Skip to content

Commit b6ff55b

Browse files
committed
Apply UI clipping and masking on Text widgets as well
Clean up old unused shader
1 parent 6659465 commit b6ff55b

File tree

8 files changed

+115
-218
lines changed

8 files changed

+115
-218
lines changed

Source/Game-Lib/Game-Lib/Rendering/Canvas/CanvasRenderer.cpp

Lines changed: 59 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,20 @@ void CanvasRenderer::Update(f32 deltaTime)
179179

180180
_panelDrawDatas.SetDirtyElement(childPanel.gpuDataIndex);
181181
}
182+
else if (childWidget.type == WidgetType::Text)
183+
{
184+
auto& childText = registry->get<Text>(childEntity);
185+
186+
for (u32 i = 0; i < childText.numCharsNonWhitespace; i++)
187+
{
188+
auto& textData = _charDrawDatas[childText.gpuDataIndex + i];
189+
190+
textData.packed0.y = (clipper.hasClipMaskTexture) ? LoadTexture(clipper.clipMaskTexture) : 0;
191+
textData.clipRegionRect = vec4(scaledClipRegionMin, scaledClipRegionMax);
192+
textData.clipMaskRegionRect = vec4(scaledClipMaskRegionMin, scaledClipMaskRegionMax);
193+
}
194+
_charDrawDatas.SetDirtyElements(childText.gpuDataIndex, childText.numCharsNonWhitespace);
195+
}
182196

183197
});
184198
}
@@ -188,18 +202,17 @@ void CanvasRenderer::Update(f32 deltaTime)
188202
transformSystem.IterateChildrenRecursiveBreadth(entity, [&](entt::entity childEntity)
189203
{
190204
auto& childWidget = registry->get<Widget>(childEntity);
205+
auto& clipper = registry->get<Clipper>(childEntity);
206+
auto& rect = registry->get<BoundingRect>(childEntity);
191207

192-
if (childWidget.type == WidgetType::Panel)
193-
{
194-
auto& clipper = registry->get<Clipper>(childEntity);
195-
auto& rect = registry->get<BoundingRect>(childEntity);
208+
vec2 scaledClipRegionMin = (rect.min + (rect.max - rect.min) * clipper.clipRegionMin) / referenceSize;
209+
vec2 scaledClipRegionMax = (rect.min + (rect.max - rect.min) * clipper.clipRegionMax) / referenceSize;
196210

197-
vec2 scaledClipRegionMin = (rect.min + (rect.max - rect.min) * clipper.clipRegionMin) / referenceSize;
198-
vec2 scaledClipRegionMax = (rect.min + (rect.max - rect.min) * clipper.clipRegionMax) / referenceSize;
199-
200-
vec2 scaledClipMaskRegionMin = rect.min / referenceSize;
201-
vec2 scaledClipMaskRegionMax = rect.max / referenceSize;
211+
vec2 scaledClipMaskRegionMin = rect.min / referenceSize;
212+
vec2 scaledClipMaskRegionMax = rect.max / referenceSize;
202213

214+
if (childWidget.type == WidgetType::Panel)
215+
{
203216
auto& childPanel = registry->get<Panel>(childEntity);
204217
auto& panelData = _panelDrawDatas[childPanel.gpuDataIndex];
205218

@@ -209,6 +222,20 @@ void CanvasRenderer::Update(f32 deltaTime)
209222

210223
_panelDrawDatas.SetDirtyElement(childPanel.gpuDataIndex);
211224
}
225+
else if (childWidget.type == WidgetType::Text)
226+
{
227+
auto& childText = registry->get<Text>(childEntity);
228+
229+
for (u32 i = 0; i < childText.numCharsNonWhitespace; i++)
230+
{
231+
auto& textData = _charDrawDatas[childText.gpuDataIndex + i];
232+
233+
textData.packed0.y = (clipper.hasClipMaskTexture) ? LoadTexture(clipper.clipMaskTexture) : 0;
234+
textData.clipRegionRect = vec4(scaledClipRegionMin, scaledClipRegionMax);
235+
textData.clipMaskRegionRect = vec4(scaledClipMaskRegionMin, scaledClipMaskRegionMax);
236+
}
237+
_charDrawDatas.SetDirtyElements(childText.gpuDataIndex, childText.numCharsNonWhitespace);
238+
}
212239
});
213240
}
214241
});
@@ -220,17 +247,17 @@ void CanvasRenderer::Update(f32 deltaTime)
220247
if (clipper.clipChildren)
221248
return;
222249

223-
auto& widget = registry->get<Widget>(entity);
224-
if (widget.type == WidgetType::Panel)
225-
{
226-
auto& rect = registry->get<BoundingRect>(entity);
250+
auto& rect = registry->get<BoundingRect>(entity);
227251

228-
vec2 scaledClipRegionMin = (rect.min + (rect.max - rect.min) * clipper.clipRegionMin) / referenceSize;
229-
vec2 scaledClipRegionMax = (rect.min + (rect.max - rect.min) * clipper.clipRegionMax) / referenceSize;
252+
vec2 scaledClipRegionMin = (rect.min + (rect.max - rect.min) * clipper.clipRegionMin) / referenceSize;
253+
vec2 scaledClipRegionMax = (rect.min + (rect.max - rect.min) * clipper.clipRegionMax) / referenceSize;
230254

231-
vec2 scaledClipMaskRegionMin = rect.min / referenceSize;
232-
vec2 scaledClipMaskRegionMax = rect.max / referenceSize;
255+
vec2 scaledClipMaskRegionMin = rect.min / referenceSize;
256+
vec2 scaledClipMaskRegionMax = rect.max / referenceSize;
233257

258+
auto& widget = registry->get<Widget>(entity);
259+
if (widget.type == WidgetType::Panel)
260+
{
234261
auto& panel = registry->get<Panel>(entity);
235262
auto& panelData = _panelDrawDatas[panel.gpuDataIndex];
236263

@@ -240,6 +267,20 @@ void CanvasRenderer::Update(f32 deltaTime)
240267

241268
_panelDrawDatas.SetDirtyElement(panel.gpuDataIndex);
242269
}
270+
else if (widget.type == WidgetType::Text)
271+
{
272+
auto& text = registry->get<Text>(entity);
273+
274+
for (u32 i = 0; i < text.numCharsNonWhitespace; i++)
275+
{
276+
auto& textData = _charDrawDatas[text.gpuDataIndex + i];
277+
278+
textData.packed0.y = (clipper.hasClipMaskTexture) ? LoadTexture(clipper.clipMaskTexture) : 0;
279+
textData.clipRegionRect = vec4(scaledClipRegionMin, scaledClipRegionMax);
280+
textData.clipMaskRegionRect = vec4(scaledClipMaskRegionMin, scaledClipMaskRegionMax);
281+
}
282+
_charDrawDatas.SetDirtyElements(text.gpuDataIndex, text.numCharsNonWhitespace);
283+
}
243284
});
244285

245286
if (_vertices.SyncToGPU(_renderer))
@@ -796,8 +837,7 @@ void CanvasRenderer::UpdateTextData(Text& text, ECS::Components::UI::TextTemplat
796837
}
797838

798839
auto& drawData = _charDrawDatas[text.gpuDataIndex + charIndex];
799-
drawData.packed0.x = fontTextureIndex;
800-
drawData.packed0.y = charIndex;
840+
drawData.packed0.x = (fontTextureIndex & 0xFFFF) | ((charIndex & 0xFFFF) << 16);
801841
drawData.packed0.z = textTemplate.color.ToRGBA32();
802842
drawData.packed0.w = textTemplate.borderColor.ToRGBA32();
803843

Source/Game-Lib/Game-Lib/Rendering/Canvas/CanvasRenderer.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,10 @@ class CanvasRenderer
7878
struct CharDrawData
7979
{
8080
public:
81-
uvec4 packed0; // x: textureIndex, y: charIndex, z: textColor, w: borderColor
81+
uvec4 packed0; // x: textureIndex & clipMaskTextureIndex, y: charIndex, z: textColor, w: borderColor
8282
vec4 packed1; // x: borderSize, y: padding, zw: unitRangeXY
83+
hvec4 clipRegionRect = hvec4(0.0f, 0.0f, 1.0f, 1.0f); // xy: min, zw: max
84+
hvec4 clipMaskRegionRect = hvec4(0.0f, 0.0f, 1.0f, 1.0f); // xy: min, zw: max
8385
};
8486

8587
private:

Source/Scripts/UI/Demo.luau

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ local function CreateClippingDemo()
241241
clippingParent:SetClipChildren(true);
242242
clippingParent:SetClipRect(0, 0, 1, 1);
243243
clippingParent:SetClipMaskTexture("Data/Texture/interface/masks/circlemaskscalable.dds");
244-
244+
245245
--clippingParent:SetClipMaskTexture(nil);
246246
--clippingParent:SetClipChildren(false);
247247

@@ -250,10 +250,8 @@ local function CreateClippingDemo()
250250
clippingChild:SetRelativePoint(0.5, 0.5);
251251

252252
-- Create a text
253-
--local clippingText = canvas::NewText("Test text", 0, 0, 0, "DefaultButtonText");
254-
255-
--clippingText:SetClipChildren(true);
256-
--clippingText:SetClipRect(0, 0, 1, 1);
253+
local clippingText = clippingParent:NewText("Test text", 100, 30, 0, "DefaultButtonText");
254+
--clippingText:SetClipRect(0, 0, 1, 0.3);
257255
--clippingText:SetClipMaskTexture("Data/Texture/interface/masks/circlemaskscalable.dds");
258256
end
259257

Source/Shaders/Shaders/Terrain/Terrain.ps.hlsl

Lines changed: 0 additions & 11 deletions
This file was deleted.

Source/Shaders/Shaders/Terrain/Terrain.vs.hlsl

Lines changed: 0 additions & 167 deletions
This file was deleted.

Source/Shaders/Shaders/UI/Panel.ps.hlsl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ float4 main(VertexOutput input) : SV_Target
126126
float2 clipMaskRegionMax = float2(f16tof32(drawData.packed1.w), f16tof32(drawData.packed1.w >> 16));
127127
float2 maskUV = (screenPos - clipMaskRegionMin) / (clipMaskRegionMax - clipMaskRegionMin);
128128

129-
uint clipmaskTextureIndex = drawData.packed0.y;
130-
float clipMask = _textures[clipmaskTextureIndex].Sample(_sampler, maskUV).a;
129+
uint clipMaskTextureIndex = drawData.packed0.y;
130+
float clipMask = _textures[clipMaskTextureIndex].Sample(_sampler, maskUV).a;
131131
if (clipMask < 0.5f)
132132
{
133133
discard;

0 commit comments

Comments
 (0)