Skip to content
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

Refactor 2d render pipeline #1708

Merged
merged 154 commits into from
Jun 19, 2024
Merged
Show file tree
Hide file tree
Changes from 144 commits
Commits
Show all changes
154 commits
Select commit Hold shift + click to select a range
9c1b561
refactor(renderpipeline): refactor framework
singlecoder Aug 21, 2023
a44de9e
refactor(renderpipeline): opt code
singlecoder Aug 22, 2023
d504369
refactor(renderpipeline): fix conflicts
singlecoder Aug 22, 2023
06c8e53
refactor(renderpipeline): opt code
singlecoder Aug 22, 2023
60b240a
refactor(renderpipeline): opt code
singlecoder Aug 29, 2023
123dde4
refactor(renderpipeline): fix conflicts
singlecoder Aug 29, 2023
563bfbe
refactor(renderpipeline): opt code
singlecoder Aug 29, 2023
a2a236b
refactor(rederpipeline): opt code
singlecoder Aug 29, 2023
bfd7435
refactor(renderpipeline): fix conflicts
singlecoder Sep 13, 2023
51de522
refactor(renderpipeline): fix conflicts
singlecoder Sep 13, 2023
88bb053
refactor(renderpipeline): fix conflicts
singlecoder Sep 13, 2023
554b80a
refactor(renderpipeline): fix conflicts
singlecoder Sep 13, 2023
339f7eb
refactor(renderpipeline): opt code
singlecoder Sep 14, 2023
c648e0c
refactor(renderpipeline): merge code from main
singlecoder Sep 20, 2023
26308cf
refactor(renderpipeline): merge code from main
singlecoder Oct 7, 2023
28d9579
refactor(2d): fix conflicts
singlecoder Nov 2, 2023
139f247
refactor(2d-render-pipeline): fix conflicts
singlecoder Nov 22, 2023
a0ed23b
Merge branch 'main' into refactor/2d-render-pipeline
singlecoder Dec 12, 2023
b550930
Merge branch 'main' into refactor/2d-render-pipeline
singlecoder Dec 20, 2023
2d86283
Merge branch 'main' into refactor/2d-render-pipeline
singlecoder Dec 25, 2023
8e028fb
refactor(render-pipeline): opt code
singlecoder Dec 28, 2023
40b1e88
refactor(2d-render-pipeline): fix conflicts
singlecoder Jan 16, 2024
eee57cf
refactor(2d-render-pipeline): opt buffer update data
singlecoder Jan 16, 2024
4be33d5
Merge branch 'main' into refactor/2d-render-pipeline
singlecoder Jan 16, 2024
0d3f67b
refactor(2d-render-pipeline): opt code
singlecoder Jan 16, 2024
61bfb35
refactor(2d-render-pipeline): fix conflicts
singlecoder Feb 4, 2024
9dd5bf1
refactor(2d-render-pipeline): fix conflicts
singlecoder Feb 4, 2024
371550b
refactor(2d-render-pipeline): opt render data api
singlecoder Feb 20, 2024
ed074ff
Merge branch 'main' into refactor/2d-render-pipeline
singlecoder Feb 20, 2024
08214c2
refactor(2d-render-pipeline): add MeshBuffer
singlecoder Feb 22, 2024
094b5e6
refactor(2d-render-pipeline): complete sprite renderer and sprite mask
singlecoder Mar 5, 2024
04eb47c
refactor(2d-render-pipeline): complete sprite renderer draw mode
singlecoder Mar 5, 2024
650b135
refactor(2d-render-pipeline): complete text renderer
singlecoder Mar 5, 2024
3f0cfa0
refactor(2d-render-pipeline): fix conflicts from dev/1.2
singlecoder Mar 15, 2024
7e33812
refactor(2d-render-pipeline): fix conflicts from dev/1.2
singlecoder Mar 15, 2024
c265204
Merge branch 'main' into refactor/2d-render-pipeline
singlecoder Mar 28, 2024
d442be2
refactor(2d-render-pipeline): fix conflicts from dev/1.3
singlecoder Apr 10, 2024
7a09c01
refactor(2d-render-pipeline): delete IBatcher
singlecoder Apr 11, 2024
901ba13
refactor(2d-render-pipeline): move IPoolElement to Pool
singlecoder Apr 11, 2024
b256155
refactor(2d-render-pipeline): replace CharRenderDataPool with Pool
singlecoder Apr 11, 2024
10bb95b
refactor(2d-render-pipeline): create mesh buffer support custom size
singlecoder Apr 12, 2024
b62df3a
refactor(2d-render-pipeline): opt code
singlecoder Apr 18, 2024
0dbad8d
refactor(2d-render-pipeline): opt code
singlecoder Apr 18, 2024
9e50d30
refactor(2d-render-pipeline): opt text renderer upload texture
singlecoder Apr 19, 2024
7649de4
refactor(2d-render-pipeline): rename the rendering order function of …
singlecoder Apr 25, 2024
68657e8
refactor(2d-render-pipeline): fix test
singlecoder Apr 25, 2024
c95c0c2
refactor(2d-render-pipeline): fix test error
singlecoder Apr 26, 2024
10fc066
refactor(2d-render-pipeline): fix chunk error
singlecoder Apr 26, 2024
c9ac2a5
refactor(2d-render-pipeline): opt code
singlecoder Apr 28, 2024
5dc393d
refactor(2d-render-pipeline): opt code
singlecoder Apr 28, 2024
d667d99
refactor(2d-render-pipeline): opt code
singlecoder Apr 29, 2024
caa0a38
refactor(2d-render-pipeline): fix 2d sort error
singlecoder Apr 29, 2024
8f77a72
refactor(2d-render-pipeline): change 2d batch structure
singlecoder Apr 30, 2024
f08d477
refactor(2d-render-pipeline): opt code
singlecoder Apr 30, 2024
7f4a460
refactor(2d-render-pipeline): opt code
singlecoder May 6, 2024
cfe01a5
refactor(2d-render-pipeline): opt code
singlecoder May 6, 2024
83cbf4a
refactor(2d-render-pipeline): fix sprite draw mode tiled error
singlecoder May 6, 2024
c353ee3
refactor(2d-render-pipeline): rename CharRenderData to CharRenderInfo
singlecoder May 6, 2024
fbf6ed1
refactor(2d-render-pipeline): opt code
singlecoder May 6, 2024
997f29f
refactor(2d-render-pipeline): fix render queue sort error
singlecoder May 7, 2024
68f8993
refactor(2d-render-pipeline): fix render queue sort error
singlecoder May 7, 2024
96e9621
refactor(2d-render-pipeline): opt code
singlecoder May 7, 2024
f9e67ec
refactor(2d-render-pipeline): opt performance for render queue sort
singlecoder May 7, 2024
48bcccf
refactor(2d-render-pipeline): opt performance for render queue sort
singlecoder May 7, 2024
c65299a
refactor(2d-render-pipeline): opt performance for 2d
singlecoder May 7, 2024
0acf868
refactor(2d-render-pipeline): opt code
singlecoder May 8, 2024
5871137
refactor(2d-render-pipeline): opt code
singlecoder May 9, 2024
999e348
refactor(2d-render-pipeline): opt code
singlecoder May 9, 2024
3710d41
Merge branch 'dev/1.3' into refactor/2d-render-pipeline
singlecoder May 10, 2024
1714428
refactor(2d-render-pipeline): fix shadow error
singlecoder May 11, 2024
09e975c
refactor(2d-render-pipeline): opt code for simple assembler
singlecoder May 21, 2024
bfb78bc
refactor(2d-render-pipeline): opt code for sprite assemble
singlecoder May 21, 2024
a35fc8f
refactor(2d-render-pipeline): opt code
singlecoder May 21, 2024
169f3eb
refactor(2d-render-pipeline): opt code
singlecoder May 21, 2024
436d4b1
refactor(2d-render-pipeline): opt code
singlecoder May 21, 2024
ae911ae
refactor(2d-render-pipeline): opt code
singlecoder May 22, 2024
2621b7e
refactor(2d-render-pipeline): opt code for batch
singlecoder May 22, 2024
0b2b12d
refactor(2d-render-pipeline): rename SpriteRenderData to RenderData2D
singlecoder May 24, 2024
239feed
refactor(2d-render-pipeline): use primitive to change buffer mesh in …
singlecoder May 31, 2024
8388166
refactor(2d-render-pipeline): opt code
singlecoder Jun 3, 2024
520da7b
refactor(2d-render-pipeline): clean render queue
singlecoder Jun 3, 2024
d8393e8
refactor(2d-render-pipeline): opt code
singlecoder Jun 4, 2024
836e752
refactor(2d-render-pipeline): opt code
singlecoder Jun 4, 2024
169aa09
refactor(2d-render-pipeline): opt code
singlecoder Jun 4, 2024
c09d5e7
refactor(2d-render-pipeline): opt code
singlecoder Jun 4, 2024
df3b5f8
refactor(2d-render-pipeline): fix conflicts
singlecoder Jun 4, 2024
6edbf7b
refactor(2d-render-pipeline): opt code
singlecoder Jun 4, 2024
26b3b94
refactor(2d-render-pipeline): add comment for export TextUtils
singlecoder Jun 5, 2024
271a77c
test(primitive): test one-to-one 2D renderer and primitive
singlecoder Jun 7, 2024
9575b36
test(primitive): buffer add alloc and free sub buffer
singlecoder Jun 7, 2024
1772f93
refactor(2d-render-pipeline): opt code
singlecoder Jun 11, 2024
a1969c3
refactor(2d-render-pipeline): opt code
singlecoder Jun 11, 2024
59d5c86
refactor(2d-render-pipeline): opt chunk
singlecoder Jun 11, 2024
531e2b3
refactor(2d-render-pipeline): revert code
singlecoder Jun 11, 2024
67eea0f
refactor(2d-render-pipeline): opt code
singlecoder Jun 11, 2024
41401e4
refactor(2d-render-pipeline): opt code
singlecoder Jun 11, 2024
0e48dbb
refactor(2d-render-pipeline): opt object pool
singlecoder Jun 11, 2024
4cb99c8
refactor(2d-render-pipeline): opt code for dynamic geometry data
singlecoder Jun 11, 2024
e2a74ca
refactor(2d-render-pipeline): opt code
singlecoder Jun 11, 2024
ef592f6
refactor(2d-render-pipeline): opt code
singlecoder Jun 11, 2024
edc5953
refactor(2d-render-pipeline): fix import error
singlecoder Jun 12, 2024
b4748af
refactor(2d-render-pipeline): opt code
singlecoder Jun 12, 2024
3d8cbc2
refactor(2d-render-pipeline): fix test error
singlecoder Jun 12, 2024
c880f70
refactor(2d-render-pipeline): refactor mask
singlecoder Jun 12, 2024
0455188
refactor(2d-render-pipeline): opt upload buffer
singlecoder Jun 12, 2024
44447f3
refactor(2d-render-pipeline): opt code
singlecoder Jun 12, 2024
98e7887
refactor(2d-render-pipeline): add sub render element and sub render data
singlecoder Jun 13, 2024
4b5dc36
refactor(2d-render-pipeline): opt dynamic update shader data for rend…
singlecoder Jun 13, 2024
7f6798d
refactor(2d-render-pipeline): fix text render error
singlecoder Jun 13, 2024
7347e62
refactor(2d-render-pipeline): fix mesh renderer error
singlecoder Jun 13, 2024
59ce725
refactor(2d-render-pipeline): opt code
singlecoder Jun 13, 2024
c502f6d
refactor(2d-render-pipeline): delete unused class
singlecoder Jun 13, 2024
e0e85c6
refactor(2d-render-pipeline): clean render element
singlecoder Jun 13, 2024
70cc80d
refactor(2d-render-pipeline): opt code
singlecoder Jun 13, 2024
8ca4efb
refactor(2d-render-pipeline): opt code for push render data
singlecoder Jun 13, 2024
ba35d56
refactor(2d-render-pipeline): opt code
singlecoder Jun 13, 2024
10d4bf5
refactor(2d-render-pipeline): opt code
singlecoder Jun 13, 2024
c100342
refactor(2d-render-pipeline): delete render data usage
singlecoder Jun 13, 2024
e51478c
refactor(2d-render-pipeline): opt code
singlecoder Jun 14, 2024
bbbc3ff
refactor(2d-render-pipeline): opt text renderer
singlecoder Jun 14, 2024
4c9794b
refactor(2d-render-pipeline): add textSubRenderElementPool for text r…
singlecoder Jun 14, 2024
30348f1
refactor(2d-render-pipeline): opt code for mask
singlecoder Jun 14, 2024
8583bf9
refactor(2d-render-pipeline): opt code for mask
singlecoder Jun 14, 2024
43687db
refactor(2d-render-pipeline): opt text renderer
singlecoder Jun 14, 2024
754a7f4
refactor(2d-render-pipeline): opt code
singlecoder Jun 14, 2024
8332c31
refactor(2d-render-pipeline): opt code
singlecoder Jun 14, 2024
6b07a12
refactor(2d-render-pipeline): opt code
singlecoder Jun 14, 2024
1bf8334
refactor(2d-render-pipeline): opt upload buffer
singlecoder Jun 14, 2024
3f46739
refactor(2d-render-pipeline): opt upload buffer
singlecoder Jun 14, 2024
dc293bd
refactor(2d-render-pipeline): rename dynamic geometry data
singlecoder Jun 14, 2024
9860e71
refactor(2d-render-pipeline): rename dynamic geometry data
singlecoder Jun 14, 2024
2ab14d6
refactor(2d-render-pipeline): rename dynamic geometry data
singlecoder Jun 14, 2024
beb3593
refactor(2d-render-pipeline): opt code
singlecoder Jun 14, 2024
aa0d174
refactor(2d-render-pipeline): opt code
singlecoder Jun 14, 2024
af0f2d7
refactor(2d-render-pipeline): opt code
singlecoder Jun 14, 2024
0b45a7f
refactor(2d-render-pipeline): opt code
singlecoder Jun 14, 2024
7cb710c
refactor(2d-render-pipeline): opt code
singlecoder Jun 14, 2024
e4f0d93
refactor(2d-render-pipeline): fix test error
singlecoder Jun 14, 2024
854410d
Test0 (#10)
GuoLei1990 Jun 17, 2024
5cb8b48
refactor(2d-render-pipeline): opt code
singlecoder Jun 17, 2024
ce13c8e
refactor(2d-render-pipeline): fix conflict from dev/1.3
singlecoder Jun 17, 2024
e9f2bee
refactor(2d-render-pipeline): fix upload buffer error
singlecoder Jun 17, 2024
38edcbf
refactor(2d-renderpip): fix show errofffffffffffffffffffffff
singlecoder Jun 17, 2024
043d9fa
refactor(2d-render-pipeline): opt code
singlecoder Jun 18, 2024
0aa5514
refactor(2d-render-pipeline): opt code
singlecoder Jun 18, 2024
6475f15
fix(e2e): fix e2e error
singlecoder Jun 18, 2024
6a7bf93
refactor(2d-render-pipeline): fix conflicts
singlecoder Jun 18, 2024
0b99f79
refactor(2d-render-pipeline): opt code
singlecoder Jun 18, 2024
75bc0c1
refactor(2d-render-pipeline): fix conflicts
singlecoder Jun 19, 2024
beb506b
refactor(2d-render-pipeline): fix e2e error
singlecoder Jun 19, 2024
fdca466
refactor(2d-render-pipeline): opt code
singlecoder Jun 19, 2024
e3f0aae
refactor(2d-render-pipeline): fix e2e screen shot error
singlecoder Jun 19, 2024
37359f0
refactor(2d-render-pipeline): opt code
singlecoder Jun 19, 2024
1203df7
refactor(2d-render-pipeline): opt code
singlecoder Jun 19, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified e2e/fixtures/originImage/Particle_particleRenderer-dream.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ import { Renderer } from "../../Renderer";
/**
* @internal
*/
export interface IAssembler {
resetData(renderer: Renderer): void;
export interface ISpriteAssembler {
resetData(renderer: Renderer, vertexCount?: number): void;
updatePositions?(renderer: Renderer): void;
updateUVs?(renderer: Renderer): void;
updateColor?(renderer: Renderer): void;
}
69 changes: 44 additions & 25 deletions packages/core/src/2d/assembler/SimpleSpriteAssembler.ts
Original file line number Diff line number Diff line change
@@ -1,35 +1,33 @@
import { BoundingBox, Matrix, Vector2, Vector3 } from "@galacean/engine-math";
import { BoundingBox, Matrix } from "@galacean/engine-math";
import { StaticInterfaceImplement } from "../../base/StaticInterfaceImplement";
import { SpriteMask } from "../sprite";
import { SpriteRenderer } from "../sprite/SpriteRenderer";
import { IAssembler } from "./IAssembler";
import { ISpriteAssembler } from "./ISpriteAssembler";

/**
* @internal
*/
@StaticInterfaceImplement<IAssembler>()
@StaticInterfaceImplement<ISpriteAssembler>()
export class SimpleSpriteAssembler {
static _rectangleTriangles: number[] = [0, 1, 2, 2, 1, 3];
static _worldMatrix: Matrix = new Matrix();
static _rectangleTriangles = [0, 1, 2, 2, 1, 3];
static _worldMatrix = new Matrix();

static resetData(renderer: SpriteRenderer | SpriteMask): void {
const { _verticesData: verticesData } = renderer;
const { positions, uvs } = verticesData;
verticesData.vertexCount = positions.length = uvs.length = 4;
for (let i = 0; i < 4; i++) {
positions[i] ||= new Vector3();
uvs[i] ||= new Vector2();
}
verticesData.triangles = SimpleSpriteAssembler._rectangleTriangles;
const manager = renderer._getChunkManager();
const lastSubChunk = renderer._subChunk;
lastSubChunk && manager.freeSubChunk(lastSubChunk);
const subChunk = manager.allocateSubChunk(4);
subChunk.indices = SimpleSpriteAssembler._rectangleTriangles;
renderer._subChunk = subChunk;
}

static updatePositions(renderer: SpriteRenderer | SpriteMask): void {
const { width, height, sprite } = renderer;
const { x: pivotX, y: pivotY } = sprite.pivot;
// Renderer's worldMatrix;
const { _worldMatrix: worldMatrix } = SimpleSpriteAssembler;
// Renderer's worldMatrix
const worldMatrix = SimpleSpriteAssembler._worldMatrix;
const { elements: wE } = worldMatrix;
// Parent's worldMatrix.
// Parent's worldMatrix
const { elements: pWE } = renderer.entity.transform.worldMatrix;
const sx = renderer.flipX ? -width : width;
const sy = renderer.flipY ? -height : height;
Expand All @@ -45,25 +43,46 @@ export class SimpleSpriteAssembler {
// | |
// 0 - 1
// ---------------
// Update positions.
// Update positions
const spritePositions = sprite._getPositions();
const { positions } = renderer._verticesData;
for (let i = 0; i < 4; i++) {
const subChunk = renderer._subChunk;
const vertices = subChunk.chunk.vertices;
for (let i = 0, o = subChunk.vertexArea.start; i < 4; ++i, o += 9) {
const { x, y } = spritePositions[i];
positions[i].set(wE[0] * x + wE[4] * y + wE[12], wE[1] * x + wE[5] * y + wE[13], wE[2] * x + wE[6] * y + wE[14]);
vertices[o] = wE[0] * x + wE[4] * y + wE[12];
vertices[o + 1] = wE[1] * x + wE[5] * y + wE[13];
vertices[o + 2] = wE[2] * x + wE[6] * y + wE[14];
}
Copy link
Member

@GuoLei1990 GuoLei1990 Jun 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can opt performance,but should opt bounds compute @cptbtptpbcptdtptp

static updatePositions(renderer: SpriteRenderer | SpriteMask): void {
    const { width, height, sprite } = renderer;
    const { x: pivotX, y: pivotY } = sprite.pivot;
    // Renderer's worldMatrix
    const worldMatrix = SimpleSpriteAssembler._worldMatrix;
    // Parent's worldMatrix
    const wE = renderer.entity.transform.worldMatrix.elements;
    const sX = renderer.flipX ? -width : width;
    const sY = renderer.flipY ? -height : height;
    const m0 = wE[0] * sX;
    const m1 = wE[1] * sX;
    const m2 = wE[2] * sX;
    const m4 = wE[4] * sY;
    const m5 = wE[5] * sY;
    const m6 = wE[6] * sY;
    const m12 = wE[12] - pivotX * m0 - pivotY * m4;
    const m13 = wE[13] - pivotX * m1 - pivotY * m5;
    const m14 = wE[14] - pivotX * m2 - pivotY * m6;

    // ---------------
    //  2 - 3
    //  |   |
    //  0 - 1
    // ---------------
    // Update positions
    const spritePositions = sprite._getPositions();
    const chunk = renderer._chunk;
    const vertices = chunk.data.vertices;
    for (let i = 0, o = chunk.vertexArea.start; i < 4; ++i, o += 9) {
      const { x, y } = spritePositions[i];
      vertices[o] = m0 * x + m4 * y + m12;
      vertices[o + 1] = m1 * x + m5 * y + m13;
      vertices[o + 2] = m2 * x + m6 * y + m14;
    }

    // Todo: should modify bounds compute method
    BoundingBox.transform(sprite._getBounds(), worldMatrix, renderer._bounds);
  }

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Will mention a new one after this PR.


BoundingBox.transform(sprite._getBounds(), worldMatrix, renderer._bounds);
}

static updateUVs(renderer: SpriteRenderer | SpriteMask): void {
const spriteUVs = renderer.sprite._getUVs();
const renderUVs = renderer._verticesData.uvs;
const { x: left, y: bottom } = spriteUVs[0];
const { x: right, y: top } = spriteUVs[3];
renderUVs[0].set(left, bottom);
renderUVs[1].set(right, bottom);
renderUVs[2].set(left, top);
renderUVs[3].set(right, top);
const subChunk = renderer._subChunk;
const vertices = subChunk.chunk.vertices;
const offset = subChunk.vertexArea.start + 3;
vertices[offset] = left;
vertices[offset + 1] = bottom;
vertices[offset + 9] = right;
vertices[offset + 10] = bottom;
vertices[offset + 18] = left;
vertices[offset + 19] = top;
vertices[offset + 27] = right;
vertices[offset + 28] = top;
}

GuoLei1990 marked this conversation as resolved.
Show resolved Hide resolved
static updateColor(renderer: SpriteRenderer): void {
const subChunk = renderer._subChunk;
const { r, g, b, a } = renderer.color;
const vertices = subChunk.chunk.vertices;
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;
}
}
GuoLei1990 marked this conversation as resolved.
Show resolved Hide resolved
}
72 changes: 44 additions & 28 deletions packages/core/src/2d/assembler/SlicedSpriteAssembler.ts
Original file line number Diff line number Diff line change
@@ -1,35 +1,31 @@
import { Matrix, Vector2, Vector3 } from "@galacean/engine-math";
import { Matrix } from "@galacean/engine-math";
import { StaticInterfaceImplement } from "../../base/StaticInterfaceImplement";
import { SpriteRenderer } from "../sprite/SpriteRenderer";
import { IAssembler } from "./IAssembler";
import { SimpleSpriteAssembler } from "./SimpleSpriteAssembler";
import { ISpriteAssembler } from "./ISpriteAssembler";

/**
* @internal
*/
@StaticInterfaceImplement<IAssembler>()
@StaticInterfaceImplement<ISpriteAssembler>()
export class SlicedSpriteAssembler {
static _rectangleTriangles: number[] = [
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: Matrix = new Matrix();
static _worldMatrix = new Matrix();

static resetData(renderer: SpriteRenderer): void {
const { _verticesData: verticesData } = renderer;
const { positions, uvs } = verticesData;
verticesData.vertexCount = positions.length = uvs.length = 16;
for (let i = 0; i < 16; i++) {
positions[i] ||= new Vector3();
uvs[i] ||= new Vector2();
}
verticesData.triangles = SlicedSpriteAssembler._rectangleTriangles;
const manager = renderer._getChunkManager();
const lastSubChunk = renderer._subChunk;
lastSubChunk && manager.freeSubChunk(lastSubChunk);
const subChunk = manager.allocateSubChunk(16);
subChunk.indices = SlicedSpriteAssembler._rectangleTriangles;
renderer._subChunk = subChunk;
}

static updatePositions(renderer: SpriteRenderer): void {
const { width, height, sprite } = renderer;
const { positions, uvs } = renderer._verticesData;
const { border } = sprite;
const spriteUVs = sprite._getUVs();
// Update local positions.
const spritePositions = sprite._getPositions();
const { x: left, y: bottom } = spritePositions[0];
Expand Down Expand Up @@ -81,7 +77,7 @@ export class SlicedSpriteAssembler {
const localTransX = renderer.width * pivotX;
const localTransY = renderer.height * pivotY;
// Renderer's worldMatrix.
const { _worldMatrix: worldMatrix } = SlicedSpriteAssembler;
const worldMatrix = SlicedSpriteAssembler._worldMatrix;
const { elements: wE } = worldMatrix;
// Parent's worldMatrix.
const { elements: pWE } = renderer.entity.transform.worldMatrix;
Expand All @@ -104,18 +100,15 @@ export class SlicedSpriteAssembler {
// 0 - 4 - 8 - 12
// ------------------------
// Assemble position and uv.
for (let i = 0; i < 4; i++) {
const subChunk = renderer._subChunk;
const vertices = subChunk.chunk.vertices;
for (let i = 0, o = subChunk.vertexArea.start; i < 4; i++) {
const rowValue = row[i];
const rowU = spriteUVs[i].x;
for (let j = 0; j < 4; j++) {
for (let j = 0; j < 4; j++, o += 9) {
const columnValue = column[j];
const idx = i * 4 + j;
positions[idx].set(
wE[0] * rowValue + wE[4] * columnValue + wE[12],
wE[1] * rowValue + wE[5] * columnValue + wE[13],
wE[2] * rowValue + wE[6] * columnValue + wE[14]
);
uvs[idx].set(rowU, spriteUVs[j].y);
vertices[o] = wE[0] * rowValue + wE[4] * columnValue + wE[12];
vertices[o + 1] = wE[1] * rowValue + wE[5] * columnValue + wE[13];
vertices[o + 2] = wE[2] * rowValue + wE[6] * columnValue + wE[14];
}
}

Expand All @@ -125,5 +118,28 @@ export class SlicedSpriteAssembler {
renderer._bounds.transform(worldMatrix);
}

static updateUVs(renderer: SpriteRenderer): void {}
static updateUVs(renderer: SpriteRenderer): void {
const subChunk = renderer._subChunk;
const vertices = subChunk.chunk.vertices;
const spriteUVs = renderer.sprite._getUVs();
for (let i = 0, o = subChunk.vertexArea.start + 3; i < 4; i++) {
const rowU = spriteUVs[i].x;
for (let j = 0; j < 4; j++, o += 9) {
vertices[o] = rowU;
vertices[o + 1] = spriteUVs[j].y;
}
}
}

GuoLei1990 marked this conversation as resolved.
Show resolved Hide resolved
static updateColor(renderer: SpriteRenderer): void {
const subChunk = renderer._subChunk;
const { r, g, b, a } = renderer.color;
const vertices = subChunk.chunk.vertices;
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;
}
}
}
GuoLei1990 marked this conversation as resolved.
Show resolved Hide resolved
Loading
Loading