Advertisement
Guest User

Untitled

a guest
Aug 14th, 2020
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. package shapesinmotion.base
  2. {
  3.     import flash.concurrent.Condition;
  4.     import flash.concurrent.Mutex;
  5.     import flash.display.Sprite;
  6.     import flash.events.Event;
  7.     import flash.system.Worker;
  8.     import flash.system.WorkerDomain;
  9.     import flash.utils.ByteArray;
  10.     import flash.utils.clearTimeout;
  11.     import flash.utils.setTimeout;
  12.    
  13.     import Box2D.Common.Math.b2Vec2;
  14.     import Box2D.Dynamics.IBox2dDebugDraw;
  15.     import Box2D.Dynamics.b2DebugDraw;
  16.     import Box2D.Dynamics.b2World;
  17.    
  18.     import hcmbox2d.base.PhysicsEngineWorkerProxy;
  19.     import hcmbox2d.helper.AdvancedPathHelper;
  20.     import hcmbox2d.helper.BombExplosionHelper;
  21.     import hcmbox2d.helper.Box2DPhysicsLineDrawHelper;
  22.     import hcmbox2d.helper.Box2dDebugDrawHelper;
  23.     import hcmbox2d.helper.Box2dPhysicsWorldJointHelper;
  24.     import hcmbox2d.helper.PhysicsLineDrawBodyHelper;
  25.     import hcmbox2d.interfaces.IPhysicsEngine;
  26.     import hcmbox2d.interfaces.factory.IPhysicsWorldObjectFactory;
  27.    
  28.     import shapesinmotion.factory.SIMBasePhysicsObjectFactory;
  29.     import shapesinmotion.factory.SIMPhysicsObjectFactory;
  30.     import shapesinmotion.factory.vertex.SIMObjectVertexFactory;
  31.     import shapesinmotion.helpers.LaserObjectHelper;
  32.     import shapesinmotion.physics.PhysicsEngineWorkerWrapper;
  33.     import shapesinmotion.physics.SIMBox2DDebugDraw;
  34.     import shapesinmotion.physics.SIMBox2dPhysicsEngine;
  35.  
  36.     public class BaseMainClass extends Sprite
  37.     {
  38.         public static const ENABLE_PHYSICS_ENGINE_WORKER:Boolean = false;
  39.  
  40.         public var isLoaderInfoLoaded:Boolean = false;
  41.         public var shapesInMotionInitializer:ShapesInMotionInitializer;
  42.        
  43.         public var physicsEngineWorker:Worker;
  44.        
  45.         private var physicsEngineMutex:Mutex;
  46.         private var physicsEngineCondition:Condition;
  47.        
  48.         private var objectData:ByteArray;
  49.         private var jointData:ByteArray;
  50.         private var commandData:ByteArray;
  51.         private var simulationData:ByteArray;
  52.         private var laserData:ByteArray;
  53.         private var touchData:ByteArray;
  54.         private var contactData:ByteArray;
  55.         private var debugDrawData:ByteArray;
  56.  
  57.         public static const DEBUG_DRAW_LINE_THICKNESS:Number = 2;
  58.         public static const DEBUG_DRAW_ALPHA:Number = 0.5;
  59.        
  60.         public function BaseMainClass()
  61.         {
  62.             super();
  63.         }
  64.  
  65.         public static var resizeEventsCount:int = 0;
  66.         public static var maxResolution:uint = 0;
  67.        
  68.         protected function startMainThread():void
  69.         {
  70.             if(ENABLE_PHYSICS_ENGINE_WORKER)
  71.             {
  72.                 physicsEngineWorker = WorkerDomain.current.createWorker(this.loaderInfo.bytes);
  73.                
  74.                 physicsEngineMutex = new Mutex();
  75.                 physicsEngineCondition = new Condition(physicsEngineMutex);
  76.                
  77.                 physicsEngineWorker.setSharedProperty("condition", physicsEngineCondition);
  78.                 physicsEngineWorker.setSharedProperty("mutex", physicsEngineMutex);
  79.  
  80.                
  81.                 objectData = new ByteArray();
  82.                 objectData.shareable = true;
  83.                
  84.                 jointData = new ByteArray();
  85.                 jointData.shareable = true;
  86.                
  87.                 commandData = new ByteArray();
  88.                 commandData.shareable = true;
  89.                
  90.                 simulationData = new ByteArray();
  91.                 simulationData.shareable = true;
  92.                
  93.                 laserData = new ByteArray();
  94.                 laserData.shareable = true;
  95.                
  96.                 touchData = new ByteArray();
  97.                 touchData.shareable = true;
  98.                
  99.                 contactData = new ByteArray();
  100.                 contactData.shareable = true;
  101.                
  102.                 debugDrawData = new ByteArray();
  103.                 debugDrawData.shareable = true;
  104.                
  105.                
  106.                 physicsEngineWorker.setSharedProperty('objectData', objectData);
  107.                 physicsEngineWorker.setSharedProperty('jointData', jointData);
  108.                 physicsEngineWorker.setSharedProperty('simulationData', simulationData);
  109.                 physicsEngineWorker.setSharedProperty('simulationData', laserData);
  110.                 physicsEngineWorker.setSharedProperty('commandData', commandData);
  111.                 physicsEngineWorker.setSharedProperty('touchData', touchData);
  112.                 physicsEngineWorker.setSharedProperty('contactData', contactData);
  113.                 physicsEngineWorker.setSharedProperty('debugDrawData', debugDrawData);     
  114.             }
  115.  
  116.             this.stage.addEventListener(flash.events.Event.RESIZE, _stageResizeEvent);
  117.             this.loaderInfo.addEventListener(Event.COMPLETE, this.loaderInfoLoadCompleteEventHandler);
  118.         }
  119.  
  120.         private static var safeTimeout:int;
  121.  
  122.         public function _stageResizeEvent(event:flash.events.Event):void
  123.         {
  124.             if(safeTimeout > 0) clearTimeout(safeTimeout);
  125.             if(isLoaderInfoLoaded && !ShapesInMotionInitializer.IS_INITIALIZED) safeTimeout = setTimeout(shapesInMotionInitializer.init, 400);
  126.  
  127.             resizeEventsCount++;
  128.             maxResolution = Math.max(this.stage.stageHeight, maxResolution);
  129.         }
  130.  
  131.         protected function loaderInfoLoadCompleteEventHandler(event:Event):void
  132.         {
  133.             isLoaderInfoLoaded = true;
  134.  
  135.             shapesInMotionInitializer.mainInstance = this;
  136.             shapesInMotionInitializer.physicsEngineWorker = physicsEngineWorker;
  137.  
  138.             shapesInMotionInitializer.loaderInfoLoadComplete();
  139.  
  140.             if(safeTimeout > 0) clearTimeout(safeTimeout);     
  141.             safeTimeout = setTimeout(shapesInMotionInitializer.init, 400);
  142.            
  143.         }
  144.  
  145.         public function createPhysicsEngineForMainThread():void
  146.         {
  147.             var engine:IPhysicsEngine;
  148.  
  149.             if(ENABLE_PHYSICS_ENGINE_WORKER)
  150.             {
  151.                 var engineWorker:PhysicsEngineWorkerProxy = new PhysicsEngineWorkerProxy();
  152.                     engineWorker.engineWorker = physicsEngineWorker;
  153.  
  154.                 engine = engineWorker;
  155.             }
  156.             else
  157.             {
  158.                 var physicsEngine:SIMBox2dPhysicsEngine = new SIMBox2dPhysicsEngine();
  159.                     physicsEngine.box2dWorld = new b2World(new b2Vec2(0, 9.81), true);
  160.                     physicsEngine.box2dJointHelper = new Box2dPhysicsWorldJointHelper();
  161.  
  162.                 var physicsWorldObjectFactory:IPhysicsWorldObjectFactory = this.createPhysicsObjectFactory();
  163.                     physicsWorldObjectFactory.physicsObjectFactory.physicsWorld = physicsEngine.box2dWorld;
  164.                     physicsWorldObjectFactory.physicsObjectFactory.meterToPixelRatio = ShapesInMotionContainer.METER_TO_PIXEL_RATIO;
  165.                     physicsWorldObjectFactory.physicsObjectFactory.pixelToMeterRatio = ShapesInMotionContainer.PIXEL_TO_METER_RATIO;
  166.  
  167.                     physicsEngine.physicsWorldObjectFactory = physicsWorldObjectFactory;
  168.  
  169.                     physicsEngine.debugDraw = this.createBox2dDebugDraw();
  170.  
  171.                     physicsEngine.advancedPathHelper = new AdvancedPathHelper();
  172.                     physicsEngine.physicsLineDrawHelper = new Box2DPhysicsLineDrawHelper();
  173.                     physicsEngine.laserHelper = new LaserObjectHelper();
  174.                     physicsEngine.bombExplosionHelper = new BombExplosionHelper();
  175.  
  176.                     physicsEngine.advancedPathHelper.physicsEngine = physicsEngine;
  177.                     physicsEngine.laserHelper.physicsEngine = physicsEngine;
  178.                     physicsEngine.bombExplosionHelper.physicsEngine = physicsEngine;
  179.  
  180.                 var physicsLineDrawBodyHelper:PhysicsLineDrawBodyHelper = new PhysicsLineDrawBodyHelper();
  181.                     physicsLineDrawBodyHelper.box2dWorld = physicsEngine.box2dWorld;
  182.  
  183.                     physicsEngine.physicsLineDrawHelper.physicsLineDrawBodyHelper = physicsLineDrawBodyHelper;
  184.  
  185.                 engine = physicsEngine;
  186.             }
  187.  
  188.             shapesInMotionInitializer.physicsEngine = engine;
  189.         }
  190.        
  191.         protected function startPhysicsEngineThread():void
  192.         {
  193.             var workerWrapper:PhysicsEngineWorkerWrapper = new PhysicsEngineWorkerWrapper();
  194.                 workerWrapper.physicsEngine.physicsWorldObjectFactory = this.createPhysicsObjectFactory();
  195.                 workerWrapper.init();
  196.         }
  197.  
  198.         protected function createBox2dDebugDraw():IBox2dDebugDraw
  199.         {
  200.             var simDebugDrawMain:SIMBox2DDebugDraw = new SIMBox2DDebugDraw();
  201.                 simDebugDrawMain.debugDrawHelper = new Box2dDebugDrawHelper();
  202.                 simDebugDrawMain.SetDrawScale(ShapesInMotionContainer.METER_TO_PIXEL_RATIO);
  203.  
  204.                 simDebugDrawMain.SetLineThickness(DEBUG_DRAW_LINE_THICKNESS);
  205.                 simDebugDrawMain.SetFillAlpha(DEBUG_DRAW_ALPHA);
  206.                 simDebugDrawMain.SetFlags(b2DebugDraw.e_jointBit | b2DebugDraw.e_shapeBit);
  207.            
  208.             return simDebugDrawMain;
  209.         }
  210.  
  211.         protected function createPhysicsObjectFactory():IPhysicsWorldObjectFactory
  212.         {
  213.             var objectVertexFactory:SIMObjectVertexFactory = new SIMObjectVertexFactory();
  214.  
  215.             var physicsObjectFactory:SIMPhysicsObjectFactory;              
  216.                 physicsObjectFactory = new SIMPhysicsObjectFactory();
  217.                 physicsObjectFactory.physicsObjectVertexFactory = objectVertexFactory.create();
  218.            
  219.             var physicsWorldObjectFactory:SIMBasePhysicsObjectFactory = new SIMBasePhysicsObjectFactory();
  220.                 physicsWorldObjectFactory.physicsObjectFactory = physicsObjectFactory;
  221.            
  222.             return physicsWorldObjectFactory;
  223.         }
  224.     }
  225. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement