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, &center, 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);
}
Example #2
0
// 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();
}