Browse Source

Improved Spline attribute editing. Moved Spline to Logic category in the editor.

Lasse Öörni 12 years ago
parent
commit
0697ad0750

+ 6 - 0
Bin/Data/Scripts/Editor/AttributeEditor.as

@@ -1206,6 +1206,12 @@ void InitVectorStructs()
         "   NodeID"
         "   NodeID"
     };
     };
     vectorStructs.Push(VectorStruct("StaticModelGroup", "Instance Nodes", staticModelGroupInstanceVariables, 1));
     vectorStructs.Push(VectorStruct("StaticModelGroup", "Instance Nodes", staticModelGroupInstanceVariables, 1));
+    
+    Array<String> splineControlPointVariables = {
+        "Control Point Count",
+        "   Point"
+    };
+    vectorStructs.Push(VectorStruct("Spline", "Control Points", splineControlPointVariables, 1));
 }
 }
 
 
 VectorStruct@ GetVectorStruct(Array<Serializable@>@ serializables, uint index)
 VectorStruct@ GetVectorStruct(Array<Serializable@>@ serializables, uint index)

+ 4 - 0
Bin/Data/UI/EditorIcons.xml

@@ -127,6 +127,10 @@
         <attribute name="Texture" value="Texture2D;Textures/EditorIcons.png" />
         <attribute name="Texture" value="Texture2D;Textures/EditorIcons.png" />
         <attribute name="Image Rect" value="96 16 110 30" />
         <attribute name="Image Rect" value="96 16 110 30" />
     </element>
     </element>
+    <element type="Spline">
+        <attribute name="Texture" value="Texture2D;Textures/EditorIcons.png" />
+        <attribute name="Image Rect" value="96 16 110 30" />
+    </element>
     <element type="RootUIElement">
     <element type="RootUIElement">
         <attribute name="Texture" value="Texture2D;Textures/EditorIcons.png" />
         <attribute name="Texture" value="Texture2D;Textures/EditorIcons.png" />
         <attribute name="Image Rect" value="0 32 14 46" />
         <attribute name="Image Rect" value="0 32 14 46" />

+ 24 - 7
Source/Engine/Scene/Spline.cpp

@@ -30,7 +30,13 @@
 namespace Urho3D
 namespace Urho3D
 {
 {
 
 
-extern const char* SCENE_CATEGORY;
+extern const char* LOGIC_CATEGORY;
+
+static const char* interpolationModeNames[] =
+{
+    "Bezier",
+    0
+};
 
 
 Spline::Spline(Context* context) :
 Spline::Spline(Context* context) :
     Component(context),
     Component(context),
@@ -45,13 +51,13 @@ Spline::Spline(Context* context) :
 
 
 void Spline::RegisterObject(Context* context)
 void Spline::RegisterObject(Context* context)
 {
 {
-    context->RegisterFactory<Spline>(SCENE_CATEGORY);
+    context->RegisterFactory<Spline>(LOGIC_CATEGORY);
 
 
-    ACCESSOR_ATTRIBUTE(Spline, VAR_VARIANTVECTOR, "Control Points", GetControlPointsAttr, SetControlPointsAttr, VariantVector, Variant::emptyVariantVector, AM_FILE);
     ATTRIBUTE(Spline, VAR_FLOAT, "Speed", speed_, 1.f, AM_FILE);
     ATTRIBUTE(Spline, VAR_FLOAT, "Speed", speed_, 1.f, AM_FILE);
-    ATTRIBUTE(Spline, VAR_INT, "Interpolation Mode", interpolationMode_, BEZIER_CURVE, AM_FILE);
+    ENUM_ATTRIBUTE(Spline, "Interpolation Mode", interpolationMode_, interpolationModeNames, BEZIER_CURVE, AM_FILE);
     ATTRIBUTE(Spline, VAR_FLOAT, "Traveled", traveled_, 0.f, AM_FILE | AM_NOEDIT);
     ATTRIBUTE(Spline, VAR_FLOAT, "Traveled", traveled_, 0.f, AM_FILE | AM_NOEDIT);
     ATTRIBUTE(Spline, VAR_FLOAT, "Elapsed Time", elapsedTime_, 0.f, AM_FILE | AM_NOEDIT);
     ATTRIBUTE(Spline, VAR_FLOAT, "Elapsed Time", elapsedTime_, 0.f, AM_FILE | AM_NOEDIT);
+    ACCESSOR_ATTRIBUTE(Spline, VAR_VARIANTVECTOR, "Control Points", GetControlPointsAttr, SetControlPointsAttr, VariantVector, Variant::emptyVariantVector, AM_FILE);
 }
 }
 
 
 void Spline::SetControlPoints(const PODVector<Vector3>& controlPoints)
 void Spline::SetControlPoints(const PODVector<Vector3>& controlPoints)
@@ -133,7 +139,7 @@ void Spline::Move(float timeStep)
     case BEZIER_CURVE:
     case BEZIER_CURVE:
         if (controlPoints_.Size() < 2)
         if (controlPoints_.Size() < 2)
         {
         {
-            LOGERRORF("Spline on Node[%d,%s] in Beizer Curve mode attempted with less than two control points.", GetNode()->GetID(), GetNode()->GetName().CString());
+            LOGERRORF("Spline on Node[%d,%s] in Bezier Curve mode attempted with less than two control points.", GetNode()->GetID(), GetNode()->GetName().CString());
             return;
             return;
         }
         }
         GetNode()->SetPosition(BezierMove(controlPoints_,traveled_));
         GetNode()->SetPosition(BezierMove(controlPoints_,traveled_));
@@ -150,6 +156,8 @@ void Spline::Reset()
 Urho3D::VariantVector Spline::GetControlPointsAttr() const
 Urho3D::VariantVector Spline::GetControlPointsAttr() const
 {
 {
     VariantVector ret;
     VariantVector ret;
+    // Store number of points first for editing
+    ret.Push(controlPoints_.Size());
     for (unsigned i = 0; i < controlPoints_.Size(); i++)
     for (unsigned i = 0; i < controlPoints_.Size(); i++)
         ret.Push(controlPoints_[i]);
         ret.Push(controlPoints_[i]);
     return ret;
     return ret;
@@ -157,8 +165,17 @@ Urho3D::VariantVector Spline::GetControlPointsAttr() const
 
 
 void Spline::SetControlPointsAttr(VariantVector value)
 void Spline::SetControlPointsAttr(VariantVector value)
 {
 {
-    for (unsigned i = 0; i < value.Size(); i++)
-        controlPoints_.Push(value[i].GetVector3());
+    controlPoints_.Clear();
+    unsigned index = 0;
+    unsigned numPoints = index < value.Size() ? value[index++].GetUInt() : 0;
+    // Prevent negative value being assigned from the editor
+    if (numPoints > M_MAX_INT)
+        numPoints = 0;
+    for (unsigned i = 0; i < numPoints; ++i)
+    {
+        Vector3 point = index < value.Size() ? value[index++].GetVector3() : Vector3::ZERO;
+        controlPoints_.Push(point);
+    }
 
 
     CalculateLength();
     CalculateLength();
 }
 }

+ 1 - 1
Source/Engine/Scene/Spline.h

@@ -30,7 +30,7 @@ namespace Urho3D
 /// Interpolation Mode for a Spline.
 /// Interpolation Mode for a Spline.
 enum InterpolationMode
 enum InterpolationMode
 {
 {
-    BEZIER_CURVE
+    BEZIER_CURVE = 0
 };
 };
 
 
 /// Spline for creating smooth movement based on Speed along a set of Control Points modified by the Interpolation Mode.
 /// Spline for creating smooth movement based on Speed along a set of Control Points modified by the Interpolation Mode.