Skip to content

Commit e567903

Browse files
Implement cockpit view (#279)
* Cockpit camera position now correctly follows parent actor * Fixes MungeSkyModel, updates BR_MODU enum * fixes incorrect blending in cockpit view * Tidy naming, adds unsigned Co-authored-by: Anonymous Maarten <madebr@users.noreply.github.com>
1 parent 83ba373 commit e567903

File tree

19 files changed

+239
-176
lines changed

19 files changed

+239
-176
lines changed

src/BRSRC13/CORE/V1DB/modrend.c

+9-9
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,14 @@
44
#include "harness/trace.h"
55

66
render_style_cbfn RenderStyleCalls[8] = {
7-
renderFaces, /* BR_RSTYLE_DEFAULT */
8-
nullRender, /* BR_RSTYLE_NONE */
9-
renderPoints, /* BR_RSTYLE_POINTS */
10-
renderEdges, /* BR_RSTYLE_EDGES */
11-
renderFaces, /* BR_RSTYLE_FACES */
7+
renderFaces, /* BR_RSTYLE_DEFAULT */
8+
nullRender, /* BR_RSTYLE_NONE */
9+
renderPoints, /* BR_RSTYLE_POINTS */
10+
renderEdges, /* BR_RSTYLE_EDGES */
11+
renderFaces, /* BR_RSTYLE_FACES */
1212
boundingBoxRenderPoints, /* BR_RSTYLE_BOUNDING_POINTS */
13-
boundingBoxRenderEdges, /* BR_RSTYLE_BOUNDING_EDGES */
14-
boundingBoxRenderFaces, /* BR_RSTYLE_BOUNDING_FACES */
13+
boundingBoxRenderEdges, /* BR_RSTYLE_BOUNDING_EDGES */
14+
boundingBoxRenderFaces, /* BR_RSTYLE_BOUNDING_FACES */
1515
};
1616

1717
v11face bounds_faces[12] = {
@@ -64,13 +64,13 @@ br_model bounds_model = {
6464
// IDA: void __usercall renderFaces(br_actor *actor@<EAX>, br_model *model@<EDX>, br_material *material@<EBX>, void *render_data@<ECX>, br_uint_8 style, int on_screen)
6565
void renderFaces(br_actor* actor, br_model* model, br_material* material, void* render_data, br_uint_8 style, int on_screen) {
6666
LOG_TRACE9("(%p, %p, %p, %p, %d, %d)", actor, model, material, render_data, style, on_screen);
67-
Harness_Hook_renderFaces(actor, model, material, BRT_TRIANGLE);
67+
Harness_Hook_renderActor(actor, model, material, BRT_TRIANGLE);
6868
}
6969

7070
// IDA: void __usercall renderEdges(br_actor *actor@<EAX>, br_model *model@<EDX>, br_material *material@<EBX>, void *render_data@<ECX>, br_uint_8 style, int on_screen)
7171
void renderEdges(br_actor* actor, br_model* model, br_material* material, void* render_data, br_uint_8 style, int on_screen) {
7272
LOG_TRACE("(%p, %p, %p, %p, %d, %d)", actor, model, material, render_data, style, on_screen);
73-
NOT_IMPLEMENTED();
73+
Harness_Hook_renderActor(actor, model, material, BRT_LINE);
7474
}
7575

7676
// IDA: void __usercall renderPoints(br_actor *actor@<EAX>, br_model *model@<EDX>, br_material *material@<EBX>, void *render_data@<ECX>, br_uint_8 style, int on_screen)

src/BRSRC13/CORE/V1DB/prepmesh.c

+7-7
Original file line numberDiff line numberDiff line change
@@ -607,13 +607,13 @@ void BrModelUpdate(br_model* model, br_uint_16 flags) {
607607
if (model->faces == NULL || model->vertices == NULL) {
608608
BrFailure("BrModelUpdate: model has no faces or vertices (%s)", model->identifier != NULL ? model->identifier : "<NULL>");
609609
}
610-
if (flags & BR_MODU_UNKNOWN) {
611-
flags |= BR_MODU_NORMALS;
610+
if (flags & BR_MODU_PIVOT) {
611+
flags |= BR_MODU_VERTEX_POSITIONS;
612612
}
613613
if (model->flags & (BR_MODF_KEEP_ORIGINAL | BR_MODF_GENERATE_TAGS)) {
614614
model->flags |= BR_MODF_UPDATEABLE;
615615
}
616-
if (!(model->flags & BR_MODF_CUSTOM_BOUNDS) && (flags & (BR_MODU_MATERIALS | BR_MODU_GROUPS | BR_MODU_NORMALS))) {
616+
if (!(model->flags & BR_MODF_CUSTOM_BOUNDS) && (flags & (BR_MODU_PRIMITIVE_COLOURS | BR_MODU_VERTEX_NORMALS | BR_MODU_VERTEX_POSITIONS))) {
617617
PrepareBoundingRadius(model);
618618
PrepareBoundingBox(model);
619619
}
@@ -651,19 +651,19 @@ void BrModelUpdate(br_model* model, br_uint_16 flags) {
651651
} else {
652652

653653
// some additional code paths might exist, but maybe not used?
654-
if (flags != BR_MODU_NORMALS) {
654+
if (flags != BR_MODU_VERTEX_POSITIONS) {
655655
TELL_ME_IF_WE_PASS_THIS_WAY();
656656
}
657657

658658
v11m = model->prepared;
659659

660-
if (model->vertices && (flags & BR_MODU_NORMALS)) {
660+
if (model->vertices && (flags & BR_MODU_VERTEX_POSITIONS)) {
661661
for (g = 0; g < v11m->ngroups; g++) {
662662
for (v = 0; v < v11m->groups[g].nvertices; v++) {
663663
fvp = &v11m->groups[g].vertices[v];
664664
vp = model->vertices + v11m->groups[g].vertex_user[v];
665665

666-
if (flags & BR_MODU_NORMALS) {
666+
if (flags & BR_MODU_VERTEX_POSITIONS) {
667667
fvp->p.v[0] = vp->p.v[0] - model->pivot.v[0];
668668
fvp->p.v[1] = vp->p.v[1] - model->pivot.v[1];
669669
fvp->p.v[2] = vp->p.v[2] - model->pivot.v[2];
@@ -672,7 +672,7 @@ void BrModelUpdate(br_model* model, br_uint_16 flags) {
672672
}
673673
}
674674

675-
if (flags & BR_MODU_NORMALS) {
675+
if (flags & BR_MODU_VERTEX_POSITIONS) {
676676
if (!(model->flags & BR_MODF_CUSTOM_NORMALS)) {
677677
RegenerateVertexNormals(v11m);
678678
}

src/BRSRC13/CORE/V1DB/render.c

+33-2
Original file line numberDiff line numberDiff line change
@@ -265,7 +265,38 @@ void BrDbSceneRenderBegin(br_actor* world, br_actor* camera) {
265265
br_token vtos_type;
266266
br_uint_32 dummy;
267267
LOG_TRACE("(%p, %p)", world, camera);
268-
NOT_IMPLEMENTED();
268+
269+
// this is not complete
270+
STUB_ONCE();
271+
272+
/*
273+
* Collect transforms from camera to root
274+
*
275+
* Make a stack of cumulative transforms for each level between
276+
* the camera and the root - this is so that model->view
277+
* transforms can use the shortest route, rather than via the root
278+
*/
279+
for (i = 0; i < BR_ASIZE(v1db.camera_path); i++) {
280+
v1db.camera_path[i].a = NULL;
281+
}
282+
283+
i = camera->depth;
284+
a = camera;
285+
BrMatrix34Identity(&v1db.camera_path[i].m);
286+
v1db.camera_path[i].transform_type = BR_TRANSFORM_IDENTITY;
287+
288+
for (; (i > 0) && (a != world); a = a->parent, i--) {
289+
BrTransformToMatrix34(&tfm, &a->t);
290+
BrMatrix34Mul(&v1db.camera_path[i - 1].m, &v1db.camera_path[i].m, &tfm);
291+
292+
v1db.camera_path[i - 1].transform_type = BrTransformCombineTypes(v1db.camera_path[i].transform_type, a->t.type);
293+
294+
v1db.camera_path[i].a = a;
295+
}
296+
297+
if (world != a) {
298+
// BrFailure("camera is not in world hierachy");
299+
}
269300
}
270301

271302
// IDA: br_renderbounds_cbfn* __cdecl BrDbSetRenderBoundsCallback(br_renderbounds_cbfn *new_cbfn)
@@ -291,7 +322,7 @@ void SetViewport(br_pixelmap* buffer) {
291322
void BrZbSceneRenderBegin(br_actor* world, br_actor* camera, br_pixelmap* colour_buffer, br_pixelmap* depth_buffer) {
292323
// LOG_TRACE("(%p, %p, %p, %p)", world, camera, colour_buffer, depth_buffer);
293324

294-
// BrDbSceneRenderBegin(world, camera);
325+
BrDbSceneRenderBegin(world, camera);
295326
Harness_Hook_BrZbSceneRenderBegin(world, camera, colour_buffer, depth_buffer);
296327
}
297328

src/BRSRC13/include/brender/br_defs.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828

2929
#define BrDegreeToRadian(d) ((br_scalar)((d) * (PI / 180.0)))
3030

31-
#define BrDegreeToAngle(d) ((br_angle)(long)((d) * (65536.0f / 360.0f))) // "d * 182.044444444"
31+
#define BrDegreeToAngle(d) ((br_angle)(long)((d) * (65536.0f / 360.0f))) // "d * 182.044444444"
3232
#define BrAngleToDegrees(a) ((br_angle)(long)((a) * (360.0f / 65536.0f))) // "d * 0.0054931640625"
3333

3434
#define BR_SCALAR(x) ((br_scalar)(x))

src/BRSRC13/include/brender/br_types.h

+20-14
Original file line numberDiff line numberDiff line change
@@ -2648,13 +2648,13 @@ typedef struct resource_header { // size: 24
26482648
br_uint_8 size_m;
26492649
br_uint_8 size_l;
26502650
#else
2651-
br_uint_8 size_l; // @12
2652-
br_uint_8 size_m; // @13
2653-
br_uint_8 size_h; // @14
2651+
br_uint_8 size_l; // @12
2652+
br_uint_8 size_m; // @13
2653+
br_uint_8 size_h; // @14
26542654
#endif
2655-
br_uint_8 class; // @15
2656-
void* magic_ptr; // @16
2657-
br_uint_32 magic_num; // @20
2655+
br_uint_8 class; // @15
2656+
void* magic_ptr; // @16
2657+
br_uint_32 magic_num; // @20
26582658
} resource_header;
26592659
#pragma pack(pop)
26602660

@@ -2952,14 +2952,20 @@ enum {
29522952
* Flags to BrModelUpdate()
29532953
*/
29542954
enum {
2955-
BR_MODU_NORMALS = 0x0001,
2956-
BR_MODU_EDGES = 0x0002,
2957-
BR_MODU_RADIUS = 0x0004,
2958-
BR_MODU_GROUPS = 0x0008,
2959-
BR_MODU_BOUNDING_BOX = 0x0010,
2960-
BR_MODU_MATERIALS = 0x0020,
2961-
BR_MODU_UNKNOWN = 0x0100, /* Added by Jeff. Referred to in code */
2962-
BR_MODU_ALL = 0x7fff
2955+
BR_MODU_VERTEX_POSITIONS = 0x0001,
2956+
BR_MODU_VERTEX_COLOURS = 0x0002,
2957+
BR_MODU_VERTEX_MAPPING = 0x0004,
2958+
BR_MODU_VERTEX_NORMALS = 0x0008,
2959+
BR_MODU_PRIMITIVE_MATERIALS = 0x0010,
2960+
BR_MODU_PRIMITIVE_COLOURS = 0x0020,
2961+
BR_MODU_VERTICES = 0x0040,
2962+
BR_MODU_FACES = 0x0080,
2963+
BR_MODU_PIVOT = 0x0100,
2964+
BR_MODU_PREPARED = 0x0200,
2965+
BR_MODU_PRIMITIVE_EQUATIONS = 0x0400,
2966+
BR_MODU_ALL = 0x7FFF,
2967+
2968+
_BR_MODU_RESERVED = 0x8000
29632969
};
29642970

29652971
/*

src/DETHRACE/common/crush.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,7 @@ void CrushModel(tCar_spec* pCar, int pModel_index, br_actor* pActor, br_vector3*
308308
void JitModelUpdate(br_actor* actor, br_model* model, br_material* material, void* render_data, br_uint_8 style, int on_screen) {
309309
LOG_TRACE("(%p, %p, %p, %p, %d, %d)", actor, model, material, render_data, style, on_screen);
310310

311-
BrModelUpdate(model, BR_MODU_NORMALS);
311+
BrModelUpdate(model, BR_MODU_VERTEX_POSITIONS);
312312
model->flags &= ~(BR_MODF_CUSTOM);
313313
BrZbModelRender(actor, model, material, style, BrOnScreenCheck(&model->bounds), 0);
314314
}
@@ -483,8 +483,8 @@ void TotallyRepairACar(tCar_spec* pCar) {
483483
memcpy(the_car_actor->actor->model->vertices,
484484
the_car_actor->undamaged_vertices,
485485
the_car_actor->actor->model->nvertices * sizeof(br_vertex));
486-
// FIXME: BrModelUpdate(..., BR_MODU_EDGES | BR_MODU_NORMALS) fails on TELL_ME_IF_WE_PASS_THIS_WAY
487-
// BrModelUpdate(the_car_actor->actor->model, BR_MODU_EDGES | BR_MODU_NORMALS);
486+
// FIXME: BrModelUpdate(..., BR_MODU_VERTEX_COLOURS | BR_MODU_VERTEX_POSITIONS) fails on TELL_ME_IF_WE_PASS_THIS_WAY
487+
// BrModelUpdate(the_car_actor->actor->model, BR_MODU_VERTEX_COLOURS | BR_MODU_VERTEX_POSITIONS);
488488
BrModelUpdate(the_car_actor->actor->model, BR_MODU_ALL);
489489
if (pipe_vertex_count != 0 && IsActionReplayAvailable()) {
490490
PipeSingleModelGeometry(pCar->car_ID, j, pipe_vertex_count, pipe_array);

src/DETHRACE/common/depth.c

+48-37
Original file line numberDiff line numberDiff line change
@@ -180,27 +180,27 @@ void MungeSkyModel(br_actor* pCamera, br_model* pModel) {
180180
LOG_TRACE("(%p, %p)", pCamera, pModel);
181181

182182
camera_data = pCamera->type_data;
183-
184183
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;
187186
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;
193193
gSky_x_multiplier = CalculateWrappingMultiplier(gSky_width, camera_data->yon_z);
194194
gSky_y_multiplier = CalculateWrappingMultiplier(gSky_height, camera_data->yon_z);
195195

196196
for (vertex = 0; vertex < 88; vertex += 4) {
197197
pModel->vertices[vertex].map.v[0] = -edge_u;
198198
}
199199
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;
201201
}
202202
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;
204204
}
205205
for (vertex = 3; vertex < 88; vertex += 4) {
206206
pModel->vertices[vertex].map.v[0] = edge_u;
@@ -209,7 +209,7 @@ void MungeSkyModel(br_actor* pCamera, br_model* pModel) {
209209
pModel->vertices[vertex].p.v[0] = -horizon_half_diag;
210210
}
211211
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);
213213
}
214214
for (vertex = 2; vertex < 88; vertex += 4) {
215215
pModel->vertices[vertex].p.v[0] = horizon_half_diag / 2.f;
@@ -218,31 +218,39 @@ void MungeSkyModel(br_actor* pCamera, br_model* pModel) {
218218
pModel->vertices[vertex].p.v[0] = horizon_half_diag;
219219
}
220220
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;
236243
}
237244
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];
242250
}
243251
}
244-
// FIXME: unknown model flag disabled
245-
BrModelUpdate(pModel, BR_MODU_ALL & ~0x80);
252+
253+
BrModelUpdate(pModel, BR_MODU_ALL & ~BR_MODU_VERTEX_NORMALS);
246254
}
247255

248256
// IDA: br_model* __usercall CreateHorizonModel@<EAX>(br_actor *pCamera@<EAX>)
@@ -331,12 +339,18 @@ void InitDepthEffects() {
331339
FatalError(kFatalError_FindSkyMaterial_S, "HORIZON.MAT"); // 2nd argument added
332340
}
333341
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);
335345
for (i = 0; i < 256; i++) {
336346
for (j = 0; j < 256; j++) {
337347
*((tU8*)gHorizon_material->index_blend->pixels + 256 * i + j) = j;
338348
}
339349
}
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+
340354
gHorizon_material->flags |= BR_MATF_PERSPECTIVE;
341355
BrMaterialAdd(gHorizon_material);
342356
gForward_sky_model = CreateHorizonModel(gCamera);
@@ -371,9 +385,6 @@ void DoDepthByShadeTable(br_pixelmap* pRender_buffer, br_pixelmap* pDepth_buffer
371385
int render_line_skip;
372386
LOG_TRACE("(%p, %p, %p, %d, %d, %d)", pRender_buffer, pDepth_buffer, pShade_table, pShade_table_power, pStart, pEnd);
373387

374-
// Added to ensure we've copied the framebuffer+depthbuffer back into main memory
375-
Harness_Hook_FlushRenderer();
376-
377388
too_near = 0xffff - (1 << pStart);
378389
shade_table_pixels = pShade_table->pixels;
379390
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
514525
br_actor* actor;
515526
LOG_TRACE("(%p, %p, %p, %p)", pRender_buffer, pDepth_buffer, pCamera, pCamera_to_world);
516527

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]));
518529
if (!gProgram_state.cockpit_on && !(gAction_replay_mode && gAction_replay_camera_mode)) {
519530
return;
520531
}

0 commit comments

Comments
 (0)