@@ -2742,6 +2742,11 @@ modelread_status read_model_file_no_subsys(polymodel * pm, const char* filename,
27422742 // read in world offset
27432743 cfread_vector (&pm->ins [idx].offset , fp);
27442744
2745+ vec3d min = {{{FLT_MAX , FLT_MAX , FLT_MAX }}};
2746+ vec3d max = {{{-FLT_MAX , -FLT_MAX , -FLT_MAX }}};
2747+ vec3d avg_total = ZERO_VECTOR ;
2748+ vec3d avg_normal = ZERO_VECTOR ;
2749+
27452750 // read in all the faces
27462751 for (idx2=0 ; idx2<pm->ins [idx].num_faces ; idx2++){
27472752 // read in 3 vertices
@@ -2753,18 +2758,37 @@ modelread_status read_model_file_no_subsys(polymodel * pm, const char* filename,
27532758 vec3d tempv;
27542759
27552760 // get three points (rotated) and compute normal
2761+ const vec3d& v1 = pm->ins [idx].vecs [pm->ins [idx].faces [idx2][0 ]];
2762+ const vec3d& v2 = pm->ins [idx].vecs [pm->ins [idx].faces [idx2][1 ]];
2763+ const vec3d& v3 = pm->ins [idx].vecs [pm->ins [idx].faces [idx2][2 ]];
27562764
27572765 vm_vec_perp (&tempv,
2758- &pm-> ins [idx]. vecs [pm-> ins [idx]. faces [idx2][ 0 ]] ,
2759- &pm-> ins [idx]. vecs [pm-> ins [idx]. faces [idx2][ 1 ]] ,
2760- &pm-> ins [idx]. vecs [pm-> ins [idx]. faces [idx2][ 2 ]] );
2766+ &v1 ,
2767+ &v2 ,
2768+ &v3 );
27612769
27622770 vm_vec_normalize_safe (&tempv);
27632771
27642772 pm->ins [idx].norm [idx2] = tempv;
2765- // 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));
2773+ // 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));
2774+
27662775
2776+ vm_vec_min (&min, &min, &v1);
2777+ vm_vec_min (&min, &min, &v2);
2778+ vm_vec_min (&min, &min, &v3);
2779+ vm_vec_max (&max, &max, &v1);
2780+ vm_vec_max (&max, &max, &v2);
2781+ vm_vec_max (&max, &max, &v3);
2782+
2783+ vec3d avg = (v1 + v2 + v3) * (1 .0f / 3 .0f );
2784+ avg_total += avg;
2785+ avg_normal += tempv;
27672786 }
2787+
2788+ pm->ins [idx].position = avg_total / static_cast <float >(num_faces) + pm->ins [idx].offset ;
2789+ vec3d bb = max - min;
2790+ pm->ins [idx].diameter = std::max ({bb.xyz .x , bb.xyz .y , bb.xyz .z });
2791+ vm_vector_2_matrix (&pm->ins [idx].orientation , &avg_normal, &vmd_z_vector);
27682792 }
27692793 break ;
27702794
0 commit comments