/*
** Command & Conquer Generals(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: W3DTerrainVisual.h ///////////////////////////////////////////////////////////////////////
// W3D implementation details for visual aspects of terrain
// Author: Colin Day, April 2001
///////////////////////////////////////////////////////////////////////////////////////////////////
#pragma once
#ifndef __W3DTERRAINVISUAL_H_
#define __W3DTERRAINVISUAL_H_
#include "GameClient/TerrainVisual.h"
#include "W3DDevice/GameClient/W3DWater.h"
// FORWARD REFERENCES /////////////////////////////////////////////////////////////////////////////
class Matrix3D;
class WaterHandle;
class HeightMapRenderObjClass;
class WorldHeightMap;
//-------------------------------------------------------------------------------------------------
/** W3D impelmentation of visual terrain details singleton */
//-------------------------------------------------------------------------------------------------
class W3DTerrainVisual : public TerrainVisual
{
public:
W3DTerrainVisual();
virtual ~W3DTerrainVisual();
virtual void init( void );
virtual void reset( void );
virtual void update( void );
virtual Bool load( AsciiString filename );
void getTerrainColorAt( Real x, Real y, RGBColor *pColor );
/// get the terrain tile type at the world location in the (x,y) plane ignoring Z
TerrainType *getTerrainTile( Real x, Real y );
/** intersect the ray with the terrain, if a hit occurs TRUE is returned
and the result point on the terrain is returned in "result" */
virtual Bool intersectTerrain( Coord3D *rayStart, Coord3D *rayEnd, Coord3D *result );
//
// water methods
//
/// enable/disable the water grid
virtual void enableWaterGrid( Bool enable );
/// set min/max height values allowed in water grid pointed to by waterTable
virtual void setWaterGridHeightClamps( const WaterHandle *waterTable, Real minZ, Real maxZ );
/// adjust fallof parameters for grid change method
virtual void setWaterAttenuationFactors( const WaterHandle *waterTable,
Real a, Real b, Real c, Real range );
/// set the water table position and orientation in world space
virtual void setWaterTransform( const WaterHandle *waterTable,
Real angle, Real x, Real y, Real z );
virtual void setWaterTransform( const Matrix3D *transform );
virtual void getWaterTransform( const WaterHandle *waterTable, Matrix3D *transform );
/// water grid resolution spacing
virtual void setWaterGridResolution( const WaterHandle *waterTable,
Real gridCellsX, Real gridCellsY, Real cellSize );
virtual void getWaterGridResolution( const WaterHandle *waterTable,
Real *gridCellsX, Real *gridCellsY, Real *cellSize );
/// adjust the water grid in world coords by the delta
virtual void changeWaterHeight( Real x, Real y, Real delta );
/// adjust the velocity at a water grid point corresponding to the world x,y
virtual void addWaterVelocity( Real worldX, Real worldY,
Real velocity, Real preferredHeight );
virtual Bool getWaterGridHeight( Real worldX, Real worldY, Real *height);
virtual void setTerrainTracksDetail(void);
virtual void setShoreLineDetail(void);
/// Add a bib at location.
void addFactionBib(Object *factionBuilding, Bool highlight, Real extra = 0);
/// Remove a bib.
void removeFactionBib(Object *factionBuilding);
/// Add a bib at location.
void addFactionBibDrawable(Drawable *factionBuilding, Bool highlight, Real extra = 0);
/// Remove a bib.
void removeFactionBibDrawable(Drawable *factionBuilding);
virtual void removeAllBibs(void);
virtual void removeBibHighlighting(void);
//
// Modify height.
//
virtual void setRawMapHeight(const ICoord2D *gridPos, Int height);
/// Replace the skybox texture
virtual void replaceSkyboxTextures(const AsciiString *oldTexName[NumSkyboxTextures], const AsciiString *newTexName[NumSkyboxTextures]);
protected:
// snapshot methods
virtual void crc( Xfer *xfer );
virtual void xfer( Xfer *xfer );
virtual void loadPostProcess( void );
HeightMapRenderObjClass *m_terrainRenderObject; ///< W3D render object for terrain
WaterRenderObjClass *m_waterRenderObject; ///< W3D render object for water plane
WorldHeightMap *m_terrainHeightMap; ///< height map used for render obj building
Bool m_isWaterGridRenderingEnabled;
AsciiString m_currentSkyboxTexNames[NumSkyboxTextures]; ///