Skip to content

Commit 73d12d1

Browse files
committed
Merge pull request #532 from Goober5000/function_parameter_tweak
modify function headers as suggested in PR #530
2 parents 0ed147f + c9a45c9 commit 73d12d1

File tree

16 files changed

+124
-174
lines changed

16 files changed

+124
-174
lines changed

code/ai/aicode.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2668,7 +2668,7 @@ void copy_xlate_model_path_points(object *objp, model_path *mp, int dir, int cou
26682668
{
26692669
// movement... find location of point like with docking code and spark generation
26702670
vm_vec_sub(&local_vert, &mp->verts[i].pos, &submodel_offset);
2671-
model_instance_find_world_point(&v1, &local_vert, modelnum, model_instance_num, mp->parent_submodel, &objp->orient, &objp->pos);
2671+
model_instance_find_world_point(&v1, &local_vert, model_instance_num, mp->parent_submodel, &objp->orient, &objp->pos);
26722672
}
26732673
else
26742674
{
@@ -6247,7 +6247,7 @@ void render_path_points(object *objp)
62476247

62486248
if (pm->n_docks) {
62496249
dock_point = pm->docking_bays[0].pnt[0];
6250-
model_instance_find_world_point(&global_dock_point, &dock_point, pm->id, shipp->model_instance_num, 0, &dobjp->orient, &dobjp->pos );
6250+
model_instance_find_world_point(&global_dock_point, &dock_point, shipp->model_instance_num, 0, &dobjp->orient, &dobjp->pos );
62516251
g3_rotate_vertex(&v, &global_dock_point);
62526252
gr_set_color(255, 255, 255);
62536253
g3_draw_sphere( &v, 1.5f);
@@ -9039,11 +9039,11 @@ void find_adjusted_dockpoint_info(vec3d *global_p0, vec3d *global_p1, vec3d *glo
90399039
vm_vec_sub(&local_p1, &pm->docking_bays[dock_index].pnt[1], &submodel_offset);
90409040

90419041
// find the dynamic positions of the dockpoints
9042-
model_instance_find_world_point(global_p0, &local_p0, modelnum, shipp->model_instance_num, submodel, &objp->orient, &objp->pos);
9043-
model_instance_find_world_point(global_p1, &local_p1, modelnum, shipp->model_instance_num, submodel, &objp->orient, &objp->pos);
9042+
model_instance_find_world_point(global_p0, &local_p0, shipp->model_instance_num, submodel, &objp->orient, &objp->pos);
9043+
model_instance_find_world_point(global_p1, &local_p1, shipp->model_instance_num, submodel, &objp->orient, &objp->pos);
90449044

90459045
// find the normal of the first dockpoint
9046-
model_instance_find_world_dir(global_p0_norm, &pm->docking_bays[dock_index].norm[0], modelnum, shipp->model_instance_num, submodel, &objp->orient, &objp->pos);
9046+
model_instance_find_world_dir(global_p0_norm, &pm->docking_bays[dock_index].norm[0], shipp->model_instance_num, submodel, &objp->orient);
90479047
}
90489048
// use the static dockpoints
90499049
else

code/ai/aiturret.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1332,15 +1332,15 @@ void ship_get_global_turret_gun_info(object *objp, ship_subsys *ssp, vec3d *gpos
13321332
gun_pos = &tp->turret_firing_point[ssp->turret_next_fire_pos % tp->turret_num_firing_points];
13331333

13341334
//model_find_world_point(gpos, gun_pos, tp->model_num, tp->turret_gun_sobj, &objp->orient, &objp->pos );
1335-
model_instance_find_world_point(gpos, gun_pos, tp->model_num, Ships[objp->instance].model_instance_num, tp->turret_gun_sobj, &objp->orient, &objp->pos);
1335+
model_instance_find_world_point(gpos, gun_pos, Ships[objp->instance].model_instance_num, tp->turret_gun_sobj, &objp->orient, &objp->pos);
13361336

13371337
if (use_angles) {
1338-
model_instance_find_world_dir(gvec, &tp->turret_norm, tp->model_num, Ships[objp->instance].model_instance_num, tp->turret_gun_sobj, &objp->orient, &objp->pos);
1338+
model_instance_find_world_dir(gvec, &tp->turret_norm, Ships[objp->instance].model_instance_num, tp->turret_gun_sobj, &objp->orient);
13391339
} else if (tp->flags2 & MSS_FLAG2_SHARE_FIRE_DIRECTION) {
13401340
vec3d shared_dir, avg, tmp_pos, tmp_target, enemy_point;
13411341
vm_vec_avg_n(&avg, tp->turret_num_firing_points, tp->turret_firing_point);
13421342

1343-
model_instance_find_world_point(&tmp_pos, &avg, tp->model_num, Ships[objp->instance].model_instance_num, tp->turret_gun_sobj, &objp->orient, &objp->pos);
1343+
model_instance_find_world_point(&tmp_pos, &avg, Ships[objp->instance].model_instance_num, tp->turret_gun_sobj, &objp->orient, &objp->pos);
13441344

13451345
if (targetp == nullptr) {
13461346
Assertion(ssp->turret_enemy_objnum >= 0, "The turret enemy object number %d for %s on ship number %d is invalid.", ssp->turret_enemy_objnum, ssp->sub_name, ssp->parent_objnum);
@@ -1382,7 +1382,7 @@ void ship_get_global_turret_gun_info(object *objp, ship_subsys *ssp, vec3d *gpos
13821382

13831383
vm_vec_normalized_dir(&shared_dir, &tmp_target, &tmp_pos);
13841384

1385-
model_instance_find_world_dir(gvec, &shared_dir, tp->model_num, Ships[objp->instance].model_instance_num, tp->turret_gun_sobj, &objp->orient, &objp->pos);
1385+
model_instance_find_world_dir(gvec, &shared_dir, Ships[objp->instance].model_instance_num, tp->turret_gun_sobj, &objp->orient);
13861386
} else {
13871387
//vector gun_pos2;
13881388
//vm_vec_add(&gun_pos2, gpos, gun_pos);

code/asteroid/asteroid.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,7 +1012,6 @@ int asteroid_check_collision(object *pasteroid, object *other_obj, vec3d *hitpos
10121012
mc.flags = MC_ONLY_SPHERE | MC_CHECK_SPHERELINE;
10131013

10141014
SCP_vector<int> submodel_vector;
1015-
polymodel *pm;
10161015
polymodel_instance *pmi;
10171016

10181017
if (model_collide(&mc)) {
@@ -1026,8 +1025,7 @@ int asteroid_check_collision(object *pasteroid, object *other_obj, vec3d *hitpos
10261025
model_get_rotating_submodel_list(&submodel_vector, heavy_obj);
10271026

10281027
// Get polymodel and turn off all rotating submodels, collide against only 1 at a time.
1029-
pm = model_get(Ship_info[Ships[heavy_obj->instance].ship_info_index].model_num);
1030-
pmi = model_get_instance(Ships[pship_obj->instance].model_instance_num);
1028+
pmi = model_get_instance(Ships[heavy_obj->instance].model_instance_num);
10311029

10321030
// turn off all rotating submodels and test for collision
10331031
for (size_t j=0; j<submodel_vector.size(); j++) {
@@ -1048,10 +1046,10 @@ int asteroid_check_collision(object *pasteroid, object *other_obj, vec3d *hitpos
10481046

10491047
// find the start and end positions of the sphere in submodel RF
10501048
pmi->submodel[submodel_vector[i]].angs = pmi->submodel[submodel_vector[i]].prev_angs;
1051-
world_find_model_instance_point(&p0, &light_obj->last_pos, pm, pmi, submodel_vector[i], &heavy_obj->last_orient, &heavy_obj->last_pos);
1049+
world_find_model_instance_point(&p0, &light_obj->last_pos, pmi, submodel_vector[i], &heavy_obj->last_orient, &heavy_obj->last_pos);
10521050

10531051
pmi->submodel[submodel_vector[i]].angs = copy_angles;
1054-
world_find_model_instance_point(&p1, &light_obj->pos, pm, pmi, submodel_vector[i], &heavy_obj->orient, &heavy_obj->pos);
1052+
world_find_model_instance_point(&p1, &light_obj->pos, pmi, submodel_vector[i], &heavy_obj->orient, &heavy_obj->pos);
10551053

10561054
mc.p0 = &p0;
10571055
mc.p1 = &p1;
@@ -1068,14 +1066,14 @@ int asteroid_check_collision(object *pasteroid, object *other_obj, vec3d *hitpos
10681066

10691067
// set up asteroid_hit_info for rotating submodel
10701068
if (asteroid_hit_info->edge_hit == 0) {
1071-
model_instance_find_obj_dir(&asteroid_hit_info->collision_normal, &mc.hit_normal, heavy_obj, mc.hit_submodel);
1069+
model_instance_find_obj_dir(&asteroid_hit_info->collision_normal, &mc.hit_normal, Ships[heavy_obj->instance].model_instance_num, mc.hit_submodel, &heavy_obj->orient);
10721070
}
10731071

10741072
// find position in submodel RF of light object at collison
10751073
vec3d int_light_pos, diff;
10761074
vm_vec_sub(&diff, mc.p1, mc.p0);
10771075
vm_vec_scale_add(&int_light_pos, mc.p0, &diff, mc.hit_dist);
1078-
model_instance_find_world_point(&asteroid_hit_info->light_collision_cm_pos, &int_light_pos, mc.model_num, mc.model_instance_num, mc.hit_submodel, &heavy_obj->orient, &zero);
1076+
model_instance_find_world_point(&asteroid_hit_info->light_collision_cm_pos, &int_light_pos, mc.model_instance_num, mc.hit_submodel, &heavy_obj->orient, &zero);
10791077
}
10801078
}
10811079
// Don't look at this submodel again
@@ -1100,7 +1098,7 @@ int asteroid_check_collision(object *pasteroid, object *other_obj, vec3d *hitpos
11001098

11011099
// get collision normal if not edge hit
11021100
if (asteroid_hit_info->edge_hit == 0) {
1103-
model_instance_find_obj_dir(&asteroid_hit_info->collision_normal, &mc.hit_normal, heavy_obj, mc.hit_submodel);
1101+
model_instance_find_obj_dir(&asteroid_hit_info->collision_normal, &mc.hit_normal, Ships[heavy_obj->instance].model_instance_num, mc.hit_submodel, &heavy_obj->orient);
11041102
}
11051103

11061104
// find position in submodel RF of light object at collison

code/camera/camera.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,8 +330,10 @@ void camera::get_info(vec3d *position, matrix *orientation)
330330
eyep = get_submodel_eye(pm, object_host_submodel);
331331
if(eyep)
332332
{
333+
Assertion(objp->type == OBJ_SHIP, "This part of the code expects the object to be a ship");
334+
333335
vec3d c_pos_in;
334-
find_submodel_instance_point_normal( &c_pos_in, &host_normal, objp, eyep->parent, &eyep->pnt, &eyep->norm);
336+
find_submodel_instance_point_normal(&c_pos_in, &host_normal, Ships[objp->instance].model_instance_num, eyep->parent, &eyep->pnt, &eyep->norm);
335337
vm_vec_unrotate(&c_pos, &c_pos_in, &objp->orient);
336338
vm_vec_add2(&c_pos, &objp->pos);
337339
}

code/debris/debris.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -898,7 +898,6 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
898898
mc.flags = MC_ONLY_SPHERE | MC_CHECK_SPHERELINE;
899899

900900
SCP_vector<int> submodel_vector;
901-
polymodel *pm;
902901
polymodel_instance *pmi;
903902

904903
if (model_collide(&mc)) {
@@ -914,7 +913,6 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
914913
model_get_rotating_submodel_list(&submodel_vector, heavy_obj);
915914

916915
// Get polymodel and turn off all rotating submodels, collide against only 1 at a time.
917-
pm = model_get(Ship_info[Ships[heavy_obj->instance].ship_info_index].model_num);
918916
pmi = model_get_instance(Ships[heavy_obj->instance].model_instance_num);
919917

920918
// turn off all rotating submodels and test for collision
@@ -939,10 +937,10 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
939937

940938
// find the start and end positions of the sphere in submodel RF
941939
pmi->submodel[*smv].angs = pmi->submodel[*smv].prev_angs;
942-
world_find_model_instance_point(&p0, &light_obj->last_pos, pm, pmi, *smv, &heavy_obj->last_orient, &heavy_obj->last_pos);
940+
world_find_model_instance_point(&p0, &light_obj->last_pos, pmi, *smv, &heavy_obj->last_orient, &heavy_obj->last_pos);
943941

944942
pmi->submodel[*smv].angs = copy_angles;
945-
world_find_model_instance_point(&p1, &light_obj->pos, pm, pmi, *smv, &heavy_obj->orient, &heavy_obj->pos);
943+
world_find_model_instance_point(&p1, &light_obj->pos, pmi, *smv, &heavy_obj->orient, &heavy_obj->pos);
946944

947945
mc.p0 = &p0;
948946
mc.p1 = &p1;
@@ -956,18 +954,18 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
956954

957955
// set up debris_hit_info common
958956
set_hit_struct_info(debris_hit_info, &mc, SUBMODEL_ROT_HIT);
959-
model_instance_find_world_point(&debris_hit_info->hit_pos, &mc.hit_point, mc.model_num, mc.model_instance_num, mc.hit_submodel, &heavy_obj->orient, &zero);
957+
model_instance_find_world_point(&debris_hit_info->hit_pos, &mc.hit_point, mc.model_instance_num, mc.hit_submodel, &heavy_obj->orient, &zero);
960958

961959
// set up debris_hit_info for rotating submodel
962960
if (debris_hit_info->edge_hit == 0) {
963-
model_instance_find_obj_dir(&debris_hit_info->collision_normal, &mc.hit_normal, heavy_obj, mc.hit_submodel);
961+
model_instance_find_obj_dir(&debris_hit_info->collision_normal, &mc.hit_normal, mc.model_instance_num, mc.hit_submodel, &heavy_obj->orient);
964962
}
965963

966964
// find position in submodel RF of light object at collison
967965
vec3d int_light_pos, diff;
968966
vm_vec_sub(&diff, mc.p1, mc.p0);
969967
vm_vec_scale_add(&int_light_pos, mc.p0, &diff, mc.hit_dist);
970-
model_instance_find_world_point(&debris_hit_info->light_collision_cm_pos, &int_light_pos, mc.model_num, mc.model_instance_num, mc.hit_submodel, &heavy_obj->orient, &zero);
968+
model_instance_find_world_point(&debris_hit_info->light_collision_cm_pos, &int_light_pos, mc.model_instance_num, mc.hit_submodel, &heavy_obj->orient, &zero);
971969
}
972970
}
973971
// Don't look at this submodel again
@@ -991,7 +989,7 @@ int debris_check_collision(object *pdebris, object *other_obj, vec3d *hitpos, co
991989

992990
// get collision normal if not edge hit
993991
if (debris_hit_info->edge_hit == 0) {
994-
model_instance_find_obj_dir(&debris_hit_info->collision_normal, &mc.hit_normal, heavy_obj, mc.hit_submodel);
992+
model_instance_find_obj_dir(&debris_hit_info->collision_normal, &mc.hit_normal, Ships[heavy_obj->instance].model_instance_num, mc.hit_submodel, &heavy_obj->orient);
995993
}
996994

997995
// find position in submodel RF of light object at collison

code/model/model.h

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1011,20 +1011,19 @@ extern void model_find_submodel_offset(vec3d *outpnt, int model_num, int sub_mod
10111011
// Given a point (pnt) that is in sub_model_num's frame of
10121012
// reference, and given the object's orient and position,
10131013
// return the point in 3-space in outpnt.
1014-
extern void model_find_world_point(vec3d * outpnt, vec3d *mpnt,int model_num, int sub_model_num, matrix * objorient, vec3d * objpos);
1015-
void model_instance_find_world_point(vec3d * outpnt, vec3d *mpnt, int model_num, int model_instance_num, int sub_model_num, matrix * objorient, vec3d * objpos );
1014+
extern void model_find_world_point(vec3d *outpnt, vec3d *mpnt, int model_num, int submodel_num, const matrix *objorient, const vec3d *objpos);
1015+
extern void model_instance_find_world_point(vec3d *outpnt, vec3d *mpnt, int model_instance_num, int submodel_num, const matrix *objorient, const vec3d *objpos);
10161016

10171017
// Given a point in the world RF, find the corresponding point in the model RF.
10181018
// This is special purpose code, specific for model collision.
10191019
// NOTE - this code ASSUMES submodel is 1 level down from hull (detail[0])
1020-
void world_find_model_point(vec3d *out, vec3d *world_pt, polymodel *pm, int submodel_num, matrix *orient, vec3d *pos);
1020+
void world_find_model_point(vec3d *out, vec3d *world_pt, const polymodel *pm, int submodel_num, const matrix *orient, const vec3d *pos);
1021+
void world_find_model_instance_point(vec3d *out, vec3d *world_pt, const polymodel_instance *pmi, int submodel_num, const matrix *orient, const vec3d *pos);
10211022

1022-
void world_find_model_instance_point(vec3d *out, vec3d *world_pt, polymodel *pm, polymodel_instance *pmi, int submodel_num, matrix *orient, vec3d *pos);
1023-
1024-
extern void find_submodel_instance_point(vec3d *outpnt, object *pship_obj, int submodel_num);
1025-
extern void find_submodel_instance_point_normal(vec3d *outpnt, vec3d *outnorm, object *pship_obj, int submodel_num, vec3d *submodel_pnt, vec3d *submodel_norm);
1026-
extern void find_submodel_instance_point_orient(vec3d *outpnt, matrix *outorient, object *pship_obj, int submodel_num, vec3d *submodel_pnt, matrix *submodel_orient);
1027-
extern void find_submodel_instance_world_point(vec3d *outpnt, object *pship_obj, int submodel_num);
1023+
extern void find_submodel_instance_point(vec3d *outpnt, int model_instance_num, int submodel_num);
1024+
extern void find_submodel_instance_point_normal(vec3d *outpnt, vec3d *outnorm, int model_instance_num, int submodel_num, const vec3d *submodel_pnt, const vec3d *submodel_norm);
1025+
extern void find_submodel_instance_point_orient(vec3d *outpnt, matrix *outorient, int model_instance_num, int submodel_num, const vec3d *submodel_pnt, const matrix *submodel_orient);
1026+
extern void find_submodel_instance_world_point(vec3d *outpnt, int model_instance_num, int submodel_num, const matrix *objorient, const vec3d *objpos);
10281027

10291028
// Given a polygon model index, find a list of rotating submodels to be used for collision
10301029
void model_get_rotating_submodel_list(SCP_vector<int> *submodel_vector, object *objp);
@@ -1038,8 +1037,8 @@ void model_init_submodel_axis_pt(submodel_instance_info *sii, int model_num, int
10381037
// Given a direction (pnt) that is in sub_model_num's frame of
10391038
// reference, and given the object's orient and position,
10401039
// return the point in 3-space in outpnt.
1041-
extern void model_find_world_dir(vec3d * out_dir, vec3d *in_dir,int model_num, int sub_model_num, matrix * objorient, vec3d * objpos);
1042-
extern void model_instance_find_world_dir(vec3d * out_dir, vec3d *in_dir,int model_num, int model_instance_num, int sub_model_num, matrix * objorient, vec3d * objpos);
1040+
extern void model_find_world_dir(vec3d *out_dir, vec3d *in_dir, int model_num, int submodel_num, const matrix *objorient);
1041+
extern void model_instance_find_world_dir(vec3d *out_dir, vec3d *in_dir, int model_instance_num, int submodel_num, const matrix *objorient);
10431042

10441043
// Clears all the submodel instances stored in a model to their defaults.
10451044
extern void model_clear_instance(int model_num);
@@ -1098,8 +1097,8 @@ int submodel_get_num_polys(int model_num, int submodel_num);
10981097
// Given a vector that is in sub_model_num's frame of
10991098
// reference, and given the object's orient and position,
11001099
// return the vector in the model's frame of reference.
1101-
void model_find_obj_dir(vec3d *w_vec, vec3d *m_vec, object *pship_obj, int sub_model_num);
1102-
void model_instance_find_obj_dir(vec3d *w_vec, vec3d *m_vec, object *pship_obj, int sub_model_num);
1100+
void model_find_obj_dir(vec3d *w_vec, vec3d *m_vec, int model_instance_num, int submodel_num, matrix *objorient);
1101+
void model_instance_find_obj_dir(vec3d *w_vec, vec3d *m_vec, int model_instance_num, int submodel_num, matrix *objorient);
11031102

11041103

11051104
// This is the interface to model_check_collision. Rather than passing all these

code/model/modelcollide.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1338,7 +1338,7 @@ int model_collide(mc_info *mc_info_obj)
13381338
vm_vec_add2(&Mc->hit_point_world, Mc->pos);
13391339
} else {
13401340
if ( Mc_pmi ) {
1341-
model_instance_find_world_point(&Mc->hit_point_world, &Mc->hit_point, Mc->model_num, Mc->model_instance_num, Mc->hit_submodel, Mc->orient, Mc->pos);
1341+
model_instance_find_world_point(&Mc->hit_point_world, &Mc->hit_point, Mc->model_instance_num, Mc->hit_submodel, Mc->orient, Mc->pos);
13421342
} else {
13431343
model_find_world_point(&Mc->hit_point_world, &Mc->hit_point, Mc->model_num, Mc->hit_submodel, Mc->orient, Mc->pos);
13441344
}

code/model/modelinterp.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2347,7 +2347,7 @@ void model_render_thrusters(polymodel *pm, int objnum, ship *shipp, matrix *orie
23472347
vm_vec_sub(&loc_offset, &gpt->pnt, &submodel_static_offset);
23482348

23492349
tempv = loc_offset;
2350-
find_submodel_instance_point_normal(&loc_offset, &loc_norm, &Objects[objnum], bank->submodel_num, &tempv, &loc_norm);
2350+
find_submodel_instance_point_normal(&loc_offset, &loc_norm, shipp->model_instance_num, bank->submodel_num, &tempv, &loc_norm);
23512351
}
23522352

23532353
vm_vec_unrotate(&world_pnt, &loc_offset, orient);
@@ -2657,7 +2657,7 @@ void model_render_glow_points_DEPRECATED(polymodel *pm, ship *shipp, matrix *ori
26572657
vm_vec_sub(&loc_offset, &gpt->pnt, &submodel_static_offset);
26582658

26592659
tempv = loc_offset;
2660-
find_submodel_instance_point_normal(&loc_offset, &loc_norm, &Objects[shipp->objnum], bank->submodel_parent, &tempv, &loc_norm);
2660+
find_submodel_instance_point_normal(&loc_offset, &loc_norm, shipp->model_instance_num, bank->submodel_parent, &tempv, &loc_norm);
26612661
}
26622662

26632663
vm_vec_unrotate(&world_pnt, &loc_offset, orient);
@@ -2815,7 +2815,7 @@ void model_render_glow_points_DEPRECATED(polymodel *pm, ship *shipp, matrix *ori
28152815
} else {
28162816
cone_dir_rot = gpo->cone_direction;
28172817
}
2818-
find_submodel_instance_point_normal(&unused, &cone_dir_model, &Objects[shipp->objnum], bank->submodel_parent, &unused, &cone_dir_rot);
2818+
find_submodel_instance_point_normal(&unused, &cone_dir_model, shipp->model_instance_num, bank->submodel_parent, &unused, &cone_dir_rot);
28192819
vm_vec_unrotate(&cone_dir_world, &cone_dir_model, orient);
28202820
vm_vec_rotate(&cone_dir_screen, &cone_dir_world, &Eye_matrix);
28212821
cone_dir_screen.xyz.z = -cone_dir_screen.xyz.z;

0 commit comments

Comments
 (0)