@@ -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
0 commit comments