topical media & game development

talk show tell print

graphic-webgl-scenejs-examples-animated-texture-animated-texture.js / js



  
Animated texture example In this example we're creating two texture layers, then animating the rotation, scale and blendFactor of the second layer to create the effect of multiple spinning General Zods that fade in and out over an underlying image of SuperMan. More info: github.com/xeolabs/scenejs/wiki/texture

  
  
  SceneJS.createScene({
    type: "scene",
    id: "theScene",
    canvasId: "theCanvas",
  
    nodes: [
      {
      type: "lookAt",
      eye : { x: 0.0, y: 0.0, z: 10},
      look : { x : 0.0, y : 0.0, z : 0 },
      up : { x: 0.0, y: 1.0, z: 0.0 },
  
      nodes: [
        {
          type: "camera",
          optics: {
          type: "perspective",
          fovy : 25.0,
          aspect : 1.47,
          near : 0.10,
          far : 300.0
          },
  
          nodes: [
          {
            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: 0.7, g: 0.7, b: 0.7 },
            diffuse:      true,
            specular:     true,
            dir:        { x: 1.0, y: 0.5, z: -1.0 }
          },
          {
            type: "material",
            baseColor:  { r: 1.0, g: 1.0, b: 1.0 },
            specularColor:  { r: 1.0, g: 1.0, b: 1.0 },
            specular:   0.3,
            shine:    10.0,
  
            nodes: [
              {
              type: "texture",
  
              id: "theTexture",
  
              layers: [
                {
                  uri:"graphic-webgl-scenejs-examples-web-images-superman.jpg",
                  minFilter: "linear",
                  magFilter: "linear",
                  wrapS: "repeat",
                  wrapT: "repeat",
                  isDepth: false,
                  depthMode:"luminance",
                  depthCompareMode: "compareRToTexture",
                  depthCompareFunc: "lequal",
                  flipY: false,
                  width: 1,
                  height: 1,
                  internalFormat:"lequal",
                  sourceFormat:"alpha",
                  sourceType: "unsignedByte",
                  applyTo:"baseColor",
                  blendMode: "add",
                  blendFactor: 1.0
                },
                {
                  uri:"../web/images/general-zod.jpg",
                  minFilter: "linear",
                  magFilter: "linear",
                  wrapS: "repeat",
                  wrapT: "repeat",
                  isDepth: false,
                  depthMode:"luminance",
                  depthCompareMode: "compareRToTexture",
                  depthCompareFunc: "lequal",
                  flipY: false,
                  width: 1,
                  height: 1,
                  internalFormat:"lequal",
                  sourceFormat:"alpha",
                  sourceType: "unsignedByte",
                  applyTo:"baseColor",
                  blendMode: "add",
                  blendFactor: 1.0,
  
                  /* Texture rotation angle in degrees
                 */
                  rotate: {
                  z: 0.0
                  },
  
                  /* Texture translation offset
                 */
                  translate : {
                  x: 0,
                  y: 0
                  },
  
                  /* Texture scale factors
                 */
                  scale : {
                  x: 1.0,
                  y: 1.0
                  }
                }
              ],
  
              nodes: [
                {
                  type: "rotate",
                  id: "pitch",
                  angle: -30.0,
                  x : 1.0,
  
                  nodes: [
                  {
                    type: "rotate",
                    id: "yaw",
                    angle: -30.0,
                    y : 1.0,
  
                    nodes: [
                      {
                      type: "cube"
                      }
                    ]
                  }
                  ]
                }
              ]
              }
            ]
          }
          ]
        }
      ]
      }
    ]
  });
  
  /*----------------------------------------------------------------------
   * Scene rendering loop and mouse handler stuff
   *---------------------------------------------------------------------*/
  
  var scene = SceneJS.scene("theScene");
  
  var yaw = -30;
  var pitch = -30;
  var lastX;
  var lastY;
  var dragging = false;
  
  var texAngle = 0.0;
  var texScale = 1.0;
  
  /* For texture animation
   */
  var timeLast = (new Date()).getTime();
  
  var canvas = document.getElementById("theCanvas");
  
  function mouseDown(event) {
    lastX = event.clientX;
    lastY = event.clientY;
    dragging = true;
  }
  
  function touchStart(event) {
    lastX = event.targetTouches[0].clientX;
    lastY = event.targetTouches[0].clientY;
    dragging = true;
  }
  
  function mouseUp() {
    dragging = false;
  }
  
  function touchEnd() {
    dragging = false;
  }
  
  function mouseMove(event) {
    var posX = event.clientX;
    var posY = event.clientY;
    actionMove(posX,posY);
  }
  
  function touchMove(event) {
    var posX = event.targetTouches[0].clientX;
    var posY = event.targetTouches[0].clientY;
    actionMove(posX,posY);
  }
  
  function actionMove(posX, posY) {
    if (dragging) {
      yaw += (posX - lastX) * 0.5;
      pitch += (posY - lastY) * 0.5;
      lastX = posX;
      lastY = posY;
  
      scene.findNode("pitch").set("angle", pitch);
      scene.findNode("yaw").set("angle", yaw);
    }
  }
  
  canvas.addEventListener('mousedown', mouseDown, true);
  canvas.addEventListener('mousemove', mouseMove, true);
  canvas.addEventListener('mouseup', mouseUp, true);
  canvas.addEventListener('touchstart', touchStart, true);
  canvas.addEventListener('touchmove', touchMove, true);
  canvas.addEventListener('touchend', touchEnd, true);
  
  scene.start({
    idleFunc: function() {
  
      /* Animate scale, rotate and blendFactor of second texture layer
     */
      scene.findNode("theTexture").set("layers", {
      "1":{
        scale: {
          x: texScale,
          y: texScale
        },
        rotate: {
          z: texAngle
        },
  
        // http://scenejs.wikispaces.com/texture#Texture%20Layers-Layer%20Blend%20Factor
  
        blendFactor: Math.abs(Math.sin(texAngle * 0.01))
      }
      });
      texAngle += 0.4;
      texScale = (texScale + 0.01) % 10.0;
    }
  });
  


(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.