Advertisement
Guest User

Help

a guest
Dec 25th, 2014
155
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //<body onload="EngineStart()">
  2.  
  3. var canvas,
  4.     scene,  
  5.     objectA, // "GameObject A"
  6.     objectB; // "GameObject B"
  7.  
  8. //=========================================================================
  9. // (*) RENDER LOOP
  10. //=========================================================================
  11.  
  12. function Render(){
  13.     for(var i = 0; i < totalCanvases; i++){
  14.         var canvas  = Canvas[i],
  15.             gl      = canvas.gl;
  16.             gl.clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT);
  17.         // Scene is a "Node" that contains children that are geometry which contain meshes.
  18.         scene.Draw(gl);
  19. }
  20.  
  21. //=========================================================================
  22. // (1) Start Engine
  23. //=========================================================================
  24. function EngineStart(){
  25.     // Wrapper, holds width,height,gl contexts,etc..
  26.       canvas = new Canvas('id');
  27.    // Nww Mesh creates a wrapper that holds Shader Programs, typed arrays, etc..
  28.   var meshA  = new Mesh(canvas,meshVertices,colorVertices);
  29.   var meshB  = new Mesh(canvas,meshVertices,colorVertices);
  30.  
  31.  
  32.   //Object3D is the wrapper used to translate, rotate, scale the mesh. This would be the GameObject in Unity3D.
  33.   objectA = new Object3D(canvas,meshA);                                
  34.   objectB = new Object3D(canvas,meshB);
  35.  
  36. }
  37.  
  38. //=========================================================================
  39. // (2) Load3DObjects: Called when images,sounds,etc are fully loaded
  40. //=========================================================================
  41. function Load3DObjects(){
  42.     for(var i = 0; i < totalCanvases; i++){
  43.         var canvas  = Canvases[i],
  44.             gl      = canvas.gl,
  45.             aspect  = gl.drawingBufferWidth/gl.drawingBufferHeight;
  46.  
  47.             ForgeSDK.Math.Matrix4.Projection = ForgeSDK.Math.Matrix4.Perspective(fov,aspect,near,far);
  48.  
  49.             gl.viewport(0,0,canvas.width,canvas.height);
  50.             gl.clearColor(_r,_g,_b,_a);
  51.             gl.enable(gl.CULL_FACE);
  52.             gl.enable(gl.DEPTH_TEST);
  53.  
  54.             LoadShaders();
  55.     }
  56. }
  57.  
  58. //=========================================================================
  59. // (2) Load Shaders: If Materials present on mesh, runs LoadShaderProgram()
  60. //  adds the program to an array on mesh, and waits for a Mesh.ProgramLoaded callback.
  61. //=========================================================================
  62. function LoadShaders(){
  63.     for(var i = 0; i < totalMeshes; i++){
  64.         var mesh    = Meshes[i],
  65.             gl      = mesh.gl;
  66.         // Each Mesh has a Material Array that holds Vertex and fragment shader urls
  67.         mesh.matsToLoad = mesh.materials.length;
  68.         var that = mesh;
  69.  
  70.         for(mat in mesh.materials){  // Load Shader Programs
  71.             var prog = LoadShaderProgram(gl,material.vertexShader, material.fragmentShader,
  72.                                          function(prog){that.ProgramLoaded(gl,prog);});
  73.  
  74.             // The Mesh Wrapper (new Mesh) comes with a ProgramLoaded function I use as a callback
  75.             mesh.materialsToLoad = mesh.materials.length;
  76.             mesh.programs.push(prog);
  77.         }
  78.     }
  79. }
  80.  
  81. //=========================================================================
  82. // (3) LoadShaderProgram(): Compiles, waits for callback, links, and finally fires:
  83. //  mesh.ProgramLoaded() callback;
  84. //=========================================================================
  85.  
  86. function LoadShaderProgram(){
  87.     var program  = gl.createProgram();
  88.  
  89.     function vshaderLoaded(str){  // Callback, ready to Link
  90.         program.vshaderSource = str;
  91.         if(program.fshaderSource){
  92.             LinkShaderProgram(gl,program); // Link
  93.             callback(program); // Mesh.PromLoaded
  94.         }
  95.     }
  96.     function fshaderLoaded(str){ // Callback, ready to Link
  97.         program.fshaderSource = str;
  98.         if(program.vshaderSource){
  99.             LinkShaderProgram(gl,program); // Link
  100.             callback(program); // Mesh.PromLoaded
  101.         }
  102.     } // First Load Shader Files via XMLHttpRequest. Wait for Back to LinkShader Program
  103.     LoadShaderFile(vs,vshaderLoaded,true);
  104.     LoadShaderFile(fs,fshaderLoaded,true);
  105.  
  106.     return program;
  107. }
  108.  
  109. //=========================================================================
  110. // (4) Mesh.ProgramLoaded(): Add Uniforms and Attributes to Program
  111. // and when all of them are loaded, call Create GLBuffers
  112. //=========================================================================
  113.  
  114. Mesh.ProgramLoaded: function (){
  115.     program.projectionUniform       = gl.getUniformLocation(program,'u_matrix');
  116.     program.vertexPosAttribute      = gl.getAttribLocation(program,'aVertPos');
  117.     program.colorPosAttribute       = gl.getAttribLocation(program,"aColor");
  118.  
  119.     gl.enableVertexAttribArray(program.vertexPosAttribute);
  120.     gl.enableVertexAttribArray(program.colorPosAttribute);
  121.  
  122.     if(--this.materialsToLoad == 0){
  123.         // All Materials Loaded, Create Buffer
  124.         CreateGLBuffers();
  125.     }  
  126. }
  127. //=========================================================================
  128. // (5) Create Vertex, Color Buffers and Create "Nodes"
  129. //=========================================================================
  130. function CreateGLBuffers(){
  131.     var sceneChildren = [];
  132.  
  133.     for(var i = 0; i < totalObjects3D; i++){   
  134.         var object  = objects3D[i],
  135.             _mesh   = object.mesh,
  136.             gl      = object.gl;
  137.  
  138.             _mesh.vertexPosBuffer = gl.createBuffer();
  139.             gl.bindBuffer(gl.ARRAY_BUFFER, _mesh.vertexPosBuffer);
  140.             gl.bufferData(gl.ARRAY_BUFFER, _mesh.meshVertices, gl.DYNAMIC_DRAW);
  141.  
  142.             _mesh.colorPosBuffer = gl.createBuffer();
  143.             gl.bindBuffer(gl.ARRAY_BUFFER,_mesh.colorPosBuffer);
  144.             gl.bufferData(gl.ARRAY_BUFFER,_mesh.colorVertices, gl.DYNAMIC_DRAW);
  145.  
  146.        
  147.         var geometry = new Node([new Goemetry(_mesh)]);
  148.             geometry.name = "Geometry Node";
  149.             geometry.ref = object;
  150.             sceneChildren[sceneChildren.length] = new Node([geometry]);
  151.     }
  152.  
  153.     scene = new Node(sceneChildren);           
  154.  
  155.     RUN_GAME_LOOP();
  156. }
  157.  
  158. //=========================================================================
  159. // CREATE A NEW NODE FUNCTION
  160. //=========================================================================
  161.  
  162. New Node Object Function {
  163.     // Properties
  164.     x:          0,
  165.     y:          0,
  166.     z:          0,
  167.     rx:         0,
  168.     ry:         0,
  169.     rz:         0,
  170.     sx:         1,
  171.     sy:         1,
  172.     sz:         1,
  173.     localPosition:  Matrix4.Translation(this.x,this.y,this.z),
  174.     localRotationX: Matrix4.RotationX(this.rx),
  175.     localRotationY: Matrix4.RotationY(this.ry),
  176.     localRotationZ: Matrix4.RotationZ(this.rz),
  177.     localScale:     Matrix4.Scale(this.sx,this.sy,this.sz),
  178.  
  179.     children:   child ? child : [];
  180. }
  181.  
  182.  
  183. //=========================================================================
  184. // CREATE A NEW GEOMETRY NODE FUNCTION
  185. //=========================================================================
  186.  
  187. New Geometry Object Function  {
  188.     // Properties
  189.     name: 'geometry',
  190.     mesh: _mesh
  191. }
  192.  
  193. //=========================================================================
  194. // NODE DRAW AND CALCULATE MESH MATRICES FUNCTION
  195. //=========================================================================
  196.  
  197. Node.Draw: function (gl,program){
  198.     PushModelMatrix4(this.CalculateMatrices());
  199.     for(ch in this.children){
  200.         var child = this.children[ch];
  201.         child.Draw();
  202.     }
  203.     PopModelMatrix4();
  204. },
  205. Node.CalculateMatrices: function(){
  206.     // Calculate this Meshes: translate, rotations, and scale
  207.     // Make new Local Positon, Rotations Scale Matrices
  208.     // Multiply alll that to get new Model Matrix and RETURN IT
  209.     return modelMatrix;
  210.  
  211. }
  212.  
  213. //=========================================================================
  214. // GEOMETRY NODE DRAW FUNCTION
  215. //=========================================================================
  216.  
  217. Geometry.Draw: function (gl){ this.mesh.Draw(); } // Draw a Mesh
  218.  
  219. //=========================================================================
  220. // MESH DRAW FUNCTION
  221. //=========================================================================
  222.  
  223. Mesh.Draw: function (){
  224.     var gl = this.gl;
  225.     for(var p in this.programs){
  226.         var program = this.programs[p];
  227.         gl.useProgram(program);
  228.         gl.bindBuffer(gl.ARRAY_BUFFER, this.vertexPosBuffer);
  229.         gl.vertexAttribPointer(program.vertexPosAttribute,3, gl.FLOAT, false, 0, 0);
  230.  
  231.         gl.bindBuffer(gl.ARRAY_BUFFER, this.colorPosBuffer);
  232.         gl.vertexAttribPointer(program.colorPosAttribute,3,gl.UNSIGNED_BYTE,true,0,0);
  233.        
  234.         // Calculate Camera Matrix
  235.         // Calcuate View Matrix
  236.         // Calculate Projection
  237.  
  238.         gl.uniformMatrix4fv(program.projectionUniform, false, Matrix4.Model[ModelStackStop]);  
  239.         gl.drawArrays(gl.TRIANGLES,0,(this.meshVertices.length/3));
  240.     }      
  241. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement