comparison IndoorCameraD3D.cpp @ 0:9c0607679772

init
author Ritor1
date Sat, 12 Jan 2013 09:45:18 +0600
parents
children ec84db4c8f9d
comparison
equal deleted inserted replaced
-1:000000000000 0:9c0607679772
1 #include "IndoorCameraD3D.h"
2 #include "VectorTypes.h"
3 #include "Game.h"
4 #include "Indoor.h"
5 #include "Viewport.h"
6 #include "IndoorCamera.h"
7 #include "OutdoorCamera.h"
8 #include "Render.h"
9 #include "LOD.h"
10
11 #include "mm7_data.h"
12
13
14
15 //----- (004364C5) --------------------------------------------------------
16 void IndoorCameraD3D::ViewTransfrom_OffsetUV(RenderVertexSoft *pVertices, unsigned int uNumVertices, RenderVertexSoft *pOutVertices, stru320 *a5)
17 {
18 for (uint i = 0; i < uNumVertices; ++i)
19 {
20 pOutVertices[i].vWorldPosition.x = pVertices[i].vWorldPosition.x;
21 pOutVertices[i].vWorldPosition.y = pVertices[i].vWorldPosition.y;
22 pOutVertices[i].vWorldPosition.z = pVertices[i].vWorldPosition.z;
23
24 pOutVertices[i].u = pVertices[i].u + a5->pDeltaUV[0];
25 pOutVertices[i].v = pVertices[i].v + a5->pDeltaUV[1];
26 }
27 ViewTransform(pOutVertices, uNumVertices);
28 }
29
30 //----- (0043669D) --------------------------------------------------------
31 char IndoorCameraD3D::ApplyViewTransform_TrueIfStillVisible(int x, int y, int z, signed int *pOutX, int *pOutZ, int *pOutY, char bDoNotShow)
32 {
33 int to_z; // esi@2
34 int v9; // ecx@3
35 signed int *v10; // esi@5
36 int pOutY_; // ecx@5
37 signed int v12; // esi@7
38 int v14; // [sp+8h] [bp-4h]@3
39 int to_x; // [sp+14h] [bp+8h]@1
40 int to_y; // [sp+18h] [bp+Ch]@1
41 int a2b; // [sp+18h] [bp+Ch]@5
42 int a3a; // [sp+1Ch] [bp+10h]@5
43
44 to_x = (x - pBLVRenderParams->vPartyPos.x) << 16;
45 to_y = (y - pBLVRenderParams->vPartyPos.y) << 16;
46 if ( pBLVRenderParams->sPartyRotX )
47 {
48 to_z = (z - pBLVRenderParams->vPartyPos.z) << 16;
49 if ( pRenderer->pRenderD3D )
50 {
51 v14 = ((unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sCosineY) >> 16)
52 + ((unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sSineY) >> 16);
53 v9 = ((unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sSineY) >> 16)
54 - ((unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sCosineY) >> 16);
55 }
56 else
57 {
58 v14 = ((unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sCosineY) >> 16)
59 - ((unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sSineY) >> 16);
60 v9 = ((unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sSineY) >> 16)
61 + ((unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sCosineY) >> 16);
62 }
63 a3a = (z - pBLVRenderParams->vPartyPos.z) << 16;
64 a2b = (unsigned __int64)(to_z * (signed __int64)pBLVRenderParams->sSineNegX) >> 16;
65 v10 = pOutX;
66 *pOutX = ((unsigned __int64)(v14 * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16) - a2b;
67 *pOutZ = v9;
68 pOutY_ = ((unsigned __int64)(v14 * (signed __int64)pBLVRenderParams->sSineNegX) >> 16)
69 + ((unsigned __int64)(a3a * (signed __int64)pBLVRenderParams->sCosineNegX) >> 16);
70 }
71 else
72 {
73 pOutY_ = (z - pBLVRenderParams->vPartyPos.z) << 16;
74 if ( pRenderer->pRenderD3D )
75 {
76 v10 = pOutX;
77 *pOutX = ((unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sCosineY) >> 16)
78 + ((unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sSineY) >> 16);
79 *pOutZ = ((unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sSineY) >> 16)
80 - ((unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sCosineY) >> 16);
81 }
82 else
83 {
84 v10 = pOutX;
85 *pOutX = ((unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sCosineY) >> 16)
86 - ((unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sSineY) >> 16);
87 *pOutZ = ((unsigned __int64)(to_x * (signed __int64)pBLVRenderParams->sSineY) >> 16)
88 + ((unsigned __int64)(to_y * (signed __int64)pBLVRenderParams->sCosineY) >> 16);
89 }
90 }
91 *pOutY = pOutY_;
92 return !bDoNotShow || (v12 = *v10, v12 >= (signed int)0x40000u) && v12 <= (signed int)0x1F400000u;
93 }
94
95
96
97 //----- (00436455) --------------------------------------------------------
98 bool IndoorCameraD3D::IsCulled(BLVFace *pFace)
99 {
100 RenderVertexSoft v; // [sp+8h] [bp-30h]@1
101
102 Vec3_short__to_RenderVertexSoft(&v, &pIndoor->pVertices[*pFace->pVertexIDs]);
103 return is_face_faced_to_camera(pFace, &v);
104 }
105
106 //----- (00436523) --------------------------------------------------------
107 void IndoorCameraD3D::ViewTransform(RenderVertexSoft *a1a, unsigned int uNumVertices)
108 {
109 if (byte_4D864C && pGame->uFlags & 0x80 ||
110 uCurrentlyLoadedLevelType == LEVEL_Indoor)
111 {
112 float sin_x = pIndoorCamera->fRotationXSine,
113 cos_x = pIndoorCamera->fRotationXCosine;
114 float sin_y = pIndoorCamera->fRotationYSine,
115 cos_y = pIndoorCamera->fRotationYCosine;
116
117 //v4 = uNumVertices;
118 //v7 = pIndoorCamera->fRotationXSine;
119 if ( pIndoorCamera->sRotationX )
120 {
121
122 //_EAX = a1a;
123 for (uint i = 0; i < uNumVertices; ++i)
124 {
125 float st0, st1, st2;
126 if ( pRenderer->pRenderD3D )
127 {
128 /*__asm
129 {
130 fld [ebp+uNumVertices] // [(a1a[i].y - pIndoorCamera->pos.y)] [(a1a[i].z - pIndoorCamera->pos.z)] [pIndoorCamera->fRotationXCosine] [pIndoorCamera->fRotationYSine] [pIndoorCamera->fRotationYCosine]
131 fmul st, st(3) // [pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)] [(a1a[i].z - pIndoorCamera->pos.z)] [pIndoorCamera->fRotationXCosine] [pIndoorCamera->fRotationYSine] [pIndoorCamera->fRotationYCosine]
132 fld [ebp+a1] // [(a1a[i].x - pIndoorCamera->pos.x)] [pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)] [(a1a[i].z - pIndoorCamera->pos.z)] [pIndoorCamera->fRotationXCosine] [pIndoorCamera->fRotationYSine] [pIndoorCamera->fRotationYCosine]
133 fmul st, st(5) // 0[pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x)]
134 // 1[pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)]
135 // 2[(a1a[i].z - pIndoorCamera->pos.z)]
136 // 3[pIndoorCamera->fRotationXCosine]
137 // 4[pIndoorCamera->fRotationYSine]
138 // 5[pIndoorCamera->fRotationYCosine]
139 faddp st(1), st // [pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x) + pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)] [(a1a[i].z - pIndoorCamera->pos.z)] [pIndoorCamera->fRotationXCosine] [pIndoorCamera->fRotationYSine] [pIndoorCamera->fRotationYCosine]
140 fld [ebp+a1] // [(a1a[i].x - pIndoorCamera->pos.x)] [pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x) + pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)] [(a1a[i].z - pIndoorCamera->pos.z)] [pIndoorCamera->fRotationXCosine] [pIndoorCamera->fRotationYSine] [pIndoorCamera->fRotationYCosine]
141 fmul st, st(4) // [pIndoorCamera->fRotationYSine * (a1a[i].x - pIndoorCamera->pos.x)] [pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x) + pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)] [(a1a[i].z - pIndoorCamera->pos.z)] [pIndoorCamera->fRotationXCosine] [pIndoorCamera->fRotationYSine] [pIndoorCamera->fRotationYCosine]
142
143 fld [ebp+uNumVertices] // 0[a1a[i].y - pIndoorCamera->pos.y]
144 // 1[pIndoorCamera->fRotationYSine * (a1a[i].x - pIndoorCamera->pos.x)]
145 // 2[pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x) + pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)]
146 // 3[(a1a[i].z - pIndoorCamera->pos.z)]
147 // 4[pIndoorCamera->fRotationXCosine]
148 // 5[pIndoorCamera->fRotationYSine]
149 // 6[pIndoorCamera->fRotationYCosine]
150
151 fmul st, st(6) // 0[pIndoorCamera->fRotationYCosine * (a1a[i].y - pIndoorCamera->pos.y)]
152 // 1[pIndoorCamera->fRotationYSine * (a1a[i].x - pIndoorCamera->pos.x)]
153 // 2[pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x) + pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)]
154 // 3[(a1a[i].z - pIndoorCamera->pos.z)]
155 // 4[pIndoorCamera->fRotationXCosine]
156 // 5[pIndoorCamera->fRotationYSine]
157 // 6[pIndoorCamera->fRotationYCosine]
158
159 fsubp st(1), st // 0[pIndoorCamera->fRotationYSine * (a1a[i].x - pIndoorCamera->pos.x) - pIndoorCamera->fRotationYCosine * (a1a[i].y - pIndoorCamera->pos.y)]
160 // 1[pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x) + pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)]
161 // 2[(a1a[i].z - pIndoorCamera->pos.z)]
162 // 3[pIndoorCamera->fRotationXCosine]
163 // 4[pIndoorCamera->fRotationYSine]
164 // 5[pIndoorCamera->fRotationYCosine]
165 }*/
166 st0 = sin_y * (a1a[i].vWorldPosition.x - pIndoorCamera->pos.x) - cos_y * (a1a[i].vWorldPosition.y - pIndoorCamera->pos.y);
167 st1 = cos_y * (a1a[i].vWorldPosition.x - pIndoorCamera->pos.x) + sin_y * (a1a[i].vWorldPosition.y - pIndoorCamera->pos.y);
168 st2 = (a1a[i].vWorldPosition.z - pIndoorCamera->pos.z);
169 }
170 else
171 {
172 /*__asm
173 {
174 fld [ebp+a1] // 0[(a1a[i].x - pIndoorCamera->pos.x)]
175 // 1[(a1a[i].z - pIndoorCamera->pos.z)]
176 // 2[pIndoorCamera->fRotationXCosine]
177 // 3[pIndoorCamera->fRotationYSine]
178 // 4[pIndoorCamera->fRotationYCosine]
179 fmul st, st(4) // 0[pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x)]
180 // 1[(a1a[i].z - pIndoorCamera->pos.z)]
181 // 2[pIndoorCamera->fRotationXCosine]
182 // 3[pIndoorCamera->fRotationYSine]
183 // 4[pIndoorCamera->fRotationYCosine]
184 fld [ebp+uNumVertices] // 0[(a1a[i].y - pIndoorCamera->pos.y)]
185 // 1[pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x)]
186 // 2[(a1a[i].z - pIndoorCamera->pos.z)]
187 // 3[pIndoorCamera->fRotationXCosine]
188 // 4[pIndoorCamera->fRotationYSine]
189 // 5[pIndoorCamera->fRotationYCosine]
190 fmul st, st(4) // 0[pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)]
191 // 1[pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x)]
192 // 2[(a1a[i].z - pIndoorCamera->pos.z)]
193 // 3[pIndoorCamera->fRotationXCosine]
194 // 4[pIndoorCamera->fRotationYSine]
195 // 5[pIndoorCamera->fRotationYCosine]
196 fsubp st(1), st // 0[pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x) - pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)]
197 // 1[(a1a[i].z - pIndoorCamera->pos.z)]
198 // 2[pIndoorCamera->fRotationXCosine]
199 // 3[pIndoorCamera->fRotationYSine]
200 // 4[pIndoorCamera->fRotationYCosine]
201 fld [ebp+a1] // 0[(a1a[i].x - pIndoorCamera->pos.x)]
202 // 1[pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x) - pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)]
203 // 2[(a1a[i].z - pIndoorCamera->pos.z)]
204 // 3[pIndoorCamera->fRotationXCosine]
205 // 4[pIndoorCamera->fRotationYSine]
206 // 5[pIndoorCamera->fRotationYCosine]
207 fmul st, st(4) // 0[pIndoorCamera->fRotationYSine * (a1a[i].x - pIndoorCamera->pos.x)]
208 // 1[pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x) - pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)]
209 // 2[(a1a[i].z - pIndoorCamera->pos.z)]
210 // 3[pIndoorCamera->fRotationXCosine]
211 // 4[pIndoorCamera->fRotationYSine]
212 // 5[pIndoorCamera->fRotationYCosine]
213 fld [ebp+uNumVertices] // 0[(a1a[i].y - pIndoorCamera->pos.y)]
214 // 1[pIndoorCamera->fRotationYSine * (a1a[i].x - pIndoorCamera->pos.x)]
215 // 2[pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x) - pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)]
216 // 3[(a1a[i].z - pIndoorCamera->pos.z)]
217 // 4[pIndoorCamera->fRotationXCosine]
218 // 5[pIndoorCamera->fRotationYSine]
219 // 6[pIndoorCamera->fRotationYCosine]
220 fmul st, st(6) // 0[pIndoorCamera->fRotationYCosine * (a1a[i].y - pIndoorCamera->pos.y)]
221 // 1[pIndoorCamera->fRotationYSine * (a1a[i].x - pIndoorCamera->pos.x)]
222 // 2[pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x) - pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)]
223 // 3[(a1a[i].z - pIndoorCamera->pos.z)]
224 // 4[pIndoorCamera->fRotationXCosine]
225 // 5[pIndoorCamera->fRotationYSine]
226 // 6[pIndoorCamera->fRotationYCosine]
227 faddp st(1), st // 0[pIndoorCamera->fRotationYCosine * (a1a[i].y - pIndoorCamera->pos.y) + pIndoorCamera->fRotationYSine * (a1a[i].x - pIndoorCamera->pos.x)]
228 // 1[pIndoorCamera->fRotationYCosine * (a1a[i].x - pIndoorCamera->pos.x) - pIndoorCamera->fRotationYSine * (a1a[i].y - pIndoorCamera->pos.y)]
229 // 2[(a1a[i].z - pIndoorCamera->pos.z)]
230 // 3[pIndoorCamera->fRotationXCosine]
231 // 4[pIndoorCamera->fRotationYSine]
232 // 5[pIndoorCamera->fRotationYCosine]
233 }*/
234 st0 = cos_y * (a1a[i].vWorldPosition.y - pIndoorCamera->pos.y) + sin_y * (a1a[i].vWorldPosition.x - pIndoorCamera->pos.x);
235 st1 = cos_y * (a1a[i].vWorldPosition.x - pIndoorCamera->pos.x) - sin_y * (a1a[i].vWorldPosition.y - pIndoorCamera->pos.y);
236 st2 = (a1a[i].vWorldPosition.z - pIndoorCamera->pos.z);
237 }
238
239 a1a[i].vWorldViewPosition.x = st1*cos_x - st2*sin_x;
240 a1a[i].vWorldViewPosition.y = st0;
241 a1a[i].vWorldViewPosition.z = st2*cos_x + st1*sin_x;
242 }
243 }
244 else
245 {
246 for (uint i = 0; i < uNumVertices; ++i)
247 {
248 if ( pRenderer->pRenderD3D )
249 {
250 /*__asm
251 {
252 fld [ebp+uNumVertices] // 0[(a1a[i].y - pIndoorCamera->pos.y)]
253 // 1[(a1a[i].z - pIndoorCamera->pos.z)]
254 // 2[sin_y]
255 // 3[cos_y]
256 fmul st, st(2) // 0[sin_y * (a1a[i].y - pIndoorCamera->pos.y)]
257 // 1[(a1a[i].z - pIndoorCamera->pos.z)]
258 // 2[sin_y]
259 // 3[cos_y]
260 fld [ebp+a1] // 0[(a1a[i].x - pIndoorCamera->pos.x)]
261 // 1[sin_y * (a1a[i].y - pIndoorCamera->pos.y)]
262 // 2[(a1a[i].z - pIndoorCamera->pos.z)]
263 // 3[sin_y]
264 // 4[cos_y]
265 fmul st, st(4) // 0[cos_y * (a1a[i].x - pIndoorCamera->pos.x)]
266 // 1[sin_y * (a1a[i].y - pIndoorCamera->pos.y)]
267 // 2[(a1a[i].z - pIndoorCamera->pos.z)]
268 // 3[sin_y]
269 // 4[cos_y]
270 faddp st(1), st // 0[cos_y * (a1a[i].x - pIndoorCamera->pos.x) + sin_y * (a1a[i].y - pIndoorCamera->pos.y)]
271 // 1[(a1a[i].z - pIndoorCamera->pos.z)]
272 // 2[sin_y]
273 // 3[cos_y]
274 fstp dword ptr [eax+0Ch]
275 fld [ebp+a1] // 0[(a1a[i].x - pIndoorCamera->pos.x)]
276 // 1[(a1a[i].z - pIndoorCamera->pos.z)]
277 // 2[sin_y]
278 // 3[cos_y]
279 fmul st, st(2) // 0[sin_y * (a1a[i].x - pIndoorCamera->pos.x)]
280 // 1[(a1a[i].z - pIndoorCamera->pos.z)]
281 // 2[sin_y]
282 // 3[cos_y]
283 fld [ebp+uNumVertices] // 0[(a1a[i].y - pIndoorCamera->pos.y)]
284 // 1[sin_y * (a1a[i].x - pIndoorCamera->pos.x)]
285 // 2[(a1a[i].z - pIndoorCamera->pos.z)]
286 // 3[sin_y]
287 // 4[cos_y]
288 fmul st, st(4) // 0[cos_y * (a1a[i].y - pIndoorCamera->pos.y)]
289 // 1[sin_y * (a1a[i].x - pIndoorCamera->pos.x)]
290 // 2[(a1a[i].z - pIndoorCamera->pos.z)]
291 // 3[sin_y]
292 // 4[cos_y]
293 fsubp st(1), st // 0[sin_y * (a1a[i].x - pIndoorCamera->pos.x) - cos_y * (a1a[i].y - pIndoorCamera->pos.y)]
294 // 1[(a1a[i].z - pIndoorCamera->pos.z)]
295 // 2[sin_y]
296 // 3[cos_y]
297 fstp dword ptr [eax+10h]
298 fstp dword ptr [eax+14h]
299 }*/
300 a1a[i].vWorldViewPosition.x = cos_y * (a1a[i].vWorldPosition.x - pIndoorCamera->pos.x) + sin_y * (a1a[i].vWorldPosition.y - pIndoorCamera->pos.y);
301 a1a[i].vWorldViewPosition.y = sin_y * (a1a[i].vWorldPosition.x - pIndoorCamera->pos.x) - cos_y * (a1a[i].vWorldPosition.y - pIndoorCamera->pos.y);
302 a1a[i].vWorldViewPosition.z = (a1a[i].vWorldPosition.z - pIndoorCamera->pos.z);
303 }
304 else
305 {
306 __debugbreak();
307 /*__asm
308 {
309 fld [ebp+a1]
310 fmul st, st(3)
311 fld [ebp+uNumVertices]
312 fmul st, st(3)
313 fsubp st(1), st
314 fstp dword ptr [eax+0Ch]
315 fld [ebp+a1]
316 fmul st, st(2)
317 fld [ebp+uNumVertices]
318 fmul st, st(4)
319 faddp st(1), st
320
321 fstp dword ptr [eax+10h]
322 fstp dword ptr [eax+14h]
323 }*/
324 }
325 }
326 }
327 }
328 else for (uint i = 0; i < uNumVertices; ++i)
329 pIndoorCamera->ViewTransform(a1a + i);
330 }
331
332
333 //----- (00436932) --------------------------------------------------------
334 bool IndoorCameraD3D::GetFacetOrientation(char polyType, Vec3_float_ *a2, Vec3_float_ *a3, Vec3_float_ *a4)
335 {
336 switch ((PolygonType)polyType)
337 {
338 case POLYGON_VerticalWall:
339 {
340 a4->x = -a2->y;
341 a4->y = a2->x;
342 a4->z = 0.0;
343
344 a3->x = 0.0;
345 a3->y = 0.0;
346 a3->z = 1.0f;
347 }
348 return true;
349
350 case POLYGON_Floor:
351 case POLYGON_Ceiling:
352 {
353 a4->x = 1.0;
354 a4->y = 0.0;
355 a4->z = 0.0;
356
357 a3->x = 0.0;
358 a3->y = 1.0;
359 a3->z = 0.0;
360 }
361 return true;
362
363 case POLYGON_InBetweenFloorAndWall:
364 case POLYGON_InBetweenCeilingAndWall:
365 {
366 if (fabs(a2->z) < 0.70811361)
367 {
368 a4->x = -a2->y;
369 a4->y = a2->x;
370 a4->z = 0.0;
371 a4->Normalize();
372
373 a3->x = 0.0;
374 a3->y = 0.0;
375 a3->z = 1.0;
376 }
377 else
378 {
379 a4->x = 1.0;
380 a4->y = 0.0;
381 a4->z = 0.0;
382
383 a3->x = 0.0;
384 a3->y = 1.0;
385 a3->z = 0.0;
386 }
387 }
388 return true;
389
390 default:
391 return false;
392 }
393 }
394
395
396 //----- (00438258) --------------------------------------------------------
397 bool IndoorCameraD3D::is_face_faced_to_camera(BLVFace *pFace, RenderVertexSoft *a2)
398 {
399 if (pFace->TwoSided())
400 return false;
401
402 //really strange cull; dot(to_cam, normal) < 0 means we see the BACK face, not font %_%
403 if ( (a2->vWorldPosition.z - (double)pIndoorCamera->pos.z) * (double)pFace->pFacePlane_old.vNormal.z
404 + (a2->vWorldPosition.y - (double)pIndoorCamera->pos.y) * (double)pFace->pFacePlane_old.vNormal.y
405 + (a2->vWorldPosition.x - (double)pIndoorCamera->pos.x) * (double)pFace->pFacePlane_old.vNormal.x < 0.0)
406 return false;
407
408 return true;
409 }
410
411 //----- (00438250) --------------------------------------------------------
412 void IndoorCameraD3D::Reset_list_0037C()
413 {
414 this->list_0037C_size = 0;
415 }
416
417
418 //----- (00438240) --------------------------------------------------------
419 void IndoorCameraD3D::_438240_draw_lits()
420 {
421 IndoorCameraD3D *v1; // ebp@1
422 int v2; // edi@2
423 int v3; // ebx@3
424 int v4; // esi@4
425 double v5; // st7@6
426 float v6; // ST00_4@8
427 IndoorCameraD3D *v7; // esi@1
428 float v8; // [sp+4h] [bp-28h]@6
429 float v9; // [sp+8h] [bp-24h]@6
430 unsigned int v10; // [sp+Ch] [bp-20h]@6
431 char v11; // [sp+10h] [bp-1Ch]@6
432 float v12; // [sp+14h] [bp-18h]@6
433 int v13; // [sp+28h] [bp-4h]@1
434
435 v7 = this;
436 _438141_draw_list_0037C();
437 v13 = 0;
438 v1 = v7;
439 if ( v7->list_E0380_size > 0 )
440 {
441 v2 = (int)&v7->list_E0380[0].field_C04;
442 do
443 {
444 v3 = 0;
445 if ( *(int *)v2 > 0 )
446 {
447 v4 = v2 - 3048;
448 do
449 {
450 if ( *(char *)(v2 - 3076) & 1 )
451 {
452 LODWORD(v12) = 1;
453 v11 = 1;
454 v10 = *(int *)(v2 + 4);
455 v9 = 0.0;
456 v8 = *(float *)(v4 + 4);
457 v5 = *(float *)v4;
458 }
459 else
460 {
461 LODWORD(v12) = 0;
462 v11 = 1;
463 v10 = *(int *)(v2 + 4);
464 v9 = *(float *)(v4 - 16);
465 v8 = *(float *)(v4 - 20);
466 v5 = *(float *)(v4 - 24);
467 }
468 v6 = v5;
469 _437D4A_draw_some_vertices(v6, v8, v9, v10, v11, v12);
470 ++v3;
471 v4 += 48;
472 }
473 while ( v3 < *(int *)v2 );
474 }
475 ++v13;
476 v2 += 3088;
477 }
478 while ( v13 < v1->list_E0380_size );
479 }
480 }
481
482
483 //----- (00438141) --------------------------------------------------------
484 void IndoorCameraD3D::_438141_draw_list_0037C()
485 {
486 IndoorCameraD3D *v1; // edi@1
487 signed int v2; // ebx@1
488 char *v3; // esi@2
489 double v4; // st7@4
490 float v5; // ST00_4@6
491 float v6; // [sp+4h] [bp-20h]@4
492 float v7; // [sp+8h] [bp-1Ch]@4
493 unsigned int v8; // [sp+Ch] [bp-18h]@4
494 char v9; // [sp+10h] [bp-14h]@4
495 float v10; // [sp+14h] [bp-10h]@4
496
497 v1 = this;
498 v2 = 0;
499 if ( (signed int)this->list_0037C_size > 0 )
500 {
501 v3 = (char *)&this->list_0037C[0].field_20;
502 do
503 {
504 if ( *(v3 - 32) & 1 )
505 {
506 LODWORD(v10) = 1;
507 v9 = 1;
508 v8 = *((int *)v3 + 5);
509 v7 = 0.0;
510 v6 = *(float *)v3;
511 v4 = *((float *)v3 - 1);
512 }
513 else
514 {
515 LODWORD(v10) = 0;
516 v9 = 1;
517 v8 = *((int *)v3 + 5);
518 v7 = *((float *)v3 - 5);
519 v6 = *((float *)v3 - 6);
520 v4 = *((float *)v3 - 7);
521 }
522 v5 = v4;
523 _437D4A_draw_some_vertices(v5, v6, v7, v8, v9, v10);
524 ++v2;
525 v3 += 56;
526 }
527 while ( v2 < (signed int)v1->list_0037C_size );
528 }
529 }
530
531
532 //----- (00437D4A) --------------------------------------------------------
533 void IndoorCameraD3D::_437D4A_draw_some_vertices(float x, float y, float z, unsigned int a5, char a6, float a7)
534 {
535 IndoorCameraD3D *v7; // edx@1
536 char *v8; // eax@1
537 signed int v9; // ecx@1
538 signed int v10; // edx@10
539 char *v11; // ecx@10
540 signed int uNumD3DVertices; // edi@16
541 char *v13; // ecx@24
542 unsigned int v14; // edx@25
543 unsigned int v15; // eax@25
544 int v16; // ebx@25
545 int v17; // eax@26
546 int v18; // edx@26
547 IDirect3DDevice3 *v19; // ST24_4@27
548 HRESULT v20; // eax@27
549 RenderVertexSoft vert[20]; // [sp+0h] [bp-680h]@1
550 RenderVertexD3D3 pD3DVertices[5]; // [sp+3C0h] [bp-2C0h]@15
551 RenderVertexSoft a1; // [sp+640h] [bp-40h]@1
552 //double v24; // [sp+670h] [bp-10h]@25
553 //double v25; // [sp+678h] [bp-8h]@1
554
555 v7 = this;
556 a1.flt_2C = 0.0;
557 //HIDWORD(v25) = (int)this;
558 v8 = (char *)&vert[0].flt_2C;
559 v9 = 20;
560 do
561 {
562 *(float *)v8 = 0.0;
563 v8 += 48;
564 --v9;
565 }
566 while ( v9 );
567 if ( LOBYTE(a7) )
568 {
569 vert[0].vWorldViewProjX = x;
570 vert[0].vWorldViewProjY = y;
571 goto LABEL_15;
572 }
573 a1.vWorldPosition.x = x;
574 a1.vWorldPosition.y = y;
575 a1.vWorldPosition.z = z;
576 if ( pRenderer->pRenderD3D )
577 {
578 LODWORD(a7) = 1;
579 if ( v7->_437285_prolly_colide_vertices_against_frustrum(
580 &a1,
581 (unsigned int *)&a7,
582 vert,
583 v7->std__vector_000034_prolly_frustrum,
584 4,
585 1,
586 0) == 1
587 && SLODWORD(a7) < 1 )
588 return;
589 }
590 else
591 {
592 vert[0].vWorldPosition.x = x;
593 vert[0].vWorldPosition.y = y;
594 vert[0].vWorldPosition.z = z;
595 }
596 ViewTransform(vert, 1u);
597 v10 = 0;
598 v11 = (char *)&vert[0].vWorldViewPosition;
599 do
600 {
601 if ( *(float *)v11 >= 8.0 )
602 break;
603 ++v10;
604 v11 += 48;
605 }
606 while ( v10 < 1 );
607 if ( v10 < 1 )
608 {
609 Project(vert, 1u, 0);
610 LABEL_15:
611 pD3DVertices[0].pos.x = vert[0].vWorldViewProjX;
612 pD3DVertices[0].pos.y = vert[0].vWorldViewProjY;
613 pD3DVertices[0].specular = 0;
614 pD3DVertices[0].diffuse = a5;
615 if ( a6 )
616 {
617 pD3DVertices[0].pos.z = 0.000099999997;
618 pD3DVertices[1].pos.x = vert[0].vWorldViewProjX;
619 pD3DVertices[2].pos.x = vert[0].vWorldViewProjX;
620 pD3DVertices[0].rhw = 0.001;
621 uNumD3DVertices = 5;
622 pD3DVertices[0].texcoord.x = 0.0;
623 pD3DVertices[1].diffuse = a5;
624 pD3DVertices[1].specular = 0;
625 pD3DVertices[0].texcoord.y = 0.0;
626 pD3DVertices[2].diffuse = a5;
627 pD3DVertices[2].specular = 0;
628 pD3DVertices[3].pos.y = vert[0].vWorldViewProjY;
629 pD3DVertices[3].diffuse = a5;
630 pD3DVertices[3].specular = 0;
631 pD3DVertices[4].pos.y = vert[0].vWorldViewProjY;
632 pD3DVertices[1].pos.y = vert[0].vWorldViewProjY - 1.0;
633 pD3DVertices[4].diffuse = a5;
634 pD3DVertices[4].specular = 0;
635 pD3DVertices[1].pos.z = 0.000099999997;
636 pD3DVertices[1].rhw = 0.001;
637 pD3DVertices[1].texcoord.x = 0.0;
638 pD3DVertices[1].texcoord.y = 0.0;
639 pD3DVertices[2].pos.y = vert[0].vWorldViewProjY + 1.0;
640 pD3DVertices[2].pos.z = 0.000099999997;
641 pD3DVertices[2].rhw = 0.001;
642 pD3DVertices[2].texcoord.x = 0.0;
643 pD3DVertices[2].texcoord.y = 0.0;
644 pD3DVertices[3].pos.x = vert[0].vWorldViewProjX - 1.0;
645 pD3DVertices[3].pos.z = 0.000099999997;
646 pD3DVertices[3].rhw = 0.001;
647 pD3DVertices[3].texcoord.x = 0.0;
648 pD3DVertices[3].texcoord.y = 0.0;
649 pD3DVertices[4].pos.x = vert[0].vWorldViewProjX + 1.0;
650 pD3DVertices[4].pos.z = 0.000099999997;
651 pD3DVertices[4].rhw = 0.001;
652 pD3DVertices[4].texcoord.x = 0.0;
653 pD3DVertices[4].texcoord.y = 0.0;
654 }
655 else
656 {
657 uNumD3DVertices = 1;
658 __debugbreak(); // make things right
659 *(unsigned int *)(&pD3DVertices[0].pos.z) = 0x38D1B717u;
660 pD3DVertices[0].texcoord.x = 0.0;
661 *(unsigned int *)(&pD3DVertices[0].rhw) = 0x3A83126Fu;
662 pD3DVertices[0].texcoord.y = 0.0;
663 }
664 if ( pRenderer->pRenderD3D )
665 {
666 __debugbreak(); // decompilation bug
667 //v19 = pRenderer->pRenderD3D->pDevice;
668 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTexture(0, nullptr));
669 ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(D3DPT_POINTLIST,
670 D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
671 pD3DVertices,
672 uNumD3DVertices,
673 16));
674 }
675 else
676 {
677 if ( (double)(signed int)pViewport->uViewportX <= vert[0].vWorldViewProjX - 1.0
678 && (double)(signed int)pViewport->uViewportZ > vert[0].vWorldViewProjX + 2.0
679 && (double)(signed int)pViewport->uViewportY <= vert[0].vWorldViewProjY - 1.0
680 && (double)(signed int)pViewport->uViewportW > vert[0].vWorldViewProjY + 2.0
681 && uNumD3DVertices > 0 )
682 {
683 v13 = (char *)&pD3DVertices[0].diffuse;
684 do
685 {
686 LODWORD(a7) = *((int *)v13 - 3);
687 //v25 = a7 + 6.7553994e15;
688 auto _v25 = floorf(a7 + 0.5f);
689
690 //v24 = *((float *)v13 - 4) + 6.7553994e15;
691 auto _v24 = floorf(*((float *)v13 - 4) + 0.5f);
692
693 v14 = *(int *)v13;
694 v15 = *(int *)v13;
695 v16 = (*(int *)v13 >> 3) & 0x1F;
696 if ( pRenderer->uTargetGBits == 5 )
697 {
698 v17 = (v15 >> 6) & 0x3E0;
699 v18 = (v14 >> 9) & 0x7C00;
700 }
701 else
702 {
703 v17 = (v15 >> 5) & 0x7E0;
704 v18 = (v14 >> 8) & 0xF800;
705 }
706 v13 += 32;
707 --uNumD3DVertices;
708 pRenderer->pTargetSurface[(uint)_v24 + pRenderer->uTargetSurfacePitch * (uint)_v25] = v18 | v16 | (unsigned __int16)v17;
709 }
710 while ( uNumD3DVertices );
711 }
712 }
713 }
714 }
715
716
717 //----- (00437C96) --------------------------------------------------------
718 void IndoorCameraD3D::do_draw_debug_line_d3d(const RenderVertexD3D3 *pLineBegin, unsigned int uDiffuseBegin, const RenderVertexD3D3 *pLineEnd, unsigned int uDiffuseEnd, float z_stuff)
719 {
720 double v6; // st7@2
721 IDirect3DDevice3 *v7; // eax@2
722 HRESULT v8; // eax@2
723 std::string v9; // [sp-18h] [bp-60h]@3
724 const char *v10; // [sp-Ch] [bp-54h]@2
725 const char *v11; // [sp-8h] [bp-50h]@2
726 int v12; // [sp-4h] [bp-4Ch]@2
727 RenderVertexD3D3 v13[2]; // [sp+8h] [bp-40h]@2
728
729 if ( pRenderer->pRenderD3D )
730 {
731 v6 = 0.001 - z_stuff;
732 memcpy(v13, pLineBegin, 0x20u);
733 memcpy(&v13[1], pLineEnd, sizeof(v13[1]));
734 v13[0].pos.z = v6;
735 v13[1].pos.z = v6;
736 v12 = 0;
737 v13[0].diffuse = uDiffuseBegin;
738 v13[1].diffuse = uDiffuseEnd;
739 v7 = pRenderer->pRenderD3D->pDevice;
740 v11 = 0;
741 //v10 = (const char *)v7;
742 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTexture(0, nullptr));
743 ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(
744 D3DPT_LINELIST,
745 452,
746 v13,
747 2,
748 16));
749 }
750 else
751 {
752 MessageBoxW(nullptr, L"draw_debug_line() not implemented for SW rendering", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Core3D.cpp:1415", 0);
753 }
754 }
755
756 //----- (00437AB5) --------------------------------------------------------
757 void IndoorCameraD3D::do_draw_debug_line_sw(RenderVertexSoft *pLineBegin, unsigned int uStartDiffuse, RenderVertexSoft *pLineEnd, unsigned int uEndDiffuse, unsigned int uOutNumVertices, float z_stuff)
758 {
759 char *v7; // eax@2
760 signed int v8; // edx@2
761 float v9; // ecx@5
762 float v10; // eax@5
763 char *v11; // eax@6
764 signed int v12; // edx@6
765 float v13; // edx@8
766 float v14; // eax@8
767 float v15; // eax@8
768 double v16; // st7@11
769 HRESULT v17; // eax@11
770 std::string v18; // [sp-18h] [bp-7E4h]@12
771 IDirect3DDevice3 *v19; // [sp-Ch] [bp-7D8h]@8
772 const char *v20; // [sp-8h] [bp-7D4h]@8
773 int v21; // [sp-4h] [bp-7D0h]@8
774 RenderVertexSoft a1[20]; // [sp+8h] [bp-7C4h]@6
775 RenderVertexSoft pVertices[20]; // [sp+3C8h] [bp-404h]@2
776 RenderVertexD3D3 v24[2]; // [sp+788h] [bp-44h]@11
777 IndoorCameraD3D *v25; // [sp+7C8h] [bp-4h]@1
778
779 v25 = this;
780 if ( pRenderer->pRenderD3D )
781 {
782 v7 = (char *)&pVertices[0].flt_2C;
783 v8 = 20;
784 do
785 {
786 *(float *)v7 = 0.0;
787 v7 += 48;
788 --v8;
789 }
790 while ( v8 );
791 if ( (char)uOutNumVertices )
792 {
793 v9 = pLineBegin->vWorldViewProjX;
794 pVertices[0].vWorldViewProjY = pLineBegin->vWorldViewProjY;
795 pVertices[0].vWorldViewProjX = v9;
796 v10 = pLineEnd->vWorldViewProjY;
797 pVertices[1].vWorldViewProjX = pLineEnd->vWorldViewProjX;
798 pVertices[1].vWorldViewProjY = v10;
799 LABEL_11:
800 v16 = 0.001 - z_stuff;
801 v24[0].specular = 0;
802 v24[0].pos.x = pVertices[0].vWorldViewProjX;
803 v24[0].pos.y = pVertices[0].vWorldViewProjY;
804 v24[0].pos.z = v16;
805 v24[0].diffuse = uStartDiffuse;
806 v24[0].rhw = 0.001;
807 v24[1].pos.x = pVertices[1].vWorldViewProjX;
808 v24[0].texcoord.x = 0.0;
809 v24[1].pos.y = pVertices[1].vWorldViewProjY;
810 v24[0].texcoord.y = 0.0;
811 v24[1].diffuse = uEndDiffuse;
812 v24[1].pos.z = v16;
813 v24[1].specular = 0;
814 v21 = 0;
815 v24[1].rhw = 0.001;
816 v20 = 0;
817 v24[1].texcoord.x = 0.0;
818 v24[1].texcoord.y = 0.0;
819 //v19 = pRenderer->pRenderD3D->pDevice;
820 ErrD3D(pRenderer->pRenderD3D->pDevice->SetTexture(0, nullptr));
821 ErrD3D(pRenderer->pRenderD3D->pDevice->DrawPrimitive(
822 D3DPT_LINELIST,
823 D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_SPECULAR | D3DFVF_TEX1,
824 v24,
825 2,
826 16));
827 return;
828 }
829 v11 = (char *)&a1[0].flt_2C;
830 v12 = 20;
831 do
832 {
833 *(float *)v11 = 0.0;
834 v11 += 48;
835 --v12;
836 }
837 while ( v12 );
838 v21 = 0;
839 v20 = (const char *)1;
840 v19 = (IDirect3DDevice3 *)4;
841 v13 = pLineBegin->vWorldPosition.x;
842 uOutNumVertices = 2;
843 a1[0].vWorldPosition.x = v13;
844 v14 = pLineBegin->vWorldPosition.z;
845 a1[0].vWorldPosition.y = pLineBegin->vWorldPosition.y;
846 a1[0].vWorldPosition.z = v14;
847 a1[1].vWorldPosition.x = pLineEnd->vWorldPosition.x;
848 v15 = pLineEnd->vWorldPosition.z;
849 a1[1].vWorldPosition.y = pLineEnd->vWorldPosition.y;
850 a1[1].vWorldPosition.z = v15;
851 if ( _437285_prolly_colide_vertices_against_frustrum(
852 a1,
853 &uOutNumVertices,
854 pVertices,
855 this->std__vector_000034_prolly_frustrum,
856 4,
857 1,
858 0) != 1
859 || (signed int)uOutNumVertices >= 2 )
860 {
861 ViewTransform(pVertices, 2u);
862 Project(pVertices, 2u, 0);
863 goto LABEL_11;
864 }
865 }
866 else
867 MessageBoxW(nullptr, L"draw_debug_line() not implemented for SW rendering", L"E:\\WORK\\MSDEV\\MM7\\MM7\\Code\\Core3D.cpp:1383", 0);
868 }
869
870
871 //----- (00437A55) --------------------------------------------------------
872 void IndoorCameraD3D::debug_outline_d3d(const RenderVertexD3D3 *pLineVertices, unsigned int uNumLines, int uDiffuse, float z_stuff)
873 {
874 unsigned int v5; // esi@1
875 const RenderVertexD3D3 *v6; // ecx@2
876 unsigned int v7; // ebx@2
877 const RenderVertexD3D3 *v8; // edi@3
878 IndoorCameraD3D *thisa; // [sp+10h] [bp-4h]@1
879
880 v5 = 0;
881 thisa = this;
882 if ( (signed int)(uNumLines - 1) > 0 )
883 {
884 v6 = pLineVertices;
885 v7 = uNumLines - 1;
886 v5 = uNumLines - 1;
887 do
888 {
889 v8 = v6 + 1;
890 do_draw_debug_line_d3d(v6, uDiffuse, v6 + 1, uDiffuse, z_stuff);
891 --v7;
892 v6 = v8;
893 }
894 while ( v7 );
895 }
896 do_draw_debug_line_d3d(&pLineVertices[v5], uDiffuse, pLineVertices, uDiffuse, z_stuff);
897 }
898
899
900 //----- (004379EE) --------------------------------------------------------
901 void IndoorCameraD3D::debug_outline_sw(RenderVertexSoft *a2, unsigned int uNumVertices, unsigned int uDiffuse, float a5)
902 {
903 unsigned int v5; // esi@1
904 RenderVertexSoft *v6; // eax@2
905 RenderVertexSoft *v7; // edi@3
906 char v8; // zf@3
907 IndoorCameraD3D *v9; // [sp+10h] [bp-4h]@1
908 unsigned int uNumVerticesa; // [sp+20h] [bp+Ch]@2
909
910 v9 = this;
911 v5 = 0;
912 if ( (signed int)(uNumVertices - 1) > 0 )
913 {
914 v6 = a2;
915 v5 = uNumVertices - 1;
916 uNumVerticesa = uNumVertices - 1;
917 do
918 {
919 v7 = v6 + 1;
920 do_draw_debug_line_sw(v6, uDiffuse, v6 + 1, uDiffuse, 0, a5);
921 v8 = uNumVerticesa-- == 1;
922 v6 = v7;
923 }
924 while ( !v8 );
925 }
926 do_draw_debug_line_sw(&a2[v5], uDiffuse, a2, uDiffuse, 0, a5);
927 }
928
929
930 //----- (00437906) --------------------------------------------------------
931 void IndoorCameraD3D::PrepareAndDrawDebugOutline(BLVFace *pFace, unsigned int uDiffuse)
932 {
933 char *v3; // eax@2
934 signed int v4; // ecx@2
935 signed int v5; // ebx@5
936 Vec3_short_ *v6; // edx@6
937 char *v7; // esi@6
938 signed int v8; // ecx@7
939 IndoorCameraD3D *thisa; // [sp+8h] [bp-4h]@1
940
941 thisa = this;
942
943
944 static RenderVertexSoft static_sub_437906_array_50CDD0[64];
945 static bool __init_flag1 = false;
946 if (!__init_flag1)
947 {
948 __init_flag1 = true;
949
950 for (uint i = 0; i < 64; ++i)
951 static_sub_437906_array_50CDD0[i].flt_2C = 0.0f;
952 }
953
954 v5 = 0;
955 if ( pFace->uNumVertices )
956 {
957 v6 = pIndoor->pVertices;
958 v7 = (char *)&static_sub_437906_array_50CDD0[0].vWorldPosition.y;
959 do
960 {
961 v8 = v5++;
962 *((float *)v7 - 1) = (double)v6[pFace->pVertexIDs[v8]].x;
963 *(float *)v7 = (double)v6[pFace->pVertexIDs[v8]].y;
964 v7 += 48;
965 *((float *)v7 - 11) = (double)v6[pFace->pVertexIDs[v8]].z;
966 *((float *)v7 - 4) = (double)pFace->pVertexUIDs[v8];
967 *((float *)v7 - 3) = (double)pFace->pVertexVIDs[v8];
968 }
969 while ( v5 < pFace->uNumVertices );
970 }
971 debug_outline_sw(static_sub_437906_array_50CDD0, pFace->uNumVertices, uDiffuse, 0.0);
972 }
973 // 50D9D0: using guessed type char static_sub_437906_byte_50D9D0_init_flag;
974
975
976 //----- (004378BA) --------------------------------------------------------
977 void IndoorCameraD3D::MatrixMultiply(Matrix3x3_float_ *a1, Matrix3x3_float_ *a2, Matrix3x3_float_ *out)
978 {
979 float *v4; // ecx@1
980 float *v5; // eax@1
981 signed int v6; // ebx@1
982 float *v7; // edx@2
983 float *v8; // ecx@2
984 signed int v9; // edi@2
985 double v10; // st7@3
986 double v11; // st6@3
987
988 v4 = (float *)out;
989 v5 = &a1->_12;
990 v6 = 3;
991 do
992 {
993 v7 = v4;
994 v8 = &a2->_21;
995 v9 = 3;
996 do
997 {
998 v10 = v8[3] * v5[1] + *(v8 - 3) * *(v5 - 1);
999 v11 = *v8 * *v5;
1000 ++v8;
1001 *v7 = v10 + v11;
1002 ++v7;
1003 --v9;
1004 }
1005 while ( v9 );
1006 v5 += 3;
1007 --v6;
1008 v4 = v7;
1009 }
1010 while ( v6 );
1011 }
1012
1013
1014 //----- (004376E7) --------------------------------------------------------
1015 void IndoorCameraD3D::CreateWorldMatrixAndSomeStuff()
1016 {
1017 //IndoorCameraD3D *v1; // esi@1
1018 double v2; // st7@1
1019 //signed int v3; // edi@1
1020 //int v4; // eax@1
1021 //double v5; // st7@2
1022 //double v6; // st7@3
1023 Matrix3x3_float_ m1; // [sp+10h] [bp-B8h]@1
1024 Matrix3x3_float_ m2; // [sp+34h] [bp-94h]@1
1025 Matrix3x3_float_ m3; // [sp+58h] [bp-70h]@1
1026 Matrix3x3_float_ m4; // [sp+7Ch] [bp-4Ch]@1
1027 Matrix3x3_float_ m5; // [sp+A0h] [bp-28h]@1
1028 float v12; // [sp+C4h] [bp-4h]@1
1029
1030 //RotationZ(0)
1031 m5._11 = cosf(0); m5._12 = sinf(0); m5._13 = 0;
1032 m5._21 = -sinf(0); m5._22 = cosf(0); m5._23 = 0;
1033 m5._31 = 0; m5._32 = 0; m5._33 = 1;
1034
1035 float cos_x1 = pIndoorCamera->fRotationXCosine,
1036 sin_x1 = pIndoorCamera->fRotationXSine;
1037 //RotationX(x)
1038 m4._11 = 1; m4._12 = 0; m4._13 = 0;
1039 m4._21 = 0; m4._22 = cos_x1; m4._23 = sin_x1;
1040 m4._31 = 0; m4._32 = -sin_x1; m4._33 = cos_x1;
1041
1042 float cos_y1 = pIndoorCamera->fRotationYCosine,
1043 sin_y1 = pIndoorCamera->fRotationYSine;
1044 //RotationY(some_angle)
1045 m3._11 = cos_y1; m3._12 = 0; m3._13 = -sin_y1;
1046 m3._21 = 0; m3._22 = 1; m3._23 = 0;
1047 m3._31 = sin_y1; m3._32 = 0; m3._33 = cos_y1;
1048
1049 MatrixMultiply(&m5, &m3, &m1);
1050 MatrixMultiply(&m4, &m1, &m2);
1051
1052 for (uint i = 0; i < 3; ++i)
1053 {
1054 field_4[0].v[i] = m2.v[1][i];
1055 field_4[1].v[i] = m2.v[0][i];
1056 field_4[2].v[i] = m2.v[2][i];
1057 }
1058
1059 inv_fov = 1.1344639;
1060 fov_x = (double)pViewport->uScreenWidth * 0.8814736;
1061
1062 fov_y = 0.8814736 * (double)pViewport->uScreenHeight;
1063 fov = fov_y;
1064 if ( fov_x > fov )
1065 fov = fov_x;
1066 screenCenterX = (double)pViewport->uScreenCenterX;
1067 screenCenterY = (double)(pViewport->uScreenCenterY - pViewport->uScreenY);
1068 }
1069
1070
1071 //----- (00437691) --------------------------------------------------------
1072 void IndoorCameraD3D::Vec3Transform(const IndoorCameraD3D_Vec3 *pVector, IndoorCameraD3D_Vec3 *pOut)
1073 {
1074 pOut->y = field_4[1].x * pVector->x + field_4[0].x * pVector->y + field_4[2].x * pVector->z;
1075 pOut->z = field_4[1].y * pVector->x + field_4[0].y * pVector->y + field_4[2].y * pVector->z;
1076 pOut->x = field_4[1].z * pVector->x + field_4[0].z * pVector->y + field_4[2].z * pVector->z;
1077 }
1078
1079 //----- (00437607) --------------------------------------------------------
1080 void IndoorCameraD3D::_437607(IndoorCameraD3D_Vec3 *a1, IndoorCameraD3D_Vec4 *a2)
1081 {
1082 double v4; // st7@1
1083 IndoorCameraD3D_Vec3 v8; // [sp+8h] [bp-1Ch]@1
1084
1085 v8.x = (double)pIndoorCamera->pos.x;
1086 v8.y = (double)pIndoorCamera->pos.y;
1087 v8.z = (double)pIndoorCamera->pos.z;
1088 Vec3Transform(a1, a2);
1089
1090 v4 = v8.x * a2->x + v8.y * a2->y + v8.z * a2->z;
1091 a2->dot = v4 + 0.000099999997;
1092 }
1093
1094 //----- (004374E8) --------------------------------------------------------
1095 void IndoorCameraD3D::_4374E8_ProllyBuildFrustrum()
1096 {
1097 //IndoorCameraD3D *v1; // esi@1
1098 //double v2; // st7@1
1099 double v3; // st7@1
1100 //double v4; // st7@1
1101 double v5; // st7@1
1102 //double v6; // st7@1
1103 IndoorCameraD3D_Vec3 v7; // [sp+Ch] [bp-24h]@1
1104 //float v8; // [sp+10h] [bp-20h]@1
1105 //float v9; // [sp+14h] [bp-1Ch]@1
1106 //float v10; // [sp+18h] [bp-18h]@1
1107 //float v11; // [sp+1Ch] [bp-14h]@1
1108 //float v12; // [sp+20h] [bp-10h]@1
1109 //int v13; // [sp+2Ch] [bp-4h]@1
1110
1111 //v1 = this;
1112 //IndoorCameraD3D_Vec3::IndoorCameraD3D_Vec3(&v7);
1113 //v2 = 2.0 / inv_fov;
1114 //v13 = 0;
1115 v3 = atan(2.0 / inv_fov * fov / fov_x);
1116 //v12 = v3;
1117 //v11 = sin(v3);
1118 //v4 = cos(v3);
1119 v7.x = -sin(v3);
1120 v7.y = 0.0;
1121 v7.z = cos(v3);
1122 _437607(&v7, std__vector_000034_prolly_frustrum);
1123 v7.x = sin(v3);
1124 _437607(&v7, &std__vector_000034_prolly_frustrum[1]);
1125 v5 = atan(2.0 / inv_fov * fov / (fov_y + 0.5));
1126 //v12 = v5;
1127 //v11 = sin(v5);
1128 //v6 = cos(v5);
1129 v7.y = sin(v5);
1130 v7.x = 0.0;
1131 v7.z = cos(v5);
1132 _437607(&v7, &std__vector_000034_prolly_frustrum[2]);
1133 v7.y = -sin(v5);
1134 _437607(&v7, &std__vector_000034_prolly_frustrum[3]);
1135 //v13 = -1;
1136 //IndoorCameraD3D_Vec3::dtor(&v7);
1137 }
1138
1139 //----- (00437376) --------------------------------------------------------
1140 char IndoorCameraD3D::_437376(stru154 *thisa, RenderVertexSoft *a2, unsigned int *pOutNumVertices)
1141 {
1142 unsigned int v4; // ebx@1
1143 RenderVertexSoft *v5; // edx@2
1144 double v6; // st7@3
1145 unsigned int v7; // edi@5
1146 signed int v8; // esi@6
1147 int v9; // ebx@8
1148 int v10; // eax@8
1149 int v11; // ecx@14
1150 int v12; // eax@14
1151 int v13; // eax@15
1152 signed int v14; // ebx@17
1153 RenderVertexSoft *v15; // eax@18
1154 unsigned int *v16; // eax@20
1155 char result; // al@24
1156 RenderVertexSoft v18; // [sp+Ch] [bp-34h]@2
1157 int v19; // [sp+3Ch] [bp-4h]@8
1158 signed int thisb; // [sp+48h] [bp+8h]@6
1159 char a2_3; // [sp+4Fh] [bp+Fh]@5
1160
1161 v4 = *pOutNumVertices;
1162 if ( (signed int)*pOutNumVertices <= 3
1163 || ((v5 = a2,
1164 memcpy(&v18, a2, sizeof(v18)),
1165 (v18.vWorldPosition.z - (double)pBLVRenderParams->vPartyPos.z) * thisa->face_plane.vNormal.z
1166 + (v18.vWorldPosition.y - (double)pBLVRenderParams->vPartyPos.y) * thisa->face_plane.vNormal.y
1167 + (v18.vWorldPosition.x - (double)pBLVRenderParams->vPartyPos.x) * thisa->face_plane.vNormal.x < 0.0) ? (v6 = 1.0) : (v6 = -1.0),
1168 a2_3 = 0,
1169 memcpy(&v5[v4], v5, sizeof(v5[v4])),
1170 memcpy(&v5[*pOutNumVertices + 1], &v5[1], sizeof(v5[*pOutNumVertices + 1])),
1171 v7 = *pOutNumVertices,
1172 (signed int)*pOutNumVertices <= 0) )
1173 goto LABEL_28;
1174 v8 = 1;
1175 for ( thisb = 1; ; v8 = thisb )
1176 {
1177 v9 = v8 - 1;
1178 v10 = v8 + 1;
1179 v19 = v8 + 1;
1180 if ( v8 - 1 >= (signed int)v7 )
1181 v9 -= v7;
1182 if ( v8 >= (signed int)v7 )
1183 v8 -= v7;
1184 if ( v19 >= (signed int)v7 )
1185 v10 = v19 - v7;
1186 v11 = (int)&v5[v10];
1187 v12 = (int)&v5[v9];
1188 if ( -0.009999999776482582 > ((v5[v8].vWorldViewProjX - *(float *)(v12 + 24))
1189 * (*(float *)(v11 + 28) - *(float *)(v12 + 28))
1190 - (v5[v8].vWorldViewProjY - *(float *)(v12 + 28))
1191 * (*(float *)(v11 + 24) - *(float *)(v12 + 24)))
1192 * v6 )
1193 {
1194 thisb = v19;
1195 v16 = pOutNumVertices;
1196 }
1197 else
1198 {
1199 v13 = thisb;
1200 if ( thisb >= (signed int)v7 )
1201 v13 = thisb - v7;
1202 v14 = v13;
1203 if ( v13 < (signed int)v7 )
1204 {
1205 v15 = &v5[v13];
1206 do
1207 {
1208 memcpy(v15, &v15[1], 0x30u);
1209 ++v14;
1210 ++v15;
1211 }
1212 while ( v14 < (signed int)*pOutNumVertices );
1213 }
1214 v16 = pOutNumVertices;
1215 a2_3 = 1;
1216 --*v16;
1217 }
1218 v7 = *v16;
1219 if ( thisb - 1 >= (signed int)*v16 )
1220 break;
1221 }
1222 if ( a2_3 )
1223 result = 1;
1224 else
1225 LABEL_28:
1226 result = 0;
1227 return result;
1228 }
1229
1230 //----- (00437285) --------------------------------------------------------
1231 bool IndoorCameraD3D::_437285_prolly_colide_vertices_against_frustrum(RenderVertexSoft *a1, unsigned int *pOutNumVertices, RenderVertexSoft *pVertices, IndoorCameraD3D_Vec4 *a4, signed int uNumVertices, char a6, int _unused)
1232 {
1233 char *v8; // eax@2
1234 signed int v9; // ecx@2
1235 //bool result; // eax@5
1236 int v11; // ecx@5
1237 //signed int v12; // ecx@6
1238 //char *v13; // esi@6
1239 RenderVertexSoft *v14; // eax@8
1240 RenderVertexSoft *v15; // edx@8
1241 Vec3_float_ a5; // [sp+18h] [bp-3Ch]@12
1242 float v17; // [sp+44h] [bp-10h]@1
1243 int v18; // [sp+48h] [bp-Ch]@5
1244 //stru9 *thisa; // [sp+4Ch] [bp-8h]@1
1245 int a7a; // [sp+53h] [bp-1h]@5
1246 //bool a6a; // [sp+70h] [bp+1Ch]@5
1247
1248 v17 = 0.0;
1249 //thisa = pGame->pStru9Instance;
1250
1251
1252 static RenderVertexSoft sr_vertices_50D9D8[64];
1253
1254 //result = 0;
1255 a7a = 0;
1256 v11 = 2 * (a6 == 0) + 1;
1257 //a6a = 0;
1258 v18 = v11;
1259 if (uNumVertices <= 0)
1260 return false;
1261
1262 //v12 = *pOutNumVertices;
1263 //v13 = (char *)&a4->y;
1264 uint i = 0;
1265 while ( 1 )
1266 {
1267 if (i % 2)
1268 {
1269 v14 = a1;
1270 v15 = sr_vertices_50D9D8;
1271 }
1272 else
1273 {
1274 v15 = a1;
1275 v14 = sr_vertices_50D9D8;
1276 }
1277 if (i == uNumVertices - 1)
1278 v14 = pVertices;
1279 a5.x = a4[i].x;
1280 a5.y = a4[i].y;
1281 a5.z = a4[i].z;
1282 pGame->pStru9Instance->_4985FB(v15, *pOutNumVertices, v14, pOutNumVertices, &a5, a4[i].dot, (char *)&a7a, _unused);
1283 //v12 = *pOutNumVertices;
1284 if (*pOutNumVertices < v18)
1285 break;
1286 //result = a6a;
1287 //v13 += 24;
1288 if (++i >= uNumVertices)
1289 return a7a;
1290 }
1291 *pOutNumVertices = 0;
1292 return true;
1293 }
1294
1295 //----- (004371C3) --------------------------------------------------------
1296 bool IndoorCameraD3D::_4371C3(RenderVertexSoft *pVertices, unsigned int *pOutNumVertices, int _unused)
1297 {
1298 char *v4; // eax@2
1299 signed int v5; // ecx@2
1300 RenderVertexSoft *v6; // esi@5
1301 unsigned int *v7; // edi@5
1302 char *v8; // ecx@6
1303 int v9; // eax@6
1304 IndoorCameraD3D *thisa; // [sp+0h] [bp-Ch]@1
1305 signed int v12; // [sp+4h] [bp-8h]@5
1306 unsigned int pVerticesa; // [sp+14h] [bp+8h]@6
1307 unsigned int pOutNumVerticesa; // [sp+18h] [bp+Ch]@6
1308
1309 thisa = this;
1310
1311
1312 static RenderVertexSoft static_4371C3_array_50E5E0[64];
1313 static bool __init_flag1 = false;
1314 if (!__init_flag1)
1315 {
1316 __init_flag1 = true;
1317
1318 for (uint i = 0; i < 64; ++i)
1319 static_4371C3_array_50E5E0[i].flt_2C = 0.0f;
1320 }
1321
1322 v12 = 0;
1323 v6 = pVertices;
1324 v7 = pOutNumVertices;
1325 if ( (signed int)*pOutNumVertices > 0 )
1326 {
1327 pOutNumVerticesa = (char *)static_4371C3_array_50E5E0 - (char *)pVertices;
1328 pVerticesa = (char *)&static_4371C3_array_50E5E0[0].vWorldViewProjY - (char *)pVertices;
1329 v8 = (char *)&static_4371C3_array_50E5E0[0].vWorldPosition.y;
1330 v9 = (int)&v6->vWorldPosition.z;
1331 do
1332 {
1333 ++v12;
1334 *((int *)v8 - 1) = *(int *)(v9 - 8);
1335 *(int *)v8 = *(int *)(v9 - 4);
1336 v8 += 48;
1337 *(float *)(pOutNumVerticesa + v9) = *(float *)v9;
1338 *(float *)(pVerticesa + v9) = *(float *)(v9 + 28);
1339 *(float *)((char *)&static_4371C3_array_50E5E0[0].flt_20 - (char *)v6 + v9) = *(float *)(v9 + 32);
1340 v9 += 48;
1341 }
1342 while ( v12 < (signed int)*v7 );
1343 }
1344 return _437285_prolly_colide_vertices_against_frustrum(
1345 static_4371C3_array_50E5E0,
1346 v7,
1347 v6,
1348 thisa->std__vector_000034_prolly_frustrum,
1349 4,
1350 0,
1351 _unused);
1352 }
1353 // 50F1E0: using guessed type char static_sub_4371C3_byte_50F1E0_init_flags;
1354
1355 //----- (00437143) --------------------------------------------------------
1356 int IndoorCameraD3D::_437143(unsigned int uNumInVertices, RenderVertexSoft *pOutVertices, RenderVertexSoft *pInVertices, unsigned int *pOutNumVertices)
1357 {
1358 unsigned int v5; // edi@1
1359 char *pOutVertices_; // edx@2
1360 char *v7; // eax@2
1361 unsigned int v8; // ebx@2
1362 double v9; // st7@3
1363 double v10; // st6@3
1364 int result; // eax@5
1365 unsigned int a2a; // [sp+10h] [bp+Ch]@2
1366
1367 v5 = uNumInVertices;
1368 if ( (signed int)uNumInVertices > 0 )
1369 {
1370 pOutVertices_ = (char *)&pOutVertices->vWorldViewProjY;
1371 v7 = (char *)&pInVertices->flt_20;
1372 v8 = (char *)pOutVertices - (char *)pInVertices;
1373 a2a = uNumInVertices;
1374 do
1375 {
1376 *(float *)v7 = 1.0 / (*((float *)v7 - 5) + 0.0000001);
1377 memcpy(pOutVertices_ - 28, v7 - 32, 0x30u);
1378 v9 = (double)pOutdoorCamera->int_fov_rad * *(float *)&v7[v8];
1379 v10 = (double)pViewport->uScreenCenterX - v9 * *((float *)v7 - 4);
1380 v7 += 48;
1381 *((float *)pOutVertices_ - 1) = v10;
1382 *(float *)pOutVertices_ = (double)pViewport->uScreenCenterY - v9 * *((float *)v7 - 15);
1383 pOutVertices_ += 48;
1384 --a2a;
1385 }
1386 while ( a2a );
1387 v5 = uNumInVertices;
1388 }
1389 result = (int)pOutNumVertices;
1390 *pOutNumVertices = v5;
1391 return result;
1392 }
1393 //----- (00436F09) --------------------------------------------------------
1394 void IndoorCameraD3D::_436F09_mess_with_lightmap__clipflag_4(RenderVertexSoft *pInVertices, int uNumInVertices, RenderVertexSoft *pOutVertices, unsigned int *pOutNumVertices)
1395 {
1396 unsigned int *pOutNumVertices_; // ebx@1
1397 double v6; // st7@2
1398 signed int v7; // esi@2
1399 char *v8; // edx@5
1400 unsigned int v9; // eax@10
1401 RenderVertexSoft *v10; // ecx@11
1402 double v11; // st6@11
1403 double v12; // st6@12
1404 unsigned int v13; // edi@14
1405 unsigned __int8 v14; // c2@16
1406 unsigned __int8 v15; // c3@16
1407 unsigned int v16; // edi@17
1408 bool a1a; // [sp+Ch] [bp+8h]@7
1409 int a4a; // [sp+18h] [bp+14h]@5
1410
1411 pOutNumVertices_ = pOutNumVertices;
1412 *pOutNumVertices = 0;
1413 if ( uNumInVertices )
1414 {
1415 memcpy(&pInVertices[uNumInVertices], pInVertices, sizeof(pInVertices[uNumInVertices]));
1416 v6 = (double)pOutdoorCamera->shading_dist_mist;
1417 v7 = 0;
1418 if ( v6 >= pInVertices->vWorldViewPosition.x )
1419 v7 = 1;
1420 if ( uNumInVertices + 1 > 1 )
1421 {
1422 a4a = uNumInVertices;
1423 v8 = (char *)&pInVertices[1].u;
1424 do
1425 {
1426 a1a = v6 >= *((float *)v8 - 6);
1427 if ( v7 == a1a )
1428 {
1429 v10 = pOutVertices;
1430 goto LABEL_23;
1431 }
1432 v9 = *pOutNumVertices_;
1433 if ( a1a )
1434 {
1435 v10 = pOutVertices;
1436 v11 = (v6 - *((float *)v8 - 18)) / (*((float *)v8 - 6) - *((float *)v8 - 18));
1437 pOutVertices[v9].vWorldViewPosition.y = (*((float *)v8 - 5) - *((float *)v8 - 17)) * v11 + *((float *)v8 - 17);
1438 pOutVertices[*pOutNumVertices_].vWorldViewPosition.z = (*((float *)v8 - 4) - *((float *)v8 - 16)) * v11
1439 + *((float *)v8 - 16);
1440 pOutVertices[*pOutNumVertices_].u = (*(float *)v8 - *((float *)v8 - 12)) * v11 + *((float *)v8 - 12);
1441 pOutVertices[*pOutNumVertices_].v = (*((float *)v8 + 1) - *((float *)v8 - 11)) * v11 + *((float *)v8 - 11);
1442 }
1443 else
1444 {
1445 v12 = (v6 - *((float *)v8 - 6)) / (*((float *)v8 - 18) - *((float *)v8 - 6));
1446 pOutVertices[v9].vWorldViewPosition.y = (*((float *)v8 - 17) - *((float *)v8 - 5)) * v12 + *((float *)v8 - 5);
1447 pOutVertices[*pOutNumVertices_].vWorldViewPosition.z = (*((float *)v8 - 16) - *((float *)v8 - 4)) * v12
1448 + *((float *)v8 - 4);
1449 pOutVertices[*pOutNumVertices_].u = (*((float *)v8 - 12) - *(float *)v8) * v12 + *(float *)v8;
1450 pOutVertices[*pOutNumVertices_].v = (*((float *)v8 - 11) - *((float *)v8 + 1)) * v12 + *((float *)v8 + 1);
1451 v10 = pOutVertices;
1452 }
1453 v10[*pOutNumVertices_].vWorldViewPosition.x = v6;
1454 v10[*pOutNumVertices_].flt_20 = 1.0 / v6;
1455 if ( v7 )
1456 {
1457 v13 = (unsigned int)&v10[*pOutNumVertices_];
1458 if ( *(float *)(v13 + 12) != *((float *)v8 - 18) || *(float *)(v13 + 16) != *((float *)v8 - 17) )
1459 goto LABEL_21;
1460 v14 = 0;
1461 v15 = *(float *)(v13 + 20) == *((float *)v8 - 16);
1462 }
1463 else
1464 {
1465 v16 = (unsigned int)&v10[*pOutNumVertices_];
1466 if ( *(float *)(v16 + 12) != *((float *)v8 - 6) || *(float *)(v16 + 16) != *((float *)v8 - 5) )
1467 {
1468 LABEL_21:
1469 ++*pOutNumVertices_;
1470 goto LABEL_23;
1471 }
1472 v14 = 0;
1473 v15 = *(float *)(v16 + 20) == *((float *)v8 - 4);
1474 }
1475 if ( !(v15 | v14) )
1476 goto LABEL_21;
1477 LABEL_23:
1478 if ( a1a )
1479 {
1480 memcpy(&v10[*pOutNumVertices_], v8 - 36, sizeof(v10[*pOutNumVertices_]));
1481 pOutVertices[*pOutNumVertices_].flt_20 = 1.0 / (*((float *)v8 - 6) + 0.0000001);
1482 pOutVertices[(*pOutNumVertices_)++].flt_2C = *((float *)v8 + 2);
1483 }
1484 v7 = a1a;
1485 v8 += 48;
1486 --a4a;
1487 }
1488 while ( a4a );
1489 }
1490 if ( (signed int)*pOutNumVertices_ < 3 )
1491 *pOutNumVertices_ = 0;
1492 }
1493 }
1494
1495
1496 //----- (00436CDC) --------------------------------------------------------
1497 void IndoorCameraD3D::_436CDC_mess_with_lightmap__clipflag_2(RenderVertexSoft *pInVertices, int uNumInVertices, RenderVertexSoft *pOutVertices, unsigned int *pOutNumVertices)
1498 {
1499 signed int v5; // esi@2
1500 char *v6; // edx@5
1501 unsigned int v7; // eax@10
1502 RenderVertexSoft *v8; // ecx@11
1503 double v9; // st6@11
1504 double v10; // st6@12
1505 unsigned int v11; // edi@14
1506 unsigned __int8 v12; // c2@16
1507 unsigned __int8 v13; // c3@16
1508 unsigned int v14; // edi@17
1509 bool a1a; // [sp+Ch] [bp+8h]@7
1510
1511 if ( uNumInVertices )
1512 {
1513 *pOutNumVertices = 0;
1514 memcpy(&pInVertices[uNumInVertices], pInVertices, sizeof(pInVertices[uNumInVertices]));
1515 v5 = 0;
1516 if ( pInVertices->vWorldViewPosition.x >= 8.0 )
1517 v5 = 1;
1518 if ( uNumInVertices + 1 > 1 )
1519 {
1520 v6 = (char *)&pInVertices[1].u;
1521 do
1522 {
1523 a1a = *((float *)v6 - 6) >= 8.0;
1524 if ( v5 == a1a )
1525 {
1526 v8 = pOutVertices;
1527 goto LABEL_23;
1528 }
1529 v7 = *pOutNumVertices;
1530 if ( a1a )
1531 {
1532 v8 = pOutVertices;
1533 v9 = (8.0 - *((float *)v6 - 18)) / (*((float *)v6 - 6) - *((float *)v6 - 18));
1534 pOutVertices[v7].vWorldViewPosition.y = (*((float *)v6 - 5) - *((float *)v6 - 17)) * v9 + *((float *)v6 - 17);
1535 pOutVertices[*pOutNumVertices].vWorldViewPosition.z = (*((float *)v6 - 4) - *((float *)v6 - 16)) * v9
1536 + *((float *)v6 - 16);
1537 pOutVertices[*pOutNumVertices].u = (*(float *)v6 - *((float *)v6 - 12)) * v9 + *((float *)v6 - 12);
1538 pOutVertices[*pOutNumVertices].v = (*((float *)v6 + 1) - *((float *)v6 - 11)) * v9 + *((float *)v6 - 11);
1539 }
1540 else
1541 {
1542 v10 = (8.0 - *((float *)v6 - 6)) / (*((float *)v6 - 18) - *((float *)v6 - 6));
1543 pOutVertices[v7].vWorldViewPosition.y = (*((float *)v6 - 17) - *((float *)v6 - 5)) * v10 + *((float *)v6 - 5);
1544 pOutVertices[*pOutNumVertices].vWorldViewPosition.z = (*((float *)v6 - 16) - *((float *)v6 - 4)) * v10
1545 + *((float *)v6 - 4);
1546 pOutVertices[*pOutNumVertices].u = (*((float *)v6 - 12) - *(float *)v6) * v10 + *(float *)v6;
1547 pOutVertices[*pOutNumVertices].v = (*((float *)v6 - 11) - *((float *)v6 + 1)) * v10 + *((float *)v6 + 1);
1548 v8 = pOutVertices;
1549 }
1550 v8[*pOutNumVertices].vWorldViewPosition.x = 8.0;
1551 v8[*pOutNumVertices].flt_20 = 0.125;
1552 if ( v5 )
1553 {
1554 v11 = (unsigned int)&v8[*pOutNumVertices];
1555 if ( *(float *)(v11 + 12) != *((float *)v6 - 18) || *(float *)(v11 + 16) != *((float *)v6 - 17) )
1556 goto LABEL_21;
1557 v12 = 0;
1558 v13 = *(float *)(v11 + 20) == *((float *)v6 - 16);
1559 }
1560 else
1561 {
1562 v14 = (unsigned int)&v8[*pOutNumVertices];
1563 if ( *(float *)(v14 + 12) != *((float *)v6 - 6) || *(float *)(v14 + 16) != *((float *)v6 - 5) )
1564 {
1565 LABEL_21:
1566 ++*pOutNumVertices;
1567 goto LABEL_23;
1568 }
1569 v12 = 0;
1570 v13 = *(float *)(v14 + 20) == *((float *)v6 - 4);
1571 }
1572 if ( !(v13 | v12) )
1573 goto LABEL_21;
1574 LABEL_23:
1575 if ( a1a )
1576 {
1577 memcpy(&v8[*pOutNumVertices], v6 - 36, sizeof(v8[*pOutNumVertices]));
1578 pOutVertices[(*pOutNumVertices)++].flt_20 = 1.0 / (*((float *)v6 - 6) + 0.0000001);
1579 }
1580 v5 = a1a;
1581 v6 += 48;
1582 --uNumInVertices;
1583 }
1584 while ( uNumInVertices );
1585 }
1586 if ( (signed int)*pOutNumVertices < 3 )
1587 *pOutNumVertices = 0;
1588 }
1589 }
1590
1591
1592 //----- (00436BB7) --------------------------------------------------------
1593 void IndoorCameraD3D::Project(RenderVertexSoft *pVertices, unsigned int uNumVertices, char a4)
1594 {
1595 double v7; // st7@7
1596 double v8; // st7@9
1597 double v9; // st6@10
1598 double v10; // st5@12
1599 double v11; // st7@16
1600 double v12; // st6@17
1601 double v13; // st5@19
1602 float uNumVerticesa; // [sp+14h] [bp+Ch]@13
1603 float uNumVerticesb; // [sp+14h] [bp+Ch]@20
1604
1605 for (uint i = 0; i < uNumVertices; ++i)
1606 {
1607 if (byte_4D864C && pGame->uFlags & 0x80 || uCurrentlyLoadedLevelType == LEVEL_Indoor)
1608 {
1609 v7 = 1.0 / pVertices[i].vWorldViewPosition.x;
1610
1611 pVertices[i].vWorldViewProjX = pVertices[i].vWorldViewPosition.y * fov * v7 + screenCenterX;
1612 pVertices[i].vWorldViewProjY = (signed int)pViewport->uViewportW - (pVertices[i].vWorldViewPosition.z * fov * v7 + screenCenterY);
1613 }
1614 else
1615 {
1616 extern void _outdoor_project(RenderVertexSoft *v);
1617 _outdoor_project(pVertices + i);
1618 }
1619
1620 if ( a4 )
1621 {
1622 __debugbreak();
1623 v8 = (double)(signed int)pViewport->uViewportZ;
1624 if ( v8 >= pVertices[i].vWorldViewProjX )
1625 v9 = pVertices[i].vWorldViewProjX;
1626 else
1627 v9 = v8;
1628 v10 = (double)(signed int)pViewport->uViewportX;
1629 if ( v10 <= v9 )
1630 {
1631 if ( v8 >= pVertices[i].vWorldViewProjX)
1632 v8 = pVertices[i].vWorldViewProjX;
1633 }
1634 else
1635 {
1636 uNumVerticesa = v10;
1637 v8 = uNumVerticesa;
1638 }
1639 pVertices[i].vWorldViewProjX = v8;
1640 v11 = (double)(signed int)pViewport->uViewportW;
1641 if ( v11 >= pVertices[i].vWorldViewProjY)
1642 v12 = pVertices[i].vWorldViewProjY;
1643 else
1644 v12 = v11;
1645 v13 = (double)(signed int)pViewport->uViewportY;
1646 if ( v13 <= v12 )
1647 {
1648 if ( v11 >= pVertices[i].vWorldViewProjY)
1649 v11 = pVertices[i].vWorldViewProjY;
1650 }
1651 else
1652 {
1653 uNumVerticesb = v13;
1654 v11 = uNumVerticesb;
1655 }
1656 pVertices[i].vWorldViewProjY = v11;
1657 }
1658 }
1659 }
1660
1661
1662 //----- (00436A9A) --------------------------------------------------------
1663 void IndoorCameraD3D::Project(signed int x, signed int y, signed int z, int *a5, int *a6)
1664 {
1665 double v6; // ST00_8@2
1666 //double v7; // ST08_8@2
1667 //double v8; // ST00_8@2
1668 signed __int64 v9; // qtt@3
1669 int v10; // ST04_4@3
1670 float a2a; // [sp+18h] [bp+8h]@2
1671 float a2b; // [sp+18h] [bp+8h]@2
1672
1673 if ( pRenderer->pRenderD3D )
1674 {
1675 v6 = 1.0 / (double)x;
1676 a2a = (double)y * fov * v6 + screenCenterX;
1677 //v7 = a2a + 6.7553994e15;
1678 *a5 = floorf(a2a + 0.5f);
1679 a2b = (double)z * fov * v6 + screenCenterY;
1680 //v8 = a2b + 6.7553994e15;
1681 *a6 = pViewport->uViewportW - floorf(a2b + 0.5f);
1682 }
1683 else
1684 {
1685 LODWORD(v9) = pBLVRenderParams->field_40 << 16;
1686 HIDWORD(v9) = pBLVRenderParams->field_40 >> 16;
1687 v10 = v9 / x;
1688 LODWORD(v9) = pBLVRenderParams->field_40 << 16;
1689 HIDWORD(v9) = pBLVRenderParams->field_40 >> 16;
1690 *a5 = pBLVRenderParams->uViewportCenterX
1691 - ((signed int)(((unsigned __int64)(v10 * (signed __int64)y) >> 16) + 32768) >> 16);
1692 *a6 = pBLVRenderParams->uViewportCenterY - ((signed int)(((unsigned __int64)(v9 / x * z) >> 16) + 32768) >> 16);
1693 }
1694 }
1695
1696 //----- (00436A6D) --------------------------------------------------------
1697 double IndoorCameraD3D::GetPolygonMinZ(RenderVertexSoft *pVertices, unsigned int uStripType)
1698 {
1699 unsigned int v3; // edx@1
1700 double result; // st7@1
1701 float *v5; // ecx@2
1702
1703 v3 = uStripType;
1704 result = 3.4028235e38;
1705 if ( (signed int)uStripType > 0 )
1706 {
1707 v5 = &pVertices->vWorldPosition.z;
1708 do
1709 {
1710 if ( *v5 < result )
1711 result = *v5;
1712 v5 += 12;
1713 --v3;
1714 }
1715 while ( v3 );
1716 }
1717 return result;
1718 }
1719
1720
1721 //----- (00436A24) --------------------------------------------------------
1722 struct IDirect3DTexture2 *IndoorCameraD3D::LoadTextureAndGetHardwarePtr(char *Str1)
1723 {
1724 return pBitmaps_LOD->pHardwareTextures[pBitmaps_LOD->LoadTexture(Str1)];
1725 }
1726
1727 //----- (00436A40) --------------------------------------------------------
1728 double IndoorCameraD3D::GetPolygonMaxZ(RenderVertexSoft *pVertex, unsigned int uStripType)
1729 {
1730 unsigned int v3; // edx@1
1731 double result; // st7@1
1732 float *v5; // ecx@2
1733
1734 v3 = uStripType;
1735 result = 1.1754944e-38;
1736 if ( (signed int)uStripType > 0 )
1737 {
1738 v5 = &pVertex->vWorldPosition.z;
1739 do
1740 {
1741 if ( *v5 > result )
1742 result = *v5;
1743 v5 += 12;
1744 --v3;
1745 }
1746 while ( v3 );
1747 }
1748 return result;
1749 }