57 11, 3, 7, 14, 0, 13, 1, 2, 5, 12, 15, 6, 9, 8, 4, 10
61const static unsigned int MAX_RANDOM_ENTRIES = 32;
82{ 0,0,0.0f,1.5f,1.0f,0.0f,0.0f,0,0,0,0,0,0,0,0,0 };
87 unsigned int buffer_size,
111 MaxAge(1000.0f * max_age),
224 HasAccel = (accel.
X != 0.0f) || (accel.
Y != 0.0f) || (accel.
Z != 0.0f);
236 PointGroup->Set_Frame_Row_Column_Count_Log2(frame_mode);
247 PointGroup->Set_Frame_Row_Column_Count_Log2(frame_mode);
258 if (line_props !=
NULL) {
326 if (line_props !=
NULL) {
863 unsigned int sub1_start;
864 unsigned int sub1_end;
865 unsigned int sub2_start;
866 unsigned int sub2_end;
880 unsigned int *apt_ptr =
APT->Get_Array();
881 for (i = sub1_start; i < sub1_end; i++) {
883 apt_ptr[active_point_count++] = i;
886 for (i = sub2_start; i < sub2_end; i++) {
888 apt_ptr[active_point_count++] = i;
945 unsigned int active_point_count = 0;
1003 Vector4 default_diffuse(0, 0, 0, 0);
1004 unsigned char *ids =
GroupID->Get_Array();
1007 diffuse =
Diffuse->Get_Array();
1013 unsigned int sub1_end;
1014 unsigned int sub2_start;
1029 Vector4 *last_color = &default_diffuse;
1030 unsigned char last_id = 0;
1032 for (i =
Start; i < sub1_end; i++) {
1034 tmp_points.
Add(positions[i]);
1035 last_color = diffuse ? &diffuse[i] : &default_diffuse;
1036 tmp_diffuse.
Add(*last_color);
1038 tmp_id.
Add(last_id);
1042 for (i = sub2_start; i <
End; i++) {
1044 tmp_points.
Add(positions[i]);
1045 last_color = diffuse ? &diffuse[i] : &default_diffuse;
1046 tmp_diffuse.
Add(*last_color);
1048 tmp_id.
Add(last_id);
1056 tmp_diffuse.
Add(*last_color);
1057 tmp_id.
Add(last_id);
1061 if (tmp_points.
Count() > 0) {
1066 int count = tmp_points.
Count();
1070 while (end < count) {
1072 while ( (end < count) && (tmp_id[start] == tmp_id[end])) {
1077 if (end - start > 1) {
1081 &(tmp_points[start]),
1083 &(tmp_diffuse[start]));
1096 unsigned int active_point_count = 0;
1144 for (
unsigned int i=0; i<
MaxNum; i++) {
1215 WWPROFILE(
"ParticleBufferClass::On_Frame_Update");
1289 float width_factor = viewport.
Width() / (vpr_max.
X - vpr_min.
X);
1290 float height_factor = viewport.
Height() / (vpr_max.
Y - vpr_min.
Y);
1293 float dist = (sphere.
Center - cam).Length();
1294 float bounding_sphere_projected_radius = 0.0f;
1295 float particle_projected_radius = 0.0f;
1297 float oo_dist = 1.0f / dist;
1298 bounding_sphere_projected_radius = sphere.
Radius * oo_dist;
1299 particle_projected_radius =
MaxSize * oo_dist;
1302 float bs_rad_sq = bounding_sphere_projected_radius * bounding_sphere_projected_radius;
1303 float p_rad_sq = particle_projected_radius * particle_projected_radius *
MaxNum;
1304 float proj_area =
WWMATH_PI *
MIN(bs_rad_sq, p_rad_sq) * width_factor * height_factor;
1360 unsigned int lod = 0;
1366 float cost_factor=0.0f;
1370 cost_factor = (float)
MaxNum * 0.0625f;
1373 cost_factor = (float)
MaxNum * 2.0f * 0.0625f;
1376 cost_factor = (float) (2*
MaxNum-1) * 0.0625f;
1379 cost_factor = (float)
MaxNum * 4.0f * 0.0625f;
1382 cost_factor = (float)
MaxNum * 8.0f * 0.0625f;
1385 for (lod = 0; lod <
LodCount; lod++) {
1386 costs[lod] = cost_factor * (float)lod;
1388 costs[lod] = (costs[lod] != 0) ? costs[lod] : 0.000001f;
1414 float polycount = costs[lod];
1415 float benefit_factor = (polycount >
WWMATH_EPSILON) ? (1 - (0.5f / (polycount * polycount))) : 0.0f;
1416 values[lod] = (benefit_factor * screen_area *
LodBias) / costs[lod];
1428 unsigned int ui_previous_key_time = 0;
1429 unsigned int ui_current_key_time = 0;
1436 static const float eps_byte = 0.0038f;
1437 bool color_rand_zero = (fabs(new_props.
Rand.X) < eps_byte && fabs(new_props.
Rand.Y) < eps_byte && fabs(new_props.
Rand.Z) < eps_byte);
1443 Color->Release_Ref();
1478 ui_previous_key_time = 0;
1479 for (
unsigned int ckey = 0; ckey < new_props.
NumKeyFrames; ckey++) {
1480 ui_current_key_time = (
unsigned int)(new_props.
KeyTimes[ckey] * 1000.0f);
1481 WWASSERT(ui_current_key_time > ui_previous_key_time);
1482 if (ui_current_key_time >=
MaxAge)
break;
1483 ui_previous_key_time = ui_current_key_time;
1485 bool color_constant_at_end = (ckey == new_props.
NumKeyFrames);
1489 unsigned int new_num_color_key_frames = ckey + 1;
1515 unsigned int im1 = i - 1;
1527 if (color_constant_at_end) {
1539 if (color_rand_zero) {
1559 unsigned int default_randomizer_entries =
MIN(pot_num, MAX_RANDOM_ENTRIES);
1587 unsigned int ui_previous_key_time = 0;
1588 unsigned int ui_current_key_time = 0;
1595 static const float eps_byte = 0.0038f;
1596 bool alpha_rand_zero = (fabs(new_props.
Rand) < eps_byte);
1602 Alpha->Release_Ref();
1637 ui_previous_key_time = 0;
1638 for (
unsigned int akey = 0; akey < new_props.
NumKeyFrames; akey++) {
1639 ui_current_key_time = (
unsigned int)(new_props.
KeyTimes[akey] * 1000.0f);
1640 WWASSERT(ui_current_key_time > ui_previous_key_time);
1641 if (ui_current_key_time >=
MaxAge)
break;
1642 ui_previous_key_time = ui_current_key_time;
1644 bool alpha_constant_at_end = (akey == new_props.
NumKeyFrames);
1648 unsigned int new_num_alpha_key_frames = akey + 1;
1674 unsigned int im1 = i - 1;
1686 if (alpha_constant_at_end) {
1698 if (alpha_rand_zero) {
1716 unsigned int default_randomizer_entries =
MIN(pot_num, MAX_RANDOM_ENTRIES);
1743 unsigned int ui_previous_key_time = 0;
1744 unsigned int ui_current_key_time = 0;
1751 static const float eps_size = 1.0e-12f;
1752 bool size_rand_zero = (fabs(new_props.
Rand) < eps_size);
1758 Size->Release_Ref();
1793 ui_previous_key_time = 0;
1794 for (
unsigned int skey = 0; skey < new_props.
NumKeyFrames; skey++) {
1795 ui_current_key_time = (
unsigned int)(new_props.
KeyTimes[skey] * 1000.0f);
1796 WWASSERT(ui_current_key_time > ui_previous_key_time);
1797 if (ui_current_key_time >=
MaxAge)
break;
1798 ui_previous_key_time = ui_current_key_time;
1800 bool size_constant_at_end = (skey == new_props.
NumKeyFrames);
1804 unsigned int new_num_size_key_frames = skey + 1;
1830 unsigned int im1 = i - 1;
1842 if (size_constant_at_end) {
1865 if (size_rand_zero) {
1883 unsigned int default_randomizer_entries =
MIN(pot_num, MAX_RANDOM_ENTRIES);
1910 float oo_intmax = 1.0f / (float)INT_MAX;
1911 unsigned int ui_previous_key_time = 0;
1912 unsigned int ui_current_key_time = 0;
1922 static const float eps_orientation = 2.77777778e-4f;
1923 static const float eps_rotation = 2.77777778e-4f;
1924 bool orientation_rand_zero = fabs(orient_rnd) < eps_orientation;
1925 bool rotation_rand_zero = fabs(new_props.
Rand) < eps_rotation;
1926 if (orientation_rand_zero && rotation_rand_zero && new_props.
NumKeyFrames == 0 && fabs(new_props.
Start) < eps_rotation) {
1962 ui_previous_key_time = 0;
1963 for (
unsigned int key = 0; key < new_props.
NumKeyFrames; key++) {
1964 ui_current_key_time = (
unsigned int)(new_props.
KeyTimes[key] * 1000.0f);
1965 WWASSERT(ui_current_key_time > ui_previous_key_time);
1966 if (ui_current_key_time >=
MaxAge)
break;
1967 ui_previous_key_time = ui_current_key_time;
1969 bool rotation_constant_at_end = (key == new_props.
NumKeyFrames);
1973 unsigned int new_num_key_frames = key + 1;
2004 unsigned int im1 = i - 1;
2016 if (rotation_constant_at_end) {
2035 if (rotation_rand_zero) {
2053 unsigned int default_randomizer_entries =
MIN(pot_num, MAX_RANDOM_ENTRIES);
2074 if (orientation_rand_zero) {
2092 unsigned int default_randomizer_entries =
MIN(pot_num, MAX_RANDOM_ENTRIES);
2120 float oo_intmax = 1.0f / (float)INT_MAX;
2121 unsigned int ui_previous_key_time = 0;
2122 unsigned int ui_current_key_time = 0;
2129 static const float eps_frame = 0.1f;
2130 bool frame_rand_zero = (fabs(new_props.
Rand) < eps_frame);
2176 ui_previous_key_time = 0;
2177 for (
unsigned int key = 0; key < new_props.
NumKeyFrames; key++) {
2178 ui_current_key_time = (
unsigned int)(new_props.
KeyTimes[key] * 1000.0f);
2179 WWASSERT(ui_current_key_time > ui_previous_key_time);
2180 if (ui_current_key_time >=
MaxAge)
break;
2181 ui_previous_key_time = ui_current_key_time;
2183 bool frame_constant_at_end = (key == new_props.
NumKeyFrames);
2187 unsigned int new_num_key_frames = key + 1;
2213 unsigned int im1 = i - 1;
2225 if (frame_constant_at_end) {
2236 if (frame_rand_zero) {
2254 unsigned int default_randomizer_entries =
MIN(pot_num, MAX_RANDOM_ENTRIES);
2281 float oo_intmax = 1.0f / (float)INT_MAX;
2282 unsigned int ui_previous_key_time = 0;
2283 unsigned int ui_current_key_time = 0;
2290 static const float eps_blur = 1e-5f;
2291 bool blurtime_rand_zero = (fabs(new_blur_times.
Rand) < eps_blur);
2292 if (blurtime_rand_zero && new_blur_times.
NumKeyFrames == 0) {
2323 ui_previous_key_time = 0;
2324 for (
unsigned int key = 0; key < new_blur_times.
NumKeyFrames; key++) {
2325 ui_current_key_time = (
unsigned int)(new_blur_times.
KeyTimes[key] * 1000.0f);
2326 WWASSERT(ui_current_key_time > ui_previous_key_time);
2327 if (ui_current_key_time >=
MaxAge)
break;
2328 ui_previous_key_time = ui_current_key_time;
2330 bool blurtime_constant_at_end = (key == new_blur_times.
NumKeyFrames);
2334 unsigned int new_num_key_frames = key + 1;
2360 unsigned int im1 = i - 1;
2372 if (blurtime_constant_at_end) {
2383 if (blurtime_rand_zero) {
2401 unsigned int default_randomizer_entries =
MIN(pot_num, MAX_RANDOM_ENTRIES);
2496 if (elapsed == 0U)
return;
2534 unsigned int sub1_end;
2535 unsigned int sub2_start;
2568 position =
Position[pingpong]->Get_Array();
2570 position =
Position[0]->Get_Array();
2574 for (part =
Start; part < sub1_end; part++) {
2576 unsigned int part_age = current_time -
TimeStamp[part];
2612 size[part] = (size[part] >= 0.0f) ? size[part] : 0.0f;
2627 orientation[part] = (
uint)(((
int)(tmp_orient * 256.0f)) & 0xFF);
2642 frame[part] = (
uint)(((
int)(tmp_frame)) & 0xFF);
2669 tailposition[part]=position[part]-
Velocity[part]*blur_time*1000;
2673 for (part = sub2_start; part <
End; part++) {
2675 unsigned int part_age = current_time -
TimeStamp[part];
2712 size[part] = (size[part] >= 0.0f) ? size[part] : 0.0f;
2727 orientation[part] = (
uint)(((
int)(tmp_orient * 256.0f)) & 0xFF);
2742 frame[part] = (
uint)(((
int)(tmp_frame)) & 0xFF);
2769 tailposition[part]=position[part]-
Velocity[part]*blur_time*1000;
2800 unsigned int sub1_end;
2801 unsigned int sub2_start;
2810 for (i =
Start; i < sub1_end; i++) {
2811 max_coords.
X = max_coords.
X >= position[i].
X ? max_coords.
X : position[i].
X;
2812 max_coords.
Y = max_coords.
Y >= position[i].
Y ? max_coords.
Y : position[i].
Y;
2813 max_coords.
Z = max_coords.
Z >= position[i].
Z ? max_coords.
Z : position[i].
Z;
2814 min_coords.
X = min_coords.
X <= position[i].
X ? min_coords.
X : position[i].
X;
2815 min_coords.
Y = min_coords.
Y <= position[i].
Y ? min_coords.
Y : position[i].
Y;
2816 min_coords.
Z = min_coords.
Z <= position[i].
Z ? min_coords.
Z : position[i].
Z;
2818 for (i = sub2_start; i <
End; i++) {
2819 max_coords.
X = max_coords.
X >= position[i].
X ? max_coords.
X : position[i].
X;
2820 max_coords.
Y = max_coords.
Y >= position[i].
Y ? max_coords.
Y : position[i].
Y;
2821 max_coords.
Z = max_coords.
Z >= position[i].
Z ? max_coords.
Z : position[i].
Z;
2822 min_coords.
X = min_coords.
X <= position[i].
X ? min_coords.
X : position[i].
X;
2823 min_coords.
Y = min_coords.
Y <= position[i].
Y ? min_coords.
Y : position[i].
Y;
2824 min_coords.
Z = min_coords.
Z <= position[i].
Z ? min_coords.
Z : position[i].
Z;
2855 position =
Position[pingpong]->Get_Array();
2856 prev_pos =
Position[pingpong ^ 0x1]->Get_Array();
2858 position =
Position[0]->Get_Array();
2862 unsigned char * ids =
GroupID->Get_Array();
2874 if (age >=
MaxAge)
continue;
2875 float fp_age = (float)age;
2930 unsigned int sub1_end;
2931 unsigned int sub2_start;
2945 for (i =
Start; i < sub1_end; i++) {
2953 for (i = sub2_start; i <
End; i++) {
2970 unsigned int sub1_end;
2971 unsigned int sub2_start;
2981 float fp_elapsed_time = (float)elapsed;
2992 Vector3 accel_p =
Accel * (0.5f * fp_elapsed_time * fp_elapsed_time);
2993 for (i =
Start; i < sub1_end; i++) {
2994 position[i] = prev_pos[i] +
Velocity[i] * fp_elapsed_time + accel_p;
2997 for (i = sub2_start; i <
End; i++) {
2998 position[i] = prev_pos[i] +
Velocity[i] * fp_elapsed_time + accel_p;
3002 for (i =
Start; i < sub1_end; i++) {
3003 position[i] +=
Velocity[i] * fp_elapsed_time;
3005 for (i = sub2_start; i <
End; i++) {
3006 position[i] +=
Velocity[i] * fp_elapsed_time;
3015 Vector3 accel_p =
Accel * (0.5f * fp_elapsed_time * fp_elapsed_time);
3016 for (i =
Start; i < sub1_end; i++) {
3017 position[i] +=
Velocity[i] * fp_elapsed_time + accel_p;
3020 for (i = sub2_start; i <
End; i++) {
3021 position[i] +=
Velocity[i] * fp_elapsed_time + accel_p;
3025 for (i =
Start; i < sub1_end; i++) {
3026 position[i] +=
Velocity[i] * fp_elapsed_time;
3028 for (i = sub2_start; i <
End; i++) {
3029 position[i] +=
Velocity[i] * fp_elapsed_time;
3038 bool create_last_keyframe =
false;
3047 real_keyframe_count ++;
3048 create_last_keyframe =
true;
3061 if (real_keyframe_count > 0) {
3077 if (create_last_keyframe) {
3086 colors.
Values[index - 1] = start_color + (delta * time_delta);
3096 bool create_last_keyframe =
false;
3103 real_keyframe_count ++;
3104 create_last_keyframe =
true;
3117 if (real_keyframe_count > 0) {
3133 if (create_last_keyframe) {
3142 opacities.
Values[index - 1] = start_alpha + (delta * time_delta);
3153 bool create_last_keyframe =
false;
3160 real_keyframe_count ++;
3161 create_last_keyframe =
true;
3166 sizes.NumKeyFrames = real_keyframe_count;
3167 sizes.KeyTimes =
NULL;
3168 sizes.Values =
NULL;
3174 if (real_keyframe_count > 0) {
3175 sizes.KeyTimes =
W3DNEWARRAY float[real_keyframe_count];
3176 sizes.Values =
W3DNEWARRAY float[real_keyframe_count];
3190 if (create_last_keyframe) {
3191 sizes.KeyTimes[index - 1] = ((float)
MaxAge / 1000);
3199 sizes.Values[index - 1] = start_size + (delta * time_delta);
3210 bool create_last_keyframe =
false;
3221 real_keyframe_count ++;
3222 create_last_keyframe =
true;
3236 if (real_keyframe_count > 0) {
3252 if (create_last_keyframe) {
3261 rotations.
Values[index - 1] = (start_rotation + (delta * time_delta)) * 1000.0f;
3272 bool create_last_keyframe =
false;
3279 real_keyframe_count ++;
3280 create_last_keyframe =
true;
3293 if (real_keyframe_count > 0) {
3309 if (create_last_keyframe) {
3318 frames.
Values[index - 1] = start_frame + (delta * time_delta);
3328 bool create_last_keyframe =
false;
3335 real_keyframe_count ++;
3336 create_last_keyframe =
true;
3349 if (real_keyframe_count > 0) {
3350 blurtimes.
KeyTimes =
new float[real_keyframe_count];
3351 blurtimes.
Values =
new float[real_keyframe_count];
3365 if (create_last_keyframe) {
3374 blurtimes.
Values[index - 1] = start_blurtime + (delta * time_delta);
3383 if ((lod_level <0) || (lod_level > 17)) {
3392 if ((lod_level <0) || (lod_level > 17)) {
Color scale(const Color &a, const Color &b)
#define W3D_EMITTER_RENDER_MODE_LINEGRP_TETRA
#define W3D_EMITTER_RENDER_MODE_LINE
#define W3D_EMITTER_RENDER_MODE_LINEGRP_PRISM
#define W3D_EMITTER_RENDER_MODE_QUAD_PARTICLES
#define W3D_EMITTER_RENDER_MODE_TRI_PARTICLES
#define NO_MAX_SCREEN_SIZE
T Bound(T original, T minval, T maxval)
void Get_View_Plane(Vector2 &set_min, Vector2 &set_max) const
void Get_Viewport(Vector2 &set_min, Vector2 &set_max) const
TextureClass * Peek_Texture(void)
ShaderClass Get_Shader(void)
virtual bool Is_Complete(void)
void Reset_Blur_Times(ParticlePropertyStruct< float > &new_blur_times)
int NewParticleQueueCount
unsigned int * ColorKeyFrameTimes
ShaderClass Get_Shader(void) const
float * FrameKeyFrameDeltas
virtual int Calculate_Cost_Value_Arrays(float screen_area, float *values, float *costs) const
void Update_Bounding_Box(void)
static float Get_LOD_Max_Screen_Size(int lod_level)
float * RandomRotationEntries
ParticleEmitterClass * Emitter
SegLineRendererClass * LineRenderer
void Get_Rotation_Key_Frames(ParticlePropertyStruct< float > &rotations) const
unsigned int * BlurTimeKeyFrameTimes
unsigned int DecimationThreshold
void Get_Frame_Key_Frames(ParticlePropertyStruct< float > &frames) const
int Is_Freeze_Random(void) const
virtual void Prepare_LOD(CameraClass &camera)
virtual void Notify_Removed(SceneClass *scene)
unsigned int * FrameKeyFrameTimes
ShareBufferClass< float > * Size
ShareBufferClass< uint8 > * Frame
virtual float Get_Cost(void) const
ShareBufferClass< float > * Alpha
virtual void Scale(float scale)
unsigned int NumFrameKeyFrames
unsigned int * RotationKeyFrameTimes
unsigned int NumRandomFrameEntriesMinus1
ShareBufferClass< unsigned char > * GroupID
unsigned char CurrentGroupID
float * BlurTimeKeyFrameValues
unsigned int NumRandomBlurTimeEntriesMinus1
virtual void Render(RenderInfoClass &rinfo)
unsigned int LastUpdateTime
virtual void Increment_LOD(void)
virtual int Get_LOD_Count(void) const
virtual ~ParticleBufferClass(void)
NewParticleStruct * Add_Uninitialized_New_Particle(void)
unsigned int NumSizeKeyFrames
TailDiffuseTypeEnum Determine_Tail_Diffuse()
ShareBufferClass< Vector3 > * TailPosition
void Render_Particles(RenderInfoClass &rinfo)
ParticleBufferClass(ParticleEmitterClass *emitter, unsigned int buffer_size, ParticlePropertyStruct< Vector3 > &color, ParticlePropertyStruct< float > &opacity, ParticlePropertyStruct< float > &size, ParticlePropertyStruct< float > &rotation, float orient_rnd, ParticlePropertyStruct< float > &frame, ParticlePropertyStruct< float > &blurtime, Vector3 accel, float max_age, float future_start, TextureClass *tex, ShaderClass shader, bool pingpong, int render_mode, int frame_mode, const W3dEmitterLinePropertiesStruct *line_props)
void Set_Texture(TextureClass *tex)
unsigned int FutureStartTime
float * RandomAlphaEntries
void Get_Size_Key_Frames(ParticlePropertyStruct< float > &sizes) const
void Generate_APT(ShareBufferClass< unsigned int > **apt, unsigned int &active_point_count)
void Update_Visual_Particle_State(void)
void Get_Opacity_Key_Frames(ParticlePropertyStruct< float > &opacities) const
float * AlphaKeyFrameValues
float Get_Merge_Abort_Factor(void) const
float * AlphaKeyFrameDeltas
float Get_Texture_Tile_Factor(void) const
ShareBufferClass< Vector4 > * Diffuse
LineGroupClass * LineGroup
ShareBufferClass< unsigned int > * APT
virtual RenderObjClass * Clone(void) const
void Combine_Color_And_Alpha()
float Get_Particle_Size(void) const
unsigned int NewParticleQueueStart
void Reset_Opacity(ParticlePropertyStruct< float > &new_props)
unsigned int NumBlurTimeKeyFrames
unsigned int NumRandomSizeEntriesMinus1
unsigned int NewParticleQueueEnd
virtual void Update_Cached_Bounding_Volumes(void) const
ParticleBufferClass & operator=(const ParticleBufferClass &)
Vector3 * RandomColorEntries
unsigned int * AlphaKeyFrameTimes
float Get_Noise_Amplitude(void) const
void Get_Color_Key_Frames(ParticlePropertyStruct< Vector3 > &colors) const
float * OrientationKeyFrameValues
ShareBufferClass< Vector4 > * TailDiffuse
virtual void Get_Obj_Space_Bounding_Sphere(SphereClass &sphere) const
ShareBufferClass< Vector3 > * Color
void Reset_Rotations(ParticlePropertyStruct< float > &new_rotations, float orient_rnd)
float * BlurTimeKeyFrameDeltas
float InitialOrientationRandom
float * RandomOrientationEntries
unsigned int NumRandomAlphaEntriesMinus1
Vector2 Get_UV_Offset_Rate(void) const
ShareBufferClass< uint8 > * Orientation
void Get_New_Particles(void)
int Get_Subdivision_Level(void) const
int Are_End_Caps_Enabled(void) const
virtual void Get_Obj_Space_Bounding_Box(AABoxClass &box) const
unsigned int NumRandomOrientationEntriesMinus1
void Kill_Old_Particles(void)
Vector3 * ColorKeyFrameDeltas
float * RandomSizeEntries
ShareBufferClass< Vector3 > * Position[2]
TextureClass * Get_Texture(void) const
NewParticleStruct * NewParticleQueue
virtual float Get_Value(void) const
void Emitter_Is_Dead(void)
void Update_Non_New_Particles(unsigned int elapsed)
unsigned int * SizeKeyFrameTimes
void Update_Kinematic_Particle_State(void)
virtual void Decrement_LOD(void)
void Reset_Size(ParticlePropertyStruct< float > &new_props)
void Render_Line(RenderInfoClass &rinfo)
float * SizeKeyFrameValues
unsigned int NumRandomColorEntriesMinus1
unsigned int NumColorKeyFrames
float * RandomBlurTimeEntries
Vector4 DefaultTailDiffuse
unsigned int NumRotationKeyFrames
virtual int Get_LOD_Level(void) const
Vector3 * ColorKeyFrameValues
PointGroupClass * PointGroup
static unsigned int TotalActiveCount
static const unsigned int PermutationArray[16]
int Get_Particle_Count(void) const
float * RandomFrameEntries
void Reset_Colors(ParticlePropertyStruct< Vector3 > &new_props)
int Get_Line_Texture_Mapping_Mode(void) const
int Is_Merge_Intersections(void) const
float * SizeKeyFrameDeltas
virtual void Set_LOD_Level(int lod)
virtual int Get_Num_Polys(void) const
ShareBufferClass< float > * UCoord
virtual float Get_Post_Increment_Value(void) const
void Reset_Frames(ParticlePropertyStruct< float > &new_frames)
int Is_Sorting_Disabled(void) const
float * RotationKeyFrameValues
float * HalfRotationKeyFrameDeltas
virtual void Notify_Added(SceneClass *scene)
void Render_Line_Group(RenderInfoClass &rinfo)
@ SAME_AS_HEAD_ALPHA_ZERO
static float LODMaxScreenSizes[17]
static void Set_LOD_Max_Screen_Size(int lod_level, float max_screen_size)
unsigned int NumAlphaKeyFrames
float * FrameKeyFrameValues
unsigned int NumRandomRotationEntriesMinus1
void Set_Emitter(ParticleEmitterClass *emitter)
virtual void On_Frame_Update(void)
void Get_Blur_Time_Key_Frames(ParticlePropertyStruct< float > &blurtimes) const
ShaderClass Get_Shader(void)
unsigned char Get_Frame_Row_Column_Count_Log2(void)
TextureClass * Peek_Texture(void)
static void Add_Object(RenderObjClass *robj)
Vector3 Get_Position(void) const
void Validate_Cached_Bounding_Volumes(void) const
virtual int Is_Not_Hidden_At_All(void)
virtual const SphereClass & Get_Bounding_Sphere(void) const
AABoxClass CachedBoundingBox
virtual void Notify_Added(SceneClass *scene)
void Invalidate_Cached_Bounding_Volumes(void) const
RenderObjClass & operator=(const RenderObjClass &)
static const float AT_MAX_LOD
virtual void Set_Force_Visible(int onoff)
virtual void Notify_Removed(SceneClass *scene)
SphereClass CachedBoundingSphere
static const float AT_MIN_LOD
virtual void Register(RenderObjClass *obj, RegType for_what)=0
virtual void Unregister(RenderObjClass *obj, RegType for_what)=0
@ UNIFORM_WIDTH_TEXTURE_MAP
static ShaderClass _PresetOpaqueShader
SrcBlendFuncType Get_Src_Blend_Func(void) const
void Enable_Fog(const char *source)
DstBlendFuncType Get_Dst_Blend_Func(void) const
int Guess_Sort_Level(void) const
AlphaTestType Get_Alpha_Test(void) const
@ DSTBLEND_ONE_MINUS_SRC_COLOR
@ DSTBLEND_ONE_MINUS_SRC_ALPHA
void Delete_All(bool allow_shrink=true)
bool Add(T const &object, int new_size_hint=0)
WWINLINE void Set(float x, float y, float z, float w)
static void Clamp(Vector4 *dst, const Vector4 *src, const float min, const float max, const int count)
static void Copy(unsigned *dst, const unsigned *src, const int count)
static unsigned int Get_Sync_Time(void)
static unsigned int Get_Frame_Count(void)
static void Add_To_Static_Sort_List(RenderObjClass *robj, unsigned int sort_level)
static bool Are_Static_Sort_Lists_Enabled(void)
static bool Is_Sorting_Enabled(void)
#define REF_PTR_RELEASE(x)
unsigned int NumKeyFrames