diff --git a/src/a3dparticle/animators/ParticleAnimation.as b/src/a3dparticle/animators/ParticleAnimation.as index ea1b53c..82393c8 100644 --- a/src/a3dparticle/animators/ParticleAnimation.as +++ b/src/a3dparticle/animators/ParticleAnimation.as @@ -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; @@ -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; @@ -83,6 +84,9 @@ package a3dparticle.animators public var fadeFactorConst:ShaderRegisterElement; + //rendering camera + public var camera:Camera3D; + public function ParticleAnimation() { super(); diff --git a/src/a3dparticle/animators/actions/rotation/BillboardGlobal.as b/src/a3dparticle/animators/actions/rotation/BillboardGlobal.as index e2c3e48..35094fe 100644 --- a/src/a3dparticle/animators/actions/rotation/BillboardGlobal.as +++ b/src/a3dparticle/animators/actions/rotation/BillboardGlobal.as @@ -1,4 +1,4 @@ -package a3dparticle.animators.actions.rotation +package a3dparticle.animators.actions.rotation { import a3dparticle.animators.actions.AllParticleAction; import away3d.core.base.IRenderable; @@ -6,9 +6,9 @@ package a3dparticle.animators.actions.rotation 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; @@ -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; } @@ -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.; - 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. = 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); } } diff --git a/src/a3dparticle/core/SimpleParticleMaterial.as b/src/a3dparticle/core/SimpleParticleMaterial.as index 6a3b48c..e1319e2 100644 --- a/src/a3dparticle/core/SimpleParticleMaterial.as +++ b/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; @@ -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); } }