diff --git a/src/client/draw.ts b/src/client/draw.ts new file mode 100644 index 0000000..8458b4a --- /dev/null +++ b/src/client/draw.ts @@ -0,0 +1,59 @@ +import {initMatrices} from './matrix'; +import {initVertexAttribs} from './vertexattrib'; + +/** + * Draws a webgl scene + * @param {any} gl the WebGL context + * @param {any} programInfo WebGL program information + * @param {any} buffers the buffers to draw + * @param {number} params various parameterss + * @param {any} texture the texture to load + */ +export function drawScene(gl: any, + programInfo: any, + buffers: any, + params: any, + texture: any) { + gl.clearColor(0.0, 0.0, 0.0, 1.0); + gl.clearDepth(1.0); + gl.enable(gl.DEPTH_TEST); + gl.depthFunc(gl.LEQUAL); + gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); + + initVertexAttribs(gl, programInfo, buffers); + gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffers.indices); + gl.useProgram(programInfo.program); + gl.activeTexture(gl.TEXTURE0); + gl.bindTexture(gl.TEXTURE_2D, texture); + gl.uniform1i(programInfo.uniformLocations.uSampler, 0); + + const [ + projectionMatrix, + viewMatrix, + modelMatrix, + normalModelMatrix, + ] = initMatrices(gl, params); + + for (let i = 0; i < params.instanceNumber; i++) { + gl.uniformMatrix4fv( + programInfo.uniformLocations.projectionMatrix, + false, + projectionMatrix); + gl.uniformMatrix4fv( + programInfo.uniformLocations.viewMatrix, + false, + viewMatrix); + gl.uniformMatrix4fv( + programInfo.uniformLocations.modelMatrix, + false, + modelMatrix[i]); + gl.uniformMatrix4fv( + programInfo.uniformLocations.normalModelMatrix, + false, + normalModelMatrix[i]); + const vertexCount = params.length; + const type = gl.UNSIGNED_SHORT; + const offset = 0; + gl.drawElements(gl.TRIANGLES, vertexCount, type, offset); + } +} diff --git a/src/client/main.ts b/src/client/main.ts index bce21bb..91af0a6 100644 --- a/src/client/main.ts +++ b/src/client/main.ts @@ -6,8 +6,7 @@ import fsSource4 from './shaders/texture.frag'; import {fetchObj, updateObj} from './objutils'; import {initShaderProgram} from './shaders'; import {loadTexture} from './texture'; -import {initMatrices} from './matrix'; -import {initVertexAttribs} from './vertexattrib'; +import {drawScene} from './draw'; import {uiUpdateParams, uiUpdateTexture, @@ -121,60 +120,3 @@ async function main() { uiUpdateShader(context); requestAnimationFrame(render); } - -/** - * Draw a webgl scene - * @param {any} gl the WebGL context - * @param {any} programInfo WebGL program information - * @param {any} buffers the buffers to draw - * @param {number} params various parameterss - * @param {any} texture the texture to load - */ -function drawScene(gl: any, - programInfo: any, - buffers: any, - params: any, - texture: any) { - gl.clearColor(0.0, 0.0, 0.0, 1.0); - gl.clearDepth(1.0); - gl.enable(gl.DEPTH_TEST); - gl.depthFunc(gl.LEQUAL); - gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT); - - initVertexAttribs(gl, programInfo, buffers); - gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffers.indices); - gl.useProgram(programInfo.program); - gl.activeTexture(gl.TEXTURE0); - gl.bindTexture(gl.TEXTURE_2D, texture); - gl.uniform1i(programInfo.uniformLocations.uSampler, 0); - - const [ - projectionMatrix, - viewMatrix, - modelMatrix, - normalModelMatrix, - ] = initMatrices(gl, params); - - for (let i = 0; i < params.instanceNumber; i++) { - gl.uniformMatrix4fv( - programInfo.uniformLocations.projectionMatrix, - false, - projectionMatrix); - gl.uniformMatrix4fv( - programInfo.uniformLocations.viewMatrix, - false, - viewMatrix); - gl.uniformMatrix4fv( - programInfo.uniformLocations.modelMatrix, - false, - modelMatrix[i]); - gl.uniformMatrix4fv( - programInfo.uniformLocations.normalModelMatrix, - false, - normalModelMatrix[i]); - const vertexCount = params.length; - const type = gl.UNSIGNED_SHORT; - const offset = 0; - gl.drawElements(gl.TRIANGLES, vertexCount, type, offset); - } -}