Skip to content

Commit

Permalink
scenegraph-node delete() (#1014)
Browse files Browse the repository at this point in the history
  • Loading branch information
georgios-uber committed Mar 31, 2019
1 parent 30301cc commit 6c3046a
Show file tree
Hide file tree
Showing 6 changed files with 50 additions and 3 deletions.
14 changes: 13 additions & 1 deletion examples/core/gltf/app.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* global document, window */
import {loadFile, parseFile, registerLoaders} from '@loaders.gl/core';
import {setParameters, clear, log} from '@luma.gl/core';
import {setParameters, clear, log, lumaStats} from '@luma.gl/core';
import {
createGLTFObjects,
GLBScenegraphLoader,
Expand Down Expand Up @@ -269,6 +269,7 @@ export class DemoApp {
canvas.ondrop = e => {
e.preventDefault();
if (e.dataTransfer.files && e.dataTransfer.files.length === 1) {
this._deleteScenes();
loadGLTF(
new Promise(resolve => {
const reader = new window.FileReader();
Expand Down Expand Up @@ -314,6 +315,7 @@ export class DemoApp {
);

modelSelector.onchange = event => {
this._deleteScenes();
loadGLTF(GLTF_BASE_URL + modelSelector.value, this.gl, this.loadOptions).then(result =>
Object.assign(this, result)
);
Expand Down Expand Up @@ -383,9 +385,19 @@ export class DemoApp {
(this.gltf.meshes || []).forEach(mesh => delete mesh._mesh);
(this.gltf.nodes || []).forEach(node => delete node._node);

this._deleteScenes();
Object.assign(this, createGLTFObjects(this.gl, this.gltf, this.loadOptions));
}

_deleteScenes() {
this.scenes.forEach(scene => scene.delete());
this.scenes = [];

lumaStats.get('Resource Counts').forEach(({name, count}) => {
log.info(3, `${name}: ${count}`)();
});
}

applyLight(model) {
// TODO: only do this when light changes
model.updateModuleSettings({
Expand Down
3 changes: 2 additions & 1 deletion modules/addons/src/gltf/create-gltf-model.js
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ export default function createGLTFModel(gl, options) {
defines: materialParser.defines,
parameters: materialParser.parameters,
vs: addVersionToShader(gl, vs),
fs: addVersionToShader(gl, fs)
fs: addVersionToShader(gl, fs),
generatedTextures: materialParser.generatedTextures
},
modelOptions
)
Expand Down
17 changes: 17 additions & 0 deletions modules/addons/src/gltf/gltf-environment.js
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,21 @@ export default class GLTFEnvironment {

return this._BrdfTexture;
}

delete() {
if (this._DiffuseEnvSampler) {
this._DiffuseEnvSampler.delete();
this._DiffuseEnvSampler = null;
}

if (this._SpecularEnvSampler) {
this._SpecularEnvSampler.delete();
this._SpecularEnvSampler = null;
}

if (this._BrdfTexture) {
this._BrdfTexture.delete();
this._BrdfTexture = null;
}
}
}
2 changes: 2 additions & 0 deletions modules/addons/src/gltf/gltf-material-parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ export default class GLTFMaterialParser {
};

this.parameters = {};
this.generatedTextures = [];

if (imageBasedLightingEnvironment) {
this.uniforms.u_DiffuseEnvSampler = imageBasedLightingEnvironment.getDiffuseEnvSampler();
Expand Down Expand Up @@ -73,6 +74,7 @@ export default class GLTFMaterialParser {
});
this.uniforms[name] = texture;
this.defineIfPresent(define, define);
this.generatedTextures.push(texture);
}

parsePbrMetallicRoughness(pbrMetallicRoughness) {
Expand Down
6 changes: 6 additions & 0 deletions modules/core/src/scenegraph/nodes/group-node.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@ export default class GroupNode extends ScenegraphNode {
return this;
}

delete() {
this.children.forEach(child => child.delete());
this.removeAll();
super.delete();
}

traverse(visitor, {worldMatrix = new Matrix4()} = {}) {
const modelMatrix = new Matrix4(worldMatrix).multiplyRight(this.matrix);

Expand Down
11 changes: 10 additions & 1 deletion modules/core/src/scenegraph/nodes/model-node.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ export default class ModelNode extends ScenegraphNode {
this._setModelNodeProps(props);
} else {
this.model = new Model(gl, props);
this.generatedTextures = props.generatedTextures;
}
}

Expand All @@ -25,7 +26,15 @@ export default class ModelNode extends ScenegraphNode {
}

delete() {
this.model.delete();
if (this.model) {
this.model.delete();
this.model = null;
}
if (Array.isArray(this.generatedTextures)) {
this.generatedTextures.forEach(texture => texture.delete());
this.generatedTextures = null;
}
// TODO: delete buffers after making sure there are not shared!
}

// Forward node methods
Expand Down

0 comments on commit 6c3046a

Please sign in to comment.