/* ** Command & Conquer Renegade(tm) ** Copyright 2025 Electronic Arts Inc. ** ** This program is free software: you can redistribute it and/or modify ** it under the terms of the GNU General Public License as published by ** the Free Software Foundation, either version 3 of the License, or ** (at your option) any later version. ** ** This program is distributed in the hope that it will be useful, ** but WITHOUT ANY WARRANTY; without even the implied warranty of ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ** GNU General Public License for more details. ** ** You should have received a copy of the GNU General Public License ** along with this program. If not, see . */ /*********************************************************************************************** *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S *** *********************************************************************************************** * * * Project Name : leveledit * * * * $Archive:: /Commando/Code/Tools/LevelEdit/heightfieldmgr.cpp $* * * * Author:: Patrick Smith * * * * $Modtime:: 3/07/02 1:53p $* * * * $Revision:: 3 $* * * *---------------------------------------------------------------------------------------------* * Functions: * * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ #include "stdafx.h" #include "heightfieldmgr.h" #include "heightfieldeditor.h" #include "editableheightfield.h" #include "chunkio.h" #include "saveload.h" #include "staticphys.h" #include "sceneeditor.h" #include "utils.h" #include "nodemgr.h" /////////////////////////////////////////////////////////////////////// // Global singleton instance /////////////////////////////////////////////////////////////////////// HeightfieldMgrClass _TheHeightfieldMgrSaveLoadSubsystem; //////////////////////////////////////////////////////////////// // Local constants //////////////////////////////////////////////////////////////// enum { CHUNKID_VARIABLES = 0x02261012, CHUNKID_HEIGHTFIELD }; enum { VARID_TEXTURE_NAME = 0x01, VARID_CENTER_POINT, VARID_SCALE, VARID_MAP_TITLE_ID, VARID_IS_PLAYER_MARKDER_VISIBLE, VARID_ENABLE_VTOL }; /////////////////////////////////////////////////////////////////////// // Static member initialization /////////////////////////////////////////////////////////////////////// DynamicVectorClass HeightfieldMgrClass::HeightfieldList; ////////////////////////////////////////////////////////////////////// // // Initialize // ////////////////////////////////////////////////////////////////////// void HeightfieldMgrClass::Initialize (void) { return ; } ////////////////////////////////////////////////////////////////////// // // Shutdown // ////////////////////////////////////////////////////////////////////// void HeightfieldMgrClass::Shutdown (void) { // // Release each heightfield in our list // for (int index = 0; index < HeightfieldList.Count (); index ++) { delete HeightfieldList[index]; } HeightfieldList.Delete_All (); return ; } //////////////////////////////////////////////////////////////// // // Save // //////////////////////////////////////////////////////////////// bool HeightfieldMgrClass::Save (ChunkSaveClass &csave) { // // Write the variables // csave.Begin_Chunk (CHUNKID_VARIABLES); csave.End_Chunk (); // // Save each heightfield to its own chunk // for (int index = 0; index < HeightfieldList.Count (); index ++) { csave.Begin_Chunk (CHUNKID_HEIGHTFIELD); HeightfieldList[index]->Save (csave); csave.End_Chunk (); } return true; } //////////////////////////////////////////////////////////////// // // Load // //////////////////////////////////////////////////////////////// bool HeightfieldMgrClass::Load (ChunkLoadClass &cload) { while (cload.Open_Chunk ()) { switch (cload.Cur_Chunk_ID ()) { // // Load all the variables from this chunk // case CHUNKID_VARIABLES: Load_Variables (cload); break; case CHUNKID_HEIGHTFIELD: { // // Load this heightfield from disk // EditableHeightfieldClass *heightfield = new EditableHeightfieldClass; heightfield->Load (cload); // // Add this heightfield to our list // HeightfieldList.Add (heightfield); break; } } cload.Close_Chunk (); } // // Start editing the first heightfield in the list // if (HeightfieldList.Count () > 0) { HeightfieldEditorClass::Load_Materials (HeightfieldList[0]); } return true; } //////////////////////////////////////////////////////////////// // // Load_Variables // //////////////////////////////////////////////////////////////// void HeightfieldMgrClass::Load_Variables (ChunkLoadClass &cload) { /*while (cload.Open_Micro_Chunk ()) { switch (cload.Cur_Micro_Chunk_ID ()) { } cload.Close_Micro_Chunk (); }*/ SaveLoadSystemClass::Register_Post_Load_Callback (this); return ; } /////////////////////////////////////////////////////////////////////// // // On_Post_Load // /////////////////////////////////////////////////////////////////////// void HeightfieldMgrClass::On_Post_Load (void) { // // Let each heightfield post-load // for (int index = 0; index < HeightfieldList.Count (); index ++) { HeightfieldList[index]->On_Post_Load (); } return ; } /////////////////////////////////////////////////////////////////////// // // Assign_Unique_IDs // /////////////////////////////////////////////////////////////////////// void HeightfieldMgrClass::Assign_Unique_IDs (void) { // // Ask each heightfield to update its IDs // for (int index = 0; index < HeightfieldList.Count (); index ++) { HeightfieldList[index]->Assign_Unique_IDs (); } return ; } /////////////////////////////////////////////////////////////////////// // // Create_Heightfield // /////////////////////////////////////////////////////////////////////// EditableHeightfieldClass * HeightfieldMgrClass::Create_Heightfield (float width, float height, float density) { // // Create a new heightfield and add it to our list // EditableHeightfieldClass *heightfield = new EditableHeightfieldClass; heightfield->Set_Dimensions (width, height, density); // // Add these objects to our lists // HeightfieldList.Add (heightfield); // // Set this heightfield as the current heightfield // HeightfieldEditorClass::Set_Current_Heightfield (heightfield); return heightfield; } /////////////////////////////////////////////////////////////////////// // // Create_Heightfield // /////////////////////////////////////////////////////////////////////// EditableHeightfieldClass * HeightfieldMgrClass::Create_Heightfield ( const char * heightmap_filename, float width, float height, float density, float scale ) { // // Create a new heightfield and add it to our list // EditableHeightfieldClass *heightfield = new EditableHeightfieldClass; heightfield->Create (heightmap_filename, width, height, density, scale); // // Add these objects to our lists // HeightfieldList.Add (heightfield); // // Set this heightfield as the current heightfield // HeightfieldEditorClass::Set_Current_Heightfield (heightfield); return heightfield; }