Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement cockpit view #279

Merged
merged 12 commits into from
Feb 18, 2023
14 changes: 7 additions & 7 deletions src/BRSRC13/CORE/V1DB/prepmesh.c
Original file line number Diff line number Diff line change
Expand Up @@ -607,13 +607,13 @@ void BrModelUpdate(br_model* model, br_uint_16 flags) {
if (model->faces == NULL || model->vertices == NULL) {
BrFailure("BrModelUpdate: model has no faces or vertices (%s)", model->identifier != NULL ? model->identifier : "<NULL>");
}
if (flags & BR_MODU_UNKNOWN) {
flags |= BR_MODU_NORMALS;
if (flags & BR_MODU_PIVOT) {
flags |= BR_MODU_VERTEX_POSITIONS;
}
if (model->flags & (BR_MODF_KEEP_ORIGINAL | BR_MODF_GENERATE_TAGS)) {
model->flags |= BR_MODF_UPDATEABLE;
}
if (!(model->flags & BR_MODF_CUSTOM_BOUNDS) && (flags & (BR_MODU_MATERIALS | BR_MODU_GROUPS | BR_MODU_NORMALS))) {
if (!(model->flags & BR_MODF_CUSTOM_BOUNDS) && (flags & (BR_MODU_PRIMITIVE_COLOURS | BR_MODU_VERTEX_NORMALS | BR_MODU_VERTEX_POSITIONS))) {
PrepareBoundingRadius(model);
PrepareBoundingBox(model);
}
Expand Down Expand Up @@ -651,19 +651,19 @@ void BrModelUpdate(br_model* model, br_uint_16 flags) {
} else {

// some additional code paths might exist, but maybe not used?
if (flags != BR_MODU_NORMALS) {
if (flags != BR_MODU_VERTEX_POSITIONS) {
TELL_ME_IF_WE_PASS_THIS_WAY();
}

v11m = model->prepared;

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

if (flags & BR_MODU_NORMALS) {
if (flags & BR_MODU_VERTEX_POSITIONS) {
fvp->p.v[0] = vp->p.v[0] - model->pivot.v[0];
fvp->p.v[1] = vp->p.v[1] - model->pivot.v[1];
fvp->p.v[2] = vp->p.v[2] - model->pivot.v[2];
Expand All @@ -672,7 +672,7 @@ void BrModelUpdate(br_model* model, br_uint_16 flags) {
}
}

if (flags & BR_MODU_NORMALS) {
if (flags & BR_MODU_VERTEX_POSITIONS) {
if (!(model->flags & BR_MODF_CUSTOM_NORMALS)) {
RegenerateVertexNormals(v11m);
}
Expand Down
1 change: 1 addition & 0 deletions src/BRSRC13/include/brender/br_defs.h
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
#define BrDegreeToRadian(d) ((br_scalar)((d) * (PI / 180.0)))

#define BrDegreeToAngle(d) ((br_angle)(long)((d) * (65536.0f / 360.0f))) // "d * 182.044444444"
#define BrDegreeToAngle2(d) ((br_angle)(long)((d) * (32768.0 / 180.0)))
#define BrAngleToDegrees(a) ((br_angle)(long)((a) * (360.0f / 65536.0f))) // "d * 0.0054931640625"

#define BR_SCALAR(x) ((br_scalar)(x))
Expand Down
34 changes: 20 additions & 14 deletions src/BRSRC13/include/brender/br_types.h
Original file line number Diff line number Diff line change
Expand Up @@ -2648,13 +2648,13 @@ typedef struct resource_header { // size: 24
br_uint_8 size_m;
br_uint_8 size_l;
#else
br_uint_8 size_l; // @12
br_uint_8 size_m; // @13
br_uint_8 size_h; // @14
br_uint_8 size_l; // @12
br_uint_8 size_m; // @13
br_uint_8 size_h; // @14
#endif
br_uint_8 class; // @15
void* magic_ptr; // @16
br_uint_32 magic_num; // @20
br_uint_8 class; // @15
void* magic_ptr; // @16
br_uint_32 magic_num; // @20
} resource_header;
#pragma pack(pop)

Expand Down Expand Up @@ -2952,14 +2952,20 @@ enum {
* Flags to BrModelUpdate()
*/
enum {
BR_MODU_NORMALS = 0x0001,
BR_MODU_EDGES = 0x0002,
BR_MODU_RADIUS = 0x0004,
BR_MODU_GROUPS = 0x0008,
BR_MODU_BOUNDING_BOX = 0x0010,
BR_MODU_MATERIALS = 0x0020,
BR_MODU_UNKNOWN = 0x0100, /* Added by Jeff. Referred to in code */
BR_MODU_ALL = 0x7fff
BR_MODU_VERTEX_POSITIONS = 0x0001,
BR_MODU_VERTEX_COLOURS = 0x0002,
BR_MODU_VERTEX_MAPPING = 0x0004,
BR_MODU_VERTEX_NORMALS = 0x0008,
BR_MODU_PRIMITIVE_MATERIALS = 0x0010,
BR_MODU_PRIMITIVE_COLOURS = 0x0020,
BR_MODU_VERTICES = 0x0040,
BR_MODU_FACES = 0x0080,
BR_MODU_PIVOT = 0x0100,
BR_MODU_PREPARED = 0x0200,
BR_MODU_PRIMITIVE_EQUATIONS = 0x0400,
BR_MODU_ALL = 0x7FFF,

_BR_MODU_RESERVED = 0x8000
};

/*
Expand Down
6 changes: 3 additions & 3 deletions src/DETHRACE/common/crush.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,7 @@ void CrushModel(tCar_spec* pCar, int pModel_index, br_actor* pActor, br_vector3*
void JitModelUpdate(br_actor* actor, br_model* model, br_material* material, void* render_data, br_uint_8 style, int on_screen) {
LOG_TRACE("(%p, %p, %p, %p, %d, %d)", actor, model, material, render_data, style, on_screen);

BrModelUpdate(model, BR_MODU_NORMALS);
BrModelUpdate(model, BR_MODU_VERTEX_POSITIONS);
model->flags &= ~(BR_MODF_CUSTOM);
BrZbModelRender(actor, model, material, style, BrOnScreenCheck(&model->bounds), 0);
}
Expand Down Expand Up @@ -483,8 +483,8 @@ void TotallyRepairACar(tCar_spec* pCar) {
memcpy(the_car_actor->actor->model->vertices,
the_car_actor->undamaged_vertices,
the_car_actor->actor->model->nvertices * sizeof(br_vertex));
// FIXME: BrModelUpdate(..., BR_MODU_EDGES | BR_MODU_NORMALS) fails on TELL_ME_IF_WE_PASS_THIS_WAY
// BrModelUpdate(the_car_actor->actor->model, BR_MODU_EDGES | BR_MODU_NORMALS);
// FIXME: BrModelUpdate(..., BR_MODU_VERTEX_COLOURS | BR_MODU_VERTEX_POSITIONS) fails on TELL_ME_IF_WE_PASS_THIS_WAY
// BrModelUpdate(the_car_actor->actor->model, BR_MODU_VERTEX_COLOURS | BR_MODU_VERTEX_POSITIONS);
BrModelUpdate(the_car_actor->actor->model, BR_MODU_ALL);
if (pipe_vertex_count != 0 && IsActionReplayAvailable()) {
PipeSingleModelGeometry(pCar->car_ID, j, pipe_vertex_count, pipe_array);
Expand Down
72 changes: 40 additions & 32 deletions src/DETHRACE/common/depth.c
Original file line number Diff line number Diff line change
Expand Up @@ -180,27 +180,27 @@ void MungeSkyModel(br_actor* pCamera, br_model* pModel) {
LOG_TRACE("(%p, %p)", pCamera, pModel);

camera_data = pCamera->type_data;

tan_half_fov = Tan(camera_data->field_of_view / 2);
// BR_ANGLE_RAD(atan2f(tan_half_fov, camera_data->aspect / 2));
horizon_half_width = (camera_data->yon_z - 1.f) * tan_half_fov;
sky_distance = camera_data->yon_z - 1.0;
horizon_half_width = sky_distance * tan_half_fov;
horizon_half_height = horizon_half_width * camera_data->aspect;
horizon_half_diag = BR_LENGTH2(horizon_half_width, horizon_half_height);
min_angle = BR_ANGLE_RAD(atan2f(horizon_half_diag, camera_data->yon_z - 1.f));
edge_u = EdgeU(gSky_image_width, 2 * min_angle, BR_ANGLE_DEG(10));
gSky_width = 2.f * horizon_half_width;
gSky_height = 2.f * horizon_half_height;
horizon_half_diag = sqrtf(horizon_half_height * horizon_half_height + horizon_half_width * horizon_half_width);
half_diag_fov = BrRadianToAngle(atan2f(sky_distance, horizon_half_width));
edge_u = EdgeU(gSky_image_width, 2 * half_diag_fov, BR_ANGLE_DEG(10));
narrow_u = edge_u / 2.f;
gSky_width = horizon_half_width * 2.f;
gSky_height = horizon_half_height * 2.f;
gSky_x_multiplier = CalculateWrappingMultiplier(gSky_width, camera_data->yon_z);
gSky_y_multiplier = CalculateWrappingMultiplier(gSky_height, camera_data->yon_z);

for (vertex = 0; vertex < 88; vertex += 4) {
pModel->vertices[vertex].map.v[0] = -edge_u;
}
for (vertex = 1; vertex < 88; vertex += 4) {
pModel->vertices[vertex].map.v[0] = -edge_u / 2.f;
pModel->vertices[vertex].map.v[0] = -narrow_u;
}
for (vertex = 2; vertex < 88; vertex += 4) {
pModel->vertices[vertex].map.v[0] = edge_u / 2.f;
pModel->vertices[vertex].map.v[0] = narrow_u;
}
for (vertex = 3; vertex < 88; vertex += 4) {
pModel->vertices[vertex].map.v[0] = edge_u;
Expand All @@ -209,7 +209,7 @@ void MungeSkyModel(br_actor* pCamera, br_model* pModel) {
pModel->vertices[vertex].p.v[0] = -horizon_half_diag;
}
for (vertex = 1; vertex < 88; vertex += 4) {
pModel->vertices[vertex].p.v[0] = -horizon_half_diag / 2.f;
pModel->vertices[vertex].p.v[0] = -(horizon_half_diag / 2.f);
}
for (vertex = 2; vertex < 88; vertex += 4) {
pModel->vertices[vertex].p.v[0] = horizon_half_diag / 2.f;
Expand All @@ -218,31 +218,39 @@ void MungeSkyModel(br_actor* pCamera, br_model* pModel) {
pModel->vertices[vertex].p.v[0] = horizon_half_diag;
}
PossibleService();
angle_range = -(gSky_image_underground + (BR_ANGLE_DEG(90) - min_angle));
for (vertex = 0; vertex < 2; vertex++) {
angle = vertex * angle_range / 2 - (BR_ANGLE_DEG(90) + min_angle);
pModel->vertices[0 + 4 * vertex].p.v[1] = sinf(BrAngleToRadian(angle)) * (camera_data->yon_z - 1.f);
pModel->vertices[0 + 4 * vertex].p.v[2] = -cosf(BrAngleToRadian(angle)) * (camera_data->yon_z - 1.f);
}
for (vertex = 0; vertex < 18; vertex++) {
angle = vertex * gSky_image_height / 18 - gSky_image_height;
pModel->vertices[8 + 4 * vertex].p.v[1] = sinf(BrAngleToRadian(angle)) * (camera_data->yon_z - 1.f);
pModel->vertices[8 + 4 * vertex].p.v[2] = -cosf(BrAngleToRadian(angle)) * (camera_data->yon_z - 1.f);
}
for (vertex = 0; vertex < 2; vertex++) {
angle = vertex * (min_angle + BR_ANGLE_DEG(90) - (gSky_image_height - gSky_image_underground)) - (gSky_image_height - gSky_image_underground);
pModel->vertices[80 + 4 * vertex].p.v[1] = sinf(BrAngleToRadian(angle)) * (camera_data->yon_z - 1.f);
pModel->vertices[80 + 4 * vertex].p.v[2] = -cosf(BrAngleToRadian(angle)) * (camera_data->yon_z - 1.f);
angle_range = -gSky_image_underground - (-BR_ANGLE_DEG(90) - half_diag_fov);
for (band = 0; band < 2u; band++) {
vertex = 4 * band;
angle = -BR_ANGLE_DEG(90) - half_diag_fov + angle_range * band / 2;
pModel->vertices[vertex].p.v[1] = sinf(BrAngleToRadian(angle)) * sky_distance;
pModel->vertices[vertex].p.v[2] = -cosf(BrAngleToRadian(angle)) * sky_distance;
}
min_angle = -gSky_image_underground;
angle_range = gSky_image_height;
nbands = 18;
for (band = 0; band < nbands; band++) {
vertex = 4 * band + 8;
pModel->vertices[vertex].p.v[1] = sinf(BrAngleToRadian(min_angle + angle_range * band / nbands)) * sky_distance;
pModel->vertices[vertex].p.v[2] = -cosf(BrAngleToRadian(min_angle + angle_range * band / nbands)) * sky_distance;
}
min_angle = gSky_image_height - gSky_image_underground;
angle_range = half_diag_fov + BR_ANGLE_DEG(90) - (gSky_image_height - gSky_image_underground);
for (band = 0; band <= 1u; band++) {
vertex = 4 * band + 80;
angle = min_angle + angle_range * band;
pModel->vertices[vertex].p.v[1] = sinf(BrAngleToRadian(angle)) * sky_distance;
pModel->vertices[vertex].p.v[2] = -cosf(BrAngleToRadian(angle)) * sky_distance;
}
PossibleService();
for (band = 0; band < 22; band++) {
for (vertex = 1; vertex < 4; vertex++) {
pModel->vertices[4 * band + vertex].p.v[1] = pModel->vertices[vertex].p.v[1];
pModel->vertices[4 * band + vertex].p.v[2] = pModel->vertices[vertex].p.v[2];
for (band = 0; band <= 21u; ++band) {
vertex = 4 * band;
for (stripe = 1; stripe < 4u; ++stripe) {
pModel->vertices[vertex + stripe].p.v[1] = pModel->vertices[vertex].p.v[1];
pModel->vertices[vertex + stripe].p.v[2] = pModel->vertices[vertex].p.v[2];
}
}
// FIXME: unknown model flag disabled
BrModelUpdate(pModel, BR_MODU_ALL & ~0x80);

BrModelUpdate(pModel, BR_MODU_ALL & ~BR_MODU_VERTEX_NORMALS);
}

// IDA: br_model* __usercall CreateHorizonModel@<EAX>(br_actor *pCamera@<EAX>)
Expand Down
2 changes: 1 addition & 1 deletion src/DETHRACE/common/pedestrn.c
Original file line number Diff line number Diff line change
Expand Up @@ -2947,7 +2947,7 @@ br_actor* BuildPedPaths(tPedestrian_instruction* pInstructions, int pInstruc_cou
}
face_count -= 4;
the_model = BrModelAllocate(NULL, vertex_count, face_count);
the_model->flags |= BR_MODU_EDGES | BR_MODU_NORMALS;
the_model->flags |= BR_MODU_VERTEX_COLOURS | BR_MODU_VERTEX_POSITIONS;

vertex_count = 0;
face_count = 0;
Expand Down
4 changes: 2 additions & 2 deletions src/DETHRACE/common/world.c
Original file line number Diff line number Diff line change
Expand Up @@ -2638,7 +2638,7 @@ void LoadTrack(char* pFile_name, tTrack_spec* pTrack_spec, tRace_info* pRace_inf
}
PossibleService();

gSky_image_width = (360.0 / BrDegreeToAngle(GetAnInt(f)));
gSky_image_width = BrDegreeToAngle(360.0 / GetAnInt(f));
gSky_image_height = BrDegreeToAngle(GetAScalar(f));
gSky_image_underground = gSky_image_height * (sky_pixels_high - GetAnInt(f)) / sky_pixels_high;

Expand Down Expand Up @@ -2818,7 +2818,7 @@ void LoadTrack(char* pFile_name, tTrack_spec* pTrack_spec, tRace_info* pRace_inf
/* Display skidmarks even if the race has no specified skidmark material. */
if (!skid_mark_cnt && num_materials) {
LOG_WARN("Track %s has no valid skid mark material, setting the default one",
pRace_info->track_file_name);
pRace_info->track_file_name);
LoadSinglePixelmap(&gTrack_storage_space, "SKIDMARK.PIX");
material = LoadSingleMaterial(&gTrack_storage_space, "SKIDMARK.MAT");
pRace_info->material_modifiers[0].skid_mark_material = material;
Expand Down
2 changes: 1 addition & 1 deletion src/DETHRACE/constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -493,7 +493,7 @@ enum {

#define TIME_CONV_THING 0.0005f

#define OPPONENT_COUNT 5
#define OPPONENT_COUNT 0

#define WORLD_SCALE 6.9f

Expand Down