@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.
Files changed (62) hide show
  1. package/dist/index.js +5545 -0
  2. package/dist/index.js.map +1 -0
  3. package/dist/index.mjs +5524 -0
  4. package/dist/index.mjs.map +1 -0
  5. package/dist/src/common/console.d.ts +3 -0
  6. package/dist/src/common/env.d.ts +1 -0
  7. package/dist/src/common/raf.d.ts +2 -0
  8. package/dist/src/common/request.d.ts +10 -0
  9. package/dist/src/common/utils.d.ts +14 -0
  10. package/dist/src/index.d.ts +17 -0
  11. package/dist/src/render/MarsExtWrap.d.ts +15 -0
  12. package/dist/src/render/MarsGPUCapability.d.ts +2 -0
  13. package/dist/src/render/MarsGeometry.d.ts +64 -0
  14. package/dist/src/render/MarsMaterial.d.ts +29 -0
  15. package/dist/src/render/MarsMaterialDataBlock.d.ts +37 -0
  16. package/dist/src/render/MarsMesh.d.ts +24 -0
  17. package/dist/src/render/MarsRenderFrame.d.ts +22 -0
  18. package/dist/src/render/MarsRenderPass.d.ts +51 -0
  19. package/dist/src/render/MarsRenderPassColorAttachment.d.ts +27 -0
  20. package/dist/src/render/MarsRenderer.d.ts +20 -0
  21. package/dist/src/render/MarsSemanticMap.d.ts +10 -0
  22. package/dist/src/render/MarsSharedGeometry.d.ts +13 -0
  23. package/dist/src/render/MarsTexture.d.ts +29 -0
  24. package/dist/src/render/MarsTextureFactory.d.ts +20 -0
  25. package/dist/src/render/RenderFrameInternal.d.ts +8 -0
  26. package/dist/src/statistic/index.d.ts +20 -0
  27. package/dist/src/webgl/GLFrameBuffer.d.ts +45 -0
  28. package/dist/src/webgl/GLGPUBuffer.d.ts +27 -0
  29. package/dist/src/webgl/GLGPUCapability.d.ts +32 -0
  30. package/dist/src/webgl/GLGPURenderer.d.ts +57 -0
  31. package/dist/src/webgl/GLGeometry.d.ts +52 -0
  32. package/dist/src/webgl/GLMaterial.d.ts +15 -0
  33. package/dist/src/webgl/GLProgram.d.ts +42 -0
  34. package/dist/src/webgl/GLRenderBuffer.d.ts +22 -0
  35. package/dist/src/webgl/GLShaderLibrary.d.ts +33 -0
  36. package/dist/src/webgl/GLTexture.d.ts +35 -0
  37. package/dist/src/webgl/GLUniformUtils.d.ts +42 -0
  38. package/dist/src/webgl/GLVertexArrayObject.d.ts +11 -0
  39. package/dist/src/webgl/KhronosTextureContainer.d.ts +25 -0
  40. package/dist/src/webgl/WebGLState.d.ts +285 -0
  41. package/dist/src/webgl/constants.d.ts +4 -0
  42. package/dist/src/webgl/glType.d.ts +8 -0
  43. package/dist/statistic.js +406 -0
  44. package/dist/statistic.js.map +1 -0
  45. package/dist/types/Camera.d.ts +12 -0
  46. package/dist/types/Canvas.d.ts +12 -0
  47. package/dist/types/GPUBuffer.d.ts +54 -0
  48. package/dist/types/GPUCapability.d.ts +50 -0
  49. package/dist/types/Geometry.d.ts +142 -0
  50. package/dist/types/IGPURenderer.d.ts +14 -0
  51. package/dist/types/Material.d.ts +156 -0
  52. package/dist/types/Mesh.d.ts +50 -0
  53. package/dist/types/RenderFrame.d.ts +50 -0
  54. package/dist/types/RenderPass.d.ts +156 -0
  55. package/dist/types/Renderer.d.ts +52 -0
  56. package/dist/types/Scene.d.ts +48 -0
  57. package/dist/types/ShaderLibrary.d.ts +78 -0
  58. package/dist/types/Texture.d.ts +212 -0
  59. package/dist/types/constants.d.ts +6 -0
  60. package/dist/types/index.d.ts +26 -0
  61. package/dist/types/type.d.ts +37 -0
  62. 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 {};