diff --git a/Engine/source/console/sim.cpp b/Engine/source/console/sim.cpp index b03e5c15a..48e3b627f 100644 --- a/Engine/source/console/sim.cpp +++ b/Engine/source/console/sim.cpp @@ -68,6 +68,8 @@ namespace Sim ImplementNamedSet(SFXAmbienceSet) ImplementNamedSet(TerrainMaterialSet) ImplementNamedSet(DataBlockSet); + ImplementNamedSet(ForestBrushSet); + ImplementNamedSet(ForestItemDataSet); ImplementNamedGroup(ActionMapGroup) ImplementNamedGroup(ClientGroup) ImplementNamedGroup(GuiGroup) diff --git a/Engine/source/console/sim.h b/Engine/source/console/sim.h index 61ff469e0..001ace64e 100644 --- a/Engine/source/console/sim.h +++ b/Engine/source/console/sim.h @@ -107,6 +107,8 @@ namespace Sim DeclareNamedSet(SFXAmbienceSet); DeclareNamedSet(TerrainMaterialSet); DeclareNamedSet(DataBlockSet); + DeclareNamedSet(ForestBrushSet); + DeclareNamedSet(ForestItemDataSet); DeclareNamedGroup(ActionMapGroup) DeclareNamedGroup(ClientGroup) DeclareNamedGroup(GuiGroup) diff --git a/Engine/source/console/simManager.cpp b/Engine/source/console/simManager.cpp index c8fb60c7f..94b407a25 100644 --- a/Engine/source/console/simManager.cpp +++ b/Engine/source/console/simManager.cpp @@ -565,6 +565,8 @@ void init() InstantiateNamedSet(SFXAmbienceSet); InstantiateNamedSet(TerrainMaterialSet); InstantiateNamedSet(DataBlockSet); + InstantiateNamedSet(ForestBrushSet); + InstantiateNamedSet(ForestItemDataSet); InstantiateNamedGroup(ActionMapGroup); InstantiateNamedGroup(ClientGroup); InstantiateNamedGroup(GuiGroup); diff --git a/Engine/source/forest/editor/forestBrushElement.cpp b/Engine/source/forest/editor/forestBrushElement.cpp index 86e89e3d6..8c41cc969 100644 --- a/Engine/source/forest/editor/forestBrushElement.cpp +++ b/Engine/source/forest/editor/forestBrushElement.cpp @@ -197,4 +197,78 @@ DefineEngineMethod( ForestBrush, containsItemData, bool, ( const char * obj ), , } return object->containsItemData( data ); -} \ No newline at end of file +} + +//------------------------------------------------------------------------- +// ForestBrushGroupSet +//------------------------------------------------------------------------- + +IMPLEMENT_CONOBJECT(ForestBrushGroup); + +ConsoleDocClass(ForestBrushGroup, + "@brief Container class for ForestBrushes\n\n" + "Editor use only.\n\n" + "@internal" +); + +ForestBrushGroup::ForestBrushGroup() +{ + +} + +bool ForestBrushGroup::onAdd() +{ + if (!Parent::onAdd()) + return false; + + SimSet* forestBrushSet; + if (!Sim::findObject("ForestBrushSet", forestBrushSet)) + { + Con::errorf("ForestBrushGroup::onAdd() - failed to find ForestBrushSet to add new ForestBrushGroup to!"); + } + + forestBrushSet->addObject(this); + + return true; +} + +void ForestBrushGroup::addObject(SimObject* inObj) +{ + ForestBrush* ele = dynamic_cast(inObj); + if (!ele) + return; + + //if ( containsItemData( ele->mData ) ) + // return; + + Parent::addObject(inObj); +} + +bool ForestBrushGroup::containsBrushData(const ForestBrush* inData) +{ + SimObjectList::iterator iter = mObjectList.begin(); + for (; iter != mObjectList.end(); iter++) + { + ForestBrush* pElement = dynamic_cast(*iter); + + if (!pElement) + continue; + + if (pElement == inData) + return true; + } + + return false; +} + +DefineEngineMethod(ForestBrushGroup, containsBrushData, bool, (const char* obj), , "( ForestBrush obj )") +{ + ForestBrush* data = NULL; + if (!Sim::findObject(obj, data)) + { + Con::warnf("ForestBrush::containsBrushData - invalid object passed"); + return false; + } + + return object->containsBrushData(data); +} diff --git a/Engine/source/forest/editor/forestBrushElement.h b/Engine/source/forest/editor/forestBrushElement.h index be6a37cc0..6a7d98973 100644 --- a/Engine/source/forest/editor/forestBrushElement.h +++ b/Engine/source/forest/editor/forestBrushElement.h @@ -121,5 +121,28 @@ protected: static SimObjectPtr smGroup; }; +//------------------------------------------------------------------------- +// ForestBrushGroup +//------------------------------------------------------------------------- -#endif // _FOREST_EDITOR_BRUSHELEMENT_H_ \ No newline at end of file +class ForestBrushGroup : public SimGroup +{ + typedef SimGroup Parent; + +public: + + ForestBrushGroup(); + + DECLARE_CONOBJECT(ForestBrushGroup); + + virtual bool onAdd(); + + virtual void addObject(SimObject*); + + bool containsBrushData(const ForestBrush* inData); +protected: + + static SimObjectPtr smGroup; +}; + +#endif // _FOREST_EDITOR_BRUSHELEMENT_H_ diff --git a/Engine/source/forest/editor/forestBrushTool.cpp b/Engine/source/forest/editor/forestBrushTool.cpp index 5b9278ea6..06a75ea1d 100644 --- a/Engine/source/forest/editor/forestBrushTool.cpp +++ b/Engine/source/forest/editor/forestBrushTool.cpp @@ -610,9 +610,14 @@ void ForestBrushTool::_collectElements() } // Find all ForestBrushElements that are directly or indirectly selected. + SimSet* brushSet; + if (!Sim::findObject("ForestBrushSet", brushSet)) + { + Con::errorf("ForestBrushTool::_collectElements() - could not find ForestBrushSet!"); + return; + } - SimGroup *brushGroup = ForestBrush::getGroup(); - brushGroup->findObjectByCallback( findSelectedElements, mElements ); + brushSet->findObjectByCallback( findSelectedElements, mElements ); // We just needed to flag these objects as selected for the benefit of our // findSelectedElements callback, we can now mark them un-selected again. diff --git a/Engine/source/forest/editor/forestEditorCtrl.cpp b/Engine/source/forest/editor/forestEditorCtrl.cpp index db8a58f3c..bf88f0b4c 100644 --- a/Engine/source/forest/editor/forestEditorCtrl.cpp +++ b/Engine/source/forest/editor/forestEditorCtrl.cpp @@ -328,10 +328,16 @@ void ForestEditorCtrl::deleteMeshSafe( ForestItemData *mesh ) } // Find ForestBrushElement(s) referencing this datablock. - SimGroup *brushGroup = ForestBrush::getGroup(); + SimSet* brushSet; + if (!Sim::findObject("ForestBrushSet", brushSet)) + { + Con::errorf("ForestBrushTool::_collectElements() - could not find ForestBrushSet!"); + return; + } + sKey = mesh; Vector foundElements; - brushGroup->findObjectByCallback( &findMeshReferences, foundElements ); + brushSet->findObjectByCallback( &findMeshReferences, foundElements ); // Add UndoAction to delete the ForestBrushElement(s) and the ForestItemData. MEDeleteUndoAction *elementAction = new MEDeleteUndoAction(); @@ -408,4 +414,4 @@ DefineEngineMethod(ForestEditorCtrl, setActiveForest, void, (const char * obj), return; object->setActiveForest(forestObject); -} \ No newline at end of file +} diff --git a/Templates/BaseGame/game/tools/assetBrowser/scripts/templateFiles/module.tscript.template b/Templates/BaseGame/game/tools/assetBrowser/scripts/templateFiles/module.tscript.template index 4a9eafc7d..37a2feab9 100644 --- a/Templates/BaseGame/game/tools/assetBrowser/scripts/templateFiles/module.tscript.template +++ b/Templates/BaseGame/game/tools/assetBrowser/scripts/templateFiles/module.tscript.template @@ -21,6 +21,8 @@ function @@::onCreateGameServer(%this) %this.registerDatablock("./scripts/managedData/managedDatablocks"); if(isFile("./scripts/managedData/managedForestItemData." @ $TorqueScriptFileExtension)) %this.registerDatablock("./scripts/managedData/managedForestItemData"); + if(isFile("./scripts/managedData/managedForestBrushData." @ $TorqueScriptFileExtension)) + %this.registerDatablock("./scripts/managedData/managedForestBrushData"); if(isFile("./scripts/managedData/managedParticleEmitterData." @ $TorqueScriptFileExtension)) %this.registerDatablock("./scripts/managedData/managedParticleEmitterData"); if(isFile("./scripts/managedData/managedParticleData." @ $TorqueScriptFileExtension)) diff --git a/Templates/BaseGame/game/tools/forestEditor/brushes.tscript b/Templates/BaseGame/game/tools/forestEditor/brushes.tscript deleted file mode 100644 index 6860a8813..000000000 --- a/Templates/BaseGame/game/tools/forestEditor/brushes.tscript +++ /dev/null @@ -1,26 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -$forestBrushesGroup = new SimGroup( ForestBrushGroup ) -{ -}; -//--- OBJECT WRITE END --- \ No newline at end of file diff --git a/Templates/BaseGame/game/tools/forestEditor/forestEditorGui.tscript b/Templates/BaseGame/game/tools/forestEditor/forestEditorGui.tscript index d039d1c86..3ae57e612 100644 --- a/Templates/BaseGame/game/tools/forestEditor/forestEditorGui.tscript +++ b/Templates/BaseGame/game/tools/forestEditor/forestEditorGui.tscript @@ -110,17 +110,45 @@ function ForestEditorGui::createForest( %this ) function ForestEditorGui::newBrush( %this ) { - %internalName = getUniqueInternalName( "Brush", ForestBrushGroup, true ); + AssetBrowser_SelectModule.showDialog("ForestEditorGui.pickedNewBrushTargetModule"); + AssetBrowser_SelectModuleWindow.selectWindow(); +} + +function ForestEditorGui::pickedNewBrushTargetModule(%this, %module) +{ + %moduleDef = ModuleDatabase.findModule(%module); + + ForestEditorGui.forestBrushPath = %moduleDef.ModulePath @ "/scripts/managedData/managedForestBrushData." @ $TorqueScriptFileExtension; + + if(!isDirectory(filePath(ForestEditorGui.forestItemDataPath))) + { + AssetBrowser.dirHandler.createFolder(filePath(ForestEditorGui.forestItemDataPath)); + } + + %group = ForestBrushSet.findObjectByInternalName(%module @ "ForestBrushGroup"); + if(!isObject(%group)) + { + %group = new ForestBrushGroup() { + internalName = %module @ "ForestBrushGroup"; + }; + + %group.setFilename(ForestEditorGui.forestBrushPath); + } + + %internalName = getUniqueInternalName( "Brush", ForestBrushSet, true ); %brush = new ForestBrush() { + class = "ForestBrushGroup"; internalName = %internalName; - parentGroup = ForestBrushGroup; + parentGroup = ForestBrushSet; }; + %group.add(%brush); + MECreateUndoAction::submit( %brush ); - ForestEditBrushTree.open( ForestBrushGroup ); + ForestEditBrushTree.open( ForestBrushSet ); ForestEditBrushTree.buildVisibleTree(true); %item = ForestEditBrushTree.findItemByObjectId( %brush ); ForestEditBrushTree.clearSelection(); @@ -135,7 +163,7 @@ function ForestEditorGui::newElement( %this ) %sel = ForestEditBrushTree.getSelectedObject(); if ( !isObject( %sel ) ) - %parentGroup = ForestBrushGroup; + %parentGroup = ForestBrushSet; else { if ( %sel.getClassName() $= "ForestBrushElement" ) @@ -144,7 +172,7 @@ function ForestEditorGui::newElement( %this ) %parentGroup = %sel; } - %internalName = getUniqueInternalName( "Element", ForestBrushGroup, true ); + %internalName = getUniqueInternalName( "Element", ForestBrushSet, true ); %element = new ForestBrushElement() { @@ -191,37 +219,11 @@ function ForestEditorGui::pickedNewMeshTargetModule(%this, %module) function selectNewForestMesh(%selectedShapeAssetId) { - /*%spec = "All Mesh Files|*.dts;*.dae|DTS|*.dts|DAE|*.dae"; - - %dlg = new OpenFileDialog() - { - Filters = %spec; - DefaultPath = $Pref::WorldEditor::LastPath; - DefaultFile = ""; - ChangePath = true; - }; - - %ret = %dlg.Execute(); - - if ( %ret ) - { - $Pref::WorldEditor::LastPath = filePath( %dlg.FileName ); - %fullPath = makeRelativePath( %dlg.FileName, getMainDotCSDir() ); - %file = fileBase( %fullPath ); - } - - %dlg.delete();*/ - if ( %selectedShapeAssetId $= "") return; %name = getUniqueName( AssetDatabase.getAssetName(%selectedShapeAssetId) ); - //%str = "datablock TSForestItemData( " @ %name @ " ) { shapeFile = \"" @ %fullPath @ "\"; };"; - //eval( %str ); - - //%fullPath = AssetDatabase.acquireAsset(%selectedShapeAssetId).getShapePath(); - new TSForestItemData(%name) { shapeAsset = %selectedShapeAssetId; }; @@ -418,7 +420,7 @@ function ForestEditBrushTree::handleRenameObject( %this, %name, %obj ) { if ( %name !$= "" ) { - %found = ForestBrushGroup.findObjectByInternalName( %name ); + %found = ForestBrushSet.findObjectByInternalName( %name ); if ( isObject( %found ) && %found.getId() != %obj.getId() ) { toolsMessageBoxOK( "Error", "Brush or Element with that name already exists.", "" ); diff --git a/Templates/BaseGame/game/tools/forestEditor/main.tscript b/Templates/BaseGame/game/tools/forestEditor/main.tscript index be2814baa..a2e057def 100644 --- a/Templates/BaseGame/game/tools/forestEditor/main.tscript +++ b/Templates/BaseGame/game/tools/forestEditor/main.tscript @@ -91,25 +91,7 @@ function ForestEditorPlugin::onWorldEditorStartup( %this ) { new PersistenceManager( ForestDataManager ); - %brushPath = "tools/forestEditor/brushes." @ $TorqueScriptFileExtension; - - if ( !isFile( %brushPath ) ) - %successfulFile = createPath( %brushPath ); - - // This creates the ForestBrushGroup, all brushes, and elements. - exec( %brushpath ); - - if ( !isObject( ForestBrushGroup ) ) - { - new SimGroup( ForestBrushGroup ); - %this.showError = true; - } - - ForestEditBrushTree.open( ForestBrushGroup ); - - if ( !isObject( ForestItemDataSet ) ) - new SimSet( ForestItemDataSet ); - + ForestEditBrushTree.open( ForestBrushSet ); ForestEditMeshTree.open( ForestItemDataSet ); // Add ourselves to the window menu. @@ -126,8 +108,8 @@ function ForestEditorPlugin::onWorldEditorStartup( %this ) function ForestEditorPlugin::onWorldEditorShutdown( %this ) { - if ( isObject( ForestBrushGroup ) ) - ForestBrushGroup.delete(); + if ( isObject( ForestBrushSet ) ) + ForestBrushSet.delete(); if ( isObject( ForestDataManager ) ) ForestDataManager.delete(); } @@ -153,7 +135,7 @@ function ForestEditorPlugin::onActivated( %this ) %this.map.push(); Parent::onActivated(%this); - ForestEditBrushTree.open( ForestBrushGroup ); + ForestEditBrushTree.open( ForestBrushSet ); ForestEditMeshTree.open( ForestItemDataSet ); // Open the Brush tab. @@ -224,12 +206,26 @@ function ForestEditorPlugin::onDeactivated( %this ) // Also take this opportunity to save. ForestDataManager.saveDirty(); + %this.saveBrushSet(); %this.map.pop(); Parent::onDeactivated(%this); } +function ForestEditorPlugin::saveBrushSet(%this) +{ + for(%i=0; %i < ForestBrushSet.getCount(); %i++) + { + %group = ForestBrushSet.getObject(%i); + if(%group.isMemberOfClass("ForestBrushGroup")) + { + %fileName = %group.getFileName(); + %group.save(%group.getFileName()); + } + } +} + function ForestEditorPlugin::isDirty( %this ) { %dirty = %this.dirty || ForestEditorGui.isDirty(); @@ -266,7 +262,8 @@ function ForestEditorPlugin::onSaveMission( %this, %missionFile ) } } - ForestBrushGroup.save( "tools/forestEditor/brushes." @ $TorqueScriptFileExtension ); + //Make sure our data is up to date too + %this.saveBrushSet(); } function ForestEditorPlugin::onEditorSleep( %this )