/** * @brief Calculates the routing of a map * @sa CheckUnit * @sa CheckConnections * @sa ProcessWorldModel */ void DoRouting (void) { int i; byte* data; vec3_t mins, maxs; pos3_t pos; /* Turn on trace debugging if requested. */ if (config.generateDebugTrace) debugTrace = true; /* Record the current mapTiles[0] state so we can remove all CLIPS when done. */ PushInfo(); /* build tracing structure */ EmitBrushes(); EmitPlanes(); /** This is needed for tracing to work!!! */ /** @note LEVEL_TRACING is not an actual level */ MakeTracingNodes(LEVEL_ACTORCLIP + 1); /* Reset the whole block of map data to 0 */ Nmap.init(); /* get world bounds for optimizing */ RT_GetMapSize(&mapTiles, mins, maxs); /* Com_Printf("Vectors: (%f, %f, %f) to (%f, %f, %f)\n", mins[0], mins[1], mins[2], maxs[0], maxs[1], maxs[2]); */ VecToPos(mins, wpMins); VecToPos(maxs, wpMaxs); /* Verify the world extents are not lopsided. */ assert(wpMins[0] <= wpMaxs[0]); assert(wpMins[1] <= wpMaxs[1]); assert(wpMins[2] <= wpMaxs[2]); /* scan area heights */ RunSingleThreadOn(CheckUnitThread, PATHFINDING_WIDTH * PATHFINDING_WIDTH * ACTOR_MAX_SIZE, config.verbosity >= VERB_NORMAL, "UNITCHECK"); /* scan connections */ RunSingleThreadOn(CheckConnectionsThread, PATHFINDING_WIDTH * PATHFINDING_WIDTH * (CORE_DIRECTIONS / (1 + RT_IS_BIDIRECTIONAL)) * (ACTOR_MAX_SIZE), config.verbosity >= VERB_NORMAL, "CONNCHECK"); /* Try to shrink the world bounds along the x and y coordinates */ for (i = 0; i < 2; i++) { /* for x and y, but not z */ int j = i ^ 1; /* if i points to x, j points to y and vice versa */ /* Increase the mins */ while (wpMaxs[j] > wpMins[j]) { VectorSet(pos, wpMins[0], wpMins[1], wpMaxs[2]); for (pos[i] = wpMins[i]; pos[i] <= wpMaxs[i]; pos[i]++) { /* for all cells in an x or y row */ if (Nmap.getFloor(1, pos[0], pos[1], wpMaxs[2]) + wpMaxs[2] * CELL_HEIGHT != -1) /* no floor ? */ break; } if (pos[i] <= wpMaxs[i]) /* found a floor before the end of the row ? */ break; /* break while */ wpMins[j]++; /* if it was an x-row, increase y-value of mins and vice versa */ } /* Decrease the maxs */ while (wpMaxs[j] > wpMins[j]) { VectorCopy(wpMaxs, pos); for (pos[i] = wpMins[i]; pos[i] <= wpMaxs[i]; pos[i]++) { if (Nmap.getFloor(1, pos[0], pos[1], wpMaxs[2]) + wpMaxs[2] * CELL_HEIGHT != -1) break; } if (pos[i] <= wpMaxs[i]) break; wpMaxs[j]--; } } /* Output the floor trace file if set */ if (config.generateTraceFile) { RT_WriteCSVFiles(Nmap, baseFilename, wpMins, wpMaxs); } /* store the data */ data = curTile->routedata; for (i = 0; i < 3; i++) wpMins[i] = LittleLong(wpMins[i]); data = CompressRouting((byte*)wpMins, data, sizeof(wpMins)); for (i = 0; i < 3; i++) wpMaxs[i] = LittleLong(wpMaxs[i]); data = CompressRouting((byte*)wpMaxs, data, sizeof(wpMaxs)); data = CompressRouting((byte*)&Nmap, data, sizeof(Nmap)); curTile->routedatasize = data - curTile->routedata; /* Ensure that we did not exceed our allotment of memory for this data. */ assert(curTile->routedatasize <= MAX_MAP_ROUTING); /* Remove the CLIPS fom the tracing structure by resetting it. */ PopInfo(); }
EntityController::EntityController(EntityManager & e, StaticMeshManager * mesh, TransformManager * trans, CameraManager * cam, MaterialManager * mat, OverlayManager * o, EventManager * _event, LightManager * l, BoundingManager * b, TextManager * text, LightningManager * lightning, DecalManager* decal, AnimationManager* anim, ProximityLightningManager* proximityLightning) : _entity(e), _mesh(mesh), _transform(trans), _camera(cam), _material(mat), _overlay(o), _event(_event), _light(l), _bounding(b), _text(text), _lightning(lightning), _decal(decal), _animation(anim), _proximityLightning(proximityLightning), _popInfo(PopInfo()) { }