Richard Boegli's CnC_Generals_Zero_Hour Fork WIP
This is documentation of Richard Boegil's Zero Hour Fork
 
Loading...
Searching...
No Matches
hlod.h
Go to the documentation of this file.
1/*
2** Command & Conquer Generals Zero Hour(tm)
3** Copyright 2025 Electronic Arts Inc.
4**
5** This program is free software: you can redistribute it and/or modify
6** it under the terms of the GNU General Public License as published by
7** the Free Software Foundation, either version 3 of the License, or
8** (at your option) any later version.
9**
10** This program is distributed in the hope that it will be useful,
11** but WITHOUT ANY WARRANTY; without even the implied warranty of
12** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13** GNU General Public License for more details.
14**
15** You should have received a copy of the GNU General Public License
16** along with this program. If not, see <http://www.gnu.org/licenses/>.
17*/
18
19/***********************************************************************************************
20 *** C O N F I D E N T I A L --- W E S T W O O D S T U D I O S ***
21 ***********************************************************************************************
22 * *
23 * Project Name : WW3D *
24 * *
25 * $Archive:: /Commando/Code/ww3d2/hlod.h $*
26 * *
27 * Author:: Greg Hjelstrom *
28 * *
29 * $Modtime:: 5/25/01 1:37p $*
30 * *
31 * $Revision:: 3 $*
32 * *
33 *---------------------------------------------------------------------------------------------*
34 * Functions: *
35 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
36
37
38#if defined(_MSC_VER)
39#pragma once
40#endif
41
42#ifndef HLOD_H
43#define HLOD_H
44
45#ifndef ANIMOBJ_H
46#include "animobj.h"
47#endif
48
49#ifndef VECTOR_H
50#include "vector.h"
51#endif
52
53#ifndef SNAPPTS_H
54#include "snappts.h"
55#endif
56
57#ifndef PROTO_H
58#include "proto.h"
59#endif
60
61#ifndef W3DERR_H
62#include "w3derr.h"
63#endif
64
65#ifndef __PROXY_H
66#include "proxy.h"
67#endif
68
69
70class DistLODClass;
71class HModelClass;
72class HLodDefClass;
73class HModelDefClass;
74class ProxyArrayClass;
75
76
77
78/*
79
80 HLodClass
81
82 This is an hierarchical, animatable level-of-detail model.
83
84*/
86{
88public:
89
90 HLodClass(const HLodClass & src);
91 HLodClass(const char * name,RenderObjClass ** lods,int count);
92 HLodClass(const HLodDefClass & def);
93 HLodClass(const HModelDefClass & def);
94
96 virtual ~HLodClass(void);
97
99 // Render Object Interface - Cloning and Identification
101 virtual RenderObjClass * Clone(void) const;
102 virtual int Class_ID(void) const { return CLASSID_HLOD; }
103 virtual int Get_Num_Polys(void) const;
104
106 // HLod Interface - Editing and information
108 virtual void Set_Max_Screen_Size(int lod_index, float size);
109 virtual float Get_Max_Screen_Size(int lod_index) const;
110
111 virtual int Get_Lod_Count(void) const;
112 virtual int Get_Lod_Model_Count (int lod_index) const;
113 virtual RenderObjClass * Peek_Lod_Model (int lod_index, int model_index) const;
114 virtual RenderObjClass * Get_Lod_Model (int lod_index, int model_index) const;
115 virtual int Get_Lod_Model_Bone (int lod_index, int model_index) const;
116 virtual int Get_Additional_Model_Count(void) const;
117 virtual RenderObjClass * Peek_Additional_Model (int model_index) const;
118 virtual RenderObjClass * Get_Additional_Model (int model_index) const;
119 virtual int Get_Additional_Model_Bone (int model_index) const;
120 virtual void Add_Lod_Model(int lod, RenderObjClass * robj, int boneindex);
121
122 virtual bool Is_NULL_Lod_Included (void) const;
123 virtual void Include_NULL_Lod (bool include = true);
124
126 // Proxy interface
128 virtual int Get_Proxy_Count (void) const;
129 virtual bool Get_Proxy (int index, ProxyClass &proxy) const;
130
132 // Render Object Interface - Rendering
134 virtual void Render(RenderInfoClass & rinfo);
135 virtual void Special_Render(SpecialRenderInfoClass & rinfo);
136
138 // Render Object Interface - "Scene Graph"
140 virtual void Set_Transform(const Matrix3D &m);
141 virtual void Set_Position(const Vector3 &v);
142
143 virtual void Notify_Added(SceneClass * scene);
144 virtual void Notify_Removed(SceneClass * scene);
145
146 virtual int Get_Num_Sub_Objects(void) const;
147 virtual RenderObjClass * Get_Sub_Object(int index) const;
148 virtual int Add_Sub_Object(RenderObjClass * subobj);
149 virtual int Remove_Sub_Object(RenderObjClass * robj);
150
151 virtual int Get_Num_Sub_Objects_On_Bone(int boneindex) const;
152 virtual RenderObjClass * Get_Sub_Object_On_Bone(int index,int boneindex) const;
153 virtual int Get_Sub_Object_Bone_Index(RenderObjClass * subobj) const;
154 virtual int Get_Sub_Object_Bone_Index(int LodIndex, int ModelIndex) const;
155 virtual int Add_Sub_Object_To_Bone(RenderObjClass * subobj,int bone_index);
156
158 // Render Object Interface - Hierarchical Animation
160 virtual void Set_Animation(void);
161 virtual void Set_Animation( HAnimClass * motion,
162 float frame, int anim_mode = ANIM_MODE_MANUAL);
163 virtual void Set_Animation( HAnimClass * motion0,
164 float frame0,
165 HAnimClass * motion1,
166 float frame1,
167 float percentage);
168 virtual void Set_Animation( HAnimComboClass * anim_combo);
169
171 // Render Object Interface - Collision Detection, Ray Tracing
173 virtual bool Cast_Ray(RayCollisionTestClass & raytest);
174 virtual bool Cast_AABox(AABoxCollisionTestClass & boxtest);
175 virtual bool Cast_OBBox(OBBoxCollisionTestClass & boxtest);
176 virtual bool Intersect_AABox(AABoxIntersectionTestClass & boxtest);
177 virtual bool Intersect_OBBox(OBBoxIntersectionTestClass & boxtest);
178
180 // Render Object Interface - Predictive LOD
182 virtual void Prepare_LOD(CameraClass &camera);
183 virtual void Recalculate_Static_LOD_Factors(void);
184 virtual void Increment_LOD(void);
185 virtual void Decrement_LOD(void);
186 virtual float Get_Cost(void) const;
187 virtual float Get_Value(void) const;
188 virtual float Get_Post_Increment_Value(void) const;
189 virtual void Set_LOD_Level(int lod);
190 virtual int Get_LOD_Level(void) const;
191 virtual int Get_LOD_Count(void) const;
192 virtual void Set_LOD_Bias(float bias);
193 virtual int Calculate_Cost_Value_Arrays(float screen_area, float *values, float *costs) const;
194 virtual RenderObjClass * Get_Current_LOD(void);
195
197 // Render Object Interface - Bounding Volumes
199 virtual const SphereClass & Get_Bounding_Sphere(void) const;
200 virtual const AABoxClass & Get_Bounding_Box(void) const;
201 virtual void Get_Obj_Space_Bounding_Sphere(SphereClass & sphere) const;
202 virtual void Get_Obj_Space_Bounding_Box(AABoxClass & box) const;
203
205 // Render Object Interface - Decals
207 virtual void Create_Decal(DecalGeneratorClass * generator);
208 virtual void Delete_Decal(uint32 decal_id);
209
211 // Render Object Interface - Attributes, Options, Properties, etc
213// virtual void Set_Texture_Reduction_Factor(float trf);
214 virtual void Scale(float scale);
215 virtual void Scale(float scalex, float scaley, float scalez) { }
216 virtual int Get_Num_Snap_Points(void);
217 virtual void Get_Snap_Point(int index,Vector3 * set);
218 virtual void Set_Hidden(int onoff);
219
220 // (gth) TESTING DYNAMICALLY SWAPPING SKELETONS!
221 virtual void Set_HTree(HTreeClass * htree);
222
223protected:
224
225 HLodClass(void);
226
227 void Free(void);
228 virtual void Update_Sub_Object_Transforms(void);
229 virtual void Update_Obj_Space_Bounding_Volumes(void);
230
231protected:
232
233
235 {
236 public:
239 bool operator == (const ModelNodeClass & that) { return (Model == that.Model) && (BoneIndex == that.BoneIndex); }
240 bool operator != (const ModelNodeClass & that) { return !operator == (that); }
241 };
242
243 class ModelArrayClass : public DynamicVectorClass<ModelNodeClass>
244 {
245 public:
248 float MaxScreenSize; // Maximum screen size for this LOD
249 float NonPixelCost; // Cost heuristics of LODS (w/o per-pixel cost)
250 float PixelCostPerArea; // PixelCostPerArea * area(normalized) + NonPixelCost = total Cost
251 float BenefitFactor; // BenefitFactor * area(normalized) = Benefit
252 };
253
254 // Lod Render Objects, basically one of the LOD Models will be rendered. Typically
255 // each model in an HLodModel will be a mesh or a "simple" HLod (one with a single LOD)
259
260 //
261 // An animating heirarchy can use a hidden CLASSID_OBBOX mesh to represent its bounding
262 // box as it animates. This is the sub object index of that mesh (if it exists).
263 //
265
266 float * Cost; // Cost array (recalculated every frame)
267 float * Value; // Value array (recalculated every frame)
268
269 // Additional Models, these models have been linked to one of the bones in this
270 // model. They are all always rendered. They can be HLODs themselves in order
271 // to implement switching on sub models.
272 // NOTE: This uses ModelArrayClass for convenience, but MaxScreenSize,
273 // NonPixelCost, PixelCostPerArea, BenefitFactor are not used here.
275
276 // possible array of snap points.
278
279 // possible array of proxy objects (names and bone indexes for application defined usage)
281
282 // Current LOD Bias (affects recalculation of the Value array)
283 float LODBias;
284};
285
286
287/*
288** Loaders for HLodClass
289*/
291{
292public:
293 virtual int Chunk_Type (void) { return W3D_CHUNK_HLOD; }
294 virtual PrototypeClass * Load_W3D(ChunkLoadClass & cload);
295};
296
297
303class HLodDefClass : public W3DMPO
304{
306public:
307
308 HLodDefClass(void);
309 HLodDefClass(HLodClass &src_lod);
310 ~HLodDefClass(void);
311
314 const char * Get_Name(void) const { return Name; }
315 void Initialize(HLodClass &src_lod);
316
317protected:
318
319 /*
320 ** Serializtion methods
321 */
325
326private:
327
328 /*
329 ** SubObjectArrayClass
330 ** Describes a level-of-detail in an HLod object. Note that this is
331 ** a render object which will be exploded when the HLod is constructed (its
332 ** sub-objects, if any, will be placed into the HLod).
333 */
334 class SubObjectArrayClass
335 {
336 public:
337 SubObjectArrayClass(void);
338 ~SubObjectArrayClass(void);
339 void Reset(void);
340 void operator = (const SubObjectArrayClass & that);
341
342 bool Load_W3D(ChunkLoadClass & cload);
343 bool Save_W3D(ChunkSaveClass & csave);
344
345 float MaxScreenSize;
346 int ModelCount;
347 char ** ModelName; // array of model names
348 int * BoneIndex; // array of bone indices
349 };
350
351 char * Name;
352 char * HierarchyTreeName;
353 int LodCount;
354 SubObjectArrayClass * Lod;
355 SubObjectArrayClass Aggregates;
356 ProxyArrayClass * ProxyArray;
357
358 void Free(void);
359 bool read_header(ChunkLoadClass & cload);
360 bool read_proxy_array(ChunkLoadClass & cload);
361
362 friend class HLodClass;
363};
364
365
366/*
367** Prototype for HLod objects
368*/
370{
372public:
373 HLodPrototypeClass( HLodDefClass *def ) { Definition = def; }
374
375 virtual const char * Get_Name(void) const { return Definition->Get_Name(); }
376 virtual int Get_Class_ID(void) const { return RenderObjClass::CLASSID_HLOD; }
377 virtual RenderObjClass * Create(void);
378 virtual void DeleteSelf() { delete this; }
379
380 HLodDefClass * Get_Definition(void) const { return Definition; }
381
382protected:
383 virtual ~HLodPrototypeClass(void) { delete Definition; }
384
385private:
386 HLodDefClass * Definition;
387};
388
389/*
390** Instance of the loaders which the asset manager install
391*/
393
394
395#endif
Color scale(const Color &a, const Color &b)
Definition GameMtl.cpp:722
@ W3D_CHUNK_HLOD
Definition w3d_file.h:465
#define NO_MAX_SCREEN_SIZE
Definition w3d_file.h:2045
#define W3DMPO_GLUE(ARGCLASS)
Definition always.h:120
unsigned long uint32
Definition bittype.h:46
Animatable3DObjClass(const char *htree_name)
Definition animobj.cpp:84
DynamicVectorClass(unsigned size=0, ModelNodeClass const *array=0)
Definition Vector.H:587
bool operator!=(const ModelNodeClass &that)
Definition hlod.h:240
RenderObjClass * Model
Definition hlod.h:237
bool operator==(const ModelNodeClass &that)
Definition hlod.h:239
HLodClass(void)
Definition hlod.cpp:920
virtual int Get_Lod_Model_Bone(int lod_index, int model_index) const
Definition hlod.cpp:1784
virtual void Special_Render(SpecialRenderInfoClass &rinfo)
Definition hlod.cpp:2186
virtual int Add_Sub_Object_To_Bone(RenderObjClass *subobj, int bone_index)
Definition hlod.cpp:2562
virtual int Class_ID(void) const
Definition hlod.h:102
virtual float Get_Value(void) const
Definition hlod.cpp:3054
virtual float Get_Max_Screen_Size(int lod_index) const
Definition hlod.cpp:1614
virtual void Render(RenderInfoClass &rinfo)
Definition hlod.cpp:2146
virtual float Get_Cost(void) const
Definition hlod.cpp:3036
virtual void Scale(float scale)
Definition hlod.cpp:3264
virtual void Decrement_LOD(void)
Definition hlod.cpp:3002
virtual RenderObjClass * Peek_Additional_Model(int model_index) const
Definition hlod.cpp:1834
virtual void Set_Position(const Vector3 &v)
Definition hlod.cpp:2241
int CurLod
Definition hlod.h:257
virtual void Prepare_LOD(CameraClass &camera)
Definition hlod.cpp:2861
virtual void Get_Obj_Space_Bounding_Box(AABoxClass &box) const
Definition hlod.cpp:1427
virtual void Update_Sub_Object_Transforms(void)
Definition hlod.cpp:3351
ModelArrayClass AdditionalModels
Definition hlod.h:274
virtual int Get_Num_Sub_Objects_On_Bone(int boneindex) const
Definition hlod.cpp:2460
float * Cost
Definition hlod.h:266
virtual bool Cast_Ray(RayCollisionTestClass &raytest)
Definition hlod.cpp:2686
virtual void Set_LOD_Bias(float bias)
Definition hlod.cpp:1662
float * Value
Definition hlod.h:267
virtual bool Cast_OBBox(OBBoxCollisionTestClass &boxtest)
Definition hlod.cpp:2756
virtual int Get_LOD_Level(void) const
Definition hlod.cpp:3128
virtual int Calculate_Cost_Value_Arrays(float screen_area, float *values, float *costs) const
Definition hlod.cpp:3164
virtual int Get_Num_Polys(void) const
Definition hlod.cpp:2112
ModelArrayClass * Lod
Definition hlod.h:258
virtual void Increment_LOD(void)
Definition hlod.cpp:2968
virtual void Add_Lod_Model(int lod, RenderObjClass *robj, int boneindex)
Definition hlod.cpp:3519
virtual bool Intersect_OBBox(OBBoxIntersectionTestClass &boxtest)
Definition hlod.cpp:2826
virtual bool Get_Proxy(int index, ProxyClass &proxy) const
Definition hlod.cpp:2071
SnapPointsClass * SnapPoints
Definition hlod.h:277
virtual void Get_Obj_Space_Bounding_Sphere(SphereClass &sphere) const
Definition hlod.cpp:1481
virtual void Set_Max_Screen_Size(int lod_index, float size)
Definition hlod.cpp:1577
virtual int Get_Proxy_Count(void) const
Definition hlod.cpp:2049
HLodClass(const HLodClass &src)
Definition hlod.cpp:948
virtual int Get_LOD_Count(void) const
Definition hlod.cpp:3146
void Free(void)
Definition hlod.cpp:1349
virtual RenderObjClass * Get_Sub_Object_On_Bone(int index, int boneindex) const
Definition hlod.cpp:2488
virtual RenderObjClass * Get_Additional_Model(int model_index) const
Definition hlod.cpp:1865
virtual void Recalculate_Static_LOD_Factors(void)
Definition hlod.cpp:2922
virtual const AABoxClass & Get_Bounding_Box(void) const
Definition hlod.cpp:1540
HLodClass & operator=(const HLodClass &)
Definition hlod.cpp:1243
float LODBias
Definition hlod.h:283
ProxyArrayClass * ProxyArray
Definition hlod.h:280
virtual int Get_Sub_Object_Bone_Index(RenderObjClass *subobj) const
Definition hlod.cpp:2527
virtual int Add_Sub_Object(RenderObjClass *subobj)
Definition hlod.cpp:2367
virtual void Notify_Added(SceneClass *scene)
Definition hlod.cpp:2260
virtual bool Cast_AABox(AABoxCollisionTestClass &boxtest)
Definition hlod.cpp:2721
virtual int Get_Lod_Model_Count(int lod_index) const
Definition hlod.cpp:1687
virtual void Get_Snap_Point(int index, Vector3 *set)
Definition hlod.cpp:3328
virtual void Update_Obj_Space_Bounding_Volumes(void)
Definition hlod.cpp:3402
virtual RenderObjClass * Clone(void) const
Definition hlod.cpp:1409
virtual void Notify_Removed(SceneClass *scene)
Definition hlod.cpp:2288
virtual RenderObjClass * Peek_Lod_Model(int lod_index, int model_index) const
Definition hlod.cpp:1717
virtual int Remove_Sub_Object(RenderObjClass *robj)
Definition hlod.cpp:2385
int LodCount
Definition hlod.h:256
virtual RenderObjClass * Get_Current_LOD(void)
Definition hlod.cpp:3213
virtual void Scale(float scalex, float scaley, float scalez)
Definition hlod.h:215
virtual bool Is_NULL_Lod_Included(void) const
Definition hlod.cpp:1930
virtual int Get_Lod_Count(void) const
Definition hlod.cpp:1644
virtual void Set_Transform(const Matrix3D &m)
Definition hlod.cpp:2222
virtual int Get_Num_Snap_Points(void)
Definition hlod.cpp:3306
virtual void Create_Decal(DecalGeneratorClass *generator)
Definition hlod.cpp:3557
virtual int Get_Additional_Model_Count(void) const
Definition hlod.cpp:1816
virtual RenderObjClass * Get_Lod_Model(int lod_index, int model_index) const
Definition hlod.cpp:1749
virtual ~HLodClass(void)
Definition hlod.cpp:1331
virtual const SphereClass & Get_Bounding_Sphere(void) const
Definition hlod.cpp:1502
virtual void Set_LOD_Level(int lod)
Definition hlod.cpp:3090
virtual int Get_Additional_Model_Bone(int model_index) const
Definition hlod.cpp:1899
int BoundingBoxIndex
Definition hlod.h:264
virtual void Set_HTree(HTreeClass *htree)
Definition hlod.cpp:3612
virtual void Set_Animation(void)
Definition hlod.cpp:2603
virtual void Include_NULL_Lod(bool include=true)
Definition hlod.cpp:1956
virtual void Set_Hidden(int onoff)
Definition hlod.cpp:3630
virtual float Get_Post_Increment_Value(void) const
Definition hlod.cpp:3072
virtual void Delete_Decal(uint32 decal_id)
Definition hlod.cpp:3586
virtual int Get_Num_Sub_Objects(void) const
Definition hlod.cpp:2316
virtual RenderObjClass * Get_Sub_Object(int index) const
Definition hlod.cpp:2339
virtual bool Intersect_AABox(AABoxIntersectionTestClass &boxtest)
Definition hlod.cpp:2791
friend class HLodClass
Definition hlod.h:362
HLodDefClass(void)
Definition hlod.cpp:273
WW3DErrorType Save(ChunkSaveClass &csave)
Definition hlod.cpp:439
WW3DErrorType Save_Header(ChunkSaveClass &csave)
Definition hlod.cpp:476
~HLodDefClass(void)
Definition hlod.cpp:319
WW3DErrorType Save_Aggregate_Array(ChunkSaveClass &csave)
Definition hlod.cpp:555
const char * Get_Name(void) const
Definition hlod.h:314
WW3DErrorType Load_W3D(ChunkLoadClass &cload)
Definition hlod.cpp:578
void Initialize(HLodClass &src_lod)
Definition hlod.cpp:374
WW3DErrorType Save_Lod_Array(ChunkSaveClass &csave)
Definition hlod.cpp:525
virtual PrototypeClass * Load_W3D(ChunkLoadClass &cload)
Definition hlod.cpp:213
virtual int Chunk_Type(void)
Definition hlod.h:293
virtual const char * Get_Name(void) const
Definition hlod.h:375
virtual ~HLodPrototypeClass(void)
Definition hlod.h:383
virtual void DeleteSelf()
Definition hlod.h:378
HLodDefClass * Get_Definition(void) const
Definition hlod.h:380
HLodPrototypeClass(HLodDefClass *def)
Definition hlod.h:373
virtual int Get_Class_ID(void) const
Definition hlod.h:376
virtual RenderObjClass * Create(void)
Definition hlod.cpp:251
PrototypeClass(void)
Definition proto.h:90
PrototypeLoaderClass(void)
Definition proto.h:139
RenderObjClass(void)
Definition rendobj.cpp:170
HLodLoaderClass _HLodLoader
Definition hlod.cpp:145
WW3DErrorType
Definition w3derr.h:51