- EclassModel(EntityClass* eclass, scene::Node& node, const Callback& transformChanged, const Callback& evaluateTransform) :
- m_entity(eclass),
- m_originKey(OriginChangedCaller(*this)),
- m_origin(ORIGINKEY_IDENTITY),
- m_angleKey(AngleChangedCaller(*this)),
- m_angle(ANGLEKEY_IDENTITY),
- m_rotationKey(RotationChangedCaller(*this)),
- m_filter(m_entity, node),
- m_named(m_entity),
- m_nameKeys(m_entity),
- m_renderName(m_named, g_vector3_identity),
- m_skin(SkinChangedCaller(*this)),
- m_transformChanged(transformChanged),
- m_evaluateTransform(evaluateTransform)
- {
- construct();
- }
- EclassModel(const EclassModel& other, scene::Node& node, const Callback& transformChanged, const Callback& evaluateTransform) :
- m_entity(other.m_entity),
- m_originKey(OriginChangedCaller(*this)),
- m_origin(ORIGINKEY_IDENTITY),
- m_angleKey(AngleChangedCaller(*this)),
- m_angle(ANGLEKEY_IDENTITY),
- m_rotationKey(RotationChangedCaller(*this)),
- m_filter(m_entity, node),
- m_named(m_entity),
- m_nameKeys(m_entity),
- m_renderName(m_named, g_vector3_identity),
- m_skin(SkinChangedCaller(*this)),
- m_transformChanged(transformChanged),
- m_evaluateTransform(evaluateTransform)
- {
- construct();
- }
-
- InstanceCounter m_instanceCounter;
- void instanceAttach(const scene::Path& path)
- {
- if(++m_instanceCounter.m_count == 1)
- {
- m_filter.instanceAttach();
- m_entity.instanceAttach(path_find_mapfile(path.begin(), path.end()));
- m_entity.attach(m_keyObservers);
- m_model.modelChanged(m_entity.getEntityClass().modelpath());
- m_skin.skinChanged(m_entity.getEntityClass().skin());
- }
- }
- void instanceDetach(const scene::Path& path)
- {
- if(--m_instanceCounter.m_count == 0)
- {
- m_skin.skinChanged("");
- m_model.modelChanged("");
- m_entity.detach(m_keyObservers);
- m_entity.instanceDetach(path_find_mapfile(path.begin(), path.end()));
- m_filter.instanceDetach();
- }
- }
-
- EntityKeyValues& getEntity()
- {
- return m_entity;
- }
- const EntityKeyValues& getEntity() const
- {
- return m_entity;
- }
-
- scene::Traversable& getTraversable()
- {
- return m_model.getTraversable();
- }
- Namespaced& getNamespaced()
- {
- return m_nameKeys;
- }
- Nameable& getNameable()
- {
- return m_named;
- }
- TransformNode& getTransformNode()
- {
- return m_transform;
- }
- ModelSkin& getModelSkin()
- {
- return m_skin.get();
- }
-
- void attach(scene::Traversable::Observer* observer)
- {
- m_model.attach(observer);
- }
- void detach(scene::Traversable::Observer* observer)
- {
- m_model.detach(observer);
- }
-
- void renderSolid(Renderer& renderer, const VolumeTest& volume, const Matrix4& localToWorld, bool selected) const
- {
- if(selected)
- {
- m_renderOrigin.render(renderer, volume, localToWorld);
- }
-
- renderer.SetState(m_entity.getEntityClass().m_state_wire, Renderer::eWireframeOnly);
- }
- void renderWireframe(Renderer& renderer, const VolumeTest& volume, const Matrix4& localToWorld, bool selected) const
- {
- renderSolid(renderer, volume, localToWorld, selected);
- if(g_showNames)
- {
- renderer.addRenderable(m_renderName, localToWorld);
- }
- }
-
- void translate(const Vector3& translation)
- {
- m_origin = origin_translated(m_origin, translation);
- }
- void rotate(const Quaternion& rotation)
- {
- if(g_gameType == eGameTypeDoom3)
- {
- rotation_rotate(m_rotation, rotation);
- }
- else
- {
- m_angle = angle_rotated(m_angle, rotation);
- }
- }
- void snapto(float snap)
- {
- m_originKey.m_origin = origin_snapped(m_originKey.m_origin, snap);
- m_originKey.write(&m_entity);
- }
- void revertTransform()
- {
- m_origin = m_originKey.m_origin;
- if(g_gameType == eGameTypeDoom3)
- {
- rotation_assign(m_rotation, m_rotationKey.m_rotation);
- }
- else
- {
- m_angle = m_angleKey.m_angle;
- }
- }
- void freezeTransform()
- {
- m_originKey.m_origin = m_origin;
- m_originKey.write(&m_entity);
- if(g_gameType == eGameTypeDoom3)
- {
- rotation_assign(m_rotationKey.m_rotation, m_rotation);
- m_rotationKey.write(&m_entity);
- }
- else
- {
- m_angleKey.m_angle = m_angle;
- m_angleKey.write(&m_entity);
- }
- }
- void transformChanged()
- {
- revertTransform();
- m_evaluateTransform();
- updateTransform();
- }
- typedef MemberCaller<EclassModel, &EclassModel::transformChanged> TransformChangedCaller;
+EclassModel( EntityClass* eclass, scene::Node& node, const Callback<void()>& transformChanged, const Callback<void()>& evaluateTransform ) :
+ m_entity( eclass ),
+ m_originKey( OriginChangedCaller( *this ) ),
+ m_origin( ORIGINKEY_IDENTITY ),
+ m_angleKey( AngleChangedCaller( *this ) ),
+ m_angle( ANGLEKEY_IDENTITY ),
+ m_rotationKey( RotationChangedCaller( *this ) ),
+ m_filter( m_entity, node ),
+ m_named( m_entity ),
+ m_nameKeys( m_entity ),
+ m_renderName( m_named, g_vector3_identity ),
+ m_skin( SkinChangedCaller( *this ) ),
+ m_transformChanged( transformChanged ),
+ m_evaluateTransform( evaluateTransform ){
+ construct();
+}
+EclassModel( const EclassModel& other, scene::Node& node, const Callback<void()>& transformChanged, const Callback<void()>& evaluateTransform ) :
+ m_entity( other.m_entity ),
+ m_originKey( OriginChangedCaller( *this ) ),
+ m_origin( ORIGINKEY_IDENTITY ),
+ m_angleKey( AngleChangedCaller( *this ) ),
+ m_angle( ANGLEKEY_IDENTITY ),
+ m_rotationKey( RotationChangedCaller( *this ) ),
+ m_filter( m_entity, node ),
+ m_named( m_entity ),
+ m_nameKeys( m_entity ),
+ m_renderName( m_named, g_vector3_identity ),
+ m_skin( SkinChangedCaller( *this ) ),
+ m_transformChanged( transformChanged ),
+ m_evaluateTransform( evaluateTransform ){
+ construct();
+}
+
+InstanceCounter m_instanceCounter;
+void instanceAttach( const scene::Path& path ){
+ if ( ++m_instanceCounter.m_count == 1 ) {
+ m_filter.instanceAttach();
+ m_entity.instanceAttach( path_find_mapfile( path.begin(), path.end() ) );
+ m_entity.attach( m_keyObservers );
+ m_model.modelChanged( m_entity.getEntityClass().modelpath() );
+ m_skin.skinChanged( m_entity.getEntityClass().skin() );
+ }
+}
+void instanceDetach( const scene::Path& path ){
+ if ( --m_instanceCounter.m_count == 0 ) {
+ m_skin.skinChanged( "" );
+ m_model.modelChanged( "" );
+ m_entity.detach( m_keyObservers );
+ m_entity.instanceDetach( path_find_mapfile( path.begin(), path.end() ) );
+ m_filter.instanceDetach();
+ }
+}
+
+EntityKeyValues& getEntity(){
+ return m_entity;
+}
+const EntityKeyValues& getEntity() const {
+ return m_entity;
+}
+
+scene::Traversable& getTraversable(){
+ return m_model.getTraversable();
+}
+Namespaced& getNamespaced(){
+ return m_nameKeys;
+}
+Nameable& getNameable(){
+ return m_named;
+}
+TransformNode& getTransformNode(){
+ return m_transform;
+}
+ModelSkin& getModelSkin(){
+ return m_skin.get();
+}
+
+void attach( scene::Traversable::Observer* observer ){
+ m_model.attach( observer );
+}
+void detach( scene::Traversable::Observer* observer ){
+ m_model.detach( observer );
+}
+
+void renderSolid( Renderer& renderer, const VolumeTest& volume, const Matrix4& localToWorld, bool selected ) const {
+ if ( selected ) {
+ m_renderOrigin.render( renderer, volume, localToWorld );
+ }
+
+ renderer.SetState( m_entity.getEntityClass().m_state_wire, Renderer::eWireframeOnly );
+}
+void renderWireframe( Renderer& renderer, const VolumeTest& volume, const Matrix4& localToWorld, bool selected ) const {
+ renderSolid( renderer, volume, localToWorld, selected );
+ if ( g_showNames ) {
+ renderer.addRenderable( m_renderName, localToWorld );
+ }
+}
+
+void translate( const Vector3& translation ){
+ m_origin = origin_translated( m_origin, translation );
+}
+void rotate( const Quaternion& rotation ){
+ if ( g_gameType == eGameTypeDoom3 ) {
+ rotation_rotate( m_rotation, rotation );
+ }
+ else
+ {
+ m_angle = angle_rotated( m_angle, rotation );
+ }
+}
+void snapto( float snap ){
+ m_originKey.m_origin = origin_snapped( m_originKey.m_origin, snap );
+ m_originKey.write( &m_entity );
+}
+void revertTransform(){
+ m_origin = m_originKey.m_origin;
+ if ( g_gameType == eGameTypeDoom3 ) {
+ rotation_assign( m_rotation, m_rotationKey.m_rotation );
+ }
+ else
+ {
+ m_angle = m_angleKey.m_angle;
+ }
+}
+void freezeTransform(){
+ m_originKey.m_origin = m_origin;
+ m_originKey.write( &m_entity );
+ if ( g_gameType == eGameTypeDoom3 ) {
+ rotation_assign( m_rotationKey.m_rotation, m_rotation );
+ m_rotationKey.write( &m_entity );
+ }
+ else
+ {
+ m_angleKey.m_angle = m_angle;
+ m_angleKey.write( &m_entity );
+ }
+}
+void transformChanged(){
+ revertTransform();
+ m_evaluateTransform();
+ updateTransform();
+}
+typedef MemberCaller<EclassModel, void(), &EclassModel::transformChanged> TransformChangedCaller;