diff --git a/Engine/source/T3D/Scene.cpp b/Engine/source/T3D/Scene.cpp index 0d7908fe3..28ad16ecc 100644 --- a/Engine/source/T3D/Scene.cpp +++ b/Engine/source/T3D/Scene.cpp @@ -148,20 +148,32 @@ void Scene::removeObject(SimObject* object) Parent::removeObject(object); } -void Scene::addDynamicObject(SceneObject* object) +void Scene::addDynamicObject(SimObject* 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? - Parent::addObject(object); + //Parent::addObject(object); } -void Scene::removeDynamicObject(SceneObject* object) +void Scene::removeDynamicObject(SimObject* 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? - Parent::removeObject(object); + //Parent::removeObject(object); } void Scene::interpolateTick(F32 delta) @@ -242,7 +254,7 @@ void Scene::dumpUtilizedAssets() Con::printf("Dumping utilized assets in scene!"); Vector utilizedAssetsList; - for (U32 i = 0; i < mPermanentObjects.size(); i++) + /*for (U32 i = 0; i < mPermanentObjects.size(); i++) { mPermanentObjects[i]->getUtilizedAssets(&utilizedAssetsList); } @@ -250,7 +262,7 @@ void Scene::dumpUtilizedAssets() for (U32 i = 0; i < mDynamicObjects.size(); i++) { mDynamicObjects[i]->getUtilizedAssets(&utilizedAssetsList); - } + }*/ for (U32 i = 0; i < utilizedAssetsList.size(); i++) { @@ -294,31 +306,16 @@ bool Scene::saveScene(StringTableEntry fileName) 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(*itr); - if (sg) + if((*itr)->isMethod("onSaving")) { ConsoleValue vars[3]; vars[2].setString(fileName); - sg->callOnChildren("onSaving", 3, vars); - } - - SceneObject* sO = dynamic_cast(*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 //special work required as well for (U32 i = 0; i < mSubScenes.size(); i++) diff --git a/Engine/source/T3D/Scene.h b/Engine/source/T3D/Scene.h index 8f48b80b1..5be94e189 100644 --- a/Engine/source/T3D/Scene.h +++ b/Engine/source/T3D/Scene.h @@ -31,8 +31,8 @@ class Scene : public NetObject, public virtual ITickable Vector mSubScenes; - Vector mPermanentObjects; - Vector mDynamicObjects; + Vector mPermanentObjects; + Vector mDynamicObjects; S32 mSceneId; @@ -69,8 +69,8 @@ public: void addObject(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 dumpUtilizedAssets(); diff --git a/Engine/source/T3D/SubScene.cpp b/Engine/source/T3D/SubScene.cpp index 03e3fbe69..371131a37 100644 --- a/Engine/source/T3D/SubScene.cpp +++ b/Engine/source/T3D/SubScene.cpp @@ -1,6 +1,7 @@ #include "SubScene.h" #include "gameMode.h" +#include "console/persistenceManager.h" #include "console/script.h" #include "scene/sceneRenderState.h" #include "renderInstance/renderPassManager.h" @@ -391,34 +392,28 @@ bool SubScene::save() if (mStartUnloadTimerMS != -1) mStartUnloadTimerMS = Sim::getCurrentTime(); + PersistenceManager prMger; + 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(*itr); - if (sg) + if ((*itr)->isMethod("onSaving")) { ConsoleValue vars[3]; vars[2].setString(mLevelAssetId); - sg->callOnChildren("onSaving", 3, vars); + Con::execute((*itr), 3, vars); } - SceneObject* scO = dynamic_cast(*itr); - if (scO) - { - scO->onSaving_callback(mLevelAssetId); - } - - SimObject* sO = static_cast(*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 bool saveSuccess = false; diff --git a/Engine/source/T3D/prefab.cpp b/Engine/source/T3D/prefab.cpp index 1351fd92b..d1e828765 100644 --- a/Engine/source/T3D/prefab.cpp +++ b/Engine/source/T3D/prefab.cpp @@ -371,6 +371,12 @@ void Prefab::_loadFile( bool addFileNotify ) return; } + SimObjectPtr rootScene = Scene::getRootScene(); + if(rootScene.isValid()) + { + rootScene->addDynamicObject(group); + } + if ( addFileNotify ) Torque::FS::AddChangeNotification( mFilename, this, &Prefab::_onFileChanged ); diff --git a/Engine/source/gui/editor/inspector/group.cpp b/Engine/source/gui/editor/inspector/group.cpp index 64ed2b352..2f517d52d 100644 --- a/Engine/source/gui/editor/inspector/group.cpp +++ b/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 dbFieldClass; -} + } // Nope, not a datablock. So maybe it has a valid inspector field override we can use? if(!cbt->getInspectorFieldType()) @@ -641,40 +641,50 @@ void GuiInspectorGroup::addInspectorField(StringTableEntry name, StringTableEntr { 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 - 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; diff --git a/Engine/source/gui/editor/inspector/variableInspector.cpp b/Engine/source/gui/editor/inspector/variableInspector.cpp index 6afcb46e5..c856c8b1a 100644 --- a/Engine/source/gui/editor/inspector/variableInspector.cpp +++ b/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 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 - 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; // diff --git a/Templates/BaseGame/game/tools/gui/fieldTypes/fieldTypes.tscript b/Templates/BaseGame/game/tools/gui/fieldTypes/fieldTypes.tscript index 1decb8b8b..98836938b 100644 --- a/Templates/BaseGame/game/tools/gui/fieldTypes/fieldTypes.tscript +++ b/Templates/BaseGame/game/tools/gui/fieldTypes/fieldTypes.tscript @@ -1,20 +1,24 @@ 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) { - %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) { - %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; } diff --git a/Templates/BaseGame/game/tools/levels/DefaultEditorLevel.asset.taml b/Templates/BaseGame/game/tools/levels/DefaultEditorLevel.asset.taml index 9b3fe43b3..6551949e3 100644 --- a/Templates/BaseGame/game/tools/levels/DefaultEditorLevel.asset.taml +++ b/Templates/BaseGame/game/tools/levels/DefaultEditorLevel.asset.taml @@ -2,6 +2,7 @@ AssetName="DefaultEditorLevel" LevelFile="@assetFile=DefaultEditorLevel.mis" LevelName="DefaultEditorLevel" + PostFXPresetFile="@assetFile=tools/levels/DefaultEditorLevel.postfxpreset.tscript" description="An empty room" previewImageAsset0="@asset=ToolsModule:DefaultEditorLevel_preview_image" previewImageAsset1="@asset=ToolsModule:DefaultEditorLevel_preview_image" diff --git a/Templates/BaseGame/game/tools/worldEditor/scripts/editors/worldEditor.ed.tscript b/Templates/BaseGame/game/tools/worldEditor/scripts/editors/worldEditor.ed.tscript index 69678c833..36388ef21 100644 --- a/Templates/BaseGame/game/tools/worldEditor/scripts/editors/worldEditor.ed.tscript +++ b/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) { + echo("SceneObject::filteredSelect() - min: " @ %min @ " max: " @ %max); %box = %this.getWorldBox(); %xlength = mAbs(getWord(%box,0) - getWord(%box,3)); %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 //script defined functions that can build a field of that type. //We happen to define the required 'build @ @ 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, %fieldDefaultVal, %fieldDataVals, %callback, %ownerObj) { + + //Set defaults if needbe + if(%ownerObj.minSize $= "") + %ownerObj.minSize = 0.1; + if(%ownerObj.maxSize $= "") + %ownerObj.maxSize = 1; + %container = new GuiControl() { canSaveDynamicFields = "0"; Profile = "EditorContainerProfile"; HorizSizing = "right"; VertSizing = "bottom"; Position = "0 0"; - Extent = "300 18"; + Extent = "300 80"; MinExtent = "8 2"; canSave = "0"; Visible = "1"; @@ -607,24 +613,83 @@ function GuiInspectorGroup::buildSimGroupSelectionButtonField(%this, %fieldName, tooltip = "";// %tooltip; 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() { canSaveDynamicFields = "0"; Profile = "ToolsGuiButtonProfile"; HorizSizing = "right"; VertSizing = "bottom"; - Position = "16 3"; - Extent = "300 18"; + Position = "40 60"; + Extent = "265 18"; MinExtent = "8 2"; canSave = "0"; Visible = "1"; hovertime = "100"; tooltip = ""; //%tooltip; tooltipProfile = "EditorToolTipProfile"; - text = %fieldName; + text = "Select"; maxLength = "1024"; command = %ownerObj @ ".SelectFiteredObjects("@ %ownerObj.minSize @","@ %ownerObj.maxSize @");"; }; }; - + %this-->stack.add(%container); }