Browse Source

- Taml serialization WIP.

MelvMay-GG 12 years ago
parent
commit
2658898907

+ 8 - 5
engine/source/2d/core/SpriteBatchItem.cc

@@ -428,7 +428,7 @@ void SpriteBatchItem::onTamlCustomWrite( TamlCustomNode* pSpriteNode )
 
 
     // Write data object.
     // Write data object.
     if ( getDataObject() != NULL )
     if ( getDataObject() != NULL )
-        pSpriteNode->addField( spriteDataObjectName, getDataObject() );
+        pSpriteNode->addNode( getDataObject() );
 }
 }
 
 
 //------------------------------------------------------------------------------
 //------------------------------------------------------------------------------
@@ -573,9 +573,12 @@ void SpriteBatchItem::onTamlCustomRead( const TamlCustomNode* pSpriteNode )
             // Set logical position.
             // Set logical position.
             setLogicalPosition( LogicalPosition( pLogicalPositionArgs ) );
             setLogicalPosition( LogicalPosition( pLogicalPositionArgs ) );
         }
         }
-        else if ( fieldName == spriteDataObjectName )
-        {            
-            setDataObject( pSpriteField->getFieldObject() );
-        }
     }
     }
+
+    // Fetch sprite children.
+    const TamlCustomNodeVector& spriteChildren = pSpriteNode->getChildren();
+
+    // Set the data object if a single child exists.
+    if ( spriteChildren.size() == 1 )
+        setDataObject( spriteChildren[0]->composeProxyObject<SimObject>() );
 }
 }

+ 196 - 137
engine/source/2d/scene/Scene.cc

@@ -83,8 +83,6 @@ static bool tamlPropertiesInitialized = false;
 // Joint property names.
 // Joint property names.
 static StringTableEntry jointCustomNodeName;
 static StringTableEntry jointCustomNodeName;
 static StringTableEntry jointCollideConnectedName;
 static StringTableEntry jointCollideConnectedName;
-static StringTableEntry jointObjectAName;
-static StringTableEntry jointObjectBName;
 static StringTableEntry jointLocalAnchorAName;
 static StringTableEntry jointLocalAnchorAName;
 static StringTableEntry jointLocalAnchorBName;
 static StringTableEntry jointLocalAnchorBName;
 
 
@@ -184,8 +182,6 @@ Scene::Scene() :
     {
     {
         jointCustomNodeName           = StringTable->insert( "Joints" );
         jointCustomNodeName           = StringTable->insert( "Joints" );
         jointCollideConnectedName         = StringTable->insert( "CollideConnected" );
         jointCollideConnectedName         = StringTable->insert( "CollideConnected" );
-        jointObjectAName                  = StringTable->insert( "AnchorA" );
-        jointObjectBName                  = StringTable->insert( "AnchorB" );
         jointLocalAnchorAName             = StringTable->insert( "LocalAnchorA" );
         jointLocalAnchorAName             = StringTable->insert( "LocalAnchorA" );
         jointLocalAnchorBName             = StringTable->insert( "LocalAnchorB" );
         jointLocalAnchorBName             = StringTable->insert( "LocalAnchorB" );
 
 
@@ -3647,8 +3643,21 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
         // Is this a distance joint?
         // Is this a distance joint?
         if ( nodeName == jointDistanceNodeName )
         if ( nodeName == jointDistanceNodeName )
         {
         {
-            SceneObject* pSceneObjectA = NULL;
-            SceneObject* pSceneObjectB = NULL;
+            // Fetch joint children.
+            const TamlCustomNodeVector& jointChildren = pJointNode->getChildren();
+
+            // Fetch joint objects.
+            SceneObject* pSceneObjectA = jointChildren.size() > 0 ? jointChildren[0]->composeProxyObject<SceneObject>() : NULL;
+            SceneObject* pSceneObjectB = jointChildren.size() == 2 ? jointChildren[1]->composeProxyObject<SceneObject>() : NULL;
+
+            // Did we get any connected objects?
+            if( pSceneObjectA == NULL && pSceneObjectB == NULL )
+            {
+                // No, so warn.
+                Con::warnf( "Scene::onTamlPostRead() - Encountered a joint '%s' but it has invalid connected objects.", nodeName );
+                continue;
+            }
+
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             bool collideConnected = false;
             bool collideConnected = false;
@@ -3670,15 +3679,7 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
                 StringTableEntry fieldName = pFieldNode->getFieldName();
                 StringTableEntry fieldName = pFieldNode->getFieldName();
 
 
                 // Fetch fields.
                 // Fetch fields.
-                if ( fieldName == jointObjectAName )
-                {
-                    pSceneObjectA = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointObjectBName )
-                {
-                    pSceneObjectB = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointLocalAnchorAName )
+                if ( fieldName == jointLocalAnchorAName )
                 {
                 {
                     pFieldNode->getFieldValue( localAnchorA );
                     pFieldNode->getFieldValue( localAnchorA );
                 }
                 }
@@ -3710,8 +3711,21 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
         // is this a rope joint?
         // is this a rope joint?
         else if ( nodeName == jointRopeNodeName )
         else if ( nodeName == jointRopeNodeName )
         {
         {
-            SceneObject* pSceneObjectA = NULL;
-            SceneObject* pSceneObjectB = NULL;
+            // Fetch joint children.
+            const TamlCustomNodeVector& jointChildren = pJointNode->getChildren();
+
+            // Fetch joint objects.
+            SceneObject* pSceneObjectA = jointChildren.size() > 0 ? jointChildren[0]->composeProxyObject<SceneObject>() : NULL;
+            SceneObject* pSceneObjectB = jointChildren.size() == 2 ? jointChildren[1]->composeProxyObject<SceneObject>() : NULL;
+
+            // Did we get any connected objects?
+            if( pSceneObjectA == NULL && pSceneObjectB == NULL )
+            {
+                // No, so warn.
+                Con::warnf( "Scene::onTamlPostRead() - Encountered a joint '%s' but it has invalid connected objects.", nodeName );
+                continue;
+            }
+
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             bool collideConnected = false;
             bool collideConnected = false;
@@ -3731,15 +3745,7 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
                 StringTableEntry fieldName = pFieldNode->getFieldName();
                 StringTableEntry fieldName = pFieldNode->getFieldName();
 
 
                 // Fetch fields.
                 // Fetch fields.
-                if ( fieldName == jointObjectAName )
-                {
-                    pSceneObjectA = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointObjectBName )
-                {
-                    pSceneObjectB = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointLocalAnchorAName )
+                if ( fieldName == jointLocalAnchorAName )
                 {
                 {
                     pFieldNode->getFieldValue( localAnchorA );
                     pFieldNode->getFieldValue( localAnchorA );
                 }
                 }
@@ -3763,8 +3769,21 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
         // Is this a revolute joint?
         // Is this a revolute joint?
         else if ( nodeName == jointRevoluteNodeName )
         else if ( nodeName == jointRevoluteNodeName )
         {
         {
-            SceneObject* pSceneObjectA = NULL;
-            SceneObject* pSceneObjectB = NULL;
+            // Fetch joint children.
+            const TamlCustomNodeVector& jointChildren = pJointNode->getChildren();
+
+            // Fetch joint objects.
+            SceneObject* pSceneObjectA = jointChildren.size() > 0 ? jointChildren[0]->composeProxyObject<SceneObject>() : NULL;
+            SceneObject* pSceneObjectB = jointChildren.size() == 2 ? jointChildren[1]->composeProxyObject<SceneObject>() : NULL;
+
+            // Did we get any connected objects?
+            if( pSceneObjectA == NULL && pSceneObjectB == NULL )
+            {
+                // No, so warn.
+                Con::warnf( "Scene::onTamlPostRead() - Encountered a joint '%s' but it has invalid connected objects.", nodeName );
+                continue;
+            }
+
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             bool collideConnected = false;
             bool collideConnected = false;
@@ -3790,15 +3809,7 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
                 StringTableEntry fieldName = pFieldNode->getFieldName();
                 StringTableEntry fieldName = pFieldNode->getFieldName();
 
 
                 // Fetch fields.
                 // Fetch fields.
-                if ( fieldName == jointObjectAName )
-                {
-                    pSceneObjectA = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointObjectBName )
-                {
-                    pSceneObjectB = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointLocalAnchorAName )
+                if ( fieldName == jointLocalAnchorAName )
                 {
                 {
                     pFieldNode->getFieldValue( localAnchorA );
                     pFieldNode->getFieldValue( localAnchorA );
                 }
                 }
@@ -3847,8 +3858,21 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
         // is this a weld joint?
         // is this a weld joint?
         else if ( nodeName == jointWeldNodeName )
         else if ( nodeName == jointWeldNodeName )
         {
         {
-            SceneObject* pSceneObjectA = NULL;
-            SceneObject* pSceneObjectB = NULL;
+            // Fetch joint children.
+            const TamlCustomNodeVector& jointChildren = pJointNode->getChildren();
+
+            // Fetch joint objects.
+            SceneObject* pSceneObjectA = jointChildren.size() > 0 ? jointChildren[0]->composeProxyObject<SceneObject>() : NULL;
+            SceneObject* pSceneObjectB = jointChildren.size() == 2 ? jointChildren[1]->composeProxyObject<SceneObject>() : NULL;
+
+            // Did we get any connected objects?
+            if( pSceneObjectA == NULL && pSceneObjectB == NULL )
+            {
+                // No, so warn.
+                Con::warnf( "Scene::onTamlPostRead() - Encountered a joint '%s' but it has invalid connected objects.", nodeName );
+                continue;
+            }
+
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             bool collideConnected = false;
             bool collideConnected = false;
@@ -3869,15 +3893,7 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
                 StringTableEntry fieldName = pFieldNode->getFieldName();
                 StringTableEntry fieldName = pFieldNode->getFieldName();
 
 
                 // Fetch fields.
                 // Fetch fields.
-                if ( fieldName == jointObjectAName )
-                {
-                    pSceneObjectA = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointObjectBName )
-                {
-                    pSceneObjectB = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointLocalAnchorAName )
+                if ( fieldName == jointLocalAnchorAName )
                 {
                 {
                     pFieldNode->getFieldValue( localAnchorA );
                     pFieldNode->getFieldValue( localAnchorA );
                 }
                 }
@@ -3905,8 +3921,21 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
         // Is this a wheel joint?
         // Is this a wheel joint?
         else if ( nodeName == jointWheelNodeName )
         else if ( nodeName == jointWheelNodeName )
         {
         {
-            SceneObject* pSceneObjectA = NULL;
-            SceneObject* pSceneObjectB = NULL;
+            // Fetch joint children.
+            const TamlCustomNodeVector& jointChildren = pJointNode->getChildren();
+
+            // Fetch joint objects.
+            SceneObject* pSceneObjectA = jointChildren.size() > 0 ? jointChildren[0]->composeProxyObject<SceneObject>() : NULL;
+            SceneObject* pSceneObjectB = jointChildren.size() == 2 ? jointChildren[1]->composeProxyObject<SceneObject>() : NULL;
+
+            // Did we get any connected objects?
+            if( pSceneObjectA == NULL && pSceneObjectB == NULL )
+            {
+                // No, so warn.
+                Con::warnf( "Scene::onTamlPostRead() - Encountered a joint '%s' but it has invalid connected objects.", nodeName );
+                continue;
+            }
+
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             bool collideConnected = false;
             bool collideConnected = false;
@@ -3932,15 +3961,7 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
                 StringTableEntry fieldName = pFieldNode->getFieldName();
                 StringTableEntry fieldName = pFieldNode->getFieldName();
 
 
                 // Fetch fields.
                 // Fetch fields.
-                if ( fieldName == jointObjectAName )
-                {
-                    pSceneObjectA = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointObjectBName )
-                {
-                    pSceneObjectB = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointLocalAnchorAName )
+                if ( fieldName == jointLocalAnchorAName )
                 {
                 {
                     pFieldNode->getFieldValue( localAnchorA );
                     pFieldNode->getFieldValue( localAnchorA );
                 }
                 }
@@ -3989,8 +4010,21 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
         // Is this a friction joint?
         // Is this a friction joint?
         else if ( nodeName == jointFrictionNodeName )
         else if ( nodeName == jointFrictionNodeName )
         {
         {
-            SceneObject* pSceneObjectA = NULL;
-            SceneObject* pSceneObjectB = NULL;
+            // Fetch joint children.
+            const TamlCustomNodeVector& jointChildren = pJointNode->getChildren();
+
+            // Fetch joint objects.
+            SceneObject* pSceneObjectA = jointChildren.size() > 0 ? jointChildren[0]->composeProxyObject<SceneObject>() : NULL;
+            SceneObject* pSceneObjectB = jointChildren.size() == 2 ? jointChildren[1]->composeProxyObject<SceneObject>() : NULL;
+
+            // Did we get any connected objects?
+            if( pSceneObjectA == NULL && pSceneObjectB == NULL )
+            {
+                // No, so warn.
+                Con::warnf( "Scene::onTamlPostRead() - Encountered a joint '%s' but it has invalid connected objects.", nodeName );
+                continue;
+            }
+
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             bool collideConnected = false;
             bool collideConnected = false;
@@ -4011,15 +4045,7 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
                 StringTableEntry fieldName = pFieldNode->getFieldName();
                 StringTableEntry fieldName = pFieldNode->getFieldName();
 
 
                 // Fetch fields.
                 // Fetch fields.
-                if ( fieldName == jointObjectAName )
-                {
-                    pSceneObjectA = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointObjectBName )
-                {
-                    pSceneObjectB = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointLocalAnchorAName )
+                if ( fieldName == jointLocalAnchorAName )
                 {
                 {
                     pFieldNode->getFieldValue( localAnchorA );
                     pFieldNode->getFieldValue( localAnchorA );
                 }
                 }
@@ -4047,8 +4073,21 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
         // Is this a prismatic joint?
         // Is this a prismatic joint?
         else if ( nodeName == jointPrismaticNodeName )
         else if ( nodeName == jointPrismaticNodeName )
         {
         {
-            SceneObject* pSceneObjectA = NULL;
-            SceneObject* pSceneObjectB = NULL;
+            // Fetch joint children.
+            const TamlCustomNodeVector& jointChildren = pJointNode->getChildren();
+
+            // Fetch joint objects.
+            SceneObject* pSceneObjectA = jointChildren.size() > 0 ? jointChildren[0]->composeProxyObject<SceneObject>() : NULL;
+            SceneObject* pSceneObjectB = jointChildren.size() == 2 ? jointChildren[1]->composeProxyObject<SceneObject>() : NULL;
+
+            // Did we get any connected objects?
+            if( pSceneObjectA == NULL && pSceneObjectB == NULL )
+            {
+                // No, so warn.
+                Con::warnf( "Scene::onTamlPostRead() - Encountered a joint '%s' but it has invalid connected objects.", nodeName );
+                continue;
+            }
+
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             bool collideConnected = false;
             bool collideConnected = false;
@@ -4076,15 +4115,7 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
                 StringTableEntry fieldName = pFieldNode->getFieldName();
                 StringTableEntry fieldName = pFieldNode->getFieldName();
 
 
                 // Fetch fields.
                 // Fetch fields.
-                if ( fieldName == jointObjectAName )
-                {
-                    pSceneObjectA = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointObjectBName )
-                {
-                    pSceneObjectB = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointLocalAnchorAName )
+                if ( fieldName == jointLocalAnchorAName )
                 {
                 {
                     pFieldNode->getFieldValue( localAnchorA );
                     pFieldNode->getFieldValue( localAnchorA );
                 }
                 }
@@ -4135,8 +4166,21 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
         // Is this a pulley joint?
         // Is this a pulley joint?
         else if ( nodeName == jointPulleyNodeName )
         else if ( nodeName == jointPulleyNodeName )
         {
         {
-            SceneObject* pSceneObjectA = NULL;
-            SceneObject* pSceneObjectB = NULL;
+            // Fetch joint children.
+            const TamlCustomNodeVector& jointChildren = pJointNode->getChildren();
+
+            // Fetch joint objects.
+            SceneObject* pSceneObjectA = jointChildren.size() > 0 ? jointChildren[0]->composeProxyObject<SceneObject>() : NULL;
+            SceneObject* pSceneObjectB = jointChildren.size() == 2 ? jointChildren[1]->composeProxyObject<SceneObject>() : NULL;
+
+            // Did we get any connected objects?
+            if( pSceneObjectA == NULL && pSceneObjectB == NULL )
+            {
+                // No, so warn.
+                Con::warnf( "Scene::onTamlPostRead() - Encountered a joint '%s' but it has invalid connected objects.", nodeName );
+                continue;
+            }
+
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorA = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             b2Vec2 localAnchorB = b2Vec2_zero;
             bool collideConnected = false;
             bool collideConnected = false;
@@ -4160,15 +4204,7 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
                 StringTableEntry fieldName = pFieldNode->getFieldName();
                 StringTableEntry fieldName = pFieldNode->getFieldName();
 
 
                 // Fetch fields.
                 // Fetch fields.
-                if ( fieldName == jointObjectAName )
-                {
-                    pSceneObjectA = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointObjectBName )
-                {
-                    pSceneObjectB = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointLocalAnchorAName )
+                if ( fieldName == jointLocalAnchorAName )
                 {
                 {
                     pFieldNode->getFieldValue( localAnchorA );
                     pFieldNode->getFieldValue( localAnchorA );
                 }
                 }
@@ -4209,7 +4245,20 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
         // Is this a target joint?
         // Is this a target joint?
         else if ( nodeName == jointTargetNodeName )
         else if ( nodeName == jointTargetNodeName )
         {
         {
-            SceneObject* pSceneObject = NULL;
+            // Fetch joint children.
+            const TamlCustomNodeVector& jointChildren = pJointNode->getChildren();
+
+            // Fetch joint objects.
+            SceneObject* pSceneObject = jointChildren.size() == 1 ? jointChildren[0]->composeProxyObject<SceneObject>() : NULL;
+
+            // Did we get any connected objects?
+            if( pSceneObject == NULL )
+            {
+                // No, so warn.
+                Con::warnf( "Scene::onTamlPostRead() - Encountered a joint '%s' but it has an invalid connected object.", nodeName );
+                continue;
+            }
+
             bool collideConnected = false;
             bool collideConnected = false;
             b2Vec2 worldTarget = b2Vec2_zero;
             b2Vec2 worldTarget = b2Vec2_zero;
             F32 maxForce = 1.0f;
             F32 maxForce = 1.0f;
@@ -4229,11 +4278,7 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
                 StringTableEntry fieldName = pFieldNode->getFieldName();
                 StringTableEntry fieldName = pFieldNode->getFieldName();
 
 
                 // Fetch fields.
                 // Fetch fields.
-                if ( fieldName == jointObjectAName )
-                {
-                    pSceneObject = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointCollideConnectedName )
+                if ( fieldName == jointCollideConnectedName )
                 {
                 {
                     pFieldNode->getFieldValue( collideConnected );
                     pFieldNode->getFieldValue( collideConnected );
                 }
                 }
@@ -4261,8 +4306,21 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
         // Is this a motor joint?
         // Is this a motor joint?
         else if ( nodeName == jointMotorNodeName )
         else if ( nodeName == jointMotorNodeName )
         {
         {
-            SceneObject* pSceneObjectA = NULL;
-            SceneObject* pSceneObjectB = NULL;
+            // Fetch joint children.
+            const TamlCustomNodeVector& jointChildren = pJointNode->getChildren();
+
+            // Fetch joint objects.
+            SceneObject* pSceneObjectA = jointChildren.size() > 0 ? jointChildren[0]->composeProxyObject<SceneObject>() : NULL;
+            SceneObject* pSceneObjectB = jointChildren.size() == 2 ? jointChildren[1]->composeProxyObject<SceneObject>() : NULL;
+
+            // Did we get any connected objects?
+            if( pSceneObjectA == NULL && pSceneObjectB == NULL )
+            {
+                // No, so warn.
+                Con::warnf( "Scene::onTamlPostRead() - Encountered a joint '%s' but it has invalid connected objects.", nodeName );
+                continue;
+            }
+
             bool collideConnected = false;
             bool collideConnected = false;
 
 
             b2Vec2 linearOffset = b2Vec2_zero;
             b2Vec2 linearOffset = b2Vec2_zero;
@@ -4284,15 +4342,7 @@ void Scene::onTamlPostRead( const TamlCustomNodes& customNodes )
                 StringTableEntry fieldName = pFieldNode->getFieldName();
                 StringTableEntry fieldName = pFieldNode->getFieldName();
 
 
                 // Fetch fields.
                 // Fetch fields.
-                if ( fieldName == jointObjectAName )
-                {
-                    pSceneObjectA = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointObjectBName )
-                {
-                    pSceneObjectB = dynamic_cast<SceneObject*>( pFieldNode->getFieldObject() );
-                }
-                else if ( fieldName == jointCollideConnectedName )
+                if ( fieldName == jointCollideConnectedName )
                 {
                 {
                     pFieldNode->getFieldValue( collideConnected );
                     pFieldNode->getFieldValue( collideConnected );
                 }
                 }
@@ -4410,11 +4460,12 @@ void Scene::onTamlCustomWrite( TamlCustomNodes& customNodes )
 						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
 						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
 							pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 							pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 
 
-						// Add bodies.
+						// Add scene object bodies.
 						if ( pSceneObjectA != NULL )
 						if ( pSceneObjectA != NULL )
-							pJointNode->addField( jointObjectAName, pSceneObjectA );
+                            pJointNode->addNode( pSceneObjectA );
+
 						if ( pSceneObjectB != NULL )
 						if ( pSceneObjectB != NULL )
-							pJointNode->addField( jointObjectBName, pSceneObjectB );
+                            pJointNode->addNode( pSceneObjectB );
 					}
 					}
 					break;
 					break;
 
 
@@ -4439,11 +4490,12 @@ void Scene::onTamlCustomWrite( TamlCustomNodes& customNodes )
 						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
 						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
 							pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 							pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 
 
-						// Add bodies.
+						// Add scene object bodies.
 						if ( pSceneObjectA != NULL )
 						if ( pSceneObjectA != NULL )
-							pJointNode->addField( jointObjectAName, pSceneObjectA );
+                            pJointNode->addNode( pSceneObjectA );
+
 						if ( pSceneObjectB != NULL )
 						if ( pSceneObjectB != NULL )
-							pJointNode->addField( jointObjectBName, pSceneObjectB );
+                            pJointNode->addNode( pSceneObjectB );
 					}
 					}
 					break;
 					break;
 
 
@@ -4480,11 +4532,12 @@ void Scene::onTamlCustomWrite( TamlCustomNodes& customNodes )
 						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
 						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
 							pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 							pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 
 
-						// Add bodies.
+						// Add scene object bodies.
 						if ( pSceneObjectA != NULL )
 						if ( pSceneObjectA != NULL )
-							pJointNode->addField( jointObjectAName, pSceneObjectA );
+                            pJointNode->addNode( pSceneObjectA );
+
 						if ( pSceneObjectB != NULL )
 						if ( pSceneObjectB != NULL )
-							pJointNode->addField( jointObjectBName, pSceneObjectB );
+                            pJointNode->addNode( pSceneObjectB );
 					}
 					}
 					break;
 					break;
 
 
@@ -4513,11 +4566,12 @@ void Scene::onTamlCustomWrite( TamlCustomNodes& customNodes )
 						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
 						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
 							pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 							pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 
 
-						// Add bodies.
+						// Add scene object bodies.
 						if ( pSceneObjectA != NULL )
 						if ( pSceneObjectA != NULL )
-							pJointNode->addField( jointObjectAName, pSceneObjectA );
+                            pJointNode->addNode( pSceneObjectA );
+
 						if ( pSceneObjectB != NULL )
 						if ( pSceneObjectB != NULL )
-							pJointNode->addField( jointObjectBName, pSceneObjectB );
+                            pJointNode->addNode( pSceneObjectB );
 					}
 					}
 					break;
 					break;
 
 
@@ -4555,11 +4609,12 @@ void Scene::onTamlCustomWrite( TamlCustomNodes& customNodes )
 						pJointNode->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
 						pJointNode->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
 						pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 						pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 
 
-						// Add bodies.
+						// Add scene object bodies.
 						if ( pSceneObjectA != NULL )
 						if ( pSceneObjectA != NULL )
-							pJointNode->addField( jointObjectAName, pSceneObjectA );
+                            pJointNode->addNode( pSceneObjectA );
+
 						if ( pSceneObjectB != NULL )
 						if ( pSceneObjectB != NULL )
-							pJointNode->addField( jointObjectBName, pSceneObjectB );
+                            pJointNode->addNode( pSceneObjectB );
 					}
 					}
 					break;
 					break;
 
 
@@ -4588,11 +4643,12 @@ void Scene::onTamlCustomWrite( TamlCustomNodes& customNodes )
 						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
 						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
 							pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 							pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 
 
-						// Add bodies.
+						// Add scene object bodies.
 						if ( pSceneObjectA != NULL )
 						if ( pSceneObjectA != NULL )
-							pJointNode->addField( jointObjectAName, pSceneObjectA );
+                            pJointNode->addNode( pSceneObjectA );
+
 						if ( pSceneObjectB != NULL )
 						if ( pSceneObjectB != NULL )
-							pJointNode->addField( jointObjectBName, pSceneObjectB );
+                            pJointNode->addNode( pSceneObjectB );
 					}
 					}
 					break;
 					break;
 
 
@@ -4630,11 +4686,12 @@ void Scene::onTamlCustomWrite( TamlCustomNodes& customNodes )
 						pJointNode->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
 						pJointNode->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
 						pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 						pJointNode->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
 
 
-						// Add bodies.
+						// Add scene object bodies.
 						if ( pSceneObjectA != NULL )
 						if ( pSceneObjectA != NULL )
-							pJointNode->addField( jointObjectAName, pSceneObjectA );
+                            pJointNode->addNode( pSceneObjectA );
+
 						if ( pSceneObjectB != NULL )
 						if ( pSceneObjectB != NULL )
-							pJointNode->addField( jointObjectBName, pSceneObjectB );
+                            pJointNode->addNode( pSceneObjectB );
 					}
 					}
 					break;
 					break;
 
 
@@ -4664,11 +4721,12 @@ void Scene::onTamlCustomWrite( TamlCustomNodes& customNodes )
 						pJointNode->addField( jointLocalAnchorAName, pJoint->GetBodyA()->GetLocalPoint( pJoint->GetAnchorA() ) );
 						pJointNode->addField( jointLocalAnchorAName, pJoint->GetBodyA()->GetLocalPoint( pJoint->GetAnchorA() ) );
 						pJointNode->addField( jointLocalAnchorBName, pJoint->GetBodyB()->GetLocalPoint( pJoint->GetAnchorB() ) );
 						pJointNode->addField( jointLocalAnchorBName, pJoint->GetBodyB()->GetLocalPoint( pJoint->GetAnchorB() ) );
 
 
-						// Add bodies.
+						// Add scene object bodies.
 						if ( pSceneObjectA != NULL )
 						if ( pSceneObjectA != NULL )
-							pJointNode->addField( jointObjectAName, pSceneObjectA );
+                            pJointNode->addNode( pSceneObjectA );
+
 						if ( pSceneObjectB != NULL )
 						if ( pSceneObjectB != NULL )
-							pJointNode->addField( jointObjectBName, pSceneObjectB );
+                            pJointNode->addNode( pSceneObjectB );
 					}
 					}
 					break;
 					break;
 
 
@@ -4699,7 +4757,7 @@ void Scene::onTamlCustomWrite( TamlCustomNodes& customNodes )
 						// NOTE: This joint uses BODYB as the object, BODYA is the ground-body however for easy of use
 						// NOTE: This joint uses BODYB as the object, BODYA is the ground-body however for easy of use
 						// we'll refer to this as OBJECTA in the persisted format.
 						// we'll refer to this as OBJECTA in the persisted format.
 						if ( pSceneObjectB != NULL )
 						if ( pSceneObjectB != NULL )
-							pJointNode->addField( jointObjectAName, pSceneObjectB );
+                            pJointNode->addNode( pSceneObjectB );
 					}
 					}
 					break;
 					break;
 
 
@@ -4731,11 +4789,12 @@ void Scene::onTamlCustomWrite( TamlCustomNodes& customNodes )
 						// Add correction factor.
 						// Add correction factor.
 						pJointNode->addField( jointMotorCorrectionFactorName, pJoint->GetCorrectionFactor() );
 						pJointNode->addField( jointMotorCorrectionFactorName, pJoint->GetCorrectionFactor() );
 
 
-						// Add bodies.
+						// Add scene object bodies.
 						if ( pSceneObjectA != NULL )
 						if ( pSceneObjectA != NULL )
-							pJointNode->addField( jointObjectAName, pSceneObjectA );
+                            pJointNode->addNode( pSceneObjectA );
+
 						if ( pSceneObjectB != NULL )
 						if ( pSceneObjectB != NULL )
-							pJointNode->addField( jointObjectBName, pSceneObjectB );
+                            pJointNode->addNode( pSceneObjectB );
 					}
 					}
 					break;
 					break;
 
 

+ 33 - 50
engine/source/persistence/taml/taml.cc

@@ -446,8 +446,8 @@ TamlWriteNode* Taml::compileObject( SimObject* pSimObject )
     // Compile children.
     // Compile children.
     compileChildren( pNewNode );
     compileChildren( pNewNode );
 
 
-    // Compile custom properties.
-    compileCustomProperties( pNewNode );
+    // Compile custom state.
+    compileCustomState( pNewNode );
 
 
     // Are there any Taml callbacks?
     // Are there any Taml callbacks?
     if ( pNewNode->mpTamlCallbacks != NULL )
     if ( pNewNode->mpTamlCallbacks != NULL )
@@ -692,66 +692,49 @@ void Taml::compileCustomState( TamlWriteNode* pTamlWriteNode )
     {
     {
         // Fetch the custom node.
         // Fetch the custom node.
         TamlCustomNode* pCustomNode = *customNodesItr;
         TamlCustomNode* pCustomNode = *customNodesItr;
-        
-        // Iterate alias.
-        for( TamlPropertyAliasVector::iterator typeAliasItr = pCustomProperty->begin(); typeAliasItr != pCustomProperty->end(); ++typeAliasItr )
-        {
-            TamlPropertyAlias* pAlias = *typeAliasItr;
 
 
-            // Iterate the fields.
-            for( TamlCustomFieldVector::iterator fieldItr = pAlias->begin(); fieldItr != pAlias->end(); ++fieldItr )
-            {
-                TamlCustomNodeField* pPropertyField = *fieldItr;
+        // Compile custom node state.
+        compileCustomNodeState( pCustomNode );
+    }
+}
 
 
-                // Skip if not an object field.
-                if ( !pPropertyField->isObjectField() )
-                    continue;
+//-----------------------------------------------------------------------------
 
 
-                // Compile the object.
-                TamlWriteNode* pCompiledWriteNode = compileObject( pPropertyField->getFieldObject() );
+void Taml::compileCustomNodeState( TamlCustomNode* pCustomNode )
+{
+    // Sanity!
+    AssertFatal( pCustomNode != NULL, "Taml: Cannot compile NULL custom node state." );
 
 
-                // Set reference field.
-                pCompiledWriteNode->mRefField = pPropertyField->getFieldName();
+    // Fetch children.
+    const TamlCustomNodeVector& children = pCustomNode->getChildren();
 
 
-                // Set the write node for the property field.
-                pPropertyField->setWriteNode( pCompiledWriteNode );
-            }
-        }
-    }
+    // Fetch proxy object.
+    SimObject* pProxyObject = pCustomNode->getProxyObject();
 
 
-#if 0
-    // Iterate the custom properties removing ignored items.
-    for( S32 customPropertyIndex = 0; customPropertyIndex < customProperties.size(); ++customPropertyIndex )
+    // Do we have a proxy object?
+    if ( pProxyObject != NULL )
     {
     {
-        // Fetch the custom property.
-        TamlCustomProperty* pCustomProperty = customProperties.at( customPropertyIndex );
-
-        // Skip if we are not ignoring the custom property if empty.
-        if ( !pCustomProperty->mIgnoreEmpty )
-            continue;
-
-        // Iterate the alias.
-        for ( S32 typeAliasIndex = 0; typeAliasIndex < pCustomProperty->size(); ++typeAliasIndex )
-        {
-            // Fetch the alias.
-            TamlPropertyAlias* pAlias = pCustomProperty->at( typeAliasIndex );
+        // Yes, so sanity!
+        AssertFatal( children.size() == 0, "Taml: Cannot compile a proxy object on a custom node that has children." );
 
 
-            // Skip If we're not ignoring the alias or the custom property is not empty.
-            if ( !pAlias->mIgnoreEmpty && pAlias->size() != 0 )
-                continue;
+        // Yes, so compile it.
+        pCustomNode->setWriteNode( compileObject( pProxyObject ) );
+        return;
+    }
 
 
-            // Remove the alias.
-            pCustomProperty->removeAlias( typeAliasIndex-- );
-        }
+    // Finish if no children.
+    if ( children.size() == 0 )
+        return;
 
 
-        // Skip if the custom property is not empty.
-        if ( pCustomProperty->size() != 0 )
-            continue;
+    // Iterate children.
+    for( TamlCustomNodeVector::const_iterator childItr = children.begin(); childItr != children.end(); ++childItr )
+    {
+        // Fetch shape node.
+        TamlCustomNode* pChildNode = *childItr;
 
 
-        // Remove the custom property.
-        customProperties.removeProperty( customPropertyIndex-- );
+        // Compile the child.
+        compileCustomNodeState( pChildNode );
     }
     }
-#endif
 }
 }
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------

+ 1 - 0
engine/source/persistence/taml/taml.h

@@ -108,6 +108,7 @@ private:
     void compileDynamicFields( TamlWriteNode* pTamlWriteNode );
     void compileDynamicFields( TamlWriteNode* pTamlWriteNode );
     void compileChildren( TamlWriteNode* pTamlWriteNode );
     void compileChildren( TamlWriteNode* pTamlWriteNode );
     void compileCustomState( TamlWriteNode* pTamlWriteNode );
     void compileCustomState( TamlWriteNode* pTamlWriteNode );
+    void compileCustomNodeState( TamlCustomNode* pCustomNode );
 
 
     bool write( FileStream& stream, SimObject* pSimObject, const TamlFormatMode formatMode );
     bool write( FileStream& stream, SimObject* pSimObject, const TamlFormatMode formatMode );
     SimObject* read( FileStream& stream, const TamlFormatMode formatMode );
     SimObject* read( FileStream& stream, const TamlFormatMode formatMode );

+ 0 - 20
engine/source/persistence/taml/tamlCustom.cc

@@ -53,25 +53,6 @@ void TamlCustomNodeField::set( const char* pFieldName, const char* pFieldValue )
 
 
 //-----------------------------------------------------------------------------
 //-----------------------------------------------------------------------------
 
 
-void TamlCustomNode::set( const char* pFieldName, SimObject* pProxyObject )
-{
-    // Sanity!
-    AssertFatal( pFieldName != NULL, "Field name cannot be NULL." );
-    AssertFatal( pProxyObject != NULL, "Field object cannot be NULL." );
-    AssertFatal( mpProxyWriteNode == NULL, "Field write node must be NULL." );
-
-    // Set node name.
-    mNodeName = StringTable->insert( pFieldName );
-
-    // Set proxy object.
-    mpProxyObject = pProxyObject;
-
-    // Remove any existing proxy write node.
-    SAFE_DELETE( mpProxyWriteNode );
-}
-
-//-----------------------------------------------------------------------------
-
 void TamlCustomNode::setWriteNode( TamlWriteNode* pWriteNode )
 void TamlCustomNode::setWriteNode( TamlWriteNode* pWriteNode )
 {
 {
     // Sanity!
     // Sanity!
@@ -84,4 +65,3 @@ void TamlCustomNode::setWriteNode( TamlWriteNode* pWriteNode )
     mpProxyWriteNode = pWriteNode;
     mpProxyWriteNode = pWriteNode;
 }
 }
 
 
-

+ 24 - 4
engine/source/persistence/taml/tamlCustom.h

@@ -243,10 +243,28 @@ public:
         mNodeName = StringTable->insert( pNodeName );
         mNodeName = StringTable->insert( pNodeName );
     }
     }
 
 
-    void set( const char* pNodeName, SimObject* pProxyObject );
-
     void setWriteNode( TamlWriteNode* pWriteNode );
     void setWriteNode( TamlWriteNode* pWriteNode );
 
 
+    TamlCustomNode* addNode( SimObject* pProxyObject )
+    {
+        // Sanity!
+        AssertFatal( pNodeName != NULL, "Field name cannot be NULL." );
+        AssertFatal( pProxyObject != NULL, "Field object cannot be NULL." );
+        AssertFatal( mpProxyWriteNode == NULL, "Field write node must be NULL." );
+
+        // Create a custom node.
+        TamlCustomNode* pCustomNode = TamlCustomNodeFactory.createObject();
+
+        // Set node name.
+        mNodeName = StringTable->insert( pProxyObject->getClassName() );
+
+        // Set proxy object.
+        mpProxyObject = pProxyObject;
+
+        // Remove any existing proxy write node.
+        SAFE_DELETE( mpProxyWriteNode );
+    }
+
     TamlCustomNode* addNode( const char* pNodeName, const bool ignoreEmpty = true )
     TamlCustomNode* addNode( const char* pNodeName, const bool ignoreEmpty = true )
     {
     {
         // Create a custom node.
         // Create a custom node.
@@ -470,8 +488,10 @@ public:
     inline bool isProxyObject( void ) const { return mpProxyObject != NULL; }
     inline bool isProxyObject( void ) const { return mpProxyObject != NULL; }
     SimObject* getProxyObject( void ) const { return mpProxyObject != NULL ? mpProxyObject : NULL; }
     SimObject* getProxyObject( void ) const { return mpProxyObject != NULL ? mpProxyObject : NULL; }
     inline const TamlWriteNode* getProxyWriteNode( void ) const { return mpProxyWriteNode; }
     inline const TamlWriteNode* getProxyWriteNode( void ) const { return mpProxyWriteNode; }
-
-
+    template<typename T> T* composeProxyObject( void ) const
+    {
+        return NULL;
+    }
 
 
     const TamlCustomNodeVector& getChildren( void ) const { return mChildren; }
     const TamlCustomNodeVector& getChildren( void ) const { return mChildren; }
     const TamlCustomFieldVector& getFields( void ) const { return mFields; }
     const TamlCustomFieldVector& getFields( void ) const { return mFields; }

+ 0 - 2
engine/source/persistence/taml/tamlWriteNode.h

@@ -67,7 +67,6 @@ public:
     {
     {
         // NOTE: This MUST be done before the state is reset otherwise we'll be touching uninitialized stuff.
         // NOTE: This MUST be done before the state is reset otherwise we'll be touching uninitialized stuff.
         mRefToNode = NULL;
         mRefToNode = NULL;
-        mRefField = StringTable->EmptyString;
         mChildren = NULL;
         mChildren = NULL;
         mpSimObject = NULL;
         mpSimObject = NULL;
         mpTamlCallbacks = NULL;
         mpTamlCallbacks = NULL;
@@ -107,7 +106,6 @@ public:
 
 
     U32                         mRefId;
     U32                         mRefId;
     TamlWriteNode*              mRefToNode;
     TamlWriteNode*              mRefToNode;
-    StringTableEntry            mRefField;
     SimObject*                  mpSimObject;
     SimObject*                  mpSimObject;
     TamlCallbacks*              mpTamlCallbacks;
     TamlCallbacks*              mpTamlCallbacks;
     const char*                 mpObjectName;
     const char*                 mpObjectName;