diff --git a/embeds/envMap/sky_negX.jpg b/embeds/envMap/sky_negX.jpg new file mode 100644 index 0000000..a7cff5a Binary files /dev/null and b/embeds/envMap/sky_negX.jpg differ diff --git a/embeds/envMap/sky_negY.jpg b/embeds/envMap/sky_negY.jpg new file mode 100644 index 0000000..57f7a53 Binary files /dev/null and b/embeds/envMap/sky_negY.jpg differ diff --git a/embeds/envMap/sky_negZ.jpg b/embeds/envMap/sky_negZ.jpg new file mode 100644 index 0000000..8458a09 Binary files /dev/null and b/embeds/envMap/sky_negZ.jpg differ diff --git a/embeds/envMap/sky_posX.jpg b/embeds/envMap/sky_posX.jpg new file mode 100644 index 0000000..511555f Binary files /dev/null and b/embeds/envMap/sky_posX.jpg differ diff --git a/embeds/envMap/sky_posY.jpg b/embeds/envMap/sky_posY.jpg new file mode 100644 index 0000000..c18ce75 Binary files /dev/null and b/embeds/envMap/sky_posY.jpg differ diff --git a/embeds/envMap/sky_posZ.jpg b/embeds/envMap/sky_posZ.jpg new file mode 100644 index 0000000..e8130bc Binary files /dev/null and b/embeds/envMap/sky_posZ.jpg differ diff --git a/embeds/li_swf_assets/fractaltree/assets.fla b/embeds/li_swf_assets/fractaltree/assets.fla new file mode 100644 index 0000000..7c80732 Binary files /dev/null and b/embeds/li_swf_assets/fractaltree/assets.fla differ diff --git a/embeds/li_swf_assets/fractaltree/assets.swf b/embeds/li_swf_assets/fractaltree/assets.swf new file mode 100644 index 0000000..55c32b4 Binary files /dev/null and b/embeds/li_swf_assets/fractaltree/assets.swf differ diff --git a/embeds/assets.fla b/embeds/li_swf_assets/shallowwater/assets.fla similarity index 100% rename from embeds/assets.fla rename to embeds/li_swf_assets/shallowwater/assets.fla diff --git a/embeds/assets.swf b/embeds/li_swf_assets/shallowwater/assets.swf similarity index 100% rename from embeds/assets.swf rename to embeds/li_swf_assets/shallowwater/assets.swf diff --git a/embeds/w_normalmap.jpg b/embeds/w_normalmap.jpg new file mode 100644 index 0000000..930017c Binary files /dev/null and b/embeds/w_normalmap.jpg differ diff --git a/embeds/water2.jpg b/embeds/water2.jpg new file mode 100644 index 0000000..d84e36d Binary files /dev/null and b/embeds/water2.jpg differ diff --git a/src/AlphaMapTest.as b/src/AlphaMapTest.as index d2ca26f..91a66dd 100644 --- a/src/AlphaMapTest.as +++ b/src/AlphaMapTest.as @@ -48,8 +48,9 @@ package var material : BitmapMaterial = new BitmapMaterial(new Albedo().bitmapData); // material.normalMap = new Normals().bitmapData; material.ambientColor = 0x080820; + material.ambient = 1; // material.transparent = true; - material.diffuseMethod.alphaThreshold = .25; + material.alphaThreshold = .5; // material.transparent = true; // material.specularMethod = null; diff --git a/src/AnimBlendTest.as b/src/AnimBlendTest.as index 9444f13..8c8810f 100644 --- a/src/AnimBlendTest.as +++ b/src/AnimBlendTest.as @@ -152,8 +152,9 @@ package var material : BitmapMaterial = new BitmapMaterial(new Teeth().bitmapData); material.lights = [ _light2, _light3 ]; material.specular = 2; - material.transparent = true; + material.alphaBlending = true; material.ambientColor = 0x202030; + material.ambient = 1; _mesh.subMeshes[0].material = material; material = new BitmapMaterial(new Skin().bitmapData); @@ -161,6 +162,7 @@ package material.gloss = 20; material.specular = 2; material.ambientColor = 0x202030; + material.ambient = 1; material.specularMap = new Spec().bitmapData; material.normalMap = new Norm().bitmapData; _mesh.material = material; diff --git a/src/CelShadingTest.as b/src/CelShadingTest.as index c72b3ed..81d16c1 100644 --- a/src/CelShadingTest.as +++ b/src/CelShadingTest.as @@ -13,7 +13,8 @@ package import away3d.materials.ColorMaterial; import away3d.materials.methods.CelDiffuseMethod; import away3d.materials.methods.CelSpecularMethod; - + import away3d.materials.methods.OutlineMethod; + import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; @@ -36,6 +37,7 @@ package public function CelShadingTest() { _view = new View3D(); + _view.backgroundColor = 0x101020; _view.antiAlias = 4; _light = new PointLight(); // DirectionalLight(); _light.x = 1000; @@ -83,14 +85,16 @@ package { var mesh : Mesh; var len : uint = _container.numChildren; - var material : ColorMaterial = new ColorMaterial(0xe24062 /*0xfbcbc1*/); - material.ambientColor = 0xaaaaaa; //0xdd5525; + var material : ColorMaterial = new ColorMaterial(0xfbcbc1); + material.ambientColor = 0xdd5525; + material.ambient = 1; //0xdd5525; material.specular = .25; - material.diffuseMethod = new CelDiffuseMethod(2); + material.diffuseMethod = new CelDiffuseMethod(3); material.specularMethod = new CelSpecularMethod(); - CelSpecularMethod(material.specularMethod).smoothness = .2; - CelDiffuseMethod(material.diffuseMethod).smoothness = .1; - material.lights = [ _light3 ]; + material.addMethod(new OutlineMethod(0x000000, 2/50)); + CelSpecularMethod(material.specularMethod).smoothness = .01; + CelDiffuseMethod(material.diffuseMethod).smoothness = .01; + material.lights = [ _light, _light2, _light3 ]; for (var i : uint = 0; i < len; ++i) { mesh = Mesh(_container.getChildAt(i)); diff --git a/src/DOFTest.as b/src/DOFTest.as index fbcd348..c56a583 100644 --- a/src/DOFTest.as +++ b/src/DOFTest.as @@ -8,7 +8,6 @@ package import away3d.entities.Mesh; import away3d.filters.DepthOfFieldFilter3D; - import away3d.filters.MotionBlurFilter3D; import away3d.lights.DirectionalLight; import away3d.lights.PointLight; import away3d.materials.ColorMaterial; @@ -87,6 +86,7 @@ package _dofFilter.focusTarget = _roamer; elementMaterial.ambientColor = 0x303040; + elementMaterial.ambient = 1; elementMaterial.lights = [ _light, _light2 ]; _view.scene.addChild(_roamer); diff --git a/src/EnvMapTest.as b/src/EnvMapTest.as index ff7f065..3a22fac 100644 --- a/src/EnvMapTest.as +++ b/src/EnvMapTest.as @@ -10,12 +10,13 @@ package import away3d.loaders.parsers.OBJParser; import away3d.materials.BitmapMaterial; import away3d.materials.methods.EnvMapMethod; + import away3d.materials.methods.FresnelEnvMapMethod; import away3d.materials.methods.FresnelSpecularMethod; import away3d.materials.utils.CubeMap; import away3d.primitives.SkyBox; import com.bit101.components.HSlider; - + import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; diff --git a/src/FlightController.as b/src/FlightController.as index 2c7f00d..bb787cb 100644 --- a/src/FlightController.as +++ b/src/FlightController.as @@ -177,7 +177,7 @@ package { _referenceX = mouseX; _referenceY = mouseY; _targetXRad += dx * _dragSpeed; - _targetYRad -= dy * _dragSpeed; + _targetYRad += dy * _dragSpeed; if (_targetYRad > bound) _targetYRad = bound; else if (_targetYRad < -bound) _targetYRad = -bound; } diff --git a/src/InteractionTest.as b/src/InteractionTest.as index 7f9e80c..8d2e544 100644 --- a/src/InteractionTest.as +++ b/src/InteractionTest.as @@ -1,6 +1,7 @@ package { import away3d.bounds.BoundingSphere; + import away3d.containers.ObjectContainer3D; import away3d.containers.View3D; import away3d.events.MouseEvent3D; import away3d.materials.BitmapMaterial; @@ -9,6 +10,8 @@ package import flash.display.BitmapData; import flash.display.BitmapDataChannel; import flash.display.Sprite; + import flash.display.StageAlign; + import flash.display.StageScaleMode; import flash.events.Event; import flash.geom.Rectangle; @@ -22,17 +25,32 @@ package private var _material1 : BitmapMaterial; private var _material2 : BitmapMaterial; private var _camController:HoverDragController; + private var _viewContainer : Sprite; + private var _dirX : Number = 1; + private var _dirY : Number = 1; + private var _container3D : ObjectContainer3D; public function InteractionTest() { + stage.scaleMode = StageScaleMode.NO_SCALE; + stage.align = StageAlign.TOP_LEFT; + + _viewContainer = new Sprite(); + _viewContainer.x = -100; + _viewContainer.y = 50; + addChild(_viewContainer); + _view = new View3D(); _view.x = 100; _view.y = 50; _view.width = 600; _view.height = 300; + _container3D = new ObjectContainer3D(); + _view.scene.addChild(_container3D); _view.antiAlias = 4; - this.addChild(_view); +// _view.forceMouseMove = true; + _viewContainer.addChild(_view); var bitmapData1 : BitmapData = new BitmapData(512, 512, false, 0x000000); var bitmapData2 : BitmapData = new BitmapData(512, 512, false, 0x000000); @@ -46,18 +64,37 @@ package _mesh2.bounds = new BoundingSphere(); _mesh1.showBounds = true; _mesh2.showBounds = true; - _view.scene.addChild(_mesh1); - _view.scene.addChild(_mesh2); + +// _container3D.mouseChildren = false; + _container3D.addChild(_mesh1); + _container3D.addChild(_mesh2); + _mesh1.rotationY = .01; - _mesh2.mouseEnabled = false; + _mesh2.mouseEnabled = true; _mesh1.mouseEnabled = true; _mesh1.mouseDetails = true; + _mesh2.mouseDetails = true; +// _container3D.addEventListener(MouseEvent3D.CLICK, onContainerClick); + _mesh1.addEventListener(MouseEvent3D.CLICK, onClick); + _mesh2.addEventListener(MouseEvent3D.CLICK, onClick); _mesh1.addEventListener(MouseEvent3D.MOUSE_MOVE, onMouseMove); + _mesh2.addEventListener(MouseEvent3D.MOUSE_MOVE, onMouseMove); _camController = new HoverDragController(_view.camera, stage); this.addEventListener(Event.ENTER_FRAME, handleEnterFrame); } + private function onContainerClick(event : MouseEvent3D) : void + { + _container3D.scaleX = _container3D.scaleY = _container3D.scaleZ = .8+Math.random()*.4; + } + + private function onClick(event : MouseEvent3D) : void + { + var material : BitmapMaterial = event.target.material; + material.mipmap = !material.mipmap; + } + private function onMouseMove(event : MouseEvent3D) : void { var material : BitmapMaterial = event.target.material; @@ -70,6 +107,13 @@ package private function handleEnterFrame(ev : Event) : void { _mesh1.rotationX += .01; + _viewContainer.x += _dirX; + _viewContainer.y += _dirY; + if (_dirX > 0 && _viewContainer.x > 200) _dirX = -1; + if (_dirY > 0 && _viewContainer.y > 200) _dirY = -1; + if (_dirX < 0 && _viewContainer.x < -100) _dirX = 1; + if (_dirY > 0 && _viewContainer.y < -200) _dirY = 1; + _view.render(); } } diff --git a/src/InteractionTest2.as b/src/InteractionTest2.as new file mode 100644 index 0000000..a255e20 --- /dev/null +++ b/src/InteractionTest2.as @@ -0,0 +1,124 @@ +package +{ + import away3d.bounds.BoundingSphere; + import away3d.containers.ObjectContainer3D; + import away3d.containers.View3D; + import away3d.events.MouseEvent3D; + import away3d.materials.BitmapMaterial; + import away3d.primitives.Cube; + import away3d.primitives.Plane; + + import flash.display.BitmapData; + import flash.display.BitmapDataChannel; + import flash.display.Sprite; + import flash.display.StageAlign; + import flash.display.StageScaleMode; + import flash.events.Event; + import flash.geom.Rectangle; + + [SWF(width="800", height="450", frameRate="60")] + public class InteractionTest2 extends Sprite + { + private var _view : View3D; + + private var _mesh1 : Cube; + private var _mesh2 : Cube; + private var _material1 : BitmapMaterial; + private var _material2 : BitmapMaterial; + private var _camController:HoverDragController; + private var _viewContainer : Sprite; + + public function InteractionTest2() + { + stage.scaleMode = StageScaleMode.NO_SCALE; + stage.align = StageAlign.TOP_LEFT; + + _viewContainer = new Sprite(); + _viewContainer.x = -100; + _viewContainer.y = 50; + addChild(_viewContainer); + + _view = new View3D(); + _view.x = 100; + _view.y = 50; + _view.width = 600; + _view.height = 300; + + _view.antiAlias = 4; + _view.forceMouseMove = true; + _viewContainer.addChild(_view); + + var bitmapData1 : BitmapData = new BitmapData(512, 512, false, 0x000000); + var bitmapData2 : BitmapData = new BitmapData(512, 512, false, 0x000000); + bitmapData1.perlinNoise(64, 64, 5, 0, false, true, BitmapDataChannel.RED); + bitmapData2.perlinNoise(64, 64, 5, 0, false, true, BitmapDataChannel.BLUE); + _material1 = new BitmapMaterial(bitmapData1); + _material2 = new BitmapMaterial(bitmapData1); + _material1.alpha = .9; + _mesh1 = new Cube(_material1, 10000, 1, 10000, 1, 1, 1, false); + _mesh1.bounds = new BoundingSphere(); + + _mesh2 = new Cube(_material2, 500, 500, 500, 1, 1, 1, false); + +// _container3D.mouseChildren = false; + _view.scene.addChild(_mesh1); + _view.scene.addChild(_mesh2); + + _mesh1.rotationY = .01; + _mesh1.mouseEnabled = true; + _mesh1.mouseDetails = true; + _mesh2.mouseEnabled = true; + _mesh2.mouseDetails = true; +// _container3D.addEventListener(MouseEvent3D.CLICK, onContainerClick); + _mesh1.addEventListener(MouseEvent3D.MOUSE_UP, onClick); + _mesh1.addEventListener(MouseEvent3D.MOUSE_OVER, onMouseOver); + _mesh1.addEventListener(MouseEvent3D.MOUSE_OUT, onMouseOut); + _mesh2.addEventListener(MouseEvent3D.MOUSE_MOVE, onMouseMove); + _camController = new HoverDragController(_view.camera, stage); + + this.addEventListener(Event.ENTER_FRAME, handleEnterFrame); + } + + private function onMouseOver(event : MouseEvent3D) : void + { + _mesh1.scaleX = _mesh1.scaleY = _mesh1.scaleZ = 1.1; + } + + private function onMouseOut(event : MouseEvent3D) : void + { + _mesh1.scaleX = _mesh1.scaleY = _mesh1.scaleZ = 1; + } + + private function onClick(event : MouseEvent3D) : void + { + var material : BitmapMaterial = event.target.material; + material.mipmap = !material.mipmap; + + var rect : Rectangle = new Rectangle(event.uv.x*material.bitmapData.width-4, event.uv.y*material.bitmapData.height-4, 9, 9); + material.bitmapData.fillRect(rect, 0x00ff00); + material.updateTexture(); + } + + private function onMouseMove(event : MouseEvent3D) : void + { + var material : BitmapMaterial = event.target.material; + var rect : Rectangle = new Rectangle(event.uv.x*material.bitmapData.width-4, event.uv.y*material.bitmapData.height-4, 9, 9); + material.bitmapData.fillRect(rect, 0x00ff00); + material.updateTexture(); + } + + + private function handleEnterFrame(ev : Event) : void + { + _mesh1.rotationX += 1; +// _viewContainer.x += _dirX; +// _viewContainer.y += _dirY; +// if (_dirX > 0 && _viewContainer.x > 200) _dirX = -1; +// if (_dirY > 0 && _viewContainer.y > 200) _dirY = -1; +// if (_dirX < 0 && _viewContainer.x < -100) _dirX = 1; +// if (_dirY > 0 && _viewContainer.y < -200) _dirY = 1; + + _view.render(); + } + } +} \ No newline at end of file diff --git a/src/LightingTest.as b/src/LightingTest.as index b559255..9084707 100644 --- a/src/LightingTest.as +++ b/src/LightingTest.as @@ -3,6 +3,7 @@ package import away3d.containers.View3D; import away3d.entities.Mesh; import away3d.events.LoaderEvent; + import away3d.events.MouseEvent3D; import away3d.lights.DirectionalLight; import away3d.lights.LightBase; import away3d.lights.PointLight; @@ -10,14 +11,16 @@ package import away3d.loaders.misc.AssetLoaderContext; import away3d.loaders.parsers.OBJParser; import away3d.materials.BitmapMaterial; - + + import flash.display.BitmapData; + import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.MouseEvent; - [SWF(width="1024", height="576", frameRate="60")] + [SWF(width="1024", height="576", frameRate="60", backgroundColor="0xffffff")] public class LightingTest extends Sprite { [Embed(source="/../embeds/head/head.obj", mimeType="application/octet-stream")] @@ -41,10 +44,19 @@ package private var _mesh : Mesh; private var _camController : HoverDragController; + private var _bg : BitmapData; + public function LightingTest() { _view = new View3D(); _view.antiAlias = 4; + _view.backgroundColor = 0x0010000; + _view.backgroundAlpha = 0; + + _bg = new BitmapData(500, 300, false, 0); + _bg.perlinNoise(50, 50, 8, 5, true, true, 7, true); + _view.backgroundImage = _bg; + _light = new PointLight(); // DirectionalLight(); _light.x = -5000; _light.y = 5000; @@ -79,8 +91,10 @@ package _loader.scale(50); _view.scene.addChild(_loader); + _view.forceMouseMove = true; + this.addEventListener(Event.ENTER_FRAME, _handleEnterFrame); - stage.addEventListener(MouseEvent.CLICK, onClick); +// stage.addEventListener(MouseEvent.CLICK, onClick); stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.addEventListener(Event.RESIZE, onStageResize); @@ -109,22 +123,30 @@ package material.specularMap = new Specular().bitmapData; material.specular = .5; material.gloss = 50; - material.lights = [_light, _light2, _light3]; + material.lights = [_light, _light2, _light3 ]; // material.specularMethod = null; for (var i : uint = 0; i < len; ++i) { mesh = Mesh(_loader.getChildAt(i)); mesh.material = material; - mesh.geometry.subGeometries[0].autoDeriveVertexNormals = true; - mesh.geometry.subGeometries[0].autoDeriveVertexTangents = true; +// mesh.geometry.subGeometries[0].autoDeriveVertexNormals = true; +// mesh.geometry.subGeometries[0].autoDeriveVertexTangents = true; } _mesh = mesh; + _mesh.mouseEnabled = true; + _mesh.mouseDetails = true; + _mesh.addEventListener(MouseEvent3D.CLICK, onClick3D) + } + + private function onClick3D(event : MouseEvent3D) : void + { + _mesh.scale(Math.random()+.5); } private function _handleEnterFrame(ev : Event) : void { - _loader.rotationY += 0.3; + _loader.rotationY += 1; _view.render(); } } diff --git a/src/LoaderMD5Test.as b/src/LoaderMD5Test.as index 507e827..597dd9d 100644 --- a/src/LoaderMD5Test.as +++ b/src/LoaderMD5Test.as @@ -5,6 +5,7 @@ package import away3d.debug.AwayStats; import away3d.entities.Mesh; import away3d.entities.Sprite3D; + import away3d.filters.RadialBlurFilter3D; import away3d.lights.DirectionalLight; import away3d.lights.LightBase; import away3d.lights.PointLight; @@ -12,13 +13,14 @@ package import away3d.materials.methods.FilteredShadowMapMethod; import away3d.materials.methods.FogMethod; import away3d.materials.methods.HardShadowMapMethod; + import away3d.materials.methods.OutlineMethod; import away3d.materials.methods.ShadingMethodBase; import away3d.materials.methods.SlowFilteredShadowMapMethod; import away3d.materials.methods.SoftShadowMapMethod; import away3d.materials.utils.CubeMap; import away3d.primitives.Plane; import away3d.primitives.SkyBox; - + import flash.display.BlendMode; import flash.display.Sprite; import flash.display.StageAlign; @@ -82,8 +84,9 @@ package private var _envMap : CubeMap; private var _count : Number = 0; private var _lights : Array; - private var _shadowMethod : SlowFilteredShadowMapMethod; - private var _shadowMethod2 : SlowFilteredShadowMapMethod; + private var _shadowMethod : FilteredShadowMapMethod; + private var _shadowMethod2 : FilteredShadowMapMethod; + private var _skybox : SkyBox; public function LoaderMD5Test() { @@ -106,8 +109,9 @@ package _controller = new MonsterController(); _controller.addEventListener(MonsterEvent.MESH_COMPLETE, onMeshComplete); _controller.bodyMaterial.addMethod(new FogMethod(_view.camera.lens.far * .5, 0x000000)); + _controller.bodyMaterial.addMethod(new OutlineMethod(0xff0000, 2, false)); _controller.bodyMaterial.lights = _lights; - _controller.bodyMaterial.shadowMethod = _shadowMethod2 = new SlowFilteredShadowMapMethod(_light3); + _controller.bodyMaterial.shadowMethod = _shadowMethod2 = new FilteredShadowMapMethod(_light3); } private function onMeshComplete(event : MonsterEvent) : void @@ -206,7 +210,7 @@ package _light2.y = 200; _light2.z = 1400; _light2.color = 0x1111ff; - _light3 = new DirectionalLight(0, -20, 10); + _light3 = new DirectionalLight(-50, -20, 10); _light3.color = 0xffffee; _light3.castsShadows = true; @@ -215,10 +219,12 @@ package _view.scene.addChild(_light); _view.scene.addChild(_light2); _view.scene.addChild(_light3); + + _view.filters3d = [ new RadialBlurFilter3D(20) ]; var material : BitmapMaterial = new BitmapMaterial(new RedLight().bitmapData); // material.blendMode = BlendMode.ADD; - material.transparent = true; + material.alphaBlending = true; material.addMethod(new FogMethod(_view.camera.lens.far*.5, 0x000000)); sprite = new Sprite3D(material, 200, 200); _light.addChild(sprite); @@ -226,20 +232,22 @@ package sprite = new Sprite3D(material, 200, 200); material.addMethod(new FogMethod(_view.camera.lens.far*.5, 0x000000)); // material.blendMode = BlendMode.ADD; - material.transparent = true; + material.alphaBlending = true; _light2.addChild(sprite); _envMap = new CubeMap( new EnvPosX().bitmapData, new EnvNegX().bitmapData, new EnvPosY().bitmapData, new EnvNegY().bitmapData, new EnvPosZ().bitmapData, new EnvNegZ().bitmapData); - _view.scene.addChild(new SkyBox(_envMap)); + _skybox = new SkyBox(_envMap); + _view.scene.addChild(_skybox); material = new BitmapMaterial(new FloorDiffuse().bitmapData, true, true, true); material.lights = _lights; material.ambientColor = 0x202030; + material.ambient = 1; material.normalMap = new FloorNormals().bitmapData; material.specularMap = new FloorSpecular().bitmapData; - material.shadowMethod = _shadowMethod = new SlowFilteredShadowMapMethod(_light3); + material.shadowMethod = _shadowMethod = new FilteredShadowMapMethod(_light3); material.addMethod(new FogMethod(_view.camera.lens.far*.5, 0x000000)); // material.specularMethod = null; var plane : Plane = new Plane(material, 50000, 50000, 1, 1, false); diff --git a/src/LoaderOBJTest.as b/src/LoaderOBJTest.as index 4330b5d..46a374d 100644 --- a/src/LoaderOBJTest.as +++ b/src/LoaderOBJTest.as @@ -13,7 +13,7 @@ package import away3d.materials.methods.BasicSpecularMethod; import away3d.materials.methods.FresnelSpecularMethod; import away3d.materials.methods.SubsurfaceScatteringDiffuseMethod; - + import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; @@ -93,7 +93,7 @@ package private function initMesh() : void { Loader3D.enableParser(OBJParser); - + _loader = new Loader3D(); _loader.addEventListener(LoaderEvent.RESOURCE_COMPLETE, onResourceComplete); _loader.parseData(OBJData, null, new AssetLoaderContext(false)); @@ -111,6 +111,7 @@ package _material.gloss = 10; _material.specular = 3; _material.ambientColor = 0x303040; + _material.ambient = 1; _subsurfaceMethod.scatterColor = 0xff7733; //0xff9966; _subsurfaceMethod.scattering = .05; _subsurfaceMethod.translucency = 4; diff --git a/src/MD5StressTest.as b/src/MD5StressTest.as index a2948b5..eb9f810 100644 --- a/src/MD5StressTest.as +++ b/src/MD5StressTest.as @@ -189,12 +189,13 @@ package var material : BitmapMaterial = new BitmapMaterial(new Teeth().bitmapData); material.lights = [ _light, _light2, _light3 ]; material.specular = .2; - material.transparent = true; + material.alphaBlending = true; _sourceMesh.subMeshes[0].material = material; material = new BitmapMaterial(new Skin().bitmapData); material.lights = [ _light, _light2, _light3 ]; material.ambientColor = 0x101020; + material.ambient = 1; material.specularMap = new Spec().bitmapData; material.normalMap = new Norm().bitmapData; _sourceMesh.material = material; diff --git a/src/MonsterController.as b/src/MonsterController.as index e0939c0..644f8a2 100644 --- a/src/MonsterController.as +++ b/src/MonsterController.as @@ -138,6 +138,7 @@ package _bodyMaterial.gloss = 20; _bodyMaterial.specular = 1.5; _bodyMaterial.ambientColor = 0x505060; + _bodyMaterial.ambient = 1; _bodyMaterial.specularMap = new BodySpec().bitmapData; _bodyMaterial.normalMap = new BodyNorms().bitmapData; } diff --git a/src/MultiViewTest.as b/src/MultiViewTest.as index 5e8bc32..bd71b25 100644 --- a/src/MultiViewTest.as +++ b/src/MultiViewTest.as @@ -238,7 +238,7 @@ package var material : BitmapMaterial = new BitmapMaterial(new RedLight().bitmapData); // material.blendMode = BlendMode.ADD; - material.transparent = true; + material.alphaBlending = true; material.addMethod(new FogMethod(_view1.camera.lens.far * .5, 0x000000)); sprite = new Sprite3D(material, 200, 200); _light.addChild(sprite); @@ -246,7 +246,7 @@ package sprite = new Sprite3D(material, 200, 200); material.addMethod(new FogMethod(_view1.camera.lens.far * .5, 0x000000)); // material.blendMode = BlendMode.ADD; - material.transparent = true; + material.alphaBlending = true; _light2.addChild(sprite); _envMap = new CubeMap(new EnvPosX().bitmapData, new EnvNegX().bitmapData, @@ -258,6 +258,7 @@ package material.lights = _lights; material.specular = 1; material.ambientColor = 0x505060; + material.ambient = 1; material.normalMap = new FloorNormals().bitmapData; material.specularMap = new FloorSpecular().bitmapData; material.addMethod(_projectionMethod); @@ -308,10 +309,8 @@ package _view3 = new View3D(_view1.scene); _view3.x = 540; _view3.y = 240; - _view3.width = 116; - _view3.height = 79; - _view3.scaleX = 4; - _view3.scaleY = 4; + _view3.width = 464; + _view3.height = 316; _view3.antiAlias = 4; _view3.camera.x = 300; _view3.camera.y = 500; @@ -338,8 +337,8 @@ package _view2.height = stage.stageHeight / 576 * 200; _view3.x = stage.stageWidth / 1024 * 540; _view3.y = stage.stageHeight / 576 * 240; - _view3.width = stage.stageWidth / 1024 * 116; - _view3.height = stage.stageHeight / 576 * 79; + _view3.width = stage.stageWidth / 1024 * 464; + _view3.height = stage.stageHeight / 576 * 316; Signature.x = 10; Signature.y = stage.stageHeight - Signature.height - 10; diff --git a/src/PostProcessTest.as b/src/PostProcessTest.as index 3282ca4..b1921e3 100644 --- a/src/PostProcessTest.as +++ b/src/PostProcessTest.as @@ -5,12 +5,13 @@ package import away3d.entities.Mesh; import away3d.entities.Sprite3D; import away3d.filters.DepthOfFieldFilter3D; + import away3d.filters.MotionBlurFilter3D; import away3d.lights.DirectionalLight; import away3d.lights.LightBase; import away3d.lights.PointLight; import away3d.materials.BitmapMaterial; + import away3d.materials.methods.FilteredShadowMapMethod; import away3d.materials.methods.FogMethod; - import away3d.materials.methods.SlowFilteredShadowMapMethod; import away3d.materials.utils.CubeMap; import away3d.primitives.Plane; import away3d.primitives.SkyBox; @@ -77,8 +78,8 @@ package private var _envMap : CubeMap; private var _count : Number = 0; private var _lights : Array; - private var _shadowMethod : SlowFilteredShadowMapMethod; - private var _shadowMethod2 : SlowFilteredShadowMapMethod; + private var _shadowMethod : FilteredShadowMapMethod; + private var _shadowMethod2 : FilteredShadowMapMethod; private var _dofFilter : DepthOfFieldFilter3D; public function PostProcessTest() @@ -92,7 +93,7 @@ package _controller.bodyMaterial.addMethod(new FogMethod(_view.camera.lens.far * .5, 0x000000)); // _controller.bodyMaterial.specularMethod = null; _controller.bodyMaterial.lights = _lights; - _controller.bodyMaterial.shadowMethod = _shadowMethod2 = new SlowFilteredShadowMapMethod(_light3); + _controller.bodyMaterial.shadowMethod = _shadowMethod2 = new FilteredShadowMapMethod(_light3); Signature = Sprite(new SignatureSwf()); Signature.y = stage.stageHeight - Signature.height; @@ -104,13 +105,13 @@ package stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); } - + private function onMeshComplete(event : MonsterEvent) : void { _dofFilter.focusTarget = _controller.mesh; _view.scene.addChild(_controller.mesh); } - + private function onKeyDown(event : KeyboardEvent) : void { switch (event.keyCode) { @@ -189,7 +190,8 @@ package // _view.filters3d = [ new MotionBlurFilter3D(.8) ]; _dofFilter = new DepthOfFieldFilter3D(20, 20); _dofFilter.range = 1000; - _view.filters3d = [ _dofFilter ]; + _view.filters3d = [ _dofFilter, new MotionBlurFilter3D(.5) ]; +// _view.filters3d = [ new BlurFilter3D(10, 10) ]; _view.camera.lens.far = 5000; _view.camera.z = -200; _view.camera.y = 160; @@ -218,7 +220,7 @@ package var material : BitmapMaterial = new BitmapMaterial(new RedLight().bitmapData); // material.blendMode = BlendMode.ADD; - material.transparent = true; + material.alphaBlending = true; material.addMethod(new FogMethod(_view.camera.lens.far * .5, 0x000000)); sprite = new Sprite3D(material, 200, 200); _light.addChild(sprite); @@ -226,7 +228,7 @@ package sprite = new Sprite3D(material, 200, 200); material.addMethod(new FogMethod(_view.camera.lens.far * .5, 0x000000)); // material.blendMode = BlendMode.ADD; - material.transparent = true; + material.alphaBlending = true; _light2.addChild(sprite); _envMap = new CubeMap(new EnvPosX().bitmapData, new EnvNegX().bitmapData, @@ -237,9 +239,10 @@ package material = new BitmapMaterial(new FloorDiffuse().bitmapData, true, true, true); material.lights = _lights; material.ambientColor = 0x202030; + material.ambient = 1; material.normalMap = new FloorNormals().bitmapData; material.specularMap = new FloorSpecular().bitmapData; - material.shadowMethod = _shadowMethod = new SlowFilteredShadowMapMethod(_light3); + material.shadowMethod = _shadowMethod = new FilteredShadowMapMethod(_light3); material.addMethod(new FogMethod(_view.camera.lens.far * .5, 0x000000)); // material.specularMethod = null; var plane : Plane = new Plane(material, 50000, 50000, 1, 1, false); diff --git a/src/PrimitivesTest.as b/src/PrimitivesTest.as index bad1332..3455b7d 100644 --- a/src/PrimitivesTest.as +++ b/src/PrimitivesTest.as @@ -6,6 +6,7 @@ package import away3d.lights.PointLight; import away3d.materials.BitmapMaterial; import away3d.materials.ColorMaterial; + import away3d.materials.methods.OutlineMethod; import away3d.primitives.Cube; import away3d.primitives.Sphere; @@ -50,7 +51,9 @@ package var red : ColorMaterial = new ColorMaterial(0xFF0000); var material : BitmapMaterial = new BitmapMaterial(new Albedo().bitmapData); material.normalMap = new Normals().bitmapData; + material.addMethod(new OutlineMethod(0xff0000, 20)); material.ambientColor = 0x080820; + material.ambient = 1; // material.specularMethod = null; // var green : BitmapMaterial = new BitmapMaterial(new Albedo().bitmapData); @@ -95,7 +98,7 @@ package private function onEnterFrame(ev : Event) : void { - _ctr.rotationY += .1; + _ctr.rotationZ += .1; //_ctr.rotationX = 20 * Math.sin(getTimer() * 0.002); _view.render(); } diff --git a/src/ProjectTest.as b/src/ProjectTest.as new file mode 100644 index 0000000..8f2a4f3 --- /dev/null +++ b/src/ProjectTest.as @@ -0,0 +1,110 @@ +package +{ + import away3d.containers.View3D; + import away3d.lights.DirectionalLight; + import away3d.lights.LightBase; + import away3d.lights.PointLight; + import away3d.materials.BitmapMaterial; + import away3d.materials.ColorMaterial; + import away3d.primitives.Cube; + import away3d.primitives.Plane; + import away3d.primitives.Sphere; + import away3d.containers.ObjectContainer3D; + + import flash.display.BitmapData; + import flash.display.Sprite; + import flash.display.StageAlign; + import flash.display.StageScaleMode; + import flash.events.Event; + import flash.geom.Point; + import flash.geom.Vector3D; + import flash.utils.getTimer; + + [SWF(frameRate="60", width="1024", height="576")] + public class ProjectTest extends Sprite + { + private var _view : View3D; + + private var _light : PointLight; + + [Embed(source="../embeds/crossColor.jpg")] + private var Albedo : Class; + + [Embed(source="../embeds/crossnrm.jpg")] + private var Normals : Class; + + private var _camController : HoverDragController; + private var _sphere : Sphere; + + private var _testSprite : Sprite; + + public function ProjectTest() + { + super(); + + _view = new View3D(); + _camController = new HoverDragController(_view.camera, stage); + _camController.radius = 500; + + addChild(_view); + addEventListener(Event.ENTER_FRAME, handleEnterFrame); + + var material : BitmapMaterial = new BitmapMaterial(new Albedo().bitmapData); +// material.normalMap = new Normals().bitmapData; + material.ambientColor = 0x080820; + material.ambient = 1; +// material.specularMethod = null; + + material.normalMap; + _sphere = new Sphere(new ColorMaterial(0xff00ff), 15); + _sphere.x = -50; + _sphere.y = -50; + _sphere.z = -50; + _view.scene.addChild(_sphere); + + _light = new PointLight(); + _light.x = -1000; + _light.y = 1000; + _light.z = -1000; + _light.color = 0xffeeaa; + + _testSprite = new Sprite(); + _testSprite.graphics.beginFill(0xffff00); + _testSprite.graphics.drawCircle(0, 0, 5); + _testSprite.graphics.endFill(); + addChild(_testSprite); + + material.lights = [_light]; + _view.scene.addChild(_light); + stage.scaleMode = StageScaleMode.NO_SCALE; + stage.align = StageAlign.TOP_LEFT; + stage.addEventListener(Event.RESIZE, onStageResize); + } + + private function onStageResize(event : Event) : void + { + _view.width = stage.stageWidth; + _view.height = stage.stageHeight; + } + + + private function handleEnterFrame(ev : Event) : void + { + //_ctr.rotationX = 20 * Math.sin(getTimer() * 0.002); + _view.camera.x = Math.random()*5000; + _view.camera.y = Math.random()*5000; + _view.camera.z = Math.random()*5000; + _view.camera.rotationX = Math.random()*6; + _view.camera.rotationY = Math.random()*6; + _view.camera.rotationZ = Math.random()*6; + var v : Vector3D = _view.unproject(_view.mouseX, _view.mouseY); + _sphere.x = _view.camera.x+(v.x-_view.camera.x)*20; + _sphere.y = _view.camera.y+(v.y-_view.camera.y)*20; + _sphere.z = _view.camera.z+(v.z-_view.camera.z)*20; + var p : Point = _view.project(_sphere.scenePosition); + _testSprite.x = p.x; + _testSprite.y = p.y; + _view.render(); + } + } +} \ No newline at end of file diff --git a/src/SSSShadingTest.as b/src/SSSShadingTest.as index 10f08ad..bdf4929 100644 --- a/src/SSSShadingTest.as +++ b/src/SSSShadingTest.as @@ -106,6 +106,7 @@ package method.scatterColor = 0xffaa00; method.translucency = 5; material.ambientColor = 0x202025; //0xdd5525; + material.ambient = 1; material.diffuseMethod = method; material.gloss = 100; material.specular = .5; diff --git a/src/ShallowWaterDemo.as b/src/ShallowWaterDemo.as index f60547a..ab967e2 100644 --- a/src/ShallowWaterDemo.as +++ b/src/ShallowWaterDemo.as @@ -1,642 +1,621 @@ package { - import away3d.containers.View3D; - import away3d.core.math.Matrix3DUtils; - import away3d.debug.AwayStats; - import away3d.lights.LightBase; - import away3d.lights.PointLight; - import away3d.materials.BitmapMaterial; - import away3d.materials.ColorMaterial; - import away3d.materials.methods.BasicDiffuseMethod; - import away3d.materials.methods.EnvMapMethod; - import away3d.materials.methods.FogMethod; - import away3d.materials.utils.CubeMap; - import away3d.primitives.Cube; - import away3d.primitives.Plane; - import away3d.primitives.SkyBox; - - import com.li.away3d.camera.MKSOCameraController; - import com.li.fluids.shallow.DisturbanceBrush; - import com.li.fluids.shallow.FluidDisturb; - import com.li.fluids.shallow.ShallowFluid; - - import flash.display.BitmapData; - import flash.display.Sprite; - import flash.display.StageAlign; - import flash.display.StageScaleMode; - import flash.events.Event; - import flash.events.MouseEvent; - import flash.events.TimerEvent; - import flash.geom.ColorTransform; - import flash.geom.Matrix3D; - import flash.net.URLRequest; - import flash.net.navigateToURL; - import flash.utils.Timer; - - import uk.co.soulwire.gui.SimpleGUI; + +import away3d.containers.View3D; +import away3d.core.math.Matrix3DUtils; +import away3d.debug.AwayStats; +import away3d.lights.LightBase; +import away3d.lights.PointLight; +import away3d.materials.BitmapMaterial; +import away3d.materials.ColorMaterial; +import away3d.materials.methods.BasicDiffuseMethod; +import away3d.materials.methods.EnvMapMethod; +import away3d.materials.methods.FogMethod; +import away3d.materials.utils.CubeMap; +import away3d.primitives.Cube; +import away3d.primitives.Plane; +import away3d.primitives.SkyBox; + +import com.li.away3d.camera.MKSOCameraController; +import com.li.fluids.shallow.DisturbanceBrush; +import com.li.fluids.shallow.FluidDisturb; +import com.li.fluids.shallow.ShallowFluid; + +import flash.display.BitmapData; +import flash.display.Sprite; +import flash.display.StageAlign; +import flash.display.StageScaleMode; +import flash.events.Event; +import flash.events.MouseEvent; +import flash.events.TimerEvent; +import flash.geom.ColorTransform; +import flash.geom.Matrix3D; +import flash.net.URLRequest; +import flash.net.navigateToURL; +import flash.utils.Timer; + +import uk.co.soulwire.gui.SimpleGUI; // TODO: Finish native mouse implementation - waiting for resolution of mouse occlusion topic. - [SWF(width="1024", height="576", frameRate="60", backgroundColor="0x000000")] - public class ShallowWaterDemo extends Sprite - { +[SWF(width="1024", height="576", frameRate="60", backgroundColor="0x000000")] +public class ShallowWaterDemo extends Sprite +{ // // Image used as height info for the terrain (generated in prefab). // [Embed(source="terrainPerlin1.jpg")] // private var HeightMapAsset:Class; - // Environment map. - [Embed(source="../embeds/envMap/snow_positive_x.jpg")] - private var EnvPosX : Class; - [Embed(source="../embeds/envMap/snow_positive_y.jpg")] - private var EnvPosY : Class; - [Embed(source="../embeds/envMap/snow_positive_z.jpg")] - private var EnvPosZ : Class; - [Embed(source="../embeds/envMap/snow_negative_x.jpg")] - private var EnvNegX : Class; - [Embed(source="../embeds/envMap/snow_negative_y.jpg")] - private var EnvNegY : Class; - [Embed(source="../embeds/envMap/snow_negative_z.jpg")] - private var EnvNegZ : Class; - - // Liquid image assets. - [Embed(source="../embeds/assets.swf", symbol="ImageClip")] - private var ImageClip : Class; - [Embed(source="../embeds/assets.swf", symbol="ImageClip1")] - private var ImageClip1 : Class; - [Embed(source="../embeds/assets.swf", symbol="ImageClip2")] - private var ImageClip2 : Class; - - // Signature asset. - [Embed(source="../embeds/assets.swf", symbol="AwaySignature")] - private var AwaySignature : Class; - - // Disturbance brushes. - [Embed(source="../embeds/assets.swf", symbol="Brush1")] - private var Brush1 : Class; - [Embed(source="../embeds/assets.swf", symbol="Brush2")] - private var Brush2 : Class; - [Embed(source="../embeds/assets.swf", symbol="Brush3")] - private var Brush3 : Class; - [Embed(source="../embeds/assets.swf", symbol="Brush4")] - private var Brush4 : Class; - [Embed(source="../embeds/assets.swf", symbol="Brush5")] - private var Brush5 : Class; - [Embed(source="../embeds/assets.swf", symbol="Brush6")] - private var Brush6 : Class; - - public var mouseBrushStrength : Number = 5; - public var rainBrushStrength : Number = 10; - public var mouseBrushLife : uint = 0; - - public var fluid : ShallowFluid; - private var _view : View3D; - private var _cameraController : MKSOCameraController; - private var _plane : Plane; - private var _pressing : Boolean; - private var _light : LightBase; - private var _dropTmr : Timer; - private var _fluidDisturb : FluidDisturb; - private var _cubeMap : CubeMap; - public var brushClip1 : Sprite; - public var brushClip2 : Sprite; - public var brushClip3 : Sprite; - public var brushClip4 : Sprite; - public var brushClip5 : Sprite; - public var brushClip6 : Sprite; - public var brushClips : Array; - private var _activeMouseBrushClip : Sprite; - private var _rainBrush : DisturbanceBrush; - private var _imageBrush : DisturbanceBrush; - private var _mouseBrush : DisturbanceBrush; - private var _liquidShading : Boolean = true; - private var _showingLiquidImage : Boolean; - private var _showingLiquidImage1 : Boolean; - private var _showingLiquidImage2 : Boolean; - private var _gui : SimpleGUI; - private var _rain : Boolean; - private var _inverse : Matrix3D = new Matrix3D(); - private var _projX : Number, _projY : Number; - public var hx : Number, hy : Number, hz : Number; - private var _min : Number; - private var _max : Number; - private var _colorMaterial : ColorMaterial; - private var _liquidMaterial : ColorMaterial; - - public function ShallowWaterDemo() : void - { - // Init stage. - stage.scaleMode = StageScaleMode.NO_SCALE; - stage.align = StageAlign.TOP_LEFT; - stage.frameRate = 60; - - // Init 3D core. - _view = new View3D(); - addChild(_view); - - // Show Away3D stats. - var stats : AwayStats = new AwayStats(_view); - stats.x = stage.stageWidth - stats.width; - addChild(stats); - - // Signature. - var sig : Sprite = new AwaySignature() as Sprite; - sig.y = stage.stageHeight; - sig.useHandCursor = sig.buttonMode = true; - sig.getChildByName("awayHit").addEventListener(MouseEvent.CLICK, logoClickHandler); - sig.getChildByName("liHit").addEventListener(MouseEvent.CLICK, liClickHandler); - sig.getChildByName("davidHit").addEventListener(MouseEvent.CLICK, davidClickHandler); - addChild(sig); - - // Init camera controller. - _view.camera.z = -250; - _view.camera.y = 200; - _view.camera.lens.far = 5000000; - _view.backgroundColor = 0x000000; - s - _cameraController = new MKSOCameraController(_view.camera); - _cameraController.soCameraController.oCameraController.maxElevation = -0.1; - _cameraController.soCameraController.oCameraController.minRadius = 300; - _cameraController.soCameraController.oCameraController.maxRadius = 2000; - _view.parent.addChildAt(_cameraController, 0); - - // Fluid. - var gridN : uint = 200; // Not larget than 255. - var gridSpacing : Number = 400 / gridN; - var dt : Number = 1 / stage.frameRate; - var viscosity : Number = 0.3; - var waveVelocity : Number = 0.99; // < 1 or the sim will collapse. - fluid = new ShallowFluid(gridN, gridN, gridSpacing, dt, waveVelocity, viscosity); - - // Disturbance util. - _fluidDisturb = new FluidDisturb(fluid); - - // Lights. - _light = new PointLight(); // DirectionalLight(); - _light.color = 0x0000FF; - _light.specular = 0.5; - _light.diffuse = 2; - _view.scene.addChild(_light); - - // Skybox. - _cubeMap = new CubeMap(new EnvPosX().bitmapData, new EnvNegX().bitmapData, - new EnvPosY().bitmapData, new EnvNegY().bitmapData, - new EnvPosZ().bitmapData, new EnvNegZ().bitmapData); - _view.scene.addChild(new SkyBox(_cubeMap)); - - // Init plane materials. - _liquidMaterial = new ColorMaterial(0xFFFFFF); - _liquidMaterial.specular = 0.5; - _liquidMaterial.ambient = 0.25; - _liquidMaterial.ambientColor = 0x111199; - _liquidMaterial.addMethod(new EnvMapMethod(_cubeMap, 1)); - _liquidMaterial.lights = [_light]; - _colorMaterial = new ColorMaterial(_liquidMaterial.color); - _colorMaterial.specular = _liquidMaterial.specular; - _colorMaterial.ambient = _liquidMaterial.ambient; - _colorMaterial.ambientColor = 0x555555; - _colorMaterial.diffuseMethod = new BasicDiffuseMethod(); - _colorMaterial.lights = [_light]; - - // Init plane. - _plane = new Plane(_liquidMaterial); - _plane.x -= gridSpacing / 2 + gridN * gridSpacing / 2; - _plane.z -= gridSpacing / 2 + gridN * gridSpacing / 2; - _plane.geometry.subGeometries[0].autoDeriveVertexNormals = false; - _plane.geometry.subGeometries[0].autoDeriveVertexTangents = false; - _plane.segmentsW = _plane.segmentsH = (gridN - 1); - _plane.rotationX = -90; - _plane.width = _plane.height = (gridN - 1) * gridSpacing; - _min = -_plane.width / 2; - _max = _plane.width / 2; - _view.scene.addChild(_plane); - - var fog : FogMethod = new FogMethod(2500, 0x000000); - - // Pool. - var poolHeight : Number = 500000; - var poolWallDepth : Number = 5; - var poolOffset : Number = 5; - var tex : BitmapData = new BitmapData(512, 512, false, 0); - tex.perlinNoise(25, 25, 8, 1, false, true, 7, true); - var white : Number = 0; - tex.colorTransform(tex.rect, new ColorTransform(0.1, 0.1, 0.1, 1, white, white, white, 0)); - var poolMat : BitmapMaterial = new BitmapMaterial(tex); - poolMat.addMethod(fog); - var left : Cube = new Cube(poolMat); - var s : uint = 1; - left.segmentsW = left.segmentsH = left.segmentsD = s; - left.x = -_plane.width / 2 - poolWallDepth / 2; - left.y = -poolHeight / 2 + poolOffset; - left.width = poolWallDepth; - left.height = poolHeight; - left.depth = _plane.width + 2 * poolWallDepth; - _view.scene.addChild(left); - var right : Cube = new Cube(poolMat); - right.segmentsW = right.segmentsH = right.segmentsD = s; - right.x = _plane.width / 2 + poolWallDepth / 2; - right.y = left.y; - right.width = poolWallDepth; - right.height = poolHeight; - right.depth = _plane.width + 2 * poolWallDepth; - _view.scene.addChild(right); - var back : Cube = new Cube(poolMat); - back.segmentsW = back.segmentsH = back.segmentsD = s; - back.z = _plane.width / 2 + poolWallDepth / 2; - back.y = left.y; - back.depth = poolWallDepth; - back.height = poolHeight; - back.width = _plane.width; - _view.scene.addChild(back); - var front : Cube = new Cube(poolMat); - front.segmentsW = front.segmentsH = front.segmentsD = s; - front.z = -_plane.width / 2 - poolWallDepth / 2; - front.y = left.y; - front.depth = poolWallDepth; - front.height = poolHeight; - front.width = _plane.width; - _view.scene.addChild(front); - - // Landscape. -// var imgWidth:Number = 512; -// var map:Bitmap = new HeightMapAsset() as Bitmap; -// var floor:Bitmap = new FloorAsset() as Bitmap; -// var t:BitmapData = new BitmapData(256, 256, false, 0xFFFFFF); -// var p:BitmapData = map.bitmapData; -// var m:BitmapMaterial = new BitmapMaterial(t); -// m.addMethod(fog); -// var landscape:Plane = new Plane(m); -// var res:uint = 100; -// landscape.segmentsW = landscape.segmentsH = res - 1; -// landscape.width = landscape.height = 2000; -// landscape.rotationX = -90; -// var h:Number = 200; -// landscape.y = -65; -//// _view.scene.addChild(landscape); -// var i:uint, j:uint; -// var imgx:uint, imgy:uint, gray:uint, index:uint; -// var d:Number = imgWidth/res; -// var newVerts:Vector. = landscape.geometry.subGeometries[0].vertexData.concat(); -// p.lock(); -// for(i = 0; i < res; i++) -// { -// for(j = 0; j < res; j++) -// { -// imgx = i*d; -// imgy = j*d; -// gray = p.getPixel(imgx, imgy) & 0x0000FF; -// index = 3*(j*res + i); -// newVerts[index + 2] -= h*gray/255; -// } -// } -// p.unlock(); -// landscape.geometry.subGeometries[0].updateVertexData(newVerts); - - // For disturbances. - initBrushes(); - - // Rain. - _dropTmr = new Timer(50); - _dropTmr.addEventListener(TimerEvent.TIMER, _dropTmr_timerHandler); - - // Start loop. - addEventListener(Event.ENTER_FRAME, enterFrameHandler); - - // SimpleGUI based on minimalcomps. - initGUI(); - - // Stage clicks. - stage.addEventListener(MouseEvent.MOUSE_DOWN, stage_mouseDownHandler); - stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUpHandler); - } + // Environment map. + [Embed(source="../embeds/envMap/snow_positive_x.jpg")] + private var EnvPosX:Class; + [Embed(source="../embeds/envMap/snow_positive_y.jpg")] + private var EnvPosY:Class; + [Embed(source="../embeds/envMap/snow_positive_z.jpg")] + private var EnvPosZ:Class; + [Embed(source="../embeds/envMap/snow_negative_x.jpg")] + private var EnvNegX:Class; + [Embed(source="../embeds/envMap/snow_negative_y.jpg")] + private var EnvNegY:Class; + [Embed(source="../embeds/envMap/snow_negative_z.jpg")] + private var EnvNegZ:Class; + + // Liquid image assets. + [Embed(source="../embeds/li_swf_assets/shallowwater/assets.swf", symbol="ImageClip")] + private var ImageClip:Class; + [Embed(source="../embeds/li_swf_assets/shallowwater/assets.swf", symbol="ImageClip1")] + private var ImageClip1:Class; + [Embed(source="../embeds/li_swf_assets/shallowwater/assets.swf", symbol="ImageClip2")] + private var ImageClip2:Class; + + // Signature asset. + [Embed(source="../embeds/li_swf_assets/shallowwater/assets.swf", symbol="AwaySignature")] + private var AwaySignature:Class; + + // Disturbance brushes. + [Embed(source="../embeds/li_swf_assets/shallowwater/assets.swf", symbol="Brush1")] + private var Brush1:Class; + [Embed(source="../embeds/li_swf_assets/shallowwater/assets.swf", symbol="Brush2")] + private var Brush2:Class; + [Embed(source="../embeds/li_swf_assets/shallowwater/assets.swf", symbol="Brush3")] + private var Brush3:Class; + [Embed(source="../embeds/li_swf_assets/shallowwater/assets.swf", symbol="Brush4")] + private var Brush4:Class; + [Embed(source="../embeds/li_swf_assets/shallowwater/assets.swf", symbol="Brush5")] + private var Brush5:Class; + [Embed(source="../embeds/li_swf_assets/shallowwater/assets.swf", symbol="Brush6")] + private var Brush6:Class; + + public var mouseBrushStrength:Number = 5; + public var rainBrushStrength:Number = 10; + public var mouseBrushLife:uint = 0; + + public var fluid:ShallowFluid; + private var _view:View3D; + private var _cameraController:MKSOCameraController; + private var _plane:Plane; + private var _pressing:Boolean; + private var _light:LightBase; + private var _dropTmr:Timer; + private var _fluidDisturb:FluidDisturb; + private var _cubeMap:CubeMap; + public var brushClip1:Sprite; + public var brushClip2:Sprite; + public var brushClip3:Sprite; + public var brushClip4:Sprite; + public var brushClip5:Sprite; + public var brushClip6:Sprite; + public var brushClips:Array; + private var _activeMouseBrushClip:Sprite; + private var _rainBrush:DisturbanceBrush; + private var _imageBrush:DisturbanceBrush; + private var _mouseBrush:DisturbanceBrush; + private var _liquidShading:Boolean = true; + private var _showingLiquidImage:Boolean; + private var _showingLiquidImage1:Boolean; + private var _showingLiquidImage2:Boolean; + private var _gui:SimpleGUI; + private var _rain:Boolean; + private var _inverse:Matrix3D = new Matrix3D(); + private var _projX:Number, _projY:Number; + public var hx:Number, hy:Number, hz:Number; + private var _min:Number; + private var _max:Number; + private var _colorMaterial:ColorMaterial; + private var _liquidMaterial:ColorMaterial; + + public function ShallowWaterDemo():void + { + addEventListener(Event.ADDED_TO_STAGE, stageInitHandler); + } - private function logoClickHandler(evt : MouseEvent) : void - { - navigateToURL(new URLRequest("http://www.away3d.com"), "_blank"); - } + private function stageInitHandler(evt:Event):void + { + removeEventListener(Event.ADDED_TO_STAGE, stageInitHandler); + + // Init stage. + stage.scaleMode = StageScaleMode.NO_SCALE; + stage.align = StageAlign.TOP_LEFT; + stage.frameRate = 60; + + // Init 3D core. + _view = new View3D(); + addChild(_view); + + // Show Away3D stats. + var stats:AwayStats = new AwayStats(_view); + stats.x = stage.stageWidth - stats.width; + addChild(stats); + + // Signature. + var sig:Sprite = new AwaySignature() as Sprite; + sig.y = stage.stageHeight; + sig.useHandCursor = sig.buttonMode = true; + sig.getChildByName("awayHit").addEventListener(MouseEvent.CLICK, logoClickHandler); + sig.getChildByName("liHit").addEventListener(MouseEvent.CLICK, liClickHandler); + sig.getChildByName("davidHit").addEventListener(MouseEvent.CLICK, davidClickHandler); + addChild(sig); + + // Init camera controller. + _view.camera.z = -250; + _view.camera.y = 200; + _view.camera.lens.far = 5000000; + _view.backgroundColor = 0x000000; + s + _cameraController = new MKSOCameraController(_view.camera); + _cameraController.soCameraController.oCameraController.maxElevation = -0.1; + _cameraController.soCameraController.oCameraController.minRadius = 300; + _cameraController.soCameraController.oCameraController.maxRadius = 2000; + _view.parent.addChildAt(_cameraController, 0); + + // Fluid. + var gridN:uint = 200; // Not larget than 255. + var gridSpacing:Number = 400/gridN; + var dt:Number = 1/stage.frameRate; + var viscosity:Number = 0.3; + var waveVelocity:Number = 0.99; // < 1 or the sim will collapse. + fluid = new ShallowFluid(gridN, gridN, gridSpacing, dt, waveVelocity, viscosity); + + // Disturbance util. + _fluidDisturb = new FluidDisturb(fluid); + + // Lights. + _light = new PointLight(); // DirectionalLight(); + _light.color = 0x0000FF; + _light.specular = 0.5; + _light.diffuse = 2; + _view.scene.addChild(_light); + + // Skybox. + _cubeMap = new CubeMap(new EnvPosX().bitmapData, new EnvNegX().bitmapData, + new EnvPosY().bitmapData, new EnvNegY().bitmapData, + new EnvPosZ().bitmapData, new EnvNegZ().bitmapData); + _view.scene.addChild(new SkyBox(_cubeMap)); + + // Init plane materials. + _liquidMaterial = new ColorMaterial(0xFFFFFF); + _liquidMaterial.specular = 0.5; + _liquidMaterial.ambient = 0.25; + _liquidMaterial.ambientColor = 0x111199; + _liquidMaterial.ambient = 1; + _liquidMaterial.addMethod(new EnvMapMethod(_cubeMap, 1)); + _liquidMaterial.lights = [_light]; + _colorMaterial = new ColorMaterial(_liquidMaterial.color); + _colorMaterial.specular = _liquidMaterial.specular; + _colorMaterial.ambient = _liquidMaterial.ambient; + _colorMaterial.ambientColor = 0x555555; + _colorMaterial.ambient = 1; + _colorMaterial.diffuseMethod = new BasicDiffuseMethod(); + _colorMaterial.lights = [_light]; + + // Init plane. + _plane = new Plane(_liquidMaterial); + _plane.x -= gridSpacing/2 + gridN*gridSpacing/2; + _plane.z -= gridSpacing/2 + gridN*gridSpacing/2; + _plane.geometry.subGeometries[0].autoDeriveVertexNormals = false; + _plane.geometry.subGeometries[0].autoDeriveVertexTangents = false; + _plane.segmentsW = _plane.segmentsH = (gridN - 1); + _plane.rotationX = 90; + _plane.width = _plane.height = (gridN - 1)*gridSpacing; + _min = -_plane.width/2; + _max = _plane.width/2; + _view.scene.addChild(_plane); + + var fog:FogMethod = new FogMethod(2500, 0x000000); + + // Pool. + var poolHeight:Number = 500000; + var poolWallDepth:Number = 5; + var poolOffset:Number = 5; + var tex:BitmapData = new BitmapData(512, 512, false, 0); + tex.perlinNoise(25, 25, 8, 1, false, true, 7, true); + var white:Number = 0; + tex.colorTransform(tex.rect, new ColorTransform(0.1, 0.1, 0.1, 1, white, white, white, 0)); + var poolMat:BitmapMaterial = new BitmapMaterial(tex); + poolMat.addMethod(fog); + var left:Cube = new Cube(poolMat); + var s:uint = 1; + left.segmentsW = left.segmentsH = left.segmentsD = s; + left.x = -_plane.width/2 - poolWallDepth/2; + left.y = -poolHeight/2 + poolOffset; + left.width = poolWallDepth; + left.height = poolHeight; + left.depth = _plane.width + 2*poolWallDepth; + _view.scene.addChild(left); + var right:Cube = new Cube(poolMat); + right.segmentsW = right.segmentsH = right.segmentsD = s; + right.x = _plane.width/2 + poolWallDepth/2; + right.y = left.y; + right.width = poolWallDepth; + right.height = poolHeight; + right.depth = _plane.width + 2*poolWallDepth; + _view.scene.addChild(right); + var back:Cube = new Cube(poolMat); + back.segmentsW = back.segmentsH = back.segmentsD = s; + back.z = _plane.width/2 + poolWallDepth/2; + back.y = left.y; + back.depth = poolWallDepth; + back.height = poolHeight; + back.width = _plane.width; + _view.scene.addChild(back); + var front:Cube = new Cube(poolMat); + front.segmentsW = front.segmentsH = front.segmentsD = s; + front.z = -_plane.width/2 - poolWallDepth/2; + front.y = left.y; + front.depth = poolWallDepth; + front.height = poolHeight; + front.width = _plane.width; + _view.scene.addChild(front); + + // For disturbances. + initBrushes(); + + // Rain. + _dropTmr = new Timer(50); + _dropTmr.addEventListener(TimerEvent.TIMER, _dropTmr_timerHandler); + + // Start loop. + addEventListener(Event.ENTER_FRAME, enterFrameHandler); + + // SimpleGUI based on minimalcomps. + initGUI(); + + // Stage clicks. + stage.addEventListener(MouseEvent.MOUSE_DOWN, stage_mouseDownHandler); + stage.addEventListener(MouseEvent.MOUSE_UP, stage_mouseUpHandler); + } - private function liClickHandler(evt : MouseEvent) : void - { - navigateToURL(new URLRequest("http://www.lidev.com.ar"), "_blank"); - } + private function logoClickHandler(evt:MouseEvent):void + { + navigateToURL(new URLRequest("http://www.away3d.com"), "_blank"); + } - private function davidClickHandler(evt : MouseEvent) : void - { - navigateToURL(new URLRequest("http://www.derschmale.com/"), "_blank"); - } + private function liClickHandler(evt:MouseEvent):void + { + navigateToURL(new URLRequest("http://www.lidev.com.ar"), "_blank"); + } - // ---------------------- - // GUI. - // ---------------------- + private function davidClickHandler(evt:MouseEvent):void + { + navigateToURL(new URLRequest("http://www.derschmale.com/"), "_blank"); + } - private function initGUI() : void - { - _gui = new SimpleGUI(this, ""); - - _gui.addColumn("Simulation"); - _gui.addSlider("fluid.speed", 0.0, 0.95, {label:"speed", tick:0.01}); - _gui.addSlider("fluid.viscosity", 0.0, 1.7, {label:"viscosity", tick:0.01}); - _gui.addToggle("toggleShading", {label:"reflective shading"}); - - var instr : String = "Instructions:\n"; - instr += "Click and drag on the stage to rotate camera.\n"; - instr += "Click on the fluid to disturb it.\n"; - instr += "Keyboard arrows and WASD also rotate camera.\n"; - instr += "Keyboard Z and X zoom camera.\n"; - _gui.addLabel(instr); - - _gui.addColumn("Rain"); - _gui.addToggle("toggleRain", {label:"enabled"}); - _gui.addSlider("rainTime", 10, 1000, {label:"speed", tick:10}); - _gui.addSlider("rainBrushStrength", 1, 50, {label:"strength", tick:0.01}); - - _gui.addColumn("Mouse Brush"); - _gui.addComboBox("activeMouseBrushClip", brushClips, {label:"brush"}); - _gui.addSlider("mouseBrushStrength", -10, 10, {label:"strength", tick:0.01}); - _gui.addSlider("mouseBrushLife", 0, 10000, {label:"life", tick:10}); - - _gui.addColumn("Liquid Image"); - _gui.addToggle("toggleLiquidImage", {label:"away"}); - _gui.addToggle("toggleLiquidImage2", {label:"mustang"}); - _gui.addToggle("toggleLiquidImage1", {label:"winston"}); - _gui.show(); - } + // ---------------------- + // GUI. + // ---------------------- - // ---------------------- - // BRUSHES. - // ---------------------- + private function initGUI():void + { + _gui = new SimpleGUI(this, ""); + + _gui.addColumn("Simulation"); + _gui.addSlider("fluid.speed", 0.0, 0.95, {label:"speed", tick:0.01}); + _gui.addSlider("fluid.viscosity", 0.0, 1.7, {label:"viscosity", tick:0.01}); + _gui.addToggle("toggleShading", {label:"reflective shading"}); + + var instr:String = "Instructions:\n"; + instr += "Click and drag on the stage to rotate camera.\n"; + instr += "Click on the fluid to disturb it.\n"; + instr += "Keyboard arrows and WASD also rotate camera.\n"; + instr += "Keyboard Z and X zoom camera.\n"; + _gui.addLabel(instr); + + _gui.addColumn("Rain"); + _gui.addToggle("toggleRain", {label:"enabled"}); + _gui.addSlider("rainTime", 10, 1000, {label:"speed", tick:10}); + _gui.addSlider("rainBrushStrength", 1, 50, {label:"strength", tick:0.01}); + + _gui.addColumn("Mouse Brush"); + _gui.addComboBox("activeMouseBrushClip", brushClips, {label:"brush"}); + _gui.addSlider("mouseBrushStrength", -10, 10, {label:"strength", tick:0.01}); + _gui.addSlider("mouseBrushLife", 0, 10000, {label:"life", tick:10}); + + _gui.addColumn("Liquid Image"); + _gui.addToggle("toggleLiquidImage", {label:"away"}); + _gui.addToggle("toggleLiquidImage2", {label:"mustang"}); + _gui.addToggle("toggleLiquidImage1", {label:"winston"}); + _gui.show(); + } - private function initBrushes() : void - { - // Init brush clips. - brushClip1 = new Brush1() as Sprite; - brushClip2 = new Brush2() as Sprite; - brushClip3 = new Brush3() as Sprite; - brushClip4 = new Brush4() as Sprite; - brushClip5 = new Brush5() as Sprite; - brushClip6 = new Brush6() as Sprite; - brushClips = [ - {label:"drop", data:brushClip3}, - {label:"star", data:brushClip1}, - {label:"box", data:brushClip2}, - {label:"triangle", data:brushClip4}, - {label:"stamp", data:brushClip5}, - {label:"butter", data:brushClip6} - ]; - _activeMouseBrushClip = brushClip3; - - // Init brushes. - _rainBrush = new DisturbanceBrush(); - _rainBrush.fromSprite(brushClip3); - _mouseBrush = new DisturbanceBrush(); - _mouseBrush.fromSprite(_activeMouseBrushClip); - _imageBrush = new DisturbanceBrush(); - _imageBrush.fromSprite(new ImageClip() as Sprite); - } + // ---------------------- + // BRUSHES. + // ---------------------- - public function set activeMouseBrushClip(value : Sprite) : void - { - _activeMouseBrushClip = value; - _mouseBrush.fromSprite(_activeMouseBrushClip, 2); - } + private function initBrushes():void + { + // Init brush clips. + brushClip1 = new Brush1() as Sprite; + brushClip2 = new Brush2() as Sprite; + brushClip3 = new Brush3() as Sprite; + brushClip4 = new Brush4() as Sprite; + brushClip5 = new Brush5() as Sprite; + brushClip6 = new Brush6() as Sprite; + brushClips = [ + {label:"drop", data:brushClip3}, + {label:"star", data:brushClip1}, + {label:"box", data:brushClip2}, + {label:"triangle", data:brushClip4}, + {label:"stamp", data:brushClip5}, + {label:"butter", data:brushClip6} + ]; + _activeMouseBrushClip = brushClip3; + + // Init brushes. + _rainBrush = new DisturbanceBrush(); + _rainBrush.fromSprite(brushClip3); + _mouseBrush = new DisturbanceBrush(); + _mouseBrush.fromSprite(_activeMouseBrushClip); + _imageBrush = new DisturbanceBrush(); + _imageBrush.fromSprite(new ImageClip() as Sprite); + } - public function get activeMouseBrushClip() : Sprite - { - return _activeMouseBrushClip; - } + public function set activeMouseBrushClip(value:Sprite):void + { + _activeMouseBrushClip = value; + _mouseBrush.fromSprite(_activeMouseBrushClip, 2); + } - public function set rainTime(delay : uint) : void - { - _dropTmr.delay = delay; - } + public function get activeMouseBrushClip():Sprite + { + return _activeMouseBrushClip; + } - public function get rainTime() : uint - { - return _dropTmr.delay; - } + public function set rainTime(delay:uint):void + { + _dropTmr.delay = delay; + } - // --------------- - // MATERIALS. - // --------------- + public function get rainTime():uint + { + return _dropTmr.delay; + } - public function set toggleShading(value : Boolean) : void - { - _liquidShading = value; - if (_liquidShading) - _plane.material = _liquidMaterial; - else - _plane.material = _colorMaterial; - } + // --------------- + // MATERIALS. + // --------------- - public function get toggleShading() : Boolean - { - return _liquidShading; - } + public function set toggleShading(value:Boolean):void + { + _liquidShading = value; + if(_liquidShading) + _plane.material = _liquidMaterial; + else + _plane.material = _colorMaterial; + } - // --------------- - // LIQUID IMAGE. - // --------------- + public function get toggleShading():Boolean + { + return _liquidShading; + } - public function set toggleLiquidImage(value : Boolean) : void - { - _showingLiquidImage = value; - if (_showingLiquidImage) { - _imageBrush.fromSprite(new ImageClip() as Sprite); - _fluidDisturb.disturbBitmapMemory(0.5, 0.5, -10, _imageBrush.bitmapData, -1, 0.01); - } - else - _fluidDisturb.releaseMemoryDisturbances(); - } + // --------------- + // LIQUID IMAGE. + // --------------- - public function get toggleLiquidImage() : Boolean + public function set toggleLiquidImage(value:Boolean):void + { + _showingLiquidImage = value; + if(_showingLiquidImage) { - return _showingLiquidImage; + _imageBrush.fromSprite(new ImageClip() as Sprite); + _fluidDisturb.disturbBitmapMemory(0.5, 0.5, -10, _imageBrush.bitmapData, -1, 0.01); } + else + _fluidDisturb.releaseMemoryDisturbances(); + } - public function set toggleLiquidImage1(value : Boolean) : void - { - _showingLiquidImage1 = value; - if (_showingLiquidImage1) { - _imageBrush.fromSprite(new ImageClip1() as Sprite); - _fluidDisturb.disturbBitmapMemory(0.5, 0.5, -15, _imageBrush.bitmapData, -1, 0.01); - } - else - _fluidDisturb.releaseMemoryDisturbances(); - } + public function get toggleLiquidImage():Boolean + { + return _showingLiquidImage; + } - public function get toggleLiquidImage1() : Boolean + public function set toggleLiquidImage1(value:Boolean):void + { + _showingLiquidImage1 = value; + if(_showingLiquidImage1) { - return _showingLiquidImage1; + _imageBrush.fromSprite(new ImageClip1() as Sprite); + _fluidDisturb.disturbBitmapMemory(0.5, 0.5, -15, _imageBrush.bitmapData, -1, 0.01); } + else + _fluidDisturb.releaseMemoryDisturbances(); + } - public function set toggleLiquidImage2(value : Boolean) : void - { - _showingLiquidImage2 = value; - if (_showingLiquidImage2) { - _imageBrush.fromSprite(new ImageClip2() as Sprite); - _fluidDisturb.disturbBitmapMemory(0.5, 0.5, -15, _imageBrush.bitmapData, -1, 0.01); - } - else - _fluidDisturb.releaseMemoryDisturbances(); - } + public function get toggleLiquidImage1():Boolean + { + return _showingLiquidImage1; + } - public function get toggleLiquidImage2() : Boolean + public function set toggleLiquidImage2(value:Boolean):void + { + _showingLiquidImage2 = value; + if(_showingLiquidImage2) { - return _showingLiquidImage2; + _imageBrush.fromSprite(new ImageClip2() as Sprite); + _fluidDisturb.disturbBitmapMemory(0.5, 0.5, -15, _imageBrush.bitmapData, -1, 0.01); } + else + _fluidDisturb.releaseMemoryDisturbances(); + } - // --------------- - // RAIN. - // --------------- + public function get toggleLiquidImage2():Boolean + { + return _showingLiquidImage2; + } - public function set toggleRain(value : Boolean) : void - { - _rain = value; - if (_rain) - _dropTmr.start(); - else - _dropTmr.stop(); - } + // --------------- + // RAIN. + // --------------- - public function get toggleRain() : Boolean - { - return _rain; - } + public function set toggleRain(value:Boolean):void + { + _rain = value; + if(_rain) + _dropTmr.start(); + else + _dropTmr.stop(); + } - private function _dropTmr_timerHandler(event : TimerEvent) : void - { - _fluidDisturb.disturbBitmapInstant(randNum(0.1, 0.9), randNum(0.1, 0.9), rainBrushStrength, _rainBrush.bitmapData); - } + public function get toggleRain():Boolean + { + return _rain; + } - // --------------- - // MOUSE. - // --------------- + private function _dropTmr_timerHandler(event:TimerEvent):void + { + _fluidDisturb.disturbBitmapInstant(randNum(0.1, 0.9), randNum(0.1, 0.9), rainBrushStrength, _rainBrush.bitmapData); + } - private function stage_mouseDownHandler(event : MouseEvent) : void - { - _pressing = true; + // --------------- + // MOUSE. + // --------------- - updateMouse(); + private function stage_mouseDownHandler(event:MouseEvent):void + { + _pressing = true; - if (hx > _min && hx < _max && hz > _min && hz < _max) - _cameraController.mouseInteractionEnabled = false; - else - _pressing = false; - } + updateMouse(); - private function stage_mouseUpHandler(event : MouseEvent) : void - { + if(hx > _min && hx < _max && hz > _min && hz < _max) + _cameraController.mouseInteractionEnabled = false; + else _pressing = false; - _cameraController.mouseInteractionEnabled = true; - } + } + + private function stage_mouseUpHandler(event:MouseEvent):void + { + _pressing = false; + _cameraController.mouseInteractionEnabled = true; + } - /* - Decided not to use built in mouse interactivity. - Using this chunk of code I stole from the engine instead. - */ - private function updateMouse() : void + /* + Decided not to use built in mouse interactivity. + Using this chunk of code I stole from the engine instead. + */ + private function updateMouse():void + { + _projX = 1 - 2*stage.mouseX/stage.stageWidth; + _projY = 2*stage.mouseY/stage.stageHeight - 1; + + // calculate screen ray and find exact intersection position with triangle + var rx:Number, ry:Number, rz:Number; + var ox:Number, oy:Number, oz:Number, ow:Number; + var t:Number; + var raw:Vector.; + + _inverse.copyFrom(_view.camera.lens.matrix); + _inverse.invert(); + raw = Matrix3DUtils.RAW_DATA_CONTAINER; + _inverse.copyRawDataTo(raw); + + // unproject projection point, gives ray dir in cam space + ox = raw[0]*_projX + raw[4]*_projY + raw[12]; + oy = raw[1]*_projX + raw[5]*_projY + raw[13]; + oz = raw[2]*_projX + raw[6]*_projY + raw[14]; + ow = raw[3]*_projX + raw[7]*_projY + raw[15]; + ox /= -ow; + oy /= -ow; + oz /= ow; + + // transform ray dir and origin (cam pos) to object space + _inverse.copyFrom(_view.camera.sceneTransform); + _inverse.copyRawDataTo(raw); + rx = raw[0]*ox + raw[4]*oy + raw[8]*oz; + ry = raw[1]*ox + raw[5]*oy + raw[9]*oz; + rz = raw[2]*ox + raw[6]*oy + raw[10]*oz; + + ox = raw[12]; + oy = raw[13]; + oz = raw[14]; + + t = -oy/ry; + + hx = ox + rx*t; + hy = oy + ry*t; + hz = oz + rz*t; + + if(hx > _min && hx < _max && hz > _min && hz < _max) { - _projX = 1 - 2 * stage.mouseX / stage.stageWidth; - _projY = 2 * stage.mouseY / stage.stageHeight - 1; - - // calculate screen ray and find exact intersection position with triangle - var rx : Number, ry : Number, rz : Number; - var ox : Number, oy : Number, oz : Number, ow : Number; - var t : Number; - var raw : Vector.; - - _inverse.copyFrom(_view.camera.lens.matrix); - _inverse.invert(); - raw = Matrix3DUtils.RAW_DATA_CONTAINER; - _inverse.copyRawDataTo(raw); - - // unproject projection point, gives ray dir in cam space - ox = raw[0] * _projX + raw[4] * _projY + raw[12]; - oy = raw[1] * _projX + raw[5] * _projY + raw[13]; - oz = raw[2] * _projX + raw[6] * _projY + raw[14]; - ow = raw[3] * _projX + raw[7] * _projY + raw[15]; - ox /= -ow; - oy /= -ow; - oz /= ow; - - // transform ray dir and origin (cam pos) to object space - _inverse.copyFrom(_view.camera.sceneTransform); - _inverse.copyRawDataTo(raw); - rx = raw[0] * ox + raw[4] * oy + raw[8] * oz; - ry = raw[1] * ox + raw[5] * oy + raw[9] * oz; - rz = raw[2] * ox + raw[6] * oy + raw[10] * oz; - - ox = raw[12]; - oy = raw[13]; - oz = raw[14]; - - t = -oy / ry; - - hx = ox + rx * t; - hy = oy + ry * t; - hz = oz + rz * t; - - if (hx > _min && hx < _max && hz > _min && hz < _max) { - // Disturb mouse. - var evtx : Number = 0.5 * (hx + _max) / _max; - var evty : Number = 0.5 * (hz + _max) / _max; - if (mouseBrushLife == 0) - _fluidDisturb.disturbBitmapInstant(evtx, evty, -mouseBrushStrength, _mouseBrush.bitmapData); - else - _fluidDisturb.disturbBitmapMemory(evtx, evty, - -5 * mouseBrushStrength, - _mouseBrush.bitmapData, - mouseBrushLife, - 0.2); - } + // Disturb mouse. + var evtx:Number = 0.5*(hx + _max)/_max; + var evty:Number = 0.5*(hz + _max)/_max; + if(mouseBrushLife == 0) + _fluidDisturb.disturbBitmapInstant(evtx, evty, -mouseBrushStrength, _mouseBrush.bitmapData); + else + _fluidDisturb.disturbBitmapMemory(evtx, evty, + -5*mouseBrushStrength, + _mouseBrush.bitmapData, + mouseBrushLife, + 0.2); } + } - // --------------- - // LOOP. - // --------------- + // --------------- + // LOOP. + // --------------- - private function enterFrameHandler(event : Event) : void - { - // Update camera. - _cameraController.update(); + private function enterFrameHandler(event:Event):void + { + // Update camera. + _cameraController.update(); - // Update fluid. - fluid.evaluate(); + // Update fluid. + fluid.evaluate(); - // Update memory disturbances. - _fluidDisturb.updateMemoryDisturbances(); + // Update memory disturbances. + _fluidDisturb.updateMemoryDisturbances(); - // Update plane to fluid. - _plane.geometry.subGeometries[0].updateVertexData(fluid.points); - _plane.geometry.subGeometries[0].updateVertexNormalData(fluid.normals); - _plane.geometry.subGeometries[0].updateVertexTangentData(fluid.tangents); + // Update plane to fluid. + _plane.geometry.subGeometries[0].updateVertexData(fluid.points); + _plane.geometry.subGeometries[0].updateVertexNormalData(fluid.normals); + _plane.geometry.subGeometries[0].updateVertexTangentData(fluid.tangents); - // Update light. - _light.transform = _view.camera.transform.clone(); + // Update light. + _light.transform = _view.camera.transform.clone(); - // Render. - _view.render(); + // Render. + _view.render(); - if (_pressing) - updateMouse(); - } + if(_pressing) + updateMouse(); + } - // --------------- - // UTILS. - // --------------- + // --------------- + // UTILS. + // --------------- - private function randNum(min : Number, max : Number) : Number - { - return (max - min) * Math.random() + min; - } + private function randNum(min:Number, max:Number):Number + { + return (max - min)*Math.random() + min; + } - private function clampNum(value : Number, min : Number, max : Number) : Number - { - if (value < min) - return min; - else if (value > max) - return max; - else - return value; - } + private function clampNum(value:Number, min:Number, max:Number):Number + { + if(value < min) + return min; + else if(value > max) + return max; + else + return value; } } +} diff --git a/src/SimpleTerrainTest.as b/src/SimpleTerrainTest.as index 9bd1dd4..5704e05 100644 --- a/src/SimpleTerrainTest.as +++ b/src/SimpleTerrainTest.as @@ -1,55 +1,44 @@ package { import away3d.containers.View3D; - import away3d.debug.AwayStats; + import away3d.debug.AwayStats; + import away3d.extrusions.Elevation; import away3d.filters.BloomFilter3D; - import away3d.filters.DepthOfFieldFilter3D; import away3d.filters.MotionBlurFilter3D; import away3d.lights.DirectionalLight; - import away3d.lights.LightBase; - import away3d.lights.PointLight; import away3d.materials.BitmapMaterial; - import away3d.materials.methods.FilteredShadowMapMethod; import away3d.materials.methods.FogMethod; - import away3d.materials.methods.SoftShadowMapMethod; - import away3d.materials.methods.TerrainDiffuseMethod; - import away3d.materials.utils.CubeMap; - import away3d.primitives.Cube; - import away3d.extrusions.Elevation; - import away3d.primitives.Plane; - import away3d.primitives.SkyBox; - import away3d.primitives.Sphere; - import away3d.containers.ObjectContainer3D; - - import flash.display.BitmapData; + import away3d.materials.methods.TerrainDiffuseMethod; + import away3d.materials.utils.CubeMap; + import away3d.primitives.SkyBox; + import flash.display.Sprite; import flash.display.StageAlign; import flash.display.StageScaleMode; import flash.events.Event; import flash.events.KeyboardEvent; import flash.ui.Keyboard; - import flash.utils.getTimer; [SWF(width="1024", height="576", frameRate="60")] public class SimpleTerrainTest extends Sprite { private var _view : View3D; - + private var _light : DirectionalLight; - // Environment map. - [Embed(source="../embeds/envMap/snow_positive_x.jpg")] - private var EnvPosX:Class; - [Embed(source="../embeds/envMap/snow_positive_y.jpg")] - private var EnvPosY:Class; - [Embed(source="../embeds/envMap/snow_positive_z.jpg")] - private var EnvPosZ:Class; - [Embed(source="../embeds/envMap/snow_negative_x.jpg")] - private var EnvNegX:Class; - [Embed(source="../embeds/envMap/snow_negative_y.jpg")] - private var EnvNegY:Class; - [Embed(source="../embeds/envMap/snow_negative_z.jpg")] - private var EnvNegZ:Class; + // Environment map. + [Embed(source="../embeds/envMap/snow_positive_x.jpg")] + private var EnvPosX : Class; + [Embed(source="../embeds/envMap/snow_positive_y.jpg")] + private var EnvPosY : Class; + [Embed(source="../embeds/envMap/snow_positive_z.jpg")] + private var EnvPosZ : Class; + [Embed(source="../embeds/envMap/snow_negative_x.jpg")] + private var EnvNegX : Class; + [Embed(source="../embeds/envMap/snow_negative_y.jpg")] + private var EnvNegY : Class; + [Embed(source="../embeds/envMap/snow_negative_z.jpg")] + private var EnvNegZ : Class; [Embed(source="../embeds/Heightmap.jpg")] private var HeightMap : Class; @@ -69,19 +58,19 @@ [Embed(source="../embeds/rock.jpg")] private var Rock : Class; - [Embed(source="../embeds/terrainRockBlend.jpg")] - private var RockBlend : Class; + [Embed(source="../embeds/terrainRockBlend.jpg")] + private var RockBlend : Class; [Embed(source="../embeds/beach.jpg")] private var Beach : Class; - [Embed(source="../embeds/terrainBeachBlend.jpg")] - private var BeachBlend : Class; + [Embed(source="../embeds/terrainBeachBlend.jpg")] + private var BeachBlend : Class; private var _camController : FlightController; - private var _terrain : Elevation; - private var _cubeMap : CubeMap; + private var _terrain : Elevation; + private var _cubeMap : CubeMap; private var _stickToFloor : Boolean = true; private var _motionBlur : MotionBlurFilter3D; @@ -91,32 +80,32 @@ public function SimpleTerrainTest() { - var material : BitmapMaterial; - var terrainMethod : TerrainDiffuseMethod; - var fog : FogMethod; + var material : BitmapMaterial; + var terrainMethod : TerrainDiffuseMethod; + var fog : FogMethod; super(); _view = new View3D(); _motionBlur = new MotionBlurFilter3D(); - _view.filters3d = [ new BloomFilter3D(20, 20, .75, 1, 3) ]; + _view.filters3d = [ new BloomFilter3D(40, 40, .75, 1, 3) ]; // _view.filters3d = [ new DepthOfFieldFilter3D(10, 10) ]; - _view.antiAlias = 4; - _view.camera.lens.far = 14000; - _view.camera.lens.near = .1; + _view.antiAlias = 4; + _view.camera.lens.far = 14000; + _view.camera.lens.near = .1; // _view.camera.y = 500; _camController = new FlightController(_view.camera, stage); _camController.moveSpeed = 1; - _cubeMap = new CubeMap( new EnvPosX().bitmapData, new EnvNegX().bitmapData, - new EnvPosY().bitmapData, new EnvNegY().bitmapData, - new EnvPosZ().bitmapData, new EnvNegZ().bitmapData); + _cubeMap = new CubeMap(new EnvPosX().bitmapData, new EnvNegX().bitmapData, + new EnvPosY().bitmapData, new EnvNegY().bitmapData, + new EnvPosZ().bitmapData, new EnvNegZ().bitmapData); - _view.scene.addChild(new SkyBox(_cubeMap)); + _view.scene.addChild(new SkyBox(_cubeMap)); addChild(_view); addEventListener(Event.ENTER_FRAME, _handleEnterFrame); - - terrainMethod = new TerrainDiffuseMethod(); + + terrainMethod = new TerrainDiffuseMethod(); terrainMethod.setSplattingLayer(0, new Grass().bitmapData, new GrassBlend().bitmapData, 150); terrainMethod.setSplattingLayer(1, new Rock().bitmapData, new RockBlend().bitmapData, 100); terrainMethod.setSplattingLayer(2, new Beach().bitmapData, new BeachBlend().bitmapData, 50); @@ -124,42 +113,43 @@ material = new BitmapMaterial(new Albedo().bitmapData); material.diffuseMethod = terrainMethod; - material.normalMap = new Normals().bitmapData; - material.ambientColor = 0x202030; - material.specular = .2; + material.normalMap = new Normals().bitmapData; + material.ambientColor = 0x202030; + material.ambient = 1; + material.specular = .2; + + fog = new FogMethod(4000, 0xcfd9de); + material.addMethod(fog); - fog = new FogMethod(4000, 0xcfd9de); - material.addMethod(fog); - // mountain like - _terrain = new Elevation(material, new HeightMap().bitmapData, 5000, 1300, 5000, 175, 175); - + _terrain = new Elevation(material, new HeightMap().bitmapData, 5000, 1300, 5000, 175, 175); + // canyon like //_terrain = new Elevation(material, new HeightMap().bitmapData, 5000, 1300, 5000, 175, 175, 100); // if your map has noise, the class generates a smoother map to prevent choppy camera movements when using _terrain.getHeightAt //_terrain = new Elevation(material, new HeightMap().bitmapData, 5000, 1300, 5000, 175, 175, 255, 0, true); //you can access the map after generation via _terrain.smoothedHeightMap; - - _view.scene.addChild(_terrain); - _light = new DirectionalLight(-300, -300, -5000); - _light.color = 0xfffdc5; - material.lights = [_light]; - _view.scene.addChild(_light); + _view.scene.addChild(_terrain); + _light = new DirectionalLight(-300, -300, -5000); + _light.color = 0xfffdc5; + material.lights = [_light]; + + _view.scene.addChild(_light); stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; stage.addEventListener(Event.RESIZE, onStageResize); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); - addChild(new AwayStats(_view)); - } + addChild(new AwayStats(_view)); + } private function onKeyUp(event : KeyboardEvent) : void { if (event.keyCode == Keyboard.SPACE) _stickToFloor = !_stickToFloor; - _camController.moveSpeed = _stickToFloor? 1 : 5; + _camController.moveSpeed = _stickToFloor ? 1 : 5; } private function onStageResize(event : Event) : void @@ -167,21 +157,21 @@ _view.width = stage.stageWidth; _view.height = stage.stageHeight; } - - + + private function _handleEnterFrame(ev : Event) : void { var mx : Number = mouseX, my : Number = mouseY; var dx : Number = mx - _prevX, dy : Number = my - _prevY; - var dist : Number = .4 + (dx*dx + dy*dy) / 300; + var dist : Number = .4 + (dx * dx + dy * dy) / 300; if (dist > .9) dist = .9; - _strength += (dist-_strength)*.05; + _strength += (dist - _strength) * .05; // _motionBlur.strength = _strength; _prevX = mx; _prevY = my; var h : Number = _terrain.getHeightAt(_view.camera.x, _view.camera.z) + 10; - if (_stickToFloor || h > _view.camera.y) _view.camera.y += (h - _view.camera.y)*.05; + if (_stickToFloor || h > _view.camera.y) _view.camera.y += (h - _view.camera.y) * .05; _view.render(); } } diff --git a/src/SoftShadowTest.as b/src/SoftShadowTest.as index ba0084e..130d7e3 100644 --- a/src/SoftShadowTest.as +++ b/src/SoftShadowTest.as @@ -4,6 +4,7 @@ package { import away3d.debug.AwayStats; import away3d.lights.DirectionalLight; import away3d.materials.ColorMaterial; + import away3d.materials.methods.FilteredShadowMapMethod; import away3d.materials.methods.SlowFilteredShadowMapMethod; import away3d.materials.methods.SoftShadowMapMethod; import away3d.primitives.Plane; @@ -76,8 +77,9 @@ package { //Material ambientColor affect the contrast of the shadow planeMaterial.ambientColor = 0xCCCCCC; + planeMaterial.ambient = 1; //SoftShadowMapMethod step size is to change the neighbour filtering - planeMaterial.shadowMethod = new SlowFilteredShadowMapMethod(light);//new SoftShadowMapMethod(light); + planeMaterial.shadowMethod = new FilteredShadowMapMethod(light);//new SoftShadowMapMethod(light); var plane : Plane = new Plane(planeMaterial, 2000, 2000, 1, 1, false); plane.castsShadows=true; @@ -87,6 +89,7 @@ package { material.shadowMethod = new SoftShadowMapMethod(light); material.lights = [light]; material.ambientColor = 0xCCCCCC; + material.ambient = 1; var sphere:Sphere=new Sphere(material,50); sphere.y=50; sphere.castsShadows=true; @@ -96,6 +99,7 @@ package { material2.shadowMethod = new SoftShadowMapMethod(light); material2.lights = [light]; material2.ambientColor = 0xCCCCCC; + material2.ambient = 1; var sphere2:Sphere=new Sphere(material2,150); sphere2.y=250; sphere2.x=250; diff --git a/src/TransformBitmapTest.as b/src/TransformBitmapTest.as index cfdeb4a..79f4ab6 100644 --- a/src/TransformBitmapTest.as +++ b/src/TransformBitmapTest.as @@ -38,6 +38,7 @@ package _material.repeat = true; _material.normalMap = new Normals().bitmapData; _material.ambientColor = 0x080820; + _material.ambient = 1; _mesh = new Sphere(_material, 400); _view.scene.addChild(_mesh); _mesh.rotationY = .01; diff --git a/src/TraverserTest.as b/src/TraverserTest.as index 40b2f73..cef80de 100644 --- a/src/TraverserTest.as +++ b/src/TraverserTest.as @@ -117,6 +117,7 @@ package _material2 = new ColorMaterial(0xffffff); _material2.normalMap = new NormalMapAsset().bitmapData; _material2.ambientColor = 0x111122; + _material2.ambient = 1; // ColorMaterial(_material2).alpha = .5; _material2.gloss = 250; _material1 = new BitmapMaterial(new TextureAsset().bitmapData); diff --git a/src/UVAnimationTest.as b/src/UVAnimationTest.as index 07badcd..49036c3 100644 --- a/src/UVAnimationTest.as +++ b/src/UVAnimationTest.as @@ -79,7 +79,7 @@ package clip.arcane::addFrame(new UVAnimationFrame(Math.random()*0.3-0.15, Math.random()*0.3-0.15), 200); } - _animator = new UVAnimator(_mat); + _animator = new UVAnimator(_eyes.subMeshes[0]); _animator.addSequence(clip); _animator.play('test'); diff --git a/src/UnprojectTest.as b/src/UnprojectTest.as index a870c0d..afe3895 100644 --- a/src/UnprojectTest.as +++ b/src/UnprojectTest.as @@ -50,6 +50,7 @@ package var material : BitmapMaterial = new BitmapMaterial(new Albedo().bitmapData); // material.normalMap = new Normals().bitmapData; material.ambientColor = 0x080820; + material.ambient = 1; // material.specularMethod = null; material.normalMap; diff --git a/src/WaterTest.as b/src/WaterTest.as new file mode 100644 index 0000000..774d246 --- /dev/null +++ b/src/WaterTest.as @@ -0,0 +1,170 @@ +package +{ + import away3d.containers.View3D; + import away3d.debug.AwayStats; + import away3d.lights.PointLight; + import away3d.materials.BitmapMaterial; + import away3d.materials.methods.EnvMapMethod; + import away3d.materials.methods.FogMethod; + import away3d.materials.methods.FresnelEnvMapMethod; + import away3d.materials.methods.FresnelSpecularMethod; + import away3d.materials.methods.SimpleWaterNormalMethod; + import away3d.materials.utils.CubeMap; + import away3d.primitives.Plane; + import away3d.primitives.SkyBox; + + import flash.display.BitmapData; + + import flash.display.Sprite; + import flash.display.StageAlign; + import flash.display.StageScaleMode; + import flash.events.Event; + import flash.events.MouseEvent; + import flash.geom.Rectangle; + import flash.geom.Vector3D; + + [SWF(width="1024", height="576", frameRate="60")] + public class WaterTest extends Sprite + { + private var _view : View3D; + + private var _yellowLight : PointLight; + private var _blueLight : PointLight; + + [Embed(source="/../embeds/w_normalmap.jpg")] + private var WaterNormals1 : Class; + + + [Embed(source="/../embeds/envMap/sky_posX.jpg")] + private var EnvPosX : Class; + + [Embed(source="/../embeds/envMap/sky_posY.jpg")] + private var EnvPosY : Class; + + [Embed(source="/../embeds/envMap/sky_posZ.jpg")] + private var EnvPosZ : Class; + + [Embed(source="/../embeds/envMap/sky_negX.jpg")] + private var EnvNegX : Class; + + [Embed(source="/../embeds/envMap/sky_negY.jpg")] + private var EnvNegY : Class; + + [Embed(source="/../embeds/envMap/sky_negZ.jpg")] + private var EnvNegZ : Class; + + //signature variables + private var Signature:Sprite; + + //signature swf + [Embed(source="/../embeds/signature_david_head.swf", symbol="Signature")] + private var SignatureSwf:Class; + + private var _diffuseMap : CubeMap; + private var _envMap : CubeMap; + + private var _camController : HoverDragController; + private var _envMapMethod : FresnelEnvMapMethod; + private var _normalMethod : SimpleWaterNormalMethod; + private var _plane : Plane; + + public function WaterTest() + { + super(); + + _view = new View3D(); + _view.camera.x = -300; + _view.camera.z = 0; + _view.camera.lookAt(new Vector3D()); + + this.addChild(_view); + this.addEventListener(Event.ENTER_FRAME, _handleEnterFrame); + + Signature = Sprite(new SignatureSwf()); + Signature.y = stage.stageHeight - Signature.height; + + addChild(Signature); + + _envMap = new CubeMap( new EnvPosX().bitmapData, new EnvNegX().bitmapData, + new EnvPosY().bitmapData, new EnvNegY().bitmapData, + new EnvPosZ().bitmapData, new EnvNegZ().bitmapData); + + _yellowLight = new PointLight(); + _yellowLight.color = 0xd2cfb9; + _yellowLight.x = -450; + _yellowLight.y = 100; + _yellowLight.z = 1000; + _blueLight = new PointLight(); + _blueLight.color = 0x266fc8; + _blueLight.x = 800; + _blueLight.z = 800; + _blueLight.y = 100; + + _camController = new HoverDragController(_view.camera, stage); + _view.camera.lens.far = 15000; + addChild(new AwayStats(_view)); + + _plane = new Plane(null, 15000, 15000, 1, 1, false); + _plane.geometry.subGeometries[0].scaleUV(5); + _view.scene.addChild(_plane); + _view.scene.addChild(_yellowLight); + _view.scene.addChild(_blueLight); + _view.scene.addChild(new SkyBox(_envMap)); + initMaterial(); + stage.scaleMode = StageScaleMode.NO_SCALE; + stage.align = StageAlign.TOP_LEFT; + stage.addEventListener(Event.RESIZE, onStageResize); + } + + private function stopEvent(event : MouseEvent) : void + { + event.stopImmediatePropagation(); + } + + private function onSliderChange(event : Event) : void + { + _envMapMethod.alpha = event.target.value; + } + + private function onStageResize(event : Event) : void + { + _view.width = stage.stageWidth; + _view.height = stage.stageHeight; + + Signature.y = stage.stageHeight - Signature.height; + } + + private function initMaterial() : void + { + var material : BitmapMaterial = new BitmapMaterial(new BitmapData(512, 512, true, 0xaa404070)); + material.alphaBlending = true; + material.lights = [ _blueLight, _yellowLight ]; + material.repeat = true; + material.normalMethod = _normalMethod = new SimpleWaterNormalMethod(new WaterNormals1().bitmapData, new WaterNormals1().bitmapData); + _envMapMethod = new FresnelEnvMapMethod(_envMap); + material.addMethod(new EnvMapMethod(_envMap)); + _envMapMethod.normalReflectance = .2; + material.specularMethod = new FresnelSpecularMethod(); + FresnelSpecularMethod(material.specularMethod).normalReflectance = .3; + material.gloss = 100; + material.specular = 1; + + _plane.material = material; + } + + + private function _handleEnterFrame(ev : Event) : void + { + //_ctr.rotationX = 20 * Math.sin(getTimer() * 0.002); + if (_normalMethod) { + _normalMethod.water1OffsetX += .001; + _normalMethod.water1OffsetY += .001; + _normalMethod.water2OffsetX += .0007; + _normalMethod.water2OffsetY += .0006; + } +// if (stage.stage3Ds[0].context3D) +// stage.stage3Ds[0].context3D.setScissorRectangle(new Rectangle(0, 0, 50, 50)); + _view.render(); + } + } +} \ No newline at end of file diff --git a/src/com/li/away3d/camera/MKSOCameraController.as b/src/com/li/away3d/camera/MKSOCameraController.as index 90fafab..ced4c7a 100644 --- a/src/com/li/away3d/camera/MKSOCameraController.as +++ b/src/com/li/away3d/camera/MKSOCameraController.as @@ -7,10 +7,6 @@ */ package com.li.away3d.camera { -import away3d.cameras.Camera3D; - -import com.li.away3d.camera.*; - import com.li.general.keyboard.KeyManager; import flash.display.Sprite; @@ -31,13 +27,13 @@ public class MKSOCameraController extends Sprite private var _dy:Number; private var _keyManager:KeyManager; - public var mouseEasing:Number = 0.005; - public var keyboardAngularSpeed:Number = 0.1; - public var keyboardLinearSpeed:Number = 10; + public var mouseEasing:Number = 0.01; + public var keyboardAngularSpeed:Number = 0.05; + public var keyboardLinearSpeed:Number = 50; public var showInteractionArea:Boolean = false; public var mouseInteractionEnabled:Boolean = true; - public function MKSOCameraController(camera:Camera3D) + public function MKSOCameraController(camera:*) { super(); _sOCameraController = new SOCameraController(camera); @@ -51,7 +47,7 @@ public class MKSOCameraController extends Sprite _keyManager = KeyManager.getInstance(stage); - addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); + stage.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler); stage.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler); stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseMoveHandler); @@ -89,9 +85,9 @@ public class MKSOCameraController extends Sprite if(_keyManager.keyIsDown(KeyManager.KEY_DOWN) || _keyManager.keyIsDown(KeyManager.KEY_S)) _sOCameraController.elevation += keyboardAngularSpeed; if(_keyManager.keyIsDown(KeyManager.KEY_Z)) - _sOCameraController.radius += keyboardLinearSpeed; - if(_keyManager.keyIsDown(KeyManager.KEY_X)) _sOCameraController.radius -= keyboardLinearSpeed; + if(_keyManager.keyIsDown(KeyManager.KEY_X)) + _sOCameraController.radius += keyboardLinearSpeed; } private function updateMouseInput():void diff --git a/src/com/li/away3d/camera/OCameraController.as b/src/com/li/away3d/camera/OCameraController.as index e299430..a837adf 100644 --- a/src/com/li/away3d/camera/OCameraController.as +++ b/src/com/li/away3d/camera/OCameraController.as @@ -7,8 +7,6 @@ */ package com.li.away3d.camera { -import away3d.cameras.Camera3D; - import flash.geom.Vector3D; /* @@ -21,7 +19,7 @@ public class OCameraController private const TWOPI:Number = 2*PI; private const HALFPI:Number = PI/2; - private var _camera:Camera3D; + private var _camera:*; private var _center:Vector3D; private var _cartesianCoordinates:Vector3D; @@ -36,7 +34,7 @@ public class OCameraController public var useAzimuthLimit:Boolean = false; - public function OCameraController(camera:Camera3D) + public function OCameraController(camera:*) { _camera = camera; _center = new Vector3D(); diff --git a/src/com/li/away3d/camera/SOCameraController.as b/src/com/li/away3d/camera/SOCameraController.as index 13fb32c..c13e63b 100644 --- a/src/com/li/away3d/camera/SOCameraController.as +++ b/src/com/li/away3d/camera/SOCameraController.as @@ -7,10 +7,6 @@ */ package com.li.away3d.camera { -import away3d.cameras.Camera3D; - -import com.li.away3d.camera.*; - import flash.geom.Vector3D; /* @@ -29,7 +25,7 @@ public class SOCameraController public var orbitEasing:Number = 0.2; public var centerEasing:Number = 0.2; - public function SOCameraController(camera:Camera3D) + public function SOCameraController(camera:*) { _orbitCameraController = new OCameraController(camera); _targetSphericalCoordinates = _orbitCameraController.sphericalCoordinates.clone(); @@ -101,6 +97,8 @@ public class SOCameraController else _targetSphericalCoordinates.x = value; + reinforceElevation(); + _sphericalDirty = true; update(); } @@ -121,10 +119,22 @@ public class SOCameraController return _targetSphericalCoordinates.y; } + private function reinforceElevation():void + { + if(_orbitCameraController.elevation > _orbitCameraController.maxElevation) + { + elevation = _orbitCameraController.maxElevation; + _orbitCameraController.elevation = elevation; + } + } + // Radius. public function set radius(value:Number):void { _targetSphericalCoordinates.z = containValue(value, _orbitCameraController.minRadius, _orbitCameraController.maxRadius); + + reinforceElevation(); + _sphericalDirty = true; update(); } diff --git a/src/com/li/away3d/primitives/Foliage.as b/src/com/li/away3d/primitives/Foliage.as new file mode 100644 index 0000000..3390368 --- /dev/null +++ b/src/com/li/away3d/primitives/Foliage.as @@ -0,0 +1,137 @@ +package com.li.away3d.primitives +{ +import away3d.core.base.SubGeometry; +import away3d.materials.MaterialBase; +import away3d.primitives.PrimitiveBase; + +import flash.geom.Vector3D; + +public class Foliage extends PrimitiveBase +{ + private var _rawVertices:Vector.; + private var _rawNormals:Vector.; + private var _rawIndices:Vector.; + private var _rawUvs:Vector.; + private var _rawTangents:Vector.; + + private var _off:uint; + private var _leafSize:Number; + private var _radius:Number; + private var _leafCount:uint; + private var _positions:Vector.; + + private var _pi:Number = Math.PI; + + public function Foliage(material:MaterialBase, positions:Vector., leafCount:uint, leafSize:Number, radius:Number) + { + super(material); + _leafCount = leafCount; + _leafSize = leafSize; + _radius = radius; + _positions = positions; + } + + override protected function buildGeometry(target:SubGeometry):void + { + // Init raw buffers. + _rawVertices = new Vector.(); + _rawNormals = new Vector.(); + _rawIndices = new Vector.(); + _rawUvs = new Vector.(); + _rawTangents = new Vector.(); + + // Create clusters. + var i:uint, j:uint, index:uint; + var loop:uint = _positions.length/3; + var subloop:uint = _leafCount; + var posx:Number, posy:Number, posz:Number; + for(i = 0; i < loop; ++i) + { + index = 3*i; + posx = _positions[index]; + posy = _positions[index + 1]; + posz = _positions[index + 2]; + for(j = 0; j < subloop; ++j) + { + var leafPoint:Vector3D = sphericalToCartesian(new Vector3D(_pi*Math.random(), _pi*Math.random(), _radius)); + leafPoint.x += posx; + leafPoint.y += posy; + leafPoint.z += posz; + createRandomDoubleSidedTriangleAt(leafPoint, _leafSize); + } + } + + // Report geom data. + target.updateVertexData(_rawVertices); + target.updateVertexNormalData(_rawNormals); + target.updateIndexData(_rawIndices); + target.updateVertexTangentData(_rawTangents); + } + + private function createRandomDoubleSidedTriangleAt(p0:Vector3D, radius:Number):void + { + // Calculate vertices. +// var p1:Vector3D = sphericalToCartesian(new Vector3D(2*_pi*Math.random(), 2*_pi*Math.random(), radius)); +// var p2:Vector3D = sphericalToCartesian(new Vector3D(2*_pi*Math.random(), 2*_pi*Math.random(), radius)); + var p1:Vector3D = new Vector3D(rand(-radius, radius), rand(-radius, radius), rand(-radius, radius)); + var p2:Vector3D = new Vector3D(rand(-radius, radius), rand(-radius, radius), rand(-radius, radius)); + var norm:Vector3D = p1.crossProduct(p2); + norm.normalize(); + + // Set vertices. + p1 = p0.add(p1); + p2 = p0.add(p2); + _rawVertices.push(p0.x, p0.y, p0.z); + _rawVertices.push(p1.x, p1.y, p1.z); + _rawVertices.push(p2.x, p2.y, p2.z); + _rawVertices.push(p0.x, p0.y, p0.z); + _rawVertices.push(p1.x, p1.y, p1.z); + _rawVertices.push(p2.x, p2.y, p2.z); + + // Set indices. + _rawIndices.push(_off, _off + 1, _off + 2); + _rawIndices.push(_off + 5, _off + 4, _off + 3); + _off += 6; + + // Set normals. + _rawNormals.push(norm.x, norm.y, norm.z); + _rawNormals.push(norm.x, norm.y, norm.z); + _rawNormals.push(norm.x, norm.y, norm.z); + norm.negate(); + _rawNormals.push(norm.x, norm.y, norm.z); + _rawNormals.push(norm.x, norm.y, norm.z); + _rawNormals.push(norm.x, norm.y, norm.z); + + // Set Tangents. + _rawTangents.push(0, 0, 0); + _rawTangents.push(0, 0, 0); + _rawTangents.push(0, 0, 0); + _rawTangents.push(0, 0, 0); + _rawTangents.push(0, 0, 0); + _rawTangents.push(0, 0, 0); + + // Set UVs. + _rawUvs.push(0, 0, 1, 0, 1, 1); + _rawUvs.push(0, 0, 1, 0, 1, 1); + } + + private function sphericalToCartesian(sphericalCoords:Vector3D):Vector3D + { + var cartesianCoords:Vector3D = new Vector3D(); + cartesianCoords.x = sphericalCoords.z*Math.sin(sphericalCoords.x)*Math.sin(sphericalCoords.y); + cartesianCoords.y = sphericalCoords.z*Math.cos(sphericalCoords.y); + cartesianCoords.z = sphericalCoords.z*Math.cos(sphericalCoords.x)*Math.sin(sphericalCoords.y); + return cartesianCoords; + } + + override protected function buildUVs(target:SubGeometry):void + { + target.updateUVData(_rawUvs); + } + + private function rand(min:Number, max:Number):Number + { + return (max - min)*Math.random() + min; + } +} +} diff --git a/src/com/li/away3d/primitives/FractalTree.as b/src/com/li/away3d/primitives/FractalTree.as new file mode 100644 index 0000000..cf36650 --- /dev/null +++ b/src/com/li/away3d/primitives/FractalTree.as @@ -0,0 +1,262 @@ +package com.li.away3d.primitives +{ +import away3d.core.base.SubGeometry; +import away3d.materials.MaterialBase; +import away3d.primitives.PrimitiveBase; + +import flash.geom.Matrix3D; +import flash.geom.Point; +import flash.geom.Vector3D; +import flash.geom.Vector3D; + +public class FractalTree extends PrimitiveBase +{ + private var _rawVertices:Vector.; + private var _rawNormals:Vector.; + private var _rawIndices:Vector.; + private var _rawUvs:Vector.; + private var _rawTangents:Vector.; + private var _size:Number; + private var _off:uint; + private var _level:uint; + private var _v0:Vector3D, _v1:Vector3D, _v2:Vector3D, _v3:Vector3D; + private var _d0:Vector3D, _d1:Vector3D; + private var _mid:Vector3D, _boxNorm:Vector3D, _triNorm:Vector3D; + private var _sideLength:Number; + private var _firstBaseToHeightFactor:Number; + private var _baseToHeightFactor:Number; + private var _baseToTriangleHeightFactorRange:Point; + private var _triangleOffsetFactorRange:Point; + private var _leafPositions:Vector.; + private var _built:Boolean; + + public function FractalTree(material:MaterialBase, width:Number, height:Number, stretching:Number, + minAperture:Number, maxAperture:Number, + minTwist:Number, maxTwist:Number, + level:uint) + { + super(material); + + _size = width; + _level = level; + + _firstBaseToHeightFactor = height; + _baseToHeightFactor = stretching; + _baseToTriangleHeightFactorRange = new Point(minAperture, maxAperture); + _triangleOffsetFactorRange = new Point(minTwist, maxTwist); + + _v0 = new Vector3D(); + _v1 = new Vector3D(); + _v2 = new Vector3D(); + _v3 = new Vector3D(); + _d0 = new Vector3D(); + _d1 = new Vector3D(); + _boxNorm = new Vector3D(); + + _leafPositions = new Vector.(); + + buildGeometry(_geometry.subGeometries[0]); + } + + override protected function buildGeometry(target:SubGeometry):void + { + if(_built) + return; + + _built = true; + + // Init raw buffers. + _rawVertices = new Vector.(); + _rawNormals = new Vector.(); + _rawIndices = new Vector.(); + _rawUvs = new Vector.(); + _rawTangents = new Vector.(); + + // Start recursive method. + buildOpenBox(Vector.([-_size/2, 0, -_size/2, + _size/2, 0, -_size/2, + _size/2, 0, _size/2, + -_size/2, 0, _size/2]), _firstBaseToHeightFactor); + step(1); + + // Report geom data. + target.updateVertexData(_rawVertices); + target.updateVertexNormalData(_rawNormals); + target.updateIndexData(_rawIndices); + target.updateVertexTangentData(_rawTangents); + } + + private function step(level:uint):void + { + var last:Vector. = _rawVertices.slice(_rawVertices.length - 18); + var right:Vector. = Vector.([last[3], last[4], last[5], + last[6], last[7], last[8], + last[9], last[10], last[11], + last[12], last[13], last[14]]); + var left:Vector. = Vector.([last[0], last[1], last[2], + last[3], last[4], last[5], + last[12], last[13], last[14], + last[15], last[16], last[17]]) + + if(level > _level) + { + // Store the position of the leaves. + var leaf0:Vector3D = new Vector3D(right[3], right[4], right[5]); + var leaf1:Vector3D = new Vector3D(left[3], left[4], left[5]); + _leafPositions.push(leaf0.x, leaf0.y, leaf0.z, leaf1.x, leaf1.y, leaf1.z); + + return; + } + + buildOpenBox(right); + step(level + 1); + + buildOpenBox(left); + step(level + 1); + } + + // A box consists of a cube without top and bottom with + // 2 triangles instead at the top. + private function buildOpenBox(vertices:Vector., forceBaseToHeightFactor:Number = -1):void + { + // Pre-calculate values for vertices and normals. + _v0.x = vertices[0]; + _v0.y = vertices[1]; + _v0.z = vertices[2]; + _v1.x = vertices[3]; + _v1.y = vertices[4]; + _v1.z = vertices[5]; + _v2.x = vertices[6]; + _v2.y = vertices[7]; + _v2.z = vertices[8]; + _v3.x = vertices[9]; + _v3.y = vertices[10]; + _v3.z = vertices[11]; + _d0 = _v0.subtract(_v1); + _d1 = _v0.subtract(_v3); + _mid = _d1.clone(); + _mid.scaleBy(-rand(_triangleOffsetFactorRange.x, _triangleOffsetFactorRange.y)); + _boxNorm = _d1.crossProduct(_d0); + _boxNorm.normalize(); + _triNorm = _boxNorm.clone(); + _sideLength = _d0.length; + _boxNorm.scaleBy((forceBaseToHeightFactor > 0 ? forceBaseToHeightFactor : _baseToHeightFactor)*_sideLength); + _triNorm.scaleBy(rand(_baseToTriangleHeightFactorRange.x, _baseToTriangleHeightFactorRange.y)*_sideLength); + + // Set vertices. + for(var i:uint; i < 2; i++) + { + _rawVertices.push(_v0.x, _v0.y, _v0.z); // flb (front left bottom) + _rawVertices.push(_v1.x, _v1.y, _v1.z); // frb + _rawVertices.push(_v2.x, _v2.y, _v2.z); // brb + _rawVertices.push(_v3.x, _v3.y, _v3.z); // blb + _rawVertices.push(_v0.x + _boxNorm.x, _v0.y + _boxNorm.y, _v0.z + _boxNorm.z); // flt + _rawVertices.push(_v1.x + _boxNorm.x, _v1.y + _boxNorm.y, _v1.z + _boxNorm.z); // frt + _rawVertices.push(_v2.x + _boxNorm.x, _v2.y + _boxNorm.y, _v2.z + _boxNorm.z); // brt + _rawVertices.push(_v3.x + _boxNorm.x, _v3.y + _boxNorm.y, _v3.z + _boxNorm.z); // blt + } + _rawVertices.push(_v1.x + _boxNorm.x, _v1.y + _boxNorm.y, _v1.z + _boxNorm.z); // flt + _rawVertices.push(_v1.x + _boxNorm.x + _mid.x + _triNorm.x, _v1.y + _boxNorm.y + _mid.y + _triNorm.y, _v1.z + _boxNorm.z + _mid.z + _triNorm.z); // tri front + _rawVertices.push(_v2.x + _boxNorm.x, _v2.y + _boxNorm.y, _v2.z + _boxNorm.z); // frt + _rawVertices.push(_v3.x + _boxNorm.x, _v3.y + _boxNorm.y, _v3.z + _boxNorm.z); // brt + _rawVertices.push(_v0.x + _boxNorm.x + _mid.x + _triNorm.x, _v0.y + _boxNorm.y + _mid.y + _triNorm.y, _v0.z + _boxNorm.z + _mid.z + _triNorm.z); // tri back + _rawVertices.push(_v0.x + _boxNorm.x, _v0.y + _boxNorm.y, _v0.z + _boxNorm.z); // blt + + // Set indices. + var off0:uint = _off + 8; + _rawIndices.push(_off + 0, _off + 4, _off + 1, _off + 4, _off + 5, _off + 1); // Front. + _rawIndices.push(_off + 2, _off + 6, _off + 3, _off + 6, _off + 7, _off + 3); // Back. + _rawIndices.push(off0 + 1, off0 + 5, off0 + 2, off0 + 5, off0 + 6, off0 + 2); // Right. + _rawIndices.push(off0 + 3, off0 + 7, off0 + 0, off0 + 7, off0 + 4, off0 + 0); // Left. + _rawIndices.push(off0 + 8, off0 + 9, off0 + 10, off0 + 11, off0 + 12, off0 + 13); // Tris. + _off += 22; + + // Set uvs. + _rawUvs.push(0, 1, 1, 1, 0, 1, 1, 1); + _rawUvs.push(0, 0, 1, 0, 0, 0, 1, 0); + _rawUvs.push(0, 1, 1, 1, 0, 1, 1, 1); + _rawUvs.push(0, 0, 1, 0, 0, 0, 1, 0); + _rawUvs.push(0, 1, 0.5, 0.5, 1, 1); + _rawUvs.push(0, 1, 0.5, 0.5, 1, 1); + + // Set normals. + var normFront:Vector3D = _d1.clone(); + normFront.normalize(); + var normBack:Vector3D = normFront.clone(); + normBack.negate(); + var normLeft:Vector3D = _d0.clone(); + normLeft.normalize(); + var normRight:Vector3D = normLeft.clone(); + normRight.negate(); + _rawNormals.push(normFront.x, normFront.y, normFront.z, + normFront.x, normFront.y, normFront.z, + normBack.x, normBack.y, normBack.z, + normBack.x, normBack.y, normBack.z); + _rawNormals.push(normFront.x, normFront.y, normFront.z, + normFront.x, normFront.y, normFront.z, + normBack.x, normBack.y, normBack.z, + normBack.x, normBack.y, normBack.z); + _rawNormals.push(normLeft.x, normLeft.y, normLeft.z, + normRight.x, normRight.y, normRight.z, + normRight.x, normRight.y, normRight.z, + normLeft.x, normLeft.y, normLeft.z); + _rawNormals.push(normLeft.x, normLeft.y, normLeft.z, + normRight.x, normRight.y, normRight.z, + normRight.x, normRight.y, normRight.z, + normLeft.x, normLeft.y, normLeft.z); + _rawNormals.push(normRight.x, normRight.y, normRight.z, + normRight.x, normRight.y, normRight.z, + normRight.x, normRight.y, normRight.z, + normLeft.x, normLeft.y, normLeft.z, + normLeft.x, normLeft.y, normLeft.z, + normLeft.x, normLeft.y, normLeft.z); + + // Set tangents. +// var rotate:Matrix3D = new Matrix3D(); +// var normTop:Vector3D = normRight.crossProduct(normFront); +// normTop.normalize(); +// rotate.appendRotation(45, normTop); +// normFront = rotate.transformVector(normFront); +// normBack = rotate.transformVector(normBack); +// normRight = rotate.transformVector(normRight); +// normLeft = rotate.transformVector(normLeft); + _rawTangents.push(normRight.x, normRight.y, normRight.z, + normRight.x, normRight.y, normRight.z, + normLeft.x, normLeft.y, normLeft.z, + normLeft.x, normLeft.y, normLeft.z); + _rawTangents.push(normRight.x, normRight.y, normRight.z, + normRight.x, normRight.y, normRight.z, + normLeft.x, normLeft.y, normLeft.z, + normLeft.x, normLeft.y, normLeft.z); + _rawTangents.push(normBack.x, normBack.y, normBack.z, + normFront.x, normFront.y, normFront.z, + normFront.x, normFront.y, normFront.z, + normBack.x, normBack.y, normBack.z); + _rawTangents.push(normBack.x, normBack.y, normBack.z, + normFront.x, normFront.y, normFront.z, + normFront.x, normFront.y, normFront.z, + normBack.x, normBack.y, normBack.z); + _rawTangents.push(normBack.x, normBack.y, normBack.z, + normBack.x, normBack.y, normBack.z, + normBack.x, normBack.y, normBack.z, + normFront.x, normFront.y, normFront.z, + normFront.x, normFront.y, normFront.z, + normFront.x, normFront.y, normFront.z); + } + + override protected function buildUVs(target:SubGeometry):void + { + target.updateUVData(_rawUvs); + } + + private function rand(min:Number, max:Number):Number + { + return (max - min)*Math.random() + min; + } + + public function get leafPositions():Vector. + { + return _leafPositions; + } +} +} diff --git a/src/com/li/away3d/primitives/FractalTreeRound.as b/src/com/li/away3d/primitives/FractalTreeRound.as new file mode 100644 index 0000000..d8dc6af --- /dev/null +++ b/src/com/li/away3d/primitives/FractalTreeRound.as @@ -0,0 +1,241 @@ +package com.li.away3d.primitives +{ +import away3d.core.base.SubGeometry; +import away3d.materials.MaterialBase; +import away3d.primitives.PrimitiveBase; + +import flash.geom.Matrix3D; +import flash.geom.Point; +import flash.geom.Vector3D; +import flash.geom.Vector3D; + +public class FractalTreeRound extends PrimitiveBase +{ + private var _rawVertices:Vector.; + private var _rawNormals:Vector.; + private var _rawIndices:Vector.; + private var _rawUvs:Vector.; + private var _rawTangents:Vector.; + private var _size:Number; + private var _off:uint; + private var _level:uint; + private var _v0:Vector3D, _v1:Vector3D, _v2:Vector3D, _v3:Vector3D; + private var _d0:Vector3D, _d1:Vector3D; + private var _mid:Vector3D, _boxNorm:Vector3D, _triNorm:Vector3D; + private var _sideLength:Number; + private var _firstBaseToHeightFactor:Number; + private var _baseToHeightFactor:Number; + private var _baseToTriangleHeightFactorRange:Point; + private var _triangleOffsetFactorRange:Point; + private var _leafPositions:Vector.; + private var _built:Boolean; + + public function FractalTreeRound(material:MaterialBase, width:Number, height:Number, stretching:Number, + minAperture:Number, maxAperture:Number, + minTwist:Number, maxTwist:Number, + level:uint) + { + super(material); + + _size = width; + _level = level; + + _firstBaseToHeightFactor = height; + _baseToHeightFactor = stretching; + _baseToTriangleHeightFactorRange = new Point(minAperture, maxAperture); + _triangleOffsetFactorRange = new Point(minTwist, maxTwist); + + _v0 = new Vector3D(); + _v1 = new Vector3D(); + _v2 = new Vector3D(); + _v3 = new Vector3D(); + _d0 = new Vector3D(); + _d1 = new Vector3D(); + _boxNorm = new Vector3D(); + + _leafPositions = new Vector.(); + + buildGeometry(_geometry.subGeometries[0]); + } + + override protected function buildGeometry(target:SubGeometry):void + { + if(_built) + return; + + _built = true; + + // Init raw buffers. + _rawVertices = new Vector.(); + _rawNormals = new Vector.(); + _rawIndices = new Vector.(); + _rawUvs = new Vector.(); + _rawTangents = new Vector.(); + + // Start recursive method. + buildOpenBox(Vector.([-_size/2, 0, -_size/2, + _size/2, 0, -_size/2, + _size/2, 0, _size/2, + -_size/2, 0, _size/2]), _firstBaseToHeightFactor); + step(1); + + // Report geom data. + target.updateVertexData(_rawVertices); + target.updateVertexNormalData(_rawNormals); + target.updateIndexData(_rawIndices); + target.updateVertexTangentData(_rawTangents); + } + + private function step(level:uint):void + { + // Obtain the last set of quads (make sure rotation occurs). + var last:Vector. = _rawVertices.slice(_rawVertices.length - 18); + var front:Vector. = Vector.([last[3], last[4], last[5], + last[12], last[13], last[14], + last[15], last[16], last[17], + last[0], last[1], last[2]]); + var back:Vector. = Vector.([last[12], last[13], last[14], + last[6], last[7], last[8], + last[9], last[10], last[11], + last[15], last[16], last[17]]); + + // If level reached, remember position and end process. + if(level > _level) + { + // Store the position of the leaves. + var leaf0:Vector3D = new Vector3D(front[0], front[1], front[2]); + var leaf1:Vector3D = new Vector3D(back[3], back[4], back[5]); + _leafPositions.push(leaf0.x, leaf0.y, leaf0.z, leaf1.x, leaf1.y, leaf1.z); + + return; + } + + // Recurse. + buildOpenBox(front); + step(level + 1); + buildOpenBox(back); + step(level + 1); + } + + // A box consists of a cube without top and bottom with + // 2 triangles instead at the top. + private function buildOpenBox(vertices:Vector., forceBaseToHeightFactor:Number = -1):void + { + // Pre-calculate values for vertices and normals. + _v0.x = vertices[0]; + _v0.y = vertices[1]; + _v0.z = vertices[2]; + _v1.x = vertices[3]; + _v1.y = vertices[4]; + _v1.z = vertices[5]; + _v2.x = vertices[6]; + _v2.y = vertices[7]; + _v2.z = vertices[8]; + _v3.x = vertices[9]; + _v3.y = vertices[10]; + _v3.z = vertices[11]; + _d0 = _v0.subtract(_v1); + _d1 = _v0.subtract(_v3); + _mid = _d1.clone(); + _mid.scaleBy(-rand(_triangleOffsetFactorRange.x, _triangleOffsetFactorRange.y)); + _boxNorm = _d1.crossProduct(_d0); + _boxNorm.normalize(); + _triNorm = _boxNorm.clone(); + _sideLength = _d0.length; + _boxNorm.scaleBy((forceBaseToHeightFactor > 0 ? forceBaseToHeightFactor : _baseToHeightFactor)*_sideLength); + _triNorm.scaleBy(rand(_baseToTriangleHeightFactorRange.x, _baseToTriangleHeightFactorRange.y)*_sideLength); + + // Set vertices. + _rawVertices.push(_v0.x, _v0.y, _v0.z); // flb (front left bottom) + _rawVertices.push(_v1.x, _v1.y, _v1.z); // frb + _rawVertices.push(_v2.x, _v2.y, _v2.z); // brb + _rawVertices.push(_v3.x, _v3.y, _v3.z); // blb + _rawVertices.push(_v0.x + _boxNorm.x, _v0.y + _boxNorm.y, _v0.z + _boxNorm.z); // flt + _rawVertices.push(_v1.x + _boxNorm.x, _v1.y + _boxNorm.y, _v1.z + _boxNorm.z); // frt + _rawVertices.push(_v2.x + _boxNorm.x, _v2.y + _boxNorm.y, _v2.z + _boxNorm.z); // brt + _rawVertices.push(_v3.x + _boxNorm.x, _v3.y + _boxNorm.y, _v3.z + _boxNorm.z); // blt + _rawVertices.push(_v1.x + _boxNorm.x + _mid.x + _triNorm.x, _v1.y + _boxNorm.y + _mid.y + _triNorm.y, _v1.z + _boxNorm.z + _mid.z + _triNorm.z); // tri front + _rawVertices.push(_v0.x + _boxNorm.x + _mid.x + _triNorm.x, _v0.y + _boxNorm.y + _mid.y + _triNorm.y, _v0.z + _boxNorm.z + _mid.z + _triNorm.z); // tri back + + // Set indices. + _rawIndices.push(_off + 0, _off + 4, _off + 1, _off + 4, _off + 5, _off + 1); // Front. + _rawIndices.push(_off + 2, _off + 6, _off + 3, _off + 6, _off + 7, _off + 3); // Back. + _rawIndices.push(_off + 1, _off + 5, _off + 2, _off + 5, _off + 6, _off + 2); // Right. + _rawIndices.push(_off + 3, _off + 7, _off + 0, _off + 7, _off + 4, _off + 0); // Left. + _rawIndices.push(_off + 5, _off + 8, _off + 6, _off + 7, _off + 9, _off + 4); // Tris. + _off += 10; + + // Set uvs. + _rawUvs.push(0, 1, 1, 1, 0, 1, 1, 1); // b + _rawUvs.push(0, 0, 1, 0, 0, 0, 1, 0); // t + _rawUvs.push(0.5, 0.5, 0.5, 0.5); // tris + + // Calculate radially outward pointing normals. + var norm0:Vector3D = _v0.subtract(_v2); + var norm1:Vector3D = _v1.subtract(_v3); + var norm2:Vector3D = _v2.subtract(_v0); + var norm3:Vector3D = _v3.subtract(_v1); + norm0.normalize(); + norm1.normalize(); + norm2.normalize(); + norm3.normalize(); + var normFront:Vector3D = _d1.clone(); + normFront.normalize(); + var normBack:Vector3D = normFront.clone(); + normBack.negate(); + var normLeft:Vector3D = _d0.clone(); + normLeft.normalize(); + var normRight:Vector3D = normLeft.clone(); + normRight.negate(); + + // Set normals. + _rawNormals.push(norm0.x, norm0.y, norm0.z, + norm1.x, norm1.y, norm1.z, + norm2.x, norm2.y, norm2.z, + norm3.x, norm3.y, norm3.z); + _rawNormals.push(norm0.x, norm0.y, norm0.z, + norm1.x, norm1.y, norm1.z, + norm2.x, norm2.y, norm2.z, + norm3.x, norm3.y, norm3.z); + _rawNormals.push(normRight.x, normRight.y, normRight.z, + normLeft.x, normLeft.y, normLeft.z); + + // Set tangents. + var rotate:Matrix3D = new Matrix3D(); + var normTop:Vector3D = normRight.crossProduct(normFront); + normTop.normalize(); + rotate.appendRotation(45, normTop); + norm0 = rotate.transformVector(norm0); + norm1 = rotate.transformVector(norm1); + norm2 = rotate.transformVector(norm2); + norm3 = rotate.transformVector(norm3); + normRight = rotate.transformVector(normRight); + normLeft = rotate.transformVector(normLeft); + _rawTangents.push(norm0.x, norm0.y, norm0.z, + norm1.x, norm1.y, norm1.z, + norm2.x, norm2.y, norm2.z, + norm3.x, norm3.y, norm3.z); + _rawTangents.push(norm0.x, norm0.y, norm0.z, + norm1.x, norm1.y, norm1.z, + norm2.x, norm2.y, norm2.z, + norm3.x, norm3.y, norm3.z); + _rawTangents.push(normRight.x, normRight.y, normRight.z, + normLeft.x, normLeft.y, normLeft.z); + } + + override protected function buildUVs(target:SubGeometry):void + { + target.updateUVData(_rawUvs); + } + + private function rand(min:Number, max:Number):Number + { + return (max - min)*Math.random() + min; + } + + public function get leafPositions():Vector. + { + return _leafPositions; + } +} +} diff --git a/src/com/li/away3d/primitives/ImageMap.as b/src/com/li/away3d/primitives/ImageMap.as new file mode 100644 index 0000000..62de7ce --- /dev/null +++ b/src/com/li/away3d/primitives/ImageMap.as @@ -0,0 +1,62 @@ +package com.li.away3d.primitives +{ +import away3d.core.base.SubGeometry; +import away3d.entities.Mesh; +import away3d.materials.MaterialBase; +import away3d.primitives.PrimitiveBase; + +import flash.display.BitmapData; + +/* + The idea of the class is to be able to reduce models to images and then + feed the image to this primitive, which would then reconstruct itself from the image + at chosen levels of resolution < original res. Such a thing could serve for LOD. + + PROBLEM: The image would only store vertices, but there would be no way of telling + how the vertices are arranged in the indices to produce triangles. + */ +public class ImageMap extends PrimitiveBase +{ + public function ImageMap(material:MaterialBase, image:BitmapData) + { + super(material); + } + + protected override function buildGeometry(target:SubGeometry):void + { + + } + + // Incoming mesh bb should be contained in 256x256x256. + public static function meshToImage(mesh:Mesh):BitmapData + { + var vertices:Vector. = mesh.geometry.subGeometries[0].vertexData; + + var w:Number = vertices.length/3; + + var bmd:BitmapData = new BitmapData(w, 1, false, 0xFFFFFF); + + var i:uint, index:uint; + var loop:uint = w; + var r:uint, g:uint, b:uint; + bmd.lock(); + for(i = 0; i < loop; ++i) + { + index = i*3; + r = vertices[index] + 127; + g = vertices[index + 1] + 127; + b = vertices[index + 2] + 127; + trace(r, g, b); + bmd.setPixel(i, 0, (r << 16) | (g << 8) | b) + } + bmd.unlock(); + + return bmd; + } + + override protected function buildUVs(target:SubGeometry):void + { + // Nothing... + } +} +} diff --git a/src/com/li/away3d/primitives/SimpleCube.as b/src/com/li/away3d/primitives/SimpleCube.as new file mode 100644 index 0000000..229aeb6 --- /dev/null +++ b/src/com/li/away3d/primitives/SimpleCube.as @@ -0,0 +1,73 @@ +package com.li.away3d.primitives +{ +import away3d.core.base.SubGeometry; +import away3d.materials.MaterialBase; +import away3d.primitives.PrimitiveBase; + +/* + A simple cube primitive with no subdivisions. + TODO: set tangents, docs, setters and getters, uv build, optimization. + */ +public class SimpleCube extends PrimitiveBase +{ + private var _width:Number; + private var _height:Number; + private var _depth:Number; + + public function SimpleCube(material:MaterialBase, width:Number, height:Number, depth:Number) + { + super(material); + + _width = width; + _height = height + _depth = depth; + } + + override protected function buildGeometry(target:SubGeometry):void + { + var halfW:Number = _width/2; + var halfH:Number = _height/2; + var halfD:Number = _depth/2; + + var rawVertices:Vector. = new Vector.(); + for(var i:uint; i < 3; i++) + { + rawVertices.push(-halfW, halfH, -halfD); // tlf + rawVertices.push(-halfW, -halfH, -halfD); // blf + rawVertices.push(halfW, -halfH, -halfD); // brf + rawVertices.push(halfW, halfH, -halfD); // trf + rawVertices.push(-halfW, halfH, halfD); // tlb + rawVertices.push(-halfW, -halfH, halfD); // blb + rawVertices.push(halfW, -halfH, halfD); // brb + rawVertices.push(halfW, halfH, halfD); // trb + } + + var rawIndices:Vector. = new Vector.(); + var off0:uint = 8; + var off1:uint = 16; + rawIndices.push(2, 1, 0, 3, 2, 0); // Front. + rawIndices.push(5, 6, 7, 4, 5, 7); // Back. + rawIndices.push(off0 + 6, off0 + 2, off0 + 3, off0 + 7, off0 + 6, off0 + 3); // Right. + rawIndices.push(off0 + 1, off0 + 5, off0 + 4, off0 + 0, off0 + 1, off0 + 4); // Left. + rawIndices.push(off1 + 3, off1 + 0, off1 + 4, off1 + 7, off1 + 3, off1 + 4); // Top. + rawIndices.push(off1 + 6, off1 + 5, off1 + 1, off1 + 2, off1 + 6, off1 + 1); // Bottom. + + var rawNormals:Vector. = new Vector.(); + rawNormals.push(0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1); + rawNormals.push(0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1); + rawNormals.push(-1, 0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0); + rawNormals.push(-1, 0, 0, -1, 0, 0, 1, 0, 0, 1, 0, 0); + rawNormals.push(0, 1, 0, 0, -1, 0, 0, -1, 0, 0, 1, 0); + rawNormals.push(0, 1, 0, 0, -1, 0, 0, -1, 0, 0, 1, 0); + + target.updateVertexData(rawVertices); + target.updateIndexData(rawIndices); + target.updateVertexNormalData(rawNormals); + } + + override protected function buildUVs(target:SubGeometry):void + { + // Pending. + } +} +} diff --git a/src/com/li/away3d/primitives/SimplePlane.as b/src/com/li/away3d/primitives/SimplePlane.as new file mode 100644 index 0000000..a2a7923 --- /dev/null +++ b/src/com/li/away3d/primitives/SimplePlane.as @@ -0,0 +1,51 @@ +package com.li.away3d.primitives +{ +import away3d.core.base.SubGeometry; +import away3d.materials.MaterialBase; +import away3d.primitives.PrimitiveBase; + +/* + A simple plane primitive with no subdivisions. + TODO: docs, setters and getters, uv build, optimization. + */ +public class SimplePlane extends PrimitiveBase +{ + private var _width:Number; + private var _height:Number; + + public function SimplePlane(material:MaterialBase = null, width:Number = 100, height:Number = 100) + { + super(material); + + _width = width; + _height = height; + } + + override protected function buildGeometry(target:SubGeometry):void + { + var halfW:Number = _width/2; + var halfH:Number = _height/2; + + var rawVertices:Vector. = new Vector.(); + rawVertices.push(-halfW, -halfH, 0); + rawVertices.push(halfW, -halfH, 0); + rawVertices.push(-halfW, halfH, 0); + rawVertices.push(halfW, halfH, 0); + + var rawIndices:Vector. = Vector.([0, 2, 1, 2, 3, 1]); + + var rawNormals:Vector. = Vector.([0, 0, -1, 0, 0, -1, 0, 0, -1, 0, 0, -1]); + var rawTangents:Vector. = Vector.([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]); + + target.updateVertexData(rawVertices); + target.updateIndexData(rawIndices); + target.updateVertexNormalData(rawNormals); + target.updateVertexTangentData(rawTangents); + } + + override protected function buildUVs(target:SubGeometry):void + { + // Pending. + } +} +} diff --git a/src/com/li/away3d/primitives/Triangle.as b/src/com/li/away3d/primitives/Triangle.as new file mode 100644 index 0000000..4df20bf --- /dev/null +++ b/src/com/li/away3d/primitives/Triangle.as @@ -0,0 +1,61 @@ +package com.li.away3d.primitives +{ +import away3d.core.base.SubGeometry; +import away3d.materials.MaterialBase; +import away3d.primitives.PrimitiveBase; + +import flash.geom.Vector3D; + +/* + A simple triangle primitive. + TODO: Add doc, setters and getters, check uv build, optimize. + */ +public class Triangle extends PrimitiveBase +{ + private var _v0:Vector3D; + private var _v1:Vector3D; + private var _v2:Vector3D; + private var _uv0:Vector3D; + private var _uv1:Vector3D; + private var _uv2:Vector3D; + + // Define vertices in a clockwise manner. + public function Triangle(material:MaterialBase, v0:Vector3D, v1:Vector3D, v2:Vector3D, + uv0:Vector3D = null, uv1:Vector3D = null, uv2:Vector3D = null) + { + super(material); + + _v0 = v0; + _v1 = v1; + _v2 = v2; + _uv0 = uv0; + _uv1 = uv1; + _uv2 = uv2; + } + + override protected function buildGeometry(target:SubGeometry):void + { + var rawVertices:Vector. = Vector.([_v0.x, _v0.y, _v0.z, _v1.x, _v1.y, _v1.z, _v2.x, _v2.y, _v2.z]); + var rawIndices:Vector. = Vector.([0, 1, 2]); + + var d0:Vector3D = _v1.subtract(_v0); + var d1:Vector3D = _v2.subtract(_v0); + var rawTangents:Vector. = Vector.([0, 0, 0]); + + var normal:Vector3D = d0.crossProduct(d1); + normal.normalize(); + var rawNormals:Vector. = Vector.([normal.x, normal.y, normal.z, normal.x, normal.y, normal.z, normal.x, normal.y, normal.z]); + + target.updateVertexData(rawVertices); + target.updateIndexData(rawIndices); + target.updateVertexNormalData(rawNormals); + target.updateVertexTangentData(rawTangents); + } + + override protected function buildUVs(target:SubGeometry):void + { + if(_uv0 && _uv1 && _uv2) + var rawUvData:Vector. = Vector.([_uv0.x, _uv0.y, _uv1.x, _uv1.y, _uv2.x, _uv2.y]); + } +} +} diff --git a/src/com/li/general/events/MouseCaptureEvent.as b/src/com/li/general/events/MouseCaptureEvent.as new file mode 100644 index 0000000..7539496 --- /dev/null +++ b/src/com/li/general/events/MouseCaptureEvent.as @@ -0,0 +1,31 @@ +package com.li.general.events +{ +import flash.events.Event; + +/** + * @author Li + */ +public class MouseCaptureEvent extends Event +{ + // ------------------------------------------------------------------------------------ + // Public fields. + // ------------------------------------------------------------------------------------ + + public static const MOUSE_DELTA:String = "mouse_delta"; + + public var deltaX:Number; + public var deltaY:Number; + + // ------------------------------------------------------------------------------------ + // Public methods. + // ------------------------------------------------------------------------------------ + + public function MouseCaptureEvent(type:String, deltaX:Number, deltaY:Number) + { + this.deltaX = deltaX; + this.deltaY = deltaY; + + super(type); + } +} +} diff --git a/src/com/li/general/events/PopUpEvent.as b/src/com/li/general/events/PopUpEvent.as new file mode 100644 index 0000000..ce3fcb6 --- /dev/null +++ b/src/com/li/general/events/PopUpEvent.as @@ -0,0 +1,21 @@ +package com.li.general.events +{ +import flash.events.Event; + +public class PopUpEvent extends Event +{ + public static const CLOSE_POP_UP:String = "CLOSE_POP_UP"; + public static const POP_UP_CLOSED:String = "POP_UP_CLOSED"; + + public function PopUpEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false) + { + super(type, bubbles, cancelable); + } + + override public function clone():Event + { + var clone:PopUpEvent = new PopUpEvent(type); + return clone; + } +} +} \ No newline at end of file diff --git a/src/com/li/general/mouse/MouseCapture.as b/src/com/li/general/mouse/MouseCapture.as new file mode 100644 index 0000000..edfd98f --- /dev/null +++ b/src/com/li/general/mouse/MouseCapture.as @@ -0,0 +1,139 @@ +package com.li.general.mouse +{ +import com.li.away3d.*; + +import com.li.general.events.MouseCaptureEvent; + +import flash.display.Sprite; +import flash.events.Event; +import flash.events.MouseEvent; + +/** + * @author Li + */ +public class MouseCapture extends Sprite +{ + // ------------------------------------------------------------------------------------ + // Private fields. + // ------------------------------------------------------------------------------------ + + private var _captureSprite:Sprite; + private var _width:Number; + private var _height:Number; + private var _lastMouseX:Number; + private var _lastMouseY:Number; + private var _mouseDeltaX:Number; + private var _mouseDeltaY:Number; + + // ------------------------------------------------------------------------------------ + // Public methods. + // ------------------------------------------------------------------------------------ + + public function MouseCapture(width:Number, height:Number) + { + super(); + + _width = width; + _height = height; + + // Wait until the sprite is added to stage for initialization. + addEventListener(Event.ADDED_TO_STAGE, captureSpriteAddedToStageHandler); + } + + public function resize(width:Number, height:Number):void + { + drawFill(width, height); + _width = width; + _height = height; + } + + // ------------------------------------------------------------------------------------ + // Private methods. + // ------------------------------------------------------------------------------------ + + private function initializeCaptureSprite():void + { + // Initialize capture sprite. + _captureSprite = new Sprite(); + drawFill(_width, _height); + + // Attach mouse listeners to capture sprite. + _captureSprite.addEventListener(MouseEvent.MOUSE_DOWN, captureSpriteMouseDownHandler); + stage.addEventListener(MouseEvent.MOUSE_UP, captureSpriteMouseUpHandler); + + // Also listen for the mouse leaving the stage. + stage.addEventListener(Event.MOUSE_LEAVE, stageMouseLeaveHandler); + } + + private function drawFill(width:Number, height:Number):void + { + _captureSprite.graphics.clear(); + _captureSprite.graphics.beginFill(0xFF0000, 0.0); + _captureSprite.graphics.drawRect(0, 0, width, height); + _captureSprite.graphics.endFill(); + addChild(_captureSprite); + } + + private function startEnterframe():void + { + _captureSprite.addEventListener(Event.ENTER_FRAME, enterframeHandler); + } + + private function stopEnterframe():void + { + _captureSprite.removeEventListener(Event.ENTER_FRAME, enterframeHandler); + } + + private function update():void + { + _mouseDeltaX = _lastMouseX - _captureSprite.mouseX; + _mouseDeltaY = _lastMouseY - _captureSprite.mouseY; + notifyMouseDelta(); + _lastMouseX = _captureSprite.mouseX; + _lastMouseY = _captureSprite.mouseY; + } + + private function notifyMouseDelta():void + { + var evt:MouseCaptureEvent = new MouseCaptureEvent(MouseCaptureEvent.MOUSE_DELTA, _mouseDeltaX, _mouseDeltaY); + dispatchEvent(evt); + } + + // ------------------------------------------------------------------------------------ + // Event handlers. + // ------------------------------------------------------------------------------------ + + private function captureSpriteAddedToStageHandler(event:Event):void + { + // Remove initialization listener. + removeEventListener(Event.ADDED_TO_STAGE, captureSpriteAddedToStageHandler); + + // Initialize. + initializeCaptureSprite(); + } + + private function captureSpriteMouseDownHandler(event:MouseEvent):void + { + // trace("capture mouse down."); + _lastMouseX = _captureSprite.mouseX; + _lastMouseY = _captureSprite.mouseY; + startEnterframe(); + } + + private function captureSpriteMouseUpHandler(event:MouseEvent):void + { + // trace("capture mouse up."); + stopEnterframe(); + } + + private function stageMouseLeaveHandler(event:Event):void + { + stopEnterframe(); + } + + private function enterframeHandler(event:Event):void + { + update(); + } +} +} diff --git a/src/com/li/pb/WaveDisplacement.pbk b/src/com/li/pb/WaveDisplacement.pbk index 4398ea3..e926ef6 100644 --- a/src/com/li/pb/WaveDisplacement.pbk +++ b/src/com/li/pb/WaveDisplacement.pbk @@ -1,58 +1,58 @@ - - -kernel WaveDisplacement -< namespace : ""; - vendor : "Li"; - version : 1; - description : "Calculates displacement values for a 2D wave equation."; -> -{ - input image3 currentBuffer; - input image3 previousBuffer; - output pixel3 dst; - - parameter float k1 - < - defaultValue : float(0.0); - >; - - parameter float k2 - < - defaultValue : float(0.0); - >; - - parameter float k3 - < - defaultValue : float(0.0); - >; - - parameter float2 dims - < - defaultValue : float2(0.0, 0.0); - >; - - void - evaluatePixel() - { - float2 coord = outCoord(); - float3 point = sampleNearest(currentBuffer, coord); - - if(coord.x > 1.0 && coord.y > 1.0 && coord.x < dims.x && coord.y < dims.y) - { - float3 prev = sampleNearest(previousBuffer, coord); - float3 right = sampleNearest(currentBuffer, coord + float2(1.0, 0.0)); - float3 left = sampleNearest(currentBuffer, coord + float2(-1.0, 0.0)); - float3 top = sampleNearest(currentBuffer, coord + float2(0.0, -1.0)); - float3 bottom = sampleNearest(currentBuffer, coord + float2(0.0, 1.0)); - - dst.z = k1*point.z + k2*prev.z + k3*(right.z + left.z + top.z + bottom.z); - } - else - { - dst.z = 0.0; - } - - dst.x = point.x; - dst.y = point.y; - } -} + + +kernel WaveDisplacement +< namespace : ""; + vendor : "Li"; + version : 1; + description : "Calculates displacement values for a 2D wave equation."; +> +{ + input image3 currentBuffer; + input image3 previousBuffer; + output pixel3 dst; + + parameter float k1 + < + defaultValue : float(0.0); + >; + + parameter float k2 + < + defaultValue : float(0.0); + >; + + parameter float k3 + < + defaultValue : float(0.0); + >; + + parameter float2 dims + < + defaultValue : float2(0.0, 0.0); + >; + + void + evaluatePixel() + { + float2 coord = outCoord(); + float3 point = sampleNearest(currentBuffer, coord); + + if(coord.x > 1.0 && coord.y > 1.0 && coord.x < dims.x && coord.y < dims.y) + { + float3 prev = sampleNearest(previousBuffer, coord); + float3 right = sampleNearest(currentBuffer, coord + float2(1.0, 0.0)); + float3 left = sampleNearest(currentBuffer, coord + float2(-1.0, 0.0)); + float3 top = sampleNearest(currentBuffer, coord + float2(0.0, -1.0)); + float3 bottom = sampleNearest(currentBuffer, coord + float2(0.0, 1.0)); + + dst.z = k1*point.z + k2*prev.z + k3*(right.z + left.z + top.z + bottom.z); + } + else + { + dst.z = 0.0; + } + + dst.x = point.x; + dst.y = point.y; + } +} diff --git a/src/com/li/pb/WaveNormals.pbk b/src/com/li/pb/WaveNormals.pbk index fcf5081..9c132fd 100644 --- a/src/com/li/pb/WaveNormals.pbk +++ b/src/com/li/pb/WaveNormals.pbk @@ -1,32 +1,32 @@ - - -kernel WaveNormals -< namespace : ""; - vendor : "Li"; - version : 1; - description : "Calculates normal values for a 2D wave equation."; -> -{ - input image3 currentBuffer; - output pixel3 dst; - - parameter float dd - < - defaultValue : float(0.0); - >; - - void - evaluatePixel() - { - float2 coord = outCoord(); - - pixel3 right = sampleNearest(currentBuffer, coord + float2(1.0, 0.0)); - pixel3 left = sampleNearest(currentBuffer, coord + float2(-1.0, 0.0)); - pixel3 top = sampleNearest(currentBuffer, coord + float2(0.0, -1.0)); - pixel3 bottom = sampleNearest(currentBuffer, coord + float2(0.0, 1.0)); - - dst.x = right.z - left.z; - dst.y = bottom.z - top.z; - dst.z = dd; - } -} + + +kernel WaveNormals +< namespace : ""; + vendor : "Li"; + version : 1; + description : "Calculates normal values for a 2D wave equation."; +> +{ + input image3 currentBuffer; + output pixel3 dst; + + parameter float dd + < + defaultValue : float(0.0); + >; + + void + evaluatePixel() + { + float2 coord = outCoord(); + + pixel3 right = sampleNearest(currentBuffer, coord + float2(1.0, 0.0)); + pixel3 left = sampleNearest(currentBuffer, coord + float2(-1.0, 0.0)); + pixel3 top = sampleNearest(currentBuffer, coord + float2(0.0, -1.0)); + pixel3 bottom = sampleNearest(currentBuffer, coord + float2(0.0, 1.0)); + + dst.x = right.z - left.z; + dst.y = bottom.z - top.z; + dst.z = dd; + } +} diff --git a/src/com/li/pb/WaveTangents.pbk b/src/com/li/pb/WaveTangents.pbk index f5f0d18..482b78a 100644 --- a/src/com/li/pb/WaveTangents.pbk +++ b/src/com/li/pb/WaveTangents.pbk @@ -1,30 +1,30 @@ - - -kernel WaveTangents -< namespace : ""; - vendor : "Li"; - version : 1; - description : "Calculates tangent values for a 2D wave equation."; -> -{ - input image3 currentBuffer; - output pixel3 dst; - - parameter float dd - < - defaultValue : float(0.0); - >; - - void - evaluatePixel() - { - float2 coord = outCoord(); - - pixel3 right = sampleNearest(currentBuffer, coord + float2(1.0, 0.0)); - pixel3 left = sampleNearest(currentBuffer, coord + float2(-1.0, 0.0)); - - dst.x = dd; - dst.y = 0.0; - dst.z = left.z - right.z; - } -} + + +kernel WaveTangents +< namespace : ""; + vendor : "Li"; + version : 1; + description : "Calculates tangent values for a 2D wave equation."; +> +{ + input image3 currentBuffer; + output pixel3 dst; + + parameter float dd + < + defaultValue : float(0.0); + >; + + void + evaluatePixel() + { + float2 coord = outCoord(); + + pixel3 right = sampleNearest(currentBuffer, coord + float2(1.0, 0.0)); + pixel3 left = sampleNearest(currentBuffer, coord + float2(-1.0, 0.0)); + + dst.x = dd; + dst.y = 0.0; + dst.z = left.z - right.z; + } +}