@predy-js/render-interface 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +5545 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +5524 -0
- package/dist/index.mjs.map +1 -0
- package/dist/src/common/console.d.ts +3 -0
- package/dist/src/common/env.d.ts +1 -0
- package/dist/src/common/raf.d.ts +2 -0
- package/dist/src/common/request.d.ts +10 -0
- package/dist/src/common/utils.d.ts +14 -0
- package/dist/src/index.d.ts +17 -0
- package/dist/src/render/MarsExtWrap.d.ts +15 -0
- package/dist/src/render/MarsGPUCapability.d.ts +2 -0
- package/dist/src/render/MarsGeometry.d.ts +64 -0
- package/dist/src/render/MarsMaterial.d.ts +29 -0
- package/dist/src/render/MarsMaterialDataBlock.d.ts +37 -0
- package/dist/src/render/MarsMesh.d.ts +24 -0
- package/dist/src/render/MarsRenderFrame.d.ts +22 -0
- package/dist/src/render/MarsRenderPass.d.ts +51 -0
- package/dist/src/render/MarsRenderPassColorAttachment.d.ts +27 -0
- package/dist/src/render/MarsRenderer.d.ts +20 -0
- package/dist/src/render/MarsSemanticMap.d.ts +10 -0
- package/dist/src/render/MarsSharedGeometry.d.ts +13 -0
- package/dist/src/render/MarsTexture.d.ts +29 -0
- package/dist/src/render/MarsTextureFactory.d.ts +20 -0
- package/dist/src/render/RenderFrameInternal.d.ts +8 -0
- package/dist/src/statistic/index.d.ts +20 -0
- package/dist/src/webgl/GLFrameBuffer.d.ts +45 -0
- package/dist/src/webgl/GLGPUBuffer.d.ts +27 -0
- package/dist/src/webgl/GLGPUCapability.d.ts +32 -0
- package/dist/src/webgl/GLGPURenderer.d.ts +57 -0
- package/dist/src/webgl/GLGeometry.d.ts +52 -0
- package/dist/src/webgl/GLMaterial.d.ts +15 -0
- package/dist/src/webgl/GLProgram.d.ts +42 -0
- package/dist/src/webgl/GLRenderBuffer.d.ts +22 -0
- package/dist/src/webgl/GLShaderLibrary.d.ts +33 -0
- package/dist/src/webgl/GLTexture.d.ts +35 -0
- package/dist/src/webgl/GLUniformUtils.d.ts +42 -0
- package/dist/src/webgl/GLVertexArrayObject.d.ts +11 -0
- package/dist/src/webgl/KhronosTextureContainer.d.ts +25 -0
- package/dist/src/webgl/WebGLState.d.ts +285 -0
- package/dist/src/webgl/constants.d.ts +4 -0
- package/dist/src/webgl/glType.d.ts +8 -0
- package/dist/statistic.js +406 -0
- package/dist/statistic.js.map +1 -0
- package/dist/types/Camera.d.ts +12 -0
- package/dist/types/Canvas.d.ts +12 -0
- package/dist/types/GPUBuffer.d.ts +54 -0
- package/dist/types/GPUCapability.d.ts +50 -0
- package/dist/types/Geometry.d.ts +142 -0
- package/dist/types/IGPURenderer.d.ts +14 -0
- package/dist/types/Material.d.ts +156 -0
- package/dist/types/Mesh.d.ts +50 -0
- package/dist/types/RenderFrame.d.ts +50 -0
- package/dist/types/RenderPass.d.ts +156 -0
- package/dist/types/Renderer.d.ts +52 -0
- package/dist/types/Scene.d.ts +48 -0
- package/dist/types/ShaderLibrary.d.ts +78 -0
- package/dist/types/Texture.d.ts +212 -0
- package/dist/types/constants.d.ts +6 -0
- package/dist/types/index.d.ts +26 -0
- package/dist/types/type.d.ts +37 -0
- package/package.json +54 -0
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
import type { GPUBuffer } from './GPUBuffer';
|
|
2
|
+
import type { IGPUResource, IGPURenderer } from './IGPURenderer';
|
|
3
|
+
import type { Immutable, TypedArray } from './type';
|
|
4
|
+
import type { GPURenderer } from './Renderer';
|
|
5
|
+
/**
|
|
6
|
+
* Attribute binding information,
|
|
7
|
+
* size:attribute size. the size attribute of vec4|vec3|vec2 is 4|3|2
|
|
8
|
+
* stride:used for interleaved attributes, 2 vec4 stride is 4 * 2 * Float32Array.BYTES_PER_ELEMENTS
|
|
9
|
+
* offset: offset for interleaved attributes, 1 vec4 offset is 4 * Float32Array.BYTES_PER_ELEMENTS
|
|
10
|
+
* normalize: attributed should be normalized
|
|
11
|
+
* Attribute的绑定信息
|
|
12
|
+
* size:向量的大小,vec4|vec3|vec2的大小分别为 4|3|2
|
|
13
|
+
* stride:如果使用交错存储顶点,2个vec4的stride为 2 * 4 * Float32Array.BYTES_PER_ELEMENTS
|
|
14
|
+
* offset:交错顶点的数据偏移,1个vec4的偏移为 4*Float32Array.BYTES_PER_ELEMENTS
|
|
15
|
+
*/
|
|
16
|
+
export interface AttributeBase {
|
|
17
|
+
size: number;
|
|
18
|
+
stride?: number;
|
|
19
|
+
offset?: number;
|
|
20
|
+
instanceDivisor?: number;
|
|
21
|
+
normalize?: boolean;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* if data provided, type can be inferred from its data
|
|
25
|
+
* if data not provided, type will be FLOAT by default
|
|
26
|
+
* releasable is false by default,
|
|
27
|
+
* if releasable set true, geometry.getAttributeData will return null after data send to gpu buffer
|
|
28
|
+
* 如果有data字段,type会根据数据进行推断
|
|
29
|
+
* 如果没有data字段,type默认为FLOAT
|
|
30
|
+
* releasable默认为false,如果为true,在数据被提交到gpu buffer后geometry.getAttributeData方法返回null
|
|
31
|
+
*/
|
|
32
|
+
export interface AttributeWithData extends AttributeBase {
|
|
33
|
+
data?: TypedArray;
|
|
34
|
+
releasable?: boolean;
|
|
35
|
+
type?: WebGLRenderingContext['FLOAT'] | WebGLRenderingContext['INT'] | WebGLRenderingContext['SHORT'];
|
|
36
|
+
}
|
|
37
|
+
export interface AttributeWithType extends AttributeBase {
|
|
38
|
+
/**
|
|
39
|
+
* 如果使用interleaved attribute,此字段表示数据共享的attribute
|
|
40
|
+
*/
|
|
41
|
+
dataSource: string;
|
|
42
|
+
type: WebGLRenderingContext['FLOAT'] | WebGLRenderingContext['INT'] | WebGLRenderingContext['SHORT'];
|
|
43
|
+
}
|
|
44
|
+
export interface AttributeWithDataSource extends AttributeBase {
|
|
45
|
+
/**
|
|
46
|
+
* 如果使用interleaved attribute,此字段表示数据共享的attribute
|
|
47
|
+
*/
|
|
48
|
+
dataSource: string;
|
|
49
|
+
/**
|
|
50
|
+
* use FLOAT by default
|
|
51
|
+
*/
|
|
52
|
+
type?: WebGLRenderingContext['FLOAT'] | WebGLRenderingContext['INT'] | WebGLRenderingContext['SHORT'];
|
|
53
|
+
}
|
|
54
|
+
export type Attribute = AttributeWithData | AttributeWithType | AttributeWithDataSource;
|
|
55
|
+
export type GeometryDrawMode = WebGLRenderingContext['POINTS'] | WebGLRenderingContext['TRIANGLES'] | WebGLRenderingContext['TRIANGLE_STRIP'] | WebGLRenderingContext['TRIANGLE_FAN'] | WebGLRenderingContext['LINES'] | WebGLRenderingContext['LINE_STRIP'] | WebGLRenderingContext['LINE_LOOP'];
|
|
56
|
+
export interface GeometryOptions {
|
|
57
|
+
name?: string;
|
|
58
|
+
attributes: {
|
|
59
|
+
[key: string]: Attribute;
|
|
60
|
+
};
|
|
61
|
+
index?: {
|
|
62
|
+
data: Uint8Array | Uint16Array | Uint32Array;
|
|
63
|
+
releasable?: boolean;
|
|
64
|
+
};
|
|
65
|
+
mode?: GeometryDrawMode;
|
|
66
|
+
drawCount?: number;
|
|
67
|
+
drawStart?: number;
|
|
68
|
+
instanceCount?: number;
|
|
69
|
+
TransformFeedbackTarget?: TransformFeedbackTarget;
|
|
70
|
+
bufferUsage?: GLenum;
|
|
71
|
+
}
|
|
72
|
+
type TransformFeedbackTarget = {
|
|
73
|
+
[key: string]: number;
|
|
74
|
+
};
|
|
75
|
+
export declare class Geometry implements IGPUResource {
|
|
76
|
+
readonly renderer?: IGPURenderer;
|
|
77
|
+
/**
|
|
78
|
+
* 集合体的attribute信息,只读
|
|
79
|
+
*/
|
|
80
|
+
readonly attributes?: Immutable<{
|
|
81
|
+
[key: string]: Attribute;
|
|
82
|
+
}>;
|
|
83
|
+
readonly isDestroyed: boolean;
|
|
84
|
+
readonly options?: Immutable<GeometryOptions>;
|
|
85
|
+
drawStart: number;
|
|
86
|
+
drawCount: number;
|
|
87
|
+
mode: number;
|
|
88
|
+
constructor(options: GeometryOptions, renderer?: IGPURenderer);
|
|
89
|
+
assignRenderer(renderer: GPURenderer): Geometry;
|
|
90
|
+
destroy(): void;
|
|
91
|
+
setAttributeBuffer(name: string, buffer: GPUBuffer): void;
|
|
92
|
+
getAttributeBuffer(name: string): GPUBuffer | undefined;
|
|
93
|
+
/**
|
|
94
|
+
* Attribute的实际数据尺寸,如果没有配置stride,则通过attribute size和attribute数据类型进行计算
|
|
95
|
+
* @param name
|
|
96
|
+
*/
|
|
97
|
+
getAttributeStride(name: string): number;
|
|
98
|
+
setAttributeData(name: string, data: TypedArray): void;
|
|
99
|
+
getAttributeData(name: string): TypedArray | undefined;
|
|
100
|
+
setAttributeSubData(name: string, offset: number, data: TypedArray): void;
|
|
101
|
+
getIndexData(): Uint8Array | Uint16Array | Uint32Array | undefined;
|
|
102
|
+
setIndexData(data: Uint8Array | Uint16Array | Uint32Array | undefined): void;
|
|
103
|
+
setIndexSubData(offset: number, data: TypedArray): void;
|
|
104
|
+
/**
|
|
105
|
+
* 获取Attribute的数据内存长度
|
|
106
|
+
* 如果此Attribute设置了其他dataSource则返回 0
|
|
107
|
+
* 无论是否设置了attribute releasable,此函数总是返回实际数据长度
|
|
108
|
+
* //todo liyaohui.lyh@antgroup.com
|
|
109
|
+
* @param name
|
|
110
|
+
*/
|
|
111
|
+
getAttributeDataLength(name: string): number;
|
|
112
|
+
getAttributeNames(): string[];
|
|
113
|
+
/**
|
|
114
|
+
* 数据写入的指令被缓存到JS中,在调用此函数后,所有JS数据指令开始调用对应的GPU函数
|
|
115
|
+
* 如果geometry对象没有进行GPU对象绑定,此函数不会成功
|
|
116
|
+
*/
|
|
117
|
+
flush(): boolean;
|
|
118
|
+
}
|
|
119
|
+
export interface SharedGeometryOptions {
|
|
120
|
+
name?: string;
|
|
121
|
+
drawStart?: number;
|
|
122
|
+
drawCount?: number;
|
|
123
|
+
mode?: number;
|
|
124
|
+
index?: {
|
|
125
|
+
data: Uint8Array | Uint16Array | Uint32Array;
|
|
126
|
+
releasable?: boolean;
|
|
127
|
+
};
|
|
128
|
+
geometry: Geometry;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* 重用Geometry的vao对象,可以进行indexBuffer的修改
|
|
132
|
+
*/
|
|
133
|
+
export declare class SharedGeometry extends Geometry {
|
|
134
|
+
/**
|
|
135
|
+
* clone geometry with same gpu buffers,
|
|
136
|
+
* if geometry renderer not assigned,this method returns void
|
|
137
|
+
* @param options
|
|
138
|
+
* @param renderer
|
|
139
|
+
*/
|
|
140
|
+
constructor(options: SharedGeometryOptions, renderer?: IGPURenderer);
|
|
141
|
+
}
|
|
142
|
+
export {};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface IGPURenderer {
|
|
2
|
+
readonly width: number;
|
|
3
|
+
readonly height: number;
|
|
4
|
+
}
|
|
5
|
+
export interface IGPUResource {
|
|
6
|
+
/**
|
|
7
|
+
* 大部分的JS数据对象创建不依赖于GPU接口,数据被存储在JS对象中,
|
|
8
|
+
* 当接收到GPU接口时,创建对应的GPU对象
|
|
9
|
+
*/
|
|
10
|
+
readonly renderer?: IGPURenderer;
|
|
11
|
+
readonly isDestroyed: boolean;
|
|
12
|
+
assignRenderer(renderer: IGPURenderer): IGPUResource;
|
|
13
|
+
destroy(): void;
|
|
14
|
+
}
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import type { Texture } from './Texture';
|
|
2
|
+
import type { ShaderUseCacheId, ShaderWithSource } from './ShaderLibrary';
|
|
3
|
+
import type { IGPUResource, IGPURenderer } from './IGPURenderer';
|
|
4
|
+
import type { Immutable, TypedArray } from './type';
|
|
5
|
+
import type { GPURenderer } from './Renderer';
|
|
6
|
+
import type { DestroyOptions } from './constants';
|
|
7
|
+
export type UniformSemantic = 'VIEW' | 'MODEL' | 'MODELVIEW' | 'PROJECTION' | 'VIEWPROJECTION' | 'MODELVIEWPROJECTION' | string;
|
|
8
|
+
export interface MaterialRenderStates {
|
|
9
|
+
sampleAlphaToCoverage?: boolean;
|
|
10
|
+
blending?: boolean;
|
|
11
|
+
blendEquationRGB?: number;
|
|
12
|
+
blendEquationAlpha?: number;
|
|
13
|
+
blendDstAlpha?: number;
|
|
14
|
+
blendSrcAlpha?: number;
|
|
15
|
+
blendSrc?: number;
|
|
16
|
+
blendDst?: number;
|
|
17
|
+
/**
|
|
18
|
+
* The blend color is a state value,
|
|
19
|
+
* like the blend equations and blend parameters. Therefore,
|
|
20
|
+
* it cannot change within a single draw call;
|
|
21
|
+
* fragment shaders cannot write to, modify,
|
|
22
|
+
* or even access the blend color.
|
|
23
|
+
* All buffers share the same blend color.
|
|
24
|
+
*/
|
|
25
|
+
blendColor?: [r: number, g: number, b: number, a: number];
|
|
26
|
+
colorMask?: [r: boolean, g: boolean, b: boolean, a: boolean];
|
|
27
|
+
depthTest?: boolean;
|
|
28
|
+
depthMask?: boolean;
|
|
29
|
+
depthFunc?: number;
|
|
30
|
+
depthRange?: [zNear: number, zFar: number];
|
|
31
|
+
cullFace?: number;
|
|
32
|
+
cullFaceEnabled?: boolean;
|
|
33
|
+
frontFace?: number;
|
|
34
|
+
stencilTest?: boolean;
|
|
35
|
+
stencilMask?: number;
|
|
36
|
+
stencilMaskBack?: number;
|
|
37
|
+
stencilMaskFront?: number;
|
|
38
|
+
stencilFunc?: [func: GLenum, ref: GLint, mask: GLuint];
|
|
39
|
+
stencilFuncBack?: [func: GLenum, ref: GLint, mask: GLuint];
|
|
40
|
+
stencilFuncFront?: [func: GLenum, ref: GLint, mask: GLuint];
|
|
41
|
+
stencilOp?: [fail: GLenum, zfail: GLenum, zpass: GLenum];
|
|
42
|
+
stencilOpBack?: [fail: GLenum, zfail: GLenum, zpass: GLenum];
|
|
43
|
+
stencilOpFront?: [fail: GLenum, zfail: GLenum, zpass: GLenum];
|
|
44
|
+
polygonOffset?: [factor: number, units: number];
|
|
45
|
+
polygonOffsetFill?: boolean;
|
|
46
|
+
}
|
|
47
|
+
export declare const enum MaterialRenderType {
|
|
48
|
+
normal = 0,
|
|
49
|
+
transformFeedback = 1
|
|
50
|
+
}
|
|
51
|
+
export interface MaterialOptions {
|
|
52
|
+
states: MaterialRenderStates;
|
|
53
|
+
shader: ShaderWithSource | ShaderUseCacheId;
|
|
54
|
+
name?: string;
|
|
55
|
+
dataBlocks?: MaterialDataBlockOptions[];
|
|
56
|
+
uniformSemantics?: {
|
|
57
|
+
[key: string]: UniformSemantic;
|
|
58
|
+
};
|
|
59
|
+
renderType?: MaterialRenderType;
|
|
60
|
+
uniformValues?: {
|
|
61
|
+
[key: string]: UniformValue;
|
|
62
|
+
};
|
|
63
|
+
transformFeedbackOutput?: {
|
|
64
|
+
mode: WebGL2RenderingContext['INTERLEAVED_ATTRIBS'] | WebGL2RenderingContext['SEPARATE_ATTRIBS'];
|
|
65
|
+
varyings: string[];
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* @example
|
|
70
|
+
* const mtl0 = new Material({
|
|
71
|
+
* shader:{
|
|
72
|
+
* fragment:'...',
|
|
73
|
+
* vertex:'...',
|
|
74
|
+
* shaderCacheId:'mtl_01'
|
|
75
|
+
* }});
|
|
76
|
+
* console.log(mtl.shaderCacheId) // expect to be a none empty string
|
|
77
|
+
*/
|
|
78
|
+
/**
|
|
79
|
+
* @example
|
|
80
|
+
* const mtl0 = new Material({
|
|
81
|
+
* shader:{
|
|
82
|
+
* fragment:'...',
|
|
83
|
+
* vertex:'...',
|
|
84
|
+
* cacheId:'mtl_01'
|
|
85
|
+
* }});
|
|
86
|
+
*
|
|
87
|
+
* const mtl2 = new Material({
|
|
88
|
+
* shader:{
|
|
89
|
+
* cacheId:'mtl_01'
|
|
90
|
+
* }
|
|
91
|
+
* });
|
|
92
|
+
* mtl2 use the same program with mtl0
|
|
93
|
+
*/
|
|
94
|
+
export type UniformValueDataType = TypedArray | number | number[] | Texture | Texture[] | number[][];
|
|
95
|
+
export type UniformValue = UniformValueDataType | UniformStruct | UniformStruct[];
|
|
96
|
+
export type UniformStruct = {
|
|
97
|
+
[key: string]: UniformValueDataType;
|
|
98
|
+
};
|
|
99
|
+
export interface MaterialDestroyOptions {
|
|
100
|
+
textures?: DestroyOptions;
|
|
101
|
+
blocks?: DestroyOptions;
|
|
102
|
+
}
|
|
103
|
+
export declare class Material implements IGPUResource {
|
|
104
|
+
readonly renderer?: IGPURenderer;
|
|
105
|
+
readonly name: string;
|
|
106
|
+
readonly defaultDataBlock: MaterialDataBlock;
|
|
107
|
+
readonly dataBlocks: MaterialDataBlock[];
|
|
108
|
+
readonly options: Immutable<MaterialOptions>;
|
|
109
|
+
readonly shaderCacheId: string;
|
|
110
|
+
readonly states: Immutable<MaterialRenderStates>;
|
|
111
|
+
readonly renderType: MaterialRenderType;
|
|
112
|
+
readonly isDestroyed: boolean;
|
|
113
|
+
constructor(options: MaterialOptions);
|
|
114
|
+
addDataBlock(b: MaterialDataBlock): void;
|
|
115
|
+
removeDataBlock(b: MaterialDataBlock): void;
|
|
116
|
+
destroy(options?: MaterialDestroyOptions): void;
|
|
117
|
+
setUniformSemantic(uniformName: string, semantic: string | undefined): void;
|
|
118
|
+
assignRenderer(renderer: GPURenderer): Material;
|
|
119
|
+
}
|
|
120
|
+
export interface MaterialDataBlockOptions {
|
|
121
|
+
uniformValues?: {
|
|
122
|
+
[key: string]: UniformValue;
|
|
123
|
+
};
|
|
124
|
+
name?: string;
|
|
125
|
+
}
|
|
126
|
+
export interface MaterialDataBlockDestroyOptions {
|
|
127
|
+
textures?: DestroyOptions;
|
|
128
|
+
}
|
|
129
|
+
export declare class MaterialDataBlock implements IGPUResource {
|
|
130
|
+
readonly renderer?: IGPURenderer;
|
|
131
|
+
readonly isDestroyed: boolean;
|
|
132
|
+
readonly name: string;
|
|
133
|
+
constructor(options: MaterialDataBlockOptions);
|
|
134
|
+
hasUniformValue(name: string): boolean;
|
|
135
|
+
setUniformValue(name: string, value: UniformValue): boolean;
|
|
136
|
+
getUniformValue(name: string): UniformValue;
|
|
137
|
+
getUniformValues(): {
|
|
138
|
+
[key: string]: UniformValue;
|
|
139
|
+
};
|
|
140
|
+
setUniformValues(map: {
|
|
141
|
+
[key: string]: UniformValue;
|
|
142
|
+
}): void;
|
|
143
|
+
/**
|
|
144
|
+
* indicate uniform data should be resent to GPU, but not the full range,
|
|
145
|
+
* only works for ubo,if not an ubo, this method has no side effect
|
|
146
|
+
* offset and count are counted by typed entry, not the number elements
|
|
147
|
+
* entry means matrix or vector in shader
|
|
148
|
+
* @param name uniform name
|
|
149
|
+
* @param offset entry offset,first entry to send to gpu, default 0
|
|
150
|
+
* @param count entry count,entry count to send to gpu,default to end
|
|
151
|
+
*/
|
|
152
|
+
updateUniformSubData(name: string, offset: number, count: number): void;
|
|
153
|
+
destroy(options?: MaterialDataBlockDestroyOptions): void;
|
|
154
|
+
assignRenderer(renderer: GPURenderer): MaterialDataBlock;
|
|
155
|
+
clone(name: string): MaterialDataBlock;
|
|
156
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { Material, MaterialDestroyOptions, MaterialOptions } from './Material';
|
|
2
|
+
import type { Geometry, GeometryOptions } from './Geometry';
|
|
3
|
+
import type { IGPUResource, IGPURenderer } from './IGPURenderer';
|
|
4
|
+
import type { GPURenderer } from './Renderer';
|
|
5
|
+
import type { mat4 } from './type';
|
|
6
|
+
import type { DestroyOptions } from './constants';
|
|
7
|
+
interface MeshOptionsBase {
|
|
8
|
+
material: Material | MaterialOptions;
|
|
9
|
+
name?: string;
|
|
10
|
+
worldMatrix?: mat4 | Float32Array;
|
|
11
|
+
priority?: number;
|
|
12
|
+
}
|
|
13
|
+
export interface GeometryMeshOptions extends MeshOptionsBase {
|
|
14
|
+
geometry: Geometry | GeometryOptions;
|
|
15
|
+
}
|
|
16
|
+
export interface GeometriesMeshOptions extends MeshOptionsBase {
|
|
17
|
+
geometries: Array<Geometry | GeometryOptions>;
|
|
18
|
+
}
|
|
19
|
+
export type MeshOptions = GeometryMeshOptions | GeometriesMeshOptions;
|
|
20
|
+
export type MeshDestroyOptions = {
|
|
21
|
+
geometries?: DestroyOptions;
|
|
22
|
+
material?: MaterialDestroyOptions | DestroyOptions.keep;
|
|
23
|
+
};
|
|
24
|
+
export declare class Mesh implements IGPUResource {
|
|
25
|
+
readonly renderer?: IGPURenderer;
|
|
26
|
+
readonly isDestroyed: boolean;
|
|
27
|
+
readonly name: string;
|
|
28
|
+
readonly geometries: Geometry[];
|
|
29
|
+
readonly geometry?: Geometry;
|
|
30
|
+
readonly material: Material;
|
|
31
|
+
worldMatrix: mat4 | Float32Array;
|
|
32
|
+
hide: boolean;
|
|
33
|
+
priority: number;
|
|
34
|
+
constructor(options: MeshOptions, renderer?: IGPURenderer);
|
|
35
|
+
/**
|
|
36
|
+
* update geometries
|
|
37
|
+
* @param geos geometries to update
|
|
38
|
+
* @param destroyGeometries whether to destroy previous geometries,default is true
|
|
39
|
+
*/
|
|
40
|
+
setGeometries(geos: Geometry[], destroyGeometries?: DestroyOptions): void;
|
|
41
|
+
/**
|
|
42
|
+
* update material
|
|
43
|
+
* @param mtl material to update
|
|
44
|
+
* @param destroyMtl whether to destroy previous material, set true equals MaterialDestroyOptions { all:true }
|
|
45
|
+
*/
|
|
46
|
+
setMaterial(mtl: Material | MaterialOptions, destroyMtl?: MaterialDestroyOptions | DestroyOptions.keep): void;
|
|
47
|
+
destroy(options?: MeshDestroyOptions): void;
|
|
48
|
+
assignRenderer(renderer: GPURenderer): Mesh;
|
|
49
|
+
}
|
|
50
|
+
export {};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { UniformValue } from './Material';
|
|
2
|
+
import type { RenderPass, RenderPassClearAction, RenderPassDestroyOptions, SemanticMap } from './RenderPass';
|
|
3
|
+
import type { Camera } from './Camera';
|
|
4
|
+
import type { Mesh } from './Mesh';
|
|
5
|
+
import type { GPUBuffer } from './GPUBuffer';
|
|
6
|
+
import type { vec4 } from './type';
|
|
7
|
+
import type { GPURenderer } from './index';
|
|
8
|
+
import type { IGPURenderer, IGPUResource } from './IGPURenderer';
|
|
9
|
+
import type { DestroyOptions } from './constants';
|
|
10
|
+
export interface RenderState {
|
|
11
|
+
currentCamera: Camera;
|
|
12
|
+
currentMesh: Mesh;
|
|
13
|
+
currentFrame: RenderFrame;
|
|
14
|
+
currentPass: RenderPass;
|
|
15
|
+
}
|
|
16
|
+
export interface RenderFrameOptions {
|
|
17
|
+
renderPasses?: RenderPass[];
|
|
18
|
+
viewport?: vec4;
|
|
19
|
+
semantics?: {
|
|
20
|
+
[key: string]: UniformValue | SemanticFunc | GPUBuffer;
|
|
21
|
+
};
|
|
22
|
+
clearAction?: RenderPassClearAction;
|
|
23
|
+
name?: string;
|
|
24
|
+
}
|
|
25
|
+
export type SemanticFunc = (state: RenderState) => UniformValue | GPUBuffer | null | undefined;
|
|
26
|
+
export type RenderFrameDestroyOptions = {
|
|
27
|
+
passes?: RenderPassDestroyOptions | DestroyOptions.keep;
|
|
28
|
+
semantics?: DestroyOptions;
|
|
29
|
+
};
|
|
30
|
+
export declare class RenderFrame implements IGPUResource {
|
|
31
|
+
clearAction: RenderPassClearAction;
|
|
32
|
+
constructor(options: RenderFrameOptions, renderer?: GPURenderer);
|
|
33
|
+
readonly renderPasses: RenderPass[];
|
|
34
|
+
readonly viewport?: vec4;
|
|
35
|
+
readonly semantics: SemanticMap;
|
|
36
|
+
readonly renderer?: IGPURenderer;
|
|
37
|
+
readonly isDestroyed: boolean;
|
|
38
|
+
setRenderPasses(passes: RenderPass[]): void;
|
|
39
|
+
addRenderPass(pass: RenderPass): void;
|
|
40
|
+
removeRenderPass(pass: RenderPass): void;
|
|
41
|
+
render(): void;
|
|
42
|
+
destroy(options?: RenderFrameDestroyOptions): void;
|
|
43
|
+
assignRenderer(renderer: IGPURenderer): RenderFrame;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* RenderFrame 渲染顺序如下:
|
|
47
|
+
* 1. renderFrame 按照priority由底到高渲染renderPass,renderPass如果有设置attachments,则会创建frameBuffer对象
|
|
48
|
+
* 2. 每个renderPass渲染时,按照meshes数组顺序进行渲染,renderPass可以制定meshes数组的排序方式,对每个mesh的priority进行排序
|
|
49
|
+
* 3. 遍历Mesh时会将其Material中的Shader添加至shaderLibrary,再调用render之前,将所有shader进行编译
|
|
50
|
+
*/
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import type { Texture, TextureConfigOptions, TextureFormatOptions } from './Texture';
|
|
2
|
+
import type { Camera } from './Camera';
|
|
3
|
+
import type { Mesh, MeshDestroyOptions } from './Mesh';
|
|
4
|
+
import type { vec4 } from './type';
|
|
5
|
+
import type { IGPURenderer, IGPUResource } from './IGPURenderer';
|
|
6
|
+
import type { GPURenderer } from './Renderer';
|
|
7
|
+
import type { UniformValue } from './Material';
|
|
8
|
+
import type { GPUBuffer } from './GPUBuffer';
|
|
9
|
+
import type { RenderState, SemanticFunc } from './RenderFrame';
|
|
10
|
+
import type { DestroyOptions } from './constants';
|
|
11
|
+
export declare enum RenderPassDestroyAttachmentType {
|
|
12
|
+
force = 0,
|
|
13
|
+
keep = 1,
|
|
14
|
+
keepExternal = 2,
|
|
15
|
+
destroy = 0
|
|
16
|
+
}
|
|
17
|
+
export declare const RenderPassPriorityPrepare = 0;
|
|
18
|
+
export declare const RenderPassPriorityNormal = 1000;
|
|
19
|
+
export declare const RenderPassPriorityPostprocess = 3000;
|
|
20
|
+
export declare enum TextureLoadAction {
|
|
21
|
+
whatever = 0,
|
|
22
|
+
clear = 2
|
|
23
|
+
}
|
|
24
|
+
export declare enum TextureStoreAction {
|
|
25
|
+
store = 0,
|
|
26
|
+
clear = 2
|
|
27
|
+
}
|
|
28
|
+
export declare enum RenderPassAttachmentStorageType {
|
|
29
|
+
none = 0,
|
|
30
|
+
color = 1,
|
|
31
|
+
stencil_8_opaque = 2,
|
|
32
|
+
depth_16_opaque = 3,
|
|
33
|
+
depth_stencil_opaque = 4,
|
|
34
|
+
depth_16_texture = 5,
|
|
35
|
+
depth_24_stencil_8_texture = 6
|
|
36
|
+
}
|
|
37
|
+
export interface RenderPassStorageObject {
|
|
38
|
+
readonly attachment: GLenum;
|
|
39
|
+
readonly format: GLenum;
|
|
40
|
+
readonly size: [width: number, height: number];
|
|
41
|
+
readonly storageType: RenderPassAttachmentStorageType;
|
|
42
|
+
readonly multiSample: number;
|
|
43
|
+
}
|
|
44
|
+
export interface RenderPassColorAttachmentTextureOptions extends TextureFormatOptions, TextureConfigOptions {
|
|
45
|
+
}
|
|
46
|
+
export interface RenderPassColorAttachmentOptions {
|
|
47
|
+
texture?: Texture | RenderPassColorAttachmentTextureOptions;
|
|
48
|
+
storage?: RenderPassStorageObject;
|
|
49
|
+
multiSample?: number;
|
|
50
|
+
}
|
|
51
|
+
export interface RenderPassColorAttachment {
|
|
52
|
+
readonly storageType: RenderPassAttachmentStorageType;
|
|
53
|
+
readonly texture: Texture;
|
|
54
|
+
readonly isDestroyed: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface RenderPassDepthStencilAttachment {
|
|
57
|
+
readonly storageType: RenderPassAttachmentStorageType;
|
|
58
|
+
readonly texture?: Texture;
|
|
59
|
+
readonly storage: RenderPassStorageObject;
|
|
60
|
+
}
|
|
61
|
+
export interface RenderPassDepthStencilAttachmentOptions {
|
|
62
|
+
storageType: RenderPassAttachmentStorageType;
|
|
63
|
+
storage?: RenderPassStorageObject;
|
|
64
|
+
texture?: Texture;
|
|
65
|
+
}
|
|
66
|
+
export interface RenderPassStoreAction {
|
|
67
|
+
depthAction?: TextureStoreAction;
|
|
68
|
+
stencilAction?: TextureStoreAction;
|
|
69
|
+
colorAction?: TextureStoreAction;
|
|
70
|
+
}
|
|
71
|
+
export interface RenderPassClearAction {
|
|
72
|
+
clearColor?: vec4;
|
|
73
|
+
colorAction?: TextureLoadAction;
|
|
74
|
+
clearDepth?: number;
|
|
75
|
+
depthAction?: TextureLoadAction;
|
|
76
|
+
clearStencil?: number;
|
|
77
|
+
stencilAction?: TextureLoadAction;
|
|
78
|
+
}
|
|
79
|
+
export interface RenderPassAttachmentOptions {
|
|
80
|
+
attachments?: RenderPassColorAttachmentOptions[];
|
|
81
|
+
depthStencilAttachment?: RenderPassDepthStencilAttachmentOptions;
|
|
82
|
+
viewport?: [x: number, y: number, width: number, height: number];
|
|
83
|
+
viewportScale?: number;
|
|
84
|
+
}
|
|
85
|
+
export type SemanticGetter = UniformValue | SemanticFunc | GPUBuffer;
|
|
86
|
+
export interface RenderPassOptions extends RenderPassAttachmentOptions {
|
|
87
|
+
name?: string;
|
|
88
|
+
meshes?: Mesh[];
|
|
89
|
+
camera?: Camera;
|
|
90
|
+
priority?: number;
|
|
91
|
+
meshOrder?: RenderPassMeshOrder;
|
|
92
|
+
clearAction?: RenderPassClearAction;
|
|
93
|
+
storeAction?: RenderPassStoreAction;
|
|
94
|
+
semantics?: {
|
|
95
|
+
[key: string]: SemanticGetter;
|
|
96
|
+
};
|
|
97
|
+
delegate?: RenderPassDelegate;
|
|
98
|
+
}
|
|
99
|
+
export declare enum RenderPassMeshOrder {
|
|
100
|
+
none = 1,
|
|
101
|
+
ascending = 2,
|
|
102
|
+
descending = 3
|
|
103
|
+
}
|
|
104
|
+
export type RenderPassDestroyOptions = {
|
|
105
|
+
meshes?: MeshDestroyOptions | DestroyOptions.keep;
|
|
106
|
+
depthStencilAttachment?: RenderPassDestroyAttachmentType;
|
|
107
|
+
colorAttachment?: RenderPassDestroyAttachmentType;
|
|
108
|
+
semantics?: DestroyOptions;
|
|
109
|
+
};
|
|
110
|
+
export declare class SemanticMap {
|
|
111
|
+
constructor(options?: {
|
|
112
|
+
[key: string]: SemanticGetter;
|
|
113
|
+
});
|
|
114
|
+
setSemantic(name: string, value: SemanticGetter | undefined): void;
|
|
115
|
+
getSemanticValue(name: string, state: RenderState): UniformValue | GPUBuffer | null | undefined;
|
|
116
|
+
hasSemanticValue(name: string): boolean;
|
|
117
|
+
toObject(): Record<string, SemanticGetter>;
|
|
118
|
+
destroy(): void;
|
|
119
|
+
}
|
|
120
|
+
export interface RenderPassDelegate {
|
|
121
|
+
willBeginRenderPass?: (renderPass: RenderPass, state: RenderState) => void;
|
|
122
|
+
didEndRenderPass?: (renderPass: RenderPass, state: RenderState) => void;
|
|
123
|
+
willRenderMesh?: (mesh: Mesh, state: RenderState) => void;
|
|
124
|
+
didiRenderMesh?: (mesh: Mesh, state: RenderState) => void;
|
|
125
|
+
}
|
|
126
|
+
export declare class RenderPass implements IGPUResource {
|
|
127
|
+
readonly isDestroyed: boolean;
|
|
128
|
+
readonly name: string;
|
|
129
|
+
readonly priority: number;
|
|
130
|
+
readonly attachments: RenderPassColorAttachment[];
|
|
131
|
+
readonly depthAttachment?: RenderPassDepthStencilAttachment;
|
|
132
|
+
readonly stencilAttachment?: RenderPassDepthStencilAttachment;
|
|
133
|
+
readonly viewport: [x: number, y: number, width: number, height: number];
|
|
134
|
+
readonly camera: Camera;
|
|
135
|
+
readonly meshes: Mesh[];
|
|
136
|
+
readonly renderer?: IGPURenderer;
|
|
137
|
+
readonly semantics: SemanticMap;
|
|
138
|
+
readonly storeAction: RenderPassStoreAction;
|
|
139
|
+
readonly clearAction: RenderPassClearAction;
|
|
140
|
+
delegate: RenderPassDelegate;
|
|
141
|
+
meshOrder: RenderPassMeshOrder;
|
|
142
|
+
constructor(options: RenderPassOptions, renderer?: IGPURenderer);
|
|
143
|
+
/**
|
|
144
|
+
* reset color/depth_stencil attachments,
|
|
145
|
+
* if color/depth_stencil texture is external, this will not destroy textures
|
|
146
|
+
* if color/depth_stencil texture is internal created, this will also delete those textures
|
|
147
|
+
* this method will delete previous fbo if exists
|
|
148
|
+
* returns previous options
|
|
149
|
+
**/
|
|
150
|
+
resetAttachments(options: RenderPassAttachmentOptions): RenderPassAttachmentOptions;
|
|
151
|
+
setMeshes(meshes: Mesh[]): Mesh[];
|
|
152
|
+
addMesh(mesh: Mesh): void;
|
|
153
|
+
removeMesh(mesh: Mesh): void;
|
|
154
|
+
destroy(options?: RenderPassDestroyOptions): void;
|
|
155
|
+
assignRenderer(renderer: GPURenderer): RenderPass;
|
|
156
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import type { RenderFrame, RenderFrameOptions } from './RenderFrame';
|
|
2
|
+
import type { ShaderLibrary } from './ShaderLibrary';
|
|
3
|
+
import type { GPUCapability } from './GPUCapability';
|
|
4
|
+
import type { GPUBuffer, GPUBufferOptions } from './GPUBuffer';
|
|
5
|
+
import type { IGPURenderer } from './IGPURenderer';
|
|
6
|
+
import type { Canvas } from './Canvas';
|
|
7
|
+
import type { Texture } from './Texture';
|
|
8
|
+
import type { RenderPass } from './RenderPass';
|
|
9
|
+
export { Camera, CameraOptions } from './Camera';
|
|
10
|
+
export interface RendererOptions {
|
|
11
|
+
gl?: WebGLRenderingContext | WebGL2RenderingContext;
|
|
12
|
+
canvas?: HTMLCanvasElement;
|
|
13
|
+
frameworks?: Array<'webgl' | 'webgl2'>;
|
|
14
|
+
willCaptureImage?: boolean;
|
|
15
|
+
premultiplyAlpha?: boolean;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 常用的GPU方法,不是规范必须实现的
|
|
19
|
+
*/
|
|
20
|
+
export interface RendererExtensions {
|
|
21
|
+
copyTexture?: (source: Texture, tex: Texture) => void;
|
|
22
|
+
resetColorAttachments?: (rp: RenderPass, colorAttachments: Texture[]) => void;
|
|
23
|
+
}
|
|
24
|
+
export declare class GPURenderer implements IGPURenderer {
|
|
25
|
+
readonly height: number;
|
|
26
|
+
readonly width: number;
|
|
27
|
+
/**
|
|
28
|
+
* if webgl not support, gpu.level will be 0
|
|
29
|
+
*/
|
|
30
|
+
readonly shaderLibrary: ShaderLibrary;
|
|
31
|
+
readonly gpu: GPUCapability;
|
|
32
|
+
readonly canvas: Canvas;
|
|
33
|
+
readonly extension: RendererExtensions;
|
|
34
|
+
readonly isDestroyed: boolean;
|
|
35
|
+
constructor(options: RendererOptions);
|
|
36
|
+
createRenderFrame(options?: RenderFrameOptions): RenderFrame;
|
|
37
|
+
createBuffer(options: GPUBufferOptions): GPUBuffer;
|
|
38
|
+
/**
|
|
39
|
+
* only resize when width or height is different from now,
|
|
40
|
+
* when resized,all full-screen renderPasses attached to this renderer should be resized as well
|
|
41
|
+
* 只有当宽高不同的时候,才实际进行函数
|
|
42
|
+
* 当重新调整宽高后,这个renderer创建的renderPasses,如果没有被指定 viewport(全屏),那么需要resize 所有的renderPass
|
|
43
|
+
* @param width
|
|
44
|
+
* @param height
|
|
45
|
+
*/
|
|
46
|
+
resize(width: number, height: number): void;
|
|
47
|
+
/**
|
|
48
|
+
* destroy all resources created by this renderer
|
|
49
|
+
* @param haltGL if true, this method will call webgl lose context extension which leads webgl absolutely halt
|
|
50
|
+
*/
|
|
51
|
+
destroy(haltGL?: boolean): void;
|
|
52
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Geometry, GeometryOptions } from './Geometry';
|
|
2
|
+
import type { Material, MaterialOptions, UniformValue } from './Material';
|
|
3
|
+
import type { Texture, TextureOptions } from './Texture';
|
|
4
|
+
import type { RenderPass, RenderPassOptions } from './RenderPass';
|
|
5
|
+
import type { Camera, CameraOptions } from './Camera';
|
|
6
|
+
import type { Mesh } from './Mesh';
|
|
7
|
+
type SceneNode = {
|
|
8
|
+
meshes: number[];
|
|
9
|
+
camera: number;
|
|
10
|
+
};
|
|
11
|
+
type SceneMaterial = MaterialOptions | {
|
|
12
|
+
extends: number;
|
|
13
|
+
vertexShader: string | number;
|
|
14
|
+
fragmentShader: string | number;
|
|
15
|
+
uniforms: {
|
|
16
|
+
[key: string]: UniformValue;
|
|
17
|
+
};
|
|
18
|
+
textures: {
|
|
19
|
+
[key: string]: number | number[];
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
type SceneMesh = {
|
|
23
|
+
name: string;
|
|
24
|
+
material: number;
|
|
25
|
+
geometries: number[];
|
|
26
|
+
};
|
|
27
|
+
type SceneRenderPass = RenderPassOptions | {
|
|
28
|
+
attachments: number[];
|
|
29
|
+
};
|
|
30
|
+
export interface SceneSchema {
|
|
31
|
+
texture: TextureOptions[];
|
|
32
|
+
geometries: GeometryOptions[];
|
|
33
|
+
materials: SceneMaterial[];
|
|
34
|
+
meshes: SceneMesh[];
|
|
35
|
+
nodes: SceneNode[];
|
|
36
|
+
renderPasses: SceneRenderPass[];
|
|
37
|
+
cameras: CameraOptions[];
|
|
38
|
+
shaders: string[];
|
|
39
|
+
}
|
|
40
|
+
export interface ParsedScene {
|
|
41
|
+
texture: Texture[];
|
|
42
|
+
geometries: Geometry[];
|
|
43
|
+
materials: Material[];
|
|
44
|
+
meshes: Mesh[];
|
|
45
|
+
renderPasses: RenderPass[];
|
|
46
|
+
cameras: Camera[];
|
|
47
|
+
}
|
|
48
|
+
export {};
|