Advertisement
Guest User

WorldRender [Worker]

a guest
Jun 22nd, 2016
29
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package
  2. {
  3.     import away3d.bounds.BoundingVolumeBase;
  4.     import away3d.containers.View3D;
  5.     import away3d.core.base.Geometry;
  6.     import away3d.entities.Mesh;
  7.     import away3d.events.MouseEvent3D;
  8.     import away3d.library.assets.NamedAssetBase;
  9.     import away3d.lights.DirectionalLight;
  10.     import away3d.materials.ColorMaterial;
  11.     import away3d.materials.MaterialBase;
  12.     import away3d.materials.lightpickers.StaticLightPicker;
  13.     import away3d.materials.methods.FilteredShadowMapMethod;
  14.     import away3d.primitives.CubeGeometry;
  15.     import away3d.tools.commands.Merge;
  16.     import flash.display.Sprite;
  17.     import flash.events.Event;
  18.     import flash.events.EventDispatcher;
  19.     import flash.geom.Matrix3D;
  20.     import flash.geom.Vector3D;
  21.     import flash.net.registerClassAlias;
  22.     import flash.sampler.NewObjectSample;
  23.     import flash.system.MessageChannel;
  24.     import flash.system.Worker;
  25.     import flash.system.WorkerDomain;
  26.     import flash.utils.ByteArray;
  27.     /**
  28.      * ...
  29.      * @author Samuel Walker
  30.      */
  31.     public class WorldRender extends Sprite
  32.     {
  33.         private var viewport:View3D;
  34.        
  35.         //Sector to Rendered cubes correlation
  36.         private var indXsector:Vector.<Sector>;
  37.         private var indXrenders:Vector.<Vector.<Mesh>>;
  38.         private var indXactive:Vector.<Boolean>;
  39.         private var indXPosition:Vector.<String>;
  40.        
  41.         private var activeCubes:Vector.<ColorMaterial>;
  42.         private var basedCube:Mesh;
  43.        
  44.         //Multithreading objects
  45.         protected var worker:Worker;
  46.         protected var mainToWorker:MessageChannel;
  47.         protected var workerToMain:MessageChannel;
  48.        
  49.         //Types of commands
  50.         public static const RENDER:String = "render";
  51.         public static const UNRENDER:String = "unrender";
  52.         public static const ACTIVATE_SECTOR:String = "activateSector";
  53.         public static const DEACTIVATE_SECTOR:String = "deactivateSector";
  54.        
  55.         public function WorldRender()
  56.         {
  57.             registerClassAlias("Sector", Sector);
  58.             registerClassAlias("Cube", Cube);
  59.             registerClassAlias("away3d.entities.Mesh", Mesh);
  60.             registerClassAlias("away3d.core.base.Geometry", Geometry);
  61.             registerClassAlias("away3d.materials.MaterialBase", MaterialBase);
  62.             registerClassAlias("away3d.bounds.BoundingVolumeBase", BoundingVolumeBase);
  63.             registerClassAlias("flash.geom.Vector3D", Vector3D);
  64.             registerClassAlias("flash.geom.Matrix3D", Matrix3D);
  65.             registerClassAlias("away3d.library.assets.NamedAssetBase", NamedAssetBase);
  66.            
  67.            
  68.             trace("Init worker");
  69.             workerToMain = Worker.current.getSharedProperty("workerToMain");
  70.             mainToWorker = Worker.current.getSharedProperty("mainToWorker");
  71.            
  72.             trace("[worker]" + workerToMain);
  73.             trace("[worker]" + mainToWorker);
  74.            
  75.             mainToWorker.addEventListener(Event.CHANNEL_MESSAGE, onMainToWorker);
  76.            
  77.             indXsector = new Vector.<Sector>();
  78.             indXrenders = new Vector.<Vector.<Mesh>>();
  79.             activeCubes = new Vector.<ColorMaterial>();
  80.             indXactive = new Vector.<Boolean>();
  81.             indXPosition = new Vector.<String>();
  82.             basedCube = new Mesh(new CubeGeometry(Cube.CUBE_SIZE, Cube.CUBE_SIZE, Cube.CUBE_SIZE));
  83.            
  84.             trace("Constructor complete");
  85.             workerToMain.send("READY");
  86.         }
  87.        
  88.         protected function onMainToWorker(e:Event):void
  89.         {
  90.             trace("[worker] recieved object");
  91.             var recievedObject:Object = mainToWorker.receive();
  92.             trace("[worker] recieved " + recievedObject);
  93.            
  94.             switch(recievedObject.order)
  95.             {
  96.                 case RENDER:
  97.                     renderSector(recievedObject.sector as Sector, recievedObject.combine);
  98.                     break;
  99.                 case ACTIVATE_SECTOR:
  100.                     activateSector(recievedObject.x, recievedObject.y, recievedObject.z);
  101.                     break;
  102.                 case DEACTIVATE_SECTOR:
  103.                     deactivateSector(recievedObject.x, recievedObject.y, recievedObject.z);
  104.                     break;
  105.             }
  106.         }
  107.        
  108.        
  109.         protected function renderSector(sector:Sector, combine:Boolean):void
  110.         {
  111.             var renders:Vector.<Mesh> = new Vector.<Mesh>();
  112.            
  113.             //Render only things touching air.
  114.             var counter:int = 0;
  115.            
  116.             trace("[worker] Sector = " + sector);
  117.             var format:Object = World.formatSector(sector.cubes);
  118.            
  119.             for (var i:int = 0; i < format.externalLength; i++)
  120.             {
  121.                 //All cubes that are external are only rendered.
  122.                 var cube:Cube = format.allCubes[i];
  123.                
  124.                 var mesh:Mesh;
  125.                 var colorFound:Boolean = new Boolean(false);
  126.                
  127.                 for each (var color:ColorMaterial in activeCubes)
  128.                 {
  129.                     if (color.color == cube.color)
  130.                     {
  131.                         mesh = new Mesh(basedCube.geometry, color);
  132.                         colorFound = true;
  133.                     }
  134.                 }
  135.                 if (colorFound == false)
  136.                 {
  137.                     var newColorMaterial:ColorMaterial = new ColorMaterial(cube.color);
  138.                     activeCubes.push(newColorMaterial);
  139.                     //trace("New color..");
  140.                     mesh = new Mesh(basedCube.geometry, newColorMaterial);
  141.                 }
  142.                 //                              Sector position                           local position
  143.                 mesh.name = sector.x + "." + sector.y + "." + sector.z + "|" + cube.x + "." + cube.y + "." + cube.z;
  144.                 mesh.x = (sector.x * (Sector.SECTOR_SIZE * Sector.SECTOR_SIZE)) + (Cube.CUBE_SIZE * cube.x);
  145.                 mesh.y = (sector.y * (Sector.SECTOR_SIZE * Sector.SECTOR_SIZE)) + (Cube.CUBE_SIZE * cube.y);
  146.                 mesh.z = (sector.z * (Sector.SECTOR_SIZE * Sector.SECTOR_SIZE)) + (Cube.CUBE_SIZE * cube.z);
  147.                
  148.                 renders.push(mesh);
  149.             }
  150.            
  151.             indXsector.push(sector);
  152.             indXPosition.push(sector.x + "." + sector.y + "." + sector.z);
  153.            
  154.             if (combine)
  155.             {
  156.                 var finalMesh:Mesh = new Mesh(new Geometry());
  157.                 var combiner:Merge = new Merge(true);
  158.                 combiner.applyToMeshes(finalMesh, renders);
  159.                 //viewport.scene.addChild(finalMesh);
  160.                 //Tell main thread to add the object
  161.                 var objectToSend:Object = new Object();
  162.                 objectToSend.order = RENDER;
  163.                 objectToSend.mesh = finalMesh;
  164.                 workerToMain.send(objectToSend);
  165.                
  166.                 var render:Vector.<Mesh> = new Vector.<Mesh>();
  167.                 render.push(finalMesh);
  168.                 indXrenders.push(render);
  169.                 indXactive.push(false);
  170.             }
  171.             else
  172.             {
  173.                 for each (var meshCube:Mesh in renders)
  174.                 {
  175.                     //viewport.scene.addChild(meshCube);
  176.                    
  177.                     meshCube.mouseEnabled = true;
  178.                     meshCube.addEventListener(MouseEvent3D.CLICK, handleCubeClick);
  179.                    
  180.                     //Tell mainthread to remove the object
  181.                     var objectToSend:Object = new Object();
  182.                     objectToSend.order = RENDER;
  183.                     objectToSend.mesh = meshCube;
  184.                     workerToMain.send(objectToSend);
  185.                    
  186.                    
  187.                 }
  188.                 indXrenders.push(renders);
  189.                 indXactive.push(true);
  190.             }
  191.            
  192.            
  193.         }
  194.        
  195.         protected function handleCubeClick(e:MouseEvent3D):void
  196.         {
  197.             e.target.removeEventListener(MouseEvent3D.CLICK, handleCubeClick);
  198.             var targetMesh:Mesh = (e.target as Mesh);
  199.             //viewport.scene.removeChild(targetMesh);
  200.            
  201.             var objectToSend:Object = new Object();
  202.                 objectToSend.order = UNRENDER;
  203.                 objectToSend.mesh = targetMesh;
  204.                 workerToMain.send(objectToSend);
  205.            
  206.             trace("Sector name = " + targetMesh.name);
  207.            
  208.             var targetSector:Sector = indXsector[indXPosition.indexOf(targetMesh.name.split("|")[0])];
  209.             //Remove the cube.
  210.            
  211.             var localCubePositions:Array = targetMesh.name.split("|")[1].split(".");
  212.             var cubeIndexPosition:int = targetSector.cubes.indexOf(targetSector.getCube(parseInt(localCubePositions[0]), parseInt(localCubePositions[1]), parseInt(localCubePositions[2])));
  213.            
  214.             targetSector.cubes[cubeIndexPosition].color = 0xFFFFFF;
  215.            
  216.             indXrenders[indXsector.indexOf(targetSector)].splice(indXrenders[indXsector.indexOf(targetSector)].indexOf(targetMesh), 1);
  217.            
  218.             trace("Target cube = " + localCubePositions);
  219.             var surroundingCubes:Vector.<Cube> = targetSector.getCubesAroundTarget(targetSector.getCube(parseInt(localCubePositions[0]), parseInt(localCubePositions[1]), parseInt(localCubePositions[2])));
  220.            
  221.            
  222.            
  223.             for each (var returnedCube:Cube in surroundingCubes)
  224.             {
  225.                 if (returnedCube.color != 0xFFFFFF)
  226.                 {
  227.                     var targetMaterial:ColorMaterial;
  228.                     for each (var colorMat:ColorMaterial in activeCubes)
  229.                     {
  230.                         if (colorMat.color == returnedCube.color)
  231.                         {
  232.                             targetMaterial = colorMat;
  233.                             break;
  234.                         }
  235.                     }
  236.                    
  237.                     var mesh:Mesh = new Mesh(basedCube.geometry, targetMaterial);
  238.                     mesh.name = targetSector.x + "." + targetSector.y + "." + targetSector.z + "|" + returnedCube.x + "." + returnedCube.y + "." + returnedCube.z;
  239.                     mesh.x = (targetSector.x * (Sector.SECTOR_SIZE * Sector.SECTOR_SIZE)) + (Cube.CUBE_SIZE * returnedCube.x);
  240.                     mesh.y = (targetSector.y * (Sector.SECTOR_SIZE * Sector.SECTOR_SIZE)) + (Cube.CUBE_SIZE * returnedCube.y);
  241.                     mesh.z = (targetSector.z * (Sector.SECTOR_SIZE * Sector.SECTOR_SIZE)) + (Cube.CUBE_SIZE * returnedCube.z);
  242.                     mesh.mouseEnabled = true;
  243.                     mesh.addEventListener(MouseEvent3D.CLICK, handleCubeClick);
  244.                    
  245.                     if (meshRendered(mesh.x, mesh.y, mesh.z, indXrenders[indXsector.indexOf(targetSector)]) == false)
  246.                     {
  247.                         trace("[worker] Rendering cube " + returnedCube.x + "." + returnedCube.y + "." + returnedCube.z);
  248.                         //viewport.scene.addChild(mesh);
  249.                         //Tell main thread to render object
  250.                         var objectToSend:Object = new Object();
  251.                             objectToSend.order = RENDER;
  252.                             objectToSend.mesh = mesh;
  253.                             workerToMain.send(objectToSend);
  254.                        
  255.                        
  256.                         indXrenders[indXsector.indexOf(targetSector)].push(mesh);
  257.                     }
  258.                     else
  259.                     {
  260.                         trace("[worker] Cube already rendered.");
  261.                     }              
  262.                    
  263.                    
  264.                 }
  265.             }
  266.            
  267.         }
  268.        
  269.         protected function meshRendered(x:int, y:int, z:int, array:Vector.<Mesh>):Boolean
  270.         {
  271.             for each (var mesh:Mesh in array)
  272.             {
  273.                 if (mesh.x == x && mesh.y == y && mesh.z == z)
  274.                 {
  275.                     return true;
  276.                 }
  277.             }
  278.             return false;
  279.         }
  280.        
  281.         protected function activateSector(x:int, y:int, z:int):void
  282.         {
  283.             if (indXactive[indXPosition.indexOf(x + "." + y + "." + z)])
  284.             {
  285.                 return;
  286.             }
  287.            
  288.             //trace("Attempting to activate sector " + x + "." + y + "." + z);
  289.             var targetSector:Sector = indXsector[indXPosition.indexOf(x + "." + y + "." + z)];
  290.            
  291.             unRenderSector(targetSector);
  292.            
  293.             renderSector(targetSector, false);
  294.         }
  295.        
  296.         protected function deactivateSector(x:int, y:int, z:int):void
  297.         {
  298.             if (!indXactive[indXPosition.indexOf(x + "." + y + "." + z)])
  299.             {
  300.                 return;
  301.             }
  302.             var targetSector:Sector = indXsector[indXPosition.indexOf(x + "." + y + "." + z)];
  303.            
  304.             unRenderSector(targetSector);
  305.            
  306.             renderSector(targetSector, true);
  307.         }
  308.        
  309.         protected function unRenderSector(sector:Sector):void
  310.         {
  311.             for each (var mesh:Mesh in indXrenders[indXsector.indexOf(sector)])
  312.             {
  313.                 //viewport.scene.removeChild(mesh);
  314.                 //Tell mainthread to remove the object
  315.                     var objectToSend:Object = new Object();
  316.                     objectToSend.order = UNRENDER;
  317.                     objectToSend.mesh = mesh;
  318.                     workerToMain.send(objectToSend);
  319.                    
  320.             }
  321.             var indxOfSector:int = indXsector.indexOf(sector);
  322.            
  323.             indXrenders.splice(indXsector.indexOf(sector), 1);
  324.             indXactive.splice(indXsector.indexOf(sector), 1);
  325.             indXPosition.splice(indXsector.indexOf(sector), 1);
  326.             indXsector.splice(indXsector.indexOf(sector), 1);
  327.         }
  328.     }
  329. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement