Skip to content
Draft
26 changes: 14 additions & 12 deletions packages/core/src/2d/assembler/ISpriteAssembler.ts
Original file line number Diff line number Diff line change
@@ -1,21 +1,23 @@
import { Matrix, Vector2 } from "@galacean/engine-math";
import { ISpriteRenderer } from "./ISpriteRenderer";
import { BoundingBox, Color, Matrix } from "@galacean/engine-math";
import { PrimitiveChunkManager } from "../../RenderPipeline/PrimitiveChunkManager";
import { SpriteTileMode } from "../enums/SpriteTileMode";
import { ISpriteLayout } from "../sprite/ISpriteLayout";
import { SpritePrimitive } from "../sprite/SpritePrimitive";

/**
* Interface for sprite assembler.
*/
export interface ISpriteAssembler {
resetData(renderer: ISpriteRenderer, vertexCount?: number): void;
resetData(primitive: SpritePrimitive, chunkManager: PrimitiveChunkManager, vertexCount?: number): void;
updatePositions(
renderer: ISpriteRenderer,
primitive: SpritePrimitive,
chunkManager: PrimitiveChunkManager,
layout: ISpriteLayout,
worldMatrix: Matrix,
width: number,
height: number,
pivot: Vector2,
flipX: boolean,
flipY: boolean,
referenceResolutionPerUnit?: number
outBounds: BoundingBox,
tileMode?: SpriteTileMode,
tiledAdaptiveThreshold?: number
): void;
updateUVs(renderer: ISpriteRenderer): void;
updateColor(renderer: ISpriteRenderer, alpha: number): void;
updateUVs(primitive: SpritePrimitive): void;
updateColor(primitive: SpritePrimitive, color: Color, alpha: number): void;
}
17 changes: 0 additions & 17 deletions packages/core/src/2d/assembler/ISpriteRenderer.ts

This file was deleted.

46 changes: 23 additions & 23 deletions packages/core/src/2d/assembler/SimpleSpriteAssembler.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { BoundingBox, Matrix, Vector2 } from "@galacean/engine-math";
import { BoundingBox, Color, Matrix } from "@galacean/engine-math";
import { StaticInterfaceImplement } from "../../base/StaticInterfaceImplement";
import { PrimitiveChunkManager } from "../../RenderPipeline/PrimitiveChunkManager";
import { ISpriteLayout } from "../sprite/ISpriteLayout";
import { SpritePrimitive } from "../sprite/SpritePrimitive";
import { ISpriteAssembler } from "./ISpriteAssembler";
import { ISpriteRenderer } from "./ISpriteRenderer";

/**
* Assemble vertex data for the sprite renderer in simple mode.
Expand All @@ -11,25 +13,23 @@ export class SimpleSpriteAssembler {
private static _rectangleTriangles = [0, 1, 2, 2, 1, 3];
private static _matrix = new Matrix();

static resetData(renderer: ISpriteRenderer): void {
const manager = renderer._getChunkManager();
const lastSubChunk = renderer._subChunk;
lastSubChunk && manager.freeSubChunk(lastSubChunk);
const subChunk = manager.allocateSubChunk(4);
static resetData(primitive: SpritePrimitive, chunkManager: PrimitiveChunkManager): void {
const lastSubChunk = primitive.subChunk;
lastSubChunk && chunkManager.freeSubChunk(lastSubChunk);
const subChunk = chunkManager.allocateSubChunk(4);
subChunk.indices = SimpleSpriteAssembler._rectangleTriangles;
renderer._subChunk = subChunk;
primitive.subChunk = subChunk;
}

static updatePositions(
renderer: ISpriteRenderer,
primitive: SpritePrimitive,
chunkManager: PrimitiveChunkManager,
layout: ISpriteLayout,
worldMatrix: Matrix,
width: number,
height: number,
pivot: Vector2,
flipX: boolean,
flipY: boolean
outBounds: BoundingBox
): void {
const { sprite } = renderer;
const { sprite } = primitive;
const { width, height, pivot, flipX, flipY } = layout;
const { x: pivotX, y: pivotY } = pivot;
// Position to World
const modelMatrix = SimpleSpriteAssembler._matrix;
Expand All @@ -52,7 +52,7 @@ export class SimpleSpriteAssembler {
// ---------------
// Update positions
const spritePositions = sprite._getPositions();
const subChunk = renderer._subChunk;
const subChunk = primitive.subChunk;
const vertices = subChunk.chunk.vertices;
for (let i = 0, o = subChunk.vertexArea.start; i < 4; ++i, o += 9) {
const { x, y } = spritePositions[i];
Expand All @@ -62,14 +62,14 @@ export class SimpleSpriteAssembler {
}

// @ts-ignore
BoundingBox.transform(sprite._getBounds(), modelMatrix, renderer._bounds);
BoundingBox.transform(sprite._getBounds(), modelMatrix, outBounds);
}

static updateUVs(renderer: ISpriteRenderer): void {
const spriteUVs = renderer.sprite._getUVs();
static updateUVs(primitive: SpritePrimitive): void {
const spriteUVs = primitive.sprite._getUVs();
const { x: left, y: bottom } = spriteUVs[0];
const { x: right, y: top } = spriteUVs[3];
const subChunk = renderer._subChunk;
const subChunk = primitive.subChunk;
const vertices = subChunk.chunk.vertices;
const offset = subChunk.vertexArea.start + 3;
vertices[offset] = left;
Expand All @@ -82,9 +82,9 @@ export class SimpleSpriteAssembler {
vertices[offset + 28] = top;
}

static updateColor(renderer: ISpriteRenderer, alpha: number): void {
const subChunk = renderer._subChunk;
const { r, g, b, a } = renderer.color;
static updateColor(primitive: SpritePrimitive, color: Color, alpha: number): void {
const subChunk = primitive.subChunk;
const { r, g, b, a } = color;
const finalAlpha = a * alpha;
const vertices = subChunk.chunk.vertices;
for (let i = 0, o = subChunk.vertexArea.start + 5; i < 4; ++i, o += 9) {
Expand Down
54 changes: 26 additions & 28 deletions packages/core/src/2d/assembler/SlicedSpriteAssembler.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
import { Matrix, Vector2 } from "@galacean/engine-math";
import { BoundingBox, Color, Matrix } from "@galacean/engine-math";
import { StaticInterfaceImplement } from "../../base/StaticInterfaceImplement";
import { PrimitiveChunkManager } from "../../RenderPipeline/PrimitiveChunkManager";
import { ISpriteLayout } from "../sprite/ISpriteLayout";
import { SpritePrimitive } from "../sprite/SpritePrimitive";
import { ISpriteAssembler } from "./ISpriteAssembler";
import { ISpriteRenderer } from "./ISpriteRenderer";

/**
* Assemble vertex data for the sprite renderer in sliced mode.
Expand All @@ -16,26 +18,24 @@ export class SlicedSpriteAssembler {
private static _row = new Array<number>(4);
private static _column = new Array<number>(4);

static resetData(renderer: ISpriteRenderer): void {
const manager = renderer._getChunkManager();
const lastSubChunk = renderer._subChunk;
lastSubChunk && manager.freeSubChunk(lastSubChunk);
const subChunk = manager.allocateSubChunk(16);
static resetData(primitive: SpritePrimitive, chunkManager: PrimitiveChunkManager): void {
const lastSubChunk = primitive.subChunk;
lastSubChunk && chunkManager.freeSubChunk(lastSubChunk);
const subChunk = chunkManager.allocateSubChunk(16);
subChunk.indices = SlicedSpriteAssembler._rectangleTriangles;
renderer._subChunk = subChunk;
primitive.subChunk = subChunk;
}

static updatePositions(
renderer: ISpriteRenderer,
primitive: SpritePrimitive,
chunkManager: PrimitiveChunkManager,
layout: ISpriteLayout,
worldMatrix: Matrix,
width: number,
height: number,
pivot: Vector2,
flipX: boolean,
flipY: boolean,
referenceResolutionPerUnit: number = 1
outBounds: BoundingBox
): void {
const { sprite } = renderer;
const { sprite } = primitive;
const { width, height, pivot, flipX, flipY } = layout;
const referenceResolutionPerUnit = layout.referenceResolutionPerUnit ?? 1;
const { border } = sprite;
// Update local positions.
const spritePositions = sprite._getPositions();
Expand Down Expand Up @@ -106,7 +106,7 @@ export class SlicedSpriteAssembler {
// 0 - 4 - 8 - 12
// ------------------------
// Assemble position and uv.
const subChunk = renderer._subChunk;
const subChunk = primitive.subChunk;
const vertices = subChunk.chunk.vertices;
for (let i = 0, o = subChunk.vertexArea.start; i < 4; i++) {
const rowValue = row[i];
Expand All @@ -118,17 +118,15 @@ export class SlicedSpriteAssembler {
}
}

// @ts-ignore
const bounds = renderer._bounds;
bounds.min.set(row[0], column[0], 0);
bounds.max.set(row[3], column[3], 0);
bounds.transform(modelMatrix);
outBounds.min.set(row[0], column[0], 0);
outBounds.max.set(row[3], column[3], 0);
outBounds.transform(modelMatrix);
}

static updateUVs(renderer: ISpriteRenderer): void {
const subChunk = renderer._subChunk;
static updateUVs(primitive: SpritePrimitive): void {
const subChunk = primitive.subChunk;
const vertices = subChunk.chunk.vertices;
const spriteUVs = renderer.sprite._getUVs();
const spriteUVs = primitive.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) {
Expand All @@ -138,9 +136,9 @@ export class SlicedSpriteAssembler {
}
}

static updateColor(renderer: ISpriteRenderer, alpha: number): void {
const subChunk = renderer._subChunk;
const { r, g, b, a } = renderer.color;
static updateColor(primitive: SpritePrimitive, color: Color, alpha: number): void {
const subChunk = primitive.subChunk;
const { r, g, b, a } = color;
const finalAlpha = a * alpha;
const vertices = subChunk.chunk.vertices;
for (let i = 0, o = subChunk.vertexArea.start + 5; i < 16; ++i, o += 9) {
Expand Down
Loading
Loading