| 288 | } |
| 289 | |
| 290 | void CRenderLayerTile::RenderTileLayer(const ColorRGBA &Color, const CRenderLayerParams &Params, CTileLayerVisuals *pTileLayerVisuals) |
| 291 | { |
| 292 | CTileLayerVisuals &Visuals = pTileLayerVisuals ? *pTileLayerVisuals : m_VisualTiles.value(); |
| 293 | if(Visuals.m_BufferContainerIndex == -1) |
| 294 | return; // no visuals were created |
| 295 | |
| 296 | float ScreenX0, ScreenY0, ScreenX1, ScreenY1; |
| 297 | Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); |
| 298 | |
| 299 | int ScreenRectY0 = std::floor(ScreenY0 / 32); |
| 300 | int ScreenRectX0 = std::floor(ScreenX0 / 32); |
| 301 | int ScreenRectY1 = std::ceil(ScreenY1 / 32); |
| 302 | int ScreenRectX1 = std::ceil(ScreenX1 / 32); |
| 303 | |
| 304 | if(IsVisibleInClipRegion(m_LayerClip)) |
| 305 | { |
| 306 | // create the indice buffers we want to draw -- reuse them |
| 307 | std::vector<char *> vpIndexOffsets; |
| 308 | std::vector<unsigned int> vDrawCounts; |
| 309 | |
| 310 | int X0 = std::max(ScreenRectX0, 0); |
| 311 | int X1 = std::min(ScreenRectX1, (int)Visuals.m_Width); |
| 312 | int XR = X1 == std::numeric_limits<int>::min() ? X1 : X1 - 1; |
| 313 | if(X0 <= XR) |
| 314 | { |
| 315 | int Y0 = std::max(ScreenRectY0, 0); |
| 316 | int Y1 = std::min(ScreenRectY1, (int)Visuals.m_Height); |
| 317 | |
| 318 | unsigned long long Reserve = absolute(Y1 - Y0) + 1; |
| 319 | vpIndexOffsets.reserve(Reserve); |
| 320 | vDrawCounts.reserve(Reserve); |
| 321 | |
| 322 | for(int y = Y0; y < Y1; ++y) |
| 323 | { |
| 324 | dbg_assert(Visuals.m_vTilesOfLayer[y * Visuals.m_Width + XR].IndexBufferByteOffset() >= Visuals.m_vTilesOfLayer[y * Visuals.m_Width + X0].IndexBufferByteOffset(), "Tile offsets are not monotone."); |
| 325 | unsigned int NumVertices = ((Visuals.m_vTilesOfLayer[y * Visuals.m_Width + XR].IndexBufferByteOffset() - Visuals.m_vTilesOfLayer[y * Visuals.m_Width + X0].IndexBufferByteOffset()) / sizeof(unsigned int)) + (Visuals.m_vTilesOfLayer[y * Visuals.m_Width + XR].DoDraw() ? 6lu : 0lu); |
| 326 | |
| 327 | if(NumVertices) |
| 328 | { |
| 329 | vpIndexOffsets.push_back((offset_ptr_size)Visuals.m_vTilesOfLayer[y * Visuals.m_Width + X0].IndexBufferByteOffset()); |
| 330 | vDrawCounts.push_back(NumVertices); |
| 331 | } |
| 332 | } |
| 333 | |
| 334 | int DrawCount = vpIndexOffsets.size(); |
| 335 | if(DrawCount != 0) |
| 336 | { |
| 337 | Graphics()->RenderTileLayer(Visuals.m_BufferContainerIndex, Color, vpIndexOffsets.data(), vDrawCounts.data(), DrawCount); |
| 338 | } |
| 339 | } |
| 340 | } |
| 341 | |
| 342 | if(Params.m_RenderTileBorder && (ScreenRectX1 > (int)Visuals.m_Width || ScreenRectY1 > (int)Visuals.m_Height || ScreenRectX0 < 0 || ScreenRectY0 < 0)) |
| 343 | { |
| 344 | RenderTileBorder(Color, ScreenRectX0, ScreenRectY0, ScreenRectX1, ScreenRectY1, &Visuals); |
| 345 | } |
| 346 | |
| 347 | if(Params.m_DebugRenderTileClips && m_LayerClip.has_value()) |
nothing calls this directly
no test coverage detected