Browse Source

Fixes issue #1277

Adds the file path to the saveDataFile call (missionpath\missionname.forest as the format)

This correctly utilizes the forest object's datafile field if it's set.
If not, it will create a new forest item with the missionPath\missionName.forest convention.

This also removes the checks for the hardcoded "theForest" forest object name, so that if it is renamed for some reason, it doesn't break.

Lastly, this corrects a minor semi-related bug, where if you are in the forest editor and have a brush selected, and then click to paint, but no forest object currently exists, it prompts to create one. Once the forest object is created, it would trigger the editor to inspect the newly made forest object. If you attempted to paint the currently selected brush, there was a mis-match in the inspector information, and it would trigger a crash.

This has been corrected by re-initializing the forest editor's selected tool mode so it can be utilized immediately after the forest object is created.
Areloch 10 years ago
parent
commit
2f69ffd2d4

+ 9 - 1
Engine/source/forest/editor/forestEditorCtrl.cpp

@@ -97,7 +97,6 @@ void ForestEditorCtrl::onSleep()
 
 bool ForestEditorCtrl::updateActiveForest( bool createNew )
 {
-   mForest = dynamic_cast<Forest*>( Sim::findObject( "theForest" ) );
    Con::executef( this, "onActiveForestUpdated", mForest ? mForest->getIdString() : "", createNew ? "1" : "0" );  
 
    if ( mTool )
@@ -400,4 +399,13 @@ DefineConsoleMethod( ForestEditorCtrl, deleteMeshSafe, void, ( const char * obj
 DefineConsoleMethod( ForestEditorCtrl, isDirty, bool, (), , "" )
 {
    return object->isDirty();
+}
+
+DefineConsoleMethod(ForestEditorCtrl, setActiveForest, void, (const char * obj), , "( Forest obj )")
+{
+   Forest *forestObject;
+   if (!Sim::findObject(obj, forestObject))
+      return;
+
+   object->setActiveForest(forestObject);
 }

+ 3 - 0
Engine/source/forest/editor/forestEditorCtrl.h

@@ -86,6 +86,9 @@ class ForestEditorCtrl : public EditTSCtrl
       /// Causes the editor to reselect the active forest.
       bool updateActiveForest( bool createNew );
 
+      /// Sets the active Forest
+      void setActiveForest(Forest* forestObject) { mForest = forestObject; }
+
       /// Returns the active Forest.
       Forest *getActiveForest() const { return mForest; }
 

+ 1 - 1
Templates/Empty/game/core/scripts/client/helperfuncs.cs

@@ -252,7 +252,7 @@ function parseMissionGroupForIds( %className, %childGroup )
       if( (%currentGroup).getObject(%i).getClassName() $= "SimGroup" )
          %classIds = %classIds @ parseMissionGroupForIds( %className, (%currentGroup).getObject(%i).getId());
    } 
-   return %classIds;
+   return trim( %classIds );
 }
 
 //------------------------------------------------------------------------------

+ 39 - 3
Templates/Empty/game/tools/forestEditor/forestEditorGui.cs

@@ -50,7 +50,9 @@ function ForestEditorGui::onActiveForestUpdated( %this, %forest, %createNew )
 /// Called from a message box when a forest is not found.
 function ForestEditorGui::createForest( %this )
 {
-   if ( isObject( theForest ) )
+   %forestObject = parseMissionGroupForIds("Forest", "");
+ 
+   if ( isObject( %forestObject ) )
    {
       error( "Cannot create a second 'theForest' Forest!" );
       return;
@@ -64,8 +66,42 @@ function ForestEditorGui::createForest( %this )
    };
    
    MECreateUndoAction::submit( theForest );
-   
-   ForestEditorInspector.inspect( theForest );
+
+   ForestEditorGui.setActiveForest( theForest );
+
+   //Re-initialize the editor settings so we can start using it immediately.
+   %tool = ForestEditorGui.getActiveTool();      
+   if ( isObject( %tool ) )
+      %tool.onActivated();
+	
+   if ( %tool == ForestTools->SelectionTool )
+   {
+      %mode = GlobalGizmoProfile.mode;
+      switch$ (%mode)
+      {
+         case "None":
+            ForestEditorSelectModeBtn.performClick();
+         case "Move":
+            ForestEditorMoveModeBtn.performClick();
+         case "Rotate":
+            ForestEditorRotateModeBtn.performClick();
+         case "Scale":
+            ForestEditorScaleModeBtn.performClick();
+      }
+   }
+   else if ( %tool == ForestTools->BrushTool )
+   {
+      %mode = ForestTools->BrushTool.mode;
+      switch$ (%mode)
+      {
+         case "Paint":
+            ForestEditorPaintModeBtn.performClick();
+         case "Erase":
+            ForestEditorEraseModeBtn.performClick();
+         case "EraseSelected":
+            ForestEditorEraseSelectedModeBtn.performClick();
+      }
+   }   
    
    EWorldEditor.isDirty = true;
 }

+ 28 - 3
Templates/Empty/game/tools/forestEditor/main.cs

@@ -141,6 +141,13 @@ function ForestEditorPlugin::onActivated( %this )
    ForestEditorPropertiesWindow.setVisible( true );
    ForestEditorGui.makeFirstResponder( true );
    //ForestEditToolbar.setVisible( true );
+
+   //Get our existing forest object in our current mission if we have one
+   %forestObject = parseMissionGroupForIds("Forest", "");
+   if(isObject(%forestObject))
+   {
+      ForestEditorGui.setActiveForest(%forestObject.getName());
+   }
    
    %this.map.push();
    Parent::onActivated(%this);   
@@ -232,9 +239,27 @@ function ForestEditorPlugin::clearDirty( %this )
 function ForestEditorPlugin::onSaveMission( %this, %missionFile )
 {
    ForestDataManager.saveDirty();
-   
-   if ( isObject( theForest ) )                     
-      theForest.saveDataFile();
+
+   //First, find out if we have an existing forest object
+   %forestObject = parseMissionGroupForIds("Forest", "");
+ 
+   if ( isObject( %forestObject ) )
+   {
+      //We do. Next, see if we have a file already by polling the datafield.
+      if(%forestObject.dataFile !$= "")
+      {
+         //If we do, just save to the provided file.
+         %forestObject.saveDataFile(%forestObject.dataFile);
+      }
+      else
+      {
+         //We don't, so we'll save in the same place as the mission file and give it the missionpath\missionName.forest 
+         //naming convention.
+         %path = filePath(%missionFile);
+         %missionName = fileBase(%missionFile);
+         %forestObject.saveDataFile(%path @ "/" @ %missionName @ ".forest");
+      }
+   }
       
    ForestBrushGroup.save( "art/forest/brushes.cs" );
 }

+ 1 - 1
Templates/Full/game/core/scripts/client/helperfuncs.cs

@@ -252,7 +252,7 @@ function parseMissionGroupForIds( %className, %childGroup )
       if( (%currentGroup).getObject(%i).getClassName() $= "SimGroup" )
          %classIds = %classIds @ parseMissionGroupForIds( %className, (%currentGroup).getObject(%i).getId());
    } 
-   return %classIds;
+   return trim( %classIds );
 }
 
 //------------------------------------------------------------------------------

+ 39 - 3
Templates/Full/game/tools/forestEditor/forestEditorGui.cs

@@ -50,7 +50,9 @@ function ForestEditorGui::onActiveForestUpdated( %this, %forest, %createNew )
 /// Called from a message box when a forest is not found.
 function ForestEditorGui::createForest( %this )
 {
-   if ( isObject( theForest ) )
+   %forestObject = parseMissionGroupForIds("Forest", "");
+ 
+   if ( isObject( %forestObject ) )
    {
       error( "Cannot create a second 'theForest' Forest!" );
       return;
@@ -64,8 +66,42 @@ function ForestEditorGui::createForest( %this )
    };
    
    MECreateUndoAction::submit( theForest );
-   
-   ForestEditorInspector.inspect( theForest );
+
+   ForestEditorGui.setActiveForest( theForest );
+
+   //Re-initialize the editor settings so we can start using it immediately.
+   %tool = ForestEditorGui.getActiveTool();      
+   if ( isObject( %tool ) )
+      %tool.onActivated();
+	
+   if ( %tool == ForestTools->SelectionTool )
+   {
+      %mode = GlobalGizmoProfile.mode;
+      switch$ (%mode)
+      {
+         case "None":
+            ForestEditorSelectModeBtn.performClick();
+         case "Move":
+            ForestEditorMoveModeBtn.performClick();
+         case "Rotate":
+            ForestEditorRotateModeBtn.performClick();
+         case "Scale":
+            ForestEditorScaleModeBtn.performClick();
+      }
+   }
+   else if ( %tool == ForestTools->BrushTool )
+   {
+      %mode = ForestTools->BrushTool.mode;
+      switch$ (%mode)
+      {
+         case "Paint":
+            ForestEditorPaintModeBtn.performClick();
+         case "Erase":
+            ForestEditorEraseModeBtn.performClick();
+         case "EraseSelected":
+            ForestEditorEraseSelectedModeBtn.performClick();
+      }
+   }   
    
    EWorldEditor.isDirty = true;
 }

+ 28 - 3
Templates/Full/game/tools/forestEditor/main.cs

@@ -141,6 +141,13 @@ function ForestEditorPlugin::onActivated( %this )
    ForestEditorPropertiesWindow.setVisible( true );
    ForestEditorGui.makeFirstResponder( true );
    //ForestEditToolbar.setVisible( true );
+
+   //Get our existing forest object in our current mission if we have one
+   %forestObject = parseMissionGroupForIds("Forest", "");
+   if(isObject(%forestObject))
+   {
+      ForestEditorGui.setActiveForest(%forestObject.getName());
+   }
    
    %this.map.push();
    Parent::onActivated(%this);   
@@ -232,9 +239,27 @@ function ForestEditorPlugin::clearDirty( %this )
 function ForestEditorPlugin::onSaveMission( %this, %missionFile )
 {
    ForestDataManager.saveDirty();
-   
-   if ( isObject( theForest ) )                     
-      theForest.saveDataFile();
+
+   //First, find out if we have an existing forest object
+   %forestObject = parseMissionGroupForIds("Forest", "");
+ 
+   if ( isObject( %forestObject ) )
+   {
+      //We do. Next, see if we have a file already by polling the datafield.
+      if(%forestObject.dataFile !$= "")
+      {
+         //If we do, just save to the provided file.
+         %forestObject.saveDataFile(%forestObject.dataFile);
+      }
+      else
+      {
+         //We don't, so we'll save in the same place as the mission file and give it the missionpath\missionName.forest 
+         //naming convention.
+         %path = filePath(%missionFile);
+         %missionName = fileBase(%missionFile);
+         %forestObject.saveDataFile(%path @ "/" @ %missionName @ ".forest");
+      }
+   }
       
    ForestBrushGroup.save( "art/forest/brushes.cs" );
 }