@galacean/engine 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/browser.js CHANGED
@@ -7017,7 +7017,7 @@
7017
7017
  _inherits$2(FontAtlas, ReferResource);
7018
7018
  function FontAtlas(engine) {
7019
7019
  var _this;
7020
- _this = ReferResource.call(this, engine) || this, _this._charInfoMap = {}, _this._space = 1, _this._curX = 1, _this._curY = 1, _this._nextY = 1;
7020
+ _this = ReferResource.call(this, engine) || this, _this._charInfoMap = {}, _this._space = 4, _this._curX = 4, _this._curY = 4, _this._nextY = 4;
7021
7021
  _this.isGCIgnored = true;
7022
7022
  var format = engine._hardwareRenderer.isWebGL2 ? TextureFormat.R8 : TextureFormat.Alpha8;
7023
7023
  var texture = new Texture2D(engine, 512, 512, format, false);
@@ -14611,6 +14611,28 @@
14611
14611
  // Order: cheap reference checks → mask state → tag lookup (rare opt-out)
14612
14612
  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;
14613
14613
  };
14614
+ /**
14615
+ * Text-specific batch check: extends sprite check with outline parity.
14616
+ * Different outlineWidth or outlineColor must split into separate draw calls,
14617
+ * because outline uniforms are shared per draw call.
14618
+ */ VertexMergeBatcher.canBatchText = function canBatchText(preElement, curElement) {
14619
+ if (!VertexMergeBatcher.canBatchSprite(preElement, curElement)) {
14620
+ return false;
14621
+ }
14622
+ var preRendererAny = preElement.component;
14623
+ var curRendererAny = curElement.component;
14624
+ if (preRendererAny._outlineWidth !== curRendererAny._outlineWidth) {
14625
+ return false;
14626
+ }
14627
+ if (preRendererAny._outlineWidth > 0) {
14628
+ var a = preRendererAny._outlineColor;
14629
+ var b = curRendererAny._outlineColor;
14630
+ if (a.r !== b.r || a.g !== b.g || a.b !== b.b || a.a !== b.a) {
14631
+ return false;
14632
+ }
14633
+ }
14634
+ return true;
14635
+ };
14614
14636
  VertexMergeBatcher.canBatchSpriteMask = function canBatchSpriteMask(preElement, curElement) {
14615
14637
  if (preElement.subChunk.chunk !== curElement.subChunk.chunk) {
14616
14638
  return false;
@@ -16130,13 +16152,18 @@
16130
16152
  _inherits$2(TextRenderer, Renderer);
16131
16153
  function TextRenderer(entity) {
16132
16154
  var _this;
16133
- _this = Renderer.call(this, entity) || this, _this._textChunks = Array(), /** @internal */ _this._subFont = null, /** @internal */ _this._dirtyFlag = 15, _this._color = new Color(1, 1, 1, 1), _this._text = "", _this._width = 0, _this._height = 0, _this._localBounds = new 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;
16155
+ _this = Renderer.call(this, entity) || this, _this._textChunks = Array(), /** @internal */ _this._subFont = null, /** @internal */ _this._dirtyFlag = 15, _this._color = new Color(1, 1, 1, 1), _this._text = "", _this._width = 0, _this._height = 0, _this._localBounds = new 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 Color(0, 0, 0, 1), _this._outlineWidth = 0;
16134
16156
  var engine = _this.engine;
16135
16157
  _this._font = engine._textDefaultFont;
16136
16158
  _this._addResourceReferCount(_this._font, 1);
16137
16159
  _this.setMaterial(engine._basicResources.textDefaultMaterial);
16160
+ var shaderData = _this.shaderData;
16161
+ shaderData.setFloat(TextRenderer._outlineWidthProperty, _this._outlineWidth);
16162
+ shaderData.setColor(TextRenderer._outlineColorProperty, _this._outlineColor);
16138
16163
  //@ts-ignore
16139
16164
  _this._color._onValueChanged = _this._onColorChanged.bind(_this);
16165
+ // @ts-ignore
16166
+ _this._outlineColor._onValueChanged = _this._onOutlineColorChanged.bind(_this);
16140
16167
  return _this;
16141
16168
  }
16142
16169
  var _proto = TextRenderer.prototype;
@@ -16158,6 +16185,7 @@
16158
16185
  Renderer.prototype._cloneTo.call(this, target);
16159
16186
  target.font = this._font;
16160
16187
  target._subFont = this._subFont;
16188
+ target.outlineWidth = this._outlineWidth;
16161
16189
  };
16162
16190
  /**
16163
16191
  * @internal
@@ -16191,7 +16219,7 @@
16191
16219
  /**
16192
16220
  * @internal
16193
16221
  */ _proto._canBatch = function _canBatch(preElement, curElement) {
16194
- return VertexMergeBatcher.canBatchSprite(preElement, curElement);
16222
+ return VertexMergeBatcher.canBatchText(preElement, curElement);
16195
16223
  };
16196
16224
  /**
16197
16225
  * @internal
@@ -16234,6 +16262,7 @@
16234
16262
  var distanceForSort = this._distanceForSort;
16235
16263
  var renderPipeline = camera._renderPipeline;
16236
16264
  var textChunks = this._textChunks;
16265
+ var textTextureSize = TextRenderer._tempVec20;
16237
16266
  for(var i = 0, n = textChunks.length; i < n; ++i){
16238
16267
  var _renderElement;
16239
16268
  var _textChunks_i = textChunks[i], subChunk = _textChunks_i.subChunk, texture = _textChunks_i.texture;
@@ -16241,6 +16270,7 @@
16241
16270
  renderElement.set(this, material, subChunk.chunk.primitive, subChunk.subMesh, texture, subChunk);
16242
16271
  (_renderElement = renderElement).shaderData || (_renderElement.shaderData = new ShaderData(ShaderDataGroup.RenderElement));
16243
16272
  renderElement.shaderData.setTexture(TextRenderer._textureProperty, texture);
16273
+ renderElement.shaderData.setVector2(TextRenderer._textTextureSizeProperty, textTextureSize.set(texture.width, texture.height));
16244
16274
  renderElement.priority = priority;
16245
16275
  renderElement.distanceForSort = distanceForSort;
16246
16276
  renderPipeline.pushRenderElement(context, renderElement);
@@ -16372,10 +16402,11 @@
16372
16402
  charRenderInfo.texture = charFont._getTextureByIndex(charInfo.index);
16373
16403
  charRenderInfo.uvs = charInfo.uvs;
16374
16404
  var w = charInfo.w, ascent = charInfo.ascent, descent = charInfo.descent;
16375
- var left = startX * pixelsPerUnitReciprocal;
16376
- var right = (startX + w) * pixelsPerUnitReciprocal;
16377
- var top = (startY + ascent) * pixelsPerUnitReciprocal;
16378
- var bottom = (startY - descent) * pixelsPerUnitReciprocal;
16405
+ var ow = this._outlineWidth * pixelsPerUnitReciprocal;
16406
+ var left = startX * pixelsPerUnitReciprocal - ow;
16407
+ var right = (startX + w) * pixelsPerUnitReciprocal + ow;
16408
+ var top = (startY + ascent) * pixelsPerUnitReciprocal + ow;
16409
+ var bottom = (startY - descent) * pixelsPerUnitReciprocal - ow;
16379
16410
  localPositions.set(left, top, right, bottom);
16380
16411
  i === firstLine && (maxY = Math.max(maxY, top));
16381
16412
  minY = Math.min(minY, bottom);
@@ -16449,6 +16480,10 @@
16449
16480
  var vertices = subChunk.chunk.vertices;
16450
16481
  var indices = subChunk.indices = [];
16451
16482
  var charRenderInfos = textChunk.charRenderInfos;
16483
+ var ow = this._outlineWidth;
16484
+ var texture = textChunk.texture;
16485
+ var owU = ow > 0 ? ow / texture.width : 0;
16486
+ var owV = ow > 0 ? ow / texture.height : 0;
16452
16487
  for(var i = 0, ii = 0, io = 0, vo = subChunk.vertexArea.start + 3; i < count; ++i, io += 4){
16453
16488
  var charRenderInfo = charRenderInfos[i];
16454
16489
  charRenderInfo.indexInChunk = i;
@@ -16456,10 +16491,13 @@
16456
16491
  for(var j = 0; j < tempIndicesLength; ++j){
16457
16492
  indices[ii++] = tempIndices[j] + io;
16458
16493
  }
16459
- // Set uv and color for vertices
16494
+ // Set uv and color for vertices, expand uv outward by outline width
16460
16495
  for(var j1 = 0; j1 < 4; ++j1, vo += 9){
16461
16496
  var uv = charRenderInfo.uvs[j1];
16462
- uv.copyToArray(vertices, vo);
16497
+ var su = j1 === 1 || j1 === 2 ? 1 : -1;
16498
+ var sv = j1 >= 2 ? 1 : -1;
16499
+ vertices[vo] = uv.x + owU * su;
16500
+ vertices[vo + 1] = uv.y + owV * sv;
16463
16501
  vertices[vo + 2] = r;
16464
16502
  vertices[vo + 3] = g;
16465
16503
  vertices[vo + 4] = b;
@@ -16488,6 +16526,9 @@
16488
16526
  _proto._onColorChanged = function _onColorChanged() {
16489
16527
  this._setDirtyFlagTrue(16);
16490
16528
  };
16529
+ _proto._onOutlineColorChanged = function _onOutlineColorChanged() {
16530
+ this.shaderData.setColor(TextRenderer._outlineColorProperty, this._outlineColor);
16531
+ };
16491
16532
  _create_class$2(TextRenderer, [
16492
16533
  {
16493
16534
  key: "color",
@@ -16674,6 +16715,35 @@
16674
16715
  }
16675
16716
  }
16676
16717
  },
16718
+ {
16719
+ key: "outlineWidth",
16720
+ get: /**
16721
+ * The outline width in pixels. 0 means outline is disabled. Clamped to [0, 8].
16722
+ */ function get() {
16723
+ return this._outlineWidth;
16724
+ },
16725
+ set: function set(value) {
16726
+ value = Math.max(0, Math.min(value, 3));
16727
+ if (this._outlineWidth !== value) {
16728
+ this._outlineWidth = value;
16729
+ this.shaderData.setFloat(TextRenderer._outlineWidthProperty, value);
16730
+ this._setDirtyFlagTrue(14);
16731
+ }
16732
+ }
16733
+ },
16734
+ {
16735
+ key: "outlineColor",
16736
+ get: /**
16737
+ * The outline color. Only effective when outlineWidth > 0.
16738
+ */ function get() {
16739
+ return this._outlineColor;
16740
+ },
16741
+ set: function set(value) {
16742
+ if (this._outlineColor !== value) {
16743
+ this._outlineColor.copyFrom(value);
16744
+ }
16745
+ }
16746
+ },
16677
16747
  {
16678
16748
  key: "maskInteraction",
16679
16749
  get: /**
@@ -16724,9 +16794,13 @@
16724
16794
  ]);
16725
16795
  return TextRenderer;
16726
16796
  }(exports.Renderer);
16727
- TextRenderer._textureProperty = ShaderProperty.getByName("renderElement_TextTexture");
16797
+ TextRenderer._tempVec20 = new Vector2();
16728
16798
  TextRenderer._tempVec30 = new Vector3();
16729
16799
  TextRenderer._tempVec31 = new Vector3();
16800
+ TextRenderer._textureProperty = ShaderProperty.getByName("renderElement_TextTexture");
16801
+ TextRenderer._textTextureSizeProperty = ShaderProperty.getByName("renderElement_TextTextureSize");
16802
+ TextRenderer._outlineColorProperty = ShaderProperty.getByName("renderer_OutlineColor");
16803
+ TextRenderer._outlineWidthProperty = ShaderProperty.getByName("renderer_OutlineWidth");
16730
16804
  TextRenderer._worldPositions = [
16731
16805
  new Vector3(),
16732
16806
  new Vector3(),
@@ -16785,12 +16859,21 @@
16785
16859
  __decorate$1([
16786
16860
  assignmentClone
16787
16861
  ], TextRenderer.prototype, "_overflowMode", void 0);
16862
+ __decorate$1([
16863
+ deepClone
16864
+ ], TextRenderer.prototype, "_outlineColor", void 0);
16865
+ __decorate$1([
16866
+ ignoreClone
16867
+ ], TextRenderer.prototype, "_outlineWidth", void 0);
16788
16868
  __decorate$1([
16789
16869
  ignoreClone
16790
16870
  ], TextRenderer.prototype, "_onTransformChanged", null);
16791
16871
  __decorate$1([
16792
16872
  ignoreClone
16793
16873
  ], TextRenderer.prototype, "_onColorChanged", null);
16874
+ __decorate$1([
16875
+ ignoreClone
16876
+ ], TextRenderer.prototype, "_onOutlineColorChanged", null);
16794
16877
  var TextChunk = function TextChunk() {
16795
16878
  this.charRenderInfos = new Array();
16796
16879
  };
@@ -23102,14 +23185,16 @@
23102
23185
  }
23103
23186
  };
23104
23187
  _proto._getComponentsInChildren = function _getComponentsInChildren(type, results) {
23105
- for(var i = this._components.length - 1; i >= 0; i--){
23106
- var component = this._components[i];
23188
+ var components = this._components;
23189
+ for(var i = 0, n = components.length; i < n; i++){
23190
+ var component = components[i];
23107
23191
  if (_instanceof1$2(component, type)) {
23108
23192
  results.push(component);
23109
23193
  }
23110
23194
  }
23111
- for(var i1 = this._children.length - 1; i1 >= 0; i1--){
23112
- this._children[i1]._getComponentsInChildren(type, results);
23195
+ var children = this._children;
23196
+ for(var i1 = 0, n1 = children.length; i1 < n1; i1++){
23197
+ children[i1]._getComponentsInChildren(type, results);
23113
23198
  }
23114
23199
  };
23115
23200
  _proto._setActiveInHierarchy = function _setActiveInHierarchy(activeChangeFlag) {
@@ -25220,6 +25305,7 @@
25220
25305
  function Pointer(id) {
25221
25306
  /** The phase of pointer. */ this.phase = PointerPhase.Leave;
25222
25307
  /** The position of the pointer in screen space pixel coordinates. */ this.position = new Vector2();
25308
+ /** The position of the pointer when it was last pressed down (in screen space pixel coordinates). */ this.pressedPosition = new Vector2();
25223
25309
  /** The change of the pointer. */ this.deltaPosition = new Vector2();
25224
25310
  /** @internal */ this._events = [];
25225
25311
  /** @internal */ this._upMap = [];
@@ -25267,12 +25353,16 @@
25267
25353
  */ var PointerEventData = /*#__PURE__*/ function() {
25268
25354
  function PointerEventData() {
25269
25355
  /** The position of the event trigger (in world space). */ this.worldPosition = new Vector3();
25356
+ /** The hit-tested target entity (deepest entity on the bubble path). */ this.target = null;
25357
+ /** The entity currently handling the event (same as target on non-bubbling fire, varies on bubble). */ this.currentTarget = null;
25270
25358
  }
25271
25359
  var _proto = PointerEventData.prototype;
25272
25360
  /**
25273
25361
  * @internal
25274
25362
  */ _proto.dispose = function dispose() {
25275
25363
  this.pointer = null;
25364
+ this.target = null;
25365
+ this.currentTarget = null;
25276
25366
  };
25277
25367
  return PointerEventData;
25278
25368
  }();
@@ -28104,10 +28194,13 @@
28104
28194
  this._init();
28105
28195
  }
28106
28196
  var _proto = PointerEventEmitter.prototype;
28107
- _proto._createEventData = function _createEventData(pointer) {
28197
+ _proto._createEventData = function _createEventData(pointer, target, currentTarget) {
28198
+ if (currentTarget === void 0) currentTarget = target;
28108
28199
  var data = this._pool.get();
28109
28200
  data.pointer = pointer;
28110
28201
  data.worldPosition.copyFrom(this._hitResult.point);
28202
+ data.target = target;
28203
+ data.currentTarget = currentTarget;
28111
28204
  return data;
28112
28205
  };
28113
28206
  _proto._fireDown = function _fireDown(entity, eventData) {
@@ -28236,12 +28329,12 @@
28236
28329
  };
28237
28330
  _proto.processDrag = function processDrag(pointer) {
28238
28331
  var entity = this._draggedEntity;
28239
- entity && this._fireDrag(entity, this._createEventData(pointer));
28332
+ entity && this._fireDrag(entity, this._createEventData(pointer, entity, entity));
28240
28333
  };
28241
28334
  _proto.processDown = function processDown(pointer) {
28242
28335
  var entity = this._pressedEntity = this._draggedEntity = this._enteredEntity;
28243
28336
  if (entity) {
28244
- var eventData = this._createEventData(pointer);
28337
+ var eventData = this._createEventData(pointer, entity, entity);
28245
28338
  this._fireDown(entity, eventData);
28246
28339
  this._fireBeginDrag(entity, eventData);
28247
28340
  }
@@ -28250,26 +28343,26 @@
28250
28343
  var _this = this, enteredEntity = _this._enteredEntity, draggedEntity = _this._draggedEntity;
28251
28344
  if (enteredEntity) {
28252
28345
  var sameTarget = this._pressedEntity === enteredEntity;
28253
- var eventData = this._createEventData(pointer);
28346
+ var eventData = this._createEventData(pointer, enteredEntity, enteredEntity);
28254
28347
  this._fireUp(enteredEntity, eventData);
28255
28348
  sameTarget && this._fireClick(enteredEntity, eventData);
28256
28349
  this._fireDrop(enteredEntity, eventData);
28257
28350
  }
28258
28351
  this._pressedEntity = null;
28259
28352
  if (draggedEntity) {
28260
- this._fireEndDrag(draggedEntity, this._createEventData(pointer));
28353
+ this._fireEndDrag(draggedEntity, this._createEventData(pointer, draggedEntity, draggedEntity));
28261
28354
  this._draggedEntity = null;
28262
28355
  }
28263
28356
  };
28264
28357
  _proto.processLeave = function processLeave(pointer) {
28265
28358
  var enteredEntity = this._enteredEntity;
28266
28359
  if (enteredEntity) {
28267
- this._fireExit(enteredEntity, this._createEventData(pointer));
28360
+ this._fireExit(enteredEntity, this._createEventData(pointer, enteredEntity, enteredEntity));
28268
28361
  this._enteredEntity = null;
28269
28362
  }
28270
28363
  var draggedEntity = this._draggedEntity;
28271
28364
  if (draggedEntity) {
28272
- this._fireEndDrag(draggedEntity, this._createEventData(pointer));
28365
+ this._fireEndDrag(draggedEntity, this._createEventData(pointer, draggedEntity, draggedEntity));
28273
28366
  this._draggedEntity = null;
28274
28367
  }
28275
28368
  this._pressedEntity = null;
@@ -28284,10 +28377,10 @@
28284
28377
  var enteredEntity = this._enteredEntity;
28285
28378
  if (entity !== enteredEntity) {
28286
28379
  if (enteredEntity) {
28287
- this._fireExit(enteredEntity, this._createEventData(pointer));
28380
+ this._fireExit(enteredEntity, this._createEventData(pointer, enteredEntity, enteredEntity));
28288
28381
  }
28289
28382
  if (entity) {
28290
- this._fireEnter(entity, this._createEventData(pointer));
28383
+ this._fireEnter(entity, this._createEventData(pointer, entity, entity));
28291
28384
  }
28292
28385
  this._enteredEntity = entity;
28293
28386
  }
@@ -28481,6 +28574,7 @@
28481
28574
  pointer._downMap[button] = frameCount;
28482
28575
  pointer._frameEvents |= PointerEventType.Down;
28483
28576
  pointer.phase = PointerPhase.Down;
28577
+ pointer.pressedPosition.copyFrom(pointer.position);
28484
28578
  break;
28485
28579
  }
28486
28580
  case "pointerup":
@@ -29626,7 +29720,7 @@
29626
29720
  var spriteMaskVs = "uniform mat4 camera_VPMat;\n\nattribute vec3 POSITION;\nattribute vec2 TEXCOORD_0;\n\nvarying vec2 v_uv;\n\nvoid main()\n{\n gl_Position = camera_VPMat * vec4(POSITION, 1.0);\n v_uv = TEXCOORD_0;\n}\n"; // eslint-disable-line
29627
29721
  var spriteFs = "#include <common>\nuniform sampler2D renderer_SpriteTexture;\n\nvarying vec2 v_uv;\nvarying vec4 v_color;\n\nvoid main()\n{\n vec4 baseColor = texture2DSRGB(renderer_SpriteTexture, v_uv);\n gl_FragColor = baseColor * v_color;\n}\n"; // eslint-disable-line
29628
29722
  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
29629
- 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
29723
+ 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
29630
29724
  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
29631
29725
  var trailFs = "#include <common>\n\nvarying vec2 v_uv;\nvarying vec4 v_color;\n\nuniform vec4 material_BaseColor;\n\n#ifdef MATERIAL_HAS_BASETEXTURE\n uniform sampler2D material_BaseTexture;\n#endif\n\nuniform mediump vec3 material_EmissiveColor;\n#ifdef MATERIAL_HAS_EMISSIVETEXTURE\n uniform sampler2D material_EmissiveTexture;\n#endif\n\nvoid main() {\n vec4 color = material_BaseColor * v_color;\n\n #ifdef MATERIAL_HAS_BASETEXTURE\n color *= texture2DSRGB(material_BaseTexture, v_uv);\n #endif\n\n // Emissive\n vec3 emissiveRadiance = material_EmissiveColor;\n #ifdef MATERIAL_HAS_EMISSIVETEXTURE\n emissiveRadiance *= texture2DSRGB(material_EmissiveTexture, v_uv).rgb;\n #endif\n\n color.rgb += emissiveRadiance;\n\n gl_FragColor = color;\n}\n\n"; // eslint-disable-line
29632
29726
  var trailVs = "attribute vec4 a_PositionBirthTime; // xyz: World position, w: Birth time (used by CPU only)\nattribute vec4 a_CornerTangent; // x: Corner (-1 or 1), yzw: Tangent direction\nattribute float a_Distance; // Absolute cumulative distance (written once per point)\n\nuniform vec4 renderer_TrailParams; // x: TextureMode (0: Stretch, 1: Tile), y: TextureScaleX, z: TextureScaleY\nuniform vec2 renderer_DistanceParams; // x: HeadDistance, y: TailDistance\nuniform vec3 camera_Position;\nuniform mat4 camera_ViewMat;\nuniform mat4 camera_ProjMat;\nuniform vec2 renderer_WidthCurve[4]; // Width curve (4 keyframes max: x=time, y=value)\nuniform vec4 renderer_ColorKeys[4]; // Color gradient (x=time, yzw=rgb)\nuniform vec2 renderer_AlphaKeys[4]; // Alpha gradient (x=time, y=alpha)\nuniform vec4 renderer_CurveMaxTime; // x: colorMaxTime, y: alphaMaxTime, z: widthMaxTime\n\nvarying vec2 v_uv;\nvarying vec4 v_color;\n\n#include <particle_common>\n\nvoid main() {\n vec3 position = a_PositionBirthTime.xyz;\n float corner = a_CornerTangent.x;\n vec3 tangent = a_CornerTangent.yzw;\n\n // Distance-based relative position: 0=head(newest), 1=tail(oldest)\n float distFromHead = renderer_DistanceParams.x - a_Distance;\n float totalDist = renderer_DistanceParams.x - renderer_DistanceParams.y;\n float relativePos = totalDist > 0.0 ? distFromHead / totalDist : 0.0;\n\n // Billboard: expand perpendicular to tangent and view direction\n vec3 toCamera = normalize(camera_Position - position);\n vec3 right = cross(tangent, toCamera);\n float rightLenSq = dot(right, right);\n if (rightLenSq < 0.000001) {\n right = cross(tangent, vec3(0.0, 1.0, 0.0));\n rightLenSq = dot(right, right);\n if (rightLenSq < 0.000001) {\n right = cross(tangent, vec3(1.0, 0.0, 0.0));\n rightLenSq = dot(right, right);\n }\n }\n right = right * inversesqrt(rightLenSq);\n\n float width = evaluateParticleCurve(renderer_WidthCurve, min(relativePos, renderer_CurveMaxTime.z));\n vec3 worldPosition = position + right * width * 0.5 * corner;\n\n gl_Position = camera_ProjMat * camera_ViewMat * vec4(worldPosition, 1.0);\n\n // u = position along trail (affected by textureMode), v = corner side.\n float u = renderer_TrailParams.x == 0.0 ? relativePos : distFromHead;\n float v = corner * 0.5 + 0.5;\n v_uv = vec2(u * renderer_TrailParams.y, v * renderer_TrailParams.z);\n\n v_color = evaluateParticleGradient(renderer_ColorKeys, renderer_CurveMaxTime.x, renderer_AlphaKeys, renderer_CurveMaxTime.y, relativePos);\n}\n"; // eslint-disable-line
@@ -55367,8 +55461,7 @@
55367
55461
  ShaderLoader._builtinRegex = /^\s*\/\/\s*@builtin\s+(\w+)/;
55368
55462
  ShaderLoader = __decorate([
55369
55463
  resourceLoader(AssetType.Shader, [
55370
- "gs",
55371
- "gsl"
55464
+ "shader"
55372
55465
  ])
55373
55466
  ], ShaderLoader);
55374
55467
  var PhysicsMaterialLoader = /*#__PURE__*/ function(Loader) {
@@ -56079,7 +56172,7 @@
56079
56172
  ], EXT_texture_webp);
56080
56173
 
56081
56174
  //@ts-ignore
56082
- var version = "0.0.0-experimental-2.0-game.8";
56175
+ var version = "0.0.0-experimental-2.0-game.10";
56083
56176
  console.log("Galacean Engine Version: " + version);
56084
56177
  for(var key in CoreObjects){
56085
56178
  Loader.registerClass(key, CoreObjects[key]);