- 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;
+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;