topical media & game development

talk show tell print

graphic-o3d-samples-o3djs-rendergraph.js / js



  /*
   * Copyright 2009, Google Inc.
   * All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions are
   * met:
   *
   *     * Redistributions of source code must retain the above copyright
   * notice, this list of conditions and the following disclaimer.
   *     * Redistributions in binary form must reproduce the above
   * copyright notice, this list of conditions and the following disclaimer
   * in the documentation and/or other materials provided with the
   * distribution.
   *     * Neither the name of Google Inc. nor the names of its
   * contributors may be used to endorse or promote products derived from
   * this software without specific prior written permission.
   *
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
   * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
   * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
   * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
   * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */
  
  
@fileoverview This file contains various functions for helping create render graphs for o3d. It puts them in the "rendergraph" module on the o3djs object. Note: This library is only a sample. It is not meant to be some official library. It is provided only as example code.

  
  
  o3djs.provide('o3djs.rendergraph');
  
  
A Module for creating render graphs. @namespace

  
  o3djs.rendergraph = o3djs.rendergraph || {};
  
  
Creates a basic render graph setup to draw opaque and transparent 3d objects.
parameter: {!o3d.Pack} pack Pack to manage created objects.
parameter: {!o3d.Transform} treeRoot root Transform of tree to render.
parameter: {!o3d.RenderNode} opt_parent RenderNode to build this view under.
parameter: {!o3djs.math.Vector4} opt_clearColor color to clear view.
parameter: {number} opt_priority Optional base priority for created objects.
parameter: {!o3djs.math.Vector4} opt_viewport viewport settings for view.
parameter: {!o3d.DrawList} opt_performanceDrawList Optional DrawList to use for performanceDrawPass.
parameter: {!o3d.DrawList} opt_zOrderedDrawList Optional DrawList to use for zOrderedDrawPass.
returns: {!o3djs.rendergraph.ViewInfo} A ViewInfo object with info about everything created.

  
  o3djs.rendergraph.createView = function(pack,
                                          treeRoot,
                                          opt_parent,
                                          opt_clearColor,
                                          opt_priority,
                                          opt_viewport,
                                          opt_performanceDrawList,
                                          opt_zOrderedDrawList) {
    return new o3djs.rendergraph.ViewInfo(pack,
                                          treeRoot,
                                          opt_parent,
                                          opt_clearColor,
                                          opt_priority,
                                          opt_viewport,
                                          opt_performanceDrawList,
                                          opt_zOrderedDrawList);
  };
  
  
Creates a basic render graph setup to draw opaque and transparent 3d objects.
parameter: {!o3d.Pack} pack Pack to manage created objects.
parameter: {!o3d.Transform} treeRoot root Transform of tree to render.
parameter: {!o3d.RenderNode} opt_parent RenderNode to build this view under.
parameter: {!o3djs.math.Vector4} opt_clearColor color to clear view.
parameter: {number} opt_priority Optional base priority for created objects.
parameter: {!o3djs.math.Vector4} opt_viewport viewport settings for view.
returns: {!o3djs.rendergraph.ViewInfo} A ViewInfo object with info about everything created.

  
  o3djs.rendergraph.createBasicView = function(pack,
                                               treeRoot,
                                               opt_parent,
                                               opt_clearColor,
                                               opt_priority,
                                               opt_viewport) {
     return o3djs.rendergraph.createView(pack,
                                         treeRoot,
                                         opt_parent,
                                         opt_clearColor,
                                         opt_priority,
                                         opt_viewport);
  };
  
  
Creates an extra view render graph setup to draw opaque and transparent 3d objects based on a previously created view. It uses the previous view to share draw lists and to set the priority.
parameter: {!o3djs.rendergraph.ViewInfo} viewInfo ViewInfo returned from createBasicView.
parameter: {!o3djs.math.Vector4} opt_viewport viewport settings for view.
parameter: {!o3djs.math.Vector4} opt_clearColor color to clear view.
parameter: {number} opt_priority base priority for created objects.
returns: {!o3djs.rendergraph.ViewInfo} A ViewInfo object with info about everything created.

  
  o3djs.rendergraph.createExtraView = function(viewInfo,
                                               opt_viewport,
                                               opt_clearColor,
                                               opt_priority) {
    return o3djs.rendergraph.createView(viewInfo.pack,
                                        viewInfo.treeRoot,
                                        viewInfo.renderGraphRoot,
                                        opt_clearColor,
                                        opt_priority,
                                        opt_viewport,
                                        viewInfo.performanceDrawList,
                                        viewInfo.zOrderedDrawList);
  };
  
  
A ViewInfo object creates the standard o3d objects needed for a single 3d view. Those include a ClearBuffer followed by a TreeTraveral followed by 2 DrawPasses all of which are children of a Viewport. On top of those a DrawContext and optionally 2 DrawLists although you can pass in your own DrawLists if there is a reason to reuse the same DrawLists such was with mulitple views of the same scene. The render graph created is something like: <pre> [Viewport] | +------+--------+------------------+---------------------+ | | | | [ClearBuffer] [TreeTraversal] [Performance StateSet] [ZOrdered StateSet] | | [Performance DrawPass] [ZOrdered DrawPass] </pre> @constructor
parameter: {!o3d.Pack} pack Pack to manage created objects.
parameter: {!o3d.Transform} treeRoot root Transform of tree to render.
parameter: {!o3d.RenderNode} opt_parent RenderNode to build this view under.
parameter: {!o3djs.math.Vector4} opt_clearColor color to clear view.
parameter: {number} opt_priority Optional base priority for created objects.
parameter: {!o3djs.math.Vector4} opt_viewport viewport settings for view.
parameter: {!o3d.DrawList} opt_performanceDrawList DrawList to use for performanceDrawPass.
parameter: {!o3d.DrawList} opt_zOrderedDrawList DrawList to use for zOrderedDrawPass.

  
  o3djs.rendergraph.ViewInfo = function(pack,
                                        treeRoot,
                                        opt_parent,
                                        opt_clearColor,
                                        opt_priority,
                                        opt_viewport,
                                        opt_performanceDrawList,
                                        opt_zOrderedDrawList) {
    var clearColor = opt_clearColor || [0.5, 0.5, 0.5, 1.0];
  
    var viewPriority = opt_priority || 0;
    var priority = 0;
  
    // Create Viewport.
    var viewport = pack.createObject('Viewport');
    if (opt_viewport) {
      viewport.viewport = opt_viewport;
    }
    viewport.priority = viewPriority;
  
    // Create a clear buffer.
    var clearBuffer = pack.createObject('ClearBuffer');
    clearBuffer.clearColor = clearColor;
    clearBuffer.priority = priority++;
    clearBuffer.parent = viewport;
  
    // Create DrawLists
    var performanceDrawList;
    if (opt_performanceDrawList) {
      performanceDrawList = opt_performanceDrawList;
      this.ownPerformanceDrawList_ = false;
    } else {
      performanceDrawList = pack.createObject('DrawList');
      this.ownPerformanceDrawList_ = true;
    }
    var zOrderedDrawList;
    if (opt_zOrderedDrawList) {
      zOrderedDrawList = opt_zOrderedDrawList;
      this.ownZOrderedDrawList_ = false;
    } else {
      zOrderedDrawList = pack.createObject('DrawList');
      this.ownZOrderedDrawList_ = true;
    }
  
    // Create DrawContext.
    var drawContext = pack.createObject('DrawContext');
  
    // Creates a TreeTraversal and parents it to the root.
    var treeTraversal = pack.createObject('TreeTraversal');
    treeTraversal.priority = priority++;
    treeTraversal.parent = viewport;
  
    // Creates an empty stateSet to parent the performanceDrawPass to
    // just to make it easier to do certain effects.
    var performanceStateSet = pack.createObject('StateSet');
    var performanceState = pack.createObject('State');
    performanceStateSet.state = performanceState;
    performanceStateSet.priority = priority++;
    performanceStateSet.parent = viewport;
    performanceState.getStateParam('ColorWriteEnable').value = 7;
  
    // Creates a DrawPass for performance shapes.
    var performanceDrawPass = pack.createObject('DrawPass');
    performanceDrawPass.drawList = performanceDrawList;
    performanceDrawPass.parent = performanceStateSet;
  
    // Creates a StateSet so everything on the zOrderedDrawPass is assumed
    // to need alpha blending with the typical settings.
    var zOrderedStateSet = pack.createObject('StateSet');
    var zOrderedState = pack.createObject('State');
    zOrderedState.getStateParam('AlphaBlendEnable').value = true;
    zOrderedState.getStateParam('SourceBlendFunction').value =
        o3djs.base.o3d.State.BLENDFUNC_SOURCE_ALPHA;
    zOrderedState.getStateParam('DestinationBlendFunction').value =
        o3djs.base.o3d.State.BLENDFUNC_INVERSE_SOURCE_ALPHA;
    zOrderedState.getStateParam('AlphaTestEnable').value = true;
    zOrderedState.getStateParam('AlphaComparisonFunction').value =
        o3djs.base.o3d.State.CMP_GREATER;
    zOrderedState.getStateParam('ColorWriteEnable').value = 7;
  
    zOrderedStateSet.state = zOrderedState;
    zOrderedStateSet.priority = priority++;
    zOrderedStateSet.parent = viewport;
  
    // Creates a DrawPass for zOrdered shapes.
    var zOrderedDrawPass = pack.createObject('DrawPass');
    zOrderedDrawPass.drawList = zOrderedDrawList;
    zOrderedDrawPass.sortMethod = o3djs.base.o3d.DrawList.BY_Z_ORDER;
    zOrderedDrawPass.parent = zOrderedStateSet;
  
    // Register the passlists and drawcontext with the TreeTraversal
    treeTraversal.registerDrawList(performanceDrawList, drawContext, true);
    treeTraversal.registerDrawList(zOrderedDrawList, drawContext, true);
    treeTraversal.transform = treeRoot;
  
    
Pack that manages the objects created for this ViewInfo. @type {!o3d.Pack}

  
    this.pack = pack;
  
    
The RenderNode this ViewInfo render graph subtree is parented under. @type {(!o3d.RenderNode|undefined)}

  
    this.renderGraphRoot = opt_parent;
  
    
The root node of the transform graph this ViewInfo renders. @type {!o3d.Transform}

  
    this.treeRoot = treeRoot;
  
    
The root of the subtree of the render graph this ViewInfo is managing. If you want to set the priority of a ViewInfo's rendergraph subtree use <pre> viewInfo.root.priority = desiredPriority; </pre> @type {!o3d.RenderGraph}

  
    this.root = viewport;
  
    
The Viewport RenderNode created for this ViewInfo. @type {!o3d.Viewport}

  
    this.viewport = viewport;
  
    
The ClearBuffer RenderNode created for this ViewInfo. @type {!o3d.ClearBuffer}

  
    this.clearBuffer = clearBuffer;
  
    
The StateSet RenderNode above the performance DrawPass in this ViewInfo @type {!o3d.StateSet}

  
    this.performanceStateSet = performanceStateSet;
  
    
The State object used by the performanceStateSet object in this ViewInfo. By default, no states are set here. @type {!o3d.State}

  
    this.performanceState = performanceState;
  
    
The DrawList used for the performance draw pass. Generally for opaque materials. @type {!o3d.DrawList}

  
    this.performanceDrawList = performanceDrawList;
  
    
The StateSet RenderNode above the ZOrdered DrawPass in this ViewInfo @type {!o3d.StateSet}

  
    this.zOrderedStateSet = zOrderedStateSet;
  
    
The State object used by the zOrderedStateSet object in this ViewInfo. By default AlphaBlendEnable is set to true, SourceBlendFucntion is set to State.BLENDFUNC_SOURCE_ALPHA and DestinationBlendFunction is set to State.BLENDFUNC_INVERSE_SOURCE_ALPHA @type {!o3d.State}

  
    this.zOrderedState = zOrderedState;
  
    
The DrawList used for the zOrdered draw pass. Generally for transparent materials. @type {!o3d.DrawList}

  
    this.zOrderedDrawList = zOrderedDrawList;
  
    
The DrawContext used by this ViewInfo. @type {!o3d.DrawContext}

  
    this.drawContext = drawContext;
  
    
The TreeTraversal used by this ViewInfo. @type {!o3d.TreeTraversal}

  
    this.treeTraversal = treeTraversal;
  
    
The DrawPass used with the performance DrawList created by this ViewInfo. @type {!o3d.DrawPass}

  
    this.performanceDrawPass = performanceDrawPass;
  
    
The DrawPass used with the zOrdered DrawList created by this ViewInfo. @type {!o3d.DrawPass}

  
    this.zOrderedDrawPass = zOrderedDrawPass;
  
    
The highest priority used for objects under the Viewport RenderNode created by this ViewInfo. @type {number}

  
    this.priority = priority;
  
    // Parent whatever the root is to the parent passed in.
    if (opt_parent) {
      this.root.parent = opt_parent;
    }
  };
  
  
Destroys the various objects created for the view.
parameter: {Boolean} opt_destroyDrawContext True if you want view's DrawContext destroyed. Default = true.
parameter: {Boolean} opt_destroyDrawList True if you want view's DrawLists destroyed. Default = true.

  
  o3djs.rendergraph.ViewInfo.prototype.destroy = function(
      opt_destroyDrawContext,
      opt_destroyDrawList) {
    if (opt_destroyDrawContext === undefined) {
      opt_destroyDrawContext = true;
    }
    if (opt_destroyDrawList === undefined) {
      opt_destroyDrawList = true;
    }
    // Remove everything we created from the pack.
    this.pack.removeObject(this.viewport);
    this.pack.removeObject(this.clearBuffer);
    if (this.ownPerformanceDrawList_ && opt_destroyDrawList) {
      this.pack.removeObject(this.performanceDrawList);
    }
    if (this.ownZOrderedDrawList_ && opt_destroyDrawList) {
      this.pack.removeObject(this.zOrderedDrawList);
    }
    if (opt_destroyDrawContext) {
      this.pack.removeObject(this.drawContext);
    }
    this.pack.removeObject(this.treeTraversal);
    this.pack.removeObject(this.performanceDrawPass);
    this.pack.removeObject(this.zOrderedDrawPass);
    // Remove our substree from its parent.
    this.viewport.parent = null;
  
    // At this point, IF nothing else is referencing any of these objects
    // they should get removed. The most likely things still being referenced
    // are the DrawLists since materials reference DrawLists.
    // Should we provide a function that removes all references to those
    // DrawLists?
  };
  
  


(C) Æliens 20/2/2008

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.