浏览代码

Shift tracking of dynamicObjects from strict child objects for Scenes, to tracking the objects but keeping them in the Cleanup Group to fix prefab loading behavior
Shifted to utilizing SimGroupInterator and persistenceManager to fix saving issues with SubScenes
Shifted to utilizing SimGroupIterator for Scene saving to standardize and minimize object misses
Changed prefab load file logic to add loaded child simgroup to rootscene for consistent tracking and avoiding conflicts with subScene's hijacking the ImmediateGroup var
Reduced duplication of build<type>field callback for inspectors
Added more standard field type lookups to inspector group when creating a field to avoid misses for types like 'F32' or similar.
Folded the added-on MinSize/MaxSize/SimgroupSelect fields for SimGroup editing into a single compound field and fixed bugs with it's behavior so it works as expected now

JeffR 10 月之前
父节点
当前提交
10d1aeca1f

+ 21 - 24
Engine/source/T3D/Scene.cpp

@@ -148,20 +148,32 @@ void Scene::removeObject(SimObject* object)
    Parent::removeObject(object);
    Parent::removeObject(object);
 }
 }
 
 
-void Scene::addDynamicObject(SceneObject* object)
+void Scene::addDynamicObject(SimObject* object)
 {
 {
    mDynamicObjects.push_back(object);
    mDynamicObjects.push_back(object);
 
 
+   SimGroup* cleanupGroup;
+   if(Sim::findObject("MissionCleanup", cleanupGroup))
+   {
+      cleanupGroup->addObject(object);
+   }
+
    //Do it like regular, though we should probably bail if we're trying to add non-scene objects to the scene?
    //Do it like regular, though we should probably bail if we're trying to add non-scene objects to the scene?
-   Parent::addObject(object);
+   //Parent::addObject(object);
 }
 }
 
 
-void Scene::removeDynamicObject(SceneObject* object)
+void Scene::removeDynamicObject(SimObject* object)
 {
 {
    mDynamicObjects.remove(object);
    mDynamicObjects.remove(object);
 
 
+   SimGroup* cleanupGroup;
+   if (Sim::findObject("MissionCleanup", cleanupGroup))
+   {
+      cleanupGroup->removeObject(object);
+   }
+
    //Do it like regular, though we should probably bail if we're trying to add non-scene objects to the scene?
    //Do it like regular, though we should probably bail if we're trying to add non-scene objects to the scene?
-   Parent::removeObject(object);
+   //Parent::removeObject(object);
 }
 }
 
 
 void Scene::interpolateTick(F32 delta)
 void Scene::interpolateTick(F32 delta)
@@ -242,7 +254,7 @@ void Scene::dumpUtilizedAssets()
    Con::printf("Dumping utilized assets in scene!");
    Con::printf("Dumping utilized assets in scene!");
 
 
    Vector<StringTableEntry> utilizedAssetsList;
    Vector<StringTableEntry> utilizedAssetsList;
-   for (U32 i = 0; i < mPermanentObjects.size(); i++)
+   /*for (U32 i = 0; i < mPermanentObjects.size(); i++)
    {
    {
       mPermanentObjects[i]->getUtilizedAssets(&utilizedAssetsList);
       mPermanentObjects[i]->getUtilizedAssets(&utilizedAssetsList);
    }
    }
@@ -250,7 +262,7 @@ void Scene::dumpUtilizedAssets()
    for (U32 i = 0; i < mDynamicObjects.size(); i++)
    for (U32 i = 0; i < mDynamicObjects.size(); i++)
    {
    {
       mDynamicObjects[i]->getUtilizedAssets(&utilizedAssetsList);
       mDynamicObjects[i]->getUtilizedAssets(&utilizedAssetsList);
-   }
+   }*/
 
 
    for (U32 i = 0; i < utilizedAssetsList.size(); i++)
    for (U32 i = 0; i < utilizedAssetsList.size(); i++)
    {
    {
@@ -294,31 +306,16 @@ bool Scene::saveScene(StringTableEntry fileName)
       fileName = getOriginatingFile();
       fileName = getOriginatingFile();
    }
    }
 
 
-   //Inform our objects we're saving, so if they do any special stuff
-   //they can do it before the actual write-out
-   for (SimGroup::iterator itr = begin(); itr != end(); itr++)
+   for (SimGroupIterator itr(this); *itr; ++itr)
    {
    {
-      SimGroup* sg = dynamic_cast<SimGroup*>(*itr);
-      if (sg)
+      if((*itr)->isMethod("onSaving"))
       {
       {
          ConsoleValue vars[3];
          ConsoleValue vars[3];
          vars[2].setString(fileName);
          vars[2].setString(fileName);
-         sg->callOnChildren("onSaving", 3, vars);
-      }
-
-      SceneObject* sO = dynamic_cast<SceneObject*>(*itr);
-      if (sO)
-      {
-         sO->onSaving_callback(fileName);
+         Con::execute((*itr), 3, vars);
       }
       }
    }
    }
 
 
-   /*for (U32 i = 0; i < mPermanentObjects.size(); i++)
-   {
-      SceneObject* obj = mPermanentObjects[i];
-      obj->onSaving_callback(fileName);
-   }*/
-
    //Inform our subscenes we're saving so they can do any
    //Inform our subscenes we're saving so they can do any
    //special work required as well
    //special work required as well
    for (U32 i = 0; i < mSubScenes.size(); i++)
    for (U32 i = 0; i < mSubScenes.size(); i++)

+ 4 - 4
Engine/source/T3D/Scene.h

@@ -31,8 +31,8 @@ class Scene : public NetObject, public virtual ITickable
 
 
    Vector<SubScene*> mSubScenes;
    Vector<SubScene*> mSubScenes;
 
 
-   Vector<SceneObject*> mPermanentObjects;
-   Vector<SceneObject*> mDynamicObjects;
+   Vector<SimObject*> mPermanentObjects;
+   Vector<SimObject*> mDynamicObjects;
 
 
    S32 mSceneId;
    S32 mSceneId;
 
 
@@ -69,8 +69,8 @@ public:
    void addObject(SimObject* object) override;
    void addObject(SimObject* object) override;
    void removeObject(SimObject* object) override;
    void removeObject(SimObject* object) override;
 
 
-   void addDynamicObject(SceneObject* object);
-   void removeDynamicObject(SceneObject* object);
+   void addDynamicObject(SimObject* object);
+   void removeDynamicObject(SimObject* object);
    void clearDynamicObjects() { mDynamicObjects.clear(); }
    void clearDynamicObjects() { mDynamicObjects.clear(); }
 
 
    void dumpUtilizedAssets();
    void dumpUtilizedAssets();

+ 13 - 18
Engine/source/T3D/SubScene.cpp

@@ -1,6 +1,7 @@
 #include "SubScene.h"
 #include "SubScene.h"
 
 
 #include "gameMode.h"
 #include "gameMode.h"
+#include "console/persistenceManager.h"
 #include "console/script.h"
 #include "console/script.h"
 #include "scene/sceneRenderState.h"
 #include "scene/sceneRenderState.h"
 #include "renderInstance/renderPassManager.h"
 #include "renderInstance/renderPassManager.h"
@@ -391,34 +392,28 @@ bool SubScene::save()
    if (mStartUnloadTimerMS != -1)
    if (mStartUnloadTimerMS != -1)
       mStartUnloadTimerMS = Sim::getCurrentTime();
       mStartUnloadTimerMS = Sim::getCurrentTime();
 
 
+   PersistenceManager prMger;
+
    StringTableEntry levelPath = mLevelAsset->getLevelPath();
    StringTableEntry levelPath = mLevelAsset->getLevelPath();
 
 
-   for (SimGroup::iterator itr = begin(); itr != end(); itr++)
+   FileStream fs;
+   fs.open(levelPath, Torque::FS::File::Write);
+   fs.close();
+
+   for (SimGroupIterator itr(this); *itr; ++itr)
    {
    {
-      //Inform our objects we're saving, so if they do any special stuff
-      //they can do it before the actual write-out
-      SimGroup* sg = dynamic_cast<SimGroup*>(*itr);
-      if (sg)
+      if ((*itr)->isMethod("onSaving"))
       {
       {
          ConsoleValue vars[3];
          ConsoleValue vars[3];
          vars[2].setString(mLevelAssetId);
          vars[2].setString(mLevelAssetId);
-         sg->callOnChildren("onSaving", 3, vars);
+         Con::execute((*itr), 3, vars);
       }
       }
 
 
-      SceneObject* scO = dynamic_cast<SceneObject*>(*itr);
-      if (scO)
-      {
-         scO->onSaving_callback(mLevelAssetId);
-      }
-
-      SimObject* sO = static_cast<SimObject*>(*itr);
-      if (!sO->save(levelPath))
-      {
-         Con::errorf("SubScene::save() - error, failed to write object %s to file: %s", sO->getIdString(), levelPath);
-         return false;
-      }
+      prMger.setDirty((*itr), levelPath);
    }
    }
 
 
+   prMger.saveDirty();
+
    //process our gameModeList and write it out to the levelAsset for metadata stashing
    //process our gameModeList and write it out to the levelAsset for metadata stashing
    bool saveSuccess = false;
    bool saveSuccess = false;
 
 

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

@@ -371,6 +371,12 @@ void Prefab::_loadFile( bool addFileNotify )
       return;
       return;
    }
    }
 
 
+   SimObjectPtr<Scene> rootScene = Scene::getRootScene();
+   if(rootScene.isValid())
+   {
+      rootScene->addDynamicObject(group);
+   }
+
    if ( addFileNotify )
    if ( addFileNotify )
       Torque::FS::AddChangeNotification( mFilename, this, &Prefab::_onFileChanged );
       Torque::FS::AddChangeNotification( mFilename, this, &Prefab::_onFileChanged );
 
 

+ 44 - 34
Engine/source/gui/editor/inspector/group.cpp

@@ -178,7 +178,7 @@ GuiInspectorField* GuiInspectorGroup::constructField( S32 fieldType )
 
 
       // return our new datablock field with correct datablock type enumeration info
       // return our new datablock field with correct datablock type enumeration info
       return dbFieldClass;
       return dbFieldClass;
-}
+   }
 
 
    // Nope, not a datablock. So maybe it has a valid inspector field override we can use?
    // Nope, not a datablock. So maybe it has a valid inspector field override we can use?
    if(!cbt->getInspectorFieldType())
    if(!cbt->getInspectorFieldType())
@@ -641,40 +641,50 @@ void GuiInspectorGroup::addInspectorField(StringTableEntry name, StringTableEntr
 {
 {
    S32 fieldType = -1;
    S32 fieldType = -1;
 
 
-   if (typeName == StringTable->insert("int"))
-      fieldType = TypeS32;
-   else if (typeName == StringTable->insert("float"))
-      fieldType = TypeF32;
-   else if (typeName == StringTable->insert("vector"))
-      fieldType = TypePoint3F;
-   else if (typeName == StringTable->insert("vector2"))
-      fieldType = TypePoint2F;
-   else if (typeName == StringTable->insert("material"))
-      fieldType = TypeMaterialAssetId;
-   else if (typeName == StringTable->insert("image"))
-      fieldType = TypeImageAssetId;
-   else if (typeName == StringTable->insert("shape"))
-      fieldType = TypeShapeAssetId;
-   else if (typeName == StringTable->insert("sound"))
-      fieldType = TypeSoundAssetId;
-   else if (typeName == StringTable->insert("bool"))
-      fieldType = TypeBool;
-   else if (typeName == StringTable->insert("object"))
-      fieldType = TypeSimObjectPtr;
-   else if (typeName == StringTable->insert("string"))
-      fieldType = TypeString;
-   else if (typeName == StringTable->insert("colorI"))
-      fieldType = TypeColorI;
-   else if (typeName == StringTable->insert("colorF"))
-      fieldType = TypeColorF;
-   else if (typeName == StringTable->insert("ease"))
-      fieldType = TypeEaseF;
-   else if (typeName == StringTable->insert("command"))
-      fieldType = TypeCommand;
-   else if (typeName == StringTable->insert("filename"))
-      fieldType = TypeStringFilename;
+   String typeNameTyped = typeName;
+   if (!typeNameTyped.startsWith("Type"))
+      typeNameTyped = String("Type") + typeNameTyped;
+
+   ConsoleBaseType* typeRef = AbstractClassRep::getTypeByName(typeNameTyped.c_str());
+   if(typeRef)
+   {
+      fieldType = typeRef->getTypeID();
+   }
    else
    else
-      fieldType = -1;
+   {
+      if (typeName == StringTable->insert("int"))
+         fieldType = TypeS32;
+      else if (typeName == StringTable->insert("float"))
+         fieldType = TypeF32;
+      else if (typeName == StringTable->insert("vector"))
+         fieldType = TypePoint3F;
+      else if (typeName == StringTable->insert("vector2"))
+         fieldType = TypePoint2F;
+      else if (typeName == StringTable->insert("material"))
+         fieldType = TypeMaterialAssetId;
+      else if (typeName == StringTable->insert("image"))
+         fieldType = TypeImageAssetId;
+      else if (typeName == StringTable->insert("shape"))
+         fieldType = TypeShapeAssetId;
+      else if (typeName == StringTable->insert("sound"))
+         fieldType = TypeSoundAssetId;
+      else if (typeName == StringTable->insert("bool"))
+         fieldType = TypeBool;
+      else if (typeName == StringTable->insert("object"))
+         fieldType = TypeSimObjectPtr;
+      else if (typeName == StringTable->insert("string"))
+         fieldType = TypeString;
+      else if (typeName == StringTable->insert("colorI"))
+         fieldType = TypeColorI;
+      else if (typeName == StringTable->insert("colorF"))
+         fieldType = TypeColorF;
+      else if (typeName == StringTable->insert("ease"))
+         fieldType = TypeEaseF;
+      else if (typeName == StringTable->insert("command"))
+         fieldType = TypeCommand;
+      else if (typeName == StringTable->insert("filename"))
+         fieldType = TypeStringFilename;
+   }
 
 
    GuiInspectorField* fieldGui;
    GuiInspectorField* fieldGui;
 
 

+ 46 - 31
Engine/source/gui/editor/inspector/variableInspector.cpp

@@ -176,38 +176,53 @@ void GuiVariableInspector::addField(const char* name, const char* label, const c
    //find the field type
    //find the field type
    S32 fieldTypeMask = -1;
    S32 fieldTypeMask = -1;
 
 
-   if (newField->mFieldTypeName == StringTable->insert("int"))
-      fieldTypeMask = TypeS32;
-   else if (newField->mFieldTypeName == StringTable->insert("float"))
-      fieldTypeMask = TypeF32;
-   else if (newField->mFieldTypeName == StringTable->insert("vector"))
-      fieldTypeMask = TypePoint3F;
-   else if (newField->mFieldTypeName == StringTable->insert("vector2"))
-      fieldTypeMask = TypePoint2F;
-   else if (newField->mFieldTypeName == StringTable->insert("material"))
-      fieldTypeMask = TypeMaterialAssetId;
-   else if (newField->mFieldTypeName == StringTable->insert("image"))
-      fieldTypeMask = TypeImageAssetId;
-   else if (newField->mFieldTypeName == StringTable->insert("shape"))
-      fieldTypeMask = TypeShapeAssetId;
-   else if (newField->mFieldTypeName == StringTable->insert("bool"))
-      fieldTypeMask = TypeBool;
-   else if (newField->mFieldTypeName == StringTable->insert("object"))
-      fieldTypeMask = TypeSimObjectPtr;
-   else if (newField->mFieldTypeName == StringTable->insert("string"))
-      fieldTypeMask = TypeString;
-   else if (newField->mFieldTypeName == StringTable->insert("colorI"))
-      fieldTypeMask = TypeColorI;
-   else if (newField->mFieldTypeName == StringTable->insert("colorF"))
-      fieldTypeMask = TypeColorF;
-   else if (newField->mFieldTypeName == StringTable->insert("ease"))
-      fieldTypeMask = TypeEaseF;
-   else if (newField->mFieldTypeName == StringTable->insert("command"))
-      fieldTypeMask = TypeCommand;
-   else if (newField->mFieldTypeName == StringTable->insert("filename"))
-      fieldTypeMask = TypeStringFilename;
+   String typeNameTyped = typeName;
+   if (!typeNameTyped.startsWith("Type"))
+      typeNameTyped = String("Type") + typeNameTyped;
+
+   ConsoleBaseType* typeRef = AbstractClassRep::getTypeByName(typeNameTyped.c_str());
+   if (typeRef)
+   {
+      fieldTypeMask = typeRef->getTypeID();
+
+      if (!typeRef->getInspectorFieldType())
+         fieldTypeMask = TypeString;
+
+      newField->mFieldTypeName = StringTable->insert(typeRef->getTypeName());
+   }
    else
    else
-      fieldTypeMask = -1;
+   {
+      if (newField->mFieldTypeName == StringTable->insert("int"))
+         fieldTypeMask = TypeS32;
+      else if (newField->mFieldTypeName == StringTable->insert("float"))
+         fieldTypeMask = TypeF32;
+      else if (newField->mFieldTypeName == StringTable->insert("vector"))
+         fieldTypeMask = TypePoint3F;
+      else if (newField->mFieldTypeName == StringTable->insert("vector2"))
+         fieldTypeMask = TypePoint2F;
+      else if (newField->mFieldTypeName == StringTable->insert("material"))
+         fieldTypeMask = TypeMaterialAssetId;
+      else if (newField->mFieldTypeName == StringTable->insert("image"))
+         fieldTypeMask = TypeImageAssetId;
+      else if (newField->mFieldTypeName == StringTable->insert("shape"))
+         fieldTypeMask = TypeShapeAssetId;
+      else if (newField->mFieldTypeName == StringTable->insert("bool"))
+         fieldTypeMask = TypeBool;
+      else if (newField->mFieldTypeName == StringTable->insert("object"))
+         fieldTypeMask = TypeSimObjectPtr;
+      else if (newField->mFieldTypeName == StringTable->insert("string"))
+         fieldTypeMask = TypeString;
+      else if (newField->mFieldTypeName == StringTable->insert("colorI"))
+         fieldTypeMask = TypeColorI;
+      else if (newField->mFieldTypeName == StringTable->insert("colorF"))
+         fieldTypeMask = TypeColorF;
+      else if (newField->mFieldTypeName == StringTable->insert("ease"))
+         fieldTypeMask = TypeEaseF;
+      else if (newField->mFieldTypeName == StringTable->insert("command"))
+         fieldTypeMask = TypeCommand;
+      else if (newField->mFieldTypeName == StringTable->insert("filename"))
+         fieldTypeMask = TypeStringFilename;
+   }
 
 
    newField->mFieldType = fieldTypeMask;
    newField->mFieldType = fieldTypeMask;
    //
    //

+ 13 - 9
Templates/BaseGame/game/tools/gui/fieldTypes/fieldTypes.tscript

@@ -1,20 +1,24 @@
 function GuiVariableInspector::onInspectorFieldModified(%this, %targetObj, %fieldName, %index, %oldValue, %newValue)
 function GuiVariableInspector::onInspectorFieldModified(%this, %targetObj, %fieldName, %index, %oldValue, %newValue)
 {
 {
-   echo("FIELD CHANGED: " @ %fieldName @ " from " @ %oldValue @ " to " @ %newValue);
+   //echo("FIELD CHANGED: " @ %fieldName @ " from " @ %oldValue @ " to " @ %newValue);
 }
 }
 
 
 function GuiInspectorVariableGroup::onConstructField(%this, %fieldName, %fieldLabel, %fieldTypeName, %fieldDesc, %fieldDefaultVal, %fieldDataVals, %callbackName, %ownerObj)
 function GuiInspectorVariableGroup::onConstructField(%this, %fieldName, %fieldLabel, %fieldTypeName, %fieldDesc, %fieldDefaultVal, %fieldDataVals, %callbackName, %ownerObj)
 {
 {
-   %inspector = %this.getParent();
-   %makeCommand = %this @ ".build" @ %fieldTypeName @ "Field(\""@ %fieldName @ "\",\"" @ %fieldLabel @ "\",\"" @ %fieldDesc @ "\",\"" @ 
-            %fieldDefaultVal @ "\",\"" @ %fieldDataVals @ "\",\"" @ %inspector @ "." @ %callbackName @ "\",\"" @ %ownerObj @"\");";
-   eval(%makeCommand);
+   return GuiInspectorGroup::onConstructField(%this, %fieldName, %fieldLabel, %fieldTypeName, %fieldDesc, %fieldDefaultVal, %fieldDataVals, %callbackName, %ownerObj);
 }
 }
 
 
 function GuiInspectorGroup::onConstructField(%this, %fieldName, %fieldLabel, %fieldTypeName, %fieldDesc, %fieldDefaultVal, %fieldDataVals, %callbackName, %ownerObj)
 function GuiInspectorGroup::onConstructField(%this, %fieldName, %fieldLabel, %fieldTypeName, %fieldDesc, %fieldDefaultVal, %fieldDataVals, %callbackName, %ownerObj)
 {
 {
-   %inspector = %this.getParent();
-   %makeCommand = %this @ ".build" @ %fieldTypeName @ "Field(\""@ %fieldName @ "\",\"" @ %fieldLabel @ "\",\"" @ %fieldDesc @ "\",\"" @ 
-            %fieldDefaultVal @ "\",\"" @ %fieldDataVals @ "\",\"" @ %inspector @ "." @ %callbackName @ "\",\"" @ %ownerObj @"\");";
-   eval(%makeCommand);
+   if(%this.isMethod("build" @ %fieldTypeName @ "Field"))
+   {
+      %inspector = %this.getParent();
+      %makeCommand = %this @ ".build" @ %fieldTypeName @ "Field(\""@ %fieldName @ "\",\"" @ %fieldLabel @ "\",\"" @ %fieldDesc @ "\",\"" @ 
+               %fieldDefaultVal @ "\",\"" @ %fieldDataVals @ "\",\"" @ %inspector @ "." @ %callbackName @ "\",\"" @ %ownerObj @"\");";
+      %ret = eval(%makeCommand);
+      
+      if(%ret == true || %ret $= "")
+         return true;
+   }
+   return false;
 }
 }

+ 1 - 0
Templates/BaseGame/game/tools/levels/DefaultEditorLevel.asset.taml

@@ -2,6 +2,7 @@
     AssetName="DefaultEditorLevel"
     AssetName="DefaultEditorLevel"
     LevelFile="@assetFile=DefaultEditorLevel.mis"
     LevelFile="@assetFile=DefaultEditorLevel.mis"
     LevelName="DefaultEditorLevel"
     LevelName="DefaultEditorLevel"
+    PostFXPresetFile="@assetFile=tools/levels/DefaultEditorLevel.postfxpreset.tscript"
     description="An empty room"
     description="An empty room"
     previewImageAsset0="@asset=ToolsModule:DefaultEditorLevel_preview_image"
     previewImageAsset0="@asset=ToolsModule:DefaultEditorLevel_preview_image"
     previewImageAsset1="@asset=ToolsModule:DefaultEditorLevel_preview_image"
     previewImageAsset1="@asset=ToolsModule:DefaultEditorLevel_preview_image"

+ 73 - 8
Templates/BaseGame/game/tools/worldEditor/scripts/editors/worldEditor.ed.tscript

@@ -563,6 +563,7 @@ function simGroup::SelectFiteredObjects(%this, %min, %max)
 
 
 function SceneObject::filteredSelect(%this, %min, %max)
 function SceneObject::filteredSelect(%this, %min, %max)
 {
 {
+   echo("SceneObject::filteredSelect() - min: " @ %min @ " max: " @ %max);
     %box = %this.getWorldBox();
     %box = %this.getWorldBox();
     %xlength = mAbs(getWord(%box,0) - getWord(%box,3));
     %xlength = mAbs(getWord(%box,0) - getWord(%box,3));
     %ylength = mAbs(getWord(%box,1) - getWord(%box,4));
     %ylength = mAbs(getWord(%box,1) - getWord(%box,4));
@@ -584,22 +585,27 @@ function simGroup::onInspect(%obj, %inspector)
       //it will route down through GuiInspectorGroup(the namespace of %group) and call onConstructField in an attemp to see if there's any
       //it will route down through GuiInspectorGroup(the namespace of %group) and call onConstructField in an attemp to see if there's any
       //script defined functions that can build a field of that type.
       //script defined functions that can build a field of that type.
       //We happen to define the required 'build @ <fieldTypeName> @ Field()' function below, allowing us to build out the custom field type
       //We happen to define the required 'build @ <fieldTypeName> @ Field()' function below, allowing us to build out the custom field type
-      %group.addField("minSize", "F32", "min diagonal size of objects");
-      %group.addField("maxSize", "F32", "max diagonal size of objects");
-      %group.addField("select", "SimGroupSelectionButton", "Select filtered objects");
+      %group.addField("Select Objects", "SimGroupSelectionButton", "Select filtered objects");
     }
     }
 }
 }
 
 
 function GuiInspectorGroup::buildSimGroupSelectionButtonField(%this, %fieldName, %fieldLabel, %fieldDesc,
 function GuiInspectorGroup::buildSimGroupSelectionButtonField(%this, %fieldName, %fieldLabel, %fieldDesc,
                                  %fieldDefaultVal, %fieldDataVals, %callback, %ownerObj)
                                  %fieldDefaultVal, %fieldDataVals, %callback, %ownerObj)
 {
 {
+   
+   //Set defaults if needbe
+   if(%ownerObj.minSize $= "")
+      %ownerObj.minSize = 0.1;
+   if(%ownerObj.maxSize $= "")
+      %ownerObj.maxSize = 1;
+      
    %container = new GuiControl() {
    %container = new GuiControl() {
       canSaveDynamicFields = "0";
       canSaveDynamicFields = "0";
       Profile = "EditorContainerProfile";
       Profile = "EditorContainerProfile";
       HorizSizing = "right";
       HorizSizing = "right";
       VertSizing = "bottom";
       VertSizing = "bottom";
       Position = "0 0";
       Position = "0 0";
-      Extent = "300 18";
+      Extent = "300 80";
       MinExtent = "8 2";
       MinExtent = "8 2";
       canSave = "0";
       canSave = "0";
       Visible = "1";
       Visible = "1";
@@ -607,24 +613,83 @@ function GuiInspectorGroup::buildSimGroupSelectionButtonField(%this, %fieldName,
       tooltip = "";// %tooltip;
       tooltip = "";// %tooltip;
       tooltipProfile = "EditorToolTipProfile";
       tooltipProfile = "EditorToolTipProfile";
       
       
+      new GuiTextCtrl() {
+         profile = GuiInspectorFieldProfile;
+         text = %fieldLabel;
+         Position = "16 2";
+         Extent = "300 18";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+      };
+      
+      new GuiControl() {
+         Position = "40 20";
+         Extent = "270 18";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         
+         new GuiTextCtrl() {
+            profile = GuiInspectorFieldProfile;
+            text = "Minimum Size:";
+            Position = "0 2";
+            Extent = "150 18";
+            HorizSizing = "right";
+            VertSizing = "bottom";
+         };
+         
+         new GuiTextEditCtrl() {
+            profile = GuiInspectorTextEditProfile;
+            variable =  %ownerObj @ ".minSize";
+            Position = "150 2";
+            Extent = "150 18";
+            HorizSizing = "left";
+            VertSizing = "bottom";
+         };
+      };
+      
+      new GuiControl() {
+         Position = "40 40";
+         Extent = "270 18";
+         HorizSizing = "right";
+         VertSizing = "bottom";
+         
+         new GuiTextCtrl() {
+            profile = GuiInspectorFieldProfile;
+            text = "Maximum Size:";
+            Position = "0 2";
+            Extent = "150 18";
+            HorizSizing = "right";
+            VertSizing = "bottom";
+         };
+         
+         new GuiTextEditCtrl() {
+            profile = GuiInspectorTextEditProfile;
+            variable = %ownerObj @ ".maxSize";
+            Position = "150 2";
+            Extent = "150 18";
+            HorizSizing = "left";
+            VertSizing = "bottom";
+         };
+      };
+      
       new GuiButtonCtrl() {
       new GuiButtonCtrl() {
          canSaveDynamicFields = "0";
          canSaveDynamicFields = "0";
          Profile = "ToolsGuiButtonProfile";
          Profile = "ToolsGuiButtonProfile";
          HorizSizing = "right";
          HorizSizing = "right";
          VertSizing = "bottom";
          VertSizing = "bottom";
-         Position = "16 3";
-         Extent = "300 18";
+         Position = "40 60";
+         Extent = "265 18";
          MinExtent = "8 2";
          MinExtent = "8 2";
          canSave = "0";
          canSave = "0";
          Visible = "1";
          Visible = "1";
          hovertime = "100";
          hovertime = "100";
          tooltip = ""; //%tooltip;
          tooltip = ""; //%tooltip;
          tooltipProfile = "EditorToolTipProfile";
          tooltipProfile = "EditorToolTipProfile";
-         text = %fieldName;
+         text = "Select";
          maxLength = "1024";
          maxLength = "1024";
          command = %ownerObj @ ".SelectFiteredObjects("@ %ownerObj.minSize @","@ %ownerObj.maxSize @");";
          command = %ownerObj @ ".SelectFiteredObjects("@ %ownerObj.minSize @","@ %ownerObj.maxSize @");";
       };
       };
    };
    };
-
+   
    %this-->stack.add(%container);
    %this-->stack.add(%container);
 }
 }