MCPcopy Create free account
hub / github.com/ddnet/ddnet / RenderTileLayer

Method RenderTileLayer

src/game/map/render_layer.cpp:290–354  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

288}
289
290void 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())

Callers

nothing calls this directly

Calls 9

GraphicsFunction · 0.85
absoluteFunction · 0.85
str_formatFunction · 0.85
RenderMapFunction · 0.85
GetScreenMethod · 0.80
IndexBufferByteOffsetMethod · 0.80
DoDrawMethod · 0.80
RenderDebugClipMethod · 0.80
ColorRGBAClass · 0.50

Tested by

no test coverage detected