From b3f5a87724dd51e1e6e3b3b4bda4101392bb4286 Mon Sep 17 00:00:00 2001 From: Bernard Kwok Date: Mon, 9 Sep 2024 10:52:51 -0400 Subject: [PATCH] Remove on-demand refersh logic. --- javascript/MaterialXView/source/helper.js | 9 ++-- javascript/MaterialXView/source/index.js | 26 ++-------- javascript/MaterialXView/source/viewer.js | 58 ++-------------------- resources/Geometry/sphere.glb | Bin 33696 -> 0 bytes 4 files changed, 9 insertions(+), 84 deletions(-) delete mode 100644 resources/Geometry/sphere.glb diff --git a/javascript/MaterialXView/source/helper.js b/javascript/MaterialXView/source/helper.js index c6fe247dcd..3f3be46c79 100644 --- a/javascript/MaterialXView/source/helper.js +++ b/javascript/MaterialXView/source/helper.js @@ -87,7 +87,7 @@ function fromMatrix(matrix, dimension) * @param {mx.Uniforms} uniforms * @param {THREE.textureLoader} textureLoader */ -function toThreeUniform(viewer, type, value, name, uniforms, textureLoader, searchPath, flipY) +function toThreeUniform(type, value, name, uniforms, textureLoader, searchPath, flipY) { let outValue = null; switch (type) @@ -156,8 +156,6 @@ function toThreeUniform(viewer, type, value, name, uniforms, textureLoader, sear // Add texture to ThreeJS cache if (checkCache) THREE.Cache.add(texturePath, texture); - - viewer.scheduleUpdate(); }, undefined, function (error) { @@ -330,7 +328,7 @@ export function registerLights(mx, lights, genContext) * @param {mx.shaderStage} shaderStage * @param {THREE.TextureLoader} textureLoader */ -export function getUniformValues(viewer, shaderStage, textureLoader, searchPath, flipY) +export function getUniformValues(shaderStage, textureLoader, searchPath, flipY) { let threeUniforms = {}; @@ -344,8 +342,7 @@ export function getUniformValues(viewer, shaderStage, textureLoader, searchPath, const variable = uniforms.get(i); const value = variable.getValue()?.getData(); const name = variable.getVariable(); - //console.log('fill uniform, name:', name, ', value:', value); - threeUniforms[name] = new THREE.Uniform(toThreeUniform(viewer, variable.getType().getName(), value, name, uniforms, + threeUniforms[name] = new THREE.Uniform(toThreeUniform(variable.getType().getName(), value, name, uniforms, textureLoader, searchPath, flipY)); } } diff --git a/javascript/MaterialXView/source/index.js b/javascript/MaterialXView/source/index.js index 6a0f61321e..c4ea5ca538 100644 --- a/javascript/MaterialXView/source/index.js +++ b/javascript/MaterialXView/source/index.js @@ -82,7 +82,6 @@ function init() orbitControls.addEventListener('change', () => { viewer.getScene().setUpdateTransforms(); - viewer.scheduleUpdate(); }) // Add hotkey 'f' to capture the current frame and save an image file. @@ -92,7 +91,6 @@ function init() if (event.key === 'f') { captureRequested = true; - viewer.scheduleUpdate(); } }); @@ -131,7 +129,6 @@ function init() }).then(() => { - viewer.scheduleUpdate(); animate(); }).catch(err => { @@ -149,7 +146,6 @@ function init() viewer.getMaterial().loadMaterials(viewer, materialFilename); viewer.getEditor().updateProperties(0.9); viewer.getScene().setUpdateTransforms(); - viewer.scheduleUpdate(); }); setSceneLoadingCallback(file => @@ -158,7 +154,6 @@ function init() console.log('Drop geometry to:', glbFileName); scene.setGeometryURL(glbFileName); scene.loadGeometry(viewer, orbitControls); - viewer.scheduleUpdate(); }); // enable three.js Cache so that dropped files can reference each other @@ -170,12 +165,10 @@ function onWindowResize() viewer.getScene().updateCamera(); viewer.getScene().setUpdateTransforms(); renderer.setSize(window.innerWidth, window.innerHeight); - console.log('resize refresh....'); - viewer.scheduleUpdate(); } function animate() -{ +{ requestAnimationFrame(animate); if (turntableEnabled) @@ -186,19 +179,8 @@ function animate() viewer.getScene().setUpdateTransforms(); } - // Only re-render when an update request was made - if (viewer.needUpdate() || turntableEnabled) - { - renderer.render(viewer.getScene().getScene(), viewer.getScene().getCamera()); - - if (viewer.getScene().getUpdateTransforms()) - { - viewer.getScene().updateTransforms(); - viewer.getScene().setUpdateTransforms(false); - } - - viewer.finishUpdate(); - } + renderer.render(viewer.getScene().getScene(), viewer.getScene().getCamera()); + viewer.getScene().updateTransforms(); if (captureRequested) { @@ -215,11 +197,9 @@ function handleKeyEvents(event) if (event.keyCode == V_KEY) { viewer.getScene().toggleBackgroundTexture(); - viewer.scheduleUpdate(); } else if (event.keyCode == P_KEY) { turntableEnabled = !turntableEnabled; - viewer.scheduleUpdate(); } } diff --git a/javascript/MaterialXView/source/viewer.js b/javascript/MaterialXView/source/viewer.js index eb2b55cc56..febe34c809 100644 --- a/javascript/MaterialXView/source/viewer.js +++ b/javascript/MaterialXView/source/viewer.js @@ -857,14 +857,12 @@ export class Material assigned += viewer.getScene().updateMaterial(matassign); matassign.setGeometry(temp); assignedSolo = true; - viewer.scheduleUpdate(); break } } else { assigned += viewer.getScene().updateMaterial(matassign); - viewer.scheduleUpdate(); } } } @@ -873,7 +871,6 @@ export class Material this._defaultMaterial = new MaterialAssign(this._materials[0].getMaterial(), ALL_GEOMETRY_SPECIFIER); this._defaultMaterial.setShader(this._materials[0].getShader()); viewer.getScene().updateMaterial(this._defaultMaterial); - viewer.scheduleUpdate(); } if (assigned > 0) @@ -929,8 +926,8 @@ export class Material let theScene = viewer.getScene(); let flipV = theScene.getFlipGeometryV(); let uniforms = { - ...getUniformValues(viewer, shader.getStage('vertex'), textureLoader, searchPath, flipV), - ...getUniformValues(viewer, shader.getStage('pixel'), textureLoader, searchPath, flipV), + ...getUniformValues(shader.getStage('vertex'), textureLoader, searchPath, flipV), + ...getUniformValues(shader.getStage('pixel'), textureLoader, searchPath, flipV), } Object.assign(uniforms, { @@ -966,7 +963,6 @@ export class Material if (logDetailedTime) console.log("- Per material generate time: ", performance.now() - startGenerateMat, "ms"); - viewer.scheduleUpdate(); return newMaterial; } @@ -1023,7 +1019,6 @@ export class Material } viewer.getMaterial().updateMaterialAssignments(viewer, this._soloMaterial); viewer.getScene().setUpdateTransforms(); - viewer.scheduleUpdate(); } // @@ -1246,10 +1241,6 @@ export class Material } const w = currentFolder.add(material.uniforms[name], 'value', minValue, maxValue, step).name(path); w.domElement.classList.add('peditoritem'); - w.onChange(function (value) - { - viewer.scheduleUpdate(); - }); } break; @@ -1313,10 +1304,6 @@ export class Material { let w = currentFolder.add(material.uniforms[name], 'value', minValue, maxValue, step).name(path); w.domElement.classList.add('peditoritem'); - w.onChange(function (value) - { - viewer.scheduleUpdate(); - }); } else { @@ -1342,7 +1329,6 @@ export class Material { material.uniforms[name].value = value; } - viewer.scheduleUpdate(); } const defaultOption = enumList[value]; // Set the default selected option const dropdownController = currentFolder.add(enumeration, defaultOption, enumeration).name(path); @@ -1358,11 +1344,6 @@ export class Material { let w = currentFolder.add(material.uniforms[name], 'value').name(path); w.domElement.classList.add('peditoritem'); - w.onChange(function (value) - { - viewer.scheduleUpdate(); - }); - } break; @@ -1406,10 +1387,6 @@ export class Material let w = vecFolder.add(material.uniforms[name].value, key, minValue[key], maxValue[key], step[key]).name(keyString[key]); w.domElement.classList.add('peditoritem'); - w.onChange(function (value) - { - viewer.scheduleUpdate(); - }); }) } break; @@ -1431,7 +1408,6 @@ export class Material { const color3 = new THREE.Color(value); material.uniforms[name].value.set(color3.toArray()); - viewer.scheduleUpdate(); }); w.domElement.classList.add('peditoritem'); } @@ -1455,11 +1431,7 @@ export class Material let item = currentFolder.add(dummy, 'thevalue'); item.name(path); item.disable(true); - let w = item.domElement.classList.add('peditoritem'); - w.onChange(function (value) - { - viewer.scheduleUpdate(); - }); + item.domElement.classList.add('peditoritem'); } break; default: @@ -1503,30 +1475,6 @@ export class Viewer this.fileLoader = new THREE.FileLoader(); this.hdrLoader = new RGBELoader(); - - this.updates = 0 - } - - scheduleUpdate() - { - this.updates++; - //console.log('Schedule update: ', this.updates) - } - - finishUpdate() - { - if (this.updates > 0) - { - this.updates--; - //console.log('Finish update: ', this.updates) - } - } - - needUpdate() - { - //if (this.updates > 0) - // console.log('Need update: ', this.updates > 0) - return this.updates > 0; } // diff --git a/resources/Geometry/sphere.glb b/resources/Geometry/sphere.glb deleted file mode 100644 index 0ebb49aea9c6e91f490a10a05d69a35ddf11bc7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33696 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
  • 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 rm~GX7G(wzpf!qLThB#~Z8sXZ==d