2496
|
1 #define _CRTDBG_MAP_ALLOC
|
|
2 #include <stdlib.h>
|
|
3 #include <crtdbg.h>
|
|
4
|
|
5 #define _CRT_SECURE_NO_WARNINGS
|
2541
|
6 #include "Engine/Engine.h"
|
2496
|
7 #include "ParticleEngine.h"
|
2541
|
8 #include "Engine/Timer.h"
|
2496
|
9 #include "Viewport.h"
|
|
10 #include "Outdoor.h"
|
2541
|
11 #include "Engine/OurMath.h"
|
|
12 #include "Engine/LOD.h"
|
2496
|
13
|
|
14 #include "Sprites.h"
|
|
15
|
|
16 TrailParticleGenerator trail_particle_generator;
|
|
17
|
|
18
|
|
19 //----- (00440DF5) --------------------------------------------------------
|
|
20 void TrailParticleGenerator::AddParticle(int x, int y, int z, int bgr16)
|
|
21 {
|
|
22 particles[num_particles].x = x;
|
|
23 particles[num_particles].y = y;
|
|
24 particles[num_particles].z = z;
|
|
25 particles[num_particles].time_to_live = rand() % 64 + 256;
|
|
26 particles[num_particles].time_left = particles[num_particles].time_to_live;
|
|
27 particles[num_particles].bgr16 = bgr16;
|
|
28
|
|
29 num_particles++;
|
|
30 assert(num_particles < 100);
|
|
31 }
|
|
32
|
|
33 //----- (00440E91) --------------------------------------------------------
|
|
34 void TrailParticleGenerator::GenerateTrailParticles(int x, int y, int z, int bgr16)
|
|
35 {
|
|
36 for (int i = 0; i < 5 + rand() % 6; ++i)
|
|
37 AddParticle(rand() % 33 + x - 16,
|
|
38 rand() % 33 + y - 16,
|
|
39 rand() % 33 + z, bgr16);
|
|
40 }
|
|
41
|
|
42 //----- (00440F07) --------------------------------------------------------
|
|
43 void TrailParticleGenerator::UpdateParticles()
|
|
44 {
|
|
45 for (uint i = 0; i < 100; ++i)
|
|
46 {
|
|
47 if (particles[i].time_left > 0)
|
|
48 {
|
|
49 particles[i].x += rand() % 5 + 4;
|
|
50 particles[i].y += rand() % 5 - 2;
|
|
51 particles[i].z += rand() % 5 - 2;
|
|
52 particles[i].time_left -= pEventTimer->uTimeElapsed;
|
|
53 }
|
|
54 }
|
|
55 }
|
|
56
|
|
57 //----- (0048AAC5) --------------------------------------------------------
|
|
58 ParticleEngine::ParticleEngine()
|
|
59 {
|
|
60 for (uint i = 0; i < 500; ++i)
|
|
61 memset(&pParticles[i], 0, sizeof(pParticles[i]));
|
|
62
|
|
63 ResetParticles();
|
|
64 }
|
|
65
|
|
66 //----- (0048AAF6) --------------------------------------------------------
|
|
67 void ParticleEngine::ResetParticles()
|
|
68 {
|
|
69 memset(pParticles, 0, 500 * sizeof(*pParticles));
|
|
70 uStartParticle = 500;
|
|
71 uEndParticle = 0;
|
|
72 uTimeElapsed = 0;
|
|
73 }
|
|
74
|
|
75 //----- (0048AB23) --------------------------------------------------------
|
|
76 void ParticleEngine::AddParticle(Particle_sw *a2)
|
|
77 {
|
|
78 signed int v2; // eax@2
|
|
79 Particle *v3; // edx@2
|
|
80 Particle *v4; // esi@10
|
|
81 int v5; // ecx@10
|
|
82 //char v6; // zf@10
|
|
83
|
|
84 if ( !pMiscTimer->bPaused )
|
|
85 {
|
|
86 v2 = 0;
|
|
87 v3 = (Particle *)this;
|
|
88 do
|
|
89 {
|
|
90 if (v3->type == ParticleType_Invalid)
|
|
91 break;
|
|
92 ++v2;
|
|
93 ++v3;
|
|
94 }
|
|
95 while ( v2 < 500 );
|
|
96 if ( v2 < 500 )
|
|
97 {
|
|
98 if ( v2 < this->uStartParticle )
|
|
99 this->uStartParticle = v2;
|
|
100 if ( v2 > this->uEndParticle )
|
|
101 this->uEndParticle = v2;
|
|
102 v4 = &this->pParticles[v2];
|
|
103 v4->type = a2->type;
|
|
104 v4->x = a2->x;
|
|
105 v4->y = a2->y;
|
|
106 v4->z = a2->z;
|
|
107 v4->_x = a2->x;
|
|
108 v4->_y = a2->y;
|
|
109 v4->_z = a2->z;
|
|
110 v4->flt_10 = a2->r;
|
|
111 v4->flt_14 = a2->g;
|
|
112 v4->flt_18 = a2->b;
|
|
113 v5 = a2->uDiffuse;
|
|
114 v4->uParticleColor = v5;
|
|
115 v4->uLightColor_bgr = v5;
|
|
116 //v6 = (v4->uType & 4) == 0;
|
|
117 v4->timeToLive = a2->timeToLive;
|
|
118 v4->uTextureID = a2->uTextureID;
|
|
119 v4->flt_28 = a2->flt_28;
|
|
120 if (v4->type & ParticleType_Rotating)
|
|
121 {
|
|
122 v4->rotation_speed = (rand() % 256) - 128;
|
|
123 v4->angle = rand();
|
|
124 }
|
|
125 else
|
|
126 {
|
|
127 v4->rotation_speed = 0;
|
|
128 v4->angle = 0;
|
|
129 }
|
|
130 }
|
|
131 }
|
|
132 }
|
|
133
|
|
134 //----- (0048ABF3) --------------------------------------------------------
|
|
135 void ParticleEngine::Draw()
|
|
136 {
|
|
137 uTimeElapsed += pEventTimer->uTimeElapsed;
|
|
138 pLines.uNumLines = 0;
|
|
139
|
|
140 if (uCurrentlyLoadedLevelType == LEVEL_Indoor)
|
|
141 DrawParticles_BLV();
|
|
142 else
|
|
143 DrawParticles_ODM();
|
|
144
|
|
145 //if (pRenderer->pRenderD3D)
|
|
146 {
|
|
147 if (pLines.uNumLines)
|
|
148 {
|
|
149 pRenderer->DrawLines(pLines.pLineVertices, pLines.uNumLines);
|
|
150 /*pRenderer->pRenderD3D->pDevice->SetTexture(0, 0);
|
|
151 pRenderer->pRenderD3D->pDevice->DrawPrimitive(
|
|
152 D3DPT_LINELIST,
|
|
153 D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
|
|
154 pLines.pLineVertices,
|
|
155 pLines.uNumLines,
|
|
156 D3DDP_DONOTLIGHT);*/
|
|
157 }
|
|
158 }
|
|
159 }
|
|
160
|
|
161 //----- (0048AC65) --------------------------------------------------------
|
|
162 void ParticleEngine::UpdateParticles()
|
|
163 {
|
|
164 unsigned int time; // edi@1
|
|
165 //int v5; // eax@3
|
|
166 //char v6; // sf@4
|
|
167 float v7; // ST4C_4@11
|
|
168 double v8; // st7@12
|
|
169 //int v9; // eax@12
|
|
170 //double v10; // st7@14
|
|
171 signed int v19; // [sp+38h] [bp-14h]@1
|
|
172 int v20; // [sp+3Ch] [bp-10h]@1
|
|
173 unsigned int time_; // [sp+40h] [bp-Ch]@1
|
|
174 int v22; // [sp+44h] [bp-8h]@12
|
|
175
|
|
176 v20 = 0;
|
|
177 time = pMiscTimer->bPaused == 0 ? pEventTimer->uTimeElapsed : 0;
|
|
178 v19 = 500;
|
|
179 time_ = pMiscTimer->bPaused == 0 ? pEventTimer->uTimeElapsed : 0;
|
|
180
|
|
181 for (uint i = uStartParticle; i <= uEndParticle; ++i)
|
|
182 {
|
|
183 Particle* p = &pParticles[i];
|
|
184
|
|
185 if (p->type == ParticleType_Invalid)
|
|
186 continue;
|
|
187
|
|
188 if (p->timeToLive <= time)
|
|
189 {
|
|
190 p->timeToLive = 0;
|
|
191 p->type = ParticleType_Invalid;
|
|
192 continue;
|
|
193 }
|
|
194 p->timeToLive -= time;
|
|
195
|
|
196 if (p->type & ParticleType_Line)
|
|
197 {
|
|
198 p->_x = p->x;
|
|
199 p->_y = p->y;
|
|
200 p->_z = p->z;
|
|
201 }
|
|
202
|
|
203 if (p->type & ParticleType_1)
|
|
204 p->flt_18 = p->flt_18 - (double)(signed int)time_ * 5.0;
|
|
205
|
|
206 if (p->type & ParticleType_8)
|
|
207 {
|
|
208 v7 = (double)(signed int)time_;
|
|
209 *(float *)&p->x += (double)(rand() % 5 - 2) * v7 / 16.0f;
|
|
210 *(float *)&p->y += (double)(rand() % 5 - 2) * v7 / 16.0f;
|
|
211 *(float *)&p->z += (double)(rand() % 5 + 4) * v7 / 16.0f;
|
|
212 }
|
|
213 v8 = (double)(signed int)time_ / 128.0f;
|
|
214 //v9 = (signed int)(time * p->rotation_speed) / 16;
|
|
215
|
|
216 p->x += v8 * p->flt_10;
|
|
217 p->y += v8 * p->flt_14;
|
|
218 p->z += v8 * p->flt_18;
|
|
219
|
|
220 p->angle += time * p->rotation_speed / 16;
|
|
221 v22 = 2 * p->timeToLive;
|
|
222 if (v22 >= 255 )
|
|
223 v22 = 255;
|
|
224 //v10 = (double)v22 * 0.0039215689;
|
|
225 p->uLightColor_bgr = ((uint)floorf(p->b * (v22 / 255.0f) + 0.5) << 16) |
|
|
226 ((uint)floorf(p->g * (v22 / 255.0f) + 0.5) << 8) |
|
|
227 ((uint)floorf(p->r * (v22 / 255.0f) + 0.5) << 0);
|
|
228 if ( i < v19 )
|
|
229 v19 = i;
|
|
230 if ( i > v20 )
|
|
231 v20 = i;
|
|
232 }
|
|
233
|
|
234 uEndParticle = v20;
|
|
235 uStartParticle = v19;
|
|
236 }
|
|
237
|
|
238 //----- (0048AE74) --------------------------------------------------------
|
|
239 bool ParticleEngine::ViewProject_TrueIfStillVisible_BLV(unsigned int uParticleID)
|
|
240 {
|
|
241 Particle *pParticle; // esi@1
|
|
242 //double v56; // ST28_8@2
|
|
243 //float v4; // eax@4
|
|
244 //double v5; // ST34_8@4
|
|
245 signed __int64 v6; // qtt@4
|
|
246 //double v7; // st7@4
|
|
247 //float v8; // ST18_4@4
|
|
248 // int v9; // ecx@4
|
|
249 //int v10; // eax@4
|
|
250 //double v11; // ST44_8@7
|
|
251 //double v12; // ST4C_8@7
|
|
252 // double v13; // ST4C_8@7
|
|
253 // int v14; // ecx@7
|
|
254 //signed __int64 v15; // qtt@7
|
|
255 // int v16; // eax@7
|
|
256 // int v17; // edx@7
|
|
257 // float v18; // edx@7
|
|
258 // int v19; // eax@7
|
|
259 // int v20; // edx@7
|
|
260 // int v21; // ST50_4@8
|
|
261 // int v22; // ebx@8
|
|
262 // int v23; // ecx@10
|
|
263 // int v24; // edi@10
|
|
264 //double v25; // ST44_8@12
|
|
265 //double v26; // ST4C_8@12
|
|
266 // int v27; // edi@12
|
|
267 // int v28; // ST40_4@12
|
|
268 // int v29; // ecx@12
|
|
269 //signed __int64 v30; // qtt@12
|
|
270 // int v31; // eax@12
|
|
271 // int v32; // edx@12
|
|
272 // float v33; // edx@12
|
|
273 //int v34; // eax@12
|
|
274 // int v35; // ecx@12
|
|
275 // int v36; // ST38_4@13
|
|
276 // int v37; // ST30_4@15
|
|
277 // int v38; // eax@16
|
|
278 //signed __int64 v40; // qtt@18
|
|
279 // int v41; // eax@18
|
|
280 // int v42; // ecx@18
|
|
281 // int v43; // eax@18
|
|
282 // unsigned __int64 v44; // qax@18
|
|
283 //double v45; // st7@18
|
|
284 //int v46; // ecx@18
|
|
285 //float v47; // ST18_4@18
|
|
286 //unsigned __int64 v48; // qax@18
|
|
287 int y_int_; // [sp+10h] [bp-40h]@2
|
|
288 // int a2; // [sp+18h] [bp-38h]@10
|
|
289 int x_int; // [sp+20h] [bp-30h]@2
|
|
290 int z_int_; // [sp+24h] [bp-2Ch]@2
|
|
291 // int z_int_4; // [sp+28h] [bp-28h]@8
|
|
292 int z; // [sp+3Ch] [bp-14h]@3
|
|
293 // double a5; // [sp+40h] [bp-10h]@4
|
|
294 // int a6; // [sp+48h] [bp-8h]@4
|
|
295 int y; // [sp+4Ch] [bp-4h]@3
|
|
296
|
|
297 pParticle = &this->pParticles[uParticleID];
|
|
298 if (pParticle->type == ParticleType_Invalid)
|
|
299 return 0;
|
|
300 //uParticleID = LODWORD(pParticle->x);
|
|
301 //v56 = *(float *)&uParticleID + 6.7553994e15;
|
|
302 x_int = floorf(pParticle->x + 0.5f);
|
|
303 //uParticleID = LODWORD(pParticle->y);
|
|
304 //y_int_ = *(float *)&uParticleID + 6.7553994e15;
|
|
305 y_int_ = floorf(pParticle->y + 0.5f);
|
|
306 //uParticleID = LODWORD(pParticle->z);
|
|
307 //z_int_ = *(float *)&uParticleID + 6.7553994e15;
|
|
308 z_int_ = floorf(pParticle->z + 0.5f);
|
|
309 /*if ( !pRenderer->pRenderD3D )
|
|
310 {
|
2541
|
311 if (pEngine->pIndoorCameraD3D->sRotationX)
|
2496
|
312 {
|
|
313 if (pParticle->type & ParticleType_Line)
|
|
314 {
|
|
315 //v11 = pParticle->_x + 6.7553994e15;
|
|
316 int _uParticleID = (int)(floorf(pParticle->_x + 0.5f) - pBLVRenderParams->vPartyPos.x) << 16;
|
|
317 //v12 = pParticle->_y + 6.7553994e15;
|
|
318 y = (int)(floorf(pParticle->_y + 0.5f) - pBLVRenderParams->vPartyPos.y) << 16;
|
2541
|
319 z = (unsigned __int64)(y * (signed __int64)pEngine->pIndoorCameraD3D->int_sine_y) >> 16;
|
|
320 HIDWORD(a5) = ((unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_y) >> 16)
|
2496
|
321 - z;
|
2541
|
322 a6 = (unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_sine_y) >> 16;
|
2496
|
323 //v13 = pParticle->_z + 6.7553994e15;
|
|
324 _uParticleID = (int)(floorf(pParticle->_z + 0.5f) - pBLVRenderParams->vPartyPos.z) << 16;
|
2541
|
325 z = ((unsigned __int64)(SHIDWORD(a5) * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_x) >> 16)
|
|
326 - ((unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_sine_x) >> 16);
|
2496
|
327 v14 = z;
|
2541
|
328 HIDWORD(v13) = (unsigned __int64)(SHIDWORD(a5) * (signed __int64)pEngine->pIndoorCameraD3D->int_sine_x) >> 16;
|
|
329 HIDWORD(a5) = (unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_x) >> 16;
|
2496
|
330 //LODWORD(v15) = pBLVRenderParams->field_40 << 16;
|
|
331 //HIDWORD(v15) = pBLVRenderParams->field_40 >> 16;
|
|
332 //v16 = v15 / z;
|
|
333 v16 = fixpoint_div(pBLVRenderParams->field_40, z);
|
2541
|
334 v17 = (unsigned __int64)(y * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_y) >> 16;
|
2496
|
335 pParticle->_screenspace_scale = v16;
|
|
336 _uParticleID = (unsigned __int64)(v16 * (signed __int64)(a6 + v17)) >> 16;
|
|
337 LODWORD(v18) = pBLVRenderParams->uViewportCenterX
|
|
338 - ((signed int)((unsigned __int64)(v16 * (signed __int64)(a6 + v17)) >> 16) >> 16);
|
|
339 v19 = pParticle->_screenspace_scale;
|
|
340 pParticle->uScreenSpaceZ = v18;
|
|
341 _uParticleID = (unsigned __int64)(v19 * (signed __int64)(HIDWORD(v13) + HIDWORD(a5))) >> 16;
|
|
342 v20 = pBLVRenderParams->uViewportCenterY
|
|
343 - ((signed int)((unsigned __int64)(v19 * (signed __int64)(HIDWORD(v13) + HIDWORD(a5))) >> 16) >> 16);
|
|
344 pParticle->sZValue2 = v14;
|
|
345 pParticle->uScreenSpaceW = v20;
|
|
346 }
|
|
347 int _uParticleID = (x_int - pBLVRenderParams->vPartyPos.x) << 16;
|
|
348 y = (y_int_ - pBLVRenderParams->vPartyPos.y) << 16;
|
2541
|
349 HIDWORD(a5) = ((unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_y) >> 16)
|
|
350 - ((unsigned __int64)(y * (signed __int64)pEngine->pIndoorCameraD3D->int_sine_y) >> 16);
|
|
351 a6 = (unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_sine_y) >> 16;
|
|
352 z_int_4 = (unsigned __int64)(y * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_y) >> 16;
|
2496
|
353 _uParticleID = (z_int_ - pBLVRenderParams->vPartyPos.z) << 16;
|
2541
|
354 v21 = (unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_sine_x) >> 16;
|
|
355 v22 = ((unsigned __int64)(SHIDWORD(a5) * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_x) >> 16) - v21;
|
|
356 z = ((unsigned __int64)(SHIDWORD(a5) * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_x) >> 16) - v21;
|
2496
|
357 if ( v22 < (signed int)0x40000u || v22 > (signed int)0x1F400000u )
|
|
358 return 0;
|
|
359 v23 = a6 + z_int_4;
|
|
360 a2 = a6 + z_int_4;
|
2541
|
361 v24 = ((unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_x) >> 16)
|
|
362 + ((unsigned __int64)(SHIDWORD(a5) * (signed __int64)pEngine->pIndoorCameraD3D->int_sine_x) >> 16);
|
2496
|
363 }
|
|
364 else
|
|
365 {
|
|
366 if (pParticle->type & ParticleType_Line)
|
|
367 {
|
|
368 //v25 = pParticle->_x + 6.7553994e15;
|
|
369 int _uParticleID = ((int)floorf(pParticle->_x + 0.5f) - pBLVRenderParams->vPartyPos.x) << 16;
|
|
370 //v26 = pParticle->_y + 6.7553994e15;
|
|
371 y = ((int)floorf(pParticle->_y + 0.5f) - pBLVRenderParams->vPartyPos.y) << 16;
|
2541
|
372 auto _hiword_v25 = (__int64)(y * (signed __int64)pEngine->pIndoorCameraD3D->int_sine_y) >> 16;
|
|
373 v27 = ((unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_y) >> 16) - _hiword_v25;
|
|
374 z = ((unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_y) >> 16) - _hiword_v25;
|
|
375 v28 = (unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_sine_y) >> 16;
|
2496
|
376 //a5 = pParticle->_z + 6.7553994e15;
|
|
377 v29 = ((int)floorf(pParticle->_z + 0.5f) - pBLVRenderParams->vPartyPos.z) << 16;
|
|
378 //LODWORD(v30) = pBLVRenderParams->field_40 << 16;
|
|
379 //HIDWORD(v30) = pBLVRenderParams->field_40 >> 16;
|
|
380 //v31 = v30 / z;
|
|
381 v31 = fixpoint_div(pBLVRenderParams->field_40, z);
|
2541
|
382 v32 = (unsigned __int64)(y * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_y) >> 16;
|
2496
|
383 pParticle->_screenspace_scale = v31;
|
|
384 _uParticleID = (unsigned __int64)(v31 * (signed __int64)(v28 + v32)) >> 16;
|
|
385 LODWORD(v33) = pBLVRenderParams->uViewportCenterX - ((signed int)((unsigned __int64)(v31 * (signed __int64)(v28 + v32)) >> 16) >> 16);
|
|
386 //v34 = pParticle->_screenspace_scale;
|
|
387 pParticle->uScreenSpaceZ = v33;
|
|
388 v35 = pBLVRenderParams->uViewportCenterY - ((signed int)((unsigned __int64)(pParticle->_screenspace_scale * (signed __int64)v29) >> 16) >> 16);
|
|
389 pParticle->sZValue2 = v27;
|
|
390 pParticle->uScreenSpaceW = v35;
|
|
391 }
|
|
392 int _uParticleID = (x_int - pBLVRenderParams->vPartyPos.x) << 16;
|
|
393 y = (y_int_ - pBLVRenderParams->vPartyPos.y) << 16;
|
2541
|
394 v36 = (unsigned __int64)(y * (signed __int64)pEngine->pIndoorCameraD3D->int_sine_y) >> 16;
|
|
395 v22 = ((unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_y) >> 16) - v36;
|
|
396 z = ((unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_y) >> 16) - v36;
|
2496
|
397 if ( v22 < 262144 || v22 > 524288000 )
|
|
398 return 0;
|
2541
|
399 v37 = (unsigned __int64)((signed int)_uParticleID * (signed __int64)pEngine->pIndoorCameraD3D->int_sine_y) >> 16;
|
|
400 _uParticleID = (unsigned __int64)(y * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_y) >> 16;
|
|
401 v23 = v37 + ((unsigned __int64)(y * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_y) >> 16);
|
|
402 a2 = v37 + ((unsigned __int64)(y * (signed __int64)pEngine->pIndoorCameraD3D->int_cosine_y) >> 16);
|
2496
|
403 v24 = (z_int_ - pBLVRenderParams->vPartyPos.z) << 16;
|
|
404 }
|
|
405 int _uParticleID = abs(v23);
|
|
406 v38 = abs(v22);
|
|
407 if ( v38 >= (signed int)_uParticleID )
|
|
408 {
|
|
409 //LODWORD(v40) = pBLVRenderParams->field_40 << 16;
|
|
410 //HIDWORD(v40) = pBLVRenderParams->field_40 >> 16;
|
|
411 v41 = fixpoint_div(pBLVRenderParams->field_40, z);
|
|
412 pParticle->_screenspace_scale = v41;
|
|
413 _uParticleID = (unsigned __int64)(v41 * (signed __int64)a2) >> 16;
|
|
414 v42 = pBLVRenderParams->uViewportCenterX - ((signed int)((unsigned __int64)(v41 * (signed __int64)a2) >> 16) >> 16);
|
|
415 v43 = pParticle->_screenspace_scale;
|
|
416 pParticle->uScreenSpaceX = v42;
|
|
417 v44 = v43 * (signed __int64)v24;
|
|
418 //uParticleID = v44 >> 16;
|
|
419 LODWORD(v44) = (signed int)(v44 >> 16) >> 16;
|
|
420 pParticle->uScreenSpaceY = pBLVRenderParams->uViewportCenterY - v44;
|
|
421 pParticle->_screenspace_scale = fixpoint_mul(fixpoint_from_float(pParticle->flt_28), pParticle->_screenspace_scale);
|
|
422 pParticle->sZValue = z;
|
|
423 return true;
|
|
424 }
|
|
425 return false;
|
|
426 }*/
|
|
427
|
|
428 int x;
|
2541
|
429 if ( !pEngine->pIndoorCameraD3D->ApplyViewTransform_TrueIfStillVisible_BLV(
|
2496
|
430 x_int,
|
|
431 y_int_,
|
|
432 z_int_,
|
|
433 &x,
|
|
434 &y,
|
|
435 &z,
|
|
436 1) )
|
|
437 return false;
|
2541
|
438 pEngine->pIndoorCameraD3D->Project(x, y, z, &pParticle->uScreenSpaceX, &pParticle->uScreenSpaceY);
|
|
439 pParticle->flt_5C = pEngine->pIndoorCameraD3D->fov_x;
|
2496
|
440 //v4 = pParticle->flt_5C;
|
2541
|
441 pParticle->flt_60 = pEngine->pIndoorCameraD3D->fov_y;
|
2496
|
442 //v5 = v4 + 6.7553994e15;
|
|
443 LODWORD(v6) = 0;
|
|
444 HIDWORD(v6) = floorf(pParticle->flt_5C + 0.5f);
|
|
445 //v7 = pParticle->flt_28;
|
|
446 //pParticle->_screenspace_scale = v6 / x;
|
|
447 //v8 = v7;
|
|
448 pParticle->_screenspace_scale = fixpoint_mul(fixpoint_from_float(pParticle->flt_28), v6 / x);
|
|
449 pParticle->sZValue = x;
|
|
450 return true;
|
|
451 }
|
|
452
|
|
453
|
|
454
|
|
455
|
|
456 //----- (0048B5B3) --------------------------------------------------------
|
|
457 bool ParticleEngine::ViewProject_TrueIfStillVisible_ODM(unsigned int uID)
|
|
458 {
|
|
459 int v3; // ebx@1
|
|
460 int v4; // edi@1
|
|
461 int v5; // ecx@1
|
|
462 int v11; // ST44_4@4
|
|
463 signed __int64 v13; // qtt@4
|
|
464 int v16; // edi@6
|
|
465 int v17; // eax@6
|
|
466 signed __int64 v22; // qtt@8
|
|
467 int v26; // edx@9
|
|
468 int v28; // ebx@12
|
|
469 signed __int64 v29; // qtt@13
|
|
470 int v40; // [sp+14h] [bp-3Ch]@12
|
|
471 int v44; // [sp+2Ch] [bp-24h]@1
|
|
472 int v45; // [sp+40h] [bp-10h]@5
|
|
473 int X_4; // [sp+48h] [bp-8h]@5
|
|
474
|
2541
|
475 v3 = stru_5C6E00->Cos(pEngine->pIndoorCameraD3D->sRotationX);
|
|
476 v44 = stru_5C6E00->Sin(pEngine->pIndoorCameraD3D->sRotationX);
|
|
477 v4 = stru_5C6E00->Cos(pEngine->pIndoorCameraD3D->sRotationY);
|
|
478 v5 = stru_5C6E00->Sin(pEngine->pIndoorCameraD3D->sRotationY);
|
2496
|
479
|
|
480 if (pParticles[uID].type == ParticleType_Invalid)
|
|
481 return false;
|
|
482
|
|
483 if ( v3 )
|
|
484 {
|
|
485 if (pParticles[uID].type & ParticleType_Line)
|
|
486 {
|
2541
|
487 v11 = fixpoint_sub_unknown(pParticles[uID].x - pEngine->pIndoorCameraD3D->vPartyPos.x, v4)
|
|
488 + fixpoint_sub_unknown(pParticles[uID].y - pEngine->pIndoorCameraD3D->vPartyPos.y, v5);
|
|
489 long long _hidword_v12 = fixpoint_mul(v11, v3) + fixpoint_sub_unknown(pParticles[uID].z - pEngine->pIndoorCameraD3D->vPartyPos.z, v44);
|
2496
|
490 LODWORD(v13) = 0;
|
|
491 HIDWORD(v13) = SLOWORD(pODMRenderParams->int_fov_rad);
|
|
492 pParticles[uID]._screenspace_scale = v13 / _hidword_v12;
|
|
493 pParticles[uID].uScreenSpaceX = pViewport->uScreenCenterX
|
|
494 - ((signed int)fixpoint_mul(pParticles[uID]._screenspace_scale, (fixpoint_sub_unknown(pParticles[uID].y
|
2541
|
495 - pEngine->pIndoorCameraD3D->vPartyPos.y, v4)
|
|
496 - fixpoint_sub_unknown(pParticles[uID].x - pEngine->pIndoorCameraD3D->vPartyPos.x, v5))) >> 16);
|
2496
|
497 pParticles[uID].uScreenSpaceY = pViewport->uScreenCenterY
|
|
498 - ((signed int)fixpoint_mul(pParticles[uID]._screenspace_scale, (fixpoint_sub_unknown(pParticles[uID].z
|
2541
|
499 - pEngine->pIndoorCameraD3D->vPartyPos.z, v3)
|
2496
|
500 - fixpoint_mul(v11, v44))) >> 16);
|
|
501 pParticles[uID].sZValue = _hidword_v12;
|
|
502 }
|
2541
|
503 v45 = fixpoint_sub_unknown(pParticles[uID].x - pEngine->pIndoorCameraD3D->vPartyPos.x, v4) + fixpoint_sub_unknown(pParticles[uID].y
|
|
504 - pEngine->pIndoorCameraD3D->vPartyPos.y, v5);
|
|
505 X_4 = fixpoint_sub_unknown(pParticles[uID].z - pEngine->pIndoorCameraD3D->vPartyPos.z, v44) + fixpoint_mul(v45, v3);
|
2496
|
506 if ( X_4 < 0x40000 )
|
|
507 return 0;
|
2541
|
508 v16 = fixpoint_sub_unknown(pParticles[uID].y - pEngine->pIndoorCameraD3D->vPartyPos.y, v4)
|
|
509 - fixpoint_sub_unknown(pParticles[uID].x - pEngine->pIndoorCameraD3D->vPartyPos.x, v5);
|
|
510 v17 = fixpoint_sub_unknown(pParticles[uID].z - pEngine->pIndoorCameraD3D->vPartyPos.z, v3) - fixpoint_mul(v45, v44);
|
2496
|
511 }
|
|
512 else
|
|
513 {
|
|
514 if (pParticles[uID].type & ParticleType_Line)
|
|
515 {
|
|
516 LODWORD(v22) = 0;
|
|
517 HIDWORD(v22) = SLOWORD(pODMRenderParams->int_fov_rad);
|
2541
|
518 long long _var_123 = fixpoint_sub_unknown(pParticles[uID].x - pEngine->pIndoorCameraD3D->vPartyPos.x, v4)
|
|
519 + fixpoint_sub_unknown(pParticles[uID].y - pEngine->pIndoorCameraD3D->vPartyPos.y, v5);
|
2496
|
520 pParticles[uID]._screenspace_scale = v22 / _var_123;
|
|
521 pParticles[uID].uScreenSpaceX = pViewport->uScreenCenterX
|
|
522 - ((signed int)fixpoint_mul(pParticles[uID]._screenspace_scale, (fixpoint_sub_unknown(pParticles[uID].y
|
2541
|
523 - pEngine->pIndoorCameraD3D->vPartyPos.y, v4)
|
|
524 - fixpoint_sub_unknown(pParticles[uID].x - pEngine->pIndoorCameraD3D->vPartyPos.x, v5))) >> 16);
|
2496
|
525 pParticles[uID].uScreenSpaceY = pViewport->uScreenCenterY - (fixpoint_sub_unknown(pParticles[uID].z, pParticles[uID]._screenspace_scale) >> 16);
|
|
526 pParticles[uID].sZValue = _var_123;
|
|
527 }
|
2541
|
528 v26 = fixpoint_sub_unknown(pParticles[uID].y - pEngine->pIndoorCameraD3D->vPartyPos.y, v5);
|
|
529 X_4 = v26 + fixpoint_sub_unknown(pParticles[uID].x - pEngine->pIndoorCameraD3D->vPartyPos.x, v4);
|
2496
|
530 if ( X_4 < 0x40000 || X_4 > (pODMRenderParams->uPickDepth - 1000) << 16 )
|
|
531 return 0;
|
|
532 v17 = pParticles[uID].z;
|
2541
|
533 v16 = fixpoint_sub_unknown(pParticles[uID].y - pEngine->pIndoorCameraD3D->vPartyPos.y, v4)
|
|
534 - fixpoint_sub_unknown(pParticles[uID].x - pEngine->pIndoorCameraD3D->vPartyPos.x, v5);
|
2496
|
535 }
|
|
536 v40 = v17;
|
|
537 v28 = abs(v16);
|
|
538 if ( abs(X_4) >= v28 )
|
|
539 {
|
|
540 LODWORD(v29) = 0;
|
|
541 HIDWORD(v29) = SLOWORD(pODMRenderParams->int_fov_rad);
|
|
542 pParticles[uID]._screenspace_scale = v29 / X_4;
|
|
543 pParticles[uID].uScreenSpaceX = pViewport->uScreenCenterX - ((signed int)fixpoint_mul(pParticles[uID]._screenspace_scale, v16) >> 16);
|
|
544 pParticles[uID].uScreenSpaceY = pViewport->uScreenCenterY - ((signed int)fixpoint_mul(pParticles[uID]._screenspace_scale, v40) >> 16);
|
|
545 pParticles[uID]._screenspace_scale = fixpoint_mul(fixpoint_from_float(pParticles[uID].flt_28), pParticles[uID]._screenspace_scale);
|
|
546 pParticles[uID].sZValue = X_4;
|
|
547 if ( pParticles[uID].uScreenSpaceX >= (signed int)pViewport->uViewportTL_X
|
|
548 && pParticles[uID].uScreenSpaceX < (signed int)pViewport->uViewportBR_X
|
|
549 && pParticles[uID].uScreenSpaceY >= (signed int)pViewport->uViewportTL_Y
|
|
550 && pParticles[uID].uScreenSpaceY < (signed int)pViewport->uViewportBR_Y )
|
|
551 return true;
|
|
552 }
|
|
553 return false;
|
|
554 }
|
|
555
|
|
556 //----- (0048BBA6) --------------------------------------------------------
|
|
557 void ParticleEngine::DrawParticles_BLV()
|
|
558 {
|
|
559 // int v11; // eax@18
|
|
560 // int v12; // ecx@20
|
|
561 // int v13; // edx@20
|
|
562 //Particle *v14; // eax@28
|
|
563 RenderBillboardTransform_local0 v15; // [sp+Ch] [bp-58h]@1
|
|
564
|
|
565 v15.sParentBillboardID = -1;
|
|
566
|
|
567 for (uint i = uStartParticle; i < uEndParticle; ++i)
|
|
568 {
|
|
569 Particle* p = &pParticles[i];
|
|
570
|
|
571 if (p->type == ParticleType_Invalid)
|
|
572 continue;
|
|
573
|
|
574 if (!ViewProject_TrueIfStillVisible_BLV(i))
|
|
575 continue;
|
|
576
|
|
577 if (p->uScreenSpaceX >= pBLVRenderParams->uViewportX &&
|
|
578 p->uScreenSpaceX < pBLVRenderParams->uViewportZ &&
|
|
579 p->uScreenSpaceY >= pBLVRenderParams->uViewportY &&
|
|
580 p->uScreenSpaceY < pBLVRenderParams->uViewportW)
|
|
581 {
|
|
582 /*if (!pRenderer->pRenderD3D)
|
|
583 {
|
|
584 __debugbreak();
|
|
585 v11 = 13 * p->_screenspace_scale >> 16;
|
|
586 if ( v11 > 30 )
|
|
587 v11 = 30;
|
|
588 v12 = p->uScreenSpaceY - v11;
|
|
589 v13 = p->uScreenSpaceX - (v11 >> 1);
|
|
590 if ( v13 + v11 < (signed int)pViewport->uViewportTL_X
|
|
591 || v13 >= (signed int)pViewport->uViewportBR_X
|
|
592 || v12 + v11 < (signed int)pViewport->uViewportTL_Y
|
|
593 || v12 >= (signed int)pViewport->uViewportBR_Y )
|
|
594 {
|
|
595 ;
|
|
596 }
|
|
597 else
|
|
598 {
|
|
599 pRenderer->MakeParticleBillboardAndPush_BLV_Software(v13, v12, p->sZValue, p->uLightColor_bgr, v11);
|
|
600 }
|
|
601 }
|
|
602 else*/
|
|
603
|
|
604 if (p->type & ParticleType_Diffuse)
|
|
605 {
|
|
606 //v14 = &pParticles[i];
|
|
607 v15._screenspace_x_scaler_packedfloat = p->_screenspace_scale / 4;
|
|
608 v15._screenspace_y_scaler_packedfloat = p->_screenspace_scale / 4;
|
|
609 v15.uScreenSpaceX = p->uScreenSpaceX;
|
|
610 v15.uScreenSpaceY = p->uScreenSpaceY;
|
|
611 v15.sZValue = p->sZValue;
|
|
612 pRenderer->MakeParticleBillboardAndPush_BLV(&v15, 0, p->uLightColor_bgr, p->angle);
|
|
613 return;
|
|
614 }
|
|
615 if (p->type & ParticleType_Line)
|
|
616 {
|
|
617 if (pLines.uNumLines < 100)
|
|
618 {
|
|
619 pLines.pLineVertices[2 * pLines.uNumLines].pos.x = p->uScreenSpaceX;
|
|
620 pLines.pLineVertices[2 * pLines.uNumLines].pos.y = p->uScreenSpaceY;
|
|
621 pLines.pLineVertices[2 * pLines.uNumLines].pos.z = 1.0 - 1.0 / ((short)p->sZValue * 0.061758894);
|
|
622 pLines.pLineVertices[2 * pLines.uNumLines].rhw = 1.0;
|
|
623 pLines.pLineVertices[2 * pLines.uNumLines].diffuse = p->uLightColor_bgr;
|
|
624 pLines.pLineVertices[2 * pLines.uNumLines].specular = 0;
|
|
625 pLines.pLineVertices[2 * pLines.uNumLines].texcoord.x = 0.0;
|
|
626 pLines.pLineVertices[2 * pLines.uNumLines].texcoord.y = 0.0;
|
|
627
|
|
628 pLines.pLineVertices[2 * pLines.uNumLines + 1].pos.x = p->uScreenSpaceZ;
|
|
629 pLines.pLineVertices[2 * pLines.uNumLines + 1].pos.y = p->uScreenSpaceW;
|
|
630 pLines.pLineVertices[2 * pLines.uNumLines + 1].pos.z = 1.0 - 1.0 / ((short)p->sZValue2 * 0.061758894);
|
|
631 pLines.pLineVertices[2 * pLines.uNumLines + 1].rhw = 1.0;
|
|
632 pLines.pLineVertices[2 * pLines.uNumLines + 1].diffuse = p->uLightColor_bgr;
|
|
633 pLines.pLineVertices[2 * pLines.uNumLines + 1].specular = 0;
|
|
634 pLines.pLineVertices[2 * pLines.uNumLines + 1].texcoord.x = 0.0;
|
|
635 pLines.pLineVertices[2 * pLines.uNumLines++ + 1].texcoord.y = 0.0;
|
|
636 }
|
|
637 }
|
|
638 if (p->type & ParticleType_Bitmap)
|
|
639 {
|
|
640 v15._screenspace_x_scaler_packedfloat = p->_screenspace_scale;
|
|
641 v15._screenspace_y_scaler_packedfloat = p->_screenspace_scale;
|
|
642 v15.uScreenSpaceX = p->uScreenSpaceX;
|
|
643 v15.uScreenSpaceY = p->uScreenSpaceY;
|
|
644 v15.sZValue = p->sZValue;
|
|
645 pRenderer->MakeParticleBillboardAndPush_BLV(&v15, pBitmaps_LOD->pHardwareTextures[p->uTextureID], p->uLightColor_bgr, p->angle);
|
|
646 }
|
|
647 if (p->type & ParticleType_Sprite)
|
|
648 {
|
|
649 v15._screenspace_x_scaler_packedfloat = p->_screenspace_scale;
|
|
650 v15._screenspace_y_scaler_packedfloat = p->_screenspace_scale;
|
|
651 v15.uScreenSpaceX = p->uScreenSpaceX;
|
|
652 v15.uScreenSpaceY = p->uScreenSpaceY;
|
|
653 v15.sZValue = p->sZValue;
|
|
654 pRenderer->MakeParticleBillboardAndPush_BLV(&v15, pSprites_LOD->pHardwareSprites[p->uTextureID].pTexture, p->uLightColor_bgr, p->angle);
|
|
655 }
|
|
656 }
|
|
657 }
|
|
658 }
|
|
659
|
|
660 //----- (0048BEEF) --------------------------------------------------------
|
|
661 void ParticleEngine::DrawParticles_ODM()
|
|
662 {
|
|
663 ParticleEngine *pParticleEngine; // esi@1
|
|
664 //int pParticleNum; // eax@1
|
|
665 // unsigned __int8 v3; // zf@1
|
|
666 // char v4; // sf@1
|
|
667 // unsigned __int8 v5; // of@1
|
|
668 //char *v7; // edi@2
|
|
669 //int v8; // eax@6
|
|
670 //signed int pNumLines; // eax@8
|
|
671 // int v10; // eax@14
|
|
672 // int v11; // ecx@16
|
|
673 // int v12; // edx@16
|
|
674 //Particle *pParticle; // eax@24
|
|
675 RenderBillboardTransform_local0 pBillboard; // [sp+Ch] [bp-58h]@1
|
|
676 //int v15; // [sp+5Ch] [bp-8h]@9
|
|
677 // int v16; // [sp+60h] [bp-4h]@1
|
|
678
|
|
679 pBillboard.sParentBillboardID = -1;
|
|
680 pParticleEngine = this;
|
|
681 //v2 = this->uStartParticle;
|
|
682 //v5 = v2 > this->uEndParticle;// v5 = __OFSUB__(v2, this->uEndParticle);
|
|
683 //v3 = v2 == this->uEndParticle;
|
|
684 //v4 = v2 - this->uEndParticle < 0;
|
|
685 //v16 = this->uStartParticle;
|
|
686 for (uint i = uStartParticle; i <= uEndParticle; ++i)
|
|
687 {
|
|
688 Particle* particle = &pParticles[i];
|
|
689 if (particle->type == ParticleType_Invalid || !ViewProject_TrueIfStillVisible_ODM(i))
|
|
690 continue;
|
|
691
|
|
692 /*if ( !pRenderer->pRenderD3D )
|
|
693 {
|
|
694 __debugbreak();
|
|
695 v10 = 13 * particle->_screenspace_scale >> 16;
|
|
696 if ( v10 > 30 )
|
|
697 v10 = 30;
|
|
698 v11 = particle->uScreenSpaceX - (v10 >> 1);
|
|
699 v12 = particle->uScreenSpaceY - v10;
|
|
700 if ( v11 + v10 < pViewport->uViewportTL_X
|
|
701 || v11 >= pViewport->uViewportBR_X
|
|
702 || particle->uScreenSpaceY < pViewport->uViewportTL_Y
|
|
703 || v12 >= (signed int)pViewport->uViewportBR_Y )
|
|
704 {
|
|
705 ;
|
|
706 }
|
|
707 else
|
|
708 {
|
|
709 pRenderer->MakeParticleBillboardAndPush_BLV_Software(v11, v12, particle->sZValue, particle->uLightColor_bgr, v10);
|
|
710 }
|
|
711 }
|
|
712 else*/
|
|
713
|
|
714 //v8 = *(_DWORD *)(v7 - 82);
|
|
715 if (particle->type & ParticleType_Diffuse)
|
|
716 {
|
|
717 pBillboard._screenspace_x_scaler_packedfloat = particle->_screenspace_scale / 4;
|
|
718 pBillboard._screenspace_y_scaler_packedfloat = particle->_screenspace_scale / 4;
|
|
719 pBillboard.uScreenSpaceX = particle->uScreenSpaceX;
|
|
720 pBillboard.uScreenSpaceY = particle->uScreenSpaceY;
|
|
721 pBillboard.sZValue = particle->sZValue;
|
|
722 pRenderer->MakeParticleBillboardAndPush_ODM(&pBillboard, 0, particle->uLightColor_bgr, particle->angle);
|
|
723 return;
|
|
724 }
|
|
725 if (particle->type & ParticleType_Line)
|
|
726 {
|
|
727 if (pLines.uNumLines < 100)
|
|
728 {
|
|
729 pLines.pLineVertices[2 * pLines.uNumLines].pos.x = particle->uScreenSpaceX;
|
|
730 pLines.pLineVertices[2 * pLines.uNumLines].pos.y = particle->uScreenSpaceY;
|
|
731 pLines.pLineVertices[2 * pLines.uNumLines].pos.z = 1.0 - 1.0 / ((double)particle->zbuffer_depth * 1000.0 / (double)pODMRenderParams->shading_dist_mist);
|
|
732 pLines.pLineVertices[2 * pLines.uNumLines].rhw = 1.0;
|
|
733 pLines.pLineVertices[2 * pLines.uNumLines].diffuse = particle->uLightColor_bgr;
|
|
734 pLines.pLineVertices[2 * pLines.uNumLines].specular = 0;
|
|
735 pLines.pLineVertices[2 * pLines.uNumLines].texcoord.x = 0.0;
|
|
736 pLines.pLineVertices[2 * pLines.uNumLines].texcoord.y = 0.0;
|
|
737
|
|
738 pLines.pLineVertices[2 * pLines.uNumLines + 1].pos.x = particle->uScreenSpaceZ;
|
|
739 pLines.pLineVertices[2 * pLines.uNumLines + 1].pos.y = particle->uScreenSpaceW;
|
|
740 pLines.pLineVertices[2 * pLines.uNumLines + 1].pos.z = 1.0 - 1.0 / ((double)particle->zbuffer_depth * 1000.0 / (double)pODMRenderParams->shading_dist_mist);
|
|
741 pLines.pLineVertices[2 * pLines.uNumLines + 1].rhw = 1.0;
|
|
742 pLines.pLineVertices[2 * pLines.uNumLines + 1].diffuse = particle->uLightColor_bgr;
|
|
743 pLines.pLineVertices[2 * pLines.uNumLines + 1].specular = 0;
|
|
744 pLines.pLineVertices[2 * pLines.uNumLines + 1].texcoord.x = 0.0;
|
|
745 pLines.pLineVertices[2 * pLines.uNumLines + 1].texcoord.y = 0.0;
|
|
746 pLines.uNumLines++;
|
|
747 }
|
|
748 }
|
|
749 if (particle->type & ParticleType_Bitmap)
|
|
750 {
|
|
751 pBillboard._screenspace_x_scaler_packedfloat = particle->_screenspace_scale;
|
|
752 pBillboard._screenspace_y_scaler_packedfloat = particle->_screenspace_scale;
|
|
753 pBillboard.uScreenSpaceX = particle->uScreenSpaceX;
|
|
754 pBillboard.uScreenSpaceY = particle->uScreenSpaceY;
|
|
755 pBillboard.sZValue = particle->sZValue;
|
|
756 pRenderer->MakeParticleBillboardAndPush_ODM(&pBillboard, pBitmaps_LOD->pHardwareTextures[particle->uTextureID], particle->uLightColor_bgr, particle->angle);
|
|
757 }
|
|
758 if (particle->type & ParticleType_Sprite)
|
|
759 {
|
|
760 pBillboard._screenspace_x_scaler_packedfloat = particle->_screenspace_scale;
|
|
761 pBillboard._screenspace_y_scaler_packedfloat = particle->_screenspace_scale;
|
|
762 pBillboard.uScreenSpaceX = particle->uScreenSpaceX;
|
|
763 pBillboard.uScreenSpaceY = particle->uScreenSpaceY;
|
|
764 pBillboard.sZValue = particle->sZValue;
|
|
765 pRenderer->MakeParticleBillboardAndPush_ODM(&pBillboard, pSprites_LOD->pHardwareSprites[particle->uTextureID].pTexture, particle->uLightColor_bgr, particle->angle);
|
|
766 }
|
|
767 }
|
|
768 } |