Changeset 454 for cafu/trunk
- Timestamp:
- 01/08/12 19:02:41 (5 months ago)
- Location:
- cafu/trunk
- Files:
-
- 10 modified
-
CaWE/ModelEditor/ChildFrame.cpp (modified) (2 diffs)
-
CaWE/ModelEditor/ModelDocument.cpp (modified) (1 diff)
-
CaWE/ModelEditor/ModelDocument.hpp (modified) (1 diff)
-
CaWE/ModelEditor/ScenePropGrid.cpp (modified) (3 diffs)
-
CaWE/ModelEditor/SceneView3D.cpp (modified) (2 diffs)
-
Libs/Models/AnimExpr.cpp (modified) (4 diffs)
-
Libs/Models/AnimExpr.hpp (modified) (1 diff)
-
Libs/Models/AnimPose.cpp (modified) (1 diff)
-
Libs/Models/AnimPose.hpp (modified) (1 diff)
-
Libs/Templates/Pointer.hpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
cafu/trunk/CaWE/ModelEditor/ChildFrame.cpp
r437 r454 871 871 m_ModelDoc->UpdateAllObservers_SelectionChanged(ANIM, OldSel, m_ModelDoc->GetSelection(ANIM)); 872 872 873 m_ModelDoc->GetAnimState().Pose.SetFrameNr(0.0f); 874 m_ModelDoc->UpdateAllObservers_AnimStateChanged(); 873 // This is not needed: setting a new ANIM selection also sets the frame number to 0. 874 // m_ModelDoc->GetAnimState().LastStdAE->SetFrameNr(0.0f); 875 // m_ModelDoc->UpdateAllObservers_AnimStateChanged(); 875 876 break; 876 877 } … … 882 883 m_ModelDoc->UpdateAllObservers_SelectionChanged(ANIM, OldSel, m_ModelDoc->GetSelection(ANIM)); 883 884 884 m_ModelDoc->GetAnimState().Pose.SetFrameNr(0.0f); 885 m_ModelDoc->UpdateAllObservers_AnimStateChanged(); 885 // This is not needed: setting a new ANIM selection also sets the frame number to 0. 886 // m_ModelDoc->GetAnimState().LastStdAE->SetFrameNr(0.0f); 887 // m_ModelDoc->UpdateAllObservers_AnimStateChanged(); 886 888 break; 887 889 } -
cafu/trunk/CaWE/ModelEditor/ModelDocument.cpp
r439 r454 138 138 if (Type==ANIM) 139 139 { 140 m_AnimState.Pose.SetSequNr(m_Selection[ANIM].Size()==0 ? -1 : m_Selection[ANIM][0]); 140 IntrusivePtrT<AnimExpressionT> BlendFrom=m_AnimState.Pose.GetAnimExpr(); 141 142 // If BlendFrom is a blend anim expression that has not yet begun (Frac is still 0), 143 // this means that we got another call to SetSelection() immediately before this one. 144 // This can happen when the user clicked on a new animation in the animations list, 145 // which (when CTRL is not used) issues two calls, one for the deselection of the previous 146 // anim (causing us to blend to the -1 sequence), and one for the selection of the new. 147 // In this case, just skip the intermediate "-1" blend target. 148 { 149 AnimExprBlendT* Blend=dynamic_cast<AnimExprBlendT*>(&*BlendFrom); 150 151 if (Blend && Blend->GetFrac()==0.0f) 152 BlendFrom=Blend->GetA(); 153 } 154 155 m_AnimState.LastStdAE=m_AnimState.Pool.GetStandard(m_Selection[ANIM].Size()==0 ? -1 : m_Selection[ANIM][0], 0.0f); 156 m_AnimState.Pose.SetAnimExpr(m_AnimState.Pool.GetBlend(BlendFrom, m_AnimState.LastStdAE, 3.0f)); 141 157 142 158 if (m_Selection[ANIM].Size()==0) -
cafu/trunk/CaWE/ModelEditor/ModelDocument.hpp
r428 r454 65 65 66 66 AnimStateT(const CafuModelT& Model) 67 : Po se(Model), Speed(1.0f), Loop(true) { }67 : Pool(Model), LastStdAE(Pool.GetStandard(-1, 0.0f)), Pose(Model, LastStdAE), Speed(1.0f), Loop(true) { } 68 68 69 AnimPoseT Pose; ///< The current pose of the model, as defined by sequence and frame number. 70 float Speed; ///< The speed (relative to clock time) with which the animation is advanced, usually 0 for stop or 1 for playback. 71 bool Loop; ///< When playing the sequence, loop automatically when its end has been reached? 69 AnimExprPoolT Pool; 70 IntrusivePtrT<AnimExprStandardT> LastStdAE; 71 AnimPoseT Pose; ///< The current pose of the model, as defined by sequence and frame number. 72 float Speed; ///< The speed (relative to clock time) with which the animation is advanced, usually 0 for stop or 1 for playback. 73 bool Loop; ///< When playing the sequence, loop automatically when its end has been reached? 72 74 }; 73 75 -
cafu/trunk/CaWE/ModelEditor/ScenePropGrid.cpp
r431 r454 143 143 144 144 wxPGProperty* AnimControlCat=Append(new wxPropertyCategory("Animation Control")); 145 m_AnimFrameNrProp=AppendIn(AnimControlCat, new wxFloatProperty("Frame No.", wxPG_LABEL, Anim. Pose.GetFrameNr()));145 m_AnimFrameNrProp=AppendIn(AnimControlCat, new wxFloatProperty("Frame No.", wxPG_LABEL, Anim.LastStdAE->GetFrameNr())); 146 146 m_AnimSpeedProp =AppendIn(AnimControlCat, new wxFloatProperty("Speed", wxPG_LABEL, Anim.Speed)); 147 147 m_AnimLoopProp =AppendIn(AnimControlCat, new wxBoolProperty("Loop", wxPG_LABEL, Anim.Loop)); … … 229 229 else if (PropName=="Model.Show tangent-space") m_Model_ShowTangentSpace =Prop->GetValue().GetBool(); 230 230 else if (PropName=="Model.Debug material") m_Model_DebugMaterial =Prop->GetValue().GetInteger(); 231 else if (PropName=="Frame No.") { AnimState. Pose.SetFrameNr(PropValueF); m_IsRecursiveSelfNotify=true; m_Parent->GetModelDoc()->UpdateAllObservers_AnimStateChanged(); m_IsRecursiveSelfNotify=false; }231 else if (PropName=="Frame No.") { AnimState.LastStdAE->SetFrameNr(PropValueF); m_IsRecursiveSelfNotify=true; m_Parent->GetModelDoc()->UpdateAllObservers_AnimStateChanged(); m_IsRecursiveSelfNotify=false; } 232 232 else if (PropName=="Speed") { AnimState.Speed=PropValueF; m_IsRecursiveSelfNotify=true; m_Parent->GetModelDoc()->UpdateAllObservers_AnimStateChanged(); m_IsRecursiveSelfNotify=false; } 233 233 else if (PropName=="Loop") { AnimState.Loop =Prop->GetValue().GetBool(); m_IsRecursiveSelfNotify=true; m_Parent->GetModelDoc()->UpdateAllObservers_AnimStateChanged(); m_IsRecursiveSelfNotify=false; } … … 286 286 const ModelDocumentT::AnimStateT& AnimState=m_Parent->GetModelDoc()->GetAnimState(); 287 287 288 if (m_AnimFrameNrProp->GetValue().GetDouble()!=AnimState. Pose.GetFrameNr())289 m_AnimFrameNrProp->SetValue(AnimState. Pose.GetFrameNr());288 if (m_AnimFrameNrProp->GetValue().GetDouble()!=AnimState.LastStdAE->GetFrameNr()) 289 m_AnimFrameNrProp->SetValue(AnimState.LastStdAE->GetFrameNr()); 290 290 291 291 if (m_AnimSpeedProp->GetValue().GetDouble()!=AnimState.Speed) -
cafu/trunk/CaWE/ModelEditor/SceneView3D.cpp
r431 r454 162 162 ModelDoc->UpdateAllObservers_SelectionChanged(ANIM, OldSel, ModelDoc->GetSelection(ANIM)); 163 163 164 ModelDoc->GetAnimState().Pose.SetFrameNr(0.0f); 165 ModelDoc->UpdateAllObservers_AnimStateChanged(); 164 // This is not needed: setting a new ANIM selection also sets the frame number to 0. 165 // ModelDoc->GetAnimState().LastStdAE->SetFrameNr(0.0f); 166 // ModelDoc->UpdateAllObservers_AnimStateChanged(); 166 167 break; 167 168 } … … 174 175 ModelDoc->UpdateAllObservers_SelectionChanged(ANIM, OldSel, ModelDoc->GetSelection(ANIM)); 175 176 176 ModelDoc->GetAnimState().Pose.SetFrameNr(0.0f); 177 ModelDoc->UpdateAllObservers_AnimStateChanged(); 177 // This is not needed: setting a new ANIM selection also sets the frame number to 0. 178 // ModelDoc->GetAnimState().LastStdAE->SetFrameNr(0.0f); 179 // ModelDoc->UpdateAllObservers_AnimStateChanged(); 178 180 break; 179 181 } -
cafu/trunk/Libs/Models/AnimExpr.cpp
r453 r454 223 223 unsigned int AnimExprFilterT::GetChangeNum() const 224 224 { 225 return std::max( GetChangeNum(), m_SubExpr->GetChangeNum());225 return std::max(AnimExpressionT::GetChangeNum(), m_SubExpr->GetChangeNum()); 226 226 } 227 227 … … 263 263 unsigned int AnimExprCombineT::GetChangeNum() const 264 264 { 265 return std::max( GetChangeNum(),265 return std::max(AnimExpressionT::GetChangeNum(), 266 266 std::max(m_A->GetChangeNum(), m_B->GetChangeNum())); 267 267 } … … 324 324 unsigned int AnimExprBlendT::GetChangeNum() const 325 325 { 326 return std::max(GetChangeNum(), 326 if (m_Frac >= 1.0f) 327 { 328 return std::max(AnimExpressionT::GetChangeNum(), m_B->GetChangeNum()); 329 } 330 331 return std::max(AnimExpressionT::GetChangeNum(), 327 332 std::max(m_A->GetChangeNum(), m_B->GetChangeNum())); 328 333 } … … 356 361 Weight = w[0]*f0 + w[1]*f1; 357 362 Pos = p[0]*f0 + p[1]*f1; 358 Quat = slerp(q[0], q[1], f 0); // slerp() is why we cannot have generic "add" and "mul" AnimExpressionT's.363 Quat = slerp(q[0], q[1], f1); // slerp() is why we cannot have generic "add" and "mul" AnimExpressionT's. 359 364 Scale = s[0]*f0 + s[1]*f1; 360 365 } -
cafu/trunk/Libs/Models/AnimExpr.hpp
r453 r454 187 187 void ReInit(IntrusivePtrT<AnimExpressionT> A, IntrusivePtrT<AnimExpressionT> B, float Duration); 188 188 189 /// Returns the "blend from" sub-expression. 190 IntrusivePtrT<AnimExpressionT> GetA() const { return m_A; } 191 192 /// Returns the "blend to" sub-expression. 193 IntrusivePtrT<AnimExpressionT> GetB() const { return m_B; } 194 195 /// Returns how far the blend has advanced. 196 float GetFrac() const { return m_Frac; } 197 189 198 // Implementations and overrides for base class methods. 190 199 virtual unsigned int GetChangeNum() const; -
cafu/trunk/Libs/Models/AnimPose.cpp
r453 r454 488 488 m_AnimExpr->AdvanceTime(Time, ForceLoop); 489 489 490 // Recursively update the chain of dlod poses. 491 if (m_DlodPose) m_DlodPose->Advance(Time, ForceLoop); 490 // Don't do this -- the dlod models share the same anim expression as the main model. 491 // In fact, this method should be removed. Have the caller call Pose->GetAnimExpr()->AdvanceTime() instead. 492 // 493 // // Recursively update the chain of dlod poses. 494 // if (m_DlodPose) m_DlodPose->Advance(Time, ForceLoop); 492 495 } 493 496 -
cafu/trunk/Libs/Models/AnimPose.hpp
r453 r454 94 94 /// The destructor. 95 95 ~AnimPoseT(); 96 97 /// Returns the current anim expression of this pose. 98 IntrusivePtrT<AnimExpressionT> GetAnimExpr() const { return m_AnimExpr; } 96 99 97 100 /// Sets a new anim expression to use for this pose. -
cafu/trunk/Libs/Templates/Pointer.hpp
r453 r454 49 49 } 50 50 51 /// The copy constructor (for Y classes that are derived from T). 52 template<class Y> IntrusivePtrT(const IntrusivePtrT<Y>& IP) 53 : m_Ptr(IP.get()) 54 { 55 if (m_Ptr) m_Ptr->m_RefCount++; 56 } 57 51 58 /// The destructor. 52 59 ~IntrusivePtrT() … … 79 86 } 80 87 88 /// Returns the stored pointer. 89 T* get() const { return m_Ptr; } 90 81 91 /// The structure dereference operator. 82 92 T* operator -> () { return m_Ptr; }
