/* ** 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. // // // //////////////////////////////////////////////////////////////////////////////// #pragma once #ifndef __HEIGHTMAP_H_ #define __HEIGHTMAP_H_ #include "always.h" #include "rendobj.h" #include "w3d_file.h" #include "dx8vertexbuffer.h" #include "dx8indexbuffer.h" #include "dx8wrapper.h" #include "shader.h" #include "vertmaterial.h" #include "Lib/BaseType.h" #include "common/GameType.h" #include "WorldHeightMap.h" #define MAX_ENABLED_DYNAMIC_LIGHTS 20 typedef UnsignedByte HeightSampleType; //type of data to store in heightmap class W3DTreeBuffer; class W3DBibBuffer; class W3DRoadBuffer; class W3DBridgeBuffer; class W3DWaypointBuffer; class W3DTerrainLogic; class W3DCustomEdging; class W3DAssetManager; class SimpleSceneClass; class W3DShroud; #define no_TIMING_TESTS 1 #define no_PRE_TRANSFORM_VERTEX // Don't do this, not a performance win. jba. #define no_USE_TREE_BUFFER ///@todoRe-enable this optimization later... jba. typedef struct { Int minX, maxX; Int minY, maxY; } TBounds; #define VERTEX_BUFFER_TILE_LENGTH 32 //tiles of side length 32 (grid of 33x33 vertices). class LightMapTerrainTextureClass; class CloudMapTerrainTextureClass; class W3DDynamicLight; #if 0 #define USE_NORMALS 1 #define VERTEX_FORMAT VertexFormatXYZNUV2 #else #define USE_DIFFUSE 1 #define VERTEX_FORMAT VertexFormatXYZDUV2 #define DX8_VERTEX_FORMAT DX8_FVF_XYZDUV2 #endif #define DO_SCORCH 1 #define DO_ROADS 1 #define TEST_CUSTOM_EDGING 1 // Adjust the triangles to make cliff sides most attractive. jba. #define FLIP_TRIANGLES 1 #ifdef DO_SCORCH typedef struct { Vector3 location; Real radius; Int scorchType; } TScorch; #endif /// Custom render object that draws the heightmap and handles intersection tests. /** Custom W3D render object that's used to process the terrain. It handles virtually everything to do with the terrain, including: drawing, lighting, scorchmarks and intersection tests. */ class HeightMapRenderObjClass : public RenderObjClass, public DX8_CleanupHook { public: HeightMapRenderObjClass(void); ~HeightMapRenderObjClass(void); // DX8_CleanupHook methods virtual void ReleaseResources(void); ///< Release all dx8 resources so the device can be reset. virtual void ReAcquireResources(void); ///< Reacquire all resources after device reset. ///////////////////////////////////////////////////////////////////////////// // Render Object Interface (W3D methods) ///////////////////////////////////////////////////////////////////////////// virtual RenderObjClass * Clone(void) const; virtual int Class_ID(void) const; virtual void Render(RenderInfoClass & rinfo); virtual bool Cast_Ray(RayCollisionTestClass & raytest); // This CANNOT be Bool, as it will not inherit properly if you make Bool == Int ///@todo: Add methods for collision detection with terrain // virtual Bool Cast_AABox(AABoxCollisionTestClass & boxtest); // virtual Bool Cast_OBBox(OBBoxCollisionTestClass & boxtest); // virtual Bool Intersect_AABox(AABoxIntersectionTestClass & boxtest); // virtual Bool Intersect_OBBox(OBBoxIntersectionTestClass & boxtest); virtual void Get_Obj_Space_Bounding_Sphere(SphereClass & sphere) const; virtual void Get_Obj_Space_Bounding_Box(AABoxClass & aabox) const; virtual void On_Frame_Update(void); virtual void Notify_Added(SceneClass * scene); ///allocate resources needed to render heightmap int initHeightData(Int width, Int height, WorldHeightMap *pMap, RefRenderObjListIterator *pLightsIterator); Int freeMapResources(void); ///< free resources used to render heightmap inline UnsignedByte getClipHeight(Int x, Int y) const { Int xextent = m_map->getXExtent() - 1; Int yextent = m_map->getYExtent() - 1; if (x < 0) x = 0; else if (x > xextent) x = xextent; if (y < 0) y = 0; else if (y > yextent) y = yextent; return m_map->getDataPtr()[x + y*m_map->getXExtent()]; } void updateCenter(CameraClass *camera, RefRenderObjListIterator *pLightsIterator); /// Update the macro texture (pass 3). void updateMacroTexture(AsciiString textureName); void doTextures(Bool flag) {m_disableTextures = !flag;}; /// Update the diffuse value from static light info for one vertex. void doTheLight(VERTEX_FORMAT *vb, Vector3*light, Vector3*normal, RefRenderObjListIterator *pLightsIterator, UnsignedByte alpha); void addScorch(Vector3 location, Real radius, Scorches type); void addTree(Coord3D location, Real scale, Real angle, AsciiString name, Bool visibleInMirror); void renderTrees(CameraClass * camera); ///< renders the tree buffer. /// Add a bib at location. void addTerrainBib(Vector3 corners[4], ObjectID id, Bool highlight); void addTerrainBibDrawable(Vector3 corners[4], DrawableID id, Bool highlight); /// Remove a bib. void removeTerrainBib(ObjectID id); void removeTerrainBibDrawable(DrawableID id); /// Removes all bibs. void removeAllTerrainBibs(void); /// Remove all highlighting. void removeTerrainBibHighlighting(void); void renderTerrainPass(CameraClass *pCamera); ///< renders additional terrain pass. W3DShroud *getShroud() {return m_shroud;} void renderExtraBlendTiles(void); ///< render 3-way blend tiles that have blend of 3 textures. void updateShorelineTiles(Int minX, Int minY, Int maxX, Int maxY, WorldHeightMap *pMap); ///
m_showAsVisibleCliff; DX8IndexBufferClass *m_indexBuffer; ///