| 31 | using TEN::Memory::LinearArrayBuffer; |
| 32 | |
| 33 | void Renderer::CollectRooms(RenderView& renderView, bool onlyRooms) |
| 34 | { |
| 35 | constexpr auto VIEW_PORT = Vector4(-1.0f, -1.0f, 1.0f, 1.0f); |
| 36 | |
| 37 | _visitedRoomsStack.clear(); |
| 38 | |
| 39 | for (int i = 0; i < g_Level.Rooms.size(); i++) |
| 40 | { |
| 41 | auto& room = _rooms[i]; |
| 42 | |
| 43 | room.ItemsToDraw.clear(); |
| 44 | room.EffectsToDraw.clear(); |
| 45 | room.StaticsToDraw.clear(); |
| 46 | room.LightsToDraw.clear(); |
| 47 | room.Decals.clear(); |
| 48 | room.Visited = false; |
| 49 | room.ViewPort = VIEW_PORT; |
| 50 | |
| 51 | for (auto& door : room.Doors) |
| 52 | { |
| 53 | door.Visited = false; |
| 54 | door.InvisibleFromCamera = false; |
| 55 | door.DotProduct = FLT_MAX; |
| 56 | } |
| 57 | } |
| 58 | |
| 59 | GetVisibleRooms(NO_VALUE, renderView.Camera.RoomNumber, VIEW_PORT, false, 0, onlyRooms, renderView); |
| 60 | |
| 61 | _invalidateCache = false; |
| 62 | |
| 63 | bool laraFound = false; |
| 64 | |
| 65 | for (auto* roomPtr : renderView.RoomsToDraw) |
| 66 | { |
| 67 | // Prepare real DX scissor test rectangle. |
| 68 | roomPtr->ClipBounds.Left = (roomPtr->ViewPort.x + 1.0f) * _screenWidth * 0.5f; |
| 69 | roomPtr->ClipBounds.Bottom = (1.0f - roomPtr->ViewPort.y) * _screenHeight * 0.5f; |
| 70 | roomPtr->ClipBounds.Right = (roomPtr->ViewPort.z + 1.0f) * _screenWidth * 0.5f; |
| 71 | roomPtr->ClipBounds.Top = (1.0f - roomPtr->ViewPort.w) * _screenHeight * 0.5f; |
| 72 | |
| 73 | // Indicate that Lara object is found. |
| 74 | if (roomPtr->RoomNumber == LaraItem->RoomNumber) |
| 75 | laraFound = true; |
| 76 | } |
| 77 | |
| 78 | // HACK: Force adding Lara's room to room list, in case she is in one of camera's neighbor rooms. |
| 79 | if (!laraFound && Contains(_rooms[renderView.Camera.RoomNumber].Neighbors, (int)LaraItem->RoomNumber)) |
| 80 | { |
| 81 | renderView.RoomsToDraw.push_back(&_rooms[LaraItem->RoomNumber]); |
| 82 | CollectItems(LaraItem->RoomNumber, renderView); |
| 83 | } |
| 84 | |
| 85 | // Collect fog bulbs. |
| 86 | std::vector<RendererFogBulb> tempFogBulbs; |
| 87 | tempFogBulbs.reserve(MAX_FOG_BULBS_DRAW); |
| 88 | |
| 89 | for (auto& light : _dynamicLights[_dynamicLightList]) |
| 90 | { |
nothing calls this directly
no test coverage detected