Skip to content

Commit 83f0829

Browse files
authored
Rollback insignia fix (#7196)
* Revert "Move insignia post-processing to model load" This reverts commit 665d714. * Revert "Cleanup of old insignia stuff" This reverts commit fdf98a1. * Revert "render insignias as decals" This reverts commit 24cdeb3. * Isolate reverts to insignias * Fix oversight * clang tidy
1 parent 2813ceb commit 83f0829

5 files changed

Lines changed: 169 additions & 83 deletions

File tree

code/model/model.h

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -729,9 +729,13 @@ typedef struct cross_section {
729729
#define MAX_INS_FACES 128
730730
typedef struct insignia {
731731
int detail_level;
732-
vec3d position;
733-
matrix orientation;
734-
float diameter;
732+
int num_faces;
733+
int faces[MAX_INS_FACES][MAX_INS_FACE_VECS]; // indices into the vecs array
734+
float u[MAX_INS_FACES][MAX_INS_FACE_VECS]; // u tex coords on a per-face-per-vertex basis
735+
float v[MAX_INS_FACES][MAX_INS_FACE_VECS]; // v tex coords on a per-face-per-vertex bases
736+
vec3d vecs[MAX_INS_VECS]; // vertex list
737+
vec3d offset; // global position offset for this insignia
738+
vec3d norm[MAX_INS_VECS] ; //normal of the insignia-Bobboau
735739
} insignia;
736740

737741
#define PM_FLAG_ALLOW_TILING (1<<0) // Allow texture tiling
@@ -807,7 +811,7 @@ class polymodel
807811
n_view_positions(0), rad(0.0f), core_radius(0.0f), n_textures(0), submodel(NULL), n_guns(0), n_missiles(0), n_docks(0),
808812
n_thrusters(0), gun_banks(NULL), missile_banks(NULL), docking_bays(NULL), thrusters(NULL), ship_bay(NULL), shield(),
809813
shield_collision_tree(NULL), sldc_size(0), n_paths(0), paths(NULL), mass(0), num_xc(0), xc(NULL), num_split_plane(0),
810-
used_this_mission(0), n_glow_point_banks(0), glow_point_banks(nullptr),
814+
num_ins(0), used_this_mission(0), n_glow_point_banks(0), glow_point_banks(nullptr),
811815
vert_source()
812816
{
813817
filename[0] = 0;
@@ -820,6 +824,7 @@ class polymodel
820824
memset(&bounding_box, 0, 8 * sizeof(vec3d));
821825
memset(&view_positions, 0, MAX_EYES * sizeof(eye));
822826
memset(&split_plane, 0, MAX_SPLIT_PLANE * sizeof(float));
827+
memset(&ins, 0, MAX_MODEL_INSIGNIAS * sizeof(insignia));
823828

824829
#ifndef NDEBUG
825830
ram_used = 0;
@@ -894,7 +899,8 @@ class polymodel
894899
int num_split_plane; // number of split planes
895900
float split_plane[MAX_SPLIT_PLANE]; // actual split plane z coords (for big ship explosions)
896901

897-
SCP_vector<insignia> ins;
902+
insignia ins[MAX_MODEL_INSIGNIAS];
903+
int num_ins;
898904

899905
#ifndef NDEBUG
900906
int ram_used; // How much RAM this model uses

code/model/modelread.cpp

Lines changed: 35 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1657,8 +1657,8 @@ modelread_status read_model_file_no_subsys(polymodel * pm, const char* filename,
16571657

16581658
memset( &pm->view_positions, 0, sizeof(pm->view_positions) );
16591659

1660-
// reset insignia
1661-
pm->ins.clear();
1660+
// reset insignia counts
1661+
pm->num_ins = 0;
16621662

16631663
// reset glow points!! - Goober5000
16641664
pm->n_glow_point_banks = 0;
@@ -2806,80 +2806,61 @@ modelread_status read_model_file_no_subsys(polymodel * pm, const char* filename,
28062806
}
28072807
break;
28082808

2809-
case ID_INSG: {
2809+
case ID_INSG:
2810+
int num_ins, num_verts, num_faces, idx, idx2, idx3;
2811+
28102812
// get the # of insignias
2811-
int num_ins = cfread_int(fp);
2812-
pm->ins = SCP_vector<insignia>(num_ins);
2813+
num_ins = cfread_int(fp);
2814+
pm->num_ins = num_ins;
28132815

28142816
// read in the insignias
2815-
for (int idx = 0; idx < num_ins; idx++){
2816-
insignia& ins = pm->ins[idx];
2817-
2817+
for(idx=0; idx<num_ins; idx++){
28182818
// get the detail level
2819-
ins.detail_level = cfread_int(fp);
2820-
if (ins.detail_level < 0) {
2821-
Warning(LOCATION, "Model '%s': insignia uses an invalid LOD (%i)\n", pm->filename, ins.detail_level);
2819+
pm->ins[idx].detail_level = cfread_int(fp);
2820+
if (pm->ins[idx].detail_level < 0) {
2821+
Warning(LOCATION, "Model '%s': insignia uses an invalid LOD (%i)\n", pm->filename, pm->ins[idx].detail_level);
28222822
}
28232823

28242824
// # of faces
2825-
int num_faces = cfread_int(fp);
2825+
num_faces = cfread_int(fp);
2826+
pm->ins[idx].num_faces = num_faces;
2827+
Assert(num_faces <= MAX_INS_FACES);
28262828

28272829
// # of vertices
2828-
int num_verts = cfread_int(fp);
2829-
SCP_vector<vec3d> vertices(num_verts);
2830+
num_verts = cfread_int(fp);
2831+
Assert(num_verts <= MAX_INS_VECS);
28302832

28312833
// read in all the vertices
2832-
for(int idx2 = 0; idx2 < num_verts; idx2++){
2833-
cfread_vector(&vertices[idx2], fp);
2834+
for(idx2=0; idx2<num_verts; idx2++){
2835+
cfread_vector(&pm->ins[idx].vecs[idx2], fp);
28342836
}
28352837

2836-
vec3d offset;
28372838
// read in world offset
2838-
cfread_vector(&offset, fp);
2839-
2840-
vec3d min {{{FLT_MAX, FLT_MAX, FLT_MAX}}};
2841-
vec3d max {{{-FLT_MAX, -FLT_MAX, -FLT_MAX}}};
2842-
vec3d avg_total = ZERO_VECTOR;
2843-
vec3d avg_normal = ZERO_VECTOR;
2839+
cfread_vector(&pm->ins[idx].offset, fp);
28442840

28452841
// read in all the faces
2846-
for(int idx2 = 0; idx2 < num_faces; idx2++){
2847-
std::array<int, 3> faces;
2842+
for(idx2=0; idx2<pm->ins[idx].num_faces; idx2++){
28482843
// read in 3 vertices
2849-
for(int idx3 = 0; idx3 < 3; idx3++){
2850-
faces[idx3] = cfread_int(fp);
2851-
2852-
//UV coords are no longer needed
2853-
cfread_float(fp);
2854-
cfread_float(fp);
2844+
for(idx3=0; idx3<3; idx3++){
2845+
pm->ins[idx].faces[idx2][idx3] = cfread_int(fp);
2846+
pm->ins[idx].u[idx2][idx3] = cfread_float(fp);
2847+
pm->ins[idx].v[idx2][idx3] = cfread_float(fp);
28552848
}
2849+
vec3d tempv;
28562850

2857-
const vec3d& v1 = vertices[faces[0]];
2858-
const vec3d& v2 = vertices[faces[1]];
2859-
const vec3d& v3 = vertices[faces[2]];
2860-
2861-
vec3d normal;
28622851
//get three points (rotated) and compute normal
2863-
vm_vec_perp(&normal, &v1, &v2, &v3);
2864-
2865-
vm_vec_min(&min, &min, &v1);
2866-
vm_vec_min(&min, &min, &v2);
2867-
vm_vec_min(&min, &min, &v3);
2868-
vm_vec_max(&max, &max, &v1);
2869-
vm_vec_max(&max, &max, &v2);
2870-
vm_vec_max(&max, &max, &v3);
2871-
2872-
vec3d avg = (v1 + v2 + v3) * (1.0f / 3.0f);
2873-
avg_total += avg;
2874-
avg_normal += normal;
2852+
2853+
vm_vec_perp(&tempv,
2854+
&pm->ins[idx].vecs[pm->ins[idx].faces[idx2][0]],
2855+
&pm->ins[idx].vecs[pm->ins[idx].faces[idx2][1]],
2856+
&pm->ins[idx].vecs[pm->ins[idx].faces[idx2][2]]);
2857+
2858+
vm_vec_normalize_safe(&tempv);
2859+
2860+
pm->ins[idx].norm[idx2] = tempv;
28752861
// mprintf(("insignorm %.2f %.2f %.2f\n",pm->ins[idx].norm[idx2].xyz.x, pm->ins[idx].norm[idx2].xyz.y, pm->ins[idx].norm[idx2].xyz.z));
2876-
}
28772862

2878-
ins.position = avg_total / static_cast<float>(num_faces) + offset;
2879-
vec3d bb = max - min;
2880-
ins.diameter = std::max({bb.xyz.x, bb.xyz.y, bb.xyz.z});
2881-
vm_vector_2_matrix(&ins.orientation, &avg_normal, &vmd_z_vector);
2882-
}
2863+
}
28832864
}
28842865
break;
28852866

code/model/modelrender.cpp

Lines changed: 116 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -641,6 +641,51 @@ void model_draw_list::render_arcs()
641641
gr_zbuffer_set(mode);
642642
}
643643

644+
void model_draw_list::add_insignia(const model_render_params *params, const polymodel *pm, int detail_level, int bitmap_num)
645+
{
646+
insignia_draw_data new_insignia;
647+
648+
new_insignia.transform = Transformations.get_transform();
649+
new_insignia.pm = pm;
650+
new_insignia.detail_level = detail_level;
651+
new_insignia.bitmap_num = bitmap_num;
652+
653+
new_insignia.clip = params->is_clip_plane_set();
654+
new_insignia.clip_normal = params->get_clip_plane_normal();
655+
new_insignia.clip_position = params->get_clip_plane_pos();
656+
657+
Insignias.push_back(new_insignia);
658+
}
659+
660+
void model_draw_list::render_insignia(const insignia_draw_data &insignia_info)
661+
{
662+
if ( insignia_info.clip ) {
663+
vec3d tmp;
664+
vec3d pos;
665+
666+
vm_matrix4_get_offset(&pos, &insignia_info.transform);
667+
vm_vec_sub(&tmp, &pos, &insignia_info.clip_position);
668+
vm_vec_normalize(&tmp);
669+
670+
if ( vm_vec_dot(&tmp, &insignia_info.clip_normal) < 0.0f) {
671+
return;
672+
}
673+
}
674+
675+
g3_start_instance_matrix(&insignia_info.transform);
676+
677+
model_render_insignias(&insignia_info);
678+
679+
g3_done_instance(true);
680+
}
681+
682+
void model_draw_list::render_insignias() const
683+
{
684+
for (const auto& ins : Insignias) {
685+
render_insignia(ins);
686+
}
687+
}
688+
644689
void model_draw_list::add_outline(const vertex* vert_array, int n_verts, const color *clr)
645690
{
646691
outline_draw draw_info;
@@ -2382,6 +2427,74 @@ void model_queue_render_thrusters(const model_render_params *interp, const polym
23822427
}
23832428
}
23842429

2430+
void model_render_insignias(const insignia_draw_data *insignia_data)
2431+
{
2432+
auto pm = insignia_data->pm;
2433+
int detail_level = insignia_data->detail_level;
2434+
int bitmap_num = insignia_data->bitmap_num;
2435+
2436+
// if the model has no insignias, or we don't have a texture, then bail
2437+
if ( (pm->num_ins <= 0) || (bitmap_num < 0) )
2438+
return;
2439+
2440+
int idx, s_idx;
2441+
vertex vecs[3];
2442+
vec3d t1, t2, t3;
2443+
int i1, i2, i3;
2444+
2445+
material insignia_material;
2446+
insignia_material.set_depth_bias(1);
2447+
2448+
// set the proper texture
2449+
material_set_unlit(&insignia_material, bitmap_num, 0.65f, true, true);
2450+
2451+
if ( insignia_data->clip ) {
2452+
insignia_material.set_clip_plane(insignia_data->clip_normal, insignia_data->clip_position);
2453+
}
2454+
2455+
// otherwise render them
2456+
for(idx=0; idx<pm->num_ins; idx++){
2457+
// skip insignias not on our detail level
2458+
if(pm->ins[idx].detail_level != detail_level){
2459+
continue;
2460+
}
2461+
2462+
for(s_idx=0; s_idx<pm->ins[idx].num_faces; s_idx++){
2463+
// get vertex indices
2464+
i1 = pm->ins[idx].faces[s_idx][0];
2465+
i2 = pm->ins[idx].faces[s_idx][1];
2466+
i3 = pm->ins[idx].faces[s_idx][2];
2467+
2468+
// transform vecs and setup vertices
2469+
vm_vec_add(&t1, &pm->ins[idx].vecs[i1], &pm->ins[idx].offset);
2470+
vm_vec_add(&t2, &pm->ins[idx].vecs[i2], &pm->ins[idx].offset);
2471+
vm_vec_add(&t3, &pm->ins[idx].vecs[i3], &pm->ins[idx].offset);
2472+
2473+
g3_transfer_vertex(&vecs[0], &t1);
2474+
g3_transfer_vertex(&vecs[1], &t2);
2475+
g3_transfer_vertex(&vecs[2], &t3);
2476+
2477+
// setup texture coords
2478+
vecs[0].texture_position.u = pm->ins[idx].u[s_idx][0];
2479+
vecs[0].texture_position.v = pm->ins[idx].v[s_idx][0];
2480+
2481+
vecs[1].texture_position.u = pm->ins[idx].u[s_idx][1];
2482+
vecs[1].texture_position.v = pm->ins[idx].v[s_idx][1];
2483+
2484+
vecs[2].texture_position.u = pm->ins[idx].u[s_idx][2];
2485+
vecs[2].texture_position.v = pm->ins[idx].v[s_idx][2];
2486+
2487+
light_apply_rgb( &vecs[0].r, &vecs[0].g, &vecs[0].b, &pm->ins[idx].vecs[i1], &pm->ins[idx].norm[i1], 1.5f );
2488+
light_apply_rgb( &vecs[1].r, &vecs[1].g, &vecs[1].b, &pm->ins[idx].vecs[i2], &pm->ins[idx].norm[i2], 1.5f );
2489+
light_apply_rgb( &vecs[2].r, &vecs[2].g, &vecs[2].b, &pm->ins[idx].vecs[i3], &pm->ins[idx].norm[i3], 1.5f );
2490+
vecs[0].a = vecs[1].a = vecs[2].a = 255;
2491+
2492+
// draw the polygon
2493+
g3_render_primitives_colored_textured(&insignia_material, vecs, 3, PRIM_TYPE_TRIFAN, false);
2494+
}
2495+
}
2496+
}
2497+
23852498
SCP_vector<vec3d> Arc_segment_points;
23862499

23872500
void model_render_arc(const vec3d *v1, const vec3d *v2, const SCP_vector<vec3d> *persistent_arc_points, const color *primary, const color *secondary, float arc_width, ubyte depth_limit)
@@ -2541,6 +2654,7 @@ void model_render_immediate(const model_render_params* render_info, int model_nu
25412654
}
25422655

25432656
model_list.render_outlines();
2657+
model_list.render_insignias();
25442658
model_list.render_arcs();
25452659

25462660
gr_zbias(0);
@@ -2863,29 +2977,8 @@ void model_render_queue(const model_render_params* interp, model_draw_list* scen
28632977
}
28642978

28652979
// MARKED!
2866-
if ( !( model_flags & MR_NO_TEXTURING ) && !( model_flags & MR_NO_INSIGNIA) && objnum >= 0 ) {
2867-
int bitmap_num = interp->get_insignia_bitmap();
2868-
if ( (!pm->ins.empty()) && (bitmap_num >= 0) ) {
2869-
2870-
for (const auto& ins : pm->ins) {
2871-
// skip insignias not on our detail level
2872-
if (ins.detail_level != detail_level) {
2873-
continue;
2874-
}
2875-
2876-
decals::Decal decal;
2877-
decal.object = &Objects[objnum];
2878-
decal.position = ins.position;
2879-
decal.submodel = -1;
2880-
decal.scale = vec3d{{{ins.diameter, ins.diameter, ins.diameter}}};
2881-
decal.orig_obj_type = OBJ_SHIP;
2882-
decal.creation_time = f2fl(Missiontime);
2883-
decal.lifetime = 1.0f;
2884-
decal.orientation = ins.orientation;
2885-
decal.definition_handle = std::make_tuple(bitmap_num, -1, -1);
2886-
decals::addSingleFrameDecal(std::move(decal));
2887-
}
2888-
}
2980+
if ( !( model_flags & MR_NO_TEXTURING ) && !( model_flags & MR_NO_INSIGNIA) ) {
2981+
scene->add_insignia(interp, pm, detail_level, interp->get_insignia_bitmap());
28892982
}
28902983

28912984
if ( (model_flags & MR_AUTOCENTER) && (set_autocen) ) {

code/model/modelrender.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -248,14 +248,15 @@ class model_draw_list
248248
light_indexing_info Current_lights_set;
249249

250250
void render_arc(const arc_effect &arc);
251-
void render_insignia(const insignia_draw_data &insignia_info);
251+
static void render_insignia(const insignia_draw_data &insignia_info);
252252
void render_outline(const outline_draw &outline_info);
253253
void render_buffer(const queued_buffer_draw &render_elements);
254254

255255
SCP_vector<queued_buffer_draw> Render_elements;
256256
SCP_vector<int> Render_keys;
257257

258258
SCP_vector<arc_effect> Arcs;
259+
SCP_vector<insignia_draw_data> Insignias;
259260
SCP_vector<outline_draw> Outlines;
260261

261262
graphics::util::UniformBuffer _dataBuffer;
@@ -288,6 +289,9 @@ class model_draw_list
288289
void add_arc(const vec3d *v1, const vec3d *v2, const SCP_vector<vec3d> *persistent_arc_points, const color *primary, const color *secondary, float arc_width, ubyte segment_depth);
289290
void render_arcs();
290291

292+
void add_insignia(const model_render_params *params, const polymodel *pm, int detail_level, int bitmap_num);
293+
void render_insignias() const;
294+
291295
void add_outline(const vertex* vert_array, int n_verts, const color *clr);
292296
void render_outlines();
293297

@@ -310,6 +314,7 @@ void submodel_render_queue(const model_render_params* render_info, model_draw_li
310314
void model_render_buffers(model_draw_list* scene, model_material* rendering_material, const model_render_params* interp, const vertex_buffer* buffer, const polymodel* pm, int mn, int detail_level, uint tmap_flags);
311315
bool model_render_check_detail_box(const vec3d* view_pos, const polymodel* pm, int submodel_num, uint64_t flags);
312316
void model_render_arc(const vec3d* v1, const vec3d* v2, const SCP_vector<vec3d> *persistent_arc_points, const color* primary, const color* secondary, float arc_width, ubyte depth_limit);
317+
void model_render_insignias(const insignia_draw_data* insignia);
313318
void model_render_set_wireframe_color(const color* clr);
314319
bool render_tech_model(tech_render_type model_type, int x1, int y1, int x2, int y2, float zoom, bool lighting, int class_idx, const matrix* orient, const SCP_string& pof_filename = "", float closeup_zoom = 0, const vec3d* closeup_pos = &vmd_zero_vector, const SCP_string& tcolor = "");
315320

code/object/objectsort.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -388,6 +388,7 @@ void obj_render_queue_all()
388388

389389
// render electricity effects and insignias
390390
scene.render_outlines();
391+
scene.render_insignias();
391392
scene.render_arcs();
392393

393394
gr_zbuffer_set(ZBUFFER_TYPE_READ);

0 commit comments

Comments
 (0)