void EERIE_COLLISION_SPHERES_Create(EERIE_3DOBJ * obj) { if(obj == NULL) return; EERIE_COLLISION_SPHERES_Release(obj); obj->sdata = new COLLISION_SPHERES_DATA(); for(size_t k = 1; k < obj->grouplist.size(); k++) { long workon = GetFirstChildGroup(obj, k); if(workon != -1) { // Group origin pos Vec3f center = obj->vertexlist[obj->grouplist[k].origin].v; // Destination Group origin pos Vec3f dest = obj->vertexlist[obj->grouplist[workon].origin].v; // Direction Vector from Origin Group to Destination Origin Group Vec3f dirvect = dest - center; // Distance between those 2 pos float dista = fdist(dest, center); float tot = dista; float divdist = 1.f / dista; // Vector Normalization dirvect *= divdist; while(dista >= 0.f) { // Iterate along the whole distance // Compute required radius for this group and that pos float val = GetSphereRadiusForGroup(obj, center, dest, k, tot * 1.4f); if(val > 0.2f) { long idx = AddVertexToVertexList(obj, ¢er, k); if(idx > -1) AddCollisionSphere(obj, idx, val); val *= ( 1.0f / 2 ); } else { val = 0.15f; } float inc = val; dista -= inc; center += dirvect * inc; } } else { AddCollisionSphere(obj, obj->grouplist[k].origin, obj->grouplist[k].siz * 18.f); } } if(obj->sdata->spheres.empty() == 0) EERIE_COLLISION_SPHERES_Release(obj); }
// TODO move to destructor? EERIE_3DOBJ::~EERIE_3DOBJ() { free(originaltextures); originaltextures = NULL; if(ndata) { KillNeighbours(this); } if(pdata) { KillProgressiveData(this); } if(cdata) { KillClothesData(this); } EERIE_RemoveCedricData(this); EERIE_PHYSICS_BOX_Release(this); EERIE_COLLISION_SPHERES_Release(this); grouplist.clear(); linked.clear(); }