@galacean/engine-core 0.0.0-experimental-2.0-game.8 → 0.0.0-experimental-2.0-game.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.js CHANGED
@@ -1935,7 +1935,7 @@ SystemInfo._initialize();
1935
1935
  _inherits(FontAtlas, ReferResource);
1936
1936
  function FontAtlas(engine) {
1937
1937
  var _this;
1938
- _this = ReferResource.call(this, engine) || this, _this._charInfoMap = {}, _this._space = 1, _this._curX = 1, _this._curY = 1, _this._nextY = 1;
1938
+ _this = ReferResource.call(this, engine) || this, _this._charInfoMap = {}, _this._space = 4, _this._curX = 4, _this._curY = 4, _this._nextY = 4;
1939
1939
  _this.isGCIgnored = true;
1940
1940
  var format = engine._hardwareRenderer.isWebGL2 ? TextureFormat.R8 : TextureFormat.Alpha8;
1941
1941
  var texture = new Texture2D(engine, 512, 512, format, false);
@@ -9683,6 +9683,28 @@ Shader._shaderMap = Object.create(null);
9683
9683
  // Order: cheap reference checks → mask state → tag lookup (rare opt-out)
9684
9684
  return preElement.subChunk.chunk === curElement.subChunk.chunk && preElement.texture === curElement.texture && preElement.material === curElement.material && maskInteraction === renderer.maskInteraction && (maskInteraction === SpriteMaskInteraction.None || preRenderer.maskLayer === renderer.maskLayer) && curElement.subShader.passes[0].getTagValue(VertexMergeBatcher._disableBatchTag) !== true;
9685
9685
  };
9686
+ /**
9687
+ * Text-specific batch check: extends sprite check with outline parity.
9688
+ * Different outlineWidth or outlineColor must split into separate draw calls,
9689
+ * because outline uniforms are shared per draw call.
9690
+ */ VertexMergeBatcher.canBatchText = function canBatchText(preElement, curElement) {
9691
+ if (!VertexMergeBatcher.canBatchSprite(preElement, curElement)) {
9692
+ return false;
9693
+ }
9694
+ var preRendererAny = preElement.component;
9695
+ var curRendererAny = curElement.component;
9696
+ if (preRendererAny._outlineWidth !== curRendererAny._outlineWidth) {
9697
+ return false;
9698
+ }
9699
+ if (preRendererAny._outlineWidth > 0) {
9700
+ var a = preRendererAny._outlineColor;
9701
+ var b = curRendererAny._outlineColor;
9702
+ if (a.r !== b.r || a.g !== b.g || a.b !== b.b || a.a !== b.a) {
9703
+ return false;
9704
+ }
9705
+ }
9706
+ return true;
9707
+ };
9686
9708
  VertexMergeBatcher.canBatchSpriteMask = function canBatchSpriteMask(preElement, curElement) {
9687
9709
  if (preElement.subChunk.chunk !== curElement.subChunk.chunk) {
9688
9710
  return false;
@@ -11212,13 +11234,18 @@ __decorate([
11212
11234
  _inherits(TextRenderer, Renderer);
11213
11235
  function TextRenderer(entity) {
11214
11236
  var _this;
11215
- _this = Renderer.call(this, entity) || this, _this._textChunks = Array(), /** @internal */ _this._subFont = null, /** @internal */ _this._dirtyFlag = 15, _this._color = new engineMath.Color(1, 1, 1, 1), _this._text = "", _this._width = 0, _this._height = 0, _this._localBounds = new engineMath.BoundingBox(), _this._font = null, _this._fontSize = 24, _this._fontStyle = FontStyle.None, _this._lineSpacing = 0, _this._characterSpacing = 0, _this._horizontalAlignment = TextHorizontalAlignment.Center, _this._verticalAlignment = TextVerticalAlignment.Center, _this._enableWrapping = false, _this._overflowMode = OverflowMode.Overflow;
11237
+ _this = Renderer.call(this, entity) || this, _this._textChunks = Array(), /** @internal */ _this._subFont = null, /** @internal */ _this._dirtyFlag = 15, _this._color = new engineMath.Color(1, 1, 1, 1), _this._text = "", _this._width = 0, _this._height = 0, _this._localBounds = new engineMath.BoundingBox(), _this._font = null, _this._fontSize = 24, _this._fontStyle = FontStyle.None, _this._lineSpacing = 0, _this._characterSpacing = 0, _this._horizontalAlignment = TextHorizontalAlignment.Center, _this._verticalAlignment = TextVerticalAlignment.Center, _this._enableWrapping = false, _this._overflowMode = OverflowMode.Overflow, _this._outlineColor = new engineMath.Color(0, 0, 0, 1), _this._outlineWidth = 0;
11216
11238
  var engine = _this.engine;
11217
11239
  _this._font = engine._textDefaultFont;
11218
11240
  _this._addResourceReferCount(_this._font, 1);
11219
11241
  _this.setMaterial(engine._basicResources.textDefaultMaterial);
11242
+ var shaderData = _this.shaderData;
11243
+ shaderData.setFloat(TextRenderer._outlineWidthProperty, _this._outlineWidth);
11244
+ shaderData.setColor(TextRenderer._outlineColorProperty, _this._outlineColor);
11220
11245
  //@ts-ignore
11221
11246
  _this._color._onValueChanged = _this._onColorChanged.bind(_this);
11247
+ // @ts-ignore
11248
+ _this._outlineColor._onValueChanged = _this._onOutlineColorChanged.bind(_this);
11222
11249
  return _this;
11223
11250
  }
11224
11251
  var _proto = TextRenderer.prototype;
@@ -11240,6 +11267,7 @@ __decorate([
11240
11267
  Renderer.prototype._cloneTo.call(this, target);
11241
11268
  target.font = this._font;
11242
11269
  target._subFont = this._subFont;
11270
+ target.outlineWidth = this._outlineWidth;
11243
11271
  };
11244
11272
  /**
11245
11273
  * @internal
@@ -11273,7 +11301,7 @@ __decorate([
11273
11301
  /**
11274
11302
  * @internal
11275
11303
  */ _proto._canBatch = function _canBatch(preElement, curElement) {
11276
- return VertexMergeBatcher.canBatchSprite(preElement, curElement);
11304
+ return VertexMergeBatcher.canBatchText(preElement, curElement);
11277
11305
  };
11278
11306
  /**
11279
11307
  * @internal
@@ -11316,6 +11344,7 @@ __decorate([
11316
11344
  var distanceForSort = this._distanceForSort;
11317
11345
  var renderPipeline = camera._renderPipeline;
11318
11346
  var textChunks = this._textChunks;
11347
+ var textTextureSize = TextRenderer._tempVec20;
11319
11348
  for(var i = 0, n = textChunks.length; i < n; ++i){
11320
11349
  var _renderElement;
11321
11350
  var _textChunks_i = textChunks[i], subChunk = _textChunks_i.subChunk, texture = _textChunks_i.texture;
@@ -11323,6 +11352,7 @@ __decorate([
11323
11352
  renderElement.set(this, material, subChunk.chunk.primitive, subChunk.subMesh, texture, subChunk);
11324
11353
  (_renderElement = renderElement).shaderData || (_renderElement.shaderData = new ShaderData(ShaderDataGroup.RenderElement));
11325
11354
  renderElement.shaderData.setTexture(TextRenderer._textureProperty, texture);
11355
+ renderElement.shaderData.setVector2(TextRenderer._textTextureSizeProperty, textTextureSize.set(texture.width, texture.height));
11326
11356
  renderElement.priority = priority;
11327
11357
  renderElement.distanceForSort = distanceForSort;
11328
11358
  renderPipeline.pushRenderElement(context, renderElement);
@@ -11454,10 +11484,11 @@ __decorate([
11454
11484
  charRenderInfo.texture = charFont._getTextureByIndex(charInfo.index);
11455
11485
  charRenderInfo.uvs = charInfo.uvs;
11456
11486
  var w = charInfo.w, ascent = charInfo.ascent, descent = charInfo.descent;
11457
- var left = startX * pixelsPerUnitReciprocal;
11458
- var right = (startX + w) * pixelsPerUnitReciprocal;
11459
- var top = (startY + ascent) * pixelsPerUnitReciprocal;
11460
- var bottom = (startY - descent) * pixelsPerUnitReciprocal;
11487
+ var ow = this._outlineWidth * pixelsPerUnitReciprocal;
11488
+ var left = startX * pixelsPerUnitReciprocal - ow;
11489
+ var right = (startX + w) * pixelsPerUnitReciprocal + ow;
11490
+ var top = (startY + ascent) * pixelsPerUnitReciprocal + ow;
11491
+ var bottom = (startY - descent) * pixelsPerUnitReciprocal - ow;
11461
11492
  localPositions.set(left, top, right, bottom);
11462
11493
  i === firstLine && (maxY = Math.max(maxY, top));
11463
11494
  minY = Math.min(minY, bottom);
@@ -11531,6 +11562,10 @@ __decorate([
11531
11562
  var vertices = subChunk.chunk.vertices;
11532
11563
  var indices = subChunk.indices = [];
11533
11564
  var charRenderInfos = textChunk.charRenderInfos;
11565
+ var ow = this._outlineWidth;
11566
+ var texture = textChunk.texture;
11567
+ var owU = ow > 0 ? ow / texture.width : 0;
11568
+ var owV = ow > 0 ? ow / texture.height : 0;
11534
11569
  for(var i = 0, ii = 0, io = 0, vo = subChunk.vertexArea.start + 3; i < count; ++i, io += 4){
11535
11570
  var charRenderInfo = charRenderInfos[i];
11536
11571
  charRenderInfo.indexInChunk = i;
@@ -11538,10 +11573,13 @@ __decorate([
11538
11573
  for(var j = 0; j < tempIndicesLength; ++j){
11539
11574
  indices[ii++] = tempIndices[j] + io;
11540
11575
  }
11541
- // Set uv and color for vertices
11576
+ // Set uv and color for vertices, expand uv outward by outline width
11542
11577
  for(var j1 = 0; j1 < 4; ++j1, vo += 9){
11543
11578
  var uv = charRenderInfo.uvs[j1];
11544
- uv.copyToArray(vertices, vo);
11579
+ var su = j1 === 1 || j1 === 2 ? 1 : -1;
11580
+ var sv = j1 >= 2 ? 1 : -1;
11581
+ vertices[vo] = uv.x + owU * su;
11582
+ vertices[vo + 1] = uv.y + owV * sv;
11545
11583
  vertices[vo + 2] = r;
11546
11584
  vertices[vo + 3] = g;
11547
11585
  vertices[vo + 4] = b;
@@ -11570,6 +11608,9 @@ __decorate([
11570
11608
  _proto._onColorChanged = function _onColorChanged() {
11571
11609
  this._setDirtyFlagTrue(16);
11572
11610
  };
11611
+ _proto._onOutlineColorChanged = function _onOutlineColorChanged() {
11612
+ this.shaderData.setColor(TextRenderer._outlineColorProperty, this._outlineColor);
11613
+ };
11573
11614
  _create_class(TextRenderer, [
11574
11615
  {
11575
11616
  key: "color",
@@ -11756,6 +11797,35 @@ __decorate([
11756
11797
  }
11757
11798
  }
11758
11799
  },
11800
+ {
11801
+ key: "outlineWidth",
11802
+ get: /**
11803
+ * The outline width in pixels. 0 means outline is disabled. Clamped to [0, 8].
11804
+ */ function get() {
11805
+ return this._outlineWidth;
11806
+ },
11807
+ set: function set(value) {
11808
+ value = Math.max(0, Math.min(value, 3));
11809
+ if (this._outlineWidth !== value) {
11810
+ this._outlineWidth = value;
11811
+ this.shaderData.setFloat(TextRenderer._outlineWidthProperty, value);
11812
+ this._setDirtyFlagTrue(14);
11813
+ }
11814
+ }
11815
+ },
11816
+ {
11817
+ key: "outlineColor",
11818
+ get: /**
11819
+ * The outline color. Only effective when outlineWidth > 0.
11820
+ */ function get() {
11821
+ return this._outlineColor;
11822
+ },
11823
+ set: function set(value) {
11824
+ if (this._outlineColor !== value) {
11825
+ this._outlineColor.copyFrom(value);
11826
+ }
11827
+ }
11828
+ },
11759
11829
  {
11760
11830
  key: "maskInteraction",
11761
11831
  get: /**
@@ -11806,9 +11876,13 @@ __decorate([
11806
11876
  ]);
11807
11877
  return TextRenderer;
11808
11878
  }(exports.Renderer);
11809
- TextRenderer._textureProperty = ShaderProperty.getByName("renderElement_TextTexture");
11879
+ TextRenderer._tempVec20 = new engineMath.Vector2();
11810
11880
  TextRenderer._tempVec30 = new engineMath.Vector3();
11811
11881
  TextRenderer._tempVec31 = new engineMath.Vector3();
11882
+ TextRenderer._textureProperty = ShaderProperty.getByName("renderElement_TextTexture");
11883
+ TextRenderer._textTextureSizeProperty = ShaderProperty.getByName("renderElement_TextTextureSize");
11884
+ TextRenderer._outlineColorProperty = ShaderProperty.getByName("renderer_OutlineColor");
11885
+ TextRenderer._outlineWidthProperty = ShaderProperty.getByName("renderer_OutlineWidth");
11812
11886
  TextRenderer._worldPositions = [
11813
11887
  new engineMath.Vector3(),
11814
11888
  new engineMath.Vector3(),
@@ -11867,12 +11941,21 @@ __decorate([
11867
11941
  __decorate([
11868
11942
  assignmentClone
11869
11943
  ], TextRenderer.prototype, "_overflowMode", void 0);
11944
+ __decorate([
11945
+ deepClone
11946
+ ], TextRenderer.prototype, "_outlineColor", void 0);
11947
+ __decorate([
11948
+ ignoreClone
11949
+ ], TextRenderer.prototype, "_outlineWidth", void 0);
11870
11950
  __decorate([
11871
11951
  ignoreClone
11872
11952
  ], TextRenderer.prototype, "_onTransformChanged", null);
11873
11953
  __decorate([
11874
11954
  ignoreClone
11875
11955
  ], TextRenderer.prototype, "_onColorChanged", null);
11956
+ __decorate([
11957
+ ignoreClone
11958
+ ], TextRenderer.prototype, "_onOutlineColorChanged", null);
11876
11959
  var TextChunk = function TextChunk() {
11877
11960
  this.charRenderInfos = new Array();
11878
11961
  };
@@ -18231,14 +18314,16 @@ var ComponentCloner = /*#__PURE__*/ function() {
18231
18314
  }
18232
18315
  };
18233
18316
  _proto._getComponentsInChildren = function _getComponentsInChildren(type, results) {
18234
- for(var i = this._components.length - 1; i >= 0; i--){
18235
- var component = this._components[i];
18317
+ var components = this._components;
18318
+ for(var i = 0, n = components.length; i < n; i++){
18319
+ var component = components[i];
18236
18320
  if (_instanceof(component, type)) {
18237
18321
  results.push(component);
18238
18322
  }
18239
18323
  }
18240
- for(var i1 = this._children.length - 1; i1 >= 0; i1--){
18241
- this._children[i1]._getComponentsInChildren(type, results);
18324
+ var children = this._children;
18325
+ for(var i1 = 0, n1 = children.length; i1 < n1; i1++){
18326
+ children[i1]._getComponentsInChildren(type, results);
18242
18327
  }
18243
18328
  };
18244
18329
  _proto._setActiveInHierarchy = function _setActiveInHierarchy(activeChangeFlag) {
@@ -20374,6 +20459,7 @@ var rePropName = RegExp(// Match anything that isn't a dot or bracket.
20374
20459
  function Pointer(id) {
20375
20460
  /** The phase of pointer. */ this.phase = PointerPhase.Leave;
20376
20461
  /** The position of the pointer in screen space pixel coordinates. */ this.position = new engineMath.Vector2();
20462
+ /** The position of the pointer when it was last pressed down (in screen space pixel coordinates). */ this.pressedPosition = new engineMath.Vector2();
20377
20463
  /** The change of the pointer. */ this.deltaPosition = new engineMath.Vector2();
20378
20464
  /** @internal */ this._events = [];
20379
20465
  /** @internal */ this._upMap = [];
@@ -20422,12 +20508,16 @@ var PointerEventType = /*#__PURE__*/ function(PointerEventType) {
20422
20508
  */ var PointerEventData = /*#__PURE__*/ function() {
20423
20509
  function PointerEventData() {
20424
20510
  /** The position of the event trigger (in world space). */ this.worldPosition = new engineMath.Vector3();
20511
+ /** The hit-tested target entity (deepest entity on the bubble path). */ this.target = null;
20512
+ /** The entity currently handling the event (same as target on non-bubbling fire, varies on bubble). */ this.currentTarget = null;
20425
20513
  }
20426
20514
  var _proto = PointerEventData.prototype;
20427
20515
  /**
20428
20516
  * @internal
20429
20517
  */ _proto.dispose = function dispose() {
20430
20518
  this.pointer = null;
20519
+ this.target = null;
20520
+ this.currentTarget = null;
20431
20521
  };
20432
20522
  return PointerEventData;
20433
20523
  }();
@@ -23289,10 +23379,13 @@ var PointerEventEmitter = /*#__PURE__*/ function() {
23289
23379
  this._init();
23290
23380
  }
23291
23381
  var _proto = PointerEventEmitter.prototype;
23292
- _proto._createEventData = function _createEventData(pointer) {
23382
+ _proto._createEventData = function _createEventData(pointer, target, currentTarget) {
23383
+ if (currentTarget === void 0) currentTarget = target;
23293
23384
  var data = this._pool.get();
23294
23385
  data.pointer = pointer;
23295
23386
  data.worldPosition.copyFrom(this._hitResult.point);
23387
+ data.target = target;
23388
+ data.currentTarget = currentTarget;
23296
23389
  return data;
23297
23390
  };
23298
23391
  _proto._fireDown = function _fireDown(entity, eventData) {
@@ -23422,12 +23515,12 @@ PointerEventEmitter._tempRay = new engineMath.Ray();
23422
23515
  };
23423
23516
  _proto.processDrag = function processDrag(pointer) {
23424
23517
  var entity = this._draggedEntity;
23425
- entity && this._fireDrag(entity, this._createEventData(pointer));
23518
+ entity && this._fireDrag(entity, this._createEventData(pointer, entity, entity));
23426
23519
  };
23427
23520
  _proto.processDown = function processDown(pointer) {
23428
23521
  var entity = this._pressedEntity = this._draggedEntity = this._enteredEntity;
23429
23522
  if (entity) {
23430
- var eventData = this._createEventData(pointer);
23523
+ var eventData = this._createEventData(pointer, entity, entity);
23431
23524
  this._fireDown(entity, eventData);
23432
23525
  this._fireBeginDrag(entity, eventData);
23433
23526
  }
@@ -23436,26 +23529,26 @@ PointerEventEmitter._tempRay = new engineMath.Ray();
23436
23529
  var _this = this, enteredEntity = _this._enteredEntity, draggedEntity = _this._draggedEntity;
23437
23530
  if (enteredEntity) {
23438
23531
  var sameTarget = this._pressedEntity === enteredEntity;
23439
- var eventData = this._createEventData(pointer);
23532
+ var eventData = this._createEventData(pointer, enteredEntity, enteredEntity);
23440
23533
  this._fireUp(enteredEntity, eventData);
23441
23534
  sameTarget && this._fireClick(enteredEntity, eventData);
23442
23535
  this._fireDrop(enteredEntity, eventData);
23443
23536
  }
23444
23537
  this._pressedEntity = null;
23445
23538
  if (draggedEntity) {
23446
- this._fireEndDrag(draggedEntity, this._createEventData(pointer));
23539
+ this._fireEndDrag(draggedEntity, this._createEventData(pointer, draggedEntity, draggedEntity));
23447
23540
  this._draggedEntity = null;
23448
23541
  }
23449
23542
  };
23450
23543
  _proto.processLeave = function processLeave(pointer) {
23451
23544
  var enteredEntity = this._enteredEntity;
23452
23545
  if (enteredEntity) {
23453
- this._fireExit(enteredEntity, this._createEventData(pointer));
23546
+ this._fireExit(enteredEntity, this._createEventData(pointer, enteredEntity, enteredEntity));
23454
23547
  this._enteredEntity = null;
23455
23548
  }
23456
23549
  var draggedEntity = this._draggedEntity;
23457
23550
  if (draggedEntity) {
23458
- this._fireEndDrag(draggedEntity, this._createEventData(pointer));
23551
+ this._fireEndDrag(draggedEntity, this._createEventData(pointer, draggedEntity, draggedEntity));
23459
23552
  this._draggedEntity = null;
23460
23553
  }
23461
23554
  this._pressedEntity = null;
@@ -23470,10 +23563,10 @@ PointerEventEmitter._tempRay = new engineMath.Ray();
23470
23563
  var enteredEntity = this._enteredEntity;
23471
23564
  if (entity !== enteredEntity) {
23472
23565
  if (enteredEntity) {
23473
- this._fireExit(enteredEntity, this._createEventData(pointer));
23566
+ this._fireExit(enteredEntity, this._createEventData(pointer, enteredEntity, enteredEntity));
23474
23567
  }
23475
23568
  if (entity) {
23476
- this._fireEnter(entity, this._createEventData(pointer));
23569
+ this._fireEnter(entity, this._createEventData(pointer, entity, entity));
23477
23570
  }
23478
23571
  this._enteredEntity = entity;
23479
23572
  }
@@ -23668,6 +23761,7 @@ PointerEventEmitter._tempRay = new engineMath.Ray();
23668
23761
  pointer._downMap[button] = frameCount;
23669
23762
  pointer._frameEvents |= PointerEventType.Down;
23670
23763
  pointer.phase = PointerPhase.Down;
23764
+ pointer.pressedPosition.copyFrom(pointer.position);
23671
23765
  break;
23672
23766
  }
23673
23767
  case "pointerup":
@@ -24866,7 +24960,7 @@ var spriteFs = "#include <common>\nuniform sampler2D renderer_SpriteTexture;\n\n
24866
24960
 
24867
24961
  var spriteVs = "uniform mat4 renderer_MVPMat;\n\nattribute vec3 POSITION;\nattribute vec2 TEXCOORD_0;\nattribute vec4 COLOR_0;\n\nvarying vec2 v_uv;\nvarying vec4 v_color;\n\nvoid main()\n{\n gl_Position = renderer_MVPMat * vec4(POSITION, 1.0);\n\n v_uv = TEXCOORD_0;\n v_color = COLOR_0;\n}\n"; // eslint-disable-line
24868
24962
 
24869
- var textFs = "uniform sampler2D renderElement_TextTexture;\nuniform vec4 renderer_UIRectClipRect;\nuniform float renderer_UIRectClipEnabled;\nuniform vec4 renderer_UIRectClipSoftness;\nuniform float renderer_UIRectClipHardClip;\n\nvarying vec2 v_uv;\nvarying vec4 v_color;\nvarying vec2 v_worldPosition;\n\nfloat getUIRectClipAlpha()\n{\n vec4 edgeDistance = vec4(\n v_worldPosition.x - renderer_UIRectClipRect.x,\n v_worldPosition.y - renderer_UIRectClipRect.y,\n renderer_UIRectClipRect.z - v_worldPosition.x,\n renderer_UIRectClipRect.w - v_worldPosition.y\n );\n vec4 hardClipFactor = step(vec4(0.0), edgeDistance);\n vec4 softness = max(renderer_UIRectClipSoftness, vec4(1e-5));\n vec4 softClipFactor = clamp(edgeDistance / softness, 0.0, 1.0);\n vec4 useSoftness = step(vec4(1e-5), renderer_UIRectClipSoftness);\n vec4 clipFactor = mix(hardClipFactor, softClipFactor, useSoftness);\n return clipFactor.x * clipFactor.y * clipFactor.z * clipFactor.w;\n}\n\nvoid main()\n{\n float rectClipAlpha = 1.0;\n if (renderer_UIRectClipEnabled > 0.5) {\n rectClipAlpha = getUIRectClipAlpha();\n }\n\n vec4 texColor = texture2D(renderElement_TextTexture, v_uv);\n #ifdef GRAPHICS_API_WEBGL2\n float coverage = texColor.r;\n #else\n float coverage = texColor.a;\n #endif\n vec4 finalColor = vec4(v_color.rgb, v_color.a * coverage);\n finalColor.a *= rectClipAlpha;\n if (renderer_UIRectClipEnabled > 0.5 && renderer_UIRectClipHardClip > 0.5 && finalColor.a < 0.001) {\n discard;\n }\n gl_FragColor = finalColor;\n}\n"; // eslint-disable-line
24963
+ var textFs = "uniform sampler2D renderElement_TextTexture;\nuniform vec2 renderElement_TextTextureSize;\nuniform vec4 renderer_OutlineColor;\nuniform float renderer_OutlineWidth;\n\nuniform vec4 renderer_UIRectClipRect;\nuniform float renderer_UIRectClipEnabled;\nuniform vec4 renderer_UIRectClipSoftness;\nuniform float renderer_UIRectClipHardClip;\n\nvarying vec2 v_uv;\nvarying vec4 v_color;\nvarying vec2 v_worldPosition;\n\nfloat getUIRectClipAlpha()\n{\n vec4 edgeDistance = vec4(\n v_worldPosition.x - renderer_UIRectClipRect.x,\n v_worldPosition.y - renderer_UIRectClipRect.y,\n renderer_UIRectClipRect.z - v_worldPosition.x,\n renderer_UIRectClipRect.w - v_worldPosition.y\n );\n vec4 hardClipFactor = step(vec4(0.0), edgeDistance);\n vec4 softness = max(renderer_UIRectClipSoftness, vec4(1e-5));\n vec4 softClipFactor = clamp(edgeDistance / softness, 0.0, 1.0);\n vec4 useSoftness = step(vec4(1e-5), renderer_UIRectClipSoftness);\n vec4 clipFactor = mix(hardClipFactor, softClipFactor, useSoftness);\n return clipFactor.x * clipFactor.y * clipFactor.z * clipFactor.w;\n}\n\nfloat sampleCoverage(vec2 uv)\n{\n vec4 c = texture2D(renderElement_TextTexture, uv);\n #ifdef GRAPHICS_API_WEBGL2\n return c.r;\n #else\n return c.a;\n #endif\n}\n\nvoid main()\n{\n float rectClipAlpha = 1.0;\n if (renderer_UIRectClipEnabled > 0.5) {\n rectClipAlpha = getUIRectClipAlpha();\n }\n\n float coverage = sampleCoverage(v_uv);\n vec4 finalColor;\n\n if (renderer_OutlineWidth > 0.0) {\n vec2 texelSize = 1.0 / renderElement_TextTextureSize;\n vec2 step = texelSize * renderer_OutlineWidth;\n float outlineCoverage = coverage;\n outlineCoverage = max(outlineCoverage, sampleCoverage(v_uv + vec2( step.x, 0.0)));\n outlineCoverage = max(outlineCoverage, sampleCoverage(v_uv + vec2(-step.x, 0.0)));\n outlineCoverage = max(outlineCoverage, sampleCoverage(v_uv + vec2( 0.0, step.y)));\n outlineCoverage = max(outlineCoverage, sampleCoverage(v_uv + vec2( 0.0, -step.y)));\n outlineCoverage = max(outlineCoverage, sampleCoverage(v_uv + vec2( step.x * 0.7071, step.y * 0.7071)));\n outlineCoverage = max(outlineCoverage, sampleCoverage(v_uv + vec2(-step.x * 0.7071, step.y * 0.7071)));\n outlineCoverage = max(outlineCoverage, sampleCoverage(v_uv + vec2( step.x * 0.7071, -step.y * 0.7071)));\n outlineCoverage = max(outlineCoverage, sampleCoverage(v_uv + vec2(-step.x * 0.7071, -step.y * 0.7071)));\n\n vec3 rgb = mix(renderer_OutlineColor.rgb, v_color.rgb, coverage);\n float alpha = max(coverage * v_color.a, outlineCoverage * renderer_OutlineColor.a);\n finalColor = vec4(rgb, alpha);\n } else {\n finalColor = vec4(v_color.rgb, v_color.a * coverage);\n }\n\n finalColor.a *= rectClipAlpha;\n if (renderer_UIRectClipEnabled > 0.5 && renderer_UIRectClipHardClip > 0.5 && finalColor.a < 0.001) {\n discard;\n }\n gl_FragColor = finalColor;\n}\n"; // eslint-disable-line
24870
24964
 
24871
24965
  var textVs = "uniform mat4 renderer_MVPMat;\nuniform mat4 renderer_ModelMat;\n\nattribute vec3 POSITION;\nattribute vec2 TEXCOORD_0;\nattribute vec4 COLOR_0;\n\nvarying vec2 v_uv;\nvarying vec4 v_color;\nvarying vec2 v_worldPosition;\n\nvoid main()\n{\n gl_Position = renderer_MVPMat * vec4(POSITION, 1.0);\n\n v_uv = TEXCOORD_0;\n v_color = COLOR_0;\n v_worldPosition = POSITION.xy;\n}\n"; // eslint-disable-line
24872
24966