topical media & game development

talk show tell print

graphic-webgl-scenejs-examples-grid-grid.js / js



  /*
  
   */
  
  function createLibrary() {
    return {
      type: "library",
      nodes: [
        {
          type: "geometry",
          coreId: "building-geometry",
  
          primitive: "triangles",
          positions : [
            5, 5, 5,-5, 5, 5,-5,-5, 5,5, -5, 5, 5, 5, 5, 5,-5, 5, 5,-5,-5, 5, 5,-5,
            5, 5, 5, 5, 5,-5,-5, 5,-5,-5, 5, 5, -5, 5, 5,-5, 5,-5,-5,-5,-5,-5,-5, 5,
            -5,-5,-5, 5,-5,-5, 5,-5, 5,-5,-5, 5, 5,-5,-5,-5,-5,-5,-5, 5,-5, 5, 5,-5
          ],
          normals : [
            0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0,
            0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1, 0,-1, 0, 0, -1, 0, 0, -1, 0, 0,-1, 0, 0,
            0,-1, 0, 0,-1, 0,0,-1, 0, 0,-1, 0, 0, 0,-1, 0, 0,-1, 0, 0,-1,0, 0,-1
          ],
          uv : [
            5, 5, 0, 5, 0, 0, 5, 0, 0, 5, 0, 0, 5, 0,5, 5, 5, 0, 5, 5,0, 5,0, 0,
            5, 5,0, 5, 0, 0,5, 0, 0, 0,5, 0, 5, 5, 0, 5, 0, 0,5, 0, 5, 5, 0, 5
          ],
          indices : [
            0, 1, 2, 0, 2, 3, 4, 5, 6, 4, 6, 7, 8, 9,10, 8,10,11,
            12,13,14,12,14,15,16,17,18, 16,18,19, 20,21,22, 20,22,23
          ]
        }
      ]
    };
  }
  function createCity() {
  
    var nodes = [];
    var width = 300.0;
    var blockWidth = 20;
    var height;
    var time = 0.0;
    for (var x = -width; x < width; x += blockWidth) {
      for (var z = -width; z < width; z += blockWidth) {
        nodes.push({
          type: "translate",
          x: x,
          y: 0,
          z: z,
          nodes: [
            {
              type: "scale",
              x: 2.0,
              y: 6.0,
              z: 2.0,
              nodes: [
                {
                  type: "name",
                  name: "cube" + x + "," + z,
  
                  nodes: [
                    {
                      type: "shaderParams",
                      params: {
                        time2: ++time
                      },
  
                      nodes: [
  
                        {
                          type: "material",
                          coreId: "material",
                          emit: 0,
                          baseColor:   { r: 0.5, g: 0.5, b: 0.6 },
                          specularColor: { r: 0.9, g: 0.9, b: 0.9 },
                          specular:    1.0,
                          shine:     70.0,
  
                          nodes: [
  
                            {
                              type: "geometry",
                              coreId: "building-geometry"
                            }
                          ]
                        }
                      ]
                    }
                  ]
                }
              ]
            }
          ]
        });
  
      }
    }
    return {
      type: "node",
      nodes: nodes
    };
  }
  
  SceneJS.createScene({
  
    /* ID that we'll access the scene by when we want to render it
     */
    id: "theScene",
  
    /* Bind scene to a WebGL canvas:
     */
    canvasId: "theCanvas",
  
    nodes: [
  
      createLibrary(),
  
      /* Viewing transform
       */
      {
        type: "lookAt",
        eye : { x: 0.0, y: 50.0, z: 1600 },
        look : { y:1.0 },
        up : { y: 1.0 },
  
        nodes: [
  
          /* Projection
           */
          {
            type: "camera",
            optics: {
              type: "perspective",
              fovy : 25.0,
              aspect : 1.47,
              near : 0.10,
              far : 3000.0
            },
  
            nodes: [
  
              /* Point lights
               */
              {
                type: "light",
                mode:          "dir",
                color:         { r: 1.0, g: 1.0, b: 1.0 },
                diffuse:        true,
                specular:        true,
                dir:          { x: 1.0, y: -0.5, z: -1.0 }
              },
  
              {
                type: "light",
                mode:          "dir",
                color:         { r: 1.0, g: 1.0, b: 0.8 },
                diffuse:        true,
                specular:        false,
                dir:          { x: 0.0, y: -0.5, z: -1.0 }
              },
  
              /* Modelling transforms - note the IDs, "pitch" and "yaw"
               */
              {
                type: "rotate",
                id: "pitch",
                angle: 0.0,
                x : 1.0,
  
                nodes: [
                  {
                    type: "rotate",
                    id: "yaw",
                    angle: 0.0,
                    y : 1.0,
  
                    nodes: [
  
                      /* Ambient, diffuse and specular surface properties
                       */
                      {
                        type: "material",
                        emit: 0,
                        baseColor:   { r: 0.5, g: 0.5, b: 0.6 },
                        specularColor: { r: 0.9, g: 0.9, b: 0.9 },
                        specular:    1.0,
                        shine:     70.0,
  
                        nodes: [
                          {
                            type: "shader",
                            id: "myShader",
  
                            shaders: [
  
                              /* Vertex shader
                               */
                              {
                                stage: "vertex",
  
                                /* A GLSL snippet containing a custom function.
                                 *
                                 * The snippet can be given as either a string or an array
                                 * of strings.
                                 */
                                code: [
                                  "uniform float time; ",
                                  "uniform float time2; ",
  
                                  "vec4 myModelPosFunc(vec4 pos){",
                                  "  float t = time + time2;",
                                  //  "  pos.x+=sin(t *0.01) * 30.0;",
                                  "  pos.y+=sin(t * 0.1) * 5.0;",
                                  // "  pos.z+=sin(t *0.01) * 30.0;",
                                  "  return pos;",
                                  "}"],
  
                                /* Bind our custom function to a SceneJS vertex shader hook
                                 */
                                hooks: {
                                  // modelPos: "myModelPosFunc"
                                }
                              },
  
                              /* Fragment shader
                               */
                              {
                                stage: "fragment",
  
                                code: [
                                  "uniform float time; ",
                                  "uniform float time2; ",
  
                                  "vec4 myPixelColorFunc(vec4 color){",
                                  "  float t = time + time2;",
                                  "  color.r=color.r+sin(t)*0.3;",
                                  "  color.g=color.g+sin(t+0.3)*0.3;",
                                  "  color.b=color.b+sin(t+0.6)*0.3;",
                                  "  color.a=color.a+sin(t);",
                                  "  return color;",
                                  "}"],
  
                                /* Bind our custom function to a SceneJS vertex shader hook
                                 */
                                hooks: {
                                  pixelColor:   "myPixelColorFunc"
                                }
                              }
                            ],
  
                            /* Expose the time uniform as a parameter which we'll set
                             * on this shader node within the render loop.
                             *
                             * We can also set shader parameters using a child shaderParams
                             * node - see other custom shader examples for how.
                             *
                             */
                            params: {
                              time: 0.0,
                              time2: 0.0
                            },
  
                            nodes: [
  
                              createCity()
                            ]
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          }
        ]
      }
    ]
  });
  
  /* Get handles to some nodes
   */
  var scene = SceneJS.scene("theScene");
  var yawNode = scene.findNode("yaw");
  var pitchNode = scene.findNode("pitch");
  
  /* As mouse drags, we'll update the rotate nodes
   */
  
  var lastX;
  var lastY;
  var dragging = false;
  
  var newInput = false;
  var yaw = 0;
  var pitch = 0;
  
  var canvas = document.getElementById("theCanvas");
  
  function mouseDown(event) {
    lastX = event.clientX;
    lastY = event.clientY;
    dragging = true;
  }
  
  function mouseUp() {
    dragging = false;
  }
  
  function mouseMove(event) {
    if (dragging) {
  
      yaw += (event.clientX - lastX) * 0.5;
      pitch += (event.clientY - lastY) * 0.5;
  
      lastX = event.clientX;
      lastY = event.clientY;
  
      newInput = true;
    }
  }
  
  canvas.addEventListener('mousedown', mouseDown, true);
  canvas.addEventListener('mousemove', mouseMove, true);
  canvas.addEventListener('mouseup', mouseUp, true);
  
  var time = 0;
  
  /* Start the scene rendering
   */
  scene.start({
    idleFunc: function() {
      scene.findNode("myShader").set("params", {time:time += 0.2});
      if (newInput) {
        yawNode.set("angle", yaw);
        pitchNode.set("angle", pitch);
        newInput = false;
      }
    }
  });
  
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.