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: extract some methods of the 2D renderers from the Engine #2391

Closed
wants to merge 38 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
3ff8a7b
refactor(mask): refactor mask
singlecoder Sep 2, 2024
4afe44b
refactor(mask): opt stencil state
singlecoder Sep 3, 2024
603ba2a
refactor(mask): move sprite mask layer to root
singlecoder Sep 3, 2024
0ae6484
refactor(mask): opt code
singlecoder Sep 5, 2024
1a89b5d
refactor(mask): clear stencil when shadow
singlecoder Sep 9, 2024
a5f1ab9
refactor(mask): fix test error
singlecoder Sep 9, 2024
7ad02b4
refactor(mask): delete render queue check in RenderQueue
singlecoder Sep 10, 2024
e97c4aa
refactor(mask): rename api _isCulledByCamera to _isFilteredByLayer
singlecoder Sep 11, 2024
2f2615b
refactor(mask): when need mask, not change stencil state, upload to g…
singlecoder Sep 11, 2024
47c9c7e
refactor(mask): delete unless code
singlecoder Sep 11, 2024
e52b60a
refactor(mask): mask should be filtered by camera culling mask
singlecoder Sep 12, 2024
8a48797
refactor(mask): opt code
singlecoder Sep 13, 2024
a311f2d
refactor(mask): clear stencil by mask when current render queue has done
singlecoder Sep 14, 2024
9a06859
refactor(mask): opt code
singlecoder Sep 18, 2024
f6f373b
refactor(mask): opt code
singlecoder Sep 18, 2024
f6b35a9
refactor(mask): opt code
singlecoder Sep 18, 2024
47d670a
refactor(mask): opt code
singlecoder Sep 18, 2024
8c0fc37
refactor(mask): opt code
singlecoder Sep 19, 2024
e71b5d6
refactor(mask): delete useless stencil clear
singlecoder Sep 19, 2024
5df85bc
refactor(mask): opt custom stencil states cache
singlecoder Sep 19, 2024
0a09fee
refactor(mask): opt code
singlecoder Sep 19, 2024
82f7f82
refactor(mask): fix conflicts from dev/1.4
singlecoder Sep 19, 2024
12d40f3
refactor(mask): opt custom stencil states
singlecoder Sep 19, 2024
028e4b0
refactor(mask): opt code
singlecoder Sep 19, 2024
2b92fe1
refactor(mask): opt code for clear mask
singlecoder Sep 19, 2024
168dcee
fix(particle): particle velocity over lifetime bug (#2387)
GuoLei1990 Sep 24, 2024
73c2cb7
chore: release v1.3.12
GuoLei1990 Sep 24, 2024
ec4a457
ci: support report codecov
gz65555 Sep 25, 2024
d4e0d5d
ci: use the right nyc
gz65555 Sep 25, 2024
432b75c
ci: use the new coverage action
gz65555 Sep 25, 2024
b55549d
ci: add code cov token
gz65555 Sep 25, 2024
e6ea057
ci: remove directory
gz65555 Sep 25, 2024
fc39d5d
ci: update publish
gz65555 Sep 25, 2024
214b8e6
chore: release v0.0.0-experimental-1.3-xr.10
gz65555 Sep 25, 2024
ee29a4f
refactor: extract some methods of the 2D renderers from the Engine
eyworldwide Sep 26, 2024
ca9450d
fix: lint
eyworldwide Sep 26, 2024
1422f7d
Merge branch 'dev/1.4' of github.com:galacean/engine
eyworldwide Sep 26, 2024
63c7b12
Merge branch 'refactor/sprite-mask' of github.com:singlecoder/engine
eyworldwide Sep 26, 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
8 changes: 5 additions & 3 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,10 +69,12 @@ jobs:
run: npm run build:editor
- name: Test
run: npm run test-cov
- run: pnpm install codecov -w
- name: Upload coverage to Codecov
run: ./node_modules/.bin/codecov
- run: curl -s https://codecov.io/bash
uses: codecov/codecov-action@v4
with:
token: ${{secrets.CODECOV_TOKEN}}
fail_ci_if_error: true
flags: unittests

e2e:
runs-on: macos-latest
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ jobs:
run: pnpm b:all

- name: Release current monorepo
uses: gz65555/publish@v0.1.3
uses: gz65555/publish@v0.1.9
env:
NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}}
NPM_CONFIG_PROVENANCE: true
Expand Down
2 changes: 1 addition & 1 deletion e2e/package.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"name": "@galacean/engine-e2e",
"private": true,
"version": "1.3.11",
"version": "0.0.0-experimental-1.3-xr.10",
"license": "MIT",
"scripts": {
"case": "vite serve .dev --config .dev/vite.config.js",
Expand Down
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@galacean/engine-root",
"version": "1.3.11",
"version": "0.0.0-experimental-1.3-xr.10",
"packageManager": "pnpm@9.3.0",
"private": true,
"scripts": {
Expand Down
2 changes: 1 addition & 1 deletion packages/core/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@galacean/engine-core",
"version": "1.3.11",
"version": "0.0.0-experimental-1.3-xr.10",
"publishConfig": {
"access": "public",
"registry": "https://registry.npmjs.org"
Expand Down
1 change: 0 additions & 1 deletion packages/core/src/2d/index.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
export { SpriteMaskInteraction } from "./enums/SpriteMaskInteraction";
export { SpriteMaskLayer } from "./enums/SpriteMaskLayer";
export { TextHorizontalAlignment, TextVerticalAlignment } from "./enums/TextAlignment";
export { OverflowMode } from "./enums/TextOverflow";
export { FontStyle } from "./enums/FontStyle";
Expand Down
16 changes: 15 additions & 1 deletion packages/core/src/2d/sprite/SpriteMask.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,14 @@ import { SubPrimitiveChunk } from "../../RenderPipeline/SubPrimitiveChunk";
import { SubRenderElement } from "../../RenderPipeline/SubRenderElement";
import { Renderer, RendererUpdateFlags } from "../../Renderer";
import { assignmentClone, ignoreClone } from "../../clone/CloneManager";
import { SpriteMaskLayer } from "../../enums/SpriteMaskLayer";
import { ShaderProperty } from "../../shader/ShaderProperty";
import { SimpleSpriteAssembler } from "../assembler/SimpleSpriteAssembler";
import { SpriteMaskLayer } from "../enums/SpriteMaskLayer";
import { SpriteModifyFlags } from "../enums/SpriteModifyFlags";
import { Sprite } from "./Sprite";
import { Material } from "../../material";
import { ColorWriteMask, CullMode, RenderQueueType, Shader } from "../../shader";
import { Engine } from "../../Engine";

/**
* A component for masking Sprites.
Expand All @@ -24,6 +27,17 @@ export class SpriteMask extends Renderer {
/** @internal */
static _alphaCutoffProperty: ShaderProperty = ShaderProperty.getByName("renderer_MaskAlphaCutoff");

static _createSpriteMaskMaterial(engine: Engine): Material {
const material = new Material(engine, Shader.find("SpriteMask"));
const renderState = material.renderState;
renderState.blendState.targetBlendState.colorWriteMask = ColorWriteMask.None;
renderState.rasterState.cullMode = CullMode.Off;
renderState.stencilState.enabled = true;
renderState.depthState.enabled = false;
material.isGCIgnored = true;
return material;
}

/** The mask layers the sprite mask influence to. */
@assignmentClone
influenceLayers: number = SpriteMaskLayer.Everything;
Expand Down
46 changes: 21 additions & 25 deletions packages/core/src/2d/sprite/SpriteRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import { SubRenderElement } from "../../RenderPipeline/SubRenderElement";
import { Renderer, RendererUpdateFlags } from "../../Renderer";
import { assignmentClone, deepClone, ignoreClone } from "../../clone/CloneManager";
import { ShaderProperty } from "../../shader/ShaderProperty";
import { CompareFunction } from "../../shader/enums/CompareFunction";
import { ISpriteAssembler } from "../assembler/ISpriteAssembler";
import { SimpleSpriteAssembler } from "../assembler/SimpleSpriteAssembler";
import { SlicedSpriteAssembler } from "../assembler/SlicedSpriteAssembler";
Expand All @@ -18,6 +17,9 @@ import { SpriteMaskInteraction } from "../enums/SpriteMaskInteraction";
import { SpriteModifyFlags } from "../enums/SpriteModifyFlags";
import { SpriteTileMode } from "../enums/SpriteTileMode";
import { Sprite } from "./Sprite";
import { Material } from "../../material";
eyworldwide marked this conversation as resolved.
Show resolved Hide resolved
import { BlendFactor, BlendOperation, ColorWriteMask, CullMode, RenderQueueType, Shader } from "../../shader";
import { Engine } from "../../Engine";

/**
* Renders a Sprite for 2D graphics.
Expand All @@ -26,6 +28,23 @@ export class SpriteRenderer extends Renderer {
/** @internal */
static _textureProperty: ShaderProperty = ShaderProperty.getByName("renderer_SpriteTexture");

static _createSpriteMaterial(engine: Engine): Material {
const material = new Material(engine, Shader.find("Sprite"));
const renderState = material.renderState;
const target = renderState.blendState.targetBlendState;
target.enabled = true;
target.sourceColorBlendFactor = BlendFactor.SourceAlpha;
target.destinationColorBlendFactor = BlendFactor.OneMinusSourceAlpha;
target.sourceAlphaBlendFactor = BlendFactor.One;
target.destinationAlphaBlendFactor = BlendFactor.OneMinusSourceAlpha;
target.colorBlendOperation = target.alphaBlendOperation = BlendOperation.Add;
renderState.depthState.writeEnabled = false;
renderState.rasterState.cullMode = CullMode.Off;
renderState.renderQueueType = RenderQueueType.Transparent;
material.isGCIgnored = true;
return material;
}

/** @internal */
@ignoreClone
_subChunk: SubPrimitiveChunk;
Expand Down Expand Up @@ -257,7 +276,6 @@ export class SpriteRenderer extends Renderer {

set maskInteraction(value: SpriteMaskInteraction) {
if (this._maskInteraction !== value) {
this._updateStencilState(this._maskInteraction, value);
this._maskInteraction = value;
}
}
Expand Down Expand Up @@ -334,7 +352,7 @@ export class SpriteRenderer extends Renderer {
}
// @todo: This question needs to be raised rather than hidden.
if (material.destroyed) {
material = this._engine._spriteDefaultMaterials[this._maskInteraction];
material = this._engine._spriteDefaultMaterial;
}

// Update position
Expand Down Expand Up @@ -395,28 +413,6 @@ export class SpriteRenderer extends Renderer {
this._dirtyUpdateFlag &= ~SpriteRendererUpdateFlags.AutomaticSize;
}

private _updateStencilState(from: SpriteMaskInteraction, to: SpriteMaskInteraction): void {
const material = this.getMaterial();
const { _spriteDefaultMaterials: spriteDefaultMaterials } = this._engine;
if (material === spriteDefaultMaterials[from]) {
this.setMaterial(spriteDefaultMaterials[to]);
} else {
const { stencilState } = material.renderState;
if (to === SpriteMaskInteraction.None) {
stencilState.enabled = false;
stencilState.writeMask = 0xff;
stencilState.referenceValue = 0;
stencilState.compareFunctionFront = stencilState.compareFunctionBack = CompareFunction.Always;
} else {
stencilState.enabled = true;
stencilState.writeMask = 0x00;
stencilState.referenceValue = 1;
stencilState.compareFunctionFront = stencilState.compareFunctionBack =
to === SpriteMaskInteraction.VisibleInsideMask ? CompareFunction.LessEqual : CompareFunction.Greater;
}
}
}

@ignoreClone
private _onSpriteChange(type: SpriteModifyFlags): void {
switch (type) {
Expand Down
53 changes: 20 additions & 33 deletions packages/core/src/2d/text/TextRenderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,7 @@
import { Renderer } from "../../Renderer";
import { TransformModifyFlags } from "../../Transform";
import { assignmentClone, deepClone, ignoreClone } from "../../clone/CloneManager";
import { ShaderData, ShaderProperty } from "../../shader";
import { CompareFunction } from "../../shader/enums/CompareFunction";
import { BlendFactor, BlendOperation, CullMode, RenderQueueType, Shader, ShaderData, ShaderProperty } from "../../shader";

Check failure on line 12 in packages/core/src/2d/text/TextRenderer.ts

View workflow job for this annotation

GitHub Actions / lint

Replace `·BlendFactor,·BlendOperation,·CullMode,·RenderQueueType,·Shader,·ShaderData,·ShaderProperty·` with `⏎··BlendFactor,⏎··BlendOperation,⏎··CullMode,⏎··RenderQueueType,⏎··Shader,⏎··ShaderData,⏎··ShaderProperty⏎`
import { ShaderDataGroup } from "../../shader/enums/ShaderDataGroup";
import { Texture2D } from "../../texture";
import { FontStyle } from "../enums/FontStyle";
Expand All @@ -21,6 +20,7 @@
import { Font } from "./Font";
import { SubFont } from "./SubFont";
import { TextUtils } from "./TextUtils";
import { Material } from "../../material";

/**
* Renders a text for 2D graphics.
Expand All @@ -32,6 +32,23 @@
private static _worldPositions = [new Vector3(), new Vector3(), new Vector3(), new Vector3()];
private static _charRenderInfos: CharRenderInfo[] = [];

static _createTextMaterial(engine: Engine): Material {
const material = new Material(engine, Shader.find("Text"));
const renderState = material.renderState;
const target = renderState.blendState.targetBlendState;
target.enabled = true;
target.sourceColorBlendFactor = BlendFactor.SourceAlpha;
target.destinationColorBlendFactor = BlendFactor.OneMinusSourceAlpha;
target.sourceAlphaBlendFactor = BlendFactor.One;
target.destinationAlphaBlendFactor = BlendFactor.OneMinusSourceAlpha;
target.colorBlendOperation = target.alphaBlendOperation = BlendOperation.Add;
renderState.depthState.writeEnabled = false;
renderState.rasterState.cullMode = CullMode.Off;
renderState.renderQueueType = RenderQueueType.Transparent;
material.isGCIgnored = true;
return material;
}
Comment on lines +35 to +50
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Use TypeScript access modifiers instead of underscore prefixes

The method _createTextMaterial uses an underscore prefix to indicate it's intended for internal use. In TypeScript, it's recommended to use the private or protected access modifiers to enforce encapsulation rather than relying on naming conventions.

Apply this diff to make the method private:

-static _createTextMaterial(engine: Engine): Material {
+private static _createTextMaterial(engine: Engine): Material {

Committable suggestion was skipped due to low confidence.


/** @internal */
@ignoreClone
_textChunks = Array<TextChunk>();
Expand Down Expand Up @@ -250,7 +267,6 @@
set maskInteraction(value: SpriteMaskInteraction) {
if (this._maskInteraction !== value) {
this._maskInteraction = value;
this._setDirtyFlagTrue(DirtyFlag.MaskInteraction);
}
}

Expand Down Expand Up @@ -394,11 +410,6 @@
return;
}

if (this._isContainDirtyFlag(DirtyFlag.MaskInteraction)) {
this._updateStencilState();
this._setDirtyFlagFalse(DirtyFlag.MaskInteraction);
}

if (this._isContainDirtyFlag(DirtyFlag.SubFont)) {
this._resetSubFont();
this._setDirtyFlagFalse(DirtyFlag.SubFont);
Expand Down Expand Up @@ -437,29 +448,6 @@
camera._renderPipeline.pushRenderElement(context, renderElement);
}

private _updateStencilState(): void {
const material = this.getInstanceMaterial();
const stencilState = material.renderState.stencilState;
const maskInteraction = this._maskInteraction;

if (maskInteraction === SpriteMaskInteraction.None) {
stencilState.enabled = false;
stencilState.writeMask = 0xff;
stencilState.referenceValue = 0;
stencilState.compareFunctionFront = stencilState.compareFunctionBack = CompareFunction.Always;
} else {
stencilState.enabled = true;
stencilState.writeMask = 0x00;
stencilState.referenceValue = 1;
const compare =
maskInteraction === SpriteMaskInteraction.VisibleInsideMask
? CompareFunction.LessEqual
: CompareFunction.Greater;
stencilState.compareFunctionFront = compare;
stencilState.compareFunctionBack = compare;
}
}

private _resetSubFont(): void {
const font = this._font;
this._subFont = font._getSubFont(this.fontSize, this.fontStyle);
Expand Down Expand Up @@ -762,8 +750,7 @@
LocalPositionBounds = 0x2,
WorldPosition = 0x4,
WorldBounds = 0x8,
MaskInteraction = 0x10,
Color = 0x20,
Color = 0x10,

Position = LocalPositionBounds | WorldPosition | WorldBounds,
Font = SubFont | Position
Expand Down
Loading
Loading