@@ -180,27 +180,27 @@ void MungeSkyModel(br_actor* pCamera, br_model* pModel) {
180
180
LOG_TRACE ("(%p, %p)" , pCamera , pModel );
181
181
182
182
camera_data = pCamera -> type_data ;
183
-
184
183
tan_half_fov = Tan (camera_data -> field_of_view / 2 );
185
- // BR_ANGLE_RAD(atan2f(tan_half_fov, camera_data->aspect / 2)) ;
186
- horizon_half_width = ( camera_data -> yon_z - 1.f ) * tan_half_fov ;
184
+ sky_distance = camera_data -> yon_z - 1.f ;
185
+ horizon_half_width = sky_distance * tan_half_fov ;
187
186
horizon_half_height = horizon_half_width * camera_data -> aspect ;
188
- horizon_half_diag = BR_LENGTH2 (horizon_half_width , horizon_half_height );
189
- min_angle = BR_ANGLE_RAD (atan2f (horizon_half_diag , camera_data -> yon_z - 1.f ));
190
- edge_u = EdgeU (gSky_image_width , 2 * min_angle , BR_ANGLE_DEG (10 ));
191
- gSky_width = 2.f * horizon_half_width ;
192
- gSky_height = 2.f * horizon_half_height ;
187
+ horizon_half_diag = sqrtf (horizon_half_height * horizon_half_height + horizon_half_width * horizon_half_width );
188
+ half_diag_fov = BrRadianToAngle (atan2f (horizon_half_diag , sky_distance ));
189
+ edge_u = EdgeU (gSky_image_width , 2 * half_diag_fov , BR_ANGLE_DEG (10 ));
190
+ narrow_u = edge_u / 2.f ;
191
+ gSky_width = horizon_half_width * 2.f ;
192
+ gSky_height = horizon_half_height * 2.f ;
193
193
gSky_x_multiplier = CalculateWrappingMultiplier (gSky_width , camera_data -> yon_z );
194
194
gSky_y_multiplier = CalculateWrappingMultiplier (gSky_height , camera_data -> yon_z );
195
195
196
196
for (vertex = 0 ; vertex < 88 ; vertex += 4 ) {
197
197
pModel -> vertices [vertex ].map .v [0 ] = - edge_u ;
198
198
}
199
199
for (vertex = 1 ; vertex < 88 ; vertex += 4 ) {
200
- pModel -> vertices [vertex ].map .v [0 ] = - edge_u / 2.f ;
200
+ pModel -> vertices [vertex ].map .v [0 ] = - narrow_u ;
201
201
}
202
202
for (vertex = 2 ; vertex < 88 ; vertex += 4 ) {
203
- pModel -> vertices [vertex ].map .v [0 ] = edge_u / 2.f ;
203
+ pModel -> vertices [vertex ].map .v [0 ] = narrow_u ;
204
204
}
205
205
for (vertex = 3 ; vertex < 88 ; vertex += 4 ) {
206
206
pModel -> vertices [vertex ].map .v [0 ] = edge_u ;
@@ -209,7 +209,7 @@ void MungeSkyModel(br_actor* pCamera, br_model* pModel) {
209
209
pModel -> vertices [vertex ].p .v [0 ] = - horizon_half_diag ;
210
210
}
211
211
for (vertex = 1 ; vertex < 88 ; vertex += 4 ) {
212
- pModel -> vertices [vertex ].p .v [0 ] = - horizon_half_diag / 2.f ;
212
+ pModel -> vertices [vertex ].p .v [0 ] = - ( horizon_half_diag / 2.f ) ;
213
213
}
214
214
for (vertex = 2 ; vertex < 88 ; vertex += 4 ) {
215
215
pModel -> vertices [vertex ].p .v [0 ] = horizon_half_diag / 2.f ;
@@ -218,31 +218,39 @@ void MungeSkyModel(br_actor* pCamera, br_model* pModel) {
218
218
pModel -> vertices [vertex ].p .v [0 ] = horizon_half_diag ;
219
219
}
220
220
PossibleService ();
221
- angle_range = - (gSky_image_underground + (BR_ANGLE_DEG (90 ) - min_angle ));
222
- for (vertex = 0 ; vertex < 2 ; vertex ++ ) {
223
- angle = vertex * angle_range / 2 - (BR_ANGLE_DEG (90 ) + min_angle );
224
- pModel -> vertices [0 + 4 * vertex ].p .v [1 ] = sinf (BrAngleToRadian (angle )) * (camera_data -> yon_z - 1.f );
225
- pModel -> vertices [0 + 4 * vertex ].p .v [2 ] = - cosf (BrAngleToRadian (angle )) * (camera_data -> yon_z - 1.f );
226
- }
227
- for (vertex = 0 ; vertex < 18 ; vertex ++ ) {
228
- angle = vertex * gSky_image_height / 18 - gSky_image_height ;
229
- pModel -> vertices [8 + 4 * vertex ].p .v [1 ] = sinf (BrAngleToRadian (angle )) * (camera_data -> yon_z - 1.f );
230
- pModel -> vertices [8 + 4 * vertex ].p .v [2 ] = - cosf (BrAngleToRadian (angle )) * (camera_data -> yon_z - 1.f );
231
- }
232
- for (vertex = 0 ; vertex < 2 ; vertex ++ ) {
233
- angle = vertex * (min_angle + BR_ANGLE_DEG (90 ) - (gSky_image_height - gSky_image_underground )) - (gSky_image_height - gSky_image_underground );
234
- pModel -> vertices [80 + 4 * vertex ].p .v [1 ] = sinf (BrAngleToRadian (angle )) * (camera_data -> yon_z - 1.f );
235
- pModel -> vertices [80 + 4 * vertex ].p .v [2 ] = - cosf (BrAngleToRadian (angle )) * (camera_data -> yon_z - 1.f );
221
+ angle_range = - gSky_image_underground - (- BR_ANGLE_DEG (90 ) - half_diag_fov );
222
+ for (band = 0 ; band < 2u ; band ++ ) {
223
+ vertex = 4 * band ;
224
+ angle = - BR_ANGLE_DEG (90 ) - half_diag_fov + angle_range * band / 2 ;
225
+ pModel -> vertices [vertex ].p .v [1 ] = sinf (BrAngleToRadian (angle )) * sky_distance ;
226
+ pModel -> vertices [vertex ].p .v [2 ] = - cosf (BrAngleToRadian (angle )) * sky_distance ;
227
+ }
228
+ min_angle = - gSky_image_underground ;
229
+ angle_range = gSky_image_height ;
230
+ nbands = 18 ;
231
+ for (band = 0 ; band < nbands ; band ++ ) {
232
+ vertex = 4 * band + 8 ;
233
+ pModel -> vertices [vertex ].p .v [1 ] = sinf (BrAngleToRadian (min_angle + angle_range * band / nbands )) * sky_distance ;
234
+ pModel -> vertices [vertex ].p .v [2 ] = - cosf (BrAngleToRadian (min_angle + angle_range * band / nbands )) * sky_distance ;
235
+ }
236
+ min_angle = gSky_image_height - gSky_image_underground ;
237
+ angle_range = half_diag_fov + BR_ANGLE_DEG (90 ) - (gSky_image_height - gSky_image_underground );
238
+ for (band = 0 ; band <= 1u ; band ++ ) {
239
+ vertex = 4 * band + 80 ;
240
+ angle = min_angle + angle_range * band ;
241
+ pModel -> vertices [vertex ].p .v [1 ] = sinf (BrAngleToRadian (angle )) * sky_distance ;
242
+ pModel -> vertices [vertex ].p .v [2 ] = - cosf (BrAngleToRadian (angle )) * sky_distance ;
236
243
}
237
244
PossibleService ();
238
- for (band = 0 ; band < 22 ; band ++ ) {
239
- for (vertex = 1 ; vertex < 4 ; vertex ++ ) {
240
- pModel -> vertices [4 * band + vertex ].p .v [1 ] = pModel -> vertices [vertex ].p .v [1 ];
241
- pModel -> vertices [4 * band + vertex ].p .v [2 ] = pModel -> vertices [vertex ].p .v [2 ];
245
+ for (band = 0 ; band <= 21u ; ++ band ) {
246
+ vertex = 4 * band ;
247
+ for (stripe = 1 ; stripe < 4u ; ++ stripe ) {
248
+ pModel -> vertices [vertex + stripe ].p .v [1 ] = pModel -> vertices [vertex ].p .v [1 ];
249
+ pModel -> vertices [vertex + stripe ].p .v [2 ] = pModel -> vertices [vertex ].p .v [2 ];
242
250
}
243
251
}
244
- // FIXME: unknown model flag disabled
245
- BrModelUpdate (pModel , BR_MODU_ALL & ~0x80 );
252
+
253
+ BrModelUpdate (pModel , BR_MODU_ALL & ~BR_MODU_VERTEX_NORMALS );
246
254
}
247
255
248
256
// IDA: br_model* __usercall CreateHorizonModel@<EAX>(br_actor *pCamera@<EAX>)
@@ -331,12 +339,18 @@ void InitDepthEffects() {
331
339
FatalError (kFatalError_FindSkyMaterial_S , "HORIZON.MAT" ); // 2nd argument added
332
340
}
333
341
gHorizon_material -> index_blend = BrPixelmapAllocate (BR_PMT_INDEX_8 , 256 , 256 , NULL , 0 );
334
- BrTableAdd (gHorizon_material -> index_blend );
342
+
343
+ // HACK: moved below loop
344
+ // BrTableAdd(gHorizon_material->index_blend);
335
345
for (i = 0 ; i < 256 ; i ++ ) {
336
346
for (j = 0 ; j < 256 ; j ++ ) {
337
347
* ((tU8 * )gHorizon_material -> index_blend -> pixels + 256 * i + j ) = j ;
338
348
}
339
349
}
350
+ // HACK: this should be above the for loop. Haven't been able to figure out how this is working in OG, as changes made to the pixelmap
351
+ // don't update the stored copy without calling `BrTableUpdate`.
352
+ BrTableAdd (gHorizon_material -> index_blend );
353
+
340
354
gHorizon_material -> flags |= BR_MATF_PERSPECTIVE ;
341
355
BrMaterialAdd (gHorizon_material );
342
356
gForward_sky_model = CreateHorizonModel (gCamera );
@@ -371,9 +385,6 @@ void DoDepthByShadeTable(br_pixelmap* pRender_buffer, br_pixelmap* pDepth_buffer
371
385
int render_line_skip ;
372
386
LOG_TRACE ("(%p, %p, %p, %d, %d, %d)" , pRender_buffer , pDepth_buffer , pShade_table , pShade_table_power , pStart , pEnd );
373
387
374
- // Added to ensure we've copied the framebuffer+depthbuffer back into main memory
375
- Harness_Hook_FlushRenderer ();
376
-
377
388
too_near = 0xffff - (1 << pStart );
378
389
shade_table_pixels = pShade_table -> pixels ;
379
390
depth_shift_amount = pShade_table_power + 8 - pStart - pEnd ;
@@ -514,7 +525,7 @@ void DoHorizon(br_pixelmap* pRender_buffer, br_pixelmap* pDepth_buffer, br_actor
514
525
br_actor * actor ;
515
526
LOG_TRACE ("(%p, %p, %p, %p)" , pRender_buffer , pDepth_buffer , pCamera , pCamera_to_world );
516
527
517
- yaw = BR_ANGLE_RAD (atan2f (pCamera_to_world -> m [2 ][0 ], pCamera_to_world -> m [2 ][2 ]));
528
+ yaw = BrRadianToAngle (atan2f (pCamera_to_world -> m [2 ][0 ], pCamera_to_world -> m [2 ][2 ]));
518
529
if (!gProgram_state .cockpit_on && !(gAction_replay_mode && gAction_replay_camera_mode )) {
519
530
return ;
520
531
}
0 commit comments