diff --git a/src/art/webgl/art.js b/src/art/webgl/art.js index 06af8ba98b736784486ab93a839ae0f122168b09..ec53bcdf27a79d349e686060a9090360769f10ec 100644 --- a/src/art/webgl/art.js +++ b/src/art/webgl/art.js @@ -77,10 +77,10 @@ App.Art.applyFigures = function(slave, scene) { } for (let i=0; i < scene.models[0].figures.length; i++) { - scene.models[0].figures[i]["visible"] = false; + scene.models[0].figures[i].visible = false; for (let j =0; j < figures.length; j++) { if (scene.models[0].figures[i].figId === figures[j]) { - scene.models[0].figures[i]["visible"] = true; + scene.models[0].figures[i].visible = true; } } } diff --git a/src/art/webgl/engine.js b/src/art/webgl/engine.js index fe24e6d9d3aa45d8c829c6c7b315d5a67193ef37..d0056f30c15898aa4485cb27c0c79300559a1825 100644 --- a/src/art/webgl/engine.js +++ b/src/art/webgl/engine.js @@ -212,26 +212,43 @@ App.Art.Engine = class { let modelBuffers = this.buffers.models[m]; let modelData = sceneData.models[m]; - modelBuffers.verticesPositionBuffer = this.gl.createBuffer(); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesPositionBuffer); - this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.verts), this.gl.STATIC_DRAW); - modelBuffers.vertexCount = this.gl.getBufferParameter(this.gl.ARRAY_BUFFER, this.gl.BUFFER_SIZE)/4; - - modelBuffers.verticesNormalBuffer = this.gl.createBuffer(); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalBuffer); - this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.vertsn), this.gl.STATIC_DRAW); - - modelBuffers.verticesTextureCoordBuffer = this.gl.createBuffer(); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTextureCoordBuffer); - this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.texts), this.gl.STATIC_DRAW); - - modelBuffers.verticesTangentBuffer = this.gl.createBuffer(); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTangentBuffer); - this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.tans), this.gl.STATIC_DRAW); + modelBuffers.verticesPositionBuffer = []; + modelBuffers.verticesNormalBuffer = []; + modelBuffers.verticesTextureCoordBuffer = []; + modelBuffers.verticesTangentBuffer = []; + modelBuffers.vertexCount = []; + modelBuffers.verticesMorphBuffer = []; + modelBuffers.verticesNormalMorphBuffer = []; modelBuffers.verticesIndexBuffer = []; modelBuffers.indexSizes = []; for (let i=0, count=0; i < modelData.figures.length; i++) { + modelBuffers.verticesPositionBuffer[i] = this.gl.createBuffer(); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesPositionBuffer[i]); + this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.figures[i].verts), this.gl.STATIC_DRAW); + modelBuffers.vertexCount[i] = this.gl.getBufferParameter(this.gl.ARRAY_BUFFER, this.gl.BUFFER_SIZE)/4; + + modelBuffers.verticesNormalBuffer[i] = this.gl.createBuffer(); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalBuffer[i]); + this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.figures[i].vertsn), this.gl.STATIC_DRAW); + + modelBuffers.verticesTextureCoordBuffer[i] = this.gl.createBuffer(); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTextureCoordBuffer[i]); + this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.figures[i].texts), this.gl.STATIC_DRAW); + + modelBuffers.verticesTangentBuffer[i] = this.gl.createBuffer(); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTangentBuffer[i]); + this.gl.bufferData(this.gl.ARRAY_BUFFER, this.base64ToFloat(modelData.figures[i].tans), this.gl.STATIC_DRAW); + + // return dummy morph + modelBuffers.verticesMorphBuffer[i] = this.gl.createBuffer(); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesMorphBuffer[i]); + this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(0), this.gl.STATIC_DRAW); + + modelBuffers.verticesNormalMorphBuffer[i] = this.gl.createBuffer(); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalMorphBuffer[i]); + this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(0), this.gl.STATIC_DRAW); + for (let j=0; j < modelData.figures[i].surfaces.length; j++, count++) { modelBuffers.verticesIndexBuffer[count] = this.gl.createBuffer(); this.gl.bindBuffer(this.gl.ELEMENT_ARRAY_BUFFER, modelBuffers.verticesIndexBuffer[count]); @@ -246,15 +263,6 @@ App.Art.Engine = class { } initMorphs(modelBuffers, modelData) { - // return dummy morph - modelBuffers.verticesMorphBuffer = this.gl.createBuffer(); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesMorphBuffer); - this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(0), this.gl.STATIC_DRAW); - - modelBuffers.verticesNormalMorphBuffer = this.gl.createBuffer(); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalMorphBuffer); - this.gl.bufferData(this.gl.ARRAY_BUFFER, new Float32Array(0), this.gl.STATIC_DRAW); - window.sceneBlocks = {}; // automatically populated during loading of morphs let promisedMorphs = []; @@ -536,32 +544,33 @@ App.Art.Engine = class { this.gl.uniformMatrix4fv(this.gl.getUniformLocation(this.shaderProgram, "matScale"), false, new Float32Array(this.matrixFlatten(matScale))); this.gl.uniformMatrix4fv(this.gl.getUniformLocation(this.shaderProgram, "matRot"), false, new Float32Array(this.matrixFlatten(matRot))); - // bind vertex buffers - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesPositionBuffer); - this.gl.vertexAttribPointer(this.vertexPositionAttribute, 3, this.gl.FLOAT, false, 0, 0); + for (let i=0, count=0; i < modelParams.figures.length; i++) { + if(!modelParams.figures[i].visible) { + count += modelParams.figures[i].surfaces.length; + continue; + } - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTextureCoordBuffer); - this.gl.vertexAttribPointer(this.textureCoordAttribute, 2, this.gl.FLOAT, false, 0, 0); + // bind vertex buffers per figure + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesPositionBuffer[i]); + this.gl.vertexAttribPointer(this.vertexPositionAttribute, 3, this.gl.FLOAT, false, 0, 0); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalBuffer); - this.gl.vertexAttribPointer(this.vertexNormalAttribute, 3, this.gl.FLOAT, false, 0, 0); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTextureCoordBuffer[i]); + this.gl.vertexAttribPointer(this.textureCoordAttribute, 2, this.gl.FLOAT, false, 0, 0); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTangentBuffer); - this.gl.vertexAttribPointer(this.vertexTangentAttribute, 3, this.gl.FLOAT, false, 0, 0); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalBuffer[i]); + this.gl.vertexAttribPointer(this.vertexNormalAttribute, 3, this.gl.FLOAT, false, 0, 0); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesMorphBuffer); - this.gl.vertexAttribPointer(this.vertexPositionMorphAttribute, 3, this.gl.FLOAT, false, 0, 0); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesTangentBuffer[i]); + this.gl.vertexAttribPointer(this.vertexTangentAttribute, 3, this.gl.FLOAT, false, 0, 0); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalMorphBuffer); - this.gl.vertexAttribPointer(this.vertexNormalMorphAttribute, 3, this.gl.FLOAT, false, 0, 0); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesMorphBuffer[i]); + this.gl.vertexAttribPointer(this.vertexPositionMorphAttribute, 3, this.gl.FLOAT, false, 0, 0); - // bind materials per surface and set uniforms - for (let i=0, count=0; i < modelParams.figures.length; i++) { - for (let j=0; j < modelParams.figures[i].surfaces.length; j++, count++) { - if(!modelParams.figures[i].visible) { - continue; - } + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalMorphBuffer[i]); + this.gl.vertexAttribPointer(this.vertexNormalMorphAttribute, 3, this.gl.FLOAT, false, 0, 0); + // bind materials per surface and set uniforms + for (let j=0; j < modelParams.figures[i].surfaces.length; j++, count++) { let visible = modelParams.figures[i].surfaces[j].visible; for (let h=0; h < modelParams.figures[i].surfaces[j].matIds.length; h++) { @@ -615,14 +624,14 @@ App.Art.Engine = class { applyMorphs(modelParams, modelBuffers) { if(modelBuffers.oldMorphValues !== JSON.stringify(modelParams.morphs) + JSON.stringify(modelParams.figures)) { - let vertexPositionMorph = new Float32Array(modelBuffers.vertexCount); - let vertexNormalMorph = new Float32Array(modelBuffers.vertexCount); - for (let f=0; f < modelParams.figures.length; f++) { if(!modelParams.visible || !modelParams.figures[f].visible) { continue; } + let vertexPositionMorph = new Float32Array(modelBuffers.vertexCount[f]); + let vertexNormalMorph = new Float32Array(modelBuffers.vertexCount[f]); + for(let m=0; m < modelParams.morphs.length; m++) { let morphValue = modelParams.morphs[m].value; @@ -644,13 +653,13 @@ App.Art.Engine = class { } } } - } - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesMorphBuffer); - this.gl.bufferData(this.gl.ARRAY_BUFFER, vertexPositionMorph, this.gl.STATIC_DRAW); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesMorphBuffer[f]); + this.gl.bufferData(this.gl.ARRAY_BUFFER, vertexPositionMorph, this.gl.STATIC_DRAW); - this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalMorphBuffer); - this.gl.bufferData(this.gl.ARRAY_BUFFER, vertexNormalMorph, this.gl.STATIC_DRAW); + this.gl.bindBuffer(this.gl.ARRAY_BUFFER, modelBuffers.verticesNormalMorphBuffer[f]); + this.gl.bufferData(this.gl.ARRAY_BUFFER, vertexNormalMorph, this.gl.STATIC_DRAW); + } modelBuffers.oldMorphValues = JSON.stringify(modelParams.morphs) + JSON.stringify(modelParams.figures); }