From 6f0e38cfca7a4e86a33508014676e91c39a39457 Mon Sep 17 00:00:00 2001 From: singlecoder Date: Tue, 24 May 2022 19:18:36 +0800 Subject: [PATCH] feat: add `priority` for renderer to order(#803) * feat(renderer): add `priority` for renderer to order --- .../src/RenderPipeline/BasicRenderPipeline.ts | 18 ++++++++++-------- .../core/src/RenderPipeline/RenderQueue.ts | 10 ++++------ packages/core/src/Renderer.ts | 17 +++++++++++++---- .../core/src/material/enums/RenderQueueType.ts | 6 +++--- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/packages/core/src/RenderPipeline/BasicRenderPipeline.ts b/packages/core/src/RenderPipeline/BasicRenderPipeline.ts index 5a687087b7..16b4c98b80 100644 --- a/packages/core/src/RenderPipeline/BasicRenderPipeline.ts +++ b/packages/core/src/RenderPipeline/BasicRenderPipeline.ts @@ -202,14 +202,16 @@ export class BasicRenderPipeline { * @param element - Render element */ pushPrimitive(element: RenderElement | SpriteElement) { - const renderQueueType = element.material.renderQueueType; - - if (renderQueueType > (RenderQueueType.Transparent + RenderQueueType.AlphaTest) >> 1) { - this._transparentQueue.pushPrimitive(element); - } else if (renderQueueType > (RenderQueueType.AlphaTest + RenderQueueType.Opaque) >> 1) { - this._alphaTestQueue.pushPrimitive(element); - } else { - this._opaqueQueue.pushPrimitive(element); + switch (element.material.renderQueueType) { + case RenderQueueType.Transparent: + this._transparentQueue.pushPrimitive(element); + break; + case RenderQueueType.AlphaTest: + this._alphaTestQueue.pushPrimitive(element); + break; + case RenderQueueType.Opaque: + this._opaqueQueue.pushPrimitive(element); + break; } } diff --git a/packages/core/src/RenderPipeline/RenderQueue.ts b/packages/core/src/RenderPipeline/RenderQueue.ts index beb204a213..757c9ad0fb 100644 --- a/packages/core/src/RenderPipeline/RenderQueue.ts +++ b/packages/core/src/RenderPipeline/RenderQueue.ts @@ -19,9 +19,8 @@ export class RenderQueue { */ static _compareFromNearToFar(a: Item, b: Item): number { return ( - a.material.renderQueueType - b.material.renderQueueType || - a.component._distanceForSort - b.component._distanceForSort || - b.component._renderSortId - a.component._renderSortId + a.component.priority - b.component.priority || + a.component._distanceForSort - b.component._distanceForSort ); } @@ -30,9 +29,8 @@ export class RenderQueue { */ static _compareFromFarToNear(a: Item, b: Item): number { return ( - a.material.renderQueueType - b.material.renderQueueType || - b.component._distanceForSort - a.component._distanceForSort || - b.component._renderSortId - a.component._renderSortId + a.component.priority - b.component.priority || + b.component._distanceForSort - a.component._distanceForSort ); } diff --git a/packages/core/src/Renderer.ts b/packages/core/src/Renderer.ts index 1d55dd41ad..cdbdb4b624 100644 --- a/packages/core/src/Renderer.ts +++ b/packages/core/src/Renderer.ts @@ -46,10 +46,6 @@ export class Renderer extends Component { @ignoreClone _globalShaderMacro: ShaderMacroCollection = new ShaderMacroCollection(); - /** @internal temp solution. */ - @ignoreClone - _renderSortId: number = 0; - @ignoreClone protected _overrideUpdate: boolean = false; @shallowClone @@ -69,6 +65,8 @@ export class Renderer extends Component { private _normalMatrix: Matrix = new Matrix(); @ignoreClone private _materialsInstanced: boolean[] = []; + @ignoreClone + private _priority: number = 0; /** * Material count. @@ -97,6 +95,17 @@ export class Renderer extends Component { return this._bounds; } + /** + * The render priority of the renderer, lower values are rendered first and higher values are rendered last. + */ + get priority(): number { + return this._priority; + } + + set priority(value: number) { + this._priority = value; + } + /** * @internal */ diff --git a/packages/core/src/material/enums/RenderQueueType.ts b/packages/core/src/material/enums/RenderQueueType.ts index 18563f5ae3..e913e7426e 100644 --- a/packages/core/src/material/enums/RenderQueueType.ts +++ b/packages/core/src/material/enums/RenderQueueType.ts @@ -3,9 +3,9 @@ */ export enum RenderQueueType { /** Opaque queue. */ - Opaque = 1000, + Opaque, /** Opaque queue, alpha cutoff. */ - AlphaTest = 2000, + AlphaTest, /** Transparent queue, rendering from back to front to ensure correct rendering of transparent objects. */ - Transparent = 3000 + Transparent }