Richard Boegli's CnC_Generals_Zero_Hour Fork WIP
This is documentation of Richard Boegil's Zero Hour Fork
 
Loading...
Searching...
No Matches
ringobj.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/ringobj.h $*
26 * *
27 * Author:: Jason Andersen *
28 * *
29 * $Modtime:: 3/23/01 7:02p $*
30 * *
31 * $Revision:: 5 $*
32 * *
33 *---------------------------------------------------------------------------------------------*
34 * Functions: *
35 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
36
37#if defined(_MSC_VER)
38#pragma once
39#endif
40
41#ifndef RINGOBJ_H
42#define RINGOBJ_H
43
44#include "always.h"
45#include "rendobj.h"
46#include "w3d_file.h"
47#include "shader.h"
48#include "proto.h"
49#include "obbox.h"
50#include "quat.h"
51#include "vector3.h"
52#include "vector2.h"
53#include "prim_anim.h"
54
56
60
61
67{
68 uint32 Version; // file format version
69 uint32 Attributes; // box attributes (above #define's)
70 char Name[2*W3D_NAME_LEN]; // name is in the form <containername>.<boxname>
71
72 W3dVectorStruct Center; // center of the box
73 W3dVectorStruct Extent; // extent of the box
74
75 float AnimDuration; // Animation time (in seconds)
76
81
84
88
89 //
90 // Note this structure is followed by a series of
91 // W3dRingKeyArrayStruct structures which define the
92 // variable set of keyframes for each channel
93};
94
95// Note: RING_NUM_LOD does not include the NULL LOD.
96#define RING_NUM_LOD (20)
97#define RING_LOWEST_LOD (10)
98#define RING_HIGHEST_LOD (50)
99
100/*
101** RingRenderObjClass: Procedurally generated render rings
102**
103*/
105{
106
107public:
108
109 // These are bit masks, so they should enum 1,2,4,8,10,20,40 etc...
111 USE_CAMERA_ALIGN = 0x00000001,
113 };
114
115 RingRenderObjClass(void);
120
122 // Render Object Interface
124 virtual RenderObjClass * Clone(void) const;
125 virtual int Class_ID(void) const;
126 virtual void Render(RenderInfoClass & rinfo);
127 virtual void Special_Render(SpecialRenderInfoClass & rinfo);
128 virtual void Set_Transform(const Matrix3D &m);
129 virtual void Set_Position(const Vector3 &v);
130 virtual void Get_Obj_Space_Bounding_Sphere(SphereClass & sphere) const;
131 virtual void Get_Obj_Space_Bounding_Box(AABoxClass & box) const;
132
133 virtual void Prepare_LOD(CameraClass &camera);
134 virtual void Increment_LOD(void);
135 virtual void Decrement_LOD(void);
136 virtual float Get_Cost(void) const;
137 virtual float Get_Value(void) const;
138 virtual float Get_Post_Increment_Value(void) const;
139 virtual void Set_LOD_Level(int lod);
140 virtual int Get_LOD_Level(void) const;
141 virtual int Get_LOD_Count(void) const;
142 virtual void Set_LOD_Bias(float bias) { LODBias = MAX(bias, 0.0f); }
143 virtual int Calculate_Cost_Value_Arrays(float screen_area, float *values, float *costs) const;
144
145 virtual void Scale(float scale);
146 virtual void Scale(float scalex, float scaley, float scalez);
147
148 virtual void Set_Hidden(int onoff) { RenderObjClass::Set_Hidden (onoff); Update_On_Visibilty (); }
149 virtual void Set_Visible(int onoff) { RenderObjClass::Set_Visible (onoff); Update_On_Visibilty (); }
152
153 const AABoxClass & Get_Box(void);
154
155 virtual int Get_Num_Polys(void) const;
156 virtual const char *Get_Name(void) const;
157 virtual void Set_Name(const char * name);
158
159 unsigned int Get_Flags(void) {return Flags;}
160 void Set_Flags(unsigned int flags) { Flags = flags; }
161 void Set_Flag(unsigned int flag, bool onoff) { Flags &= (~flag); if (onoff) Flags |= flag; }
162
163 // Animation access
164 bool Is_Animating (void) { return IsAnimating; }
165 void Start_Animating (void) { IsAnimating = true; anim_time = 0; }
166 void Stop_Animating (void) { IsAnimating = false; anim_time = 0; }
167
168 // Texture tiling access
169 int Get_Texture_Tiling (void) const { return TextureTileCount; }
170 void Set_Texture_Tiling (int count) { TextureTileCount = count; }
171
172 // Current state access
173 void Set_Color(const Vector3 & color) { Color = color; }
174 void Set_Alpha(float alpha) { Alpha = alpha; }
177
178 const Vector3 & Get_Color(void) const { return Color; }
179 float Get_Alpha(void) const { return Alpha; }
180 const Vector2 & Get_Inner_Scale(void) const { return InnerScale; }
181 const Vector2 & Get_Outer_Scale(void) const { return OuterScale; }
182
183 Vector3 Get_Default_Color(void) const;
184 float Get_Default_Alpha(void) const;
187
188 // Size/position methods
189 const Vector2 & Get_Inner_Extent (void) const { return InnerExtent; }
190 const Vector2 & Get_Outer_Extent (void) const { return OuterExtent; }
191 void Set_Inner_Extent (const Vector2 &extent);
192 void Set_Outer_Extent (const Vector2 &extent);
193 void Set_Local_Center_Extent(const Vector3 & center,const Vector3 & extent);
194 void Set_Local_Min_Max(const Vector3 & min,const Vector3 & max);
195
196 // Texture access
197 void Set_Texture(TextureClass *tf);
200 void Set_Shader(ShaderClass &shader) { RingShader = shader; }
201
202 // Animation Control
203 float Get_Animation_Duration(void) const { return AnimDuration; }
205 void Restart_Animation (void) { anim_time = 0; }
206
207 // Animatable channel access
210
213
216
219
224
225protected:
226
227 virtual void update_cached_box(void);
228 void Update_On_Visibilty(void);
229
230 // Initialization stuff
231 void Init_Material (void);
232 static void Generate_Shared_Mesh_Arrays (void);
233
234
235 // Animation Stuff
236 void animate(void); // animation update function
237 float anim_time; // what time in seconds are we in the animation
240
241 // LOD Stuff
242 void calculate_value_array(float screen_area, float *values) const;
243 float LODBias;
245 float Value[RING_NUM_LOD + 2];// Value array needs # of LODs + 1 (RING_NUM_LOD doesn't include null LOD)
246
251
252 void update_mesh_data(const Vector3 & center,const Vector3 & extent);
253 void render_ring(RenderInfoClass & rinfo,const Vector3 & center,const Vector3 & extent);
254 void vis_render_ring(SpecialRenderInfoClass & rinfo,const Vector3 & center,const Vector3 & extent);
255
259
262
264
265 // Current State
267 float Alpha;
270
271 // Flags
272 unsigned int Flags;
273
277
279
280 // Friend classes
281 friend class RingPrototypeClass;
282};
283
285{
286 InnerExtent = extent;
287}
288
290{
291 OuterExtent = extent;
292 ObjSpaceExtent.X = extent.X;
293 ObjSpaceExtent.Y = extent.Y;
294 ObjSpaceExtent.Z = 0;
296}
297
298inline void RingRenderObjClass::Set_Local_Center_Extent(const Vector3 & center,const Vector3 & extent)
299{
300 ObjSpaceCenter = center;
301 ObjSpaceExtent = extent;
303}
304
306{
307 ObjSpaceCenter = (max + min) / 2.0f;
308 ObjSpaceExtent = (max - min) / 2.0f;
310}
311
313{
316 return CachedBox;
317}
318
319/*
320** Loader for rings
321*/
323{
324public:
325 virtual int Chunk_Type (void) { return W3D_CHUNK_RING; }
326 virtual PrototypeClass * Load_W3D(ChunkLoadClass & cload);
327};
328
329/*
330** Prototype for Ring objects
331*/
333{
335
336public:
337 RingPrototypeClass (void);
339
340 virtual const char * Get_Name(void) const;
341 virtual int Get_Class_ID(void) const;
342 virtual RenderObjClass * Create(void);
343 virtual void DeleteSelf() { delete this; }
344
345 bool Load (ChunkLoadClass &cload);
346 bool Save (ChunkSaveClass &csave);
347
348protected:
349 ~RingPrototypeClass (void);
350
351private:
352 W3dRingStruct Definition;
353
354 RingColorChannelClass ColorChannel;
355 RingAlphaChannelClass AlphaChannel;
356 RingScaleChannelClass InnerScaleChannel;
357 RingScaleChannelClass OuterScaleChannel;
358};
359
360/*
361** Instance of the loader which the asset manager installs
362*/
364
365
366#endif // RINGOBJ_H
367
368// EOF - ringobj,h
369
370
#define min(x, y)
Definition BaseType.h:101
#define max(x, y)
Definition BaseType.h:105
Color scale(const Color &a, const Color &b)
Definition GameMtl.cpp:722
#define W3D_NAME_LEN
Definition w3d_file.h:319
@ W3D_CHUNK_RING
Definition w3d_file.h:475
#define W3DMPO_GLUE(ARGCLASS)
Definition always.h:120
#define MAX(a, b)
Definition always.h:185
unsigned long uint32
Definition bittype.h:46
PrototypeClass(void)
Definition proto.h:90
PrototypeLoaderClass(void)
Definition proto.h:139
RenderObjClass(void)
Definition rendobj.cpp:170
virtual void Set_Visible(int onoff)
Definition rendobj.h:465
virtual void Set_Hidden(int onoff)
Definition rendobj.h:472
virtual void Set_Force_Visible(int onoff)
Definition rendobj.h:476
virtual void Validate_Transform(void) const
Definition rendobj.cpp:464
virtual void Set_Animation_Hidden(int onoff)
Definition rendobj.h:474
virtual int Chunk_Type(void)
Definition ringobj.h:325
virtual PrototypeClass * Load_W3D(ChunkLoadClass &cload)
Definition ringobj.cpp:1194
bool Save(ChunkSaveClass &csave)
Definition ringobj.cpp:1318
virtual const char * Get_Name(void) const
Definition ringobj.cpp:1262
bool Load(ChunkLoadClass &cload)
Definition ringobj.cpp:1281
virtual RenderObjClass * Create(void)
Definition ringobj.cpp:1354
virtual void DeleteSelf()
Definition ringobj.h:343
virtual int Get_Class_ID(void) const
Definition ringobj.cpp:1267
ShaderClass & Get_Shader(void)
Definition ringobj.h:199
void Update_On_Visibilty(void)
Definition ringobj.cpp:1115
virtual float Get_Post_Increment_Value(void) const
Definition ringobj.cpp:995
Vector2 OuterScale
Definition ringobj.h:269
virtual RenderObjClass * Clone(void) const
Definition ringobj.cpp:635
virtual const char * Get_Name(void) const
Definition ringobj.cpp:484
~RingRenderObjClass(void)
Definition ringobj.cpp:305
virtual int Calculate_Cost_Value_Arrays(float screen_area, float *values, float *costs) const
Definition ringobj.cpp:1015
ShaderClass RingShader
Definition ringobj.h:275
Vector2 Get_Default_Outer_Scale(void) const
Definition ringobj.cpp:830
virtual int Class_ID(void) const
Definition ringobj.cpp:653
virtual void Set_Force_Visible(int onoff)
Definition ringobj.h:151
float Get_Animation_Duration(void) const
Definition ringobj.h:203
const AABoxClass & Get_Box(void)
Definition ringobj.h:312
Vector3 ObjSpaceExtent
Definition ringobj.h:258
RingScaleChannelClass & Get_Inner_Scale_Channel(void)
Definition ringobj.h:214
void Set_Texture_Tiling(int count)
Definition ringobj.h:170
void Set_Alpha_Channel(const RingAlphaChannelClass &data)
Definition ringobj.h:221
RingScaleChannelClass OuterScaleChannel
Definition ringobj.h:250
static void Generate_Shared_Mesh_Arrays(void)
Definition ringobj.cpp:367
virtual float Get_Value(void) const
Definition ringobj.cpp:990
virtual void Scale(float scale)
Definition ringobj.cpp:1039
virtual void Set_Hidden(int onoff)
Definition ringobj.h:148
void Set_Outer_Scale(const Vector2 &scale)
Definition ringobj.h:176
void Set_Texture(TextureClass *tf)
Definition ringobj.cpp:466
virtual float Get_Cost(void) const
Definition ringobj.cpp:985
void Set_Flags(unsigned int flags)
Definition ringobj.h:160
void Set_Inner_Extent(const Vector2 &extent)
Definition ringobj.h:284
virtual void Get_Obj_Space_Bounding_Sphere(SphereClass &sphere) const
Definition ringobj.cpp:938
void calculate_value_array(float screen_area, float *values) const
Definition ringobj.cpp:394
const RingScaleChannelClass & Peek_Outer_Scale_Channel(void)
Definition ringobj.h:218
virtual void Render(RenderInfoClass &rinfo)
Definition ringobj.cpp:671
virtual void Increment_LOD(void)
Definition ringobj.cpp:975
const Vector2 & Get_Outer_Scale(void) const
Definition ringobj.h:181
RingColorChannelClass ColorChannel
Definition ringobj.h:247
void Set_Outer_Extent(const Vector2 &extent)
Definition ringobj.h:289
Vector3 Get_Default_Color(void) const
Definition ringobj.cpp:752
TextureClass * RingTexture
Definition ringobj.h:276
TextureClass * Peek_Texture(void)
Definition ringobj.h:198
void Restart_Animation(void)
Definition ringobj.h:205
const RingScaleChannelClass & Peek_Inner_Scale_Channel(void)
Definition ringobj.h:215
void Start_Animating(void)
Definition ringobj.h:165
void Stop_Animating(void)
Definition ringobj.h:166
void Set_Color(const Vector3 &color)
Definition ringobj.h:173
friend class RingPrototypeClass
Definition ringobj.h:281
AABoxClass CachedBox
Definition ringobj.h:278
char Name[2 *W3D_NAME_LEN]
Definition ringobj.h:256
const Vector2 & Get_Inner_Extent(void) const
Definition ringobj.h:189
virtual int Get_Num_Polys(void) const
Definition ringobj.cpp:449
bool Is_Animating(void)
Definition ringobj.h:164
void Set_Inner_Scale(const Vector2 &scale)
Definition ringobj.h:175
RingColorChannelClass & Get_Color_Channel(void)
Definition ringobj.h:208
void Init_Material(void)
Definition ringobj.cpp:418
virtual void Get_Obj_Space_Bounding_Box(AABoxClass &box) const
Definition ringobj.cpp:957
void Set_Local_Center_Extent(const Vector3 &center, const Vector3 &extent)
Definition ringobj.h:298
void animate(void)
Definition ringobj.cpp:1140
void Set_Local_Min_Max(const Vector3 &min, const Vector3 &max)
Definition ringobj.h:305
const Vector3 & Get_Color(void) const
Definition ringobj.h:178
Vector2 OuterExtent
Definition ringobj.h:261
virtual int Get_LOD_Level(void) const
Definition ringobj.cpp:1005
RingRenderObjClass & operator=(const RingRenderObjClass &)
Definition ringobj.cpp:324
const RingAlphaChannelClass & Peek_Alpha_Channel(void)
Definition ringobj.h:212
RingScaleChannelClass & Get_Outer_Scale_Channel(void)
Definition ringobj.h:217
void Set_Outer_Scale_Channel(const RingScaleChannelClass &data)
Definition ringobj.h:223
virtual void Special_Render(SpecialRenderInfoClass &rinfo)
Definition ringobj.cpp:856
Vector2 Get_Default_Inner_Scale(void) const
Definition ringobj.cpp:804
unsigned int Flags
Definition ringobj.h:272
virtual void Decrement_LOD(void)
Definition ringobj.cpp:980
float Get_Default_Alpha(void) const
Definition ringobj.cpp:778
void vis_render_ring(SpecialRenderInfoClass &rinfo, const Vector3 &center, const Vector3 &extent)
Definition ringobj.cpp:617
virtual void Set_Visible(int onoff)
Definition ringobj.h:149
void Set_Alpha(float alpha)
Definition ringobj.h:174
RingScaleChannelClass InnerScaleChannel
Definition ringobj.h:249
void Set_Flag(unsigned int flag, bool onoff)
Definition ringobj.h:161
Vector2 InnerScale
Definition ringobj.h:268
VertexMaterialClass * RingMaterial
Definition ringobj.h:274
RingAlphaChannelClass & Get_Alpha_Channel(void)
Definition ringobj.h:211
void update_mesh_data(const Vector3 &center, const Vector3 &extent)
RingAlphaChannelClass AlphaChannel
Definition ringobj.h:248
Vector3 ObjSpaceCenter
Definition ringobj.h:257
virtual void Set_Name(const char *name)
Definition ringobj.cpp:502
virtual void Set_Position(const Vector3 &v)
Definition ringobj.cpp:900
void Set_Animation_Duration(float time)
Definition ringobj.h:204
void Set_Shader(ShaderClass &shader)
Definition ringobj.h:200
float Value[RING_NUM_LOD+2]
Definition ringobj.h:245
virtual void Set_LOD_Bias(float bias)
Definition ringobj.h:142
virtual void Set_Animation_Hidden(int onoff)
Definition ringobj.h:150
unsigned int Get_Flags(void)
Definition ringobj.h:159
virtual void Set_Transform(const Matrix3D &m)
Definition ringobj.cpp:881
const RingColorChannelClass & Peek_Color_Channel(void)
Definition ringobj.h:209
float Get_Alpha(void) const
Definition ringobj.h:179
virtual void Set_LOD_Level(int lod)
Definition ringobj.cpp:1000
virtual int Get_LOD_Count(void) const
Definition ringobj.cpp:1010
virtual void Prepare_LOD(CameraClass &camera)
Definition ringobj.cpp:964
const Vector2 & Get_Outer_Extent(void) const
Definition ringobj.h:190
virtual void update_cached_box(void)
Definition ringobj.cpp:919
const Vector2 & Get_Inner_Scale(void) const
Definition ringobj.h:180
void Set_Inner_Scale_Channel(const RingScaleChannelClass &data)
Definition ringobj.h:222
int Get_Texture_Tiling(void) const
Definition ringobj.h:169
void Set_Color_Channel(const RingColorChannelClass &data)
Definition ringobj.h:220
void render_ring(RenderInfoClass &rinfo, const Vector3 &center, const Vector3 &extent)
Definition ringobj.cpp:521
Vector2 InnerExtent
Definition ringobj.h:260
float Y
Definition vector2.h:79
float X
Definition vector2.h:74
RingLoaderClass _RingLoader
Definition ringobj.cpp:1392
LERPAnimationChannelClass< Vector2 > RingScaleChannelClass
Definition ringobj.h:59
LERPAnimationChannelClass< float > RingAlphaChannelClass
Definition ringobj.h:58
#define RING_NUM_LOD
Definition ringobj.h:96
LERPAnimationChannelClass< Vector3 > RingColorChannelClass
Definition ringobj.h:57
W3dVectorStruct Center
Definition ringobj.h:72
W3dShaderStruct Shader
Definition ringobj.h:86
W3dVectorStruct DefaultColor
Definition ringobj.h:77
uint32 Version
Definition ringobj.h:68
Vector2 OuterExtent
Definition ringobj.h:83
Vector2 InnerExtent
Definition ringobj.h:82
uint32 Attributes
Definition ringobj.h:69
int TextureTileCount
Definition ringobj.h:87
char Name[2 *W3D_NAME_LEN]
Definition ringobj.h:70
Vector2 DefaultInnerScale
Definition ringobj.h:79
W3dVectorStruct Extent
Definition ringobj.h:73
char TextureName[2 *W3D_NAME_LEN]
Definition ringobj.h:85
float DefaultAlpha
Definition ringobj.h:78
Vector2 DefaultOuterScale
Definition ringobj.h:80
float AnimDuration
Definition ringobj.h:75
unsigned char flag
Definition vchannel.cpp:273