/* ** 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: W3DBridgeBuffer.h ////////////////////////////////////////////////// //----------------------------------------------------------------------------- // // Westwood Studios Pacific. // // Confidential Information // Copyright (C) 2001 - All Rights Reserved // //----------------------------------------------------------------------------- // // Project: RTS3 // // File name: W3DBridgeBuffer.h // // Created: John Ahlquist, May 2001 // // Desc: Draw buffer to handle all the bridges in a scene. // //----------------------------------------------------------------------------- #pragma once #ifndef __W3DBRIDGE_BUFFER_H_ #define __W3DBRIDGE_BUFFER_H_ //----------------------------------------------------------------------------- // Includes //----------------------------------------------------------------------------- #include "always.h" #include "rendobj.h" #include "w3d_file.h" #include "dx8vertexbuffer.h" #include "dx8indexbuffer.h" #include "shader.h" #include "vertmaterial.h" #include "Lib/BaseType.h" #include "common/GameType.h" #include "Common/Dict.h" #include "Common/AsciiString.h" //----------------------------------------------------------------------------- // Forward References //----------------------------------------------------------------------------- class MeshClass; class W3DTerrainLogic; class W3DAssetManager; class SimpleSceneClass; //----------------------------------------------------------------------------- // Type Defines //----------------------------------------------------------------------------- typedef enum { FIXED_BRIDGE = 0, SECTIONAL_BRIDGE = 1 } TBridgeType; class BridgeInfo; /// The individual data for a bridge. class W3DBridge { protected: Vector3 m_start; ///< Drawing location Vector3 m_end; ///< Drawing location Real m_scale; ///< Width scale. Real m_length; TBridgeType m_bridgeType; ///< Type of bridge. Currently only 2 supported. SphereClass m_bounds; ///< Bounding sphere for culling to set the visible flag. TextureClass *m_bridgeTexture; MeshClass *m_leftMesh; ///< W3D mesh models for the bridges. Matrix3D m_leftMtx; ///< Transform for the left mesh. Real m_minY; ///< min y vertex. Real m_maxY; ///< max y vertex. Real m_leftMinX; ///< m_leftMesh min x vertex. Real m_leftMaxX; ///< m_leftMesh max x vertex. MeshClass *m_sectionMesh; ///< W3D mesh models for the bridges. Matrix3D m_sectionMtx; ///< Transform for the section mesh. Real m_sectionMinX; ///< m_sectionMesh min x vertex. Real m_sectionMaxX; ///< m_sectionMesh max x vertex. MeshClass *m_rightMesh; ///< W3D mesh models for the bridges. Matrix3D m_rightMtx; ///< Transform for the right mesh. Real m_rightMinX; ///< m_rightMesh min x vertex. Real m_rightMaxX; ///< m_rightMesh max x vertex. Int m_firstIndex; ///< Starting index buffer. Int m_numVertex; ///< Number of vertex used. Int m_firstVertex; ///< First vertex. Int m_numPolygons; ///< Number of polygons to draw. Bool m_visible; AsciiString m_templateName; ///< Name of the bridge type. enum BodyDamageType m_curDamageState; Bool m_enabled; protected: Int getModelVerticesFixed(VertexFormatXYZNDUV1 *destination_vb, Int curVertex, const Matrix3D &mtx, MeshClass *pMesh, RefRenderObjListIterator *pLightsIterator); Int getModelIndices(UnsignedShort *destination_ib, Int curIndex, Int vertexOffset, MeshClass *pMesh); Int getModelVertices(VertexFormatXYZNDUV1 *destination_vb, Int curVertex, Real xOffset, Vector3 &vec, Vector3 &vecNormal, Vector3 &vecZ, Vector3 &offset, const Matrix3D &mtx, MeshClass *pMesh, RefRenderObjListIterator *pLightsIterator); public: W3DBridge(void); ~W3DBridge(void); void init(Vector3 fromLoc, Vector3 toLoc, AsciiString name); AsciiString getTemplateName(void) {return m_templateName;} const Vector3* getStart(void) const {return &m_start;} const Vector3* getEnd(void) const { return &m_end;} Bool load(enum BodyDamageType curDamageState); enum BodyDamageType getDamageState(void) {return m_curDamageState;}; void setDamageState(enum BodyDamageType state) { m_curDamageState = state;}; void getIndicesNVertices(UnsignedShort *destination_ib, VertexFormatXYZNDUV1 *destination_vb, Int *curIndexP, Int *curVertexP, RefRenderObjListIterator *pLightsIterator); Bool cullBridge(CameraClass * camera); ///< Culls the bridges. Returns true if visibility changed. void clearBridge(void); ///< Frees all objects associated with a bridge. Bool isVisible(void) {return m_visible;}; Bool isEnabled(void) {return m_enabled;}; void setEnabled(Bool enable) {m_enabled = enable;}; void renderBridge(Bool wireframe); void getBridgeInfo(BridgeInfo *pInfo); }; // // W3DBridgeBuffer: Draw buffer for the bridges. // // class W3DBridgeBuffer { friend class HeightMapRenderObjClass; public: W3DBridgeBuffer(void); ~W3DBridgeBuffer(void); /// Empties the bridge buffer. void clearAllBridges(void); /// Draws the bridges. Uses camera for culling. void drawBridges(CameraClass * camera, Bool wireframe, TextureClass *cloudTexture); /// Called when the view changes, and sort key needs to be recalculated. /// Normally sortKey gets calculated when a bridge becomes visible. void doFullUpdate(void) {m_updateVis = true;}; void loadBridges(W3DTerrainLogic *pTerrainLogic, Bool saveGame); ///< Loads the bridges from the map objects list. void worldBuilderUpdateBridgeTowers( W3DAssetManager *assetManager, SimpleSceneClass *scene ); ///< for the editor and showing visual bridge towers void updateCenter(CameraClass *camera, RefRenderObjListIterator *pLightsIterator); enum { MAX_BRIDGE_VERTEX=8000, MAX_BRIDGE_INDEX=2*8000, MAX_BRIDGES=200}; protected: DX8VertexBufferClass *m_vertexBridge; ///