Pass polymodel& to polymodel_read
This commit is contained in:
parent
acae546a90
commit
43e1c841f0
|
@ -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
|
||||
*/
|
||||
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);
|
||||
|
||||
}
|
||||
|
|
|
@ -189,7 +189,7 @@ void free_model(polymodel &po);
|
|||
/*
|
||||
* 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
|
||||
void polymodel_write(PHYSFS_File *fp, const polymodel &pm);
|
||||
|
|
|
@ -551,7 +551,7 @@ static void load_hxm(const d_fname &hxmname)
|
|||
{
|
||||
auto &Polygon_models = LevelSharedPolygonModelState.Polygon_models;
|
||||
pm = &Polygon_models[repl_num];
|
||||
polymodel_read(pm, f);
|
||||
polymodel_read(*pm, f);
|
||||
const auto model_data_size = pm->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)
|
||||
|
|
|
@ -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);
|
||||
range_for (auto &p, r)
|
||||
polymodel_read(&p, fp);
|
||||
polymodel_read(p, fp);
|
||||
|
||||
range_for (auto &p, r)
|
||||
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);
|
||||
range_for (auto &p, r)
|
||||
polymodel_read(&p, fp);
|
||||
polymodel_read(p, fp);
|
||||
|
||||
range_for (auto &p, r)
|
||||
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);
|
||||
range_for (auto &p, r)
|
||||
polymodel_read(&p, fp);
|
||||
polymodel_read(p, fp);
|
||||
|
||||
range_for (auto &p, r)
|
||||
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);
|
||||
|
||||
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);
|
||||
|
||||
Dying_modelnums[i] = PHYSFSX_readInt(fp);
|
||||
|
@ -749,8 +749,8 @@ int load_exit_models()
|
|||
{
|
||||
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[destroyed_exit_modelnum], exit_hamfile);
|
||||
polymodel_read(Polygon_models[exit_modelnum], exit_hamfile);
|
||||
polymodel_read(Polygon_models[destroyed_exit_modelnum], exit_hamfile);
|
||||
Polygon_models[exit_modelnum].first_texture = start_num;
|
||||
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);
|
||||
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[destroyed_exit_modelnum], exit_hamfile);
|
||||
polymodel_read(Polygon_models[exit_modelnum], exit_hamfile);
|
||||
polymodel_read(Polygon_models[destroyed_exit_modelnum], exit_hamfile);
|
||||
Polygon_models[exit_modelnum].first_texture = start_num;
|
||||
Polygon_models[destroyed_exit_modelnum].first_texture = start_num+3;
|
||||
|
||||
|
|
|
@ -144,7 +144,7 @@ static void pof_read_ang(vms_angvec &ang, const std::span<const uint8_t> bufp, s
|
|||
//be filled in.
|
||||
|
||||
//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;
|
||||
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
|
||||
vms_vector pmmin,pmmax;
|
||||
|
||||
pm->n_models = pof_read_int(model_buf, Pof_addr);
|
||||
pm->rad = 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);
|
||||
|
||||
Assert(pm->n_models <= MAX_SUBMODELS);
|
||||
assert(pm.n_models <= MAX_SUBMODELS);
|
||||
|
||||
pof_read_vec(pmmin, 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);
|
||||
|
||||
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_pnts[n], model_buf, Pof_addr);
|
||||
pof_read_vec(pm->submodel_offsets[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_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;
|
||||
|
||||
|
@ -263,12 +263,12 @@ static polymodel *read_model_file(polymodel *pm,const char *filename,robot_info
|
|||
|
||||
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))
|
||||
pof_read_ang(f[m], model_buf, Pof_addr);
|
||||
|
||||
|
||||
robot_set_angles(r,pm,anim_angs);
|
||||
robot_set_angles(*r, pm, anim_angs);
|
||||
|
||||
}
|
||||
else
|
||||
|
@ -288,10 +288,10 @@ static polymodel *read_model_file(polymodel *pm,const char *filename,robot_info
|
|||
}
|
||||
|
||||
case ID_IDTA: //Interpreter data
|
||||
pm->model_data_size = len;
|
||||
pm->model_data = std::make_unique<uint8_t[]>(pm->model_data_size);
|
||||
pm.model_data_size = len;
|
||||
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;
|
||||
|
||||
|
@ -308,8 +308,7 @@ static polymodel *read_model_file(polymodel *pm,const char *filename,robot_info
|
|||
align_polygon_model_data(pm);
|
||||
#endif
|
||||
if constexpr (words_bigendian)
|
||||
swap_polygon_model_data(pm->model_data.get());
|
||||
return pm;
|
||||
swap_polygon_model_data(pm.model_data.get());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
static void polyobj_find_min_max(polymodel *pm)
|
||||
static void polyobj_find_min_max(polymodel &pm)
|
||||
{
|
||||
auto &big_mn = pm->mins;
|
||||
auto &big_mx = pm->maxs;
|
||||
for (int m=0;m<pm->n_models;m++) {
|
||||
auto &mn = pm->submodel_mins[m];
|
||||
auto &mx = pm->submodel_maxs[m];
|
||||
const auto &ofs = pm->submodel_offsets[m];
|
||||
auto &big_mn = pm.mins;
|
||||
auto &big_mx = pm.maxs;
|
||||
for (int m = 0; m < pm.n_models; ++m)
|
||||
{
|
||||
auto &mn = pm.submodel_mins[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++;
|
||||
|
||||
|
@ -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 &model = Polygon_models[n_models];
|
||||
read_model_file(&model, filename, r);
|
||||
|
||||
polyobj_find_min_max(&model);
|
||||
read_model_file(model, filename, r);
|
||||
polyobj_find_min_max(model);
|
||||
|
||||
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
|
||||
*/
|
||||
void polymodel_read(polymodel *pm, PHYSFS_File *fp)
|
||||
void polymodel_read(polymodel &pm, PHYSFS_File *fp)
|
||||
{
|
||||
pm->model_data.reset();
|
||||
PHYSFSX_serialize_read(fp, *pm);
|
||||
pm.model_data.reset();
|
||||
PHYSFSX_serialize_read(fp, pm);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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
|
||||
//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;
|
||||
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
|
||||
{
|
||||
auto &&gr = partial_range(gun_nums, 1u, pm->n_models);
|
||||
auto &&gr = partial_range(gun_nums, 1u, pm.n_models);
|
||||
//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;
|
||||
while (m != 0 && m < bound)
|
||||
{
|
||||
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 unsigned n_guns = r->n_guns + 1;
|
||||
for (auto &&[g, ras] : enumerate(partial_range(r->anim_states, n_guns)))
|
||||
const unsigned n_guns = r.n_guns + 1;
|
||||
for (auto &&[g, ras] : enumerate(partial_range(r.anim_states, n_guns)))
|
||||
{
|
||||
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 ++;
|
||||
Robot_joints[N_robot_joints].jointnum = 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);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue