Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package
- {
- import away3d.bounds.BoundingVolumeBase;
- import away3d.containers.View3D;
- import away3d.core.base.Geometry;
- import away3d.entities.Mesh;
- import away3d.events.MouseEvent3D;
- import away3d.library.assets.NamedAssetBase;
- import away3d.lights.DirectionalLight;
- import away3d.materials.ColorMaterial;
- import away3d.materials.MaterialBase;
- import away3d.materials.lightpickers.StaticLightPicker;
- import away3d.materials.methods.FilteredShadowMapMethod;
- import away3d.primitives.CubeGeometry;
- import away3d.tools.commands.Merge;
- import flash.display.Sprite;
- import flash.events.Event;
- import flash.events.EventDispatcher;
- import flash.geom.Matrix3D;
- import flash.geom.Vector3D;
- import flash.net.registerClassAlias;
- import flash.sampler.NewObjectSample;
- import flash.system.MessageChannel;
- import flash.system.Worker;
- import flash.system.WorkerDomain;
- import flash.utils.ByteArray;
- /**
- * ...
- * @author Samuel Walker
- */
- public class WorldRender extends Sprite
- {
- private var viewport:View3D;
- //Sector to Rendered cubes correlation
- private var indXsector:Vector.<Sector>;
- private var indXrenders:Vector.<Vector.<Mesh>>;
- private var indXactive:Vector.<Boolean>;
- private var indXPosition:Vector.<String>;
- private var activeCubes:Vector.<ColorMaterial>;
- private var basedCube:Mesh;
- //Multithreading objects
- protected var worker:Worker;
- protected var mainToWorker:MessageChannel;
- protected var workerToMain:MessageChannel;
- //Types of commands
- public static const RENDER:String = "render";
- public static const UNRENDER:String = "unrender";
- public static const ACTIVATE_SECTOR:String = "activateSector";
- public static const DEACTIVATE_SECTOR:String = "deactivateSector";
- public function WorldRender()
- {
- registerClassAlias("Sector", Sector);
- registerClassAlias("Cube", Cube);
- registerClassAlias("away3d.entities.Mesh", Mesh);
- registerClassAlias("away3d.core.base.Geometry", Geometry);
- registerClassAlias("away3d.materials.MaterialBase", MaterialBase);
- registerClassAlias("away3d.bounds.BoundingVolumeBase", BoundingVolumeBase);
- registerClassAlias("flash.geom.Vector3D", Vector3D);
- registerClassAlias("flash.geom.Matrix3D", Matrix3D);
- registerClassAlias("away3d.library.assets.NamedAssetBase", NamedAssetBase);
- trace("Init worker");
- workerToMain = Worker.current.getSharedProperty("workerToMain");
- mainToWorker = Worker.current.getSharedProperty("mainToWorker");
- trace("[worker]" + workerToMain);
- trace("[worker]" + mainToWorker);
- mainToWorker.addEventListener(Event.CHANNEL_MESSAGE, onMainToWorker);
- indXsector = new Vector.<Sector>();
- indXrenders = new Vector.<Vector.<Mesh>>();
- activeCubes = new Vector.<ColorMaterial>();
- indXactive = new Vector.<Boolean>();
- indXPosition = new Vector.<String>();
- basedCube = new Mesh(new CubeGeometry(Cube.CUBE_SIZE, Cube.CUBE_SIZE, Cube.CUBE_SIZE));
- trace("Constructor complete");
- workerToMain.send("READY");
- }
- protected function onMainToWorker(e:Event):void
- {
- trace("[worker] recieved object");
- var recievedObject:Object = mainToWorker.receive();
- trace("[worker] recieved " + recievedObject);
- switch(recievedObject.order)
- {
- case RENDER:
- renderSector(recievedObject.sector as Sector, recievedObject.combine);
- break;
- case ACTIVATE_SECTOR:
- activateSector(recievedObject.x, recievedObject.y, recievedObject.z);
- break;
- case DEACTIVATE_SECTOR:
- deactivateSector(recievedObject.x, recievedObject.y, recievedObject.z);
- break;
- }
- }
- protected function renderSector(sector:Sector, combine:Boolean):void
- {
- var renders:Vector.<Mesh> = new Vector.<Mesh>();
- //Render only things touching air.
- var counter:int = 0;
- trace("[worker] Sector = " + sector);
- var format:Object = World.formatSector(sector.cubes);
- for (var i:int = 0; i < format.externalLength; i++)
- {
- //All cubes that are external are only rendered.
- var cube:Cube = format.allCubes[i];
- var mesh:Mesh;
- var colorFound:Boolean = new Boolean(false);
- for each (var color:ColorMaterial in activeCubes)
- {
- if (color.color == cube.color)
- {
- mesh = new Mesh(basedCube.geometry, color);
- colorFound = true;
- }
- }
- if (colorFound == false)
- {
- var newColorMaterial:ColorMaterial = new ColorMaterial(cube.color);
- activeCubes.push(newColorMaterial);
- //trace("New color..");
- mesh = new Mesh(basedCube.geometry, newColorMaterial);
- }
- // Sector position local position
- mesh.name = sector.x + "." + sector.y + "." + sector.z + "|" + cube.x + "." + cube.y + "." + cube.z;
- mesh.x = (sector.x * (Sector.SECTOR_SIZE * Sector.SECTOR_SIZE)) + (Cube.CUBE_SIZE * cube.x);
- mesh.y = (sector.y * (Sector.SECTOR_SIZE * Sector.SECTOR_SIZE)) + (Cube.CUBE_SIZE * cube.y);
- mesh.z = (sector.z * (Sector.SECTOR_SIZE * Sector.SECTOR_SIZE)) + (Cube.CUBE_SIZE * cube.z);
- renders.push(mesh);
- }
- indXsector.push(sector);
- indXPosition.push(sector.x + "." + sector.y + "." + sector.z);
- if (combine)
- {
- var finalMesh:Mesh = new Mesh(new Geometry());
- var combiner:Merge = new Merge(true);
- combiner.applyToMeshes(finalMesh, renders);
- //viewport.scene.addChild(finalMesh);
- //Tell main thread to add the object
- var objectToSend:Object = new Object();
- objectToSend.order = RENDER;
- objectToSend.mesh = finalMesh;
- workerToMain.send(objectToSend);
- var render:Vector.<Mesh> = new Vector.<Mesh>();
- render.push(finalMesh);
- indXrenders.push(render);
- indXactive.push(false);
- }
- else
- {
- for each (var meshCube:Mesh in renders)
- {
- //viewport.scene.addChild(meshCube);
- meshCube.mouseEnabled = true;
- meshCube.addEventListener(MouseEvent3D.CLICK, handleCubeClick);
- //Tell mainthread to remove the object
- var objectToSend:Object = new Object();
- objectToSend.order = RENDER;
- objectToSend.mesh = meshCube;
- workerToMain.send(objectToSend);
- }
- indXrenders.push(renders);
- indXactive.push(true);
- }
- }
- protected function handleCubeClick(e:MouseEvent3D):void
- {
- e.target.removeEventListener(MouseEvent3D.CLICK, handleCubeClick);
- var targetMesh:Mesh = (e.target as Mesh);
- //viewport.scene.removeChild(targetMesh);
- var objectToSend:Object = new Object();
- objectToSend.order = UNRENDER;
- objectToSend.mesh = targetMesh;
- workerToMain.send(objectToSend);
- trace("Sector name = " + targetMesh.name);
- var targetSector:Sector = indXsector[indXPosition.indexOf(targetMesh.name.split("|")[0])];
- //Remove the cube.
- var localCubePositions:Array = targetMesh.name.split("|")[1].split(".");
- var cubeIndexPosition:int = targetSector.cubes.indexOf(targetSector.getCube(parseInt(localCubePositions[0]), parseInt(localCubePositions[1]), parseInt(localCubePositions[2])));
- targetSector.cubes[cubeIndexPosition].color = 0xFFFFFF;
- indXrenders[indXsector.indexOf(targetSector)].splice(indXrenders[indXsector.indexOf(targetSector)].indexOf(targetMesh), 1);
- trace("Target cube = " + localCubePositions);
- var surroundingCubes:Vector.<Cube> = targetSector.getCubesAroundTarget(targetSector.getCube(parseInt(localCubePositions[0]), parseInt(localCubePositions[1]), parseInt(localCubePositions[2])));
- for each (var returnedCube:Cube in surroundingCubes)
- {
- if (returnedCube.color != 0xFFFFFF)
- {
- var targetMaterial:ColorMaterial;
- for each (var colorMat:ColorMaterial in activeCubes)
- {
- if (colorMat.color == returnedCube.color)
- {
- targetMaterial = colorMat;
- break;
- }
- }
- var mesh:Mesh = new Mesh(basedCube.geometry, targetMaterial);
- mesh.name = targetSector.x + "." + targetSector.y + "." + targetSector.z + "|" + returnedCube.x + "." + returnedCube.y + "." + returnedCube.z;
- mesh.x = (targetSector.x * (Sector.SECTOR_SIZE * Sector.SECTOR_SIZE)) + (Cube.CUBE_SIZE * returnedCube.x);
- mesh.y = (targetSector.y * (Sector.SECTOR_SIZE * Sector.SECTOR_SIZE)) + (Cube.CUBE_SIZE * returnedCube.y);
- mesh.z = (targetSector.z * (Sector.SECTOR_SIZE * Sector.SECTOR_SIZE)) + (Cube.CUBE_SIZE * returnedCube.z);
- mesh.mouseEnabled = true;
- mesh.addEventListener(MouseEvent3D.CLICK, handleCubeClick);
- if (meshRendered(mesh.x, mesh.y, mesh.z, indXrenders[indXsector.indexOf(targetSector)]) == false)
- {
- trace("[worker] Rendering cube " + returnedCube.x + "." + returnedCube.y + "." + returnedCube.z);
- //viewport.scene.addChild(mesh);
- //Tell main thread to render object
- var objectToSend:Object = new Object();
- objectToSend.order = RENDER;
- objectToSend.mesh = mesh;
- workerToMain.send(objectToSend);
- indXrenders[indXsector.indexOf(targetSector)].push(mesh);
- }
- else
- {
- trace("[worker] Cube already rendered.");
- }
- }
- }
- }
- protected function meshRendered(x:int, y:int, z:int, array:Vector.<Mesh>):Boolean
- {
- for each (var mesh:Mesh in array)
- {
- if (mesh.x == x && mesh.y == y && mesh.z == z)
- {
- return true;
- }
- }
- return false;
- }
- protected function activateSector(x:int, y:int, z:int):void
- {
- if (indXactive[indXPosition.indexOf(x + "." + y + "." + z)])
- {
- return;
- }
- //trace("Attempting to activate sector " + x + "." + y + "." + z);
- var targetSector:Sector = indXsector[indXPosition.indexOf(x + "." + y + "." + z)];
- unRenderSector(targetSector);
- renderSector(targetSector, false);
- }
- protected function deactivateSector(x:int, y:int, z:int):void
- {
- if (!indXactive[indXPosition.indexOf(x + "." + y + "." + z)])
- {
- return;
- }
- var targetSector:Sector = indXsector[indXPosition.indexOf(x + "." + y + "." + z)];
- unRenderSector(targetSector);
- renderSector(targetSector, true);
- }
- protected function unRenderSector(sector:Sector):void
- {
- for each (var mesh:Mesh in indXrenders[indXsector.indexOf(sector)])
- {
- //viewport.scene.removeChild(mesh);
- //Tell mainthread to remove the object
- var objectToSend:Object = new Object();
- objectToSend.order = UNRENDER;
- objectToSend.mesh = mesh;
- workerToMain.send(objectToSend);
- }
- var indxOfSector:int = indXsector.indexOf(sector);
- indXrenders.splice(indXsector.indexOf(sector), 1);
- indXactive.splice(indXsector.indexOf(sector), 1);
- indXPosition.splice(indXsector.indexOf(sector), 1);
- indXsector.splice(indXsector.indexOf(sector), 1);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement