@@ -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+
644689void 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+
23852498SCP_vector<vec3d> Arc_segment_points;
23862499
23872500void 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) ) {
0 commit comments