@luma.gl/engine 8.6.0-alpha.4 → 9.0.0-alpha.10

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 (129) hide show
  1. package/dist/animation/key-frames.d.ts +1 -0
  2. package/dist/animation/key-frames.d.ts.map +1 -1
  3. package/dist/animation/key-frames.js.map +1 -1
  4. package/dist/animation/timeline.d.ts +2 -2
  5. package/dist/animation/timeline.d.ts.map +1 -1
  6. package/dist/animation/timeline.js.map +1 -1
  7. package/dist/geometries/cone-geometry.d.ts.map +1 -1
  8. package/dist/geometries/cone-geometry.js +1 -1
  9. package/dist/geometries/cone-geometry.js.map +1 -1
  10. package/dist/geometries/cube-geometry.d.ts +4 -0
  11. package/dist/geometries/cube-geometry.d.ts.map +1 -1
  12. package/dist/geometries/cube-geometry.js +31 -7
  13. package/dist/geometries/cube-geometry.js.map +1 -1
  14. package/dist/geometries/cylinder-geometry.d.ts.map +1 -1
  15. package/dist/geometries/cylinder-geometry.js +1 -1
  16. package/dist/geometries/cylinder-geometry.js.map +1 -1
  17. package/dist/geometries/ico-sphere-geometry.d.ts.map +1 -1
  18. package/dist/geometries/ico-sphere-geometry.js +1 -1
  19. package/dist/geometries/ico-sphere-geometry.js.map +1 -1
  20. package/dist/geometries/plane-geometry.d.ts.map +1 -1
  21. package/dist/geometries/plane-geometry.js +1 -1
  22. package/dist/geometries/plane-geometry.js.map +1 -1
  23. package/dist/geometries/sphere-geometry.d.ts.map +1 -1
  24. package/dist/geometries/sphere-geometry.js +1 -1
  25. package/dist/geometries/sphere-geometry.js.map +1 -1
  26. package/dist/geometries/truncated-cone-geometry.d.ts +15 -3
  27. package/dist/geometries/truncated-cone-geometry.d.ts.map +1 -1
  28. package/dist/geometries/truncated-cone-geometry.js +29 -15
  29. package/dist/geometries/truncated-cone-geometry.js.map +1 -1
  30. package/dist/geometry/geometry-table.d.ts +15 -0
  31. package/dist/geometry/geometry-table.d.ts.map +1 -0
  32. package/dist/geometry/geometry-table.js +2 -0
  33. package/dist/{transform/transform-types.js.map → geometry/geometry-table.js.map} +1 -1
  34. package/dist/geometry/geometry-utils.js.map +1 -1
  35. package/dist/geometry/geometry.d.ts +32 -14
  36. package/dist/geometry/geometry.d.ts.map +1 -1
  37. package/dist/geometry/geometry.js +57 -34
  38. package/dist/geometry/geometry.js.map +1 -1
  39. package/dist/geometry/primitive-utils.d.ts +1 -0
  40. package/dist/geometry/primitive-utils.d.ts.map +1 -0
  41. package/dist/geometry/primitive-utils.js +2 -0
  42. package/dist/geometry/primitive-utils.js.map +1 -0
  43. package/dist/index.d.ts +6 -7
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +4 -6
  46. package/dist/index.js.map +1 -1
  47. package/dist/lib/animation-loop.d.ts +23 -84
  48. package/dist/lib/animation-loop.d.ts.map +1 -1
  49. package/dist/lib/animation-loop.js +106 -193
  50. package/dist/lib/animation-loop.js.map +1 -1
  51. package/dist/lib/animation-props.d.ts +24 -0
  52. package/dist/lib/animation-props.d.ts.map +1 -0
  53. package/dist/lib/animation-props.js +2 -0
  54. package/dist/lib/animation-props.js.map +1 -0
  55. package/dist/lib/clip-space.d.ts +1 -0
  56. package/dist/lib/clip-space.d.ts.map +1 -0
  57. package/dist/lib/clip-space.js +2 -0
  58. package/dist/lib/clip-space.js.map +1 -0
  59. package/dist/lib/model-utils.d.ts +4 -3
  60. package/dist/lib/model-utils.d.ts.map +1 -1
  61. package/dist/lib/model-utils.js +24 -70
  62. package/dist/lib/model-utils.js.map +1 -1
  63. package/dist/lib/model.d.ts +34 -104
  64. package/dist/lib/model.d.ts.map +1 -1
  65. package/dist/lib/model.js +111 -502
  66. package/dist/lib/model.js.map +1 -1
  67. package/dist/lib/pipeline-factory.d.ts +60 -0
  68. package/dist/lib/pipeline-factory.d.ts.map +1 -0
  69. package/dist/lib/pipeline-factory.js +219 -0
  70. package/dist/lib/pipeline-factory.js.map +1 -0
  71. package/dist/lib/render-loop.d.ts +5 -18
  72. package/dist/lib/render-loop.d.ts.map +1 -1
  73. package/dist/lib/render-loop.js +16 -23
  74. package/dist/lib/render-loop.js.map +1 -1
  75. package/package.json +6 -6
  76. package/src/animation/key-frames.ts +1 -0
  77. package/src/animation/timeline.ts +2 -2
  78. package/src/geometries/cone-geometry.ts +1 -1
  79. package/src/geometries/cube-geometry.ts +160 -8
  80. package/src/geometries/cylinder-geometry.ts +1 -1
  81. package/src/geometries/ico-sphere-geometry.ts +2 -2
  82. package/src/geometries/plane-geometry.ts +1 -1
  83. package/src/geometries/sphere-geometry.ts +2 -2
  84. package/src/geometries/truncated-cone-geometry.ts +30 -12
  85. package/src/geometry/geometry-table.ts +16 -0
  86. package/src/geometry/geometry-utils.ts +1 -1
  87. package/src/geometry/geometry.ts +97 -47
  88. package/src/geometry/primitive-utils.ts +30 -0
  89. package/src/index.ts +13 -12
  90. package/src/lib/animation-loop.ts +136 -314
  91. package/src/lib/animation-props.ts +31 -0
  92. package/src/{utils → lib}/clip-space.ts +5 -2
  93. package/src/lib/model-utils.ts +60 -32
  94. package/src/lib/model.ts +127 -639
  95. package/src/lib/pipeline-factory.ts +234 -0
  96. package/src/lib/render-loop.ts +24 -22
  97. package/dist/lib/program-manager.d.ts +0 -39
  98. package/dist/lib/program-manager.d.ts.map +0 -1
  99. package/dist/lib/program-manager.js +0 -175
  100. package/dist/lib/program-manager.js.map +0 -1
  101. package/dist/transform/buffer-transform.d.ts +0 -36
  102. package/dist/transform/buffer-transform.d.ts.map +0 -1
  103. package/dist/transform/buffer-transform.js +0 -255
  104. package/dist/transform/buffer-transform.js.map +0 -1
  105. package/dist/transform/texture-transform.d.ts +0 -57
  106. package/dist/transform/texture-transform.d.ts.map +0 -1
  107. package/dist/transform/texture-transform.js +0 -412
  108. package/dist/transform/texture-transform.js.map +0 -1
  109. package/dist/transform/transform-shader-utils.d.ts +0 -26
  110. package/dist/transform/transform-shader-utils.d.ts.map +0 -1
  111. package/dist/transform/transform-shader-utils.js +0 -149
  112. package/dist/transform/transform-shader-utils.js.map +0 -1
  113. package/dist/transform/transform-types.d.ts +0 -44
  114. package/dist/transform/transform-types.d.ts.map +0 -1
  115. package/dist/transform/transform-types.js +0 -2
  116. package/dist/transform/transform.d.ts +0 -47
  117. package/dist/transform/transform.d.ts.map +0 -1
  118. package/dist/transform/transform.js +0 -198
  119. package/dist/transform/transform.js.map +0 -1
  120. package/dist/utils/clip-space.d.ts +0 -5
  121. package/dist/utils/clip-space.d.ts.map +0 -1
  122. package/dist/utils/clip-space.js +0 -34
  123. package/dist/utils/clip-space.js.map +0 -1
  124. package/src/lib/program-manager.ts +0 -187
  125. package/src/transform/buffer-transform.ts +0 -214
  126. package/src/transform/texture-transform.ts +0 -344
  127. package/src/transform/transform-shader-utils.ts +0 -169
  128. package/src/transform/transform-types.ts +0 -42
  129. package/src/transform/transform.ts +0 -189
@@ -1,169 +0,0 @@
1
- import {assert} from '@luma.gl/webgl';
2
- import {combineInjects, getQualifierDetails, typeToChannelSuffix} from '@luma.gl/shadertools';
3
-
4
- const SAMPLER_UNIFORM_PREFIX = 'transform_uSampler_';
5
- const SIZE_UNIFORM_PREFIX = 'transform_uSize_';
6
- const VS_POS_VARIABLE = 'transform_position';
7
-
8
- // Scan provided vertex shader
9
- // for each texture attribute, inject sampler instructions and build uniforms for sampler
10
- // for texture target, get varying type and inject position instruction
11
- export function updateForTextures(options: {
12
- vs: any;
13
- sourceTextureMap: any;
14
- targetTextureVarying: any;
15
- targetTexture: any;
16
- }): {
17
- vs: any;
18
- targetTextureType: any;
19
- inject: {};
20
- samplerTextureMap: {};
21
- } {
22
- const {vs, sourceTextureMap, targetTextureVarying, targetTexture} = options;
23
- const texAttributeNames = Object.keys(sourceTextureMap);
24
- let sourceCount = texAttributeNames.length;
25
- let targetTextureType = null;
26
- const samplerTextureMap = {};
27
- let updatedVs = vs;
28
- let finalInject = {};
29
-
30
- if (sourceCount > 0 || targetTextureVarying) {
31
- const vsLines = updatedVs.split('\n');
32
- const updateVsLines = vsLines.slice();
33
- vsLines.forEach((line, index, lines) => {
34
- // TODO add early exit
35
- if (sourceCount > 0) {
36
- const updated = processAttributeDefinition(line, sourceTextureMap);
37
- if (updated) {
38
- const {updatedLine, inject} = updated;
39
- updateVsLines[index] = updatedLine;
40
- // sampleInstructions.push(sampleInstruction);
41
- finalInject = combineInjects([finalInject, inject]);
42
- Object.assign(samplerTextureMap, updated.samplerTextureMap);
43
- sourceCount--;
44
- }
45
- }
46
- if (targetTextureVarying && !targetTextureType) {
47
- targetTextureType = getVaryingType(line, targetTextureVarying);
48
- }
49
- });
50
-
51
- if (targetTextureVarying) {
52
- assert(targetTexture);
53
- const sizeName = `${SIZE_UNIFORM_PREFIX}${targetTextureVarying}`;
54
-
55
- const uniformDeclaration = `uniform vec2 ${sizeName};\n`;
56
- const posInstructions = `\
57
- vec2 ${VS_POS_VARIABLE} = transform_getPos(${sizeName});
58
- gl_Position = vec4(${VS_POS_VARIABLE}, 0, 1.);\n`;
59
- const inject = {
60
- 'vs:#decl': uniformDeclaration,
61
- 'vs:#main-start': posInstructions
62
- };
63
- finalInject = combineInjects([finalInject, inject]);
64
- }
65
- updatedVs = updateVsLines.join('\n');
66
- }
67
- return {
68
- // updated vertex shader (commented texture attribute definition)
69
- vs: updatedVs,
70
- // type (float, vec2, vec3 of vec4) target texture varying
71
- targetTextureType,
72
- // required vertex and fragment shader injects
73
- inject: finalInject,
74
- // map of sampler name to texture name, can be used to set attributes
75
- // usefull when swapping textures, as source and destination texture change when swap is called.
76
- samplerTextureMap
77
- };
78
- }
79
-
80
- // builds and returns an object contaning size uniform for each texture
81
- export function getSizeUniforms(options: {
82
- sourceTextureMap: any;
83
- targetTextureVarying: any;
84
- targetTexture: any;
85
- }): {} {
86
- const uniforms = {};
87
- let width;
88
- let height;
89
- if (options.targetTextureVarying) {
90
- ({width, height} = options.targetTexture);
91
- uniforms[`${SIZE_UNIFORM_PREFIX}${options.targetTextureVarying}`] = [width, height];
92
- }
93
- for (const textureName in options.sourceTextureMap) {
94
- ({width, height} = options.sourceTextureMap[textureName]);
95
- uniforms[`${SIZE_UNIFORM_PREFIX}${textureName}`] = [width, height];
96
- }
97
- return uniforms;
98
- }
99
-
100
- // Return size (float, vec2 etc) of a given varying, null if doens't exist.
101
-
102
- export function getVaryingType(line: any, varying: any): any {
103
- const qualiferDetails = getQualifierDetails(line, ['varying', 'out']);
104
- if (!qualiferDetails) {
105
- return null;
106
- }
107
- return qualiferDetails.name === varying ? qualiferDetails.type : null;
108
- }
109
-
110
- // build required definitions, sample instructions for each texture attribute
111
- export function processAttributeDefinition(
112
- line: any,
113
- textureMap: any
114
- ): {
115
- updatedLine: string;
116
- inject: {
117
- 'vs:#decl': string;
118
- 'vs:#main-start': string;
119
- };
120
- samplerTextureMap: {};
121
- } {
122
- const samplerTextureMap = {};
123
- const attributeData = getAttributeDefinition(line);
124
- if (!attributeData) {
125
- return null;
126
- }
127
- const {type, name} = attributeData;
128
- if (name && textureMap[name]) {
129
- // eslint-disable-next-line no-useless-escape
130
- const updatedLine = `\// ${line} => Replaced by Transform with a sampler`;
131
- const {samplerName, sizeName, uniformDeclerations} = getSamplerDeclarations(name);
132
-
133
- const channels = typeToChannelSuffix(type);
134
- const sampleInstruction = ` ${type} ${name} = transform_getInput(${samplerName}, ${sizeName}).${channels};\n`;
135
-
136
- samplerTextureMap[samplerName] = name;
137
- const inject = {
138
- 'vs:#decl': uniformDeclerations,
139
- 'vs:#main-start': sampleInstruction
140
- };
141
-
142
- // samplerNameMap
143
- return {
144
- // update vertex shader line.
145
- updatedLine,
146
- // inject object with sampler instructions.
147
- inject,
148
- // sampler name to texture name map
149
- samplerTextureMap
150
- };
151
- }
152
- return null;
153
- }
154
-
155
- // HELPERS
156
-
157
- // Checks if provided line is defining an attribute, if so returns details otherwise null
158
- function getAttributeDefinition(line) {
159
- return getQualifierDetails(line, ['attribute', 'in']);
160
- }
161
-
162
- function getSamplerDeclarations(textureName) {
163
- const samplerName = `${SAMPLER_UNIFORM_PREFIX}${textureName}`;
164
- const sizeName = `${SIZE_UNIFORM_PREFIX}${textureName}`;
165
- const uniformDeclerations = `\
166
- uniform sampler2D ${samplerName};
167
- uniform vec2 ${sizeName};`;
168
- return {samplerName, sizeName, uniformDeclerations};
169
- }
@@ -1,42 +0,0 @@
1
- /** Properties for creating Transforms */
2
- export type TransformProps = {
3
- id?: string;
4
- vs?: string;
5
- elementCount?: number;
6
- sourceBuffers?: object;
7
- feedbackBuffers?: object;
8
- varyings?: string[];
9
- feedbackMap?: object;
10
- modules?: object[]; // TODO use ShaderModule type
11
- attributes?: any;
12
- uniforms?: any;
13
- parameters?: any;
14
- discard?: boolean;
15
- isIndexed?: boolean;
16
- _sourceTextures?: any;
17
- _targetTexture?: any;
18
- _targetTextureVarying?: string;
19
- _swapTexture?: string;
20
- _fs?: string;
21
- fs?: string;
22
- inject?: any;
23
- drawMode?: number;
24
- };
25
-
26
- /** Options that can be provided when running a Transform */
27
- export type TransformRunOptions = {
28
- clearRenderTarget?: boolean;
29
- uniforms: Record<string, any>;
30
- };
31
-
32
- /** Options that control drawing a Transform. Used by subclasses to return draw parameters */
33
- export type TransformDrawOptions = {
34
- attributes?: object;
35
- framebuffer?: any;
36
- uniforms?: object;
37
- discard?: boolean;
38
- parameters?: object;
39
- transformFeedback?: any;
40
- };
41
-
42
- export type TransformBinding = {sourceBuffers, feedbackBuffers, transformFeedback};
@@ -1,189 +0,0 @@
1
- import {Device, assert} from '@luma.gl/api';
2
- import GL from '@luma.gl/constants';
3
- import {getShaderInfo, getPassthroughFS} from '@luma.gl/shadertools';
4
- import type {Framebuffer, Buffer} from '@luma.gl/webgl';
5
- import {WebGLDevice, isObjectEmpty} from '@luma.gl/webgl';
6
-
7
- import Model from '../lib/model';
8
- import BufferTransform from './buffer-transform';
9
- import TextureTransform from './texture-transform';
10
- import {TransformProps, TransformRunOptions, TransformDrawOptions} from './transform-types';
11
-
12
- /**
13
- * Takes source and target buffers/textures and sets up the pipeline
14
- */
15
- export default class Transform {
16
- /**
17
- * Check if Transforms are supported (they are not under WebGL1)
18
- * @todo differentiate writing to buffer vs not
19
- */
20
- static isSupported(device: Device | WebGL2RenderingContext): boolean {
21
- try {
22
- const webglDevice = WebGLDevice.attach(device);
23
- return webglDevice.isWebGL2;
24
- } catch {
25
- return false;
26
- }
27
- }
28
-
29
- readonly device: WebGLDevice;
30
- readonly gl: WebGL2RenderingContext;
31
- model: Model | null = null;
32
- elementCount = 0;
33
- bufferTransform = null;
34
- textureTransform = null;
35
- elementIDBuffer = null;
36
-
37
- constructor(device: Device | WebGL2RenderingContext, props: TransformProps = {}) {
38
- this.device = WebGLDevice.attach(device);
39
- // TODO assert webgl2?
40
- this.gl = this.device.gl2;
41
- this._initialize(props);
42
- Object.seal(this);
43
- }
44
-
45
- /** Delete owned resources. */
46
- destroy(): void {
47
- const {model, bufferTransform, textureTransform} = this;
48
- if (model) {
49
- model.delete();
50
- }
51
- if (bufferTransform) {
52
- bufferTransform.delete();
53
- }
54
- if (textureTransform) {
55
- textureTransform.delete();
56
- }
57
- }
58
-
59
- /** @deprecated Use destroy*() */
60
- delete(): void {
61
- this.destroy();
62
- }
63
-
64
- /** Run one transform loop. */
65
- run(options?: TransformRunOptions): void {
66
- const {clearRenderTarget = true} = options || {};
67
-
68
- const updatedOpts = this._updateDrawOptions(options);
69
-
70
- if (clearRenderTarget && updatedOpts.framebuffer) {
71
- updatedOpts.framebuffer.clear({color: true});
72
- }
73
-
74
- this.model.transform(updatedOpts);
75
- }
76
-
77
- /** swap resources if a map is provided */
78
- swap(): void {
79
- let swapped = false;
80
- const resourceTransforms = [this.bufferTransform, this.textureTransform].filter(Boolean);
81
- for (const resourceTransform of resourceTransforms) {
82
- swapped = swapped || resourceTransform.swap();
83
- }
84
- assert(swapped, 'Nothing to swap');
85
- }
86
-
87
- /** Return Buffer object for given varying name. */
88
- getBuffer(varyingName: string = null): Buffer {
89
- return this.bufferTransform && this.bufferTransform.getBuffer(varyingName);
90
- }
91
-
92
- /** Return data either from Buffer or from Texture */
93
- getData(options: {packed?: boolean; varyingName?: string} = {}) {
94
- const resourceTransforms = [this.bufferTransform, this.textureTransform].filter(Boolean);
95
- for (const resourceTransform of resourceTransforms) {
96
- const data = resourceTransform.getData(options);
97
- if (data) {
98
- return data;
99
- }
100
- }
101
- return null;
102
- }
103
-
104
- /** Return framebuffer object if rendering to textures */
105
- getFramebuffer(): Framebuffer | null {
106
- return this.textureTransform && this.textureTransform.getFramebuffer();
107
- }
108
-
109
- /** Update some or all buffer/texture bindings. */
110
- update(props: TransformProps): void {
111
- if ('elementCount' in props) {
112
- this.model.setVertexCount(props.elementCount);
113
- }
114
- const resourceTransforms = [this.bufferTransform, this.textureTransform].filter(Boolean);
115
- for (const resourceTransform of resourceTransforms) {
116
- resourceTransform.update(props);
117
- }
118
- }
119
-
120
- // Private
121
-
122
- _initialize(props: TransformProps): void {
123
- const {gl} = this;
124
- this._buildResourceTransforms(gl, props);
125
-
126
- props = this._updateModelProps(props);
127
- this.model = new Model(
128
- this.device,
129
- Object.assign({}, props, {
130
- fs: props.fs || getPassthroughFS({version: getShaderInfo(props.vs).version}),
131
- id: props.id || 'transform-model',
132
- drawMode: props.drawMode || GL.POINTS,
133
- vertexCount: props.elementCount
134
- })
135
- );
136
-
137
- if (this.bufferTransform) {
138
- this.bufferTransform.setupResources({model: this.model});
139
- }
140
- }
141
-
142
- _updateModelProps(props: TransformProps): TransformProps {
143
- let updatedProps = {...props};
144
- const resourceTransforms = [this.bufferTransform, this.textureTransform].filter(Boolean);
145
- for (const resourceTransform of resourceTransforms) {
146
- updatedProps = resourceTransform.updateModelProps(updatedProps);
147
- }
148
- return updatedProps;
149
- }
150
-
151
- _buildResourceTransforms(gl: WebGL2RenderingContext, props: TransformProps) {
152
- if (canCreateBufferTransform(props)) {
153
- this.bufferTransform = new BufferTransform(gl, props);
154
- }
155
- if (canCreateTextureTransform(props)) {
156
- this.textureTransform = new TextureTransform(gl, props);
157
- }
158
- assert(
159
- this.bufferTransform || this.textureTransform,
160
- 'must provide source/feedback buffers or source/target textures'
161
- );
162
- }
163
-
164
- _updateDrawOptions(options: TransformRunOptions): TransformDrawOptions {
165
- let updatedOpts = {...options};
166
- const resourceTransforms = [this.bufferTransform, this.textureTransform].filter(Boolean);
167
- for (const resourceTransform of resourceTransforms) {
168
- updatedOpts = Object.assign(updatedOpts, resourceTransform.getDrawOptions(updatedOpts));
169
- }
170
- return updatedOpts;
171
- }
172
- }
173
-
174
- // Helper Methods
175
-
176
- function canCreateBufferTransform(props: TransformProps): boolean {
177
- const canCreate = !isObjectEmpty(props.feedbackBuffers) ||
178
- !isObjectEmpty(props.feedbackMap) ||
179
- (props.varyings && props.varyings.length > 0);
180
- return Boolean(canCreate);
181
- }
182
-
183
- function canCreateTextureTransform(props: TransformProps): boolean {
184
- const canCreate =
185
- !isObjectEmpty(props._sourceTextures) ||
186
- props._targetTexture ||
187
- props._targetTextureVarying
188
- return canCreate;
189
- }