Pass polymodel& to polymodel_read

This commit is contained in:
Kp 2022-10-09 23:15:20 +00:00
parent acae546a90
commit 43e1c841f0
6 changed files with 51 additions and 52 deletions

View File

@ -94,7 +94,7 @@ void calc_gun_point(const robot_info &, vms_vector &gun_point, const object_base
* reads n robot_info structs from a PHYSFS_File * reads n robot_info structs from a PHYSFS_File
*/ */
void robot_info_read(PHYSFS_File *fp, robot_info &r); void robot_info_read(PHYSFS_File *fp, robot_info &r);
void robot_set_angles(robot_info *r, polymodel *pm, enumerated_array<std::array<vms_angvec, MAX_SUBMODELS>, N_ANIM_STATES, robot_animation_state> &angs); void robot_set_angles(robot_info &r, polymodel &pm, enumerated_array<std::array<vms_angvec, MAX_SUBMODELS>, N_ANIM_STATES, robot_animation_state> &angs);
weapon_id_type get_robot_weapon(const robot_info &ri, const robot_gun_number gun_num); weapon_id_type get_robot_weapon(const robot_info &ri, const robot_gun_number gun_num);
} }

View File

@ -189,7 +189,7 @@ void free_model(polymodel &po);
/* /*
* reads a polymodel structure from a PHYSFS_File * reads a polymodel structure from a PHYSFS_File
*/ */
extern void polymodel_read(polymodel *pm, PHYSFS_File *fp); void polymodel_read(polymodel &pm, PHYSFS_File *fp);
} }
#if 0 #if 0
void polymodel_write(PHYSFS_File *fp, const polymodel &pm); void polymodel_write(PHYSFS_File *fp, const polymodel &pm);

View File

@ -551,7 +551,7 @@ static void load_hxm(const d_fname &hxmname)
{ {
auto &Polygon_models = LevelSharedPolygonModelState.Polygon_models; auto &Polygon_models = LevelSharedPolygonModelState.Polygon_models;
pm = &Polygon_models[repl_num]; pm = &Polygon_models[repl_num];
polymodel_read(pm, f); polymodel_read(*pm, f);
const auto model_data_size = pm->model_data_size; const auto model_data_size = pm->model_data_size;
pm->model_data = std::make_unique<uint8_t[]>(model_data_size); pm->model_data = std::make_unique<uint8_t[]>(model_data_size);
if (PHYSFS_read(f, pm->model_data, model_data_size, 1) < 1) if (PHYSFS_read(f, pm->model_data, model_data_size, 1) < 1)

View File

@ -213,7 +213,7 @@ void properties_read_cmp(d_level_shared_robot_info_state &LevelSharedRobotInfoSt
{ {
const auto &&r = partial_range(Polygon_models, N_polygon_models); const auto &&r = partial_range(Polygon_models, N_polygon_models);
range_for (auto &p, r) range_for (auto &p, r)
polymodel_read(&p, fp); polymodel_read(p, fp);
range_for (auto &p, r) range_for (auto &p, r)
polygon_model_data_read(&p, fp); polygon_model_data_read(&p, fp);
@ -355,7 +355,7 @@ void bm_read_all(d_level_shared_robot_info_state &LevelSharedRobotInfoState, d_v
{ {
const auto &&r = partial_range(Polygon_models, N_polygon_models); const auto &&r = partial_range(Polygon_models, N_polygon_models);
range_for (auto &p, r) range_for (auto &p, r)
polymodel_read(&p, fp); polymodel_read(p, fp);
range_for (auto &p, r) range_for (auto &p, r)
polygon_model_data_read(&p, fp); polygon_model_data_read(&p, fp);
@ -502,7 +502,7 @@ void bm_read_extra_robots(const char *fname, Mission::descent_version_type type)
{ {
const auto &&r = partial_range(Polygon_models, N_D2_POLYGON_MODELS.value, N_polygon_models); const auto &&r = partial_range(Polygon_models, N_D2_POLYGON_MODELS.value, N_polygon_models);
range_for (auto &p, r) range_for (auto &p, r)
polymodel_read(&p, fp); polymodel_read(p, fp);
range_for (auto &p, r) range_for (auto &p, r)
polygon_model_data_read(&p, fp); polygon_model_data_read(&p, fp);
@ -585,7 +585,7 @@ void load_robot_replacements(const d_fname &level_name)
Error("Polygon model (%u) out of range in (%s). Range = [0..%u].", i, static_cast<const char *>(level_name), N_polygon_models - 1); Error("Polygon model (%u) out of range in (%s). Range = [0..%u].", i, static_cast<const char *>(level_name), N_polygon_models - 1);
free_model(Polygon_models[i]); free_model(Polygon_models[i]);
polymodel_read(&Polygon_models[i], fp); polymodel_read(Polygon_models[i], fp);
polygon_model_data_read(&Polygon_models[i], fp); polygon_model_data_read(&Polygon_models[i], fp);
Dying_modelnums[i] = PHYSFSX_readInt(fp); Dying_modelnums[i] = PHYSFSX_readInt(fp);
@ -749,8 +749,8 @@ int load_exit_models()
{ {
exit_modelnum = LevelSharedPolygonModelState.N_polygon_models++; exit_modelnum = LevelSharedPolygonModelState.N_polygon_models++;
destroyed_exit_modelnum = LevelSharedPolygonModelState.N_polygon_models++; destroyed_exit_modelnum = LevelSharedPolygonModelState.N_polygon_models++;
polymodel_read(&Polygon_models[exit_modelnum], exit_hamfile); polymodel_read(Polygon_models[exit_modelnum], exit_hamfile);
polymodel_read(&Polygon_models[destroyed_exit_modelnum], exit_hamfile); polymodel_read(Polygon_models[destroyed_exit_modelnum], exit_hamfile);
Polygon_models[exit_modelnum].first_texture = start_num; Polygon_models[exit_modelnum].first_texture = start_num;
Polygon_models[destroyed_exit_modelnum].first_texture = start_num+3; Polygon_models[destroyed_exit_modelnum].first_texture = start_num+3;
@ -796,8 +796,8 @@ int load_exit_models()
PHYSFSX_fseek(exit_hamfile, offset, SEEK_SET); PHYSFSX_fseek(exit_hamfile, offset, SEEK_SET);
exit_modelnum = LevelSharedPolygonModelState.N_polygon_models++; exit_modelnum = LevelSharedPolygonModelState.N_polygon_models++;
destroyed_exit_modelnum = LevelSharedPolygonModelState.N_polygon_models++; destroyed_exit_modelnum = LevelSharedPolygonModelState.N_polygon_models++;
polymodel_read(&Polygon_models[exit_modelnum], exit_hamfile); polymodel_read(Polygon_models[exit_modelnum], exit_hamfile);
polymodel_read(&Polygon_models[destroyed_exit_modelnum], exit_hamfile); polymodel_read(Polygon_models[destroyed_exit_modelnum], exit_hamfile);
Polygon_models[exit_modelnum].first_texture = start_num; Polygon_models[exit_modelnum].first_texture = start_num;
Polygon_models[destroyed_exit_modelnum].first_texture = start_num+3; Polygon_models[destroyed_exit_modelnum].first_texture = start_num+3;

View File

@ -144,7 +144,7 @@ static void pof_read_ang(vms_angvec &ang, const std::span<const uint8_t> bufp, s
//be filled in. //be filled in.
//reads a binary file containing a 3d model //reads a binary file containing a 3d model
static polymodel *read_model_file(polymodel *pm,const char *filename,robot_info *r) static void read_model_file(polymodel &pm, const char *const filename, robot_info *r)
{ {
short version; short version;
int len, next_chunk; int len, next_chunk;
@ -181,10 +181,10 @@ static polymodel *read_model_file(polymodel *pm,const char *filename,robot_info
case ID_OHDR: { //Object header case ID_OHDR: { //Object header
vms_vector pmmin,pmmax; vms_vector pmmin,pmmax;
pm->n_models = pof_read_int(model_buf, Pof_addr); pm.n_models = pof_read_int(model_buf, Pof_addr);
pm->rad = pof_read_int(model_buf, Pof_addr); pm.rad = pof_read_int(model_buf, Pof_addr);
Assert(pm->n_models <= MAX_SUBMODELS); assert(pm.n_models <= MAX_SUBMODELS);
pof_read_vec(pmmin, model_buf, Pof_addr); pof_read_vec(pmmin, model_buf, Pof_addr);
pof_read_vec(pmmax, model_buf, Pof_addr); pof_read_vec(pmmax, model_buf, Pof_addr);
@ -199,15 +199,15 @@ static polymodel *read_model_file(polymodel *pm,const char *filename,robot_info
Assert(n < MAX_SUBMODELS); Assert(n < MAX_SUBMODELS);
pm->submodel_parents[n] = pof_read_short(model_buf, Pof_addr); pm.submodel_parents[n] = pof_read_short(model_buf, Pof_addr);
pof_read_vec(pm->submodel_norms[n], model_buf, Pof_addr); pof_read_vec(pm.submodel_norms[n], model_buf, Pof_addr);
pof_read_vec(pm->submodel_pnts[n], model_buf, Pof_addr); pof_read_vec(pm.submodel_pnts[n], model_buf, Pof_addr);
pof_read_vec(pm->submodel_offsets[n], model_buf, Pof_addr); pof_read_vec(pm.submodel_offsets[n], model_buf, Pof_addr);
pm->submodel_rads[n] = pof_read_int(model_buf, Pof_addr); //radius pm.submodel_rads[n] = pof_read_int(model_buf, Pof_addr); //radius
pm->submodel_ptrs[n] = pof_read_int(model_buf, Pof_addr); //offset pm.submodel_ptrs[n] = pof_read_int(model_buf, Pof_addr); //offset
break; break;
@ -263,12 +263,12 @@ static polymodel *read_model_file(polymodel *pm,const char *filename,robot_info
Assert(n_frames == N_ANIM_STATES); Assert(n_frames == N_ANIM_STATES);
for (int m=0;m<pm->n_models;m++) for (int m = 0; m < pm.n_models; ++m)
range_for (auto &f, partial_range(anim_angs, n_frames)) range_for (auto &f, partial_range(anim_angs, n_frames))
pof_read_ang(f[m], model_buf, Pof_addr); pof_read_ang(f[m], model_buf, Pof_addr);
robot_set_angles(r,pm,anim_angs); robot_set_angles(*r, pm, anim_angs);
} }
else else
@ -288,10 +288,10 @@ static polymodel *read_model_file(polymodel *pm,const char *filename,robot_info
} }
case ID_IDTA: //Interpreter data case ID_IDTA: //Interpreter data
pm->model_data_size = len; pm.model_data_size = len;
pm->model_data = std::make_unique<uint8_t[]>(pm->model_data_size); pm.model_data = std::make_unique<uint8_t[]>(pm.model_data_size);
pof_cfread(pm->model_data.get(), len, model_buf, Pof_addr); pof_cfread(pm.model_data.get(), len, model_buf, Pof_addr);
break; break;
@ -308,8 +308,7 @@ static polymodel *read_model_file(polymodel *pm,const char *filename,robot_info
align_polygon_model_data(pm); align_polygon_model_data(pm);
#endif #endif
if constexpr (words_bigendian) if constexpr (words_bigendian)
swap_polygon_model_data(pm->model_data.get()); swap_polygon_model_data(pm.model_data.get());
return pm;
} }
} }
@ -504,16 +503,17 @@ static void assign_minmax(vms_vector &minv, vms_vector &maxv, const vms_vector &
update_bounds<&vms_vector::z>(minv, maxv, v); update_bounds<&vms_vector::z>(minv, maxv, v);
} }
static void polyobj_find_min_max(polymodel *pm) static void polyobj_find_min_max(polymodel &pm)
{ {
auto &big_mn = pm->mins; auto &big_mn = pm.mins;
auto &big_mx = pm->maxs; auto &big_mx = pm.maxs;
for (int m=0;m<pm->n_models;m++) { for (int m = 0; m < pm.n_models; ++m)
auto &mn = pm->submodel_mins[m]; {
auto &mx = pm->submodel_maxs[m]; auto &mn = pm.submodel_mins[m];
const auto &ofs = pm->submodel_offsets[m]; auto &mx = pm.submodel_maxs[m];
const auto &ofs = pm.submodel_offsets[m];
auto data = reinterpret_cast<const uint16_t *>(&pm->model_data[pm->submodel_ptrs[m]]); auto data = reinterpret_cast<const uint16_t *>(&pm.model_data[pm.submodel_ptrs[m]]);
const auto type = *data++; const auto type = *data++;
@ -560,9 +560,8 @@ int load_polygon_model(const char *filename,int n_textures,int first_texture,rob
auto &Polygon_models = LevelSharedPolygonModelState.Polygon_models; auto &Polygon_models = LevelSharedPolygonModelState.Polygon_models;
auto &model = Polygon_models[n_models]; auto &model = Polygon_models[n_models];
read_model_file(&model, filename, r); read_model_file(model, filename, r);
polyobj_find_min_max(model);
polyobj_find_min_max(&model);
const auto highest_texture_num = g3_init_polygon_model(std::span{model.model_data.get(), model.model_data_size}); const auto highest_texture_num = g3_init_polygon_model(std::span{model.model_data.get(), model.model_data_size});
@ -615,10 +614,10 @@ ASSERT_SERIAL_UDT_MESSAGE_SIZE(polymodel, 12 + (10 * 4) + (10 * 3 * sizeof(vms_v
/* /*
* reads a polymodel structure from a PHYSFS_File * reads a polymodel structure from a PHYSFS_File
*/ */
void polymodel_read(polymodel *pm, PHYSFS_File *fp) void polymodel_read(polymodel &pm, PHYSFS_File *fp)
{ {
pm->model_data.reset(); pm.model_data.reset();
PHYSFSX_serialize_read(fp, *pm); PHYSFSX_serialize_read(fp, pm);
} }
} }

View File

@ -124,32 +124,32 @@ static void set_robot_state(object_base &obj, const robot_animation_state state)
//set the animation angles for this robot. Gun fields of robot info must //set the animation angles for this robot. Gun fields of robot info must
//be filled in. //be filled in.
void robot_set_angles(robot_info *const r, polymodel *const pm, enumerated_array<std::array<vms_angvec, MAX_SUBMODELS>, N_ANIM_STATES, robot_animation_state> &angs) void robot_set_angles(robot_info &r, polymodel &pm, enumerated_array<std::array<vms_angvec, MAX_SUBMODELS>, N_ANIM_STATES, robot_animation_state> &angs)
{ {
auto &Robot_joints = LevelSharedRobotJointState.Robot_joints; auto &Robot_joints = LevelSharedRobotJointState.Robot_joints;
std::array<robot_gun_number, MAX_SUBMODELS> gun_nums; //which gun each submodel is part of std::array<robot_gun_number, MAX_SUBMODELS> gun_nums; //which gun each submodel is part of
gun_nums[0] = robot_gun_number{UINT8_MAX}; //body never animates, at least for now gun_nums[0] = robot_gun_number{UINT8_MAX}; //body never animates, at least for now
{ {
auto &&gr = partial_range(gun_nums, 1u, pm->n_models); auto &&gr = partial_range(gun_nums, 1u, pm.n_models);
//assume part of body... //assume part of body...
std::fill(gr.begin(), gr.end(), robot_gun_number{r->n_guns}); std::fill(gr.begin(), gr.end(), robot_gun_number{r.n_guns});
} }
for (auto [g, entry_m] : enumerate(partial_const_range(r->gun_submodels, r->n_guns))) for (auto [g, entry_m] : enumerate(partial_const_range(r.gun_submodels, r.n_guns)))
{ {
const std::size_t bound = std::min(std::size(gun_nums), std::size(pm->submodel_parents)); const std::size_t bound = std::min(std::size(gun_nums), std::size(pm.submodel_parents));
auto m = entry_m; auto m = entry_m;
while (m != 0 && m < bound) while (m != 0 && m < bound)
{ {
gun_nums[m] = g; //...unless we find it in a gun gun_nums[m] = g; //...unless we find it in a gun
m = pm->submodel_parents[m]; m = pm.submodel_parents[m];
} }
} }
const auto n_models = pm->n_models; const auto n_models = pm.n_models;
const auto &&gun_num_model_range = enumerate(partial_range(gun_nums, n_models)); const auto &&gun_num_model_range = enumerate(partial_range(gun_nums, n_models));
const unsigned n_guns = r->n_guns + 1; const unsigned n_guns = r.n_guns + 1;
for (auto &&[g, ras] : enumerate(partial_range(r->anim_states, n_guns))) for (auto &&[g, ras] : enumerate(partial_range(r.anim_states, n_guns)))
{ {
for (auto &&[state, as] : enumerate(ras)) for (auto &&[state, as] : enumerate(ras))
{ {
@ -163,7 +163,7 @@ void robot_set_angles(robot_info *const r, polymodel *const pm, enumerated_array
const auto N_robot_joints = LevelSharedRobotJointState.N_robot_joints ++; const auto N_robot_joints = LevelSharedRobotJointState.N_robot_joints ++;
Robot_joints[N_robot_joints].jointnum = m; Robot_joints[N_robot_joints].jointnum = m;
Robot_joints[N_robot_joints].angles = angs[state][m]; Robot_joints[N_robot_joints].angles = angs[state][m];
r->anim_states[g][state].n_joints++; r.anim_states[g][state].n_joints++;
Assert(N_robot_joints < MAX_ROBOT_JOINTS); Assert(N_robot_joints < MAX_ROBOT_JOINTS);
} }
} }