Richard Boegli's CnC_Generals_Zero_Hour Fork WIP
This is documentation of Richard Boegil's Zero Hour Fork
 
Loading...
Searching...
No Matches
streak.cpp
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 : G *
24 * *
25 * $Archive:: /VSS_Sync/ww3d2/segline.cpp $*
26 * *
27 * $Author:: Vss_sync $*
28 * *
29 * $Modtime:: 8/29/01 7:29p $*
30 * *
31 * $Revision:: 23 $*
32 * *
33 *---------------------------------------------------------------------------------------------*
34 * Functions: *
35 * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
36
37#include "streak.h"
38#include "ww3d.h"
39#include "rinfo.h"
40#include "predlod.h"
41#include "v3_rnd.h"
42#include "texture.h"
43#include "coltest.h"
44#include "w3d_file.h"
45#include "texture.h"
46#include "dx8wrapper.h"
47#include "vp.h"
48#include "vector3i.h"
49#include "sortingrenderer.h"
50
51static SegLineRendererClass _LineRenderer;
52
53
54/*
55** StreakLineClass implementation:
56*/
57
59 MaxSubdivisionLevels(0),
60 NormalizedScreenArea(0.0f)
61{
62 Personalities = NULL;
63
64}
65
67 MaxSubdivisionLevels(src.MaxSubdivisionLevels),
68 NormalizedScreenArea(src.NormalizedScreenArea),
69 PointLocations(src.PointLocations),
70 PointColors(src.PointColors),
71 PointWidths(src.PointWidths),
72 LineRenderer(src.LineRenderer),
73 StreakRenderer(src.StreakRenderer),
74 Personalities(src.Personalities)
75{
76}
77
79{
81
82 if (this != &that) {
83
84 MaxSubdivisionLevels = that.MaxSubdivisionLevels;
85 NormalizedScreenArea = that.NormalizedScreenArea;
86 PointLocations = that.PointLocations;
87 PointColors = that.PointColors;
88 PointWidths = that.PointWidths;
89 LineRenderer = that.LineRenderer;
90 StreakRenderer = that.StreakRenderer;
91 Personalities = that.Personalities;
92 }
93
94 return * this;
95}
96
97//StreakLineClass::~StreakLineClass(void)
98//{
99//}
100
101
102
103
104
106{
107 LineRenderer.Reset_Line();
108 StreakRenderer.Reset_Line();
109}
110
111
112
113
114
118// These are segment points, and include the start and end point of the
119// entire line. Therefore there must be at least two.
120void StreakLineClass::Set_Locs( unsigned int num_points, Vector3 *locs )
121{
122 if (num_points < 2 || !locs) {
123 WWASSERT(0);
124 return;
125 }
126
127 PointLocations.Delete_All();
128 for (unsigned int i=0; i<num_points; i++) {
129 PointLocations.Add(locs[i],num_points);
130 }
131
133}
134
135void StreakLineClass::Set_Widths( unsigned int num_points, float *widths )
136{
137 if (num_points < 2 || !widths) {
138 WWASSERT(0);
139 return;
140 }
141
142 PointWidths.Delete_All();
143 for (unsigned int i=0; i<num_points; i++) {
144 PointWidths.Add(widths[i],num_points);
145 }
146
147}
148
149void StreakLineClass::Set_Colors( unsigned int num_points, Vector4 *colors )
150{
151 if (num_points < 2 || !colors) {
152 WWASSERT(0);
153 return;
154 }
155
156 PointColors.Delete_All();
157 for (unsigned int i=0; i<num_points; i++) {
158 PointColors.Add(colors[i],num_points);
159 }
160
161}
162
163void StreakLineClass::Set_LocsWidthsColors( unsigned int num_points,
164 Vector3 *locs,
165 float *widths,
166 Vector4 *colors,
167 unsigned int *personalities)
168{
169
170 Personalities = personalities;
171
172 Set_Locs( num_points, locs );
173
174 if (widths)
175 {
176 Set_Widths( num_points, widths );
177
178 //sanity check
179 int locCount = PointLocations.Count();
180 int widCount = PointWidths.Count();
181 WWASSERT(locCount == widCount);
182
183 }
184
185 if (colors)
186 {
187 Set_Colors( num_points, colors );
188
189 //sanity check
190 int locCount = PointLocations.Count();
191 int colCount = PointColors.Count();
192 WWASSERT(locCount == colCount);
193
194 }
195
196
198}
199
200
201
205
206
207
208
209
210
211
212// These are segment points, and include the start and end point of the
213// entire line. Therefore there must be at least two.
215{
216 int locCount = PointLocations.Count();
217 return locCount;
218}
219
220// Set object-space location for a given point.
221// NOTE: If given position beyond end of point list, do nothing.
222void StreakLineClass::Set_Point_Location(unsigned int point_idx, const Vector3 &location)
223{
224 if (point_idx < (unsigned int)PointLocations.Count()) {
225 PointLocations[point_idx] = location;
226 }
228}
229
230// Get object-space location of a given point (if position beyond end of
231// point list, will return 0,0,0).
232void StreakLineClass::Get_Point_Location(unsigned int point_idx, Vector3 &loc)
233{
234 if (point_idx < (unsigned int)PointLocations.Count()) {
235 loc.Set(PointLocations[point_idx]);
236 } else {
237 loc.Set(0, 0, 0);
238 }
239}
240
242{
243 PointLocations.Add(location);
244}
245
246void StreakLineClass::Delete_Point(unsigned int point_idx)
247{
248 if (point_idx < (unsigned int)PointLocations.Count()) {
249 PointLocations.Delete(point_idx);
250 }
251}
252
253
255{
256 return LineRenderer.Get_Texture();
257}
258
260{
261 return LineRenderer.Get_Shader();
262}
263
265{
266 color.Set(LineRenderer.Get_Color());
267}
268
270{
271 return LineRenderer.Get_Opacity();
272}
273
275{
276 return LineRenderer.Get_Noise_Amplitude();
277}
278
280{
281 return LineRenderer.Get_Merge_Abort_Factor();
282}
283
285{
286 return MaxSubdivisionLevels;
287}
288
290{
291 return LineRenderer.Get_Texture_Mapping_Mode();
292}
293
295{
296 return LineRenderer.Get_Texture_Tile_Factor();
297}
298
300{
301 return LineRenderer.Get_UV_Offset_Rate();
302}
303
305{
306 return LineRenderer.Is_Merge_Intersections();
307}
308
310{
311 return LineRenderer.Is_Freeze_Random();
312}
313
315{
316 return LineRenderer.Is_Sorting_Disabled();
317}
318
320{
321 return LineRenderer.Are_End_Caps_Enabled();
322}
323
325{
326 LineRenderer.Set_Texture(texture);
327 StreakRenderer.Set_Texture(texture);
328}
329
331{
332 LineRenderer.Set_Shader(shader);
333 StreakRenderer.Set_Shader(shader);
334}
335
337{
338 return LineRenderer.Get_Width();
339}
340
342{
343 // Widths need to be clamped because they are not automatically clamped later (like colors and
344 // alphas are).
345 LineRenderer.Set_Width(MAX(width, 0.0f));
346 StreakRenderer.Set_Width(MAX(width, 0.0f));
347
349}
350
352{
353 LineRenderer.Set_Color(color);
354 StreakRenderer.Set_Color(color);
355}
356
358{
359 LineRenderer.Set_Opacity(opacity);
360 StreakRenderer.Set_Opacity(opacity);
361}
362
364{
365 LineRenderer.Set_Noise_Amplitude(WWMath::Fabs(amplitude));
366
368}
369
371{
372 LineRenderer.Set_Merge_Abort_Factor(factor);
373}
374
376{
377 MaxSubdivisionLevels = MIN(levels, MAX_SEGLINE_SUBDIV_LEVELS);
378
380}
381
383{
384 LineRenderer.Set_Texture_Mapping_Mode(mode);
385}
386
388{
389 LineRenderer.Set_Texture_Tile_Factor(factor);
390}
391
393{
394 LineRenderer.Set_UV_Offset_Rate(rate);
395}
396
398{
399 LineRenderer.Set_Merge_Intersections(onoff);
400}
401
403{
404 LineRenderer.Set_Freeze_Random(onoff);
405}
406
407
409{
410 LineRenderer.Set_Disable_Sorting(onoff);
411}
412
414{
415 LineRenderer.Set_End_Caps(onoff);
416}
417
418/*
419** RenderObjClass interface:
420*/
421
423{
424 return NEW_REF( StreakLineClass, (*this));
425}
426
428{
429 int subdivision_factor = 1 << LineRenderer.Get_Current_Subdivision_Level();
430 return 2 * (PointLocations.Count() - 1) * subdivision_factor;
431}
432
434{
435 if (Is_Not_Hidden_At_All() == false) {
436 return ;
437 }
438
439 // Process texture reductions:
440// if (LineRenderer.Peek_Texture()) LineRenderer.Peek_Texture()->Process_Reduction();
441
442 unsigned int sort_level = SORT_LEVEL_NONE;
443
445 sort_level=Get_Shader().Guess_Sort_Level();
446
448
449 WW3D::Add_To_Static_Sort_List(this, sort_level);
450
451 }
452 else
453 {
454 if ( !PointColors.Count() || !PointWidths.Count() )
455 {
456 Render_Seg_Line(rinfo);
457 }
458 else
459 {
460 Render_Streak_Line(rinfo);
461 }
462 }
463}
464
466{
467 // Get object-space bounding box and create bounding sphere from it
468 AABoxClass box;
470
471 // Create object-space bounding sphere from the bounding box:
472 sphere.Center = box.Center;
473 sphere.Radius = box.Extent.Length();
474}
475
477{
478 unsigned int num_points = PointLocations.Count();
479
480 // Line must have at least two points to be valid
481
482 if (num_points >= 2) {
483
484 // Find object-space axis-aligned bounding box
485 Vector3 max_coords;
486 Vector3 min_coords;
487 unsigned int i;
488
489 // We create two bounding boxes; one from the points, and if we have random noise
490 // subdivision we create another one from the midpoints and factor the noise amplitude
491 // into the second box, and then combine the two.
492
493 // First bounding box:
494 max_coords = PointLocations[0];
495 min_coords = PointLocations[0];
496 for (i = 1; i < num_points; i++) {
497 max_coords.Update_Max(PointLocations[i]);
498 min_coords.Update_Min(PointLocations[i]);
499 }
500 // Enlarge bounding box by half the width
501 float enlarge_factor = LineRenderer.Get_Width() * 0.5f;
502 Vector3 enlarge_offset;
503 enlarge_offset.Set(enlarge_factor, enlarge_factor, enlarge_factor);
504 max_coords += enlarge_offset;
505 min_coords -= enlarge_offset;
506
507 if (MaxSubdivisionLevels > 0) {
508 // Second bounding box:
509 Vector3 max_coords2;
510 Vector3 min_coords2;
511 Vector3 midpoint = (PointLocations[0] + PointLocations[1]) * 0.5f;
512 max_coords2 = midpoint;
513 min_coords2 = midpoint;
514 for (i = 1; i < num_points - 1; i++) {
515 midpoint = (PointLocations[i] + PointLocations[i + 1]) * 0.5f;
516 max_coords2.Update_Max(midpoint);
517 min_coords2.Update_Min(midpoint);
518 }
519
520 // We ignore the actual number of subdivision levels: we multiply the random noise
521 // amplitude by 2, which is the limit as the number of subdivision levels goes to
522 // infinity.
523 enlarge_factor += (2 * LineRenderer.Get_Noise_Amplitude());
524 enlarge_offset.Set(enlarge_factor, enlarge_factor, enlarge_factor);
525 max_coords2 += enlarge_offset;
526 min_coords2 -= enlarge_offset;
527
528 // Combine the two:
529 max_coords.Update_Max(max_coords2);
530 min_coords.Update_Min(min_coords2);
531 }
532
533 box.Init_Min_Max(min_coords, max_coords);
534
535 } else {
536 // Invalid line - return something
537 box.Init(Vector3(0,0,0),Vector3(1,1,1));
538 }
539}
540
542{
543 // Find the maximum screen dimension of the object in pixels
544 NormalizedScreenArea = Get_Screen_Size(camera);
545
546// // Find and set texture reduction factor
547// Set_Texture_Reduction_Factor(Calculate_Texture_Reduction_Factor(NormalizedScreenArea));
548
549 // Ensure subdivision level is legal
550 unsigned int lvl = LineRenderer.Get_Current_Subdivision_Level();
551 lvl = MIN(lvl, MaxSubdivisionLevels);
552 LineRenderer.Set_Current_Subdivision_Level(lvl);
553
554 // Prepare LOD processing if the line has subdivision enabled:
555 if (MaxSubdivisionLevels > 0) {
556 // Add myself to the LOD optimizer:
558 } else {
559 // Not added to optimizer, need to add cost
561 }
562}
563
565{
566 unsigned int lvl = LineRenderer.Get_Current_Subdivision_Level();
567
568 lvl = MIN(lvl+1,MaxSubdivisionLevels);
569
570 LineRenderer.Set_Current_Subdivision_Level(lvl);
571}
572
574{
575 int lvl = LineRenderer.Get_Current_Subdivision_Level();
576 if (lvl == 0) return;
577 LineRenderer.Set_Current_Subdivision_Level(lvl-1);
578}
579
581{
582 return Get_Num_Polys();
583}
584
586{
587 // If we are at the minimum LOD, we must return AT_MIN_LOD.
588 if (LineRenderer.Get_Current_Subdivision_Level() == 0) {
589 return AT_MIN_LOD;
590 } else {
591 float polycount = (float)Get_Num_Polys();
592 float benefit_factor = 1.0f - (0.5f / (polycount * polycount));
593 return (benefit_factor * NormalizedScreenArea) / Get_Cost();
594 }
595}
596
598{
599 // If we are at the maximum LOD, we must return AT_MIN_LOD.
600 if (LineRenderer.Get_Current_Subdivision_Level() == MaxSubdivisionLevels) {
601 return AT_MAX_LOD;
602 } else {
603 // Assumption: each subdivision level doubles polycount
604 float polycount = 2.0f * (float)Get_Num_Polys();
605 float benefit_factor = 1.0f - (0.5f / (polycount * polycount));
606 // Assumption: Cost() == polycount
607 return (benefit_factor * NormalizedScreenArea) / polycount;
608 }
609}
610
612{
613 lod = MAX(0, lod);
614 lod = MIN(lod, (int)MaxSubdivisionLevels);
615
616 LineRenderer.Set_Current_Subdivision_Level((unsigned int)lod);
617}
618
620{
621 return (int) LineRenderer.Get_Current_Subdivision_Level();
622}
623
625{
626 return (int)MaxSubdivisionLevels;
627}
628/*
629void StreakLineClass::Set_Texture_Reduction_Factor(float trf)
630{
631 if (LineRenderer.Peek_Texture()) LineRenderer.Peek_Texture()->Set_Reduction_Factor(trf);
632}*/
633
634
635
637{
638 // Line must have at least two points to be valid
639 if (PointLocations.Count() < 2) return;
640
641 SphereClass bounding_sphere;
642 Get_Obj_Space_Bounding_Sphere(bounding_sphere);
643
644// LineRenderer.Set_Width(rand()%3);
645
646 LineRenderer.Render(
647 rinfo,
648 Transform,
649 PointLocations.Count(),
650 &(PointLocations[0]),
651 bounding_sphere
652 );
653}
654
655
657{
658
659 WWASSERT(PointLocations.Count() == PointColors.Count());
660 WWASSERT(PointLocations.Count() == PointWidths.Count());
661
662 // Line must have at least two points to be valid
663 if (PointLocations.Count() < 2) return;
664 if (PointColors.Count() < 2) return;
665 if (PointWidths.Count() < 2) return;
666
667 if(PointLocations.Count() != PointColors.Count()) return;
668 if(PointLocations.Count() != PointWidths.Count()) return;
669
670 SphereClass bounding_sphere;
671 Get_Obj_Space_Bounding_Sphere(bounding_sphere);
672
673
674// StreakRenderer.Render(
675// rinfo,
676// Transform,
677// PointLocations.Count(),
678// &(PointLocations[0]),
679// bounding_sphere
680// );
681 StreakRenderer.RenderStreak(
682 rinfo,
683 Transform,
684 PointLocations.Count(),
685 &(PointLocations[0]),
686 &(PointColors[0]),
687 &(PointWidths[0]),
688 bounding_sphere,
689 Personalities
690 );
691}
692
693
695{
696 if ((Get_Collision_Type() & raytest.CollisionType) == 0) return false;
697
698 bool retval = false;
699
700 //
701 // Check each line segment against the ray
702 //
703 float fraction = 1.0F;
704 for (uint32 index = 1; index < (unsigned int)PointLocations.Count(); index ++)
705 {
706#ifdef ALLOW_TEMPORARIES
707 Vector3 curr_start = Transform * PointLocations[index-1];
708 Vector3 curr_end = Transform * PointLocations[index];
709 LineSegClass line_seg (curr_start, curr_end);
710#else
711 Vector3 curr[2];
712 Transform.mulVector3Array(&PointLocations[index-1], curr, 2);
713 LineSegClass line_seg(curr[0], curr[1]);
714#endif
715
716 Vector3 p0;
717 Vector3 p1;
718 if (raytest.Ray.Find_Intersection (line_seg, &p0, &fraction, &p1, NULL)) {
719
720 //
721 // Determine if the ray was close enough to this line to be
722 // considered intersecting
723 //
724 float dist = (p0 - p1).Length ();
725 if (dist <= LineRenderer.Get_Width() && fraction >= 0 && fraction < raytest.Result->Fraction) {
726 //if (dist <= Width && fraction < raytest.Result->Fraction) {
727 retval = true;
728 break;
729 }
730 }
731 }
732
733 //
734 // Fill in the raytest structure if we were successfull
735 //
736 if (retval) {
737 raytest.Result->Fraction = fraction;
739 raytest.CollidedRenderObj = this;
740 }
741
742 return retval;
743}
744
745
#define NULL
Definition BaseType.h:92
#define WWASSERT
#define SORT_LEVEL_NONE
Definition w3d_file.h:1195
@ SURFACE_TYPE_DEFAULT
Definition w3d_file.h:1075
#define MIN(a, b)
Definition always.h:189
#define MAX(a, b)
Definition always.h:185
unsigned long uint32
Definition bittype.h:46
WWINLINE void Init(const Vector3 &center, const Vector3 &extent)
Definition aabox.h:101
Vector3 Center
Definition aabox.h:123
void Init_Min_Max(const Vector3 &min, const Vector3 &max)
Definition aabox.h:339
Vector3 Extent
Definition aabox.h:124
CastResultStruct * Result
Definition coltest.h:98
RenderObjClass * CollidedRenderObj
Definition coltest.h:100
bool Find_Intersection(const LineSegClass &other_line, Vector3 *p1, float *fraction1, Vector3 *p2, float *fraction2) const
Definition lineseg.cpp:167
static void Add_Object(RenderObjClass *robj)
Definition predlod.cpp:226
static void Add_Cost(float cost)
Definition predlod.h:67
LineSegClass Ray
Definition coltest.h:139
virtual float Get_Screen_Size(CameraClass &camera)
Definition rendobj.cpp:324
virtual int Is_Not_Hidden_At_All(void)
Definition rendobj.h:463
RenderObjClass(void)
Definition rendobj.cpp:170
void Invalidate_Cached_Bounding_Volumes(void) const
Definition rendobj.h:523
RenderObjClass & operator=(const RenderObjClass &)
Definition rendobj.cpp:232
static const float AT_MAX_LOD
Definition rendobj.h:405
Matrix3D Transform
Definition rendobj.h:549
virtual int Get_Collision_Type(void) const
Definition rendobj.h:484
static const float AT_MIN_LOD
Definition rendobj.h:404
int Guess_Sort_Level(void) const
Definition shader.cpp:1123
float Radius
Definition sphere.h:91
Vector3 Center
Definition sphere.h:90
virtual void Increment_LOD(void)
Definition streak.cpp:564
virtual void Render(RenderInfoClass &rinfo)
Definition streak.cpp:433
void Set_Opacity(float opacity)
Definition streak.cpp:357
virtual int Get_LOD_Level(void) const
Definition streak.cpp:619
void Set_LocsWidthsColors(unsigned int num_points, Vector3 *locs, float *widths=NULL, Vector4 *colors=NULL, unsigned int *personalities=NULL)
Definition streak.cpp:163
void Set_Merge_Abort_Factor(float factor)
Definition streak.cpp:370
void Render_Streak_Line(RenderInfoClass &rinfo)
Definition streak.cpp:656
SegLineRendererClass::TextureMapMode Get_Texture_Mapping_Mode(void)
Definition streak.cpp:289
StreakLineClass & operator=(const StreakLineClass &that)
Definition streak.cpp:78
void Set_Merge_Intersections(int onoff)
Definition streak.cpp:397
virtual float Get_Cost(void) const
Definition streak.cpp:580
void Set_UV_Offset_Rate(const Vector2 &rate)
Definition streak.cpp:392
void Set_Freeze_Random(int onoff)
Definition streak.cpp:402
float Get_Width(void)
Definition streak.cpp:336
int Are_End_Caps_Enabled(void)
Definition streak.cpp:319
void Set_Color(const Vector3 &color)
Definition streak.cpp:351
float Get_Opacity(void)
Definition streak.cpp:269
void Add_Point(const Vector3 &location)
Definition streak.cpp:241
void Set_End_Caps(int onoff)
Definition streak.cpp:413
void Set_Locs(unsigned int num_points, Vector3 *locs)
Definition streak.cpp:120
virtual void Decrement_LOD(void)
Definition streak.cpp:573
float Get_Texture_Tile_Factor(void)
Definition streak.cpp:294
void Set_Disable_Sorting(int onoff)
Definition streak.cpp:408
virtual int Get_Num_Polys(void) const
Definition streak.cpp:427
void Set_Texture(TextureClass *texture)
Definition streak.cpp:324
void Set_Texture_Tile_Factor(float factor)
Definition streak.cpp:387
void Reset_Line(void)
Definition streak.cpp:105
void Set_Texture_Mapping_Mode(SegLineRendererClass::TextureMapMode mode)
Definition streak.cpp:382
unsigned int Get_Subdivision_Levels(void)
Definition streak.cpp:284
virtual void Get_Obj_Space_Bounding_Sphere(SphereClass &sphere) const
Definition streak.cpp:465
virtual float Get_Value(void) const
Definition streak.cpp:585
void Get_Color(Vector3 &color)
Definition streak.cpp:264
StreakLineClass(void)
Definition streak.cpp:58
int Is_Freeze_Random(void)
Definition streak.cpp:309
int Is_Merge_Intersections(void)
Definition streak.cpp:304
virtual float Get_Post_Increment_Value(void) const
Definition streak.cpp:597
TextureClass * Get_Texture(void)
Definition streak.cpp:254
virtual void Prepare_LOD(CameraClass &camera)
Definition streak.cpp:541
void Set_Width(float width)
Definition streak.cpp:341
void Set_Noise_Amplitude(float amplitude)
Definition streak.cpp:363
float Get_Merge_Abort_Factor(void)
Definition streak.cpp:279
virtual RenderObjClass * Clone(void) const
Definition streak.cpp:422
Vector2 Get_UV_Offset_Rate(void)
Definition streak.cpp:299
virtual void Set_LOD_Level(int lod)
Definition streak.cpp:611
void Set_Point_Location(unsigned int point_idx, const Vector3 &location)
Definition streak.cpp:222
int Get_Num_Points(void)
Definition streak.cpp:214
virtual int Get_LOD_Count(void) const
Definition streak.cpp:624
ShaderClass Get_Shader(void)
Definition streak.cpp:259
virtual void Get_Obj_Space_Bounding_Box(AABoxClass &box) const
Definition streak.cpp:476
void Set_Subdivision_Levels(unsigned int levels)
Definition streak.cpp:375
void Set_Colors(unsigned int num_points, Vector4 *colors)
Definition streak.cpp:149
virtual bool Cast_Ray(RayCollisionTestClass &raytest)
Definition streak.cpp:694
void Set_Shader(ShaderClass shader)
Definition streak.cpp:330
void Get_Point_Location(unsigned int point_idx, Vector3 &loc)
Definition streak.cpp:232
void Delete_Point(unsigned int point_idx)
Definition streak.cpp:246
int Is_Sorting_Disabled(void)
Definition streak.cpp:314
void Set_Widths(unsigned int num_points, float *widths)
Definition streak.cpp:135
float Get_Noise_Amplitude(void)
Definition streak.cpp:274
void Render_Seg_Line(RenderInfoClass &rinfo)
Definition streak.cpp:636
WWINLINE void Update_Max(const Vector3 &a)
Definition vector3.h:617
WWINLINE void Update_Min(const Vector3 &a)
Definition vector3.h:597
WWINLINE float Length(void) const
Definition vector3.h:453
WWINLINE void Set(float x, float y, float z)
Definition vector3.h:103
static void Add_To_Static_Sort_List(RenderObjClass *robj, unsigned int sort_level)
Definition ww3d.cpp:1984
static bool Are_Static_Sort_Lists_Enabled(void)
Definition ww3d.h:282
static bool Is_Sorting_Enabled(void)
Definition ww3d.h:220
static WWINLINE float Fabs(float val)
Definition wwmath.h:113
else return(RetVal)
#define NEW_REF(C, P)
Definition refcount.h:62
#define MAX_SEGLINE_SUBDIV_LEVELS
uint32 SurfaceType
Definition castres.h:67