/* ** Command & Conquer Generals Zero Hour(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) 2001-2003 Electronic Arts Inc. // // // //////////////////////////////////////////////////////////////////////////////// // FILE: INIWater.cpp ///////////////////////////////////////////////////////////////////////////// // Author: Colin Day, December 2001 // Desc: Water settings /////////////////////////////////////////////////////////////////////////////////////////////////// // INCLUDES /////////////////////////////////////////////////////////////////////////////////////// #include "PreRTS.h" // This must go first in EVERY cpp file int the GameEngine #define DEFINE_TIME_OF_DAY_NAMES #include "Common/INI.h" #include "Common/GameType.h" #include "GameClient/TerrainVisual.h" #include "GameClient/Water.h" /////////////////////////////////////////////////////////////////////////////////////////////////// // PUBLIC FUNCTIONS /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////////////////////////// //------------------------------------------------------------------------------------------------- /** Water setting, note that this does not support override situations. As the water * system becomes more complex we may want to change this */ //------------------------------------------------------------------------------------------------- void INI::parseWaterSettingDefinition( INI* ini ) { AsciiString name; WaterSetting *waterSetting = NULL; // read the name const char* token = ini->getNextToken(); name.set( token ); // get the water setting we want to load based on name char **timeOfDayName = TimeOfDayNames; Int timeOfDayIndex = 0; // TIME_OF_DAY_INVALID while( timeOfDayName && *timeOfDayName ) { if( stricmp( *timeOfDayName, name.str() ) == 0 ) { waterSetting = &WaterSettings[ timeOfDayIndex ]; break; } // end if // next name timeOfDayName++; timeOfDayIndex++; } // end while // check for no time of day match if( waterSetting == NULL ) throw INI_INVALID_DATA; // parse the data ini->initFromINI( waterSetting, waterSetting->getFieldParse() ); } // end parseWaterSetting //------------------------------------------------------------------------------------------------- void INI::parseWaterTransparencyDefinition( INI *ini ) { if (TheWaterTransparency == NULL) { TheWaterTransparency = newInstance(WaterTransparencySetting); } else if (ini->getLoadType() == INI_LOAD_CREATE_OVERRIDES) { WaterTransparencySetting* wt = (WaterTransparencySetting*) (TheWaterTransparency.getNonOverloadedPointer()); WaterTransparencySetting* wtOverride = newInstance(WaterTransparencySetting); *wtOverride = *wt; // Mark that it is an override. wtOverride->markAsOverride(); wt->friend_getFinalOverride()->setNextOverride(wtOverride); } else { throw INI_INVALID_DATA; } WaterTransparencySetting* waterTrans = (WaterTransparencySetting*) (TheWaterTransparency.getNonOverloadedPointer()); waterTrans = (WaterTransparencySetting*) (waterTrans->friend_getFinalOverride()); // parse the data ini->initFromINI( waterTrans, TheWaterTransparency->getFieldParse() ); // If we overrode any skybox textures, then call the W3D Water stuff. if (ini->getLoadType() == INI_LOAD_CREATE_OVERRIDES) { // Check to see if we overrode any skybox textures. // If we did, then we need to replace them in the model. // Copy/Paste monkeys PLEASE TAKE NOTE. This technique only works for the skybox because we // know that there will never be more than one sky box. If you were to use this technique for // technicals, for instance, it would make all technicals in the level have the same new // texture. const WaterTransparencySetting* wtOriginal = TheWaterTransparency.getNonOverloadedPointer(); OVERRIDE wtOverride = TheWaterTransparency; if (wtOriginal == wtOverride) return; const AsciiString *oldTextures[5],*newTextures[5]; //Copy current texture names into arrays oldTextures[0]=&wtOriginal->m_skyboxTextureN; newTextures[0]=&wtOverride->m_skyboxTextureN; oldTextures[1]=&wtOriginal->m_skyboxTextureE; newTextures[1]=&wtOverride->m_skyboxTextureE; oldTextures[2]=&wtOriginal->m_skyboxTextureS; newTextures[2]=&wtOverride->m_skyboxTextureS; oldTextures[3]=&wtOriginal->m_skyboxTextureW; newTextures[3]=&wtOverride->m_skyboxTextureW; oldTextures[4]=&wtOriginal->m_skyboxTextureT; newTextures[4]=&wtOverride->m_skyboxTextureT; TheTerrainVisual->replaceSkyboxTextures(oldTextures, newTextures); } }