diff options
Diffstat (limited to 'src/content_cao.cpp')
-rw-r--r-- | src/content_cao.cpp | 55 |
1 files changed, 33 insertions, 22 deletions
diff --git a/src/content_cao.cpp b/src/content_cao.cpp index 1cd3926ca..b12bfe1c8 100644 --- a/src/content_cao.cpp +++ b/src/content_cao.cpp @@ -576,6 +576,10 @@ private: v2s16 m_tx_basepos; bool m_initial_tx_basepos_set; bool m_tx_select_horiz_by_yawpitch; + v2f m_frames; + int m_frame_speed; + int m_frame_blend; + std::map<std::string, core::vector2d<v3f> > m_bone_posrot; int m_anim_frame; int m_anim_num_frames; float m_anim_framelength; @@ -924,6 +928,8 @@ public: m_visuals_expired = false; removeFromScene(); addToScene(m_smgr, m_gamedef->tsrc(), m_irr); + updateAnimations(); + updateBonePosRot(); } if(m_prop.physical){ @@ -1136,32 +1142,27 @@ public: } } - void updateAnimations(int frame_start, int frame_end, float frame_speed, float frame_blend) + void updateAnimations() { if(!m_animated_meshnode) return; - m_animated_meshnode->setFrameLoop(frame_start, frame_end); - m_animated_meshnode->setAnimationSpeed(frame_speed); - m_animated_meshnode->setTransitionTime(frame_blend); + m_animated_meshnode->setFrameLoop((int)m_frames.X, (int)m_frames.Y); + m_animated_meshnode->setAnimationSpeed(m_frame_speed); + m_animated_meshnode->setTransitionTime(m_frame_blend); + } - if(m_prop.animation_bone_position.size() > 0) + void updateBonePosRot() + { + if(m_bone_posrot.size() > 0) { - for(std::map<std::string, v3f>::const_iterator ii = m_prop.animation_bone_position.begin(); ii != m_prop.animation_bone_position.end(); ++ii){ - m_animated_meshnode->setJointMode(irr::scene::EJUOR_CONTROL); // To write positions to the mesh on render + m_animated_meshnode->setJointMode(irr::scene::EJUOR_CONTROL); // To write positions to the mesh on render + for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_bone_posrot.begin(); ii != m_bone_posrot.end(); ++ii){ std::string bone_name = (*ii).first; - v3f bone_pos = (*ii).second; + v3f bone_pos = (*ii).second.X; + v3f bone_rot = (*ii).second.Y; irr::scene::IBoneSceneNode* bone = m_animated_meshnode->getJointNode(bone_name.c_str()); bone->setPosition(bone_pos); - } - } - if(m_prop.animation_bone_rotation.size() > 0) - { - for(std::map<std::string, v3f>::const_iterator ii = m_prop.animation_bone_rotation.begin(); ii != m_prop.animation_bone_rotation.end(); ++ii){ - m_animated_meshnode->setJointMode(irr::scene::EJUOR_CONTROL); // To write positions to the mesh on render - std::string bone_name = (*ii).first; - v3f bone_rot = (*ii).second; - irr::scene::IBoneSceneNode* bone = m_animated_meshnode->getJointNode(bone_name.c_str()); bone->setRotation(bone_rot); } } @@ -1236,12 +1237,22 @@ public: } else if(cmd == GENERIC_CMD_SET_ANIMATIONS) { - int frame_start = readU16(is); - int frame_end = readU16(is); - float frame_speed = readF1000(is); - float frame_blend = readF1000(is); + m_frames = readV2F1000(is); + m_frame_speed = readF1000(is); + m_frame_blend = readF1000(is); + + updateAnimations(); + expireVisuals(); + } + else if(cmd == GENERIC_CMD_SET_BONE_POSROT) + { + std::string bone = deSerializeString(is); + v3f position = readV3F1000(is); + v3f rotation = readV3F1000(is); + m_bone_posrot[bone] = core::vector2d<v3f>(position, rotation); - updateAnimations(frame_start, frame_end, frame_speed, frame_blend); + updateBonePosRot(); + expireVisuals(); } else if(cmd == GENERIC_CMD_PUNCHED) { |