-
-
Notifications
You must be signed in to change notification settings - Fork 307
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add GUI #2375
base: dev/1.4
Are you sure you want to change the base?
Add GUI #2375
Changes from 223 commits
9c1b561
a44de9e
d504369
06c8e53
60b240a
123dde4
563bfbe
a2a236b
bfd7435
51de522
88bb053
554b80a
339f7eb
c648e0c
26308cf
28d9579
139f247
a0ed23b
b550930
2d86283
8e028fb
40b1e88
eee57cf
4be33d5
0d3f67b
61bfb35
9dd5bf1
371550b
ed074ff
08214c2
094b5e6
04eb47c
650b135
3f0cfa0
7e33812
c265204
d442be2
7a09c01
901ba13
b256155
10bb95b
b62df3a
0dbad8d
9e50d30
ebd27df
c98748f
7649de4
68657e8
c95c0c2
8f36498
10fc066
c9ac2a5
5dc393d
d667d99
caa0a38
8f77a72
f08d477
7f4a460
cfe01a5
83cbf4a
c353ee3
fbf6ed1
997f29f
68f8993
96e9621
f9e67ec
48bcccf
c65299a
0acf868
5871137
999e348
fa5a17f
8fae435
332ff64
3710d41
1714428
8bcde48
a0e2dc5
f232172
09e975c
bfb78bc
a35fc8f
169f3eb
436d4b1
ae911ae
2621b7e
0b2b12d
239feed
8388166
520da7b
54ff8f1
d8393e8
836e752
169aa09
c09d5e7
df3b5f8
3ada1f6
6edbf7b
fbaa8aa
26b3b94
bae7a9a
7f613d9
271a77c
9575b36
054ded6
cef8757
1772f93
a1969c3
78059b3
7d57894
59d5c86
531e2b3
67eea0f
41401e4
0e48dbb
4cb99c8
e2a74ca
ef592f6
80e88c8
edc5953
6a0962e
b4748af
3d8cbc2
c880f70
0455188
44447f3
98e7887
4b5dc36
7f6798d
7347e62
59ce725
c502f6d
e0e85c6
70cc80d
8ca4efb
ba35d56
10d4bf5
c100342
e51478c
bbbc3ff
4c9794b
30348f1
8583bf9
43687db
754a7f4
8332c31
6b07a12
1bf8334
3f46739
dc293bd
9860e71
2ab14d6
beb3593
aa0d174
af0f2d7
0b45a7f
7cb710c
e4f0d93
854410d
5cb8b48
ce13c8e
e9f2bee
38edcbf
9d407d2
043d9fa
0aa5514
6475f15
6a7bf93
0b99f79
75bc0c1
beb506b
fdca466
e3f0aae
37359f0
31529a9
1203df7
42dcd13
5fef2a1
78add14
fd2dc9d
c9177bf
e71a6da
1457cdd
c9b3157
477af1f
7ccffd3
11691f6
4934498
f0ebdd0
fa07ecd
7ae6558
52c0d28
5931066
a197c1e
189a1e7
aa6aff8
077e163
40d926f
334bd4a
8d0ee7a
fc9302b
2dce250
4e83314
012b61e
f7dacdc
41075e6
2f4ce0f
04bb5b3
f237f6a
20a1d30
5279a74
6a87332
a5e0642
d88532f
6904c05
d6c03fa
f702b2b
bc8a8d4
53d136e
15b8e6c
4b2487d
ae63b66
8094d8a
3a29609
8a7073a
b8bb449
5d4af60
c4ace76
d73f8f5
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,27 @@ | ||
import { Renderer } from "../../Renderer"; | ||
import { Vector2, Vector3 } from "@galacean/engine-math"; | ||
import { ISpriteRenderer } from "./ISpriteRenderer"; | ||
|
||
/** | ||
* @internal | ||
*/ | ||
export interface ISpriteAssembler { | ||
resetData(renderer: Renderer, vertexCount?: number): void; | ||
updatePositions?(renderer: Renderer): void; | ||
updateUVs?(renderer: Renderer): void; | ||
updateColor?(renderer: Renderer): void; | ||
resetData(renderer: ISpriteRenderer, vertexCount?: number): void; | ||
updatePositions( | ||
renderer: ISpriteRenderer, | ||
width: number, | ||
height: number, | ||
pivot: Vector2, | ||
flipX?: boolean, | ||
flipY?: boolean | ||
): void; | ||
updateUVs(renderer: ISpriteRenderer): void; | ||
updateColor(renderer: ISpriteRenderer, alpha?: number): void; | ||
getUVByLocalPosition( | ||
renderer: ISpriteRenderer, | ||
width: number, | ||
height: number, | ||
pivot: Vector2, | ||
position: Vector3, | ||
out: Vector2 | ||
): boolean; | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
import { Color } from "@galacean/engine-math"; | ||
import { PrimitiveChunkManager } from "../../RenderPipeline/PrimitiveChunkManager"; | ||
import { SubPrimitiveChunk } from "../../RenderPipeline/SubPrimitiveChunk"; | ||
import { Transform } from "../../Transform"; | ||
import { SpriteTileMode } from "../enums/SpriteTileMode"; | ||
import { Sprite } from "../sprite"; | ||
|
||
export interface ISpriteRenderer { | ||
sprite: Sprite; | ||
color?: Color; | ||
tileMode?: SpriteTileMode; | ||
tiledAdaptiveThreshold?: number; | ||
_transform: Transform; | ||
_subChunk: SubPrimitiveChunk; | ||
_getChunkManager(): PrimitiveChunkManager; | ||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,18 +1,17 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { BoundingBox, Matrix } from "@galacean/engine-math"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { Matrix, Vector2, Vector3 } from "@galacean/engine-math"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { StaticInterfaceImplement } from "../../base/StaticInterfaceImplement"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { SpriteMask } from "../sprite"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { SpriteRenderer } from "../sprite/SpriteRenderer"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { ISpriteAssembler } from "./ISpriteAssembler"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
import { ISpriteRenderer } from "./ISpriteRenderer"; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
* @internal | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
@StaticInterfaceImplement<ISpriteAssembler>() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
export class SimpleSpriteAssembler { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static _rectangleTriangles = [0, 1, 2, 2, 1, 3]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static _worldMatrix = new Matrix(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private static _rectangleTriangles = [0, 1, 2, 2, 1, 3]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
private static _worldMatrix = new Matrix(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static resetData(renderer: SpriteRenderer | SpriteMask): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static resetData(renderer: ISpriteRenderer): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const manager = renderer._getChunkManager(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const lastSubChunk = renderer._subChunk; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
lastSubChunk && manager.freeSubChunk(lastSubChunk); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -21,16 +20,23 @@ export class SimpleSpriteAssembler { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
renderer._subChunk = subChunk; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static updatePositions(renderer: SpriteRenderer | SpriteMask): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { width, height, sprite } = renderer; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { x: pivotX, y: pivotY } = sprite.pivot; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static updatePositions( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
renderer: ISpriteRenderer, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
width: number, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
height: number, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pivot: Vector2, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
flipX: boolean = false, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
flipY: boolean = false | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { sprite } = renderer; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { x: pivotX, y: pivotY } = pivot; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Renderer's worldMatrix | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const worldMatrix = SimpleSpriteAssembler._worldMatrix; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { elements: wE } = worldMatrix; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
// Parent's worldMatrix | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { elements: pWE } = renderer.entity.transform.worldMatrix; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const sx = renderer.flipX ? -width : width; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const sy = renderer.flipY ? -height : height; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { elements: pWE } = renderer._transform.worldMatrix; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const sx = flipX ? -width : width; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const sy = flipY ? -height : height; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(wE[0] = pWE[0] * sx), (wE[1] = pWE[1] * sx), (wE[2] = pWE[2] * sx); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(wE[4] = pWE[4] * sy), (wE[5] = pWE[5] * sy), (wE[6] = pWE[6] * sy); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
(wE[8] = pWE[8]), (wE[9] = pWE[9]), (wE[10] = pWE[10]); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -53,11 +59,9 @@ export class SimpleSpriteAssembler { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vertices[o + 1] = wE[1] * x + wE[5] * y + wE[13]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vertices[o + 2] = wE[2] * x + wE[6] * y + wE[14]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
BoundingBox.transform(sprite._getBounds(), worldMatrix, renderer._bounds); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static updateUVs(renderer: SpriteRenderer | SpriteMask): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static updateUVs(renderer: ISpriteRenderer): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const spriteUVs = renderer.sprite._getUVs(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { x: left, y: bottom } = spriteUVs[0]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { x: right, y: top } = spriteUVs[3]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
@@ -74,15 +78,43 @@ export class SimpleSpriteAssembler { | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vertices[offset + 28] = top; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static updateColor(renderer: SpriteRenderer): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static updateColor(renderer: ISpriteRenderer, alpha: number = 1): void { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const subChunk = renderer._subChunk; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { r, g, b, a } = renderer.color; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const finalAlpha = a * alpha; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const vertices = subChunk.chunk.vertices; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Above three lines and following line can be optimized using destructuring to reduce redundancy and improve readability. Here’s an optimized version: const { _subChunk: { chunk: { vertices } }, color: { r, g, b, a } } = renderer; |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
for (let i = 0, o = subChunk.vertexArea.start + 5; i < 4; ++i, o += 9) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vertices[o] = r; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vertices[o + 1] = g; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vertices[o + 2] = b; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vertices[o + 3] = a; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
vertices[o + 3] = finalAlpha; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static getUVByLocalPosition( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
renderer: ISpriteRenderer, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
width: number, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
height: number, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
pivot: Vector2, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
position: Vector3, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
out: Vector2 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
): boolean { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const sprite = renderer.sprite; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const normalizedX = position.x / width + pivot.x; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const normalizedY = position.y / height + pivot.y; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const positions = sprite._getPositions(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { x: left, y: bottom } = positions[0]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { x: right, y: top } = positions[3]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if (normalizedX >= left && normalizedX <= right && normalizedY >= bottom && normalizedY <= top) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const uvs = sprite._getUVs(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { x: uvLeft, y: uvBottom } = uvs[0]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const { x: uvRight, y: uvTop } = uvs[3]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const factorX = (normalizedX - left) / (right - left); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const factorY = (normalizedY - bottom) / (top - bottom); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
out.set(uvLeft + (uvRight - uvLeft) * factorX, uvBottom + (uvTop - uvBottom) * factorY); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return true; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+94
to
+117
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Add input validation to prevent potential runtime errors. The method should validate input parameters to prevent division by zero and null/undefined errors. static getUVByLocalPosition(
renderer: ISpriteRenderer,
width: number,
height: number,
pivot: Vector2,
position: Vector3,
out: Vector2
): boolean {
+ if (!renderer?.sprite || !position || !pivot || !out) {
+ return false;
+ }
+ if (width === 0 || height === 0) {
+ return false;
+ }
const sprite = renderer.sprite;
const normalizedX = position.x / width + pivot.x; 📝 Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,20 +1,22 @@ | ||||||||||||||||||||||||||||
import { Matrix } from "@galacean/engine-math"; | ||||||||||||||||||||||||||||
import { Matrix, Vector2, Vector3 } from "@galacean/engine-math"; | ||||||||||||||||||||||||||||
import { StaticInterfaceImplement } from "../../base/StaticInterfaceImplement"; | ||||||||||||||||||||||||||||
import { SpriteRenderer } from "../sprite/SpriteRenderer"; | ||||||||||||||||||||||||||||
import { ISpriteAssembler } from "./ISpriteAssembler"; | ||||||||||||||||||||||||||||
import { ISpriteRenderer } from "./ISpriteRenderer"; | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
/** | ||||||||||||||||||||||||||||
* @internal | ||||||||||||||||||||||||||||
*/ | ||||||||||||||||||||||||||||
@StaticInterfaceImplement<ISpriteAssembler>() | ||||||||||||||||||||||||||||
export class SlicedSpriteAssembler { | ||||||||||||||||||||||||||||
static _rectangleTriangles = [ | ||||||||||||||||||||||||||||
private static _rectangleTriangles = [ | ||||||||||||||||||||||||||||
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, | ||||||||||||||||||||||||||||
9, 12, 9, 13, 12, 9, 10, 13, 10, 14, 13, 10, 11, 14, 11, 15, 14 | ||||||||||||||||||||||||||||
]; | ||||||||||||||||||||||||||||
static _worldMatrix = new Matrix(); | ||||||||||||||||||||||||||||
private static _worldMatrix = new Matrix(); | ||||||||||||||||||||||||||||
private static _row = new Array<number>(4); | ||||||||||||||||||||||||||||
private static _column = new Array<number>(4); | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
static resetData(renderer: SpriteRenderer): void { | ||||||||||||||||||||||||||||
static resetData(renderer: ISpriteRenderer): void { | ||||||||||||||||||||||||||||
const manager = renderer._getChunkManager(); | ||||||||||||||||||||||||||||
const lastSubChunk = renderer._subChunk; | ||||||||||||||||||||||||||||
lastSubChunk && manager.freeSubChunk(lastSubChunk); | ||||||||||||||||||||||||||||
|
@@ -23,8 +25,15 @@ export class SlicedSpriteAssembler { | |||||||||||||||||||||||||||
renderer._subChunk = subChunk; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
static updatePositions(renderer: SpriteRenderer): void { | ||||||||||||||||||||||||||||
const { width, height, sprite } = renderer; | ||||||||||||||||||||||||||||
static updatePositions( | ||||||||||||||||||||||||||||
renderer: ISpriteRenderer, | ||||||||||||||||||||||||||||
cptbtptpbcptdtptp marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||
width: number, | ||||||||||||||||||||||||||||
height: number, | ||||||||||||||||||||||||||||
pivot: Vector2, | ||||||||||||||||||||||||||||
flipX: boolean = false, | ||||||||||||||||||||||||||||
flipY: boolean = false | ||||||||||||||||||||||||||||
): void { | ||||||||||||||||||||||||||||
const { sprite } = renderer; | ||||||||||||||||||||||||||||
const { border } = sprite; | ||||||||||||||||||||||||||||
// Update local positions. | ||||||||||||||||||||||||||||
cptbtptpbcptdtptp marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||
const spritePositions = sprite._getPositions(); | ||||||||||||||||||||||||||||
|
@@ -47,42 +56,36 @@ export class SlicedSpriteAssembler { | |||||||||||||||||||||||||||
// column | ||||||||||||||||||||||||||||
// ------------------------ | ||||||||||||||||||||||||||||
// Calculate row and column. | ||||||||||||||||||||||||||||
let row: number[], column: number[]; | ||||||||||||||||||||||||||||
const { _row: row, _column: column } = SlicedSpriteAssembler; | ||||||||||||||||||||||||||||
if (fixedLeft + fixedRight > width) { | ||||||||||||||||||||||||||||
const widthScale = width / (fixedLeft + fixedRight); | ||||||||||||||||||||||||||||
row = [ | ||||||||||||||||||||||||||||
expectWidth * left * widthScale, | ||||||||||||||||||||||||||||
fixedLeft * widthScale, | ||||||||||||||||||||||||||||
fixedLeft * widthScale, | ||||||||||||||||||||||||||||
width - expectWidth * (1 - right) * widthScale | ||||||||||||||||||||||||||||
]; | ||||||||||||||||||||||||||||
(row[0] = expectWidth * left * widthScale), (row[1] = row[2] = fixedLeft * widthScale); | ||||||||||||||||||||||||||||
row[3] = width - expectWidth * (1 - right) * widthScale; | ||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||
row = [expectWidth * left, fixedLeft, width - fixedRight, width - expectWidth * (1 - right)]; | ||||||||||||||||||||||||||||
(row[0] = expectWidth * left), (row[1] = fixedLeft), (row[2] = width - fixedRight); | ||||||||||||||||||||||||||||
row[3] = width - expectWidth * (1 - right); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
Comment on lines
+65
to
+69
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Improve readability by simplifying assignment statements Consider breaking down the combined assignment statements into separate lines for better clarity and maintainability. Apply this diff to refactor the code: - (row[0] = expectWidth * left * widthScale), (row[1] = row[2] = fixedLeft * widthScale);
- row[3] = width - expectWidth * (1 - right) * widthScale;
+ row[0] = expectWidth * left * widthScale;
+ row[1] = fixedLeft * widthScale;
+ row[2] = fixedLeft * widthScale;
+ row[3] = width - expectWidth * (1 - right) * widthScale; 📝 Committable suggestion
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can not agree more There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @singlecoder, glad to hear that you agree! If there's anything else I can assist with, please let me know. (^ᆺ^)ノ If you found this review helpful, would you consider giving us a shout-out on X? |
||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
if (fixedTop + fixedBottom > height) { | ||||||||||||||||||||||||||||
const heightScale = height / (fixedTop + fixedBottom); | ||||||||||||||||||||||||||||
column = [ | ||||||||||||||||||||||||||||
expectHeight * bottom * heightScale, | ||||||||||||||||||||||||||||
fixedBottom * heightScale, | ||||||||||||||||||||||||||||
fixedBottom * heightScale, | ||||||||||||||||||||||||||||
height - expectHeight * (1 - top) * heightScale | ||||||||||||||||||||||||||||
]; | ||||||||||||||||||||||||||||
(column[0] = expectHeight * bottom * heightScale), (column[1] = column[2] = fixedBottom * heightScale); | ||||||||||||||||||||||||||||
column[3] = height - expectHeight * (1 - top) * heightScale; | ||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||
column = [expectHeight * bottom, fixedBottom, height - fixedTop, height - expectHeight * (1 - top)]; | ||||||||||||||||||||||||||||
(column[0] = expectHeight * bottom), (column[1] = fixedBottom), (column[2] = height - fixedTop); | ||||||||||||||||||||||||||||
column[3] = height - expectHeight * (1 - top); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
// Update renderer's worldMatrix. | ||||||||||||||||||||||||||||
const { x: pivotX, y: pivotY } = renderer.sprite.pivot; | ||||||||||||||||||||||||||||
const localTransX = renderer.width * pivotX; | ||||||||||||||||||||||||||||
const localTransY = renderer.height * pivotY; | ||||||||||||||||||||||||||||
const { x: pivotX, y: pivotY } = pivot; | ||||||||||||||||||||||||||||
const localTransX = width * pivotX; | ||||||||||||||||||||||||||||
const localTransY = height * pivotY; | ||||||||||||||||||||||||||||
// Renderer's worldMatrix. | ||||||||||||||||||||||||||||
const worldMatrix = SlicedSpriteAssembler._worldMatrix; | ||||||||||||||||||||||||||||
const { elements: wE } = worldMatrix; | ||||||||||||||||||||||||||||
// Parent's worldMatrix. | ||||||||||||||||||||||||||||
const { elements: pWE } = renderer.entity.transform.worldMatrix; | ||||||||||||||||||||||||||||
const sx = renderer.flipX ? -1 : 1; | ||||||||||||||||||||||||||||
const sy = renderer.flipY ? -1 : 1; | ||||||||||||||||||||||||||||
const { elements: pWE } = renderer._transform.worldMatrix; | ||||||||||||||||||||||||||||
const sx = flipX ? -1 : 1; | ||||||||||||||||||||||||||||
const sy = flipY ? -1 : 1; | ||||||||||||||||||||||||||||
(wE[0] = pWE[0] * sx), (wE[1] = pWE[1] * sx), (wE[2] = pWE[2] * sx); | ||||||||||||||||||||||||||||
Comment on lines
+89
to
+91
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Check for potential issues with Accessing If + // Add in ISpriteRenderer implementation
+ get worldMatrix(): Matrix {
+ return this._transform.worldMatrix;
+ } Then update the reference: - const { elements: pWE } = renderer._transform.worldMatrix;
+ const { elements: pWE } = renderer.worldMatrix;
|
||||||||||||||||||||||||||||
(wE[4] = pWE[4] * sy), (wE[5] = pWE[5] * sy), (wE[6] = pWE[6] * sy); | ||||||||||||||||||||||||||||
(wE[8] = pWE[8]), (wE[9] = pWE[9]), (wE[10] = pWE[10]); | ||||||||||||||||||||||||||||
|
@@ -111,14 +114,9 @@ export class SlicedSpriteAssembler { | |||||||||||||||||||||||||||
vertices[o + 2] = wE[2] * rowValue + wE[6] * columnValue + wE[14]; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
const { min, max } = renderer._bounds; | ||||||||||||||||||||||||||||
min.set(row[0], column[0], 0); | ||||||||||||||||||||||||||||
max.set(row[3], column[3], 0); | ||||||||||||||||||||||||||||
renderer._bounds.transform(worldMatrix); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
static updateUVs(renderer: SpriteRenderer): void { | ||||||||||||||||||||||||||||
static updateUVs(renderer: ISpriteRenderer): void { | ||||||||||||||||||||||||||||
const subChunk = renderer._subChunk; | ||||||||||||||||||||||||||||
const vertices = subChunk.chunk.vertices; | ||||||||||||||||||||||||||||
const spriteUVs = renderer.sprite._getUVs(); | ||||||||||||||||||||||||||||
|
@@ -131,15 +129,76 @@ export class SlicedSpriteAssembler { | |||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
static updateColor(renderer: SpriteRenderer): void { | ||||||||||||||||||||||||||||
static updateColor(renderer: ISpriteRenderer, alpha: number = 1): void { | ||||||||||||||||||||||||||||
const subChunk = renderer._subChunk; | ||||||||||||||||||||||||||||
const { r, g, b, a } = renderer.color; | ||||||||||||||||||||||||||||
const finalAlpha = a * alpha; | ||||||||||||||||||||||||||||
const vertices = subChunk.chunk.vertices; | ||||||||||||||||||||||||||||
cptbtptpbcptdtptp marked this conversation as resolved.
Show resolved
Hide resolved
|
||||||||||||||||||||||||||||
for (let i = 0, o = subChunk.vertexArea.start + 5; i < 16; ++i, o += 9) { | ||||||||||||||||||||||||||||
vertices[o] = r; | ||||||||||||||||||||||||||||
vertices[o + 1] = g; | ||||||||||||||||||||||||||||
vertices[o + 2] = b; | ||||||||||||||||||||||||||||
vertices[o + 3] = a; | ||||||||||||||||||||||||||||
vertices[o + 3] = finalAlpha; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
static getUVByLocalPosition( | ||||||||||||||||||||||||||||
renderer: ISpriteRenderer, | ||||||||||||||||||||||||||||
width: number, | ||||||||||||||||||||||||||||
height: number, | ||||||||||||||||||||||||||||
pivot: Vector2, | ||||||||||||||||||||||||||||
position: Vector3, | ||||||||||||||||||||||||||||
out: Vector2 | ||||||||||||||||||||||||||||
): boolean { | ||||||||||||||||||||||||||||
const sprite = renderer.sprite; | ||||||||||||||||||||||||||||
const positions = sprite._getPositions(); | ||||||||||||||||||||||||||||
const { x: left, y: bottom } = positions[0]; | ||||||||||||||||||||||||||||
const { x: right, y: top } = positions[3]; | ||||||||||||||||||||||||||||
const { border } = sprite; | ||||||||||||||||||||||||||||
const { width: expectWidth, height: expectHeight } = sprite; | ||||||||||||||||||||||||||||
const fixedLeft = expectWidth * border.x; | ||||||||||||||||||||||||||||
const fixedBottom = expectHeight * border.y; | ||||||||||||||||||||||||||||
const fixedRight = expectWidth * border.z; | ||||||||||||||||||||||||||||
const fixedTop = expectHeight * border.w; | ||||||||||||||||||||||||||||
const { _row: row, _column: column } = SlicedSpriteAssembler; | ||||||||||||||||||||||||||||
if (fixedLeft + fixedRight > width) { | ||||||||||||||||||||||||||||
const widthScale = width / (fixedLeft + fixedRight); | ||||||||||||||||||||||||||||
(row[0] = expectWidth * left * widthScale), (row[1] = row[2] = fixedLeft * widthScale); | ||||||||||||||||||||||||||||
row[3] = width - expectWidth * (1 - right) * widthScale; | ||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||
(row[0] = expectWidth * left), (row[1] = fixedLeft), (row[2] = width - fixedRight); | ||||||||||||||||||||||||||||
row[3] = width - expectWidth * (1 - right); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
if (fixedTop + fixedBottom > height) { | ||||||||||||||||||||||||||||
const heightScale = height / (fixedTop + fixedBottom); | ||||||||||||||||||||||||||||
(column[0] = expectHeight * bottom * heightScale), (column[1] = column[2] = fixedBottom * heightScale); | ||||||||||||||||||||||||||||
column[3] = height - expectHeight * (1 - top) * heightScale; | ||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||
(column[0] = expectHeight * bottom), (column[1] = fixedBottom), (column[2] = height - fixedTop); | ||||||||||||||||||||||||||||
column[3] = height - expectHeight * (1 - top); | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||
const x = position.x + width * pivot.x; | ||||||||||||||||||||||||||||
const y = position.y + height * pivot.y; | ||||||||||||||||||||||||||||
if (x >= row[0] && x <= row[3] && y >= column[0] && y <= column[3]) { | ||||||||||||||||||||||||||||
for (let i = row.length - 2; i >= 0; i--) { | ||||||||||||||||||||||||||||
if (x >= row[i]) { | ||||||||||||||||||||||||||||
for (let j = column.length - 2; j >= 0; j--) { | ||||||||||||||||||||||||||||
if (y >= column[j]) { | ||||||||||||||||||||||||||||
const uvs = sprite._getUVs(); | ||||||||||||||||||||||||||||
const factorX = (x - row[i]) / (row[i + 1] - row[i]); | ||||||||||||||||||||||||||||
const factorY = (y - column[j]) / (column[j + 1] - column[j]); | ||||||||||||||||||||||||||||
const uvLeft = uvs[i].x; | ||||||||||||||||||||||||||||
const uvBottom = uvs[j].y; | ||||||||||||||||||||||||||||
out.set(uvLeft + (uvs[i + 1].x - uvLeft) * factorX, uvBottom + (uvs[j + 1].y - uvBottom) * factorY); | ||||||||||||||||||||||||||||
return true; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} else { | ||||||||||||||||||||||||||||
return false; | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I ran a performance test comparing the ternary operator version and a simplified multiplication version for sx and sy. The results showed that the multiplication approach is consistently faster. Since both versions produce the same output, I recommend switching to the multiplication method to improve performance, especially in cases where this function is called frequently. Here’s the updated version:
const sx = width * (flipX ? -1 : 1);
const sy = height * (flipY ? -1 : 1);
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
理论上 -x 应该是比 -1 * x 性能更好
另外,-1 * x 和 x 对比怎么样呢
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I write a test on hitu. Here is the result.