Browse Source

- Start of controller Taml work.

MelvMay-GG 12 years ago
parent
commit
d7182c4
1 changed files with 430 additions and 400 deletions
  1. 430 400
      engine/source/2d/scene/Scene.cc

+ 430 - 400
engine/source/2d/scene/Scene.cc

@@ -78,9 +78,9 @@ static ContactFilter mContactFilter;
 static U32 sSceneCount = 0;
 static U32 sSceneMasterIndex = 0;
 
-// Joint property names..
-static bool jointPropertiesInitialized = false;
+static bool tamlPropertiesInitialized = false;
 
+// Joint property names.
 static StringTableEntry jointCustomPropertyName;
 static StringTableEntry jointCollideConnectedName;
 static StringTableEntry jointObjectAName;
@@ -144,6 +144,8 @@ static StringTableEntry jointMotorMaxForceName;
 static StringTableEntry jointMotorMaxTorqueName;
 static StringTableEntry jointMotorCorrectionFactorName;
 
+static StringTableEntry controllerCustomPropertyName;
+
 //-----------------------------------------------------------------------------
 
 Scene::Scene() :
@@ -177,8 +179,8 @@ Scene::Scene() :
     mRenderCallback(false),
     mSceneIndex(0)
 {
-    // Initialize joint property names.
-    if ( !jointPropertiesInitialized )
+    // Initialize Taml property names.
+    if ( !tamlPropertiesInitialized )
     {
         jointCustomPropertyName           = StringTable->insert( "Joints" );
         jointCollideConnectedName         = StringTable->insert( "CollideConnected" );
@@ -243,8 +245,10 @@ Scene::Scene() :
         jointMotorMaxTorqueName           = jointRevoluteMotorMaxTorqueName;
         jointMotorCorrectionFactorName    = StringTable->insert( "CorrectionFactor" );
 
+		controllerCustomPropertyName	  = StringTable->insert( "Controllers" );
+
         // Flag as initialized.
-        jointPropertiesInitialized = true;
+        tamlPropertiesInitialized = true;
     }
 
     // Set Vector Associations.
@@ -4310,408 +4314,434 @@ void Scene::onTamlCustomWrite( TamlCustomProperties& customProperties )
     // Fetch joint count.
     const U32 jointCount = getJointCount();
 
-    // Finish if no joints.
-    if ( jointCount == 0 )
-        return;
-
-    // Add joint property.
-    TamlCustomProperty* pJointProperty = customProperties.addProperty( jointCustomPropertyName );
-
-    // Iterate joints.
-    for( typeJointHash::iterator jointItr = mJoints.begin(); jointItr != mJoints.end(); ++jointItr )
-    {
-        // Fetch base joint.
-        b2Joint* pBaseJoint = jointItr->value;
-
-        // Add joint alias.
-        // NOTE:    The name of the alias will get updated shortly.
-        TamlPropertyAlias* pJointAlias = pJointProperty->addAlias( StringTable->EmptyString );
-
-        // Fetch common details.
-        b2Body* pBodyA = pBaseJoint->GetBodyA();
-        b2Body* pBodyB = pBaseJoint->GetBodyB();
-
-        // Fetch physics proxies.
-        PhysicsProxy* pPhysicsProxyA = static_cast<PhysicsProxy*>(pBodyA->GetUserData());
-        PhysicsProxy* pPhysicsProxyB = static_cast<PhysicsProxy*>(pBodyB->GetUserData());
-
-        // Fetch physics proxy type.
-        PhysicsProxy::ePhysicsProxyType proxyTypeA = static_cast<PhysicsProxy*>(pBodyA->GetUserData())->getPhysicsProxyType();
-        PhysicsProxy::ePhysicsProxyType proxyTypeB = static_cast<PhysicsProxy*>(pBodyB->GetUserData())->getPhysicsProxyType();
-
-        // Fetch scene objects.
-        SceneObject* pSceneObjectA = proxyTypeA == PhysicsProxy::PHYSIC_PROXY_SCENEOBJECT ? static_cast<SceneObject*>(pPhysicsProxyA) : NULL;
-        SceneObject* pSceneObjectB = proxyTypeB == PhysicsProxy::PHYSIC_PROXY_SCENEOBJECT ? static_cast<SceneObject*>(pPhysicsProxyB) : NULL;
-
-        // Populate joint appropriately.
-        switch( pBaseJoint->GetType() )
-        {
-            case e_distanceJoint:
-                {
-                    // Set alias name.
-                    pJointAlias->mAliasName = StringTable->insert( jointDistanceTypeName );
-
-                    // Fetch joint.
-                    const b2DistanceJoint* pJoint = dynamic_cast<const b2DistanceJoint*>( pBaseJoint );
-
-                    // Sanity!
-                    AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid distance joint type returned." );
-
-                    // Add length.
-                    pJointAlias->addField( jointDistanceLengthName, pJoint->GetLength() );
-
-                    // Add frequency.
-                    if ( mNotZero( pJoint->GetFrequency() ) )
-                        pJointAlias->addField( jointDistanceFrequencyName, pJoint->GetFrequency() );
-
-                    // Add damping ratio.
-                    if ( mNotZero( pJoint->GetDampingRatio() ) )
-                        pJointAlias->addField( jointDistanceDampingRatioName, pJoint->GetDampingRatio() );
-
-                    // Add local anchors.
-                    if ( mNotZero( pJoint->GetLocalAnchorA().LengthSquared() ) )
-                        pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
-                    if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
-                        pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
-
-                    // Add bodies.
-                    if ( pSceneObjectA != NULL )
-                        pJointAlias->addField( jointObjectAName, pSceneObjectA );
-                    if ( pSceneObjectB != NULL )
-                        pJointAlias->addField( jointObjectBName, pSceneObjectB );
-                }
-                break;
-
-            case e_ropeJoint:
-                {
-                    // Set alias name.
-                    pJointAlias->mAliasName = StringTable->insert( jointRopeTypeName );
-
-                    // Fetch joint.
-                    const b2RopeJoint* pJoint = dynamic_cast<const b2RopeJoint*>( pBaseJoint );
-
-                    // Sanity!
-                    AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid rope joint type returned." );
-
-                    // Add max length.
-                    if ( mNotZero( pJoint->GetMaxLength() ) )
-                        pJointAlias->addField( jointRopeMaxLengthName, pJoint->GetMaxLength() );
-
-                    // Add local anchors.
-                    if ( mNotZero( pJoint->GetLocalAnchorA().LengthSquared() ) )
-                        pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
-                    if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
-                        pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
-
-                    // Add bodies.
-                    if ( pSceneObjectA != NULL )
-                        pJointAlias->addField( jointObjectAName, pSceneObjectA );
-                    if ( pSceneObjectB != NULL )
-                        pJointAlias->addField( jointObjectBName, pSceneObjectB );
-                }
-                break;
-
-            case e_revoluteJoint:
-                {
-                    // Set alias name.
-                    pJointAlias->mAliasName = StringTable->insert( jointRevoluteTypeName );
-
-                    // Fetch joint.
-                    const b2RevoluteJoint* pJoint = dynamic_cast<const b2RevoluteJoint*>( pBaseJoint );
-
-                    // Sanity!
-                    AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid revolute joint type returned." );
-
-                    // Add limit.
-                    if ( pJoint->IsLimitEnabled() )
-                    {
-                        // Add limits.
-                        pJointAlias->addField( jointRevoluteLimitLowerAngleName, mRadToDeg(pJoint->GetLowerLimit()) );
-                        pJointAlias->addField( jointRevoluteLimitUpperAngleName, mRadToDeg(pJoint->GetUpperLimit()) );
-                    }
-
-                    // Add motor.
-                    if ( pJoint->IsMotorEnabled() )
-                    {
-                        // Add motor.
-                        pJointAlias->addField( jointRevoluteMotorSpeedName, mRadToDeg(pJoint->GetMotorSpeed()) );
-                        pJointAlias->addField( jointRevoluteMotorMaxTorqueName, pJoint->GetMaxMotorTorque() );
-                    }
-
-                    // Add local anchors.
-                    if ( mNotZero( pJoint->GetLocalAnchorA().LengthSquared() ) )
-                        pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
-                    if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
-                        pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
-
-                    // Add bodies.
-                    if ( pSceneObjectA != NULL )
-                        pJointAlias->addField( jointObjectAName, pSceneObjectA );
-                    if ( pSceneObjectB != NULL )
-                        pJointAlias->addField( jointObjectBName, pSceneObjectB );
-                }
-                break;
-
-            case e_weldJoint:
-                {
-                    // Set alias name.
-                    pJointAlias->mAliasName = StringTable->insert( jointWeldTypeName );
-
-                    // Fetch joint.
-                    const b2WeldJoint* pJoint = dynamic_cast<const b2WeldJoint*>( pBaseJoint );
-
-                    // Sanity!
-                    AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid weld joint type returned." );
-
-                    // Add frequency.
-                    if ( mNotZero( pJoint->GetFrequency() ) )
-                        pJointAlias->addField( jointWeldFrequencyName, pJoint->GetFrequency() );
-
-                    // Add damping ratio.
-                    if ( mNotZero( pJoint->GetDampingRatio() ) )
-                        pJointAlias->addField( jointWeldDampingRatioName, pJoint->GetDampingRatio() );
-
-                    // Add local anchors.
-                    if ( mNotZero( pJoint->GetLocalAnchorA().LengthSquared() ) )
-                        pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
-                    if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
-                        pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
-
-                    // Add bodies.
-                    if ( pSceneObjectA != NULL )
-                        pJointAlias->addField( jointObjectAName, pSceneObjectA );
-                    if ( pSceneObjectB != NULL )
-                        pJointAlias->addField( jointObjectBName, pSceneObjectB );
-                }
-                break;
-
-            case e_wheelJoint:
-                {
-                    // Set alias name.
-                    pJointAlias->mAliasName = StringTable->insert( jointWheelTypeName );
-
-                    // Fetch joint.
-                    b2WheelJoint* pJoint = dynamic_cast<b2WheelJoint*>( pBaseJoint );
-
-                    // Sanity!
-                    AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid wheel joint type returned." );
-
-                    // Add motor.
-                    if ( pJoint->IsMotorEnabled() )
-                    {
-                        // Add motor.
-                        pJointAlias->addField( jointWheelMotorSpeedName, mRadToDeg(pJoint->GetMotorSpeed()) );
-                        pJointAlias->addField( jointWheelMotorMaxTorqueName, pJoint->GetMaxMotorTorque() );
-                    }
-
-                    // Add frequency.
-                    if ( mNotZero( pJoint->GetSpringFrequencyHz() ) )
-                        pJointAlias->addField( jointWheelFrequencyName, pJoint->GetSpringFrequencyHz() );
-
-                    // Add damping ratio.
-                    if ( mNotZero( pJoint->GetSpringDampingRatio() ) )
-                        pJointAlias->addField( jointWheelDampingRatioName, pJoint->GetSpringDampingRatio() );
-
-                    // Add world axis.
-                    pJointAlias->addField( jointWheelWorldAxisName, pJoint->GetBodyA()->GetWorldVector( pJoint->GetLocalAxisA() ) );
-
-                    // Add local anchors.
-                    pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
-                    pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
-
-                    // Add bodies.
-                    if ( pSceneObjectA != NULL )
-                        pJointAlias->addField( jointObjectAName, pSceneObjectA );
-                    if ( pSceneObjectB != NULL )
-                        pJointAlias->addField( jointObjectBName, pSceneObjectB );
-                }
-                break;
-
-            case e_frictionJoint:
-                {
-                    // Set alias name.
-                    pJointAlias->mAliasName = StringTable->insert( jointFrictionTypeName );
-
-                    // Fetch joint.
-                    const b2FrictionJoint* pJoint = dynamic_cast<const b2FrictionJoint*>( pBaseJoint );
-
-                    // Add max force.
-                    if ( mNotZero( pJoint->GetMaxForce() ) )
-                        pJointAlias->addField( jointFrictionMaxForceName, pJoint->GetMaxForce() );
-
-                    // Add max torque.
-                    if ( mNotZero( pJoint->GetMaxTorque() ) )
-                        pJointAlias->addField( jointFrictionMaxTorqueName, pJoint->GetMaxTorque() );
-
-                    // Sanity!
-                    AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid friction joint type returned." );
-
-                    // Add local anchors.
-                    if ( mNotZero( pJoint->GetLocalAnchorA().LengthSquared() ) )
-                        pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
-                    if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
-                        pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
-
-                    // Add bodies.
-                    if ( pSceneObjectA != NULL )
-                        pJointAlias->addField( jointObjectAName, pSceneObjectA );
-                    if ( pSceneObjectB != NULL )
-                        pJointAlias->addField( jointObjectBName, pSceneObjectB );
-                }
-                break;
-
-            case e_prismaticJoint:
-                {
-                    // Set alias name.
-                    pJointAlias->mAliasName = StringTable->insert( jointPrismaticTypeName );
-
-                    // Fetch joint.
-                    b2PrismaticJoint* pJoint = dynamic_cast<b2PrismaticJoint*>( pBaseJoint );
-
-                    // Sanity!
-                    AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid prismatic joint type returned." );
-
-                    // Add limit.
-                    if ( pJoint->IsLimitEnabled() )
-                    {
-                        // Add limits.
-                        pJointAlias->addField( jointPrismaticLimitLowerTransName, pJoint->GetLowerLimit() );
-                        pJointAlias->addField( jointPrismaticLimitUpperTransName, pJoint->GetUpperLimit() );
-                    }
-
-                    // Add motor.
-                    if ( pJoint->IsMotorEnabled() )
-                    {
-                        // Add motor.
-                        pJointAlias->addField( jointPrismaticMotorSpeedName, mRadToDeg(pJoint->GetMotorSpeed()) );
-                        pJointAlias->addField( jointPrismaticMotorMaxForceName, pJoint->GetMaxMotorForce() );
-                    }
-
-                    // Add world axis.
-                    pJointAlias->addField( jointPrismaticWorldAxisName, pJoint->GetBodyA()->GetWorldVector( pJoint->GetLocalAxisA() ) );
-
-                    // Add local anchors.
-                    pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
-                    pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
-
-                    // Add bodies.
-                    if ( pSceneObjectA != NULL )
-                        pJointAlias->addField( jointObjectAName, pSceneObjectA );
-                    if ( pSceneObjectB != NULL )
-                        pJointAlias->addField( jointObjectBName, pSceneObjectB );
-                }
-                break;
-
-            case e_pulleyJoint:
-                {
-                    // Set alias name.
-                    pJointAlias->mAliasName = StringTable->insert( jointPulleyTypeName );
-
-                    // Fetch joint.
-                    b2PulleyJoint* pJoint = dynamic_cast<b2PulleyJoint*>( pBaseJoint );
-
-                    // Sanity!
-                    AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid pulley joint type returned." );
-
-                    // Add lengths.
-                    pJointAlias->addField( jointPulleyLengthAName, pJoint->GetLengthA() );
-                    pJointAlias->addField( jointPulleyLengthBName, pJoint->GetLengthB() );
-
-                    // Add ratio,
-                    pJointAlias->addField( jointPulleyRatioName, pJoint->GetRatio() );
-
-                    // Add ground anchors.
-                    pJointAlias->addField( jointPulleyGroundAnchorAName, pJoint->GetGroundAnchorA() );
-                    pJointAlias->addField( jointPulleyGroundAnchorBName, pJoint->GetGroundAnchorB() );
-
-                    // Add local anchors.
-                    pJointAlias->addField( jointLocalAnchorAName, pJoint->GetBodyA()->GetLocalPoint( pJoint->GetAnchorA() ) );
-                    pJointAlias->addField( jointLocalAnchorBName, pJoint->GetBodyB()->GetLocalPoint( pJoint->GetAnchorB() ) );
-
-                    // Add bodies.
-                    if ( pSceneObjectA != NULL )
-                        pJointAlias->addField( jointObjectAName, pSceneObjectA );
-                    if ( pSceneObjectB != NULL )
-                        pJointAlias->addField( jointObjectBName, pSceneObjectB );
-                }
-                break;
-
-            case e_mouseJoint:
-                {
-                    // Set alias name.
-                    pJointAlias->mAliasName = StringTable->insert( jointTargetTypeName );
-
-                    // Fetch joint.
-                    const b2MouseJoint* pJoint = dynamic_cast<const b2MouseJoint*>( pBaseJoint );
-
-                    // Sanity!
-                    AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid target joint type returned." );
-
-                    // Add target.
-                    pJointAlias->addField( jointTargetWorldTargetName, pJoint->GetTarget() );
-
-                    // Add max force.
-                    pJointAlias->addField( jointTargetMaxForceName, pJoint->GetMaxForce() );
-
-                    // Add frequency
-                    pJointAlias->addField( jointTargetFrequencyName, pJoint->GetFrequency() );
-
-                    // Add damping ratio.
-                    pJointAlias->addField( jointTargetDampingRatioName, pJoint->GetDampingRatio() );
-
-                    // Add body.
-                    // 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.
-                    if ( pSceneObjectB != NULL )
-                        pJointAlias->addField( jointObjectAName, pSceneObjectB );
-                }
-                break;
-
-            case e_motorJoint:
-                {
-                    // Set alias name.
-                    pJointAlias->mAliasName = StringTable->insert( jointMotorTypeName );
-
-                    // Fetch joint.
-                    const b2MotorJoint* pJoint = dynamic_cast<const b2MotorJoint*>( pBaseJoint );
-
-                    // Sanity!
-                    AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid motor joint type returned." );
+    // Do we have any joints?
+    if ( jointCount > 0 )
+	{
+		// Yes, so add joint property.
+		TamlCustomProperty* pJointProperty = customProperties.addProperty( jointCustomPropertyName );
 
-                    // Add linear offset.
-                    if ( mNotZero( pJoint->GetLinearOffset().LengthSquared() ) )
-                        pJointAlias->addField( jointMotorLinearOffsetName, pJoint->GetLinearOffset() );
+		// Iterate joints.
+		for( typeJointHash::iterator jointItr = mJoints.begin(); jointItr != mJoints.end(); ++jointItr )
+		{
+			// Fetch base joint.
+			b2Joint* pBaseJoint = jointItr->value;
+
+			// Add joint alias.
+			// NOTE:    The name of the alias will get updated shortly.
+			TamlPropertyAlias* pJointAlias = pJointProperty->addAlias( StringTable->EmptyString );
+
+			// Fetch common details.
+			b2Body* pBodyA = pBaseJoint->GetBodyA();
+			b2Body* pBodyB = pBaseJoint->GetBodyB();
+
+			// Fetch physics proxies.
+			PhysicsProxy* pPhysicsProxyA = static_cast<PhysicsProxy*>(pBodyA->GetUserData());
+			PhysicsProxy* pPhysicsProxyB = static_cast<PhysicsProxy*>(pBodyB->GetUserData());
+
+			// Fetch physics proxy type.
+			PhysicsProxy::ePhysicsProxyType proxyTypeA = static_cast<PhysicsProxy*>(pBodyA->GetUserData())->getPhysicsProxyType();
+			PhysicsProxy::ePhysicsProxyType proxyTypeB = static_cast<PhysicsProxy*>(pBodyB->GetUserData())->getPhysicsProxyType();
+
+			// Fetch scene objects.
+			SceneObject* pSceneObjectA = proxyTypeA == PhysicsProxy::PHYSIC_PROXY_SCENEOBJECT ? static_cast<SceneObject*>(pPhysicsProxyA) : NULL;
+			SceneObject* pSceneObjectB = proxyTypeB == PhysicsProxy::PHYSIC_PROXY_SCENEOBJECT ? static_cast<SceneObject*>(pPhysicsProxyB) : NULL;
+
+			// Populate joint appropriately.
+			switch( pBaseJoint->GetType() )
+			{
+				case e_distanceJoint:
+					{
+						// Set alias name.
+						pJointAlias->mAliasName = StringTable->insert( jointDistanceTypeName );
+
+						// Fetch joint.
+						const b2DistanceJoint* pJoint = dynamic_cast<const b2DistanceJoint*>( pBaseJoint );
+
+						// Sanity!
+						AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid distance joint type returned." );
+
+						// Add length.
+						pJointAlias->addField( jointDistanceLengthName, pJoint->GetLength() );
+
+						// Add frequency.
+						if ( mNotZero( pJoint->GetFrequency() ) )
+							pJointAlias->addField( jointDistanceFrequencyName, pJoint->GetFrequency() );
+
+						// Add damping ratio.
+						if ( mNotZero( pJoint->GetDampingRatio() ) )
+							pJointAlias->addField( jointDistanceDampingRatioName, pJoint->GetDampingRatio() );
+
+						// Add local anchors.
+						if ( mNotZero( pJoint->GetLocalAnchorA().LengthSquared() ) )
+							pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
+						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
+							pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
+
+						// Add bodies.
+						if ( pSceneObjectA != NULL )
+							pJointAlias->addField( jointObjectAName, pSceneObjectA );
+						if ( pSceneObjectB != NULL )
+							pJointAlias->addField( jointObjectBName, pSceneObjectB );
+					}
+					break;
+
+				case e_ropeJoint:
+					{
+						// Set alias name.
+						pJointAlias->mAliasName = StringTable->insert( jointRopeTypeName );
+
+						// Fetch joint.
+						const b2RopeJoint* pJoint = dynamic_cast<const b2RopeJoint*>( pBaseJoint );
+
+						// Sanity!
+						AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid rope joint type returned." );
+
+						// Add max length.
+						if ( mNotZero( pJoint->GetMaxLength() ) )
+							pJointAlias->addField( jointRopeMaxLengthName, pJoint->GetMaxLength() );
+
+						// Add local anchors.
+						if ( mNotZero( pJoint->GetLocalAnchorA().LengthSquared() ) )
+							pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
+						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
+							pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
+
+						// Add bodies.
+						if ( pSceneObjectA != NULL )
+							pJointAlias->addField( jointObjectAName, pSceneObjectA );
+						if ( pSceneObjectB != NULL )
+							pJointAlias->addField( jointObjectBName, pSceneObjectB );
+					}
+					break;
+
+				case e_revoluteJoint:
+					{
+						// Set alias name.
+						pJointAlias->mAliasName = StringTable->insert( jointRevoluteTypeName );
+
+						// Fetch joint.
+						const b2RevoluteJoint* pJoint = dynamic_cast<const b2RevoluteJoint*>( pBaseJoint );
+
+						// Sanity!
+						AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid revolute joint type returned." );
+
+						// Add limit.
+						if ( pJoint->IsLimitEnabled() )
+						{
+							// Add limits.
+							pJointAlias->addField( jointRevoluteLimitLowerAngleName, mRadToDeg(pJoint->GetLowerLimit()) );
+							pJointAlias->addField( jointRevoluteLimitUpperAngleName, mRadToDeg(pJoint->GetUpperLimit()) );
+						}
+
+						// Add motor.
+						if ( pJoint->IsMotorEnabled() )
+						{
+							// Add motor.
+							pJointAlias->addField( jointRevoluteMotorSpeedName, mRadToDeg(pJoint->GetMotorSpeed()) );
+							pJointAlias->addField( jointRevoluteMotorMaxTorqueName, pJoint->GetMaxMotorTorque() );
+						}
+
+						// Add local anchors.
+						if ( mNotZero( pJoint->GetLocalAnchorA().LengthSquared() ) )
+							pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
+						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
+							pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
+
+						// Add bodies.
+						if ( pSceneObjectA != NULL )
+							pJointAlias->addField( jointObjectAName, pSceneObjectA );
+						if ( pSceneObjectB != NULL )
+							pJointAlias->addField( jointObjectBName, pSceneObjectB );
+					}
+					break;
+
+				case e_weldJoint:
+					{
+						// Set alias name.
+						pJointAlias->mAliasName = StringTable->insert( jointWeldTypeName );
+
+						// Fetch joint.
+						const b2WeldJoint* pJoint = dynamic_cast<const b2WeldJoint*>( pBaseJoint );
+
+						// Sanity!
+						AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid weld joint type returned." );
+
+						// Add frequency.
+						if ( mNotZero( pJoint->GetFrequency() ) )
+							pJointAlias->addField( jointWeldFrequencyName, pJoint->GetFrequency() );
+
+						// Add damping ratio.
+						if ( mNotZero( pJoint->GetDampingRatio() ) )
+							pJointAlias->addField( jointWeldDampingRatioName, pJoint->GetDampingRatio() );
+
+						// Add local anchors.
+						if ( mNotZero( pJoint->GetLocalAnchorA().LengthSquared() ) )
+							pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
+						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
+							pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
+
+						// Add bodies.
+						if ( pSceneObjectA != NULL )
+							pJointAlias->addField( jointObjectAName, pSceneObjectA );
+						if ( pSceneObjectB != NULL )
+							pJointAlias->addField( jointObjectBName, pSceneObjectB );
+					}
+					break;
+
+				case e_wheelJoint:
+					{
+						// Set alias name.
+						pJointAlias->mAliasName = StringTable->insert( jointWheelTypeName );
+
+						// Fetch joint.
+						b2WheelJoint* pJoint = dynamic_cast<b2WheelJoint*>( pBaseJoint );
+
+						// Sanity!
+						AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid wheel joint type returned." );
+
+						// Add motor.
+						if ( pJoint->IsMotorEnabled() )
+						{
+							// Add motor.
+							pJointAlias->addField( jointWheelMotorSpeedName, mRadToDeg(pJoint->GetMotorSpeed()) );
+							pJointAlias->addField( jointWheelMotorMaxTorqueName, pJoint->GetMaxMotorTorque() );
+						}
+
+						// Add frequency.
+						if ( mNotZero( pJoint->GetSpringFrequencyHz() ) )
+							pJointAlias->addField( jointWheelFrequencyName, pJoint->GetSpringFrequencyHz() );
+
+						// Add damping ratio.
+						if ( mNotZero( pJoint->GetSpringDampingRatio() ) )
+							pJointAlias->addField( jointWheelDampingRatioName, pJoint->GetSpringDampingRatio() );
+
+						// Add world axis.
+						pJointAlias->addField( jointWheelWorldAxisName, pJoint->GetBodyA()->GetWorldVector( pJoint->GetLocalAxisA() ) );
+
+						// Add local anchors.
+						pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
+						pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
+
+						// Add bodies.
+						if ( pSceneObjectA != NULL )
+							pJointAlias->addField( jointObjectAName, pSceneObjectA );
+						if ( pSceneObjectB != NULL )
+							pJointAlias->addField( jointObjectBName, pSceneObjectB );
+					}
+					break;
+
+				case e_frictionJoint:
+					{
+						// Set alias name.
+						pJointAlias->mAliasName = StringTable->insert( jointFrictionTypeName );
+
+						// Fetch joint.
+						const b2FrictionJoint* pJoint = dynamic_cast<const b2FrictionJoint*>( pBaseJoint );
+
+						// Add max force.
+						if ( mNotZero( pJoint->GetMaxForce() ) )
+							pJointAlias->addField( jointFrictionMaxForceName, pJoint->GetMaxForce() );
+
+						// Add max torque.
+						if ( mNotZero( pJoint->GetMaxTorque() ) )
+							pJointAlias->addField( jointFrictionMaxTorqueName, pJoint->GetMaxTorque() );
+
+						// Sanity!
+						AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid friction joint type returned." );
+
+						// Add local anchors.
+						if ( mNotZero( pJoint->GetLocalAnchorA().LengthSquared() ) )
+							pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
+						if ( mNotZero( pJoint->GetLocalAnchorB().LengthSquared() ) )
+							pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
+
+						// Add bodies.
+						if ( pSceneObjectA != NULL )
+							pJointAlias->addField( jointObjectAName, pSceneObjectA );
+						if ( pSceneObjectB != NULL )
+							pJointAlias->addField( jointObjectBName, pSceneObjectB );
+					}
+					break;
+
+				case e_prismaticJoint:
+					{
+						// Set alias name.
+						pJointAlias->mAliasName = StringTable->insert( jointPrismaticTypeName );
+
+						// Fetch joint.
+						b2PrismaticJoint* pJoint = dynamic_cast<b2PrismaticJoint*>( pBaseJoint );
+
+						// Sanity!
+						AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid prismatic joint type returned." );
+
+						// Add limit.
+						if ( pJoint->IsLimitEnabled() )
+						{
+							// Add limits.
+							pJointAlias->addField( jointPrismaticLimitLowerTransName, pJoint->GetLowerLimit() );
+							pJointAlias->addField( jointPrismaticLimitUpperTransName, pJoint->GetUpperLimit() );
+						}
+
+						// Add motor.
+						if ( pJoint->IsMotorEnabled() )
+						{
+							// Add motor.
+							pJointAlias->addField( jointPrismaticMotorSpeedName, mRadToDeg(pJoint->GetMotorSpeed()) );
+							pJointAlias->addField( jointPrismaticMotorMaxForceName, pJoint->GetMaxMotorForce() );
+						}
+
+						// Add world axis.
+						pJointAlias->addField( jointPrismaticWorldAxisName, pJoint->GetBodyA()->GetWorldVector( pJoint->GetLocalAxisA() ) );
+
+						// Add local anchors.
+						pJointAlias->addField( jointLocalAnchorAName, pJoint->GetLocalAnchorA() );
+						pJointAlias->addField( jointLocalAnchorBName, pJoint->GetLocalAnchorB() );
+
+						// Add bodies.
+						if ( pSceneObjectA != NULL )
+							pJointAlias->addField( jointObjectAName, pSceneObjectA );
+						if ( pSceneObjectB != NULL )
+							pJointAlias->addField( jointObjectBName, pSceneObjectB );
+					}
+					break;
+
+				case e_pulleyJoint:
+					{
+						// Set alias name.
+						pJointAlias->mAliasName = StringTable->insert( jointPulleyTypeName );
+
+						// Fetch joint.
+						b2PulleyJoint* pJoint = dynamic_cast<b2PulleyJoint*>( pBaseJoint );
+
+						// Sanity!
+						AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid pulley joint type returned." );
+
+						// Add lengths.
+						pJointAlias->addField( jointPulleyLengthAName, pJoint->GetLengthA() );
+						pJointAlias->addField( jointPulleyLengthBName, pJoint->GetLengthB() );
+
+						// Add ratio,
+						pJointAlias->addField( jointPulleyRatioName, pJoint->GetRatio() );
+
+						// Add ground anchors.
+						pJointAlias->addField( jointPulleyGroundAnchorAName, pJoint->GetGroundAnchorA() );
+						pJointAlias->addField( jointPulleyGroundAnchorBName, pJoint->GetGroundAnchorB() );
+
+						// Add local anchors.
+						pJointAlias->addField( jointLocalAnchorAName, pJoint->GetBodyA()->GetLocalPoint( pJoint->GetAnchorA() ) );
+						pJointAlias->addField( jointLocalAnchorBName, pJoint->GetBodyB()->GetLocalPoint( pJoint->GetAnchorB() ) );
+
+						// Add bodies.
+						if ( pSceneObjectA != NULL )
+							pJointAlias->addField( jointObjectAName, pSceneObjectA );
+						if ( pSceneObjectB != NULL )
+							pJointAlias->addField( jointObjectBName, pSceneObjectB );
+					}
+					break;
+
+				case e_mouseJoint:
+					{
+						// Set alias name.
+						pJointAlias->mAliasName = StringTable->insert( jointTargetTypeName );
+
+						// Fetch joint.
+						const b2MouseJoint* pJoint = dynamic_cast<const b2MouseJoint*>( pBaseJoint );
+
+						// Sanity!
+						AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid target joint type returned." );
+
+						// Add target.
+						pJointAlias->addField( jointTargetWorldTargetName, pJoint->GetTarget() );
+
+						// Add max force.
+						pJointAlias->addField( jointTargetMaxForceName, pJoint->GetMaxForce() );
+
+						// Add frequency
+						pJointAlias->addField( jointTargetFrequencyName, pJoint->GetFrequency() );
+
+						// Add damping ratio.
+						pJointAlias->addField( jointTargetDampingRatioName, pJoint->GetDampingRatio() );
+
+						// Add body.
+						// 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.
+						if ( pSceneObjectB != NULL )
+							pJointAlias->addField( jointObjectAName, pSceneObjectB );
+					}
+					break;
+
+				case e_motorJoint:
+					{
+						// Set alias name.
+						pJointAlias->mAliasName = StringTable->insert( jointMotorTypeName );
+
+						// Fetch joint.
+						const b2MotorJoint* pJoint = dynamic_cast<const b2MotorJoint*>( pBaseJoint );
+
+						// Sanity!
+						AssertFatal( pJoint != NULL, "Scene::onTamlCustomWrite() - Invalid motor joint type returned." );
+
+						// Add linear offset.
+						if ( mNotZero( pJoint->GetLinearOffset().LengthSquared() ) )
+							pJointAlias->addField( jointMotorLinearOffsetName, pJoint->GetLinearOffset() );
+
+						// Add angular offset.
+						if ( mNotZero( pJoint->GetAngularOffset() ) )
+							pJointAlias->addField( jointMotorAngularOffsetName, mRadToDeg( pJoint->GetAngularOffset() ) );
+
+						// Add max force.
+						pJointAlias->addField( jointMotorMaxForceName, pJoint->GetMaxForce() );
+
+						// Add max torque.
+						pJointAlias->addField( jointMotorMaxTorqueName, pJoint->GetMaxTorque() );
+
+						// Add correction factor.
+						pJointAlias->addField( jointMotorCorrectionFactorName, pJoint->GetCorrectionFactor() );
+
+						// Add bodies.
+						if ( pSceneObjectA != NULL )
+							pJointAlias->addField( jointObjectAName, pSceneObjectA );
+						if ( pSceneObjectB != NULL )
+							pJointAlias->addField( jointObjectBName, pSceneObjectB );
+					}
+					break;
+
+			default:
+				// Sanity!
+				AssertFatal( false, "Scene::onTamlCustomWrite() - Unknown joint type detected." );
+			}
+
+			// Add collide connected flag.
+			if ( pBaseJoint->GetCollideConnected() )
+				pJointAlias->addField( jointCollideConnectedName, pBaseJoint->GetCollideConnected() );
+		}
+	}
 
-                    // Add angular offset.
-                    if ( mNotZero( pJoint->GetAngularOffset() ) )
-                        pJointAlias->addField( jointMotorAngularOffsetName, mRadToDeg( pJoint->GetAngularOffset() ) );
+	// Fetch controller count.
+	const S32 sceneControllerCount = getControllers() ? getControllers()->size() : 0;
+	
+	// Do we have any scene controllers?
+	if ( sceneControllerCount > 0 )
+	{
+		// Yes, so add controller property.
+		TamlCustomProperty* pControllerProperty = customProperties.addProperty( controllerCustomPropertyName );
 
-                    // Add max force.
-                    pJointAlias->addField( jointMotorMaxForceName, pJoint->GetMaxForce() );
+		// Fetch the scene controllers.
+		SimSet* pControllerSet = getControllers();
 
-                    // Add max torque.
-                    pJointAlias->addField( jointMotorMaxTorqueName, pJoint->GetMaxTorque() );
+		// Iterate scene controllers.
+		for( S32 i = 0; i < sceneControllerCount; i++ )
+		{
+			// Fetch the scene controller.
+			SceneController* pController = dynamic_cast<SceneController*>((*pControllerSet)[i]);
 
-                    // Add correction factor.
-                    pJointAlias->addField( jointMotorCorrectionFactorName, pJoint->GetCorrectionFactor() );
+			// Skip if not a controller.
+			if ( pController == NULL )
+				continue;
 
-                    // Add bodies.
-                    if ( pSceneObjectA != NULL )
-                        pJointAlias->addField( jointObjectAName, pSceneObjectA );
-                    if ( pSceneObjectB != NULL )
-                        pJointAlias->addField( jointObjectBName, pSceneObjectB );
-                }
-                break;
 
-        default:
-            // Sanity!
-            AssertFatal( false, "Scene::onTamlCustomWrite() - Unknown joint type detected." );
-        }
-
-        // Add collide connected flag.
-        if ( pBaseJoint->GetCollideConnected() )
-            pJointAlias->addField( jointCollideConnectedName, pBaseJoint->GetCollideConnected() );
-    }
+		}
+	}
 }
 
 //-----------------------------------------------------------------------------