@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.
- package/dist/animation/key-frames.d.ts +1 -0
- package/dist/animation/key-frames.d.ts.map +1 -1
- package/dist/animation/key-frames.js.map +1 -1
- package/dist/animation/timeline.d.ts +2 -2
- package/dist/animation/timeline.d.ts.map +1 -1
- package/dist/animation/timeline.js.map +1 -1
- package/dist/geometries/cone-geometry.d.ts.map +1 -1
- package/dist/geometries/cone-geometry.js +1 -1
- package/dist/geometries/cone-geometry.js.map +1 -1
- package/dist/geometries/cube-geometry.d.ts +4 -0
- package/dist/geometries/cube-geometry.d.ts.map +1 -1
- package/dist/geometries/cube-geometry.js +31 -7
- package/dist/geometries/cube-geometry.js.map +1 -1
- package/dist/geometries/cylinder-geometry.d.ts.map +1 -1
- package/dist/geometries/cylinder-geometry.js +1 -1
- package/dist/geometries/cylinder-geometry.js.map +1 -1
- package/dist/geometries/ico-sphere-geometry.d.ts.map +1 -1
- package/dist/geometries/ico-sphere-geometry.js +1 -1
- package/dist/geometries/ico-sphere-geometry.js.map +1 -1
- package/dist/geometries/plane-geometry.d.ts.map +1 -1
- package/dist/geometries/plane-geometry.js +1 -1
- package/dist/geometries/plane-geometry.js.map +1 -1
- package/dist/geometries/sphere-geometry.d.ts.map +1 -1
- package/dist/geometries/sphere-geometry.js +1 -1
- package/dist/geometries/sphere-geometry.js.map +1 -1
- package/dist/geometries/truncated-cone-geometry.d.ts +15 -3
- package/dist/geometries/truncated-cone-geometry.d.ts.map +1 -1
- package/dist/geometries/truncated-cone-geometry.js +29 -15
- package/dist/geometries/truncated-cone-geometry.js.map +1 -1
- package/dist/geometry/geometry-table.d.ts +15 -0
- package/dist/geometry/geometry-table.d.ts.map +1 -0
- package/dist/geometry/geometry-table.js +2 -0
- package/dist/{transform/transform-types.js.map → geometry/geometry-table.js.map} +1 -1
- package/dist/geometry/geometry-utils.js.map +1 -1
- package/dist/geometry/geometry.d.ts +32 -14
- package/dist/geometry/geometry.d.ts.map +1 -1
- package/dist/geometry/geometry.js +57 -34
- package/dist/geometry/geometry.js.map +1 -1
- package/dist/geometry/primitive-utils.d.ts +1 -0
- package/dist/geometry/primitive-utils.d.ts.map +1 -0
- package/dist/geometry/primitive-utils.js +2 -0
- package/dist/geometry/primitive-utils.js.map +1 -0
- package/dist/index.d.ts +6 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -6
- package/dist/index.js.map +1 -1
- package/dist/lib/animation-loop.d.ts +23 -84
- package/dist/lib/animation-loop.d.ts.map +1 -1
- package/dist/lib/animation-loop.js +106 -193
- package/dist/lib/animation-loop.js.map +1 -1
- package/dist/lib/animation-props.d.ts +24 -0
- package/dist/lib/animation-props.d.ts.map +1 -0
- package/dist/lib/animation-props.js +2 -0
- package/dist/lib/animation-props.js.map +1 -0
- package/dist/lib/clip-space.d.ts +1 -0
- package/dist/lib/clip-space.d.ts.map +1 -0
- package/dist/lib/clip-space.js +2 -0
- package/dist/lib/clip-space.js.map +1 -0
- package/dist/lib/model-utils.d.ts +4 -3
- package/dist/lib/model-utils.d.ts.map +1 -1
- package/dist/lib/model-utils.js +24 -70
- package/dist/lib/model-utils.js.map +1 -1
- package/dist/lib/model.d.ts +34 -104
- package/dist/lib/model.d.ts.map +1 -1
- package/dist/lib/model.js +111 -502
- package/dist/lib/model.js.map +1 -1
- package/dist/lib/pipeline-factory.d.ts +60 -0
- package/dist/lib/pipeline-factory.d.ts.map +1 -0
- package/dist/lib/pipeline-factory.js +219 -0
- package/dist/lib/pipeline-factory.js.map +1 -0
- package/dist/lib/render-loop.d.ts +5 -18
- package/dist/lib/render-loop.d.ts.map +1 -1
- package/dist/lib/render-loop.js +16 -23
- package/dist/lib/render-loop.js.map +1 -1
- package/package.json +6 -6
- package/src/animation/key-frames.ts +1 -0
- package/src/animation/timeline.ts +2 -2
- package/src/geometries/cone-geometry.ts +1 -1
- package/src/geometries/cube-geometry.ts +160 -8
- package/src/geometries/cylinder-geometry.ts +1 -1
- package/src/geometries/ico-sphere-geometry.ts +2 -2
- package/src/geometries/plane-geometry.ts +1 -1
- package/src/geometries/sphere-geometry.ts +2 -2
- package/src/geometries/truncated-cone-geometry.ts +30 -12
- package/src/geometry/geometry-table.ts +16 -0
- package/src/geometry/geometry-utils.ts +1 -1
- package/src/geometry/geometry.ts +97 -47
- package/src/geometry/primitive-utils.ts +30 -0
- package/src/index.ts +13 -12
- package/src/lib/animation-loop.ts +136 -314
- package/src/lib/animation-props.ts +31 -0
- package/src/{utils → lib}/clip-space.ts +5 -2
- package/src/lib/model-utils.ts +60 -32
- package/src/lib/model.ts +127 -639
- package/src/lib/pipeline-factory.ts +234 -0
- package/src/lib/render-loop.ts +24 -22
- package/dist/lib/program-manager.d.ts +0 -39
- package/dist/lib/program-manager.d.ts.map +0 -1
- package/dist/lib/program-manager.js +0 -175
- package/dist/lib/program-manager.js.map +0 -1
- package/dist/transform/buffer-transform.d.ts +0 -36
- package/dist/transform/buffer-transform.d.ts.map +0 -1
- package/dist/transform/buffer-transform.js +0 -255
- package/dist/transform/buffer-transform.js.map +0 -1
- package/dist/transform/texture-transform.d.ts +0 -57
- package/dist/transform/texture-transform.d.ts.map +0 -1
- package/dist/transform/texture-transform.js +0 -412
- package/dist/transform/texture-transform.js.map +0 -1
- package/dist/transform/transform-shader-utils.d.ts +0 -26
- package/dist/transform/transform-shader-utils.d.ts.map +0 -1
- package/dist/transform/transform-shader-utils.js +0 -149
- package/dist/transform/transform-shader-utils.js.map +0 -1
- package/dist/transform/transform-types.d.ts +0 -44
- package/dist/transform/transform-types.d.ts.map +0 -1
- package/dist/transform/transform-types.js +0 -2
- package/dist/transform/transform.d.ts +0 -47
- package/dist/transform/transform.d.ts.map +0 -1
- package/dist/transform/transform.js +0 -198
- package/dist/transform/transform.js.map +0 -1
- package/dist/utils/clip-space.d.ts +0 -5
- package/dist/utils/clip-space.d.ts.map +0 -1
- package/dist/utils/clip-space.js +0 -34
- package/dist/utils/clip-space.js.map +0 -1
- package/src/lib/program-manager.ts +0 -187
- package/src/transform/buffer-transform.ts +0 -214
- package/src/transform/texture-transform.ts +0 -344
- package/src/transform/transform-shader-utils.ts +0 -169
- package/src/transform/transform-types.ts +0 -42
- 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
|
-
}
|