Skip to content

Commit

Permalink
Merge pull request #1286 from INEEDSSD/LayaAir_3.0
Browse files Browse the repository at this point in the history
fix: Fix Value2D cache bug. and update recent bugs.
  • Loading branch information
lirongf committed Dec 9, 2023
2 parents 26b736d + 34e6066 commit f39434b
Show file tree
Hide file tree
Showing 13 changed files with 124 additions and 89 deletions.
4 changes: 3 additions & 1 deletion src/layaAir/Laya.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import { URL } from "./laya/net/URL";
import { RunDriver } from "./laya/utils/RunDriver";
import { Config } from "./Config";
import { Shader3D } from "./laya/RenderEngine/RenderShader/Shader3D";
import { DrawStyle } from "./laya/webgl/canvas/DrawStyle";

/**
* <code>Laya</code> 是全局对象的引用入口集。
Expand Down Expand Up @@ -202,7 +203,8 @@ export class Laya {
Value2D._initone(ShaderDefines2D.TEXTURE2D | ShaderDefines2D.FILTERGLOW, TextureSV);
Value2D._initone(ShaderDefines2D.PRIMITIVE, PrimitiveSV);
Value2D._initone(ShaderDefines2D.SKINMESH, SkinSV);

ColorUtils._initDefault();
DrawStyle._Defaultinit();
if (laya3D) {
return laya3D.__init__().then(() => {
_onInitModuleCallbacks.forEach(c => c());
Expand Down
7 changes: 3 additions & 4 deletions src/layaAir/laya/d3/core/Camera.ts
Original file line number Diff line number Diff line change
Expand Up @@ -642,10 +642,9 @@ export class Camera extends BaseCamera {
return;
this._canBlitDepth = value;
this._cacheDepth = value;
if (value)
this._internalRenderTexture && (this._internalRenderTexture.generateDepthTexture = true);
else {
this._internalRenderTexture && (this._internalRenderTexture.generateDepthTexture = false);
this._internalRenderTexture && RenderTexture.recoverToPool(this._internalRenderTexture);
(!this._internalRenderTexture._inPool) && (this._internalRenderTexture = RenderTexture.createFromPool(this.viewport.width, this.viewport.height, this._getRenderTextureFormat(), this.depthTextureFormat, false, this.msaa ? 4 : 1, this._canBlitDepth, this._needRenderGamma(this._getRenderTextureFormat())));
if (!value) {
if (this._cacheDepthTexture)
this._cacheDepthTexture._inPool ? 0 : RenderTexture.recoverToPool(this._cacheDepthTexture);
}
Expand Down
2 changes: 1 addition & 1 deletion src/layaAir/laya/d3/core/render/PostEffect/GaussianDoF.ts
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,7 @@ export class GaussianDoF extends PostProcessEffect {
fullCoC.filterMode = FilterMode.Point;
this._shaderData.setTexture(GaussianDoF.BLURCOCTEXTURE, blurVTex);
let finalTex: RenderTexture = RenderTexture.createFromPool(source.width, source.height, source.colorFormat, source.depthStencilFormat, false, 1);
cmd.blitScreenTriangle(source, context.destination, null, this._shader, this._shaderData, 4);
cmd.blitScreenTriangle(context.indirectTarget, context.destination, null, this._shader, this._shaderData, 4);
//context.source = finalTex;
// recover render texture
RenderTexture.recoverToPool(fullCoC);
Expand Down
20 changes: 10 additions & 10 deletions src/layaAir/laya/d3/core/render/PostEffect/ScalableAO.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import { VertexMesh } from "../../../../RenderEngine/RenderShader/VertexMesh";
/**
* AO质量
*/
export enum AOQUALITY{
export enum AOQUALITY {
/**高 */
High,
/**中 */
Expand Down Expand Up @@ -83,9 +83,9 @@ export class ScalableAO extends PostProcessEffect {

ScalableAO.AOParams = Shader3D.propertyNameToID('u_AOParams');
ScalableAO.SourceTex = Shader3D.propertyNameToID('u_SourceTex');
ScalableAO.SHADERDEFINE_AOHigh =Shader3D.getDefineByName("AO_High");
ScalableAO.SHADERDEFINE_AOMEDIUM =Shader3D.getDefineByName("AO_MEDIUM");
ScalableAO.SHADERDEFINE_LOWEST =Shader3D.getDefineByName("AO_LOWEST");
ScalableAO.SHADERDEFINE_AOHigh = Shader3D.getDefineByName("AO_High");
ScalableAO.SHADERDEFINE_AOMEDIUM = Shader3D.getDefineByName("AO_MEDIUM");
ScalableAO.SHADERDEFINE_LOWEST = Shader3D.getDefineByName("AO_LOWEST");
Shader3D.addInclude("AmbientOcclusion.glsl", AmbientOcclusion);
//scalableAoShader
let attributeMap: any = {
Expand Down Expand Up @@ -135,7 +135,7 @@ export class ScalableAO extends PostProcessEffect {
/**@internal */
private _aoParams: Vector3 = new Vector3();

private _aoQuality:AOQUALITY = AOQUALITY.MEDIUM;
private _aoQuality: AOQUALITY = AOQUALITY.MEDIUM;

/**
* 实例化一个AO效果类
Expand Down Expand Up @@ -192,13 +192,13 @@ export class ScalableAO extends PostProcessEffect {
/**
* ao质量
*/
get aoQuality(){
get aoQuality() {
return this._aoQuality;
}

set aoQuality(value:AOQUALITY){
set aoQuality(value: AOQUALITY) {
this._aoQuality = value;
switch(value){
switch (value) {
case AOQUALITY.High:
this._shaderData.addDefine(ScalableAO.SHADERDEFINE_AOHigh);
this._shaderData.removeDefine(ScalableAO.SHADERDEFINE_AOMEDIUM);
Expand All @@ -216,7 +216,7 @@ export class ScalableAO extends PostProcessEffect {
break;
}
}

/**
* @override
*/
Expand Down Expand Up @@ -269,7 +269,7 @@ export class ScalableAO extends PostProcessEffect {
cmd.blitScreenTriangle(blurTex, finalTex, null, this._aoBlurHorizontalShader, this._shaderData, 0);
//blur Composition
cmd.setShaderDataTexture(shaderData, ScalableAO.aoTexture, finalTex);
cmd.blitScreenTriangle(context.source, context.destination, null, this._aoComposition, this._shaderData, 0);
cmd.blitScreenTriangle(context.indirectTarget, context.destination, null, this._aoComposition, this._shaderData, 0);
//context.source = blurTex;
context.deferredReleaseTextures.push(finalTex);
context.deferredReleaseTextures.push(blurTex);
Expand Down
61 changes: 3 additions & 58 deletions src/layaAir/laya/d3/utils/Utils3D.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,17 @@ import { PixelLineSprite3D } from "../core/pixelLine/PixelLineSprite3D";
import { BoundBox } from "../math/BoundBox";
import { TextureGenerator } from "../resource/TextureGenerator";
import { ILaya3D } from "../../../ILaya3D";
import { HTMLCanvas } from "../../resource/HTMLCanvas";
import { TextureFormat } from "../../RenderEngine/RenderEnum/TextureFormat";
import { FilterMode } from "../../RenderEngine/RenderEnum/FilterMode";
import { WrapMode } from "../../RenderEngine/RenderEnum/WrapMode";
import { RenderTargetFormat } from "../../RenderEngine/RenderEnum/RenderTargetFormat";
import { LayaEnv } from "../../../LayaEnv";
import { Bounds } from "../math/Bounds";
import { Color } from "../../maths/Color";
import { Matrix4x4 } from "../../maths/Matrix4x4";
import { Quaternion } from "../../maths/Quaternion";
import { Vector3 } from "../../maths/Vector3";
import { Vector4 } from "../../maths/Vector4";
import { RenderTexture } from "../../resource/RenderTexture";
import { Utils } from "../../utils/Utils";

/**
* <code>Utils3D</code> 类用于创建3D工具。
Expand Down Expand Up @@ -811,66 +809,13 @@ export class Utils3D {


/**
* @deprecated
* 将RenderTexture转换为Base64
* @param rendertexture 渲染Buffer
* @returns
*/
static uint8ArrayToArrayBuffer(rendertexture: RenderTexture) {
let pixelArray: Uint8Array | Float32Array;
let width = rendertexture.width;
let height = rendertexture.height;
switch (rendertexture.colorFormat) {
case RenderTargetFormat.R8G8B8:
pixelArray = new Uint8Array(width * height * 4);
break;
case RenderTargetFormat.R8G8B8A8:
pixelArray = new Uint8Array(width * height * 4);
break;
case RenderTargetFormat.R16G16B16A16:
pixelArray = new Float32Array(width * height * 4);
break;
default:
throw "this function is not surpprt " + rendertexture.format.toString() + "format Material";
}
rendertexture.getData(0, 0, rendertexture.width, rendertexture.height, pixelArray);
//tranceTo
//throw " rt get Data";
switch (rendertexture.colorFormat) {
case RenderTargetFormat.R16G16B16A16:
let ori = pixelArray;
let trans = new Uint8Array(width * height * 4);
for (let i = 0, n = ori.length; i < n; i++) {
trans[i] = Math.min(Math.floor(ori[i] * 255), 255);
}
pixelArray = trans;
break;
}

let pixels = pixelArray;
var bs: String;
if (LayaEnv.isConch) {
//TODO:
//var base64img=__JS__("conchToBase64('image/png',1,pixels,canvasWidth,canvasHeight)");
//var l = base64img.split(",");
//if (isBase64)
// return base64img;
//return base.utils.DBUtils.decodeArrayBuffer(l[1]);
}
else {
var canv: HTMLCanvas = new HTMLCanvas(true);
canv.lock = true;
canv.size(width, height);
var ctx2d = canv.getContext('2d');
//@ts-ignore
var imgdata: ImageData = ctx2d.createImageData(width, height);
//@ts-ignore
imgdata.data.set(new Uint8ClampedArray(pixels));
//@ts-ignore
ctx2d.putImageData(imgdata, 0, 0);;
bs = canv.source.toDataURL();
canv.destroy();
}
return bs;
return Utils.uint8ArrayToArrayBuffer(rendertexture);
}
}

Expand Down
3 changes: 2 additions & 1 deletion src/layaAir/laya/display/Sprite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1237,7 +1237,7 @@ export class Sprite extends Node {
*
* var htmlCanvas:HTMLCanvas = sprite.drawToCanvas(100, 100, 0, 0);//把精灵绘制到canvas上面
* htmlCanvas.toBase64("image/png",0.9);//打印图片base64信息,可以发给服务器或者保存为图片
*
* @deprecated
* @param canvasWidth 画布宽度。
* @param canvasHeight 画布高度。
* @param x 绘制的 X 轴偏移量。
Expand Down Expand Up @@ -1273,6 +1273,7 @@ export class Sprite extends Node {


/**
* @deprecated
* @private
* 绘制到画布。
*/
Expand Down
2 changes: 1 addition & 1 deletion src/layaAir/laya/resource/RenderTexture.ts
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ export class RenderTexture extends BaseTexture implements IRenderTarget {
return this._generateDepthTexture;
}
public set generateDepthTexture(value: boolean) {

this._generateDepthTexture = value;
// todo 重复 设置
if (value && !this._depthStencilTexture) {
// todo base texture format 移出构造函数
Expand Down
13 changes: 8 additions & 5 deletions src/layaAir/laya/resource/RenderTexture2D.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ export class RenderTexture2D extends BaseTexture implements IRenderTarget {
}

/** @private */
private _depthStencilFormat: number;
_depthStencilFormat: number;
/** @private */
private _colorFormat: RenderTargetFormat;
_colorFormat: RenderTargetFormat;

/**@internal */
_mgrKey: number = 0; //给WebGLRTMgr用的
Expand Down Expand Up @@ -101,7 +101,7 @@ export class RenderTexture2D extends BaseTexture implements IRenderTarget {
}
/**深度模板纹理 */
depthStencilTexture: BaseTexture;

_renderTarget: InternalRenderTarget;
/**是否是CameraTarget */
_isCameraTarget: boolean;
Expand Down Expand Up @@ -287,8 +287,11 @@ export class RenderTexture2D extends BaseTexture implements IRenderTarget {
* @param height 高度。
* @return 像素数据。
*/
getData(x: number, y: number, width: number, height: number): ArrayBufferView {
return LayaGL.textureContext.getRenderTextureData(this._renderTarget, x, y, width, height);
getData(x: number, y: number, width: number, height: number, out: Uint8Array | Float32Array = null): ArrayBufferView {
if (!out)
return LayaGL.textureContext.getRenderTextureData(this._renderTarget, x, y, width, height);
else
return LayaGL.textureContext.readRenderTargetPixelData(this._renderTarget, x, y, width, height, out);
}

/**
Expand Down
2 changes: 1 addition & 1 deletion src/layaAir/laya/utils/ColorUtils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ export class ColorUtils {
/**@private */

/**@private */
private static _DEFAULT: any = ColorUtils._initDefault();
private static _DEFAULT: any;

/**rgba 取值范围0-1*/
//TODO:delete?
Expand Down
72 changes: 72 additions & 0 deletions src/layaAir/laya/utils/Utils.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
import { LayaEnv } from "../../LayaEnv";
import { RenderTargetFormat } from "../RenderEngine/RenderEnum/RenderTargetFormat";
import { HTMLCanvas } from "../resource/HTMLCanvas";
import { RenderTexture } from "../resource/RenderTexture";
import { RenderTexture2D } from "../resource/RenderTexture2D";

var _gid: number = 1;
const _pi: number = 180 / Math.PI;
const _pi2: number = Math.PI / 180;
Expand Down Expand Up @@ -180,5 +186,71 @@ export class Utils {
else
return path + newExt;
}


/**
* 将RenderTexture转换为Base64
* @param rendertexture 渲染Buffer
* @returns
*/
static uint8ArrayToArrayBuffer(rendertexture: RenderTexture | RenderTexture2D) {
let pixelArray: Uint8Array | Float32Array;
let width = rendertexture.width;
let height = rendertexture.height;
let colorformat = (rendertexture instanceof RenderTexture) ? rendertexture.colorFormat : rendertexture._colorFormat;
switch (colorformat) {
case RenderTargetFormat.R8G8B8:
pixelArray = new Uint8Array(width * height * 4);
break;
case RenderTargetFormat.R8G8B8A8:
pixelArray = new Uint8Array(width * height * 4);
break;
case RenderTargetFormat.R16G16B16A16:
pixelArray = new Float32Array(width * height * 4);
break;
default:
throw "this function is not surpprt " + rendertexture.format.toString() + "format Material";
}
rendertexture.getData(0, 0, rendertexture.width, rendertexture.height, pixelArray);
//tranceTo
//throw " rt get Data";
switch (colorformat) {
case RenderTargetFormat.R16G16B16A16:
let ori = pixelArray;
let trans = new Uint8Array(width * height * 4);
for (let i = 0, n = ori.length; i < n; i++) {
trans[i] = Math.min(Math.floor(ori[i] * 255), 255);
}
pixelArray = trans;
break;
}

let pixels = pixelArray;
var bs: String;
if (LayaEnv.isConch) {
//TODO:
//var base64img=__JS__("conchToBase64('image/png',1,pixels,canvasWidth,canvasHeight)");
//var l = base64img.split(",");
//if (isBase64)
// return base64img;
//return base.utils.DBUtils.decodeArrayBuffer(l[1]);
}
else {
var canv: HTMLCanvas = new HTMLCanvas(true);
canv.lock = true;
canv.size(width, height);
var ctx2d = canv.getContext('2d');
//@ts-ignore
var imgdata: ImageData = ctx2d.createImageData(width, height);
//@ts-ignore
imgdata.data.set(new Uint8ClampedArray(pixels));
//@ts-ignore
ctx2d.putImageData(imgdata, 0, 0);;
bs = canv.source.toDataURL();
canv.destroy();
}
return bs;
}

}

6 changes: 4 additions & 2 deletions src/layaAir/laya/webgl/canvas/DrawStyle.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
import { ColorUtils } from "../../utils/ColorUtils"

export class DrawStyle {
static DEFAULT: DrawStyle = new DrawStyle("#000000")

static DEFAULT: DrawStyle;
static _Defaultinit() {
DrawStyle.DEFAULT = new DrawStyle("#000000");
}
_color: ColorUtils;

static create(value: any): DrawStyle {
Expand Down
17 changes: 14 additions & 3 deletions src/layaAir/laya/webgl/shader/d2/value/Value2D.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,14 @@ export class Value2D {

static create(mainType: number, subType: number): Value2D {
var types: any = Value2D._cache[mainType | subType];
if (types._length)
return types[--types._length];
else
if (types._length) {
let value: Value2D = types[--types._length];
value.resetValue();
return value;
}
else {
return new Value2D._typeClass[mainType | subType](subType);
}
}


Expand Down Expand Up @@ -184,6 +188,13 @@ export class Value2D {
this.clipOff[0] = 0;
}

/**
* 重设Value2D内容
*/
resetValue(): void {
this.textureHost = null;
}

release(): void {
if ((--this.ref) < 1) {
this._inClassCache && (this._inClassCache[this._inClassCache._length++] = this);
Expand Down
Loading

0 comments on commit f39434b

Please sign in to comment.