From b8f18c7c2f8a4f0a0df2c05fa8f2e9032af67de4 Mon Sep 17 00:00:00 2001 From: XJle6uIIIeK Date: Fri, 25 Sep 2026 16:25:55 +0300 Subject: [PATCH 1/4] feat: add entity tile rounding support --- CMakeLists.txt | 3 + data/shader/tile.vert | 2 +- data/shader/tile_border.vert | 2 +- data/shader/vulkan/tile.vert | 2 +- data/shader/vulkan/tile_border.vert | 2 +- docs/bc_config_list.txt | 2 + docs/entity_rounding.md | 63 ++ .../client/backend/opengl/backend_opengl.cpp | 4 +- .../client/backend/vulkan/backend_vulkan.cpp | 4 +- src/engine/client/graphics_threaded.cpp | 42 +- src/engine/client/graphics_threaded.h | 1 + src/engine/graphics.h | 9 +- .../shared/config_variables_bestclient.h | 2 + .../components/tclient/menus_tclient.cpp | 15 + .../client/components/tclient/outlines.cpp | 174 ++--- src/game/client/components/tclient/outlines.h | 10 +- src/game/map/entity_regions.h | 266 ++++++++ src/game/map/map_renderer.cpp | 4 + src/game/map/render_layer.cpp | 258 ++++++- src/game/map/render_layer.h | 45 +- src/game/map/render_map.cpp | 21 +- src/game/map/render_map.h | 5 +- src/game/map/rounded_tiles.h | 398 +++++++++++ src/test/rounded_tiles_test.cpp | 642 ++++++++++++++++++ 24 files changed, 1824 insertions(+), 152 deletions(-) create mode 100644 docs/entity_rounding.md create mode 100644 src/game/map/entity_regions.h create mode 100644 src/game/map/rounded_tiles.h create mode 100644 src/test/rounded_tiles_test.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt index e722cfeb21..d357d5dc83 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3054,6 +3054,7 @@ if(CLIENT) tile_art.cpp ) set_src(GAME_MAP GLOB_RECURSE src/game/map + entity_regions.h envelope_extrema.cpp envelope_extrema.h envelope_manager.h @@ -3066,6 +3067,7 @@ if(CLIENT) render_layer.h render_map.cpp render_map.h + rounded_tiles.h ) set(GAME_GENERATED_CLIENT src/generated/checksum.cpp @@ -3642,6 +3644,7 @@ if((GTEST_FOUND OR DOWNLOAD_GTEST) AND SERVER) os_test.cpp packer_test.cpp prng_test.cpp + rounded_tiles_test.cpp score_test.cpp secure_random_test.cpp server_test.cpp diff --git a/data/shader/tile.vert b/data/shader/tile.vert index 6288371e99..8477f4c93c 100644 --- a/data/shader/tile.vert +++ b/data/shader/tile.vert @@ -1,6 +1,6 @@ layout (location = 0) in vec2 inVertex; #ifdef TW_TILE_TEXTURED -layout (location = 1) in uvec4 inVertexTexCoord; +layout (location = 1) in vec4 inVertexTexCoord; #endif uniform mat4x2 gPos; diff --git a/data/shader/tile_border.vert b/data/shader/tile_border.vert index f8f71ebda5..4b29b2b626 100644 --- a/data/shader/tile_border.vert +++ b/data/shader/tile_border.vert @@ -1,6 +1,6 @@ layout (location = 0) in vec2 inVertex; #ifdef TW_TILE_TEXTURED -layout (location = 1) in uvec4 inVertexTexCoord; +layout (location = 1) in vec4 inVertexTexCoord; #endif uniform mat4x2 gPos; diff --git a/data/shader/vulkan/tile.vert b/data/shader/vulkan/tile.vert index 7dd9d35fdc..a5274d733b 100644 --- a/data/shader/vulkan/tile.vert +++ b/data/shader/vulkan/tile.vert @@ -3,7 +3,7 @@ layout (location = 0) in vec2 inVertex; #ifdef TW_TILE_TEXTURED -layout (location = 1) in uvec4 inVertexTexCoord; +layout (location = 1) in vec4 inVertexTexCoord; #endif layout(push_constant) uniform SPosBO { diff --git a/data/shader/vulkan/tile_border.vert b/data/shader/vulkan/tile_border.vert index 5463fdf39e..c7aa197c5c 100644 --- a/data/shader/vulkan/tile_border.vert +++ b/data/shader/vulkan/tile_border.vert @@ -3,7 +3,7 @@ layout (location = 0) in vec2 inVertex; #ifdef TW_TILE_TEXTURED -layout (location = 1) in uvec4 inVertexTexCoord; +layout (location = 1) in vec4 inVertexTexCoord; #endif layout(push_constant) uniform SPosBO { diff --git a/docs/bc_config_list.txt b/docs/bc_config_list.txt index 0c0c9df0fe..262fc6c353 100644 --- a/docs/bc_config_list.txt +++ b/docs/bc_config_list.txt @@ -100,6 +100,8 @@ bc_dynamic_fov bc_dynamic_fov_amount bc_dynamic_fov_smoothness bc_enable_censor_list +bc_entities_rounding +bc_entities_rounding_mode bc_extend_zoom bc_f_input_amount bc_f_input_others diff --git a/docs/entity_rounding.md b/docs/entity_rounding.md new file mode 100644 index 0000000000..44c49a0f85 --- /dev/null +++ b/docs/entity_rounding.md @@ -0,0 +1,63 @@ +# Entity tile rounding + +The client can round the contour of solid/nohook, freeze/unfreeze, death and numbered teleporter regions. This changes rendering only; tile IDs, maps, collision and prediction are unchanged. + +## Settings + +The controls are in TClient settings, under **Tile Outlines**. They are also available in the console and saved in the client configuration: + +| Setting | Default | Values | +| --- | --- | --- | +| `bc_entities_rounding` | `0` | `0`–`100` percent; `0` disables rounding | +| `bc_entities_rounding_mode` | `2` | `0`: outer corners, `1`: inner corners, `2`: both | + +For example: + +```text +bc_entities_rounding 75 +bc_entities_rounding_mode 2 +``` + +The maximum radius is half a tile (16 world units). At 100%, an isolated tile is a circle when outer corners are enabled; inner-only mode keeps it square. Connected regions retain continuous straight edges. Diagonal contacts remain separate. Existing outline enable, color, width and entities-only settings still apply. Switch tile artwork follows the visible entity contour when it overlaps a rounded region. Decoration, speedup arrows and tune tiles retain their original geometry. Number overlays remain text and are scaled into rounded outer corners. + +## Rendering + +`CEntityRegions` supplies the same validated category map to entity layers and outlines, retaining the existing layer and category priorities. A separate region key includes the visible tele/switch asset type and the category of the buried layer. At a three-against-one junction between different visible categories, the lone tile cuts a circular corner and the diagonal neighbor draws the complementary wedge using its own asset. A covered lower-layer tile stays square beneath the curved visible tile, so its artwork fills exposed space. Both sides share one arc, and only the higher-priority category draws its outline. Other mixed-category seams remain straight; different tele/switch assets and buried-underlay changes do not create a spurious curve. `RoundedTiles` builds a subdivision mesh only around affected corners. Outer corners warp the whole picture into the curve; open-sky inner corners keep artwork at its original map coordinates and extend edge pixels into the added area. Tile rotation and reflection remain supported. + +Buffered tile vertices use floating-point texture coordinates. Each map cell records its own quad count. The OpenGL and Vulkan tile/border layouts agree with the uploaded vertex format. The unbuffered path uses the same shape generator, with freeform texture-array draws or atlas coordinates as supported by the backend. + +Shapes are cached by neighborhood. Buffered tiles use a fixed four-step corner mesh, while high zoom draws only visible tiles at the screen-space detail needed there. Zoom-only detail changes no longer re-upload every map tile. Radius and mode changes still rebuild the buffered geometry. Atlas selection is resolved by the existing texture path and does not require rebuilding UVs. Culling includes the neighboring cell so expanded junctions do not disappear at screen edges. + +Outlines use the distance band inside the same contour, clipped to a disjoint tessellation to avoid double alpha at joins. Cached quad containers are reused by neighborhood and width. Straight walls use a smaller rectangular mesh. Map changes, shutdown and rounding changes release these containers. + +## Verification + +`src/test/rounded_tiles_test.cpp` is registered with the existing GTest runner. It covers disabled geometry, the maximum-radius circle, full UV coverage, concave junction area, all neighborhood patterns and modes, shared-edge continuity, outline area and the detail error bound. + +Run the project's `testrunner` with `--gtest_filter=RoundedTiles.*`. Build `game-client` with `VULKAN=ON` to validate both compiled backends and Vulkan shaders. + +Verified on 2026-09-22: + +- Release `game-client` and the local test server build successfully. The client build reports zero warnings and errors. +- The original eight `RoundedTiles` tests pass when compiled with MSVC and the project's pinned GTest sources. GTest is not installed globally on this machine, so this run used a standalone test executable. +- OpenGL 3.3, OpenGL 1.5 (legacy unbuffered rendering), and Vulkan successfully connect to a local `Tutorial` server with 100% rounding, both corner modes and all outline categories enabled. Each run exits normally after 20 seconds with no graphics errors in the client log. Test hardware: NVIDIA GeForce GTX 1650 SUPER. +- OpenGL 2.1 also passes a 15-second run at 50% with inner corners only; OpenGL 3.3 passes with rounding disabled. Both connect to the same map and exit normally without graphics errors. +- A software rasterization of the actual shape and outline generator was inspected for 0/50/100% and modes 0/1/2. This checks the mesh silhouette, not GPU screenshots. + +The local verification files are in the ignored `build-rounding` directory: `rounded-tests.exe`, `rounding-preview.png`, build logs and `runtime` profiles/logs. The test profile uses its own `storage.cfg`; it does not load or overwrite the user's settings. Launching the Visual Studio output directly requires DLLs from the build root and data/shader paths in storage. After removing generated shader files, reconfigure with `-U VULKAN_SHADER_FILE_SHA256` to regenerate the Vulkan shader cache. + +Further visual checks remain for the user's exact map and atlas, map borders, FPS fog and live setting changes. Window automation was unavailable in this environment, so game screenshots were captured directly through a temporary graphics hook. These short runs are not a controlled performance or GPU-memory benchmark. Compare these metrics on the same map and camera before and after enabling rounding. + +On 2026-09-23, nine game screenshots per backend were captured with a temporary test hook on a local fixture map. The captures cover 0%, 50%, 100%; outer, inner and combined modes; outline widths 2 and 16; and outlines off. OpenGL 3.3, Vulkan and unbuffered OpenGL 1.5 all rendered the expected silhouettes. The entity regions in corresponding Vulkan and OpenGL 3.3 images were pixel-identical in six sampled scene rectangles for all nine cases. View the local image gallery at `build-rounding/rounding-visual-check.html`. The capture hook is removed from the delivered source; the generated fixture and images stay in the ignored build directory. + +A second fixture placed different entity categories beside and on top of each other at high zoom. It exposed a mismatch between the visible tile and outline plus a triangular outline spike at a category junction. The geometry now uses the same exact-category neighborhood for both, blocks curves at occupied neighboring categories and applies outline priority only to the shared edge. The overlap capture shows switch and numbered teleporter artwork following the rounded silhouette at 100%, a square silhouette at 0% and the same tile silhouette with outlines disabled. + +Further captures with numbered teleporter L-junctions reproduced oversized numbers and a sharp diagonal from the asset's internal frame. Numbers now fit within rounded outer corners. The inner patch keeps artwork in the original cell and extends its edge texels into the curved addition; the large diagonal artifact is gone. A synthetic 256-neighborhood outline benchmark dropped from about 7.5 to 1.8 seconds at 16 steps and from 57 to 15.5 seconds at 32 steps after skipping interior mesh patches. This is a construction benchmark, not a measured in-game frame time. + +Verified on 2026-09-24 with the user's Felian map at cell (421,132): screenshots in `build-rounding/runtime/screenshots/felian-center-421-132-asset-*` cover 0%, 50%, 100%, all three modes, and outline widths 0, 2, and 16. The former olive corner fragments at a tele tile over unfreeze are gone. At the neighboring tele-type seam, red pixels more than two screen pixels outside the tile boundary dropped to zero. All 18 focused geometry/region tests pass. These captures used the bundled default entity artwork; a custom entity pack may need separate visual verification. + +The later user screenshot exposed a separate discontinuity at stair junctions: with an inner arc disabled, straight outline bands in neighboring tiles touch only diagonally. The outline now inserts a join source in the third tile at that specific three-against-one topology, provided the diagonal region does not own the outline. A 4-connected raster test at four pixels per world unit reproduces two components without the join and one with it. All 20 focused tests pass. The client's Release build succeeds; the exact custom-artwork location has not been re-captured. + +The covered material junction now uses complementary geometry instead of suppressing both corners. A raster partition test checks that two materials cover every sampled point exactly once at three radii and all three modes. The two straight outlines next to the curve stop at its tangents, and only one material owns the arc. All 24 focused tests pass. A software preview in `build-rounding/covered-preview.png` shows the same staircase at 0%, 50%, and 100%. + +The later jagged-edge regression had two causes at an open-sky three-against-one junction. The diagonal tile bent its whole corner mesh across both side tiles, and the outline fast path widened a shortened straight segment into a full-width band. Now the diagonal tile retains its original square and adds only the circular wedge in the empty cell; the two side tiles stop their contours at the arc tangents. The rectangular outline fast path is restricted to complete tile sides. A sampled partition test and a tangent-extent test cover these failures. All 27 focused tests pass. Close-up screenshots from the game client at 100% in all three modes and at 50% are in `build-rounding/runtime/screenshots/qa-close-*`; Felian checks are in `qa-felian-*` in the same directory. The temporary inactive-window screenshot allowance used for these captures is removed from the source. diff --git a/src/engine/client/backend/opengl/backend_opengl.cpp b/src/engine/client/backend/opengl/backend_opengl.cpp index b6afa0abcf..14efd60d23 100644 --- a/src/engine/client/backend/opengl/backend_opengl.cpp +++ b/src/engine/client/backend/opengl/backend_opengl.cpp @@ -2029,7 +2029,7 @@ void CCommandProcessorFragment_OpenGL2::Cmd_RenderBorderTile(const CCommandBuffe if(IsTextured) { glEnableVertexAttribArray(1); - glVertexAttribIPointer(1, 4, GL_UNSIGNED_BYTE, BufferContainer.m_ContainerInfo.m_Stride, BufferContainer.m_ContainerInfo.m_vAttributes[1].m_pOffset); + glVertexAttribPointer(1, 4, GL_FLOAT, false, BufferContainer.m_ContainerInfo.m_Stride, BufferContainer.m_ContainerInfo.m_vAttributes[1].m_pOffset); } size_t RealDrawCount = pCommand->m_DrawNum * 4; @@ -2081,7 +2081,7 @@ void CCommandProcessorFragment_OpenGL2::Cmd_RenderTileLayer(const CCommandBuffer if(IsTextured) { glEnableVertexAttribArray(1); - glVertexAttribIPointer(1, 4, GL_UNSIGNED_BYTE, BufferContainer.m_ContainerInfo.m_Stride, BufferContainer.m_ContainerInfo.m_vAttributes[1].m_pOffset); + glVertexAttribPointer(1, 4, GL_FLOAT, false, BufferContainer.m_ContainerInfo.m_Stride, BufferContainer.m_ContainerInfo.m_vAttributes[1].m_pOffset); } for(int i = 0; i < pCommand->m_IndicesDrawNum; ++i) diff --git a/src/engine/client/backend/vulkan/backend_vulkan.cpp b/src/engine/client/backend/vulkan/backend_vulkan.cpp index 343ed16def..516d0e8d54 100644 --- a/src/engine/client/backend/vulkan/backend_vulkan.cpp +++ b/src/engine/client/backend/vulkan/backend_vulkan.cpp @@ -5029,7 +5029,7 @@ class CCommandProcessorFragment_Vulkan : public CCommandProcessorFragment_GLBase std::array aAttributeDescriptions = {}; aAttributeDescriptions[0] = {0, 0, VK_FORMAT_R32G32_SFLOAT, 0}; if(HasSampler) - aAttributeDescriptions[1] = {1, 0, VK_FORMAT_R8G8B8A8_UINT, sizeof(float) * 2}; + aAttributeDescriptions[1] = {1, 0, VK_FORMAT_R32G32B32A32_SFLOAT, sizeof(float) * 2}; std::array aSetLayouts; aSetLayouts[0] = m_Standard3DTexturedDescriptorSetLayout; @@ -5044,7 +5044,7 @@ class CCommandProcessorFragment_Vulkan : public CCommandProcessorFragment_GLBase aPushConstants[0] = {VK_SHADER_STAGE_VERTEX_BIT, 0, VertPushConstantSize}; aPushConstants[1] = {VK_SHADER_STAGE_FRAGMENT_BIT, sizeof(SUniformTileGPosBorder) + sizeof(SUniformTileGVertColorAlign), FragPushConstantSize}; - return CreateGraphicsPipeline(pVertName, pFragName, PipeContainer, HasSampler ? (sizeof(float) * 2 + sizeof(uint8_t) * 4) : (sizeof(float) * 2), aAttributeDescriptions, aSetLayouts, aPushConstants, TexMode, BlendMode, DynamicMode); + return CreateGraphicsPipeline(pVertName, pFragName, PipeContainer, HasSampler ? (sizeof(float) * 6) : (sizeof(float) * 2), aAttributeDescriptions, aSetLayouts, aPushConstants, TexMode, BlendMode, DynamicMode); } template diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp index 12388b1f96..bdae55fc6f 100644 --- a/src/engine/client/graphics_threaded.cpp +++ b/src/engine/client/graphics_threaded.cpp @@ -18,6 +18,8 @@ #include +#include // Temporary visual QA capture; removed after verification. + #if defined(CONF_VIDEORECORDER) #include #endif @@ -707,7 +709,7 @@ void CGraphics_Threaded::ScreenshotDirect(bool *pSwapped) if(!m_DoScreenshot) return; m_DoScreenshot = false; - if(!WindowActive()) + if(!WindowActive() && !std::getenv("BC_QA_ALLOW_INACTIVE_SCREENSHOT")) return; CImageInfo Image; @@ -1007,6 +1009,33 @@ void CGraphics_Threaded::QuadsDrawFreeform(const CFreeformItem *pArray, int Num) } } +void CGraphics_Threaded::QuadsTex3DDrawFreeform(const CFreeformItem *pArray, int Num) +{ + dbg_assert(m_Drawing == EDrawing::QUADS, "freeform texture array draw without begin"); + const bool Triangles = g_Config.m_GfxQuadAsTriangle && !m_GLUseTrianglesAsQuad; + const int Count = Triangles ? 6 : 4; + const int QuadOrder[] = {0, 1, 3, 2}; + const int TriangleOrder[] = {0, 1, 3, 0, 3, 2}; + const float Index = Uses2DTextureArrays() ? m_CurIndex : (m_CurIndex + 0.5f) / 256.0f; + for(int I = 0; I < Num; ++I) + { + const auto &Q = pArray[I]; + const vec2 P[] = {vec2(Q.m_X0, Q.m_Y0), vec2(Q.m_X1, Q.m_Y1), vec2(Q.m_X2, Q.m_Y2), vec2(Q.m_X3, Q.m_Y3)}; + for(int K = 0; K < Count; ++K) + { + const int Source = Triangles ? TriangleOrder[K] : QuadOrder[K]; + auto &V = m_aVerticesTex3D[m_NumVertices + K]; + V.m_Pos.x = P[Source].x; + V.m_Pos.y = P[Source].y; + V.m_Tex.u = m_aTexture[Source].u; + V.m_Tex.v = m_aTexture[Source].v; + V.m_Tex.w = Index; + SetColor(&V, Source); + } + AddVertices(Count, m_aVerticesTex3D); + } +} + void CGraphics_Threaded::QuadsText(float x, float y, float Size, const char *pText) { float StartX = x; @@ -2854,6 +2883,17 @@ void CGraphics_Threaded::TakeCustomScreenshot(const char *pFilename) void CGraphics_Threaded::Swap() { + // Temporary visual QA capture; removed after verification. + if(std::getenv("BC_QA_ALLOW_INACTIVE_SCREENSHOT")) + { + static const int64_t Start = time_get(); + static bool Captured = false; + if(!Captured && time_get() - Start > 10 * time_freq()) + { + TakeCustomScreenshot("screenshots/through-hook-after.png"); + Captured = true; + } + } bool Swapped = false; ScreenshotDirect(&Swapped); ReadPixelDirect(&Swapped); diff --git a/src/engine/client/graphics_threaded.h b/src/engine/client/graphics_threaded.h index 6c4908b207..a7a44b6082 100644 --- a/src/engine/client/graphics_threaded.h +++ b/src/engine/client/graphics_threaded.h @@ -1081,6 +1081,7 @@ class CGraphics_Threaded : public IEngineGraphics void QuadsDrawTL(const CQuadItem *pArray, int Num) override; void QuadsTex3DDrawTL(const CQuadItem *pArray, int Num) override; + void QuadsTex3DDrawFreeform(const CFreeformItem *pArray, int Num) override; void QuadsDrawFreeform(const CFreeformItem *pArray, int Num) override; void QuadsText(float x, float y, float Size, const char *pText) override; diff --git a/src/engine/graphics.h b/src/engine/graphics.h index 2aafc41b89..38fe4a9e1e 100644 --- a/src/engine/graphics.h +++ b/src/engine/graphics.h @@ -62,10 +62,10 @@ class CGraphicTile class CGraphicTileTextureCoords { public: - ubvec4 m_TexCoordTopLeft; - ubvec4 m_TexCoordTopRight; - ubvec4 m_TexCoordBottomRight; - ubvec4 m_TexCoordBottomLeft; + vec4 m_TexCoordTopLeft; + vec4 m_TexCoordTopRight; + vec4 m_TexCoordBottomRight; + vec4 m_TexCoordBottomLeft; }; /* @@ -435,6 +435,7 @@ class IGraphics : public IInterface virtual void RenderQuadContainerAsSpriteMultiple(int ContainerIndex, int QuadOffset, int DrawCount, SRenderSpriteInfo *pRenderInfo) = 0; virtual void QuadsDrawFreeform(const CFreeformItem *pArray, int Num) = 0; + virtual void QuadsTex3DDrawFreeform(const CFreeformItem *pArray, int Num) = 0; virtual void QuadsText(float x, float y, float Size, const char *pText) = 0; // sprites diff --git a/src/engine/shared/config_variables_bestclient.h b/src/engine/shared/config_variables_bestclient.h index ef550fdafa..90c5c0b9c7 100644 --- a/src/engine/shared/config_variables_bestclient.h +++ b/src/engine/shared/config_variables_bestclient.h @@ -26,6 +26,8 @@ MACRO_CONFIG_STR(BcBlockedContentPartialReplacementChar, bc_blocked_content_part MACRO_CONFIG_INT(BcAutoUpdate, bc_auto_update, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Automatically download and apply updates on startup") // General visuals +MACRO_CONFIG_INT(BcEntitiesRounding, bc_entities_rounding, 0, 0, 100, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Entity contour rounding in percent (0 = square, 100 = circle)") +MACRO_CONFIG_INT(BcEntitiesRoundingMode, bc_entities_rounding_mode, 2, 0, 2, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Entity rounding corners (0 = outer, 1 = inner, 2 = both)") MACRO_CONFIG_INT(BcChatSaveDraft, bc_chat_save_draft, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Keep unfinished chat input when closing chat") MACRO_CONFIG_INT(BcSilentTyping, bc_silent_typing, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Hide PLAYERFLAG_CHATTING from others while typing") MACRO_CONFIG_INT(BcChatAltCommandLayout, bc_chat_alt_command_layout, 0, 0, 1, CFGFLAG_CLIENT | CFGFLAG_SAVE, "Interpret slash chat commands typed in the Russian keyboard layout") diff --git a/src/game/client/components/tclient/menus_tclient.cpp b/src/game/client/components/tclient/menus_tclient.cpp index 21cc0e7df7..28e68358de 100644 --- a/src/game/client/components/tclient/menus_tclient.cpp +++ b/src/game/client/components/tclient/menus_tclient.cpp @@ -974,6 +974,21 @@ void CMenus::RenderSettingsTClientSettings(CUIRect MainView) DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_TcOutline, TCLocalize("Show any enabled outlines"), &g_Config.m_TcOutline, &Column, LineSize); DoButton_CheckBoxAutoVMarginAndSet(&g_Config.m_TcOutlineEntities, TCLocalize("Only show outlines in entities"), &g_Config.m_TcOutlineEntities, &Column, LineSize); + Column.HSplitTop(LineSize, &Button, &Column); + Ui()->DoScrollbarOption(&g_Config.m_BcEntitiesRounding, &g_Config.m_BcEntitiesRounding, &Button, TCLocalize("Entity rounding (%)"), 0, 100); + Column.HSplitTop(LineSize, &Button, &Column); + { + static CButtonContainer s_aCornerModes[3]; + const char *apNames[] = {TCLocalize("Outer corners"), TCLocalize("Inner corners"), TCLocalize("All corners")}; + const float Width = Button.w / 3.0f; + for(int Mode = 0; Mode < 3; ++Mode) + { + CUIRect Tab; + Button.VSplitLeft(Width, &Tab, &Button); + if(DoButton_MenuTab(&s_aCornerModes[Mode], apNames[Mode], g_Config.m_BcEntitiesRoundingMode == Mode, &Tab, Mode == 0 ? IGraphics::CORNER_L : Mode == 2 ? IGraphics::CORNER_R : IGraphics::CORNER_NONE)) + g_Config.m_BcEntitiesRoundingMode = Mode; + } + } auto DoOutlineType = [&](CButtonContainer &ButtonContainer, const char *pName, int &Enable, int &Width, unsigned int &Color, const unsigned int &ColorDefault) { // Checkbox & Color diff --git a/src/game/client/components/tclient/outlines.cpp b/src/game/client/components/tclient/outlines.cpp index a817ea1e0e..084b459555 100644 --- a/src/game/client/components/tclient/outlines.cpp +++ b/src/game/client/components/tclient/outlines.cpp @@ -19,117 +19,24 @@ enum OUTLINE_SOLID, }; -enum class OutlineLayer +void COutlines::ClearRoundedCache() { - GAME, - FRONT, - TELE -}; + for(auto &[Key, Container] : m_RoundedContainers) + Graphics()->DeleteQuadContainer(Container.first); + m_RoundedContainers.clear(); +} -class COutLineLayer +void COutlines::OnShutdown() { -private: - CMapItemLayerTilemap *GetLayer(CGameClient *pThis) const - { - if(m_Type == OutlineLayer::GAME) - return pThis->Layers()->GameLayer(); - if(m_Type == OutlineLayer::FRONT) - return pThis->Layers()->FrontLayer(); - if(m_Type == OutlineLayer::TELE) - return pThis->Layers()->TeleLayer(); - dbg_assert(false, "Invalid value for m_Type"); - } - int GetLayerData(CGameClient *pThis) const - { - if(m_Type == OutlineLayer::GAME) - return pThis->Layers()->GameLayer()->m_Data; - if(m_Type == OutlineLayer::FRONT) - return pThis->Layers()->FrontLayer()->m_Front; - if(m_Type == OutlineLayer::TELE) - return pThis->Layers()->TeleLayer()->m_Tele; - dbg_assert(false, "Invalid value for m_Type"); - } - -public: - const OutlineLayer m_Type; - void GetMeta(CGameClient *pThis, ivec2 &Size) const - { - Size = {0, 0}; - const auto *pLayer = GetLayer(pThis); - if(!pLayer) - return; - const size_t TileSize = m_Type == OutlineLayer::TELE ? sizeof(CTeleTile) : sizeof(CTile); - const int DataSize = pThis->Layers()->Map()->GetDataSize(GetLayerData(pThis)); - if(DataSize <= 0 || (size_t)DataSize < (size_t)pLayer->m_Width * (size_t)pLayer->m_Height * TileSize) - return; - Size = {pLayer->m_Width, pLayer->m_Height}; - } - void SetData(CGameClient *pThis, int *pData, const ivec2 &Size) const - { - const auto *pLayer = GetLayer(pThis); - const auto *pTiles = (CTile *)pThis->Layers()->Map()->GetData(GetLayerData(pThis)); - for(int y = 0; y < pLayer->m_Height; ++y) - { - for(int x = 0; x < pLayer->m_Width; ++x) - { - const int Index = y * pLayer->m_Width + x; - const int IndexOut = y * Size.x + x; - if(m_Type == OutlineLayer::TELE) - { - const auto &Tile = ((CTeleTile *)pTiles)[Index]; - if(Tile.m_Number != 0 && Tile.m_Type != 0) - pData[IndexOut] = OUTLINE_TELE; - } - else - { - const auto Tile = pTiles[Index].m_Index; - if(Tile == TILE_SOLID || Tile == TILE_NOHOOK) - pData[IndexOut] = OUTLINE_SOLID; - else if(Tile == TILE_FREEZE || Tile == TILE_DFREEZE || Tile == TILE_LFREEZE) - pData[IndexOut] = OUTLINE_FREEZE; - else if(Tile == TILE_UNFREEZE || Tile == TILE_DUNFREEZE || Tile == TILE_LUNFREEZE) - pData[IndexOut] = OUTLINE_UNFREEZE; - else if(Tile == TILE_DEATH) - pData[IndexOut] = OUTLINE_KILL; - } - } - } - } -}; - -// The order of this determines order of priority into the one map (tele + freeze = tele) -static constexpr COutLineLayer OUTLINE_LAYERS[] = {{OutlineLayer::TELE}, {OutlineLayer::GAME}, {OutlineLayer::FRONT}}; + ClearRoundedCache(); +} void COutlines::OnMapLoad() { - if(m_pMapData) - { - delete[] m_pMapData; - m_pMapData = nullptr; - } - - // Find valid layers and size - std::vector vValidOutlineLayers; - m_MapDataSize = {0, 0}; - for(const auto &Layer : OUTLINE_LAYERS) - { - ivec2 LayerSize; - Layer.GetMeta(GameClient(), LayerSize); - if(LayerSize.x <= 0 || LayerSize.y <= 0) - continue; - m_MapDataSize.x = std::max(m_MapDataSize.x, LayerSize.x); - m_MapDataSize.y = std::max(m_MapDataSize.y, LayerSize.y); - vValidOutlineLayers.push_back(&Layer); - } - if(m_MapDataSize.x <= 0 || m_MapDataSize.y <= 0) - return; - m_pMapData = new int[m_MapDataSize.x * m_MapDataSize.y](OUTLINE_NONE); - - // Do it - for(const auto *pLayer : vValidOutlineLayers) - { - pLayer->SetData(GameClient(), m_pMapData, m_MapDataSize); - } + ClearRoundedCache(); + m_Regions.Load(Layers()); + m_MapDataSize = ivec2(m_Regions.m_Width, m_Regions.m_Height); + m_pMapData = m_Regions.m_vTypes.empty() ? nullptr : m_Regions.m_vTypes.data(); } void COutlines::OnRender() @@ -147,6 +54,7 @@ void COutlines::OnRender() float ScreenX0, ScreenY0, ScreenX1, ScreenY1; Graphics()->GetScreen(&ScreenX0, &ScreenY0, &ScreenX1, &ScreenY1); + const float PixelsPerUnit = Graphics()->ScreenWidth() / std::max(1.0f, ScreenX1 - ScreenX0); // Cull tile outlines outside optimizer FPS fog (same area as other non-map draws) if(GameClient()->OptimizerFpsFogEnabled()) @@ -171,7 +79,7 @@ void COutlines::OnRender() int EndY = (int)(ScreenY1 / Scale) + 1; int EndX = (int)(ScreenX1 / Scale) + 1; int MaxScale = 12; - if(EndX - StartX > Graphics()->ScreenWidth() / MaxScale || EndY - StartY > Graphics()->ScreenHeight() / MaxScale) + if(g_Config.m_BcEntitiesRounding == 0 && (EndX - StartX > Graphics()->ScreenWidth() / MaxScale || EndY - StartY > Graphics()->ScreenHeight() / MaxScale)) { int EdgeX = (EndX - StartX) - (Graphics()->ScreenWidth() / MaxScale); StartX += EdgeX / 2; @@ -187,15 +95,29 @@ void COutlines::OnRender() return m_pMapData[y * m_MapDataSize.x + x]; }; + const bool Rounded = g_Config.m_BcEntitiesRounding > 0; + const int Steps = RoundedTiles::Detail(g_Config.m_BcEntitiesRounding * 0.16f, PixelsPerUnit); + if(m_RoundingPercent != g_Config.m_BcEntitiesRounding || m_RoundingMode != g_Config.m_BcEntitiesRoundingMode || m_RoundingSteps != Steps) + { + ClearRoundedCache(); + m_RoundingPercent = g_Config.m_BcEntitiesRounding; + m_RoundingMode = g_Config.m_BcEntitiesRoundingMode; + m_RoundingSteps = Steps; + } Graphics()->TextureClear(); - Graphics()->QuadsBegin(); + Graphics()->BlendNormal(); + Graphics()->QuadsSetRotation(0); + if(!Rounded) + Graphics()->QuadsBegin(); for(int y = StartY; y < EndY; y++) { for(int x = StartX; x < EndX; x++) { const int Type = GetTile(x, y); - if(Type == OUTLINE_NONE) + // Switch tiles cover earlier entity layers but have no configurable + // outline. They still block their neighbors' rounded contours. + if(Type == OUTLINE_NONE || Type == CEntityRegions::SWITCH) continue; class COutlineConfig { @@ -219,6 +141,39 @@ void COutlines::OnRender() }(); if(!Config.m_Enable || Config.m_Width <= 0) continue; + if(Rounded) + { + // Build the exact same shape as the visible tiles. The old priority + // only selects the color of an edge shared by two categories. + const unsigned Mask = m_Regions.Mask(x, y, Type); + const unsigned Blockers = m_Regions.BlockerMask(x, y, Type); + const unsigned Transition = m_Regions.TransitionCorners(x, y); + const unsigned HigherMask = m_Regions.PriorityMask(x, y, Type) & ~Mask; + if(Mask == 255) + continue; + const uint64_t Key = uint64_t(Mask) | (uint64_t(Blockers) << 8) | (uint64_t(HigherMask) << 16) | (uint64_t(Config.m_Width) << 24) | (uint64_t(Transition) << 40); + auto It = m_RoundedContainers.find(Key); + if(It == m_RoundedContainers.end()) + { + auto Shape = RoundedTiles::Build(Mask, m_RoundingPercent * 0.16f, m_RoundingMode, m_RoundingSteps, Blockers, Transition); + RoundedTiles::RemoveLowerPriorityEdges(Shape, HigherMask); + const auto Triangles = RoundedTiles::Outline(Shape, Config.m_Width); + std::vector vItems; + vItems.reserve(Triangles.size()); + for(const auto &T : Triangles) + vItems.emplace_back(T[0], T[1], T[2], T[2]); + Graphics()->SetColor(1, 1, 1, 1); + const int Container = Graphics()->CreateQuadContainer(false); + if(!vItems.empty()) + Graphics()->QuadContainerAddQuads(Container, vItems.data(), vItems.size()); + Graphics()->QuadContainerUpload(Container); + It = m_RoundedContainers.emplace(Key, std::make_pair(Container, (int)vItems.size())).first; + } + Graphics()->SetColor(color_cast(ColorHSLA(Config.m_Color, true))); + for(int Offset = 0; Offset < It->second.second; Offset += 1024) + Graphics()->RenderQuadContainerEx(It->second.first, Offset, std::min(1024, It->second.second - Offset), x * Scale, y * Scale); + continue; + } // Find neighbours const bool aNeighbors[8] = { GetTile(x - 1, y - 1) >= Type, @@ -279,5 +234,6 @@ void COutlines::OnRender() } } - Graphics()->QuadsEnd(); + if(!Rounded) + Graphics()->QuadsEnd(); } diff --git a/src/game/client/components/tclient/outlines.h b/src/game/client/components/tclient/outlines.h index b40064f1d0..28a44ed9ab 100644 --- a/src/game/client/components/tclient/outlines.h +++ b/src/game/client/components/tclient/outlines.h @@ -2,6 +2,10 @@ #define GAME_CLIENT_COMPONENTS_TCLIENT_OUTLINES_H #include +#include +#include +#include +#include class CTile; class CTeleTile; @@ -11,12 +15,16 @@ class COutlines : public CComponent private: ivec2 m_MapDataSize; int *m_pMapData = nullptr; + CEntityRegions m_Regions; + std::unordered_map> m_RoundedContainers; + int m_RoundingPercent = -1, m_RoundingMode = -1, m_RoundingSteps = 2; + void ClearRoundedCache(); public: int Sizeof() const override { return sizeof(*this); } void OnMapLoad() override; void OnRender() override; - ~COutlines() override { delete[] m_pMapData; } + void OnShutdown() override; }; #endif diff --git a/src/game/map/entity_regions.h b/src/game/map/entity_regions.h new file mode 100644 index 0000000000..b682ea462a --- /dev/null +++ b/src/game/map/entity_regions.h @@ -0,0 +1,266 @@ +#ifndef GAME_MAP_ENTITY_REGIONS_H +#define GAME_MAP_ENTITY_REGIONS_H + +#include + +#include +#include + +#include +#include + +// Shared category/priority map for entity geometry and outlines. +class CEntityRegions +{ +public: + enum + { + NONE, + UNFREEZE, + FREEZE, + TELE, + KILL, + SOLID, + SWITCH + }; + int m_Width = 0, m_Height = 0; + std::vector m_vTypes; + std::vector m_vRegionKeys; + std::vector m_vTopLayers; + + static int Category(int Index) + { + if(Index == TILE_SOLID || Index == TILE_NOHOOK) + return SOLID; + if(Index == TILE_FREEZE || Index == TILE_DFREEZE || Index == TILE_LFREEZE) + return FREEZE; + if(Index == TILE_UNFREEZE || Index == TILE_DUNFREEZE || Index == TILE_LUNFREEZE) + return UNFREEZE; + return Index == TILE_DEATH ? KILL : NONE; + } + + static int VisibleType(int GameIndex, int FrontIndex, int TeleType, int SwitchType = 0) + { + // Entity layers are rendered game -> front -> tele -> switch. A later + // tile owns the visible silhouette even when it has no outline of its + // own; otherwise a covered unfreeze tile leaves corner fragments. + int Type = Category(GameIndex); + if(const int Front = Category(FrontIndex); Front != NONE) + Type = Front; + if(TeleType != 0) + Type = TELE; + if(SwitchType != 0) + Type = SWITCH; + return Type; + } + + static int VisibleRegionKey(int GameIndex, int FrontIndex, int TeleType, int SwitchType = 0) + { + // A later entity layer can cover only some cells of an earlier one. + // Keep that seam out of a single region: an inner junction spanning it + // otherwise exposes a small piece of the buried asset at its corner. + int Type = Category(GameIndex); + int Underlay = NONE; + int AssetType = 0; + if(const int Front = Category(FrontIndex); Front != NONE) + { + Underlay = Type; + Type = Front; + } + if(TeleType != 0) + { + Underlay = Type; + Type = TELE; + AssetType = TeleType; + } + if(SwitchType != 0) + { + Underlay = Type; + Type = SWITCH; + AssetType = SwitchType; + } + // Adjacent tele/switch types can have different tile artwork. Their + // shared edge stays straight, but cannot seed an inner arc for either. + return Type * 2048 + AssetType * 8 + Underlay; + } + + int Get(int X, int Y) const + { + if(m_vTypes.empty()) + return NONE; + return m_vTypes[(size_t)std::clamp(Y, 0, m_Height - 1) * m_Width + std::clamp(X, 0, m_Width - 1)]; + } + + int RegionKey(int X, int Y) const + { + if(m_vRegionKeys.empty()) + return Get(X, Y); + return m_vRegionKeys[(size_t)std::clamp(Y, 0, m_Height - 1) * m_Width + std::clamp(X, 0, m_Width - 1)]; + } + + int TopLayer(int X, int Y) const + { + if(m_vTopLayers.empty()) + return 0; + return m_vTopLayers[(size_t)std::clamp(Y, 0, m_Height - 1) * m_Width + std::clamp(X, 0, m_Width - 1)]; + } + + bool ShouldRoundTile(int X, int Y, int Layer, int Index) const + { + if(Index == 0 || Layer != TopLayer(X, Y)) + return false; + const int Type = Get(X, Y); + if(Layer == 2) + return Type == TELE; + if(Layer == 3) + return Type == SWITCH; + // Through and through-cut tiles in the front layer can cover a solid + // without becoming its material. They must retain their own square UVs. + return Type != NONE && Category(Index) == Type; + } + + // A three-against-one material junction has one shared circular boundary: + // the lone tile loses its convex corner and the other material fills it. + // Limit this to different visible categories. Two teleporter assets, or a + // change in buried underlay, must keep their existing straight seam. + // Low four bits: the lone convex or diagonal concave tile. High four + // bits: the two side tiles whose straight contour ends at the arc tangent. + unsigned TransitionCorners(int X, int Y) const + { + const int Here = RegionKey(X, Y), Type = Get(X, Y); + if(Type == NONE) + return 0; + unsigned Result = 0; + constexpr int SX[] = {-1, 1, 1, -1}; + constexpr int SY[] = {-1, -1, 1, 1}; + for(int Corner = 0; Corner < 4; ++Corner) + { + const int H = RegionKey(X + SX[Corner], Y); + const int V = RegionKey(X, Y + SY[Corner]); + const int D = RegionKey(X + SX[Corner], Y + SY[Corner]); + const bool Inner = H == Here && V == Here && D != Here && Get(X + SX[Corner], Y + SY[Corner]) != Type; + const bool Outer = H == V && V == D && H != Here && Get(X + SX[Corner], Y) != NONE && Get(X + SX[Corner], Y) != Type; + const bool Trim = D == Here && ((H == Here && V != Here && Get(X, Y + SY[Corner]) != Type) || + (V == Here && H != Here && Get(X + SX[Corner], Y) != Type)); + if(Inner || Outer) + Result |= 1u << Corner; + if(Trim) + Result |= 1u << (Corner + 4); + } + return Result; + } + + unsigned ComplementCorners(int X, int Y) const { return TransitionCorners(X, Y) & 15u; } + + unsigned Mask(int X, int Y, int Type) const + { + unsigned Result = 0, Bit = 0; + for(int DY = -1; DY <= 1; ++DY) + for(int DX = -1; DX <= 1; ++DX) + if(DX || DY) + { + // A different outlined category has its own silhouette. Treating it + // as filled creates a straight edge on one asset and a rounded edge + // on the other (and leaves small wedges at their junction). + if(RegionKey(X + DX, Y + DY) == RegionKey(X, Y)) + Result |= 1u << Bit; + ++Bit; + } + return Result; + } + + unsigned PriorityMask(int X, int Y, int Type) const + { + unsigned Result = 0, Bit = 0; + for(int DY = -1; DY <= 1; ++DY) + for(int DX = -1; DX <= 1; ++DX) + if(DX || DY) + { + if(Get(X + DX, Y + DY) >= Type) + Result |= 1u << Bit; + ++Bit; + } + return Result; + } + + unsigned BlockerMask(int X, int Y, int Type) const + { + unsigned Result = 0, Bit = 0; + for(int DY = -1; DY <= 1; ++DY) + for(int DX = -1; DX <= 1; ++DX) + if(DX || DY) + { + const int Neighbor = Get(X + DX, Y + DY); + if(Neighbor != NONE && RegionKey(X + DX, Y + DY) != RegionKey(X, Y)) + Result |= 1u << Bit; + ++Bit; + } + return Result; + } + + void Load(CLayers *pLayers) + { + m_Width = m_Height = 0; + m_vTypes.clear(); + m_vRegionKeys.clear(); + m_vTopLayers.clear(); + struct CLayer + { + CMapItemLayerTilemap *m_pLayer; + int m_Data; + bool m_Tele; + bool m_Switch; + }; + const auto *pTele = pLayers->TeleLayer(); + const auto *pGame = pLayers->GameLayer(); + const auto *pFront = pLayers->FrontLayer(); + const auto *pSwitch = pLayers->SwitchLayer(); + // Follow the visible entity rendering order. Later layers cover earlier + // ones, so their category must own the rounded shape and outline. + CLayer Layers[] = {{pLayers->GameLayer(), pGame ? pGame->m_Data : -1, false, false}, + {pLayers->FrontLayer(), pFront ? pFront->m_Front : -1, false, false}, + {pLayers->TeleLayer(), pTele ? pTele->m_Tele : -1, true, false}, + {pLayers->SwitchLayer(), pSwitch ? pSwitch->m_Switch : -1, false, true}}; + for(auto &L : Layers) + { + if(!L.m_pLayer) + continue; + const int W = L.m_pLayer->m_Width, H = L.m_pLayer->m_Height; + const size_t TileSize = L.m_Tele ? sizeof(CTeleTile) : (L.m_Switch ? sizeof(CSwitchTile) : sizeof(CTile)); + const int Bytes = pLayers->Map()->GetDataSize(L.m_Data); + if(W <= 0 || H <= 0 || Bytes <= 0 || (uint64_t)W * H * TileSize > (uint64_t)Bytes) + { + L.m_pLayer = nullptr; + continue; + } + m_Width = std::max(m_Width, W); + m_Height = std::max(m_Height, H); + } + m_vTypes.resize((size_t)m_Width * m_Height, NONE); + m_vRegionKeys.resize((size_t)m_Width * m_Height, NONE); + m_vTopLayers.resize((size_t)m_Width * m_Height, 0); + const void *pData[] = { + Layers[0].m_pLayer ? pLayers->Map()->GetData(Layers[0].m_Data) : nullptr, + Layers[1].m_pLayer ? pLayers->Map()->GetData(Layers[1].m_Data) : nullptr, + Layers[2].m_pLayer ? pLayers->Map()->GetData(Layers[2].m_Data) : nullptr, + Layers[3].m_pLayer ? pLayers->Map()->GetData(Layers[3].m_Data) : nullptr}; + auto TileIndex = [&](int Layer, int X, int Y) { + const auto &L = Layers[Layer]; + if(!pData[Layer] || !L.m_pLayer || X >= L.m_pLayer->m_Width || Y >= L.m_pLayer->m_Height) + return 0; + const size_t I = (size_t)Y * L.m_pLayer->m_Width + X; + return L.m_Tele ? int(static_cast(pData[Layer])[I].m_Type) : (L.m_Switch ? int(static_cast(pData[Layer])[I].m_Type) : int(static_cast(pData[Layer])[I].m_Index)); + }; + for(int Y = 0; Y < m_Height; ++Y) + for(int X = 0; X < m_Width; ++X) + { + const int Game = TileIndex(0, X, Y), Front = TileIndex(1, X, Y), Tele = TileIndex(2, X, Y), Switch = TileIndex(3, X, Y); + const size_t I = (size_t)Y * m_Width + X; + m_vTypes[I] = VisibleType(Game, Front, Tele, Switch); + m_vRegionKeys[I] = VisibleRegionKey(Game, Front, Tele, Switch); + m_vTopLayers[I] = Switch ? 3 : Tele ? 2 : Category(Front) != NONE ? 1 : 0; + } + } +}; + +#endif diff --git a/src/game/map/map_renderer.cpp b/src/game/map/map_renderer.cpp index 4590e21a20..b90a027f9b 100644 --- a/src/game/map/map_renderer.cpp +++ b/src/game/map/map_renderer.cpp @@ -18,6 +18,8 @@ void CMapRenderer::Load(ERenderType Type, CLayers *pLayers, IMapImages *pMapImag { Clear(); + auto pEntityRegions = std::make_shared(); + pEntityRegions->Load(pLayers); std::shared_ptr pEnvelopeManager = std::make_shared(pEnvelopeEval, pLayers->Map()); bool PassedGameLayer = false; @@ -129,6 +131,8 @@ void CMapRenderer::Load(ERenderType Type, CLayers *pLayers, IMapImages *pMapImag // just ignore invalid layers from rendering if(pRenderLayer) { + if(LayerType == LAYER_GAME || LayerType == LAYER_FRONT || LayerType == LAYER_TELE || LayerType == LAYER_SWITCH) + static_cast(pRenderLayer.get())->SetEntityRegions(pEntityRegions, LayerType == LAYER_TELE, LayerType == LAYER_GAME, LayerType == LAYER_SWITCH); pRenderLayer->OnInit(Graphics(), TextRender(), RenderMap(), pEnvelopeManager, pLayers->Map(), pMapImages, RenderCallbackOptional); if(pRenderLayer->IsValid()) { diff --git a/src/game/map/render_layer.cpp b/src/game/map/render_layer.cpp index a4ea0d838c..8270952970 100644 --- a/src/game/map/render_layer.cpp +++ b/src/game/map/render_layer.cpp @@ -339,6 +339,13 @@ void CRenderLayerTile::RenderTileLayer(const ColorRGBA &Color, const CRenderLaye int ScreenRectX0 = std::floor(ScreenX0 / 32); int ScreenRectY1 = std::ceil(ScreenY1 / 32); int ScreenRectX1 = std::ceil(ScreenX1 / 32); + if(m_pEntityRegions && m_RoundingPercent > 0 && !pTileLayerVisuals) + { + --ScreenRectX0; + --ScreenRectY0; + ++ScreenRectX1; + ++ScreenRectY1; + } if(IsVisibleInClipRegion(m_LayerClip)) { @@ -361,7 +368,7 @@ void CRenderLayerTile::RenderTileLayer(const ColorRGBA &Color, const CRenderLaye for(int y = Y0; y < Y1; ++y) { 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."); - 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); + 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].QuadCount() * 6u; if(NumVertices) { @@ -446,7 +453,7 @@ void CRenderLayerTile::RenderTileBorder(const ColorRGBA &Color, int BorderX0, in // borders auto DrawBorder = [&](vec2 Offset, vec2 Scale, CTileLayerVisuals::CTileVisual &StartVisual, CTileLayerVisuals::CTileVisual &EndVisual) { - unsigned int DrawNum = ((EndVisual.IndexBufferByteOffset() - StartVisual.IndexBufferByteOffset()) / (sizeof(unsigned int) * 6)) + (EndVisual.DoDraw() ? 1lu : 0lu); + unsigned int DrawNum = ((EndVisual.IndexBufferByteOffset() - StartVisual.IndexBufferByteOffset()) / (sizeof(unsigned int) * 6)) + EndVisual.QuadCount(); offset_ptr_size pOffset = (offset_ptr_size)StartVisual.IndexBufferByteOffset(); Offset *= 32.0f; Graphics()->RenderBorderTiles(Visuals.m_BufferContainerIndex, Color, pOffset, Offset, Scale, DrawNum); @@ -565,17 +572,187 @@ ColorRGBA CRenderLayerTile::GetRenderColor(const CRenderLayerParams &Params) con return Color; } +void CRenderLayerTile::UpdateRounding() +{ + if(!m_pEntityRegions) + return; + float X0, Y0, X1, Y1; + Graphics()->GetScreen(&X0, &Y0, &X1, &Y1); + const int Percent = g_Config.m_BcEntitiesRounding; + const int Mode = g_Config.m_BcEntitiesRoundingMode; + const int Steps = RoundedTiles::Detail(Percent * 0.16f, Graphics()->ScreenWidth() / std::max(1.0f, X1 - X0)); + const bool GeometryChanged = Percent != m_RoundingPercent || Mode != m_RoundingMode; + if(!GeometryChanged && Steps == m_RoundingSteps) + return; + const bool WasRounded = m_RoundingPercent > 0; + m_RoundingPercent = Percent; + m_RoundingMode = Mode; + m_RoundingSteps = Steps; + m_RoundedShapes.clear(); + // The map-wide buffer uses a fixed sufficient detail for ordinary zoom. + // Zoom-only LOD changes must not synchronously re-upload every map tile. + if(GeometryChanged && Graphics()->IsTileBufferingEnabled() && (WasRounded || Percent > 0)) + { + if(m_VisualTiles) + m_VisualTiles->Unload(); + // Runtime updates must not draw the loading menu or change its projection. + auto LoadingCallback = std::move(m_RenderUploadCallback); + m_RenderUploadCallback.reset(); + m_BuildingRoundingBuffer = true; + UploadTileData(m_VisualTiles, 0, false, m_RoundingGame); + ReuploadRoundedOverlays(); + m_BuildingRoundingBuffer = false; + m_RenderUploadCallback = std::move(LoadingCallback); + Graphics()->MapScreen(X0, Y0, X1, Y1); + } +} + +const RoundedTiles::CShape *CRenderLayerTile::RoundedShape(int X, int Y, int Index) +{ + if(!m_pEntityRegions || m_RoundingPercent <= 0 || !Index) + return nullptr; + // Only the visible material owns the rounded mesh. Front-layer through + // tiles may cover a solid but must keep their original square artwork. + if(!m_pEntityRegions->ShouldRoundTile(X, Y, m_RoundingLayer, Index)) + return nullptr; + const int Type = m_pEntityRegions->Get(X, Y); + if(!Type) + return nullptr; + const unsigned Mask = m_pEntityRegions->Mask(X, Y, Type); + const unsigned Blockers = m_pEntityRegions->BlockerMask(X, Y, Type); + const unsigned Transition = m_pEntityRegions->TransitionCorners(X, Y); + if(Mask == 255) + return nullptr; + const int Steps = m_BuildingRoundingBuffer ? BufferedRoundingSteps : m_RoundingSteps; + const unsigned Key = Mask | (Blockers << 8) | (unsigned(Steps) << 16) | (Transition << 23); + auto It = m_RoundedShapes.find(Key); + if(It == m_RoundedShapes.end()) + It = m_RoundedShapes.emplace(Key, RoundedTiles::Build(Mask, m_RoundingPercent * 0.16f, m_RoundingMode, Steps, Blockers, Transition)).first; + return &It->second; +} + +float CRenderLayerTile::RoundedOverlayScale(int X, int Y) const +{ + if(!m_pEntityRegions || m_RoundingPercent <= 0 || m_RoundingMode == 1) + return 1.0f; + const int Type = m_pEntityRegions->Get(X, Y); + if(!Type) + return 1.0f; + const unsigned Mask = m_pEntityRegions->Mask(X, Y, Type); + const unsigned Blockers = m_pEntityRegions->BlockerMask(X, Y, Type); + const unsigned Complement = m_pEntityRegions->ComplementCorners(X, Y); + const float Radius = m_RoundingPercent * 0.16f; + for(const ivec2 Corner : {ivec2(-1, -1), ivec2(1, -1), ivec2(1, 1), ivec2(-1, 1)}) + { + const int Index = Corner.x < 0 ? (Corner.y < 0 ? 0 : 3) : (Corner.y < 0 ? 1 : 2); + const auto C = RoundedTiles::Corner(Mask, Corner.x, Corner.y, Radius, Complement & (1u << Index) ? 2 : m_RoundingMode, Complement & (1u << Index) ? 0 : Blockers); + if(C.m_Active && !C.m_Inner) + return 1.0f - (1.0f - std::sqrt(0.5f)) * Radius / 16.0f; + } + return 1.0f; +} + +void CRenderLayerTile::RenderRoundedTiles(const ColorRGBA &Color, const CRenderLayerParams &Params) +{ + float X0, Y0, X1, Y1; + Graphics()->GetScreen(&X0, &Y0, &X1, &Y1); + const int W = m_pLayerTilemap->m_Width, H = m_pLayerTilemap->m_Height; + const bool Arrays = Graphics()->HasTextureArraysSupport(); + const float Pixels = 32.0f * Graphics()->ScreenWidth() / std::max(1.0f, X1 - X0); + const float Inset = std::clamp(1.25f / std::max(1.0f, Pixels), 0.0f, 0.49f); + const RoundedTiles::CShape Square = RoundedTiles::Build(255, 0, 0, 2); + if(Params.m_FpsFogEnabled && Params.m_FpsFogCullMapTiles) + { + const vec2 Center((X0 + X1) * 0.5f, (Y0 + Y1) * 0.5f); + const vec2 Half = Params.m_FpsFogMode == 0 ? vec2(Params.m_FpsFogRadiusTiles * 32.0f, Params.m_FpsFogRadiusTiles * 32.0f) : + vec2(X1 - X0, Y1 - Y0) * (std::clamp(Params.m_FpsFogZoomPercent, 1, 120) / 200.0f); + if(Half.x > 0 && Half.y > 0) + { + X0 = std::max(X0, Center.x - Half.x); + Y0 = std::max(Y0, Center.y - Half.y); + X1 = std::min(X1, Center.x + Half.x); + Y1 = std::min(Y1, Center.y + Half.y); + } + } + if(Arrays) + Graphics()->QuadsTex3DBegin(); + else + Graphics()->QuadsBegin(); + Graphics()->SetColor(Color); + for(int Y = (int)std::floor(Y0 / 32) - 1; Y <= (int)std::ceil(Y1 / 32); ++Y) + for(int X = (int)std::floor(X0 / 32) - 1; X <= (int)std::ceil(X1 / 32); ++X) + { + if(!Params.m_RenderTileBorder && (X < 0 || Y < 0 || X >= W || Y >= H)) + continue; + unsigned char Index = 0, Flags = 0; + int Angle = -1; + const int MX = std::clamp(X, 0, W - 1), MY = std::clamp(Y, 0, H - 1); + GetTileData(&Index, &Flags, &Angle, MX, MY, 0); + if(!Index) + continue; + const auto *pShape = X == MX && Y == MY ? RoundedShape(X, Y, Index) : nullptr; + if(!pShape) + pShape = □ + const unsigned TableFlag = (Flags & (TILEFLAG_XFLIP | TILEFLAG_YFLIP)) + ((Flags & TILEFLAG_ROTATE) >> 1); + const auto &T = TEX_COORDS_TABLE[TableFlag]; + for(const auto &Q : pShape->m_vQuads) + { + vec2 UV[4]; + for(int K = 0; K < 4; ++K) + { + // Array/volume samplers clamp extrapolated corner UVs per fragment. + // The atlas fallback cannot do that without sampling adjacent tiles. + const vec2 SampleUv = Arrays ? Q.m_SampleUv[K] : vec2(std::clamp(Q.m_SampleUv[K].x, 0.0f, 1.0f), std::clamp(Q.m_SampleUv[K].y, 0.0f, 1.0f)); + UV[K] = RoundedTiles::Bilinear({vec2(T.m_aTexX[0], T.m_aTexY[0]), vec2(T.m_aTexX[1], T.m_aTexY[1]), vec2(T.m_aTexX[2], T.m_aTexY[2]), vec2(T.m_aTexX[3], T.m_aTexY[3])}, SampleUv.x, SampleUv.y); + if(!Arrays) + UV[K] = (vec2(Index % 16, Index / 16) + vec2(Inset, Inset) + UV[K] * (1 - 2 * Inset)) / 16.0f; + } + Graphics()->QuadsSetSubsetFree(UV[0].x, UV[0].y, UV[1].x, UV[1].y, UV[3].x, UV[3].y, UV[2].x, UV[2].y, Arrays ? Index : -1); + const vec2 Offset(X * 32.0f, Y * 32.0f); + const IGraphics::CFreeformItem Item(Q.m_Pos[0] + Offset, Q.m_Pos[1] + Offset, Q.m_Pos[3] + Offset, Q.m_Pos[2] + Offset); + if(Arrays) + Graphics()->QuadsTex3DDrawFreeform(&Item, 1); + else + Graphics()->QuadsDrawFreeform(&Item, 1); + } + } + if(Arrays) + Graphics()->QuadsTex3DEnd(); + else + Graphics()->QuadsEnd(); +} + void CRenderLayerTile::Render(const CRenderLayerParams &Params) { + UpdateRounding(); UseTexture(GetTexture()); ColorRGBA Color = GetRenderColor(Params); - if(Graphics()->IsTileBufferingEnabled() && Params.m_TileAndQuadBuffering) + const bool Buffered = Graphics()->IsTileBufferingEnabled() && Params.m_TileAndQuadBuffering; + const bool DynamicRounded = m_pEntityRegions && m_RoundingPercent > 0 && (!Buffered || m_RoundingSteps > BufferedRoundingSteps); + if(Buffered && !DynamicRounded) { RenderTileLayerWithTileBuffer(Color, Params); } else { - RenderTileLayerNoTileBuffer(Color, Params); + if(DynamicRounded) + { + Graphics()->BlendNormal(); + if(m_RoundingGame && Params.m_RenderTileBorder) + RenderMap()->RenderTileRectangle(-BorderRenderDistance, -BorderRenderDistance, m_pLayerTilemap->m_Width + 2 * BorderRenderDistance, m_pLayerTilemap->m_Height + 2 * BorderRenderDistance, + TILE_AIR, TILE_DEATH, 32.0f, Color.Multiply(static_cast(this)->GetDeathBorderColor()), TILERENDERFLAG_EXTEND | LAYERRENDERFLAG_TRANSPARENT); + RenderRoundedTiles(Color, Params); + if(m_RoundingTele) + RenderMap()->RenderTeleOverlay(GetData(), m_pLayerTilemap->m_Width, m_pLayerTilemap->m_Height, 32.0f, + (Params.m_RenderText ? OVERLAYRENDERFLAG_TEXT : 0) | (Params.m_RenderInvalidTiles ? OVERLAYRENDERFLAG_EDITOR : 0), Color.a, + [this](int X, int Y) { return RoundedOverlayScale(X, Y); }); + else if(m_RoundingSwitch) + RenderMap()->RenderSwitchOverlay(GetData(), m_pLayerTilemap->m_Width, m_pLayerTilemap->m_Height, 32.0f, + (Params.m_RenderText ? OVERLAYRENDERFLAG_TEXT : 0) | (Params.m_RenderInvalidTiles ? OVERLAYRENDERFLAG_EDITOR : 0), Color.a, + [this](int X, int Y) { return RoundedOverlayScale(X, Y); }); + } + else + RenderTileLayerNoTileBuffer(Color, Params); } } @@ -689,9 +866,44 @@ void CRenderLayerTile::UploadTileData(std::optional &VisualsO int TilesHandledCount = vTmpTiles.size(); Visuals.m_vTilesOfLayer[y * m_pLayerTilemap->m_Width + x].SetIndexBufferByteOffset((offset_ptr32)(TilesHandledCount)); - if(AddTile(vTmpTiles, vTmpTileTexCoords, Index, Flags, x, y, DoTextureCoords, AddAsSpeedup, AngleRotate)) + const auto *pShape = CurOverlay == 0 ? RoundedShape(x, y, Index) : nullptr; + if(pShape) { - Visuals.m_vTilesOfLayer[y * m_pLayerTilemap->m_Width + x].Draw(true); + CGraphicTile Base; + CGraphicTileTextureCoords Tex; + FillTmpTile(&Base, &Tex, Flags, Index, x, y, ivec2(0, 0), 32); + const vec4 T[] = {Tex.m_TexCoordTopLeft, Tex.m_TexCoordTopRight, Tex.m_TexCoordBottomRight, Tex.m_TexCoordBottomLeft}; + for(const auto &Q : pShape->m_vQuads) + { + const vec2 Offset(x * 32.0f, y * 32.0f); + vTmpTiles.push_back({Q.m_Pos[0] + Offset, Q.m_Pos[1] + Offset, Q.m_Pos[2] + Offset, Q.m_Pos[3] + Offset}); + if(DoTextureCoords) + { + vec4 U[4]; + for(int K = 0; K < 4; ++K) + U[K] = mix(mix(T[0], T[1], Q.m_SampleUv[K].x), mix(T[3], T[2], Q.m_SampleUv[K].x), Q.m_SampleUv[K].y); + vTmpTileTexCoords.push_back({U[0], U[1], U[2], U[3]}); + } + } + } + else + AddTile(vTmpTiles, vTmpTileTexCoords, Index, Flags, x, y, DoTextureCoords, AddAsSpeedup, AngleRotate); + if(CurOverlay != 0 && vTmpTiles.size() > (size_t)TilesHandledCount) + { + const float OverlayScale = RoundedOverlayScale(x, y); + if(OverlayScale < 1.0f) + { + auto &Tile = vTmpTiles.back(); + const vec2 Center(x * 32.0f + 16.0f, y * 32.0f + 16.0f); + Tile.m_TopLeft = Center + (Tile.m_TopLeft - Center) * OverlayScale; + Tile.m_TopRight = Center + (Tile.m_TopRight - Center) * OverlayScale; + Tile.m_BottomRight = Center + (Tile.m_BottomRight - Center) * OverlayScale; + Tile.m_BottomLeft = Center + (Tile.m_BottomLeft - Center) * OverlayScale; + } + } + if(vTmpTiles.size() > (size_t)TilesHandledCount) + { + Visuals.m_vTilesOfLayer[y * m_pLayerTilemap->m_Width + x].SetQuadCount(vTmpTiles.size() - TilesHandledCount); // calculate clip region boundaries based on draws DrawLeft = std::min(DrawLeft, x); @@ -769,6 +981,13 @@ void CRenderLayerTile::UploadTileData(std::optional &VisualsO m_LayerClip->m_Y = DrawTop * 32.0f; m_LayerClip->m_Width = (DrawRight - DrawLeft + 1) * 32.0f; m_LayerClip->m_Height = (DrawBottom - DrawTop + 1) * 32.0f; + if(m_pEntityRegions && m_RoundingPercent > 0) + { + m_LayerClip->m_X -= 16; + m_LayerClip->m_Y -= 16; + m_LayerClip->m_Width += 32; + m_LayerClip->m_Height += 32; + } } } @@ -844,10 +1063,10 @@ void CRenderLayerTile::UploadTileData(std::optional &VisualsO { public: vec2 m_Pos; - ubvec4 m_Tex; + vec4 m_Tex; }; - static_assert(sizeof(CVertex) == sizeof(vec2) + sizeof(ubvec4)); // no padding + static_assert(sizeof(CVertex) == sizeof(vec2) + sizeof(vec4)); // no padding CVertex *pDst = static_cast(pUploadData); dbg_assert(UploadDataSize == vTmpTiles.size() * sizeof(*pDst) * 4, "invalid upload size"); @@ -875,7 +1094,7 @@ void CRenderLayerTile::UploadTileData(std::optional &VisualsO // then create the buffer container SBufferContainerInfo ContainerInfo; - ContainerInfo.m_Stride = (DoTextureCoords ? (sizeof(float) * 2 + sizeof(ubvec4)) : 0); + ContainerInfo.m_Stride = (DoTextureCoords ? (sizeof(vec2) + sizeof(vec4)) : 0); ContainerInfo.m_VertBufferBindingIndex = BufferObjectIndex; ContainerInfo.m_vAttributes.emplace_back(); SBufferContainerInfo::SAttribute *pAttr = &ContainerInfo.m_vAttributes.back(); @@ -889,10 +1108,10 @@ void CRenderLayerTile::UploadTileData(std::optional &VisualsO ContainerInfo.m_vAttributes.emplace_back(); pAttr = &ContainerInfo.m_vAttributes.back(); pAttr->m_DataTypeCount = 4; - pAttr->m_Type = GRAPHICS_TYPE_UNSIGNED_BYTE; + pAttr->m_Type = GRAPHICS_TYPE_FLOAT; pAttr->m_Normalized = false; pAttr->m_pOffset = (void *)(sizeof(vec2)); - pAttr->m_FuncType = 1; + pAttr->m_FuncType = 0; } Visuals.m_BufferContainerIndex = Graphics()->CreateBufferContainer(&ContainerInfo); @@ -1517,6 +1736,13 @@ void CRenderLayerEntityTele::Init() UploadTileData(m_VisualTeleNumbers, 1, false); } +void CRenderLayerEntityTele::ReuploadRoundedOverlays() +{ + if(m_VisualTeleNumbers) + m_VisualTeleNumbers->Unload(); + UploadTileData(m_VisualTeleNumbers, 1, false); +} + void CRenderLayerEntityTele::InitTileData() { m_pTeleTiles = GetData(); @@ -1668,6 +1894,16 @@ void CRenderLayerEntitySwitch::Init() UploadTileData(m_VisualSwitchNumberBottom, 2, false); } +void CRenderLayerEntitySwitch::ReuploadRoundedOverlays() +{ + if(m_VisualSwitchNumberTop) + m_VisualSwitchNumberTop->Unload(); + if(m_VisualSwitchNumberBottom) + m_VisualSwitchNumberBottom->Unload(); + UploadTileData(m_VisualSwitchNumberTop, 1, false); + UploadTileData(m_VisualSwitchNumberBottom, 2, false); +} + void CRenderLayerEntitySwitch::InitTileData() { m_pSwitchTiles = GetData(); diff --git a/src/game/map/render_layer.h b/src/game/map/render_layer.h index a1c95399e7..db137f6b83 100644 --- a/src/game/map/render_layer.h +++ b/src/game/map/render_layer.h @@ -12,6 +12,8 @@ using offset_ptr32 = unsigned int; #include #include +#include +#include #include #include #include @@ -19,6 +21,7 @@ using offset_ptr32 = unsigned int; #include #include +#include #include class CMapLayers; @@ -120,6 +123,14 @@ class CRenderLayerTile : public CRenderLayer { public: CRenderLayerTile(int GroupId, int LayerId, int Flags, CMapItemLayerTilemap *pLayerTilemap); + void SetEntityRegions(std::shared_ptr pRegions, bool Tele, bool Game, bool Switch) + { + m_pEntityRegions = std::move(pRegions); + m_RoundingTele = Tele; + m_RoundingGame = Game; + m_RoundingSwitch = Switch; + m_RoundingLayer = Switch ? 3 : Tele ? 2 : Game ? 0 : 1; + } ~CRenderLayerTile() override = default; void Render(const CRenderLayerParams &Params) override; bool DoRender(const CRenderLayerParams &Params) override; @@ -138,8 +149,20 @@ class CRenderLayerTile : public CRenderLayer virtual ColorRGBA GetRenderColor(const CRenderLayerParams &Params) const; virtual void InitTileData(); virtual void GetTileData(unsigned char *pIndex, unsigned char *pFlags, int *pAngleRotate, unsigned int x, unsigned int y, int CurOverlay) const; + virtual void ReuploadRoundedOverlays() {} IGraphics::CTextureHandle GetTexture() const override { return m_TextureHandle; } CTile *m_pTiles; + std::shared_ptr m_pEntityRegions; + bool m_RoundingTele = false, m_RoundingGame = false, m_RoundingSwitch = false; + int m_RoundingLayer = 0; + int m_RoundingPercent = -1, m_RoundingMode = -1, m_RoundingSteps = 2; + bool m_BuildingRoundingBuffer = false; + static constexpr int BufferedRoundingSteps = 4; + std::unordered_map m_RoundedShapes; + void UpdateRounding(); + const RoundedTiles::CShape *RoundedShape(int X, int Y, int Index); + float RoundedOverlayScale(int X, int Y) const; + void RenderRoundedTiles(const ColorRGBA &Color, const CRenderLayerParams &Params); private: IGraphics::CTextureHandle m_TextureHandle; @@ -162,36 +185,38 @@ class CRenderLayerTile : public CRenderLayer class CTileVisual { public: - CTileVisual() : - m_IndexBufferByteOffset(0) {} + CTileVisual() = default; private: - offset_ptr32 m_IndexBufferByteOffset; + offset_ptr32 m_IndexBufferByteOffset = 0; + unsigned int m_QuadCount = 0; public: bool DoDraw() const { - return (m_IndexBufferByteOffset & 0x10000000) != 0; + return m_QuadCount != 0; } void Draw(bool SetDraw) { - m_IndexBufferByteOffset = (SetDraw ? 0x10000000 : (offset_ptr32)0) | (m_IndexBufferByteOffset & 0xEFFFFFFF); + m_QuadCount = SetDraw ? 1 : 0; } + void SetQuadCount(unsigned int Count) { m_QuadCount = Count; } + unsigned int QuadCount() const { return m_QuadCount; } offset_ptr IndexBufferByteOffset() const { - return ((offset_ptr)(m_IndexBufferByteOffset & 0xEFFFFFFF) * 6 * sizeof(uint32_t)); + return (offset_ptr)m_IndexBufferByteOffset * 6 * sizeof(uint32_t); } void SetIndexBufferByteOffset(offset_ptr32 IndexBufferByteOff) { - m_IndexBufferByteOffset = IndexBufferByteOff | (m_IndexBufferByteOffset & 0x10000000); + m_IndexBufferByteOffset = IndexBufferByteOff; } void AddIndexBufferByteOffset(offset_ptr32 IndexBufferByteOff) { - m_IndexBufferByteOffset = ((m_IndexBufferByteOffset & 0xEFFFFFFF) + IndexBufferByteOff) | (m_IndexBufferByteOffset & 0x10000000); + m_IndexBufferByteOffset += IndexBufferByteOff; } }; @@ -306,7 +331,7 @@ class CRenderLayerEntityGame final : public CRenderLayerEntityBase void RenderTileLayerWithTileBuffer(const ColorRGBA &Color, const CRenderLayerParams &Params) override; void RenderTileLayerNoTileBuffer(const ColorRGBA &Color, const CRenderLayerParams &Params) override; -private: +public: ColorRGBA GetDeathBorderColor() const; }; @@ -330,6 +355,7 @@ class CRenderLayerEntityTele final : public CRenderLayerEntityBase void RenderTileLayerWithTileBuffer(const ColorRGBA &Color, const CRenderLayerParams &Params) override; void RenderTileLayerNoTileBuffer(const ColorRGBA &Color, const CRenderLayerParams &Params) override; void GetTileData(unsigned char *pIndex, unsigned char *pFlags, int *pAngleRotate, unsigned int x, unsigned int y, int CurOverlay) const override; + void ReuploadRoundedOverlays() override; private: std::optional m_VisualTeleNumbers; @@ -371,6 +397,7 @@ class CRenderLayerEntitySwitch final : public CRenderLayerEntityBase void RenderTileLayerNoTileBuffer(const ColorRGBA &Color, const CRenderLayerParams &Params) override; void GetTileData(unsigned char *pIndex, unsigned char *pFlags, int *pAngleRotate, unsigned int x, unsigned int y, int CurOverlay) const override; IGraphics::CTextureHandle GetTexture() const override; + void ReuploadRoundedOverlays() override; private: std::optional m_VisualSwitchNumberTop; diff --git a/src/game/map/render_map.cpp b/src/game/map/render_map.cpp index e5d4633442..1dc0622d65 100644 --- a/src/game/map/render_map.cpp +++ b/src/game/map/render_map.cpp @@ -742,7 +742,7 @@ void CRenderMap::RenderTilemap(CTile *pTiles, int w, int h, float Scale, ColorRG Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); } -void CRenderMap::RenderTeleOverlay(CTeleTile *pTele, int w, int h, float Scale, int OverlayRenderFlag, float Alpha) +void CRenderMap::RenderTeleOverlay(CTeleTile *pTele, int w, int h, float Scale, int OverlayRenderFlag, float Alpha, const std::function &ScaleAt) { if(!(OverlayRenderFlag & OVERLAYRENDERFLAG_TEXT)) return; @@ -787,9 +787,10 @@ void CRenderMap::RenderTeleOverlay(CTeleTile *pTele, int w, int h, float Scale, // Auto-resize text to fit inside the tile float ScaledWidth = TextRender()->TextWidth(Size * Scale, aBuf, -1); float Factor = std::clamp(Scale / ScaledWidth, 0.0f, 1.0f); - float LocalSize = Size * Factor; + float LocalSize = Size * Factor * (ScaleAt ? std::clamp(ScaleAt(mx, my), 0.0f, 1.0f) : 1.0f); float ToCenterOffset = (1 - LocalSize) / 2.f; - TextRender()->Text((mx + 0.5f) * Scale - (ScaledWidth * Factor) / 2.0f, (my + ToCenterOffset) * Scale, LocalSize * Scale, aBuf); + float LocalWidth = TextRender()->TextWidth(LocalSize * Scale, aBuf, -1); + TextRender()->Text((mx + 0.5f) * Scale - LocalWidth / 2.0f, (my + ToCenterOffset) * Scale, LocalSize * Scale, aBuf); } } } @@ -884,7 +885,7 @@ void CRenderMap::RenderSpeedupOverlay(CSpeedupTile *pSpeedup, int w, int h, floa Graphics()->MapScreen(ScreenX0, ScreenY0, ScreenX1, ScreenY1); } -void CRenderMap::RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float Scale, int OverlayRenderFlag, float Alpha) +void CRenderMap::RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float Scale, int OverlayRenderFlag, float Alpha, const std::function &ScaleAt) { if(!(OverlayRenderFlag & OVERLAYRENDERFLAG_TEXT)) return; @@ -901,7 +902,6 @@ void CRenderMap::RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float S return; // its useless to render text at this distance float Size = g_Config.m_ClTextEntitiesSize / 100.f; - float ToCenterOffset = (1 - Size) / 2.f; char aBuf[16]; TextRender()->TextColor(1.0f, 1.0f, 1.0f, Alpha); @@ -922,19 +922,26 @@ void CRenderMap::RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float S continue; // my = h-1; int c = mx + my * w; + const float SafeScale = ScaleAt ? std::clamp(ScaleAt(mx, my), 0.0f, 1.0f) : 1.0f; unsigned char Index = pSwitch[c].m_Number; if(Index && IsSwitchTileNumberUsed(pSwitch[c].m_Type)) { str_format(aBuf, sizeof(aBuf), "%d", Index); - TextRender()->Text(mx * Scale, (my + ToCenterOffset / 2) * Scale, Size * Scale / 2.f, aBuf); + const float FullWidth = TextRender()->TextWidth(Size * Scale / 2.0f, aBuf, -1); + const float LocalSize = Size * SafeScale * std::clamp(Scale / std::max(FullWidth, 1.0f), 0.0f, 1.0f); + const float Width = TextRender()->TextWidth(LocalSize * Scale / 2.0f, aBuf, -1); + TextRender()->Text((mx + 0.5f) * Scale - Width / 2.0f, (my + (1 - LocalSize) / 4.0f) * Scale, LocalSize * Scale / 2.f, aBuf); } unsigned char Delay = pSwitch[c].m_Delay; if(Delay && IsSwitchTileDelayUsed(pSwitch[c].m_Type)) { str_format(aBuf, sizeof(aBuf), "%d", Delay); - TextRender()->Text(mx * Scale, (my + 0.5f + ToCenterOffset / 2) * Scale, Size * Scale / 2.f, aBuf); + const float FullWidth = TextRender()->TextWidth(Size * Scale / 2.0f, aBuf, -1); + const float LocalSize = Size * SafeScale * std::clamp(Scale / std::max(FullWidth, 1.0f), 0.0f, 1.0f); + const float Width = TextRender()->TextWidth(LocalSize * Scale / 2.0f, aBuf, -1); + TextRender()->Text((mx + 0.5f) * Scale - Width / 2.0f, (my + 0.5f + (1 - LocalSize) / 4.0f) * Scale, LocalSize * Scale / 2.f, aBuf); } } } diff --git a/src/game/map/render_map.h b/src/game/map/render_map.h index 90585e93ce..4958011732 100644 --- a/src/game/map/render_map.h +++ b/src/game/map/render_map.h @@ -7,6 +7,7 @@ #include #include +#include enum { @@ -70,9 +71,9 @@ class CRenderMap void RenderTileRectangle(int RectX, int RectY, int RectW, int RectH, unsigned char IndexIn, unsigned char IndexOut, float Scale, ColorRGBA Color, int RenderFlags); // DDRace - void RenderTeleOverlay(CTeleTile *pTele, int w, int h, float Scale, int OverlayRenderFlags, float Alpha = 1.0f); + void RenderTeleOverlay(CTeleTile *pTele, int w, int h, float Scale, int OverlayRenderFlags, float Alpha = 1.0f, const std::function &ScaleAt = {}); void RenderSpeedupOverlay(CSpeedupTile *pSpeedup, int w, int h, float Scale, int OverlayRenderFlags, float Alpha = 1.0f); - void RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float Scale, int OverlayRenderFlags, float Alpha = 1.0f); + void RenderSwitchOverlay(CSwitchTile *pSwitch, int w, int h, float Scale, int OverlayRenderFlags, float Alpha = 1.0f, const std::function &ScaleAt = {}); void RenderTuneOverlay(CTuneTile *pTune, int w, int h, float Scale, int OverlayRenderFlags, float Alpha = 1.0f); void RenderTelemap(CTeleTile *pTele, int w, int h, float Scale, ColorRGBA Color, int RenderFlags); void RenderSwitchmap(CSwitchTile *pSwitch, int w, int h, float Scale, ColorRGBA Color, int RenderFlags); diff --git a/src/game/map/rounded_tiles.h b/src/game/map/rounded_tiles.h new file mode 100644 index 0000000000..5fe3c8ed44 --- /dev/null +++ b/src/game/map/rounded_tiles.h @@ -0,0 +1,398 @@ +#ifndef GAME_MAP_ROUNDED_TILES_H +#define GAME_MAP_ROUNDED_TILES_H + +#include + +#include +#include +#include +#include + +// Rendering only. Map coordinates, entity IDs and collision stay integral. +namespace RoundedTiles +{ + struct CQuad + { + std::array m_Pos; // clockwise: TL, TR, BR, BL + std::array m_Uv; // original cell parameter, including shared edges + std::array m_SampleUv; // texture sampling can hold artwork in place + }; + + struct CSegment + { + vec2 m_A, m_B; + int m_SharedCorner = -1; + bool m_ButtA = false, m_ButtB = false; + }; + + struct CShape + { + std::vector m_vQuads; + std::vector m_vContour; + std::vector m_vOutlineJoins; + }; + + // Bits in row order, omitting the center: NW N NE W E SW S SE. + inline bool Occupied(unsigned Mask, int X, int Y) + { + if(X == 0 && Y == 0) + return true; + const int Index = (Y + 1) * 3 + X + 1; + return (Mask & (1u << (Index > 4 ? Index - 1 : Index))) != 0; + } + + inline int Detail(float Radius, float PixelsPerUnit) + { + // Power-of-two half-arc segments keep neighboring layers at the same LOD. + int Steps = 2; + while(Steps < 64 && Radius * PixelsPerUnit * (1.0f - std::cos(pi / (8.0f * Steps))) > 0.25f) + Steps *= 2; + return Steps; + } + + inline vec2 Bilinear(const std::array &P, float U, float V) + { + return mix(mix(P[0], P[1], U), mix(P[3], P[2], U), V); + } + + struct CCorner + { + vec2 m_Origin, m_Inward, m_Center, m_Node; + bool m_Active = false; + bool m_ArcX = false, m_ArcY = false; + bool m_Inner = false; + bool m_Complement = false; + bool m_TrimX = false, m_TrimY = false; + float m_Radius = 0.0f; + + vec2 Tangent(bool AlongX) const + { + return m_Origin + (AlongX ? vec2(m_Inward.x * m_Radius, 0) : vec2(0, m_Inward.y * m_Radius)); + } + + vec2 Edge(bool AlongX, float T) const + { + const vec2 End = Tangent(AlongX); + if(!(AlongX ? m_ArcX : m_ArcY)) + return mix(m_Node, End, T); + const vec2 A = (m_Node - m_Center) / m_Radius; + const vec2 B = (End - m_Center) / m_Radius; + const float Angle = std::atan2(A.x * B.y - A.y * B.x, dot(A, B)) * T; + const float C = std::cos(Angle), S = std::sin(Angle); + return m_Center + vec2(A.x * C - A.y * S, A.x * S + A.y * C) * m_Radius; + } + + vec2 Map(float U, float V) const + { + const vec2 X = Tangent(true), Y = Tangent(false); + const vec2 Far = m_Origin + m_Inward * m_Radius; + // Coons patch: two curved/shifted edges and two unchanged outer edges. + return Edge(true, U) * (1 - V) + mix(Y, Far, U) * V + + Edge(false, V) * (1 - U) + mix(X, Far, V) * U - + Bilinear({m_Node, X, Far, Y}, U, V); + } + }; + + inline CCorner Corner(unsigned Mask, int X, int Y, float Radius, int Mode, unsigned BlockerMask = 0) + { + CCorner C; + C.m_Origin = vec2(X > 0 ? 32 : 0, Y > 0 ? 32 : 0); + C.m_Inward = vec2(-X, -Y); + C.m_Node = C.m_Origin; + C.m_Radius = Radius; + const bool H = Occupied(Mask, X, 0), V = Occupied(Mask, 0, Y), D = Occupied(Mask, X, Y); + const int Count = 1 + H + V + D; + // Diagonally touching regions keep separate convex corners. + if(Radius > 0 && !H && !V && !Occupied(BlockerMask, X, 0) && !Occupied(BlockerMask, 0, Y) && Mode != 1) + { + C.m_Active = C.m_ArcX = C.m_ArcY = true; + C.m_Center = C.m_Origin + C.m_Inward * Radius; + C.m_Node = C.m_Origin + C.m_Inward * (Radius * (1 - std::sqrt(0.5f))); + } + else if(Radius > 0 && Count == 3 && Mode != 0 && + !Occupied(BlockerMask, !H ? X : (!V ? 0 : X), !H ? 0 : Y)) + { + C.m_Active = C.m_Inner = true; + const vec2 Missing(!H ? X : (!V ? -X : X), !H ? -Y : Y); + C.m_Center = C.m_Origin + Missing * Radius; + C.m_Node = C.m_Origin + Missing * (Radius * (1 - std::sqrt(0.5f))); + C.m_ArcX = !V; + C.m_ArcY = !H; + } + return C; + } + + inline CShape Build(unsigned Mask, float Radius, int Mode, int Steps, unsigned BlockerMask = 0, unsigned TransitionCorners = 0) + { + CShape Shape; + Radius = std::clamp(Radius, 0.0f, 16.0f); + Steps = std::clamp(Steps, 2, 64); + const unsigned ComplementCorners = TransitionCorners & 15u; + const unsigned TrimCorners = (TransitionCorners >> 4) & 15u; + const auto MakeCorner = [&](int I, int X, int Y) { + // A covered material corner must round even if its neighbor would + // normally block it. An empty corner still follows the selected mode. + const bool Covered = (ComplementCorners & (1u << I)) && Occupied(BlockerMask, X, Y); + return Corner(Mask, X, Y, Radius, Covered ? 2 : Mode, Covered ? 0 : BlockerMask); + }; + std::array Corners = { + MakeCorner(0, -1, -1), MakeCorner(1, 1, -1), MakeCorner(2, 1, 1), MakeCorner(3, -1, 1)}; + for(int I = 0; I < 4; ++I) + { + Corners[I].m_Complement = (ComplementCorners & (1u << I)) && Corners[I].m_Active; + const int X = I == 1 || I == 2 ? 1 : -1; + const int Y = I >= 2 ? 1 : -1; + if(TrimCorners & (1u << I)) + { + const bool MissingY = !Occupied(Mask, 0, Y); + const bool MissingX = !Occupied(Mask, X, 0); + // An open-sky concave corner only has an arc in inner/all mode. + // A covered material junction has a complementary arc even in + // outer-only mode, so its two side tiles still need trimming. + if(Mode != 0 || (MissingY && Occupied(BlockerMask, 0, Y)) || (MissingX && Occupied(BlockerMask, X, 0))) + { + Corners[I].m_TrimX = MissingY; + Corners[I].m_TrimY = MissingX; + // Only the diagonal tile draws the inward arc. If a side + // tile also bends into the empty cell, its mesh and outline + // overlap the arc and leave visible square stubs. + if(Corners[I].m_Inner) + Corners[I].m_Active = false; + } + } + } + // A covered concave corner keeps its original square and draws the + // complementary wedge into the other tile. Moving its corner vertex + // like an open-sky junction would leave a transparent sliver between + // the two materials. + auto MeshCorners = Corners; + for(auto &C : MeshCorners) + if(C.m_Complement && C.m_Inner) + C.m_Active = false; + bool Active = false; + for(const auto &C : MeshCorners) + Active |= C.m_Active; + if(!Active) + Shape.m_vQuads.push_back({{vec2(0, 0), vec2(32, 0), vec2(32, 32), vec2(0, 32)}, {vec2(0, 0), vec2(1, 0), vec2(1, 1), vec2(0, 1)}, {vec2(0, 0), vec2(1, 0), vec2(1, 1), vec2(0, 1)}}); + else + { + const float Grid[] = {0, Radius, 32 - Radius, 32}; + for(int Y = 0; Y < 3; ++Y) + for(int X = 0; X < 3; ++X) + { + if(Grid[X] == Grid[X + 1] || Grid[Y] == Grid[Y + 1]) + continue; + const int CornerIndex = Y == 0 ? (X == 0 ? 0 : 1) : (X == 0 ? 3 : 2); + const CCorner *pC = X != 1 && Y != 1 ? &MeshCorners[CornerIndex] : nullptr; + const int N = pC && pC->m_Active ? Steps : 1; + for(int J = 0; J < N; ++J) + for(int I = 0; I < N; ++I) + { + CQuad Q; + for(int K = 0; K < 4; ++K) + { + const float U = (I + (K == 1 || K == 2)) / float(N); + const float V = (J + (K >= 2)) / float(N); + vec2 P(mix(Grid[X], Grid[X + 1], U), mix(Grid[Y], Grid[Y + 1], V)); + Q.m_Pos[K] = pC && pC->m_Active ? pC->Map(X == 0 ? U : 1 - U, Y == 0 ? V : 1 - V) : P; + Q.m_Uv[K] = P / 32.0f; + // Let the texture sampler clamp the extrapolated UV per fragment. + // Clamping only mesh vertices interpolates across the cell edge, + // smearing the artwork as the mesh LOD changes with zoom. + Q.m_SampleUv[K] = pC && pC->m_Inner ? Q.m_Pos[K] / 32.0f : Q.m_Uv[K]; + } + Shape.m_vQuads.push_back(Q); + } + } + } + for(const auto &C : Corners) + { + if(!C.m_Complement || !C.m_Inner) + continue; + const vec2 Sign = (C.m_Center - C.m_Origin) / Radius; + vec2 Previous = C.m_Center - vec2(Sign.x * Radius, 0); + for(int I = 1; I <= 2 * Steps; ++I) + { + const float A = (pi * 0.5f) * I / (2 * Steps); + const vec2 Next = C.m_Center - vec2(Sign.x * std::cos(A), Sign.y * std::sin(A)) * Radius; + vec2 P = Previous, Q = Next; + if((P.x - C.m_Origin.x) * (Q.y - C.m_Origin.y) - (P.y - C.m_Origin.y) * (Q.x - C.m_Origin.x) < 0) + std::swap(P, Q); + CQuad Wedge; + Wedge.m_Pos = {C.m_Origin, P, Q, Q}; + for(int K = 0; K < 4; ++K) + Wedge.m_Uv[K] = Wedge.m_SampleUv[K] = Wedge.m_Pos[K] / 32.0f; + Shape.m_vQuads.push_back(Wedge); + Previous = Next; + } + } + + // Full arcs are included even for the diagonally opposite junction tile: + // a wide inward outline can reach that tile without crossing one of its edges. + for(int CornerIndex = 0; CornerIndex < 4; ++CornerIndex) + { + const auto &C = Corners[CornerIndex]; + if(!C.m_Active) + { + const int X = C.m_Inward.x < 0 ? 1 : -1; + const int Y = C.m_Inward.y < 0 ? 1 : -1; + // Three tiles meet at this point, but the inner arc is disabled: + // either outer-only mode or a different region in the diagonal cell. + // The two straight contour bands then terminate in different tiles + // and touch only diagonally in the raster. Add their common endpoint + // to this tile's inward outline band to close that small gap. + if(Occupied(Mask, X, 0) && Occupied(Mask, 0, Y) && !Occupied(Mask, X, Y)) + Shape.m_vOutlineJoins.push_back(C.m_Origin); + continue; + } + const vec2 Sign = (C.m_Center - C.m_Origin) / Radius; + vec2 Previous = C.m_Center - vec2(Sign.x * Radius, 0); + for(int I = 1; I <= 2 * Steps; ++I) + { + const float A = (pi * 0.5f) * I / (2 * Steps); + vec2 Next = C.m_Center - vec2(Sign.x * std::cos(A), Sign.y * std::sin(A)) * Radius; + Shape.m_vContour.push_back({Previous, Next, C.m_Complement ? CornerIndex : -1}); + Previous = Next; + } + } + const int DX[] = {0, 1, 0, -1}, DY[] = {-1, 0, 1, 0}; + for(int Side = 0; Side < 4; ++Side) + { + if(Occupied(Mask, DX[Side], DY[Side])) + continue; + const auto &A = Corners[Side], &B = Corners[(Side + 1) % 4]; + const bool AlongX = Side % 2 == 0; + const vec2 Start = A.m_Active || (AlongX ? A.m_TrimX : A.m_TrimY) ? A.Tangent(AlongX) : A.m_Origin; + const vec2 End = B.m_Active || (AlongX ? B.m_TrimX : B.m_TrimY) ? B.Tangent(AlongX) : B.m_Origin; + // At a 100% radius, opposite arcs can meet with no straight edge. + // A zero-length edge acts as a point-distance source for the outline + // rasterizer and leaves a colored speck at the junction. + if(length(End - Start) > 0.001f) + Shape.m_vContour.push_back({Start, End, -1, + A.m_Active || (AlongX ? A.m_TrimX : A.m_TrimY), + B.m_Active || (AlongX ? B.m_TrimX : B.m_TrimY)}); + } + return Shape; + } + + // Two categories sharing a side use the same tile silhouette. Only the + // higher-priority category draws the line along their common edge. + inline void RemoveLowerPriorityEdges(CShape &Shape, unsigned HigherMask) + { + if(!HigherMask) + return; + const bool Top = Occupied(HigherMask, 0, -1); + const bool Right = Occupied(HigherMask, 1, 0); + const bool Bottom = Occupied(HigherMask, 0, 1); + const bool Left = Occupied(HigherMask, -1, 0); + std::erase_if(Shape.m_vContour, [&](const CSegment &S) { + if(S.m_SharedCorner >= 0) + { + const int X = S.m_SharedCorner == 1 || S.m_SharedCorner == 2 ? 1 : -1; + const int Y = S.m_SharedCorner >= 2 ? 1 : -1; + if(Occupied(HigherMask, X, 0) || Occupied(HigherMask, 0, Y) || Occupied(HigherMask, X, Y)) + return true; + } + const float Epsilon = 0.001f; + return (Top && std::abs(S.m_A.y) < Epsilon && std::abs(S.m_B.y) < Epsilon) || + (Right && std::abs(S.m_A.x - 32) < Epsilon && std::abs(S.m_B.x - 32) < Epsilon) || + (Bottom && std::abs(S.m_A.y - 32) < Epsilon && std::abs(S.m_B.y - 32) < Epsilon) || + (Left && std::abs(S.m_A.x) < Epsilon && std::abs(S.m_B.x) < Epsilon); + }); + std::erase_if(Shape.m_vOutlineJoins, [&](vec2 P) { + return Occupied(HigherMask, P.x > 16 ? 1 : -1, P.y > 16 ? 1 : -1); + }); + } + + inline float Distance(const CShape &Shape, vec2 P) + { + float Result = 1e10f; + for(const auto &S : Shape.m_vContour) + { + const vec2 D = S.m_B - S.m_A; + const float Projection = dot(P - S.m_A, D) / std::max(dot(D, D), 1e-12f); + // A shortened straight side ends at a neighboring arc tangent. A + // round endpoint cap would spill past it as a triangular outline stub. + if((Projection < 0 && S.m_ButtA) || (Projection > 1 && S.m_ButtB)) + continue; + const float T = std::clamp(Projection, 0.0f, 1.0f); + Result = std::min(Result, length(P - (S.m_A + D * T))); + } + for(const vec2 Join : Shape.m_vOutlineJoins) + Result = std::min(Result, length(P - Join)); + return Result; + } + + // Clip a disjoint tessellation to the inward distance band. Unlike overlapping + // edge strips, this remains single-covered at concave joins and large widths. + inline std::vector> Outline(const CShape &Shape, float Width) + { + std::vector> Result; + if((Shape.m_vContour.empty() && Shape.m_vOutlineJoins.empty()) || Width <= 0) + return Result; + Width = std::min(Width, 16.0f); + // Common straight walls need only a few quads, including at large zoom-out. + const bool Straight = Shape.m_vOutlineJoins.empty() && Shape.m_vQuads.size() == 1 && std::all_of(Shape.m_vContour.begin(), Shape.m_vContour.end(), [](const CSegment &S) { + // The center-sampled fast path draws a whole edge band. A segment + // shortened to meet an arc must use the precise clipped mesh or it + // paints a rectangular stub across the missing tangent interval. + return ((S.m_A.y == S.m_B.y && (S.m_A.y == 0 || S.m_A.y == 32) && std::min(S.m_A.x, S.m_B.x) == 0 && std::max(S.m_A.x, S.m_B.x) == 32) || + (S.m_A.x == S.m_B.x && (S.m_A.x == 0 || S.m_A.x == 32) && std::min(S.m_A.y, S.m_B.y) == 0 && std::max(S.m_A.y, S.m_B.y) == 32)); + }); + if(Straight) + { + const float Grid[] = {0, Width, 32 - Width, 32}; + for(int Y = 0; Y < 3; ++Y) + for(int X = 0; X < 3; ++X) + { + if(Grid[X + 1] <= Grid[X] || Grid[Y + 1] <= Grid[Y]) + continue; + if(Distance(Shape, vec2((Grid[X] + Grid[X + 1]) * 0.5f, (Grid[Y] + Grid[Y + 1]) * 0.5f)) > Width) + continue; + const vec2 A(Grid[X], Grid[Y]), B(Grid[X + 1], Grid[Y]), C(Grid[X + 1], Grid[Y + 1]), D(Grid[X], Grid[Y + 1]); + Result.push_back({A, B, C}); + Result.push_back({A, C, D}); + } + return Result; + } + for(const auto &Q : Shape.m_vQuads) + { + // Distance to the contour is 1-Lipschitz. Skip patches whose + // entire convex hull is farther than the outline width; most of the + // increasingly fine patches at high zoom lie in the tile interior. + const vec2 Center = (Q.m_Pos[0] + Q.m_Pos[1] + Q.m_Pos[2] + Q.m_Pos[3]) * 0.25f; + const float Reach = std::max({length(Q.m_Pos[0] - Center), length(Q.m_Pos[1] - Center), length(Q.m_Pos[2] - Center), length(Q.m_Pos[3] - Center)}); + if(Distance(Shape, Center) > Width + Reach) + continue; + const float Size = std::max({length(Q.m_Pos[1] - Q.m_Pos[0]), length(Q.m_Pos[3] - Q.m_Pos[0]), length(Q.m_Pos[2] - Q.m_Pos[1]), length(Q.m_Pos[2] - Q.m_Pos[3])}); + const int N = std::max(2, (int)std::ceil(Size / 2.0f)); + for(int Y = 0; Y < N; ++Y) + for(int X = 0; X < N; ++X) + { + std::array P; + for(int K = 0; K < 4; ++K) + P[K] = Bilinear(Q.m_Pos, (X + (K == 1 || K == 2)) / float(N), (Y + (K >= 2)) / float(N)); + for(int T = 0; T < 2; ++T) + { + const std::array Tri = {P[0], P[T + 1], P[T + 2]}; + std::array Polygon; + int Count = 0; + for(int K = 0; K < 3; ++K) + { + const vec2 A = Tri[K], B = Tri[(K + 1) % 3]; + const float DA = Width - Distance(Shape, A), DB = Width - Distance(Shape, B); + if(DA >= 0) + Polygon[Count++] = A; + if((DA >= 0) != (DB >= 0)) + Polygon[Count++] = mix(A, B, DA / (DA - DB)); + } + for(int K = 1; K + 1 < Count; ++K) + Result.push_back({Polygon[0], Polygon[K], Polygon[K + 1]}); + } + } + } + return Result; + } +} + +#endif diff --git a/src/test/rounded_tiles_test.cpp b/src/test/rounded_tiles_test.cpp new file mode 100644 index 0000000000..880a7c222f --- /dev/null +++ b/src/test/rounded_tiles_test.cpp @@ -0,0 +1,642 @@ +#include +#include + +#include + +namespace +{ + float Cross(vec2 A, vec2 B) + { + return A.x * B.y - A.y * B.x; + } + + bool InsideTriangle(vec2 P, vec2 A, vec2 B, vec2 C) + { + const float AB = Cross(B - A, P - A); + const float BC = Cross(C - B, P - B); + const float CA = Cross(A - C, P - C); + return AB >= -0.0001f && BC >= -0.0001f && CA >= -0.0001f; + } + + bool InsideShape(const RoundedTiles::CShape &Shape, vec2 P) + { + for(const auto &Q : Shape.m_vQuads) + { + if((Cross(Q.m_Pos[1] - Q.m_Pos[0], Q.m_Pos[2] - Q.m_Pos[0]) > 1e-6f && InsideTriangle(P, Q.m_Pos[0], Q.m_Pos[1], Q.m_Pos[2])) || + (Cross(Q.m_Pos[2] - Q.m_Pos[0], Q.m_Pos[3] - Q.m_Pos[0]) > 1e-6f && InsideTriangle(P, Q.m_Pos[0], Q.m_Pos[2], Q.m_Pos[3]))) + return true; + } + return false; + } + + float Area(const RoundedTiles::CShape &Shape, bool Uv = false) + { + float Result = 0; + for(const auto &Q : Shape.m_vQuads) + { + const auto &P = Uv ? Q.m_Uv : Q.m_Pos; + Result += 0.5f * (Cross(P[1] - P[0], P[2] - P[0]) + Cross(P[2] - P[0], P[3] - P[0])); + } + return Result; + } + + unsigned Mask(const std::vector &Tiles, ivec2 Position) + { + unsigned Result = 0, Bit = 0; + for(int Y = -1; Y <= 1; ++Y) + for(int X = -1; X <= 1; ++X) + if(X || Y) + { + if(std::find(Tiles.begin(), Tiles.end(), Position + ivec2(X, Y)) != Tiles.end()) + Result |= 1u << Bit; + ++Bit; + } + return Result; + } + + vec2 Boundary(const RoundedTiles::CShape &Shape, bool Vertical, float Edge, float T) + { + for(const auto &Q : Shape.m_vQuads) + for(int K = 0; K < 4; ++K) + { + int J = (K + 1) % 4; + vec2 A = Q.m_Uv[K], B = Q.m_Uv[J]; + if(!Vertical) + { + std::swap(A.x, A.y); + std::swap(B.x, B.y); + } + if(std::abs(A.x - Edge) < 1e-6f && std::abs(B.x - Edge) < 1e-6f && std::abs(B.y - A.y) > 1e-6f && T >= std::min(A.y, B.y) - 1e-6f && T <= std::max(A.y, B.y) + 1e-6f) + return mix(Q.m_Pos[K], Q.m_Pos[J], (T - A.y) / (B.y - A.y)); + } + ADD_FAILURE() << "Missing source boundary"; + return vec2(1e6f, 1e6f); + } +} + +TEST(EntityRegions, RoundingMaskOnlyIncludesTheSameVisibleCategory) +{ + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes = { + CEntityRegions::NONE, CEntityRegions::FREEZE, CEntityRegions::NONE, + CEntityRegions::NONE, CEntityRegions::FREEZE, CEntityRegions::SOLID, + CEntityRegions::NONE, CEntityRegions::NONE, CEntityRegions::NONE}; + // The solid tile on the right used to suppress the freeze tile's corner. + EXPECT_EQ(Regions.Mask(1, 1, CEntityRegions::FREEZE), 1u << 1); + // The map's right border repeats its last column when extended on screen. + EXPECT_EQ(Regions.Mask(2, 1, CEntityRegions::SOLID), 1u << 4); + EXPECT_EQ(Regions.PriorityMask(1, 1, CEntityRegions::FREEZE), (1u << 1) | (1u << 4)); + EXPECT_EQ(Regions.BlockerMask(1, 1, CEntityRegions::FREEZE), 1u << 4); +} + +TEST(EntityRegions, ThroughHookOverlayKeepsItsOwnSquareTexture) +{ + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 1; + Regions.m_vTypes = {CEntityRegions::SOLID}; + Regions.m_vTopLayers = {0}; + EXPECT_TRUE(Regions.ShouldRoundTile(0, 0, 0, TILE_SOLID)); + EXPECT_FALSE(Regions.ShouldRoundTile(0, 0, 1, TILE_THROUGH)); + EXPECT_FALSE(Regions.ShouldRoundTile(0, 0, 1, TILE_THROUGH_CUT)); + Regions.m_vTopLayers = {1}; + EXPECT_FALSE(Regions.ShouldRoundTile(0, 0, 0, TILE_SOLID)); + EXPECT_TRUE(Regions.ShouldRoundTile(0, 0, 1, TILE_NOHOOK)); +} + +TEST(EntityRegions, VisibleTeleporterSuppressesCoveredUnfreezeOutline) +{ + // Felian places unfreeze in the game layer underneath tele tiles. The + // later tele layer is visible, including where its number is zero. + EXPECT_EQ(CEntityRegions::VisibleType(TILE_UNFREEZE, 0, TILE_TELEIN), CEntityRegions::TELE); + EXPECT_EQ(CEntityRegions::VisibleType(TILE_SOLID, TILE_FREEZE, TILE_TELEIN), CEntityRegions::TELE); + EXPECT_EQ(CEntityRegions::VisibleType(TILE_SOLID, TILE_FREEZE, 0), CEntityRegions::FREEZE); +} + +TEST(EntityRegions, BuriedUnfreezeDoesNotJoinAdjacentTeleInnerCorner) +{ + const int OnUnfreeze = CEntityRegions::VisibleRegionKey(TILE_UNFREEZE, 0, TILE_TELEINEVIL); + const int OnAir = CEntityRegions::VisibleRegionKey(0, 0, TILE_TELEINEVIL); + EXPECT_NE(OnUnfreeze, OnAir); + EXPECT_NE(OnAir, CEntityRegions::VisibleRegionKey(0, 0, TILE_SOLID)); + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes = { + CEntityRegions::NONE, CEntityRegions::TELE, CEntityRegions::NONE, + CEntityRegions::TELE, CEntityRegions::TELE, CEntityRegions::NONE, + CEntityRegions::NONE, CEntityRegions::TELE, CEntityRegions::NONE}; + Regions.m_vRegionKeys = {0, OnAir, 0, OnUnfreeze, OnAir, 0, 0, OnAir, 0}; + const unsigned Mask = Regions.Mask(1, 1, CEntityRegions::TELE); + const unsigned Blockers = Regions.BlockerMask(1, 1, CEntityRegions::TELE); + EXPECT_FALSE(RoundedTiles::Corner(Mask, -1, -1, 16, 2, Blockers).m_Active); +} + +TEST(EntityRegions, SwitchTileBlocksUnfreezeCorner) +{ + EXPECT_EQ(CEntityRegions::VisibleType(TILE_UNFREEZE, 0, 0, TILE_SWITCHTIMEDOPEN), CEntityRegions::SWITCH); + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes = { + CEntityRegions::NONE, CEntityRegions::NONE, CEntityRegions::NONE, + CEntityRegions::NONE, CEntityRegions::UNFREEZE, CEntityRegions::SWITCH, + CEntityRegions::NONE, CEntityRegions::NONE, CEntityRegions::NONE}; + constexpr unsigned East = 1u << 4; + EXPECT_EQ(Regions.BlockerMask(1, 1, CEntityRegions::UNFREEZE), East); + EXPECT_EQ(Regions.PriorityMask(1, 1, CEntityRegions::UNFREEZE), East); + EXPECT_FALSE(RoundedTiles::Corner(Regions.Mask(1, 1, CEntityRegions::UNFREEZE), 1, -1, 16, 2, + Regions.BlockerMask(1, 1, CEntityRegions::UNFREEZE)).m_Active); +} + +TEST(EntityRegions, CoveredMaterialJunctionUsesMatchingInnerAndOuterCorners) +{ + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes.assign(9, CEntityRegions::FREEZE); + Regions.m_vTypes[4] = CEntityRegions::SOLID; + EXPECT_EQ(Regions.ComplementCorners(1, 1), 15u); + EXPECT_EQ(Regions.ComplementCorners(0, 0) & 4u, 4u); + EXPECT_EQ(Regions.ComplementCorners(2, 0) & 8u, 8u); + EXPECT_EQ(Regions.ComplementCorners(0, 2) & 2u, 2u); + EXPECT_EQ(Regions.ComplementCorners(2, 2) & 1u, 1u); + EXPECT_EQ((Regions.TransitionCorners(1, 0) >> 4) & 12u, 12u); + + // Same visible asset over different buried layers is not a material seam. + Regions.m_vTypes[4] = CEntityRegions::FREEZE; + Regions.m_vRegionKeys.assign(9, CEntityRegions::FREEZE); + Regions.m_vRegionKeys[4] = CEntityRegions::FREEZE + 2048; + EXPECT_EQ(Regions.ComplementCorners(1, 1), 0u); +} + +TEST(EntityRegions, EmptyInnerJunctionTrimsTheTwoSideTiles) +{ + // The diagonal solid owns the inward arc. The two solids touching the + // empty cell by an edge must stop their contours at its tangents. + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes = { + CEntityRegions::SOLID, CEntityRegions::SOLID, CEntityRegions::NONE, + CEntityRegions::SOLID, CEntityRegions::NONE, CEntityRegions::NONE, + CEntityRegions::NONE, CEntityRegions::NONE, CEntityRegions::NONE}; + EXPECT_NE(Regions.TransitionCorners(1, 0) & (1u << (3 + 4)), 0u); + EXPECT_NE(Regions.TransitionCorners(0, 1) & (1u << (1 + 4)), 0u); + for(const ivec2 Tile : {ivec2(1, 0), ivec2(0, 1)}) + { + const unsigned Mask = Regions.Mask(Tile.x, Tile.y, CEntityRegions::SOLID); + const auto Shape = RoundedTiles::Build(Mask, 16, 2, 8, + Regions.BlockerMask(Tile.x, Tile.y, CEntityRegions::SOLID), Regions.TransitionCorners(Tile.x, Tile.y)); + const vec2 Corner = Tile.x ? vec2(0, 32) : vec2(32, 0); + const vec2 Vertex = Tile.x ? Boundary(Shape, true, 0, 1) : Boundary(Shape, false, 0, 1); + EXPECT_LT(length(Vertex - Corner), 0.001f); + } + const auto OuterOnly = RoundedTiles::Build(Regions.Mask(1, 0, CEntityRegions::SOLID), 16, 0, 8, + Regions.BlockerMask(1, 0, CEntityRegions::SOLID), Regions.TransitionCorners(1, 0)); + EXPECT_LT(length(Boundary(OuterOnly, true, 0, 1) - vec2(0, 32)), 0.001f); +} + +TEST(RoundedTiles, EmptyInnerJunctionHasOneSurface) +{ + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes = { + CEntityRegions::SOLID, CEntityRegions::SOLID, CEntityRegions::NONE, + CEntityRegions::SOLID, CEntityRegions::NONE, CEntityRegions::NONE, + CEntityRegions::NONE, CEntityRegions::NONE, CEntityRegions::NONE}; + std::vector> Shapes; + for(const ivec2 Tile : {ivec2(0, 0), ivec2(1, 0), ivec2(0, 1)}) + Shapes.emplace_back(Tile, RoundedTiles::Build(Regions.Mask(Tile.x, Tile.y, CEntityRegions::SOLID), 16, 2, 16, + Regions.BlockerMask(Tile.x, Tile.y, CEntityRegions::SOLID), Regions.TransitionCorners(Tile.x, Tile.y))); + int Overlaps = 0; + for(int Y = 0; Y < 128; ++Y) + for(int X = 0; X < 128; ++X) + { + const vec2 P(16.125f + X * 0.375f, 16.125f + Y * 0.375f); + int Cover = 0; + for(const auto &[Tile, Shape] : Shapes) + Cover += InsideShape(Shape, P - vec2(Tile.x * 32.0f, Tile.y * 32.0f)); + if(P.x >= 32 && P.y >= 32 && std::abs(length(P - vec2(48, 48)) - 16) < 0.6f) + continue; + Overlaps += Cover > 1; + } + EXPECT_EQ(Overlaps, 0); +} + +TEST(RoundedTiles, TrimmedStraightOutlineStopsAtTheArcTangent) +{ + // North-east side tile of a three-solid/one-empty junction. Only the + // final half of its bottom edge is exposed after the diagonal arc. + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes = { + CEntityRegions::SOLID, CEntityRegions::SOLID, CEntityRegions::SOLID, + CEntityRegions::SOLID, CEntityRegions::NONE, CEntityRegions::NONE, + CEntityRegions::NONE, CEntityRegions::NONE, CEntityRegions::NONE}; + const auto Shape = RoundedTiles::Build(Regions.Mask(1, 0, CEntityRegions::SOLID), 16, 2, 16, + Regions.BlockerMask(1, 0, CEntityRegions::SOLID), Regions.TransitionCorners(1, 0)); + const auto Outline = RoundedTiles::Outline(Shape, 2); + const auto Covers = [&](vec2 P) { + for(const auto &T : Outline) + if(Cross(T[1] - T[0], T[2] - T[0]) > 1e-7f && InsideTriangle(P, T[0], T[1], T[2])) + return true; + return false; + }; + EXPECT_FALSE(Covers(vec2(3, 31))); + // A shortened edge must have a flat cap at the tangent. Treating its + // endpoint as a distance-field point adds the triangular purple spur. + EXPECT_FALSE(Covers(vec2(15, 31))); + EXPECT_TRUE(Covers(vec2(20, 31))); + EXPECT_TRUE(Covers(vec2(25, 31))); +} + +TEST(RoundedTiles, TwoMaterialsPartitionCoveredCornerWithoutGaps) +{ + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes.assign(9, CEntityRegions::FREEZE); + Regions.m_vTypes[4] = CEntityRegions::SOLID; + for(float Radius : {0.16f, 8.0f, 16.0f}) + for(int Mode = 0; Mode < 3; ++Mode) + { + std::vector> Shapes; + for(int Y = 0; Y < 3; ++Y) + for(int X = 0; X < 3; ++X) + { + const int Type = Regions.Get(X, Y); + Shapes.emplace_back(ivec2(X, Y), RoundedTiles::Build(Regions.Mask(X, Y, Type), Radius, Mode, 16, + Regions.BlockerMask(X, Y, Type), Regions.TransitionCorners(X, Y))); + } + int Mismatches = 0; + std::vector FirstMismatches; + int FirstCover = -1; + for(int Y = 0; Y < 64; ++Y) + for(int X = 0; X < 64; ++X) + { + const vec2 P(32.125f + X * 0.5f, 32.125f + Y * 0.5f); + int Cover = 0; + for(const auto &[Tile, Shape] : Shapes) + Cover += InsideShape(Shape, P - vec2(Tile.x * 32.0f, Tile.y * 32.0f)); + if(Cover != 1) + { + ++Mismatches; + if(FirstMismatches.empty()) + FirstCover = Cover; + if(FirstMismatches.size() < 4) + FirstMismatches.emplace_back(X, Y); + } + } + EXPECT_EQ(Mismatches, 0) << Radius << "," << Mode << " first " << (FirstMismatches.empty() ? -1 : FirstMismatches[0].x) << "," << (FirstMismatches.empty() ? -1 : FirstMismatches[0].y) << " cover " << FirstCover; + } +} + +TEST(RoundedTiles, SharedMaterialArcHasExactlyOneOutlineOwner) +{ + for(const auto Pair : {std::pair{CEntityRegions::FREEZE, CEntityRegions::SOLID}, + std::pair{CEntityRegions::SOLID, CEntityRegions::FREEZE}}) + { + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes.assign(9, Pair.first); + Regions.m_vTypes[4] = Pair.second; + int Before = 0, After = 0; + for(const ivec2 Tile : {ivec2(0, 0), ivec2(1, 1)}) + { + const int SharedCorner = Tile == ivec2(0, 0) ? 2 : 0; + const int Type = Regions.Get(Tile.x, Tile.y); + const unsigned Mask = Regions.Mask(Tile.x, Tile.y, Type); + auto Shape = RoundedTiles::Build(Mask, 16, 2, 8, + Regions.BlockerMask(Tile.x, Tile.y, Type), Regions.TransitionCorners(Tile.x, Tile.y)); + Before += std::count_if(Shape.m_vContour.begin(), Shape.m_vContour.end(), [&](const auto &S) { return S.m_SharedCorner == SharedCorner; }); + RoundedTiles::RemoveLowerPriorityEdges(Shape, Regions.PriorityMask(Tile.x, Tile.y, Type) & ~Mask); + After += std::count_if(Shape.m_vContour.begin(), Shape.m_vContour.end(), [&](const auto &S) { return S.m_SharedCorner == SharedCorner; }); + } + EXPECT_EQ(Before, 32); + EXPECT_EQ(After, 16); + } +} + +TEST(RoundedTiles, NeighborOutlineStopsAtCoveredArcTangent) +{ + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes.assign(9, CEntityRegions::FREEZE); + Regions.m_vTypes[4] = CEntityRegions::SOLID; + const unsigned Mask = Regions.Mask(1, 0, CEntityRegions::FREEZE); + const auto Shape = RoundedTiles::Build(Mask, 8, 2, 8, + Regions.BlockerMask(1, 0, CEntityRegions::FREEZE), Regions.TransitionCorners(1, 0)); + int BottomEdges = 0; + for(const auto &S : Shape.m_vContour) + if(S.m_A.y == 32 && S.m_B.y == 32 && S.m_A.x != S.m_B.x) + { + ++BottomEdges; + EXPECT_FLOAT_EQ(std::min(S.m_A.x, S.m_B.x), 8); + EXPECT_FLOAT_EQ(std::max(S.m_A.x, S.m_B.x), 24); + } + EXPECT_EQ(BottomEdges, 1); +} + +TEST(RoundedTiles, DifferentCategoryBlocksCurvesAcrossItsCell) +{ + constexpr unsigned East = 1u << 4; + constexpr unsigned South = 1u << 6; + constexpr unsigned SouthEast = 1u << 7; + // Three tiles of one category used to expand into a fourth category. + const auto WithoutBlocker = RoundedTiles::Build(East | South, 16, 1, 16); + const auto WithBlocker = RoundedTiles::Build(East | South, 16, 1, 16, SouthEast); + EXPECT_GT(Area(WithoutBlocker), 1024); + EXPECT_FLOAT_EQ(Area(WithBlocker), 1024); + // A neighboring category sharing the top-right edge prevents an outer + // curve from cutting a hole between the two visible tiles. + EXPECT_TRUE(RoundedTiles::Corner(0, 1, -1, 16, 0).m_Active); + EXPECT_FALSE(RoundedTiles::Corner(0, 1, -1, 16, 0, East).m_Active); +} + +TEST(RoundedTiles, OutlineDoesNotInventAnInnerArcAtCategoryJunction) +{ + constexpr unsigned East = 1u << 4; + constexpr unsigned NorthEast = 1u << 2; + const auto TileCorner = RoundedTiles::Corner(East, 1, -1, 16, 2, NorthEast); + const auto OldOutlineCorner = RoundedTiles::Corner(East | NorthEast, 1, -1, 16, 2, NorthEast); + EXPECT_FALSE(TileCorner.m_Active); + EXPECT_TRUE(OldOutlineCorner.m_Active); + + auto Shape = RoundedTiles::Build(0, 16, 2, 16, East); + const auto CountRightEdges = [](const RoundedTiles::CShape &S) { + return std::count_if(S.m_vContour.begin(), S.m_vContour.end(), [](const RoundedTiles::CSegment &Edge) { + return Edge.m_A.x == 32 && Edge.m_B.x == 32 && Edge.m_A.y != Edge.m_B.y; + }); + }; + EXPECT_GT(CountRightEdges(Shape), 0); + RoundedTiles::RemoveLowerPriorityEdges(Shape, East); + EXPECT_EQ(CountRightEdges(Shape), 0); +} + +TEST(RoundedTiles, BlockedInnerJunctionJoinsStraightOutlineBands) +{ + // Three outlined tiles surround a different category to the north-west. + // Their north and west bands end in different cells; the south-east tile + // must bridge them without changing any tile artwork or creating an arc. + constexpr unsigned North = 1u << 1; + constexpr unsigned West = 1u << 3; + constexpr unsigned NorthWest = 1u << 0; + auto Shape = RoundedTiles::Build(North | West, 16, 2, 4, NorthWest); + ASSERT_EQ(Shape.m_vOutlineJoins.size(), 1u); + EXPECT_EQ(RoundedTiles::Build(North | West, 16, 0, 4).m_vOutlineJoins.size(), 1u); + EXPECT_LT(length(Shape.m_vOutlineJoins[0]), 0.001f); + const auto CoversJoin = [](const RoundedTiles::CShape &S) { + for(const auto &T : RoundedTiles::Outline(S, 2)) + if(Cross(T[1] - T[0], T[2] - T[0]) > 0.0001f && InsideTriangle(vec2(0.5f, 0.5f), T[0], T[1], T[2])) + return true; + return false; + }; + EXPECT_TRUE(CoversJoin(Shape)); + Shape.m_vOutlineJoins.clear(); + EXPECT_FALSE(CoversJoin(Shape)); + Shape = RoundedTiles::Build(North | West, 16, 2, 4, NorthWest); + RoundedTiles::RemoveLowerPriorityEdges(Shape, NorthWest); + EXPECT_TRUE(Shape.m_vOutlineJoins.empty()); +} + +TEST(RoundedTiles, StairOutlineHasOneFourConnectedRasterComponent) +{ + const std::vector Tiles = {ivec2(1, 0), ivec2(0, 1), ivec2(1, 1)}; + const auto CountComponents = [&](bool AddJoin) { + std::array Pixels{}; + for(const ivec2 Tile : Tiles) + { + const unsigned Blocker = Tile == ivec2(1, 0) ? 1u << 3 : Tile == ivec2(0, 1) ? 1u << 1 : 1u << 0; + auto Shape = RoundedTiles::Build(Mask(Tiles, Tile), 16, 2, 4, Blocker); + if(!AddJoin) + Shape.m_vOutlineJoins.clear(); + const auto Triangles = RoundedTiles::Outline(Shape, 2); + for(int Y = 0; Y < 16; ++Y) + for(int X = 0; X < 16; ++X) + { + const vec2 P(30.0f + (X + 0.5f) / 4.0f - Tile.x * 32.0f, 30.0f + (Y + 0.5f) / 4.0f - Tile.y * 32.0f); + for(const auto &T : Triangles) + if(Cross(T[1] - T[0], T[2] - T[0]) > 0.0001f && InsideTriangle(P, T[0], T[1], T[2])) + { + Pixels[Y * 16 + X] = true; + break; + } + } + } + int Components = 0; + for(int I = 0; I < 16 * 16; ++I) + { + if(!Pixels[I]) + continue; + ++Components; + std::vector Queue{I}; + Pixels[I] = false; + for(size_t Head = 0; Head < Queue.size(); ++Head) + { + const int Current = Queue[Head]; + for(const ivec2 D : {ivec2(1, 0), ivec2(-1, 0), ivec2(0, 1), ivec2(0, -1)}) + { + const int X = Current % 16 + D.x, Y = Current / 16 + D.y; + if(X < 0 || X >= 16 || Y < 0 || Y >= 16 || !Pixels[Y * 16 + X]) + continue; + Pixels[Y * 16 + X] = false; + Queue.push_back(Y * 16 + X); + } + } + } + return Components; + }; + EXPECT_EQ(CountComponents(false), 2); + EXPECT_EQ(CountComponents(true), 1); +} + +TEST(RoundedTiles, DisabledIsOneSquare) +{ + for(unsigned M = 0; M < 256; ++M) + { + const auto S = RoundedTiles::Build(M, 0, 2, 4); + ASSERT_EQ(S.m_vQuads.size(), 1u); + EXPECT_FLOAT_EQ(Area(S), 1024); + EXPECT_FLOAT_EQ(Area(S, true), 1); + } +} + +TEST(RoundedTiles, MaximumIsCircleAndPreservesEntireUv) +{ + const auto S = RoundedTiles::Build(0, 16, 2, 32); + EXPECT_NEAR(Area(S), pi * 256, 0.2f); + EXPECT_NEAR(Area(S, true), 1, 1e-5f); + for(const auto &Q : S.m_vQuads) + for(int K = 0; K < 4; ++K) + { + const vec2 Uv = Q.m_Uv[K]; + if(Uv.x == 0 || Uv.x == 1 || Uv.y == 0 || Uv.y == 1) + EXPECT_NEAR(length(Q.m_Pos[K] - vec2(16, 16)), 16, 1e-4f); + } +} + +TEST(RoundedTiles, InnerJunctionFillsHoleWithoutOverlap) +{ + const std::vector Tiles = {ivec2(0, 0), ivec2(0, 1), ivec2(1, 1)}; + for(float R : {0.16f, 8.0f, 16.0f}) + { + float Sum = 0; + for(const auto &P : Tiles) + Sum += Area(RoundedTiles::Build(Mask(Tiles, P), R, 1, 32)); + EXPECT_NEAR(Sum, 3072 + R * R * (1 - pi / 4), 0.1f); + } +} + +TEST(RoundedTiles, InnerJunctionMatchesCircularUnion) +{ + // NW, SW and SE are filled; NE is the missing cell. The rounded inner + // boundary in NE is a quarter-circle centered at (48, 16). + const std::vector Tiles = {ivec2(0, 0), ivec2(0, 1), ivec2(1, 1)}; + std::vector> Shapes; + for(const auto &Tile : Tiles) + Shapes.emplace_back(Tile, RoundedTiles::Build(Mask(Tiles, Tile), 16, 2, 16)); + int Mismatches = 0; + for(int Y = 0; Y < 64; ++Y) + for(int X = 0; X < 64; ++X) + { + const vec2 P(32.125f + X * 0.25f, 16.125f + Y * 0.25f); + const float D = length(P - vec2(48, 16)); + if(std::abs(D - 16) < 0.5f) + continue; + bool Filled = false; + for(const auto &[Tile, Shape] : Shapes) + Filled |= InsideShape(Shape, P - vec2(Tile.x * 32.0f, Tile.y * 32.0f)); + Mismatches += Filled != (D > 16); + } + EXPECT_EQ(Mismatches, 0); +} + +TEST(RoundedTiles, InnerJunctionOutlineStaysInsideUnion) +{ + const std::vector Tiles = {ivec2(0, 0), ivec2(0, 1), ivec2(1, 1)}; + int OutsideTriangles = 0; + for(const auto &Tile : Tiles) + { + const auto Shape = RoundedTiles::Build(Mask(Tiles, Tile), 16, 2, 16); + for(const auto &Triangle : RoundedTiles::Outline(Shape, 2)) + { + const vec2 P = (Triangle[0] + Triangle[1] + Triangle[2]) / 3.0f + vec2(Tile.x * 32.0f, Tile.y * 32.0f); + if(P.x > 32 && P.x < 48 && P.y > 16 && P.y < 32 && length(P - vec2(48, 16)) < 15.5f) + ++OutsideTriangles; + } + } + EXPECT_EQ(OutsideTriangles, 0); +} + +TEST(RoundedTiles, InnerJunctionKeepsArtworkInOriginalCell) +{ + // The missing south-east neighbor expands this tile into its cell. The + // original border/art must remain at its original map coordinates. UVs + // outside the cell are clamped by the sampler per fragment, not at mesh + // vertices: vertex clamping blurs the border at lower mesh detail. + const auto Shape = RoundedTiles::Build(255u ^ 128u, 16, 1, 16); + float MaxUvError = 0.0f; + bool Extrapolates = false; + for(const auto &Q : Shape.m_vQuads) + for(int K = 0; K < 4; ++K) + { + const vec2 Expected = Q.m_Pos[K] / 32.0f; + MaxUvError = std::max(MaxUvError, length(Q.m_SampleUv[K] - Expected)); + Extrapolates |= Q.m_SampleUv[K].x > 1.0f || Q.m_SampleUv[K].y > 1.0f; + } + EXPECT_LT(MaxUvError, 1e-5f); + EXPECT_TRUE(Extrapolates); +} + +TEST(RoundedTiles, OutlineHasNoPointSourcesAtCategoryJunctions) +{ + // A zero-length contour at a square junction paints an isolated triangular + // spot when the surrounding straight edge is covered by another category. + for(unsigned Mask = 0; Mask < 256; ++Mask) + for(int Mode = 0; Mode < 3; ++Mode) + { + const auto Shape = RoundedTiles::Build(Mask, 16, Mode, 4); + for(const auto &Segment : Shape.m_vContour) + EXPECT_GT(length(Segment.m_B - Segment.m_A), 0.001f) << Mask << "," << Mode; + } +} + +TEST(RoundedTiles, ModesAndInterior) +{ + EXPECT_FLOAT_EQ(Area(RoundedTiles::Build(0, 16, 1, 4)), 1024); + EXPECT_EQ(RoundedTiles::Build(255, 16, 2, 4).m_vQuads.size(), 1u); + EXPECT_TRUE(RoundedTiles::Build(255, 16, 2, 4).m_vContour.empty()); + const auto Inner = RoundedTiles::Corner(255 ^ 128, 1, 1, 16, 1); + EXPECT_TRUE(Inner.m_Inner); + EXPECT_FALSE(RoundedTiles::Corner(255 ^ 128, 1, 1, 16, 0).m_Active); +} + +TEST(RoundedTiles, EveryNeighborhoodHasPositiveGeometryAndFullUv) +{ + for(int Mode = 0; Mode < 3; ++Mode) + for(float R : {0.16f, 8.0f, 15.84f, 16.0f}) + for(unsigned M = 0; M < 256; ++M) + { + const auto S = RoundedTiles::Build(M, R, Mode, 4); + ASSERT_NEAR(Area(S, true), 1, 2e-5f) << M << "," << Mode << "," << R; + for(const auto &Q : S.m_vQuads) + { + ASSERT_GE(Cross(Q.m_Pos[1] - Q.m_Pos[0], Q.m_Pos[2] - Q.m_Pos[0]), -0.0001f) << M << "," << Mode; + ASSERT_GE(Cross(Q.m_Pos[2] - Q.m_Pos[0], Q.m_Pos[3] - Q.m_Pos[0]), -0.0001f) << M << "," << Mode; + } + } +} + +TEST(RoundedTiles, SharedEdgesStayWatertight) +{ + // Exhaust the occupancy of a 3x3 neighborhood, including three-way joins. + for(unsigned Bits = 0; Bits < 512; ++Bits) + { + std::vector Tiles; + for(int I = 0; I < 9; ++I) + if(Bits & (1u << I)) + Tiles.emplace_back(I % 3, I / 3); + for(const auto &P : Tiles) + for(const ivec2 D : {ivec2(1, 0), ivec2(0, 1)}) + { + if(std::find(Tiles.begin(), Tiles.end(), P + D) == Tiles.end()) + continue; + for(int Mode = 0; Mode < 3; ++Mode) + { + const auto A = RoundedTiles::Build(Mask(Tiles, P), 16, Mode, 4); + const auto B = RoundedTiles::Build(Mask(Tiles, P + D), 16, Mode, 4); + for(int I = 0; I <= 16; ++I) + { + const vec2 PA = Boundary(A, D.x != 0, 1, I / 16.0f); + const vec2 PB = Boundary(B, D.x != 0, 0, I / 16.0f) + vec2(D.x * 32, D.y * 32); + ASSERT_LT(length(PA - PB), 0.0001f) << Bits << "," << Mode; + } + } + } + } +} + +TEST(RoundedTiles, OutlineIsInsideAndSingleCovered) +{ + const auto Shape = RoundedTiles::Build(0, 16, 2, 16); + for(float Width : {1.0f, 2.0f, 8.0f, 16.0f}) + { + const auto Triangles = RoundedTiles::Outline(Shape, Width); + float Sum = 0; + for(const auto &T : Triangles) + { + const float A = Cross(T[1] - T[0], T[2] - T[0]) * 0.5f; + ASSERT_GE(A, -1e-5f); + Sum += A; + for(const auto &P : T) + ASSERT_LE(length(P - vec2(16, 16)), 16.0001f); + } + EXPECT_LE(Sum, Area(Shape) + 0.01f); + EXPECT_NEAR(Sum, pi * (256 - (16 - Width) * (16 - Width)), 1.5f); + } +} + +TEST(RoundedTiles, DetailMeetsPixelError) +{ + for(float Pixels : {0.1f, 1.0f, 4.0f, 32.0f, 100.0f}) + { + int N = RoundedTiles::Detail(16, Pixels); + EXPECT_LE(16 * Pixels * (1 - std::cos(pi / (8 * N))), 0.2501f); + } +} From 64826270b72cfc68da08328bb5ab85a8779c006c Mon Sep 17 00:00:00 2001 From: XJle6uIIIeK Date: Fri, 25 Sep 2026 23:11:50 +0300 Subject: [PATCH 2/4] Improve entity tile rounding: refactor render layer, fix regions, update tests --- docs/entity_rounding.md | 2 ++ src/engine/client/graphics_threaded.cpp | 17 ++++----- src/game/map/entity_regions.h | 15 ++++++-- src/game/map/render_layer.cpp | 46 +++++++++++++++---------- src/game/map/render_layer.h | 2 +- src/test/rounded_tiles_test.cpp | 21 +++++++++-- 6 files changed, 68 insertions(+), 35 deletions(-) diff --git a/docs/entity_rounding.md b/docs/entity_rounding.md index 44c49a0f85..52626674aa 100644 --- a/docs/entity_rounding.md +++ b/docs/entity_rounding.md @@ -30,6 +30,8 @@ Shapes are cached by neighborhood. Buffered tiles use a fixed four-step corner m Outlines use the distance band inside the same contour, clipped to a disjoint tessellation to avoid double alpha at joins. Cached quad containers are reused by neighborhood and width. Straight walls use a smaller rectangular mesh. Map changes, shutdown and rounding changes release these containers. +Front-layer through/through-cut artwork and the entity tile beneath it share the same rounded silhouette. Their texture coordinates still cover the complete source tile, preserving the striped artwork through the bend. Straight outline segments ending at an adjacent arc use flat tangent caps instead of protruding past the arc. + ## Verification `src/test/rounded_tiles_test.cpp` is registered with the existing GTest runner. It covers disabled geometry, the maximum-radius circle, full UV coverage, concave junction area, all neighborhood patterns and modes, shared-edge continuity, outline area and the detail error bound. diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp index bdae55fc6f..9c1c5914ac 100644 --- a/src/engine/client/graphics_threaded.cpp +++ b/src/engine/client/graphics_threaded.cpp @@ -18,7 +18,6 @@ #include -#include // Temporary visual QA capture; removed after verification. #if defined(CONF_VIDEORECORDER) #include @@ -26,6 +25,8 @@ #include "graphics_threaded.h" +#include + class CSemaphore; static CVideoMode g_aFakeModes[] = { @@ -2883,16 +2884,12 @@ void CGraphics_Threaded::TakeCustomScreenshot(const char *pFilename) void CGraphics_Threaded::Swap() { - // Temporary visual QA capture; removed after verification. - if(std::getenv("BC_QA_ALLOW_INACTIVE_SCREENSHOT")) + static const int64_t QAStart = time_get(); + static bool QACaptured = false; + if(!QACaptured && std::getenv("BC_QA_ALLOW_INACTIVE_SCREENSHOT") && time_get() - QAStart > time_freq() * 10) { - static const int64_t Start = time_get(); - static bool Captured = false; - if(!Captured && time_get() - Start > 10 * time_freq()) - { - TakeCustomScreenshot("screenshots/through-hook-after.png"); - Captured = true; - } + TakeCustomScreenshot("screenshots/through-hook-rounded-qa.png"); + QACaptured = true; } bool Swapped = false; ScreenshotDirect(&Swapped); diff --git a/src/game/map/entity_regions.h b/src/game/map/entity_regions.h index b682ea462a..c1e34685fd 100644 --- a/src/game/map/entity_regions.h +++ b/src/game/map/entity_regions.h @@ -27,6 +27,10 @@ class CEntityRegions std::vector m_vTypes; std::vector m_vRegionKeys; std::vector m_vTopLayers; + static bool IsThrough(int Index) + { + return Index == TILE_THROUGH || Index == TILE_THROUGH_CUT || Index == TILE_THROUGH_ALL || Index == TILE_THROUGH_DIR; + } static int Category(int Index) { @@ -107,15 +111,20 @@ class CEntityRegions bool ShouldRoundTile(int X, int Y, int Layer, int Index) const { - if(Index == 0 || Layer != TopLayer(X, Y)) + if(Index == 0) return false; const int Type = Get(X, Y); + // A front-layer through tile is translucent artwork laid over the game + // tile. Both layers must use the same silhouette, otherwise the square + // front sprite crosses the curved solid outline (or exposes a wedge). + if(Layer == 1 && TopLayer(X, Y) == 0 && Type != NONE && IsThrough(Index)) + return true; + if(Layer != TopLayer(X, Y)) + return false; if(Layer == 2) return Type == TELE; if(Layer == 3) return Type == SWITCH; - // Through and through-cut tiles in the front layer can cover a solid - // without becoming its material. They must retain their own square UVs. return Type != NONE && Category(Index) == Type; } diff --git a/src/game/map/render_layer.cpp b/src/game/map/render_layer.cpp index 8270952970..38b15f2253 100644 --- a/src/game/map/render_layer.cpp +++ b/src/game/map/render_layer.cpp @@ -611,8 +611,16 @@ const RoundedTiles::CShape *CRenderLayerTile::RoundedShape(int X, int Y, int Ind { if(!m_pEntityRegions || m_RoundingPercent <= 0 || !Index) return nullptr; - // Only the visible material owns the rounded mesh. Front-layer through - // tiles may cover a solid but must keep their original square artwork. + if(X == 27 && Y == 9 && m_RoundingLayer == 1) + { + static bool Logged = false; + if(!Logged) + { + Logged = true; + dbg_msg("round-qa", "front index=%d top=%d type=%d should=%d mask=%u", Index, m_pEntityRegions->TopLayer(X, Y), m_pEntityRegions->Get(X, Y), m_pEntityRegions->ShouldRoundTile(X, Y, m_RoundingLayer, Index), m_pEntityRegions->Mask(X, Y, m_pEntityRegions->Get(X, Y))); + } + } + // A front-layer through tile and the game tile beneath it share a mesh. if(!m_pEntityRegions->ShouldRoundTile(X, Y, m_RoundingLayer, Index)) return nullptr; const int Type = m_pEntityRegions->Get(X, Y); @@ -624,7 +632,7 @@ const RoundedTiles::CShape *CRenderLayerTile::RoundedShape(int X, int Y, int Ind if(Mask == 255) return nullptr; const int Steps = m_BuildingRoundingBuffer ? BufferedRoundingSteps : m_RoundingSteps; - const unsigned Key = Mask | (Blockers << 8) | (unsigned(Steps) << 16) | (Transition << 23); + const uint64_t Key = uint64_t(Mask) | (uint64_t(Blockers) << 8) | (uint64_t(Steps) << 16) | (uint64_t(Transition) << 23); auto It = m_RoundedShapes.find(Key); if(It == m_RoundedShapes.end()) It = m_RoundedShapes.emplace(Key, RoundedTiles::Build(Mask, m_RoundingPercent * 0.16f, m_RoundingMode, Steps, Blockers, Transition)).first; @@ -636,20 +644,12 @@ float CRenderLayerTile::RoundedOverlayScale(int X, int Y) const if(!m_pEntityRegions || m_RoundingPercent <= 0 || m_RoundingMode == 1) return 1.0f; const int Type = m_pEntityRegions->Get(X, Y); - if(!Type) + if(Type != CEntityRegions::TELE && Type != CEntityRegions::SWITCH) return 1.0f; - const unsigned Mask = m_pEntityRegions->Mask(X, Y, Type); - const unsigned Blockers = m_pEntityRegions->BlockerMask(X, Y, Type); - const unsigned Complement = m_pEntityRegions->ComplementCorners(X, Y); - const float Radius = m_RoundingPercent * 0.16f; - for(const ivec2 Corner : {ivec2(-1, -1), ivec2(1, -1), ivec2(1, 1), ivec2(-1, 1)}) - { - const int Index = Corner.x < 0 ? (Corner.y < 0 ? 0 : 3) : (Corner.y < 0 ? 1 : 2); - const auto C = RoundedTiles::Corner(Mask, Corner.x, Corner.y, Radius, Complement & (1u << Index) ? 2 : m_RoundingMode, Complement & (1u << Index) ? 0 : Blockers); - if(C.m_Active && !C.m_Inner) - return 1.0f - (1.0f - std::sqrt(0.5f)) * Radius / 16.0f; - } - return 1.0f; + // A text size chosen per tile makes a number in the middle of a teleporter + // region much larger than the same number on its rounded end. Use one size + // for the whole region so labels stay consistent as the contour bends. + return 1.0f - (1.0f - std::sqrt(0.5f)) * (m_RoundingPercent / 100.0f); } void CRenderLayerTile::RenderRoundedTiles(const ColorRGBA &Color, const CRenderLayerParams &Params) @@ -693,6 +693,7 @@ void CRenderLayerTile::RenderRoundedTiles(const ColorRGBA &Color, const CRenderL const auto *pShape = X == MX && Y == MY ? RoundedShape(X, Y, Index) : nullptr; if(!pShape) pShape = □ + const bool ThroughArtwork = m_RoundingLayer == 1 && CEntityRegions::IsThrough(Index); const unsigned TableFlag = (Flags & (TILEFLAG_XFLIP | TILEFLAG_YFLIP)) + ((Flags & TILEFLAG_ROTATE) >> 1); const auto &T = TEX_COORDS_TABLE[TableFlag]; for(const auto &Q : pShape->m_vQuads) @@ -702,7 +703,12 @@ void CRenderLayerTile::RenderRoundedTiles(const ColorRGBA &Color, const CRenderL { // Array/volume samplers clamp extrapolated corner UVs per fragment. // The atlas fallback cannot do that without sampling adjacent tiles. - const vec2 SampleUv = Arrays ? Q.m_SampleUv[K] : vec2(std::clamp(Q.m_SampleUv[K].x, 0.0f, 1.0f), std::clamp(Q.m_SampleUv[K].y, 0.0f, 1.0f)); + // Inner arcs add area outside the original cell. Sampling by + // position clamps a through tile's diagonal stripes to a single + // edge texel there. Stretch its complete source patch over that + // added area instead, as for an outer rounded corner. + const vec2 SourceUv = ThroughArtwork ? Q.m_Uv[K] : Q.m_SampleUv[K]; + const vec2 SampleUv = Arrays ? SourceUv : vec2(std::clamp(SourceUv.x, 0.0f, 1.0f), std::clamp(SourceUv.y, 0.0f, 1.0f)); UV[K] = RoundedTiles::Bilinear({vec2(T.m_aTexX[0], T.m_aTexY[0]), vec2(T.m_aTexX[1], T.m_aTexY[1]), vec2(T.m_aTexX[2], T.m_aTexY[2]), vec2(T.m_aTexX[3], T.m_aTexY[3])}, SampleUv.x, SampleUv.y); if(!Arrays) UV[K] = (vec2(Index % 16, Index / 16) + vec2(Inset, Inset) + UV[K] * (1 - 2 * Inset)) / 16.0f; @@ -869,6 +875,7 @@ void CRenderLayerTile::UploadTileData(std::optional &VisualsO const auto *pShape = CurOverlay == 0 ? RoundedShape(x, y, Index) : nullptr; if(pShape) { + const bool ThroughArtwork = m_RoundingLayer == 1 && CEntityRegions::IsThrough(Index); CGraphicTile Base; CGraphicTileTextureCoords Tex; FillTmpTile(&Base, &Tex, Flags, Index, x, y, ivec2(0, 0), 32); @@ -881,7 +888,10 @@ void CRenderLayerTile::UploadTileData(std::optional &VisualsO { vec4 U[4]; for(int K = 0; K < 4; ++K) - U[K] = mix(mix(T[0], T[1], Q.m_SampleUv[K].x), mix(T[3], T[2], Q.m_SampleUv[K].x), Q.m_SampleUv[K].y); + { + const vec2 SourceUv = ThroughArtwork ? Q.m_Uv[K] : Q.m_SampleUv[K]; + U[K] = mix(mix(T[0], T[1], SourceUv.x), mix(T[3], T[2], SourceUv.x), SourceUv.y); + } vTmpTileTexCoords.push_back({U[0], U[1], U[2], U[3]}); } } diff --git a/src/game/map/render_layer.h b/src/game/map/render_layer.h index db137f6b83..5dc017a1fb 100644 --- a/src/game/map/render_layer.h +++ b/src/game/map/render_layer.h @@ -158,7 +158,7 @@ class CRenderLayerTile : public CRenderLayer int m_RoundingPercent = -1, m_RoundingMode = -1, m_RoundingSteps = 2; bool m_BuildingRoundingBuffer = false; static constexpr int BufferedRoundingSteps = 4; - std::unordered_map m_RoundedShapes; + std::unordered_map m_RoundedShapes; void UpdateRounding(); const RoundedTiles::CShape *RoundedShape(int X, int Y, int Index); float RoundedOverlayScale(int X, int Y) const; diff --git a/src/test/rounded_tiles_test.cpp b/src/test/rounded_tiles_test.cpp index 880a7c222f..03be2f32d9 100644 --- a/src/test/rounded_tiles_test.cpp +++ b/src/test/rounded_tiles_test.cpp @@ -90,20 +90,35 @@ TEST(EntityRegions, RoundingMaskOnlyIncludesTheSameVisibleCategory) EXPECT_EQ(Regions.BlockerMask(1, 1, CEntityRegions::FREEZE), 1u << 4); } -TEST(EntityRegions, ThroughHookOverlayKeepsItsOwnSquareTexture) +TEST(EntityRegions, ThroughHookOverlaySharesTheRoundedSolidSilhouette) { CEntityRegions Regions; Regions.m_Width = Regions.m_Height = 1; Regions.m_vTypes = {CEntityRegions::SOLID}; Regions.m_vTopLayers = {0}; EXPECT_TRUE(Regions.ShouldRoundTile(0, 0, 0, TILE_SOLID)); - EXPECT_FALSE(Regions.ShouldRoundTile(0, 0, 1, TILE_THROUGH)); - EXPECT_FALSE(Regions.ShouldRoundTile(0, 0, 1, TILE_THROUGH_CUT)); + EXPECT_TRUE(Regions.ShouldRoundTile(0, 0, 1, TILE_THROUGH)); + EXPECT_TRUE(Regions.ShouldRoundTile(0, 0, 1, TILE_THROUGH_CUT)); + EXPECT_TRUE(Regions.ShouldRoundTile(0, 0, 1, TILE_THROUGH_ALL)); + EXPECT_TRUE(Regions.ShouldRoundTile(0, 0, 1, TILE_THROUGH_DIR)); + const auto Rounded = RoundedTiles::Build(0, 16, 2, 16); + EXPECT_LT(Area(Rounded), 850.0f); + EXPECT_NEAR(Area(Rounded, true), 1.0f, 0.001f); Regions.m_vTopLayers = {1}; EXPECT_FALSE(Regions.ShouldRoundTile(0, 0, 0, TILE_SOLID)); + EXPECT_FALSE(Regions.ShouldRoundTile(0, 0, 1, TILE_THROUGH)); EXPECT_TRUE(Regions.ShouldRoundTile(0, 0, 1, TILE_NOHOOK)); } +TEST(EntityRegions, ThroughOverlayDoesNotSuppressAdjacentJunctions) +{ + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes.assign(9, CEntityRegions::FREEZE); + Regions.m_vTypes[4] = CEntityRegions::SOLID; + EXPECT_NE(Regions.ComplementCorners(1, 1), 0u); +} + TEST(EntityRegions, VisibleTeleporterSuppressesCoveredUnfreezeOutline) { // Felian places unfreeze in the game layer underneath tele tiles. The From 70f24b24e697a5349c7a9a6435ef24cdc7179beb Mon Sep 17 00:00:00 2001 From: XJle6uIIIeK Date: Mon, 28 Sep 2026 16:00:58 +0300 Subject: [PATCH 3/4] Fix through-hook artwork and continuous rounded outlines --- docs/entity_rounding.md | 4 +- src/engine/client/graphics_threaded.cpp | 11 +--- src/game/map/render_layer.cpp | 17 +----- src/game/map/rounded_tiles.h | 59 +++++++++++++------- src/test/rounded_tiles_test.cpp | 72 ++++++++++++++++++++++++- 5 files changed, 116 insertions(+), 47 deletions(-) diff --git a/docs/entity_rounding.md b/docs/entity_rounding.md index 52626674aa..271bd081b3 100644 --- a/docs/entity_rounding.md +++ b/docs/entity_rounding.md @@ -30,7 +30,7 @@ Shapes are cached by neighborhood. Buffered tiles use a fixed four-step corner m Outlines use the distance band inside the same contour, clipped to a disjoint tessellation to avoid double alpha at joins. Cached quad containers are reused by neighborhood and width. Straight walls use a smaller rectangular mesh. Map changes, shutdown and rounding changes release these containers. -Front-layer through/through-cut artwork and the entity tile beneath it share the same rounded silhouette. Their texture coordinates still cover the complete source tile, preserving the striped artwork through the bend. Straight outline segments ending at an adjacent arc use flat tangent caps instead of protruding past the arc. +Front-layer through/through-cut artwork and the entity tile beneath it share the same rounded silhouette. A complementary inner wedge samples the through asset in the diagonal cell's local coordinates. This continues its repeating stripe pattern into the added area instead of stretching a clamped edge texel. Straight outline segments ending at an adjacent arc use flat caps. The signed cap distance remains continuous while clipping mesh cells, preserving the last part of the line without an endpoint spur. The two side tiles also retain that arc as an outline distance source, while their geometry stays square. This fills the inward part of the curved band on both sides of the tangent without overlapping tile meshes; material priority still determines who draws a shared arc. Number overlays use one size for all tiles at the selected radius, so an interior label does not grow relative to labels on the rounded ends. ## Verification @@ -63,3 +63,5 @@ The later user screenshot exposed a separate discontinuity at stair junctions: w The covered material junction now uses complementary geometry instead of suppressing both corners. A raster partition test checks that two materials cover every sampled point exactly once at three radii and all three modes. The two straight outlines next to the curve stop at its tangents, and only one material owns the arc. All 24 focused tests pass. A software preview in `build-rounding/covered-preview.png` shows the same staircase at 0%, 50%, and 100%. The later jagged-edge regression had two causes at an open-sky three-against-one junction. The diagonal tile bent its whole corner mesh across both side tiles, and the outline fast path widened a shortened straight segment into a full-width band. Now the diagonal tile retains its original square and adds only the circular wedge in the empty cell; the two side tiles stop their contours at the arc tangents. The rectangular outline fast path is restricted to complete tile sides. A sampled partition test and a tangent-extent test cover these failures. All 27 focused tests pass. Close-up screenshots from the game client at 100% in all three modes and at 50% are in `build-rounding/runtime/screenshots/qa-close-*`; Felian checks are in `qa-felian-*` in the same directory. The temporary inactive-window screenshot allowance used for these captures is removed from the source. + +Verified on 2026-09-28: 32 focused tests pass, including repeating through-hook wedge UVs, a fractional-radius straight cap, and the arc's inward band in both side tiles. The side-tile regression fails in all 48 sampled radius/mode/detail combinations before the fix. Fresh game captures with the user's `my_entities1` atlas cover 100% in modes 0/1/2 and 77% in mode 2 on OpenGL 1.5, plus Vulkan at 100%. This exercises the unbuffered and buffered texture paths. Three tangent rectangles in the 100% combined screenshot change from two or three disconnected white-outline components to one 4-connected component each. These captures use a local fixture, not the live Felian server. View `build-rounding/through-rounding-check.html` for the unedited screenshots. The temporary auto-capture hook is removed from the final source and executable. diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp index 9c1c5914ac..fe188bf447 100644 --- a/src/engine/client/graphics_threaded.cpp +++ b/src/engine/client/graphics_threaded.cpp @@ -25,8 +25,6 @@ #include "graphics_threaded.h" -#include - class CSemaphore; static CVideoMode g_aFakeModes[] = { @@ -710,7 +708,7 @@ void CGraphics_Threaded::ScreenshotDirect(bool *pSwapped) if(!m_DoScreenshot) return; m_DoScreenshot = false; - if(!WindowActive() && !std::getenv("BC_QA_ALLOW_INACTIVE_SCREENSHOT")) + if(!WindowActive()) return; CImageInfo Image; @@ -2884,13 +2882,6 @@ void CGraphics_Threaded::TakeCustomScreenshot(const char *pFilename) void CGraphics_Threaded::Swap() { - static const int64_t QAStart = time_get(); - static bool QACaptured = false; - if(!QACaptured && std::getenv("BC_QA_ALLOW_INACTIVE_SCREENSHOT") && time_get() - QAStart > time_freq() * 10) - { - TakeCustomScreenshot("screenshots/through-hook-rounded-qa.png"); - QACaptured = true; - } bool Swapped = false; ScreenshotDirect(&Swapped); ReadPixelDirect(&Swapped); diff --git a/src/game/map/render_layer.cpp b/src/game/map/render_layer.cpp index 38b15f2253..18f6eb4c94 100644 --- a/src/game/map/render_layer.cpp +++ b/src/game/map/render_layer.cpp @@ -611,15 +611,6 @@ const RoundedTiles::CShape *CRenderLayerTile::RoundedShape(int X, int Y, int Ind { if(!m_pEntityRegions || m_RoundingPercent <= 0 || !Index) return nullptr; - if(X == 27 && Y == 9 && m_RoundingLayer == 1) - { - static bool Logged = false; - if(!Logged) - { - Logged = true; - dbg_msg("round-qa", "front index=%d top=%d type=%d should=%d mask=%u", Index, m_pEntityRegions->TopLayer(X, Y), m_pEntityRegions->Get(X, Y), m_pEntityRegions->ShouldRoundTile(X, Y, m_RoundingLayer, Index), m_pEntityRegions->Mask(X, Y, m_pEntityRegions->Get(X, Y))); - } - } // A front-layer through tile and the game tile beneath it share a mesh. if(!m_pEntityRegions->ShouldRoundTile(X, Y, m_RoundingLayer, Index)) return nullptr; @@ -703,11 +694,7 @@ void CRenderLayerTile::RenderRoundedTiles(const ColorRGBA &Color, const CRenderL { // Array/volume samplers clamp extrapolated corner UVs per fragment. // The atlas fallback cannot do that without sampling adjacent tiles. - // Inner arcs add area outside the original cell. Sampling by - // position clamps a through tile's diagonal stripes to a single - // edge texel there. Stretch its complete source patch over that - // added area instead, as for an outer rounded corner. - const vec2 SourceUv = ThroughArtwork ? Q.m_Uv[K] : Q.m_SampleUv[K]; + const vec2 SourceUv = RoundedTiles::SampleUv(Q, K, ThroughArtwork); const vec2 SampleUv = Arrays ? SourceUv : vec2(std::clamp(SourceUv.x, 0.0f, 1.0f), std::clamp(SourceUv.y, 0.0f, 1.0f)); UV[K] = RoundedTiles::Bilinear({vec2(T.m_aTexX[0], T.m_aTexY[0]), vec2(T.m_aTexX[1], T.m_aTexY[1]), vec2(T.m_aTexX[2], T.m_aTexY[2]), vec2(T.m_aTexX[3], T.m_aTexY[3])}, SampleUv.x, SampleUv.y); if(!Arrays) @@ -889,7 +876,7 @@ void CRenderLayerTile::UploadTileData(std::optional &VisualsO vec4 U[4]; for(int K = 0; K < 4; ++K) { - const vec2 SourceUv = ThroughArtwork ? Q.m_Uv[K] : Q.m_SampleUv[K]; + const vec2 SourceUv = RoundedTiles::SampleUv(Q, K, ThroughArtwork); U[K] = mix(mix(T[0], T[1], SourceUv.x), mix(T[3], T[2], SourceUv.x), SourceUv.y); } vTmpTileTexCoords.push_back({U[0], U[1], U[2], U[3]}); diff --git a/src/game/map/rounded_tiles.h b/src/game/map/rounded_tiles.h index 5fe3c8ed44..acd2dab2fc 100644 --- a/src/game/map/rounded_tiles.h +++ b/src/game/map/rounded_tiles.h @@ -16,8 +16,17 @@ namespace RoundedTiles std::array m_Pos; // clockwise: TL, TR, BR, BL std::array m_Uv; // original cell parameter, including shared edges std::array m_SampleUv; // texture sampling can hold artwork in place + vec2 m_RepeatOffset = vec2(0, 0); // diagonal cell filled by an inner wedge }; + inline vec2 SampleUv(const CQuad &Quad, int Vertex, bool RepeatingArtwork) + { + // A complementary wedge lies wholly in the diagonal cell. A repeating + // through-hook pattern uses that cell's local UVs instead of clamping + // the source tile's edge across the newly filled area. + return Quad.m_SampleUv[Vertex] - (RepeatingArtwork ? Quad.m_RepeatOffset : vec2(0, 0)); + } + struct CSegment { vec2 m_A, m_B; @@ -132,7 +141,8 @@ namespace RoundedTiles const auto MakeCorner = [&](int I, int X, int Y) { // A covered material corner must round even if its neighbor would // normally block it. An empty corner still follows the selected mode. - const bool Covered = (ComplementCorners & (1u << I)) && Occupied(BlockerMask, X, Y); + const bool Covered = ((ComplementCorners & (1u << I)) && Occupied(BlockerMask, X, Y)) || + ((TrimCorners & (1u << I)) && (Occupied(BlockerMask, X, 0) || Occupied(BlockerMask, 0, Y))); return Corner(Mask, X, Y, Radius, Covered ? 2 : Mode, Covered ? 0 : BlockerMask); }; std::array Corners = { @@ -153,11 +163,9 @@ namespace RoundedTiles { Corners[I].m_TrimX = MissingY; Corners[I].m_TrimY = MissingX; - // Only the diagonal tile draws the inward arc. If a side - // tile also bends into the empty cell, its mesh and outline - // overlap the arc and leave visible square stubs. - if(Corners[I].m_Inner) - Corners[I].m_Active = false; + // Keep the arc as a distance source: its inward band reaches + // into this side tile before the straight-edge tangent. Only + // the diagonal tile adds geometry into the empty cell. } } } @@ -167,7 +175,7 @@ namespace RoundedTiles // the two materials. auto MeshCorners = Corners; for(auto &C : MeshCorners) - if(C.m_Complement && C.m_Inner) + if((C.m_Complement || C.m_TrimX || C.m_TrimY) && C.m_Inner) C.m_Active = false; bool Active = false; for(const auto &C : MeshCorners) @@ -220,6 +228,7 @@ namespace RoundedTiles std::swap(P, Q); CQuad Wedge; Wedge.m_Pos = {C.m_Origin, P, Q, Q}; + Wedge.m_RepeatOffset = Sign; for(int K = 0; K < 4; ++K) Wedge.m_Uv[K] = Wedge.m_SampleUv[K] = Wedge.m_Pos[K] / 32.0f; Shape.m_vQuads.push_back(Wedge); @@ -251,7 +260,8 @@ namespace RoundedTiles { const float A = (pi * 0.5f) * I / (2 * Steps); vec2 Next = C.m_Center - vec2(Sign.x * std::cos(A), Sign.y * std::sin(A)) * Radius; - Shape.m_vContour.push_back({Previous, Next, C.m_Complement ? CornerIndex : -1}); + Shape.m_vContour.push_back({Previous, Next, + (C.m_Complement || C.m_TrimX || C.m_TrimY) ? CornerIndex : -1}); Previous = Next; } } @@ -304,22 +314,31 @@ namespace RoundedTiles }); } - inline float Distance(const CShape &Shape, vec2 P) + inline float BandDistance(const CShape &Shape, vec2 P, float Width) { float Result = 1e10f; for(const auto &S : Shape.m_vContour) { const vec2 D = S.m_B - S.m_A; - const float Projection = dot(P - S.m_A, D) / std::max(dot(D, D), 1e-12f); - // A shortened straight side ends at a neighboring arc tangent. A - // round endpoint cap would spill past it as a triangular outline stub. - if((Projection < 0 && S.m_ButtA) || (Projection > 1 && S.m_ButtB)) - continue; + const float LengthSquared = std::max(dot(D, D), 1e-12f); + const float Projection = dot(P - S.m_A, D) / LengthSquared; const float T = std::clamp(Projection, 0.0f, 1.0f); - Result = std::min(Result, length(P - (S.m_A + D * T))); + float Band = length(P - (S.m_A + D * T)) - Width; + // Flat caps need a continuous signed half-plane, not an infinite + // distance beyond the endpoint. Interpolating an infinite value while + // clipping a mesh cell cuts off the last part of the straight outline. + if(S.m_ButtA || S.m_ButtB) + { + const float SegmentLength = std::sqrt(LengthSquared); + if(S.m_ButtA) + Band = std::max(Band, -Projection * SegmentLength); + if(S.m_ButtB) + Band = std::max(Band, (Projection - 1.0f) * SegmentLength); + } + Result = std::min(Result, Band); } for(const vec2 Join : Shape.m_vOutlineJoins) - Result = std::min(Result, length(P - Join)); + Result = std::min(Result, length(P - Join) - Width); return Result; } @@ -347,7 +366,7 @@ namespace RoundedTiles { if(Grid[X + 1] <= Grid[X] || Grid[Y + 1] <= Grid[Y]) continue; - if(Distance(Shape, vec2((Grid[X] + Grid[X + 1]) * 0.5f, (Grid[Y] + Grid[Y + 1]) * 0.5f)) > Width) + if(BandDistance(Shape, vec2((Grid[X] + Grid[X + 1]) * 0.5f, (Grid[Y] + Grid[Y + 1]) * 0.5f), Width) > 0) continue; const vec2 A(Grid[X], Grid[Y]), B(Grid[X + 1], Grid[Y]), C(Grid[X + 1], Grid[Y + 1]), D(Grid[X], Grid[Y + 1]); Result.push_back({A, B, C}); @@ -357,12 +376,12 @@ namespace RoundedTiles } for(const auto &Q : Shape.m_vQuads) { - // Distance to the contour is 1-Lipschitz. Skip patches whose + // The signed distance band is 1-Lipschitz. Skip patches whose // entire convex hull is farther than the outline width; most of the // increasingly fine patches at high zoom lie in the tile interior. const vec2 Center = (Q.m_Pos[0] + Q.m_Pos[1] + Q.m_Pos[2] + Q.m_Pos[3]) * 0.25f; const float Reach = std::max({length(Q.m_Pos[0] - Center), length(Q.m_Pos[1] - Center), length(Q.m_Pos[2] - Center), length(Q.m_Pos[3] - Center)}); - if(Distance(Shape, Center) > Width + Reach) + if(BandDistance(Shape, Center, Width) > Reach) continue; const float Size = std::max({length(Q.m_Pos[1] - Q.m_Pos[0]), length(Q.m_Pos[3] - Q.m_Pos[0]), length(Q.m_Pos[2] - Q.m_Pos[1]), length(Q.m_Pos[2] - Q.m_Pos[3])}); const int N = std::max(2, (int)std::ceil(Size / 2.0f)); @@ -380,7 +399,7 @@ namespace RoundedTiles for(int K = 0; K < 3; ++K) { const vec2 A = Tri[K], B = Tri[(K + 1) % 3]; - const float DA = Width - Distance(Shape, A), DB = Width - Distance(Shape, B); + const float DA = -BandDistance(Shape, A, Width), DB = -BandDistance(Shape, B, Width); if(DA >= 0) Polygon[Count++] = A; if((DA >= 0) != (DB >= 0)) diff --git a/src/test/rounded_tiles_test.cpp b/src/test/rounded_tiles_test.cpp index 03be2f32d9..f751bd39a2 100644 --- a/src/test/rounded_tiles_test.cpp +++ b/src/test/rounded_tiles_test.cpp @@ -257,11 +257,81 @@ TEST(RoundedTiles, TrimmedStraightOutlineStopsAtTheArcTangent) EXPECT_FALSE(Covers(vec2(3, 31))); // A shortened edge must have a flat cap at the tangent. Treating its // endpoint as a distance-field point adds the triangular purple spur. - EXPECT_FALSE(Covers(vec2(15, 31))); + // The arc's inward band reaches into this side tile before its tangent. + EXPECT_TRUE(Covers(vec2(15, 31))); + EXPECT_FALSE(Covers(vec2(9, 31))); EXPECT_TRUE(Covers(vec2(20, 31))); EXPECT_TRUE(Covers(vec2(25, 31))); } +TEST(RoundedTiles, FlatOutlineCapDoesNotLoseTheLastMeshCell) +{ + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes = { + CEntityRegions::SOLID, CEntityRegions::SOLID, CEntityRegions::SOLID, + CEntityRegions::SOLID, CEntityRegions::NONE, CEntityRegions::NONE, + CEntityRegions::NONE, CEntityRegions::NONE, CEntityRegions::NONE}; + const float Radius = 12.3f; + auto Shape = RoundedTiles::Build(Regions.Mask(1, 0, CEntityRegions::SOLID), Radius, 2, 8, + Regions.BlockerMask(1, 0, CEntityRegions::SOLID), Regions.TransitionCorners(1, 0)); + // Isolate the straight cap; the neighboring arc also covers this area. + std::erase_if(Shape.m_vContour, [](const auto &S) { return S.m_A.y != 32 || S.m_B.y != 32; }); + const auto Outline = RoundedTiles::Outline(Shape, 2); + const auto Covers = [&](vec2 P) { + return std::any_of(Outline.begin(), Outline.end(), [&](const auto &T) { + return Cross(T[1] - T[0], T[2] - T[0]) > 1e-7f && InsideTriangle(P, T[0], T[1], T[2]); + }); + }; + EXPECT_FALSE(Covers(vec2(Radius - 0.1f, 31))); + EXPECT_TRUE(Covers(vec2(Radius + 0.1f, 31))); +} + +TEST(RoundedTiles, InnerArcOutlineContinuesInsideBothSideTiles) +{ + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes = { + CEntityRegions::SOLID, CEntityRegions::SOLID, CEntityRegions::SOLID, + CEntityRegions::SOLID, CEntityRegions::NONE, CEntityRegions::NONE, + CEntityRegions::SOLID, CEntityRegions::NONE, CEntityRegions::NONE}; + for(const float Radius : {4.0f, 12.3f, 16.0f}) + for(const int Mode : {1, 2}) + for(const int Steps : {2, 4, 8, 16}) + for(const ivec2 Tile : {ivec2(1, 0), ivec2(0, 1)}) + { + const auto Shape = RoundedTiles::Build(Regions.Mask(Tile.x, Tile.y, CEntityRegions::SOLID), Radius, Mode, Steps, + Regions.BlockerMask(Tile.x, Tile.y, CEntityRegions::SOLID), Regions.TransitionCorners(Tile.x, Tile.y)); + const auto Outline = RoundedTiles::Outline(Shape, 2); + const vec2 P = Tile.x ? vec2(Radius - 0.25f, 31) : vec2(31, Radius - 0.25f); + EXPECT_TRUE(std::any_of(Outline.begin(), Outline.end(), [&](const auto &T) { + return Cross(T[1] - T[0], T[2] - T[0]) > 1e-7f && InsideTriangle(P, T[0], T[1], T[2]); + })) << "radius=" << Radius << " mode=" << Mode << " steps=" << Steps << " tile=" << Tile.x << ',' << Tile.y; + } +} + +TEST(RoundedTiles, ThroughArtworkContinuesIntoTheDiagonalWedge) +{ + const auto Shape = RoundedTiles::Build((1u << 3) | (1u << 6), 16, 2, 8, 0, 1u << 3); + int Wedges = 0; + for(const auto &Q : Shape.m_vQuads) + { + if(length(Q.m_RepeatOffset) < 0.5f) + continue; + ++Wedges; + for(int K = 0; K < 4; ++K) + { + const vec2 UV = RoundedTiles::SampleUv(Q, K, true); + EXPECT_GE(UV.x, -0.0001f); + EXPECT_LE(UV.x, 1.0001f); + EXPECT_GE(UV.y, -0.0001f); + EXPECT_LE(UV.y, 1.0001f); + EXPECT_LT(length(UV + Q.m_RepeatOffset - Q.m_Pos[K] / 32.0f), 0.0001f); + } + } + EXPECT_GT(Wedges, 0); +} + TEST(RoundedTiles, TwoMaterialsPartitionCoveredCornerWithoutGaps) { CEntityRegions Regions; From 83c07d188036681a7fd0524e8aad7e6629846d65 Mon Sep 17 00:00:00 2001 From: XJle6uIIIeK Date: Mon, 28 Sep 2026 17:03:39 +0300 Subject: [PATCH 4/4] Index rounded outline boundaries for far zoom and adapt current renderer APIs --- CMakeLists.txt | 1 + docs/entity_rounding.md | 16 ++- docs/images/entity-rounding-far.png | Bin 0 -> 58841 bytes docs/images/entity-rounding-fractional.png | Bin 0 -> 160573 bytes docs/images/entity-rounding-labels.png | Bin 0 -> 125285 bytes docs/images/entity-rounding-through.png | Bin 0 -> 152726 bytes src/engine/client/graphics_threaded.cpp | 3 +- .../components/tclient/menus_tclient.cpp | 3 +- .../client/components/tclient/outlines.cpp | 108 ++++++++++------ src/game/client/components/tclient/outlines.h | 4 + src/game/map/entity_outline.h | 106 ++++++++++++++++ src/game/map/entity_regions.h | 6 +- src/game/map/render_layer.cpp | 11 +- src/game/map/render_layer.h | 8 +- src/game/map/rounded_tiles.h | 2 +- src/test/rounded_tiles_test.cpp | 120 +++++++++++++++++- 16 files changed, 328 insertions(+), 60 deletions(-) create mode 100644 docs/images/entity-rounding-far.png create mode 100644 docs/images/entity-rounding-fractional.png create mode 100644 docs/images/entity-rounding-labels.png create mode 100644 docs/images/entity-rounding-through.png create mode 100644 src/game/map/entity_outline.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 80efe8e230..0273bf9325 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3363,6 +3363,7 @@ if(CLIENT) ) set_src(GAME_MAP GLOB_RECURSE src/game/map # tidy-alphabetical-start + entity_outline.h entity_regions.h envelope_extrema.cpp envelope_extrema.h diff --git a/docs/entity_rounding.md b/docs/entity_rounding.md index 271bd081b3..f69cace052 100644 --- a/docs/entity_rounding.md +++ b/docs/entity_rounding.md @@ -28,7 +28,7 @@ Buffered tile vertices use floating-point texture coordinates. Each map cell rec Shapes are cached by neighborhood. Buffered tiles use a fixed four-step corner mesh, while high zoom draws only visible tiles at the screen-space detail needed there. Zoom-only detail changes no longer re-upload every map tile. Radius and mode changes still rebuild the buffered geometry. Atlas selection is resolved by the existing texture path and does not require rebuilding UVs. Culling includes the neighboring cell so expanded junctions do not disappear at screen edges. -Outlines use the distance band inside the same contour, clipped to a disjoint tessellation to avoid double alpha at joins. Cached quad containers are reused by neighborhood and width. Straight walls use a smaller rectangular mesh. Map changes, shutdown and rounding changes release these containers. +Outlines use the distance band inside the same contour, clipped to a disjoint tessellation to avoid double alpha at joins. Cached quad containers are reused by neighborhood and width. Straight walls use a smaller rectangular mesh. A boundary index built on map load visits only visible contour cells, rather than rescanning the full viewport every frame. Repeated contours outside map borders use scaled straight strips. Map changes, shutdown and rounding changes release the containers. Front-layer through/through-cut artwork and the entity tile beneath it share the same rounded silhouette. A complementary inner wedge samples the through asset in the diagonal cell's local coordinates. This continues its repeating stripe pattern into the added area instead of stretching a clamped edge texel. Straight outline segments ending at an adjacent arc use flat caps. The signed cap distance remains continuous while clipping mesh cells, preserving the last part of the line without an endpoint spur. The two side tiles also retain that arc as an outline distance source, while their geometry stays square. This fills the inward part of the curved band on both sides of the tangent without overlapping tile meshes; material priority still determines who draws a shared arc. Number overlays use one size for all tiles at the selected radius, so an interior label does not grow relative to labels on the rounded ends. @@ -36,7 +36,7 @@ Front-layer through/through-cut artwork and the entity tile beneath it share the `src/test/rounded_tiles_test.cpp` is registered with the existing GTest runner. It covers disabled geometry, the maximum-radius circle, full UV coverage, concave junction area, all neighborhood patterns and modes, shared-edge continuity, outline area and the detail error bound. -Run the project's `testrunner` with `--gtest_filter=RoundedTiles.*`. Build `game-client` with `VULKAN=ON` to validate both compiled backends and Vulkan shaders. +Run the project's `testrunner` with `--gtest_filter=RoundedTiles.*:EntityRegions.*:EntityOutlineIndex.*`. Build `game-client` with `VULKAN=ON` to validate both compiled backends and Vulkan shaders. Verified on 2026-09-22: @@ -65,3 +65,15 @@ The covered material junction now uses complementary geometry instead of suppres The later jagged-edge regression had two causes at an open-sky three-against-one junction. The diagonal tile bent its whole corner mesh across both side tiles, and the outline fast path widened a shortened straight segment into a full-width band. Now the diagonal tile retains its original square and adds only the circular wedge in the empty cell; the two side tiles stop their contours at the arc tangents. The rectangular outline fast path is restricted to complete tile sides. A sampled partition test and a tangent-extent test cover these failures. All 27 focused tests pass. Close-up screenshots from the game client at 100% in all three modes and at 50% are in `build-rounding/runtime/screenshots/qa-close-*`; Felian checks are in `qa-felian-*` in the same directory. The temporary inactive-window screenshot allowance used for these captures is removed from the source. Verified on 2026-09-28: 32 focused tests pass, including repeating through-hook wedge UVs, a fractional-radius straight cap, and the arc's inward band in both side tiles. The side-tile regression fails in all 48 sampled radius/mode/detail combinations before the fix. Fresh game captures with the user's `my_entities1` atlas cover 100% in modes 0/1/2 and 77% in mode 2 on OpenGL 1.5, plus Vulkan at 100%. This exercises the unbuffered and buffered texture paths. Three tangent rectangles in the 100% combined screenshot change from two or three disconnected white-outline components to one 4-connected component each. These captures use a local fixture, not the live Felian server. View `build-rounding/through-rounding-check.html` for the unedited screenshots. The temporary auto-capture hook is removed from the final source and executable. + +### Integration with current BestClient main + +Merged upstream main `f7295c203cb80a8b1e760c5c7332269be1ed8aae` on 2026-09-28. The renderer uses the current screen rectangle, layer initialization callback, vertex color and FPS fog APIs. The updated bundled libraries and all 38 Vulkan shaders build with the client and server in Release mode. + +The full test runner passes 407 tests, with three existing tests disabled. The 36 entity rounding tests include four boundary-index regressions: empty views, exact neighborhood masks, bounded traversal at extreme zoom, and equivalent coverage outside map borders. + +Fresh game captures verify outer-only, inner-only and combined rounding at 100%, combined rounding at 77%, and runtime changes through 0%, 50% and 77%. OpenGL 1.5, OpenGL 3.3 and Vulkan render the through-hook fixture successfully. The three sampled tangent rectangles have one connected white-outline component each at 100% and 77%. Teleporter labels keep the same size at the ends and in the middle of the L-shaped region. Felian was also checked at close and extreme far zoom. Temporary screenshot and performance instrumentation is removed from the production source. + +On Felian with Vulkan, a 1600-by-1000 viewport covering 1546-by-966 tiles, 100% combined rounding and all outlines enabled, steady samples improved from 59–86 FPS to 250–263 FPS. Outline CPU time fell from 9–14 ms to 1.1–1.2 ms, and visited cells fell from 1,493,436 to 8,953. These are local measurements on a GTX 1650 SUPER, not a guarantee for other hardware. Rounding disabled reached 490–569 FPS, but its existing central outline culling cap renders a smaller area, so that result is not an equivalent-coverage comparison. + +Unedited captures: [through-hook junctions at 100%](images/entity-rounding-through.png), [fractional radius at 77%](images/entity-rounding-fractional.png), [consistent teleporter labels](images/entity-rounding-labels.png), and [Felian at extreme far zoom](images/entity-rounding-far.png). diff --git a/docs/images/entity-rounding-far.png b/docs/images/entity-rounding-far.png new file mode 100644 index 0000000000000000000000000000000000000000..5b19f1780af7e5de86aa0fea9514b7465957bfb8 GIT binary patch literal 58841 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 literal 0 HcmV?d00001 diff --git a/docs/images/entity-rounding-fractional.png b/docs/images/entity-rounding-fractional.png new file mode 100644 index 0000000000000000000000000000000000000000..22826394289a134edd6dd91f8ad6942606d776bb GIT binary patch literal 160573 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

RZo~4$+?6kFM>>EU8d9N0x-mW-SY<|j+} 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 literal 0 HcmV?d00001 diff --git a/docs/images/entity-rounding-labels.png b/docs/images/entity-rounding-labels.png new file mode 100644 index 0000000000000000000000000000000000000000..c7453da5a9d44478f278affd74aa01fdc2e739eb GIT binary patch literal 125285 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


ffK2PIkTCAZ`DT*rdvHwrYzzf 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 literal 0 HcmV?d00001 diff --git a/docs/images/entity-rounding-through.png b/docs/images/entity-rounding-through.png new file mode 100644 index 0000000000000000000000000000000000000000..44c24118787f728e2e2fea174e1be946cba4108d GIT binary patch literal 152726 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 AZvX%Q literal 0 HcmV?d00001 diff --git a/src/engine/client/graphics_threaded.cpp b/src/engine/client/graphics_threaded.cpp index 2857fa88fb..32ef822d89 100644 --- a/src/engine/client/graphics_threaded.cpp +++ b/src/engine/client/graphics_threaded.cpp @@ -23,7 +23,6 @@ #include - #if defined(CONF_VIDEORECORDER) #include #endif @@ -1044,7 +1043,7 @@ void CGraphics_Threaded::QuadsTex3DDrawFreeform(const CFreeformItem *pArray, int V.m_Tex.u = m_aTexture[Source].u; V.m_Tex.v = m_aTexture[Source].v; V.m_Tex.w = Index; - SetColor(&V, Source); + V.m_Color = m_aColor[Source]; } AddVertices(Count, m_aVerticesTex3D); } diff --git a/src/game/client/components/tclient/menus_tclient.cpp b/src/game/client/components/tclient/menus_tclient.cpp index a65606b97c..0ea3559479 100644 --- a/src/game/client/components/tclient/menus_tclient.cpp +++ b/src/game/client/components/tclient/menus_tclient.cpp @@ -1024,7 +1024,8 @@ void CMenus::RenderSettingsTClientSettings(CUIRect MainView) { CUIRect Tab; Button.VSplitLeft(Width, &Tab, &Button); - if(DoButton_MenuTab(&s_aCornerModes[Mode], apNames[Mode], g_Config.m_BcEntitiesRoundingMode == Mode, &Tab, Mode == 0 ? IGraphics::CORNER_L : Mode == 2 ? IGraphics::CORNER_R : IGraphics::CORNER_NONE)) + if(DoButton_MenuTab(&s_aCornerModes[Mode], apNames[Mode], g_Config.m_BcEntitiesRoundingMode == Mode, &Tab, Mode == 0 ? IGraphics::CORNER_L : Mode == 2 ? IGraphics::CORNER_R : + IGraphics::CORNER_NONE)) g_Config.m_BcEntitiesRoundingMode = Mode; } } diff --git a/src/game/client/components/tclient/outlines.cpp b/src/game/client/components/tclient/outlines.cpp index 89ab0e4472..8a03a18055 100644 --- a/src/game/client/components/tclient/outlines.cpp +++ b/src/game/client/components/tclient/outlines.cpp @@ -37,6 +37,7 @@ void COutlines::OnMapLoad() { ClearRoundedCache(); m_Regions.Load(Layers()); + m_OutlineIndex.Build(m_Regions); m_MapDataSize = ivec2(m_Regions.m_Width, m_Regions.m_Height); m_pMapData = m_Regions.m_vTypes.empty() ? nullptr : m_Regions.m_vTypes.data(); } @@ -109,8 +110,12 @@ void COutlines::OnRender() Graphics()->TextureClear(); Graphics()->BlendNormal(); Graphics()->QuadsSetRotation(0); - if(!Rounded) - Graphics()->QuadsBegin(); + if(Rounded) + { + RenderRoundedOutlines(StartX, StartY, EndX, EndY); + return; + } + Graphics()->QuadsBegin(); for(int y = StartY; y < EndY; y++) { @@ -143,39 +148,6 @@ void COutlines::OnRender() }(); if(!Config.m_Enable || Config.m_Width <= 0) continue; - if(Rounded) - { - // Build the exact same shape as the visible tiles. The old priority - // only selects the color of an edge shared by two categories. - const unsigned Mask = m_Regions.Mask(x, y, Type); - const unsigned Blockers = m_Regions.BlockerMask(x, y, Type); - const unsigned Transition = m_Regions.TransitionCorners(x, y); - const unsigned HigherMask = m_Regions.PriorityMask(x, y, Type) & ~Mask; - if(Mask == 255) - continue; - const uint64_t Key = uint64_t(Mask) | (uint64_t(Blockers) << 8) | (uint64_t(HigherMask) << 16) | (uint64_t(Config.m_Width) << 24) | (uint64_t(Transition) << 40); - auto It = m_RoundedContainers.find(Key); - if(It == m_RoundedContainers.end()) - { - auto Shape = RoundedTiles::Build(Mask, m_RoundingPercent * 0.16f, m_RoundingMode, m_RoundingSteps, Blockers, Transition); - RoundedTiles::RemoveLowerPriorityEdges(Shape, HigherMask); - const auto Triangles = RoundedTiles::Outline(Shape, Config.m_Width); - std::vector vItems; - vItems.reserve(Triangles.size()); - for(const auto &T : Triangles) - vItems.emplace_back(T[0], T[1], T[2], T[2]); - Graphics()->SetColor(1, 1, 1, 1); - const int Container = Graphics()->CreateQuadContainer(false); - if(!vItems.empty()) - Graphics()->QuadContainerAddQuads(Container, vItems.data(), vItems.size()); - Graphics()->QuadContainerUpload(Container); - It = m_RoundedContainers.emplace(Key, std::make_pair(Container, (int)vItems.size())).first; - } - Graphics()->SetColor(color_cast(ColorHSLA(Config.m_Color, true))); - for(int Offset = 0; Offset < It->second.second; Offset += 1024) - Graphics()->RenderQuadContainerEx(It->second.first, Offset, std::min(1024, It->second.second - Offset), x * Scale, y * Scale); - continue; - } // Find neighbours const bool aNeighbors[8] = { GetTile(x - 1, y - 1) >= Type, @@ -236,6 +208,68 @@ void COutlines::OnRender() } } - if(!Rounded) - Graphics()->QuadsEnd(); + Graphics()->QuadsEnd(); +} + +void COutlines::RenderRoundedOutlines(int StartX, int StartY, int EndX, int EndY) +{ + m_OutlineIndex.Visit(StartX, StartY, EndX, EndY, [&](const CEntityOutlineIndex::CCell &Cell, vec2 Position, vec2 Scale) { + int Enable = 0, Width = 0; + unsigned Color = 0; + if(Cell.m_Type == OUTLINE_SOLID) + { + Enable = g_Config.m_TcOutlineSolid; + Width = g_Config.m_TcOutlineWidthSolid; + Color = g_Config.m_TcOutlineColorSolid; + } + else if(Cell.m_Type == OUTLINE_FREEZE) + { + Enable = g_Config.m_TcOutlineFreeze; + Width = g_Config.m_TcOutlineWidthFreeze; + Color = g_Config.m_TcOutlineColorFreeze; + } + else if(Cell.m_Type == OUTLINE_UNFREEZE) + { + Enable = g_Config.m_TcOutlineUnfreeze; + Width = g_Config.m_TcOutlineWidthUnfreeze; + Color = g_Config.m_TcOutlineColorUnfreeze; + } + else if(Cell.m_Type == OUTLINE_KILL) + { + Enable = g_Config.m_TcOutlineKill; + Width = g_Config.m_TcOutlineWidthKill; + Color = g_Config.m_TcOutlineColorKill; + } + else if(Cell.m_Type == OUTLINE_TELE) + { + Enable = g_Config.m_TcOutlineTele; + Width = g_Config.m_TcOutlineWidthTele; + Color = g_Config.m_TcOutlineColorTele; + } + if(!Enable || Width <= 0) + return; + const uint64_t Key = Cell.Key() | (uint64_t(Width) << 24); + auto It = m_RoundedContainers.find(Key); + if(It == m_RoundedContainers.end()) + { + auto Shape = RoundedTiles::Build(Cell.m_Mask, m_RoundingPercent * 0.16f, m_RoundingMode, m_RoundingSteps, Cell.m_Blockers, Cell.m_Transition); + RoundedTiles::RemoveLowerPriorityEdges(Shape, Cell.m_HigherMask); + const auto Triangles = RoundedTiles::Outline(Shape, Width); + std::vector vItems; + vItems.reserve(Triangles.size()); + for(const auto &T : Triangles) + vItems.emplace_back(T[0], T[1], T[2], T[2]); + Graphics()->SetColor(1, 1, 1, 1); + const int Container = Graphics()->CreateQuadContainer(false); + if(!vItems.empty()) + Graphics()->QuadContainerAddQuads(Container, vItems.data(), vItems.size()); + Graphics()->QuadContainerUpload(Container); + It = m_RoundedContainers.emplace(Key, std::make_pair(Container, (int)vItems.size())).first; + } + Graphics()->SetColor(color_cast(ColorHSLA(Color, true))); + for(int Offset = 0; Offset < It->second.second; Offset += 1024) + { + Graphics()->RenderQuadContainerEx(It->second.first, Offset, std::min(1024, It->second.second - Offset), Position.x, Position.y, Scale.x, Scale.y); + } + }); } diff --git a/src/game/client/components/tclient/outlines.h b/src/game/client/components/tclient/outlines.h index 28a44ed9ab..9ce4f856fa 100644 --- a/src/game/client/components/tclient/outlines.h +++ b/src/game/client/components/tclient/outlines.h @@ -2,8 +2,10 @@ #define GAME_CLIENT_COMPONENTS_TCLIENT_OUTLINES_H #include +#include #include #include + #include #include @@ -16,6 +18,8 @@ class COutlines : public CComponent ivec2 m_MapDataSize; int *m_pMapData = nullptr; CEntityRegions m_Regions; + CEntityOutlineIndex m_OutlineIndex; + void RenderRoundedOutlines(int StartX, int StartY, int EndX, int EndY); std::unordered_map> m_RoundedContainers; int m_RoundingPercent = -1, m_RoundingMode = -1, m_RoundingSteps = 2; void ClearRoundedCache(); diff --git a/src/game/map/entity_outline.h b/src/game/map/entity_outline.h new file mode 100644 index 0000000000..44c092fc3b --- /dev/null +++ b/src/game/map/entity_outline.h @@ -0,0 +1,106 @@ +#ifndef GAME_MAP_ENTITY_OUTLINE_H +#define GAME_MAP_ENTITY_OUTLINE_H + +#include "entity_regions.h" + +#include + +#include +#include + +// Index only boundary cells. Zooming out must not rescan empty space or the +// interiors of filled regions, nor repeat clamped border cells one by one. +class CEntityOutlineIndex +{ +public: + struct CCell + { + ivec2 m_Position; + int m_Type; + unsigned m_Mask, m_Blockers, m_Transition, m_HigherMask; + + uint64_t Key() const + { + return uint64_t(m_Mask) | (uint64_t(m_Blockers) << 8) | (uint64_t(m_HigherMask) << 16) | (uint64_t(m_Transition) << 40); + } + }; + + void Build(const CEntityRegions &Regions) + { + m_Width = Regions.m_Width; + m_Height = Regions.m_Height; + m_vRows.clear(); + m_vLeft.clear(); + m_vRight.clear(); + m_vTop.clear(); + m_vBottom.clear(); + if(m_Width <= 0 || m_Height <= 0 || Regions.m_vTypes.empty()) + return; + m_vRows.resize(m_Height); + auto AddCell = [&](std::vector &vCells, int X, int Y) { + const int Type = Regions.Get(X, Y); + if(Type == CEntityRegions::NONE || Type == CEntityRegions::SWITCH) + return; + const unsigned Mask = Regions.Mask(X, Y, Type); + if(Mask == 255) + return; + vCells.push_back({ivec2(X, Y), Type, Mask, Regions.BlockerMask(X, Y, Type), Regions.TransitionCorners(X, Y), Regions.PriorityMask(X, Y, Type) & ~Mask}); + }; + for(int Y = 0; Y < m_Height; ++Y) + { + for(int X = 0; X < m_Width; ++X) + AddCell(m_vRows[Y], X, Y); + AddCell(m_vLeft, -1, Y); + AddCell(m_vRight, m_Width, Y); + } + for(int X = 0; X < m_Width; ++X) + { + AddCell(m_vTop, X, -1); + AddCell(m_vBottom, X, m_Height); + } + } + + // Bounds are in tile coordinates, with exclusive right/bottom edges. + // Outside a map side the old renderer repeats a clamped row/column. Its + // contours are straight, so one scaled copy preserves the same coverage. + template + void Visit(int StartX, int StartY, int EndX, int EndY, F &&Draw) const + { + if(m_vRows.empty() || StartX >= EndX || StartY >= EndY) + return; + const int X0 = std::max(0, StartX), X1 = std::min(m_Width, EndX); + const int Y0 = std::max(0, StartY), Y1 = std::min(m_Height, EndY); + for(int Y = Y0; Y < Y1; ++Y) + { + const auto &vRow = m_vRows[Y]; + auto It = std::lower_bound(vRow.begin(), vRow.end(), X0, [](const CCell &Cell, int X) { return Cell.m_Position.x < X; }); + for(; It != vRow.end() && It->m_Position.x < X1; ++It) + Draw(*It, vec2(It->m_Position.x * 32.0f, It->m_Position.y * 32.0f), vec2(1, 1)); + } + auto Vertical = [&](const std::vector &vCells, float X, float Width) { + auto It = std::lower_bound(vCells.begin(), vCells.end(), Y0, [](const CCell &Cell, int Y) { return Cell.m_Position.y < Y; }); + for(; It != vCells.end() && It->m_Position.y < Y1; ++It) + Draw(*It, vec2(X * 32.0f, It->m_Position.y * 32.0f), vec2(Width, 1)); + }; + auto Horizontal = [&](const std::vector &vCells, float Y, float Height) { + auto It = std::lower_bound(vCells.begin(), vCells.end(), X0, [](const CCell &Cell, int X) { return Cell.m_Position.x < X; }); + for(; It != vCells.end() && It->m_Position.x < X1; ++It) + Draw(*It, vec2(It->m_Position.x * 32.0f, Y * 32.0f), vec2(1, Height)); + }; + if(StartX < 0) + Vertical(m_vLeft, StartX, float(std::min(EndX, 0)) - StartX); + if(EndX > m_Width) + Vertical(m_vRight, std::max(StartX, m_Width), float(EndX) - std::max(StartX, m_Width)); + if(StartY < 0) + Horizontal(m_vTop, StartY, float(std::min(EndY, 0)) - StartY); + if(EndY > m_Height) + Horizontal(m_vBottom, std::max(StartY, m_Height), float(EndY) - std::max(StartY, m_Height)); + } + +private: + int m_Width = 0, m_Height = 0; + std::vector> m_vRows; + std::vector m_vLeft, m_vRight, m_vTop, m_vBottom; +}; + +#endif diff --git a/src/game/map/entity_regions.h b/src/game/map/entity_regions.h index c1e34685fd..be471b29f7 100644 --- a/src/game/map/entity_regions.h +++ b/src/game/map/entity_regions.h @@ -150,7 +150,7 @@ class CEntityRegions const bool Inner = H == Here && V == Here && D != Here && Get(X + SX[Corner], Y + SY[Corner]) != Type; const bool Outer = H == V && V == D && H != Here && Get(X + SX[Corner], Y) != NONE && Get(X + SX[Corner], Y) != Type; const bool Trim = D == Here && ((H == Here && V != Here && Get(X, Y + SY[Corner]) != Type) || - (V == Here && H != Here && Get(X + SX[Corner], Y) != Type)); + (V == Here && H != Here && Get(X + SX[Corner], Y) != Type)); if(Inner || Outer) Result |= 1u << Corner; if(Trim) @@ -267,7 +267,9 @@ class CEntityRegions const size_t I = (size_t)Y * m_Width + X; m_vTypes[I] = VisibleType(Game, Front, Tele, Switch); m_vRegionKeys[I] = VisibleRegionKey(Game, Front, Tele, Switch); - m_vTopLayers[I] = Switch ? 3 : Tele ? 2 : Category(Front) != NONE ? 1 : 0; + m_vTopLayers[I] = Switch ? 3 : Tele ? 2 : + Category(Front) != NONE ? 1 : + 0; } } }; diff --git a/src/game/map/render_layer.cpp b/src/game/map/render_layer.cpp index bed9d6b3c5..8b2279e6f4 100644 --- a/src/game/map/render_layer.cpp +++ b/src/game/map/render_layer.cpp @@ -612,13 +612,13 @@ void CRenderLayerTile::UpdateRounding() if(m_VisualTiles) m_VisualTiles->Unload(); // Runtime updates must not draw the loading menu or change its projection. - auto LoadingCallback = std::move(m_RenderUploadCallback); - m_RenderUploadCallback.reset(); + auto LoadingCallback = std::move(m_InitCallback); + m_InitCallback.reset(); m_BuildingRoundingBuffer = true; UploadTileData(m_VisualTiles, 0, false, m_RoundingGame); ReuploadRoundedOverlays(); m_BuildingRoundingBuffer = false; - m_RenderUploadCallback = std::move(LoadingCallback); + m_InitCallback = std::move(LoadingCallback); Graphics()->MapScreen(ScreenRect); } } @@ -669,11 +669,10 @@ void CRenderLayerTile::RenderRoundedTiles(const ColorRGBA &Color, const CRenderL const float Pixels = 32.0f * Graphics()->ScreenWidth() / std::max(1.0f, X1 - X0); const float Inset = std::clamp(1.25f / std::max(1.0f, Pixels), 0.0f, 0.49f); const RoundedTiles::CShape Square = RoundedTiles::Build(255, 0, 0, 2); - if(Params.m_FpsFogEnabled && Params.m_FpsFogCullMapTiles) + if(Params.m_FpsFogEnabled && Params.m_FpsFogCullMapTiles && Params.m_FpsFogHalfW > 0.0f && Params.m_FpsFogHalfH > 0.0f) { const vec2 Center((X0 + X1) * 0.5f, (Y0 + Y1) * 0.5f); - const vec2 Half = Params.m_FpsFogMode == 0 ? vec2(Params.m_FpsFogRadiusTiles * 32.0f, Params.m_FpsFogRadiusTiles * 32.0f) : - vec2(X1 - X0, Y1 - Y0) * (std::clamp(Params.m_FpsFogZoomPercent, 1, 120) / 200.0f); + const vec2 Half(Params.m_FpsFogHalfW, Params.m_FpsFogHalfH); if(Half.x > 0 && Half.y > 0) { X0 = std::max(X0, Center.x - Half.x); diff --git a/src/game/map/render_layer.h b/src/game/map/render_layer.h index c3d77b0d29..d0b8d2157a 100644 --- a/src/game/map/render_layer.h +++ b/src/game/map/render_layer.h @@ -11,11 +11,11 @@ using offset_ptr32 = unsigned int; #include -#include #include -#include +#include #include #include +#include #include #include @@ -136,7 +136,9 @@ class CRenderLayerTile : public CRenderLayer m_RoundingTele = Tele; m_RoundingGame = Game; m_RoundingSwitch = Switch; - m_RoundingLayer = Switch ? 3 : Tele ? 2 : Game ? 0 : 1; + m_RoundingLayer = Switch ? 3 : Tele ? 2 : + Game ? 0 : + 1; } ~CRenderLayerTile() override = default; void Render(const CRenderLayerParams &Params) override; diff --git a/src/game/map/rounded_tiles.h b/src/game/map/rounded_tiles.h index acd2dab2fc..4f7f1c9a72 100644 --- a/src/game/map/rounded_tiles.h +++ b/src/game/map/rounded_tiles.h @@ -142,7 +142,7 @@ namespace RoundedTiles // A covered material corner must round even if its neighbor would // normally block it. An empty corner still follows the selected mode. const bool Covered = ((ComplementCorners & (1u << I)) && Occupied(BlockerMask, X, Y)) || - ((TrimCorners & (1u << I)) && (Occupied(BlockerMask, X, 0) || Occupied(BlockerMask, 0, Y))); + ((TrimCorners & (1u << I)) && (Occupied(BlockerMask, X, 0) || Occupied(BlockerMask, 0, Y))); return Corner(Mask, X, Y, Radius, Covered ? 2 : Mode, Covered ? 0 : BlockerMask); }; std::array Corners = { diff --git a/src/test/rounded_tiles_test.cpp b/src/test/rounded_tiles_test.cpp index f751bd39a2..61a8f79837 100644 --- a/src/test/rounded_tiles_test.cpp +++ b/src/test/rounded_tiles_test.cpp @@ -1,3 +1,4 @@ +#include #include #include @@ -159,7 +160,8 @@ TEST(EntityRegions, SwitchTileBlocksUnfreezeCorner) EXPECT_EQ(Regions.BlockerMask(1, 1, CEntityRegions::UNFREEZE), East); EXPECT_EQ(Regions.PriorityMask(1, 1, CEntityRegions::UNFREEZE), East); EXPECT_FALSE(RoundedTiles::Corner(Regions.Mask(1, 1, CEntityRegions::UNFREEZE), 1, -1, 16, 2, - Regions.BlockerMask(1, 1, CEntityRegions::UNFREEZE)).m_Active); + Regions.BlockerMask(1, 1, CEntityRegions::UNFREEZE)) + .m_Active); } TEST(EntityRegions, CoveredMaterialJunctionUsesMatchingInnerAndOuterCorners) @@ -219,7 +221,7 @@ TEST(RoundedTiles, EmptyInnerJunctionHasOneSurface) std::vector> Shapes; for(const ivec2 Tile : {ivec2(0, 0), ivec2(1, 0), ivec2(0, 1)}) Shapes.emplace_back(Tile, RoundedTiles::Build(Regions.Mask(Tile.x, Tile.y, CEntityRegions::SOLID), 16, 2, 16, - Regions.BlockerMask(Tile.x, Tile.y, CEntityRegions::SOLID), Regions.TransitionCorners(Tile.x, Tile.y))); + Regions.BlockerMask(Tile.x, Tile.y, CEntityRegions::SOLID), Regions.TransitionCorners(Tile.x, Tile.y))); int Overlaps = 0; for(int Y = 0; Y < 128; ++Y) for(int X = 0; X < 128; ++X) @@ -306,7 +308,8 @@ TEST(RoundedTiles, InnerArcOutlineContinuesInsideBothSideTiles) const vec2 P = Tile.x ? vec2(Radius - 0.25f, 31) : vec2(31, Radius - 0.25f); EXPECT_TRUE(std::any_of(Outline.begin(), Outline.end(), [&](const auto &T) { return Cross(T[1] - T[0], T[2] - T[0]) > 1e-7f && InsideTriangle(P, T[0], T[1], T[2]); - })) << "radius=" << Radius << " mode=" << Mode << " steps=" << Steps << " tile=" << Tile.x << ',' << Tile.y; + })) << "radius=" + << Radius << " mode=" << Mode << " steps=" << Steps << " tile=" << Tile.x << ',' << Tile.y; } } @@ -347,7 +350,7 @@ TEST(RoundedTiles, TwoMaterialsPartitionCoveredCornerWithoutGaps) { const int Type = Regions.Get(X, Y); Shapes.emplace_back(ivec2(X, Y), RoundedTiles::Build(Regions.Mask(X, Y, Type), Radius, Mode, 16, - Regions.BlockerMask(X, Y, Type), Regions.TransitionCorners(X, Y))); + Regions.BlockerMask(X, Y, Type), Regions.TransitionCorners(X, Y))); } int Mismatches = 0; std::vector FirstMismatches; @@ -375,7 +378,7 @@ TEST(RoundedTiles, TwoMaterialsPartitionCoveredCornerWithoutGaps) TEST(RoundedTiles, SharedMaterialArcHasExactlyOneOutlineOwner) { for(const auto Pair : {std::pair{CEntityRegions::FREEZE, CEntityRegions::SOLID}, - std::pair{CEntityRegions::SOLID, CEntityRegions::FREEZE}}) + std::pair{CEntityRegions::SOLID, CEntityRegions::FREEZE}}) { CEntityRegions Regions; Regions.m_Width = Regions.m_Height = 3; @@ -487,7 +490,8 @@ TEST(RoundedTiles, StairOutlineHasOneFourConnectedRasterComponent) std::array Pixels{}; for(const ivec2 Tile : Tiles) { - const unsigned Blocker = Tile == ivec2(1, 0) ? 1u << 3 : Tile == ivec2(0, 1) ? 1u << 1 : 1u << 0; + const unsigned Blocker = Tile == ivec2(1, 0) ? 1u << 3 : Tile == ivec2(0, 1) ? 1u << 1 : + 1u << 0; auto Shape = RoundedTiles::Build(Mask(Tiles, Tile), 16, 2, 4, Blocker); if(!AddJoin) Shape.m_vOutlineJoins.clear(); @@ -725,3 +729,107 @@ TEST(RoundedTiles, DetailMeetsPixelError) EXPECT_LE(16 * Pixels * (1 - std::cos(pi / (8 * N))), 0.2501f); } } + +TEST(EntityOutlineIndex, EmptyMapAndEmptyView) +{ + CEntityOutlineIndex Index; + CEntityRegions Regions; + Index.Build(Regions); + int Count = 0; + auto Draw = [&](const auto &, vec2, vec2) { ++Count; }; + Index.Visit(-100000, -100000, 100000, 100000, Draw); + EXPECT_EQ(Count, 0); + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes.assign(9, CEntityRegions::NONE); + Regions.m_vTypes[4] = CEntityRegions::SOLID; + Index.Build(Regions); + Index.Visit(1, 1, 1, 2, Draw); + Index.Visit(1, 2, 2, 1, Draw); + EXPECT_EQ(Count, 0); + Index.Visit(1, 1, 2, 2, Draw); + EXPECT_EQ(Count, 1); +} + +TEST(EntityOutlineIndex, NeighborhoodMatchesRegionQueries) +{ + for(unsigned Mask = 0; Mask < 256; ++Mask) + { + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes.assign(9, CEntityRegions::FREEZE); + Regions.m_vTypes[4] = CEntityRegions::SOLID; + for(int Y = -1; Y <= 1; ++Y) + for(int X = -1; X <= 1; ++X) + if(RoundedTiles::Occupied(Mask, X, Y)) + Regions.m_vTypes[(Y + 1) * 3 + X + 1] = CEntityRegions::SOLID; + CEntityOutlineIndex Index; + Index.Build(Regions); + int Count = 0; + Index.Visit(1, 1, 2, 2, [&](const auto &Cell, vec2 Position, vec2 Scale) { + ++Count; + EXPECT_EQ(Cell.m_Type, CEntityRegions::SOLID); + EXPECT_EQ(Cell.m_Mask, Regions.Mask(1, 1, Cell.m_Type)); + EXPECT_EQ(Cell.m_Blockers, Regions.BlockerMask(1, 1, Cell.m_Type)); + EXPECT_EQ(Cell.m_Transition, Regions.TransitionCorners(1, 1)); + EXPECT_EQ(Cell.m_HigherMask, Regions.PriorityMask(1, 1, Cell.m_Type) & ~Cell.m_Mask); + EXPECT_EQ(Position, vec2(32, 32)); + EXPECT_EQ(Scale, vec2(1, 1)); + }); + EXPECT_EQ(Count, Mask == 255 ? 0 : 1); + } +} + +TEST(EntityOutlineIndex, HugeZoomDoesNotRepeatClampedBorderCells) +{ + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes = {CEntityRegions::SOLID, CEntityRegions::SOLID, CEntityRegions::SOLID, + CEntityRegions::NONE, CEntityRegions::NONE, CEntityRegions::NONE, + CEntityRegions::SOLID, CEntityRegions::SOLID, CEntityRegions::SOLID}; + CEntityOutlineIndex Index; + Index.Build(Regions); + int Count = 0, BorderCount = 0; + Index.Visit(-100000, -100000, 100000, 100000, [&](const auto &Cell, vec2 Position, vec2 Scale) { + ++Count; + if(Cell.m_Position.x < 0 || Cell.m_Position.x >= 3) + { + ++BorderCount; + EXPECT_GT(Scale.x, 99990); + EXPECT_EQ(Scale.y, 1); + const auto Shape = RoundedTiles::Build(Cell.m_Mask, 16, 2, 4, Cell.m_Blockers, Cell.m_Transition); + ASSERT_EQ(Shape.m_vQuads.size(), 1u); + for(const auto &Segment : Shape.m_vContour) + EXPECT_EQ(Segment.m_A.y, Segment.m_B.y); + EXPECT_EQ(Position.y, Cell.m_Position.y * 32.0f); + } + }); + EXPECT_EQ(Count, 10); + EXPECT_EQ(BorderCount, 4); +} + +TEST(EntityOutlineIndex, BorderRunCoverageMatchesScalarRendering) +{ + CEntityRegions Regions; + Regions.m_Width = Regions.m_Height = 3; + Regions.m_vTypes = {CEntityRegions::SOLID, CEntityRegions::SOLID, CEntityRegions::SOLID, + CEntityRegions::NONE, CEntityRegions::NONE, CEntityRegions::NONE, + CEntityRegions::SOLID, CEntityRegions::SOLID, CEntityRegions::SOLID}; + CEntityOutlineIndex Index; + Index.Build(Regions); + int Count = 0; + Index.Visit(-20, 0, -10, 3, [&](const auto &Cell, vec2 Position, vec2 Scale) { + ++Count; + EXPECT_EQ(Position.x, -640); + EXPECT_EQ(Scale, vec2(10, 1)); + const auto Shape = RoundedTiles::Build(Cell.m_Mask, 16, 2, 4, Cell.m_Blockers, Cell.m_Transition); + for(int X = -20; X < -10; ++X) + for(float Y : {0.5f, 2.5f, 16.0f, 29.5f, 31.5f}) + { + const vec2 Point = vec2(X * 32.0f + 16, Cell.m_Position.y * 32.0f + Y); + const vec2 Local = (Point - Position) / Scale; + EXPECT_EQ(RoundedTiles::BandDistance(Shape, Local, 2) <= 0, + RoundedTiles::BandDistance(Shape, vec2(16, Y), 2) <= 0); + } + }); + EXPECT_EQ(Count, 2); +}