Skip to content

Commit 8dc03b0

Browse files
committed
additional submodel scripting enhancements
4. `__eq` functions for models and submodels 5. Store model and submodel IDs, not pointers
1 parent 1b75fea commit 8dc03b0

5 files changed

Lines changed: 102 additions & 37 deletions

File tree

code/model/model.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1012,6 +1012,7 @@ SCP_set<int> model_get_textures_used(const polymodel* pm, int submodel);
10121012
// Returns a pointer to the polymodel structure for model 'n'
10131013
polymodel *model_get(int model_num);
10141014

1015+
int num_model_instances();
10151016
polymodel_instance* model_get_instance(int model_instance_num);
10161017

10171018
// routine to copy subsystems. Must be called when subsystems sets are the same -- see ship.cpp

code/model/modelread.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3895,6 +3895,11 @@ polymodel * model_get(int model_num)
38953895
return Polygon_models[num];
38963896
}
38973897

3898+
int num_model_instances()
3899+
{
3900+
return static_cast<int>(Polygon_model_instances.size());
3901+
}
3902+
38983903
polymodel_instance* model_get_instance(int model_instance_num)
38993904
{
39003905
Assert( model_instance_num >= 0 );

code/scripting/api/objs/model.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ int model_h::GetID() const
2323
}
2424
bool model_h::isValid() const
2525
{
26-
return (model_num >= 0) && (model_get(model_num) != nullptr);
26+
return (model_num >= 0) && (model_get(model_num) != nullptr); // note: the model ID can exceed MAX_POLYGON_MODELS because the modulo is taken
2727
}
2828
model_h::model_h(int n_modelnum)
2929
: model_num(n_modelnum)
@@ -56,8 +56,8 @@ bool submodel_h::isValid() const
5656
if (model_num >= 0 && submodel_num >= 0)
5757
{
5858
auto model = model_get(model_num);
59-
if (model != nullptr)
60-
return submodel_num < model->n_models;
59+
if (model != nullptr && submodel_num < model->n_models)
60+
return true;
6161
}
6262
return false;
6363
}

code/scripting/api/objs/modelinstance.cpp

Lines changed: 78 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -111,65 +111,118 @@ ADE_OBJ(l_ModelInstance, modelinstance_h, "model_instance", "Model instance hand
111111

112112
modelinstance_h::modelinstance_h(int pmi_id)
113113
{
114-
_pmi = model_get_instance(pmi_id);
114+
_pmi_id = pmi_id;
115115
}
116116
modelinstance_h::modelinstance_h(polymodel_instance *pmi)
117-
: _pmi(pmi)
117+
: _pmi_id(pmi ? pmi->id : -1)
118118
{}
119119
modelinstance_h::modelinstance_h()
120-
: _pmi(nullptr)
120+
: _pmi_id(-1)
121121
{}
122-
polymodel_instance *modelinstance_h::Get()
122+
polymodel_instance *modelinstance_h::Get() const
123123
{
124-
return _pmi;
124+
return isValid() ? model_get_instance(_pmi_id) : nullptr;
125+
}
126+
int modelinstance_h::GetID() const
127+
{
128+
return isValid() ? _pmi_id : -1;
129+
}
130+
polymodel *modelinstance_h::GetModel() const
131+
{
132+
return isValid() ? model_get(model_get_instance(_pmi_id)->model_num) : nullptr;
133+
}
134+
int modelinstance_h::GetModelID() const
135+
{
136+
return isValid() ? model_get_instance(_pmi_id)->model_num : -1;
125137
}
126138
bool modelinstance_h::isValid() const
127139
{
128-
return (_pmi != nullptr);
140+
return (_pmi_id >= 0) && (_pmi_id < num_model_instances()) && (model_get_instance(_pmi_id) != nullptr);
129141
}
130142

131143

132144
ADE_OBJ(l_SubmodelInstance, submodelinstance_h, "submodel_instance", "Submodel instance handle");
133145

134146
submodelinstance_h::submodelinstance_h(int pmi_id, int submodel_num)
135-
: _submodel_num(submodel_num)
147+
: _pmi_id(pmi_id), _submodel_num(submodel_num)
148+
{}
149+
submodelinstance_h::submodelinstance_h(polymodel_instance *pmi, int submodel_num)
150+
: _pmi_id(pmi ? pmi->id : -1), _submodel_num(submodel_num)
151+
{}
152+
submodelinstance_h::submodelinstance_h()
153+
: _pmi_id(-1), _submodel_num(-1)
154+
{}
155+
polymodel_instance *submodelinstance_h::GetModelInstance() const
136156
{
137-
_pmi = model_get_instance(pmi_id);
138-
_pm = _pmi ? model_get(_pmi->model_num) : nullptr;
157+
return isValid() ? model_get_instance(_pmi_id) : nullptr;
139158
}
140-
submodelinstance_h::submodelinstance_h(polymodel_instance *pmi, int submodel_num)
141-
: _pmi(pmi), _submodel_num(submodel_num)
159+
int submodelinstance_h::GetModelInstanceID() const
142160
{
143-
_pm = pmi ? model_get(pmi->model_num) : nullptr;
161+
return isValid() ? _pmi_id : -1;
144162
}
145-
submodelinstance_h::submodelinstance_h()
146-
: _pmi(nullptr), _pm(nullptr), _submodel_num(-1)
147-
{}
148-
polymodel_instance *submodelinstance_h::GetModelInstance()
163+
submodel_instance *submodelinstance_h::Get() const
149164
{
150-
return isValid() ? _pmi : nullptr;
165+
return isValid() ? &model_get_instance(_pmi_id)->submodel[_submodel_num] : nullptr;
151166
}
152-
submodel_instance *submodelinstance_h::Get()
167+
polymodel *submodelinstance_h::GetModel() const
153168
{
154-
return isValid() ? &_pmi->submodel[_submodel_num] : nullptr;
169+
return isValid() ? model_get(model_get_instance(_pmi_id)->model_num) : nullptr;
155170
}
156-
polymodel *submodelinstance_h::GetModel()
171+
int submodelinstance_h::GetModelID() const
157172
{
158-
return isValid() ? _pm : nullptr;
173+
return isValid() ? model_get_instance(_pmi_id)->model_num : -1;
159174
}
160-
bsp_info *submodelinstance_h::GetSubmodel()
175+
bsp_info *submodelinstance_h::GetSubmodel() const
161176
{
162-
return isValid() ? &_pm->submodel[_submodel_num] : nullptr;
177+
return isValid() ? &model_get(model_get_instance(_pmi_id)->model_num)->submodel[_submodel_num] : nullptr;
163178
}
164-
int submodelinstance_h::GetSubmodelIndex()
179+
int submodelinstance_h::GetSubmodelIndex() const
165180
{
166181
return isValid() ? _submodel_num : -1;
167182
}
168183
bool submodelinstance_h::isValid() const
169184
{
170-
return _pmi != nullptr && _pm != nullptr && _submodel_num >= 0 && _submodel_num < _pm->n_models;
185+
if (_pmi_id >= 0 && _submodel_num >= 0 && _pmi_id < num_model_instances())
186+
{
187+
auto pmi = model_get_instance(_pmi_id);
188+
if (pmi != nullptr && pmi->model_num >= 0)
189+
{
190+
auto pm = model_get(pmi->model_num);
191+
if (pm != nullptr && _submodel_num < pm->n_models)
192+
return true;
193+
}
194+
}
195+
return false;
196+
}
197+
198+
199+
ADE_FUNC(__eq, l_ModelInstance, "model_instance, model_instance", "Checks if two model instance handles refer to the same model instance", "boolean", "True if model instances are equal")
200+
{
201+
modelinstance_h* mih1;
202+
modelinstance_h* mih2;
203+
204+
if (!ade_get_args(L, "oo", l_ModelInstance.GetPtr(&mih1), l_ModelInstance.GetPtr(&mih2)))
205+
return ADE_RETURN_NIL;
206+
207+
if (mih1->GetID() == mih2->GetID())
208+
return ADE_RETURN_TRUE;
209+
210+
return ADE_RETURN_FALSE;
171211
}
172212

213+
ADE_FUNC(__eq, l_SubmodelInstance, "submodel_instance, submodel_instance", "Checks if two submodel instance handles refer to the same submodel instance", "boolean", "True if submodel instances are equal")
214+
{
215+
submodelinstance_h* smih1;
216+
submodelinstance_h* smih2;
217+
218+
if (!ade_get_args(L, "oo", l_SubmodelInstance.GetPtr(&smih1), l_SubmodelInstance.GetPtr(&smih2)))
219+
return ADE_RETURN_NIL;
220+
221+
if (smih1->GetModelInstanceID() == smih2->GetModelInstanceID() && smih1->GetSubmodelIndex() == smih2->GetSubmodelIndex())
222+
return ADE_RETURN_TRUE;
223+
224+
return ADE_RETURN_FALSE;
225+
}
173226

174227
ADE_FUNC(getModel, l_ModelInstance, nullptr, "Returns the model used by this instance", "model", "A model")
175228
{

code/scripting/api/objs/modelinstance.h

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,18 @@ namespace api {
1010
class modelinstance_h
1111
{
1212
protected:
13-
polymodel_instance *_pmi;
13+
int _pmi_id;
1414

1515
public:
1616
explicit modelinstance_h(int pmi_id);
1717
explicit modelinstance_h(polymodel_instance *pmi);
1818
modelinstance_h();
1919

20-
polymodel_instance *Get();
20+
polymodel_instance *Get() const;
21+
int GetID() const;
22+
23+
polymodel *GetModel() const;
24+
int GetModelID() const;
2125

2226
bool isValid() const;
2327
};
@@ -27,21 +31,23 @@ DECLARE_ADE_OBJ(l_ModelInstance, modelinstance_h);
2731
class submodelinstance_h
2832
{
2933
protected:
30-
polymodel_instance *_pmi;
31-
polymodel *_pm;
34+
int _pmi_id;
3235
int _submodel_num;
3336

3437
public:
3538
explicit submodelinstance_h(int pmi_id, int submodel_num);
3639
explicit submodelinstance_h(polymodel_instance *pmi, int submodel_num);
3740
submodelinstance_h();
3841

39-
polymodel_instance *GetModelInstance();
40-
submodel_instance *Get();
42+
polymodel_instance *GetModelInstance() const;
43+
int GetModelInstanceID() const;
44+
45+
polymodel *GetModel() const;
46+
int GetModelID() const;
4147

42-
polymodel *GetModel();
43-
bsp_info *GetSubmodel();
44-
int GetSubmodelIndex();
48+
submodel_instance *Get() const;
49+
bsp_info *GetSubmodel() const;
50+
int GetSubmodelIndex() const;
4551

4652
bool isValid() const;
4753
};

0 commit comments

Comments
 (0)