comparison stru10.cpp @ 0:9c0607679772

init
author Ritor1
date Sat, 12 Jan 2013 09:45:18 +0600
parents
children ecfb1b3c9a39 d4497b76a863
comparison
equal deleted inserted replaced
-1:000000000000 0:9c0607679772
1 #include "stru10.h"
2 #include "Render.h"
3 #include "Indoor.h"
4 #include "Game.h"
5 #include "Party.h"
6
7 #include "mm7_data.h"
8
9
10
11
12 //----- (0049CE9E) --------------------------------------------------------
13 void stru10::_49CE9E(BLVFace *pFace, RenderVertexSoft *a2, signed int a3, RenderVertexSoft *a4)
14 {
15 char *v5; // eax@1
16 signed int v6; // edx@1
17 unsigned int v7; // eax@3
18 signed int v8; // ecx@11
19 signed int v9; // esi@11
20 RenderVertexSoft *v10; // edx@12
21 double v11; // st6@14
22 RenderVertexSoft *v12; // edx@19
23 signed int v13; // ecx@19
24 signed int v14; // esi@19
25 RenderVertexSoft *v15; // edi@20
26 double v16; // st6@22
27 signed int v17; // ecx@27
28 signed int v18; // edi@27
29 char *v19; // esi@28
30 double v20; // st6@30
31 signed int v21; // ecx@35
32 signed int v22; // edi@35
33 char *v23; // esi@36
34 double v24; // st7@38
35 signed int v25; // ecx@45
36 signed int v26; // esi@45
37 RenderVertexSoft *v27; // edx@46
38 double v28; // st6@48
39 signed int v29; // ecx@53
40 signed int v30; // esi@53
41 RenderVertexSoft *v31; // edi@54
42 double v32; // st6@56
43 signed int v33; // ecx@61
44 signed int v34; // edi@61
45 char *v35; // esi@62
46 double v36; // st6@64
47 signed int v37; // edi@69
48 char *v38; // esi@70
49 double v39; // st7@72
50 RenderVertexSoft *v40; // esi@77
51 signed int v41; // ecx@79
52 signed int v42; // esi@79
53 char *v43; // edx@80
54 double v44; // st6@82
55 RenderVertexSoft *v45; // eax@87
56 signed int v46; // ecx@87
57 signed int v47; // edi@87
58 char *v48; // esi@88
59 double v49; // st6@90
60 signed int v50; // ecx@96
61 signed int v51; // edi@96
62 char *v52; // esi@97
63 double v53; // st6@99
64 signed int v54; // ecx@105
65 signed int v55; // edi@105
66 char *v56; // esi@106
67 double v57; // st7@108
68 RenderVertexSoft a2a[64]; // [sp+0h] [bp-C18h]@1
69 float v59; // [sp+C00h] [bp-18h]@4
70 float v60; // [sp+C04h] [bp-14h]@9
71 float v61; // [sp+C08h] [bp-10h]@4
72 float v62; // [sp+C0Ch] [bp-Ch]@9
73 float v63; // [sp+C10h] [bp-8h]@4
74 float v64; // [sp+C14h] [bp-4h]@4
75 float a1a; // [sp+C20h] [bp+8h]@11
76 float a1b; // [sp+C20h] [bp+8h]@19
77 float a1c; // [sp+C20h] [bp+8h]@27
78 float a1d; // [sp+C20h] [bp+8h]@35
79 float a1e; // [sp+C20h] [bp+8h]@45
80 float a1f; // [sp+C20h] [bp+8h]@53
81 float a1g; // [sp+C20h] [bp+8h]@61
82 float a1h; // [sp+C20h] [bp+8h]@69
83 float a1i; // [sp+C20h] [bp+8h]@79
84 float a1j; // [sp+C20h] [bp+8h]@87
85 float a1k; // [sp+C20h] [bp+8h]@96
86 float a1l; // [sp+C20h] [bp+8h]@105
87
88 v5 = (char *)&a2a[0].flt_2C;
89 v6 = 64;
90 do
91 {
92 *(float *)v5 = 0.0;
93 v5 += 48;
94 --v6;
95 }
96 while ( v6 );
97 stru10::CalcPolygonBoundingBox(pFace, a2a);
98 v7 = pFace->uAttributes;
99 if ( v7 & 0x100 )
100 {
101 v63 = a2a[0].vWorldPosition.x;
102 v59 = a2a[2].vWorldPosition.x;
103 v61 = a2a[1].vWorldPosition.y;
104 v64 = a2a[3].vWorldPosition.y;
105 goto LABEL_10;
106 }
107 if ( v7 & 0x200 )
108 {
109 v63 = a2a[0].vWorldPosition.x;
110 v59 = a2a[2].vWorldPosition.x;
111 }
112 else
113 {
114 if ( !(v7 & 0x400) )
115 goto LABEL_10;
116 v61 = a2a[0].vWorldPosition.y;
117 v64 = a2a[2].vWorldPosition.y;
118 }
119 v62 = a2a[1].vWorldPosition.z;
120 v60 = a2a[3].vWorldPosition.z;
121 LABEL_10:
122 if ( v7 & 0x100 )
123 {
124 v8 = -1;
125 a1a = 3.4028235e38;
126 v9 = 0;
127 if ( a3 > 0 )
128 {
129 v10 = a2;
130 do
131 {
132 if ( v10->vWorldPosition.x <= (double)v63 )
133 v11 = v63 - v10->vWorldPosition.x;
134 else
135 v11 = v10->vWorldPosition.x - v63;
136 if ( v11 < a1a )
137 {
138 a1a = v11;
139 v8 = v9;
140 }
141 ++v9;
142 ++v10;
143 }
144 while ( v9 < a3 );
145 }
146 v12 = a4;
147 a1b = 3.4028235e38;
148 memcpy(a4, &a2[v8], 0x30u);
149 v13 = -1;
150 v14 = 0;
151 if ( a3 > 0 )
152 {
153 v15 = a2;
154 do
155 {
156 if ( v15->vWorldPosition.x <= (double)v59 )
157 v16 = v59 - v15->vWorldPosition.x;
158 else
159 v16 = v15->vWorldPosition.x - v59;
160 if ( v16 < a1b )
161 {
162 a1b = v16;
163 v13 = v14;
164 }
165 ++v14;
166 ++v15;
167 }
168 while ( v14 < a3 );
169 }
170 a1c = 3.4028235e38;
171 memcpy(&a4[2], &a2[v13], sizeof(a4[2]));
172 v17 = -1;
173 v18 = 0;
174 if ( a3 > 0 )
175 {
176 v19 = (char *)&a2->vWorldPosition.y;
177 do
178 {
179 if ( *(float *)v19 <= (double)v61 )
180 v20 = v61 - *(float *)v19;
181 else
182 v20 = *(float *)v19 - v61;
183 if ( v20 < a1c )
184 {
185 a1c = v20;
186 v17 = v18;
187 }
188 ++v18;
189 v19 += 48;
190 }
191 while ( v18 < a3 );
192 }
193 a1d = 3.4028235e38;
194 memcpy(&a4[1], &a2[v17], sizeof(a4[1]));
195 v21 = -1;
196 v22 = 0;
197 if ( a3 > 0 )
198 {
199 v23 = (char *)&a2->vWorldPosition.y;
200 do
201 {
202 if ( *(float *)v23 <= (double)v64 )
203 v24 = v64 - *(float *)v23;
204 else
205 v24 = *(float *)v23 - v64;
206 if ( v24 < a1d )
207 {
208 a1d = v24;
209 v21 = v22;
210 }
211 ++v22;
212 v23 += 48;
213 }
214 while ( v22 < a3 );
215 }
216 LABEL_77:
217 v40 = &a2[v21];
218 goto LABEL_115;
219 }
220 if ( v7 & 0x200 )
221 {
222 v25 = -1;
223 a1e = 3.4028235e38;
224 v26 = 0;
225 if ( a3 > 0 )
226 {
227 v27 = a2;
228 do
229 {
230 if ( v27->vWorldPosition.x <= (double)v63 )
231 v28 = v63 - v27->vWorldPosition.x;
232 else
233 v28 = v27->vWorldPosition.x - v63;
234 if ( v28 < a1e )
235 {
236 a1e = v28;
237 v25 = v26;
238 }
239 ++v26;
240 ++v27;
241 }
242 while ( v26 < a3 );
243 }
244 v12 = a4;
245 a1f = 3.4028235e38;
246 memcpy(a4, &a2[v25], 0x30u);
247 v29 = -1;
248 v30 = 0;
249 if ( a3 > 0 )
250 {
251 v31 = a2;
252 do
253 {
254 if ( v31->vWorldPosition.x <= (double)v59 )
255 v32 = v59 - v31->vWorldPosition.x;
256 else
257 v32 = v31->vWorldPosition.x - v59;
258 if ( v32 < a1f )
259 {
260 a1f = v32;
261 v29 = v30;
262 }
263 ++v30;
264 ++v31;
265 }
266 while ( v30 < a3 );
267 }
268 a1g = 3.4028235e38;
269 memcpy(&a4[2], &a2[v29], sizeof(a4[2]));
270 v33 = -1;
271 v34 = 0;
272 if ( a3 > 0 )
273 {
274 v35 = (char *)&a2->vWorldPosition.z;
275 do
276 {
277 if ( *(float *)v35 <= (double)v62 )
278 v36 = v62 - *(float *)v35;
279 else
280 v36 = *(float *)v35 - v62;
281 if ( v36 < a1g )
282 {
283 a1g = v36;
284 v33 = v34;
285 }
286 ++v34;
287 v35 += 48;
288 }
289 while ( v34 < a3 );
290 }
291 a1h = 3.4028235e38;
292 memcpy(&a4[1], &a2[v33], sizeof(a4[1]));
293 v21 = -1;
294 v37 = 0;
295 if ( a3 > 0 )
296 {
297 v38 = (char *)&a2->vWorldPosition.z;
298 do
299 {
300 if ( *(float *)v38 <= (double)v60 )
301 v39 = v60 - *(float *)v38;
302 else
303 v39 = *(float *)v38 - v60;
304 if ( v39 < a1h )
305 {
306 a1h = v39;
307 v21 = v37;
308 }
309 ++v37;
310 v38 += 48;
311 }
312 while ( v37 < a3 );
313 }
314 goto LABEL_77;
315 }
316 if ( !(v7 & 0x400) )
317 return;
318 v41 = -1;
319 a1i = 3.4028235e38;
320 v42 = 0;
321 if ( a3 > 0 )
322 {
323 v43 = (char *)&a2->vWorldPosition.y;
324 do
325 {
326 if ( *(float *)v43 <= (double)v61 )
327 v44 = v61 - *(float *)v43;
328 else
329 v44 = *(float *)v43 - v61;
330 if ( v44 < a1i )
331 {
332 a1i = v44;
333 v41 = v42;
334 }
335 ++v42;
336 v43 += 48;
337 }
338 while ( v42 < a3 );
339 }
340 v45 = a2;
341 v12 = a4;
342 a1j = 3.4028235e38;
343 memcpy(a4, &a2[v41], 0x30u);
344 v46 = -1;
345 v47 = 0;
346 if ( a3 > 0 )
347 {
348 v48 = (char *)&a2->vWorldPosition.y;
349 do
350 {
351 if ( *(float *)v48 <= (double)v64 )
352 v49 = v64 - *(float *)v48;
353 else
354 v49 = *(float *)v48 - v64;
355 if ( v49 < a1j )
356 {
357 a1j = v49;
358 v46 = v47;
359 }
360 ++v47;
361 v48 += 48;
362 }
363 while ( v47 < a3 );
364 v45 = a2;
365 }
366 a1k = 3.4028235e38;
367 memcpy(&a4[2], &v45[v46], sizeof(a4[2]));
368 v50 = -1;
369 v51 = 0;
370 if ( a3 > 0 )
371 {
372 v52 = (char *)&v45->vWorldPosition.z;
373 do
374 {
375 if ( *(float *)v52 <= (double)v62 )
376 v53 = v62 - *(float *)v52;
377 else
378 v53 = *(float *)v52 - v62;
379 if ( v53 < a1k )
380 {
381 a1k = v53;
382 v50 = v51;
383 }
384 ++v51;
385 v52 += 48;
386 }
387 while ( v51 < a3 );
388 v45 = a2;
389 }
390 a1l = 3.4028235e38;
391 memcpy(&a4[1], &v45[v50], sizeof(a4[1]));
392 v54 = -1;
393 v55 = 0;
394 if ( a3 > 0 )
395 {
396 v56 = (char *)&v45->vWorldPosition.z;
397 do
398 {
399 if ( *(float *)v56 <= (double)v60 )
400 v57 = v60 - *(float *)v56;
401 else
402 v57 = *(float *)v56 - v60;
403 if ( v57 < a1l )
404 {
405 a1l = v57;
406 v54 = v55;
407 }
408 ++v55;
409 v56 += 48;
410 }
411 while ( v55 < a3 );
412 v45 = a2;
413 }
414 v40 = &v45[v54];
415 LABEL_115:
416 memcpy(&v12[3], v40, sizeof(v12[3]));
417 }
418
419 //----- (0049D379) --------------------------------------------------------
420 void stru10::CalcPolygonBoundingBox(BLVFace *pFace, RenderVertexSoft *pOutVertices)
421 {
422 struct
423 {
424 float x;
425 float y;
426 int c;
427 } v46[40]; //[sp+0C];
428
429 if (pFace->uAttributes & 0x0100)
430 {
431 for (uint i = 0; i < pFace->uNumVertices; ++i)
432 {
433 v46[i].x = pIndoor->pVertices[pFace->pVertexIDs[i]].x + pFace->pXInterceptDisplacements[i];
434 v46[i].y = pIndoor->pVertices[pFace->pVertexIDs[i]].y + pFace->pYInterceptDisplacements[i];
435 v46[i].c = i;
436 }
437 }
438 if (pFace->uAttributes & 0x0200)
439 {
440 for (uint i = 0; i < pFace->uNumVertices; ++i)
441 {
442 v46[i].x = pIndoor->pVertices[pFace->pVertexIDs[i]].x + pFace->pXInterceptDisplacements[i];
443 v46[i].y = pIndoor->pVertices[pFace->pVertexIDs[i]].y + pFace->pZInterceptDisplacements[i];
444 v46[i].c = i;
445 }
446 }
447 if (pFace->uAttributes & 0x0400)
448 {
449 for (uint i = 0; i < pFace->uNumVertices; ++i)
450 {
451 v46[i].x = pIndoor->pVertices[pFace->pVertexIDs[i]].x + pFace->pYInterceptDisplacements[i];
452 v46[i].y = pIndoor->pVertices[pFace->pVertexIDs[i]].y + pFace->pZInterceptDisplacements[i];
453 v46[i].c = i;
454 }
455 }
456
457 float x_min = FLT_MAX;
458 uint x_min_idx = 0;
459
460 float x_max = FLT_MIN;
461 uint x_max_idx = 0;
462
463 float y_min = FLT_MAX;
464 uint y_min_idx = 0;
465
466 float y_max = FLT_MIN;
467 uint y_max_idx = 0;
468
469 for (uint i = 0; i < pFace->uNumVertices; ++i)
470 {
471 if (v46[i].x < x_min)
472 {
473 x_min = v46[i].x;
474 x_min_idx = v46[i].c;
475 }
476 if (v46[i].x > x_max)
477 {
478 x_max = v46[i].x;
479 x_max_idx = v46[i].c;
480 }
481
482 if (v46[i].y < y_min)
483 {
484 y_min = v46[i].y;
485 y_min_idx = v46[i].c;
486 }
487 if (v46[i].y > y_max)
488 {
489 y_max = v46[i].y;
490 y_max_idx = v46[i].c;
491 }
492 }
493
494
495
496 auto p1 = &pIndoor->pVertices[pFace->pVertexIDs[x_min_idx]];
497 RenderVertexSoft v1; // [sp+30Ch] [bp-54h]@24
498 v1.vWorldPosition.x = (float)p1->x;
499 v1.vWorldPosition.y = (float)p1->y;
500 v1.vWorldPosition.z = (float)p1->z;
501 memcpy(pOutVertices + 0, &v1, sizeof(RenderVertexSoft));
502
503 auto p2 = &pIndoor->pVertices[pFace->pVertexIDs[y_min_idx]];
504 RenderVertexSoft v2; // [sp+30Ch] [bp-54h]@24
505 v2.vWorldPosition.x = (float)p2->x;
506 v2.vWorldPosition.y = (float)p2->y;
507 v2.vWorldPosition.z = (float)p2->z;
508 memcpy(pOutVertices + 1, &v2, sizeof(RenderVertexSoft));
509
510 auto p3 = &pIndoor->pVertices[pFace->pVertexIDs[x_max_idx]];
511 RenderVertexSoft v3; // [sp+30Ch] [bp-54h]@24
512 v3.vWorldPosition.x = (float)p3->x;
513 v3.vWorldPosition.y = (float)p3->y;
514 v3.vWorldPosition.z = (float)p3->z;
515 memcpy(pOutVertices + 2, &v3, sizeof(RenderVertexSoft));
516
517 auto p4 = &pIndoor->pVertices[pFace->pVertexIDs[y_max_idx]];
518 RenderVertexSoft v4; // [sp+30Ch] [bp-54h]@24
519 v4.vWorldPosition.x = (double)p4->x;
520 v4.vWorldPosition.y = (double)p4->y;
521 v4.vWorldPosition.z = (double)p4->z;
522 memcpy(pOutVertices + 3, &v4, sizeof(RenderVertexSoft));
523 }
524
525
526 //----- (0049C9E3) --------------------------------------------------------
527 bool stru10::_49C9E3(BLVFace *pFace, RenderVertexSoft *pFaceBounding, unsigned int uNumVertices, RenderVertexSoft *arg0)
528 {
529 //IndoorCameraD3D *v6; // edi@1
530 //PolygonType v7; // al@1
531 //unsigned int v8; // edx@7
532 //char v10; // zf@10
533 //float v13; // ST14_4@20
534 //stru10 *v15; // ecx@21
535 //RenderVertexSoft *v16; // ST0C_4@21
536 //bool result; // eax@21
537 //float v18; // ST14_4@24
538 //stru10 *v19; // edi@29
539 //float v20; // ST14_4@30
540 //float v21; // ST14_4@30
541 //float v22; // ST14_4@30
542 //float v23; // ST14_4@30
543 //float v24; // ST14_4@31
544 //RenderVertexSoft v25; // [sp+10h] [bp-90h]@24
545 //RenderVertexSoft v26; // [sp+40h] [bp-60h]@20
546 //IndoorCameraD3D *thisa; // [sp+70h] [bp-30h]@1
547 //stru10 *v31; // [sp+84h] [bp-1Ch]@1
548 float v32; // [sp+88h] [bp-18h]@8
549 Vec3_float_ a1; // [sp+8Ch] [bp-14h]@1
550 float v35; // [sp+9Ch] [bp-4h]@8
551
552 //auto a3 = pFace;
553 //auto arg4 = pFaceBounding;
554
555 //_ESI = a3;
556 //v31 = this;
557 //v6 = pGame->pIndoorCameraD3D;
558 //v7 = a3->uPolygonType;
559
560 a1.x = 0.0f;
561 a1.y = 0.0f;
562 a1.z = 0.0f;
563
564 float var_28;
565 float var_24;
566 if (pFace->uPolygonType == POLYGON_VerticalWall)
567 {
568 a1.x = -pFace->pFacePlane.vNormal.y;
569 a1.y = pFace->pFacePlane.vNormal.x;
570 a1.z = 0.0f;
571 a1.Normalize();
572
573 var_28 = 0;
574 var_24 = 1;
575 }
576 else if (pFace->uPolygonType == POLYGON_Floor ||
577 pFace->uPolygonType == POLYGON_Ceiling)
578 {
579 a1.x = 1;
580 a1.y = 0;
581 a1.z = 0.0f;
582
583 var_28 = 1;
584 var_24 = 0;
585 }
586
587
588 float arg_4;
589 float var_18;
590 float var_4;
591 float a3;
592 float var_8;
593 //v8 = _ESI->uAttributes;
594 //_ECX = pFaceBounding;
595 //__asm { fld 0.5 }
596 if (pFace->uAttributes & 0x0100)
597 {
598 arg_4 = (pFaceBounding[0].vWorldPosition.x + pFaceBounding[2].vWorldPosition.x) / 2;
599 var_18 = (pFaceBounding[3].vWorldPosition.y + pFaceBounding[1].vWorldPosition.y) / 2;
600 var_4 = (pFaceBounding[0].vWorldPosition.z + pFaceBounding[2].vWorldPosition.z) / 2;
601
602 a3 = arg_4 - pFaceBounding[0].vWorldPosition.x;
603 var_8 = var_18 - pFaceBounding[1].vWorldPosition.y;
604 }
605 if (pFace->uAttributes & 0x0200)
606 {
607 arg_4 = (pFaceBounding[0].vWorldPosition.x + pFaceBounding[2].vWorldPosition.x) / 2;
608 var_18 = (pFaceBounding[0].vWorldPosition.y + pFaceBounding[2].vWorldPosition.y) / 2;
609 var_4 = (pFaceBounding[1].vWorldPosition.z + pFaceBounding[3].vWorldPosition.z) / 2;
610
611 a3 = arg_4 - pFaceBounding[0].vWorldPosition.x;
612 var_8 = var_4 - pFaceBounding[1].vWorldPosition.z;
613
614 if (pFace->uPolygonType == POLYGON_VerticalWall)
615 a3 /= a1.x;
616 }
617 if (pFace->uAttributes & 0x0400)
618 {
619 arg_4 = (pFaceBounding[0].vWorldPosition.x + pFaceBounding[2].vWorldPosition.x) / 2;
620 var_18 = (pFaceBounding[0].vWorldPosition.y + pFaceBounding[2].vWorldPosition.y) / 2;
621 var_4 = (pFaceBounding[1].vWorldPosition.z + pFaceBounding[3].vWorldPosition.z) / 2;
622
623 a3 = var_18 - pFaceBounding[0].vWorldPosition.y;
624 var_8 = var_4 - pFaceBounding[1].vWorldPosition.z;
625 // [0.5]
626 if (pFace->uPolygonType == POLYGON_VerticalWall)
627 {
628 if (a1.x != 1.0f)
629 a3 /= a1.y;
630 }
631 }
632
633
634 if ( byte_4D864C && pGame->uFlags & 8 )
635 {
636 RenderVertexSoft v26; // [sp+40h] [bp-60h]@20
637 v26.vWorldPosition.x = arg_4;
638 v26.vWorldPosition.y = v32;
639 v26.vWorldPosition.z = v35;
640
641 pGame->pIndoorCameraD3D->do_draw_debug_line_sw(pFaceBounding, 0xFF00u, &v26, 0xFF0000u, 0, 0);
642 }
643
644 //_EBX = arg0;
645 //v15 = v31;
646 //v16 = arg0;
647 float var_20 = var_8 * var_24;
648 var_8 = a3 * a1.z;
649 float arg_0 = var_8 + var_4;
650
651 arg0[0].vWorldPosition.x = arg_4 - a3 * a1.x + var_8 * flt_4D84E8;
652 arg0[0].vWorldPosition.y = var_18 - a3 * a1.y + var_8 * var_28;
653 arg0[0].vWorldPosition.z = var_4 - var_8 + var_8 * var_24;
654 arg0[1].vWorldPosition.x = arg_4 - a3 * a1.x - var_8 * flt_4D84E8;
655 arg0[1].vWorldPosition.y = var_18 - a3 * a1.y - var_8 * var_28;
656 arg0[1].vWorldPosition.z = (var_4 - var_8) - var_8 * var_24;
657 arg0[2].vWorldPosition.x = a3 * a1.x + arg_4 - var_8 * flt_4D84E8;
658 arg0[2].vWorldPosition.y = a3 * a1.y + var_18 - var_8 * var_28;
659 arg0[2].vWorldPosition.z = var_8 + var_4 - var_20;
660 arg0[3].vWorldPosition.x = (a3 * a1.x + arg_4) + var_8 * flt_4D84E8;
661 arg0[3].vWorldPosition.y = a3 * a1.y + var_18 + var_8 * var_28;
662 arg0[3].vWorldPosition.z = arg_0 + var_20;
663
664 a3 = (var_4 - var_8);
665 a3 = (a3 * a1.x + arg_4);
666
667 a1.x = 0.0f;
668 a1.y = 0.0f;
669 a1.z = 0.0f;
670
671 if (!_49C8DC(arg0, &a1, &a3))
672 return false;
673
674
675 if ( byte_4D864C )
676 {
677 if ( pGame->uFlags & 8 )
678 {
679 RenderVertexSoft v25; // [sp+10h] [bp-90h]@20
680 RenderVertexSoft v26; // [sp+40h] [bp-60h]@20
681
682 v25.vWorldPosition.x = arg_4;
683 v25.vWorldPosition.y = v32;
684 v25.vWorldPosition.z = v35;
685
686 v26.vWorldPosition.x = a1.x * 30.0f;
687 v26.vWorldPosition.y = a1.y * 30.0f;
688 v26.vWorldPosition.z = a1.z * 30.0f;
689
690 pGame->pIndoorCameraD3D->do_draw_debug_line_sw(&v25, 0xFFFFFFFFu, &v26, 0xFFFF00u, 0, 0);
691 }
692 }
693
694
695 RenderVertexSoft v25; // [sp+10h] [bp-90h]@20
696 memcpy(&v25, arg0, sizeof(RenderVertexSoft));
697
698 float _dp = (v25.vWorldPosition.x - pBLVRenderParams->vPartyPos.x) * a1.x +
699 (v25.vWorldPosition.y - pBLVRenderParams->vPartyPos.y) * a1.y +
700 (v25.vWorldPosition.z - pBLVRenderParams->vPartyPos.z) * a1.z;
701 if (fabs(_dp) < 1e-6f)
702 {
703 memcpy(&v25, arg0 + 1, sizeof(RenderVertexSoft));
704 memcpy(arg0 + 1, arg0 + 3, sizeof(RenderVertexSoft));
705 memcpy(arg0 + 3, &v25, sizeof(RenderVertexSoft));
706 }
707
708 if ( byte_4D864C && pGame->uFlags & 8 )
709 {
710 RenderVertexSoft v26; // [sp+40h] [bp-60h]@20
711 if ( !LOBYTE(field_4) )
712 {
713 v26.vWorldPosition.x = pParty->vPosition.x;
714 v26.vWorldPosition.y = pParty->vPosition.y;
715 v26.vWorldPosition.z = pParty->vPosition.z + pParty->sEyelevel;
716
717 pGame->pIndoorCameraD3D->do_draw_debug_line_sw(&v26, 0xFF0000u, arg0, 0xFF0000u, 0, 0);
718 pGame->pIndoorCameraD3D->do_draw_debug_line_sw(&v26, 0xFF00u, arg0 + 1, 0xFF00u, 0, 0);
719 pGame->pIndoorCameraD3D->do_draw_debug_line_sw(&v26, 0xFFu, arg0 + 2, 0xFFu, 0, 0);
720 pGame->pIndoorCameraD3D->do_draw_debug_line_sw(&v26, 0xFFFFFFu, arg0 + 3, 0xFFFFFFu, 0, 0);
721 LOBYTE(field_4) = 1;
722 }
723 pGame->pIndoorCameraD3D->debug_outline_sw(arg0, uNumVertices, 0x1EFF1Eu, 0.00019999999);
724 }
725 return true;
726 }
727
728
729
730 //----- (0049C5B0) --------------------------------------------------------
731 stru10::stru10()
732 {
733 LOBYTE(this->field_4) = 0;
734 }
735
736 //----- (0049C5BD) --------------------------------------------------------
737 stru10::~stru10()
738 {
739 }
740
741 //----- (0049C5DA) --------------------------------------------------------
742 char stru10::_49C5DA(BLVFace *a2, RenderVertexSoft *a3, int *a4, IndoorCameraD3D_Vec4 *a5, RenderVertexSoft *a6)
743 {
744 stru10 *v6; // edi@1
745 char *v7; // eax@1
746 signed int v8; // ecx@1
747 IndoorCameraD3D *v9; // esi@3
748 char result; // al@6
749 RenderVertexSoft a4a[4]; // [sp+Ch] [bp-C0h]@1
750
751 v6 = this;
752 v7 = (char *)&a4a[0].flt_2C;
753 v8 = 4;
754 do
755 {
756 *(float *)v7 = 0.0;
757 v7 += 48;
758 --v8;
759 }
760 while ( v8 );
761 v9 = pGame->pIndoorCameraD3D;
762 _49CE9E(a2, a3, *a4, a4a);
763 if ( byte_4D864C && pGame->uFlags & 8 )
764 pGame->pIndoorCameraD3D->debug_outline_sw(a4a, 4u, 0xFF1E1Eu, 0.000099999997);
765 result = _49C9E3(a2, a4a, 4u, a6);
766 if ( result )
767 result = _49C720(a6, a5);
768 return result;
769 }
770 // 4D864C: using guessed type char byte_4D864C;
771
772 //----- (0049C681) --------------------------------------------------------
773 char stru10::_49C681_DrawDebugStuff(BLVFace *pFace, IndoorCameraD3D_Vec4 *a3, RenderVertexSoft *pArrayOf4)
774 {
775 RenderVertexSoft pBounding[4]; // [sp+Ch] [bp-C0h]@1
776
777 CalcPolygonBoundingBox(pFace, pBounding);
778 if ( byte_4D864C && pGame->uFlags & 8 )
779 pGame->pIndoorCameraD3D->debug_outline_sw(pBounding, 4, 0xFF1E1E, 0.000099999997);
780 if (_49C9E3(pFace, pBounding, 4, pArrayOf4))
781 return _49C720(pArrayOf4, a3);
782 return false;
783 }
784 // 4D864C: using guessed type char byte_4D864C;
785
786 //----- (0049C720) --------------------------------------------------------
787 char stru10::_49C720(RenderVertexSoft *a2, IndoorCameraD3D_Vec4 *a4)
788 {
789 char result; // al@2
790 Vec3_float_ a3; // [sp+4h] [bp-34h]@1
791 float v5; // [sp+30h] [bp-8h]@1
792 stru10 *thisa; // [sp+34h] [bp-4h]@1
793
794 v5 = 0.0;
795 a3.x = (double)pBLVRenderParams->vPartyPos.x;
796 a3.y = (double)pBLVRenderParams->vPartyPos.y;
797 thisa = this;
798 a3.z = (double)pBLVRenderParams->vPartyPos.z;
799 if ( _49C7C5(a2, a2 + 1, &a3, a4)
800 && _49C7C5(a2 + 1, a2 + 2, &a3, a4 + 1)
801 && _49C7C5(a2 + 2, a2 + 3, &a3, a4 + 2) )
802 result = _49C7C5(a2 + 3, a2, &a3, a4 + 3) != 0;
803 else
804 result = 0;
805 return result;
806 }
807
808 //----- (0049C7C5) --------------------------------------------------------
809 bool stru10::_49C7C5(RenderVertexSoft *a1, RenderVertexSoft *a2, Vec3_float_ *a3, IndoorCameraD3D_Vec4 *a4)
810 {
811 double v5; // st7@1
812 double v6; // st6@1
813 double v7; // st5@1
814 Vec3_float_ *result; // eax@1
815 __int16 v9; // fps@3
816 char v10; // c0@3
817 char v11; // c2@3
818 char v12; // c3@3
819 float v13; // ecx@5
820 double v14; // st7@5
821 double v15; // st6@5
822 Vec3_float_ v1; // [sp+4h] [bp-48h]@1
823 Vec3_float_ v2; // [sp+10h] [bp-3Ch]@1
824 float v18; // [sp+20h] [bp-2Ch]@1
825 float v19; // [sp+24h] [bp-28h]@1
826 Vec3_float_ v20; // [sp+28h] [bp-24h]@1
827 Vec3_float_ v21; // [sp+34h] [bp-18h]@1
828 Vec3_float_ a1a; // [sp+40h] [bp-Ch]@1
829
830 a1a.x = 0.0;
831 a1a.y = 0.0;
832 a1a.z = 0.0;
833 v21.x = a3->x;
834 v21.y = a3->y;
835 v21.z = a3->z;
836 v5 = a1->vWorldPosition.x;
837 v6 = a1->vWorldPosition.y;
838 v2.z = a1->vWorldPosition.z;
839 v7 = a2->vWorldPosition.x;
840 v18 = a2->vWorldPosition.y;
841 v19 = a2->vWorldPosition.z;
842 v20.x = v5 - v21.x;
843 v20.y = v6 - v21.y;
844 v20.z = v2.z - v21.z;
845 LODWORD(v1.x) = (int)v20.x;
846 v1.y = v20.y;
847 v1.z = v20.z;
848 v20.x = v7 - v5;
849 v20.y = v18 - v6;
850 v20.z = v19 - v2.z;
851 result = Vec3_float_::Cross(&v1, &v2, v20.x, v20.y, v20.z);
852 a1a.x = result->x;
853 a1a.y = result->y;
854 a1a.z = result->z;
855 if ( a1a.x != 0.0
856 || a1a.y != 0.0
857 || (/*UNDEF(v9),*/ v10 = a1a.z < 0.0, v11 = 0, v12 = a1a.z == 0.0, BYTE1(result) = HIBYTE(v9), a1a.z != 0.0) )
858 {
859 a1a.Normalize();
860 result = (Vec3_float_ *)a4;
861 v13 = a1a.y;
862 a4->x = a1a.x;
863 v14 = v21.z * a1a.z;
864 v15 = v21.y * a1a.y;
865 a4->y = v13;
866 a4->z = a1a.z;
867 a4->dot = v14 + v15 + v21.x * a1a.x;
868 LOBYTE(result) = 1;
869 }
870 else
871 {
872 LOBYTE(result) = 0;
873 }
874 return (bool)result;
875 }
876
877 //----- (0049C8DC) --------------------------------------------------------
878 bool stru10::_49C8DC(RenderVertexSoft *arg0, Vec3_float_ *a2, float *a3)
879 {
880 double v4; // st7@1
881 double v5; // st6@1
882 double v6; // st5@1
883 Vec3_float_ *result; // eax@1
884 __int16 v8; // fps@3
885 char v9; // c0@3
886 char v10; // c2@3
887 char v11; // c3@3
888 float v12; // ecx@5
889 double v13; // st7@5
890 double v14; // st6@5
891 Vec3_float_ v1; // [sp+8h] [bp-3Ch]@1
892 Vec3_float_ v2; // [sp+14h] [bp-30h]@1
893 float v17; // [sp+24h] [bp-20h]@1
894 float v18; // [sp+28h] [bp-1Ch]@1
895 float v19; // [sp+2Ch] [bp-18h]@1
896 float v20; // [sp+30h] [bp-14h]@1
897 float v21; // [sp+34h] [bp-10h]@1
898 Vec3_float_ a1; // [sp+38h] [bp-Ch]@1
899
900 v19 = arg0->vWorldPosition.x;
901 v20 = arg0->vWorldPosition.y;
902 v21 = arg0->vWorldPosition.z;
903 v4 = arg0[1].vWorldPosition.x;
904 v5 = arg0[1].vWorldPosition.y;
905 v2.z = arg0[1].vWorldPosition.z;
906 v6 = arg0[2].vWorldPosition.x;
907 v17 = arg0[2].vWorldPosition.y;
908 v18 = arg0[2].vWorldPosition.z;
909 a1.x = v4 - v19;
910 a1.y = v5 - v20;
911 a1.z = v2.z - v21;
912 LODWORD(v1.x) = (int)a1.x;
913 v1.y = a1.y;
914 v1.z = a1.z;
915 a1.x = v6 - v4;
916 a1.y = v17 - v5;
917 a1.z = v18 - v2.z;
918 result = Vec3_float_::Cross(&v1, &v2, a1.x, a1.y, a1.z);
919 a1.x = result->x;
920 a1.y = result->y;
921 a1.z = result->z;
922 if ( a1.x != 0.0
923 || a1.y != 0.0
924 || (/*UNDEF(v8),*/ v9 = a1.z < 0.0, v10 = 0, v11 = a1.z == 0.0, /*BYTE1(result) = HIBYTE(v8),*/ a1.z != 0.0) )
925 {
926 a1.Normalize();
927 v12 = a1.y;
928 a2->x = a1.x;
929 v13 = v21 * a1.z;
930 v14 = v20 * a1.y;
931 a2->y = v12;
932 a2->z = a1.z;
933 result = (Vec3_float_ *)a3;
934 *a3 = -(v13 + v14 + v19 * a1.x);
935 return true;
936 }
937 return false;
938 }