Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Core/GameEngineDevice/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ set(GAMEENGINEDEVICE_SRC
Include/W3DDevice/GameClient/W3DProfilerFrameCapture.h
# Include/W3DDevice/GameClient/W3DProjectedShadow.h
Include/W3DDevice/GameClient/W3DPropBuffer.h
Include/W3DDevice/GameClient/W3DScorch.h
# Include/W3DDevice/GameClient/W3DRoadBuffer.h
# Include/W3DDevice/GameClient/W3DScene.h
Include/W3DDevice/GameClient/W3DShaderManager.h
Expand Down Expand Up @@ -163,6 +164,7 @@ set(GAMEENGINEDEVICE_SRC
# Source/W3DDevice/GameClient/W3DPoly.cpp
Source/W3DDevice/GameClient/W3DProfilerFrameCapture.cpp
Source/W3DDevice/GameClient/W3DPropBuffer.cpp
Source/W3DDevice/GameClient/W3DScorch.cpp
# Source/W3DDevice/GameClient/W3DRoadBuffer.cpp
# Source/W3DDevice/GameClient/W3DScene.cpp
Source/W3DDevice/GameClient/W3DShaderManager.cpp
Expand Down
36 changes: 4 additions & 32 deletions Core/GameEngineDevice/Include/W3DDevice/GameClient/BaseHeightMap.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@ class W3DWaypointBuffer;
class W3DTerrainLogic;
class W3DAssetManager;
class SimpleSceneClass;
class W3DScorch;
class W3DShroud;
class W3DPropDrawModuleData;
class W3DPropBuffer;
Expand All @@ -70,14 +71,6 @@ class W3DDynamicLight;

#define DO_ROADS 1

#ifdef DO_SCORCH
typedef struct {
Vector3 location;
Real radius;
Int scorchType;
} TScorch;
#endif

#define VERTEX_FORMAT VertexFormatXYZDUV2
#define DX8_VERTEX_FORMAT DX8_FVF_XYZDUV2

Expand Down Expand Up @@ -195,6 +188,7 @@ class BaseHeightMapRenderObjClass : public RenderObjClass, public DX8_CleanupHoo
void updateShorelineTile(Int X, Int Y, Int Border, WorldHeightMap *pMap); ///<figure out which tiles on this map cross water plane
void recordShoreLineSortInfos();
void updateViewImpassableAreas(Bool partial = FALSE, Int minX = 0, Int maxX = 0, Int minY = 0, Int maxY = 0);
void drawScorches();
void clearAllScorches();
void setTimeOfDay( TimeOfDay tod );
void loadRoadsAndBridges(W3DTerrainLogic *pTerrainLogic, Bool saveGame); ///< Load the roads from the map objects.
Expand Down Expand Up @@ -240,30 +234,7 @@ class BaseHeightMapRenderObjClass : public RenderObjClass, public DX8_CleanupHoo
Int m_x; ///< dimensions of heightmap
Int m_y; ///< dimensions of heightmap

#ifdef DO_SCORCH
enum { MAX_SCORCH_VERTEX=8194,
MAX_SCORCH_INDEX=6*8194,
MAX_SCORCH_MARKS=500,
SCORCH_MARKS_IN_TEXTURE=9,
SCORCH_PER_ROW = 3};
DX8VertexBufferClass *m_vertexScorch; ///<Scorch vertex buffer.
DX8IndexBufferClass *m_indexScorch; ///<indices defining a triangles for the scorch drawing.
TextureClass *m_scorchTexture; ///<Scorch mark texture
Int m_curNumScorchVertices; ///<number of vertices used in m_vertexScorch.
Int m_curNumScorchIndices; ///<number of indices used in m_indexScorch.
TScorch m_scorches[MAX_SCORCH_MARKS];
Int m_numScorches;

Int m_scorchesInBuffer; ///< how many are in the buffers. If less than numScorches, we need to update

// NOTE: This argument (contrary to most of the rest of the engine), is in degrees, not radians.
Real m_curImpassableSlope;

void updateScorches(); ///<Update m_vertexScorch and m_indexScorch so all scorches will be drawn.
void allocateScorchBuffers(); ///<allocate static buffers for drawing scorch marks.
void freeScorchBuffers(); ///< frees up scorch buffers.
void drawScorches(); ///< Draws the scorch mark polygons in m_vertexScorch.
#endif
Real m_curImpassableSlope; // NOTE: This argument (contrary to most of the rest of the engine), is in degrees, not radians.
WorldHeightMap *m_map;
Bool m_useDepthFade; ///<fade terrain lighting under water
Bool m_updating;
Expand Down Expand Up @@ -296,6 +267,7 @@ class BaseHeightMapRenderObjClass : public RenderObjClass, public DX8_CleanupHoo
W3DRoadBuffer *m_roadBuffer; ///< Class for drawing roads.
#endif
W3DBridgeBuffer *m_bridgeBuffer;
W3DScorch *m_scorches;
W3DShroud *m_shroud; ///< Class for drawing the shroud over terrain.
struct shoreLineTileInfo
{ Int m_xy; //x,y position of tile
Expand Down
84 changes: 84 additions & 0 deletions Core/GameEngineDevice/Include/W3DDevice/GameClient/W3DScorch.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
/*
** Command & Conquer Generals Zero Hour(tm)
** Copyright 2026 TheSuperHackers
**
** 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 <http://www.gnu.org/licenses/>.
*/

#pragma once

#include "WWMath/vector3.h"
#include "Common/GameType.h"
#include "Lib/BaseTypeCore.h"

class TextureClass;
class DX8IndexBufferClass;
class DX8VertexBufferClass;
class WorldHeightMap;

class W3DScorch
{
public:
W3DScorch();
virtual ~W3DScorch();

virtual void allocateScorchBuffers(); ///< allocate static buffers for drawing scorch marks.
virtual void freeBuffers(); ///< frees up scorch buffers.
virtual void clearAllScorches();
virtual void invalidateBuffers();
virtual void addScorch(Vector3 location, Real radius, Scorches type);
virtual void drawScorches(WorldHeightMap* map); ///< Draws the scorch mark polygons in m_vertexScorch.

private:
typedef struct
{
Vector3 location;
Real radius;
Int scorchType;
} TScorch;

enum
{
MAX_SCORCH_VERTEX = 8194,
MAX_SCORCH_INDEX = 6 * 8194,
MAX_SCORCH_MARKS = 500,
SCORCH_MARKS_IN_TEXTURE = 9,
SCORCH_PER_ROW = 3
};

virtual void updateScorches(WorldHeightMap* map); ///< Update m_vertexScorch and m_indexScorch so all scorches will be drawn.

DX8VertexBufferClass* m_vertexScorch; ///< Scorch vertex buffer.
DX8IndexBufferClass* m_indexScorch; ///< indices defining a triangles for the scorch drawing.
TextureClass* m_scorchTexture; ///< Scorch mark texture
Int m_curNumScorchVertices; ///< number of vertices used in m_vertexScorch.
Int m_curNumScorchIndices; ///< number of indices used in m_indexScorch.
TScorch m_scorches[MAX_SCORCH_MARKS];
Int m_numScorches;
Int m_scorchesInBuffer; ///< how many are in the buffers. If less than numScorches, we need to update
};

class W3DScorchDummy : public W3DScorch
{
public:
void allocateScorchBuffers() override {}
void freeBuffers() override {}
void clearAllScorches() override {}
void invalidateBuffers() override {}
void addScorch(Vector3 location, Real radius, Scorches type) override {}
void drawScorches(WorldHeightMap* map) override {}

private:
void updateScorches(WorldHeightMap* map) override {}
};
Loading
Loading