Skip to content

Commit 8703a2d

Browse files
authored
Support GUI (#2375)
* feat(2d): support GUI
1 parent 63a5662 commit 8703a2d

File tree

96 files changed

+6168
-1293
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+6168
-1293
lines changed

.github/workflows/release.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ jobs:
7676
cp -r ${{ github.workspace }}/packages/galacean/dist ${{ github.workspace }}/temp/@galacean/engine
7777
mkdir -p ${{ github.workspace }}/temp/@galacean/engine-xr
7878
cp -r ${{ github.workspace }}/packages/xr/dist ${{ github.workspace }}/temp/@galacean/engine-xr
79+
mkdir -p ${{ github.workspace }}/temp/@galacean/engine-ui
80+
cp -r ${{ github.workspace }}/packages/ui/dist ${{ github.workspace }}/temp/@galacean/engine-ui
7981
mkdir -p ${{ github.workspace }}/temp/@galacean/engine-shaderlab
8082
cp -r ${{ github.workspace }}/packages/shader-lab/dist ${{ github.workspace }}/temp/@galacean/engine-shaderlab
8183
mkdir -p ${{ github.workspace }}/temp/@galacean/engine-shader-shaderlab
@@ -113,6 +115,7 @@ jobs:
113115
"engine": [
114116
"${{ github.workspace }}/temp/@galacean/engine/dist/browser.js",
115117
"${{ github.workspace }}/temp/@galacean/engine-xr/dist/browser.js",
118+
"${{ github.workspace }}/temp/@galacean/engine-ui/dist/browser.js",
116119
"${{ github.workspace }}/temp/@galacean/engine-shaderlab/dist/browser.js",
117120
"${{ github.workspace }}/temp/@galacean/engine-shader-shaderlab/dist/browser.js",
118121
"${{ github.workspace }}/temp/@galacean/engine-physics-lite/dist/browser.js",
Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,21 @@
1-
import { Renderer } from "../../Renderer";
1+
import { Matrix, Vector2 } from "@galacean/engine-math";
2+
import { ISpriteRenderer } from "./ISpriteRenderer";
23

34
/**
4-
* @internal
5+
* Interface for sprite assembler.
56
*/
67
export interface ISpriteAssembler {
7-
resetData(renderer: Renderer, vertexCount?: number): void;
8-
updatePositions?(renderer: Renderer): void;
9-
updateUVs?(renderer: Renderer): void;
10-
updateColor?(renderer: Renderer): void;
8+
resetData(renderer: ISpriteRenderer, vertexCount?: number): void;
9+
updatePositions(
10+
renderer: ISpriteRenderer,
11+
worldMatrix: Matrix,
12+
width: number,
13+
height: number,
14+
pivot: Vector2,
15+
flipX: boolean,
16+
flipY: boolean,
17+
referenceResolutionPerUnit?: number
18+
): void;
19+
updateUVs(renderer: ISpriteRenderer): void;
20+
updateColor(renderer: ISpriteRenderer, alpha: number): void;
1121
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
import { Color } from "@galacean/engine-math";
2+
import { PrimitiveChunkManager } from "../../RenderPipeline/PrimitiveChunkManager";
3+
import { SubPrimitiveChunk } from "../../RenderPipeline/SubPrimitiveChunk";
4+
import { SpriteTileMode } from "../enums/SpriteTileMode";
5+
import { Sprite } from "../sprite";
6+
7+
/**
8+
* Interface for sprite renderer.
9+
*/
10+
export interface ISpriteRenderer {
11+
sprite: Sprite;
12+
color?: Color;
13+
tileMode?: SpriteTileMode;
14+
tiledAdaptiveThreshold?: number;
15+
_subChunk: SubPrimitiveChunk;
16+
_getChunkManager(): PrimitiveChunkManager;
17+
}

packages/core/src/2d/assembler/SimpleSpriteAssembler.ts

Lines changed: 29 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
1-
import { BoundingBox, Matrix } from "@galacean/engine-math";
1+
import { BoundingBox, Matrix, Vector2 } from "@galacean/engine-math";
22
import { StaticInterfaceImplement } from "../../base/StaticInterfaceImplement";
3-
import { SpriteMask } from "../sprite";
4-
import { SpriteRenderer } from "../sprite/SpriteRenderer";
53
import { ISpriteAssembler } from "./ISpriteAssembler";
4+
import { ISpriteRenderer } from "./ISpriteRenderer";
65

76
/**
8-
* @internal
7+
* Assemble vertex data for the sprite renderer in simple mode.
98
*/
109
@StaticInterfaceImplement<ISpriteAssembler>()
1110
export class SimpleSpriteAssembler {
12-
static _rectangleTriangles = [0, 1, 2, 2, 1, 3];
13-
static _worldMatrix = new Matrix();
11+
private static _rectangleTriangles = [0, 1, 2, 2, 1, 3];
12+
private static _matrix = new Matrix();
1413

15-
static resetData(renderer: SpriteRenderer | SpriteMask): void {
14+
static resetData(renderer: ISpriteRenderer): void {
1615
const manager = renderer._getChunkManager();
1716
const lastSubChunk = renderer._subChunk;
1817
lastSubChunk && manager.freeSubChunk(lastSubChunk);
@@ -21,16 +20,24 @@ export class SimpleSpriteAssembler {
2120
renderer._subChunk = subChunk;
2221
}
2322

24-
static updatePositions(renderer: SpriteRenderer | SpriteMask): void {
25-
const { width, height, sprite } = renderer;
26-
const { x: pivotX, y: pivotY } = sprite.pivot;
23+
static updatePositions(
24+
renderer: ISpriteRenderer,
25+
worldMatrix: Matrix,
26+
width: number,
27+
height: number,
28+
pivot: Vector2,
29+
flipX: boolean,
30+
flipY: boolean
31+
): void {
32+
const { sprite } = renderer;
33+
const { x: pivotX, y: pivotY } = pivot;
34+
// Position to World
35+
const modelMatrix = SimpleSpriteAssembler._matrix;
36+
const { elements: wE } = modelMatrix;
2737
// Renderer's worldMatrix
28-
const worldMatrix = SimpleSpriteAssembler._worldMatrix;
29-
const { elements: wE } = worldMatrix;
30-
// Parent's worldMatrix
31-
const { elements: pWE } = renderer.entity.transform.worldMatrix;
32-
const sx = renderer.flipX ? -width : width;
33-
const sy = renderer.flipY ? -height : height;
38+
const { elements: pWE } = worldMatrix;
39+
const sx = flipX ? -width : width;
40+
const sy = flipY ? -height : height;
3441
(wE[0] = pWE[0] * sx), (wE[1] = pWE[1] * sx), (wE[2] = pWE[2] * sx);
3542
(wE[4] = pWE[4] * sy), (wE[5] = pWE[5] * sy), (wE[6] = pWE[6] * sy);
3643
(wE[8] = pWE[8]), (wE[9] = pWE[9]), (wE[10] = pWE[10]);
@@ -54,10 +61,11 @@ export class SimpleSpriteAssembler {
5461
vertices[o + 2] = wE[2] * x + wE[6] * y + wE[14];
5562
}
5663

57-
BoundingBox.transform(sprite._getBounds(), worldMatrix, renderer._bounds);
64+
// @ts-ignore
65+
BoundingBox.transform(sprite._getBounds(), modelMatrix, renderer._bounds);
5866
}
5967

60-
static updateUVs(renderer: SpriteRenderer | SpriteMask): void {
68+
static updateUVs(renderer: ISpriteRenderer): void {
6169
const spriteUVs = renderer.sprite._getUVs();
6270
const { x: left, y: bottom } = spriteUVs[0];
6371
const { x: right, y: top } = spriteUVs[3];
@@ -74,15 +82,16 @@ export class SimpleSpriteAssembler {
7482
vertices[offset + 28] = top;
7583
}
7684

77-
static updateColor(renderer: SpriteRenderer): void {
85+
static updateColor(renderer: ISpriteRenderer, alpha: number): void {
7886
const subChunk = renderer._subChunk;
7987
const { r, g, b, a } = renderer.color;
88+
const finalAlpha = a * alpha;
8089
const vertices = subChunk.chunk.vertices;
8190
for (let i = 0, o = subChunk.vertexArea.start + 5; i < 4; ++i, o += 9) {
8291
vertices[o] = r;
8392
vertices[o + 1] = g;
8493
vertices[o + 2] = b;
85-
vertices[o + 3] = a;
94+
vertices[o + 3] = finalAlpha;
8695
}
8796
}
8897
}
Lines changed: 48 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
1-
import { Matrix } from "@galacean/engine-math";
1+
import { Matrix, Vector2 } from "@galacean/engine-math";
22
import { StaticInterfaceImplement } from "../../base/StaticInterfaceImplement";
3-
import { SpriteRenderer } from "../sprite/SpriteRenderer";
43
import { ISpriteAssembler } from "./ISpriteAssembler";
4+
import { ISpriteRenderer } from "./ISpriteRenderer";
55

66
/**
7-
* @internal
7+
* Assemble vertex data for the sprite renderer in sliced mode.
88
*/
99
@StaticInterfaceImplement<ISpriteAssembler>()
1010
export class SlicedSpriteAssembler {
11-
static _rectangleTriangles = [
11+
private static _rectangleTriangles = [
1212
0, 1, 4, 1, 5, 4, 1, 2, 5, 2, 6, 5, 2, 3, 6, 3, 7, 6, 4, 5, 8, 5, 9, 8, 5, 6, 9, 6, 10, 9, 6, 7, 10, 7, 11, 10, 8,
1313
9, 12, 9, 13, 12, 9, 10, 13, 10, 14, 13, 10, 11, 14, 11, 15, 14
1414
];
15-
static _worldMatrix = new Matrix();
15+
private static _matrix = new Matrix();
16+
private static _row = new Array<number>(4);
17+
private static _column = new Array<number>(4);
1618

17-
static resetData(renderer: SpriteRenderer): void {
19+
static resetData(renderer: ISpriteRenderer): void {
1820
const manager = renderer._getChunkManager();
1921
const lastSubChunk = renderer._subChunk;
2022
lastSubChunk && manager.freeSubChunk(lastSubChunk);
@@ -23,14 +25,24 @@ export class SlicedSpriteAssembler {
2325
renderer._subChunk = subChunk;
2426
}
2527

26-
static updatePositions(renderer: SpriteRenderer): void {
27-
const { width, height, sprite } = renderer;
28+
static updatePositions(
29+
renderer: ISpriteRenderer,
30+
worldMatrix: Matrix,
31+
width: number,
32+
height: number,
33+
pivot: Vector2,
34+
flipX: boolean,
35+
flipY: boolean,
36+
referenceResolutionPerUnit: number = 1
37+
): void {
38+
const { sprite } = renderer;
2839
const { border } = sprite;
2940
// Update local positions.
3041
const spritePositions = sprite._getPositions();
3142
const { x: left, y: bottom } = spritePositions[0];
3243
const { x: right, y: top } = spritePositions[3];
33-
const { width: expectWidth, height: expectHeight } = sprite;
44+
const expectWidth = sprite.width * referenceResolutionPerUnit;
45+
const expectHeight = sprite.height * referenceResolutionPerUnit;
3446
const fixedLeft = expectWidth * border.x;
3547
const fixedBottom = expectHeight * border.y;
3648
const fixedRight = expectWidth * border.z;
@@ -47,42 +59,36 @@ export class SlicedSpriteAssembler {
4759
// column
4860
// ------------------------
4961
// Calculate row and column.
50-
let row: number[], column: number[];
62+
const { _row: row, _column: column } = SlicedSpriteAssembler;
5163
if (fixedLeft + fixedRight > width) {
5264
const widthScale = width / (fixedLeft + fixedRight);
53-
row = [
54-
expectWidth * left * widthScale,
55-
fixedLeft * widthScale,
56-
fixedLeft * widthScale,
57-
width - expectWidth * (1 - right) * widthScale
58-
];
65+
(row[0] = expectWidth * left * widthScale), (row[1] = row[2] = fixedLeft * widthScale);
66+
row[3] = width - expectWidth * (1 - right) * widthScale;
5967
} else {
60-
row = [expectWidth * left, fixedLeft, width - fixedRight, width - expectWidth * (1 - right)];
68+
(row[0] = expectWidth * left), (row[1] = fixedLeft), (row[2] = width - fixedRight);
69+
row[3] = width - expectWidth * (1 - right);
6170
}
6271

6372
if (fixedTop + fixedBottom > height) {
6473
const heightScale = height / (fixedTop + fixedBottom);
65-
column = [
66-
expectHeight * bottom * heightScale,
67-
fixedBottom * heightScale,
68-
fixedBottom * heightScale,
69-
height - expectHeight * (1 - top) * heightScale
70-
];
74+
(column[0] = expectHeight * bottom * heightScale), (column[1] = column[2] = fixedBottom * heightScale);
75+
column[3] = height - expectHeight * (1 - top) * heightScale;
7176
} else {
72-
column = [expectHeight * bottom, fixedBottom, height - fixedTop, height - expectHeight * (1 - top)];
77+
(column[0] = expectHeight * bottom), (column[1] = fixedBottom), (column[2] = height - fixedTop);
78+
column[3] = height - expectHeight * (1 - top);
7379
}
7480

7581
// Update renderer's worldMatrix.
76-
const { x: pivotX, y: pivotY } = renderer.sprite.pivot;
77-
const localTransX = renderer.width * pivotX;
78-
const localTransY = renderer.height * pivotY;
82+
const { x: pivotX, y: pivotY } = pivot;
83+
const localTransX = width * pivotX;
84+
const localTransY = height * pivotY;
85+
// Position to World
86+
const modelMatrix = SlicedSpriteAssembler._matrix;
87+
const { elements: wE } = modelMatrix;
7988
// Renderer's worldMatrix.
80-
const worldMatrix = SlicedSpriteAssembler._worldMatrix;
81-
const { elements: wE } = worldMatrix;
82-
// Parent's worldMatrix.
83-
const { elements: pWE } = renderer.entity.transform.worldMatrix;
84-
const sx = renderer.flipX ? -1 : 1;
85-
const sy = renderer.flipY ? -1 : 1;
89+
const { elements: pWE } = worldMatrix;
90+
const sx = flipX ? -1 : 1;
91+
const sy = flipY ? -1 : 1;
8692
(wE[0] = pWE[0] * sx), (wE[1] = pWE[1] * sx), (wE[2] = pWE[2] * sx);
8793
(wE[4] = pWE[4] * sy), (wE[5] = pWE[5] * sy), (wE[6] = pWE[6] * sy);
8894
(wE[8] = pWE[8]), (wE[9] = pWE[9]), (wE[10] = pWE[10]);
@@ -112,13 +118,14 @@ export class SlicedSpriteAssembler {
112118
}
113119
}
114120

115-
const { min, max } = renderer._bounds;
116-
min.set(row[0], column[0], 0);
117-
max.set(row[3], column[3], 0);
118-
renderer._bounds.transform(worldMatrix);
121+
// @ts-ignore
122+
const bounds = renderer._bounds;
123+
bounds.min.set(row[0], column[0], 0);
124+
bounds.max.set(row[3], column[3], 0);
125+
bounds.transform(modelMatrix);
119126
}
120127

121-
static updateUVs(renderer: SpriteRenderer): void {
128+
static updateUVs(renderer: ISpriteRenderer): void {
122129
const subChunk = renderer._subChunk;
123130
const vertices = subChunk.chunk.vertices;
124131
const spriteUVs = renderer.sprite._getUVs();
@@ -131,15 +138,16 @@ export class SlicedSpriteAssembler {
131138
}
132139
}
133140

134-
static updateColor(renderer: SpriteRenderer): void {
141+
static updateColor(renderer: ISpriteRenderer, alpha: number): void {
135142
const subChunk = renderer._subChunk;
136143
const { r, g, b, a } = renderer.color;
144+
const finalAlpha = a * alpha;
137145
const vertices = subChunk.chunk.vertices;
138146
for (let i = 0, o = subChunk.vertexArea.start + 5; i < 16; ++i, o += 9) {
139147
vertices[o] = r;
140148
vertices[o + 1] = g;
141149
vertices[o + 2] = b;
142-
vertices[o + 3] = a;
150+
vertices[o + 3] = finalAlpha;
143151
}
144152
}
145153
}

0 commit comments

Comments
 (0)