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

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
  };
@@ -29626,7 +29709,7 @@
29626
29709
  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
29710
  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
29711
  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
29712
+ 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
29713
  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
29714
  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
29715
  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
@@ -56079,7 +56162,7 @@
56079
56162
  ], EXT_texture_webp);
56080
56163
 
56081
56164
  //@ts-ignore
56082
- var version = "0.0.0-experimental-2.0-game.8";
56165
+ var version = "0.0.0-experimental-2.0-game.9";
56083
56166
  console.log("Galacean Engine Version: " + version);
56084
56167
  for(var key in CoreObjects){
56085
56168
  Loader.registerClass(key, CoreObjects[key]);