csBox3 operator * (const csBox3 &box1, const csBox3 &box2) { return csBox3 ( MAX (box1.minbox.x, box2.minbox.x), MAX (box1.minbox.y, box2.minbox.y), MAX (box1.minbox.z, box2.minbox.z), MIN (box1.maxbox.x, box2.maxbox.x), MIN (box1.maxbox.y, box2.maxbox.y), MIN (box1.maxbox.z, box2.maxbox.z)); }
csBox3 operator+ (const csBox3 &box, const csVector3 &point) { return csBox3 ( MIN (box.minbox.x, point.x), MIN (box.minbox.y, point.y), MIN (box.minbox.z, point.z), MAX (box.maxbox.x, point.x), MAX (box.maxbox.y, point.y), MAX (box.maxbox.z, point.z)); }
csBox3 csReversibleTransform::This2Other (const csBox3 &box) const { if (m_t2o.IsIdentity()) { csBox3 newBox (box); newBox.SetCenter (This2Other (box.GetCenter())); return newBox; } else { const csVector3 minA = box.Min (); const csVector3 maxA = box.Max (); csVector3 minB (v_o2t); csVector3 maxB (v_o2t); for (size_t i = 0; i < 3; ++i) { const csVector3 row = m_t2o.Row (i); for (size_t j = 0; j < 3; ++j) { float a = row[j] * minA[j]; float b = row[j] * maxA[j]; if (a < b) { minB[i] += a; maxB[i] += b; } else { minB[i] += b; maxB[i] += a; } } } return csBox3 (minB, maxB); } }
bool BgLoader::LoadZones(iStringArray* regions, bool loadMeshes) { // Firstly, get a list of all zones that should be loaded. csRefArray<Zone> newLoadedZones; for(size_t i=0; i<regions->GetSize(); ++i) { csRef<Zone> zone = zones.Get(zStringSet.Request(regions->Get(i)), csRef<Zone>()); if(zone.IsValid()) { newLoadedZones.Push(zone); } else { return false; } } // Next clean all sectors which shouldn't be loaded. for(size_t i=0; i<loadedZones.GetSize(); ++i) { bool found = false; for(size_t j=0; j<newLoadedZones.GetSize(); ++j) { if(loadedZones[i] == newLoadedZones[j]) { found = true; break; } } if(!found) { for(size_t j=0; j<loadedZones[i]->sectors.GetSize(); ++j) { CleanSector(loadedZones[i]->sectors[j]); } loadedZones.DeleteIndex(i); --i; } } // Now load all sectors which should be loaded. for(size_t i=0; i<newLoadedZones.GetSize(); ++i) { bool found = false; for(size_t j=0; j<loadedZones.GetSize(); ++j) { if(newLoadedZones[i] == loadedZones[j]) { found = true; break; } } if(!found) { loadedZones.Push(newLoadedZones[i]); for(size_t j=0; j<newLoadedZones[i]->sectors.GetSize(); ++j) { LoadSector(csBox3(), csBox3(), newLoadedZones[i]->sectors[j], (uint)-1, true, loadMeshes); } } else { for(size_t j=0; j<newLoadedZones[i]->sectors.GetSize(); ++j) { LoadSector(csBox3(), csBox3(), newLoadedZones[i]->sectors[j], (uint)-1, true, loadMeshes, true); } } } // Finally, clean up all sectors which were created but not checked for loading. for(size_t i=0; i<loadedZones.GetSize(); ++i) { for(size_t j=0; j<loadedZones[i]->sectors.GetSize(); ++j) { for(size_t k=0; k<loadedZones[i]->sectors[j]->activePortals.GetSize(); ++k) { if(!loadedZones[i]->sectors[j]->activePortals[k]->targetSector->checked) { CleanSector(loadedZones[i]->sectors[j]->activePortals[k]->targetSector); // TODO: improve this, it's a bit hacky. engine->GetMeshes()->Remove(loadedZones[i]->sectors[j]->activePortals[k]->mObject); loadedZones[i]->sectors[j]->activePortals[k]->pObject = NULL; loadedZones[i]->sectors[j]->activePortals[k]->mObject.Invalidate(); loadedZones[i]->sectors[j]->activePortals.Delete(loadedZones[i]->sectors[j]->activePortals[k]); --(loadedZones[i]->sectors[j]->objectCount); } } } } return true; }