topical media & game development

talk show tell print

student-ar-org-papervision3d-core-geom-Particles.ax

student-ar-org-papervision3d-core-geom-Particles.ax [swf] [flash] flex


  package org.papervision3d.core.geom
  {
          import org.papervision3d.core.geom.renderables.Vertex3DInstance;        
          import org.papervision3d.core.geom.renderables.Vertex3D;        
          
          import flash.geom.Rectangle;        
          
          import org.papervision3d.core.math.Matrix3D;        
          import org.papervision3d.core.geom.renderables.Particle;
          import org.papervision3d.core.render.data.RenderSessionData;
          import org.papervision3d.objects.DisplayObject3D;
          import org.papervision3d.core.culling.IObjectCuller;        
          
          
<p> The @ax-student-ar-org-papervision3d-core-geom-Particles object is a DisplayObject3D that is used solely for displaying particle objects. A single particle is a 2D graphic that is scaled and positioned relative to a 3D point, without any perspective distortion. In effect, it's like a plane that is always facing the camera. This is sometimes referred to as a 3D sprite, pointsprite or billboard. A particle's appearance is defined by its ParticleMaterial. </p> <p> Example: </p> <pre><code> //This example creates a @ax-student-ar-org-papervision3d-core-geom-Particles DisplayObject3D and adds 100 particles into it. var num@ax-student-ar-org-papervision3d-core-geom-Particles : int = 100; var particles : @ax-student-ar-org-papervision3d-core-geom-Particles = new @ax-student-ar-org-papervision3d-core-geom-Particles(); var particleMaterial : ParticleMaterial = new ParticleMaterial(0xff0000, 0.8,ParticleMaterial.SHAPE_CIRCLE); var particleSize : Number = 5; for(var i : int = 0; i<num@ax-student-ar-org-papervision3d-core-geom-Particles; i++) { var xpos : Number = Math.random()*200; var ypos : Number = Math.random()*200; var zpos : Number = Math.random()*200; var particle : Particle = new Particle(particleMaterial, particleSize, xpos, ypos, zpos); particles.addParticle(particle); } scene.addChild(particles); </code></pre> </p> <p> See also : ParticleMaterial, MovieAssetParticleMaterial, MovieParticleMaterial, BitmapParticleMaterial. </p> @Author Ralph Hauwert @Author Seb Lee-Delisle

  
  
        public class @ax-student-ar-org-papervision3d-core-geom-Particles extends Vertices3D
          {
                  
                  private var vertices:Array;
                  public var particles:Array;
                  
                   

parameter: name An identifier for this @ax-student-ar-org-papervision3d-core-geom-Particles object.

  
                           
                  public function @ax-student-ar-org-papervision3d-core-geom-Particles(name:String = "@ax-student-ar-org-papervision3d-core-geom-Particles")
                  {
                          this.vertices = new Array();
                          this.particles = new Array();
                          
                          super(vertices, name);
                  }
                  
                  
Converts 3D vertices into 2D space, to prepare for rendering onto the stage.
parameter: parent The parent DisplayObject3D
parameter: renderSessionData The renderSessionData object for this render cycle.

  
  
                  public override function project( parent :DisplayObject3D, renderSessionData:RenderSessionData ):Number
                  {
                          super.project(parent,renderSessionData);
                          
                          var viewport : Rectangle = renderSessionData.camera.viewport;
                          // TODO (MEDIUM) implement Frustum camera rendering for @ax-student-ar-org-papervision3d-core-geom-Particles
                          
                                  //return projectFrustum(parent, renderSessionData);
                          if(this.culled) return 0; 
  
                          var p:Particle;
                          
                          
                  
                          for each(p in particles)
                          {
                                  if( renderSessionData.camera is IObjectCuller )
                                  {
                                          var v:Vertex3D = p.vertex3D;
                                          p.renderScale = viewport.width /2 /(v.x * view.n41 + v.y * view.n42 + v.z * view.n43 + view.n44) ;
                                  } 
                                  else
                                  {        
                                          var fz:Number = (renderSessionData.camera.focus*renderSessionData.camera.zoom);
                                          p.renderScale = fz / (renderSessionData.camera.focus + p.vertex3D.vertex3DInstance.z);
                                  }
                                  p.updateRenderRect();
                                  
                                  if(renderSessionData.viewPort.particleCuller.testParticle(p)){
                                          p.renderCommand.screenZ = p.vertex3D.vertex3DInstance.z;
                                          renderSessionData.renderer.addToRenderList(p.renderCommand);        
                                  }else{
                                          renderSessionData.renderStatistics.culled@ax-student-ar-org-papervision3d-core-geom-Particles++;
                                  }
                          }
                          return 1;
                  }
                  
                  /*
                  public override function projectFrustum( parent :DisplayObject3D, renderSessionData:RenderSessionData ):Number 
                  {
                          
                  
                          var view : Matrix3D = this.view,
                                  viewport : Rectangle = renderSessionData.camera.viewport,
                                  m11 :Number = view.n11,
                                  m12 :Number = view.n12,
                                  m13 :Number = view.n13,
                                  m21 :Number = view.n21,
                                  m22 :Number = view.n22,
                                  m23 :Number = view.n23,
                                  m31 :Number = view.n31,
                                  m32 :Number = view.n32,
                                  m33 :Number = view.n33,
                                  m41 :Number = view.n41,
                                  m42 :Number = view.n42,
                                  m43 :Number = view.n43,
                                  vx        :Number,
                                  vy        :Number,
                                  vz        :Number,
                                  s_x        :Number,
                                  s_y        :Number,
                                  s_z        :Number,
                                  s_w :Number,
                                  vpw :Number = viewport.width / 2,
                                  vph :Number = viewport.height / 2,
                                  vertex : Vertex3D, 
                                  screen : Vertex3DInstance,
                                  vertices :Array  = this.geometry.vertices,
                                  i        :int    = particles.length,
                                  p                : Particle; 
                                  
                          while( p = particles[--i] )
                          {
                                  vertex = p.vertex3D; 
                                  
                                  // Center position
                                  vx = vertex.x;
                                  vy = vertex.y;
                                  vz = vertex.z;
                                  
                                  s_z = vx * m31 + vy * m32 + vz * m33 + view.n34;
                                  s_w = vx * m41 + vy * m42 + vz * m43 + view.n44;
                                  
                                  //trace(s_w);
                                  
                                  screen = vertex.vertex3DInstance;
                                  
                                  // to normalized clip space (0.0 to 1.0)
                                  // NOTE: can skip and simply test (s_z < 0) and save a div
                                  s_z /= s_w;
                          
                                  // is point between near- and far-plane?
                                  if( screen.visible = (s_z > 0 && s_z < 1) )
                                  {
                                          // to normalized clip space (-1,-1) to (1, 1)
                                          s_x = (vx * m11 + vy * m12 + vz * m13 + view.n14) / s_w;
                                          s_y = (vx * m21 + vy * m22 + vz * m23 + view.n24) / s_w;
                                          
                                          // NOTE: optionally we can flag screen verts here 
                                          //screen.visible = (s_x > -1 && s_x < 1 && s_y > -1 && s_y < 1);
                                          
                                          // project to viewport.
                                          screen.x = s_x * vpw;
                                          
                                          screen.y = s_y * vph;
                                          
                                          //Papervision3D.logger.debug( "sx:" + screen.x + " " +screen.y );
                                          // NOTE: z not lineair, value increases when nearing far-plane.
                                          screen.z = s_z*s_w;
                                  } 
                                          trace("particles projectfrustum vertex  visible :", screen.visible);
                                  
                          }
                          
                          return 0;
                  }
                  
  		*/
                  
                  
Adds a particle. @param particle The particle to be added.

  
                  public function addParticle(particle:Particle):void
                  {
                          particle.instance = this;
                          particles.push(particle);
                          vertices.push(particle.vertex3D);
                  }
                  
                  
Removes a particle. @param particle The particle to be removed.

  
                  public function removeParticle(particle:Particle):void
                  {
                          particle.instance = null;
                          particles.splice(particles.indexOf(particle,0), 1);
                          vertices.splice(vertices.indexOf(particle.vertex3D,0), 1);
                  }
                  
                  
Removes all the particles.

  
                  public function removeAll@ax-student-ar-org-papervision3d-core-geom-Particles():void
                  {
                          particles = new Array();
                          vertices = new Array();
                          geometry.vertices = vertices;
                  }
                  
                  
          }
  }


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