MCPcopy Create free account
hub / github.com/OGSR/OGSR-Engine / ObjectContactCallback

Method ObjectContactCallback

ogsr_engine/xrGame/BreakableObject.cpp:227–263  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

225}
226
227void CBreakableObject::ObjectContactCallback(bool& /**do_colide/**/, bool bo1, dContact& c, SGameMtl* /*material_1*/, SGameMtl* /*material_2*/)
228{
229 dxGeomUserData* usr_data_1 = retrieveGeomUserData(c.geom.g1);
230 dxGeomUserData* usr_data_2 = retrieveGeomUserData(c.geom.g2);
231 CBreakableObject* this_object;
232 dBodyID body;
233 float norm_sign;
234 if (usr_data_1 && usr_data_1->ph_ref_object && usr_data_1->ph_ref_object->CLS_ID == CLSID_OBJECT_BREAKABLE)
235 {
236 body = dGeomGetBody(c.geom.g2);
237 if (!body)
238 return;
239 this_object = static_cast<CBreakableObject*>(usr_data_1->ph_ref_object);
240 norm_sign = -1.f;
241 }
242 else if (usr_data_2 && usr_data_2->ph_ref_object && usr_data_2->ph_ref_object->CLS_ID == CLSID_OBJECT_BREAKABLE)
243 {
244 body = dGeomGetBody(c.geom.g1);
245 if (!body)
246 return;
247 this_object = static_cast<CBreakableObject*>(usr_data_2->ph_ref_object);
248 norm_sign = 1.f;
249 }
250 else
251 return;
252
253 if (!this_object->m_pUnbrokenObject)
254 return;
255 float c_damage = E_NlS(body, c.geom.normal, norm_sign);
256 if (this_object->m_damage_threshold < c_damage && this_object->m_max_frame_damage < c_damage)
257 {
258 this_object->b_resived_damage = true;
259 this_object->m_max_frame_damage = c_damage;
260 this_object->m_contact_damage_pos.set(c.geom.pos[0], c.geom.pos[1], c.geom.pos[2]);
261 this_object->m_contact_damage_dir.set(-c.geom.normal[0] * norm_sign, -c.geom.normal[1] * norm_sign, -c.geom.normal[2] * norm_sign);
262 }
263}
264
265void CBreakableObject::ProcessDamage()
266{

Callers

nothing calls this directly

Calls 3

dGeomGetBodyFunction · 0.85
E_NlSFunction · 0.85
setMethod · 0.45

Tested by

no test coverage detected