Skip to content

Commit

Permalink
fix the Billboard bug
Browse files Browse the repository at this point in the history
  • Loading branch information
liaocheng committed Sep 5, 2012
1 parent 8d5087b commit aba7314
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 17 deletions.
6 changes: 5 additions & 1 deletion src/a3dparticle/animators/ParticleAnimation.as
Expand Up @@ -8,6 +8,7 @@ package a3dparticle.animators
import a3dparticle.particle.ParticleParam;
import away3d.animators.IAnimationSet;
import away3d.animators.IAnimationState;
import away3d.cameras.Camera3D;
import away3d.core.base.IRenderable;
import away3d.core.managers.Stage3DProxy;
import away3d.materials.passes.MaterialPassBase;
Expand Down Expand Up @@ -67,7 +68,7 @@ package a3dparticle.animators
public var OneConst:ShaderRegisterElement;
public var TwoConst:ShaderRegisterElement;
public var cameraPosConst:ShaderRegisterElement;
public var uvTarget:ShaderRegisterElement
public var uvTarget:ShaderRegisterElement;
//vary
private var varyTime:ShaderRegisterElement;
public var fragmentTime:ShaderRegisterElement;
Expand All @@ -83,6 +84,9 @@ package a3dparticle.animators
public var fadeFactorConst:ShaderRegisterElement;


//rendering camera
public var camera:Camera3D;

public function ParticleAnimation()
{
super();
Expand Down
23 changes: 10 additions & 13 deletions src/a3dparticle/animators/actions/rotation/BillboardGlobal.as
@@ -1,14 +1,14 @@
package a3dparticle.animators.actions.rotation
package a3dparticle.animators.actions.rotation
{
import a3dparticle.animators.actions.AllParticleAction;
import away3d.core.base.IRenderable;
import away3d.core.managers.Stage3DProxy;
import away3d.core.math.MathConsts;
import away3d.materials.passes.MaterialPassBase;
import away3d.materials.utils.ShaderRegisterElement;
import flash.display3D.Context3D;
import flash.display3D.Context3DProgramType;
import flash.geom.Matrix3D;
import flash.geom.Orientation3D;
import flash.geom.Vector3D;

import away3d.arcane;
Expand All @@ -20,8 +20,9 @@ package a3dparticle.animators.actions.rotation
public class BillboardGlobal extends AllParticleAction
{
private var rotationMatrixRegister:ShaderRegisterElement;
private var matrix:Matrix3D = new Matrix3D;

public function BillboardGlobal()
public function BillboardGlobal()
{
priority = 2;
}
Expand All @@ -42,16 +43,12 @@ package a3dparticle.animators.actions.rotation

override public function setRenderState(stage3DProxy : Stage3DProxy, renderable : IRenderable) : void
{
var mvp :Matrix3D = renderable.getModelViewProjectionUnsafe();
var comps : Vector.<Vector3D>;
comps = mvp.decompose();
var rotation :Matrix3D = new Matrix3D();
rotation.appendRotation(-comps[1].z * MathConsts.RADIANS_TO_DEGREES, new Vector3D(0, 0, 1));
rotation.appendRotation(-comps[1].y * MathConsts.RADIANS_TO_DEGREES, new Vector3D(0, 1, 0));
rotation.appendRotation(-comps[1].x * MathConsts.RADIANS_TO_DEGREES, new Vector3D(1, 0, 0));

var context : Context3D = stage3DProxy._context3D;
context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, rotationMatrixRegister.index, rotation, true);
matrix.copyFrom(renderable.sceneTransform);
matrix.append(_animation.camera.inverseSceneTransform);
var comps : Vector.<Vector3D> = matrix.decompose(Orientation3D.AXIS_ANGLE);
matrix.identity();
matrix.appendRotation( -comps[1].w * MathConsts.RADIANS_TO_DEGREES, comps[1]);
stage3DProxy._context3D.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX, rotationMatrixRegister.index, matrix, true);
}

}
Expand Down
10 changes: 7 additions & 3 deletions src/a3dparticle/core/SimpleParticleMaterial.as
@@ -1,5 +1,6 @@
package a3dparticle.core
{
import a3dparticle.animators.ParticleAnimation;
import a3dparticle.animators.ParticleAnimationtor;
import a3dparticle.particle.ParticleMaterialBase;
import away3d.animators.AnimationSetBase;
Expand Down Expand Up @@ -86,12 +87,15 @@ package a3dparticle.core

override arcane function renderPass(index : uint, renderable : IRenderable, stage3DProxy : Stage3DProxy, entityCollector : EntityCollector) : void
{
if (renderable is SubContainer)
var subContainer:SubContainer;
if ((subContainer = renderable as SubContainer))
{
//sometimes action need to read the camera, set it temporary
(subContainer.animator.animationSet as ParticleAnimation).camera = entityCollector.camera;
for (var i:int = 0; i < renderTimes; i++)
{
ParticleAnimationtor(SubContainer(renderable).animator).passCount = i;
ParticleAnimationtor(SubContainer(renderable).animator).offestTime = -i * _particleMaterial.timeInterval;
ParticleAnimationtor(subContainer.animator).passCount = i;
ParticleAnimationtor(subContainer.animator).offestTime = -i * _particleMaterial.timeInterval;
super.renderPass(index, renderable, stage3DProxy, entityCollector);
}
}
Expand Down

0 comments on commit aba7314

Please sign in to comment.