692
|
1 #include "Viewport.h"
|
|
2
|
|
3 #include "Party.h"
|
|
4 #include "VectorTypes.h"
|
|
5 #include "Indoor.h"
|
|
6 #include "Render.h"
|
|
7 #include "mm7_data.h"
|
|
8
|
|
9
|
|
10 //----- (004C0262) --------------------------------------------------------
|
|
11 void Viewport::SetScreen( signed int sTL_X, signed int sTL_Y, signed int sBR_X, signed int sBR_Y )
|
|
12 {
|
|
13 unsigned int tl_x; // edx@1
|
|
14 unsigned int br_x; // esi@1
|
|
15 unsigned int tl_y; // edi@3
|
|
16 unsigned int br_y; // eax@3
|
|
17 int v10; // eax@7
|
|
18
|
|
19 tl_x = sTL_X;
|
|
20 br_x = sBR_X;
|
|
21 if ( sTL_X > sBR_X )
|
|
22 {
|
|
23 br_x = sBR_X ^ sTL_X ^ sBR_X; // swap x's
|
|
24 tl_x = br_x ^ sBR_X ^ sTL_X;
|
|
25 }
|
|
26 tl_y = sTL_Y;
|
|
27 br_y = sBR_Y;
|
|
28 if ( (signed int)sTL_Y > (signed int)sBR_Y )
|
|
29 {
|
|
30 br_y = sBR_Y ^ sTL_Y ^ sBR_Y; // swap y's
|
|
31 tl_y = br_y ^ sBR_Y ^ sTL_Y;
|
|
32 }
|
|
33 this->uScreen_TL_X = tl_x;
|
|
34 this->uScreen_TL_Y = tl_y;
|
|
35 this->uScreen_BR_X = br_x;
|
|
36 this->uScreen_BR_Y = br_y;
|
|
37 this->uScreenWidth = br_x - tl_x + 1;
|
693
|
38 this->uScreenHeight = br_y - tl_y + 1;
|
|
39 this->uScreenCenterX = (signed int)(br_x + tl_x) /2;
|
692
|
40 if ( pRenderer->pRenderD3D == 0 )
|
693
|
41 this->uScreenCenterY = this->uScreen_BR_Y - ((unsigned __int64)(this->field_30 * (signed __int64)(uScreenHeight)) >> 16);
|
692
|
42 else
|
693
|
43 this->uScreenCenterY = uScreenHeight/2;
|
692
|
44 SetViewport(this->uScreen_TL_X, this->uScreen_TL_Y, this->uScreen_BR_X, this->uScreen_BR_Y);
|
|
45 }
|
|
46
|
|
47 //----- (004C02F8) --------------------------------------------------------
|
|
48 void Viewport::_4C02F8(int a2)
|
|
49 {
|
|
50 this->field_30 = a2;
|
|
51 SetScreen(this->uScreen_TL_X, this->uScreen_TL_Y, this->uScreen_BR_X, this->uScreen_BR_Y);
|
|
52 }
|
|
53
|
|
54 //----- (004C0312) --------------------------------------------------------
|
693
|
55 void Viewport::SetViewport( signed int sTL_X, signed int sTL_Y, signed int sBR_X, signed int sBR_Y )
|
692
|
56 {
|
693
|
57 signed int tl_x; // ebx@1
|
|
58 signed int tl_y; // edi@3
|
|
59 signed int br_x; // edx@5
|
|
60 signed int br_y; // eax@7
|
692
|
61
|
693
|
62 tl_x = sTL_X;
|
|
63 if ( sTL_X < this->uScreen_TL_X )
|
|
64 tl_x = this->uScreen_TL_X;
|
|
65 tl_y = sTL_Y;
|
|
66 if ( sTL_Y < this->uScreen_TL_Y )
|
|
67 tl_y = this->uScreen_TL_Y;
|
|
68 br_x = sBR_X;
|
|
69 if ( sBR_X > this->uScreen_BR_X )
|
|
70 br_x = this->uScreen_BR_X;
|
|
71 br_y = sBR_Y;
|
|
72 if ( sBR_Y > this->uScreen_BR_Y )
|
|
73 br_y = this->uScreen_BR_Y;
|
|
74 this->uViewportTL_Y = tl_y;
|
|
75 this->uViewportTL_X = tl_x;
|
|
76 this->uViewportBR_X = br_x;
|
|
77 this->uViewportBR_Y = br_y;
|
692
|
78 }
|
|
79
|
|
80 //----- (00443219) --------------------------------------------------------
|
|
81 void ViewingParams::_443219()
|
|
82 {
|
693
|
83 this->sViewCenterY += 512;
|
|
84 AdjustPosition();
|
692
|
85 }
|
|
86
|
|
87 //----- (00443225) --------------------------------------------------------
|
|
88 void ViewingParams::_443225()
|
|
89 {
|
693
|
90 this->sViewCenterX -= 512;
|
|
91 AdjustPosition();
|
692
|
92 }
|
|
93
|
|
94 //----- (00443231) --------------------------------------------------------
|
|
95 void ViewingParams::_443231()
|
|
96 {
|
693
|
97 this->sViewCenterY -= 512;
|
|
98 AdjustPosition();
|
692
|
99 }
|
|
100
|
|
101 //----- (0044323D) --------------------------------------------------------
|
|
102 void ViewingParams::_44323D()
|
|
103 {
|
693
|
104 this->sViewCenterX += 512;
|
|
105 AdjustPosition();
|
692
|
106 }
|
|
107
|
|
108 //----- (00443249) --------------------------------------------------------
|
693
|
109 void ViewingParams::CenterOnParty()
|
692
|
110 {
|
|
111 int v1; // edx@1
|
|
112
|
|
113 v1 = (unsigned __int64)((signed __int64)this->field_2C << 15) >> 16;
|
|
114 this->field_2C = v1;
|
|
115 if ( v1 < 384 )
|
|
116 this->field_2C = 384;
|
693
|
117 this->sViewCenterX = pParty->vPosition.x;
|
|
118 this->sViewCenterY = pParty->vPosition.y;
|
|
119 AdjustPosition();
|
692
|
120 }
|
|
121
|
|
122 //----- (00443291) --------------------------------------------------------
|
693
|
123 void ViewingParams::CenterOnParty2()
|
692
|
124 {
|
|
125 int v1; // edx@1
|
|
126 int v2; // eax@1
|
|
127
|
|
128 v1 = 2 * this->field_2C;
|
|
129 v2 = 1536;
|
|
130 this->field_2C = v1;
|
|
131 if ( uCurrentlyLoadedLevelType != LEVEL_Outdoor )
|
|
132 v2 = 3072;
|
|
133 if ( v1 > v2 )
|
|
134 this->field_2C = v2;
|
693
|
135 this->sViewCenterX = pParty->vPosition.x;
|
|
136 this->sViewCenterY = pParty->vPosition.y;
|
|
137 AdjustPosition();
|
692
|
138 }
|
|
139
|
|
140 //----- (004432E7) --------------------------------------------------------
|
693
|
141 void ViewingParams::AdjustPosition()
|
692
|
142 {
|
|
143 ViewingParams *v1; // esi@1
|
|
144 int v2; // ebx@1
|
|
145 signed int v3; // edx@1
|
|
146 int v4; // ecx@1
|
|
147 int v5; // edi@3
|
|
148 int v6; // eax@3
|
|
149 int v7; // eax@5
|
693
|
150
|
692
|
151
|
|
152 v1 = this;
|
|
153 v2 = this->field_3A;
|
|
154 v3 = 88 >> this->field_2C / 384;
|
|
155 v4 = (44 - v3) << 9;
|
693
|
156 if ( v1->sViewCenterY > v2 + v4 )
|
|
157 v1->sViewCenterY = v2 + v4;
|
692
|
158
|
|
159 v5 = v1->field_38;
|
|
160 v6 = (v3 - 44) << 9;
|
693
|
161 if ( v1->sViewCenterX < v5 + v6 )
|
|
162 v1->sViewCenterX = v5 + v6;
|
692
|
163
|
|
164 v7 = v2 + v6;
|
693
|
165 if ( v1->sViewCenterY < v7 )
|
|
166 v1->sViewCenterY = v7;
|
692
|
167
|
693
|
168 if ( v1->sViewCenterX > v5 + v4 )
|
|
169 v1->sViewCenterX = v5 + v4;
|
692
|
170 }
|
|
171
|
|
172 //----- (00443343) --------------------------------------------------------
|
|
173 void ViewingParams::InitGrayPalette()
|
|
174 {
|
|
175 for (unsigned short i=0; i<256; ++i)
|
|
176 pPalette[i]=GenerateColorAsCloseAsPossibleToR8G8B8InTargetFormat(i, i, i);
|
|
177 }
|
|
178
|
|
179 //----- (00443365) --------------------------------------------------------
|
|
180 void ViewingParams::_443365()
|
|
181 {
|
|
182 ViewingParams *v1; // esi@1
|
|
183 __int16 *v2; // edi@3
|
|
184 Vec3_short_ *v3; // eax@4
|
|
185 unsigned int v4; // edx@4
|
|
186 signed int v5; // eax@8
|
|
187 Vec3_short_ *v6; // eax@12
|
|
188 signed int v7; // edi@12
|
|
189 signed int v8; // eax@16
|
|
190 char v9; // zf@20
|
|
191 int result; // eax@21
|
|
192 unsigned int v11; // [sp+4h] [bp-1Ch]@3
|
|
193 unsigned int *v12; // [sp+8h] [bp-18h]@3
|
|
194 unsigned int v13; // [sp+Ch] [bp-14h]@8
|
|
195 unsigned int v14; // [sp+10h] [bp-10h]@2
|
|
196 unsigned int v15; // [sp+14h] [bp-Ch]@2
|
|
197 unsigned int v16; // [sp+18h] [bp-8h]@2
|
|
198 unsigned int v17; // [sp+1Ch] [bp-4h]@2
|
|
199
|
|
200 v1 = this;
|
|
201 InitGrayPalette();
|
|
202 if ( uCurrentlyLoadedLevelType == LEVEL_Indoor )
|
|
203 {
|
|
204 v16 = 0x40000000u;
|
|
205 v14 = 0x40000000u;
|
|
206 v17 = 0xC0000000u;
|
|
207 v15 = 0xC0000000u;
|
|
208 if ( (signed int)pIndoor->pMapOutlines->uNumOutlines > 0 )
|
|
209 {
|
|
210 v2 = (__int16 *)(pIndoor->pMapOutlines->pOutlines);
|
|
211 v11 = pIndoor->pMapOutlines->uNumOutlines;
|
|
212 v12 = (uint *)pIndoor->pMapOutlines->pOutlines;
|
|
213 do
|
|
214 {
|
|
215 v3 = &pIndoor->pVertices[*v2];
|
|
216 v4 = v3->x;
|
|
217 if ( (signed int)v4 < (signed int)v16 )
|
|
218 v16 = v3->x;
|
|
219 if ( (signed int)v4 > (signed int)v17 )
|
|
220 v17 = v3->x;
|
|
221 v5 = v3->y;
|
|
222 v13 = v5;
|
|
223 if ( v5 < (signed int)v14 )
|
|
224 v14 = v4;
|
|
225 if ( v5 > (signed int)v15 )
|
|
226 v15 = v4;
|
|
227 v6 = &pIndoor->pVertices[v2[1]];
|
|
228 v7 = v6->x;
|
|
229 if ( v7 < (signed int)v16 )
|
|
230 v16 = v4;
|
|
231 if ( v7 > (signed int)v17 )
|
|
232 v17 = v4;
|
|
233 v8 = v6->y;
|
|
234 if ( v8 < (signed int)v14 )
|
|
235 v14 = v13;
|
|
236 if ( v8 > (signed int)v15 )
|
|
237 v15 = v13;
|
|
238 v2 = (__int16 *)(v12 + 3);
|
|
239 v9 = v11-- == 1;
|
|
240 v12 += 3;
|
|
241 }
|
|
242 while ( !v9 );
|
|
243 }
|
|
244 v1->uMinimapZoom = 1024;
|
|
245 v1->field_38 = (signed int)(v16 + v17) / 2;
|
|
246 v1->field_28 = 10;
|
|
247 result = (signed int)(v14 + v15) / 2;
|
|
248 v1->field_3A = result;
|
|
249 }
|
|
250 else
|
|
251 {
|
|
252 v1->field_38 = 0;
|
|
253 v1->field_3A = 0;
|
|
254 v1->uMinimapZoom = dword_576E2C;
|
|
255 v1->field_28 = dword_576E28;
|
|
256 }
|
|
257 v1->field_2C = 384;
|
|
258 } |