0% found this document useful (0 votes)
19 views16 pages

Engine

This document defines an Engine class that initializes Away3D and Starling frameworks for 3D and 2D rendering. It handles frame timing, input events, and quality settings. Methods include setting the background color, registering frame tickers, handling input events, and initializing proxies for the 3D rendering stage.

Uploaded by

nightmaremtgame
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
Download as txt, pdf, or txt
0% found this document useful (0 votes)
19 views16 pages

Engine

This document defines an Engine class that initializes Away3D and Starling frameworks for 3D and 2D rendering. It handles frame timing, input events, and quality settings. Methods include setting the background color, registering frame tickers, handling input events, and initializing proxies for the 3D rendering stage.

Uploaded by

nightmaremtgame
Copyright
© © All Rights Reserved
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1/ 16

package fkengine.

core
{
import away3d.animators.AnimatorBase;
import away3d.cameras.Camera3D;
import away3d.cameras.lenses.LensBase;
import away3d.cameras.lenses.OrthographicLens;
import away3d.containers.ObjectContainer3D;
import away3d.containers.View3D;
import away3d.controllers.HoverController;
import away3d.core.base.SubGeometryBase;
import away3d.core.managers.Stage3DManager;
import away3d.core.managers.Stage3DProxy;
import away3d.core.render.GameRenderer;
import away3d.debug.AwayStats;
import away3d.events.Stage3DEvent;
import away3d.materials.lightpickers.StaticLightPicker;
import fkengine.animator.Animator;
import fkengine.animator.Animator2D;
import fkengine.events.EngineEvents;
import fkengine.events.IMaskClickEvent;
import fkengine.events.InputEvents;
import fkengine.game.Connection;
import fkengine.gui.Components.RadiusMask.RadiusMaskView;
import fkengine.gui.Measures;
import fkengine.main.AppMain;
import fkengine.message.MessageHandler;
import fkengine.message.MessageReceiver;
import fkengine.utils.Defines;
import fkengine.utils.Utils;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.display.Stage;
import flash.errors.IllegalOperationError;
import flash.events.Event;
import flash.events.KeyboardEvent;
import flash.events.TimerEvent;
import flash.geom.Point;
import flash.geom.Rectangle;
import flash.geom.Vector3D;
import flash.ui.Multitouch;
import flash.utils.Timer;
import flash.utils.getTimer;
import starling.animation.Tween;
import starling.core.Starling;
import starling.events.Event;
import starling.events.TouchEvent;
import starling.textures.Texture;

public class Engine implements MessageReceiver


{

private static var _frameSkipMechanismEnabled:Boolean;

public static var FPS_CALCULATOR_MECHANISM:Boolean = false;

public static var DESIRED_FPS_MECHANISM:Boolean = false;

public static var FRAMESKIP_MECHANISM_ENABLED:Boolean = false;


public static var FRAMESKIP_MECHANISM_BUFFER1:int = 32;

public static var FRAMESKIP_MECHANISM_BUFFER2:int = 4;

public static var FRAME_DISCARD_DIVIDER:int = 4;

private static var _instance:fkengine.core.Engine = null;

private static var _levelOfDetails:int;

private static var _pushedQuality:int = -1;

private var _frameSkipVector:Vector.<int>;

private var _frameTimeVector:Vector.<int>;

private var _meanFpsCount:Vector.<int>;

private var _numberOfFramesVector:Vector.<int>;

private var _currentFrameSkip:int = 0;

private var _frameSkip:int = 0;

public const DESIRED_FPS:Number = 16.666666666666668;

private var _view:Sprite;

private var _view3Ds:Vector.<View3D>;

private var _topView3Ds:Vector.<View3D>;

private var _stats3D:AwayStats;

private var _stage:Stage;

private var _rad:Number = 0;

private var _blackColor:Vector.<Number>;

private var _stage3DManager:Stage3DManager;

private var _stage3DProxy:Stage3DProxy;

private var _2d_front:Starling;

private var _2d_back:Starling;

private var _eventReceiver:EngineEvents;

private var _readyCount:int;

protected var _lightPicker:StaticLightPicker;

protected var _cameraController:HoverController;

private var _mouseIsDown:Boolean;


private var _lastPanAngle:Number;

private var _lastTiltAngle:Number;

private var _lastMouseX:Number;

private var _lastMouseY:Number;

private var _tiltIncrement:Number = 0;

private var _panIncrement:Number = 0;

private var _moon:ObjectContainer3D;

private var _lastFrameTime:int = 0;

private var _inputEventsReceiver:Vector.<InputEvents>;

private var _inputBeginPoint:Point;

private var _preloaderQueue:Vector.<fkengine.core.IPreloaderQueueItem>;

private var _preloadingCallback:fkengine.core.IPreloaderCallback;

private var _screenShotCallback:Boolean;

private var _backgrondColor:int;

private var _darkness:Number = 0;

private var _backgroundStartColor:uint;

private var _backgroundEndColor:uint;

private var _backgroundInterpolation:Number;

private var _callbacks:Vector.<Function>;

private var _animateBackground:Boolean;

private var _suspended:Boolean;

private var _starling2DText:Texture;

private var _tickers:Vector.<fkengine.core.IExpectedFrameTimer>;

private var _timer:Timer;

private var _timerPastTime:uint;

private var _frameDiscard:Number = 0;

private var _frameDrawCounter:Number = 0;

private var _test:int;

private var _previousFrameTime:int;


private var _requiredFpsAmount:int = 1;

private var _vecColor:Vector.<Number> = null;

private var _needsResetStage3D:Boolean;

public function Engine()


{
_frameSkipVector = new Vector.<int>();
_frameTimeVector = new Vector.<int>();
_meanFpsCount = new Vector.<int>();
_numberOfFramesVector = new Vector.<int>();
_view3Ds = new Vector.<View3D>();
_topView3Ds = new Vector.<View3D>();
_blackColor = new <Number>[0,0,0,0];
_inputBeginPoint = new Point();
_preloaderQueue = new Vector.<fkengine.core.IPreloaderQueueItem>();
_backgrondColor = Defines.BG_COLOR;
_callbacks = new Vector.<Function>();
_tickers = new Vector.<fkengine.core.IExpectedFrameTimer>();
super();
if(_instance)
{
throw new Error("Use getShared() instead");
}
_inputEventsReceiver = new Vector.<InputEvents>();
MessageHandler.listenToMessage(Defines.MESSAGE_WindowPause,this);
}

public static function getShared() : fkengine.core.Engine


{
_instance ||= new fkengine.core.Engine();
return _instance;
}

public static function set frameSkipMechanismEnabled(param1:Boolean) : void


{
_frameSkipMechanismEnabled = param1;
}

public static function pushQuality(param1:int, param2:Boolean) : void


{
_pushedQuality = param1;
if(param2)
{
Measures.pushDownsamplingEnabled();
}
else
{
Measures.pushDownsamplingDisabled();
}
}

public static function popQuality() : void


{
_pushedQuality = -1;
Measures.popDownsamplingEnabled();
}
public static function get levelOfDetails() : int
{
return 9;
}

public function get backgroundColor() : int


{
return _backgrondColor;
}

final public function get requiredFpsAmount2() : int


{
var _loc1_:int = this._requiredFpsAmount * _requiredFpsAmount;
if(_loc1_ > 4)
{
_loc1_ = 4;
}
return _loc1_;
}

final public function get requiredFpsAmount() : int


{
return _requiredFpsAmount;
}

public function set backgroundColor(param1:int) : void


{
_backgrondColor = param1;
_vecColor = null;
}

public function get darkness() : Number


{
return _darkness;
}

public function set darkness(param1:Number) : void


{
_backgrondColor = Utils.interpolateColor(328965,2302755,param1);
_vecColor = null;
}

public function setAntiAliasing(param1:int) : void


{
_stage3DProxy.antiAlias = param1;
_needsResetStage3D = true;
}

public function messageReceived(param1:Object, param2:int, param3:Object) :


void
{
if(param2 == Defines.MESSAGE_WindowPause)
{
_screenShotCallback = param3;
}
if(param2 == Defines.MESSAGE_AppSuspended)
{
_suspended = true;
}
if(param2 == Defines.MESSAGE_AppResumed)
{
if(_suspended)
{
_suspended = false;
_lastFrameTime = getTimer();
Animator2D.currentTimer = getTimer();
Animator.currentTimer = getTimer();
}
}
}

protected function onTimerTick(param1:TimerEvent) : void


{
if(_suspended)
{
_timerPastTime = -1;
return;
}
var _loc3_:uint = uint(getTimer() - _timerPastTime);
if(_timerPastTime == -1)
{
_timerPastTime = getTimer();
return;
}
_timerPastTime = getTimer();
if(_loc3_ < 17 * 1.2)
{
_loc3_ = 17;
}
for each(var _loc2_ in _tickers)
{
_loc2_.tick(_loc3_);
}
}

public function registerFrameTicker(param1:fkengine.core.IExpectedFrameTimer)


: void
{
_tickers.push(param1);
}

public function removeFrameTimer(param1:fkengine.core.IExpectedFrameTimer) :


void
{
var _loc2_:int = _tickers.indexOf(param1);
if(_loc2_ != -1)
{
_tickers.splice(_loc2_,1);
}
}

public function setLevelOfDetails(param1:int) : void


{
_levelOfDetails = param1;
}

public function get touchEnabled() : Boolean


{
return _2d_front.touchProcessor.enabled;
}

public function set touchEnabled(param1:Boolean) : void


{
_2d_front.touchProcessor.enabled = param1;
}

public function registerForInputEvents(param1:InputEvents) : void


{
if(_inputEventsReceiver.indexOf(param1) == -1)
{
_inputEventsReceiver.push(param1);
}
}

public function unregisterForInputEvents(param1:InputEvents) : void


{
if(_inputEventsReceiver.indexOf(param1) != -1)
{
_inputEventsReceiver.splice(_inputEventsReceiver.indexOf(param1),1);
}
}

public function init(param1:Stage, param2:EngineEvents) : void


{
this._view = new Sprite();
this._stage = param1;
this._eventReceiver = param2;
param1.addEventListener("keyDown",keyDown);
param1.addEventListener("keyUp",keyUp);
MessageHandler.listenToMessage(Defines.MESSAGE_AppSuspended,this);
MessageHandler.listenToMessage(Defines.MESSAGE_AppResumed,this);
initProxies();
}

protected function keyDown(param1:KeyboardEvent) : void


{
var _loc3_:InputEventType = new InputEventType();
_loc3_.keyCode = param1.keyCode;
for each(var _loc2_ in _inputEventsReceiver)
{
_loc2_.userInputDispatchEvent(3,_loc3_);
}
}

protected function keyUp(param1:KeyboardEvent) : void


{
var _loc3_:InputEventType = new InputEventType();
_loc3_.keyCode = param1.keyCode;
for each(var _loc2_ in _inputEventsReceiver)
{
_loc2_.userInputDispatchEvent(4,_loc3_);
}
}

public function get stage() : Stage


{
return _stage;
}

public function get stage3DProxy() : Stage3DProxy


{
return _stage3DProxy;
}

public function _mouseEvent(param1:TouchEvent) : void


{
}

public function objectRemoved(param1:starling.events.Event) : void


{
}

private function initProxies() : void


{
_stage3DManager = Stage3DManager.getInstance(_stage);
_stage3DProxy = _stage3DManager.getFreeStage3DProxy();
_stage3DProxy.addEventListener("Context3DCreated",onContextCreated);
var _loc1_:AppMain = AppMain;
_stage3DProxy.antiAlias = !!fkengine.main.AppMain._instance.isMobile ? 0 :
Utils.getCookieInt("msaa",2);
_stage3DProxy.color = 16777215;
Utils.setCurrentCirclePoints();
}

private function onContextCreated(param1:Stage3DEvent) : void


{
_stage3DProxy.addEventListener("enterFrame",renderFrame);
_stage3DProxy.context3D.enableErrorChecking = false;
if(_stage3DProxy.context3D.enableErrorChecking)
{
trace("!! WARNING :: STAGE3D DEBUG MODE !!");
}
else
{
trace("!! INFO :: STAGE3D STANDARD MODE !!");
}
initStarling();
}

private function initStarling() : void


{
var engine:fkengine.core.Engine;
var _loc7_:Boolean = true;
var _loc1_:Starling = Starling;
if(starling.core.Starling.sCurrent)
{
throw new flash.errors.IllegalOperationError("\'multitouchEnabled\'
must be set before Starling instance is created");
}
flash.ui.Multitouch.inputMode = _loc7_ ? "touchPoint" : "none";
var _loc2_:Measures = Measures;
var _loc3_:Measures = Measures;
_2d_back = new Starling(Layer2D,_stage,new
Rectangle(0,0,fkengine.gui.Measures._stageWidth,fkengine.gui.Measures._stageHeight)
,_stage3DProxy.stage3D,"auto","baselineConstrained",false);
var _loc4_:Measures = Measures;
var _loc5_:Measures = Measures;
_2d_front = new Starling(Layer2D,_stage,new
Rectangle(0,0,fkengine.gui.Measures._stageWidth,fkengine.gui.Measures._stageHeight)
,_stage3DProxy.stage3D);
engine = this;

_2d_front.addEventListener("rootCreated",function(param1:starling.events.Event):voi
d
{
RadiusMaskView.initProgram(_2d_front);
_eventReceiver.engineReady(engine);
});
_2d_back.start();
_2d_front.start();
}

public function enableDownsampleSmoothing() : void


{
}

public function
registerPreloadingCallback(param1:fkengine.core.IPreloaderCallback) : void
{
_preloadingCallback = param1;
}

public function maskClickArea(param1:Vector3D, param2:Number,


param3:IMaskClickEvent) : void
{
_2d_front.touchProcessor.maskClickArea(param1,param2,param3);
}

public function animateBackground(param1:uint, param2:Number, param3:Boolean


= false) : void
{
_animateBackground = animateBackground;
_backgroundStartColor = _backgrondColor;
_backgroundEndColor = param1;
_backgroundInterpolation = 0;
var _loc4_:Tween;
(_loc4_ = new
Tween(this,param2)).animate("backgroundColorInterpolation",1);
var _loc5_:Starling = Starling;
(!!starling.core.Starling.sCurrent ?
starling.core.Starling.sCurrent.juggler : null).add(_loc4_);
}

public function get backgroundColorInterpolation() : Number


{
return _backgroundInterpolation;
}

public function set backgroundColorInterpolation(param1:Number) : void


{
_backgroundInterpolation = param1;
_backgrondColor =
Utils.interpolateColor(_backgroundStartColor,_backgroundEndColor,param1);
_vecColor = null;
}
private function renderFrame(param1:flash.events.Event) : void
{
var _loc11_:View3D = null;
var _loc2_:PreloadingCompleteBroadcaster = null;
var _loc13_:int = 0;
var _loc12_:BitmapData = null;
var _loc7_:* = 0;
var _loc5_:int = 0;
if(_suspended)
{
return;
}
var _loc10_:int = getTimer();
Connection.processData();
Animator.currentTimer = _loc10_;
Animator2D.currentTimer = _loc10_;
var _loc9_:int = _lastFrameTime != 0 ? _loc10_ - _lastFrameTime : 0;
_lastFrameTime = _loc10_;
for each(_loc11_ in _view3Ds)
{
if(_loc11_.visible)
{
_loc11_.updateAnimationTime(Animator.currentTimer);
}
}
if(DESIRED_FPS_MECHANISM)
{
_frameDiscard += _loc9_;
_frameDrawCounter += _loc9_;
}
else
{
_frameDiscard = _frameDrawCounter = _loc9_;
}
var _loc4_:Number = Number(DESIRED_FPS_MECHANISM ? 16.666666666666668 :
_loc9_);
var _loc6_:int;
var _loc3_:* = _loc6_ = _frameDiscard == 0 ? 0 :
Math.round(_frameDiscard / _loc4_);
_frameDiscard -= _loc4_ * _loc6_;
if(_frameDiscard < 0)
{
_frameDiscard = 0;
}
Animator.update(_loc4_ * _loc6_);
Animator2D.update(_loc4_ * _loc6_);
for each(var _loc14_ in _callbacks)
{
_loc14_(_loc4_ * _loc6_);
}
if(DESIRED_FPS_MECHANISM && _loc6_ > 0)
{
if(_frameDiscard < _loc4_ / FRAME_DISCARD_DIVIDER)
{
_frameDiscard = 0;
}
if(FPS_CALCULATOR_MECHANISM == true && _frameSkipMechanismEnabled)
{
_meanFpsCount.push(_loc6_);
if(_meanFpsCount.length > FRAMESKIP_MECHANISM_BUFFER1)
{
_meanFpsCount.shift();
}
}
§§push(Math);
§§push(Math);
var _loc29_:Vector.<int>;
if((_loc29_ = _meanFpsCount).length == 0)
{
§§push(0);
}
else
{
var _loc31_:Number = 0;
for each(var _loc30_ in _loc29_)
{
_loc31_ += _loc30_;
}
§§push(_loc31_ / _loc29_.length);
}
_requiredFpsAmount = §§pop().max(§§pop().round(§§pop()),1);
}
if(DESIRED_FPS_MECHANISM == true && FRAMESKIP_MECHANISM_ENABLED == true &&
_frameSkipMechanismEnabled == true && _frameDrawCounter < Math.floor(_loc4_) *
(_frameSkip + 1))
{
return;
}
_frameDrawCounter = 0;
_loc11_ = null;
AnimatorBase.beginFrame();
if(_preloaderQueue.length || _preloadingCallback != null)
{
_stage3DProxy.context3D.clear(0,0,0,0);
SubGeometryBase.unsetCurrentGeometry(_stage3DProxy);
_stage3DProxy.context3D.clear(0,0,0,0);
_preloaderQueue.length = 0;
if(_preloadingCallback)
{
_loc2_ = new PreloadingCompleteBroadcaster(_preloadingCallback);
_preloadingCallback = null;
_loc2_ = null;
}
_loc13_ = 0;
while(_loc13_ < 8)
{
_stage3DProxy.context3D.setTextureAt(_loc13_,null);
_loc13_++;
}
_loc13_ = 0;
while(_loc13_ < 8)
{
_stage3DProxy.context3D.setVertexBufferAt(_loc13_,null);
_loc13_++;
}
}
var _loc15_:int = _backgrondColor;
var _loc8_:Vector.<Number>;
_vecColor = _loc8_ = !!_vecColor ? _vecColor :
Utils.hexColorToFloat(_loc15_);
if(_needsResetStage3D == true)
{
_needsResetStage3D = false;
_stage3DProxy.clear();
}
_stage3DProxy.context3D.clear(_loc8_[0],_loc8_[1],_loc8_[2],1);
_2d_back.nextFrame();
for each(_loc11_ in _view3Ds)
{
if(_loc11_.visible)
{
SubGeometryBase.unsetCurrentGeometry(_stage3DProxy);
_loc11_.render();
}
}
_2d_front.nextFrame();
if(_screenShotCallback)
{
var _loc24_:Measures = Measures;
var _loc25_:Measures = Measures;
_loc12_ = new
BitmapData(fkengine.gui.Measures._stageWidth,fkengine.gui.Measures._stageHeight);
_stage3DProxy.context3D.drawToBitmapData(_loc12_);
var _loc26_:AppMain = AppMain;
fkengine.main.AppMain._napp.screenshotReceived(_loc12_);
_screenShotCallback = false;
}
else
{
_stage3DProxy.present();
}
if(FRAMESKIP_MECHANISM_ENABLED == true && _frameSkipMechanismEnabled ==
true)
{
_loc7_ = _loc9_;
_frameTimeVector.push(_loc7_);
if(_frameTimeVector.length > FRAMESKIP_MECHANISM_BUFFER1)
{
_frameTimeVector.shift();
}
var _loc32_:Vector.<int>;
if((_loc32_ = _frameTimeVector).length == 0)
{
§§push(0);
}
else
{
var _loc34_:Number = 0;
for each(var _loc33_ in _loc32_)
{
_loc34_ += _loc33_;
}
§§push(_loc34_ / _loc32_.length);
}
_loc5_ = §§pop();
_frameSkipVector.push(_loc5_ <= 18 ? 0 : 1);
if(_frameSkipVector.length > FRAMESKIP_MECHANISM_BUFFER2)
{
_frameSkipVector.shift();
}
var _loc37_:int = 0;
var _loc36_:Vector.<int> = _frameSkipVector;
var _loc35_:int = 0;
var _loc38_:int = 0;
while(_loc38_ < _loc36_.length)
{
if(_loc36_[_loc38_] == _loc37_)
{
_loc35_++;
}
_loc38_++;
}
if(_loc35_ > FRAMESKIP_MECHANISM_BUFFER2 / 2)
{
_frameSkip = 0;
}
else
{
_frameSkip = 1;
}
}
}

private function sleep(param1:int) : void


{
var _loc2_:int = getTimer();
while(getTimer() - _loc2_ < param1)
{
}
}

final private function vectorCount(param1:Vector.<int>, param2:int) : int


{
var _loc4_:int = 0;
var _loc3_:int = 0;
_loc4_ = 0;
while(_loc4_ < param1.length)
{
if(param1[_loc4_] == param2)
{
_loc3_++;
}
_loc4_++;
}
return _loc3_;
}

final private function vectorMean(param1:Vector.<int>) : Number


{
if(param1.length == 0)
{
return 0;
}
var _loc3_:Number = 0;
for each(var _loc2_ in param1)
{
_loc3_ += _loc2_;
}
return _loc3_ / param1.length;
}

private function initScene() : void


{
}

public function dispose3DViewport(param1:View3D) : void


{
if(_topView3Ds.indexOf(param1) != -1)
{
_topView3Ds.splice(_view3Ds.indexOf(param1),1);
}
else
{
_view3Ds.splice(_view3Ds.indexOf(param1),1);
}
if(param1)
{
param1.dispose();
}
}

public function create3DViewport(param1:LensBase = null, param2:Boolean =


false) : View3D
{
if(!param1)
{
param1 = new OrthographicLens();
}
var _loc4_:Camera3D = new Camera3D(param1);
var _loc3_:View3D = new View3D(null,_loc4_,param2 == false ? new
GameRenderer() : null);
_loc3_.stage3DProxy = _stage3DProxy;
_loc3_.shareContext = true;
_view.addChild(_loc3_);
_loc3_.camera.lens.far = 5000;
_loc3_.camera.lens.near = 100;
_loc3_.camera.position = new Vector3D(0,0,-100);
if(param2)
{
_topView3Ds.push(_loc3_);
}
else
{
_view3Ds.push(_loc3_);
}
return _loc3_;
}

public function resize() : void


{
}

public function getGUILayer() : Layer2D


{
return this.getFrontLayer();
}

public function getBackLayer() : Layer2D


{
return _2d_back.root as Layer2D;
}

public function getFrontLayer() : Layer2D


{
return _2d_front.root as Layer2D;
}

public function restoreTouch() : void


{
return _2d_front.touchProcessor.restoreTouch();
}

public function dispose() : void


{
for each(var _loc1_ in _view3Ds)
{
_stats3D.unregisterView(_loc1_);
_loc1_.dispose();
}
_view3Ds = null;
_2d_front.stop();
_2d_front.dispose();
_2d_front = null;
_2d_back.dispose();
_2d_back = null;
}

public function getView() : Sprite


{
return _view;
}

public function queuePreloading(param1:fkengine.core.IPreloaderQueueItem) :


void
{
for each(var _loc2_ in _preloaderQueue)
{
if(_loc2_.preloaderEqualsTo(param1))
{
return;
}
}
_preloaderQueue.push(param1);
}

public function registerCallback(param1:Function) : void


{
if(_callbacks.indexOf(param1) == -1)
{
_callbacks.push(param1);
}
}
public function unregisterCallback(param1:Function) : void
{
var _loc2_:int = _callbacks.indexOf(param1);
if(_loc2_ != -1)
{
_callbacks.splice(_loc2_,1);
}
}
}
}

You might also like