فهرست منبع

Merge pull request #951 from Azaezel/alpha403/clusterCleanups

inspector cleanups
Brian Roberts 2 سال پیش
والد
کامیت
6e35acf2a2
100فایلهای تغییر یافته به همراه823 افزوده شده و 732 حذف شده
  1. 1 0
      Engine/source/T3D/Scene.cpp
  2. 1 0
      Engine/source/T3D/accumulationVolume.cpp
  3. 1 0
      Engine/source/T3D/aiPlayer.cpp
  4. 1 0
      Engine/source/T3D/assets/CppAsset.cpp
  5. 1 0
      Engine/source/T3D/assets/CubemapAsset.cpp
  6. 1 0
      Engine/source/T3D/assets/ExampleAsset.cpp
  7. 1 0
      Engine/source/T3D/assets/GUIAsset.cpp
  8. 1 0
      Engine/source/T3D/assets/GameObjectAsset.cpp
  9. 1 0
      Engine/source/T3D/assets/ImageAsset.cpp
  10. 1 0
      Engine/source/T3D/assets/LevelAsset.cpp
  11. 1 0
      Engine/source/T3D/assets/MaterialAsset.cpp
  12. 1 0
      Engine/source/T3D/assets/ParticleAsset.cpp
  13. 1 0
      Engine/source/T3D/assets/PostEffectAsset.cpp
  14. 1 0
      Engine/source/T3D/assets/ScriptAsset.cpp
  15. 1 0
      Engine/source/T3D/assets/ShapeAnimationAsset.cpp
  16. 1 0
      Engine/source/T3D/assets/ShapeAsset.cpp
  17. 1 0
      Engine/source/T3D/assets/SoundAsset.cpp
  18. 1 0
      Engine/source/T3D/assets/TerrainAsset.cpp
  19. 1 0
      Engine/source/T3D/assets/TerrainMaterialAsset.cpp
  20. 3 0
      Engine/source/T3D/assets/assetImporter.cpp
  21. 1 0
      Engine/source/T3D/assets/stateMachineAsset.cpp
  22. 2 0
      Engine/source/T3D/camera.cpp
  23. 1 0
      Engine/source/T3D/convexShape.cpp
  24. 14 11
      Engine/source/T3D/debris.cpp
  25. 1 0
      Engine/source/T3D/decal/decalData.cpp
  26. 1 0
      Engine/source/T3D/examples/renderMeshExample.cpp
  27. 2 1
      Engine/source/T3D/examples/renderObjectExample.cpp
  28. 4 3
      Engine/source/T3D/examples/renderShapeExample.cpp
  29. 1 0
      Engine/source/T3D/fps/guiClockHud.cpp
  30. 1 0
      Engine/source/T3D/fps/guiCrossHairHud.cpp
  31. 1 0
      Engine/source/T3D/fps/guiHealthBarHud.cpp
  32. 3 2
      Engine/source/T3D/fps/guiHealthTextHud.cpp
  33. 1 0
      Engine/source/T3D/fps/guiShapeNameHud.cpp
  34. 142 127
      Engine/source/T3D/fx/explosion.cpp
  35. 1 0
      Engine/source/T3D/fx/fxFoliageReplicator.cpp
  36. 1 0
      Engine/source/T3D/fx/fxShapeReplicator.cpp
  37. 1 0
      Engine/source/T3D/fx/groundCover.cpp
  38. 2 0
      Engine/source/T3D/fx/lightning.cpp
  39. 1 0
      Engine/source/T3D/fx/particle.cpp
  40. 1 0
      Engine/source/T3D/fx/particleEmitter.cpp
  41. 2 0
      Engine/source/T3D/fx/particleEmitterNode.cpp
  42. 2 0
      Engine/source/T3D/fx/precipitation.cpp
  43. 2 0
      Engine/source/T3D/fx/ribbon.cpp
  44. 2 0
      Engine/source/T3D/fx/ribbonNode.cpp
  45. 2 1
      Engine/source/T3D/fx/splash.cpp
  46. 2 0
      Engine/source/T3D/gameBase/gameBase.cpp
  47. 1 0
      Engine/source/T3D/groundPlane.cpp
  48. 1 0
      Engine/source/T3D/guiObjectView.cpp
  49. 37 38
      Engine/source/T3D/item.cpp
  50. 1 0
      Engine/source/T3D/levelInfo.cpp
  51. 1 0
      Engine/source/T3D/lightAnimData.cpp
  52. 1 0
      Engine/source/T3D/lightBase.cpp
  53. 1 0
      Engine/source/T3D/lightDescription.cpp
  54. 1 0
      Engine/source/T3D/lightFlareData.cpp
  55. 1 0
      Engine/source/T3D/lighting/boxEnvironmentProbe.cpp
  56. 1 0
      Engine/source/T3D/lighting/reflectionProbe.cpp
  57. 1 0
      Engine/source/T3D/lighting/skylight.cpp
  58. 1 0
      Engine/source/T3D/lighting/sphereEnvironmentProbe.cpp
  59. 2 1
      Engine/source/T3D/missionArea.cpp
  60. 6 1
      Engine/source/T3D/missionMarker.cpp
  61. 1 0
      Engine/source/T3D/notesObject.cpp
  62. 3 1
      Engine/source/T3D/pathCamera.cpp
  63. 3 1
      Engine/source/T3D/pathShape.cpp
  64. 1 0
      Engine/source/T3D/physicalZone.cpp
  65. 10 8
      Engine/source/T3D/physics/physicsDebris.cpp
  66. 2 1
      Engine/source/T3D/physics/physicsForce.cpp
  67. 7 6
      Engine/source/T3D/physics/physicsShape.cpp
  68. 3 3
      Engine/source/T3D/player.cpp
  69. 1 0
      Engine/source/T3D/pointLight.cpp
  70. 1 0
      Engine/source/T3D/portal.cpp
  71. 1 0
      Engine/source/T3D/prefab.cpp
  72. 86 84
      Engine/source/T3D/projectile.cpp
  73. 7 8
      Engine/source/T3D/proximityMine.cpp
  74. 28 47
      Engine/source/T3D/rigidShape.cpp
  75. 1 0
      Engine/source/T3D/scopeAlwaysShape.cpp
  76. 1 0
      Engine/source/T3D/sfx/sfxEmitter.cpp
  77. 28 49
      Engine/source/T3D/shapeBase.cpp
  78. 0 2
      Engine/source/T3D/shapeBase.h
  79. 124 140
      Engine/source/T3D/shapeImage.cpp
  80. 1 0
      Engine/source/T3D/spotLight.cpp
  81. 3 5
      Engine/source/T3D/staticShape.cpp
  82. 2 0
      Engine/source/T3D/trigger.cpp
  83. 9 8
      Engine/source/T3D/tsStatic.cpp
  84. 24 25
      Engine/source/T3D/turret/aiTurretShape.cpp
  85. 27 25
      Engine/source/T3D/turret/turretShape.cpp
  86. 37 17
      Engine/source/T3D/vehicles/flyingVehicle.cpp
  87. 1 0
      Engine/source/T3D/vehicles/guiSpeedometer.cpp
  88. 74 77
      Engine/source/T3D/vehicles/hoverVehicle.cpp
  89. 35 25
      Engine/source/T3D/vehicles/vehicle.cpp
  90. 1 0
      Engine/source/T3D/vehicles/vehicleBlocker.cpp
  91. 14 5
      Engine/source/T3D/vehicles/wheeledVehicle.cpp
  92. 1 0
      Engine/source/T3D/zone.cpp
  93. 2 1
      Engine/source/Verve/Core/VController.cpp
  94. 1 1
      Engine/source/Verve/Core/VController.h
  95. 3 2
      Engine/source/Verve/Core/VEvent.cpp
  96. 1 1
      Engine/source/Verve/Core/VEvent.h
  97. 2 1
      Engine/source/Verve/Core/VObject.cpp
  98. 1 1
      Engine/source/Verve/Core/VObject.h
  99. 3 2
      Engine/source/Verve/Extension/Animation/VShapeAnimationEvent.cpp
  100. 1 1
      Engine/source/Verve/Extension/Animation/VShapeAnimationEvent.h

+ 1 - 0
Engine/source/T3D/Scene.cpp

@@ -24,6 +24,7 @@ Scene::~Scene()
 
 void Scene::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 
    addGroup("Internal");

+ 1 - 0
Engine/source/T3D/accumulationVolume.cpp

@@ -97,6 +97,7 @@ AccumulationVolume::~AccumulationVolume()
 
 void AccumulationVolume::initPersistFields()
 {
+   docsURL;
    addProtectedField("textureAsset", TypeImageAssetId, Offset(mTextureAssetId, AccumulationVolume),
       &_setTexture, &defaultProtectedGetFn, "Accumulation texture.");
    addProtectedField( "texture", TypeStringFilename, Offset( mTextureName, AccumulationVolume ),

+ 1 - 0
Engine/source/T3D/aiPlayer.cpp

@@ -133,6 +133,7 @@ AIPlayer::~AIPlayer()
 
 void AIPlayer::initPersistFields()
 {
+   docsURL;
    addGroup( "AI" );
 
       addField( "mMoveTolerance", TypeF32, Offset( mMoveTolerance, AIPlayer ), 

+ 1 - 0
Engine/source/T3D/assets/CppAsset.cpp

@@ -107,6 +107,7 @@ CppAsset::~CppAsset()
 
 void CppAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/CubemapAsset.cpp

@@ -111,6 +111,7 @@ CubemapAsset::~CubemapAsset()
 
 void CubemapAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/ExampleAsset.cpp

@@ -104,6 +104,7 @@ ExampleAsset::~ExampleAsset()
 
 void ExampleAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/GUIAsset.cpp

@@ -95,6 +95,7 @@ GUIAsset::~GUIAsset()
 
 void GUIAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/GameObjectAsset.cpp

@@ -109,6 +109,7 @@ GameObjectAsset::~GameObjectAsset()
 
 void GameObjectAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/ImageAsset.cpp

@@ -155,6 +155,7 @@ void ImageAsset::consoleInit()
 
 void ImageAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/LevelAsset.cpp

@@ -111,6 +111,7 @@ LevelAsset::~LevelAsset()
 
 void LevelAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/MaterialAsset.cpp

@@ -150,6 +150,7 @@ void MaterialAsset::consoleInit()
 
 void MaterialAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/ParticleAsset.cpp

@@ -106,6 +106,7 @@ ParticleAsset::~ParticleAsset()
 
 void ParticleAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/PostEffectAsset.cpp

@@ -111,6 +111,7 @@ PostEffectAsset::~PostEffectAsset()
 
 void PostEffectAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/ScriptAsset.cpp

@@ -105,6 +105,7 @@ ScriptAsset::~ScriptAsset()
 
 void ScriptAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/ShapeAnimationAsset.cpp

@@ -112,6 +112,7 @@ ShapeAnimationAsset::~ShapeAnimationAsset()
 
 void ShapeAnimationAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/ShapeAsset.cpp

@@ -165,6 +165,7 @@ void ShapeAsset::consoleInit()
 
 void ShapeAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/SoundAsset.cpp

@@ -147,6 +147,7 @@ SoundAsset::~SoundAsset()
 
 void SoundAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/TerrainAsset.cpp

@@ -134,6 +134,7 @@ TerrainAsset::~TerrainAsset()
 
 void TerrainAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/assets/TerrainMaterialAsset.cpp

@@ -153,6 +153,7 @@ void TerrainMaterialAsset::consoleInit()
 
 void TerrainMaterialAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 3 - 0
Engine/source/T3D/assets/assetImporter.cpp

@@ -134,6 +134,7 @@ void AssetImportConfig::onRemove()
 /// Engine.
 void AssetImportConfig::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 
    addGroup("General");
@@ -466,6 +467,7 @@ void AssetImportObject::onRemove()
 
 void AssetImportObject::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 
    addField("assetType", TypeRealString, Offset(assetType, AssetImportObject), "What type is the importing asset");
@@ -539,6 +541,7 @@ void AssetImporter::onRemove()
 
 void AssetImporter::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 
    addField("targetModuleId", TypeRealString, Offset(targetModuleId, AssetImporter), "The Id of the module the assets are to be imported into");

+ 1 - 0
Engine/source/T3D/assets/stateMachineAsset.cpp

@@ -106,6 +106,7 @@ StateMachineAsset::~StateMachineAsset()
 
 void StateMachineAsset::initPersistFields()
 {
+   docsURL;
    // Call parent.
    Parent::initPersistFields();
 

+ 2 - 0
Engine/source/T3D/camera.cpp

@@ -85,6 +85,7 @@ ConsoleDocClass( CameraData,
 
 void CameraData::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 }
 
@@ -1307,6 +1308,7 @@ void Camera::unpackUpdate(NetConnection *con, BitStream *bstream)
 
 void Camera::initPersistFields()
 {
+   docsURL;
    addGroup( "Camera" );
       addProtectedField( "controlMode", TYPEID< CameraMotionMode >(), Offset( mMode, Camera ),
          &_setModeField, &defaultProtectedGetFn,

+ 1 - 0
Engine/source/T3D/convexShape.cpp

@@ -309,6 +309,7 @@ ConvexShape::~ConvexShape()
 
 void ConvexShape::initPersistFields()
 {
+   docsURL;
    addGroup( "Rendering" );
 
       INITPERSISTFIELD_MATERIALASSET(Material, ConvexShape, "Default material used to render the ConvexShape surface.");

+ 14 - 11
Engine/source/T3D/debris.cpp

@@ -295,21 +295,23 @@ bool DebrisData::preload(bool server, String &errorStr)
 
 void DebrisData::initPersistFields()
 {
-   addGroup("Display");
-   addField("texture",              TypeString,                  Offset(textureName,         DebrisData), 
-      "@brief Texture imagemap to use for this debris object.\n\nNot used any more.\n", AbstractClassRep::FIELD_HideInInspectors);
-
-   INITPERSISTFIELD_SHAPEASSET(Shape, DebrisData, "Shape to use for this debris object.");
-   endGroup("Display");
-
+   docsURL;
+   addGroup("Shapes");
+      addField("texture",              TypeString,                  Offset(textureName,         DebrisData), 
+         "@brief Texture imagemap to use for this debris object.\n\nNot used any more.\n", AbstractClassRep::FIELD_HideInInspectors);
+      INITPERSISTFIELD_SHAPEASSET(Shape, DebrisData, "Shape to use for this debris object.");
+   endGroup("Shapes");
+
+   addGroup("Particle Effects");
+      addField("emitters",             TYPEID< ParticleEmitterData >(),  Offset(emitterList,    DebrisData), DDC_NUM_EMITTERS, 
+         "@brief List of particle emitters to spawn along with this debris object.\n\nThese are optional.  You could have Debris made up of only a shape.\n");
+   addGroup("Particle Effects");
    addGroup("Datablocks");
-   addField("emitters",             TYPEID< ParticleEmitterData >(),  Offset(emitterList,    DebrisData), DDC_NUM_EMITTERS, 
-      "@brief List of particle emitters to spawn along with this debris object.\n\nThese are optional.  You could have Debris made up of only a shape.\n");
    addField("explosion",            TYPEID< ExplosionData >(),   Offset(explosion,           DebrisData), 
       "@brief ExplosionData to spawn along with this debris object.\n\nThis is optional as not all Debris explode.\n");
    endGroup("Datablocks");
 
-   addGroup("Physical Properties");
+   addGroup("Physics");
    addField("elasticity",           TypeF32,                     Offset(elasticity,          DebrisData), 
       "@brief A floating-point value specifying how 'bouncy' this object is.\n\nMust be in the range of -10 to 10.\n");
    addField("friction",             TypeF32,                     Offset(friction,            DebrisData), 
@@ -338,7 +340,7 @@ void DebrisData::initPersistFields()
       "@brief Use mass calculations based on radius.\n\nAllows for the adjustment of elasticity and friction based on the Debris size.\n@see baseRadius\n");
    addField("baseRadius",           TypeF32,                     Offset(baseRadius,          DebrisData), 
       "@brief Radius at which the standard elasticity and friction apply.\n\nOnly used when useRaduisMass is true.\n@see useRadiusMass.\n");
-   endGroup("Physical Properties");
+   endGroup("Physics");
 
    addGroup("Behavior");
    addField("explodeOnMaxBounce",   TypeBool,                    Offset(explodeOnMaxBounce,  DebrisData), 
@@ -566,6 +568,7 @@ Debris::~Debris()
 
 void Debris::initPersistFields()
 {
+   docsURL;
    addGroup( "Debris" );	
    
       addField( "lifetime", TypeF32, Offset(mLifetime, Debris), 

+ 1 - 0
Engine/source/T3D/decal/decalData.cpp

@@ -138,6 +138,7 @@ void DecalData::onRemove()
 
 void DecalData::initPersistFields()
 {
+   docsURL;
    addGroup( "Decal" );
 
       addField( "size", TypeF32, Offset( size, DecalData ), 

+ 1 - 0
Engine/source/T3D/examples/renderMeshExample.cpp

@@ -74,6 +74,7 @@ RenderMeshExample::~RenderMeshExample()
 //-----------------------------------------------------------------------------
 void RenderMeshExample::initPersistFields()
 {
+   docsURL;
    addGroup( "Rendering" );
    INITPERSISTFIELD_MATERIALASSET(Material, RenderMeshExample, "The material used to render the mesh.");
    endGroup( "Rendering" );

+ 2 - 1
Engine/source/T3D/examples/renderObjectExample.cpp

@@ -68,6 +68,7 @@ RenderObjectExample::~RenderObjectExample()
 //-----------------------------------------------------------------------------
 void RenderObjectExample::initPersistFields()
 {
+   docsURL;
    // SceneObject already handles exposing the transform
    Parent::initPersistFields();
 }
@@ -277,4 +278,4 @@ void RenderObjectExample::render( ObjectRenderInst *ri, SceneRenderState *state,
 
    // Draw our triangles
    GFX->drawPrimitive( GFXTriangleList, 0, 12 );
-}
+}

+ 4 - 3
Engine/source/T3D/examples/renderShapeExample.cpp

@@ -72,12 +72,13 @@ RenderShapeExample::~RenderShapeExample()
 //-----------------------------------------------------------------------------
 void RenderShapeExample::initPersistFields()
 {
-   addGroup( "Rendering" );
+   docsURL;
+   Parent::initPersistFields();
+   addGroup( "Shapes" );
    INITPERSISTFIELD_SHAPEASSET(Shape, RenderShapeExample, "The path to the shape file.")
-   endGroup( "Rendering" );
+   endGroup( "Shapes" );
 
    // SceneObject already handles exposing the transform
-   Parent::initPersistFields();
 }
 
 void RenderShapeExample::inspectPostApply()

+ 1 - 0
Engine/source/T3D/fps/guiClockHud.cpp

@@ -97,6 +97,7 @@ GuiClockHud::GuiClockHud()
 
 void GuiClockHud::initPersistFields()
 {
+   docsURL;
    addGroup("Misc");		
    addField( "showFill", TypeBool, Offset( mShowFill, GuiClockHud ), "If true, draws a background color behind the control.");
    addField( "showFrame", TypeBool, Offset( mShowFrame, GuiClockHud ), "If true, draws a frame around the control." );

+ 1 - 0
Engine/source/T3D/fps/guiCrossHairHud.cpp

@@ -99,6 +99,7 @@ GuiCrossHairHud::GuiCrossHairHud()
 
 void GuiCrossHairHud::initPersistFields()
 {
+   docsURL;
    addGroup("Damage");		
    addField( "damageFillColor", TypeColorF, Offset( mDamageFillColor, GuiCrossHairHud ), "As the health bar depletes, this color will represent the health loss amount." );
    addField( "damageFrameColor", TypeColorF, Offset( mDamageFrameColor, GuiCrossHairHud ), "Color for the health bar's frame." );

+ 1 - 0
Engine/source/T3D/fps/guiHealthBarHud.cpp

@@ -112,6 +112,7 @@ GuiHealthBarHud::GuiHealthBarHud()
 
 void GuiHealthBarHud::initPersistFields()
 {
+   docsURL;
    addGroup("Colors");		
    addField( "fillColor", TypeColorF, Offset( mFillColor, GuiHealthBarHud ), "Standard color for the background of the control." );
    addField( "frameColor", TypeColorF, Offset( mFrameColor, GuiHealthBarHud ), "Color for the control's frame." );

+ 3 - 2
Engine/source/T3D/fps/guiHealthTextHud.cpp

@@ -115,7 +115,8 @@ GuiHealthTextHud::GuiHealthTextHud()
 }  
   
 void GuiHealthTextHud::initPersistFields()  
-{  
+{
+   docsURL;
    addGroup("Colors");       
    addField("fillColor", TypeColorF, Offset(mFillColor, GuiHealthTextHud), "Color for the background of the control.");  
    addField("frameColor", TypeColorF, Offset(mFrameColor, GuiHealthTextHud), "Color for the control's frame.");  
@@ -199,4 +200,4 @@ void GuiHealthTextHud::onRender(Point2I offset, const RectI &updateRect)
    // If enabled draw the border last  
    if (mShowFrame)  
       drawUtil->drawRect(updateRect, mFrameColor.toColorI());
-}  
+}  

+ 1 - 0
Engine/source/T3D/fps/guiShapeNameHud.cpp

@@ -126,6 +126,7 @@ GuiShapeNameHud::GuiShapeNameHud()
 
 void GuiShapeNameHud::initPersistFields()
 {
+   docsURL;
    addGroup("Colors");     
    addField( "fillColor",  TypeColorF, Offset( mFillColor, GuiShapeNameHud ), "Standard color for the background of the control." );
    addField( "frameColor", TypeColorF, Offset( mFrameColor, GuiShapeNameHud ), "Color for the control's frame."  );

+ 142 - 127
Engine/source/T3D/fx/explosion.cpp

@@ -387,134 +387,148 @@ ExplosionData* ExplosionData::cloneAndPerformSubstitutions(const SimObject* owne
 
 void ExplosionData::initPersistFields()
 {
-   INITPERSISTFIELD_SHAPEASSET(ExplosionShape, ExplosionData, "@brief Optional shape asset to place at the center of the explosion.\n\n"
-      "The <i>ambient</i> animation of this model will be played automatically at the start of the explosion.");
-
-   addField( "explosionScale", TypePoint3F, Offset(explosionScale, ExplosionData),
+   docsURL;
+   addGroup("Shapes");
+      INITPERSISTFIELD_SHAPEASSET(ExplosionShape, ExplosionData, "@brief Optional shape asset to place at the center of the explosion.\n\n"
+         "The <i>ambient</i> animation of this model will be played automatically at the start of the explosion.");
+   endGroup("Shapes");
+
+   addGroup("Sounds");
+      INITPERSISTFIELD_SOUNDASSET(Sound, ExplosionData, "Sound to play when this explosion explodes.");
+   endGroup("Sounds");
+
+   addGroup("Particle Effects");
+      addField( "faceViewer", TypeBool, Offset(faceViewer, ExplosionData),
+         "Controls whether the visual effects of the explosion always face the camera." );
+
+      addField( "particleEmitter", TYPEID< ParticleEmitterData >(), Offset(particleEmitter, ExplosionData),
+         "@brief Emitter used to generate a cloud of particles at the start of the explosion.\n\n"
+         "Explosions can generate two different particle effects. The first is a "
+         "single burst of particles at the start of the explosion emitted in a "
+         "spherical cloud using particleEmitter.\n\n"
+         "The second effect spawns the list of ParticleEmitters given by the emitter[] "
+         "field. These emitters generate particles in the normal way throughout the "
+         "lifetime of the explosion." );
+      addField( "particleDensity", TypeS32, Offset(particleDensity, ExplosionData),
+         "@brief Density of the particle cloud created at the start of the explosion.\n\n"
+         "@see particleEmitter" );
+      addField( "particleRadius", TypeF32, Offset(particleRadius, ExplosionData),
+         "@brief Radial distance from the explosion center at which cloud particles "
+         "are emitted.\n\n"
+         "@see particleEmitter" );
+      addField( "emitter", TYPEID< ParticleEmitterData >(), Offset(emitterList, ExplosionData), EC_NUM_EMITTERS,
+         "@brief List of additional ParticleEmitterData objects to spawn with this "
+         "explosion.\n\n"
+         "@see particleEmitter" );
+   endGroup("Particle Effects");
+
+   addGroup("Debris");
+      addField( "debris", TYPEID< DebrisData >(), Offset(debrisList, ExplosionData), EC_NUM_DEBRIS_TYPES,
+         "List of DebrisData objects to spawn with this explosion." );
+      addField( "debrisThetaMin", TypeF32, Offset(debrisThetaMin, ExplosionData),
+         "Minimum angle, from the horizontal plane, to eject debris from." );
+      addField( "debrisThetaMax", TypeF32, Offset(debrisThetaMax, ExplosionData),
+         "Maximum angle, from the horizontal plane, to eject debris from." );
+      addField( "debrisPhiMin", TypeF32, Offset(debrisPhiMin, ExplosionData),
+         "Minimum reference angle, from the vertical plane, to eject debris from." );
+      addField( "debrisPhiMax", TypeF32, Offset(debrisPhiMax, ExplosionData),
+         "Maximum reference angle, from the vertical plane, to eject debris from." );
+      addField( "debrisNum", TypeS32, Offset(debrisNum, ExplosionData),
+         "Number of debris objects to create." );
+      addField( "debrisNumVariance", TypeS32, Offset(debrisNumVariance, ExplosionData),
+         "Variance in the number of debris objects to create (must be from 0 - debrisNum)." );
+      addField( "debrisVelocity", TypeF32, Offset(debrisVelocity, ExplosionData),
+         "Velocity to toss debris at." );
+      addField( "debrisVelocityVariance", TypeF32, Offset(debrisVelocityVariance, ExplosionData),
+         "Variance in the debris initial velocity (must be >= 0)." );
+      addField( "subExplosion", TYPEID< ExplosionData >(), Offset(explosionList, ExplosionData), EC_MAX_SUB_EXPLOSIONS,
+         "List of additional ExplosionData objects to create at the start of the explosion." );
+   endGroup("Debris");
+
+
+   addGroup("Animation");
+      addField("explosionScale", TypePoint3F, Offset(explosionScale, ExplosionData),
       "\"X Y Z\" scale factor applied to the explosionShape model at the start "
-      "of the explosion." );
-   addField( "playSpeed", TypeF32, Offset(playSpeed, ExplosionData),
-      "Time scale at which to play the explosionShape <i>ambient</i> sequence." );
-
-   INITPERSISTFIELD_SOUNDASSET(Sound, ExplosionData, "Sound to play when this explosion explodes.");
-
-   addField( "faceViewer", TypeBool, Offset(faceViewer, ExplosionData),
-      "Controls whether the visual effects of the explosion always face the camera." );
-
-   addField( "particleEmitter", TYPEID< ParticleEmitterData >(), Offset(particleEmitter, ExplosionData),
-      "@brief Emitter used to generate a cloud of particles at the start of the explosion.\n\n"
-      "Explosions can generate two different particle effects. The first is a "
-      "single burst of particles at the start of the explosion emitted in a "
-      "spherical cloud using particleEmitter.\n\n"
-      "The second effect spawns the list of ParticleEmitters given by the emitter[] "
-      "field. These emitters generate particles in the normal way throughout the "
-      "lifetime of the explosion." );
-   addField( "particleDensity", TypeS32, Offset(particleDensity, ExplosionData),
-      "@brief Density of the particle cloud created at the start of the explosion.\n\n"
-      "@see particleEmitter" );
-   addField( "particleRadius", TypeF32, Offset(particleRadius, ExplosionData),
-      "@brief Radial distance from the explosion center at which cloud particles "
-      "are emitted.\n\n"
-      "@see particleEmitter" );
-   addField( "emitter", TYPEID< ParticleEmitterData >(), Offset(emitterList, ExplosionData), EC_NUM_EMITTERS,
-      "@brief List of additional ParticleEmitterData objects to spawn with this "
-      "explosion.\n\n"
-      "@see particleEmitter" );
-
-   addField( "debris", TYPEID< DebrisData >(), Offset(debrisList, ExplosionData), EC_NUM_DEBRIS_TYPES,
-      "List of DebrisData objects to spawn with this explosion." );
-   addField( "debrisThetaMin", TypeF32, Offset(debrisThetaMin, ExplosionData),
-      "Minimum angle, from the horizontal plane, to eject debris from." );
-   addField( "debrisThetaMax", TypeF32, Offset(debrisThetaMax, ExplosionData),
-      "Maximum angle, from the horizontal plane, to eject debris from." );
-   addField( "debrisPhiMin", TypeF32, Offset(debrisPhiMin, ExplosionData),
-      "Minimum reference angle, from the vertical plane, to eject debris from." );
-   addField( "debrisPhiMax", TypeF32, Offset(debrisPhiMax, ExplosionData),
-      "Maximum reference angle, from the vertical plane, to eject debris from." );
-   addField( "debrisNum", TypeS32, Offset(debrisNum, ExplosionData),
-      "Number of debris objects to create." );
-   addField( "debrisNumVariance", TypeS32, Offset(debrisNumVariance, ExplosionData),
-      "Variance in the number of debris objects to create (must be from 0 - debrisNum)." );
-   addField( "debrisVelocity", TypeF32, Offset(debrisVelocity, ExplosionData),
-      "Velocity to toss debris at." );
-   addField( "debrisVelocityVariance", TypeF32, Offset(debrisVelocityVariance, ExplosionData),
-      "Variance in the debris initial velocity (must be >= 0)." );
-
-   addField( "subExplosion", TYPEID< ExplosionData >(), Offset(explosionList, ExplosionData), EC_MAX_SUB_EXPLOSIONS,
-      "List of additional ExplosionData objects to create at the start of the "
-      "explosion." );
-
-   addField( "delayMS", TypeS32, Offset(delayMS, ExplosionData),
-      "Amount of time, in milliseconds, to delay the start of the explosion effect "
-      "from the creation of the Explosion object." );
-   addField( "delayVariance", TypeS32, Offset(delayVariance, ExplosionData),
-      "Variance, in milliseconds, of delayMS." );
-   addField( "lifetimeMS", TypeS32, Offset(lifetimeMS, ExplosionData),
-      "@brief Lifetime, in milliseconds, of the Explosion object.\n\n"
-      "@note If explosionShape is defined and contains an <i>ambient</i> animation, "
-      "this field is ignored, and the playSpeed scaled duration of the animation "
-      "is used instead." );
-   addField( "lifetimeVariance", TypeS32, Offset(lifetimeVariance, ExplosionData),
-      "Variance, in milliseconds, of the lifetimeMS of the Explosion object.\n" );
-   addField( "offset", TypeF32, Offset(offset, ExplosionData),
-      "@brief Offset distance (in a random direction) of the center of the explosion "
-      "from the Explosion object position.\n\n"
-      "Most often used to create some variance in position for subExplosion effects." );
-
-   addField( "times", TypeF32, Offset(times, ExplosionData), EC_NUM_TIME_KEYS,
-      "@brief Time keyframes used to scale the explosionShape model.\n\n"
-      "Values should be in increasing order from 0.0 - 1.0, and correspond to "
-      "the life of the Explosion where 0 is the beginning and 1 is the end of "
-      "the explosion lifetime.\n"
-      "@see lifetimeMS" );
-   addField( "sizes", TypePoint3F, Offset(sizes, ExplosionData), EC_NUM_TIME_KEYS,
-      "@brief \"X Y Z\" size keyframes used to scale the explosionShape model.\n\n"
-      "The explosionShape (if defined) will be scaled using the times/sizes "
-      "keyframes over the lifetime of the explosion.\n"
-      "@see lifetimeMS" );
-
-   addField( "shakeCamera", TypeBool, Offset(shakeCamera, ExplosionData),
-      "Controls whether the camera shakes during this explosion." );
-   addField( "camShakeFreq", TypePoint3F, Offset(camShakeFreq, ExplosionData),
-      "Frequency of camera shaking, defined in the \"X Y Z\" axes." );
-   addField( "camShakeAmp", TypePoint3F, Offset(camShakeAmp, ExplosionData),
-      "@brief Amplitude of camera shaking, defined in the \"X Y Z\" axes.\n\n"
-      "Set any value to 0 to disable shaking in that axis." );
-   addField( "camShakeDuration", TypeF32, Offset(camShakeDuration, ExplosionData),
-      "Duration (in seconds) to shake the camera." );
-   addField( "camShakeRadius", TypeF32, Offset(camShakeRadius, ExplosionData),
-      "Radial distance that a camera's position must be within relative to the "
-      "center of the explosion to be shaken." );
-   addField( "camShakeFalloff", TypeF32, Offset(camShakeFalloff, ExplosionData),
-      "Falloff value for the camera shake." );
-
-   addField( "lightStartRadius", TypeF32, Offset(lightStartRadius, ExplosionData),
-      "@brief Initial radius of the PointLight created by this explosion.\n\n"
-      "Radius is linearly interpolated from lightStartRadius to lightEndRadius "
-      "over the lifetime of the explosion.\n"
-      "@see lifetimeMS" );
-   addField( "lightEndRadius", TypeF32, Offset(lightEndRadius, ExplosionData),
-      "@brief Final radius of the PointLight created by this explosion.\n\n"
-      "@see lightStartRadius" );
-   addField( "lightStartColor", TypeColorF, Offset(lightStartColor, ExplosionData),
-      "@brief Initial color of the PointLight created by this explosion.\n\n"
-      "Color is linearly interpolated from lightStartColor to lightEndColor "
-      "over the lifetime of the explosion.\n"
-      "@see lifetimeMS" );
-   addField( "lightEndColor", TypeColorF, Offset(lightEndColor, ExplosionData),
-      "@brief Final color of the PointLight created by this explosion.\n\n"
-      "@see lightStartColor" );
-   addField( "lightStartBrightness", TypeF32, Offset(lightStartBrightness, ExplosionData),
-      "@brief Initial brightness of the PointLight created by this explosion.\n\n"
-      "Brightness is linearly interpolated from lightStartBrightness to "
-      "lightEndBrightness over the lifetime of the explosion.\n"
-      "@see lifetimeMS" );
-   addField("lightEndBrightness", TypeF32, Offset(lightEndBrightness, ExplosionData),
-      "@brief Final brightness of the PointLight created by this explosion.\n\n"
-      "@see lightStartBrightness" );
-   addField( "lightNormalOffset", TypeF32, Offset(lightNormalOffset, ExplosionData),
-      "Distance (in the explosion normal direction) of the PointLight position "
-      "from the explosion center." );
+      "of the explosion.");
+       addField("playSpeed", TypeF32, Offset(playSpeed, ExplosionData),
+          "Time scale at which to play the explosionShape <i>ambient</i> sequence.");
+
+      addField( "delayMS", TypeS32, Offset(delayMS, ExplosionData),
+         "Amount of time, in milliseconds, to delay the start of the explosion effect "
+         "from the creation of the Explosion object." );
+      addField( "delayVariance", TypeS32, Offset(delayVariance, ExplosionData),
+         "Variance, in milliseconds, of delayMS." );
+      addField( "lifetimeMS", TypeS32, Offset(lifetimeMS, ExplosionData),
+         "@brief Lifetime, in milliseconds, of the Explosion object.\n\n"
+         "@note If explosionShape is defined and contains an <i>ambient</i> animation, "
+         "this field is ignored, and the playSpeed scaled duration of the animation "
+         "is used instead." );
+      addField( "lifetimeVariance", TypeS32, Offset(lifetimeVariance, ExplosionData),
+         "Variance, in milliseconds, of the lifetimeMS of the Explosion object.\n" );
+      addField( "offset", TypeF32, Offset(offset, ExplosionData),
+         "@brief Offset distance (in a random direction) of the center of the explosion "
+         "from the Explosion object position.\n\n"
+         "Most often used to create some variance in position for subExplosion effects." );
+
+      addField( "times", TypeF32, Offset(times, ExplosionData), EC_NUM_TIME_KEYS,
+         "@brief Time keyframes used to scale the explosionShape model.\n\n"
+         "Values should be in increasing order from 0.0 - 1.0, and correspond to "
+         "the life of the Explosion where 0 is the beginning and 1 is the end of "
+         "the explosion lifetime.\n"
+         "@see lifetimeMS" );
+      addField( "sizes", TypePoint3F, Offset(sizes, ExplosionData), EC_NUM_TIME_KEYS,
+         "@brief \"X Y Z\" size keyframes used to scale the explosionShape model.\n\n"
+         "The explosionShape (if defined) will be scaled using the times/sizes "
+         "keyframes over the lifetime of the explosion.\n"
+         "@see lifetimeMS" );
+   endGroup("Animation");
+
+   addGroup("Camera Shake");
+      addField( "shakeCamera", TypeBool, Offset(shakeCamera, ExplosionData),
+         "Controls whether the camera shakes during this explosion." );
+      addField( "camShakeFreq", TypePoint3F, Offset(camShakeFreq, ExplosionData),
+         "Frequency of camera shaking, defined in the \"X Y Z\" axes." );
+      addField( "camShakeAmp", TypePoint3F, Offset(camShakeAmp, ExplosionData),
+         "@brief Amplitude of camera shaking, defined in the \"X Y Z\" axes.\n\n"
+         "Set any value to 0 to disable shaking in that axis." );
+      addField( "camShakeDuration", TypeF32, Offset(camShakeDuration, ExplosionData),
+         "Duration (in seconds) to shake the camera." );
+      addField( "camShakeRadius", TypeF32, Offset(camShakeRadius, ExplosionData),
+         "Radial distance that a camera's position must be within relative to the "
+         "center of the explosion to be shaken." );
+      addField( "camShakeFalloff", TypeF32, Offset(camShakeFalloff, ExplosionData),
+         "Falloff value for the camera shake." );
+   endGroup("Camera Shake");
+
+   addGroup("Light Emitter");
+      addField( "lightStartRadius", TypeF32, Offset(lightStartRadius, ExplosionData),
+         "@brief Initial radius of the PointLight created by this explosion.\n\n"
+         "Radius is linearly interpolated from lightStartRadius to lightEndRadius "
+         "over the lifetime of the explosion.\n"
+         "@see lifetimeMS" );
+      addField( "lightEndRadius", TypeF32, Offset(lightEndRadius, ExplosionData),
+         "@brief Final radius of the PointLight created by this explosion.\n\n"
+         "@see lightStartRadius" );
+      addField( "lightStartColor", TypeColorF, Offset(lightStartColor, ExplosionData),
+         "@brief Initial color of the PointLight created by this explosion.\n\n"
+         "Color is linearly interpolated from lightStartColor to lightEndColor "
+         "over the lifetime of the explosion.\n"
+         "@see lifetimeMS" );
+      addField( "lightEndColor", TypeColorF, Offset(lightEndColor, ExplosionData),
+         "@brief Final color of the PointLight created by this explosion.\n\n"
+         "@see lightStartColor" );
+      addField( "lightStartBrightness", TypeF32, Offset(lightStartBrightness, ExplosionData),
+         "@brief Initial brightness of the PointLight created by this explosion.\n\n"
+         "Brightness is linearly interpolated from lightStartBrightness to "
+         "lightEndBrightness over the lifetime of the explosion.\n"
+         "@see lifetimeMS" );
+      addField("lightEndBrightness", TypeF32, Offset(lightEndBrightness, ExplosionData),
+         "@brief Final brightness of the PointLight created by this explosion.\n\n"
+         "@see lightStartBrightness" );
+      addField( "lightNormalOffset", TypeF32, Offset(lightNormalOffset, ExplosionData),
+         "Distance (in the explosion normal direction) of the PointLight position "
+         "from the explosion center." );
+   endGroup("Light Emitter");
 
    // disallow some field substitutions
    onlyKeepClearSubstitutions("debris"); // subs resolving to "~~", or "~0" are OK
@@ -967,6 +981,7 @@ void Explosion::setInitialState(const Point3F& point, const Point3F& normal, con
 //--------------------------------------------------------------------------
 void Explosion::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
    addField("initialNormal", TypePoint3F, Offset(mInitialNormal, Explosion), "Initial starting Normal.");
    //

+ 1 - 0
Engine/source/T3D/fx/fxFoliageReplicator.cpp

@@ -345,6 +345,7 @@ fxFoliageReplicator::~fxFoliageReplicator()
 
 void fxFoliageReplicator::initPersistFields()
 {
+   docsURL;
    // Add out own persistent fields.
    addGroup( "Debugging" );	// MM: Added Group Header.
       addField( "UseDebugInfo",        TypeBool,      Offset( mFieldData.mUseDebugInfo,         fxFoliageReplicator ), "Culling bins are drawn when set to true." );

+ 1 - 0
Engine/source/T3D/fx/fxShapeReplicator.cpp

@@ -139,6 +139,7 @@ fxShapeReplicator::~fxShapeReplicator()
 
 void fxShapeReplicator::initPersistFields()
 {
+   docsURL;
    // Add out own persistent fields.
    addGroup( "Debugging" );	// MM: Added Group Header.
       addField( "HideReplications",    TypeBool,      Offset( mFieldData.mHideReplications,     fxShapeReplicator ), "Replicated shapes are hidden when set to true." );

+ 1 - 0
Engine/source/T3D/fx/groundCover.cpp

@@ -540,6 +540,7 @@ IMPLEMENT_CO_NETOBJECT_V1(GroundCover);
 
 void GroundCover::initPersistFields()
 {
+   docsURL;
    addGroup( "GroundCover General" );
 
       INITPERSISTFIELD_MATERIALASSET(Material, GroundCover, "Material used by all GroundCover segments.");

+ 2 - 0
Engine/source/T3D/fx/lightning.cpp

@@ -262,6 +262,7 @@ LightningData::~LightningData()
 //--------------------------------------------------------------------------
 void LightningData::initPersistFields()
 {
+   docsURL;
 
    INITPERSISTFIELD_SOUNDASSET(StrikeSound, LightningData, "Sound to play when lightning STRIKES!");
 
@@ -411,6 +412,7 @@ Lightning::~Lightning()
 //--------------------------------------------------------------------------
 void Lightning::initPersistFields()
 {
+   docsURL;
    addGroup( "Strikes" );
    addField( "strikesPerMinute", TypeS32, Offset(strikesPerMinute, Lightning),
       "@brief Number of lightning strikes to perform per minute.\n\n"

+ 1 - 0
Engine/source/T3D/fx/particle.cpp

@@ -147,6 +147,7 @@ FRangeValidator spinRandFValidator(-1000.f, 1000.f);
 //-----------------------------------------------------------------------------
 void ParticleData::initPersistFields()
 {
+   docsURL;
    addFieldV( "dragCoefficient", TYPEID< F32 >(), Offset(dragCoefficient, ParticleData), &dragCoefFValidator,
       "Particle physics drag amount." );
    addField( "windCoefficient", TYPEID< F32 >(), Offset(windCoefficient, ParticleData),

+ 1 - 0
Engine/source/T3D/fx/particleEmitter.cpp

@@ -207,6 +207,7 @@ FRangeValidator phiFValidator(0.f, 360.f);
 //-----------------------------------------------------------------------------
 void ParticleEmitterData::initPersistFields()
 {
+   docsURL;
    addGroup( "ParticleEmitterData" );
 
       addFieldV("ejectionPeriodMS", TYPEID< S32 >(), Offset(ejectionPeriodMS,   ParticleEmitterData), &ejectPeriodIValidator,

+ 2 - 0
Engine/source/T3D/fx/particleEmitterNode.cpp

@@ -89,6 +89,7 @@ ParticleEmitterNodeData::~ParticleEmitterNodeData()
 //-----------------------------------------------------------------------------
 void ParticleEmitterNodeData::initPersistFields()
 {
+   docsURL;
    addField( "timeMultiple", TYPEID< F32 >(), Offset(timeMultiple, ParticleEmitterNodeData),
       "@brief Time multiplier for particle emitter nodes.\n\n"
       "Increasing timeMultiple is like running the emitter at a faster rate - single-shot "
@@ -181,6 +182,7 @@ ParticleEmitterNode::~ParticleEmitterNode()
 //-----------------------------------------------------------------------------
 void ParticleEmitterNode::initPersistFields()
 {
+   docsURL;
    addField( "active", TYPEID< bool >(), Offset(mActive,ParticleEmitterNode),
       "Controls whether particles are emitted from this node." );
    addField( "emitter",  TYPEID< ParticleEmitterData >(), Offset(mEmitterDatablock, ParticleEmitterNode),

+ 2 - 0
Engine/source/T3D/fx/precipitation.cpp

@@ -143,6 +143,7 @@ PrecipitationData::PrecipitationData()
 
 void PrecipitationData::initPersistFields()
 {
+   docsURL;
    INITPERSISTFIELD_SOUNDASSET(Sound, PrecipitationData, "Looping SFXProfile effect to play while Precipitation is active.");
 
    addProtectedField( "dropTexture", TypeFilename, Offset(mDropName, PrecipitationData), &_setDropData, &defaultProtectedGetFn,
@@ -367,6 +368,7 @@ IRangeValidator ValidNumDropsRange(1, 100000);
 
 void Precipitation::initPersistFields()
 {
+   docsURL;
    addGroup("Precipitation");
 
       addFieldV( "numDrops", TypeS32, Offset(mNumDrops, Precipitation), &ValidNumDropsRange,

+ 2 - 0
Engine/source/T3D/fx/ribbon.cpp

@@ -68,6 +68,7 @@ RibbonData::RibbonData()
 
 void RibbonData::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 
    addGroup("Ribbon");
@@ -205,6 +206,7 @@ Ribbon::~Ribbon()
 //--------------------------------------------------------------------------
 void Ribbon::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 }
 

+ 2 - 0
Engine/source/T3D/fx/ribbonNode.cpp

@@ -56,6 +56,7 @@ RibbonNodeData::~RibbonNodeData()
 //-----------------------------------------------------------------------------
 void RibbonNodeData::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 }
 
@@ -90,6 +91,7 @@ RibbonNode::~RibbonNode()
 //-----------------------------------------------------------------------------
 void RibbonNode::initPersistFields()
 {
+   docsURL;
    addField( "active", TYPEID< bool >(), Offset(mActive,RibbonNode),
       "Controls whether ribbon is emitted from this node." );
    addField( "ribbon",  TYPEID< RibbonData >(), Offset(mRibbonDatablock, RibbonNode),

+ 2 - 1
Engine/source/T3D/fx/splash.cpp

@@ -114,8 +114,9 @@ SplashData::SplashData()
 //--------------------------------------------------------------------------
 // Init fields
 //--------------------------------------------------------------------------
-   void SplashData::initPersistFields()
+void SplashData::initPersistFields()
 {
+      docsURL;
    INITPERSISTFIELD_SOUNDASSET(Sound, SplashData, "Sound to play when splash, splashes.");
 
    addField("scale",             TypePoint3F,                  Offset(scale,              SplashData), "The scale of this splashing effect, defined as the F32 points X, Y, Z.\n");

+ 2 - 0
Engine/source/T3D/gameBase/gameBase.cpp

@@ -156,6 +156,7 @@ bool GameBaseData::onAdd()
 
 void GameBaseData::initPersistFields()
 {
+   docsURL;
    addGroup("Scripting");
 
       addField( "category", TypeCaseString, Offset(mCategory, GameBaseData ),
@@ -721,6 +722,7 @@ DefineEngineMethod( GameBase, setDataBlock, bool, ( GameBaseData* data ),,
 
 void GameBase::initPersistFields()
 {
+   docsURL;
    addGroup( "Game" );
 
       addProtectedField( "dataBlock", TYPEID< GameBaseData >(), Offset(mDataBlock, GameBase),

+ 1 - 0
Engine/source/T3D/groundPlane.cpp

@@ -103,6 +103,7 @@ GroundPlane::~GroundPlane()
 
 void GroundPlane::initPersistFields()
 {
+   docsURL;
    addGroup( "Plane" );
 
       addField( "squareSize",    TypeF32,          Offset( mSquareSize, GroundPlane ), "Square size in meters to which %GroundPlane subdivides its geometry." );

+ 1 - 0
Engine/source/T3D/guiObjectView.cpp

@@ -135,6 +135,7 @@ GuiObjectView::~GuiObjectView()
 
 void GuiObjectView::initPersistFields()
 {
+   docsURL;
    addGroup( "Model" );
    
       addField( "shapeFile", TypeStringFilename, Offset( mModelName, GuiObjectView ),

+ 37 - 38
Engine/source/T3D/item.cpp

@@ -88,7 +88,6 @@ ConsoleDocClass( ItemData,
       "   density = 2;\n"
 	   "   drag = 0.5;\n"
 	   "   maxVelocity = \"10.0\";\n"
-	   "   emap = true;\n"
 	   "   sticky = false;\n"
 	   "   dynamicType = \"0\"\n;"
 	   "   lightOnlyStatic = false;\n"
@@ -109,9 +108,6 @@ ConsoleDocClass( ItemData,
 
 ItemData::ItemData()
 {
-   shadowEnable = true;
-
-
    friction = 0;
    elasticity = 0;
 
@@ -141,40 +137,43 @@ EndImplementEnumType;
 
 void ItemData::initPersistFields()
 {
-   addField("friction",          TypeF32,       Offset(friction,           ItemData), "A floating-point value specifying how much velocity is lost to impact and sliding friction.");
-   addField("elasticity",        TypeF32,       Offset(elasticity,         ItemData), "A floating-point value specifying how 'bouncy' this ItemData is.");
-   addField("sticky",            TypeBool,      Offset(sticky,             ItemData), 
-      "@brief If true, ItemData will 'stick' to any surface it collides with.\n\n"
-      "When an item does stick to a surface, the Item::onStickyCollision() callback is called.  The Item has methods to retrieve "
-      "the world position and normal the Item is stuck to.\n"
-      "@note Valid objects to stick to must be of StaticShapeObjectType.\n");
-   addField("gravityMod",        TypeF32,       Offset(gravityMod,         ItemData), "Floating point value to multiply the existing gravity with, just for this ItemData.");
-   addField("maxVelocity",       TypeF32,       Offset(maxVelocity,        ItemData), "Maximum velocity that this ItemData is able to move.");
-
-   addField("lightType",         TYPEID< Item::LightType >(),      Offset(lightType, ItemData), "Type of light to apply to this ItemData. Options are NoLight, ConstantLight, PulsingLight. Default is NoLight." );
-   addField("lightColor",        TypeColorF,    Offset(lightColor,         ItemData),
-      "@brief Color value to make this light. Example: \"1.0,1.0,1.0\"\n\n"
-      "@see lightType\n");
-   addField("lightTime",         TypeS32,       Offset(lightTime,          ItemData), 
-      "@brief Time value for the light of this ItemData, used to control the pulse speed of the PulsingLight LightType.\n\n"
-      "@see lightType\n");
-   addField("lightRadius",       TypeF32,       Offset(lightRadius,        ItemData), 
-      "@brief Distance from the center point of this ItemData for the light to affect\n\n"
-      "@see lightType\n");
-   addField("lightOnlyStatic",   TypeBool,      Offset(lightOnlyStatic,    ItemData), 
-      "@brief If true, this ItemData will only cast a light if the Item for this ItemData has a static value of true.\n\n"
-      "@see lightType\n");
-
-   addField("simpleServerCollision",   TypeBool,  Offset(simpleServerCollision,    ItemData), 
-      "@brief Determines if only simple server-side collision will be used (for pick ups).\n\n"
-      "If set to true then only simple, server-side collision detection will be used.  This is often the case "
-      "if the item is used for a pick up object, such as ammo.  If set to false then a full collision volume "
-      "will be used as defined by the shape.  The default is true.\n"
-      "@note Only applies when using a physics library.\n"
-      "@see TurretShape and ProximityMine for examples that should set this to false to allow them to be "
-      "shot by projectiles.\n");
-
+   docsURL;
    Parent::initPersistFields();
+   addGroup("Physics");
+      addField("friction",          TypeF32,       Offset(friction,           ItemData), "A floating-point value specifying how much velocity is lost to impact and sliding friction.");
+      addField("elasticity",        TypeF32,       Offset(elasticity,         ItemData), "A floating-point value specifying how 'bouncy' this ItemData is.");
+      addField("sticky",            TypeBool,      Offset(sticky,             ItemData),
+         "@brief If true, ItemData will 'stick' to any surface it collides with.\n\n"
+         "When an item does stick to a surface, the Item::onStickyCollision() callback is called.  The Item has methods to retrieve "
+         "the world position and normal the Item is stuck to.\n"
+         "@note Valid objects to stick to must be of StaticShapeObjectType.\n");
+      addField("gravityMod",        TypeF32,       Offset(gravityMod,         ItemData), "Floating point value to multiply the existing gravity with, just for this ItemData.");
+      addField("maxVelocity",       TypeF32,       Offset(maxVelocity,        ItemData), "Maximum velocity that this ItemData is able to move.");
+      addField("simpleServerCollision",   TypeBool,  Offset(simpleServerCollision,    ItemData),
+         "@brief Determines if only simple server-side collision will be used (for pick ups).\n\n"
+         "If set to true then only simple, server-side collision detection will be used.  This is often the case "
+         "if the item is used for a pick up object, such as ammo.  If set to false then a full collision volume "
+         "will be used as defined by the shape.  The default is true.\n"
+         "@note Only applies when using a physics library.\n"
+         "@see TurretShape and ProximityMine for examples that should set this to false to allow them to be "
+         "shot by projectiles.\n");
+   endGroup("Physics");
+
+   addGroup("Light Emitter");
+      addField("lightType",         TYPEID< Item::LightType >(),      Offset(lightType, ItemData), "Type of light to apply to this ItemData. Options are NoLight, ConstantLight, PulsingLight. Default is NoLight." );
+      addField("lightColor",        TypeColorF,    Offset(lightColor,         ItemData),
+         "@brief Color value to make this light. Example: \"1.0,1.0,1.0\"\n\n"
+         "@see lightType\n");
+      addField("lightTime",         TypeS32,       Offset(lightTime,          ItemData), 
+         "@brief Time value for the light of this ItemData, used to control the pulse speed of the PulsingLight LightType.\n\n"
+         "@see lightType\n");
+      addField("lightRadius",       TypeF32,       Offset(lightRadius,        ItemData), 
+         "@brief Distance from the center point of this ItemData for the light to affect\n\n"
+         "@see lightType\n");
+      addField("lightOnlyStatic",   TypeBool,      Offset(lightOnlyStatic,    ItemData), 
+         "@brief If true, this ItemData will only cast a light if the Item for this ItemData has a static value of true.\n\n"
+         "@see lightType\n");
+   endGroup("Light Emitter");
 }
 
 void ItemData::packData(BitStream* stream)
@@ -262,7 +261,6 @@ ConsoleDocClass( Item,
       "   mass = 2;\n"
       "   friction = 1;\n"
       "   elasticity = 0.3;\n"
-      "   emap = true;\n\n"
       "   // Dynamic properties used by the scripts\n"
       "   pickupName = \"a health patch\";\n"
       "   repairAmount = 50;\n"
@@ -1304,6 +1302,7 @@ bool Item::_setRotate(void *object, const char *index, const char *data)
 
 void Item::initPersistFields()
 {
+   docsURL;
    addGroup("Misc");	
    addProtectedField("static", TypeBool, Offset(mStatic, Item), &_setStatic, &defaultProtectedGetFn, "If true, the object is not moving in the world.\n");
    addProtectedField("rotate", TypeBool, Offset(mRotate, Item), &_setRotate, &defaultProtectedGetFn, "If true, the object will automatically rotate around its Z axis.\n");

+ 1 - 0
Engine/source/T3D/levelInfo.cpp

@@ -127,6 +127,7 @@ FRangeValidator ValiDampnessRange(0.0f, 1.0f);
 
 void LevelInfo::initPersistFields()
 {
+   docsURL;
    addGroup( "Visibility" );
 
       addField( "nearClip", TypeF32, Offset( mNearClip, LevelInfo ), "Closest distance from the camera's position to render the world." );

+ 1 - 0
Engine/source/T3D/lightAnimData.cpp

@@ -62,6 +62,7 @@ ConsoleDocClass( LightAnimData,
 
 void LightAnimData::initPersistFields()
 {
+   docsURL;
    addGroup( "Offset",
       "The XYZ translation animation state relative to the light position." );
 

+ 1 - 0
Engine/source/T3D/lightBase.cpp

@@ -88,6 +88,7 @@ LightBase::~LightBase()
 
 void LightBase::initPersistFields()
 {
+   docsURL;
    // We only add the basic lighting options that all lighting
    // systems would use... the specific lighting system options
    // are injected at runtime by the lighting system itself.

+ 1 - 0
Engine/source/T3D/lightDescription.cpp

@@ -90,6 +90,7 @@ ConsoleDocClass( LightDescription,
 
 void LightDescription::initPersistFields()
 {
+   docsURL;
    addGroup( "Light" );
 
       addField( "color", TypeColorF, Offset( color, LightDescription ), "Changes the base color hue of the light." );

+ 1 - 0
Engine/source/T3D/lightFlareData.cpp

@@ -142,6 +142,7 @@ LightFlareData::~LightFlareData()
 
 void LightFlareData::initPersistFields()
 {
+   docsURL;
    addGroup( "LightFlareData" );
 
       addField( "overallScale", TypeF32, Offset( mScale, LightFlareData ),

+ 1 - 0
Engine/source/T3D/lighting/boxEnvironmentProbe.cpp

@@ -90,6 +90,7 @@ BoxEnvironmentProbe::~BoxEnvironmentProbe()
 //-----------------------------------------------------------------------------
 void BoxEnvironmentProbe::initPersistFields()
 {
+   docsURL;
    // SceneObject already handles exposing the transform
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/lighting/reflectionProbe.cpp

@@ -151,6 +151,7 @@ ReflectionProbe::~ReflectionProbe()
 //-----------------------------------------------------------------------------
 void ReflectionProbe::initPersistFields()
 {
+   docsURL;
    addField("canDamp", TypeBool, Offset(mCanDamp, ReflectionProbe),"wetness allowed");
    addGroup("Rendering");
       addProtectedField("enabled", TypeBool, Offset(mEnabled, ReflectionProbe),

+ 1 - 0
Engine/source/T3D/lighting/skylight.cpp

@@ -90,6 +90,7 @@ Skylight::~Skylight()
 //-----------------------------------------------------------------------------
 void Skylight::initPersistFields()
 {
+   docsURL;
    // SceneObject already handles exposing the transform
    Parent::initPersistFields();
 

+ 1 - 0
Engine/source/T3D/lighting/sphereEnvironmentProbe.cpp

@@ -89,6 +89,7 @@ SphereEnvironmentProbe::~SphereEnvironmentProbe()
 //-----------------------------------------------------------------------------
 void SphereEnvironmentProbe::initPersistFields()
 {
+   docsURL;
    // SceneObject already handles exposing the transform
    Parent::initPersistFields();
 

+ 2 - 1
Engine/source/T3D/missionArea.cpp

@@ -130,6 +130,7 @@ void MissionArea::inspectPostApply()
 
 void MissionArea::initPersistFields()
 {
+   docsURL;
    addGroup("Dimensions");	
    addField("area", TypeRectI, Offset(mArea, MissionArea), "Four corners (X1, X2, Y1, Y2) that makes up the level's boundaries");
    addField("flightCeiling", TypeF32, Offset(mFlightCeiling, MissionArea), "Represents the top of the mission area, used by FlyingVehicle. ");
@@ -215,4 +216,4 @@ DefineEngineMethod( MissionArea, postApply, void, (),,
                    )
 {
    object->inspectPostApply();
-}
+}

+ 6 - 1
Engine/source/T3D/missionMarker.cpp

@@ -179,7 +179,9 @@ void MissionMarker::unpackUpdate(NetConnection * con, BitStream * stream)
    }
 }
 
-void MissionMarker::initPersistFields() {
+void MissionMarker::initPersistFields()
+{
+   docsURL;
    Parent::initPersistFields();
 }
 
@@ -281,6 +283,7 @@ void WayPoint::unpackUpdate(NetConnection * con, BitStream * stream)
 
 void WayPoint::initPersistFields()
 {
+   docsURL;
    addGroup("Misc"); 
    addField("markerName", TypeCaseString, Offset(mName, WayPoint), "Unique name representing this waypoint");
    endGroup("Misc");
@@ -468,6 +471,7 @@ void SpawnSphere::advanceTime( F32 timeDelta )
 
 void SpawnSphere::initPersistFields()
 {
+   docsURL;
    addGroup( "Spawn" );
    addField( "spawnClass", TypeRealString, Offset(mSpawnClass, SpawnSphere),
       "Object class to create (eg. Player, AIPlayer, Debris etc)" );
@@ -611,6 +615,7 @@ void CameraBookmark::unpackUpdate(NetConnection * con, BitStream * stream)
 
 void CameraBookmark::initPersistFields()
 {
+   docsURL;
    //addGroup("Misc");  
    //addField("name", TypeCaseString, Offset(mName, CameraBookmark));
    //endGroup("Misc");

+ 1 - 0
Engine/source/T3D/notesObject.cpp

@@ -40,6 +40,7 @@ NotesObject::~NotesObject()
 //-----------------------------------------------------------------------------
 void NotesObject::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 
    addField("Note", TypeCommand, Offset(mNote, NotesObject), "");

+ 3 - 1
Engine/source/T3D/pathCamera.cpp

@@ -61,6 +61,7 @@ void PathCameraData::consoleInit()
 
 void PathCameraData::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 }
 
@@ -201,6 +202,7 @@ void PathCamera::onEditorDisable()
 
 void PathCamera::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 }
 
@@ -637,4 +639,4 @@ DefineEngineMethod(PathCamera, popFront, void, (),, "Removes the knot at the fro
 													"@endtsexample\n")
 {
    object->popFront();
-}
+}

+ 3 - 1
Engine/source/T3D/pathShape.cpp

@@ -44,6 +44,7 @@ bool PathShapeData::preload(bool server, String &errorStr)
 
 void PathShapeData::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 }
 
@@ -146,6 +147,7 @@ PathShapeData::PathShapeData()
 
 void PathShape::initPersistFields()
 {
+   docsURL;
 
    addField( "Path", TYPEID< SimObjectRef<SimPath::Path> >(), Offset( mSimPath, PathShape ),
          "@brief Name of a Path to follow." );
@@ -587,4 +589,4 @@ DefineEngineMethod(PathShape, popFront, void, (), , "Removes the knot at the fro
 DefineEngineMethod(PathShape, getState, S32, (), , "PathShape.getState()")
 {
 	return object->getState(); 
-}
+}

+ 1 - 0
Engine/source/T3D/physicalZone.cpp

@@ -148,6 +148,7 @@ void PhysicalZone::consoleInit()
 
 void PhysicalZone::initPersistFields()
 {
+   docsURL;
    addGroup("Misc");
    addField("velocityMod",  TypeF32,               Offset(mVelocityMod,  PhysicalZone), "Multiply velocity of objects entering zone by this value every tick.");
    addField("gravityMod",   TypeF32,               Offset(mGravityMod,   PhysicalZone), "Gravity in PhysicalZone. Multiplies against standard gravity.");

+ 10 - 8
Engine/source/T3D/physics/physicsDebris.cpp

@@ -110,21 +110,23 @@ bool PhysicsDebrisData::preload( bool server, String &errorStr )
 
 void PhysicsDebrisData::initPersistFields()
 {
-   addGroup( "Display" );
+   docsURL;
+   addGroup( "Shapes" );
 
       addProtectedField( "shapeFile", TypeShapeFilename, Offset( mShapeName, PhysicsDebrisData ), &_setShapeData, &defaultProtectedGetFn,
          "@brief Path to the .DAE or .DTS file to use for this shape.\n\n"
          "Compatable with Live-Asset Reloading.", AbstractClassRep::FIELD_HideInInspectors);
-         
+
       INITPERSISTFIELD_SHAPEASSET(Shape, PhysicsDebrisData, "@brief Shape to use with this debris.\n\n"
          "Compatable with Live-Asset Reloading.");
+   endGroup( "Shapes" );
 
+   addGroup("Rendering");
       addField( "castShadows", TypeBool, Offset( castShadows, PhysicsDebrisData ), 
         "@brief Determines if the shape's shadow should be cast onto the environment.\n\n" );
+   endGroup("Rendering");
 
-   endGroup( "Display" );
-
-   addGroup( "Physical Properties" );
+   addGroup( "Physics" );
 
       addField("lifetime", TypeF32, Offset( lifetime, PhysicsDebrisData ),
          "@brief Base time, in seconds, that debris persists after time of creation.\n\n"
@@ -192,8 +194,7 @@ void PhysicsDebrisData::initPersistFields()
          "The result of the calculated buoyancy is relative to the density of the WaterObject the PhysicsDebris is within."
          "@see WaterObject::density");
 
-   endGroup( "Physical Properties" );
-
+   endGroup( "Physics" );
    Parent::initPersistFields();
 }
 
@@ -332,6 +333,7 @@ PhysicsDebris::~PhysicsDebris()
 
 void PhysicsDebris::initPersistFields()
 {
+   docsURL;
    Con::addVariable( "$pref::PhysicsDebris::lifetimeScale", TypeF32, &smLifetimeScale,
       "@brief Scales how long %PhysicsDebris will live before being removed.\n"
       "@note A value of 0 will disable PhysicsDebris entirely.");
@@ -723,4 +725,4 @@ void PhysicsDebris::_onPhysicsReset( PhysicsResetEvent reset )
       // Editing stuff, clean up the trash!
       safeDeleteObject();
    }
-}
+}

+ 2 - 1
Engine/source/T3D/physics/physicsForce.cpp

@@ -54,7 +54,8 @@ PhysicsForce::~PhysicsForce()
 }
 
 void PhysicsForce::initPersistFields()
-{   
+{
+   docsURL;
    Parent::initPersistFields();   
 }
 

+ 7 - 6
Engine/source/T3D/physics/physicsShape.cpp

@@ -87,9 +87,8 @@ PhysicsShapeData::~PhysicsShapeData()
 
 void PhysicsShapeData::initPersistFields()
 {
-   Parent::initPersistFields();
-
-   addGroup("Media");
+   docsURL;
+   addGroup("Shapes");
 
       INITPERSISTFIELD_SHAPEASSET(Shape, PhysicsShapeData, "@brief Shape asset to be used with this physics object.\n\n"
          "Compatable with Live-Asset Reloading. ")
@@ -103,7 +102,7 @@ void PhysicsShapeData::initPersistFields()
       addField( "destroyedShape", TYPEID< SimObjectRef<PhysicsShapeData> >(), Offset( destroyedShape, PhysicsShapeData ),
          "@brief Name of a PhysicsShapeData to spawn when this shape is destroyed (optional)." );
 
-   endGroup("Media");
+   endGroup("Shapes");
 
    addGroup( "Physics" );
       
@@ -173,7 +172,8 @@ void PhysicsShapeData::initPersistFields()
       addField( "simType", TYPEID< PhysicsShapeData::SimType >(), Offset( simType, PhysicsShapeData ),
          "@brief Controls whether this shape is simulated on the server, client, or both physics simulations.\n\n" );
 
-   endGroup( "Networking" );   
+   endGroup( "Networking" );
+   Parent::initPersistFields();
 }
 
 void PhysicsShapeData::packData( BitStream *stream )
@@ -431,7 +431,8 @@ void PhysicsShape::consoleInit()
 }
 
 void PhysicsShape::initPersistFields()
-{   
+{
+   docsURL;
    addGroup( "PhysicsShape" );
 
       addField( "playAmbient", TypeBool, Offset( mPlayAmbient, PhysicsShape ),

+ 3 - 3
Engine/source/T3D/player.cpp

@@ -282,7 +282,6 @@ IMPLEMENT_CALLBACK( PlayerData, onLeaveMissionArea, void, ( Player* obj ), ( obj
 
 PlayerData::PlayerData()
 {
-   shadowEnable = true;
    shadowSize = 256;
    shadowProjectionDistance = 14.0f;
 
@@ -705,6 +704,9 @@ bool PlayerData::isJumpAction(U32 action)
 
 void PlayerData::initPersistFields()
 {
+   docsURL;
+   Parent::initPersistFields();
+
    addField( "pickupRadius", TypeF32, Offset(pickupRadius, PlayerData),
       "@brief Radius around the player to collide with Items in the scene (on server).\n\n"
       "Internally the pickupRadius is added to the larger side of the initial bounding box "
@@ -1163,8 +1165,6 @@ void PlayerData::initPersistFields()
          "need to.\n");
 
    endGroup( "Third Person" );
-
-   Parent::initPersistFields();
 }
 
 void PlayerData::packData(BitStream* stream)

+ 1 - 0
Engine/source/T3D/pointLight.cpp

@@ -99,6 +99,7 @@ PointLight::~PointLight()
 
 void PointLight::initPersistFields()
 {
+   docsURL;
    addGroup( "Light" );
 
       addField( "radius", TypeF32, Offset( mRadius, PointLight ), "Controls the falloff of the light emission" );

+ 1 - 0
Engine/source/T3D/portal.cpp

@@ -147,6 +147,7 @@ Portal::Portal()
 
 void Portal::initPersistFields()
 {
+   docsURL;
    addGroup( "Zoning" );
 
       addProtectedField( "frontSidePassable", TypeBool, Offset( mPassableSides[ FrontSide ], Portal ),

+ 1 - 0
Engine/source/T3D/prefab.cpp

@@ -81,6 +81,7 @@ Prefab::~Prefab()
 
 void Prefab::initPersistFields()
 {
+   docsURL;
    addGroup( "Prefab" );
 
       addProtectedField( "filename", TypePrefabFilename, Offset( mFilename, Prefab ),         

+ 86 - 84
Engine/source/T3D/projectile.cpp

@@ -232,88 +232,91 @@ ProjectileData::ProjectileData(const ProjectileData& other, bool temp_clone) : G
 
 void ProjectileData::initPersistFields()
 {
-   addField("particleEmitter", TYPEID< ParticleEmitterData >(), Offset(particleEmitter, ProjectileData),
-      "@brief Particle emitter datablock used to generate particles while the projectile is outside of water.\n\n"
-      "@note If datablocks are defined for both particleEmitter and particleWaterEmitter, both effects will play "
-      "as the projectile enters or leaves water.\n\n"
-      "@see particleWaterEmitter\n");
-   addField("particleWaterEmitter", TYPEID< ParticleEmitterData >(), Offset(particleWaterEmitter, ProjectileData),
-      "@brief Particle emitter datablock used to generate particles while the projectile is submerged in water.\n\n"
-      "@note If datablocks are defined for both particleWaterEmitter and particleEmitter , both effects will play "
-      "as the projectile enters or leaves water.\n\n"
-      "@see particleEmitter\n");
-
-   addProtectedField("projectileShapeName", TypeShapeFilename, Offset(mProjectileShapeName, ProjectileData), &_setProjectileShapeData, &defaultProtectedGetFn,
-      "@brief File path to the model of the projectile.\n\n", AbstractClassRep::FIELD_HideInInspectors);
-      
-   INITPERSISTFIELD_SHAPEASSET(ProjectileShape, ProjectileData, "@brief The model of the projectile.\n\n");
-
-   addField("scale", TypePoint3F, Offset(scale, ProjectileData),
-      "@brief Scale to apply to the projectile's size.\n\n"
-      "@note This is applied after SceneObject::scale\n");
-
-   INITPERSISTFIELD_SOUNDASSET(ProjectileSound, ProjectileData, "The sound for the projectile.");
-
-   addField("explosion", TYPEID< ExplosionData >(), Offset(explosion, ProjectileData),
-      "@brief Explosion datablock used when the projectile explodes outside of water.\n\n");
-   addField("waterExplosion", TYPEID< ExplosionData >(), Offset(waterExplosion, ProjectileData),
-      "@brief Explosion datablock used when the projectile explodes underwater.\n\n");
-
-   addField("splash", TYPEID< SplashData >(), Offset(splash, ProjectileData),
-      "@brief Splash datablock used to create splash effects as the projectile enters or leaves water\n\n");
-
-   addField("decal", TYPEID< DecalData >(), Offset(decal, ProjectileData),
-      "@brief Decal datablock used for decals placed at projectile explosion points.\n\n");
-
-   addField("lightDesc", TYPEID< LightDescription >(), Offset(lightDesc, ProjectileData),
-      "@brief LightDescription datablock used for lights attached to the projectile.\n\n");
-
-   addField("isBallistic", TypeBool, Offset(isBallistic, ProjectileData),
-      "@brief Detetmines if the projectile should be affected by gravity and whether or not "
-      "it bounces before exploding.\n\n");
-
-   addField("velInheritFactor", TypeF32, Offset(velInheritFactor, ProjectileData),
-      "@brief Amount of velocity the projectile recieves from the source that created it.\n\n"
-      "Use an amount between 0 and 1 for the best effect. "
-      "This value is never modified by the engine.\n"
-      "@note This value by default is not transmitted between the server and the client.");
-   addField("muzzleVelocity", TypeF32, Offset(muzzleVelocity, ProjectileData),
-      "@brief Amount of velocity the projectile recieves from the \"muzzle\" of the gun.\n\n"
-      "Used with velInheritFactor to determine the initial velocity of the projectile. "
-      "This value is never modified by the engine.\n\n"
-      "@note This value by default is not transmitted between the server and the client.\n\n"
-      "@see velInheritFactor");
-   
-   addField("impactForce", TypeF32, Offset(impactForce, ProjectileData));
-
-   addProtectedField("lifetime", TypeS32, Offset(lifetime, ProjectileData), &setLifetime, &getScaledValue, 
-      "@brief Amount of time, in milliseconds, before the projectile is removed from the simulation.\n\n"
-      "Used with fadeDelay to determine the transparency of the projectile at a given time. "
-      "A projectile may exist up to a maximum of 131040ms (or 4095 ticks) as defined by Projectile::MaxLivingTicks in the source code."
-      "@see fadeDelay");
-
-   addProtectedField("armingDelay", TypeS32, Offset(armingDelay, ProjectileData), &setArmingDelay, &getScaledValue, 
-      "@brief Amount of time, in milliseconds, before the projectile will cause damage or explode on impact.\n\n"
-      "This value must be equal to or less than the projectile's lifetime.\n\n"
-      "@see lifetime");
-   addProtectedField("fadeDelay", TypeS32, Offset(fadeDelay, ProjectileData), &setFadeDelay, &getScaledValue,
-      "@brief Amount of time, in milliseconds, before the projectile begins to fade out.\n\n"
-      "This value must be smaller than the projectile's lifetime to have an affect.");
-
-   addField("bounceElasticity", TypeF32, Offset(bounceElasticity, ProjectileData), 
-      "@brief Influences post-bounce velocity of a projectile that does not explode on contact.\n\n"
-      "Scales the velocity from a bounce after friction is taken into account. "
-      "A value of 1.0 will leave it's velocity unchanged while values greater than 1.0 will increase it.\n");
-   addField("bounceFriction", TypeF32, Offset(bounceFriction, ProjectileData),
-      "@brief Factor to reduce post-bounce velocity of a projectile that does not explode on contact.\n\n"
-      "Reduces bounce velocity by this factor and a multiple of the tangent to impact. "
-      "Used to simulate surface friction.\n");
-   addField("gravityMod", TypeF32, Offset(gravityMod, ProjectileData ),
-      "@brief Scales the influence of gravity on the projectile.\n\n"
-      "The larger this value is, the more that gravity will affect the projectile. "
-      "A value of 1.0 will assume \"normal\" influence upon it.\n"
-      "The magnitude of gravity is assumed to be 9.81 m/s/s\n\n"
-      "@note ProjectileData::isBallistic must be true for this to have any affect.");
+   docsURL;
+   addGroup("Shapes");
+      addProtectedField("projectileShapeName", TypeShapeFilename, Offset(mProjectileShapeName, ProjectileData), &_setProjectileShapeData, &defaultProtectedGetFn,
+         "@brief File path to the model of the projectile.\n\n", AbstractClassRep::FIELD_HideInInspectors);
+      INITPERSISTFIELD_SHAPEASSET(ProjectileShape, ProjectileData, "@brief The model of the projectile.\n\n");
+      addField("scale", TypePoint3F, Offset(scale, ProjectileData),
+         "@brief Scale to apply to the projectile's size.\n\n"
+         "@note This is applied after SceneObject::scale\n");
+   endGroup("Shapes");
+
+   addGroup("Particle Effects");
+      addField("particleEmitter", TYPEID< ParticleEmitterData >(), Offset(particleEmitter, ProjectileData),
+         "@brief Particle emitter datablock used to generate particles while the projectile is outside of water.\n\n"
+         "@note If datablocks are defined for both particleEmitter and particleWaterEmitter, both effects will play "
+         "as the projectile enters or leaves water.\n\n"
+         "@see particleWaterEmitter\n");
+      addField("particleWaterEmitter", TYPEID< ParticleEmitterData >(), Offset(particleWaterEmitter, ProjectileData),
+         "@brief Particle emitter datablock used to generate particles while the projectile is submerged in water.\n\n"
+         "@note If datablocks are defined for both particleWaterEmitter and particleEmitter , both effects will play "
+         "as the projectile enters or leaves water.\n\n"
+         "@see particleEmitter\n");
+      addField("explosion", TYPEID< ExplosionData >(), Offset(explosion, ProjectileData),
+         "@brief Explosion datablock used when the projectile explodes outside of water.\n\n");
+      addField("waterExplosion", TYPEID< ExplosionData >(), Offset(waterExplosion, ProjectileData),
+         "@brief Explosion datablock used when the projectile explodes underwater.\n\n");
+      addField("splash", TYPEID< SplashData >(), Offset(splash, ProjectileData),
+         "@brief Splash datablock used to create splash effects as the projectile enters or leaves water\n\n");
+      addField("decal", TYPEID< DecalData >(), Offset(decal, ProjectileData),
+         "@brief Decal datablock used for decals placed at projectile explosion points.\n\n");
+   endGroup("Particle Effects");
+
+   addGroup("Sounds");
+      INITPERSISTFIELD_SOUNDASSET(ProjectileSound, ProjectileData, "The sound for the projectile.");
+   endGroup("Sounds");
+
+   addGroup("Light Emitter");
+      addField("lightDesc", TYPEID< LightDescription >(), Offset(lightDesc, ProjectileData),
+         "@brief LightDescription datablock used for lights attached to the projectile.\n\n");
+   endGroup("Light Emitter");   
+
+   addGroup("Physics");
+      addProtectedField("lifetime", TypeS32, Offset(lifetime, ProjectileData), &setLifetime, &getScaledValue,
+         "@brief Amount of time, in milliseconds, before the projectile is removed from the simulation.\n\n"
+         "Used with fadeDelay to determine the transparency of the projectile at a given time. "
+         "A projectile may exist up to a maximum of 131040ms (or 4095 ticks) as defined by Projectile::MaxLivingTicks in the source code."
+         "@see fadeDelay");
+      addProtectedField("armingDelay", TypeS32, Offset(armingDelay, ProjectileData), &setArmingDelay, &getScaledValue,
+         "@brief Amount of time, in milliseconds, before the projectile will cause damage or explode on impact.\n\n"
+         "This value must be equal to or less than the projectile's lifetime.\n\n"
+         "@see lifetime");
+      addProtectedField("fadeDelay", TypeS32, Offset(fadeDelay, ProjectileData), &setFadeDelay, &getScaledValue,
+         "@brief Amount of time, in milliseconds, before the projectile begins to fade out.\n\n"
+         "This value must be smaller than the projectile's lifetime to have an affect.");
+      addField("isBallistic", TypeBool, Offset(isBallistic, ProjectileData),
+         "@brief Detetmines if the projectile should be affected by gravity and whether or not "
+         "it bounces before exploding.\n\n");
+      addField("velInheritFactor", TypeF32, Offset(velInheritFactor, ProjectileData),
+         "@brief Amount of velocity the projectile recieves from the source that created it.\n\n"
+         "Use an amount between 0 and 1 for the best effect. "
+         "This value is never modified by the engine.\n"
+         "@note This value by default is not transmitted between the server and the client.");
+      addField("muzzleVelocity", TypeF32, Offset(muzzleVelocity, ProjectileData),
+         "@brief Amount of velocity the projectile recieves from the \"muzzle\" of the gun.\n\n"
+         "Used with velInheritFactor to determine the initial velocity of the projectile. "
+         "This value is never modified by the engine.\n\n"
+         "@note This value by default is not transmitted between the server and the client.\n\n"
+         "@see velInheritFactor");
+      addField("impactForce", TypeF32, Offset(impactForce, ProjectileData));
+      addField("bounceElasticity", TypeF32, Offset(bounceElasticity, ProjectileData),
+         "@brief Influences post-bounce velocity of a projectile that does not explode on contact.\n\n"
+         "Scales the velocity from a bounce after friction is taken into account. "
+         "A value of 1.0 will leave it's velocity unchanged while values greater than 1.0 will increase it.\n");
+      addField("bounceFriction", TypeF32, Offset(bounceFriction, ProjectileData),
+         "@brief Factor to reduce post-bounce velocity of a projectile that does not explode on contact.\n\n"
+         "Reduces bounce velocity by this factor and a multiple of the tangent to impact. "
+         "Used to simulate surface friction.\n");
+      addField("gravityMod", TypeF32, Offset(gravityMod, ProjectileData),
+         "@brief Scales the influence of gravity on the projectile.\n\n"
+         "The larger this value is, the more that gravity will affect the projectile. "
+         "A value of 1.0 will assume \"normal\" influence upon it.\n"
+         "The magnitude of gravity is assumed to be 9.81 m/s/s\n\n"
+         "@note ProjectileData::isBallistic must be true for this to have any affect.");
+   endGroup("Physics");
+
+   Parent::initPersistFields();
    // disallow some field substitutions
    onlyKeepClearSubstitutions("explosion");
    onlyKeepClearSubstitutions("particleEmitter");
@@ -321,8 +324,6 @@ void ProjectileData::initPersistFields()
    onlyKeepClearSubstitutions("sound");
    onlyKeepClearSubstitutions("splash");
    onlyKeepClearSubstitutions("waterExplosion");
-
-   Parent::initPersistFields();
 }
 
 
@@ -647,6 +648,7 @@ Projectile::~Projectile()
 //--------------------------------------------------------------------------
 void Projectile::initPersistFields()
 {
+   docsURL;
    addGroup("Physics");
 
    addProtectedField("initialPosition",  TypePoint3F, Offset(mInitialPosition, Projectile), &_setInitialPosition, &defaultProtectedGetFn,

+ 7 - 8
Engine/source/T3D/proximityMine.cpp

@@ -88,12 +88,16 @@ ProximityMineData::ProximityMineData()
 
 void ProximityMineData::initPersistFields()
 {
+   docsURL;
+   Parent::initPersistFields();
+   addGroup("Sounds");
+      INITPERSISTFIELD_SOUNDASSET(ArmSound, ProximityMineData, "Arming sound for this proximity mine.");
+      INITPERSISTFIELD_SOUNDASSET(TriggerSound, ProximityMineData, "Arming sound for this proximity mine.");
+   endGroup("Sounds");
+
    addGroup( "Arming" );
    addField( "armingDelay", TypeF32, Offset(armingDelay, ProximityMineData), 
       "Delay (in seconds) from when the mine is placed to when it becomes active." );
-
-   INITPERSISTFIELD_SOUNDASSET(ArmSound, ProximityMineData, "Arming sound for this proximity mine.");
-
    endGroup( "Arming" );
 
    addGroup( "Triggering" );
@@ -111,9 +115,6 @@ void ProximityMineData::initPersistFields()
       "Speed above which moving objects within the trigger radius will trigger the mine" );
    addField( "triggerDelay", TypeF32, Offset(triggerDelay, ProximityMineData),
       "Delay (in seconds) from when the mine is triggered until it explodes." );
-
-   INITPERSISTFIELD_SOUNDASSET(TriggerSound, ProximityMineData, "Arming sound for this proximity mine.");
-
    endGroup( "Triggering" );
 
    addGroup( "Explosion" );
@@ -124,8 +125,6 @@ void ProximityMineData::initPersistFields()
       "ground, which can end up blocking the explosion.  This offset along the mine's "
       "'up' normal allows you to raise the explosion origin to a better height.");
    endGroup( "Explosion" );
-
-   Parent::initPersistFields();
 }
 
 bool ProximityMineData::preload( bool server, String& errorStr )

+ 28 - 47
Engine/source/T3D/rigidShape.cpp

@@ -61,7 +61,6 @@ ConsoleDocClass( RigidShapeData,
 	"	   category = \"RigidShape\";\n"
 	"\n"		
 	"	   shapeFile = \"~/data/shapes/boulder/boulder.dts\";\n"
-	"	   emap = true;\n"
 	"\n"
 	"	   // Rigid Body\n"
 	"	   mass = 500;\n"
@@ -112,7 +111,6 @@ ConsoleDocClass( RigidShape,
 	"	   category = \"RigidShape\";\n"
 	"\n"		
 	"	   shapeFile = \"~/data/shapes/boulder/boulder.dts\";\n"
-	"	   emap = true;\n"
 	"\n"
 	"	   // Rigid Body\n"
 	"	   mass = 500;\n"
@@ -232,8 +230,6 @@ EndImplementEnumType;
 
 RigidShapeData::RigidShapeData()
 {
-   shadowEnable = true;
-
    body.friction = 0;
    body.restitution = 1;
 
@@ -516,73 +512,57 @@ void RigidShapeData::unpackData(BitStream* stream)
 
 void RigidShapeData::initPersistFields()
 {
-   addGroup("Physics");
-   addField("enablePhysicsRep", TypeBool, Offset(enablePhysicsRep, RigidShapeData),
-      "@brief Creates a representation of the object in the physics plugin.\n");
-   endGroup("Physics");
-
-   addField("massCenter", TypePoint3F, Offset(massCenter, RigidShapeData), "Center of mass for rigid body.");
-   addField("massBox", TypePoint3F, Offset(massBox, RigidShapeData), "Size of inertial box.");
-   addField("bodyRestitution", TypeF32, Offset(body.restitution, RigidShapeData), "The percentage of kinetic energy kept by this object in a collision.");
-   addField("bodyFriction", TypeF32, Offset(body.friction, RigidShapeData), "How much friction this object has. Lower values will cause the object to appear to be more slippery.");
-
-   addField("minImpactSpeed", TypeF32, Offset(minImpactSpeed, RigidShapeData),
-      "Minimum collision speed to classify collision as impact (triggers onImpact on server object)." );
-   addField("softImpactSpeed", TypeF32, Offset(softImpactSpeed, RigidShapeData), "Minimum speed at which this object must be travelling for the soft impact sound to be played.");
-   addField("hardImpactSpeed", TypeF32, Offset(hardImpactSpeed, RigidShapeData), "Minimum speed at which the object must be travelling for the hard impact sound to be played.");
-   addField("minRollSpeed", TypeF32, Offset(minRollSpeed, RigidShapeData));
-
-   addField("maxDrag", TypeF32, Offset(maxDrag, RigidShapeData), "Maximum drag available to this object.");
-   addField("minDrag", TypeF32, Offset(minDrag, RigidShapeData), "Minimum drag available to this object.");
-   addField("integration", TypeS32, Offset(integration, RigidShapeData), "Number of physics steps to process per tick.");
-   addField("collisionTol", TypeF32, Offset(collisionTol, RigidShapeData), "Collision distance tolerance.");
-   addField("contactTol", TypeF32, Offset(contactTol, RigidShapeData), "Contact velocity tolerance.");
-   
-   addGroup( "Forces" );
+   docsURL;
+   Parent::initPersistFields();
 
-      addField("dragForce",            TypeF32, Offset(dragForce,            RigidShapeData), "Used to simulate the constant drag acting on the object");
-      addField("vertFactor",           TypeF32, Offset(vertFactor,           RigidShapeData), "The scalar applied to the vertical portion of the velocity drag acting on a object.");
-   
-   endGroup( "Forces" );
-   
    addGroup( "Particle Effects" );
-
       addField("dustEmitter",       TYPEID< ParticleEmitterData >(),   Offset(dustEmitter,        RigidShapeData), "Array of pointers to ParticleEmitterData datablocks which will be used to emit particles at object/terrain contact point.\n");
       addField("triggerDustHeight", TypeF32,                      Offset(triggerDustHeight,  RigidShapeData), "Maximum height from the ground at which the object will generate dust.\n");
       addField("dustHeight",        TypeF32,                      Offset(dustHeight,         RigidShapeData), "Height of dust effects.\n");
-
       addField("dustTrailEmitter",     TYPEID< ParticleEmitterData >(),   Offset(dustTrailEmitter,   RigidShapeData), "Particle emitter used to create a dust trail for the moving object.\n");
-
       addField("splashEmitter",        TYPEID< ParticleEmitterData >(),   Offset(splashEmitterList,     RigidShapeData), VC_NUM_SPLASH_EMITTERS, "Array of pointers to ParticleEmitterData datablocks which will generate splash effects.\n");
-
       addField("splashFreqMod",  TypeF32,                Offset(splashFreqMod,   RigidShapeData), "The simulated frequency modulation of a splash generated by this object. Multiplied along with speed and time elapsed when determining splash emition rate.\n");
-      addField("splashVelEpsilon", TypeF32,              Offset(splashVelEpsilon, RigidShapeData), "The threshold speed at which we consider the object's movement to have stopped when updating splash effects.\n");
-      
+      addField("splashVelEpsilon", TypeF32,              Offset(splashVelEpsilon, RigidShapeData), "The threshold speed at which we consider the object's movement to have stopped when updating splash effects.\n");  
    endGroup( "Particle Effects" );
    
    addGroup( "Sounds" );
+      INITPERSISTFIELD_SOUNDASSET_ENUMED(BodySounds, bodySounds, Body::Sounds::MaxSounds, RigidShapeData, "Sounds for body.");      INITPERSISTFIELD_SOUNDASSET_ENUMED(WaterSounds, waterSounds, Sounds::MaxSounds, RigidShapeData, "Sounds for interacting with water.");
+   endGroup( "Sounds" );
 
-      INITPERSISTFIELD_SOUNDASSET_ENUMED(BodySounds, bodySounds, Body::Sounds::MaxSounds, RigidShapeData, "Sounds for body.");
+   addGroup("Physics");
+      addField("enablePhysicsRep", TypeBool, Offset(enablePhysicsRep, RigidShapeData),
+         "@brief Creates a representation of the object in the physics plugin.\n");
+         ("massCenter", TypePoint3F, Offset(massCenter, RigidShapeData), "Center of mass for rigid body.");
+      addField("massBox", TypePoint3F, Offset(massBox, RigidShapeData), "Size of inertial box.");
+      addField("bodyRestitution", TypeF32, Offset(body.restitution, RigidShapeData), "The percentage of kinetic energy kept by this object in a collision.");
+      addField("bodyFriction", TypeF32, Offset(body.friction, RigidShapeData), "How much friction this object has. Lower values will cause the object to appear to be more slippery.");
+      addField("maxDrag", TypeF32, Offset(maxDrag, RigidShapeData), "Maximum drag available to this object.");
+      addField("minDrag", TypeF32, Offset(minDrag, RigidShapeData), "Minimum drag available to this object.");
+      addField("integration", TypeS32, Offset(integration, RigidShapeData), "Number of physics steps to process per tick.");
+      addField("collisionTol", TypeF32, Offset(collisionTol, RigidShapeData), "Collision distance tolerance.");
+      addField("contactTol", TypeF32, Offset(contactTol, RigidShapeData), "Contact velocity tolerance.");
+      addField("dragForce",            TypeF32, Offset(dragForce,            RigidShapeData), "Used to simulate the constant drag acting on the object");
+      addField("vertFactor",           TypeF32, Offset(vertFactor,           RigidShapeData), "The scalar applied to the vertical portion of the velocity drag acting on a object.");
+   endGroup("Physics");
 
+   addGroup("Collision");
+      addField("minImpactSpeed", TypeF32, Offset(minImpactSpeed, RigidShapeData),
+      "Minimum collision speed to classify collision as impact (triggers onImpact on server object)." );
+      addField("softImpactSpeed", TypeF32, Offset(softImpactSpeed, RigidShapeData), "Minimum speed at which this object must be travelling for the soft impact sound to be played.");
+      addField("hardImpactSpeed", TypeF32, Offset(hardImpactSpeed, RigidShapeData), "Minimum speed at which the object must be travelling for the hard impact sound to be played.");
+      addField("minRollSpeed", TypeF32, Offset(minRollSpeed, RigidShapeData));
       addField("exitSplashSoundVelocity", TypeF32,       Offset(exitSplashSoundVel, RigidShapeData), "The minimum velocity at which the exit splash sound will be played when emerging from water.\n");
       addField("softSplashSoundVelocity", TypeF32,       Offset(softSplashSoundVel, RigidShapeData),"The minimum velocity at which the soft splash sound will be played when impacting water.\n");
       addField("mediumSplashSoundVelocity", TypeF32,     Offset(medSplashSoundVel, RigidShapeData), "The minimum velocity at which the medium splash sound will be played when impacting water.\n");
       addField("hardSplashSoundVelocity", TypeF32,       Offset(hardSplashSoundVel, RigidShapeData), "The minimum velocity at which the hard splash sound will be played when impacting water.\n");
-      
-      INITPERSISTFIELD_SOUNDASSET_ENUMED(WaterSounds, waterSounds, Sounds::MaxSounds, RigidShapeData, "Sounds for interacting with water.");
-
-   endGroup( "Sounds" );
+   endGroup("Collision");   
    
    addGroup( "Camera" );
-
       addField("cameraRoll",     TypeBool,       Offset(cameraRoll,     RigidShapeData), "Specifies whether the camera's rotation matrix, and the render eye transform are multiplied during camera updates.\n");
       addField("cameraLag",      TypeF32,        Offset(cameraLag,      RigidShapeData), "Scalar amount by which the third person camera lags the object, relative to the object's linear velocity.\n");
       addField("cameraDecay",  TypeF32,        Offset(cameraDecay,  RigidShapeData), "Scalar rate at which the third person camera offset decays, per tick.\n");
       addField("cameraOffset",   TypeF32,        Offset(cameraOffset,   RigidShapeData), "The vertical offset of the object's camera.\n");
-      
    endGroup( "Camera" );
-
-   Parent::initPersistFields();
 }   
 
 
@@ -1706,6 +1686,7 @@ void RigidShape::consoleInit()
 
 void RigidShape::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 }
 

+ 1 - 0
Engine/source/T3D/scopeAlwaysShape.cpp

@@ -40,6 +40,7 @@ ScopeAlwaysShape::ScopeAlwaysShape()
 
 void ScopeAlwaysShape::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 }
 

+ 1 - 0
Engine/source/T3D/sfx/sfxEmitter.cpp

@@ -174,6 +174,7 @@ void SFXEmitter::consoleInit()
 
 void SFXEmitter::initPersistFields()
 {
+   docsURL;
    addGroup( "Media" );
 
    INITPERSISTFIELD_SOUNDASSET(Sound, SFXEmitter, "");

+ 28 - 49
Engine/source/T3D/shapeBase.cpp

@@ -153,7 +153,7 @@ static const char *sDamageStateName[] =
 //----------------------------------------------------------------------------
 
 ShapeBaseData::ShapeBaseData()
- : shadowEnable( false ),
+ :
    shadowSize( 128 ),
    shadowMaxVisibleDistance( 80.0f ),
    shadowProjectionDistance( 10.0f ),
@@ -208,7 +208,6 @@ ShapeBaseData::ShapeBaseData()
 
 ShapeBaseData::ShapeBaseData(const ShapeBaseData& other, bool temp_clone) : GameBaseData(other, temp_clone)
 {
-   shadowEnable = other.shadowEnable;
    shadowSize = other.shadowSize;
    shadowMaxVisibleDistance = other.shadowMaxVisibleDistance;
    shadowProjectionDistance = other.shadowProjectionDistance;
@@ -535,31 +534,17 @@ bool ShapeBaseData::_setMass( void* object, const char* index, const char* data
 
 void ShapeBaseData::initPersistFields()
 {
-   addGroup( "Shadows" );
-
-      addField( "shadowEnable", TypeBool, Offset(shadowEnable, ShapeBaseData),
-         "Enable shadows for this shape (currently unused, shadows are always enabled)." );
-      addField( "shadowSize", TypeS32, Offset(shadowSize, ShapeBaseData),
-         "Size of the projected shadow texture (must be power of 2)." );
-      addField( "shadowMaxVisibleDistance", TypeF32, Offset(shadowMaxVisibleDistance, ShapeBaseData),
-         "Maximum distance at which shadow is visible (currently unused)." );
-      addField( "shadowProjectionDistance", TypeF32, Offset(shadowProjectionDistance, ShapeBaseData),
-         "Maximum height above ground to project shadow. If the object is higher "
-         "than this no shadow will be rendered." );
-      addField( "shadowSphereAdjust", TypeF32, Offset(shadowSphereAdjust, ShapeBaseData),
-         "Scalar applied to the radius of spot shadows (initial radius is based "
-         "on the shape bounds but can be adjusted with this field)." );
-
-   endGroup( "Shadows" );
-
-   addGroup( "Render" );
-
+   docsURL;
+   addGroup( "Shapes" );
       INITPERSISTFIELD_SHAPEASSET(Shape, ShapeBaseData, "The source shape asset.");
+      addField("computeCRC", TypeBool, Offset(computeCRC, ShapeBaseData),
+         "If true, verify that the CRC of the client's shape model matches the "
+         "server's CRC for the shape model when loaded by the client.");
+      addField("silentBBoxValidation", TypeBool, Offset(silent_bbox_check, ShapeBaseData));
+      INITPERSISTFIELD_SHAPEASSET(DebrisShape, ShapeBaseData, "The shape asset to use for auto-generated breakups via blowup(). @note may not be functional.");
+   endGroup( "Shapes" );
 
-   endGroup( "Render" );
-
-   addGroup( "Destruction", "Parameters related to the destruction effects of this object." );
-
+   addGroup("Particle Effects");
       addField( "explosion", TYPEID< ExplosionData >(), Offset(explosion, ShapeBaseData),
          "%Explosion to generate when this shape is blown up." );
       addField( "underwaterExplosion", TYPEID< ExplosionData >(), Offset(underwaterExplosion, ShapeBaseData),
@@ -568,23 +553,17 @@ void ShapeBaseData::initPersistFields()
          "%Debris to generate when this shape is blown up." );
       addField( "renderWhenDestroyed", TypeBool, Offset(renderWhenDestroyed, ShapeBaseData),
          "Whether to render the shape when it is in the \"Destroyed\" damage state." );
+   endGroup("Particle Effects");
 
-      INITPERSISTFIELD_SHAPEASSET(DebrisShape, ShapeBaseData, "The shape asset to use for auto-generated breakups. @note may not be functional.");
-
-   endGroup( "Destruction" );
-
-   addGroup( "Physics" );
-   
+   addGroup( "Physics" );   
       addProtectedField("mass", TypeF32, Offset(mass, ShapeBaseData), &_setMass, &defaultProtectedGetFn, "Shape mass.\nUsed in simulation of moving objects.\n"  );
       addField( "drag", TypeF32, Offset(drag, ShapeBaseData),
          "Drag factor.\nReduces velocity of moving objects." );
       addField( "density", TypeF32, Offset(density, ShapeBaseData),
          "Shape density.\nUsed when computing buoyancy when in water.\n" );
-
    endGroup( "Physics" );
 
    addGroup( "Damage/Energy" );
-
       addField( "maxEnergy", TypeF32, Offset(maxEnergy, ShapeBaseData),
          "Maximum energy level for this object." );
       addField( "maxDamage", TypeF32, Offset(maxDamage, ShapeBaseData),
@@ -605,11 +584,9 @@ void ShapeBaseData::initPersistFields()
       addField( "isInvincible", TypeBool, Offset(isInvincible, ShapeBaseData),
          "Invincible flag; when invincible, the object cannot be damaged or "
          "repaired." );
-
    endGroup( "Damage/Energy" );
 
    addGroup( "Camera", "The settings used by the shape when it is the camera." );
-
       addField( "cameraMaxDist", TypeF32, Offset(cameraMaxDist, ShapeBaseData),
          "The maximum distance from the camera to the object.\n"
          "Used when computing a custom camera transform for this object.\n\n"
@@ -638,35 +615,38 @@ void ShapeBaseData::initPersistFields()
          "Observe this object through its camera transform and default fov.\n"
          "If true, when this object is the camera it can provide a custom camera "
          "transform and FOV (instead of the default eye transform)." );
-
    endGroup("Camera");
 
-   addGroup( "Misc" );
-
-      addField( "computeCRC", TypeBool, Offset(computeCRC, ShapeBaseData),
-         "If true, verify that the CRC of the client's shape model matches the "
-         "server's CRC for the shape model when loaded by the client." );
-
-   endGroup( "Misc" );
-
    addGroup( "Reflection" );
-
       addField( "cubeReflectorDesc", TypeRealString, Offset( cubeDescName, ShapeBaseData ), 
          "References a ReflectorDesc datablock that defines performance and quality properties for dynamic reflections.\n");
       //addField( "reflectMaxRateMs", TypeS32, Offset( reflectMaxRateMs, ShapeBaseData ), "reflection will not be updated more frequently than this" );
       //addField( "reflectMaxDist", TypeF32, Offset( reflectMaxDist, ShapeBaseData ), "distance at which reflection is never updated" );
       //addField( "reflectMinDist", TypeF32, Offset( reflectMinDist, ShapeBaseData ), "distance at which reflection is always updated" );
       //addField( "reflectDetailAdjust", TypeF32, Offset( reflectDetailAdjust, ShapeBaseData ), "scale up or down the detail level for objects rendered in a reflection" );
-
    endGroup( "Reflection" );
 
    addField("remapTextureTags",      TypeString,   Offset(remap_txr_tags, ShapeBaseData));
-   addField("silentBBoxValidation",  TypeBool,     Offset(silent_bbox_check, ShapeBaseData));
+
    // disallow some field substitutions
    onlyKeepClearSubstitutions("debris"); // subs resolving to "~~", or "~0" are OK
    onlyKeepClearSubstitutions("explosion");
    onlyKeepClearSubstitutions("underwaterExplosion");
    Parent::initPersistFields();
+
+   addGroup("BL Projected Shadows");
+      addField("shadowSize", TypeS32, Offset(shadowSize, ShapeBaseData),
+         "Size of the projected shadow texture (must be power of 2).");
+      addField("shadowMaxVisibleDistance", TypeF32, Offset(shadowMaxVisibleDistance, ShapeBaseData),
+         "Maximum distance at which shadow is visible (currently unused).");
+      addField("shadowProjectionDistance", TypeF32, Offset(shadowProjectionDistance, ShapeBaseData),
+         "Maximum height above ground to project shadow. If the object is higher "
+         "than this no shadow will be rendered.");
+      addField("shadowSphereAdjust", TypeF32, Offset(shadowSphereAdjust, ShapeBaseData),
+         "Scalar applied to the radius of spot shadows (initial radius is based "
+         "on the shape bounds but can be adjusted with this field).");
+   endGroup("BL Projected Shadows");
+
 }
 
 DefineEngineMethod( ShapeBaseData, checkDeployPos, bool, ( TransformF txfm ),,
@@ -751,7 +731,6 @@ void ShapeBaseData::packData(BitStream* stream)
    if(stream->writeFlag(computeCRC))
       stream->write(mCRC);
 
-   stream->writeFlag(shadowEnable);
    stream->write(shadowSize);
    stream->write(shadowMaxVisibleDistance);
    stream->write(shadowProjectionDistance);
@@ -829,7 +808,6 @@ void ShapeBaseData::unpackData(BitStream* stream)
    if(computeCRC)
       stream->read(&mCRC);
 
-   shadowEnable = stream->readFlag();
    stream->read(&shadowSize);
    stream->read(&shadowMaxVisibleDistance);
    stream->read(&shadowProjectionDistance);
@@ -1056,6 +1034,7 @@ ShapeBase::~ShapeBase()
 
 void ShapeBase::initPersistFields()
 {
+   docsURL;
    addProtectedField( "skin", TypeRealString, Offset(mAppliedSkinName, ShapeBase), &_setFieldSkin, &_getFieldSkin,
       "@brief The skin applied to the shape.\n\n"
 

+ 0 - 2
Engine/source/T3D/shapeBase.h

@@ -354,7 +354,6 @@ struct ShapeBaseImageData: public GameBaseData {
    bool useRemainderDT;
 
    //
-   bool emap;                       ///< Environment mapping on?
    bool correctMuzzleVector;        ///< Adjust 1st person firing vector to eye's LOS point?
    bool correctMuzzleVectorTP;      ///< Adjust 3rd person firing vector to camera's LOS point?
    bool firstPerson;                ///< Render the image when in first person?
@@ -542,7 +541,6 @@ public:
 
    // TODO: These are only really used in Basic Lighting
    // mode... we should probably move them somewhere else.
-   bool shadowEnable;
    U32 shadowSize;
    F32 shadowMaxVisibleDistance;
    F32 shadowProjectionDistance;

+ 124 - 140
Engine/source/T3D/shapeImage.cpp

@@ -166,8 +166,6 @@ static ShapeBaseImageData::StateData gDefaultStateData;
 
 ShapeBaseImageData::ShapeBaseImageData()
 {
-   emap = false;
-
    mountPoint = 0;
    mountOffset.identity();
    eyeOffset.identity();
@@ -631,92 +629,109 @@ S32 ShapeBaseImageData::lookupState(const char* name)
 
 void ShapeBaseImageData::initPersistFields()
 {
-   addField( "emap", TypeBool, Offset(emap, ShapeBaseImageData),
-      "@brief Whether to enable environment mapping on this Image.\n\n" );
-
-   INITPERSISTFIELD_SHAPEASSET_ARRAY(Shape, MaxShapes, ShapeBaseImageData, "The shape asset to use for this image in the third person")
-
+   docsURL;
+   addGroup("Shapes");
+      INITPERSISTFIELD_SHAPEASSET_ARRAY(Shape, MaxShapes, ShapeBaseImageData, "The shape asset to use for this image in the third person")
    //addProtectedField("shapeFileFP", TypeShapeFilename, Offset(mShapeName[1], ShapeBaseImageData), _setShapeData, defaultProtectedGetFn, "deprecated alias for ShapeFPFile/Asset", AbstractClassRep::FIELD_HideInInspectors);
-
-   addField( "imageAnimPrefix", TypeCaseString, Offset(imageAnimPrefix, ShapeBaseImageData),
-      "@brief Passed along to the mounting shape to modify animation sequences played in third person. [optional]\n\n" );
-   addField( "imageAnimPrefixFP", TypeCaseString, Offset(imageAnimPrefixFP, ShapeBaseImageData),
-      "@brief Passed along to the mounting shape to modify animation sequences played in first person. [optional]\n\n" );
-
-   addField( "animateAllShapes", TypeBool, Offset(animateAllShapes, ShapeBaseImageData),
-      "@brief Indicates that all shapes should be animated in sync.\n\n"
-      "When multiple shapes are defined for this image datablock, each of them are automatically "
-      "animated in step with each other.  This allows for easy switching between between shapes "
-      "when some other condition changes, such as going from first person to third person, and "
-      "keeping their look consistent.  If you know that you'll never switch between shapes on the "
-      "fly, such as players only being allowed in a first person view, then you could set this to "
-      "false to save some calculations.\n\n"
-      "There are other circumstances internal to the engine that determine that only the current shape "
-      "should be animated rather than all defined shapes.  In those cases, this property is ignored.\n\n"
-      "@note This property is only important if you have more than one shape defined, such as shapeFileFP.\n\n"
-      "@see shapeFileFP\n");
-
-   addField( "animateOnServer", TypeBool, Offset(animateOnServer, ShapeBaseImageData),
-      "@brief Indicates that the image should be animated on the server.\n\n"
-      "In most cases you'll want this set if you're using useEyeNode.  You may also want to "
-      "set this if the muzzlePoint is animated while it shoots.  You can set this "
-      "to false even if these previous cases are true if the image's shape is set "
-      "up in the correct position and orientation in the 'root' pose and none of "
-      "the nodes are animated at key times, such as the muzzlePoint essentially "
-      "remaining at the same position at the start of the fire state (it could "
-      "animate just fine after the projectile is away as the muzzle vector is only "
-      "calculated at the start of the state).\n\n"
-      "You'll also want to set this to true if you're animating the camera using the "
-      "image's 'eye' node -- unless the movement is very subtle and doesn't need to "
-      "be reflected on the server.\n\n"
-      "@note Setting this to true causes up to four animation threads to be advanced on the server "
-      "for each instance in use, although for most images only one or two are actually defined.\n\n"
-      "@see useEyeNode\n");
-
-   addField( "scriptAnimTransitionTime", TypeF32, Offset(scriptAnimTransitionTime, ShapeBaseImageData),
-      "@brief The amount of time to transition between the previous sequence and new sequence when the script prefix has changed.\n\n"
-      "When setImageScriptAnimPrefix() is used on a ShapeBase that has this image mounted, the image "
-      "will attempt to switch to the new animation sequence based on the given script prefix.  This is "
-      "the amount of time it takes to transition from the previously playing animation sequence to"
-      "the new script prefix-based animation sequence.\n"
-      "@see ShapeBase::setImageScriptAnimPrefix()");
+      addField("casing", TYPEID< DebrisData >(), Offset(casing, ShapeBaseImageData),
+            "@brief DebrisData datablock to use for ejected casings.\n\n"
+            "@see stateEjectShell");
+      addField("shellExitDir", TypePoint3F, Offset(shellExitDir, ShapeBaseImageData),
+         "@brief Vector direction to eject shell casings.\n\n"
+         "@see casing");
+      addField("shellExitVariance", TypeF32, Offset(shellExitVariance, ShapeBaseImageData),
+         "@brief Variance (in degrees) from the shellExitDir vector to eject casings.\n\n"
+         "@see shellExitDir");
+      addField("shellVelocity", TypeF32, Offset(shellVelocity, ShapeBaseImageData),
+         "@brief Speed at which to eject casings.\n\n"
+         "@see casing");
+      addField("computeCRC", TypeBool, Offset(computeCRC, ShapeBaseImageData),
+         "If true, verify that the CRC of the client's Image matches the server's "
+         "CRC for the Image when loaded by the client.");
+   endGroup("Shapes");
+
+   addGroup("Animation");
+      addField( "imageAnimPrefix", TypeCaseString, Offset(imageAnimPrefix, ShapeBaseImageData),
+         "@brief Passed along to the mounting shape to modify animation sequences played in third person. [optional]\n\n" );
+      addField( "imageAnimPrefixFP", TypeCaseString, Offset(imageAnimPrefixFP, ShapeBaseImageData),
+         "@brief Passed along to the mounting shape to modify animation sequences played in first person. [optional]\n\n" );
+      addField( "animateAllShapes", TypeBool, Offset(animateAllShapes, ShapeBaseImageData),
+         "@brief Indicates that all shapes should be animated in sync.\n\n"
+         "When multiple shapes are defined for this image datablock, each of them are automatically "
+         "animated in step with each other.  This allows for easy switching between between shapes "
+         "when some other condition changes, such as going from first person to third person, and "
+         "keeping their look consistent.  If you know that you'll never switch between shapes on the "
+         "fly, such as players only being allowed in a first person view, then you could set this to "
+         "false to save some calculations.\n\n"
+         "There are other circumstances internal to the engine that determine that only the current shape "
+         "should be animated rather than all defined shapes.  In those cases, this property is ignored.\n\n"
+         "@note This property is only important if you have more than one shape defined, such as shapeFileFP.\n\n"
+         "@see shapeFileFP\n");
+      addField( "animateOnServer", TypeBool, Offset(animateOnServer, ShapeBaseImageData),
+         "@brief Indicates that the image should be animated on the server.\n\n"
+         "In most cases you'll want this set if you're using useEyeNode.  You may also want to "
+         "set this if the muzzlePoint is animated while it shoots.  You can set this "
+         "to false even if these previous cases are true if the image's shape is set "
+         "up in the correct position and orientation in the 'root' pose and none of "
+         "the nodes are animated at key times, such as the muzzlePoint essentially "
+         "remaining at the same position at the start of the fire state (it could "
+         "animate just fine after the projectile is away as the muzzle vector is only "
+         "calculated at the start of the state).\n\n"
+         "You'll also want to set this to true if you're animating the camera using the "
+         "image's 'eye' node -- unless the movement is very subtle and doesn't need to "
+         "be reflected on the server.\n\n"
+         "@note Setting this to true causes up to four animation threads to be advanced on the server "
+         "for each instance in use, although for most images only one or two are actually defined.\n\n"
+         "@see useEyeNode\n");
+      addField( "scriptAnimTransitionTime", TypeF32, Offset(scriptAnimTransitionTime, ShapeBaseImageData),
+         "@brief The amount of time to transition between the previous sequence and new sequence when the script prefix has changed.\n\n"
+         "When setImageScriptAnimPrefix() is used on a ShapeBase that has this image mounted, the image "
+         "will attempt to switch to the new animation sequence based on the given script prefix.  This is "
+         "the amount of time it takes to transition from the previously playing animation sequence to"
+         "the new script prefix-based animation sequence.\n"
+         "@see ShapeBase::setImageScriptAnimPrefix()");
+   endGroup("Animation");
 
    addField( "projectile", TYPEID< ProjectileData >(), Offset(projectile, ShapeBaseImageData),
       "@brief The projectile fired by this Image\n\n" );
-
    addField( "cloakable", TypeBool, Offset(cloakable, ShapeBaseImageData),
       "@brief Whether this Image can be cloaked.\n\n"
       "Currently unused." );
+   addField("usesEnergy", TypeBool, Offset(usesEnergy, ShapeBaseImageData),
+      "@brief Flag indicating whether this Image uses energy instead of ammo.  The energy level comes from the ShapeBase object we're mounted to.\n\n"
+      "@see ShapeBase::setEnergyLevel()");
+   addField("minEnergy", TypeF32, Offset(minEnergy, ShapeBaseImageData),
+      "@brief Minimum Image energy for it to be operable.\n\n"
+      "@see usesEnergy");
 
+   addGroup("Mounting");
    addField( "mountPoint", TypeS32, Offset(mountPoint, ShapeBaseImageData),
       "@brief Mount node # to mount this Image to.\n\n"
       "This should correspond to a mount# node on the ShapeBase derived object we are mounting to." );
-
    addField( "offset", TypeMatrixPosition, Offset(mountOffset, ShapeBaseImageData),
       "@brief \"X Y Z\" translation offset from this Image's <i>mountPoint</i> node to "
       "attach to.\n\n"
       "Defaults to \"0 0 0\". ie. attach this Image's "
       "<i>mountPoint</i> node to the ShapeBase model's mount# node without any offset.\n"
       "@see rotation");
-
    addField( "rotation", TypeMatrixRotation, Offset(mountOffset, ShapeBaseImageData),
       "@brief \"X Y Z ANGLE\" rotation offset from this Image's <i>mountPoint</i> node "
       "to attach to.\n\n"
       "Defaults to \"0 0 0\". ie. attach this Image's "
       "<i>mountPoint</i> node to the ShapeBase model's mount# node without any additional rotation.\n"
       "@see offset");
+   endGroup("Mounting");
 
+   addGroup("Camera");
    addField( "eyeOffset", TypeMatrixPosition, Offset(eyeOffset, ShapeBaseImageData),
       "@brief \"X Y Z\" translation offset from the ShapeBase model's eye node.\n\n"
       "When in first person view, this is the offset from the eye node to place the gun.  This "
       "gives the gun a fixed point in space, typical of a lot of FPS games.\n"
       "@see eyeRotation");
-
    addField( "eyeRotation", TypeMatrixRotation, Offset(eyeOffset, ShapeBaseImageData),
       "@brief \"X Y Z ANGLE\" rotation offset from the ShapeBase model's eye node.\n\n"
       "When in first person view, this is the rotation from the eye node to place the gun.\n"
       "@see eyeOffset");
-
    addField( "useEyeNode", TypeBool, Offset(useEyeNode, ShapeBaseImageData),
       "@brief Mount image using image's eyeMount node and place the camera at the image's eye node (or "
       "at the eyeMount node if the eye node is missing).\n\n"
@@ -728,92 +743,62 @@ void ShapeBaseImageData::initPersistFields()
       "@note Read about the animateOnServer field as you may want to set it to true if you're using useEyeNode.\n\n"
       "@see eyeOffset\n\n"
       "@see animateOnServer\n\n");
-
+   addField("firstPerson", TypeBool, Offset(firstPerson, ShapeBaseImageData),
+      "@brief Set to true to render the image in first person.");
+   endGroup("Camera");
+   
+   addGroup("Camera Shake");
+      addField( "shakeCamera", TypeBool, Offset(shakeCamera, ShapeBaseImageData),
+         "@brief Flag indicating whether the camera should shake when this Image fires.\n\n" );
+      addField( "camShakeFreq", TypePoint3F, Offset(camShakeFreq, ShapeBaseImageData),
+         "@brief Frequency of the camera shaking effect.\n\n"
+         "@see shakeCamera" );
+      addField( "camShakeAmp", TypePoint3F, Offset(camShakeAmp, ShapeBaseImageData),
+         "@brief Amplitude of the camera shaking effect.\n\n"
+         "@see shakeCamera" );
+      addField( "camShakeDuration", TypeF32, Offset(camShakeDuration, ShapeBaseImageData),
+         "Duration (in seconds) to shake the camera." );
+      addField( "camShakeRadius", TypeF32, Offset(camShakeRadius, ShapeBaseImageData),
+         "Radial distance that a camera's position must be within relative to the "
+         "center of the explosion to be shaken." );
+      addField( "camShakeFalloff", TypeF32, Offset(camShakeFalloff, ShapeBaseImageData),
+         "Falloff value for the camera shake." );
+   endGroup("Camera Shake");
+
+   addGroup("Physics");
    addField( "correctMuzzleVector", TypeBool,  Offset(correctMuzzleVector, ShapeBaseImageData),
       "@brief Flag to adjust the aiming vector to the eye's LOS point when in 1st person view.\n\n"
       "@see ShapeBase::getMuzzleVector()" );
-
    addField( "correctMuzzleVectorTP", TypeBool,  Offset(correctMuzzleVectorTP, ShapeBaseImageData),
       "@brief Flag to adjust the aiming vector to the camera's LOS point when in 3rd person view.\n\n"
       "@see ShapeBase::getMuzzleVector()" );
-
-   addField( "firstPerson", TypeBool, Offset(firstPerson, ShapeBaseImageData),
-      "@brief Set to true to render the image in first person." );
-
    addField( "mass", TypeF32, Offset(mass, ShapeBaseImageData),
       "@brief Mass of this Image.\n\n"
       "This is added to the total mass of the ShapeBase object." );
-
-   addField( "usesEnergy", TypeBool, Offset(usesEnergy,ShapeBaseImageData),
-      "@brief Flag indicating whether this Image uses energy instead of ammo.  The energy level comes from the ShapeBase object we're mounted to.\n\n"
-      "@see ShapeBase::setEnergyLevel()");
-
-   addField( "minEnergy", TypeF32, Offset(minEnergy, ShapeBaseImageData),
-      "@brief Minimum Image energy for it to be operable.\n\n"
-      "@see usesEnergy");
-
    addField( "accuFire", TypeBool, Offset(accuFire, ShapeBaseImageData),
       "@brief Flag to control whether the Image's aim is automatically converged with "
       "the crosshair.\n\n"
       "Currently unused." );
-
-   addField( "lightType", TYPEID< ShapeBaseImageData::LightType >(), Offset(lightType, ShapeBaseImageData),
-      "@brief The type of light this Image emits.\n\n"
-      "@see ShapeBaseImageLightType");
-
-   addField( "lightColor", TypeColorF, Offset(lightColor, ShapeBaseImageData),
-      "@brief The color of light this Image emits.\n\n"
-      "@see lightType");
-
-   addField( "lightDuration", TypeS32, Offset(lightDuration, ShapeBaseImageData),
-      "@brief Duration in SimTime of Pulsing and WeaponFire type lights.\n\n"
-      "@see lightType");
-
-   addField( "lightRadius", TypeF32, Offset(lightRadius, ShapeBaseImageData),
-      "@brief Radius of the light this Image emits.\n\n"
-      "@see lightType");
-
-   addField( "lightBrightness", TypeF32, Offset(lightBrightness, ShapeBaseImageData),
-      "@brief Brightness of the light this Image emits.\n\n"
-      "Only valid for WeaponFireLight."
-      "@see lightType");
-
-   addField( "shakeCamera", TypeBool, Offset(shakeCamera, ShapeBaseImageData),
-      "@brief Flag indicating whether the camera should shake when this Image fires.\n\n" );
-
-   addField( "camShakeFreq", TypePoint3F, Offset(camShakeFreq, ShapeBaseImageData),
-      "@brief Frequency of the camera shaking effect.\n\n"
-      "@see shakeCamera" );
-
-   addField( "camShakeAmp", TypePoint3F, Offset(camShakeAmp, ShapeBaseImageData),
-      "@brief Amplitude of the camera shaking effect.\n\n"
-      "@see shakeCamera" );
-
-   addField( "camShakeDuration", TypeF32, Offset(camShakeDuration, ShapeBaseImageData),
-      "Duration (in seconds) to shake the camera." );
-
-   addField( "camShakeRadius", TypeF32, Offset(camShakeRadius, ShapeBaseImageData),
-      "Radial distance that a camera's position must be within relative to the "
-      "center of the explosion to be shaken." );
-
-   addField( "camShakeFalloff", TypeF32, Offset(camShakeFalloff, ShapeBaseImageData),
-      "Falloff value for the camera shake." );
-
-   addField( "casing", TYPEID< DebrisData >(), Offset(casing, ShapeBaseImageData),
-      "@brief DebrisData datablock to use for ejected casings.\n\n"
-      "@see stateEjectShell" );
-
-   addField( "shellExitDir", TypePoint3F, Offset(shellExitDir, ShapeBaseImageData),
-      "@brief Vector direction to eject shell casings.\n\n"
-      "@see casing");
-
-   addField( "shellExitVariance", TypeF32, Offset(shellExitVariance, ShapeBaseImageData),
-      "@brief Variance (in degrees) from the shellExitDir vector to eject casings.\n\n"
-      "@see shellExitDir");
-
-   addField( "shellVelocity", TypeF32, Offset(shellVelocity, ShapeBaseImageData),
-      "@brief Speed at which to eject casings.\n\n"
-      "@see casing");
+   endGroup("Physics");
+
+   addGroup("Light Emitter");
+      addField( "lightType", TYPEID< ShapeBaseImageData::LightType >(), Offset(lightType, ShapeBaseImageData),
+         "@brief The type of light this Image emits.\n\n"
+         "@see ShapeBaseImageLightType");
+      addField( "lightColor", TypeColorF, Offset(lightColor, ShapeBaseImageData),
+         "@brief The color of light this Image emits.\n\n"
+         "@see lightType");
+      addField( "lightDuration", TypeS32, Offset(lightDuration, ShapeBaseImageData),
+         "@brief Duration in SimTime of Pulsing and WeaponFire type lights.\n\n"
+         "@see lightType");
+      addField( "lightRadius", TypeF32, Offset(lightRadius, ShapeBaseImageData),
+         "@brief Radius of the light this Image emits.\n\n"
+         "@see lightType");
+      addField( "lightBrightness", TypeF32, Offset(lightBrightness, ShapeBaseImageData),
+         "@brief Brightness of the light this Image emits.\n\n"
+         "Only valid for WeaponFireLight."
+         "@see lightType");
+   endGroup("Light Emitter");
 
    // State arrays
    addArray( "States", MaxStates );
@@ -994,18 +979,17 @@ void ShapeBaseImageData::initPersistFields()
 
    endArray( "States" );
 
-   addField( "computeCRC", TypeBool, Offset(computeCRC, ShapeBaseImageData),
-      "If true, verify that the CRC of the client's Image matches the server's "
-      "CRC for the Image when loaded by the client." );
-
-   addField( "maxConcurrentSounds", TypeS32, Offset(maxConcurrentSounds, ShapeBaseImageData),
-      "@brief Maximum number of sounds this Image can play at a time.\n\n"
-      "Any value <= 0 indicates that it can play an infinite number of sounds." );
-
-   addField( "useRemainderDT", TypeBool, Offset(useRemainderDT, ShapeBaseImageData), 
-      "@brief If true, allow multiple timeout transitions to occur within a single "
-      "tick (useful if states have a very small timeout).\n\n" );
-
+   addGroup("Sounds");
+      addField( "maxConcurrentSounds", TypeS32, Offset(maxConcurrentSounds, ShapeBaseImageData),
+         "@brief Maximum number of sounds this Image can play at a time.\n\n"
+         "Any value <= 0 indicates that it can play an infinite number of sounds." );
+   endGroup("Sounds");
+
+   addGroup("Animation");
+      addField( "useRemainderDT", TypeBool, Offset(useRemainderDT, ShapeBaseImageData),
+         "@brief If true, allow multiple timeout transitions to occur within a single "
+         "tick (useful if states have a very small timeout).\n\n" );
+   endGroup("Animation");
    Parent::initPersistFields();
 }
 

+ 1 - 0
Engine/source/T3D/spotLight.cpp

@@ -95,6 +95,7 @@ SpotLight::~SpotLight()
 
 void SpotLight::initPersistFields()
 {
+   docsURL;
    addGroup( "Light" );
       
       addField( "range", TypeF32, Offset( mRange, SpotLight ) );

+ 3 - 5
Engine/source/T3D/staticShape.cpp

@@ -95,9 +95,6 @@ ConsoleDocClass( StaticShapeData,
 StaticShapeData::StaticShapeData()
 {
    dynamicTypeField     = 0;
-
-   shadowEnable = true;
-
    noIndividualDamage = false;
 }
 
@@ -111,13 +108,13 @@ StaticShapeData::StaticShapeData(const StaticShapeData& other, bool temp_clone)
 
 void StaticShapeData::initPersistFields()
 {
+   docsURL;
+   Parent::initPersistFields();
    addField("noIndividualDamage",   TypeBool, Offset(noIndividualDamage,   StaticShapeData), "Deprecated\n\n @internal");
    addField("dynamicType",          TypeS32,  Offset(dynamicTypeField,     StaticShapeData), 
       "@brief An integer value which, if speficied, is added to the value retured by getType().\n\n"
       "This allows you to extend the type mask for a StaticShape that uses this datablock.  Type masks "
       "are used for container queries, etc.");
-
-   Parent::initPersistFields();
 }
 
 void StaticShapeData::packData(BitStream* stream)
@@ -197,6 +194,7 @@ StaticShape::~StaticShape()
 
 void StaticShape::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 }
 

+ 2 - 0
Engine/source/T3D/trigger.cpp

@@ -98,6 +98,7 @@ bool TriggerData::onAdd()
 
 void TriggerData::initPersistFields()
 {
+   docsURL;
    addGroup("Callbacks");
 
       addField( "tickPeriodMS",  TypeS32,    Offset( tickPeriodMS, TriggerData ),
@@ -370,6 +371,7 @@ void Trigger::consoleInit()
 
 void Trigger::initPersistFields()
 {
+   docsURL;
    addField("polyhedron", TypeTriggerPolyhedron, Offset(mTriggerPolyhedron, Trigger),
       "@brief Defines a non-rectangular area for the trigger.\n\n"
       "Rather than the standard rectangular bounds, this optional parameter defines a quadrilateral "

+ 9 - 8
Engine/source/T3D/tsStatic.cpp

@@ -176,11 +176,7 @@ FRangeValidator speedValidator(0.0f, AnimSpeedMax);
 
 void TSStatic::initPersistFields()
 {
-   addFieldV("AnimOffset", TypeF32, Offset(mAnimOffset, TSStatic), &percentValidator,
-      "Percent Animation Offset.");
-
-   addFieldV("AnimSpeed", TypeF32, Offset(mAnimSpeed, TSStatic), &speedValidator,
-      "Percent Animation Speed.");
+   docsURL;
    addGroup("Shape");
 
    INITPERSISTFIELD_SHAPEASSET(Shape, TSStatic, "Model to use for this TSStatic");
@@ -219,16 +215,21 @@ void TSStatic::initPersistFields()
       "name as the new target.\n\n");
    endGroup("Materials");
 
-   addGroup("Rendering");
-
+   addGroup("Animation");
    addField("playAmbient", TypeBool, Offset(mPlayAmbient, TSStatic),
       "Enables automatic playing of the animation sequence named \"ambient\" (if it exists) when the TSStatic is loaded.");
+   addFieldV("AnimOffset", TypeF32, Offset(mAnimOffset, TSStatic), &percentValidator,
+      "Percent Animation Offset.");
+   addFieldV("AnimSpeed", TypeF32, Offset(mAnimSpeed, TSStatic), &speedValidator,
+      "Percent Animation Speed.");
+   endGroup("Animation");
+
+   addGroup("Rendering");
    addField("meshCulling", TypeBool, Offset(mMeshCulling, TSStatic),
       "Enables detailed culling of meshes within the TSStatic. Should only be used "
       "with large complex shapes like buildings which contain many submeshes.");
    addField("originSort", TypeBool, Offset(mUseOriginSort, TSStatic),
       "Enables translucent sorting of the TSStatic by its origin instead of the bounds.");
-
    endGroup("Rendering");
 
    addGroup("Reflection");

+ 24 - 25
Engine/source/T3D/turret/aiTurretShape.cpp

@@ -124,34 +124,34 @@ AITurretShapeData::AITurretShapeData()
 
 void AITurretShapeData::initPersistFields()
 {
-   addField("maxScanHeading",       TypeF32,       Offset(maxScanHeading,        AITurretShapeData),
-      "@brief Maximum number of degrees to scan left and right.\n\n"
-      "@note Maximum scan heading is 90 degrees.\n");
-   addField("maxScanPitch",         TypeF32,       Offset(maxScanPitch,          AITurretShapeData),
-      "@brief Maximum number of degrees to scan up and down.\n\n"
-      "@note Maximum scan pitch is 90 degrees.\n");
-   addField("maxScanDistance",      TypeF32,       Offset(maxScanDistance,       AITurretShapeData),
-      "@brief Maximum distance to scan.\n\n"
-      "When combined with maxScanHeading and maxScanPitch this forms a 3D scanning wedge used to initially "
-      "locate a target.\n");
-
-   addField("scanTickFrequency",          TypeS32,       Offset(scanTickFrequency,       AITurretShapeData),
-      "@brief How often should we perform a full scan when looking for a target.\n\n"
-      "Expressed as the number of ticks between full scans, but no less than 1.\n");
-   addField("scanTickFrequencyVariance",  TypeS32,       Offset(scanTickFrequencyVariance,       AITurretShapeData),
-      "@brief Random amount that should be added to the scan tick frequency each scan period.\n\n"
-      "Expressed as the number of ticks to randomly add, but no less than zero.\n");
-
-   addField("trackLostTargetTime",  TypeF32,       Offset(trackLostTargetTime,       AITurretShapeData),
-      "@brief How long after the turret has lost the target should it still track it.\n\n"
-      "Expressed in seconds.\n");
-
+   docsURL;
+   Parent::initPersistFields();
+   addGroup("AI Steering");
+      addField("maxScanHeading",       TypeF32,       Offset(maxScanHeading,        AITurretShapeData),
+         "@brief Maximum number of degrees to scan left and right.\n\n"
+         "@note Maximum scan heading is 90 degrees.\n");
+      addField("maxScanPitch",         TypeF32,       Offset(maxScanPitch,          AITurretShapeData),
+         "@brief Maximum number of degrees to scan up and down.\n\n"
+         "@note Maximum scan pitch is 90 degrees.\n");
+      addField("maxScanDistance",      TypeF32,       Offset(maxScanDistance,       AITurretShapeData),
+         "@brief Maximum distance to scan.\n\n"
+         "When combined with maxScanHeading and maxScanPitch this forms a 3D scanning wedge used to initially "
+         "locate a target.\n");
+      addField("scanTickFrequency",          TypeS32,       Offset(scanTickFrequency,       AITurretShapeData),
+         "@brief How often should we perform a full scan when looking for a target.\n\n"
+         "Expressed as the number of ticks between full scans, but no less than 1.\n");
+      addField("scanTickFrequencyVariance",  TypeS32,       Offset(scanTickFrequencyVariance,       AITurretShapeData),
+         "@brief Random amount that should be added to the scan tick frequency each scan period.\n\n"
+         "Expressed as the number of ticks to randomly add, but no less than zero.\n");
+      addField("trackLostTargetTime",  TypeF32,       Offset(trackLostTargetTime,       AITurretShapeData),
+         "@brief How long after the turret has lost the target should it still track it.\n\n"
+         "Expressed in seconds.\n");
    addField("maxWeaponRange",       TypeF32,       Offset(maxWeaponRange,       AITurretShapeData),
       "@brief Maximum distance that the weapon will fire upon a target.\n\n");
-
    addField("weaponLeadVelocity",   TypeF32,       Offset(weaponLeadVelocity,   AITurretShapeData),
       "@brief Velocity used to lead target.\n\n"
       "If value <= 0, don't lead target.\n");
+   endGroup("AI Steering");
 
    // State arrays
    addArray( "States", MaxStates );
@@ -196,8 +196,6 @@ void AITurretShapeData::initPersistFields()
          "Scoped to AITurretShapeData.");
 
    endArray( "States" );
-
-   Parent::initPersistFields();
 }
 
 bool AITurretShapeData::onAdd()
@@ -467,6 +465,7 @@ AITurretShape::~AITurretShape()
 
 void AITurretShape::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 }
 

+ 27 - 25
Engine/source/T3D/turret/turretShape.cpp

@@ -87,8 +87,6 @@ TurretShapeData::TurretShapeData()
 {
    weaponLinkType = FireTogether;
 
-   shadowEnable = true;
-
    zRotOnly = false;
 
    startLoaded = true;
@@ -133,42 +131,45 @@ TurretShapeData::TurretShapeData()
 
 void TurretShapeData::initPersistFields()
 {
-   addField("zRotOnly",       TypeBool,         Offset(zRotOnly,       TurretShapeData),
-      "@brief Should the turret allow only z rotations.\n\n"
-      "True indicates that the turret may only be rotated on its z axis, just like the Item class.  "
-      "This keeps the turret always upright regardless of the surface it lands on.\n");
-
+   docsURL;
+   Parent::initPersistFields();
+   addGroup("Steering");
+      addField("zRotOnly",       TypeBool,         Offset(zRotOnly,       TurretShapeData),
+         "@brief Should the turret allow only z rotations.\n\n"
+         "True indicates that the turret may only be rotated on its z axis, just like the Item class.  "
+         "This keeps the turret always upright regardless of the surface it lands on.\n");
+      addField("maxHeading",        TypeF32,       Offset(maxHeading,         TurretShapeData),
+         "@brief Maximum number of degrees to rotate from center.\n\n"
+         "A value of 180 or more degrees indicates the turret may rotate completely around.\n");
+      addField("minPitch",          TypeF32,       Offset(minPitch,           TurretShapeData),
+         "@brief Minimum number of degrees to rotate down from straight ahead.\n\n");
+      addField("maxPitch",          TypeF32,       Offset(maxPitch,           TurretShapeData),
+         "@brief Maximum number of degrees to rotate up from straight ahead.\n\n");
+      addField("headingRate",       TypeF32,       Offset(headingRate,        TurretShapeData),
+         "@brief Degrees per second rotation.\n\n"
+         "A value of 0 means no rotation is allowed.  A value less than 0 means the rotation is instantaneous.\n");
+      addField("pitchRate",         TypeF32,       Offset(pitchRate,          TurretShapeData),
+         "@brief Degrees per second rotation.\n\n"
+         "A value of 0 means no rotation is allowed.  A value less than 0 means the rotation is instantaneous.\n");
+   endGroup("Steering");
+
+   addGroup("Weapon State");
    addField( "weaponLinkType", TYPEID< TurretShapeData::FireLinkType >(), Offset(weaponLinkType, TurretShapeData),
       "@brief Set how the mounted weapons are linked and triggered.\n\n"
       "<ul><li>FireTogether: All weapons fire under trigger 0.</li>"
       "<li>GroupedFire: Weapon mounts 0,2 fire under trigger 0, mounts 1,3 fire under trigger 1.</li>"
       "<li>IndividualFire: Each weapon mount fires under its own trigger 0-3.</li></ul>\n"
       "@see TurretShapeFireLinkType");
-
    addField("startLoaded",       TypeBool,       Offset(startLoaded,       TurretShapeData),
       "@brief Does the turret's mounted weapon(s) start in a loaded state.\n\n"
       "True indicates that all mounted weapons start in a loaded state.\n"
       "@see ShapeBase::setImageLoaded()");
+   endGroup("Weapon State");
 
+   addGroup("Camera", "The settings used by the shape when it is the camera.");
    addField("cameraOffset",      TypeF32,       Offset(cameraOffset,       TurretShapeData),
       "Vertical (Z axis) height of the camera above the turret." );
-
-   addField("maxHeading",        TypeF32,       Offset(maxHeading,         TurretShapeData),
-      "@brief Maximum number of degrees to rotate from center.\n\n"
-      "A value of 180 or more degrees indicates the turret may rotate completely around.\n");
-   addField("minPitch",          TypeF32,       Offset(minPitch,           TurretShapeData),
-      "@brief Minimum number of degrees to rotate down from straight ahead.\n\n");
-   addField("maxPitch",          TypeF32,       Offset(maxPitch,           TurretShapeData),
-      "@brief Maximum number of degrees to rotate up from straight ahead.\n\n");
-
-   addField("headingRate",       TypeF32,       Offset(headingRate,        TurretShapeData),
-      "@brief Degrees per second rotation.\n\n"
-      "A value of 0 means no rotation is allowed.  A value less than 0 means the rotation is instantaneous.\n");
-   addField("pitchRate",         TypeF32,       Offset(pitchRate,          TurretShapeData),
-      "@brief Degrees per second rotation.\n\n"
-      "A value of 0 means no rotation is allowed.  A value less than 0 means the rotation is instantaneous.\n");
-
-   Parent::initPersistFields();
+   endGroup("Camera");
 }
 
 void TurretShapeData::packData(BitStream* stream)
@@ -300,6 +301,7 @@ TurretShape::~TurretShape()
 
 void TurretShape::initPersistFields()
 {
+   docsURL;
    addField("respawn",        TypeBool,      Offset(mRespawn,      TurretShape),
       "@brief Respawn the turret after it has been destroyed.\n\n"
       "If true, the turret will respawn after it is destroyed.\n");

+ 37 - 17
Engine/source/T3D/vehicles/flyingVehicle.cpp

@@ -50,6 +50,15 @@ const static U32 sCollisionMoveMask = ( TerrainObjectType | WaterObjectType
 static U32 sServerCollisionMask = sCollisionMoveMask; // ItemObjectType
 static U32 sClientCollisionMask = sCollisionMoveMask;
 
+typedef FlyingVehicleData::Sounds engineSounds;
+DefineEnumType(engineSounds);
+
+ImplementEnumType(engineSounds, "enum types.\n"
+   "@ingroup VehicleData\n\n")
+   { engineSounds::JetSound, "JetSound", "..." },
+   { engineSounds::EngineSound,  "EngineSound", "..." },
+      EndImplementEnumType;
+
 //
 const char* FlyingVehicle::sJetSequence[FlyingVehicle::JetAnimCount] =
 {
@@ -166,15 +175,30 @@ bool FlyingVehicleData::preload(bool server, String &errorStr)
 
 void FlyingVehicleData::initPersistFields()
 {
+   docsURL;
+   Parent::initPersistFields();
 
-   INITPERSISTFIELD_SOUNDASSET_ARRAY(FlyingSounds, Sounds::MaxSounds, FlyingVehicleData, "Sounds for flying vehicle");
+   addGroup("Physics");
+   addField( "rollForce", TypeF32, Offset(rollForce, FlyingVehicleData),
+      "@brief Damping torque against rolling maneuvers (rotation about the y-axis), "
+      "proportional to linear velocity.\n\n"
+      "Acts to adjust roll to a stable position over time as the vehicle moves." );
+   addField( "rotationalDrag", TypeF32, Offset(rotationalDrag, FlyingVehicleData),
+      "Rotational drag factor (slows vehicle rotation speed in all axes)." );
+   addField( "horizontalSurfaceForce", TypeF32, Offset(horizontalSurfaceForce, FlyingVehicleData),
+      "@brief Damping force in the opposite direction to sideways velocity.\n\n"
+      "Provides \"bite\" into the wind for climbing/diving and turning)." );
+   addField( "hoverHeight", TypeF32, Offset(hoverHeight, FlyingVehicleData),
+      "The vehicle's height off the ground when at rest." );
+   addField( "createHoverHeight", TypeF32, Offset(createHoverHeight, FlyingVehicleData),
+      "@brief The vehicle's height off the ground when useCreateHeight is active.\n\n"
+      "This can help avoid problems with spawning the vehicle." );
+   endGroup("Physics");
 
+   addGroup("Steering");
    addField( "maneuveringForce", TypeF32, Offset(maneuveringForce, FlyingVehicleData),
       "@brief Maximum X and Y (horizontal plane) maneuvering force.\n\n"
       "The actual force applied depends on the current thrust." );
-   addField( "horizontalSurfaceForce", TypeF32, Offset(horizontalSurfaceForce, FlyingVehicleData),
-      "@brief Damping force in the opposite direction to sideways velocity.\n\n"
-      "Provides \"bite\" into the wind for climbing/diving and turning)." );
    addField( "verticalSurfaceForce", TypeF32, Offset(verticalSurfaceForce, FlyingVehicleData),
       "@brief Damping force in the opposite direction to vertical velocity.\n\n"
       "Controls side slip; lower numbers give more slide." );
@@ -186,13 +210,9 @@ void FlyingVehicleData::initPersistFields()
    addField( "steeringRollForce", TypeF32, Offset(steeringRollForce, FlyingVehicleData),
       "Roll force induced by sideways steering input value (controls how much "
       "the vehicle rolls when turning)." );
-   addField( "rollForce", TypeF32, Offset(rollForce, FlyingVehicleData),
-      "@brief Damping torque against rolling maneuvers (rotation about the y-axis), "
-      "proportional to linear velocity.\n\n"
-      "Acts to adjust roll to a stable position over time as the vehicle moves." );
-   addField( "rotationalDrag", TypeF32, Offset(rotationalDrag, FlyingVehicleData),
-      "Rotational drag factor (slows vehicle rotation speed in all axes)." );
+   endGroup("Steering");
 
+   addGroup("AutoCorrection");
    addField( "maxAutoSpeed", TypeF32, Offset(maxAutoSpeed, FlyingVehicleData),
       "Maximum speed for automatic vehicle control assistance - vehicles "
       "travelling at speeds above this value do not get control assitance." );
@@ -208,13 +228,9 @@ void FlyingVehicleData::initPersistFields()
       "@brief Corrective torque applied to level out the vehicle when moving at less "
       "than maxAutoSpeed.\n\n"
       "The torque is inversely proportional to vehicle speed." );
+   endGroup("AutoCorrection");
 
-   addField( "hoverHeight", TypeF32, Offset(hoverHeight, FlyingVehicleData),
-      "The vehicle's height off the ground when at rest." );
-   addField( "createHoverHeight", TypeF32, Offset(createHoverHeight, FlyingVehicleData),
-      "@brief The vehicle's height off the ground when useCreateHeight is active.\n\n"
-      "This can help avoid problems with spawning the vehicle." );
-
+   addGroup("Particle Effects");
    addField( "forwardJetEmitter",TYPEID< ParticleEmitterData >(), Offset(jetEmitter[ForwardJetEmitter], FlyingVehicleData),
       "@brief Emitter to generate particles for forward jet thrust.\n\n"
       "Forward jet thrust particles are emitted from model nodes JetNozzle0 "
@@ -231,8 +247,11 @@ void FlyingVehicleData::initPersistFields()
       "Emitter to generate contrail particles from model nodes contrail0 - contrail3." );
    addField( "minTrailSpeed", TypeF32, Offset(minTrailSpeed, FlyingVehicleData),
       "Minimum speed at which to start generating contrail particles." );
+   endGroup("Particle Effects");
 
-   Parent::initPersistFields();
+   addGroup("Sounds");
+      INITPERSISTFIELD_SOUNDASSET_ENUMED(FlyingSounds, engineSounds, Sounds::MaxSounds, FlyingVehicleData, "EngineSounds.");
+   endGroup("Sounds");
 }
 
 void FlyingVehicleData::packData(BitStream* stream)
@@ -788,6 +807,7 @@ void FlyingVehicle::unpackUpdate(NetConnection *con, BitStream *stream)
 
 void FlyingVehicle::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 }
 

+ 1 - 0
Engine/source/T3D/vehicles/guiSpeedometer.cpp

@@ -108,6 +108,7 @@ GuiSpeedometerHud::GuiSpeedometerHud()
 
 void GuiSpeedometerHud::initPersistFields()
 {
+   docsURL;
    addGroup("Needle");
 
    addField("maxSpeed", TypeF32, Offset( mMaxSpeed, GuiSpeedometerHud ),

+ 74 - 77
Engine/source/T3D/vehicles/hoverVehicle.cpp

@@ -174,79 +174,88 @@ HoverVehicleData::~HoverVehicleData()
 //--------------------------------------------------------------------------
 void HoverVehicleData::initPersistFields()
 {
-   addField( "dragForce", TypeF32, Offset(dragForce, HoverVehicleData),
+   docsURL;
+   Parent::initPersistFields();
+   addGroup("Physics");
+      addField( "normalForce", TypeF32, Offset(normalForce, HoverVehicleData),
+         "Force generated in the ground normal direction when the vehicle is not "
+         "floating (within stabalizer length from the ground).\n\n"
+         "@see stabLenMin" );
+      addField( "stabLenMin", TypeF32, Offset(stabLenMin, HoverVehicleData),
+         "Length of the base stabalizer when travelling at minimum speed (0).\n"
+         "Each tick, the vehicle performs 2 raycasts (from the center back and "
+         "center front of the vehicle) to check for contact with the ground. The "
+         "base stabalizer length determines the length of that raycast; if "
+         "neither raycast hit the ground, the vehicle is floating, stabalizer "
+         "spring and ground normal forces are not applied.\n\n"
+         "<img src=\"images/hoverVehicle_forces.png\">\n"
+         "@see stabSpringConstant" );
+      addField( "stabLenMax", TypeF32, Offset(stabLenMax, HoverVehicleData),
+         "Length of the base stabalizer when travelling at maximum speed "
+         "(maxThrustSpeed).\n\n@see stabLenMin\n\n@see mainThrustForce" );
+      addField("vertFactor", TypeF32, Offset(vertFactor, HoverVehicleData),
+         "Scalar applied to the vertical portion of the velocity drag acting on "
+         "the vehicle.\nFor the horizontal (X and Y) components of velocity drag, "
+         "a factor of 0.25 is applied when the vehicle is floating, and a factor "
+         "of 1.0 is applied when the vehicle is not floating. This velocity drag "
+         "is multiplied by the vehicle's dragForce, as defined above, and the "
+         "result is subtracted from it's movement force.\n"
+         "@note The vertFactor must be between 0.0 and 1.0 (inclusive).");
+      addField("stabSpringConstant", TypeF32, Offset(stabSpringConstant, HoverVehicleData),
+         "Value used to generate stabalizer spring force. The force generated "
+         "depends on stabilizer compression, that is how close the vehicle is "
+         "to the ground proportional to current stabalizer length.\n\n"
+         "@see stabLenMin");
+      addField("stabDampingConstant", TypeF32, Offset(stabDampingConstant, HoverVehicleData),
+         "Damping spring force acting against changes in the stabalizer length.\n\n"
+         "@see stabLenMin");
+   endGroup("Physics");
+
+   addGroup("Steering");
+      addField( "steeringForce", TypeF32, Offset(steeringForce, HoverVehicleData),
+         "Yaw (rotation about the Z-axis) force applied when steering in the x-axis direction."
+         "about the vehicle's Z-axis)" );
+      addField( "rollForce", TypeF32, Offset(rollForce, HoverVehicleData),
+      "Roll (rotation about the Y-axis) force applied when steering in the x-axis direction." );
+      addField( "pitchForce", TypeF32, Offset(pitchForce, HoverVehicleData),
+      "Pitch (rotation about the X-axis) force applied when steering in the y-axis direction." );
+      addField( "dragForce", TypeF32, Offset(dragForce, HoverVehicleData),
       "Drag force factor that acts opposite to the vehicle velocity.\nAlso "
       "used to determnine the vehicle's maxThrustSpeed.\n@see mainThrustForce" );
-   addField( "vertFactor", TypeF32, Offset(vertFactor, HoverVehicleData),
-      "Scalar applied to the vertical portion of the velocity drag acting on "
-      "the vehicle.\nFor the horizontal (X and Y) components of velocity drag, "
-      "a factor of 0.25 is applied when the vehicle is floating, and a factor "
-      "of 1.0 is applied when the vehicle is not floating. This velocity drag "
-      "is multiplied by the vehicle's dragForce, as defined above, and the "
-      "result is subtracted from it's movement force.\n"
-      "@note The vertFactor must be between 0.0 and 1.0 (inclusive)." );
-   addField( "floatingThrustFactor", TypeF32, Offset(floatingThrustFactor, HoverVehicleData),
-      "Scalar applied to the vehicle's thrust force when the vehicle is floating.\n"
-      "@note The floatingThrustFactor must be between 0.0 and 1.0 (inclusive)." );
-   addField( "mainThrustForce", TypeF32, Offset(mainThrustForce, HoverVehicleData),
-      "Force generated by thrusting the vehicle forward.\nAlso used to determine "
-      "the maxThrustSpeed:\n\n"
-      "@tsexample\n"
-      "maxThrustSpeed = (mainThrustForce + strafeThrustForce) / dragForce;\n"
-      "@endtsexample\n" );
-   addField( "reverseThrustForce", TypeF32, Offset(reverseThrustForce, HoverVehicleData),
-      "Force generated by thrusting the vehicle backward." );
-   addField( "strafeThrustForce", TypeF32, Offset(strafeThrustForce, HoverVehicleData),
-      "Force generated by thrusting the vehicle to one side.\nAlso used to "
-      "determine the vehicle's maxThrustSpeed.\n@see mainThrustForce" );
-   addField( "turboFactor", TypeF32, Offset(turboFactor, HoverVehicleData),
-      "Scale factor applied to the vehicle's thrust force when jetting." );
-
-   addField( "stabLenMin", TypeF32, Offset(stabLenMin, HoverVehicleData),
-      "Length of the base stabalizer when travelling at minimum speed (0).\n"
-      "Each tick, the vehicle performs 2 raycasts (from the center back and "
-      "center front of the vehicle) to check for contact with the ground. The "
-      "base stabalizer length determines the length of that raycast; if "
-      "neither raycast hit the ground, the vehicle is floating, stabalizer "
-      "spring and ground normal forces are not applied.\n\n"
-      "<img src=\"images/hoverVehicle_forces.png\">\n"
-      "@see stabSpringConstant" );
-   addField( "stabLenMax", TypeF32, Offset(stabLenMax, HoverVehicleData),
-      "Length of the base stabalizer when travelling at maximum speed "
-      "(maxThrustSpeed).\n\n@see stabLenMin\n\n@see mainThrustForce" );
-
-   addField( "stabSpringConstant", TypeF32, Offset(stabSpringConstant, HoverVehicleData),
-      "Value used to generate stabalizer spring force. The force generated "
-      "depends on stabilizer compression, that is how close the vehicle is "
-      "to the ground proportional to current stabalizer length.\n\n"
-      "@see stabLenMin" );
-   addField( "stabDampingConstant", TypeF32, Offset(stabDampingConstant, HoverVehicleData),
-      "Damping spring force acting against changes in the stabalizer length.\n\n"
-      "@see stabLenMin" );
-
+      addField( "mainThrustForce", TypeF32, Offset(mainThrustForce, HoverVehicleData),
+         "Force generated by thrusting the vehicle forward.\nAlso used to determine "
+         "the maxThrustSpeed:\n\n"
+         "@tsexample\n"
+         "maxThrustSpeed = (mainThrustForce + strafeThrustForce) / dragForce;\n"
+         "@endtsexample\n" );
+      addField( "reverseThrustForce", TypeF32, Offset(reverseThrustForce, HoverVehicleData),
+         "Force generated by thrusting the vehicle backward." );
+      addField( "strafeThrustForce", TypeF32, Offset(strafeThrustForce, HoverVehicleData),
+         "Force generated by thrusting the vehicle to one side.\nAlso used to "
+         "determine the vehicle's maxThrustSpeed.\n@see mainThrustForce" );
+      addField( "turboFactor", TypeF32, Offset(turboFactor, HoverVehicleData),
+         "Scale factor applied to the vehicle's thrust force when jetting." );
+      addField( "floatingThrustFactor", TypeF32, Offset(floatingThrustFactor, HoverVehicleData),
+         "Scalar applied to the vehicle's thrust force when the vehicle is floating.\n"
+         "@note The floatingThrustFactor must be between 0.0 and 1.0 (inclusive)." );
+   endGroup("Steering");
+
+   addGroup("AutoCorrection");
    addField( "gyroDrag", TypeF32, Offset(gyroDrag, HoverVehicleData),
       "Damping torque that acts against the vehicle's current angular momentum." );
-   addField( "normalForce", TypeF32, Offset(normalForce, HoverVehicleData),
-      "Force generated in the ground normal direction when the vehicle is not "
-      "floating (within stabalizer length from the ground).\n\n"
-      "@see stabLenMin" );
    addField( "restorativeForce", TypeF32, Offset(restorativeForce, HoverVehicleData),
       "Force generated to stabalize the vehicle (return it to neutral pitch/roll) "
       "when the vehicle is floating (more than stabalizer length from the "
       "ground.\n\n@see stabLenMin" );
-   addField( "steeringForce", TypeF32, Offset(steeringForce, HoverVehicleData),
-      "Yaw (rotation about the Z-axis) force applied when steering in the x-axis direction."
-      "about the vehicle's Z-axis)" );
-   addField( "rollForce", TypeF32, Offset(rollForce, HoverVehicleData),
-      "Roll (rotation about the Y-axis) force applied when steering in the x-axis direction." );
-   addField( "pitchForce", TypeF32, Offset(pitchForce, HoverVehicleData),
-      "Pitch (rotation about the X-axis) force applied when steering in the y-axis direction." );
+   endGroup("AutoCorrection");
 
-   INITPERSISTFIELD_SOUNDASSET_ENUMED(HoverSounds, hoverSoundsEnum, Sounds::MaxSounds, HoverVehicleData, "Sounds for hover vehicle.");
-   
+   addGroup("Particle Effects");
    addField( "dustTrailEmitter", TYPEID< ParticleEmitterData >(), Offset(dustTrailEmitter, HoverVehicleData),
       "Emitter to generate particles for the vehicle's dust trail.\nThe trail "
       "of dust particles is generated only while the vehicle is moving." );
+   addField( "forwardJetEmitter", TYPEID< ParticleEmitterData >(), Offset(jetEmitter[ForwardJetEmitter], HoverVehicleData),
+      "Emitter to generate particles for forward jet thrust.\nForward jet "
+      "thrust particles are emitted from model nodes JetNozzle0 and JetNozzle1." );
    addField( "dustTrailOffset", TypePoint3F, Offset(dustTrailOffset, HoverVehicleData),
       "\"X Y Z\" offset from the vehicle's origin from which to generate dust "
       "trail particles.\nBy default particles are emitted directly beneath the "
@@ -261,23 +270,11 @@ void HoverVehicleData::initPersistFields()
       "vehicle's speed is divided by this value to determine how many particles "
       "to generate each frame. Lower values give a more dense trail, higher "
       "values a more sparse trail." );
+   endGroup("Sounds");
 
-   addField( "floatingGravMag", TypeF32, Offset(floatingGravMag, HoverVehicleData),
-      "Scale factor applied to the vehicle gravitational force when the vehicle "
-      "is floating.\n\n@see stabLenMin" );
-   addField( "brakingForce", TypeF32, Offset(brakingForce, HoverVehicleData),
-      "Force generated by braking.\nThe vehicle is considered to be braking if "
-      "it is moving, but the throttle is off, and no left or right thrust is "
-      "being applied. This force is only applied when the vehicle's velocity is "
-      "less than brakingActivationSpeed." );
-   addField( "brakingActivationSpeed", TypeF32, Offset(brakingActivationSpeed, HoverVehicleData),
-      "Maximum speed below which a braking force is applied.\n\n@see brakingForce" );
-
-   addField( "forwardJetEmitter", TYPEID< ParticleEmitterData >(), Offset(jetEmitter[ForwardJetEmitter], HoverVehicleData),
-      "Emitter to generate particles for forward jet thrust.\nForward jet "
-      "thrust particles are emitted from model nodes JetNozzle0 and JetNozzle1." );
-
-   Parent::initPersistFields();
+   addGroup("Particle Effects");
+      INITPERSISTFIELD_SOUNDASSET_ENUMED(HoverSounds, hoverSoundsEnum, Sounds::MaxSounds, HoverVehicleData, "Sounds for hover vehicle.");
+   endGroup("Sounds");
 }
 
 

+ 35 - 25
Engine/source/T3D/vehicles/vehicle.cpp

@@ -127,7 +127,6 @@ ConsoleDocClass( VehicleData,
 
 VehicleData::VehicleData()
 {
-   shadowEnable = true;
    shadowSize = 256;
    shadowProjectionDistance = 14.0f;
    maxSteeringAngle = M_PI_F/4.0f; // 45 deg.
@@ -275,30 +274,10 @@ void VehicleData::unpackData(BitStream* stream)
 
 void VehicleData::initPersistFields()
 {
-   addGroup("Physics");
-   addField("enablePhysicsRep", TypeBool, Offset(enablePhysicsRep, VehicleData),
-      "@brief Creates a representation of the object in the physics plugin.\n");
-   endGroup("Physics");
-
-   addField( "jetForce", TypeF32, Offset(jetForce, VehicleData),
-      "@brief Additional force applied to the vehicle when it is jetting.\n\n"
-      "For WheeledVehicles, the force is applied in the forward direction. For "
-      "FlyingVehicles, the force is applied in the thrust direction." );
-   addField( "jetEnergyDrain", TypeF32, Offset(jetEnergyDrain, VehicleData),
-      "@brief Energy amount to drain for each tick the vehicle is jetting.\n\n"
-      "Once the vehicle's energy level reaches 0, it will no longer be able to jet." );
-   addField( "minJetEnergy", TypeF32, Offset(minJetEnergy, VehicleData),
-      "Minimum vehicle energy level to begin jetting." );
-
-   addField( "steeringReturn", TypeF32, Offset(steeringReturn, VehicleData),
-      "Rate at which the vehicle's steering returns to forwards when it is moving." );
-   addField( "steeringReturnSpeedScale", TypeF32, Offset(steeringReturnSpeedScale, VehicleData),
-      "Amount of effect the vehicle's speed has on its rate of steering return." );
-   addField( "powerSteering", TypeBool, Offset(powerSteering, VehicleData),
-      "If true, steering does not auto-centre while the vehicle is being steered by its driver." );
-   addField( "maxSteeringAngle", TypeF32, Offset(maxSteeringAngle, VehicleData),
-      "Maximum yaw (horizontal) and pitch (vertical) steering angle in radians." );
+   docsURL;
+   Parent::initPersistFields();   
 
+   addGroup("Particle Effects");
    addField( "damageEmitter", TYPEID< ParticleEmitterData >(), Offset(damageEmitterList, VehicleData), VC_NUM_DAMAGE_EMITTERS,
       "@brief Array of particle emitters used to generate damage (dust, smoke etc) "
       "effects.\n\n"
@@ -326,13 +305,43 @@ void VehicleData::initPersistFields()
    addField( "numDmgEmitterAreas", TypeF32, Offset(numDmgEmitterAreas, VehicleData),
       "Number of damageEmitterOffset values to use for each damageEmitter.\n\n"
       "@see damageEmitterOffset" );
+   endGroup("Particle Effects");
+
+   addGroup("Physics");
+   addField("enablePhysicsRep", TypeBool, Offset(enablePhysicsRep, VehicleData),
+      "@brief Creates a representation of the object in the physics plugin.\n");
+   endGroup("Physics");
+
+   addGroup("Collision");
    addField( "collDamageThresholdVel", TypeF32, Offset(collDamageThresholdVel, VehicleData),
       "Minimum collision velocity to cause damage to this vehicle.\nCurrently unused." );
    addField( "collDamageMultiplier", TypeF32, Offset(collDamageMultiplier, VehicleData),
       "@brief Damage to this vehicle after a collision (multiplied by collision "
       "velocity).\n\nCurrently unused." );
+   endGroup("Collision");
+
+   addGroup("Steering");
+      addField( "jetForce", TypeF32, Offset(jetForce, VehicleData),
+         "@brief Additional force applied to the vehicle when it is jetting.\n\n"
+         "For WheeledVehicles, the force is applied in the forward direction. For "
+         "FlyingVehicles, the force is applied in the thrust direction." );
+      addField( "jetEnergyDrain", TypeF32, Offset(jetEnergyDrain, VehicleData),
+      "@brief Energy amount to drain for each tick the vehicle is jetting.\n\n"
+         "Once the vehicle's energy level reaches 0, it will no longer be able to jet." );
+      addField( "minJetEnergy", TypeF32, Offset(minJetEnergy, VehicleData),
+      "Minimum vehicle energy level to begin jetting." );
+      addField( "maxSteeringAngle", TypeF32, Offset(maxSteeringAngle, VehicleData),
+         "Maximum yaw (horizontal) and pitch (vertical) steering angle in radians." );
+   endGroup("Steering");
 
-   Parent::initPersistFields();
+   addGroup("AutoCorrection");
+   addField( "powerSteering", TypeBool, Offset(powerSteering, VehicleData),
+      "If true, steering does not auto-centre while the vehicle is being steered by its driver." );
+   addField( "steeringReturn", TypeF32, Offset(steeringReturn, VehicleData),
+      "Rate at which the vehicle's steering returns to forwards when it is moving." );
+   addField( "steeringReturnSpeedScale", TypeF32, Offset(steeringReturnSpeedScale, VehicleData),
+      "Amount of effect the vehicle's speed has on its rate of steering return." );
+   endGroup("AutoCorrection");
 }
 
 
@@ -1100,6 +1109,7 @@ void Vehicle::consoleInit()
 
 void Vehicle::initPersistFields()
 {
+   docsURL;
    addField( "disableMove", TypeBool, Offset(mDisableMove, Vehicle),
       "When this flag is set, the vehicle will ignore throttle changes." );
 

+ 1 - 0
Engine/source/T3D/vehicles/vehicleBlocker.cpp

@@ -59,6 +59,7 @@ VehicleBlocker::~VehicleBlocker()
 //--------------------------------------------------------------------------
 void VehicleBlocker::initPersistFields()
 {
+   docsURL;
    addField("dimensions", TypePoint3F, Offset(mDimensions, VehicleBlocker));
    Parent::initPersistFields();
 }

+ 14 - 5
Engine/source/T3D/vehicles/wheeledVehicle.cpp

@@ -112,6 +112,7 @@ bool WheeledVehicleTire::preload(bool server, String &errorStr)
 
 void WheeledVehicleTire::initPersistFields()
 {
+   docsURL;
    INITPERSISTFIELD_SHAPEASSET(Shape, WheeledVehicleTire, "The shape to use for the wheel.");
 
    addField( "mass", TypeF32, Offset(mass, WheeledVehicleTire),
@@ -233,6 +234,7 @@ WheeledVehicleSpring::WheeledVehicleSpring()
 
 void WheeledVehicleSpring::initPersistFields()
 {
+   docsURL;
    addField( "length", TypeF32, Offset(length, WheeledVehicleSpring),
       "@brief Maximum spring length. ie. how far the wheel can extend from the "
       "root hub position.\n\n"
@@ -448,13 +450,20 @@ bool WheeledVehicleData::mirrorWheel(Wheel* we)
 
 void WheeledVehicleData::initPersistFields()
 {
+   docsURL;
+   Parent::initPersistFields();
+
+   addGroup("Particle Effects");
+   addField("tireEmitter", TYPEID< ParticleEmitterData >(), Offset(tireEmitter, WheeledVehicleData),
+      "ParticleEmitterData datablock used to generate particles from each wheel "
+      "when the vehicle is moving and the wheel is in contact with the ground.");
+   endGroup("Particle Effects");
+
    addGroup("Sounds");
    INITPERSISTFIELD_SOUNDASSET_ENUMED(WheeledVehicleSounds, WheeledVehicleSoundsEnum, MaxSounds, WheeledVehicleData, "Sounds related to wheeled vehicle.");
    endGroup("Sounds");
 
-   addField("tireEmitter",TYPEID< ParticleEmitterData >(), Offset(tireEmitter, WheeledVehicleData),
-      "ParticleEmitterData datablock used to generate particles from each wheel "
-      "when the vehicle is moving and the wheel is in contact with the ground.");
+   addGroup("Steering");
    addField("maxWheelSpeed", TypeF32, Offset(maxWheelSpeed, WheeledVehicleData),
       "@brief Maximum linear velocity of each wheel.\n\n"
       "This caps the maximum speed of the vehicle." );
@@ -468,8 +477,7 @@ void WheeledVehicleData::initPersistFields()
    addField("brakeTorque", TypeF32, Offset(brakeTorque, WheeledVehicleData),
       "@brief Torque applied when braking.\n\n"
       "This controls how fast the vehicle will stop when the brakes are applied." );
-   
-   Parent::initPersistFields();
+   endGroup("Steering");
 }
 
 
@@ -555,6 +563,7 @@ WheeledVehicle::~WheeledVehicle()
 
 void WheeledVehicle::initPersistFields()
 {
+   docsURL;
    Parent::initPersistFields();
 }
 

+ 1 - 0
Engine/source/T3D/zone.cpp

@@ -85,6 +85,7 @@ void Zone::consoleInit()
 #ifdef TORQUE_TOOLS
 void Zone::initPersistFields()
 {
+   docsURL;
    addProtectedField("selectAll", TypeBool, Offset(mSelecting, Zone),
       &_doSelect, &defaultProtectedGetFn, "Select all in this zone", AbstractClassRep::FieldFlags::FIELD_ComponentInspectors);
 

+ 2 - 1
Engine/source/Verve/Core/VController.cpp

@@ -60,8 +60,9 @@ VController::~VController( void )
     // Void.
 }
 
-void VController::initPersistFields( void )
+void VController::initPersistFields()
 {
+   docsURL;
     addGroup( "Controller" );
         addProtectedField( "Time",      TypeS32,  Offset( mTime,              VController ), &setTime,      &defaultProtectedGetFn, "Current position of the Controller (in milliseconds)." );
         addProtectedField( "Duration",  TypeS32,  Offset( mDuration,          VController ), &setDuration,  &defaultProtectedGetFn, "Total length of the sequence (in milliseconds)." );

+ 1 - 1
Engine/source/Verve/Core/VController.h

@@ -152,7 +152,7 @@ public:
     VController();
     ~VController();
 
-    static  void    initPersistFields( void );
+    static  void    initPersistFields();
 
     // ITickable.
 

+ 3 - 2
Engine/source/Verve/Core/VEvent.cpp

@@ -40,8 +40,9 @@ VEvent::VEvent( void ) :
     setLabel( "DefaultEvent" );
 }
 
-void VEvent::initPersistFields( void )
+void VEvent::initPersistFields()
 {
+   docsURL;
     Parent::initPersistFields();
 
     addProtectedField( "TriggerTime", TypeS32, Offset( mTriggerTime, VEvent ), &setTriggerTime, &defaultProtectedGetFn, "The time that this event is triggered." );
@@ -403,4 +404,4 @@ void VEvent::setDuration( const S32 &pDuration )
 
     // Apply Duration.
     mDuration = pDuration;
-}
+}

+ 1 - 1
Engine/source/Verve/Core/VEvent.h

@@ -48,7 +48,7 @@ public:
 
     VEvent( void );
 
-    static  void    initPersistFields( void );
+    static  void    initPersistFields();
 
     // Controller Methods.
 

+ 2 - 1
Engine/source/Verve/Core/VObject.cpp

@@ -42,8 +42,9 @@ VObject::~VObject( void )
     remove();
 }
 
-void VObject::initPersistFields( void )
+void VObject::initPersistFields()
 {
+   docsURL;
     // Don't Use Parent Fields.
     // Parent::initPersistFields();
 

+ 1 - 1
Engine/source/Verve/Core/VObject.h

@@ -66,7 +66,7 @@ public:
     VObject( void );
     virtual ~VObject( void );
 
-    static  void           initPersistFields( void );
+    static  void           initPersistFields();
 
     // Reference Methods.
 

+ 3 - 2
Engine/source/Verve/Extension/Animation/VShapeAnimationEvent.cpp

@@ -38,8 +38,9 @@ VShapeAnimationEvent::VShapeAnimationEvent( void ) :
 
 //-----------------------------------------------------------------------------
 
-void VShapeAnimationEvent::initPersistFields( void )
+void VShapeAnimationEvent::initPersistFields()
 {
+   docsURL;
     Parent::initPersistFields();
 
     addField( "AnimationData", TypeRealString, Offset( mAnimationData, VShapeAnimationEvent ), "The name of the Animation Sequence to play upon triggering." );
@@ -151,4 +152,4 @@ F32 VShapeAnimationEvent::getAnimationPosition( const S32 &pTime )
     const S32 loopInterp = S32( mDuration * interp ) % duration;
 
     return ( F32 )loopInterp / ( F32 )duration;
-}
+}

+ 1 - 1
Engine/source/Verve/Extension/Animation/VShapeAnimationEvent.h

@@ -46,7 +46,7 @@ public:
 
     VShapeAnimationEvent( void );
 
-    static void     initPersistFields( void );
+    static void     initPersistFields();
 
     // Callback Methods.
 

برخی فایل ها در این مقایسه diff نمایش داده نمی شوند زیرا تعداد فایل ها بسیار زیاد است