| 225 | } |
| 226 | |
| 227 | void 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 | |
| 265 | void CBreakableObject::ProcessDamage() |
| 266 | { |
nothing calls this directly
no test coverage detected