Browse Source

Added safety check for the number of animation states.

Lasse Öörni 12 years ago
parent
commit
cc494ac7e7

+ 70 - 66
Source/Samples/06_SkeletalAnimation/Mover.cpp

@@ -1,66 +1,66 @@
-//
-// Copyright (c) 2008-2013 the Urho3D project.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:
-//
-// The above copyright notice and this permission notice shall be included in
-// all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-// THE SOFTWARE.
-//
-
-#include "AnimatedModel.h"
-#include "AnimationState.h"
-#include "Mover.h"
-#include "Scene.h"
-#include "SceneEvents.h"
-
-Mover::Mover(Context* context) :
-    Component(context),
-    moveSpeed_(0.0f),
-    rotationSpeed_(0.0f)
-{
-}
-
-void Mover::SetParameters(float moveSpeed, float rotationSpeed, const BoundingBox& bounds)
-{
-    moveSpeed_ = moveSpeed;
-    rotationSpeed_ = rotationSpeed;
-    bounds_ = bounds;
-}
-
-void Mover::OnNodeSet(Node* node)
-{
-    // If the node pointer is nonzero, this component has been created into a scene node. Subscribe to the variable timestep
-    // scene update event now. If the node pointer is zero, the component is being removed from a scene node at destruction
-    // time. In that case we do nothing
-    if (node)
-    {
-        Scene* scene = node->GetScene();
-        // The scene pointer will be nonzero if the scene node belongs to a scene (it is also legal to create free-standing
-        // scene nodes)
-        if (scene)
-            SubscribeToEvent(scene, E_SCENEUPDATE, HANDLER(Mover, HandleSceneUpdate));
-    }
-}
-
-void Mover::HandleSceneUpdate(StringHash eventType, VariantMap& eventData)
-{
-    // Get the timestep from the update event
-    using namespace SceneUpdate;
-    float timeStep = eventData[P_TIMESTEP].GetFloat();
-    
+//
+// Copyright (c) 2008-2013 the Urho3D project.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+//
+
+#include "AnimatedModel.h"
+#include "AnimationState.h"
+#include "Mover.h"
+#include "Scene.h"
+#include "SceneEvents.h"
+
+Mover::Mover(Context* context) :
+    Component(context),
+    moveSpeed_(0.0f),
+    rotationSpeed_(0.0f)
+{
+}
+
+void Mover::SetParameters(float moveSpeed, float rotationSpeed, const BoundingBox& bounds)
+{
+    moveSpeed_ = moveSpeed;
+    rotationSpeed_ = rotationSpeed;
+    bounds_ = bounds;
+}
+
+void Mover::OnNodeSet(Node* node)
+{
+    // If the node pointer is nonzero, this component has been created into a scene node. Subscribe to the variable timestep
+    // scene update event now. If the node pointer is zero, the component is being removed from a scene node at destruction
+    // time. In that case we do nothing
+    if (node)
+    {
+        Scene* scene = node->GetScene();
+        // The scene pointer will be nonzero if the scene node belongs to a scene (it is also legal to create free-standing
+        // scene nodes)
+        if (scene)
+            SubscribeToEvent(scene, E_SCENEUPDATE, HANDLER(Mover, HandleSceneUpdate));
+    }
+}
+
+void Mover::HandleSceneUpdate(StringHash eventType, VariantMap& eventData)
+{
+    // Get the timestep from the update event
+    using namespace SceneUpdate;
+    float timeStep = eventData[P_TIMESTEP].GetFloat();
+    
     node_->TranslateRelative(Vector3::FORWARD * moveSpeed_ * timeStep);
     node_->TranslateRelative(Vector3::FORWARD * moveSpeed_ * timeStep);
     
     
     // If in risk of going outside the plane, rotate the model right
     // If in risk of going outside the plane, rotate the model right
@@ -70,6 +70,10 @@ void Mover::HandleSceneUpdate(StringHash eventType, VariantMap& eventData)
     
     
     // Get the model's first (only) animation state and advance its time. Note the convenience accessor to other components
     // Get the model's first (only) animation state and advance its time. Note the convenience accessor to other components
     // in the same scene node
     // in the same scene node
-    AnimationState* state = GetComponent<AnimatedModel>()->GetAnimationStates()[0];
-    state->AddTime(timeStep);
-}
+    AnimatedModel* model = GetComponent<AnimatedModel>();
+    if (model->GetNumAnimationStates())
+    {
+        AnimationState* state = model->GetAnimationStates()[0];
+        state->AddTime(timeStep);
+    }
+}

+ 2 - 2
Source/Samples/06_SkeletalAnimation/SkeletalAnimation.h

@@ -31,8 +31,8 @@ using namespace Urho3D;
 /// Skeletal animation example.
 /// Skeletal animation example.
 /// This sample demonstrates:
 /// This sample demonstrates:
 ///     - Populating a 3D scene with skeletally animated AnimatedModel components;
 ///     - Populating a 3D scene with skeletally animated AnimatedModel components;
-///     - Moving the animated models and advancing their animation;
-///     - Enabling a cascaded shadow map on a directional light, which allows high-quality shadows from
+///     - Moving the animated models and advancing their animation using a custom component;
+///     - Enabling a cascaded shadow map on a directional light, which allows high-quality shadows
 ///       over a large area (typically used in outdoor scenes for shadows cast by sunlight);
 ///       over a large area (typically used in outdoor scenes for shadows cast by sunlight);
 ///     - Displaying renderer debug geometry;
 ///     - Displaying renderer debug geometry;
 class SkeletalAnimation : public Sample
 class SkeletalAnimation : public Sample