void CityOnPlanet::Init() { /* Resolve city model numbers since it is a bit expensive */ if (!s_cityBuildingsInitted) { s_cityBuildingsInitted = true; for (int i=0; i<MAX_BUILDING_LISTS; i++) { lookupBuildingListModels(&s_buildingLists[i]); } } }
void CityOnPlanet::Init() { /* Resolve city model numbers since it is a bit expensive */ if (!s_cityBuildingsInitted) { s_cityBuildingsInitted = true; for (unsigned int i=0; i<COUNTOF(s_buildingLists); i++) { lookupBuildingListModels(&s_buildingLists[i]); } } }
CityOnPlanet::CityOnPlanet(Planet *planet, SpaceStation *station, Uint32 seed) { m_buildings.clear(); m_planet = planet; m_frame = planet->GetFrame(); m_detailLevel = Pi::detail.cities; /* Resolve city model numbers since it is a bit expensive */ if (!s_cityBuildingsInitted) { s_cityBuildingsInitted = true; for (int i=0; i<MAX_BUILDING_LISTS; i++) { lookupBuildingListModels(&s_buildingLists[i]); } } Aabb aabb; station->GetAabb(aabb); matrix4x4d m; station->GetRotMatrix(m); vector3d mx = m*vector3d(1,0,0); vector3d mz = m*vector3d(0,0,1); MTRand rand; rand.seed(seed); vector3d p = station->GetPosition(); vector3d p1, p2, p3, p4; double sizex = START_SEG_SIZE;// + rand.Int32((int)START_SEG_SIZE); double sizez = START_SEG_SIZE;// + rand.Int32((int)START_SEG_SIZE); // always have random shipyard buildings around the space station cityflavour[0].buildingListIdx = 0;//2; cityflavour[0].center = p; cityflavour[0].size = 500; for (int i=1; i<CITYFLAVOURS; i++) { cityflavour[i].buildingListIdx = MAX_BUILDING_LISTS>1 ? rand.Int32(MAX_BUILDING_LISTS-1) : 0; citybuildinglist_t *blist = &s_buildingLists[cityflavour[i].buildingListIdx]; double a = rand.Int32(-1000,1000); double b = rand.Int32(-1000,1000); cityflavour[i].center = p + a*mx + b*mz; cityflavour[i].size = rand.Int32(int(blist->minRadius), int(blist->maxRadius)); } for (int side=0; side<4; side++) { /* put buildings on all sides of spaceport */ switch(side) { case 3: p1 = p + mx*(aabb.min.x) + mz*aabb.min.z; p2 = p + mx*(aabb.min.x) + mz*(aabb.min.z-sizez); p3 = p + mx*(aabb.min.x+sizex) + mz*(aabb.min.z-sizez); p4 = p + mx*(aabb.min.x+sizex) + mz*(aabb.min.z); break; case 2: p1 = p + mx*(aabb.min.x-sizex) + mz*aabb.max.z; p2 = p + mx*(aabb.min.x-sizex) + mz*(aabb.max.z-sizez); p3 = p + mx*(aabb.min.x) + mz*(aabb.max.z-sizez); p4 = p + mx*(aabb.min.x) + mz*(aabb.max.z); break; case 1: p1 = p + mx*(aabb.max.x-sizex) + mz*aabb.max.z; p2 = p + mx*(aabb.max.x) + mz*aabb.max.z; p3 = p + mx*(aabb.max.x) + mz*(aabb.max.z+sizez); p4 = p + mx*(aabb.max.x-sizex) + mz*(aabb.max.z+sizez); break; default: case 0: p1 = p + mx*aabb.max.x + mz*aabb.min.z; p2 = p + mx*(aabb.max.x+sizex) + mz*aabb.min.z; p3 = p + mx*(aabb.max.x+sizex) + mz*(aabb.min.z+sizez); p4 = p + mx*aabb.max.x + mz*(aabb.min.z+sizez); break; } PutCityBit(rand, m, p1, p2, p3, p4); } AddStaticGeomsToCollisionSpace(); }