diff --git a/asconfig.json b/asconfig.json index 1ff58f3..2098b2f 100644 --- a/asconfig.json +++ b/asconfig.json @@ -2,7 +2,8 @@ "config": "air", "compilerOptions": { "source-path": [ - "src" + "src", + "external/Alternativa3D/src" ], "library-path": [ "external/Alternativa3D/libs" diff --git a/src/TanksTestingTool.as b/src/TanksTestingTool.as index f32e5ef..04e473f 100644 --- a/src/TanksTestingTool.as +++ b/src/TanksTestingTool.as @@ -25,7 +25,7 @@ package import alternativa.tanks.game.entities.tank.graphics.materials.TankMaterial; import alternativa.tanks.game.entities.tank.graphics.materials.TankMaterial2; import alternativa.tanks.game.entities.tank.graphics.materials.TracksMaterial2; - import alternativa.tanks.game.entities.tank.graphics.materials.TreesMaterial; + import alternativa.engine3d.materials.StandardMaterial; import alternativa.tanks.game.subsystems.rendersystem.RenderSystem; import alternativa.utils.Properties; import flash.display.DisplayObject; @@ -42,7 +42,11 @@ package import platform.client.formats.a3d.osgi.Activator; import platform.clients.fp10.libraries.alternativaprotocol.Activator; import tankshudDemo.TanksHudDemo; + import alternativa.engine3d.alternativa3d; + // This is so this class can access fog mode settings on materials + use namespace alternativa3d; + [SWF(backgroundColor="#333333",frameRate="100",width="1024",height="768")] public class TanksTestingTool extends Sprite { @@ -81,13 +85,13 @@ package { switch(A3DUtils.getSupportedTextureFormat(this.stage3D.context3D)) { - case TextureFormat.DXT1: + case A3DUtils.DXT1: this.loadConfig("cfg.dxt1.xml"); break; - case TextureFormat.ETC1: + case A3DUtils.ETC1: this.loadConfig("cfg.etc1.xml"); break; - case TextureFormat.PVRTC: + case A3DUtils.PVRTC: this.loadConfig("cfg.pvrtc.xml"); } } @@ -108,12 +112,9 @@ package new ConsoleVarFloat("beam_fallof",170,0,180,this.onLightSettingsChange); new ConsoleVarFloat("beam_fallof",170,0,180,this.onLightSettingsChange); new ConsoleVarFloat("camera_smoothing",20,0,200,this.onControllerSettingsChange); - MapMaterial.fogMode = MapMaterial.DISABLED; - TreesMaterial.fogMode = TreesMaterial.DISABLED; + StandardMaterial.fogMode = StandardMaterial.DISABLED; TankMaterial.fogMode = TankMaterial.DISABLED; - TankMaterial2.fogMode = TankMaterial.DISABLED; GiShadowMaterial.fogMode = FogMode.DISABLED; - TracksMaterial2.fogMode = FogMode.DISABLED; } private function onControllerSettingsChange(param1:ConsoleVarFloat) : void diff --git a/src/alternativa/engine3d/alternativa3d.as b/src/alternativa/engine3d/alternativa3d.as deleted file mode 100644 index 5b95c81..0000000 --- a/src/alternativa/engine3d/alternativa3d.as +++ /dev/null @@ -1,5 +0,0 @@ -package alternativa.engine3d -{ - public namespace alternativa3d = "http://alternativaplatform.com/en/alternativa3d"; -} - diff --git a/src/alternativa/engine3d/animation/AnimationClip.as b/src/alternativa/engine3d/animation/AnimationClip.as deleted file mode 100644 index 7f5d442..0000000 --- a/src/alternativa/engine3d/animation/AnimationClip.as +++ /dev/null @@ -1,392 +0,0 @@ -package alternativa.engine3d.animation -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.animation.keys.Track; - import alternativa.engine3d.core.Object3D; - - use namespace alternativa3d; - - public class AnimationClip extends AnimationNode - { - alternativa3d var name_Kq:Array; - - public var name:String; - - public var loop:Boolean = true; - - public var length:Number = 0; - - public var animated:Boolean = true; - - private var name_qC:Number = 0; - - private var name_Iv:int = 0; - - private var name_cT:Vector. = new Vector.(); - - private var name_Ci:AnimationNotify; - - public function AnimationClip(name:String = null) - { - super(); - this.name = name; - } - - public function get objects() : Array - { - return this.name_Kq == null ? null : [].concat(this.name_Kq); - } - - public function set objects(value:Array) : void - { - this.updateObjects(this.name_Kq,alternativa3d::controller,value,alternativa3d::controller); - this.name_Kq = value == null ? null : [].concat(value); - } - - override alternativa3d function setController(value:AnimationController) : void - { - this.updateObjects(this.name_Kq,alternativa3d::controller,this.name_Kq,value); - this.alternativa3d::controller = value; - } - - private function addObject(object:Object) : void - { - if(this.name_Kq == null) - { - this.name_Kq = [object]; - } - else - { - this.name_Kq.push(object); - } - if(alternativa3d::controller != null) - { - alternativa3d::controller.alternativa3d::addObject(object); - } - } - - private function updateObjects(oldObjects:Array, oldController:AnimationController, newObjects:Array, newController:AnimationController) : void - { - var i:int = 0; - var count:int = 0; - if(oldController != null && oldObjects != null) - { - for(i = 0,count = int(this.name_Kq.length); i < count; i++) - { - oldController.alternativa3d::removeObject(oldObjects[i]); - } - } - if(newController != null && newObjects != null) - { - for(i = 0,count = int(newObjects.length); i < count; i++) - { - newController.alternativa3d::addObject(newObjects[i]); - } - } - } - - public function updateLength() : void - { - var track:Track = null; - var len:Number = NaN; - for(var i:int = 0; i < this.name_Iv; ) - { - track = this.name_cT[i]; - len = track.length; - if(len > this.length) - { - this.length = len; - } - i++; - } - } - - public function addTrack(track:Track) : Track - { - if(track == null) - { - throw new Error("Track can not be null"); - } - var _loc2_:* = this.name_Iv++; - this.name_cT[_loc2_] = track; - if(track.length > this.length) - { - this.length = track.length; - } - return track; - } - - public function removeTrack(track:Track) : Track - { - var t:Track = null; - var index:int = int(this.name_cT.indexOf(track)); - if(index < 0) - { - throw new ArgumentError("Track not found"); - } - --this.name_Iv; - for(var j:int = index + 1; index < this.name_Iv; ) - { - this.name_cT[index] = this.name_cT[j]; - index++; - j++; - } - this.name_cT.length = this.name_Iv; - this.length = 0; - for(var i:int = 0; i < this.name_Iv; ) - { - t = this.name_cT[i]; - if(t.length > this.length) - { - this.length = t.length; - } - i++; - } - return track; - } - - public function getTrackAt(index:int) : Track - { - return this.name_cT[index]; - } - - public function get numTracks() : int - { - return this.name_Iv; - } - - override alternativa3d function update(interval:Number, weight:Number) : void - { - var i:int = 0; - var track:Track = null; - var state:AnimationState = null; - var oldTime:Number = this.name_qC; - if(this.animated) - { - this.name_qC += interval * speed; - if(this.loop) - { - if(this.name_qC < 0) - { - this.name_qC = 0; - } - else if(this.name_qC >= this.length) - { - this.alternativa3d::collectNotifiers(oldTime,this.length); - this.name_qC = this.length <= 0 ? 0 : this.name_qC % this.length; - this.alternativa3d::collectNotifiers(0,this.name_qC); - } - else - { - this.alternativa3d::collectNotifiers(oldTime,this.name_qC); - } - } - else - { - if(this.name_qC < 0) - { - this.name_qC = 0; - } - else if(this.name_qC >= this.length) - { - this.name_qC = this.length; - } - this.alternativa3d::collectNotifiers(oldTime,this.name_qC); - } - } - if(weight > 0) - { - for(i = 0; i < this.name_Iv; ) - { - track = this.name_cT[i]; - if(track.object != null) - { - state = alternativa3d::controller.alternativa3d::getState(track.object); - if(state != null) - { - track.alternativa3d::blend(this.name_qC,weight,state); - } - } - i++; - } - } - } - - public function get time() : Number - { - return this.name_qC; - } - - public function set time(value:Number) : void - { - this.name_qC = value; - } - - public function get normalizedTime() : Number - { - return this.length == 0 ? 0 : this.name_qC / this.length; - } - - public function set normalizedTime(value:Number) : void - { - this.name_qC = value * this.length; - } - - private function getNumChildren(object:Object) : int - { - if(object is Object3D) - { - return Object3D(object).numChildren; - } - return 0; - } - - private function getChildAt(object:Object, index:int) : Object - { - if(object is Object3D) - { - return Object3D(object).getChildAt(index); - } - return null; - } - - private function addChildren(object:Object) : void - { - var child:Object = null; - for(var i:int = 0, numChildren:int = this.getNumChildren(object); i < numChildren; i++) - { - child = this.getChildAt(object,i); - this.addObject(child); - this.addChildren(child); - } - } - - public function attach(object:Object, includeDescendants:Boolean) : void - { - this.updateObjects(this.name_Kq,alternativa3d::controller,null,alternativa3d::controller); - this.name_Kq = null; - this.addObject(object); - if(includeDescendants) - { - this.addChildren(object); - } - } - - alternativa3d function collectNotifiers(start:Number, end:Number) : void - { - for(var notify:AnimationNotify = this.name_Ci; notify != null; ) - { - if(notify.name_qC > start) - { - if(notify.name_qC > end) - { - notify = notify.alternativa3d::next; - continue; - } - notify.name_XY = alternativa3d::controller.alternativa3d::nearestNotifyers; - alternativa3d::controller.alternativa3d::nearestNotifyers = notify; - } - notify = notify.alternativa3d::next; - } - } - - public function addNotify(time:Number, name:String = null) : AnimationNotify - { - var _loc4_:AnimationNotify = null; - time = time <= 0 ? 0 : (time >= this.length ? this.length : time); - var notify:AnimationNotify = new AnimationNotify(name); - notify.name_qC = time; - if(this.name_Ci == null) - { - this.name_Ci = notify; - return notify; - } - if(this.name_Ci.name_qC > time) - { - notify.alternativa3d::next = this.name_Ci; - this.name_Ci = notify; - return notify; - } - _loc4_ = this.name_Ci; - while(_loc4_.alternativa3d::next != null && _loc4_.alternativa3d::next.name_qC <= time) - { - _loc4_ = _loc4_.alternativa3d::next; - } - if(_loc4_.alternativa3d::next == null) - { - _loc4_.alternativa3d::next = notify; - } - else - { - notify.alternativa3d::next = _loc4_.alternativa3d::next; - _loc4_.alternativa3d::next = notify; - } - return notify; - } - - public function addNotifyAtEnd(offsetFromEnd:Number = 0, name:String = null) : AnimationNotify - { - return this.addNotify(this.length - offsetFromEnd,name); - } - - public function removeNotify(notify:AnimationNotify) : AnimationNotify - { - var n:AnimationNotify = null; - if(this.name_Ci != null) - { - if(this.name_Ci == notify) - { - this.name_Ci = this.name_Ci.alternativa3d::next; - return notify; - } - n = this.name_Ci; - while(n.alternativa3d::next != null && n.alternativa3d::next != notify) - { - n = n.alternativa3d::next; - } - if(n.alternativa3d::next == notify) - { - n.alternativa3d::next = notify.alternativa3d::next; - return notify; - } - } - throw new Error("Notify not found"); - } - - public function get notifiers() : Vector. - { - var result:Vector. = new Vector.(); - var i:int = 0; - for(var notify:AnimationNotify = this.name_Ci; notify != null; notify = notify.alternativa3d::next) - { - result[i] = notify; - i++; - } - return result; - } - - public function slice(start:Number, end:Number = 1.7976931348623157e+308) : AnimationClip - { - var sliced:AnimationClip = new AnimationClip(this.name); - sliced.name_Kq = this.name_Kq == null ? null : [].concat(this.name_Kq); - for(var i:int = 0; i < this.name_Iv; i++) - { - sliced.addTrack(this.name_cT[i].slice(start,end)); - } - return sliced; - } - - public function clone() : AnimationClip - { - var cloned:AnimationClip = new AnimationClip(this.name); - cloned.name_Kq = this.name_Kq == null ? null : [].concat(this.name_Kq); - for(var i:int = 0; i < this.name_Iv; i++) - { - cloned.addTrack(this.name_cT[i]); - } - cloned.length = this.length; - return cloned; - } - } -} - diff --git a/src/alternativa/engine3d/animation/AnimationController.as b/src/alternativa/engine3d/animation/AnimationController.as deleted file mode 100644 index ae4b683..0000000 --- a/src/alternativa/engine3d/animation/AnimationController.as +++ /dev/null @@ -1,182 +0,0 @@ -package alternativa.engine3d.animation -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.animation.events.NotifyEvent; - import alternativa.engine3d.core.Object3D; - import flash.utils.Dictionary; - import flash.utils.getTimer; - - use namespace alternativa3d; - - public class AnimationController - { - private var name_cn:AnimationNode; - - private var name_Kq:Vector.; - - private var name_62:Vector. = new Vector.(); - - private var name_oX:Dictionary = new Dictionary(); - - private var name_eB:Object = new Object(); - - private var name_Jl:int = -1; - - alternativa3d var nearestNotifyers:AnimationNotify; - - public function AnimationController() - { - super(); - } - - public function get root() : AnimationNode - { - return this.name_cn; - } - - public function set root(value:AnimationNode) : void - { - if(this.name_cn != value) - { - if(this.name_cn != null) - { - this.name_cn.alternativa3d::setController(null); - this.name_cn.name_Eo = false; - } - if(value != null) - { - value.alternativa3d::setController(this); - value.name_Eo = true; - } - this.name_cn = value; - } - } - - public function update() : void - { - var interval:Number = NaN; - var data:AnimationState = null; - var i:int = 0; - var count:int = 0; - var _loc6_:int = 0; - var object:Object3D = null; - if(this.name_Jl < 0) - { - this.name_Jl = getTimer(); - interval = 0; - } - else - { - _loc6_ = int(getTimer()); - interval = 0.001 * (_loc6_ - this.name_Jl); - this.name_Jl = _loc6_; - } - if(this.name_cn == null) - { - return; - } - for each(data in this.name_eB) - { - data.reset(); - } - this.name_cn.alternativa3d::update(interval,1); - for(i = 0,count = int(this.name_62.length); i < count; ) - { - object = this.name_62[i]; - data = this.name_eB[object.name]; - if(data != null) - { - data.apply(object); - } - i++; - } - for(var notify:AnimationNotify = this.alternativa3d::nearestNotifyers; notify != null; ) - { - if(notify.willTrigger(NotifyEvent.NOTIFY)) - { - notify.dispatchEvent(new NotifyEvent(notify)); - } - notify = notify.name_XY; - } - this.alternativa3d::nearestNotifyers = null; - } - - alternativa3d function addObject(object:Object) : void - { - if(object in this.name_oX) - { - this.name_oX[object]++; - } - else - { - if(object is Object3D) - { - this.name_62.push(object); - } - else - { - this.name_Kq.push(object); - } - this.name_oX[object] = 1; - } - } - - alternativa3d function removeObject(object:Object) : void - { - var index:int = 0; - var j:int = 0; - var count:int = 0; - var used:int = int(this.name_oX[object]); - used--; - if(used <= 0) - { - if(object is Object3D) - { - index = int(this.name_62.indexOf(object as Object3D)); - count = this.name_62.length - 1; - for(j = index + 1; index < count; ) - { - this.name_62[index] = this.name_62[j]; - index++; - j++; - } - this.name_62.length = count; - } - else - { - index = int(this.name_Kq.indexOf(object)); - count = this.name_Kq.length - 1; - for(j = index + 1; index < count; ) - { - this.name_Kq[index] = this.name_Kq[j]; - index++; - j++; - } - this.name_Kq.length = count; - } - delete this.name_oX[object]; - } - else - { - this.name_oX[object] = used; - } - } - - alternativa3d function getState(name:String) : AnimationState - { - var state:AnimationState = this.name_eB[name]; - if(state == null) - { - state = new AnimationState(); - this.name_eB[name] = state; - } - return state; - } - - public function freeze() : void - { - this.name_Jl = -1; - } - } -} - diff --git a/src/alternativa/engine3d/animation/AnimationNode.as b/src/alternativa/engine3d/animation/AnimationNode.as deleted file mode 100644 index 74a5a00..0000000 --- a/src/alternativa/engine3d/animation/AnimationNode.as +++ /dev/null @@ -1,59 +0,0 @@ -package alternativa.engine3d.animation -{ - import alternativa.engine3d.alternativa3d; - - use namespace alternativa3d; - - public class AnimationNode - { - alternativa3d var name_Eo:Boolean = false; - - alternativa3d var _parent:AnimationNode; - - alternativa3d var controller:AnimationController; - - public var speed:Number = 1; - - public function AnimationNode() - { - super(); - } - - public function get isActive() : Boolean - { - return this.name_Eo && this.alternativa3d::controller != null; - } - - public function get parent() : AnimationNode - { - return this.alternativa3d::_parent; - } - - alternativa3d function update(elapsed:Number, weight:Number) : void - { - } - - alternativa3d function setController(value:AnimationController) : void - { - this.alternativa3d::controller = value; - } - - alternativa3d function addNode(node:AnimationNode) : void - { - if(node.alternativa3d::_parent != null) - { - node.alternativa3d::_parent.alternativa3d::removeNode(node); - } - node.alternativa3d::_parent = this; - node.alternativa3d::setController(this.alternativa3d::controller); - } - - alternativa3d function removeNode(node:AnimationNode) : void - { - node.alternativa3d::setController(null); - node.name_Eo = false; - node.alternativa3d::_parent = null; - } - } -} - diff --git a/src/alternativa/engine3d/animation/AnimationNotify.as b/src/alternativa/engine3d/animation/AnimationNotify.as deleted file mode 100644 index 25cb855..0000000 --- a/src/alternativa/engine3d/animation/AnimationNotify.as +++ /dev/null @@ -1,32 +0,0 @@ -package alternativa.engine3d.animation -{ - import alternativa.engine3d.alternativa3d; - import flash.events.EventDispatcher; - - use namespace alternativa3d; - - public class AnimationNotify extends EventDispatcher - { - public var name:String; - - alternativa3d var name_qC:Number = 0; - - alternativa3d var next:AnimationNotify; - - alternativa3d var name_1n:Number; - - alternativa3d var name_XY:AnimationNotify; - - public function AnimationNotify(name:String) - { - super(); - this.name = name; - } - - public function get time() : Number - { - return this.name_qC; - } - } -} - diff --git a/src/alternativa/engine3d/animation/AnimationState.as b/src/alternativa/engine3d/animation/AnimationState.as deleted file mode 100644 index 222324c..0000000 --- a/src/alternativa/engine3d/animation/AnimationState.as +++ /dev/null @@ -1,272 +0,0 @@ -package alternativa.engine3d.animation -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.animation.keys.TransformKey; - import alternativa.engine3d.core.Object3D; - import flash.geom.Vector3D; - - use namespace alternativa3d; - - public class AnimationState - { - public var name_6V:int = 0; - - public var transform:TransformKey = new TransformKey(); - - public var name_H1:Number = 0; - - public var numbers:Object = new Object(); - - public var name_NT:Object = new Object(); - - public function AnimationState() - { - super(); - } - - public function reset() : void - { - var key:String = null; - this.name_H1 = 0; - for(key in this.numbers) - { - delete this.numbers[key]; - delete this.name_NT[key]; - } - } - - public function addWeightedTransform(key:TransformKey, weight:Number) : void - { - this.name_H1 += weight; - this.transform.interpolate(this.transform,key,weight / this.name_H1); - } - - public function addWeightedNumber(property:String, value:Number, weight:Number) : void - { - var current:Number = NaN; - var sum:Number = Number(this.name_NT[property]); - if(sum == sum) - { - sum += weight; - weight /= sum; - current = Number(this.numbers[property]); - this.numbers[property] = (1 - weight) * current + weight * value; - this.name_NT[property] = sum; - } - else - { - this.numbers[property] = value; - this.name_NT[property] = weight; - } - } - - public function apply(object:Object3D) : void - { - var sum:Number = NaN; - var weight:Number = NaN; - var key:String = null; - if(this.name_H1 > 0) - { - object.x = this.transform.alternativa3d::x; - object.y = this.transform.alternativa3d::y; - object.z = this.transform.alternativa3d::z; - this.setEulerAngles(this.transform.alternativa3d::rotation,object); - object.scaleX = this.transform.alternativa3d::scaleX; - object.scaleY = this.transform.alternativa3d::scaleY; - object.scaleZ = this.transform.alternativa3d::scaleZ; - } - for(key in this.numbers) - { - switch(key) - { - case "x": - sum = Number(this.name_NT["x"]); - weight = sum / (sum + this.name_H1); - object.x = (1 - weight) * object.x + weight * this.numbers["x"]; - break; - case "y": - sum = Number(this.name_NT["y"]); - weight = sum / (sum + this.name_H1); - object.y = (1 - weight) * object.y + weight * this.numbers["y"]; - break; - case "z": - sum = Number(this.name_NT["z"]); - weight = sum / (sum + this.name_H1); - object.z = (1 - weight) * object.z + weight * this.numbers["z"]; - break; - case "rotationX": - sum = Number(this.name_NT["rotationX"]); - weight = sum / (sum + this.name_H1); - object.rotationX = (1 - weight) * object.rotationX + weight * this.numbers["rotationX"]; - break; - case "rotationY": - sum = Number(this.name_NT["rotationY"]); - weight = sum / (sum + this.name_H1); - object.rotationY = (1 - weight) * object.rotationY + weight * this.numbers["rotationY"]; - break; - case "rotationZ": - sum = Number(this.name_NT["rotationZ"]); - weight = sum / (sum + this.name_H1); - object.rotationZ = (1 - weight) * object.rotationZ + weight * this.numbers["rotationZ"]; - break; - case "scaleX": - sum = Number(this.name_NT["scaleX"]); - weight = sum / (sum + this.name_H1); - object.scaleX = (1 - weight) * object.scaleX + weight * this.numbers["scaleX"]; - break; - case "scaleY": - sum = Number(this.name_NT["scaleY"]); - weight = sum / (sum + this.name_H1); - object.scaleY = (1 - weight) * object.scaleY + weight * this.numbers["scaleY"]; - break; - case "scaleZ": - sum = Number(this.name_NT["scaleZ"]); - weight = sum / (sum + this.name_H1); - object.scaleZ = (1 - weight) * object.scaleZ + weight * this.numbers["scaleZ"]; - break; - default: - object[key] = this.numbers[key]; - break; - } - } - } - - public function applyObject(object:Object) : void - { - var sum:Number = NaN; - var weight:Number = NaN; - var key:String = null; - if(this.name_H1 > 0) - { - object.x = this.transform.alternativa3d::x; - object.y = this.transform.alternativa3d::y; - object.z = this.transform.alternativa3d::z; - this.setEulerAnglesObject(this.transform.alternativa3d::rotation,object); - object.scaleX = this.transform.alternativa3d::scaleX; - object.scaleY = this.transform.alternativa3d::scaleY; - object.scaleZ = this.transform.alternativa3d::scaleZ; - } - for(key in this.numbers) - { - switch(key) - { - case "x": - sum = Number(this.name_NT["x"]); - weight = sum / (sum + this.name_H1); - object.x = (1 - weight) * object.x + weight * this.numbers["x"]; - break; - case "y": - sum = Number(this.name_NT["y"]); - weight = sum / (sum + this.name_H1); - object.y = (1 - weight) * object.y + weight * this.numbers["y"]; - break; - case "z": - sum = Number(this.name_NT["z"]); - weight = sum / (sum + this.name_H1); - object.z = (1 - weight) * object.z + weight * this.numbers["z"]; - break; - case "rotationX": - sum = Number(this.name_NT["rotationX"]); - weight = sum / (sum + this.name_H1); - object.rotationX = (1 - weight) * object.rotationX + weight * this.numbers["rotationX"]; - break; - case "rotationY": - sum = Number(this.name_NT["rotationY"]); - weight = sum / (sum + this.name_H1); - object.rotationY = (1 - weight) * object.rotationY + weight * this.numbers["rotationY"]; - break; - case "rotationZ": - sum = Number(this.name_NT["rotationZ"]); - weight = sum / (sum + this.name_H1); - object.rotationZ = (1 - weight) * object.rotationZ + weight * this.numbers["rotationZ"]; - break; - case "scaleX": - sum = Number(this.name_NT["scaleX"]); - weight = sum / (sum + this.name_H1); - object.scaleX = (1 - weight) * object.scaleX + weight * this.numbers["scaleX"]; - break; - case "scaleY": - sum = Number(this.name_NT["scaleY"]); - weight = sum / (sum + this.name_H1); - object.scaleY = (1 - weight) * object.scaleY + weight * this.numbers["scaleY"]; - break; - case "scaleZ": - sum = Number(this.name_NT["scaleZ"]); - weight = sum / (sum + this.name_H1); - object.scaleZ = (1 - weight) * object.scaleZ + weight * this.numbers["scaleZ"]; - break; - default: - object[key] = this.numbers[key]; - break; - } - } - } - - private function setEulerAngles(quat:Vector3D, object:Object3D) : void - { - var qi2:Number = 2 * quat.x * quat.x; - var qj2:Number = 2 * quat.y * quat.y; - var qk2:Number = 2 * quat.z * quat.z; - var qij:Number = 2 * quat.x * quat.y; - var qjk:Number = 2 * quat.y * quat.z; - var qki:Number = 2 * quat.z * quat.x; - var qri:Number = 2 * quat.w * quat.x; - var qrj:Number = 2 * quat.w * quat.y; - var qrk:Number = 2 * quat.w * quat.z; - var aa:Number = 1 - qj2 - qk2; - var bb:Number = qij - qrk; - var ee:Number = qij + qrk; - var ff:Number = 1 - qi2 - qk2; - var ii:Number = qki - qrj; - var jj:Number = qjk + qri; - var kk:Number = 1 - qi2 - qj2; - if(-1 < ii && ii < 1) - { - object.rotationX = Math.atan2(jj,kk); - object.rotationY = -Math.asin(ii); - object.rotationZ = Math.atan2(ee,aa); - } - else - { - object.rotationX = 0; - object.rotationY = ii <= -1 ? Number(Math.PI) : -Math.PI; - object.rotationY *= 0.5; - object.rotationZ = Math.atan2(-bb,ff); - } - } - - private function setEulerAnglesObject(quat:Vector3D, object:Object) : void - { - var qi2:Number = 2 * quat.x * quat.x; - var qj2:Number = 2 * quat.y * quat.y; - var qk2:Number = 2 * quat.z * quat.z; - var qij:Number = 2 * quat.x * quat.y; - var qjk:Number = 2 * quat.y * quat.z; - var qki:Number = 2 * quat.z * quat.x; - var qri:Number = 2 * quat.w * quat.x; - var qrj:Number = 2 * quat.w * quat.y; - var qrk:Number = 2 * quat.w * quat.z; - var aa:Number = 1 - qj2 - qk2; - var bb:Number = qij - qrk; - var ee:Number = qij + qrk; - var ff:Number = 1 - qi2 - qk2; - var ii:Number = qki - qrj; - var jj:Number = qjk + qri; - var kk:Number = 1 - qi2 - qj2; - if(-1 < ii && ii < 1) - { - object.rotationX = Math.atan2(jj,kk); - object.rotationY = -Math.asin(ii); - object.rotationZ = Math.atan2(ee,aa); - } - else - { - object.rotationX = 0; - object.rotationY = ii <= -1 ? Math.PI : -Math.PI; - object.rotationY *= 0.5; - object.rotationZ = Math.atan2(-bb,ff); - } - } - } -} - diff --git a/src/alternativa/engine3d/animation/events/NotifyEvent.as b/src/alternativa/engine3d/animation/events/NotifyEvent.as deleted file mode 100644 index 571da87..0000000 --- a/src/alternativa/engine3d/animation/events/NotifyEvent.as +++ /dev/null @@ -1,21 +0,0 @@ -package alternativa.engine3d.animation.events -{ - import alternativa.engine3d.animation.AnimationNotify; - import flash.events.Event; - - public class NotifyEvent extends Event - { - public static const NOTIFY:String = "notify"; - - public function NotifyEvent(notify:AnimationNotify) - { - super(NOTIFY); - } - - public function get notify() : AnimationNotify - { - return AnimationNotify(target); - } - } -} - diff --git a/src/alternativa/engine3d/animation/keys/Keyframe.as b/src/alternativa/engine3d/animation/keys/Keyframe.as deleted file mode 100644 index 33eda8b..0000000 --- a/src/alternativa/engine3d/animation/keys/Keyframe.as +++ /dev/null @@ -1,45 +0,0 @@ -package alternativa.engine3d.animation.keys -{ - import alternativa.engine3d.alternativa3d; - - use namespace alternativa3d; - - public class Keyframe - { - alternativa3d var name_qC:Number = 0; - - public function Keyframe() - { - super(); - } - - public function get time() : Number - { - return this.name_qC; - } - - public function get value() : Object - { - return null; - } - - public function set value(v:Object) : void - { - } - - alternativa3d function get nextKeyFrame() : Keyframe - { - return null; - } - - alternativa3d function set nextKeyFrame(value:Keyframe) : void - { - } - - public function toString() : String - { - return "[Keyframe time = " + this.name_qC.toFixed(2) + " value = " + this.value + "]"; - } - } -} - diff --git a/src/alternativa/engine3d/animation/keys/NumberKey.as b/src/alternativa/engine3d/animation/keys/NumberKey.as deleted file mode 100644 index 9df1b6f..0000000 --- a/src/alternativa/engine3d/animation/keys/NumberKey.as +++ /dev/null @@ -1,44 +0,0 @@ -package alternativa.engine3d.animation.keys -{ - import alternativa.engine3d.alternativa3d; - - use namespace alternativa3d; - - public class NumberKey extends Keyframe - { - alternativa3d var name_4O:Number = 0; - - alternativa3d var next:NumberKey; - - public function NumberKey() - { - super(); - } - - public function interpolate(a:NumberKey, b:NumberKey, c:Number) : void - { - this.name_4O = (1 - c) * a.name_4O + c * b.name_4O; - } - - override public function get value() : Object - { - return this.name_4O; - } - - override public function set value(v:Object) : void - { - this.name_4O = Number(v); - } - - override alternativa3d function get nextKeyFrame() : Keyframe - { - return this.alternativa3d::next; - } - - override alternativa3d function set nextKeyFrame(value:Keyframe) : void - { - this.alternativa3d::next = NumberKey(value); - } - } -} - diff --git a/src/alternativa/engine3d/animation/keys/NumberTrack.as b/src/alternativa/engine3d/animation/keys/NumberTrack.as deleted file mode 100644 index 721b660..0000000 --- a/src/alternativa/engine3d/animation/keys/NumberTrack.as +++ /dev/null @@ -1,91 +0,0 @@ -package alternativa.engine3d.animation.keys -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.animation.AnimationState; - - use namespace alternativa3d; - - public class NumberTrack extends Track - { - private static var temp:NumberKey = new NumberKey(); - - alternativa3d var name_ku:NumberKey; - - public var property:String; - - public function NumberTrack(object:String, property:String) - { - super(); - this.property = property; - this.object = object; - } - - override alternativa3d function get keyFramesList() : Keyframe - { - return this.name_ku; - } - - override alternativa3d function set keyFramesList(value:Keyframe) : void - { - this.name_ku = NumberKey(value); - } - - public function addKey(time:Number, value:Number = 0) : Keyframe - { - var key:NumberKey = new NumberKey(); - key.name_qC = time; - key.value = value; - alternativa3d::addKeyToList(key); - return key; - } - - override alternativa3d function blend(time:Number, weight:Number, state:AnimationState) : void - { - var prev:NumberKey = null; - if(this.property == null) - { - return; - } - var next:NumberKey = this.name_ku; - while(next != null && next.name_qC < time) - { - prev = next; - next = next.alternativa3d::next; - } - if(prev != null) - { - if(next != null) - { - temp.interpolate(prev,next,(time - prev.name_qC) / (next.name_qC - prev.name_qC)); - state.addWeightedNumber(this.property,temp.name_4O,weight); - } - else - { - state.addWeightedNumber(this.property,prev.name_4O,weight); - } - } - else if(next != null) - { - state.addWeightedNumber(this.property,next.name_4O,weight); - } - } - - override alternativa3d function createKeyFrame() : Keyframe - { - return new NumberKey(); - } - - override alternativa3d function interpolateKeyFrame(dest:Keyframe, a:Keyframe, b:Keyframe, value:Number) : void - { - NumberKey(dest).interpolate(NumberKey(a),NumberKey(b),value); - } - - override public function slice(start:Number, end:Number = 1.7976931348623157e+308) : Track - { - var track:NumberTrack = new NumberTrack(object,this.property); - alternativa3d::sliceImplementation(track,start,end); - return track; - } - } -} - diff --git a/src/alternativa/engine3d/animation/keys/Track.as b/src/alternativa/engine3d/animation/keys/Track.as deleted file mode 100644 index 14be297..0000000 --- a/src/alternativa/engine3d/animation/keys/Track.as +++ /dev/null @@ -1,193 +0,0 @@ -package alternativa.engine3d.animation.keys -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.animation.AnimationState; - - use namespace alternativa3d; - - public class Track - { - public var object:String; - - alternativa3d var name_YC:Number = 0; - - public function Track() - { - super(); - } - - public function get length() : Number - { - return this.name_YC; - } - - alternativa3d function get keyFramesList() : Keyframe - { - return null; - } - - alternativa3d function set keyFramesList(value:Keyframe) : void - { - } - - alternativa3d function addKeyToList(key:Keyframe) : void - { - var _loc3_:Keyframe = null; - var time:Number = key.name_qC; - if(this.alternativa3d::keyFramesList == null) - { - this.alternativa3d::keyFramesList = key; - this.name_YC = time <= 0 ? 0 : time; - return; - } - if(this.alternativa3d::keyFramesList.name_qC > time) - { - key.alternativa3d::nextKeyFrame = this.alternativa3d::keyFramesList; - this.alternativa3d::keyFramesList = key; - return; - } - _loc3_ = this.alternativa3d::keyFramesList; - while(_loc3_.alternativa3d::nextKeyFrame != null && _loc3_.alternativa3d::nextKeyFrame.name_qC <= time) - { - _loc3_ = _loc3_.alternativa3d::nextKeyFrame; - } - if(_loc3_.alternativa3d::nextKeyFrame == null) - { - _loc3_.alternativa3d::nextKeyFrame = key; - this.name_YC = time <= 0 ? 0 : time; - } - else - { - key.alternativa3d::nextKeyFrame = _loc3_.alternativa3d::nextKeyFrame; - _loc3_.alternativa3d::nextKeyFrame = key; - } - } - - public function removeKey(key:Keyframe) : Keyframe - { - var k:Keyframe = null; - if(this.alternativa3d::keyFramesList != null) - { - if(this.alternativa3d::keyFramesList == key) - { - this.alternativa3d::keyFramesList = this.alternativa3d::keyFramesList.alternativa3d::nextKeyFrame; - if(this.alternativa3d::keyFramesList == null) - { - this.name_YC = 0; - } - return key; - } - k = this.alternativa3d::keyFramesList; - while(k.alternativa3d::nextKeyFrame != null && k.alternativa3d::nextKeyFrame != key) - { - k = k.alternativa3d::nextKeyFrame; - } - if(k.alternativa3d::nextKeyFrame == key) - { - if(key.alternativa3d::nextKeyFrame == null) - { - this.name_YC = k.name_qC <= 0 ? 0 : k.name_qC; - } - k.alternativa3d::nextKeyFrame = key.alternativa3d::nextKeyFrame; - return key; - } - } - throw new Error("Key not found"); - } - - public function get keys() : Vector. - { - var result:Vector. = new Vector.(); - var i:int = 0; - for(var key:Keyframe = this.alternativa3d::keyFramesList; key != null; key = key.alternativa3d::nextKeyFrame) - { - result[i] = key; - i++; - } - return result; - } - - alternativa3d function blend(time:Number, weight:Number, state:AnimationState) : void - { - } - - public function slice(start:Number, end:Number = 1.7976931348623157e+308) : Track - { - return null; - } - - alternativa3d function createKeyFrame() : Keyframe - { - return null; - } - - alternativa3d function interpolateKeyFrame(dest:Keyframe, a:Keyframe, b:Keyframe, value:Number) : void - { - } - - alternativa3d function sliceImplementation(dest:Track, start:Number, end:Number) : void - { - var prev:Keyframe = null; - var nextKey:Keyframe = null; - var shiftTime:Number = start > 0 ? start : 0; - var next:Keyframe = this.alternativa3d::keyFramesList; - var key:Keyframe = this.alternativa3d::createKeyFrame(); - while(next != null && next.name_qC <= start) - { - prev = next; - next = next.alternativa3d::nextKeyFrame; - } - if(prev != null) - { - if(next != null) - { - this.alternativa3d::interpolateKeyFrame(key,prev,next,(start - prev.name_qC) / (next.name_qC - prev.name_qC)); - key.name_qC = start - shiftTime; - } - else - { - this.alternativa3d::interpolateKeyFrame(key,key,prev,1); - } - } - else - { - if(next == null) - { - return; - } - this.alternativa3d::interpolateKeyFrame(key,key,next,1); - key.name_qC = next.name_qC - shiftTime; - prev = next; - next = next.alternativa3d::nextKeyFrame; - } - dest.alternativa3d::keyFramesList = key; - if(next == null || end <= start) - { - dest.name_YC = key.name_qC <= 0 ? 0 : key.name_qC; - return; - } - while(next != null && next.name_qC <= end) - { - nextKey = this.alternativa3d::createKeyFrame(); - this.alternativa3d::interpolateKeyFrame(nextKey,nextKey,next,1); - nextKey.name_qC = next.name_qC - shiftTime; - key.alternativa3d::nextKeyFrame = nextKey; - key = nextKey; - prev = next; - next = next.alternativa3d::nextKeyFrame; - } - if(next != null) - { - nextKey = this.alternativa3d::createKeyFrame(); - this.alternativa3d::interpolateKeyFrame(nextKey,prev,next,(end - prev.name_qC) / (next.name_qC - prev.name_qC)); - nextKey.name_qC = end - shiftTime; - key.alternativa3d::nextKeyFrame = nextKey; - } - if(nextKey != null) - { - dest.name_YC = nextKey.name_qC <= 0 ? 0 : nextKey.name_qC; - } - } - } -} - diff --git a/src/alternativa/engine3d/animation/keys/TransformKey.as b/src/alternativa/engine3d/animation/keys/TransformKey.as deleted file mode 100644 index 8238772..0000000 --- a/src/alternativa/engine3d/animation/keys/TransformKey.as +++ /dev/null @@ -1,123 +0,0 @@ -package alternativa.engine3d.animation.keys -{ - import alternativa.engine3d.alternativa3d; - import flash.geom.Matrix3D; - import flash.geom.Orientation3D; - import flash.geom.Vector3D; - - use namespace alternativa3d; - - public class TransformKey extends Keyframe - { - alternativa3d var x:Number = 0; - - alternativa3d var y:Number = 0; - - alternativa3d var z:Number = 0; - - alternativa3d var rotation:Vector3D = new Vector3D(0,0,0,1); - - alternativa3d var scaleX:Number = 1; - - alternativa3d var scaleY:Number = 1; - - alternativa3d var scaleZ:Number = 1; - - alternativa3d var next:TransformKey; - - public function TransformKey() - { - super(); - } - - override public function get value() : Object - { - var m:Matrix3D = new Matrix3D(); - m.recompose(Vector.([new Vector3D(this.alternativa3d::x,this.alternativa3d::y,this.alternativa3d::z),this.alternativa3d::rotation,new Vector3D(this.alternativa3d::scaleX,this.alternativa3d::scaleY,this.alternativa3d::scaleZ)]),Orientation3D.QUATERNION); - return m; - } - - override public function set value(v:Object) : void - { - var m:Matrix3D = Matrix3D(v); - var components:Vector. = m.decompose(Orientation3D.QUATERNION); - this.alternativa3d::x = components[0].x; - this.alternativa3d::y = components[0].y; - this.alternativa3d::z = components[0].z; - this.alternativa3d::rotation = components[1]; - this.alternativa3d::scaleX = components[2].x; - this.alternativa3d::scaleY = components[2].y; - this.alternativa3d::scaleZ = components[2].z; - } - - public function interpolate(a:TransformKey, b:TransformKey, c:Number) : void - { - var c2:Number = 1 - c; - this.alternativa3d::x = c2 * a.alternativa3d::x + c * b.alternativa3d::x; - this.alternativa3d::y = c2 * a.alternativa3d::y + c * b.alternativa3d::y; - this.alternativa3d::z = c2 * a.alternativa3d::z + c * b.alternativa3d::z; - this.slerp(a.alternativa3d::rotation,b.alternativa3d::rotation,c,this.alternativa3d::rotation); - this.alternativa3d::scaleX = c2 * a.alternativa3d::scaleX + c * b.alternativa3d::scaleX; - this.alternativa3d::scaleY = c2 * a.alternativa3d::scaleY + c * b.alternativa3d::scaleY; - this.alternativa3d::scaleZ = c2 * a.alternativa3d::scaleZ + c * b.alternativa3d::scaleZ; - } - - private function slerp(a:Vector3D, b:Vector3D, t:Number, result:Vector3D) : void - { - var k1:Number = NaN; - var k2:Number = NaN; - var d:Number = NaN; - var _loc10_:Number = NaN; - var _loc11_:Number = NaN; - var _loc12_:Number = NaN; - var _loc13_:Number = NaN; - var flip:Number = 1; - var cosine:Number = a.w * b.w + a.x * b.x + a.y * b.y + a.z * b.z; - if(cosine < 0) - { - cosine = -cosine; - flip = -1; - } - if(1 - cosine < 0.001) - { - k1 = 1 - t; - k2 = t * flip; - result.w = a.w * k1 + b.w * k2; - result.x = a.x * k1 + b.x * k2; - result.y = a.y * k1 + b.y * k2; - result.z = a.z * k1 + b.z * k2; - d = result.w * result.w + result.x * result.x + result.y * result.y + result.z * result.z; - if(d == 0) - { - result.w = 1; - } - else - { - result.scaleBy(1 / Math.sqrt(d)); - } - } - else - { - _loc10_ = Number(Math.acos(cosine)); - _loc11_ = Number(Math.sin(_loc10_)); - _loc12_ = Math.sin((1 - t) * _loc10_) / _loc11_; - _loc13_ = Math.sin(t * _loc10_) / _loc11_ * flip; - result.w = a.w * _loc12_ + b.w * _loc13_; - result.x = a.x * _loc12_ + b.x * _loc13_; - result.y = a.y * _loc12_ + b.y * _loc13_; - result.z = a.z * _loc12_ + b.z * _loc13_; - } - } - - override alternativa3d function get nextKeyFrame() : Keyframe - { - return this.alternativa3d::next; - } - - override alternativa3d function set nextKeyFrame(value:Keyframe) : void - { - this.alternativa3d::next = TransformKey(value); - } - } -} - diff --git a/src/alternativa/engine3d/animation/keys/TransformTrack.as b/src/alternativa/engine3d/animation/keys/TransformTrack.as deleted file mode 100644 index ab85f28..0000000 --- a/src/alternativa/engine3d/animation/keys/TransformTrack.as +++ /dev/null @@ -1,163 +0,0 @@ -package alternativa.engine3d.animation.keys -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.animation.AnimationState; - import flash.geom.Matrix3D; - import flash.geom.Orientation3D; - import flash.geom.Vector3D; - - use namespace alternativa3d; - - public class TransformTrack extends Track - { - private static var tempQuat:Vector3D = new Vector3D(); - - private static var temp:TransformKey = new TransformKey(); - - private var name_ku:TransformKey; - - public function TransformTrack(object:String) - { - super(); - this.object = object; - } - - override alternativa3d function get keyFramesList() : Keyframe - { - return this.name_ku; - } - - override alternativa3d function set keyFramesList(value:Keyframe) : void - { - this.name_ku = TransformKey(value); - } - - public function addKey(time:Number, matrix:Matrix3D) : TransformKey - { - var key:TransformKey = null; - key = new TransformKey(); - key.name_qC = time; - var components:Vector. = matrix.decompose(Orientation3D.QUATERNION); - key.alternativa3d::x = components[0].x; - key.alternativa3d::y = components[0].y; - key.alternativa3d::z = components[0].z; - key.alternativa3d::rotation = components[1]; - key.alternativa3d::scaleX = components[2].x; - key.alternativa3d::scaleY = components[2].y; - key.alternativa3d::scaleZ = components[2].z; - alternativa3d::addKeyToList(key); - return key; - } - - public function addKeyComponents(time:Number, x:Number = 0, y:Number = 0, z:Number = 0, rotationX:Number = 0, rotationY:Number = 0, rotationZ:Number = 0, scaleX:Number = 1, scaleY:Number = 1, scaleZ:Number = 1) : TransformKey - { - var key:TransformKey = new TransformKey(); - key.name_qC = time; - key.alternativa3d::x = x; - key.alternativa3d::y = y; - key.alternativa3d::z = z; - key.alternativa3d::rotation = this.createQuatFromEuler(rotationX,rotationY,rotationZ); - key.alternativa3d::scaleX = scaleX; - key.alternativa3d::scaleY = scaleY; - key.alternativa3d::scaleZ = scaleZ; - alternativa3d::addKeyToList(key); - return key; - } - - private function appendQuat(quat:Vector3D, additive:Vector3D) : void - { - var ww:Number = additive.w * quat.w - additive.x * quat.x - additive.y * quat.y - additive.z * quat.z; - var xx:Number = additive.w * quat.x + additive.x * quat.w + additive.y * quat.z - additive.z * quat.y; - var yy:Number = additive.w * quat.y + additive.y * quat.w + additive.z * quat.x - additive.x * quat.z; - var zz:Number = additive.w * quat.z + additive.z * quat.w + additive.x * quat.y - additive.y * quat.x; - quat.w = ww; - quat.x = xx; - quat.y = yy; - quat.z = zz; - } - - private function normalizeQuat(quat:Vector3D) : void - { - var d:Number = quat.w * quat.w + quat.x * quat.x + quat.y * quat.y + quat.z * quat.z; - if(d == 0) - { - quat.w = 1; - } - else - { - d = 1 / Math.sqrt(d); - quat.w *= d; - quat.x *= d; - quat.y *= d; - quat.z *= d; - } - } - - private function setQuatFromAxisAngle(quat:Vector3D, x:Number, y:Number, z:Number, angle:Number) : void - { - quat.w = Math.cos(0.5 * angle); - var k:Number = Math.sin(0.5 * angle) / Math.sqrt(x * x + y * y + z * z); - quat.x = x * k; - quat.y = y * k; - quat.z = z * k; - } - - private function createQuatFromEuler(x:Number, y:Number, z:Number) : Vector3D - { - var result:Vector3D = new Vector3D(); - this.setQuatFromAxisAngle(result,1,0,0,x); - this.setQuatFromAxisAngle(tempQuat,0,1,0,y); - this.appendQuat(result,tempQuat); - this.normalizeQuat(result); - this.setQuatFromAxisAngle(tempQuat,0,0,1,z); - this.appendQuat(result,tempQuat); - this.normalizeQuat(result); - return result; - } - - override alternativa3d function blend(time:Number, weight:Number, state:AnimationState) : void - { - var prev:TransformKey = null; - var next:TransformKey = this.name_ku; - while(next != null && next.name_qC < time) - { - prev = next; - next = next.alternativa3d::next; - } - if(prev != null) - { - if(next != null) - { - temp.interpolate(prev,next,(time - prev.name_qC) / (next.name_qC - prev.name_qC)); - state.addWeightedTransform(temp,weight); - } - else - { - state.addWeightedTransform(prev,weight); - } - } - else if(next != null) - { - state.addWeightedTransform(next,weight); - } - } - - override alternativa3d function createKeyFrame() : Keyframe - { - return new TransformKey(); - } - - override alternativa3d function interpolateKeyFrame(dest:Keyframe, a:Keyframe, b:Keyframe, value:Number) : void - { - TransformKey(dest).interpolate(TransformKey(a),TransformKey(b),value); - } - - override public function slice(start:Number, end:Number = 1.7976931348623157e+308) : Track - { - var track:TransformTrack = new TransformTrack(object); - alternativa3d::sliceImplementation(track,start,end); - return track; - } - } -} - diff --git a/src/alternativa/engine3d/collisions/EllipsoidCollider.as b/src/alternativa/engine3d/collisions/EllipsoidCollider.as deleted file mode 100644 index 9072c2d..0000000 --- a/src/alternativa/engine3d/collisions/EllipsoidCollider.as +++ /dev/null @@ -1,679 +0,0 @@ -package alternativa.engine3d.collisions -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.*; - import alternativa.engine3d.resources.Geometry; - import flash.geom.Vector3D; - import flash.utils.ByteArray; - import flash.utils.Dictionary; - - use namespace alternativa3d; - - public class EllipsoidCollider - { - public var radiusX:Number; - - public var radiusY:Number; - - public var radiusZ:Number; - - public var threshold:Number = 0.001; - - private var matrix:Transform3D = new Transform3D(); - - private var name_jX:Transform3D = new Transform3D(); - - alternativa3d var geometries:Vector. = new Vector.(); - - alternativa3d var name_QK:Vector. = new Vector.(); - - private var vertices:Vector. = new Vector.(); - - private var name_g0:Vector. = new Vector.(); - - private var indices:Vector. = new Vector.(); - - private var numTriangles:int; - - private var radius:Number; - - private var src:Vector3D = new Vector3D(); - - private var name_o5:Vector3D = new Vector3D(); - - private var dest:Vector3D = new Vector3D(); - - private var name_SE:Vector3D = new Vector3D(); - - private var name_pU:Vector3D = new Vector3D(); - - alternativa3d var sphere:Vector3D = new Vector3D(); - - private var name_SZ:Vector3D = new Vector3D(); - - private var name_1v:Vector3D = new Vector3D(); - - private var name_L9:Vector3D = new Vector3D(); - - private var name_8B:Vector3D = new Vector3D(); - - public function EllipsoidCollider(radiusX:Number, radiusY:Number, radiusZ:Number) - { - super(); - this.radiusX = radiusX; - this.radiusY = radiusY; - this.radiusZ = radiusZ; - } - - alternativa3d function calculateSphere(transform:Transform3D) : void - { - this.alternativa3d::sphere.x = transform.d; - this.alternativa3d::sphere.y = transform.h; - this.alternativa3d::sphere.z = transform.l; - var sax:Number = transform.a * this.name_SZ.x + transform.b * this.name_SZ.y + transform.c * this.name_SZ.z + transform.d; - var say:Number = transform.e * this.name_SZ.x + transform.f * this.name_SZ.y + transform.g * this.name_SZ.z + transform.h; - var saz:Number = transform.i * this.name_SZ.x + transform.j * this.name_SZ.y + transform.k * this.name_SZ.z + transform.l; - var sbx:Number = transform.a * this.name_1v.x + transform.b * this.name_1v.y + transform.c * this.name_1v.z + transform.d; - var sby:Number = transform.e * this.name_1v.x + transform.f * this.name_1v.y + transform.g * this.name_1v.z + transform.h; - var sbz:Number = transform.i * this.name_1v.x + transform.j * this.name_1v.y + transform.k * this.name_1v.z + transform.l; - var scx:Number = transform.a * this.name_L9.x + transform.b * this.name_L9.y + transform.c * this.name_L9.z + transform.d; - var scy:Number = transform.e * this.name_L9.x + transform.f * this.name_L9.y + transform.g * this.name_L9.z + transform.h; - var scz:Number = transform.i * this.name_L9.x + transform.j * this.name_L9.y + transform.k * this.name_L9.z + transform.l; - var sdx:Number = transform.a * this.name_8B.x + transform.b * this.name_8B.y + transform.c * this.name_8B.z + transform.d; - var sdy:Number = transform.e * this.name_8B.x + transform.f * this.name_8B.y + transform.g * this.name_8B.z + transform.h; - var sdz:Number = transform.i * this.name_8B.x + transform.j * this.name_8B.y + transform.k * this.name_8B.z + transform.l; - var dx:Number = sax - this.alternativa3d::sphere.x; - var dy:Number = say - this.alternativa3d::sphere.y; - var dz:Number = saz - this.alternativa3d::sphere.z; - this.alternativa3d::sphere.w = dx * dx + dy * dy + dz * dz; - dx = sbx - this.alternativa3d::sphere.x; - dy = sby - this.alternativa3d::sphere.y; - dz = sbz - this.alternativa3d::sphere.z; - var dxyz:Number = dx * dx + dy * dy + dz * dz; - if(dxyz > this.alternativa3d::sphere.w) - { - this.alternativa3d::sphere.w = dxyz; - } - dx = scx - this.alternativa3d::sphere.x; - dy = scy - this.alternativa3d::sphere.y; - dz = scz - this.alternativa3d::sphere.z; - dxyz = dx * dx + dy * dy + dz * dz; - if(dxyz > this.alternativa3d::sphere.w) - { - this.alternativa3d::sphere.w = dxyz; - } - dx = sdx - this.alternativa3d::sphere.x; - dy = sdy - this.alternativa3d::sphere.y; - dz = sdz - this.alternativa3d::sphere.z; - dxyz = dx * dx + dy * dy + dz * dz; - if(dxyz > this.alternativa3d::sphere.w) - { - this.alternativa3d::sphere.w = dxyz; - } - this.alternativa3d::sphere.w = Math.sqrt(this.alternativa3d::sphere.w); - } - - private function prepare(source:Vector3D, displacement:Vector3D, object:Object3D, excludedObjects:Dictionary) : void - { - var j:int = 0; - var intersects:Boolean = false; - var geometry:Geometry = null; - var transform:Transform3D = null; - var geometryIndicesLength:int = 0; - var vBuffer:VertexStream = null; - var geometryIndices:Vector. = null; - var attributesOffset:int = 0; - var numMappings:int = 0; - var data:ByteArray = null; - var vx:Number = NaN; - var vy:Number = NaN; - var vz:Number = NaN; - var a:int = 0; - var index:int = 0; - var ax:Number = NaN; - var ay:Number = NaN; - var az:Number = NaN; - var b:int = 0; - var bx:Number = NaN; - var by:Number = NaN; - var bz:Number = NaN; - var c:int = 0; - var cx:Number = NaN; - var cy:Number = NaN; - var cz:Number = NaN; - var abx:Number = NaN; - var aby:Number = NaN; - var abz:Number = NaN; - var acx:Number = NaN; - var acy:Number = NaN; - var acz:Number = NaN; - var normalX:Number = NaN; - var normalY:Number = NaN; - var normalZ:Number = NaN; - var len:Number = NaN; - var offset:Number = NaN; - this.radius = this.radiusX; - if(this.radiusY > this.radius) - { - this.radius = this.radiusY; - } - if(this.radiusZ > this.radius) - { - this.radius = this.radiusZ; - } - this.matrix.compose(source.x,source.y,source.z,0,0,0,this.radiusX / this.radius,this.radiusY / this.radius,this.radiusZ / this.radius); - this.name_jX.copy(this.matrix); - this.name_jX.invert(); - this.src.x = 0; - this.src.y = 0; - this.src.z = 0; - this.name_o5.x = this.name_jX.a * displacement.x + this.name_jX.b * displacement.y + this.name_jX.c * displacement.z; - this.name_o5.y = this.name_jX.e * displacement.x + this.name_jX.f * displacement.y + this.name_jX.g * displacement.z; - this.name_o5.z = this.name_jX.i * displacement.x + this.name_jX.j * displacement.y + this.name_jX.k * displacement.z; - this.dest.x = this.src.x + this.name_o5.x; - this.dest.y = this.src.y + this.name_o5.y; - this.dest.z = this.src.z + this.name_o5.z; - var rad:Number = this.radius + this.name_o5.length; - this.name_SZ.x = -rad; - this.name_SZ.y = -rad; - this.name_SZ.z = -rad; - this.name_1v.x = rad; - this.name_1v.y = -rad; - this.name_1v.z = -rad; - this.name_L9.x = rad; - this.name_L9.y = rad; - this.name_L9.z = -rad; - this.name_8B.x = -rad; - this.name_8B.y = rad; - this.name_8B.z = -rad; - if(excludedObjects == null || !excludedObjects[object]) - { - if(object.alternativa3d::transformChanged) - { - object.alternativa3d::composeTransforms(); - } - object.alternativa3d::globalToLocalTransform.combine(object.alternativa3d::inverseTransform,this.matrix); - intersects = true; - if(object.boundBox != null) - { - this.alternativa3d::calculateSphere(object.alternativa3d::globalToLocalTransform); - intersects = object.boundBox.alternativa3d::checkSphere(this.alternativa3d::sphere); - } - if(intersects) - { - object.alternativa3d::localToGlobalTransform.combine(this.name_jX,object.alternativa3d::transform); - object.alternativa3d::collectGeometry(this,excludedObjects); - } - if(object.alternativa3d::childrenList != null) - { - object.alternativa3d::collectChildrenGeometry(this,excludedObjects); - } - } - this.numTriangles = 0; - var indicesLength:int = 0; - var normalsLength:int = 0; - var mapOffset:int = 0; - var verticesLength:int = 0; - var geometriesLength:int = int(this.alternativa3d::geometries.length); - for(var i:int = 0; i < geometriesLength; i++) - { - geometry = this.alternativa3d::geometries[i]; - transform = this.name_QK[i]; - geometryIndicesLength = int(geometry.alternativa3d::_indices.length); - if(!(geometry.alternativa3d::_numVertices == 0 || geometryIndicesLength == 0)) - { - vBuffer = VertexAttributes.POSITION < geometry.name_GM.length ? geometry.name_GM[VertexAttributes.POSITION] : null; - if(vBuffer != null) - { - attributesOffset = int(geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION]); - numMappings = int(vBuffer.attributes.length); - data = vBuffer.data; - for(j = 0; j < geometry.alternativa3d::_numVertices; j++) - { - data.position = 4 * (numMappings * j + attributesOffset); - vx = Number(data.readFloat()); - vy = Number(data.readFloat()); - vz = Number(data.readFloat()); - this.vertices[verticesLength] = transform.a * vx + transform.b * vy + transform.c * vz + transform.d; - verticesLength++; - this.vertices[verticesLength] = transform.e * vx + transform.f * vy + transform.g * vz + transform.h; - verticesLength++; - this.vertices[verticesLength] = transform.i * vx + transform.j * vy + transform.k * vz + transform.l; - verticesLength++; - } - } - geometryIndices = geometry.alternativa3d::_indices; - for(j = 0; j < geometryIndicesLength; ) - { - a = geometryIndices[j] + mapOffset; - j++; - index = a * 3; - ax = this.vertices[index]; - index++; - ay = this.vertices[index]; - index++; - az = this.vertices[index]; - b = geometryIndices[j] + mapOffset; - j++; - index = b * 3; - bx = this.vertices[index]; - index++; - by = this.vertices[index]; - index++; - bz = this.vertices[index]; - c = geometryIndices[j] + mapOffset; - j++; - index = c * 3; - cx = this.vertices[index]; - index++; - cy = this.vertices[index]; - index++; - cz = this.vertices[index]; - if(!(ax > rad && bx > rad && cx > rad || ax < -rad && bx < -rad && cx < -rad)) - { - if(!(ay > rad && by > rad && cy > rad || ay < -rad && by < -rad && cy < -rad)) - { - if(!(az > rad && bz > rad && cz > rad || az < -rad && bz < -rad && cz < -rad)) - { - abx = bx - ax; - aby = by - ay; - abz = bz - az; - acx = cx - ax; - acy = cy - ay; - acz = cz - az; - normalX = acz * aby - acy * abz; - normalY = acx * abz - acz * abx; - normalZ = acy * abx - acx * aby; - len = normalX * normalX + normalY * normalY + normalZ * normalZ; - if(len >= 0.001) - { - len = 1 / Math.sqrt(len); - normalX *= len; - normalY *= len; - normalZ *= len; - offset = ax * normalX + ay * normalY + az * normalZ; - if(!(offset > rad || offset < -rad)) - { - this.indices[indicesLength] = a; - indicesLength++; - this.indices[indicesLength] = b; - indicesLength++; - this.indices[indicesLength] = c; - indicesLength++; - this.name_g0[normalsLength] = normalX; - normalsLength++; - this.name_g0[normalsLength] = normalY; - normalsLength++; - this.name_g0[normalsLength] = normalZ; - normalsLength++; - this.name_g0[normalsLength] = offset; - normalsLength++; - ++this.numTriangles; - } - } - } - } - } - } - mapOffset += geometry.alternativa3d::_numVertices; - } - } - this.alternativa3d::geometries.length = 0; - this.name_QK.length = 0; - } - - public function calculateDestination(source:Vector3D, displacement:Vector3D, object:Object3D, excludedObjects:Dictionary = null) : Vector3D - { - var limit:int = 0; - var i:int = 0; - var offset:Number = NaN; - if(displacement.length <= this.threshold) - { - return source.clone(); - } - this.prepare(source,displacement,object,excludedObjects); - if(this.numTriangles > 0) - { - limit = 50; - for(i = 0; i < limit; ) - { - if(!this.checkCollision()) - { - break; - } - offset = this.radius + this.threshold + this.name_pU.w - this.dest.x * this.name_pU.x - this.dest.y * this.name_pU.y - this.dest.z * this.name_pU.z; - this.dest.x += this.name_pU.x * offset; - this.dest.y += this.name_pU.y * offset; - this.dest.z += this.name_pU.z * offset; - this.src.x = this.name_SE.x + this.name_pU.x * (this.radius + this.threshold); - this.src.y = this.name_SE.y + this.name_pU.y * (this.radius + this.threshold); - this.src.z = this.name_SE.z + this.name_pU.z * (this.radius + this.threshold); - this.name_o5.x = this.dest.x - this.src.x; - this.name_o5.y = this.dest.y - this.src.y; - this.name_o5.z = this.dest.z - this.src.z; - if(this.name_o5.length < this.threshold) - { - break; - } - i++; - } - return new Vector3D(this.matrix.a * this.dest.x + this.matrix.b * this.dest.y + this.matrix.c * this.dest.z + this.matrix.d,this.matrix.e * this.dest.x + this.matrix.f * this.dest.y + this.matrix.g * this.dest.z + this.matrix.h,this.matrix.i * this.dest.x + this.matrix.j * this.dest.y + this.matrix.k * this.dest.z + this.matrix.l); - } - return new Vector3D(source.x + displacement.x,source.y + displacement.y,source.z + displacement.z); - } - - public function getCollision(source:Vector3D, displacement:Vector3D, resCollisionPoint:Vector3D, resCollisionPlane:Vector3D, object:Object3D, excludedObjects:Dictionary = null) : Boolean - { - var abx:Number = NaN; - var aby:Number = NaN; - var abz:Number = NaN; - var acx:Number = NaN; - var acy:Number = NaN; - var acz:Number = NaN; - var abx2:Number = NaN; - var aby2:Number = NaN; - var abz2:Number = NaN; - var acx2:Number = NaN; - var acy2:Number = NaN; - var acz2:Number = NaN; - if(displacement.length <= this.threshold) - { - return false; - } - this.prepare(source,displacement,object,excludedObjects); - if(this.numTriangles > 0) - { - if(this.checkCollision()) - { - resCollisionPoint.x = this.matrix.a * this.name_SE.x + this.matrix.b * this.name_SE.y + this.matrix.c * this.name_SE.z + this.matrix.d; - resCollisionPoint.y = this.matrix.e * this.name_SE.x + this.matrix.f * this.name_SE.y + this.matrix.g * this.name_SE.z + this.matrix.h; - resCollisionPoint.z = this.matrix.i * this.name_SE.x + this.matrix.j * this.name_SE.y + this.matrix.k * this.name_SE.z + this.matrix.l; - if(this.name_pU.x < this.name_pU.y) - { - if(this.name_pU.x < this.name_pU.z) - { - abx = 0; - aby = -this.name_pU.z; - abz = Number(this.name_pU.y); - } - else - { - abx = -this.name_pU.y; - aby = Number(this.name_pU.x); - abz = 0; - } - } - else if(this.name_pU.y < this.name_pU.z) - { - abx = Number(this.name_pU.z); - aby = 0; - abz = -this.name_pU.x; - } - else - { - abx = -this.name_pU.y; - aby = Number(this.name_pU.x); - abz = 0; - } - acx = this.name_pU.z * aby - this.name_pU.y * abz; - acy = this.name_pU.x * abz - this.name_pU.z * abx; - acz = this.name_pU.y * abx - this.name_pU.x * aby; - abx2 = this.matrix.a * abx + this.matrix.b * aby + this.matrix.c * abz; - aby2 = this.matrix.e * abx + this.matrix.f * aby + this.matrix.g * abz; - abz2 = this.matrix.i * abx + this.matrix.j * aby + this.matrix.k * abz; - acx2 = this.matrix.a * acx + this.matrix.b * acy + this.matrix.c * acz; - acy2 = this.matrix.e * acx + this.matrix.f * acy + this.matrix.g * acz; - acz2 = this.matrix.i * acx + this.matrix.j * acy + this.matrix.k * acz; - resCollisionPlane.x = abz2 * acy2 - aby2 * acz2; - resCollisionPlane.y = abx2 * acz2 - abz2 * acx2; - resCollisionPlane.z = aby2 * acx2 - abx2 * acy2; - resCollisionPlane.normalize(); - resCollisionPlane.w = resCollisionPoint.x * resCollisionPlane.x + resCollisionPoint.y * resCollisionPlane.y + resCollisionPoint.z * resCollisionPlane.z; - return true; - } - return false; - } - return false; - } - - private function checkCollision() : Boolean - { - var index:int = 0; - var ax:Number = NaN; - var ay:Number = NaN; - var az:Number = NaN; - var bx:Number = NaN; - var by:Number = NaN; - var bz:Number = NaN; - var cx:Number = NaN; - var cy:Number = NaN; - var cz:Number = NaN; - var normalX:Number = NaN; - var normalY:Number = NaN; - var normalZ:Number = NaN; - var offset:Number = NaN; - var distance:Number = NaN; - var pointX:Number = NaN; - var pointY:Number = NaN; - var pointZ:Number = NaN; - var faceX:Number = NaN; - var faceY:Number = NaN; - var faceZ:Number = NaN; - var min:Number = NaN; - var inside:Boolean = false; - var k:int = 0; - var deltaX:Number = NaN; - var deltaY:Number = NaN; - var deltaZ:Number = NaN; - var _loc33_:Number = NaN; - var p1x:Number = NaN; - var p1y:Number = NaN; - var p1z:Number = NaN; - var p2x:Number = NaN; - var p2y:Number = NaN; - var p2z:Number = NaN; - var abx:Number = NaN; - var aby:Number = NaN; - var abz:Number = NaN; - var acx:Number = NaN; - var acy:Number = NaN; - var acz:Number = NaN; - var crx:Number = NaN; - var cry:Number = NaN; - var crz:Number = NaN; - var edgeLength:Number = NaN; - var edgeDistanceSqr:Number = NaN; - var acLen:Number = NaN; - var backX:Number = NaN; - var backY:Number = NaN; - var backZ:Number = NaN; - var deltaLength:Number = NaN; - var projectionLength:Number = NaN; - var projectionInsideLength:Number = NaN; - var time:Number = NaN; - var minTime:Number = 1; - var displacementLength:Number = Number(this.name_o5.length); - var indicesLength:int = this.numTriangles * 3; - for(var i:int = 0, j:int = 0; i < indicesLength; ) - { - index = this.indices[i] * 3; - i++; - ax = this.vertices[index]; - index++; - ay = this.vertices[index]; - index++; - az = this.vertices[index]; - index = this.indices[i] * 3; - i++; - bx = this.vertices[index]; - index++; - by = this.vertices[index]; - index++; - bz = this.vertices[index]; - index = this.indices[i] * 3; - i++; - cx = this.vertices[index]; - index++; - cy = this.vertices[index]; - index++; - cz = this.vertices[index]; - normalX = this.name_g0[j]; - j++; - normalY = this.name_g0[j]; - j++; - normalZ = this.name_g0[j]; - j++; - offset = this.name_g0[j]; - j++; - distance = this.src.x * normalX + this.src.y * normalY + this.src.z * normalZ - offset; - if(distance < this.radius) - { - pointX = this.src.x - normalX * distance; - pointY = this.src.y - normalY * distance; - pointZ = this.src.z - normalZ * distance; - } - else - { - _loc33_ = (distance - this.radius) / (distance - this.dest.x * normalX - this.dest.y * normalY - this.dest.z * normalZ + offset); - pointX = this.src.x + this.name_o5.x * _loc33_ - normalX * this.radius; - pointY = this.src.y + this.name_o5.y * _loc33_ - normalY * this.radius; - pointZ = this.src.z + this.name_o5.z * _loc33_ - normalZ * this.radius; - } - min = 1e+22; - inside = true; - for(k = 0; k < 3; ) - { - if(k == 0) - { - p1x = ax; - p1y = ay; - p1z = az; - p2x = bx; - p2y = by; - p2z = bz; - } - else if(k == 1) - { - p1x = bx; - p1y = by; - p1z = bz; - p2x = cx; - p2y = cy; - p2z = cz; - } - else - { - p1x = cx; - p1y = cy; - p1z = cz; - p2x = ax; - p2y = ay; - p2z = az; - } - abx = p2x - p1x; - aby = p2y - p1y; - abz = p2z - p1z; - acx = pointX - p1x; - acy = pointY - p1y; - acz = pointZ - p1z; - crx = acz * aby - acy * abz; - cry = acx * abz - acz * abx; - crz = acy * abx - acx * aby; - if(crx * normalX + cry * normalY + crz * normalZ < 0) - { - edgeLength = abx * abx + aby * aby + abz * abz; - edgeDistanceSqr = (crx * crx + cry * cry + crz * crz) / edgeLength; - if(edgeDistanceSqr < min) - { - edgeLength = Number(Math.sqrt(edgeLength)); - abx /= edgeLength; - aby /= edgeLength; - abz /= edgeLength; - _loc33_ = abx * acx + aby * acy + abz * acz; - if(_loc33_ < 0) - { - acLen = acx * acx + acy * acy + acz * acz; - if(acLen < min) - { - min = acLen; - faceX = p1x; - faceY = p1y; - faceZ = p1z; - } - } - else if(_loc33_ > edgeLength) - { - acx = pointX - p2x; - acy = pointY - p2y; - acz = pointZ - p2z; - acLen = acx * acx + acy * acy + acz * acz; - if(acLen < min) - { - min = acLen; - faceX = p2x; - faceY = p2y; - faceZ = p2z; - } - } - else - { - min = edgeDistanceSqr; - faceX = p1x + abx * _loc33_; - faceY = p1y + aby * _loc33_; - faceZ = p1z + abz * _loc33_; - } - } - inside = false; - } - k++; - } - if(inside) - { - faceX = pointX; - faceY = pointY; - faceZ = pointZ; - } - deltaX = this.src.x - faceX; - deltaY = this.src.y - faceY; - deltaZ = this.src.z - faceZ; - if(deltaX * this.name_o5.x + deltaY * this.name_o5.y + deltaZ * this.name_o5.z <= 0) - { - backX = -this.name_o5.x / displacementLength; - backY = -this.name_o5.y / displacementLength; - backZ = -this.name_o5.z / displacementLength; - deltaLength = deltaX * deltaX + deltaY * deltaY + deltaZ * deltaZ; - projectionLength = deltaX * backX + deltaY * backY + deltaZ * backZ; - projectionInsideLength = this.radius * this.radius - deltaLength + projectionLength * projectionLength; - if(projectionInsideLength > 0) - { - time = (projectionLength - Math.sqrt(projectionInsideLength)) / displacementLength; - if(time < minTime) - { - minTime = time; - this.name_SE.x = faceX; - this.name_SE.y = faceY; - this.name_SE.z = faceZ; - if(inside) - { - this.name_pU.x = normalX; - this.name_pU.y = normalY; - this.name_pU.z = normalZ; - this.name_pU.w = offset; - } - else - { - deltaLength = Number(Math.sqrt(deltaLength)); - this.name_pU.x = deltaX / deltaLength; - this.name_pU.y = deltaY / deltaLength; - this.name_pU.z = deltaZ / deltaLength; - this.name_pU.w = this.name_SE.x * this.name_pU.x + this.name_SE.y * this.name_pU.y + this.name_SE.z * this.name_pU.z; - } - } - } - } - } - return minTime < 1; - } - } -} - diff --git a/src/alternativa/engine3d/core/BoundBox.as b/src/alternativa/engine3d/core/BoundBox.as deleted file mode 100644 index 6c84215..0000000 --- a/src/alternativa/engine3d/core/BoundBox.as +++ /dev/null @@ -1,373 +0,0 @@ -package alternativa.engine3d.core -{ - import alternativa.engine3d.alternativa3d; - import flash.geom.Vector3D; - - use namespace alternativa3d; - - public class BoundBox - { - public var minX:Number = 1e+22; - - public var minY:Number = 1e+22; - - public var minZ:Number = 1e+22; - - public var maxX:Number = -1e+22; - - public var maxY:Number = -1e+22; - - public var maxZ:Number = -1e+22; - - public function BoundBox() - { - super(); - } - - public function reset() : void - { - this.minX = 1e+22; - this.minY = 1e+22; - this.minZ = 1e+22; - this.maxX = -1e+22; - this.maxY = -1e+22; - this.maxZ = -1e+22; - } - - alternativa3d function checkFrustumCulling(frustum:CullingPlane, culling:int) : int - { - var side:int = 1; - for(var plane:CullingPlane = frustum; plane != null; plane = plane.next) - { - if(Boolean(culling & side)) - { - if(plane.x >= 0) - { - if(plane.y >= 0) - { - if(plane.z >= 0) - { - if(this.maxX * plane.x + this.maxY * plane.y + this.maxZ * plane.z <= plane.offset) - { - return -1; - } - if(this.minX * plane.x + this.minY * plane.y + this.minZ * plane.z > plane.offset) - { - culling &= 0x3F & ~side; - } - } - else - { - if(this.maxX * plane.x + this.maxY * plane.y + this.minZ * plane.z <= plane.offset) - { - return -1; - } - if(this.minX * plane.x + this.minY * plane.y + this.maxZ * plane.z > plane.offset) - { - culling &= 0x3F & ~side; - } - } - } - else if(plane.z >= 0) - { - if(this.maxX * plane.x + this.minY * plane.y + this.maxZ * plane.z <= plane.offset) - { - return -1; - } - if(this.minX * plane.x + this.maxY * plane.y + this.minZ * plane.z > plane.offset) - { - culling &= 0x3F & ~side; - } - } - else - { - if(this.maxX * plane.x + this.minY * plane.y + this.minZ * plane.z <= plane.offset) - { - return -1; - } - if(this.minX * plane.x + this.maxY * plane.y + this.maxZ * plane.z > plane.offset) - { - culling &= 0x3F & ~side; - } - } - } - else if(plane.y >= 0) - { - if(plane.z >= 0) - { - if(this.minX * plane.x + this.maxY * plane.y + this.maxZ * plane.z <= plane.offset) - { - return -1; - } - if(this.maxX * plane.x + this.minY * plane.y + this.minZ * plane.z > plane.offset) - { - culling &= 0x3F & ~side; - } - } - else - { - if(this.minX * plane.x + this.maxY * plane.y + this.minZ * plane.z <= plane.offset) - { - return -1; - } - if(this.maxX * plane.x + this.minY * plane.y + this.maxZ * plane.z > plane.offset) - { - culling &= 0x3F & ~side; - } - } - } - else if(plane.z >= 0) - { - if(this.minX * plane.x + this.minY * plane.y + this.maxZ * plane.z <= plane.offset) - { - return -1; - } - if(this.maxX * plane.x + this.maxY * plane.y + this.minZ * plane.z > plane.offset) - { - culling &= 0x3F & ~side; - } - } - else - { - if(this.minX * plane.x + this.minY * plane.y + this.minZ * plane.z <= plane.offset) - { - return -1; - } - if(this.maxX * plane.x + this.maxY * plane.y + this.maxZ * plane.z > plane.offset) - { - culling &= 0x3F & ~side; - } - } - } - side <<= 1; - } - return culling; - } - - alternativa3d function checkOcclusionCulling(camera:Camera3D, object:Object3D, occlusion:CullingPlane = null) : Boolean - { - return true; - } - - alternativa3d function checkRays(origins:Vector., directions:Vector., raysLength:int) : Boolean - { - var origin:Vector3D = null; - var direction:Vector3D = null; - var a:Number = NaN; - var b:Number = NaN; - var c:Number = NaN; - var d:Number = NaN; - var threshold:Number = NaN; - for(var i:int = 0; i < raysLength; ) - { - origin = origins[i]; - direction = directions[i]; - if(origin.x >= this.minX && origin.x <= this.maxX && origin.y >= this.minY && origin.y <= this.maxY && origin.z >= this.minZ && origin.z <= this.maxZ) - { - return true; - } - if(!(origin.x < this.minX && direction.x <= 0 || origin.x > this.maxX && direction.x >= 0 || origin.y < this.minY && direction.y <= 0 || origin.y > this.maxY && direction.y >= 0 || origin.z < this.minZ && direction.z <= 0 || origin.z > this.maxZ && direction.z >= 0)) - { - threshold = 0.000001; - if(direction.x > threshold) - { - a = (this.minX - origin.x) / direction.x; - b = (this.maxX - origin.x) / direction.x; - } - else if(direction.x < -threshold) - { - a = (this.maxX - origin.x) / direction.x; - b = (this.minX - origin.x) / direction.x; - } - else - { - a = 0; - b = 1e+22; - } - if(direction.y > threshold) - { - c = (this.minY - origin.y) / direction.y; - d = (this.maxY - origin.y) / direction.y; - } - else if(direction.y < -threshold) - { - c = (this.maxY - origin.y) / direction.y; - d = (this.minY - origin.y) / direction.y; - } - else - { - c = 0; - d = 1e+22; - } - if(!(c >= b || d <= a)) - { - if(c < a) - { - if(d < b) - { - b = d; - } - } - else - { - a = c; - if(d < b) - { - b = d; - } - } - if(direction.z > threshold) - { - c = (this.minZ - origin.z) / direction.z; - d = (this.maxZ - origin.z) / direction.z; - } - else if(direction.z < -threshold) - { - c = (this.maxZ - origin.z) / direction.z; - d = (this.minZ - origin.z) / direction.z; - } - else - { - c = 0; - d = 1e+22; - } - if(!(c >= b || d <= a)) - { - return true; - } - } - } - i++; - } - return false; - } - - alternativa3d function checkSphere(sphere:Vector3D) : Boolean - { - return sphere.x + sphere.w > this.minX && sphere.x - sphere.w < this.maxX && sphere.y + sphere.w > this.minY && sphere.y - sphere.w < this.maxY && sphere.z + sphere.w > this.minZ && sphere.z - sphere.w < this.maxZ; - } - - public function intersectRay(origin:Vector3D, direction:Vector3D) : Boolean - { - var a:Number = NaN; - var b:Number = NaN; - var c:Number = NaN; - var d:Number = NaN; - if(origin.x >= this.minX && origin.x <= this.maxX && origin.y >= this.minY && origin.y <= this.maxY && origin.z >= this.minZ && origin.z <= this.maxZ) - { - return true; - } - if(origin.x < this.minX && direction.x <= 0) - { - return false; - } - if(origin.x > this.maxX && direction.x >= 0) - { - return false; - } - if(origin.y < this.minY && direction.y <= 0) - { - return false; - } - if(origin.y > this.maxY && direction.y >= 0) - { - return false; - } - if(origin.z < this.minZ && direction.z <= 0) - { - return false; - } - if(origin.z > this.maxZ && direction.z >= 0) - { - return false; - } - if(direction.x > 0.000001) - { - a = (this.minX - origin.x) / direction.x; - b = (this.maxX - origin.x) / direction.x; - } - else if(direction.x < -0.000001) - { - a = (this.maxX - origin.x) / direction.x; - b = (this.minX - origin.x) / direction.x; - } - else - { - a = -1e+22; - b = 1e+22; - } - if(direction.y > 0.000001) - { - c = (this.minY - origin.y) / direction.y; - d = (this.maxY - origin.y) / direction.y; - } - else if(direction.y < -0.000001) - { - c = (this.maxY - origin.y) / direction.y; - d = (this.minY - origin.y) / direction.y; - } - else - { - c = -1e+22; - d = 1e+22; - } - if(c >= b || d <= a) - { - return false; - } - if(c < a) - { - if(d < b) - { - b = d; - } - } - else - { - a = c; - if(d < b) - { - b = d; - } - } - if(direction.z > 0.000001) - { - c = (this.minZ - origin.z) / direction.z; - d = (this.maxZ - origin.z) / direction.z; - } - else if(direction.z < -0.000001) - { - c = (this.maxZ - origin.z) / direction.z; - d = (this.minZ - origin.z) / direction.z; - } - else - { - c = -1e+22; - d = 1e+22; - } - if(c >= b || d <= a) - { - return false; - } - return true; - } - - public function clone() : BoundBox - { - var res:BoundBox = new BoundBox(); - res.minX = this.minX; - res.minY = this.minY; - res.minZ = this.minZ; - res.maxX = this.maxX; - res.maxY = this.maxY; - res.maxZ = this.maxZ; - return res; - } - - public function toString() : String - { - return "[BoundBox " + "X:[" + this.minX.toFixed(2) + ", " + this.maxX.toFixed(2) + "] Y:[" + this.minY.toFixed(2) + ", " + this.maxY.toFixed(2) + "] Z:[" + this.minZ.toFixed(2) + ", " + this.maxZ.toFixed(2) + "]]"; - } - } -} - diff --git a/src/alternativa/engine3d/core/Camera3D.as b/src/alternativa/engine3d/core/Camera3D.as deleted file mode 100644 index 33c8619..0000000 --- a/src/alternativa/engine3d/core/Camera3D.as +++ /dev/null @@ -1,908 +0,0 @@ -package alternativa.engine3d.core -{ - import alternativa.engine3d.alternativa3d; - import flash.display.Bitmap; - import flash.display.BitmapData; - import flash.display.DisplayObject; - import flash.display.Sprite; - import flash.display.Stage3D; - import flash.display.StageAlign; - import flash.display3D.Context3D; - import flash.events.Event; - import flash.geom.Point; - import flash.geom.Rectangle; - import flash.geom.Vector3D; - import flash.system.System; - import flash.text.TextField; - import flash.text.TextFieldAutoSize; - import flash.text.TextFormat; - import flash.utils.Dictionary; - import flash.utils.getDefinitionByName; - import flash.utils.getQualifiedClassName; - import flash.utils.getQualifiedSuperclassName; - import flash.utils.getTimer; - - use namespace alternativa3d; - - public class Camera3D extends Object3D - { - public var view:View; - - public var fov:Number = 1.5707963267948966; - - public var nearClipping:Number; - - public var farClipping:Number; - - public var orthographic:Boolean = false; - - alternativa3d var focalLength:Number; - - alternativa3d var m0:Number; - - alternativa3d var m5:Number; - - alternativa3d var m10:Number; - - alternativa3d var m14:Number; - - alternativa3d var correctionX:Number; - - alternativa3d var correctionY:Number; - - alternativa3d var lights:Vector. = new Vector.(); - - alternativa3d var lightsLength:int = 0; - - alternativa3d var ambient:Vector. = new Vector.(4); - - alternativa3d var childLights:Vector. = new Vector.(); - - alternativa3d var frustum:CullingPlane; - - alternativa3d var origins:Vector. = new Vector.(); - - alternativa3d var directions:Vector. = new Vector.(); - - alternativa3d var raysLength:int = 0; - - alternativa3d var occluders:Vector. = new Vector.(); - - alternativa3d var occludersLength:int = 0; - - alternativa3d var context3D:Context3D; - - alternativa3d var renderer:Renderer; - - alternativa3d var numDraws:int; - - alternativa3d var numTriangles:int; - - public var debug:Boolean = false; - - private var debugSet:Object = new Object(); - - private var _diagram:Sprite = createDiagram(); - - public var fpsUpdatePeriod:int = 10; - - public var timerUpdatePeriod:int = 10; - - private var fpsTextField:TextField; - - private var memoryTextField:TextField; - - private var drawsTextField:TextField; - - private var trianglesTextField:TextField; - - private var timerTextField:TextField; - - private var graph:Bitmap; - - private var rect:Rectangle; - - private var _diagramAlign:String = "TR"; - - private var _diagramHorizontalMargin:Number = 2; - - private var _diagramVerticalMargin:Number = 2; - - private var fpsUpdateCounter:int; - - private var previousFrameTime:int; - - private var previousPeriodTime:int; - - private var maxMemory:int; - - private var timerUpdateCounter:int; - - private var timeSum:int; - - private var timeCount:int; - - private var timer:int; - - public function Camera3D(nearClipping:Number, farClipping:Number) - { - super(); - this.nearClipping = nearClipping; - this.farClipping = farClipping; - this.alternativa3d::renderer = new Renderer(); - this.alternativa3d::frustum = new CullingPlane(); - this.alternativa3d::frustum.next = new CullingPlane(); - this.alternativa3d::frustum.next.next = new CullingPlane(); - this.alternativa3d::frustum.next.next.next = new CullingPlane(); - this.alternativa3d::frustum.next.next.next.next = new CullingPlane(); - this.alternativa3d::frustum.next.next.next.next.next = new CullingPlane(); - } - - public function render(stage3D:Stage3D) : void - { - var i:int = 0; - var light:Light3D = null; - var root:Object3D = null; - var childLightsLength:int = 0; - if(stage3D == null) - { - throw new TypeError("Parameter stage3D must be non-null."); - } - this.alternativa3d::numDraws = 0; - this.alternativa3d::numTriangles = 0; - this.alternativa3d::occludersLength = 0; - this.alternativa3d::lightsLength = 0; - this.alternativa3d::ambient[0] = 0; - this.alternativa3d::ambient[1] = 0; - this.alternativa3d::ambient[2] = 0; - this.alternativa3d::ambient[3] = 1; - this.alternativa3d::context3D = stage3D.context3D; - if(this.alternativa3d::context3D != null && this.view != null && this.alternativa3d::renderer != null && (this.view.stage != null || this.view.name_gJ != null)) - { - this.alternativa3d::renderer.alternativa3d::camera = this; - this.alternativa3d::calculateProjection(this.view.name_qj,this.view.alternativa3d::_height); - this.view.alternativa3d::prepareToRender(stage3D,this.alternativa3d::context3D); - if(alternativa3d::transformChanged) - { - alternativa3d::composeTransforms(); - } - alternativa3d::localToGlobalTransform.copy(alternativa3d::transform); - alternativa3d::globalToLocalTransform.copy(alternativa3d::inverseTransform); - for(root = this; root.parent != null; ) - { - root = root.parent; - if(root.alternativa3d::transformChanged) - { - root.alternativa3d::composeTransforms(); - } - alternativa3d::localToGlobalTransform.append(root.alternativa3d::transform); - alternativa3d::globalToLocalTransform.prepend(root.alternativa3d::inverseTransform); - } - this.view.alternativa3d::calculateRays(this); - for(i = int(this.alternativa3d::origins.length); i < this.view.alternativa3d::raysLength; i++) - { - this.alternativa3d::origins[i] = new Vector3D(); - this.alternativa3d::directions[i] = new Vector3D(); - } - this.alternativa3d::raysLength = this.view.alternativa3d::raysLength; - if(root.visible) - { - root.alternativa3d::cameraToLocalTransform.combine(root.alternativa3d::inverseTransform,alternativa3d::localToGlobalTransform); - root.alternativa3d::listening = root.alternativa3d::bubbleListeners != null || root.alternativa3d::captureListeners != null; - if(root.boundBox != null) - { - this.alternativa3d::calculateFrustum(root.alternativa3d::cameraToLocalTransform); - root.alternativa3d::culling = root.boundBox.alternativa3d::checkFrustumCulling(this.alternativa3d::frustum,63); - } - else - { - root.alternativa3d::culling = 63; - } - if(root.alternativa3d::culling >= 0) - { - root.alternativa3d::calculateVisibility(this); - } - root.alternativa3d::calculateChildrenVisibility(this); - for(i = 0; i < this.alternativa3d::lightsLength; i++) - { - light = this.alternativa3d::lights[i]; - light.alternativa3d::localToCameraTransform.calculateInversion(light.alternativa3d::cameraToLocalTransform); - light.alternativa3d::red = (light.color >> 16 & 0xFF) * light.intensity / 255; - light.alternativa3d::green = (light.color >> 8 & 0xFF) * light.intensity / 255; - light.alternativa3d::blue = (light.color & 0xFF) * light.intensity / 255; - } - root.alternativa3d::localToCameraTransform.combine(alternativa3d::globalToLocalTransform,root.alternativa3d::transform); - if(root.alternativa3d::culling >= 0 && (root.boundBox == null || this.alternativa3d::occludersLength == 0 || Boolean(root.boundBox.alternativa3d::checkOcclusionCulling(this,root)))) - { - if(root.alternativa3d::listening && root.boundBox != null) - { - this.alternativa3d::calculateRays(root.alternativa3d::cameraToLocalTransform); - root.alternativa3d::listening = root.boundBox.alternativa3d::checkRays(this.alternativa3d::origins,this.alternativa3d::directions,this.alternativa3d::raysLength); - } - if(this.alternativa3d::lightsLength > 0 && root.alternativa3d::useLights) - { - if(root.boundBox != null) - { - childLightsLength = 0; - for(i = 0; i < this.alternativa3d::lightsLength; ) - { - light = this.alternativa3d::lights[i]; - light.name_cl.combine(root.alternativa3d::cameraToLocalTransform,light.alternativa3d::localToCameraTransform); - if(light.boundBox == null || light.alternativa3d::checkBound(root)) - { - this.alternativa3d::childLights[childLightsLength] = light; - childLightsLength++; - } - i++; - } - root.alternativa3d::collectDraws(this,this.alternativa3d::childLights,childLightsLength); - } - else - { - for(i = 0; i < this.alternativa3d::lightsLength; ) - { - light = this.alternativa3d::lights[i]; - light.name_cl.combine(root.alternativa3d::cameraToLocalTransform,light.alternativa3d::localToCameraTransform); - i++; - } - root.alternativa3d::collectDraws(this,this.alternativa3d::lights,this.alternativa3d::lightsLength); - } - } - else - { - root.alternativa3d::collectDraws(this,null,0); - } - } - root.alternativa3d::collectChildrenDraws(this,this.alternativa3d::lights,this.alternativa3d::lightsLength); - } - this.view.alternativa3d::processMouseEvents(this.alternativa3d::context3D,this); - this.alternativa3d::renderer.alternativa3d::render(this.alternativa3d::context3D); - if(this.view.name_gJ == null) - { - this.alternativa3d::context3D.present(); - } - else - { - this.alternativa3d::context3D.drawToBitmapData(this.view.name_gJ); - this.alternativa3d::context3D.present(); - } - } - this.alternativa3d::lights.length = 0; - this.alternativa3d::childLights.length = 0; - this.alternativa3d::occluders.length = 0; - this.alternativa3d::context3D = null; - } - - public function projectGlobal(point:Vector3D) : Vector3D - { - if(this.view == null) - { - throw new Error("It is necessary to have view set."); - } - var viewSizeX:Number = this.view.name_qj * 0.5; - var viewSizeY:Number = this.view.alternativa3d::_height * 0.5; - var focalLength:Number = Math.sqrt(viewSizeX * viewSizeX + viewSizeY * viewSizeY) / Math.tan(this.fov * 0.5); - var res:Vector3D = globalToLocal(point); - res.x = res.x * focalLength / res.z + viewSizeX; - res.y = res.y * focalLength / res.z + viewSizeY; - return res; - } - - public function calculateRay(origin:Vector3D, direction:Vector3D, viewX:Number, viewY:Number) : void - { - if(this.view == null) - { - throw new Error("It is necessary to have view set."); - } - var viewSizeX:Number = this.view.name_qj * 0.5; - var viewSizeY:Number = this.view.alternativa3d::_height * 0.5; - var focalLength:Number = Math.sqrt(viewSizeX * viewSizeX + viewSizeY * viewSizeY) / Math.tan(this.fov * 0.5); - var dx:Number = viewX - viewSizeX; - var dy:Number = viewY - viewSizeY; - var ox:Number = dx * this.nearClipping / focalLength; - var oy:Number = dy * this.nearClipping / focalLength; - var oz:Number = this.nearClipping; - if(alternativa3d::transformChanged) - { - alternativa3d::composeTransforms(); - } - trm.copy(alternativa3d::transform); - for(var root:Object3D = this; root.parent != null; ) - { - root = root.parent; - if(root.alternativa3d::transformChanged) - { - root.alternativa3d::composeTransforms(); - } - trm.append(root.alternativa3d::transform); - } - origin.x = trm.a * ox + trm.b * oy + trm.c * oz + trm.d; - origin.y = trm.e * ox + trm.f * oy + trm.g * oz + trm.h; - origin.z = trm.i * ox + trm.j * oy + trm.k * oz + trm.l; - direction.x = trm.a * dx + trm.b * dy + trm.c * focalLength; - direction.y = trm.e * dx + trm.f * dy + trm.g * focalLength; - direction.z = trm.i * dx + trm.j * dy + trm.k * focalLength; - var directionL:Number = 1 / Math.sqrt(direction.x * direction.x + direction.y * direction.y + direction.z * direction.z); - direction.x *= directionL; - direction.y *= directionL; - direction.z *= directionL; - } - - override public function clone() : Object3D - { - var res:Camera3D = new Camera3D(this.nearClipping,this.farClipping); - res.clonePropertiesFrom(this); - return res; - } - - override protected function clonePropertiesFrom(source:Object3D) : void - { - super.clonePropertiesFrom(source); - this.view = (source as Camera3D).view; - } - - alternativa3d function calculateProjection(width:Number, height:Number) : void - { - var viewSizeX:Number = width * 0.5; - var viewSizeY:Number = height * 0.5; - this.alternativa3d::focalLength = Math.sqrt(viewSizeX * viewSizeX + viewSizeY * viewSizeY) / Math.tan(this.fov * 0.5); - if(!this.orthographic) - { - this.alternativa3d::m0 = this.alternativa3d::focalLength / viewSizeX; - this.alternativa3d::m5 = -this.alternativa3d::focalLength / viewSizeY; - this.alternativa3d::m10 = this.farClipping / (this.farClipping - this.nearClipping); - this.alternativa3d::m14 = -this.nearClipping * this.alternativa3d::m10; - } - else - { - this.alternativa3d::m0 = 1 / viewSizeX; - this.alternativa3d::m5 = -1 / viewSizeY; - this.alternativa3d::m10 = 1 / (this.farClipping - this.nearClipping); - this.alternativa3d::m14 = -this.nearClipping * this.alternativa3d::m10; - } - this.alternativa3d::correctionX = viewSizeX / this.alternativa3d::focalLength; - this.alternativa3d::correctionY = viewSizeY / this.alternativa3d::focalLength; - } - - alternativa3d function calculateFrustum(transform:Transform3D) : void - { - var fa:Number = NaN; - var fe:Number = NaN; - var fi:Number = NaN; - var fb:Number = NaN; - var ff:Number = NaN; - var fj:Number = NaN; - var ax:Number = NaN; - var ay:Number = NaN; - var az:Number = NaN; - var bx:Number = NaN; - var by:Number = NaN; - var bz:Number = NaN; - var _loc20_:Number = NaN; - var _loc21_:Number = NaN; - var nearPlane:CullingPlane = this.alternativa3d::frustum; - var farPlane:CullingPlane = nearPlane.next; - var leftPlane:CullingPlane = farPlane.next; - var rightPlane:CullingPlane = leftPlane.next; - var topPlane:CullingPlane = rightPlane.next; - var bottomPlane:CullingPlane = topPlane.next; - if(!this.orthographic) - { - fa = transform.a * this.alternativa3d::correctionX; - fe = transform.e * this.alternativa3d::correctionX; - fi = transform.i * this.alternativa3d::correctionX; - fb = transform.b * this.alternativa3d::correctionY; - ff = transform.f * this.alternativa3d::correctionY; - fj = transform.j * this.alternativa3d::correctionY; - nearPlane.x = fj * fe - ff * fi; - nearPlane.y = fb * fi - fj * fa; - nearPlane.z = ff * fa - fb * fe; - nearPlane.offset = (transform.d + transform.c * this.nearClipping) * nearPlane.x + (transform.h + transform.g * this.nearClipping) * nearPlane.y + (transform.l + transform.k * this.nearClipping) * nearPlane.z; - farPlane.x = -nearPlane.x; - farPlane.y = -nearPlane.y; - farPlane.z = -nearPlane.z; - farPlane.offset = (transform.d + transform.c * this.farClipping) * farPlane.x + (transform.h + transform.g * this.farClipping) * farPlane.y + (transform.l + transform.k * this.farClipping) * farPlane.z; - ax = -fa - fb + transform.c; - ay = -fe - ff + transform.g; - az = -fi - fj + transform.k; - bx = fa - fb + transform.c; - by = fe - ff + transform.g; - bz = fi - fj + transform.k; - topPlane.x = bz * ay - by * az; - topPlane.y = bx * az - bz * ax; - topPlane.z = by * ax - bx * ay; - topPlane.offset = transform.d * topPlane.x + transform.h * topPlane.y + transform.l * topPlane.z; - ax = bx; - ay = by; - az = bz; - bx = fa + fb + transform.c; - by = fe + ff + transform.g; - bz = fi + fj + transform.k; - rightPlane.x = bz * ay - by * az; - rightPlane.y = bx * az - bz * ax; - rightPlane.z = by * ax - bx * ay; - rightPlane.offset = transform.d * rightPlane.x + transform.h * rightPlane.y + transform.l * rightPlane.z; - ax = bx; - ay = by; - az = bz; - bx = -fa + fb + transform.c; - by = -fe + ff + transform.g; - bz = -fi + fj + transform.k; - bottomPlane.x = bz * ay - by * az; - bottomPlane.y = bx * az - bz * ax; - bottomPlane.z = by * ax - bx * ay; - bottomPlane.offset = transform.d * bottomPlane.x + transform.h * bottomPlane.y + transform.l * bottomPlane.z; - ax = bx; - ay = by; - az = bz; - bx = -fa - fb + transform.c; - by = -fe - ff + transform.g; - bz = -fi - fj + transform.k; - leftPlane.x = bz * ay - by * az; - leftPlane.y = bx * az - bz * ax; - leftPlane.z = by * ax - bx * ay; - leftPlane.offset = transform.d * leftPlane.x + transform.h * leftPlane.y + transform.l * leftPlane.z; - } - else - { - _loc20_ = this.view.name_qj * 0.5; - _loc21_ = this.view.alternativa3d::_height * 0.5; - nearPlane.x = transform.j * transform.e - transform.f * transform.i; - nearPlane.y = transform.b * transform.i - transform.j * transform.a; - nearPlane.z = transform.f * transform.a - transform.b * transform.e; - nearPlane.offset = (transform.d + transform.c * this.nearClipping) * nearPlane.x + (transform.h + transform.g * this.nearClipping) * nearPlane.y + (transform.l + transform.k * this.nearClipping) * nearPlane.z; - farPlane.x = -nearPlane.x; - farPlane.y = -nearPlane.y; - farPlane.z = -nearPlane.z; - farPlane.offset = (transform.d + transform.c * this.farClipping) * farPlane.x + (transform.h + transform.g * this.farClipping) * farPlane.y + (transform.l + transform.k * this.farClipping) * farPlane.z; - topPlane.x = transform.i * transform.g - transform.e * transform.k; - topPlane.y = transform.a * transform.k - transform.i * transform.c; - topPlane.z = transform.e * transform.c - transform.a * transform.g; - topPlane.offset = (transform.d - transform.b * _loc21_) * topPlane.x + (transform.h - transform.f * _loc21_) * topPlane.y + (transform.l - transform.j * _loc21_) * topPlane.z; - bottomPlane.x = -topPlane.x; - bottomPlane.y = -topPlane.y; - bottomPlane.z = -topPlane.z; - bottomPlane.offset = (transform.d + transform.b * _loc21_) * bottomPlane.x + (transform.h + transform.f * _loc21_) * bottomPlane.y + (transform.l + transform.j * _loc21_) * bottomPlane.z; - leftPlane.x = transform.k * transform.f - transform.g * transform.j; - leftPlane.y = transform.c * transform.j - transform.k * transform.b; - leftPlane.z = transform.g * transform.b - transform.c * transform.f; - leftPlane.offset = (transform.d - transform.a * _loc20_) * leftPlane.x + (transform.h - transform.e * _loc20_) * leftPlane.y + (transform.l - transform.i * _loc20_) * leftPlane.z; - rightPlane.x = -leftPlane.x; - rightPlane.y = -leftPlane.y; - rightPlane.z = -leftPlane.z; - rightPlane.offset = (transform.d + transform.a * _loc20_) * rightPlane.x + (transform.h + transform.e * _loc20_) * rightPlane.y + (transform.l + transform.i * _loc20_) * rightPlane.z; - } - } - - alternativa3d function calculateRays(transform:Transform3D) : void - { - var o:Vector3D = null; - var d:Vector3D = null; - var origin:Vector3D = null; - var direction:Vector3D = null; - for(var i:int = 0; i < this.alternativa3d::raysLength; i++) - { - o = this.view.name_Cr[i]; - d = this.view.name_g4[i]; - origin = this.alternativa3d::origins[i]; - direction = this.alternativa3d::directions[i]; - origin.x = transform.a * o.x + transform.b * o.y + transform.c * o.z + transform.d; - origin.y = transform.e * o.x + transform.f * o.y + transform.g * o.z + transform.h; - origin.z = transform.i * o.x + transform.j * o.y + transform.k * o.z + transform.l; - direction.x = transform.a * d.x + transform.b * d.y + transform.c * d.z; - direction.y = transform.e * d.x + transform.f * d.y + transform.g * d.z; - direction.z = transform.i * d.x + transform.j * d.y + transform.k * d.z; - } - } - - public function addToDebug(debug:int, objectOrClass:*) : void - { - if(!this.debugSet[debug]) - { - this.debugSet[debug] = new Dictionary(); - } - this.debugSet[debug][objectOrClass] = true; - } - - public function removeFromDebug(debug:int, objectOrClass:*) : void - { - var key:* = undefined; - if(Boolean(this.debugSet[debug])) - { - delete this.debugSet[debug][objectOrClass]; - var _loc4_:int = 0; - var _loc5_:* = this.debugSet[debug]; - for(key in _loc5_) - { - } - if(!key) - { - delete this.debugSet[debug]; - } - } - } - - alternativa3d function checkInDebug(object:Object3D) : int - { - var _loc4_:Class = null; - var res:int = 0; - for(var debug:int = 1; debug <= 512; ) - { - if(Boolean(this.debugSet[debug])) - { - if(Boolean(this.debugSet[debug][Object3D]) || Boolean(this.debugSet[debug][object])) - { - res |= debug; - } - else - { - for(_loc4_ = getDefinitionByName(getQualifiedClassName(object)) as Class; _loc4_ != Object3D; ) - { - if(Boolean(this.debugSet[debug][_loc4_])) - { - res |= debug; - break; - } - _loc4_ = Class(getDefinitionByName(getQualifiedSuperclassName(_loc4_))); - } - } - } - debug <<= 1; - } - return res; - } - - public function startTimer() : void - { - this.timer = getTimer(); - } - - public function stopTimer() : void - { - this.timeSum += getTimer() - this.timer; - ++this.timeCount; - } - - public function get diagram() : DisplayObject - { - return this._diagram; - } - - public function get diagramAlign() : String - { - return this._diagramAlign; - } - - public function set diagramAlign(value:String) : void - { - this._diagramAlign = value; - this.resizeDiagram(); - } - - public function get diagramHorizontalMargin() : Number - { - return this._diagramHorizontalMargin; - } - - public function set diagramHorizontalMargin(value:Number) : void - { - this._diagramHorizontalMargin = value; - this.resizeDiagram(); - } - - public function get diagramVerticalMargin() : Number - { - return this._diagramVerticalMargin; - } - - public function set diagramVerticalMargin(value:Number) : void - { - this._diagramVerticalMargin = value; - this.resizeDiagram(); - } - - private function createDiagram() : Sprite - { - var diagram:Sprite = null; - diagram = new Sprite(); - diagram.mouseEnabled = false; - diagram.mouseChildren = false; - this.fpsTextField = new TextField(); - this.fpsTextField.defaultTextFormat = new TextFormat("Tahoma",10,13421772); - this.fpsTextField.autoSize = TextFieldAutoSize.LEFT; - this.fpsTextField.text = "FPS:"; - this.fpsTextField.selectable = false; - this.fpsTextField.x = -3; - this.fpsTextField.y = -5; - diagram.addChild(this.fpsTextField); - this.timerTextField = new TextField(); - this.timerTextField.defaultTextFormat = new TextFormat("Tahoma",10,26367); - this.timerTextField.autoSize = TextFieldAutoSize.LEFT; - this.timerTextField.text = "MS:"; - this.timerTextField.selectable = false; - this.timerTextField.x = -3; - this.timerTextField.y = 4; - diagram.addChild(this.timerTextField); - this.memoryTextField = new TextField(); - this.memoryTextField.defaultTextFormat = new TextFormat("Tahoma",10,13421568); - this.memoryTextField.autoSize = TextFieldAutoSize.LEFT; - this.memoryTextField.text = "MEM:"; - this.memoryTextField.selectable = false; - this.memoryTextField.x = -3; - this.memoryTextField.y = 13; - diagram.addChild(this.memoryTextField); - this.drawsTextField = new TextField(); - this.drawsTextField.defaultTextFormat = new TextFormat("Tahoma",10,52224); - this.drawsTextField.autoSize = TextFieldAutoSize.LEFT; - this.drawsTextField.text = "DRW:"; - this.drawsTextField.selectable = false; - this.drawsTextField.x = -3; - this.drawsTextField.y = 22; - diagram.addChild(this.drawsTextField); - this.trianglesTextField = new TextField(); - this.trianglesTextField.defaultTextFormat = new TextFormat("Tahoma",10,16724736); - this.trianglesTextField.autoSize = TextFieldAutoSize.LEFT; - this.trianglesTextField.text = "TRI:"; - this.trianglesTextField.selectable = false; - this.trianglesTextField.x = -3; - this.trianglesTextField.y = 31; - diagram.addChild(this.trianglesTextField); - diagram.addEventListener(Event.ADDED_TO_STAGE,function():void - { - fpsTextField = new TextField(); - fpsTextField.defaultTextFormat = new TextFormat("Tahoma",10,13421772); - fpsTextField.autoSize = TextFieldAutoSize.RIGHT; - fpsTextField.text = Number(diagram.stage.frameRate).toFixed(2); - fpsTextField.selectable = false; - fpsTextField.x = -3; - fpsTextField.y = -5; - fpsTextField.width = 85; - diagram.addChild(fpsTextField); - timerTextField = new TextField(); - timerTextField.defaultTextFormat = new TextFormat("Tahoma",10,26367); - timerTextField.autoSize = TextFieldAutoSize.RIGHT; - timerTextField.text = ""; - timerTextField.selectable = false; - timerTextField.x = -3; - timerTextField.y = 4; - timerTextField.width = 85; - diagram.addChild(timerTextField); - memoryTextField = new TextField(); - memoryTextField.defaultTextFormat = new TextFormat("Tahoma",10,13421568); - memoryTextField.autoSize = TextFieldAutoSize.RIGHT; - memoryTextField.text = bytesToString(System.totalMemory); - memoryTextField.selectable = false; - memoryTextField.x = -3; - memoryTextField.y = 13; - memoryTextField.width = 85; - diagram.addChild(memoryTextField); - drawsTextField = new TextField(); - drawsTextField.defaultTextFormat = new TextFormat("Tahoma",10,52224); - drawsTextField.autoSize = TextFieldAutoSize.RIGHT; - drawsTextField.text = "0"; - drawsTextField.selectable = false; - drawsTextField.x = -3; - drawsTextField.y = 22; - drawsTextField.width = 72; - diagram.addChild(drawsTextField); - trianglesTextField = new TextField(); - trianglesTextField.defaultTextFormat = new TextFormat("Tahoma",10,16724736); - trianglesTextField.autoSize = TextFieldAutoSize.RIGHT; - trianglesTextField.text = "0"; - trianglesTextField.selectable = false; - trianglesTextField.x = -3; - trianglesTextField.y = 31; - trianglesTextField.width = 72; - diagram.addChild(trianglesTextField); - graph = new Bitmap(new BitmapData(80,40,true,553648127)); - rect = new Rectangle(0,0,1,40); - graph.x = 0; - graph.y = 45; - diagram.addChild(graph); - previousPeriodTime = getTimer(); - previousFrameTime = previousPeriodTime; - fpsUpdateCounter = 0; - maxMemory = 0; - timerUpdateCounter = 0; - timeSum = 0; - timeCount = 0; - diagram.stage.addEventListener(Event.ENTER_FRAME,updateDiagram,false,-1000); - diagram.stage.addEventListener(Event.RESIZE,resizeDiagram,false,-1000); - resizeDiagram(); - }); - diagram.addEventListener(Event.REMOVED_FROM_STAGE,function():void - { - diagram.removeChild(fpsTextField); - diagram.removeChild(memoryTextField); - diagram.removeChild(drawsTextField); - diagram.removeChild(trianglesTextField); - diagram.removeChild(timerTextField); - diagram.removeChild(graph); - fpsTextField = null; - memoryTextField = null; - drawsTextField = null; - trianglesTextField = null; - timerTextField = null; - graph.bitmapData.dispose(); - graph = null; - rect = null; - diagram.stage.removeEventListener(Event.ENTER_FRAME,updateDiagram); - diagram.stage.removeEventListener(Event.RESIZE,resizeDiagram); - }); - return diagram; - } - - private function resizeDiagram(e:Event = null) : void - { - var coord:Point = null; - if(this._diagram.stage != null) - { - coord = this._diagram.parent.globalToLocal(new Point()); - if(this._diagramAlign == StageAlign.TOP_LEFT || this._diagramAlign == StageAlign.LEFT || this._diagramAlign == StageAlign.BOTTOM_LEFT) - { - this._diagram.x = Math.round(coord.x + this._diagramHorizontalMargin); - } - if(this._diagramAlign == StageAlign.TOP || this._diagramAlign == StageAlign.BOTTOM) - { - this._diagram.x = Math.round(coord.x + this._diagram.stage.stageWidth / 2 - this.graph.width / 2); - } - if(this._diagramAlign == StageAlign.TOP_RIGHT || this._diagramAlign == StageAlign.RIGHT || this._diagramAlign == StageAlign.BOTTOM_RIGHT) - { - this._diagram.x = Math.round(coord.x + this._diagram.stage.stageWidth - this._diagramHorizontalMargin - this.graph.width); - } - if(this._diagramAlign == StageAlign.TOP_LEFT || this._diagramAlign == StageAlign.TOP || this._diagramAlign == StageAlign.TOP_RIGHT) - { - this._diagram.y = Math.round(coord.y + this._diagramVerticalMargin); - } - if(this._diagramAlign == StageAlign.LEFT || this._diagramAlign == StageAlign.RIGHT) - { - this._diagram.y = Math.round(coord.y + this._diagram.stage.stageHeight / 2 - (this.graph.y + this.graph.height) / 2); - } - if(this._diagramAlign == StageAlign.BOTTOM_LEFT || this._diagramAlign == StageAlign.BOTTOM || this._diagramAlign == StageAlign.BOTTOM_RIGHT) - { - this._diagram.y = Math.round(coord.y + this._diagram.stage.stageHeight - this._diagramVerticalMargin - this.graph.y - this.graph.height); - } - } - } - - private function updateDiagram(e:Event) : void - { - var value:Number = NaN; - var mod:int = 0; - var time:int = int(getTimer()); - var stageFrameRate:int = int(this._diagram.stage.frameRate); - if(++this.fpsUpdateCounter == this.fpsUpdatePeriod) - { - value = 1000 * this.fpsUpdatePeriod / (time - this.previousPeriodTime); - if(value > stageFrameRate) - { - value = stageFrameRate; - } - mod = value * 100 % 100; - this.fpsTextField.text = int(value) + "." + (mod >= 10 ? mod : (mod > 0 ? "0" + mod : "00")); - this.previousPeriodTime = time; - this.fpsUpdateCounter = 0; - } - value = 1000 / (time - this.previousFrameTime); - if(value > stageFrameRate) - { - value = stageFrameRate; - } - this.graph.bitmapData.scroll(1,0); - this.graph.bitmapData.fillRect(this.rect,553648127); - this.graph.bitmapData.setPixel32(0,40 * (1 - value / stageFrameRate),4291611852); - this.previousFrameTime = time; - if(++this.timerUpdateCounter == this.timerUpdatePeriod) - { - if(this.timeCount > 0) - { - value = this.timeSum / this.timeCount; - mod = value * 100 % 100; - this.timerTextField.text = int(value) + "." + (mod >= 10 ? mod : (mod > 0 ? "0" + mod : "00")); - } - else - { - this.timerTextField.text = ""; - } - this.timerUpdateCounter = 0; - this.timeSum = 0; - this.timeCount = 0; - } - var memory:int = int(System.totalMemory); - value = memory / 1048576; - mod = value * 100 % 100; - this.memoryTextField.text = int(value) + "." + (mod >= 10 ? mod : (mod > 0 ? "0" + mod : "00")); - if(memory > this.maxMemory) - { - this.maxMemory = memory; - } - this.graph.bitmapData.setPixel32(0,40 * (1 - memory / this.maxMemory),4291611648); - this.drawsTextField.text = this.formatInt(this.alternativa3d::numDraws); - this.trianglesTextField.text = this.formatInt(this.alternativa3d::numTriangles); - } - - private function formatInt(num:int) : String - { - var n:int = 0; - var s:String = null; - if(num < 1000) - { - return "" + num; - } - if(num < 1000000) - { - n = num % 1000; - if(n < 10) - { - s = "00" + n; - } - else if(n < 100) - { - s = "0" + n; - } - else - { - s = "" + n; - } - return int(num / 1000) + " " + s; - } - n = num % 1000000 / 1000; - if(n < 10) - { - s = "00" + n; - } - else if(n < 100) - { - s = "0" + n; - } - else - { - s = "" + n; - } - n = num % 1000; - if(n < 10) - { - s += " 00" + n; - } - else if(n < 100) - { - s += " 0" + n; - } - else - { - s += " " + n; - } - return int(num / 1000000) + " " + s; - } - - private function bytesToString(bytes:int) : String - { - if(bytes < 1024) - { - return bytes + "b"; - } - if(bytes < 10240) - { - return (bytes / 1024).toFixed(2) + "kb"; - } - if(bytes < 102400) - { - return (bytes / 1024).toFixed(1) + "kb"; - } - if(bytes < 1048576) - { - return (bytes >> 10) + "kb"; - } - if(bytes < 10485760) - { - return (bytes / 1048576).toFixed(2); - } - if(bytes < 104857600) - { - return (bytes / 1048576).toFixed(1); - } - return String(bytes >> 20); - } - } -} - diff --git a/src/alternativa/engine3d/core/CullingPlane.as b/src/alternativa/engine3d/core/CullingPlane.as deleted file mode 100644 index 9c0604b..0000000 --- a/src/alternativa/engine3d/core/CullingPlane.as +++ /dev/null @@ -1,49 +0,0 @@ -package alternativa.engine3d.core -{ - public class CullingPlane - { - public static var collector:CullingPlane; - - public var x:Number; - - public var y:Number; - - public var z:Number; - - public var offset:Number; - - public var next:CullingPlane; - - public function CullingPlane() - { - super(); - } - - public static function create() : CullingPlane - { - var res:CullingPlane = null; - if(collector != null) - { - res = collector; - collector = res.next; - res.next = null; - return res; - } - return new CullingPlane(); - } - - public function create() : CullingPlane - { - var res:CullingPlane = null; - if(collector != null) - { - res = collector; - collector = res.next; - res.next = null; - return res; - } - return new CullingPlane(); - } - } -} - diff --git a/src/alternativa/engine3d/core/Debug.as b/src/alternativa/engine3d/core/Debug.as deleted file mode 100644 index ced8609..0000000 --- a/src/alternativa/engine3d/core/Debug.as +++ /dev/null @@ -1,55 +0,0 @@ -package alternativa.engine3d.core -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.objects.WireFrame; - import flash.utils.Dictionary; - - use namespace alternativa3d; - - public class Debug - { - public static const BOUNDS:int = 8; - - private static var boundWires:Dictionary = new Dictionary(); - - public function Debug() - { - super(); - } - - private static function createBoundWire() : WireFrame - { - var res:WireFrame = new WireFrame(); - res.alternativa3d::geometry.alternativa3d::addLine(-0.5,-0.5,-0.5,0.5,-0.5,-0.5); - res.alternativa3d::geometry.alternativa3d::addLine(0.5,-0.5,-0.5,0.5,0.5,-0.5); - res.alternativa3d::geometry.alternativa3d::addLine(0.5,0.5,-0.5,-0.5,0.5,-0.5); - res.alternativa3d::geometry.alternativa3d::addLine(-0.5,0.5,-0.5,-0.5,-0.5,-0.5); - res.alternativa3d::geometry.alternativa3d::addLine(-0.5,-0.5,0.5,0.5,-0.5,0.5); - res.alternativa3d::geometry.alternativa3d::addLine(0.5,-0.5,0.5,0.5,0.5,0.5); - res.alternativa3d::geometry.alternativa3d::addLine(0.5,0.5,0.5,-0.5,0.5,0.5); - res.alternativa3d::geometry.alternativa3d::addLine(-0.5,0.5,0.5,-0.5,-0.5,0.5); - res.alternativa3d::geometry.alternativa3d::addLine(-0.5,-0.5,-0.5,-0.5,-0.5,0.5); - res.alternativa3d::geometry.alternativa3d::addLine(0.5,-0.5,-0.5,0.5,-0.5,0.5); - res.alternativa3d::geometry.alternativa3d::addLine(0.5,0.5,-0.5,0.5,0.5,0.5); - res.alternativa3d::geometry.alternativa3d::addLine(-0.5,0.5,-0.5,-0.5,0.5,0.5); - return res; - } - - alternativa3d static function drawBoundBox(camera:Camera3D, boundBox:BoundBox, transform:Transform3D, color:int = -1) : void - { - var boundWire:WireFrame = boundWires[camera.alternativa3d::context3D]; - if(boundWire == null) - { - boundWire = createBoundWire(); - boundWires[camera.alternativa3d::context3D] = boundWire; - boundWire.alternativa3d::geometry.upload(camera.alternativa3d::context3D); - } - boundWire.color = color >= 0 ? uint(color) : 10092288; - boundWire.thickness = 1; - boundWire.alternativa3d::transform.compose((boundBox.minX + boundBox.maxX) * 0.5,(boundBox.minY + boundBox.maxY) * 0.5,(boundBox.minZ + boundBox.maxZ) * 0.5,0,0,0,boundBox.maxX - boundBox.minX,boundBox.maxY - boundBox.minY,boundBox.maxZ - boundBox.minZ); - boundWire.alternativa3d::localToCameraTransform.combine(transform,boundWire.alternativa3d::transform); - boundWire.alternativa3d::collectDraws(camera,null,0); - } - } -} - diff --git a/src/alternativa/engine3d/core/DrawUnit.as b/src/alternativa/engine3d/core/DrawUnit.as deleted file mode 100644 index b3380ab..0000000 --- a/src/alternativa/engine3d/core/DrawUnit.as +++ /dev/null @@ -1,368 +0,0 @@ -package alternativa.engine3d.core -{ - import alternativa.engine3d.alternativa3d; - import flash.display3D.Context3DBlendFactor; - import flash.display3D.Context3DTriangleFace; - import flash.display3D.IndexBuffer3D; - import flash.display3D.Program3D; - import flash.display3D.VertexBuffer3D; - import flash.display3D.textures.TextureBase; - - use namespace alternativa3d; - - public class DrawUnit - { - alternativa3d var next:DrawUnit; - - alternativa3d var object:Object3D; - - alternativa3d var program:Program3D; - - alternativa3d var indexBuffer:IndexBuffer3D; - - alternativa3d var firstIndex:int; - - alternativa3d var numTriangles:int; - - alternativa3d var blendSource:String = "one"; - - alternativa3d var blendDestination:String = "zero"; - - alternativa3d var culling:String = "front"; - - alternativa3d var textures:Vector. = new Vector.(); - - alternativa3d var name_kR:Vector. = new Vector.(); - - alternativa3d var name_Oq:int = 0; - - alternativa3d var vertexBuffers:Vector. = new Vector.(); - - alternativa3d var name_else:Vector. = new Vector.(); - - alternativa3d var name_nw:Vector. = new Vector.(); - - alternativa3d var name_EL:Vector. = new Vector.(); - - alternativa3d var name_3G:int = 0; - - alternativa3d var name_Aq:Vector. = new Vector.(); - - alternativa3d var name_9X:int = 0; - - alternativa3d var name_Cl:Vector. = new Vector.(28 * 4,true); - - alternativa3d var name_Kv:int = 0; - - public function DrawUnit() - { - super(); - } - - alternativa3d function clear() : void - { - this.alternativa3d::object = null; - this.alternativa3d::program = null; - this.alternativa3d::indexBuffer = null; - this.alternativa3d::blendSource = Context3DBlendFactor.ONE; - this.alternativa3d::blendDestination = Context3DBlendFactor.ZERO; - this.alternativa3d::culling = Context3DTriangleFace.FRONT; - this.alternativa3d::textures.length = 0; - this.name_Oq = 0; - this.alternativa3d::vertexBuffers.length = 0; - this.name_3G = 0; - this.name_9X = 0; - this.name_Kv = 0; - } - - alternativa3d function setTextureAt(sampler:int, texture:TextureBase) : void - { - if(uint(sampler) > 8) - { - throw new Error("Sampler index " + sampler + " is out of bounds."); - } - if(texture == null) - { - throw new Error("Texture is null"); - } - this.name_kR[this.name_Oq] = sampler; - this.alternativa3d::textures[this.name_Oq] = texture; - ++this.name_Oq; - } - - alternativa3d function setVertexBufferAt(index:int, buffer:VertexBuffer3D, bufferOffset:int, format:String) : void - { - if(uint(index) > 8) - { - throw new Error("VertexBuffer index " + index + " is out of bounds."); - } - if(buffer == null) - { - throw new Error("Buffer is null"); - } - this.name_else[this.name_3G] = index; - this.alternativa3d::vertexBuffers[this.name_3G] = buffer; - this.name_nw[this.name_3G] = bufferOffset; - this.name_EL[this.name_3G] = format; - ++this.name_3G; - } - - alternativa3d function setVertexConstantsFromVector(firstRegister:int, data:Vector., numRegisters:int) : void - { - if(uint(firstRegister + numRegisters) > 128) - { - throw new Error("Register index " + firstRegister + " is out of bounds."); - } - var offset:int = firstRegister << 2; - if(firstRegister + numRegisters > this.name_9X) - { - this.name_9X = firstRegister + numRegisters; - this.name_Aq.length = this.name_9X << 2; - } - for(var i:int = 0, len:int = numRegisters << 2; i < len; ) - { - this.name_Aq[offset] = data[i]; - offset++; - i++; - } - } - - alternativa3d function setVertexConstantsFromNumbers(firstRegister:int, x:Number, y:Number, z:Number, w:Number = 1) : void - { - if(uint(firstRegister + 1) > 128) - { - throw new Error("Register index " + firstRegister + " is out of bounds."); - } - var offset:int = firstRegister << 2; - if(firstRegister + 1 > this.name_9X) - { - this.name_9X = firstRegister + 1; - this.name_Aq.length = this.name_9X << 2; - } - this.name_Aq[offset] = x; - offset++; - this.name_Aq[offset] = y; - offset++; - this.name_Aq[offset] = z; - offset++; - this.name_Aq[offset] = w; - } - - alternativa3d function setVertexConstantsFromTransform(firstRegister:int, transform:Transform3D) : void - { - if(uint(firstRegister + 3) > 128) - { - throw new Error("Register index " + firstRegister + " is out of bounds."); - } - var offset:int = firstRegister << 2; - if(firstRegister + 3 > this.name_9X) - { - this.name_9X = firstRegister + 3; - this.name_Aq.length = this.name_9X << 2; - } - this.name_Aq[offset] = transform.a; - offset++; - this.name_Aq[offset] = transform.b; - offset++; - this.name_Aq[offset] = transform.c; - offset++; - this.name_Aq[offset] = transform.d; - offset++; - this.name_Aq[offset] = transform.e; - offset++; - this.name_Aq[offset] = transform.f; - offset++; - this.name_Aq[offset] = transform.g; - offset++; - this.name_Aq[offset] = transform.h; - offset++; - this.name_Aq[offset] = transform.i; - offset++; - this.name_Aq[offset] = transform.j; - offset++; - this.name_Aq[offset] = transform.k; - offset++; - this.name_Aq[offset] = transform.l; - } - - alternativa3d function setProjectionConstants(camera:Camera3D, firstRegister:int, transform:Transform3D = null) : void - { - if(uint(firstRegister + 4) > 128) - { - throw new Error("Register index is out of bounds."); - } - var offset:int = firstRegister << 2; - if(firstRegister + 4 > this.name_9X) - { - this.name_9X = firstRegister + 4; - this.name_Aq.length = this.name_9X << 2; - } - if(transform != null) - { - this.name_Aq[offset] = transform.a * camera.alternativa3d::m0; - offset++; - this.name_Aq[offset] = transform.b * camera.alternativa3d::m0; - offset++; - this.name_Aq[offset] = transform.c * camera.alternativa3d::m0; - offset++; - this.name_Aq[offset] = transform.d * camera.alternativa3d::m0; - offset++; - this.name_Aq[offset] = transform.e * camera.alternativa3d::m5; - offset++; - this.name_Aq[offset] = transform.f * camera.alternativa3d::m5; - offset++; - this.name_Aq[offset] = transform.g * camera.alternativa3d::m5; - offset++; - this.name_Aq[offset] = transform.h * camera.alternativa3d::m5; - offset++; - this.name_Aq[offset] = transform.i * camera.alternativa3d::m10; - offset++; - this.name_Aq[offset] = transform.j * camera.alternativa3d::m10; - offset++; - this.name_Aq[offset] = transform.k * camera.alternativa3d::m10; - offset++; - this.name_Aq[offset] = transform.l * camera.alternativa3d::m10 + camera.alternativa3d::m14; - offset++; - if(!camera.orthographic) - { - this.name_Aq[offset] = transform.i; - offset++; - this.name_Aq[offset] = transform.j; - offset++; - this.name_Aq[offset] = transform.k; - offset++; - this.name_Aq[offset] = transform.l; - } - else - { - this.name_Aq[offset] = 0; - offset++; - this.name_Aq[offset] = 0; - offset++; - this.name_Aq[offset] = 0; - offset++; - this.name_Aq[offset] = 1; - } - } - else - { - this.name_Aq[offset] = camera.alternativa3d::m0; - offset++; - this.name_Aq[offset] = 0; - offset++; - this.name_Aq[offset] = 0; - offset++; - this.name_Aq[offset] = 0; - offset++; - this.name_Aq[offset] = 0; - offset++; - this.name_Aq[offset] = camera.alternativa3d::m5; - offset++; - this.name_Aq[offset] = 0; - offset++; - this.name_Aq[offset] = 0; - offset++; - this.name_Aq[offset] = 0; - offset++; - this.name_Aq[offset] = 0; - offset++; - this.name_Aq[offset] = camera.alternativa3d::m10; - offset++; - this.name_Aq[offset] = camera.alternativa3d::m14; - offset++; - this.name_Aq[offset] = 0; - offset++; - this.name_Aq[offset] = 0; - offset++; - if(!camera.orthographic) - { - this.name_Aq[offset] = 1; - offset++; - this.name_Aq[offset] = 0; - } - else - { - this.name_Aq[offset] = 0; - offset++; - this.name_Aq[offset] = 1; - } - } - } - - alternativa3d function setFragmentConstantsFromVector(firstRegister:int, data:Vector., numRegisters:int) : void - { - if(uint(firstRegister + numRegisters) > 28) - { - throw new Error("Register index " + firstRegister + " is out of bounds."); - } - var offset:int = firstRegister << 2; - if(firstRegister + numRegisters > this.name_Kv) - { - this.name_Kv = firstRegister + numRegisters; - } - for(var i:int = 0, len:int = numRegisters << 2; i < len; ) - { - this.name_Cl[offset] = data[i]; - offset++; - i++; - } - } - - alternativa3d function setFragmentConstantsFromNumbers(firstRegister:int, x:Number, y:Number, z:Number, w:Number = 1) : void - { - if(uint(firstRegister + 1) > 28) - { - throw new Error("Register index " + firstRegister + " is out of bounds."); - } - var offset:int = firstRegister << 2; - if(firstRegister + 1 > this.name_Kv) - { - this.name_Kv = firstRegister + 1; - } - this.name_Cl[offset] = x; - offset++; - this.name_Cl[offset] = y; - offset++; - this.name_Cl[offset] = z; - offset++; - this.name_Cl[offset] = w; - } - - alternativa3d function setFragmentConstantsFromTransform(firstRegister:int, transform:Transform3D) : void - { - if(uint(firstRegister + 3) > 28) - { - throw new Error("Register index " + firstRegister + " is out of bounds."); - } - var offset:int = firstRegister << 2; - if(firstRegister + 3 > this.name_Kv) - { - this.name_Kv = firstRegister + 3; - } - this.name_Cl[offset] = transform.a; - offset++; - this.name_Cl[offset] = transform.b; - offset++; - this.name_Cl[offset] = transform.c; - offset++; - this.name_Cl[offset] = transform.d; - offset++; - this.name_Cl[offset] = transform.e; - offset++; - this.name_Cl[offset] = transform.f; - offset++; - this.name_Cl[offset] = transform.g; - offset++; - this.name_Cl[offset] = transform.h; - offset++; - this.name_Cl[offset] = transform.i; - offset++; - this.name_Cl[offset] = transform.j; - offset++; - this.name_Cl[offset] = transform.k; - offset++; - this.name_Cl[offset] = transform.l; - } - } -} - diff --git a/src/alternativa/engine3d/core/Light3D.as b/src/alternativa/engine3d/core/Light3D.as deleted file mode 100644 index d3c0f82..0000000 --- a/src/alternativa/engine3d/core/Light3D.as +++ /dev/null @@ -1,62 +0,0 @@ -package alternativa.engine3d.core -{ - import alternativa.engine3d.alternativa3d; - - use namespace alternativa3d; - - public class Light3D extends Object3D - { - private static var lastLightNumber:uint = 0; - - public var color:uint; - - public var intensity:Number = 1; - - alternativa3d var name_cl:Transform3D = new Transform3D(); - - alternativa3d var name_oG:String; - - alternativa3d var red:Number; - - alternativa3d var green:Number; - - alternativa3d var blue:Number; - - public function Light3D() - { - super(); - this.name_oG = "l" + lastLightNumber.toString(16); - name = "L" + (lastLightNumber++).toString(); - } - - override alternativa3d function calculateVisibility(camera:Camera3D) : void - { - if(this.intensity != 0 && this.color > 0) - { - camera.alternativa3d::lights[camera.alternativa3d::lightsLength] = this; - ++camera.alternativa3d::lightsLength; - } - } - - alternativa3d function checkBound(targetObject:Object3D) : Boolean - { - return true; - } - - override public function clone() : Object3D - { - var res:Light3D = new Light3D(); - res.clonePropertiesFrom(this); - return res; - } - - override protected function clonePropertiesFrom(source:Object3D) : void - { - super.clonePropertiesFrom(source); - var src:Light3D = source as Light3D; - this.color = src.color; - this.intensity = src.intensity; - } - } -} - diff --git a/src/alternativa/engine3d/core/Object3D.as b/src/alternativa/engine3d/core/Object3D.as deleted file mode 100644 index 8c2ea6f..0000000 --- a/src/alternativa/engine3d/core/Object3D.as +++ /dev/null @@ -1,1292 +0,0 @@ -package alternativa.engine3d.core -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.collisions.EllipsoidCollider; - import alternativa.engine3d.core.events.Event3D; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.objects.Surface; - import alternativa.engine3d.shadows.ShadowRenderer; - import flash.events.Event; - import flash.events.EventPhase; - import flash.events.IEventDispatcher; - import flash.geom.Matrix3D; - import flash.geom.Vector3D; - import flash.utils.Dictionary; - import flash.utils.getQualifiedClassName; - - use namespace alternativa3d; - - [Event(name="mouseWheel",type="alternativa.engine3d.core.events.MouseEvent3D")] - [Event(name="mouseMove",type="alternativa.engine3d.core.events.MouseEvent3D")] - [Event(name="rollOut",type="alternativa.engine3d.core.events.MouseEvent3D")] - [Event(name="rollOver",type="alternativa.engine3d.core.events.MouseEvent3D")] - [Event(name="mouseOut",type="alternativa.engine3d.core.events.MouseEvent3D")] - [Event(name="mouseOver",type="alternativa.engine3d.core.events.MouseEvent3D")] - [Event(name="mouseUp",type="alternativa.engine3d.core.events.MouseEvent3D")] - [Event(name="mouseDown",type="alternativa.engine3d.core.events.MouseEvent3D")] - [Event(name="doubleClick",type="alternativa.engine3d.core.events.MouseEvent3D")] - [Event(name="click",type="alternativa.engine3d.core.events.MouseEvent3D")] - [Event(name="removed",type="alternativa.engine3d.core.events.Event3D")] - [Event(name="added",type="alternativa.engine3d.core.events.Event3D")] - public class Object3D implements IEventDispatcher - { - protected static const trm:Transform3D = new Transform3D(); - - public var data:Object; - - public var useShadow:Boolean = true; - - public var name:String; - - public var visible:Boolean = true; - - public var mouseEnabled:Boolean = true; - - public var mouseChildren:Boolean = true; - - public var doubleClickEnabled:Boolean = false; - - public var useHandCursor:Boolean = false; - - public var boundBox:BoundBox; - - alternativa3d var _x:Number = 0; - - alternativa3d var _y:Number = 0; - - alternativa3d var _z:Number = 0; - - alternativa3d var _rotationX:Number = 0; - - alternativa3d var _rotationY:Number = 0; - - alternativa3d var _rotationZ:Number = 0; - - alternativa3d var _scaleX:Number = 1; - - alternativa3d var _scaleY:Number = 1; - - alternativa3d var _scaleZ:Number = 1; - - alternativa3d var _parent:Object3D; - - alternativa3d var childrenList:Object3D; - - alternativa3d var next:Object3D; - - alternativa3d var transform:Transform3D = new Transform3D(); - - alternativa3d var inverseTransform:Transform3D = new Transform3D(); - - alternativa3d var transformChanged:Boolean = true; - - alternativa3d var cameraToLocalTransform:Transform3D = new Transform3D(); - - alternativa3d var localToCameraTransform:Transform3D = new Transform3D(); - - alternativa3d var localToGlobalTransform:Transform3D = new Transform3D(); - - alternativa3d var globalToLocalTransform:Transform3D = new Transform3D(); - - alternativa3d var culling:int; - - alternativa3d var listening:Boolean; - - alternativa3d var bubbleListeners:Object; - - alternativa3d var captureListeners:Object; - - alternativa3d var transformProcedure:Procedure; - - alternativa3d var deltaTransformProcedure:Procedure; - - alternativa3d var shadowRenderers:Vector.; - - alternativa3d var numShadowRenderers:int; - - public function Object3D() - { - super(); - } - - public function get x() : Number - { - return this.alternativa3d::_x; - } - - public function set x(value:Number) : void - { - if(this.alternativa3d::_x != value) - { - this.alternativa3d::_x = value; - this.alternativa3d::transformChanged = true; - } - } - - public function get y() : Number - { - return this.alternativa3d::_y; - } - - public function set y(value:Number) : void - { - if(this.alternativa3d::_y != value) - { - this.alternativa3d::_y = value; - this.alternativa3d::transformChanged = true; - } - } - - public function get z() : Number - { - return this.alternativa3d::_z; - } - - public function set z(value:Number) : void - { - if(this.alternativa3d::_z != value) - { - this.alternativa3d::_z = value; - this.alternativa3d::transformChanged = true; - } - } - - public function get rotationX() : Number - { - return this.alternativa3d::_rotationX; - } - - public function set rotationX(value:Number) : void - { - if(this.alternativa3d::_rotationX != value) - { - this.alternativa3d::_rotationX = value; - this.alternativa3d::transformChanged = true; - } - } - - public function get rotationY() : Number - { - return this.alternativa3d::_rotationY; - } - - public function set rotationY(value:Number) : void - { - if(this.alternativa3d::_rotationY != value) - { - this.alternativa3d::_rotationY = value; - this.alternativa3d::transformChanged = true; - } - } - - public function get rotationZ() : Number - { - return this.alternativa3d::_rotationZ; - } - - public function set rotationZ(value:Number) : void - { - if(this.alternativa3d::_rotationZ != value) - { - this.alternativa3d::_rotationZ = value; - this.alternativa3d::transformChanged = true; - } - } - - public function get scaleX() : Number - { - return this.alternativa3d::_scaleX; - } - - public function set scaleX(value:Number) : void - { - if(this.alternativa3d::_scaleX != value) - { - this.alternativa3d::_scaleX = value; - this.alternativa3d::transformChanged = true; - } - } - - public function get scaleY() : Number - { - return this.alternativa3d::_scaleY; - } - - public function set scaleY(value:Number) : void - { - if(this.alternativa3d::_scaleY != value) - { - this.alternativa3d::_scaleY = value; - this.alternativa3d::transformChanged = true; - } - } - - public function get scaleZ() : Number - { - return this.alternativa3d::_scaleZ; - } - - public function set scaleZ(value:Number) : void - { - if(this.alternativa3d::_scaleZ != value) - { - this.alternativa3d::_scaleZ = value; - this.alternativa3d::transformChanged = true; - } - } - - public function get matrix() : Matrix3D - { - if(this.alternativa3d::transformChanged) - { - this.alternativa3d::composeTransforms(); - } - return new Matrix3D(Vector.([this.alternativa3d::transform.a,this.alternativa3d::transform.e,this.alternativa3d::transform.i,0,this.alternativa3d::transform.b,this.alternativa3d::transform.f,this.alternativa3d::transform.j,0,this.alternativa3d::transform.c,this.alternativa3d::transform.g,this.alternativa3d::transform.k,0,this.alternativa3d::transform.d,this.alternativa3d::transform.h,this.alternativa3d::transform.l,1])); - } - - public function set matrix(value:Matrix3D) : void - { - var v:Vector. = value.decompose(); - var t:Vector3D = v[0]; - var r:Vector3D = v[1]; - var s:Vector3D = v[2]; - this.alternativa3d::_x = t.x; - this.alternativa3d::_y = t.y; - this.alternativa3d::_z = t.z; - this.alternativa3d::_rotationX = r.x; - this.alternativa3d::_rotationY = r.y; - this.alternativa3d::_rotationZ = r.z; - this.alternativa3d::_scaleX = s.x; - this.alternativa3d::_scaleY = s.y; - this.alternativa3d::_scaleZ = s.z; - this.alternativa3d::transformChanged = true; - } - - public function intersectRay(origin:Vector3D, direction:Vector3D) : RayIntersectionData - { - return this.alternativa3d::intersectRayChildren(origin,direction); - } - - alternativa3d function intersectRayChildren(origin:Vector3D, direction:Vector3D) : RayIntersectionData - { - var childOrigin:Vector3D = null; - var childDirection:Vector3D = null; - var childTransform:Transform3D = null; - var ma:Number = NaN; - var mb:Number = NaN; - var mc:Number = NaN; - var md:Number = NaN; - var me:Number = NaN; - var mf:Number = NaN; - var mg:Number = NaN; - var mh:Number = NaN; - var mi:Number = NaN; - var mj:Number = NaN; - var mk:Number = NaN; - var ml:Number = NaN; - var data:RayIntersectionData = null; - var minTime:Number = 1e+22; - var minData:RayIntersectionData = null; - for(var child:Object3D = this.alternativa3d::childrenList; child != null; ) - { - if(childOrigin == null) - { - childOrigin = new Vector3D(); - childDirection = new Vector3D(); - } - childTransform = child.alternativa3d::inverseTransform; - ma = childTransform.a; - mb = childTransform.b; - mc = childTransform.c; - md = childTransform.d; - me = childTransform.e; - mf = childTransform.f; - mg = childTransform.g; - mh = childTransform.h; - mi = childTransform.i; - mj = childTransform.j; - mk = childTransform.k; - ml = childTransform.l; - childOrigin.x = ma * origin.x + mb * origin.y + mc * origin.z + md; - childOrigin.y = me * origin.x + mf * origin.y + mg * origin.z + mh; - childOrigin.z = mi * origin.x + mj * origin.y + mk * origin.z + ml; - childDirection.x = ma * direction.x + mb * direction.y + mc * direction.z; - childDirection.y = me * direction.x + mf * direction.y + mg * direction.z; - childDirection.z = mi * direction.x + mj * direction.y + mk * direction.z; - data = child.intersectRay(childOrigin,childDirection); - if(data != null && data.time < minTime) - { - minData = data; - minTime = data.time; - } - child = child.alternativa3d::next; - } - return minData; - } - - public function get concatenatedMatrix() : Matrix3D - { - if(this.alternativa3d::transformChanged) - { - this.alternativa3d::composeTransforms(); - } - trm.copy(this.alternativa3d::transform); - for(var root:Object3D = this; root.parent != null; ) - { - root = root.parent; - if(root.alternativa3d::transformChanged) - { - root.alternativa3d::composeTransforms(); - } - trm.append(root.alternativa3d::transform); - } - return new Matrix3D(Vector.([trm.a,trm.e,trm.i,0,trm.b,trm.f,trm.j,0,trm.c,trm.g,trm.k,0,trm.d,trm.h,trm.l,1])); - } - - public function localToGlobal(point:Vector3D) : Vector3D - { - if(this.alternativa3d::transformChanged) - { - this.alternativa3d::composeTransforms(); - } - trm.copy(this.alternativa3d::transform); - for(var root:Object3D = this; root.parent != null; ) - { - root = root.parent; - if(root.alternativa3d::transformChanged) - { - root.alternativa3d::composeTransforms(); - } - trm.append(root.alternativa3d::transform); - } - var res:Vector3D = new Vector3D(); - res.x = trm.a * point.x + trm.b * point.y + trm.c * point.z + trm.d; - res.y = trm.e * point.x + trm.f * point.y + trm.g * point.z + trm.h; - res.z = trm.i * point.x + trm.j * point.y + trm.k * point.z + trm.l; - return res; - } - - public function globalToLocal(point:Vector3D) : Vector3D - { - if(this.alternativa3d::transformChanged) - { - this.alternativa3d::composeTransforms(); - } - trm.copy(this.alternativa3d::inverseTransform); - for(var root:Object3D = this; root.parent != null; ) - { - root = root.parent; - if(root.alternativa3d::transformChanged) - { - root.alternativa3d::composeTransforms(); - } - trm.prepend(root.alternativa3d::inverseTransform); - } - var res:Vector3D = new Vector3D(); - res.x = trm.a * point.x + trm.b * point.y + trm.c * point.z + trm.d; - res.y = trm.e * point.x + trm.f * point.y + trm.g * point.z + trm.h; - res.z = trm.i * point.x + trm.j * point.y + trm.k * point.z + trm.l; - return res; - } - - alternativa3d function get useLights() : Boolean - { - return false; - } - - public function calculateBoundBox() : void - { - if(this.boundBox != null) - { - this.boundBox.reset(); - } - else - { - this.boundBox = new BoundBox(); - } - this.alternativa3d::updateBoundBox(this.boundBox,false,null); - } - - alternativa3d function updateBoundBox(boundBox:BoundBox, hierarchy:Boolean, transform:Transform3D = null) : void - { - var child:Object3D = null; - if(hierarchy) - { - for(child = this.alternativa3d::childrenList; child != null; child = child.alternativa3d::next) - { - if(child.alternativa3d::transformChanged) - { - child.alternativa3d::composeTransforms(); - } - child.alternativa3d::localToCameraTransform.copy(child.alternativa3d::transform); - if(transform != null) - { - child.alternativa3d::localToCameraTransform.append(transform); - } - child.alternativa3d::updateBoundBox(boundBox,true,child.alternativa3d::localToCameraTransform); - } - } - } - - public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false) : void - { - var listeners:Object = null; - if(listener == null) - { - throw new TypeError("Parameter listener must be non-null."); - } - if(useCapture) - { - if(this.alternativa3d::captureListeners == null) - { - this.alternativa3d::captureListeners = new Object(); - } - listeners = this.alternativa3d::captureListeners; - } - else - { - if(this.alternativa3d::bubbleListeners == null) - { - this.alternativa3d::bubbleListeners = new Object(); - } - listeners = this.alternativa3d::bubbleListeners; - } - var vector:Vector. = listeners[type]; - if(vector == null) - { - vector = new Vector.(); - listeners[type] = vector; - } - if(vector.indexOf(listener) < 0) - { - vector.push(listener); - } - } - - public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false) : void - { - var vector:Vector. = null; - var i:int = 0; - var length:int = 0; - var j:int = 0; - var _loc9_:* = undefined; - if(listener == null) - { - throw new TypeError("Parameter listener must be non-null."); - } - var listeners:Object = useCapture ? this.alternativa3d::captureListeners : this.alternativa3d::bubbleListeners; - if(listeners != null) - { - vector = listeners[type]; - if(vector != null) - { - i = int(vector.indexOf(listener)); - if(i >= 0) - { - length = int(vector.length); - for(j = i + 1; j < length; j++,i++) - { - vector[i] = vector[j]; - } - if(length > 1) - { - vector.length = length - 1; - } - else - { - delete listeners[type]; - var _loc10_:int = 0; - var _loc11_:* = listeners; - for(_loc9_ in _loc11_) - { - } - if(!_loc9_) - { - if(listeners == this.alternativa3d::captureListeners) - { - this.alternativa3d::captureListeners = null; - } - else - { - this.alternativa3d::bubbleListeners = null; - } - } - } - } - } - } - } - - public function hasEventListener(type:String) : Boolean - { - return this.alternativa3d::captureListeners != null && Boolean(this.alternativa3d::captureListeners[type]) || this.alternativa3d::bubbleListeners != null && Boolean(this.alternativa3d::bubbleListeners[type]); - } - - public function willTrigger(type:String) : Boolean - { - for(var object:Object3D = this; object != null; ) - { - if(object.alternativa3d::captureListeners != null && object.alternativa3d::captureListeners[type] || object.alternativa3d::bubbleListeners != null && object.alternativa3d::bubbleListeners[type]) - { - return true; - } - object = object.alternativa3d::_parent; - } - return false; - } - - public function dispatchEvent(event:Event) : Boolean - { - var object:Object3D = null; - var i:int = 0; - var j:int = 0; - var length:int = 0; - var vector:Vector. = null; - var functions:Vector. = null; - if(event == null) - { - throw new TypeError("Parameter event must be non-null."); - } - var event3D:Event3D = event as Event3D; - if(event3D != null) - { - event3D.name_5E = this; - } - var branch:Vector. = new Vector.(); - var branchLength:int = 0; - for(object = this; object != null; object = object.alternativa3d::_parent) - { - branch[branchLength] = object; - branchLength++; - } - for(i = branchLength - 1; i > 0; ) - { - object = branch[i]; - if(event3D != null) - { - event3D.name_Kh = object; - event3D.name_VE = EventPhase.CAPTURING_PHASE; - } - if(object.alternativa3d::captureListeners != null) - { - vector = object.alternativa3d::captureListeners[event.type]; - if(vector != null) - { - length = int(vector.length); - functions = new Vector.(); - for(j = 0; j < length; functions[j] = vector[j],j++) - { - } - for(j = 0; j < length; (functions[j] as Function).call(null,event),j++) - { - } - } - } - i--; - } - if(event3D != null) - { - event3D.name_VE = EventPhase.AT_TARGET; - } - for(i = 0; i < branchLength; ) - { - object = branch[i]; - if(event3D != null) - { - event3D.name_Kh = object; - if(i > 0) - { - event3D.name_VE = EventPhase.BUBBLING_PHASE; - } - } - if(object.alternativa3d::bubbleListeners != null) - { - vector = object.alternativa3d::bubbleListeners[event.type]; - if(vector != null) - { - length = int(vector.length); - functions = new Vector.(); - for(j = 0; j < length; functions[j] = vector[j],j++) - { - } - for(j = 0; j < length; (functions[j] as Function).call(null,event),j++) - { - } - } - } - if(!event.bubbles) - { - break; - } - i++; - } - return true; - } - - public function get parent() : Object3D - { - return this.alternativa3d::_parent; - } - - alternativa3d function removeFromParent() : void - { - if(this.alternativa3d::_parent != null) - { - this.alternativa3d::_parent.removeFromList(this); - } - } - - public function addChild(child:Object3D) : Object3D - { - if(child == null) - { - throw new TypeError("Parameter child must be non-null."); - } - if(child == this) - { - throw new ArgumentError("An object cannot be added as a child of itself."); - } - for(var container:Object3D = this.alternativa3d::_parent; container != null; ) - { - if(container == child) - { - throw new ArgumentError("An object cannot be added as a child to one of it\'s children (or children\'s children, etc.)."); - } - container = container.alternativa3d::_parent; - } - if(child.alternativa3d::_parent != null) - { - child.alternativa3d::_parent.removeChild(child); - } - this.addToList(child); - if(child.willTrigger(Event3D.ADDED)) - { - child.dispatchEvent(new Event3D(Event3D.ADDED,true)); - } - return child; - } - - public function removeChild(child:Object3D) : Object3D - { - if(child == null) - { - throw new TypeError("Parameter child must be non-null."); - } - if(child.alternativa3d::_parent != this) - { - throw new ArgumentError("The supplied Object3D must be a child of the caller."); - } - if(child.willTrigger(Event3D.REMOVED)) - { - child.dispatchEvent(new Event3D(Event3D.REMOVED,true)); - } - var result:Object3D = this.removeFromList(child); - if(result == null) - { - throw new ArgumentError("Cannot remove child."); - } - return result; - } - - private function removeFromList(child:Object3D) : Object3D - { - var prev:Object3D = null; - var current:Object3D = null; - for(current = this.alternativa3d::childrenList; current != null; current = current.alternativa3d::next) - { - if(current == child) - { - if(prev != null) - { - prev.alternativa3d::next = current.alternativa3d::next; - } - else - { - this.alternativa3d::childrenList = current.alternativa3d::next; - } - current.alternativa3d::next = null; - current.alternativa3d::_parent = null; - return child; - } - prev = current; - } - return null; - } - - public function addChildAt(child:Object3D, index:int) : Object3D - { - if(child == null) - { - throw new TypeError("Parameter child must be non-null."); - } - if(child == this) - { - throw new ArgumentError("An object cannot be added as a child of itself."); - } - if(index < 0) - { - throw new RangeError("The supplied index is out of bounds."); - } - for(var container:Object3D = this.alternativa3d::_parent; container != null; ) - { - if(container == child) - { - throw new ArgumentError("An object cannot be added as a child to one of it\'s children (or children\'s children, etc.)."); - } - container = container.alternativa3d::_parent; - } - var current:Object3D = this.alternativa3d::childrenList; - for(var i:int = 0; i < index; i++) - { - if(current == null) - { - throw new RangeError("The supplied index is out of bounds."); - } - current = current.alternativa3d::next; - } - if(child.alternativa3d::_parent != null) - { - child.alternativa3d::_parent.removeChild(child); - } - this.addToList(child,current); - if(child.willTrigger(Event3D.ADDED)) - { - child.dispatchEvent(new Event3D(Event3D.ADDED,true)); - } - return child; - } - - public function removeChildAt(index:int) : Object3D - { - if(index < 0) - { - throw new RangeError("The supplied index is out of bounds."); - } - var current:Object3D = this.alternativa3d::childrenList; - for(var i:int = 0; i < index; i++) - { - if(current == null) - { - throw new RangeError("The supplied index is out of bounds."); - } - current = current.alternativa3d::next; - } - if(current == null) - { - throw new RangeError("The supplied index is out of bounds."); - } - this.removeChild(current); - return current; - } - - public function getChildAt(index:int) : Object3D - { - if(index < 0) - { - throw new RangeError("The supplied index is out of bounds."); - } - var current:Object3D = this.alternativa3d::childrenList; - for(var i:int = 0; i < index; i++) - { - if(current == null) - { - throw new RangeError("The supplied index is out of bounds."); - } - current = current.alternativa3d::next; - } - if(current == null) - { - throw new RangeError("The supplied index is out of bounds."); - } - return current; - } - - public function getChildIndex(child:Object3D) : int - { - if(child == null) - { - throw new TypeError("Parameter child must be non-null."); - } - if(child.alternativa3d::_parent != this) - { - throw new ArgumentError("The supplied Object3D must be a child of the caller."); - } - var index:int = 0; - for(var current:Object3D = this.alternativa3d::childrenList; current != null; current = current.alternativa3d::next) - { - if(current == child) - { - return index; - } - index++; - } - throw new ArgumentError("Cannot get child index."); - } - - public function setChildIndex(child:Object3D, index:int) : void - { - if(child == null) - { - throw new TypeError("Parameter child must be non-null."); - } - if(child.alternativa3d::_parent != this) - { - throw new ArgumentError("The supplied Object3D must be a child of the caller."); - } - if(index < 0) - { - throw new RangeError("The supplied index is out of bounds."); - } - var current:Object3D = this.alternativa3d::childrenList; - for(var i:int = 0; i < index; i++) - { - if(current == null) - { - throw new RangeError("The supplied index is out of bounds."); - } - current = current.alternativa3d::next; - } - this.removeFromList(child); - this.addToList(child,current); - } - - public function swapChildren(child1:Object3D, child2:Object3D) : void - { - var _loc3_:Object3D = null; - if(child1 == null || child2 == null) - { - throw new TypeError("Parameter child must be non-null."); - } - if(child1.alternativa3d::_parent != this || child2.alternativa3d::_parent != this) - { - throw new ArgumentError("The supplied Object3D must be a child of the caller."); - } - if(child1 != child2) - { - if(child1.alternativa3d::next == child2) - { - this.removeFromList(child2); - this.addToList(child2,child1); - } - else if(child2.alternativa3d::next == child1) - { - this.removeFromList(child1); - this.addToList(child1,child2); - } - else - { - _loc3_ = child1.alternativa3d::next; - this.removeFromList(child1); - this.addToList(child1,child2); - this.removeFromList(child2); - this.addToList(child2,_loc3_); - } - } - } - - public function swapChildrenAt(index1:int, index2:int) : void - { - var i:int = 0; - var child1:Object3D = null; - var child2:Object3D = null; - var _loc6_:Object3D = null; - if(index1 < 0 || index2 < 0) - { - throw new RangeError("The supplied index is out of bounds."); - } - if(index1 != index2) - { - child1 = this.alternativa3d::childrenList; - for(i = 0; i < index1; i++) - { - if(child1 == null) - { - throw new RangeError("The supplied index is out of bounds."); - } - child1 = child1.alternativa3d::next; - } - if(child1 == null) - { - throw new RangeError("The supplied index is out of bounds."); - } - child2 = this.alternativa3d::childrenList; - for(i = 0; i < index2; i++) - { - if(child2 == null) - { - throw new RangeError("The supplied index is out of bounds."); - } - child2 = child2.alternativa3d::next; - } - if(child2 == null) - { - throw new RangeError("The supplied index is out of bounds."); - } - if(child1 != child2) - { - if(child1.alternativa3d::next == child2) - { - this.removeFromList(child2); - this.addToList(child2,child1); - } - else if(child2.alternativa3d::next == child1) - { - this.removeFromList(child1); - this.addToList(child1,child2); - } - else - { - _loc6_ = child1.alternativa3d::next; - this.removeFromList(child1); - this.addToList(child1,child2); - this.removeFromList(child2); - this.addToList(child2,_loc6_); - } - } - } - } - - public function getChildByName(name:String) : Object3D - { - if(name == null) - { - throw new TypeError("Parameter name must be non-null."); - } - for(var child:Object3D = this.alternativa3d::childrenList; child != null; ) - { - if(child.name == name) - { - return child; - } - child = child.alternativa3d::next; - } - return null; - } - - public function contains(child:Object3D) : Boolean - { - if(child == null) - { - throw new TypeError("Parameter child must be non-null."); - } - if(child == this) - { - return true; - } - for(var object:Object3D = this.alternativa3d::childrenList; object != null; ) - { - if(object.contains(child)) - { - return true; - } - object = object.alternativa3d::next; - } - return false; - } - - public function get numChildren() : int - { - var num:int = 0; - for(var current:Object3D = this.alternativa3d::childrenList; current != null; num++,current = current.alternativa3d::next) - { - } - return num; - } - - private function addToList(child:Object3D, item:Object3D = null) : void - { - var _loc3_:Object3D = null; - child.alternativa3d::next = item; - child.alternativa3d::_parent = this; - if(item == this.alternativa3d::childrenList) - { - this.alternativa3d::childrenList = child; - } - else - { - for(_loc3_ = this.alternativa3d::childrenList; _loc3_ != null; ) - { - if(_loc3_.alternativa3d::next == item) - { - _loc3_.alternativa3d::next = child; - break; - } - _loc3_ = _loc3_.alternativa3d::next; - } - } - } - - public function getResources(hierarchy:Boolean = false, resourceType:Class = null) : Vector. - { - var key:* = undefined; - var res:Vector. = new Vector.(); - var dict:Dictionary = new Dictionary(); - var count:int = 0; - this.alternativa3d::fillResources(dict,hierarchy,resourceType); - for(key in dict) - { - var _loc9_:* = count++; - res[_loc9_] = key as Resource; - } - return res; - } - - alternativa3d function fillResources(resources:Dictionary, hierarchy:Boolean = false, resourceType:Class = null) : void - { - var child:Object3D = null; - if(hierarchy) - { - for(child = this.alternativa3d::childrenList; child != null; child = child.alternativa3d::next) - { - child.alternativa3d::fillResources(resources,hierarchy,resourceType); - } - } - } - - alternativa3d function composeTransforms() : void - { - var cosX:Number = NaN; - var sinX:Number = NaN; - var cosY:Number = NaN; - var sinY:Number = NaN; - var cosZ:Number = NaN; - var sinZ:Number = NaN; - cosX = Number(Math.cos(this.alternativa3d::_rotationX)); - sinX = Number(Math.sin(this.alternativa3d::_rotationX)); - cosY = Number(Math.cos(this.alternativa3d::_rotationY)); - sinY = Number(Math.sin(this.alternativa3d::_rotationY)); - cosZ = Number(Math.cos(this.alternativa3d::_rotationZ)); - sinZ = Number(Math.sin(this.alternativa3d::_rotationZ)); - var cosZsinY:Number = cosZ * sinY; - var sinZsinY:Number = sinZ * sinY; - var cosYscaleX:Number = cosY * this.alternativa3d::_scaleX; - var sinXscaleY:Number = sinX * this.alternativa3d::_scaleY; - var cosXscaleY:Number = cosX * this.alternativa3d::_scaleY; - var cosXscaleZ:Number = cosX * this.alternativa3d::_scaleZ; - var sinXscaleZ:Number = sinX * this.alternativa3d::_scaleZ; - this.alternativa3d::transform.a = cosZ * cosYscaleX; - this.alternativa3d::transform.b = cosZsinY * sinXscaleY - sinZ * cosXscaleY; - this.alternativa3d::transform.c = cosZsinY * cosXscaleZ + sinZ * sinXscaleZ; - this.alternativa3d::transform.d = this.alternativa3d::_x; - this.alternativa3d::transform.e = sinZ * cosYscaleX; - this.alternativa3d::transform.f = sinZsinY * sinXscaleY + cosZ * cosXscaleY; - this.alternativa3d::transform.g = sinZsinY * cosXscaleZ - cosZ * sinXscaleZ; - this.alternativa3d::transform.h = this.alternativa3d::_y; - this.alternativa3d::transform.i = -sinY * this.alternativa3d::_scaleX; - this.alternativa3d::transform.j = cosY * sinXscaleY; - this.alternativa3d::transform.k = cosY * cosXscaleZ; - this.alternativa3d::transform.l = this.alternativa3d::_z; - var sinXsinY:Number = sinX * sinY; - cosYscaleX = cosY / this.alternativa3d::_scaleX; - cosXscaleY = cosX / this.alternativa3d::_scaleY; - sinXscaleZ = -sinX / this.alternativa3d::_scaleZ; - cosXscaleZ = cosX / this.alternativa3d::_scaleZ; - this.alternativa3d::inverseTransform.a = cosZ * cosYscaleX; - this.alternativa3d::inverseTransform.b = sinZ * cosYscaleX; - this.alternativa3d::inverseTransform.c = -sinY / this.alternativa3d::_scaleX; - this.alternativa3d::inverseTransform.d = -this.alternativa3d::inverseTransform.a * this.alternativa3d::_x - this.alternativa3d::inverseTransform.b * this.alternativa3d::_y - this.alternativa3d::inverseTransform.c * this.alternativa3d::_z; - this.alternativa3d::inverseTransform.e = sinXsinY * cosZ / this.alternativa3d::_scaleY - sinZ * cosXscaleY; - this.alternativa3d::inverseTransform.f = cosZ * cosXscaleY + sinXsinY * sinZ / this.alternativa3d::_scaleY; - this.alternativa3d::inverseTransform.g = sinX * cosY / this.alternativa3d::_scaleY; - this.alternativa3d::inverseTransform.h = -this.alternativa3d::inverseTransform.e * this.alternativa3d::_x - this.alternativa3d::inverseTransform.f * this.alternativa3d::_y - this.alternativa3d::inverseTransform.g * this.alternativa3d::_z; - this.alternativa3d::inverseTransform.i = cosZ * sinY * cosXscaleZ - sinZ * sinXscaleZ; - this.alternativa3d::inverseTransform.j = cosZ * sinXscaleZ + sinY * sinZ * cosXscaleZ; - this.alternativa3d::inverseTransform.k = cosY * cosXscaleZ; - this.alternativa3d::inverseTransform.l = -this.alternativa3d::inverseTransform.i * this.alternativa3d::_x - this.alternativa3d::inverseTransform.j * this.alternativa3d::_y - this.alternativa3d::inverseTransform.k * this.alternativa3d::_z; - this.alternativa3d::transformChanged = false; - } - - alternativa3d function calculateVisibility(camera:Camera3D) : void - { - } - - alternativa3d function calculateChildrenVisibility(camera:Camera3D) : void - { - for(var child:Object3D = this.alternativa3d::childrenList; child != null; ) - { - if(child.visible) - { - if(child.alternativa3d::transformChanged) - { - child.alternativa3d::composeTransforms(); - } - child.alternativa3d::cameraToLocalTransform.combine(child.alternativa3d::inverseTransform,this.alternativa3d::cameraToLocalTransform); - child.alternativa3d::listening = this.alternativa3d::listening || child.alternativa3d::bubbleListeners != null || child.alternativa3d::captureListeners != null; - if(child.boundBox != null) - { - camera.alternativa3d::calculateFrustum(child.alternativa3d::cameraToLocalTransform); - child.alternativa3d::culling = child.boundBox.alternativa3d::checkFrustumCulling(camera.alternativa3d::frustum,63); - } - else - { - child.alternativa3d::culling = 63; - } - if(child.alternativa3d::culling >= 0) - { - child.alternativa3d::calculateVisibility(camera); - } - if(child.alternativa3d::childrenList != null) - { - child.alternativa3d::calculateChildrenVisibility(camera); - } - } - child = child.alternativa3d::next; - } - } - - alternativa3d function collectDraws(camera:Camera3D, lights:Vector., lightsLength:int) : void - { - } - - alternativa3d function collectChildrenDraws(camera:Camera3D, lights:Vector., lightsLength:int) : void - { - var i:int = 0; - var light:Light3D = null; - var childLightsLength:int = 0; - for(var child:Object3D = this.alternativa3d::childrenList; child != null; ) - { - if(child.visible) - { - child.alternativa3d::localToCameraTransform.combine(this.alternativa3d::localToCameraTransform,child.alternativa3d::transform); - if(child.alternativa3d::culling >= 0 && (child.boundBox == null || camera.alternativa3d::occludersLength == 0 || Boolean(child.boundBox.alternativa3d::checkOcclusionCulling(camera,child)))) - { - if(child.alternativa3d::listening && child.boundBox != null) - { - camera.alternativa3d::calculateRays(child.alternativa3d::cameraToLocalTransform); - child.alternativa3d::listening = child.boundBox.alternativa3d::checkRays(camera.alternativa3d::origins,camera.alternativa3d::directions,camera.alternativa3d::raysLength); - } - if(lightsLength > 0 && child.alternativa3d::useLights) - { - if(child.boundBox != null) - { - childLightsLength = 0; - for(i = 0; i < lightsLength; ) - { - light = lights[i]; - light.name_cl.combine(child.alternativa3d::cameraToLocalTransform,light.alternativa3d::localToCameraTransform); - if(light.boundBox == null || light.alternativa3d::checkBound(child)) - { - camera.alternativa3d::childLights[childLightsLength] = light; - childLightsLength++; - } - i++; - } - child.alternativa3d::collectDraws(camera,camera.alternativa3d::childLights,childLightsLength); - } - else - { - for(i = 0; i < lightsLength; ) - { - light = lights[i]; - light.name_cl.combine(child.alternativa3d::cameraToLocalTransform,light.alternativa3d::localToCameraTransform); - i++; - } - child.alternativa3d::collectDraws(camera,lights,lightsLength); - } - } - else - { - child.alternativa3d::collectDraws(camera,null,0); - } - } - if(child.alternativa3d::childrenList != null) - { - child.alternativa3d::collectChildrenDraws(camera,lights,lightsLength); - } - } - child = child.alternativa3d::next; - } - } - - alternativa3d function collectGeometry(collider:EllipsoidCollider, excludedObjects:Dictionary) : void - { - } - - alternativa3d function collectChildrenGeometry(collider:EllipsoidCollider, excludedObjects:Dictionary) : void - { - var intersects:Boolean = false; - for(var child:Object3D = this.alternativa3d::childrenList; child != null; ) - { - if(excludedObjects == null || !excludedObjects[child]) - { - if(child.alternativa3d::transformChanged) - { - child.alternativa3d::composeTransforms(); - } - child.alternativa3d::globalToLocalTransform.combine(child.alternativa3d::inverseTransform,this.alternativa3d::globalToLocalTransform); - intersects = true; - if(child.boundBox != null) - { - collider.alternativa3d::calculateSphere(child.alternativa3d::globalToLocalTransform); - intersects = Boolean(child.boundBox.alternativa3d::checkSphere(collider.alternativa3d::sphere)); - } - if(intersects) - { - child.alternativa3d::localToGlobalTransform.combine(this.alternativa3d::localToGlobalTransform,child.alternativa3d::transform); - child.alternativa3d::collectGeometry(collider,excludedObjects); - } - if(child.alternativa3d::childrenList != null) - { - child.alternativa3d::collectChildrenGeometry(collider,excludedObjects); - } - } - child = child.alternativa3d::next; - } - } - - alternativa3d function setTransformConstants(drawUnit:DrawUnit, surface:Surface, vertexShader:Linker, camera:Camera3D) : void - { - } - - public function clone() : Object3D - { - var res:Object3D = new Object3D(); - res.clonePropertiesFrom(this); - return res; - } - - protected function clonePropertiesFrom(source:Object3D) : void - { - var lastChild:Object3D = null; - var newChild:Object3D = null; - this.name = source.name; - this.visible = source.visible; - this.mouseEnabled = source.mouseEnabled; - this.mouseChildren = source.mouseChildren; - this.doubleClickEnabled = source.doubleClickEnabled; - this.useHandCursor = source.useHandCursor; - this.boundBox = Boolean(source.boundBox) ? source.boundBox.clone() : null; - this.alternativa3d::_x = source.alternativa3d::_x; - this.alternativa3d::_y = source.alternativa3d::_y; - this.alternativa3d::_z = source.alternativa3d::_z; - this.alternativa3d::_rotationX = source.alternativa3d::_rotationX; - this.alternativa3d::_rotationY = source.alternativa3d::_rotationY; - this.alternativa3d::_rotationZ = source.alternativa3d::_rotationZ; - this.alternativa3d::_scaleX = source.alternativa3d::_scaleX; - this.alternativa3d::_scaleY = source.alternativa3d::_scaleY; - this.alternativa3d::_scaleZ = source.alternativa3d::_scaleZ; - for(var child:Object3D = source.alternativa3d::childrenList; child != null; child = child.alternativa3d::next) - { - newChild = child.clone(); - if(this.alternativa3d::childrenList != null) - { - lastChild.alternativa3d::next = newChild; - } - else - { - this.alternativa3d::childrenList = newChild; - } - lastChild = newChild; - newChild.alternativa3d::_parent = this; - } - } - - public function toString() : String - { - var className:String = getQualifiedClassName(this); - return "[" + className.substr(className.indexOf("::") + 2) + " " + this.name + "]"; - } - } -} - diff --git a/src/alternativa/engine3d/core/Occluder.as b/src/alternativa/engine3d/core/Occluder.as deleted file mode 100644 index afad26b..0000000 --- a/src/alternativa/engine3d/core/Occluder.as +++ /dev/null @@ -1,21 +0,0 @@ -package alternativa.engine3d.core -{ - import alternativa.engine3d.alternativa3d; - - use namespace alternativa3d; - - public class Occluder extends Object3D - { - public function Occluder() - { - super(); - } - - override alternativa3d function calculateVisibility(camera:Camera3D) : void - { - camera.alternativa3d::occluders[camera.alternativa3d::occludersLength] = this; - ++camera.alternativa3d::occludersLength; - } - } -} - diff --git a/src/alternativa/engine3d/core/RayIntersectionData.as b/src/alternativa/engine3d/core/RayIntersectionData.as deleted file mode 100644 index 28b8045..0000000 --- a/src/alternativa/engine3d/core/RayIntersectionData.as +++ /dev/null @@ -1,30 +0,0 @@ -package alternativa.engine3d.core -{ - import alternativa.engine3d.objects.Surface; - import flash.geom.Point; - import flash.geom.Vector3D; - - public class RayIntersectionData - { - public var object:Object3D; - - public var point:Vector3D; - - public var surface:Surface; - - public var time:Number; - - public var uv:Point; - - public function RayIntersectionData() - { - super(); - } - - public function toString() : String - { - return "[RayIntersectionData " + this.object + ", " + this.point + ", " + this.uv + ", " + this.time + "]"; - } - } -} - diff --git a/src/alternativa/engine3d/core/RenderPriority.as b/src/alternativa/engine3d/core/RenderPriority.as deleted file mode 100644 index 6e03cdd..0000000 --- a/src/alternativa/engine3d/core/RenderPriority.as +++ /dev/null @@ -1,37 +0,0 @@ -package alternativa.engine3d.core -{ - public class RenderPriority - { - public static const SKY:int = 0; - - public static const OPAQUE_SORT:int = 1; - - public static const OPAQUE:int = 2; - - public static const DECALS:int = 3; - - public static const TANK_SHADOW:int = 4; - - public static const TANK_OPAQUE:int = 5; - - public static const SHADOWS:int = 6; - - public static const SHADOWED_LIGHTS:int = 7; - - public static const LIGHTS:int = 8; - - public static const FOG:int = 9; - - public static const TRANSPARENT_SORT:int = 10; - - public static const NEXT_LAYER:int = 11; - - public static const EFFECTS:int = 12; - - public function RenderPriority() - { - super(); - } - } -} - diff --git a/src/alternativa/engine3d/core/Renderer.as b/src/alternativa/engine3d/core/Renderer.as deleted file mode 100644 index 11322e0..0000000 --- a/src/alternativa/engine3d/core/Renderer.as +++ /dev/null @@ -1,270 +0,0 @@ -package alternativa.engine3d.core -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.materials.ShaderProgram; - import flash.display3D.Context3D; - import flash.display3D.Context3DCompareMode; - import flash.display3D.Context3DProgramType; - import flash.display3D.IndexBuffer3D; - import flash.display3D.Program3D; - - use namespace alternativa3d; - - public class Renderer - { - protected static var collector:DrawUnit; - - private static var _usedBuffers:uint = 0; - - private static var _usedTextures:uint = 0; - - alternativa3d var camera:Camera3D; - - alternativa3d var name_T5:Vector. = new Vector.(); - - public function Renderer() - { - super(); - } - - alternativa3d function render(context:Context3D) : void - { - var list:DrawUnit = null; - var next:DrawUnit = null; - var drawUnitsLength:int = int(this.name_T5.length); - for(var i:int = 0; i < drawUnitsLength; i++) - { - list = this.name_T5[i]; - if(list != null) - { - switch(i) - { - case RenderPriority.SKY: - context.setDepthTest(false,Context3DCompareMode.ALWAYS); - break; - case RenderPriority.OPAQUE_SORT: - context.setDepthTest(true,Context3DCompareMode.LESS); - break; - case RenderPriority.OPAQUE: - context.setDepthTest(true,Context3DCompareMode.LESS); - break; - case RenderPriority.TANK_SHADOW: - context.setDepthTest(false,Context3DCompareMode.LESS_EQUAL); - break; - case RenderPriority.TANK_OPAQUE: - context.setDepthTest(true,Context3DCompareMode.LESS); - break; - case RenderPriority.DECALS: - context.setDepthTest(false,Context3DCompareMode.LESS_EQUAL); - break; - case RenderPriority.SHADOWS: - context.setDepthTest(false,Context3DCompareMode.EQUAL); - break; - case RenderPriority.SHADOWED_LIGHTS: - context.setDepthTest(false,Context3DCompareMode.EQUAL); - break; - case RenderPriority.LIGHTS: - context.setDepthTest(false,Context3DCompareMode.EQUAL); - break; - case RenderPriority.FOG: - context.setDepthTest(false,Context3DCompareMode.EQUAL); - break; - case RenderPriority.TRANSPARENT_SORT: - if(list.alternativa3d::next != null) - { - list = this.alternativa3d::sortByAverageZ(list); - } - context.setDepthTest(false,Context3DCompareMode.LESS); - break; - case RenderPriority.NEXT_LAYER: - context.setDepthTest(false,Context3DCompareMode.ALWAYS); - break; - case RenderPriority.EFFECTS: - if(list.alternativa3d::next != null) - { - list = this.alternativa3d::sortByAverageZ(list); - } - context.setDepthTest(false,Context3DCompareMode.LESS); - } - // Rendering, XXX: this was missing from the decompile so I just coppied the code from latest A3D (8.32) - while (list != null) { - next = list.next; - renderDrawUnit(list, context, camera); - // Send to collector - list.clear(); - list.next = collector; - collector = list; - list = next; - } - } - } - - this.name_T5.length = 0; - } - - alternativa3d function createDrawUnit(object:Object3D, program:Program3D, indexBuffer:IndexBuffer3D, firstIndex:int, numTriangles:int, debugShader:ShaderProgram = null) : DrawUnit - { - var res:DrawUnit = null; - if(collector != null) - { - res = collector; - collector = collector.alternativa3d::next; - res.alternativa3d::next = null; - } - else - { - res = new DrawUnit(); - } - res.alternativa3d::object = object; - res.alternativa3d::program = program; - res.alternativa3d::indexBuffer = indexBuffer; - res.alternativa3d::firstIndex = firstIndex; - res.alternativa3d::numTriangles = numTriangles; - return res; - } - - alternativa3d function addDrawUnit(drawUnit:DrawUnit, renderPriority:int) : void - { - if(renderPriority >= this.name_T5.length) - { - this.name_T5.length = renderPriority + 1; - } - drawUnit.alternativa3d::next = this.name_T5[renderPriority]; - this.name_T5[renderPriority] = drawUnit; - } - - protected function renderDrawUnit(drawUnit:DrawUnit, context:Context3D, camera:Camera3D) : void - { - var bufferIndex:int = 0; - var bufferBit:int = 0; - var currentBuffers:int = 0; - var textureSampler:int = 0; - var textureBit:int = 0; - var currentTextures:int = 0; - context.setBlendFactors(drawUnit.alternativa3d::blendSource,drawUnit.alternativa3d::blendDestination); - context.setCulling(drawUnit.alternativa3d::culling); - for(var i:int = 0; i < drawUnit.name_3G; i++) - { - bufferIndex = int(drawUnit.name_else[i]); - bufferBit = 1 << bufferIndex; - currentBuffers |= bufferBit; - _usedBuffers &= ~bufferBit; - context.setVertexBufferAt(bufferIndex,drawUnit.alternativa3d::vertexBuffers[i],drawUnit.name_nw[i],drawUnit.name_EL[i]); - } - if(drawUnit.name_9X > 0) - { - context.setProgramConstantsFromVector(Context3DProgramType.VERTEX,0,drawUnit.name_Aq,drawUnit.name_9X); - } - if(drawUnit.name_Kv > 0) - { - context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT,0,drawUnit.name_Cl,drawUnit.name_Kv); - } - for(i = 0; i < drawUnit.name_Oq; ) - { - textureSampler = int(drawUnit.name_kR[i]); - textureBit = 1 << textureSampler; - currentTextures |= textureBit; - _usedTextures &= ~textureBit; - context.setTextureAt(textureSampler,drawUnit.alternativa3d::textures[i]); - i++; - } - context.setProgram(drawUnit.alternativa3d::program); - for(bufferIndex = 0; _usedBuffers > 0; ) - { - bufferBit = _usedBuffers & 1; - _usedBuffers >>= 1; - if(Boolean(bufferBit)) - { - context.setVertexBufferAt(bufferIndex,null); - } - bufferIndex++; - } - for(textureSampler = 0; _usedTextures > 0; ) - { - textureBit = _usedTextures & 1; - _usedTextures >>= 1; - if(Boolean(textureBit)) - { - context.setTextureAt(textureSampler,null); - } - textureSampler++; - } - context.drawTriangles(drawUnit.alternativa3d::indexBuffer,drawUnit.alternativa3d::firstIndex,drawUnit.alternativa3d::numTriangles); - _usedBuffers = currentBuffers; - _usedTextures = currentTextures; - ++camera.alternativa3d::numDraws; - camera.alternativa3d::numTriangles += drawUnit.alternativa3d::numTriangles; - } - - alternativa3d function sortByAverageZ(list:DrawUnit, direction:Boolean = true) : DrawUnit - { - var left:DrawUnit = list; - var right:DrawUnit = list.alternativa3d::next; - while(right != null && right.alternativa3d::next != null) - { - list = list.alternativa3d::next; - right = right.alternativa3d::next.alternativa3d::next; - } - right = list.alternativa3d::next; - list.alternativa3d::next = null; - if(left.alternativa3d::next != null) - { - left = this.alternativa3d::sortByAverageZ(left,direction); - } - if(right.alternativa3d::next != null) - { - right = this.alternativa3d::sortByAverageZ(right,direction); - } - var flag:Boolean = direction ? left.alternativa3d::object.alternativa3d::localToCameraTransform.l > right.alternativa3d::object.alternativa3d::localToCameraTransform.l : left.alternativa3d::object.alternativa3d::localToCameraTransform.l < right.alternativa3d::object.alternativa3d::localToCameraTransform.l; - if(flag) - { - list = left; - left = left.alternativa3d::next; - } - else - { - list = right; - right = right.alternativa3d::next; - } - var last:DrawUnit = list; - while(left != null) - { - if(right == null) - { - last.alternativa3d::next = left; - return list; - } - if(flag) - { - if(direction ? left.alternativa3d::object.alternativa3d::localToCameraTransform.l > right.alternativa3d::object.alternativa3d::localToCameraTransform.l : left.alternativa3d::object.alternativa3d::localToCameraTransform.l < right.alternativa3d::object.alternativa3d::localToCameraTransform.l) - { - last = left; - left = left.alternativa3d::next; - } - else - { - last.alternativa3d::next = right; - last = right; - right = right.alternativa3d::next; - flag = false; - } - } - else if(direction ? left.alternativa3d::object.alternativa3d::localToCameraTransform.l < right.alternativa3d::object.alternativa3d::localToCameraTransform.l : left.alternativa3d::object.alternativa3d::localToCameraTransform.l > right.alternativa3d::object.alternativa3d::localToCameraTransform.l) - { - last = right; - right = right.alternativa3d::next; - } - else - { - last.alternativa3d::next = left; - last = left; - left = left.alternativa3d::next; - flag = true; - } - } - last.alternativa3d::next = right; - return list; - } - } -} - diff --git a/src/alternativa/engine3d/core/Resource.as b/src/alternativa/engine3d/core/Resource.as deleted file mode 100644 index 158e3a2..0000000 --- a/src/alternativa/engine3d/core/Resource.as +++ /dev/null @@ -1,27 +0,0 @@ -package alternativa.engine3d.core -{ - import flash.display3D.Context3D; - - public class Resource - { - public function Resource() - { - super(); - } - - public function get isUploaded() : Boolean - { - return false; - } - - public function upload(context3D:Context3D) : void - { - throw new Error("Cannot upload without data"); - } - - public function dispose() : void - { - } - } -} - diff --git a/src/alternativa/engine3d/core/Transform3D.as b/src/alternativa/engine3d/core/Transform3D.as deleted file mode 100644 index ed7a460..0000000 --- a/src/alternativa/engine3d/core/Transform3D.as +++ /dev/null @@ -1,278 +0,0 @@ -package alternativa.engine3d.core -{ - import alternativa.engine3d.alternativa3d; - - use namespace alternativa3d; - - public class Transform3D - { - public var a:Number = 1; - - public var b:Number = 0; - - public var c:Number = 0; - - public var d:Number = 0; - - public var e:Number = 0; - - public var f:Number = 1; - - public var g:Number = 0; - - public var h:Number = 0; - - public var i:Number = 0; - - public var j:Number = 0; - - public var k:Number = 1; - - public var l:Number = 0; - - public function Transform3D() - { - super(); - } - - public function identity() : void - { - this.a = 1; - this.b = 0; - this.c = 0; - this.d = 0; - this.e = 0; - this.f = 1; - this.g = 0; - this.h = 0; - this.i = 0; - this.j = 0; - this.k = 1; - this.l = 0; - } - - public function compose(x:Number, y:Number, z:Number, rotationX:Number, rotationY:Number, rotationZ:Number, scaleX:Number, scaleY:Number, scaleZ:Number) : void - { - var cosX:Number = Number(Math.cos(rotationX)); - var sinX:Number = Number(Math.sin(rotationX)); - var cosY:Number = Number(Math.cos(rotationY)); - var sinY:Number = Number(Math.sin(rotationY)); - var cosZ:Number = Number(Math.cos(rotationZ)); - var sinZ:Number = Number(Math.sin(rotationZ)); - var cosZsinY:Number = cosZ * sinY; - var sinZsinY:Number = sinZ * sinY; - var cosYscaleX:Number = cosY * scaleX; - var sinXscaleY:Number = sinX * scaleY; - var cosXscaleY:Number = cosX * scaleY; - var cosXscaleZ:Number = cosX * scaleZ; - var sinXscaleZ:Number = sinX * scaleZ; - this.a = cosZ * cosYscaleX; - this.b = cosZsinY * sinXscaleY - sinZ * cosXscaleY; - this.c = cosZsinY * cosXscaleZ + sinZ * sinXscaleZ; - this.d = x; - this.e = sinZ * cosYscaleX; - this.f = sinZsinY * sinXscaleY + cosZ * cosXscaleY; - this.g = sinZsinY * cosXscaleZ - cosZ * sinXscaleZ; - this.h = y; - this.i = -sinY * scaleX; - this.j = cosY * sinXscaleY; - this.k = cosY * cosXscaleZ; - this.l = z; - } - - public function composeInverse(x:Number, y:Number, z:Number, rotationX:Number, rotationY:Number, rotationZ:Number, scaleX:Number, scaleY:Number, scaleZ:Number) : void - { - var cosX:Number = Number(Math.cos(rotationX)); - var sinX:Number = Number(Math.sin(-rotationX)); - var cosY:Number = Number(Math.cos(rotationY)); - var sinY:Number = Number(Math.sin(-rotationY)); - var cosZ:Number = Number(Math.cos(rotationZ)); - var sinZ:Number = Number(Math.sin(-rotationZ)); - var sinXsinY:Number = sinX * sinY; - var cosYscaleX:Number = cosY / scaleX; - var cosXscaleY:Number = cosX / scaleY; - var sinXscaleZ:Number = sinX / scaleZ; - var cosXscaleZ:Number = cosX / scaleZ; - this.a = cosZ * cosYscaleX; - this.b = -sinZ * cosYscaleX; - this.c = sinY / scaleX; - this.d = -this.a * x - this.b * y - this.c * z; - this.e = sinZ * cosXscaleY + sinXsinY * cosZ / scaleY; - this.f = cosZ * cosXscaleY - sinXsinY * sinZ / scaleY; - this.g = -sinX * cosY / scaleY; - this.h = -this.e * x - this.f * y - this.g * z; - this.i = sinZ * sinXscaleZ - cosZ * sinY * cosXscaleZ; - this.j = cosZ * sinXscaleZ + sinY * sinZ * cosXscaleZ; - this.k = cosY * cosXscaleZ; - this.l = -this.i * x - this.j * y - this.k * z; - } - - public function invert() : void - { - var ta:Number = this.a; - var tb:Number = this.b; - var tc:Number = this.c; - var td:Number = this.d; - var te:Number = this.e; - var tf:Number = this.f; - var tg:Number = this.g; - var th:Number = this.h; - var ti:Number = this.i; - var tj:Number = this.j; - var tk:Number = this.k; - var tl:Number = this.l; - var det:Number = 1 / (-tc * tf * ti + tb * tg * ti + tc * te * tj - ta * tg * tj - tb * te * tk + ta * tf * tk); - this.a = (-tg * tj + tf * tk) * det; - this.b = (tc * tj - tb * tk) * det; - this.c = (-tc * tf + tb * tg) * det; - this.d = (td * tg * tj - tc * th * tj - td * tf * tk + tb * th * tk + tc * tf * tl - tb * tg * tl) * det; - this.e = (tg * ti - te * tk) * det; - this.f = (-tc * ti + ta * tk) * det; - this.g = (tc * te - ta * tg) * det; - this.h = (tc * th * ti - td * tg * ti + td * te * tk - ta * th * tk - tc * te * tl + ta * tg * tl) * det; - this.i = (-tf * ti + te * tj) * det; - this.j = (tb * ti - ta * tj) * det; - this.k = (-tb * te + ta * tf) * det; - this.l = (td * tf * ti - tb * th * ti - td * te * tj + ta * th * tj + tb * te * tl - ta * tf * tl) * det; - } - - public function initFromVector(vector:Vector.) : void - { - this.a = vector[0]; - this.b = vector[1]; - this.c = vector[2]; - this.d = vector[3]; - this.e = vector[4]; - this.f = vector[5]; - this.g = vector[6]; - this.h = vector[7]; - this.i = vector[8]; - this.j = vector[9]; - this.k = vector[10]; - this.l = vector[11]; - } - - public function append(transform:Transform3D) : void - { - var ta:Number = this.a; - var tb:Number = this.b; - var tc:Number = this.c; - var td:Number = this.d; - var te:Number = this.e; - var tf:Number = this.f; - var tg:Number = this.g; - var th:Number = this.h; - var ti:Number = this.i; - var tj:Number = this.j; - var tk:Number = this.k; - var tl:Number = this.l; - this.a = transform.a * ta + transform.b * te + transform.c * ti; - this.b = transform.a * tb + transform.b * tf + transform.c * tj; - this.c = transform.a * tc + transform.b * tg + transform.c * tk; - this.d = transform.a * td + transform.b * th + transform.c * tl + transform.d; - this.e = transform.e * ta + transform.f * te + transform.g * ti; - this.f = transform.e * tb + transform.f * tf + transform.g * tj; - this.g = transform.e * tc + transform.f * tg + transform.g * tk; - this.h = transform.e * td + transform.f * th + transform.g * tl + transform.h; - this.i = transform.i * ta + transform.j * te + transform.k * ti; - this.j = transform.i * tb + transform.j * tf + transform.k * tj; - this.k = transform.i * tc + transform.j * tg + transform.k * tk; - this.l = transform.i * td + transform.j * th + transform.k * tl + transform.l; - } - - public function prepend(transform:Transform3D) : void - { - var ta:Number = this.a; - var tb:Number = this.b; - var tc:Number = this.c; - var td:Number = this.d; - var te:Number = this.e; - var tf:Number = this.f; - var tg:Number = this.g; - var th:Number = this.h; - var ti:Number = this.i; - var tj:Number = this.j; - var tk:Number = this.k; - var tl:Number = this.l; - this.a = ta * transform.a + tb * transform.e + tc * transform.i; - this.b = ta * transform.b + tb * transform.f + tc * transform.j; - this.c = ta * transform.c + tb * transform.g + tc * transform.k; - this.d = ta * transform.d + tb * transform.h + tc * transform.l + td; - this.e = te * transform.a + tf * transform.e + tg * transform.i; - this.f = te * transform.b + tf * transform.f + tg * transform.j; - this.g = te * transform.c + tf * transform.g + tg * transform.k; - this.h = te * transform.d + tf * transform.h + tg * transform.l + th; - this.i = ti * transform.a + tj * transform.e + tk * transform.i; - this.j = ti * transform.b + tj * transform.f + tk * transform.j; - this.k = ti * transform.c + tj * transform.g + tk * transform.k; - this.l = ti * transform.d + tj * transform.h + tk * transform.l + tl; - } - - public function combine(transformA:Transform3D, transformB:Transform3D) : void - { - this.a = transformA.a * transformB.a + transformA.b * transformB.e + transformA.c * transformB.i; - this.b = transformA.a * transformB.b + transformA.b * transformB.f + transformA.c * transformB.j; - this.c = transformA.a * transformB.c + transformA.b * transformB.g + transformA.c * transformB.k; - this.d = transformA.a * transformB.d + transformA.b * transformB.h + transformA.c * transformB.l + transformA.d; - this.e = transformA.e * transformB.a + transformA.f * transformB.e + transformA.g * transformB.i; - this.f = transformA.e * transformB.b + transformA.f * transformB.f + transformA.g * transformB.j; - this.g = transformA.e * transformB.c + transformA.f * transformB.g + transformA.g * transformB.k; - this.h = transformA.e * transformB.d + transformA.f * transformB.h + transformA.g * transformB.l + transformA.h; - this.i = transformA.i * transformB.a + transformA.j * transformB.e + transformA.k * transformB.i; - this.j = transformA.i * transformB.b + transformA.j * transformB.f + transformA.k * transformB.j; - this.k = transformA.i * transformB.c + transformA.j * transformB.g + transformA.k * transformB.k; - this.l = transformA.i * transformB.d + transformA.j * transformB.h + transformA.k * transformB.l + transformA.l; - } - - public function calculateInversion(source:Transform3D) : void - { - var ta:Number = source.a; - var tb:Number = source.b; - var tc:Number = source.c; - var td:Number = source.d; - var te:Number = source.e; - var tf:Number = source.f; - var tg:Number = source.g; - var th:Number = source.h; - var ti:Number = source.i; - var tj:Number = source.j; - var tk:Number = source.k; - var tl:Number = source.l; - var det:Number = 1 / (-tc * tf * ti + tb * tg * ti + tc * te * tj - ta * tg * tj - tb * te * tk + ta * tf * tk); - this.a = (-tg * tj + tf * tk) * det; - this.b = (tc * tj - tb * tk) * det; - this.c = (-tc * tf + tb * tg) * det; - this.d = (td * tg * tj - tc * th * tj - td * tf * tk + tb * th * tk + tc * tf * tl - tb * tg * tl) * det; - this.e = (tg * ti - te * tk) * det; - this.f = (-tc * ti + ta * tk) * det; - this.g = (tc * te - ta * tg) * det; - this.h = (tc * th * ti - td * tg * ti + td * te * tk - ta * th * tk - tc * te * tl + ta * tg * tl) * det; - this.i = (-tf * ti + te * tj) * det; - this.j = (tb * ti - ta * tj) * det; - this.k = (-tb * te + ta * tf) * det; - this.l = (td * tf * ti - tb * th * ti - td * te * tj + ta * th * tj + tb * te * tl - ta * tf * tl) * det; - } - - public function copy(source:Transform3D) : void - { - this.a = source.a; - this.b = source.b; - this.c = source.c; - this.d = source.d; - this.e = source.e; - this.f = source.f; - this.g = source.g; - this.h = source.h; - this.i = source.i; - this.j = source.j; - this.k = source.k; - this.l = source.l; - } - - public function toString() : String - { - return "[Transform3D" + " a:" + this.a.toFixed(3) + " b:" + this.b.toFixed(3) + " c:" + this.a.toFixed(3) + " d:" + this.d.toFixed(3) + " e:" + this.e.toFixed(3) + " f:" + this.f.toFixed(3) + " g:" + this.a.toFixed(3) + " h:" + this.h.toFixed(3) + " i:" + this.i.toFixed(3) + " j:" + this.j.toFixed(3) + " k:" + this.a.toFixed(3) + " l:" + this.l.toFixed(3) + "]"; - } - } -} - diff --git a/src/alternativa/engine3d/core/VertexAttributes.as b/src/alternativa/engine3d/core/VertexAttributes.as deleted file mode 100644 index c8d14fa..0000000 --- a/src/alternativa/engine3d/core/VertexAttributes.as +++ /dev/null @@ -1,45 +0,0 @@ -package alternativa.engine3d.core -{ - import alternativa.engine3d.alternativa3d; - import flash.display3D.Context3DVertexBufferFormat; - - use namespace alternativa3d; - - public class VertexAttributes - { - public static const POSITION:uint = 1; - - public static const NORMAL:uint = 2; - - public static const TANGENT4:uint = 3; - - public static const JOINTS:Vector. = Vector.([4,5,6,7]); - - public static const TEXCOORDS:Vector. = Vector.([8,9,10,11,12,13,14,15]); - - alternativa3d static const FORMATS:Array = [Context3DVertexBufferFormat.FLOAT_1,Context3DVertexBufferFormat.FLOAT_3,Context3DVertexBufferFormat.FLOAT_3,Context3DVertexBufferFormat.FLOAT_4,Context3DVertexBufferFormat.FLOAT_4,Context3DVertexBufferFormat.FLOAT_4,Context3DVertexBufferFormat.FLOAT_4,Context3DVertexBufferFormat.FLOAT_4,Context3DVertexBufferFormat.FLOAT_2,Context3DVertexBufferFormat.FLOAT_2,Context3DVertexBufferFormat.FLOAT_2,Context3DVertexBufferFormat.FLOAT_2,Context3DVertexBufferFormat.FLOAT_2,Context3DVertexBufferFormat.FLOAT_2,Context3DVertexBufferFormat.FLOAT_2,Context3DVertexBufferFormat.FLOAT_2]; - - public function VertexAttributes() - { - super(); - } - - public static function getAttributeStride(attribute:int) : int - { - switch(alternativa3d::FORMATS[attribute]) - { - case Context3DVertexBufferFormat.FLOAT_1: - return 1; - case Context3DVertexBufferFormat.FLOAT_2: - return 2; - case Context3DVertexBufferFormat.FLOAT_3: - return 3; - case Context3DVertexBufferFormat.FLOAT_4: - return 4; - default: - return 0; - } - } - } -} - diff --git a/src/alternativa/engine3d/core/VertexStream.as b/src/alternativa/engine3d/core/VertexStream.as deleted file mode 100644 index 7ac00fc..0000000 --- a/src/alternativa/engine3d/core/VertexStream.as +++ /dev/null @@ -1,20 +0,0 @@ -package alternativa.engine3d.core -{ - import flash.display3D.VertexBuffer3D; - import flash.utils.ByteArray; - - public class VertexStream - { - public var buffer:VertexBuffer3D; - - public var attributes:Array; - - public var data:ByteArray; - - public function VertexStream() - { - super(); - } - } -} - diff --git a/src/alternativa/engine3d/core/View.as b/src/alternativa/engine3d/core/View.as deleted file mode 100644 index 90972f2..0000000 --- a/src/alternativa/engine3d/core/View.as +++ /dev/null @@ -1,1562 +0,0 @@ -package alternativa.engine3d.core -{ - import alternativa.Alternativa3D; - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.events.MouseEvent3D; - import alternativa.engine3d.materials.ShaderProgram; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.materials.compiler.VariableType; - import alternativa.engine3d.objects.Surface; - import alternativa.engine3d.resources.Geometry; - import flash.display.Bitmap; - import flash.display.BitmapData; - import flash.display.DisplayObject; - import flash.display.Sprite; - import flash.display.Stage3D; - import flash.display.StageAlign; - import flash.display3D.Context3D; - import flash.display3D.Context3DBlendFactor; - import flash.display3D.Context3DCompareMode; - import flash.display3D.Context3DProgramType; - import flash.display3D.Context3DTextureFormat; - import flash.display3D.Context3DTriangleFace; - import flash.display3D.VertexBuffer3D; - import flash.display3D.textures.Texture; - import flash.events.ContextMenuEvent; - import flash.events.Event; - import flash.events.KeyboardEvent; - import flash.events.MouseEvent; - import flash.geom.Point; - import flash.geom.Rectangle; - import flash.geom.Vector3D; - import flash.net.URLRequest; - import flash.net.navigateToURL; - import flash.ui.ContextMenu; - import flash.ui.ContextMenuItem; - import flash.ui.Keyboard; - import flash.ui.Mouse; - import flash.utils.Dictionary; - import flash.utils.setTimeout; - - use namespace alternativa3d; - - public class View extends Sprite - { - private static var drawDistanceFragment:Linker; - - private static var drawDistanceVertexProcedure:Procedure; - - private static const renderEvent:MouseEvent = new MouseEvent("render"); - - private static const drawDistancePrograms:Dictionary = new Dictionary(); - - private static const drawUnit:DrawUnit = new DrawUnit(); - - private static const pixels:Dictionary = new Dictionary(); - - private static const stack:Vector. = new Vector.(); - - private static const point:Point = new Point(); - - private static const scissor:Rectangle = new Rectangle(0,0,1,1); - - private static const rectangle:Rectangle = new Rectangle(); - - private static const zeroRectangle:Rectangle = new Rectangle(); - - private static const localCoords:Vector3D = new Vector3D(); - - private static const branch:Vector. = new Vector.(); - - private static const overedBranch:Vector. = new Vector.(); - - private static const changedBranch:Vector. = new Vector.(); - - private static const functions:Vector. = new Vector.(); - - private static var drawRectGeometries:Dictionary = new Dictionary(true); - - private static var drawDistanceTextures:Dictionary = new Dictionary(true); - - private static var drawDistanceTexturesWidths:Dictionary = new Dictionary(true); - - private static var drawTexturedRectPrograms:Dictionary = new Dictionary(true); - - private static const drawTexturedRectUVScaleConst:Vector. = Vector.([1,1,1,1]); - - private static var drawColoredRectPrograms:Dictionary = new Dictionary(true); - - private static const drawColoredRectConst:Vector. = Vector.([0,0,-1,1]); - - private static const drawRectColor:Vector. = new Vector.(4); - - public var backgroundColor:uint; - - public var backgroundAlpha:Number; - - public var antiAlias:int; - - alternativa3d var name_qj:int; - - alternativa3d var _height:int; - - alternativa3d var name_gJ:BitmapData = null; - - private var name_j6:Vector.; - - private var indices:Vector.; - - private var name_Zv:int = 0; - - private var surfaces:Vector.; - - private var geometries:Vector.; - - private var name_2L:Vector.; - - private var name_8b:int = 0; - - alternativa3d var name_Cr:Vector.; - - alternativa3d var name_g4:Vector.; - - private var name_Ql:Vector.; - - private var name_extends:Vector.>; - - private var name_9L:Vector.>; - - private var name_4N:Vector.; - - private var name_ff:Vector.; - - alternativa3d var raysLength:int = 0; - - private var name_Ki:MouseEvent; - - private var target:Object3D; - - private var targetSurface:Surface; - - private var name_Cu:Number; - - private var name_B4:Object3D; - - private var name_c3:Object3D; - - private var name_Lx:Object3D; - - private var name_H7:Surface; - - private var altKey:Boolean; - - private var ctrlKey:Boolean; - - private var shiftKey:Boolean; - - private var container:Bitmap; - - private var area:Sprite; - - private var name_N2:Logo; - - private var name_OE:Bitmap; - - private var name_bx:String = "BR"; - - private var name_hq:Number = 0; - - private var name_Xc:Number = 0; - - private var name_IE:Boolean; - - public function View(width:int, height:int, renderToBitmap:Boolean = false, backgroundColor:uint = 0, backgroundAlpha:Number = 1, antiAlias:int = 0) - { - var item:ContextMenuItem; - var menu:ContextMenu; - this.name_j6 = new Vector.(); - this.indices = new Vector.(); - this.surfaces = new Vector.(); - this.geometries = new Vector.(); - this.name_2L = new Vector.(); - this.name_Cr = new Vector.(); - this.name_g4 = new Vector.(); - this.name_Ql = new Vector.(); - this.name_extends = new Vector.>(); - this.name_9L = new Vector.>(); - this.name_4N = new Vector.(); - this.name_ff = new Vector.(); - super(); - if(width < 50) - { - width = 50; - } - if(height < 50) - { - height = 50; - } - this.name_qj = width; - this.alternativa3d::_height = height; - this.name_IE = renderToBitmap; - this.backgroundColor = backgroundColor; - this.backgroundAlpha = backgroundAlpha; - this.antiAlias = antiAlias; - mouseEnabled = true; - mouseChildren = true; - doubleClickEnabled = true; - buttonMode = true; - useHandCursor = false; - tabEnabled = false; - tabChildren = false; - item = new ContextMenuItem("Powered by Alternativa3D " + Alternativa3D.version); - item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT,function(e:ContextMenuEvent):void - { - try - { - navigateToURL(new URLRequest("http://alternativaplatform.com"),"_blank"); - } - catch(e:Error) - { - } - }); - menu = new ContextMenu(); - menu.customItems = [item]; - contextMenu = menu; - this.container = new Bitmap(); - if(renderToBitmap) - { - this.createRenderBitmap(); - } - super.addChild(this.container); - this.area = new Sprite(); - this.area.graphics.beginFill(16711680); - this.area.graphics.drawRect(0,0,100,100); - this.area.mouseEnabled = false; - this.area.visible = false; - this.area.width = this.name_qj; - this.area.height = this.alternativa3d::_height; - hitArea = this.area; - super.addChild(hitArea); - this.showLogo(); - if(drawDistanceFragment == null) - { - drawDistanceVertexProcedure = Procedure.compileFromArray(["#v0=distance","#c0=transform0","#c1=transform1","#c2=transform2","#c3=coefficient","#c4=projection","dp4 t0.x, i0, c0","dp4 t0.y, i0, c1","dp4 t0.z, i0, c2","mul v0.x, t0.z, c3.z","mov v0.y, i0.x","mov v0.z, i0.x","mov v0.w, i0.x","mul t1.x, t0.x, c4.x","mul t1.y, t0.y, c4.y","mul t0.w, t0.z, c4.z","add t1.z, t0.w, c4.w","mov t3.z, c4.x","div t3.z, t3.z, c4.x","sub t3.z, t3.z, c3.w","mul t1.w, t0.z, t3.z","add t1.w, t1.w, c3.w","mul t0.x, c3.x, t1.w","mul t0.y, c3.y, t1.w","add t1.x, t1.x, t0.x","add t1.y, t1.y, t0.y","mov o0, t1"],"mouseEventsVertex"); - drawDistanceFragment = new Linker(Context3DProgramType.FRAGMENT); - drawDistanceFragment.addProcedure(new Procedure(["mov t0.z, c0.z","mov t0.w, c0.w","frc t0.y, v0.x","sub t0.x, v0.x, t0.y","mul t0.x, t0.x, c0.x","mov o0, ft0","#v0=distance","#c0=code"],"mouseEventsFragment")); - } - addEventListener(MouseEvent.MOUSE_DOWN,this.onMouse); - addEventListener(MouseEvent.CLICK,this.onMouse); - addEventListener(MouseEvent.DOUBLE_CLICK,this.onMouse); - addEventListener(MouseEvent.MOUSE_MOVE,this.onMouse); - addEventListener(MouseEvent.MOUSE_OVER,this.onMouse); - addEventListener(MouseEvent.MOUSE_WHEEL,this.onMouse); - addEventListener(MouseEvent.MOUSE_OUT,this.onLeave); - addEventListener(Event.ADDED_TO_STAGE,this.onAddToStage); - addEventListener(Event.REMOVED_FROM_STAGE,this.onRemoveFromStage); - } - - private function onMouse(mouseEvent:MouseEvent) : void - { - var prev:int = this.name_Zv - 1; - if(this.name_Zv > 0 && mouseEvent.type == "mouseMove" && (this.name_j6[prev] as MouseEvent).type == "mouseMove") - { - this.name_j6[prev] = mouseEvent; - } - else - { - this.name_j6[this.name_Zv] = mouseEvent; - ++this.name_Zv; - } - this.name_Ki = mouseEvent; - } - - private function onLeave(mouseEvent:MouseEvent) : void - { - this.name_j6[this.name_Zv] = mouseEvent; - ++this.name_Zv; - this.name_Ki = null; - } - - private function createRenderBitmap() : void - { - this.name_gJ = new BitmapData(this.name_qj,this.alternativa3d::_height,this.backgroundAlpha < 1,this.backgroundColor); - this.container.bitmapData = this.name_gJ; - this.container.smoothing = true; - } - - private function onAddToStage(e:Event) : void - { - stage.addEventListener(KeyboardEvent.KEY_DOWN,this.onKeyDown); - stage.addEventListener(KeyboardEvent.KEY_UP,this.onKeyUp); - } - - private function onRemoveFromStage(e:Event) : void - { - stage.removeEventListener(KeyboardEvent.KEY_DOWN,this.onKeyDown); - stage.removeEventListener(KeyboardEvent.KEY_UP,this.onKeyUp); - this.altKey = false; - this.ctrlKey = false; - this.shiftKey = false; - } - - private function onKeyDown(keyboardEvent:KeyboardEvent) : void - { - this.altKey = keyboardEvent.altKey; - this.ctrlKey = keyboardEvent.ctrlKey; - this.shiftKey = keyboardEvent.shiftKey; - if(this.ctrlKey && this.shiftKey && keyboardEvent.keyCode == Keyboard.F1 && this.name_OE == null) - { - this.name_OE = new Bitmap(Logo.image); - this.name_OE.x = Math.round((this.name_qj - this.name_OE.width) / 2); - this.name_OE.y = Math.round((this.alternativa3d::_height - this.name_OE.height) / 2); - super.addChild(this.name_OE); - setTimeout(this.removeBitmap,2048); - } - } - - private function onKeyUp(keyboardEvent:KeyboardEvent) : void - { - this.altKey = keyboardEvent.altKey; - this.ctrlKey = keyboardEvent.ctrlKey; - this.shiftKey = keyboardEvent.shiftKey; - } - - private function removeBitmap() : void - { - if(this.name_OE != null) - { - super.removeChild(this.name_OE); - this.name_OE = null; - } - } - - alternativa3d function calculateRays(camera:Camera3D) : void - { - var i:int = 0; - var mouseEvent:MouseEvent = null; - var mouseMoved:Boolean = false; - var origin:Vector3D = null; - var direction:Vector3D = null; - var coefficient:Point = null; - if(this.name_Ki != null) - { - mouseMoved = false; - for(i = 0; i < this.name_Zv; ) - { - mouseEvent = this.name_j6[i]; - if(mouseEvent.type == "mouseMove" || mouseEvent.type == "mouseOut") - { - mouseMoved = true; - break; - } - i++; - } - if(!mouseMoved) - { - renderEvent.localX = this.name_Ki.localX; - renderEvent.localY = this.name_Ki.localY; - renderEvent.ctrlKey = this.ctrlKey; - renderEvent.altKey = this.altKey; - renderEvent.shiftKey = this.shiftKey; - renderEvent.buttonDown = this.name_Ki.buttonDown; - renderEvent.delta = 0; - this.name_j6[this.name_Zv] = renderEvent; - ++this.name_Zv; - } - } - var mouseX:Number = 1e+22; - var mouseY:Number = 1e+22; - for(i = 0; i < this.name_Zv; i++) - { - mouseEvent = this.name_j6[i]; - if(mouseEvent.type != "mouseOut") - { - if(mouseEvent.localX != mouseX || mouseEvent.localY != mouseY) - { - mouseX = Number(mouseEvent.localX); - mouseY = Number(mouseEvent.localY); - if(this.alternativa3d::raysLength < this.name_Cr.length) - { - origin = this.name_Cr[this.alternativa3d::raysLength]; - direction = this.name_g4[this.alternativa3d::raysLength]; - coefficient = this.name_Ql[this.alternativa3d::raysLength]; - } - else - { - origin = new Vector3D(); - direction = new Vector3D(); - coefficient = new Point(); - this.name_Cr[this.alternativa3d::raysLength] = origin; - this.name_g4[this.alternativa3d::raysLength] = direction; - this.name_Ql[this.alternativa3d::raysLength] = coefficient; - this.name_extends[this.alternativa3d::raysLength] = new Vector.(); - this.name_9L[this.alternativa3d::raysLength] = new Vector.(); - } - if(!camera.orthographic) - { - direction.x = mouseX - this.name_qj * 0.5; - direction.y = mouseY - this.alternativa3d::_height * 0.5; - direction.z = camera.alternativa3d::focalLength; - origin.x = direction.x * camera.nearClipping / camera.alternativa3d::focalLength; - origin.y = direction.y * camera.nearClipping / camera.alternativa3d::focalLength; - origin.z = camera.nearClipping; - direction.normalize(); - coefficient.x = mouseX * 2 / this.name_qj; - coefficient.y = mouseY * 2 / this.alternativa3d::_height; - } - else - { - direction.x = 0; - direction.y = 0; - direction.z = 1; - origin.x = mouseX - this.name_qj * 0.5; - origin.y = mouseY - this.alternativa3d::_height * 0.5; - origin.z = camera.nearClipping; - coefficient.x = mouseX * 2 / this.name_qj; - coefficient.y = mouseY * 2 / this.alternativa3d::_height; - } - ++this.alternativa3d::raysLength; - } - this.indices[i] = this.alternativa3d::raysLength - 1; - } - else - { - this.indices[i] = -1; - } - } - } - - alternativa3d function addSurfaceToMouseEvents(surface:Surface, geometry:Geometry, procedure:Procedure) : void - { - this.surfaces[this.name_8b] = surface; - this.geometries[this.name_8b] = geometry; - this.name_2L[this.name_8b] = procedure; - ++this.name_8b; - } - - alternativa3d function prepareToRender(stage3D:Stage3D, context:Context3D) : void - { - var vis:Boolean = false; - var parent:DisplayObject = null; - var coords:Point = null; - var stage3DObject:Object = stage3D; - var isIncubator:Boolean = "viewPort" in stage3DObject; - if(isIncubator) - { - if(this.name_qj > 2048) - { - this.name_qj = 2048; - } - if(this.alternativa3d::_height > 2048) - { - this.alternativa3d::_height = 2048; - } - } - if(this.name_gJ == null) - { - vis = Boolean(this.visible); - for(parent = this.parent; parent != null; parent = parent.parent) - { - vis &&= Boolean(parent.visible); - } - point.x = 0; - point.y = 0; - coords = localToGlobal(point); - if(isIncubator) - { - if(vis) - { - rectangle.x = coords.x; - rectangle.y = coords.y; - point.x = this.name_qj; - point.y = this.alternativa3d::_height; - coords = localToGlobal(point); - rectangle.width = coords.x - rectangle.x; - rectangle.height = coords.y - rectangle.y; - if(rectangle.width < 0) - { - rectangle.width = 0; - } - if(rectangle.height < 0) - { - rectangle.height = 0; - } - stage3DObject.viewPort = rectangle; - } - else - { - stage3DObject.viewPort = zeroRectangle; - } - } - else - { - stage3DObject.x = coords.x; - stage3DObject.y = coords.y; - stage3DObject.visible = vis; - } - } - else - { - if(isIncubator) - { - stage3DObject.viewPort = zeroRectangle; - } - else - { - stage3DObject.visible = false; - } - if(this.name_qj != this.name_gJ.width || this.alternativa3d::_height != this.name_gJ.height || this.backgroundAlpha < 1 != this.name_gJ.transparent) - { - this.name_gJ.dispose(); - this.createRenderBitmap(); - } - } - context.configureBackBuffer(this.name_qj,this.alternativa3d::_height,this.antiAlias); - var r:Number = (this.backgroundColor >> 16 & 0xFF) / 255; - var g:Number = (this.backgroundColor >> 8 & 0xFF) / 255; - var b:Number = (this.backgroundColor & 0xFF) / 255; - if(this.canvas != null) - { - r *= this.backgroundAlpha; - g *= this.backgroundAlpha; - b *= this.backgroundAlpha; - } - context.clear(r,g,b,this.backgroundAlpha); - } - - alternativa3d function processMouseEvents(context:Context3D, camera:Camera3D) : void - { - var i:int = 0; - var raySurfaces:Vector. = null; - var rayDepths:Vector. = null; - var raySurfacesLength:int = 0; - var mouseEvent:MouseEvent = null; - var index:int = 0; - if(this.name_Zv > 0) - { - if(this.name_8b > 0) - { - this.calculateSurfacesDepths(context,camera,this.name_qj,this.alternativa3d::_height); - for(i = 0; i < this.alternativa3d::raysLength; ) - { - raySurfaces = this.name_extends[i]; - rayDepths = this.name_9L[i]; - raySurfacesLength = int(raySurfaces.length); - if(raySurfacesLength > 1) - { - this.sort(raySurfaces,rayDepths,raySurfacesLength); - } - i++; - } - } - this.name_Cu = camera.farClipping; - for(i = 0; i < this.name_Zv; i++) - { - mouseEvent = this.name_j6[i]; - index = this.indices[i]; - switch(mouseEvent.type) - { - case "mouseDown": - this.defineTarget(index); - if(this.target != null) - { - this.propagateEvent(MouseEvent3D.MOUSE_DOWN,mouseEvent,camera,this.target,this.targetSurface,this.branchToVector(this.target,branch)); - } - this.name_B4 = this.target; - break; - case "mouseWheel": - this.defineTarget(index); - if(this.target != null) - { - this.propagateEvent(MouseEvent3D.MOUSE_WHEEL,mouseEvent,camera,this.target,this.targetSurface,this.branchToVector(this.target,branch)); - } - break; - case "click": - this.defineTarget(index); - if(this.target != null) - { - this.propagateEvent(MouseEvent3D.MOUSE_UP,mouseEvent,camera,this.target,this.targetSurface,this.branchToVector(this.target,branch)); - if(this.name_B4 == this.target) - { - this.name_c3 = this.target; - this.propagateEvent(MouseEvent3D.CLICK,mouseEvent,camera,this.target,this.targetSurface,this.branchToVector(this.target,branch)); - } - } - this.name_B4 = null; - break; - case "doubleClick": - this.defineTarget(index); - if(this.target != null) - { - this.propagateEvent(MouseEvent3D.MOUSE_UP,mouseEvent,camera,this.target,this.targetSurface,this.branchToVector(this.target,branch)); - if(this.name_B4 == this.target) - { - this.propagateEvent(this.name_c3 == this.target && this.target.doubleClickEnabled ? MouseEvent3D.DOUBLE_CLICK : MouseEvent3D.CLICK,mouseEvent,camera,this.target,this.targetSurface,this.branchToVector(this.target,branch)); - } - } - this.name_c3 = null; - this.name_B4 = null; - break; - case "mouseMove": - this.defineTarget(index); - if(this.target != null) - { - this.propagateEvent(MouseEvent3D.MOUSE_MOVE,mouseEvent,camera,this.target,this.targetSurface,this.branchToVector(this.target,branch)); - } - if(this.name_Lx != this.target) - { - this.processOverOut(mouseEvent,camera); - } - break; - case "mouseOut": - this.name_Ki = null; - this.target = null; - this.targetSurface = null; - if(this.name_Lx != this.target) - { - this.processOverOut(mouseEvent,camera); - } - break; - case "render": - this.defineTarget(index); - if(this.name_Lx != this.target) - { - this.processOverOut(mouseEvent,camera); - } - break; - } - this.target = null; - this.targetSurface = null; - this.name_Cu = camera.farClipping; - } - } - this.surfaces.length = 0; - this.name_8b = 0; - this.name_j6.length = 0; - this.name_Zv = 0; - for(i = 0; i < this.alternativa3d::raysLength; i++) - { - this.name_extends[i].length = 0; - this.name_9L[i].length = 0; - } - this.alternativa3d::raysLength = 0; - } - - private function calculateSurfacesDepths(context:Context3D, camera:Camera3D, contextWidth:int, contextHeight:int) : void - { - var vLinker:Linker = null; - var fLinker:Linker = null; - var i:int = 0; - var j:int = 0; - var log2Width:int = 0; - var texture:Texture = null; - var textureLog2Width:int = 0; - var textureHeight:int = 0; - var rayCoefficients:Point = null; - var pixel:BitmapData = null; - var k:int = 0; - var textureScreenSize:Number = NaN; - var color:int = 0; - var red:int = 0; - var green:int = 0; - var ind:int = 0; - var raySurfaces:Vector. = null; - var rayDepths:Vector. = null; - context.setBlendFactors(Context3DBlendFactor.ONE,Context3DBlendFactor.ZERO); - context.setCulling(Context3DTriangleFace.FRONT); - context.setTextureAt(0,null); - context.setTextureAt(1,null); - context.setTextureAt(2,null); - context.setTextureAt(3,null); - context.setTextureAt(4,null); - context.setTextureAt(5,null); - context.setTextureAt(6,null); - context.setTextureAt(7,null); - context.setVertexBufferAt(0,null); - context.setVertexBufferAt(1,null); - context.setVertexBufferAt(2,null); - context.setVertexBufferAt(3,null); - context.setVertexBufferAt(4,null); - context.setVertexBufferAt(5,null); - context.setVertexBufferAt(6,null); - context.setVertexBufferAt(7,null); - var drawRectGeometry:Geometry = drawRectGeometries[context]; - if(drawRectGeometry == null) - { - drawRectGeometry = new Geometry(4); - drawRectGeometry.addVertexStream([VertexAttributes.POSITION,VertexAttributes.POSITION,VertexAttributes.POSITION,VertexAttributes.TEXCOORDS[0],VertexAttributes.TEXCOORDS[0]]); - drawRectGeometry.setAttributeValues(VertexAttributes.POSITION,Vector.([0,0,1,0,1,1,1,1,1,1,0,1])); - drawRectGeometry.setAttributeValues(VertexAttributes.TEXCOORDS[0],Vector.([0,0,0,1,1,1,1,0])); - drawRectGeometry.indices = Vector.([0,1,3,2,3,1]); - drawRectGeometry.upload(context); - drawRectGeometries[context] = drawRectGeometry; - } - var drawColoredRectProgram:ShaderProgram = drawColoredRectPrograms[context]; - if(drawColoredRectProgram == null) - { - vLinker = new Linker(Context3DProgramType.VERTEX); - vLinker.addProcedure(Procedure.compileFromArray(["#a0=a0","#c0=c0","mul t0.x, a0.x, c0.x","mul t0.y, a0.y, c0.y","add o0.x, t0.x, c0.z","add o0.y, t0.y, c0.w","mov o0.z, a0.z","mov o0.w, a0.z"])); - fLinker = new Linker(Context3DProgramType.FRAGMENT); - fLinker.addProcedure(Procedure.compileFromArray(["#c0=c0","mov o0, c0"])); - drawColoredRectProgram = new ShaderProgram(vLinker,fLinker); - drawColoredRectProgram.upload(context); - drawColoredRectPrograms[context] = drawColoredRectProgram; - } - var drawTexturedRectProgram:ShaderProgram = drawTexturedRectPrograms[context]; - if(drawTexturedRectProgram == null) - { - vLinker = new Linker(Context3DProgramType.VERTEX); - vLinker.addProcedure(Procedure.compileFromArray(["#a0=a0","#a1=a1","#v0=v0","#c0=c0","#c1=c1","mul v0, a1, c1","mul t0.x, a0.x, c0.x","mul t0.y, a0.y, c0.y","add o0.x, t0.x, c0.z","add o0.y, t0.y, c0.w","mov o0.z, a0.z","mov o0.w, a0.z"])); - fLinker = new Linker(Context3DProgramType.FRAGMENT); - fLinker.addProcedure(Procedure.compileFromArray(["#v0=v0","#s0=s0","tex t0, v0, s0 <2d, nearest, mipnone>","mov o0, t0"])); - drawTexturedRectProgram = new ShaderProgram(vLinker,fLinker); - drawTexturedRectProgram.upload(context); - drawTexturedRectPrograms[context] = drawTexturedRectProgram; - } - if(this.antiAlias > 0) - { - log2Width = Math.ceil(Math.log(contextWidth) / Math.LN2) - 1; - texture = drawDistanceTextures[context]; - textureLog2Width = int(drawDistanceTexturesWidths[context]); - textureHeight = 1; - if(texture == null || textureLog2Width != log2Width) - { - textureLog2Width = log2Width; - if(texture != null) - { - texture.dispose(); - } - texture = context.createTexture(2 << textureLog2Width,textureHeight,Context3DTextureFormat.BGRA,true); - drawDistanceTextures[context] = texture; - drawDistanceTexturesWidths[context] = textureLog2Width; - } - } - context.setDepthTest(true,Context3DCompareMode.LESS); - var m0:Number = Number(camera.alternativa3d::m0); - var m5:Number = Number(camera.alternativa3d::m5); - var m10:Number = Number(camera.alternativa3d::m10); - var m11:Number = Number(camera.alternativa3d::m14); - var kZ:Number = 255 / camera.farClipping; - var fragmentConst:Number = 1 / 255; - var drawTextureWidthScale:Number = 1; - var drawTextureWidthOffset:Number = 0; - var drawTextureHeightScale:Number = 1; - var drawTextureHeightOffset:Number = 0; - if(this.antiAlias > 0) - { - drawTextureWidthScale = contextWidth / (2 << textureLog2Width); - drawTextureWidthOffset = drawTextureWidthScale - 1; - drawTextureHeightScale = contextHeight / textureHeight; - drawTextureHeightOffset = drawTextureHeightScale - 1; - m0 *= drawTextureWidthScale; - m5 *= drawTextureHeightScale; - } - var pixelIndex:int = 0; - for(i = 0; i < this.alternativa3d::raysLength; ) - { - rayCoefficients = this.name_Ql[i]; - i++; - for(j = 0; j < this.name_8b; ) - { - if(pixelIndex == 0) - { - if(this.antiAlias > 0) - { - context.setRenderToTexture(texture,true,0,0); - context.clear(1,0,0,1); - } - else - { - drawColoredRectConst[0] = this.alternativa3d::raysLength * this.name_8b * 2 / contextWidth; - drawColoredRectConst[1] = -2 / contextHeight; - context.setDepthTest(false,Context3DCompareMode.ALWAYS); - context.setProgram(drawColoredRectProgram.program); - context.setVertexBufferAt(0,drawRectGeometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION),drawRectGeometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - context.setProgramConstantsFromVector(Context3DProgramType.VERTEX,0,drawColoredRectConst); - drawRectColor[0] = 1; - drawRectColor[1] = 0; - drawRectColor[2] = 0; - drawRectColor[3] = 1; - context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT,0,drawRectColor); - context.drawTriangles(drawRectGeometry.name_EM,0,2); - context.setVertexBufferAt(0,null); - } - } - scissor.x = pixelIndex; - context.setScissorRectangle(scissor); - this.drawSurface(context,camera,j,m0,m5,m10,m11,(pixelIndex * 2 / contextWidth - rayCoefficients.x) * drawTextureWidthScale + drawTextureWidthOffset,rayCoefficients.y * drawTextureHeightScale - drawTextureHeightOffset,kZ,fragmentConst,camera.orthographic); - this.name_4N[pixelIndex] = i - 1; - this.name_ff[pixelIndex] = j; - j++; - pixelIndex++; - if(pixelIndex >= contextWidth || i >= this.alternativa3d::raysLength && j >= this.name_8b) - { - if(this.antiAlias > 0) - { - context.setRenderToBackBuffer(); - textureScreenSize = pixelIndex / (2 << textureLog2Width); - drawColoredRectConst[0] = 2 * textureScreenSize * (2 << textureLog2Width) / contextWidth; - drawColoredRectConst[1] = -2 * textureHeight / contextHeight; - drawTexturedRectUVScaleConst[0] = textureScreenSize; - context.setDepthTest(false,Context3DCompareMode.ALWAYS); - context.setProgram(drawTexturedRectProgram.program); - context.setVertexBufferAt(0,drawRectGeometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION),drawRectGeometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - context.setVertexBufferAt(1,drawRectGeometry.alternativa3d::getVertexBuffer(VertexAttributes.TEXCOORDS[0]),drawRectGeometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[0]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[0]]); - context.setProgramConstantsFromVector(Context3DProgramType.VERTEX,0,drawColoredRectConst); - context.setProgramConstantsFromVector(Context3DProgramType.VERTEX,1,drawTexturedRectUVScaleConst); - context.setTextureAt(0,texture); - context.drawTriangles(drawRectGeometry.name_EM,0,2); - context.setTextureAt(0,null); - context.setVertexBufferAt(0,null); - context.setVertexBufferAt(1,null); - } - pixel = pixels[pixelIndex]; - if(pixel == null) - { - pixel = new BitmapData(pixelIndex,1,false,16711680); - pixels[pixelIndex] = pixel; - } - context.drawToBitmapData(pixel); - for(k = 0; k < pixelIndex; ) - { - color = int(pixel.getPixel(k,0)); - red = color >> 16 & 0xFF; - green = color >> 8 & 0xFF; - if(red < 255) - { - ind = this.name_4N[k]; - raySurfaces = this.name_extends[ind]; - rayDepths = this.name_9L[ind]; - ind = this.name_ff[k]; - raySurfaces.push(this.surfaces[ind]); - rayDepths.push((red + green / 255) / kZ); - } - k++; - } - pixelIndex = 0; - } - } - } - context.setScissorRectangle(null); - context.setDepthTest(true,Context3DCompareMode.ALWAYS); - context.setProgram(drawColoredRectProgram.program); - context.setVertexBufferAt(0,drawRectGeometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION),drawRectGeometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - drawColoredRectConst[0] = this.alternativa3d::raysLength * this.name_8b * 2 / contextWidth; - drawColoredRectConst[1] = -2 / contextHeight; - context.setProgramConstantsFromVector(Context3DProgramType.VERTEX,0,drawColoredRectConst); - var r:Number = (this.backgroundColor >> 16 & 0xFF) / 255; - var g:Number = (this.backgroundColor >> 8 & 0xFF) / 255; - var b:Number = (this.backgroundColor & 0xFF) / 255; - if(this.canvas != null) - { - drawRectColor[0] = this.backgroundAlpha * r; - drawRectColor[1] = this.backgroundAlpha * g; - drawRectColor[2] = this.backgroundAlpha * b; - } - else - { - drawRectColor[0] = r; - drawRectColor[1] = g; - drawRectColor[2] = b; - } - drawRectColor[3] = this.backgroundAlpha; - context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT,0,drawRectColor); - context.drawTriangles(drawRectGeometry.name_EM,0,2); - context.setVertexBufferAt(0,null); - } - - private function drawSurface(context:Context3D, camera:Camera3D, index:int, m0:Number, m5:Number, m10:Number, m14:Number, xOffset:Number, yOffset:Number, vertexConst:Number, fragmentConst:Number, orthographic:Boolean) : void - { - var i:int = 0; - var vertex:Linker = null; - var position:String = null; - var surface:Surface = this.surfaces[index]; - var geometry:Geometry = this.geometries[index]; - var procedure:Procedure = this.name_2L[index]; - var object:Object3D = surface.alternativa3d::object; - var drawDistanceProgram:ShaderProgram = drawDistancePrograms[procedure]; - if(drawDistanceProgram == null) - { - vertex = new Linker(Context3DProgramType.VERTEX); - position = "position"; - vertex.declareVariable(position,VariableType.ATTRIBUTE); - if(procedure != null) - { - vertex.addProcedure(procedure); - vertex.declareVariable("localPosition",VariableType.TEMPORARY); - vertex.setInputParams(procedure,position); - vertex.setOutputParams(procedure,"localPosition"); - position = "localPosition"; - } - vertex.addProcedure(drawDistanceVertexProcedure); - vertex.setInputParams(drawDistanceVertexProcedure,position); - drawDistanceProgram = new ShaderProgram(vertex,drawDistanceFragment); - drawDistanceFragment.setOppositeLinker(vertex); - drawDistanceProgram.upload(context); - drawDistancePrograms[procedure] = drawDistanceProgram; - } - var buffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - if(buffer == null) - { - return; - } - drawUnit.name_3G = 0; - drawUnit.name_9X = 0; - drawUnit.name_Kv = 0; - object.alternativa3d::setTransformConstants(drawUnit,surface,drawDistanceProgram.vertexShader,camera); - drawUnit.alternativa3d::setVertexConstantsFromTransform(drawDistanceProgram.vertexShader.getVariableIndex("transform0"),object.alternativa3d::localToCameraTransform); - drawUnit.alternativa3d::setVertexConstantsFromNumbers(drawDistanceProgram.vertexShader.getVariableIndex("coefficient"),xOffset,yOffset,vertexConst,orthographic ? 1 : 0); - drawUnit.alternativa3d::setVertexConstantsFromNumbers(drawDistanceProgram.vertexShader.getVariableIndex("projection"),m0,m5,m10,m14); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(drawDistanceProgram.fragmentShader.getVariableIndex("code"),fragmentConst,0,0,1); - context.setProgram(drawDistanceProgram.program); - context.setVertexBufferAt(0,buffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - for(i = 0; i < drawUnit.name_3G; i++) - { - context.setVertexBufferAt(drawUnit.name_else[i],drawUnit.alternativa3d::vertexBuffers[i],drawUnit.name_nw[i],drawUnit.name_EL[i]); - } - context.setProgramConstantsFromVector(Context3DProgramType.VERTEX,0,drawUnit.name_Aq,drawUnit.name_9X); - context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT,0,drawUnit.name_Cl,drawUnit.name_Kv); - context.drawTriangles(geometry.name_EM,surface.indexBegin,surface.numTriangles); - context.setVertexBufferAt(0,null); - for(i = 0; i < drawUnit.name_3G; i++) - { - context.setVertexBufferAt(drawUnit.name_else[i],null); - } - } - - private function sort(surfaces:Vector., depths:Vector., length:int) : void - { - var r:int = 0; - var j:int = 0; - var l:int = 0; - var i:int = 0; - var median:Number = NaN; - var left:Number = NaN; - var right:Number = NaN; - var surface:Surface = null; - stack[0] = 0; - stack[1] = length - 1; - for(var index:int = 2; index > 0; ) - { - index--; - r = stack[index]; - j = r; - index--; - l = stack[index]; - i = l; - for(median = depths[r + l >> 1]; i <= j; ) - { - for(left = depths[i]; left > median; ) - { - i++; - left = depths[i]; - } - for(right = depths[j]; right < median; ) - { - j--; - right = depths[j]; - } - if(i <= j) - { - depths[i] = right; - depths[j] = left; - surface = surfaces[i]; - surfaces[i] = surfaces[j]; - surfaces[j] = surface; - i++; - j--; - } - } - if(l < j) - { - stack[index] = l; - index++; - stack[index] = j; - index++; - } - if(i < r) - { - stack[index] = i; - index++; - stack[index] = r; - index++; - } - } - } - - private function processOverOut(mouseEvent:MouseEvent, camera:Camera3D) : void - { - var changedBranchLength:int = 0; - var i:int = 0; - var j:int = 0; - var object:Object3D = null; - this.branchToVector(this.target,branch); - this.branchToVector(this.name_Lx,overedBranch); - var branchLength:int = int(branch.length); - var overedBranchLength:int = int(overedBranch.length); - if(this.name_Lx != null) - { - this.propagateEvent(MouseEvent3D.MOUSE_OUT,mouseEvent,camera,this.name_Lx,this.name_H7,overedBranch,true,this.target); - changedBranchLength = 0; - for(i = 0; i < overedBranchLength; ) - { - object = overedBranch[i]; - for(j = 0; j < branchLength; j++) - { - if(object == branch[j]) - { - break; - } - } - if(j == branchLength) - { - changedBranch[changedBranchLength] = object; - changedBranchLength++; - } - i++; - } - if(changedBranchLength > 0) - { - changedBranch.length = changedBranchLength; - this.propagateEvent(MouseEvent3D.ROLL_OUT,mouseEvent,camera,this.name_Lx,this.name_H7,changedBranch,false,this.target); - } - } - if(this.target != null) - { - changedBranchLength = 0; - for(i = 0; i < branchLength; ) - { - object = branch[i]; - for(j = 0; j < overedBranchLength; j++) - { - if(object == overedBranch[j]) - { - break; - } - } - if(j == overedBranchLength) - { - changedBranch[changedBranchLength] = object; - changedBranchLength++; - } - i++; - } - if(changedBranchLength > 0) - { - changedBranch.length = changedBranchLength; - this.propagateEvent(MouseEvent3D.ROLL_OVER,mouseEvent,camera,this.target,this.targetSurface,changedBranch,false,this.name_Lx); - } - this.propagateEvent(MouseEvent3D.MOUSE_OVER,mouseEvent,camera,this.target,this.targetSurface,branch,true,this.name_Lx); - useHandCursor = this.target.useHandCursor; - } - else - { - useHandCursor = false; - } - Mouse.cursor = Mouse.cursor; - this.name_Lx = this.target; - this.name_H7 = this.targetSurface; - } - - private function branchToVector(object:Object3D, vector:Vector.) : Vector. - { - for(var len:int = 0; object != null; ) - { - vector[len] = object; - len++; - object = object.alternativa3d::_parent; - } - vector.length = len; - return vector; - } - - private function propagateEvent(type:String, mouseEvent:MouseEvent, camera:Camera3D, target:Object3D, targetSurface:Surface, objects:Vector., bubbles:Boolean = true, relatedObject:Object3D = null) : void - { - var object:Object3D = null; - var vector:Vector. = null; - var length:int = 0; - var i:int = 0; - var j:int = 0; - var mouseEvent3D:MouseEvent3D = null; - var oblectsLength:int = int(objects.length); - for(i = oblectsLength - 1; i > 0; ) - { - object = objects[i]; - if(object.alternativa3d::captureListeners != null) - { - vector = object.alternativa3d::captureListeners[type]; - if(vector != null) - { - if(mouseEvent3D == null) - { - this.calculateLocalCoords(camera,target.alternativa3d::cameraToLocalTransform,this.name_Cu,mouseEvent); - mouseEvent3D = new MouseEvent3D(type,bubbles,localCoords.x,localCoords.y,localCoords.z,relatedObject,mouseEvent.ctrlKey,mouseEvent.altKey,mouseEvent.shiftKey,mouseEvent.buttonDown,mouseEvent.delta); - mouseEvent3D.name_5E = target; - mouseEvent3D.name_BX = targetSurface; - } - mouseEvent3D.name_Kh = object; - mouseEvent3D.name_VE = 1; - length = int(vector.length); - for(j = 0; j < length; functions[j] = vector[j],j++) - { - } - for(j = 0; j < length; ) - { - (functions[j] as Function).call(null,mouseEvent3D); - if(mouseEvent3D.name_XD) - { - return; - } - j++; - } - if(mouseEvent3D.alternativa3d::stop) - { - return; - } - } - } - i--; - } - for(i = 0; i < oblectsLength; ) - { - object = objects[i]; - if(object.alternativa3d::bubbleListeners != null) - { - vector = object.alternativa3d::bubbleListeners[type]; - if(vector != null) - { - if(mouseEvent3D == null) - { - this.calculateLocalCoords(camera,target.alternativa3d::cameraToLocalTransform,this.name_Cu,mouseEvent); - mouseEvent3D = new MouseEvent3D(type,bubbles,localCoords.x,localCoords.y,localCoords.z,relatedObject,mouseEvent.ctrlKey,mouseEvent.altKey,mouseEvent.shiftKey,mouseEvent.buttonDown,mouseEvent.delta); - mouseEvent3D.name_5E = target; - mouseEvent3D.name_BX = targetSurface; - } - mouseEvent3D.name_Kh = object; - mouseEvent3D.name_VE = i == 0 ? 2 : 3; - length = int(vector.length); - for(j = 0; j < length; functions[j] = vector[j],j++) - { - } - for(j = 0; j < length; ) - { - (functions[j] as Function).call(null,mouseEvent3D); - if(mouseEvent3D.name_XD) - { - return; - } - j++; - } - if(mouseEvent3D.alternativa3d::stop) - { - return; - } - } - } - i++; - } - } - - private function calculateLocalCoords(camera:Camera3D, transform:Transform3D, z:Number, mouseEvent:MouseEvent) : void - { - var x:Number = NaN; - var y:Number = NaN; - if(!camera.orthographic) - { - x = z * (mouseEvent.localX - this.name_qj * 0.5) / camera.alternativa3d::focalLength; - y = z * (mouseEvent.localY - this.alternativa3d::_height * 0.5) / camera.alternativa3d::focalLength; - } - else - { - x = mouseEvent.localX - this.name_qj * 0.5; - y = mouseEvent.localY - this.alternativa3d::_height * 0.5; - } - localCoords.x = transform.a * x + transform.b * y + transform.c * z + transform.d; - localCoords.y = transform.e * x + transform.f * y + transform.g * z + transform.h; - localCoords.z = transform.i * x + transform.j * y + transform.k * z + transform.l; - } - - private function defineTarget(index:int) : void - { - var source:Object3D = null; - var surface:Surface = null; - var depth:Number = NaN; - var object:Object3D = null; - var potentialTarget:Object3D = null; - var obj:Object3D = null; - var surfaces:Vector. = this.name_extends[index]; - var depths:Vector. = this.name_9L[index]; - for(var i:int = surfaces.length - 1; i >= 0; ) - { - surface = surfaces[i]; - depth = depths[i]; - object = surface.alternativa3d::object; - potentialTarget = null; - for(obj = object; obj != null; ) - { - if(!obj.mouseChildren) - { - potentialTarget = null; - } - if(potentialTarget == null && obj.mouseEnabled) - { - potentialTarget = obj; - } - obj = obj.alternativa3d::_parent; - } - if(potentialTarget != null) - { - if(this.target != null) - { - for(obj = potentialTarget; obj != null; ) - { - if(obj == this.target) - { - source = object; - if(this.target != potentialTarget) - { - this.target = potentialTarget; - this.targetSurface = surface; - this.name_Cu = depth; - } - break; - } - obj = obj.alternativa3d::_parent; - } - } - else - { - source = object; - this.target = potentialTarget; - this.targetSurface = surface; - this.name_Cu = depth; - } - if(source == this.target) - { - break; - } - } - i--; - } - } - - public function get renderToBitmap() : Boolean - { - return this.name_gJ != null; - } - - public function set renderToBitmap(value:Boolean) : void - { - if(value) - { - if(this.name_gJ == null) - { - this.createRenderBitmap(); - } - } - else if(this.name_gJ != null) - { - this.container.bitmapData = null; - this.name_gJ.dispose(); - this.name_gJ = null; - } - } - - public function get canvas() : BitmapData - { - return this.name_gJ; - } - - public function showLogo() : void - { - if(this.name_N2 == null) - { - this.name_N2 = new Logo(); - super.addChild(this.name_N2); - this.name_package(); - } - } - - public function hideLogo() : void - { - if(this.name_N2 != null) - { - super.removeChild(this.name_N2); - this.name_N2 = null; - } - } - - public function get logoAlign() : String - { - return this.name_bx; - } - - public function set logoAlign(value:String) : void - { - this.name_bx = value; - this.name_package(); - } - - public function get logoHorizontalMargin() : Number - { - return this.name_hq; - } - - public function set logoHorizontalMargin(value:Number) : void - { - this.name_hq = value; - this.name_package(); - } - - public function get logoVerticalMargin() : Number - { - return this.name_Xc; - } - - public function set logoVerticalMargin(value:Number) : void - { - this.name_Xc = value; - this.name_package(); - } - - private function name_package() : void - { - if(this.name_N2 != null) - { - if(this.name_bx == StageAlign.TOP_LEFT || this.name_bx == StageAlign.LEFT || this.name_bx == StageAlign.BOTTOM_LEFT) - { - this.name_N2.x = Math.round(this.name_hq); - } - if(this.name_bx == StageAlign.TOP || this.name_bx == StageAlign.BOTTOM) - { - this.name_N2.x = Math.round((this.name_qj - this.name_N2.width) / 2); - } - if(this.name_bx == StageAlign.TOP_RIGHT || this.name_bx == StageAlign.RIGHT || this.name_bx == StageAlign.BOTTOM_RIGHT) - { - this.name_N2.x = Math.round(this.name_qj - this.name_hq - this.name_N2.width); - } - if(this.name_bx == StageAlign.TOP_LEFT || this.name_bx == StageAlign.TOP || this.name_bx == StageAlign.TOP_RIGHT) - { - this.name_N2.y = Math.round(this.name_Xc); - } - if(this.name_bx == StageAlign.LEFT || this.name_bx == StageAlign.RIGHT) - { - this.name_N2.y = Math.round((this.alternativa3d::_height - this.name_N2.height) / 2); - } - if(this.name_bx == StageAlign.BOTTOM_LEFT || this.name_bx == StageAlign.BOTTOM || this.name_bx == StageAlign.BOTTOM_RIGHT) - { - this.name_N2.y = Math.round(this.alternativa3d::_height - this.name_Xc - this.name_N2.height); - } - } - } - - override public function get width() : Number - { - return this.name_qj; - } - - override public function set width(value:Number) : void - { - if(value < 50) - { - value = 50; - } - this.name_qj = value; - this.area.width = value; - this.name_package(); - } - - override public function get height() : Number - { - return this.alternativa3d::_height; - } - - override public function set height(value:Number) : void - { - if(value < 50) - { - value = 50; - } - this.alternativa3d::_height = value; - this.area.height = value; - this.name_package(); - } - - override public function addChild(child:DisplayObject) : DisplayObject - { - throw new Error("Unsupported operation."); - } - - override public function removeChild(child:DisplayObject) : DisplayObject - { - throw new Error("Unsupported operation."); - } - - override public function addChildAt(child:DisplayObject, index:int) : DisplayObject - { - throw new Error("Unsupported operation."); - } - - override public function removeChildAt(index:int) : DisplayObject - { - throw new Error("Unsupported operation."); - } - - override public function getChildAt(index:int) : DisplayObject - { - throw new Error("Unsupported operation."); - } - - override public function getChildIndex(child:DisplayObject) : int - { - throw new Error("Unsupported operation."); - } - - override public function setChildIndex(child:DisplayObject, index:int) : void - { - throw new Error("Unsupported operation."); - } - - override public function swapChildren(child1:DisplayObject, child2:DisplayObject) : void - { - throw new Error("Unsupported operation."); - } - - override public function swapChildrenAt(index1:int, index2:int) : void - { - throw new Error("Unsupported operation."); - } - - override public function getChildByName(name:String) : DisplayObject - { - throw new Error("Unsupported operation."); - } - - override public function contains(child:DisplayObject) : Boolean - { - throw new Error("Unsupported operation."); - } - } -} - -import flash.display.BitmapData; -import flash.display.DisplayObject; -import flash.display.DisplayObjectContainer; -import flash.display.InteractiveObject; -import flash.display.Sprite; -import flash.events.EventDispatcher; -import flash.events.MouseEvent; -import flash.geom.ColorTransform; -import flash.geom.Matrix; -import flash.net.URLRequest; -import flash.net.navigateToURL; - -class Logo extends Sprite -{ - public static const image:BitmapData = createBMP(); - - private static const normal:ColorTransform = new ColorTransform(); - - private static const highlighted:ColorTransform = new ColorTransform(1.1,1.1,1.1,1); - - private var border:int = 5; - - public function Logo() - { - super(); - graphics.beginFill(16711680,0); - graphics.drawRect(0,0,image.width + this.border + this.border,image.height + this.border + this.border); - graphics.drawRect(this.border,this.border,image.width,image.height); - graphics.beginBitmapFill(image,new Matrix(1,0,0,1,this.border,this.border),false,true); - graphics.drawRect(this.border,this.border,image.width,image.height); - tabEnabled = false; - buttonMode = true; - useHandCursor = true; - addEventListener(MouseEvent.MOUSE_DOWN,this.onMouseDown); - addEventListener(MouseEvent.CLICK,this.onClick); - addEventListener(MouseEvent.DOUBLE_CLICK,this.onDoubleClick); - addEventListener(MouseEvent.MOUSE_MOVE,this.onMouseMove); - addEventListener(MouseEvent.MOUSE_OVER,this.onMouseMove); - addEventListener(MouseEvent.MOUSE_OUT,this.onMouseOut); - addEventListener(MouseEvent.MOUSE_WHEEL,this.onMouseWheel); - } - - private static function createBMP() : BitmapData - { - var bmp:BitmapData = new BitmapData(165,27,true,0); - bmp.setVector(bmp.rect,Vector.([0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134217728,503316480,721420288,503316480,134217728,134217728,503316480,721420288,503316480,134217728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,100663296,419430400,721420288,788529152,536870912,234881024,50331648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1677721600,503316480,503316480,1677721600,2348810240,1677721600,503316480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67108864,301989888,822083584,1677721600,2365587456,2483027968 - ,1996488704,1241513984,536870912,117440512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16777216,167772160,520093696,822083584,905969664,822083584,520093696,301989888,520093696,822083584,905969664,822083584,620756992,620756992,721420288,620756992,620756992,721420288,620756992,620756992,721420288,620756992,620756992,822083584,905969664,822083584,520093696,218103808,234881024,536870912,721420288,620756992,620756992,822083584,905969664,822083584,520093696,301989888,520093696,822083584,1493172224,2768240640,4292467161,2533359616,822083584,822083584,2533359616,4292467161,2768240640,1493172224,822083584,620756992,620756992,721420288,503316480,268435456,503316480,721420288,503316480,134217728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134217728,620756992,1392508928,2248146944,3514129719,4192520610,4277921461,3886715221,2905283846,1778384896,788529152,234881024,50331648,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ,0,167772160,822083584,1845493760,2533359616,2734686208,2533359616,1845493760,1325400064,1845493760,2533359616,2734686208,2533359616,2164260864,2164260864,2348810240,2164260864,2164260864,2348810240,2164260864,2164260864,2348810240,2164260864,2164260864,2533359616,2734686208,2533359616,1845493760,1056964608,1107296256,1895825408,2348810240,2164260864,2164260864,2533359616,2734686208,2533359616,1845493760,1325400064,1845493760,2533359616,2952790016,3730463322,4292467161,2734686208,905969664,905969664,2734686208,4292467161,3730463322,2952790016,2533359616,2164260864,2164260864,2348810240,1677721600,989855744,1677721600,2348810240,1677721600,503316480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16777216,167772160,754974720,1828716544,3022988562,4022445697,4294959283,4294953296,4294953534,4294961056,4226733479,3463135252,2130706432,1224736768,486539264,83886080,0,0,0,0,0,0,0,0,0,0,0,0,0 - ,0,520093696,1845493760,3665591420,4292467161,4292467161,4292467161,3665591420,2650800128,3665591420,4292467161,4292467161,4292467161,3816191606,3355443200,4292467161,3355443200,3355443200,4292467161,3355443200,3355443200,4292467161,3355443200,3816191606,4292467161,4292467161,4292467161,3665591420,2382364672,2415919104,3801125008,4292467161,3355443200,3816191606,4292467161,4292467161,4292467161,3495911263,2650800128,3665591420,4292467161,4292467161,4292467161,4292467161,2533359616,822083584,822083584,2533359616,4292467161,4292467161,4292467161,4292467161,3816191606,3355443200,4292467161,2533359616,1627389952,2533359616,4292467161,2533359616,822083584,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50331648,251658240,889192448,1962934272,3463338042,4260681651,4294955128,4294949388,4294949120,4294948864,4294948864,4294953816,4294960063,3903219779,2701722370,1627389952,620756992,100663296,0,0 - ,0,0,0,0,0,0,0,0,0,0,0,822083584,2533359616,4292467161,3730463322,3187671040,3730463322,4292467161,3456106496,4292467161,3849680245,3221225472,3849680245,4292467161,3640655872,4292467161,3640655872,3640655872,4292467161,3640655872,3640655872,4292467161,3640655872,4292467161,3966923378,3640655872,3966923378,4292467161,3355443200,3918236555,4292467161,3763951961,3539992576,4292467161,3966923378,3640655872,3966923378,4292467161,3456106496,4292467161,3849680245,3221225472,3422552064,3456106496,2348810240,721420288,721420288,2348810240,3456106496,3422552064,3221225472,3849680245,4292467161,3640655872,4292467161,2734686208,1828716544,2734686208,4292467161,2734686208,905969664,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50331648,318767104,1006632960,2080374784,3683940948,4294958002,4294949951,4294946816,4294946048,4294944256,4294944256,4294945536,4294944512,4294944799,4294954914,4123823487,3056010753 - ,1778384896,671088640,117440512,0,0,0,0,0,0,0,0,0,0,0,0,822083584,2533359616,4292467161,3187671040,2734686208,3187671040,4292467161,3640655872,4292467161,3221225472,2801795072,3221225472,4292467161,3640655872,4292467161,3966923378,3640655872,4292467161,3966923378,3640655872,4292467161,3640655872,4292467161,3640655872,4292467161,4292467161,4292467161,3640655872,4292467161,3613154396,2818572288,3221225472,4292467161,3640655872,4292467161,4292467161,4292467161,3640655872,4292467161,3221225472,2801795072,3221225472,4292467161,2533359616,822083584,822083584,2533359616,4292467161,3221225472,2801795072,3221225472,4292467161,3640655872,4292467161,2952790016,2264924160,2952790016,4292467161,2533359616,822083584,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50331648,318767104,1056964608,2147483648,3819605095,4294955172,4294944795,4294943744,4294941184,4294939392,4294940672,4294940160,4294938624,4294941440 - ,4294940672,4294936323,4294815095,4208955271,3208382211,1845493760,721420288,134217728,0,0,0,0,0,0,0,0,0,0,0,721420288,2348810240,3456106496,3405774848,3187671040,3730463322,4292467161,3456106496,4292467161,3849680245,3221225472,3849680245,4292467161,3355443200,3816191606,4292467161,3966923378,3966923378,4292467161,3966923378,4292467161,3640655872,4292467161,3966923378,3640655872,3640655872,3640655872,3640655872,4292467161,2868903936,1996488704,2684354560,4292467161,3966923378,3640655872,3640655872,3539992576,3456106496,4292467161,3849680245,3221225472,3849680245,4292467161,2533359616,822083584,822083584,2533359616,4292467161,3849680245,3221225472,3849680245,4292467161,3456106496,4292467161,3730463322,3187671040,3405774848,3456106496,2348810240,721420288,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16777216,234881024,989855744,2147483648,3836647021,4294952084,4294939916,4294939392,4294936064 - ,4294935808,4294939907,3970992676,3783616794,4260594952,4294933248,4294937088,4294937088,4294865664,4294676569,4243165579,3292924164,1862270976,721420288,134217728,0,0,0,0,0,0,0,0,0,0,822083584,2533359616,4292467161,4292467161,4292467161,4292467161,3665591420,2650800128,3665591420,4292467161,4292467161,4292467161,3665591420,2348810240,2348810240,3665591420,4292467161,3355443200,3816191606,4292467161,4292467161,3355443200,3816191606,4292467161,4292467161,4292467161,3696908890,3355443200,4292467161,2533359616,1325400064,1845493760,3665591420,4292467161,4292467161,4292467161,3665591420,2650800128,3665591420,4292467161,4292467161,4292467161,3665591420,1845493760,520093696,520093696,1845493760,3665591420,4292467161,4292467161,4292467161,3665591420,2650800128,3665591420,4292467161,4292467161,4292467161,4292467161,2533359616,822083584,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150994944,855638016 - ,2063597568,3785853032,4294949263,4294935301,4294934528,4294931200,4294865408,4294739211,3598869795,2348810240,2248146944,3157861897,4158024716,4294930432,4294934272,4294934016,4294796032,4294604868,4260400774,3309963524,1862270976,704643072,117440512,0,0,0,0,0,0,0,0,0,905969664,2734686208,4292467161,3730463322,2952790016,2533359616,1845493760,1325400064,1845493760,2533359616,2734686208,2533359616,1845493760,1006632960,1006632960,1845493760,2348810240,2164260864,2164260864,2533359616,2533359616,2164260864,2164260864,2533359616,2734686208,2533359616,2164260864,2164260864,2348810240,1677721600,671088640,822083584,1845493760,2533359616,2734686208,2533359616,1845493760,1325400064,1845493760,2533359616,2734686208,2533359616,1845493760,822083584,167772160,167772160,822083584,1845493760,2533359616,2734686208,2533359616,1845493760,1325400064,1845493760,2533359616,2952790016,3730463322,4292467161,2734686208,905969664,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,117440512,738197504,1962934272,3632951638,4294947982,4294931462,4294930176,4294794752,4294662144,4260327185,3378071325,1946157056,922746880,822083584,1677721600,2785937666,3954400527,4294929408,4294931968,4294931712,4294661120,4294469180,4260200571,3208316675,1795162112,620756992,83886080,0,0,0,0,0,0,0,0,822083584,2533359616,4292467161,2768240640,1493172224,822083584,520093696,301989888,520093696,822083584,905969664,822083584,520093696,184549376,184549376,520093696,721420288,620756992,620756992,822083584,822083584,620756992,620756992,822083584,905969664,822083584,620756992,620756992,721420288,503316480,150994944,167772160,520093696,822083584,905969664,822083584,520093696,301989888,520093696,822083584,905969664,822083584,520093696,167772160,16777216,16777216,167772160,520093696,822083584,905969664,822083584,520093696,301989888,520093696,822083584,1493172224,2768240640,4292467161,2533359616,822083584,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,67108864,620756992,1811939328,3429059385,4294882972,4294796301,4294727936,4294526208,4294325760,4226241553,3242276118,1862270976,738197504,150994944,100663296,520093696,1325400064,2264924160,3768667144,4294928385,4294929408,4294796800,4294460416,4294335293,4225986666,3055813377,1644167168,503316480,50331648,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1677721600,503316480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1677721600,503316480,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16777216,335544320,1459617792,3005750036,4243500445,4294661403,4294524672,4294258432,4294121728,4259985678,3259118102,1845493760,704643072,134217728,0,0,50331648,335544320,1006632960,2080374784,3751757574,4294794241,4294794240,4294592771 - ,4294323463,4294400588,4123811671,2769158144,1275068416,251658240,0,0,0,0,0,0,0,134217728,503316480,721420288,503316480,134217728,0,0,0,0,134217728,503316480,721420288,503316480,268435456,503316480,721420288,503316480,134217728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134217728,503316480,721420288,503316480,134217728,0,0,0,0,134217728,503316480,721420288,503316480,134217728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134217728,503316480,721420288,520093696,167772160,16777216,0,0,0,0,0,0,0,0,134217728,503316480,721420288,520093696,234881024,285212672,570425344,687865856,436207616,117440512,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,150994944,922746880,2348810240,4056321414,4294197820,4294119936,4294056448,4293921536,4293991688,3394978333,1879048192,704643072,117440512,0,0,0,0,33554432,268435456,1023410176,2248146944,3869450497,4293927168,4293661957,4293331976,4293330946,4293609799,3936365867,2181038080,822083584,134217728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,503316480,1677721600 - ,2348810240,1744830464,1140850688,1744830464,2348810240,1744830464,637534208,67108864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1744830464,637534208,67108864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1811939328,771751936,150994944,0,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1811939328,1040187392,1207959552,1979711488,2248146944,1509949440,436207616,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50331648,620756992,1879048192,3649264467,4294272360,4293853184,4293920000,4293920000,4293918720,3649195041,1979711488,754974720,134217728,0,0,0,0,0,67108864,335544320,1023410176,2080374784,3036676096,4088070144,4292476928,4292608000,4292739072,4292804608,4293347915,3581022738,1879048192,654311424,83886080,0,0,0,0,0,0,0,0,50331648,201326592,335544320,201326592,50331648,0,822083584,2533359616,4294967295,3261885548,2080374784,2768240640,4294967295,3261885548,1258291200,234881024,117440512,402653184,671088640 - ,687865856,469762048,184549376,33554432,0,83886080,318767104,419430400,352321536,469762048,620756992,620756992,520093696,335544320,150994944,50331648,0,0,50331648,201326592,335544320,201326592,50331648,0,822083584,2533359616,4294967295,3295439980,1610612736,872415232,520093696,318767104,301989888,167772160,33554432,0,33554432,167772160,301989888,167772160,33554432,50331648,201326592,335544320,201326592,50331648,0,0,0,50331648,184549376,469762048,704643072,704643072,469762048,184549376,855638016,2533359616,4294809856,3566287616,1493172224,335544320,0,0,50331648,234881024,402653184,234881024,50331648,0,822083584,2550136832,4294809856,3583064832,2147483648,2382364672,3921236224,4209802240,2181038080,687865856,184549376,469762048,704643072,704643072,469762048,184549376,50331648,50331648,234881024,520093696,671088640,704643072,822083584,889192448,771751936,721420288,805306368,771751936,520093696,234881024,50331648,0,0,0,0,268435456,1358954496,3023117852,4260334217,4293854213,4293919488,4293921024 - ,4293853184,4055516443,2348810240,939524096,150994944,0,0,0,0,33554432,201326592,671088640,1442840576,2264924160,3513790764,3356295425,3473866752,4207017984,4292673536,4292804608,4292870144,4292937479,4276240705,3174499075,1610612736,419430400,0,0,0,0,0,0,0,83886080,452984832,1157627904,1577058304,1174405120,486539264,83886080,905969664,2734686208,4294967295,3479528805,2533359616,3087007744,4294967295,3429394536,1543503872,520093696,754974720,1610612736,2248146944,2298478592,1845493760,1107296256,385875968,150994944,587202560,1409286144,1644167168,1442840576,1761607680,2147483648,2147483648,1962934272,1593835520,1040187392,385875968,50331648,83886080,452984832,1157627904,1577058304,1174405120,486539264,234881024,1191182336,2868903936,4294967295,3630326370,2734686208,2432696320,1962934272,1526726656,1392508928,822083584,167772160,0,167772160,822083584,1392508928,1073741824,436207616,503316480,1157627904,1577058304,1174405120,486539264,83886080,0,83886080,452984832,1140850688,1845493760,2315255808 - ,2315255808,1845493760,1140850688,1375731712,2818572288,4294804480,3666292992,1744830464,419430400,0,100663296,520093696,1275068416,1694498816,1291845632,536870912,234881024,1191182336,2868903936,4294804480,3783471360,2952790016,3768006912,4294606336,3681495040,2130706432,1023410176,1140850688,1845493760,2315255808,2315255808,1845493760,1140850688,469762048,335544320,1006632960,1879048192,2248146944,2298478592,2533359616,2667577344,2449473536,2332033024,2499805184,2449473536,1962934272,1191182336,419430400,50331648,0,0,83886080,754974720,2181038080,3971250292,4293995053,4293853184,4293855488,4293591040,4208406034,2938050314,1426063360,335544320,16777216,0,0,50331648,234881024,620756992,1207959552,2013265920,3107396370,4055000155,4293554803,4003672881,3221225472,3544186880,4292673536,4292804608,4292870144,4292870144,4293006099,4122616354,2600796160,1023410176,134217728,0,0,0,0,0,67108864,520093696,1560281088,2685209869,3768886436,2736133654,1644167168,603979776,1006632960,2734686208,4294967295 - ,3630326370,2952790016,3630326370,4294967295,3429394536,1711276032,1191182336,1979711488,3531768450,4140814287,4140945873,3801519766,2584349194,1493172224,1006632960,1728053248,3380576127,3769610159,2734686208,3752175013,4022386880,4022386880,3886721706,3513806960,2739028546,1140850688,285212672,520093696,1560281088,2685209869,3768886436,2736133654,1644167168,1107296256,1996488704,3579994722,4294967295,3780992349,3456106496,4294967295,3596837731,3173130786,3600916897,1828716544,553648128,50331648,553648128,1828716544,3600916897,2620009002,1509949440,1694498816,2685209869,3768886436,2736133654,1644167168,603979776,150994944,503316480,1543503872,2889486848,3767873792,4175254272,4175254272,3767873792,2889486848,2399141888,3120562176,4294798592,3632408576,1694498816,402653184,83886080,587202560,1644167168,2786133248,3870512384,2870872320,1711276032,1140850688,2013265920,3682543616,4294798592,3866764800,3456106496,4294798592,4054399232,3338665984,2516582400,2097152000,2889486848,3767873792,4175254272 - ,4175254272,3767873792,2889486848,1660944384,1275068416,2097152000,3836689152,4192360448,3422552064,4294798592,4294798592,4192360448,3970513152,4294798592,4192360448,3903601152,2788757760,1174405120,234881024,0,0,335544320,1493172224,3259970090,4294206305,4293591040,4293263872,4292935936,4292806915,3648730389,1862270976,620756992,117440512,117440512,285212672,553648128,922746880,1392508928,2063597568,2938704652,3834466116,4276189301,4292948534,4293067009,4293740360,3732214294,3187671040,3918004480,4293132288,4293066752,4292935680,4292870144,4293073434,3681683208,1879048192,536870912,33554432,0,0,0,16777216,402653184,1509949440,2869890831,4106733511,4277729528,4157920468,3022135842,1644167168,1392508928,2751463424,4294967295,3730726494,3271557120,4294967295,4294967295,3429394536,2030043136,2147483648,3768820643,4209699562,3832574064,3815599469,4260820726,3970410407,2936999695,2499805184,3464001656,4022189501,3578678862,3355443200,4294967295,3747569503,3426828609,3426828609,4004030632,3784347792 - ,1996488704,922746880,1509949440,2869890831,4106733511,4277729528,4157920468,3022135842,2348810240,2768240640,4294967295,4294967295,3847969627,3640655872,4294967295,3847969627,4020084125,4260820726,2888510251,1157627904,335544320,1157627904,2888510251,4260820726,3852772516,2734686208,3004174352,4106733511,4277729528,4157920468,3022135842,1644167168,721420288,1275068416,3058897920,4106697728,4294726912,4020186368,4020186368,4294726912,4106697728,3561427200,3489660928,4294792448,3598458880,1660944384,402653184,452984832,1577058304,2937455616,4158017536,4277752576,4192228608,3090025216,2382364672,2801795072,4294792448,4294792448,3916570368,3640655872,4294792448,4294792448,4294792448,3170893824,3460961024,4106697728,4294726912,4020186368,4020186368,4294726912,4106697728,3259962368,2617245696,3649906432,4277752576,3730839552,3539992576,4294792448,3849592320,3679458560,4277752576,4037094656,3813479168,4277752576,3886493184,1996488704,536870912,0,67108864,788529152,2281701376,4072894821,4293201424 - ,4292870144,4292804608,4292608000,4156898324,2634022912,1392508928,822083584,905969664,1140850688,1476395008,2013265920,2617573888,3292798484,3902098491,4241976422,4292888908,4292806923,4293001216,4293263360,4293525760,4294260515,3510376966,3305308160,4191289856,4293394432,4293066752,4292935680,4293001473,4242215445,2871133184,1191182336,201326592,0,0,0,268435456,1291845632,2701723913,4072652735,4260754933,3782702967,4175355614,4158446812,2870877726,2264924160,3019898880,4294967295,3630326370,2952790016,3305111552,4294967295,3462817382,2399141888,3243660886,4277795321,3764675684,3372220416,3405774848,3780071247,4174829270,3729542220,3456106496,4294967295,3801256594,2885681152,3271557120,4294967295,3546506083,2298478592,2348810240,3648616825,4294967295,2818572288,2097152000,2701723913,4072652735,4260754933,3782702967,4175355614,4158446812,3289979161,3137339392,3456106496,4294967295,3847969627,3640655872,4294967295,3780992349,3645064003,4226674157,3767833748,1996488704,1174405120,1996488704 - ,3767833748,4243385580,3712107074,3473278470,4072652735,4260754933,3782702967,4175355614,4158446812,2870877726,1711276032,1811939328,3685360896,4124521216,3410759424,2920416000,2920416000,3427536640,4157944576,4105775616,3640655872,4294787072,3564509184,1627389952,637534208,1342177280,2785739264,4106956544,4260773120,3867745792,4209325824,4192286208,3323987200,3137339392,3456106496,4294787072,3899463168,3640655872,4294787072,3798931456,3204448256,3221225472,4055509504,4157944576,3427536640,2920416000,2920416000,3427536640,4157944576,4072286720,3456106496,4294787072,3886162944,2969567232,3305111552,4294787072,3698464768,2952790016,3783794432,4294787072,3640655872,3951172864,4294787072,2550136832,822083584,0,285212672,1426063360,3277007389,4293737023,4293066752,4292870144,4292739072,4241565196,3423471106,2717908992,2197815296,2264924160,2685010432,3005286916,3377536014,3851039012,4139536965,4292959323,4292818747,4292742414,4292804608,4292804608,4292935680,4293725440,4294590464,3954466066,2871071238 - ,2466250752,3445623808,4294119168,4293525504,4293132288,4293001216,4293462024,3835439624,2030043136,654311424,67108864,0,50331648,788529152,2348941826,3851061898,4260886519,3529005144,3120562176,3525452322,4243451373,3902446234,3288926473,3439329280,4294967295,3513017444,2634022912,3137339392,4294967295,3496306021,2583691264,3717567893,4209041632,3489660928,4141406424,4141538010,4124168657,4192461795,3868365458,3523215360,4294967295,3462817382,2499805184,3070230528,4294967295,3429394536,1811939328,1845493760,3446040166,4294967295,3422552064,3221225472,3851061898,4260886519,3529005144,3120562176,3525452322,4243451373,3952580503,3490318858,3539992576,4294967295,3847969627,3640655872,4294967295,3630326370,2952790016,3869483939,4260689140,3123917619,2415919104,3123917619,4260689140,4020084125,3640655872,3968239238,4260886519,3529005144,3120562176,3525452322,4243451373,3902446234,2735475724,2113929216,2600468480,3019898880,2583691264,2063597568,2063597568,2667577344,3714912256,4294781952,3640655872 - ,4294781952,3547336960,1728053248,1191182336,2382495744,3902150144,4277545472,3580038656,3120562176,3559458048,4243531776,3986889472,3490382080,3539992576,4294781952,3882225408,3640655872,4294781952,3614249216,2634022912,2919235584,4294781952,3714912256,2667577344,2063597568,2063597568,2667577344,3714912256,4294781952,3640655872,4294781952,3547336960,2583691264,3120562176,4294781952,3547336960,2566914048,3547336960,4294781952,3640655872,3882225408,4294781952,2734686208,905969664,50331648,687865856,2164260864,4004986156,4293526023,4293132288,4292804608,4292739072,4190049031,3866102791,3816952331,3868467732,4003800346,4156500256,4275644710,4292683559,4292682277,4292679193,4292739073,4292739072,4292608000,4292411392,4292673536,4293661184,4174923273,3446360857,2164260864,1291845632,1191182336,2332033024,4073140736,4294119168,4293525504,4293066752,4293263360,4276230916,3260750080,1392508928,318767104,16777216,184549376,1275068416,3157340465,4274439878,3678486849,3120562176,3289452817,3848232799 - ,4120681628,4291611852,3711251765,3456106496,4291611852,3799348597,2919235584,3288334336,4291611852,3461435729,2499805184,3410446151,4206212533,3778952766,3591574291,3388997632,3305111552,3170893824,3036676096,3372220416,4291611852,3427947090,2415919104,3019898880,4291611852,3427947090,1795162112,1795162112,3427947090,4291611852,3640655872,3760793897,4274439878,3678486849,3120562176,3289452817,3848232799,4120681628,4291611852,3795137845,3640655872,4291611852,3846785353,3640655872,4291611852,3478212945,2399141888,3073322799,4172394929,4121339558,3491832097,4121339558,4172394929,3542690089,3643353385,4274439878,3678486849,3120562176,3289452817,3848232799,4120681628,4291611852,3510188345,2785017856,3582069760,4090368512,3376612608,2920218624,2920218624,3393389824,4123791872,4037807872,3456106496,4294514688,3835038720,2231369728,1862270976,3191800832,4277278208,3696690944,3137339392,3323461888,3883600384,4140044544,4294514688,3813017088,3640655872,4294514688,3865118720,3640655872,4294514688 - ,3496610048,2130706432,2399141888,3954183936,4123791872,3393389824,2920218624,2920218624,3393389824,4123791872,4071296768,3640655872,4294514688,3496610048,2466250752,3053453312,4294514688,3496610048,2466250752,3496610048,4294514688,3640655872,3865118720,4294514688,2734686208,905969664,201326592,1224736768,3023639812,4277017613,4293656576,4293263360,4292870144,4292804608,4292870144,4292871176,4292939794,4292939796,4292873232,4292871689,4292739587,4292804608,4292804608,4292673536,4292542464,4292345856,4292542464,4293133568,4157219336,3665638928,2651785731,1677721600,771751936,251658240,385875968,1526726656,3327729408,4294721792,4294119168,4293591040,4293197824,4293925893,3987551235,2248146944,872415232,134217728,385875968,1677721600,3630721128,4291546059,3813757265,3849088108,4189172145,4154893990,3881063508,4154762404,3781387107,3070230528,3629931612,4257728455,3661512254,3539992576,4291611852,3427947090,2231369728,2769885465,3934158462,4205949361,3847311697,3643419178,3729081669,4037585064 - ,2902458368,3288334336,4291611852,3427947090,2415919104,3019898880,4291611852,3427947090,1795162112,1795162112,3427947090,4291611852,3640655872,3932250465,4291546059,3813757265,3849088108,4189172145,4154893990,3881063508,4154762404,3915275870,3640655872,4291611852,3846785353,3640655872,4291611852,3427947090,1929379840,1946157056,3309980234,4206541498,4274374085,4206541498,3427289160,2835349504,3731187045,4291546059,3813757265,3849088108,4189172145,4154893990,3881063508,4154762404,3865075808,3456106496,4294511104,4088530432,4294380032,3968205824,3968205824,4294380032,4038395392,3158180096,2533359616,3531015424,4260563200,3310682880,2583691264,3665954048,4294445568,3815047936,3867608064,4191881216,4157409024,3899130624,4157277952,3933602816,3640655872,4294511104,3864789504,3640655872,4294511104,3462923264,1778384896,1577058304,2957115648,4038395392,4294380032,3968205824,3968205824,4294380032,4038395392,3493396736,3472883712,4294511104,3462923264,2449473536,3036676096,4294511104,3462923264 - ,2449473536,3462923264,4294511104,3640655872,3864789504,4294511104,2734686208,905969664,436207616,1795162112,3784914178,4294453760,4293985792,4293525504,4293263360,4293066752,4293001216,4292870144,4292870144,4292870144,4292804608,4292739072,4292608000,4292411392,4292411392,4292411392,4292804608,4276096257,4055439621,3462337541,2617967874,1778384896,1006632960,436207616,100663296,0,83886080,822083584,2332033024,4107292928,4294722560,4294251776,4293656576,4293856768,4276101633,3515097344,1342177280,234881024,436207616,1711276032,3817968017,4206673084,4223647679,4019952539,3613812326,3157077293,2869101315,3461238350,4037716650,2516582400,2365587456,3614865014,4104759721,3405774848,4291611852,3260503895,1560281088,1526726656,2703500324,3630786921,4036861341,4240490688,3867575942,2973514812,2231369728,2885681152,4291611852,3260503895,2080374784,2768240640,4291611852,3260503895,1493172224,1493172224,3260503895,4291611852,3372220416,3951922573,4206673084,4223647679,4019952539,3613812326,3157077293 - ,2869101315,3461238350,4087982505,3405774848,4291611852,3662499149,3355443200,4291611852,3260503895,1358954496,872415232,1795162112,3224646708,4257662662,3224646708,2147483648,2147483648,3817968017,4206673084,4223647679,4019952539,3613812326,3157077293,2869101315,3461238350,4104628135,3590324224,4294508544,3815702528,3698589696,4073127936,4073127936,3598123008,2720661504,1543503872,1107296256,1929379840,3616538624,4057071616,2801795072,3870294016,4209246208,4226351104,4022140928,3615162368,3157852160,2869100544,3462266880,4090298368,3405774848,4294508544,3663659008,3355443200,4294508544,3261661184,1325400064,687865856,1476395008,2720661504,3598123008,4073127936,4073127936,3598123008,2720661504,2231369728,2902458368,4294508544,3261661184,2080374784,2768240640,4294508544,3261661184,2080374784,3261661184,4294508544,3355443200,3663659008,4294508544,2533359616,822083584,520093696,1962934272,4022817026,4294132225,4294521600,4294253056,4293920768,4293591296,4293197824,4293132288,4292935680,4292804608 - ,4292804608,4292804608,4292935936,4293135104,4242084099,4072214529,3597801734,3023440387,2231369728,1577058304,956301312,452984832,117440512,16777216,0,0,0,352321536,1627389952,3530502912,4294929408,4294791936,4294592513,4158276864,3444975876,2535986688,1006632960,150994944,234881024,1006632960,1929379840,2449473536,2483027968,2164260864,1694498816,1258291200,1174405120,1610612736,1929379840,1459617792,1124073472,1660944384,2130706432,2264924160,2348810240,1744830464,687865856,436207616,1023410176,1694498816,2197815296,2348810240,1962934272,1224736768,989855744,1761607680,2348810240,1744830464,1140850688,1744830464,2348810240,1744830464,721420288,721420288,1744830464,2348810240,2197815296,2164260864,2449473536,2483027968,2164260864,1694498816,1258291200,1174405120,1610612736,2063597568,2248146944,2348810240,2164260864,2164260864,2348810240,1744830464,637534208,184549376,704643072,1728053248,2281701376,1728053248,939524096,1124073472,1929379840,2449473536,2483027968,2164260864,1694498816 - ,1258291200,1174405120,1610612736,2483027968,3305111552,4294508544,3563126784,2449473536,2214592512,2147483648,1677721600,1023410176,402653184,234881024,788529152,1660944384,1996488704,1828716544,2030043136,2449473536,2483027968,2164260864,1694498816,1258291200,1174405120,1610612736,2063597568,2248146944,2348810240,2164260864,2164260864,2348810240,1744830464,637534208,150994944,402653184,1023410176,1677721600,2147483648,2147483648,1677721600,1023410176,905969664,1744830464,2348810240,1744830464,1140850688,1744830464,2348810240,1744830464,1140850688,1744830464,2348810240,2164260864,2164260864,2348810240,1677721600,503316480,318767104,1375731712,3059226113,3699846145,3869130506,4022230030,4141306627,4226171904,4260378112,4260178176,4259914240,4191428864,4089652224,3936955141,3648853506,3361147392,2887846915,2248146944,1694498816,1191182336,721420288,335544320,83886080,16777216,0,0,0,0,0,117440512,989855744,2585332736,4039860480,3784984577,3226543360,2382364672,1728053248,989855744,318767104 - ,33554432,50331648,234881024,536870912,771751936,788529152,620756992,385875968,167772160,134217728,352321536,520093696,369098752,234881024,436207616,620756992,671088640,721420288,503316480,134217728,33554432,150994944,385875968,637534208,721420288,520093696,234881024,184549376,503316480,721420288,503316480,268435456,503316480,721420288,503316480,134217728,134217728,503316480,721420288,637534208,620756992,771751936,788529152,620756992,385875968,167772160,134217728,352321536,587202560,671088640,721420288,620756992,620756992,721420288,503316480,134217728,0,134217728,469762048,687865856,469762048,167772160,234881024,536870912,771751936,788529152,620756992,385875968,167772160,134217728,352321536,1258291200,2734686208,4294508544,3278503936,1476395008,754974720,620756992,385875968,150994944,33554432,16777216,150994944,436207616,570425344,503316480,587202560,771751936,788529152,620756992,385875968,167772160,134217728,352321536,587202560,671088640,721420288,620756992,620756992,721420288,503316480 - ,134217728,0,33554432,150994944,385875968,620756992,620756992,385875968,150994944,150994944,503316480,721420288,503316480,268435456,503316480,721420288,503316480,268435456,503316480,721420288,620756992,620756992,721420288,503316480,134217728,67108864,503316480,1224736768,1744830464,1979711488,2181038080,2382364672,2533359616,2634022912,2634022912,2600468480,2466250752,2298478592,2046820352,1728053248,1409286144,1073741824,704643072,385875968,167772160,50331648,0,0,0,0,0,0,0,0,16777216,419430400,1342177280,1979711488,1862270976,1342177280,822083584,419430400,150994944,33554432,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,503316480,1677721600,2348810240,1744830464,637534208,67108864,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,50331648,234881024,419430400,536870912,637534208,738197504,822083584,855638016,872415232,838860800,788529152,687865856 - ,570425344,419430400,251658240,117440512,33554432,0,0,0,0,0,0,0,0,0,0,0,0,67108864,335544320,536870912,469762048,234881024,50331648,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,134217728,503316480,721420288,503316480,134217728,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])); - return bmp; - } - - private function onMouseDown(e:MouseEvent) : void - { - e.stopPropagation(); - } - - private function onClick(e:MouseEvent) : void - { - e.stopPropagation(); - try - { - navigateToURL(new URLRequest("http://alternativaplatform.com"),"_blank"); - } - catch(e:Error) - { - } - } - - private function onDoubleClick(e:MouseEvent) : void - { - e.stopPropagation(); - } - - private function onMouseMove(e:MouseEvent) : void - { - e.stopPropagation(); - transform.colorTransform = highlighted; - } - - private function onMouseOut(e:MouseEvent) : void - { - e.stopPropagation(); - transform.colorTransform = normal; - } - - private function onMouseWheel(e:MouseEvent) : void - { - e.stopPropagation(); - } -} diff --git a/src/alternativa/engine3d/core/events/Event3D.as b/src/alternativa/engine3d/core/events/Event3D.as deleted file mode 100644 index 75a199a..0000000 --- a/src/alternativa/engine3d/core/events/Event3D.as +++ /dev/null @@ -1,78 +0,0 @@ -package alternativa.engine3d.core.events -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Object3D; - import flash.events.Event; - - use namespace alternativa3d; - - public class Event3D extends Event - { - public static const ADDED:String = "added3D"; - - public static const REMOVED:String = "removed3D"; - - alternativa3d var name_5E:Object3D; - - alternativa3d var name_Kh:Object3D; - - alternativa3d var name_iJ:Boolean; - - alternativa3d var name_VE:uint = 3; - - alternativa3d var stop:Boolean = false; - - alternativa3d var name_XD:Boolean = false; - - public function Event3D(type:String, bubbles:Boolean = true) - { - super(type,bubbles); - this.name_iJ = bubbles; - } - - override public function get bubbles() : Boolean - { - return this.name_iJ; - } - - override public function get eventPhase() : uint - { - return this.name_VE; - } - - override public function get target() : Object - { - return this.name_5E; - } - - override public function get currentTarget() : Object - { - return this.name_Kh; - } - - override public function stopPropagation() : void - { - this.alternativa3d::stop = true; - } - - override public function stopImmediatePropagation() : void - { - this.name_XD = true; - } - - override public function clone() : Event - { - var result:Event3D = new Event3D(type,this.name_iJ); - result.name_5E = this.name_5E; - result.name_Kh = this.name_Kh; - result.name_VE = this.name_VE; - return result; - } - - override public function toString() : String - { - return formatToString("Event3D","type","bubbles","eventPhase"); - } - } -} - diff --git a/src/alternativa/engine3d/core/events/MouseEvent3D.as b/src/alternativa/engine3d/core/events/MouseEvent3D.as deleted file mode 100644 index ed86ac9..0000000 --- a/src/alternativa/engine3d/core/events/MouseEvent3D.as +++ /dev/null @@ -1,82 +0,0 @@ -package alternativa.engine3d.core.events -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.objects.Surface; - import flash.events.Event; - - use namespace alternativa3d; - - public class MouseEvent3D extends Event3D - { - public static const CLICK:String = "click3D"; - - public static const DOUBLE_CLICK:String = "doubleClick3D"; - - public static const MOUSE_DOWN:String = "mouseDown3D"; - - public static const MOUSE_UP:String = "mouseUp3D"; - - public static const MOUSE_OVER:String = "mouseOver3D"; - - public static const MOUSE_OUT:String = "mouseOut3D"; - - public static const ROLL_OVER:String = "rollOver3D"; - - public static const ROLL_OUT:String = "rollOut3D"; - - public static const MOUSE_MOVE:String = "mouseMove3D"; - - public static const MOUSE_WHEEL:String = "mouseWheel3D"; - - public var ctrlKey:Boolean; - - public var altKey:Boolean; - - public var shiftKey:Boolean; - - public var buttonDown:Boolean; - - public var delta:int; - - public var relatedObject:Object3D; - - public var localX:Number; - - public var localY:Number; - - public var localZ:Number; - - alternativa3d var name_BX:Surface; - - public function MouseEvent3D(type:String, bubbles:Boolean = true, localX:Number = NaN, localY:Number = NaN, localZ:Number = NaN, relatedObject:Object3D = null, ctrlKey:Boolean = false, altKey:Boolean = false, shiftKey:Boolean = false, buttonDown:Boolean = false, delta:int = 0) - { - super(type,bubbles); - this.localX = localX; - this.localY = localY; - this.localZ = localZ; - this.relatedObject = relatedObject; - this.ctrlKey = ctrlKey; - this.altKey = altKey; - this.shiftKey = shiftKey; - this.buttonDown = buttonDown; - this.delta = delta; - } - - public function get surface() : Surface - { - return this.name_BX; - } - - override public function clone() : Event - { - return new MouseEvent3D(type,name_iJ,this.localX,this.localY,this.localZ,this.relatedObject,this.ctrlKey,this.altKey,this.shiftKey,this.buttonDown,this.delta); - } - - override public function toString() : String - { - return formatToString("MouseEvent3D","type","bubbles","eventPhase","localX","localY","localZ","relatedObject","altKey","ctrlKey","shiftKey","buttonDown","delta"); - } - } -} - diff --git a/src/alternativa/engine3d/effects/AGALMiniAssembler.as b/src/alternativa/engine3d/effects/AGALMiniAssembler.as deleted file mode 100644 index e7b2310..0000000 --- a/src/alternativa/engine3d/effects/AGALMiniAssembler.as +++ /dev/null @@ -1,826 +0,0 @@ -package alternativa.engine3d.effects -{ - import flash.utils.*; - - public class AGALMiniAssembler - { - private static var initialized:Boolean = false; - - private static const OPMAP:Dictionary = new Dictionary(); - - private static const REGMAP:Dictionary = new Dictionary(); - - private static const SAMPLEMAP:Dictionary = new Dictionary(); - - private static const MAX_NESTING:int = 4; - - private static const MAX_OPCODES:int = 256; - - private static const FRAGMENT:String = "fragment"; - - private static const VERTEX:String = "vertex"; - - private static const SAMPLER_DIM_SHIFT:uint = 12; - - private static const SAMPLER_SPECIAL_SHIFT:uint = 16; - - private static const SAMPLER_REPEAT_SHIFT:uint = 20; - - private static const SAMPLER_MIPMAP_SHIFT:uint = 24; - - private static const SAMPLER_FILTER_SHIFT:uint = 28; - - private static const REG_WRITE:uint = 1; - - private static const REG_READ:uint = 2; - - private static const REG_FRAG:uint = 32; - - private static const REG_VERT:uint = 64; - - private static const OP_SCALAR:uint = 1; - - private static const OP_INC_NEST:uint = 2; - - private static const OP_DEC_NEST:uint = 4; - - private static const OP_SPECIAL_TEX:uint = 8; - - private static const OP_SPECIAL_MATRIX:uint = 16; - - private static const OP_FRAG_ONLY:uint = 32; - - private static const OP_VERT_ONLY:uint = 64; - - private static const OP_NO_DEST:uint = 128; - - private static const MOV:String = "mov"; - - private static const ADD:String = "add"; - - private static const SUB:String = "sub"; - - private static const MUL:String = "mul"; - - private static const DIV:String = "div"; - - private static const RCP:String = "rcp"; - - private static const MIN:String = "min"; - - private static const MAX:String = "max"; - - private static const FRC:String = "frc"; - - private static const SQT:String = "sqt"; - - private static const RSQ:String = "rsq"; - - private static const POW:String = "pow"; - - private static const LOG:String = "log"; - - private static const EXP:String = "exp"; - - private static const NRM:String = "nrm"; - - private static const SIN:String = "sin"; - - private static const COS:String = "cos"; - - private static const CRS:String = "crs"; - - private static const DP3:String = "dp3"; - - private static const DP4:String = "dp4"; - - private static const ABS:String = "abs"; - - private static const NEG:String = "neg"; - - private static const SAT:String = "sat"; - - private static const M33:String = "m33"; - - private static const M44:String = "m44"; - - private static const M34:String = "m34"; - - private static const IFZ:String = "ifz"; - - private static const INZ:String = "inz"; - - private static const IFE:String = "ife"; - - private static const INE:String = "ine"; - - private static const IFG:String = "ifg"; - - private static const IFL:String = "ifl"; - - private static const IEG:String = "ieg"; - - private static const IEL:String = "iel"; - - private static const ELS:String = "els"; - - private static const EIF:String = "eif"; - - private static const REP:String = "rep"; - - private static const ERP:String = "erp"; - - private static const BRK:String = "brk"; - - private static const KIL:String = "kil"; - - private static const TEX:String = "tex"; - - private static const SGE:String = "sge"; - - private static const SLT:String = "slt"; - - private static const SGN:String = "sgn"; - - private static const VA:String = "va"; - - private static const VC:String = "vc"; - - private static const VT:String = "vt"; - - private static const OP:String = "op"; - - private static const V:String = "v"; - - private static const FC:String = "fc"; - - private static const FT:String = "ft"; - - private static const FS:String = "fs"; - - private static const OC:String = "oc"; - - private static const D2:String = "2d"; - - private static const D3:String = "3d"; - - private static const CUBE:String = "cube"; - - private static const MIPNEAREST:String = "mipnearest"; - - private static const MIPLINEAR:String = "miplinear"; - - private static const MIPNONE:String = "mipnone"; - - private static const NOMIP:String = "nomip"; - - private static const NEAREST:String = "nearest"; - - private static const LINEAR:String = "linear"; - - private static const CENTROID:String = "centroid"; - - private static const SINGLE:String = "single"; - - private static const DEPTH:String = "depth"; - - private static const REPEAT:String = "repeat"; - - private static const WRAP:String = "wrap"; - - private static const CLAMP:String = "clamp"; - - private var name_0e:ByteArray = null; - - private var name_iF:String = ""; - - private var name_9J:Boolean = false; - - public function AGALMiniAssembler(debugging:Boolean = false) - { - super(); - this.name_9J = debugging; - if(!initialized) - { - init(); - } - } - - private static function init() : void - { - initialized = true; - OPMAP[MOV] = new OpCode(MOV,2,0,0); - OPMAP[ADD] = new OpCode(ADD,3,1,0); - OPMAP[SUB] = new OpCode(SUB,3,2,0); - OPMAP[MUL] = new OpCode(MUL,3,3,0); - OPMAP[DIV] = new OpCode(DIV,3,4,0); - OPMAP[RCP] = new OpCode(RCP,2,5,0); - OPMAP[MIN] = new OpCode(MIN,3,6,0); - OPMAP[MAX] = new OpCode(MAX,3,7,0); - OPMAP[FRC] = new OpCode(FRC,2,8,0); - OPMAP[SQT] = new OpCode(SQT,2,9,0); - OPMAP[RSQ] = new OpCode(RSQ,2,10,0); - OPMAP[POW] = new OpCode(POW,3,11,0); - OPMAP[LOG] = new OpCode(LOG,2,12,0); - OPMAP[EXP] = new OpCode(EXP,2,13,0); - OPMAP[NRM] = new OpCode(NRM,2,14,0); - OPMAP[SIN] = new OpCode(SIN,2,15,0); - OPMAP[COS] = new OpCode(COS,2,16,0); - OPMAP[CRS] = new OpCode(CRS,3,17,0); - OPMAP[DP3] = new OpCode(DP3,3,18,0); - OPMAP[DP4] = new OpCode(DP4,3,19,0); - OPMAP[ABS] = new OpCode(ABS,2,20,0); - OPMAP[NEG] = new OpCode(NEG,2,21,0); - OPMAP[SAT] = new OpCode(SAT,2,22,0); - OPMAP[M33] = new OpCode(M33,3,23,OP_SPECIAL_MATRIX); - OPMAP[M44] = new OpCode(M44,3,24,OP_SPECIAL_MATRIX); - OPMAP[M34] = new OpCode(M34,3,25,OP_SPECIAL_MATRIX); - OPMAP[IFZ] = new OpCode(IFZ,1,26,OP_NO_DEST | OP_INC_NEST | OP_SCALAR); - OPMAP[INZ] = new OpCode(INZ,1,27,OP_NO_DEST | OP_INC_NEST | OP_SCALAR); - OPMAP[IFE] = new OpCode(IFE,2,28,OP_NO_DEST | OP_INC_NEST | OP_SCALAR); - OPMAP[INE] = new OpCode(INE,2,29,OP_NO_DEST | OP_INC_NEST | OP_SCALAR); - OPMAP[IFG] = new OpCode(IFG,2,30,OP_NO_DEST | OP_INC_NEST | OP_SCALAR); - OPMAP[IFL] = new OpCode(IFL,2,31,OP_NO_DEST | OP_INC_NEST | OP_SCALAR); - OPMAP[IEG] = new OpCode(IEG,2,32,OP_NO_DEST | OP_INC_NEST | OP_SCALAR); - OPMAP[IEL] = new OpCode(IEL,2,33,OP_NO_DEST | OP_INC_NEST | OP_SCALAR); - OPMAP[ELS] = new OpCode(ELS,0,34,OP_NO_DEST | OP_INC_NEST | OP_DEC_NEST); - OPMAP[EIF] = new OpCode(EIF,0,35,OP_NO_DEST | OP_DEC_NEST); - OPMAP[REP] = new OpCode(REP,1,36,OP_NO_DEST | OP_INC_NEST | OP_SCALAR); - OPMAP[ERP] = new OpCode(ERP,0,37,OP_NO_DEST | OP_DEC_NEST); - OPMAP[BRK] = new OpCode(BRK,0,38,OP_NO_DEST); - OPMAP[KIL] = new OpCode(KIL,1,39,OP_NO_DEST | OP_FRAG_ONLY); - OPMAP[TEX] = new OpCode(TEX,3,40,OP_FRAG_ONLY | OP_SPECIAL_TEX); - OPMAP[SGE] = new OpCode(SGE,3,41,0); - OPMAP[SLT] = new OpCode(SLT,3,42,0); - OPMAP[SGN] = new OpCode(SGN,2,43,0); - REGMAP[VA] = new Register(VA,"vertex attribute",0,7,REG_VERT | REG_READ); - REGMAP[VC] = new Register(VC,"vertex constant",1,127,REG_VERT | REG_READ); - REGMAP[VT] = new Register(VT,"vertex temporary",2,7,REG_VERT | REG_WRITE | REG_READ); - REGMAP[OP] = new Register(OP,"vertex output",3,0,REG_VERT | REG_WRITE); - REGMAP[V] = new Register(V,"varying",4,7,REG_VERT | REG_FRAG | REG_READ | REG_WRITE); - REGMAP[FC] = new Register(FC,"fragment constant",1,27,REG_FRAG | REG_READ); - REGMAP[FT] = new Register(FT,"fragment temporary",2,7,REG_FRAG | REG_WRITE | REG_READ); - REGMAP[FS] = new Register(FS,"texture sampler",5,7,REG_FRAG | REG_READ); - REGMAP[OC] = new Register(OC,"fragment output",3,0,REG_FRAG | REG_WRITE); - SAMPLEMAP[D2] = new Sampler(D2,SAMPLER_DIM_SHIFT,0); - SAMPLEMAP[D3] = new Sampler(D3,SAMPLER_DIM_SHIFT,2); - SAMPLEMAP[CUBE] = new Sampler(CUBE,SAMPLER_DIM_SHIFT,1); - SAMPLEMAP[MIPNEAREST] = new Sampler(MIPNEAREST,SAMPLER_MIPMAP_SHIFT,1); - SAMPLEMAP[MIPLINEAR] = new Sampler(MIPLINEAR,SAMPLER_MIPMAP_SHIFT,2); - SAMPLEMAP[MIPNONE] = new Sampler(MIPNONE,SAMPLER_MIPMAP_SHIFT,0); - SAMPLEMAP[NOMIP] = new Sampler(NOMIP,SAMPLER_MIPMAP_SHIFT,0); - SAMPLEMAP[NEAREST] = new Sampler(NEAREST,SAMPLER_FILTER_SHIFT,0); - SAMPLEMAP[LINEAR] = new Sampler(LINEAR,SAMPLER_FILTER_SHIFT,1); - SAMPLEMAP[CENTROID] = new Sampler(CENTROID,SAMPLER_SPECIAL_SHIFT,1 << 0); - SAMPLEMAP[SINGLE] = new Sampler(SINGLE,SAMPLER_SPECIAL_SHIFT,1 << 1); - SAMPLEMAP[DEPTH] = new Sampler(DEPTH,SAMPLER_SPECIAL_SHIFT,1 << 2); - SAMPLEMAP[REPEAT] = new Sampler(REPEAT,SAMPLER_REPEAT_SHIFT,1); - SAMPLEMAP[WRAP] = new Sampler(WRAP,SAMPLER_REPEAT_SHIFT,1); - SAMPLEMAP[CLAMP] = new Sampler(CLAMP,SAMPLER_REPEAT_SHIFT,0); - } - - public function get error() : String - { - return this.name_iF; - } - - public function get agalcode() : ByteArray - { - return this.name_0e; - } - - public function assemble(mode:String, source:String, verbose:Boolean = false) : ByteArray - { - var i:int = 0; - var line:String = null; - var startcomment:int = 0; - var optsi:int = 0; - var opts:Array = null; - var opCode:Array = null; - var opFound:OpCode = null; - var regs:Array = null; - var badreg:Boolean = false; - var pad:uint = 0; - var regLength:uint = 0; - var j:int = 0; - var isRelative:Boolean = false; - var relreg:Array = null; - var res:Array = null; - var regFound:Register = null; - var idxmatch:Array = null; - var regidx:uint = 0; - var regmask:uint = 0; - var maskmatch:Array = null; - var isDest:Boolean = false; - var isSampler:Boolean = false; - var reltype:uint = 0; - var relsel:uint = 0; - var reloffset:int = 0; - var cv:uint = 0; - var maskLength:uint = 0; - var k:int = 0; - var relname:Array = null; - var regFoundRel:Register = null; - var selmatch:Array = null; - var relofs:Array = null; - var samplerbits:uint = 0; - var optsLength:uint = 0; - var bias:Number = NaN; - var optfound:Sampler = null; - var dbgLine:String = null; - var agalLength:uint = 0; - var index:uint = 0; - var byteStr:String = null; - var start:uint = uint(getTimer()); - this.name_0e = new ByteArray(); - this.name_iF = ""; - var isFrag:Boolean = false; - if(mode == FRAGMENT) - { - isFrag = true; - } - else if(mode != VERTEX) - { - this.name_iF = "ERROR: mode needs to be \"" + FRAGMENT + "\" or \"" + VERTEX + "\" but is \"" + mode + "\"."; - } - this.agalcode.endian = Endian.LITTLE_ENDIAN; - this.agalcode.writeByte(160); - this.agalcode.writeUnsignedInt(1); - this.agalcode.writeByte(161); - this.agalcode.writeByte(isFrag ? 1 : 0); - var lines:Array = source.replace(/[\f\n\r\v]+/g,"\n").split("\n"); - var nest:int = 0; - var nops:int = 0; - var lng:int = int(lines.length); - i = 0; - while(i < lng && this.name_iF == "") - { - line = new String(lines[i]); - startcomment = int(line.search("//")); - if(startcomment != -1) - { - line = line.slice(0,startcomment); - } - optsi = int(line.search(/<.*>/g)); - if(optsi != -1) - { - opts = line.slice(optsi).match(/([\w\.\-\+]+)/gi); - line = line.slice(0,optsi); - } - opCode = line.match(/^\w{3}/ig); - opFound = OPMAP[opCode[0]]; - if(this.name_9J) - { - trace(opFound); - } - if(opFound == null) - { - if(line.length >= 3) - { - trace("warning: bad line " + i + ": " + lines[i]); - } - } - else - { - line = line.slice(line.search(opFound.name) + opFound.name.length); - if(Boolean(opFound.flags & OP_DEC_NEST)) - { - nest--; - if(nest < 0) - { - this.name_iF = "error: conditional closes without open."; - break; - } - } - if(Boolean(opFound.flags & OP_INC_NEST)) - { - nest++; - if(nest > MAX_NESTING) - { - this.name_iF = "error: nesting to deep, maximum allowed is " + MAX_NESTING + "."; - break; - } - } - if(Boolean(opFound.flags & OP_FRAG_ONLY) && !isFrag) - { - this.name_iF = "error: opcode is only allowed in fragment programs."; - break; - } - if(verbose) - { - trace("emit opcode=" + opFound); - } - this.agalcode.writeUnsignedInt(opFound.emitCode); - nops++; - if(nops > MAX_OPCODES) - { - this.name_iF = "error: too many opcodes. maximum is " + MAX_OPCODES + "."; - break; - } - regs = line.match(/vc\[([vof][actps]?)(\d*)?(\.[xyzw](\+\d{1,3})?)?\](\.[xyzw]{1,4})?|([vof][actps]?)(\d*)?(\.[xyzw]{1,4})?/gi); - if(regs.length != opFound.numRegister) - { - this.name_iF = "error: wrong number of operands. found " + regs.length + " but expected " + opFound.numRegister + "."; - break; - } - badreg = false; - pad = uint(64 + 64 + 32); - regLength = uint(regs.length); - for(j = 0; j < regLength; j++) - { - isRelative = false; - relreg = regs[j].match(/\[.*\]/ig); - if(relreg.length > 0) - { - regs[j] = regs[j].replace(relreg[0],"0"); - if(verbose) - { - trace("IS REL"); - } - isRelative = true; - } - res = regs[j].match(/^\b[A-Za-z]{1,2}/ig); - regFound = REGMAP[res[0]]; - if(this.name_9J) - { - trace(regFound); - } - if(regFound == null) - { - this.name_iF = "error: could not parse operand " + j + " (" + regs[j] + ")."; - badreg = true; - break; - } - if(isFrag) - { - if(!(regFound.flags & REG_FRAG)) - { - this.name_iF = "error: register operand " + j + " (" + regs[j] + ") only allowed in vertex programs."; - badreg = true; - break; - } - if(isRelative) - { - this.name_iF = "error: register operand " + j + " (" + regs[j] + ") relative adressing not allowed in fragment programs."; - badreg = true; - break; - } - } - else if(!(regFound.flags & REG_VERT)) - { - this.name_iF = "error: register operand " + j + " (" + regs[j] + ") only allowed in fragment programs."; - badreg = true; - break; - } - regs[j] = regs[j].slice(regs[j].search(regFound.name) + regFound.name.length); - idxmatch = isRelative ? relreg[0].match(/\d+/) : regs[j].match(/\d+/); - regidx = 0; - if(Boolean(idxmatch)) - { - regidx = uint(uint(idxmatch[0])); - } - if(regFound.range < regidx) - { - this.name_iF = "error: register operand " + j + " (" + regs[j] + ") index exceeds limit of " + (regFound.range + 1) + "."; - badreg = true; - break; - } - regmask = 0; - maskmatch = regs[j].match(/(\.[xyzw]{1,4})/); - isDest = j == 0 && !(opFound.flags & OP_NO_DEST); - isSampler = j == 2 && Boolean(opFound.flags & OP_SPECIAL_TEX); - reltype = 0; - relsel = 0; - reloffset = 0; - if(isDest && isRelative) - { - this.name_iF = "error: relative can not be destination"; - badreg = true; - break; - } - if(Boolean(maskmatch)) - { - regmask = 0; - maskLength = uint(maskmatch[0].length); - for(k = 1; k < maskLength; k++) - { - cv = maskmatch[0].charCodeAt(k) - "x".charCodeAt(0); - if(cv > 2) - { - cv = 3; - } - if(isDest) - { - regmask |= 1 << cv; - } - else - { - regmask |= cv << (k - 1 << 1); - } - } - if(!isDest) - { - while(k <= 4) - { - regmask |= cv << (k - 1 << 1); - k++; - } - } - } - else - { - regmask = isDest ? 15 : 228; - } - if(isRelative) - { - relname = relreg[0].match(/[A-Za-z]{1,2}/ig); - regFoundRel = REGMAP[relname[0]]; - if(regFoundRel == null) - { - this.name_iF = "error: bad index register"; - badreg = true; - break; - } - reltype = regFoundRel.emitCode; - selmatch = relreg[0].match(/(\.[xyzw]{1,1})/); - if(selmatch.length == 0) - { - this.name_iF = "error: bad index register select"; - badreg = true; - break; - } - relsel = selmatch[0].charCodeAt(1) - "x".charCodeAt(0); - if(relsel > 2) - { - relsel = 3; - } - relofs = relreg[0].match(/\+\d{1,3}/ig); - if(relofs.length > 0) - { - reloffset = int(relofs[0]); - } - if(reloffset < 0 || reloffset > 255) - { - this.name_iF = "error: index offset " + reloffset + " out of bounds. [0..255]"; - badreg = true; - break; - } - if(verbose) - { - trace("RELATIVE: type=" + reltype + "==" + relname[0] + " sel=" + relsel + "==" + selmatch[0] + " idx=" + regidx + " offset=" + reloffset); - } - } - if(verbose) - { - trace(" emit argcode=" + regFound + "[" + regidx + "][" + regmask + "]"); - } - if(isDest) - { - this.agalcode.writeShort(regidx); - this.agalcode.writeByte(regmask); - this.agalcode.writeByte(regFound.emitCode); - pad -= 32; - } - else if(isSampler) - { - if(verbose) - { - trace(" emit sampler"); - } - samplerbits = 5; - optsLength = uint(opts.length); - bias = 0; - for(k = 0; k < optsLength; k++) - { - if(verbose) - { - trace(" opt: " + opts[k]); - } - optfound = SAMPLEMAP[opts[k]]; - if(optfound == null) - { - bias = Number(Number(opts[k])); - if(verbose) - { - trace(" bias: " + bias); - } - } - else - { - if(optfound.flag != SAMPLER_SPECIAL_SHIFT) - { - samplerbits &= ~(15 << optfound.flag); - } - samplerbits |= uint(optfound.mask) << uint(optfound.flag); - } - } - this.agalcode.writeShort(regidx); - this.agalcode.writeByte(int(bias * 8)); - this.agalcode.writeByte(0); - this.agalcode.writeUnsignedInt(samplerbits); - if(verbose) - { - trace(" bits: " + (samplerbits - 5)); - } - pad -= 64; - } - else - { - if(j == 0) - { - this.agalcode.writeUnsignedInt(0); - pad -= 32; - } - this.agalcode.writeShort(regidx); - this.agalcode.writeByte(reloffset); - this.agalcode.writeByte(regmask); - this.agalcode.writeByte(regFound.emitCode); - this.agalcode.writeByte(reltype); - this.agalcode.writeShort(isRelative ? relsel | 1 << 15 : 0); - pad -= 64; - } - } - for(j = 0; j < pad; ) - { - this.agalcode.writeByte(0); - j += 8; - } - if(badreg) - { - break; - } - } - i++; - } - if(this.name_iF != "") - { - this.name_iF += "\n at line " + i + " " + lines[i]; - this.agalcode.length = 0; - trace(this.name_iF); - } - if(this.name_9J) - { - dbgLine = "generated bytecode:"; - agalLength = uint(this.agalcode.length); - for(index = 0; index < agalLength; index++) - { - if(!(index % 16)) - { - dbgLine += "\n"; - } - if(!(index % 4)) - { - dbgLine += " "; - } - byteStr = this.agalcode[index].toString(16); - if(byteStr.length < 2) - { - byteStr = "0" + byteStr; - } - dbgLine += byteStr; - } - trace(dbgLine); - } - if(verbose) - { - trace("AGALMiniAssembler.assemble time: " + (getTimer() - start) / 1000 + "s"); - } - return this.agalcode; - } - } -} - -class OpCode -{ - private var _emitCode:uint; - - private var _flags:uint; - - private var _name:String; - - private var _numRegister:uint; - - public function OpCode(name:String, numRegister:uint, emitCode:uint, flags:uint) - { - super(); - this._name = name; - this._numRegister = numRegister; - this._emitCode = emitCode; - this._flags = flags; - } - - public function get emitCode() : uint - { - return this._emitCode; - } - - public function get flags() : uint - { - return this._flags; - } - - public function get name() : String - { - return this._name; - } - - public function get numRegister() : uint - { - return this._numRegister; - } - - public function toString() : String - { - return "[OpCode name=\"" + this._name + "\", numRegister=" + this._numRegister + ", emitCode=" + this._emitCode + ", flags=" + this._flags + "]"; - } -} - -class Register -{ - private var _emitCode:uint; - - private var _name:String; - - private var _longName:String; - - private var _flags:uint; - - private var _range:uint; - - public function Register(name:String, longName:String, emitCode:uint, range:uint, flags:uint) - { - super(); - this._name = name; - this._longName = longName; - this._emitCode = emitCode; - this._range = range; - this._flags = flags; - } - - public function get emitCode() : uint - { - return this._emitCode; - } - - public function get longName() : String - { - return this._longName; - } - - public function get name() : String - { - return this._name; - } - - public function get flags() : uint - { - return this._flags; - } - - public function get range() : uint - { - return this._range; - } - - public function toString() : String - { - return "[Register name=\"" + this._name + "\", longName=\"" + this._longName + "\", emitCode=" + this._emitCode + ", range=" + this._range + ", flags=" + this._flags + "]"; - } -} - -class Sampler -{ - private var _flag:uint; - - private var _mask:uint; - - private var _name:String; - - public function Sampler(name:String, flag:uint, mask:uint) - { - super(); - this._name = name; - this._flag = flag; - this._mask = mask; - } - - public function get flag() : uint - { - return this._flag; - } - - public function get mask() : uint - { - return this._mask; - } - - public function get name() : String - { - return this._name; - } - - public function toString() : String - { - return "[Sampler name=\"" + this._name + "\", flag=\"" + this._flag + "\", mask=" + this.mask + "]"; - } -} diff --git a/src/alternativa/engine3d/effects/Particle.as b/src/alternativa/engine3d/effects/Particle.as deleted file mode 100644 index 9ebc9ae..0000000 --- a/src/alternativa/engine3d/effects/Particle.as +++ /dev/null @@ -1,73 +0,0 @@ -package alternativa.engine3d.effects -{ - import flash.display3D.textures.TextureBase; - - public class Particle - { - public static var collector:Particle; - - public var diffuse:TextureBase; - - public var opacity:TextureBase; - - public var blendSource:String; - - public var blendDestination:String; - - public var x:Number; - - public var y:Number; - - public var z:Number; - - public var rotation:Number; - - public var width:Number; - - public var height:Number; - - public var originX:Number; - - public var originY:Number; - - public var name_q:Number; - - public var name_Ts:Number; - - public var name_ej:Number; - - public var name_W5:Number; - - public var red:Number; - - public var green:Number; - - public var blue:Number; - - public var alpha:Number; - - public var next:Particle; - - public function Particle() - { - super(); - } - - public static function create() : Particle - { - var res:Particle = null; - if(collector != null) - { - res = collector; - collector = collector.next; - res.next = null; - } - else - { - res = new Particle(); - } - return res; - } - } -} - diff --git a/src/alternativa/engine3d/effects/ParticleEffect.as b/src/alternativa/engine3d/effects/ParticleEffect.as deleted file mode 100644 index 61280af..0000000 --- a/src/alternativa/engine3d/effects/ParticleEffect.as +++ /dev/null @@ -1,232 +0,0 @@ -package alternativa.engine3d.effects -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.BoundBox; - import alternativa.engine3d.core.Transform3D; - import flash.geom.Vector3D; - - use namespace alternativa3d; - - public class ParticleEffect - { - private static var randomNumbers:Vector.; - - private static const randomNumbersCount:int = 1000; - - private static const vector:Vector3D = new Vector3D(); - - public var name:String; - - public var scale:Number = 1; - - public var boundBox:BoundBox; - - alternativa3d var next:ParticleEffect; - - alternativa3d var name_implements:ParticleEffect; - - alternativa3d var system:ParticleSystem; - - alternativa3d var startTime:Number; - - alternativa3d var lifeTime:Number = 1.7976931348623157e+308; - - alternativa3d var particleList:Particle; - - alternativa3d var aabb:BoundBox; - - alternativa3d var name_M7:Vector3D; - - protected var name_cF:Vector3D; - - protected var name_gV:Vector.; - - protected var name_lB:Vector.; - - protected var name_ib:Vector.; - - protected var name_Nz:Vector.; - - protected var name_kf:int = 0; - - private var name_TK:int; - - private var name_hs:int; - - private var name_G1:Vector3D; - - private var name_Q2:Vector3D; - - public function ParticleEffect() - { - var i:int = 0; - this.alternativa3d::aabb = new BoundBox(); - this.name_gV = new Vector.(); - this.name_lB = new Vector.(); - this.name_ib = new Vector.(); - this.name_Nz = new Vector.(); - this.name_G1 = new Vector3D(0,0,0); - this.name_Q2 = new Vector3D(0,0,1); - super(); - if(randomNumbers == null) - { - randomNumbers = new Vector.(); - for(i = 0; i < randomNumbersCount; randomNumbers[i] = Math.random(),i++) - { - } - } - this.name_TK = Math.random() * randomNumbersCount; - } - - public function get position() : Vector3D - { - return this.name_G1.clone(); - } - - public function set position(value:Vector3D) : void - { - this.name_G1.x = value.x; - this.name_G1.y = value.y; - this.name_G1.z = value.z; - this.name_G1.w = value.w; - if(this.alternativa3d::system != null) - { - this.alternativa3d::setPositionKeys(this.alternativa3d::system.alternativa3d::getTime() - this.alternativa3d::startTime); - } - } - - public function get direction() : Vector3D - { - return this.name_Q2.clone(); - } - - public function set direction(value:Vector3D) : void - { - this.name_Q2.x = value.x; - this.name_Q2.y = value.y; - this.name_Q2.z = value.z; - this.name_Q2.w = value.w; - if(this.alternativa3d::system != null) - { - this.alternativa3d::setDirectionKeys(this.alternativa3d::system.alternativa3d::getTime() - this.alternativa3d::startTime); - } - } - - public function stop() : void - { - var time:Number = this.alternativa3d::system.alternativa3d::getTime() - this.alternativa3d::startTime; - for(var i:int = 0; i < this.name_kf; ) - { - if(time < this.name_gV[i]) - { - break; - } - i++; - } - this.name_kf = i; - } - - protected function get particleSystem() : ParticleSystem - { - return this.alternativa3d::system; - } - - protected function get cameraTransform() : Transform3D - { - return this.alternativa3d::system.alternativa3d::cameraToLocalTransform; - } - - protected function random() : Number - { - var res:Number = randomNumbers[this.name_hs]; - ++this.name_hs; - if(this.name_hs == randomNumbersCount) - { - this.name_hs = 0; - } - return res; - } - - protected function addKey(time:Number, script:Function) : void - { - this.name_gV[this.name_kf] = time; - this.name_lB[this.name_kf] = new Vector3D(); - this.name_ib[this.name_kf] = new Vector3D(); - this.name_Nz[this.name_kf] = script; - ++this.name_kf; - } - - protected function setLife(time:Number) : void - { - this.alternativa3d::lifeTime = time; - } - - alternativa3d function calculateAABB() : void - { - this.alternativa3d::aabb.minX = this.boundBox.minX * this.scale + this.name_G1.x; - this.alternativa3d::aabb.minY = this.boundBox.minY * this.scale + this.name_G1.y; - this.alternativa3d::aabb.minZ = this.boundBox.minZ * this.scale + this.name_G1.z; - this.alternativa3d::aabb.maxX = this.boundBox.maxX * this.scale + this.name_G1.x; - this.alternativa3d::aabb.maxY = this.boundBox.maxY * this.scale + this.name_G1.y; - this.alternativa3d::aabb.maxZ = this.boundBox.maxZ * this.scale + this.name_G1.z; - } - - alternativa3d function setPositionKeys(time:Number) : void - { - var pos:Vector3D = null; - for(var i:int = 0; i < this.name_kf; ) - { - if(time <= this.name_gV[i]) - { - pos = this.name_lB[i]; - pos.x = this.name_G1.x; - pos.y = this.name_G1.y; - pos.z = this.name_G1.z; - } - i++; - } - } - - alternativa3d function setDirectionKeys(time:Number) : void - { - var dir:Vector3D = null; - vector.x = this.name_Q2.x; - vector.y = this.name_Q2.y; - vector.z = this.name_Q2.z; - vector.normalize(); - for(var i:int = 0; i < this.name_kf; ) - { - if(time <= this.name_gV[i]) - { - dir = this.name_ib[i]; - dir.x = vector.x; - dir.y = vector.y; - dir.z = vector.z; - } - i++; - } - } - - alternativa3d function calculate(time:Number) : Boolean - { - var keyTime:Number = NaN; - var script:Function = null; - this.name_hs = this.name_TK; - for(var i:int = 0; i < this.name_kf; ) - { - keyTime = this.name_gV[i]; - if(time < keyTime) - { - break; - } - this.name_M7 = this.name_lB[i]; - this.name_cF = this.name_ib[i]; - script = this.name_Nz[i]; - script.call(this,keyTime,time - keyTime); - i++; - } - return i < this.name_kf || this.alternativa3d::particleList != null; - } - } -} - diff --git a/src/alternativa/engine3d/effects/ParticlePrototype.as b/src/alternativa/engine3d/effects/ParticlePrototype.as deleted file mode 100644 index be59bc3..0000000 --- a/src/alternativa/engine3d/effects/ParticlePrototype.as +++ /dev/null @@ -1,166 +0,0 @@ -package alternativa.engine3d.effects -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Transform3D; - import flash.display3D.textures.TextureBase; - import flash.geom.Vector3D; - - use namespace alternativa3d; - - public class ParticlePrototype - { - public var atlas:TextureAtlas; - - private var blendSource:String; - - private var blendDestination:String; - - private var animated:Boolean; - - private var width:Number; - - private var height:Number; - - private var name_gV:Vector. = new Vector.(); - - private var name_0r:Vector. = new Vector.(); - - private var name_4e:Vector. = new Vector.(); - - private var name_Oj:Vector. = new Vector.(); - - private var name_07:Vector. = new Vector.(); - - private var name_3l:Vector. = new Vector.(); - - private var name_7S:Vector. = new Vector.(); - - private var name_Ch:Vector. = new Vector.(); - - private var name_kf:int = 0; - - public function ParticlePrototype(width:Number, height:Number, atlas:TextureAtlas, animated:Boolean = false, blendSource:String = "sourceAlpha", blendDestination:String = "oneMinusSourceAlpha") - { - super(); - this.width = width; - this.height = height; - this.atlas = atlas; - this.animated = animated; - this.blendSource = blendSource; - this.blendDestination = blendDestination; - } - - public function addKey(time:Number, rotation:Number = 0, scaleX:Number = 1, scaleY:Number = 1, red:Number = 1, green:Number = 1, blue:Number = 1, alpha:Number = 1) : void - { - var lastIndex:int = this.name_kf - 1; - if(this.name_kf > 0 && time <= this.name_gV[lastIndex]) - { - throw new Error("Keys must be successively."); - } - this.name_gV[this.name_kf] = time; - this.name_0r[this.name_kf] = rotation; - this.name_4e[this.name_kf] = scaleX; - this.name_Oj[this.name_kf] = scaleY; - this.name_07[this.name_kf] = red; - this.name_3l[this.name_kf] = green; - this.name_7S[this.name_kf] = blue; - this.name_Ch[this.name_kf] = alpha; - ++this.name_kf; - } - - public function createParticle(effect:ParticleEffect, time:Number, position:Vector3D, rotation:Number = 0, scaleX:Number = 1, scaleY:Number = 1, alpha:Number = 1, firstFrame:int = 0) : void - { - var systemScale:Number = NaN; - var effectScale:Number = NaN; - var transform:Transform3D = null; - var wind:Vector3D = null; - var gravity:Vector3D = null; - var a:int = 0; - var t:Number = NaN; - var pos:int = 0; - var col:int = 0; - var row:int = 0; - var particle:Particle = null; - var cx:Number = NaN; - var cy:Number = NaN; - var cz:Number = NaN; - var rot:Number = NaN; - var b:int = this.name_kf - 1; - if(this.atlas.diffuse.alternativa3d::_texture != null && this.name_kf > 1 && time >= this.name_gV[0] && time < this.name_gV[b]) - { - for(b = 1; b < this.name_kf; ) - { - if(time < this.name_gV[b]) - { - systemScale = Number(effect.alternativa3d::system.alternativa3d::scale); - effectScale = effect.scale; - transform = effect.alternativa3d::system.alternativa3d::localToCameraTransform; - wind = effect.alternativa3d::system.wind; - gravity = effect.alternativa3d::system.gravity; - a = b - 1; - t = (time - this.name_gV[a]) / (this.name_gV[b] - this.name_gV[a]); - pos = firstFrame + (this.animated ? time * this.atlas.fps : 0); - if(this.atlas.loop) - { - pos %= this.atlas.rangeLength; - if(pos < 0) - { - pos += this.atlas.rangeLength; - } - } - else - { - if(pos < 0) - { - pos = 0; - } - if(pos >= this.atlas.rangeLength) - { - pos = this.atlas.rangeLength - 1; - } - } - pos += this.atlas.rangeBegin; - col = pos % this.atlas.columnsCount; - row = pos / this.atlas.columnsCount; - particle = Particle.create(); - particle.diffuse = this.atlas.diffuse.alternativa3d::_texture; - particle.opacity = this.atlas.opacity != null ? this.atlas.opacity.alternativa3d::_texture : null; - particle.blendSource = this.blendSource; - particle.blendDestination = this.blendDestination; - cx = effect.name_M7.x + position.x * effectScale; - cy = effect.name_M7.y + position.y * effectScale; - cz = effect.name_M7.z + position.z * effectScale; - particle.x = cx * transform.a + cy * transform.b + cz * transform.c + transform.d; - particle.y = cx * transform.e + cy * transform.f + cz * transform.g + transform.h; - particle.z = cx * transform.i + cy * transform.j + cz * transform.k + transform.l; - rot = this.name_0r[a] + (this.name_0r[b] - this.name_0r[a]) * t; - particle.rotation = scaleX * scaleY > 0 ? rotation + rot : rotation - rot; - particle.width = systemScale * effectScale * scaleX * this.width * (this.name_4e[a] + (this.name_4e[b] - this.name_4e[a]) * t); - particle.height = systemScale * effectScale * scaleY * this.height * (this.name_Oj[a] + (this.name_Oj[b] - this.name_Oj[a]) * t); - particle.originX = this.atlas.originX; - particle.originY = this.atlas.originY; - particle.name_q = 1 / this.atlas.columnsCount; - particle.name_Ts = 1 / this.atlas.rowsCount; - particle.name_ej = col / this.atlas.columnsCount; - particle.name_W5 = row / this.atlas.rowsCount; - particle.red = this.name_07[a] + (this.name_07[b] - this.name_07[a]) * t; - particle.green = this.name_3l[a] + (this.name_3l[b] - this.name_3l[a]) * t; - particle.blue = this.name_7S[a] + (this.name_7S[b] - this.name_7S[a]) * t; - particle.alpha = alpha * (this.name_Ch[a] + (this.name_Ch[b] - this.name_Ch[a]) * t); - particle.next = effect.alternativa3d::particleList; - effect.alternativa3d::particleList = particle; - break; - } - b++; - } - } - } - - public function get lifeTime() : Number - { - var lastIndex:int = this.name_kf - 1; - return this.name_gV[lastIndex]; - } - } -} - diff --git a/src/alternativa/engine3d/effects/ParticleSystem.as b/src/alternativa/engine3d/effects/ParticleSystem.as deleted file mode 100644 index ce1cde8..0000000 --- a/src/alternativa/engine3d/effects/ParticleSystem.as +++ /dev/null @@ -1,464 +0,0 @@ -package alternativa.engine3d.effects -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.Debug; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.RenderPriority; - import flash.display3D.Context3D; - import flash.display3D.Context3DBlendFactor; - import flash.display3D.Context3DProgramType; - import flash.display3D.Context3DTriangleFace; - import flash.display3D.Context3DVertexBufferFormat; - import flash.display3D.IndexBuffer3D; - import flash.display3D.Program3D; - import flash.display3D.VertexBuffer3D; - import flash.display3D.textures.TextureBase; - import flash.geom.Vector3D; - import flash.utils.ByteArray; - import flash.utils.getTimer; - - use namespace alternativa3d; - - public class ParticleSystem extends Object3D - { - private static var vertexBuffer:VertexBuffer3D; - - private static var indexBuffer:IndexBuffer3D; - - private static var diffuseProgram:Program3D; - - private static var opacityProgram:Program3D; - - private static var diffuseBlendProgram:Program3D; - - private static var opacityBlendProgram:Program3D; - - private static const limit:int = 31; - - public var name_jW:Boolean = true; - - public var gravity:Vector3D = new Vector3D(0,0,-1); - - public var wind:Vector3D = new Vector3D(); - - public var name_IN:int = 0; - - public var fogMaxDensity:Number = 0; - - public var fogNear:Number = 0; - - public var fogFar:Number = 0; - - alternativa3d var scale:Number = 1; - - alternativa3d var effectList:ParticleEffect; - - private var drawUnit:DrawUnit = null; - - private var diffuse:TextureBase = null; - - private var opacity:TextureBase = null; - - private var blendSource:String = null; - - private var blendDestination:String = null; - - private var counter:int; - - private var name_La:Number; - - private var name_p3:Number; - - private var name_ZN:Vector. = new Vector.(); - - private var name_hr:int = 0; - - private var pause:Boolean = false; - - private var name_pK:Number; - - private var name_L5:Number = 0; - - public function ParticleSystem() - { - super(); - } - - public function stop() : void - { - if(!this.pause) - { - this.name_pK = getTimer() * 0.001; - this.pause = true; - } - } - - public function play() : void - { - if(this.pause) - { - this.name_L5 += getTimer() * 0.001 - this.name_pK; - this.pause = false; - } - } - - public function prevFrame() : void - { - this.name_pK -= 0.001; - } - - public function nextFrame() : void - { - this.name_pK += 0.001; - } - - public function each(effect:ParticleEffect) : ParticleEffect - { - if(effect.alternativa3d::system != null) - { - throw new Error("Cannot add the same effect twice."); - } - effect.alternativa3d::startTime = this.alternativa3d::getTime(); - effect.alternativa3d::system = this; - effect.alternativa3d::setPositionKeys(0); - effect.alternativa3d::setDirectionKeys(0); - effect.name_implements = this.alternativa3d::effectList; - this.alternativa3d::effectList = effect; - return effect; - } - - public function getEffectByName(name:String) : ParticleEffect - { - for(var effect:ParticleEffect = this.alternativa3d::effectList; effect != null; ) - { - if(effect.name == name) - { - return effect; - } - effect = effect.name_implements; - } - return null; - } - - alternativa3d function getTime() : Number - { - return this.pause ? this.name_pK - this.name_L5 : getTimer() * 0.001 - this.name_L5; - } - - override alternativa3d function collectDraws(camera:Camera3D, lights:Vector., lightsLength:int) : void - { - var visibleEffectList:ParticleEffect = null; - var effectTime:Number = NaN; - var culling:int = 0; - var debug:int = 0; - if(vertexBuffer == null) - { - this.createAndUpload(camera.alternativa3d::context3D); - } - this.alternativa3d::scale = Math.sqrt(alternativa3d::localToCameraTransform.a * alternativa3d::localToCameraTransform.a + alternativa3d::localToCameraTransform.e * alternativa3d::localToCameraTransform.e + alternativa3d::localToCameraTransform.i * alternativa3d::localToCameraTransform.i); - this.alternativa3d::scale += Math.sqrt(alternativa3d::localToCameraTransform.b * alternativa3d::localToCameraTransform.b + alternativa3d::localToCameraTransform.f * alternativa3d::localToCameraTransform.f + alternativa3d::localToCameraTransform.j * alternativa3d::localToCameraTransform.j); - this.alternativa3d::scale += Math.sqrt(alternativa3d::localToCameraTransform.c * alternativa3d::localToCameraTransform.c + alternativa3d::localToCameraTransform.g * alternativa3d::localToCameraTransform.g + alternativa3d::localToCameraTransform.k * alternativa3d::localToCameraTransform.k); - this.alternativa3d::scale /= 3; - camera.alternativa3d::calculateFrustum(alternativa3d::cameraToLocalTransform); - var conflictAnyway:Boolean = false; - var time:Number = this.alternativa3d::getTime(); - for(var effect:ParticleEffect = this.alternativa3d::effectList, prev:ParticleEffect = null; effect != null; ) - { - effectTime = time - effect.alternativa3d::startTime; - if(effectTime <= effect.alternativa3d::lifeTime) - { - culling = 63; - if(effect.boundBox != null) - { - effect.alternativa3d::calculateAABB(); - culling = int(effect.alternativa3d::aabb.alternativa3d::checkFrustumCulling(camera.alternativa3d::frustum,63)); - } - if(culling >= 0) - { - if(effect.alternativa3d::calculate(effectTime)) - { - if(effect.alternativa3d::particleList != null) - { - effect.alternativa3d::next = visibleEffectList; - visibleEffectList = effect; - conflictAnyway ||= effect.boundBox == null; - } - prev = effect; - effect = effect.name_implements; - } - else if(prev != null) - { - prev.name_implements = effect.name_implements; - effect = prev.name_implements; - } - else - { - this.alternativa3d::effectList = effect.name_implements; - effect = this.alternativa3d::effectList; - } - } - else - { - prev = effect; - effect = effect.name_implements; - } - } - else if(prev != null) - { - prev.name_implements = effect.name_implements; - effect = prev.name_implements; - } - else - { - this.alternativa3d::effectList = effect.name_implements; - effect = this.alternativa3d::effectList; - } - } - if(visibleEffectList != null) - { - if(visibleEffectList.alternativa3d::next != null) - { - this.drawConflictEffects(camera,visibleEffectList); - } - else - { - this.drawParticleList(camera,visibleEffectList.alternativa3d::particleList); - visibleEffectList.alternativa3d::particleList = null; - if(camera.debug && visibleEffectList.boundBox != null && Boolean(camera.alternativa3d::checkInDebug(this) & Debug.BOUNDS)) - { - Debug.alternativa3d::drawBoundBox(camera,visibleEffectList.alternativa3d::aabb,alternativa3d::localToCameraTransform); - } - } - this.flush(camera); - this.drawUnit = null; - this.diffuse = null; - this.opacity = null; - this.blendSource = null; - this.blendDestination = null; - this.name_hr = 0; - } - if(camera.debug) - { - debug = camera.alternativa3d::checkInDebug(this); - if(Boolean(debug & Debug.BOUNDS) && boundBox != null) - { - Debug.alternativa3d::drawBoundBox(camera,boundBox,alternativa3d::localToCameraTransform); - } - } - } - - private function createAndUpload(context:Context3D) : void - { - var vertices:Vector. = new Vector.(); - var indices:Vector. = new Vector.(); - for(var i:int = 0; i < limit; i++) - { - vertices.push(0,0,0,0,0,i * 4,0,1,0,0,1,i * 4,1,1,0,1,1,i * 4,1,0,0,1,0,i * 4); - indices.push(i * 4,i * 4 + 1,i * 4 + 3,i * 4 + 2,i * 4 + 3,i * 4 + 1); - } - vertexBuffer = context.createVertexBuffer(limit * 4,6); - vertexBuffer.uploadFromVector(vertices,0,limit * 4); - indexBuffer = context.createIndexBuffer(limit * 6); - indexBuffer.uploadFromVector(indices,0,limit * 6); - var vertexProgram:Array = ["mov vt2, vc[va1.z]","sub vt0.z, va0.x, vt2.x","sub vt0.w, va0.y, vt2.y","mul vt0.z, vt0.z, vt2.z","mul vt0.w, vt0.w, vt2.w","mov vt2, vc[va1.z+1]","mov vt1.z, vt2.w","sin vt1.x, vt1.z","cos vt1.y, vt1.z","mul vt1.z, vt0.z, vt1.y","mul vt1.w, vt0.w, vt1.x","sub vt0.x, vt1.z, vt1.w","mul vt1.z, vt0.z, vt1.x","mul vt1.w, vt0.w, vt1.y","add vt0.y, vt1.z, vt1.w","add vt0.x, vt0.x, vt2.x","add vt0.y, vt0.y, vt2.y","add vt0.z, va0.z, vt2.z","mov vt0.w, va0.w","dp4 op.x, vt0, vc124","dp4 op.y, vt0, vc125","dp4 op.z, vt0, vc126","dp4 op.w, vt0, vc127","mov vt2, vc[va1.z+2]","mul vt1.x, va1.x, vt2.x","mul vt1.y, va1.y, vt2.y","add vt1.x, vt1.x, vt2.z","add vt1.y, vt1.y, vt2.w","mov v0, vt1","mov v1, vc[va1.z+3]","mov v2, vt0"]; - var fragmentDiffuseProgram:Array = ["tex ft0, v0, fs0 <2d,clamp,linear,miplinear>","mul ft0, ft0, v1","sub ft1.w, v2.z, fc1.x","div ft1.w, ft1.w, fc1.y","max ft1.w, ft1.w, fc1.z","min ft1.w, ft1.w, fc0.w","sub ft1.xyz, fc0.xyz, ft0.xyz","mul ft1.xyz, ft1.xyz, ft1.w","add ft0.xyz, ft0.xyz, ft1.xyz","mov oc, ft0"]; - var fragmentOpacityProgram:Array = ["tex ft0, v0, fs0 <2d,clamp,linear,miplinear>","tex ft1, v0, fs1 <2d,clamp,linear,miplinear>","mov ft0.w, ft1.x","mul ft0, ft0, v1","sub ft1.w, v2.z, fc1.x","div ft1.w, ft1.w, fc1.y","max ft1.w, ft1.w, fc1.z","min ft1.w, ft1.w, fc0.w","sub ft1.xyz, fc0.xyz, ft0.xyz","mul ft1.xyz, ft1.xyz, ft1.w","add ft0.xyz, ft0.xyz, ft1.xyz","mov oc, ft0"]; - var fragmentDiffuseBlendProgram:Array = ["tex ft0, v0, fs0 <2d,clamp,linear,miplinear>","mul ft0, ft0, v1","sub ft1.w, v2.z, fc1.x","div ft1.w, ft1.w, fc1.y","max ft1.w, ft1.w, fc1.z","min ft1.w, ft1.w, fc0.w","sub ft1.w, fc1.w, ft1.w","mul ft0.w, ft0.w, ft1.w","mov oc, ft0"]; - var fragmentOpacityBlendProgram:Array = ["tex ft0, v0, fs0 <2d,clamp,linear,miplinear>","tex ft1, v0, fs1 <2d,clamp,linear,miplinear>","mov ft0.w, ft1.x","mul ft0, ft0, v1","sub ft1.w, v2.z, fc1.x","div ft1.w, ft1.w, fc1.y","max ft1.w, ft1.w, fc1.z","min ft1.w, ft1.w, fc0.w","sub ft1.w, fc1.w, ft1.w","mul ft0.w, ft0.w, ft1.w","mov oc, ft0"]; - diffuseProgram = context.createProgram(); - opacityProgram = context.createProgram(); - diffuseBlendProgram = context.createProgram(); - opacityBlendProgram = context.createProgram(); - var compiledVertexProgram:ByteArray = this.compileProgram(Context3DProgramType.VERTEX,vertexProgram); - diffuseProgram.upload(compiledVertexProgram,this.compileProgram(Context3DProgramType.FRAGMENT,fragmentDiffuseProgram)); - opacityProgram.upload(compiledVertexProgram,this.compileProgram(Context3DProgramType.FRAGMENT,fragmentOpacityProgram)); - diffuseBlendProgram.upload(compiledVertexProgram,this.compileProgram(Context3DProgramType.FRAGMENT,fragmentDiffuseBlendProgram)); - opacityBlendProgram.upload(compiledVertexProgram,this.compileProgram(Context3DProgramType.FRAGMENT,fragmentOpacityBlendProgram)); - } - - private function compileProgram(mode:String, program:Array) : ByteArray - { - var line:String = null; - var string:String = ""; - var length:int = int(program.length); - for(var i:int = 0; i < length; i++) - { - line = program[i]; - string += line + (i < length - 1 ? " \n" : ""); - } - return new AGALMiniAssembler().assemble(mode,string,false); - } - - private function flush(camera:Camera3D) : void - { - if(this.name_hr == this.name_ZN.length) - { - this.name_ZN[this.name_hr] = new Object3D(); - } - var object:Object3D = this.name_ZN[this.name_hr]; - ++this.name_hr; - object.alternativa3d::localToCameraTransform.l = (this.name_La + this.name_p3) / 2; - this.drawUnit.alternativa3d::object = object; - this.drawUnit.alternativa3d::numTriangles = this.counter << 1; - if(this.blendDestination == Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA) - { - this.drawUnit.alternativa3d::program = this.opacity != null ? opacityProgram : diffuseProgram; - } - else - { - this.drawUnit.alternativa3d::program = this.opacity != null ? opacityBlendProgram : diffuseBlendProgram; - } - this.drawUnit.alternativa3d::setVertexBufferAt(0,vertexBuffer,0,Context3DVertexBufferFormat.FLOAT_3); - this.drawUnit.alternativa3d::setVertexBufferAt(1,vertexBuffer,3,Context3DVertexBufferFormat.FLOAT_3); - this.drawUnit.alternativa3d::setProjectionConstants(camera,124); - this.drawUnit.alternativa3d::setFragmentConstantsFromNumbers(0,(this.name_IN >> 16 & 0xFF) / 255,(this.name_IN >> 8 & 0xFF) / 255,(this.name_IN & 0xFF) / 255,this.fogMaxDensity); - this.drawUnit.alternativa3d::setFragmentConstantsFromNumbers(1,this.fogNear,this.fogFar - this.fogNear,0,1); - this.drawUnit.alternativa3d::setTextureAt(0,this.diffuse); - if(this.opacity != null) - { - this.drawUnit.alternativa3d::setTextureAt(1,this.opacity); - } - this.drawUnit.alternativa3d::blendSource = this.blendSource; - this.drawUnit.alternativa3d::blendDestination = this.blendDestination; - this.drawUnit.alternativa3d::culling = Context3DTriangleFace.NONE; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(this.drawUnit,RenderPriority.TRANSPARENT_SORT); - } - - private function drawParticleList(camera:Camera3D, list:Particle) : void - { - var last:Particle = null; - var offset:int = 0; - if(list.next != null) - { - list = this.sortParticleList(list); - } - for(var particle:Particle = list; particle != null; ) - { - if(this.counter >= limit || particle.diffuse != this.diffuse || particle.opacity != this.opacity || particle.blendSource != this.blendSource || particle.blendDestination != this.blendDestination) - { - if(this.drawUnit != null) - { - this.flush(camera); - } - this.drawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(null,null,indexBuffer,0,0); - this.diffuse = particle.diffuse; - this.opacity = particle.opacity; - this.blendSource = particle.blendSource; - this.blendDestination = particle.blendDestination; - this.counter = 0; - this.name_La = particle.z; - } - offset = this.counter << 2; - this.drawUnit.alternativa3d::setVertexConstantsFromNumbers(offset++,particle.originX,particle.originY,particle.width,particle.height); - this.drawUnit.alternativa3d::setVertexConstantsFromNumbers(offset++,particle.x,particle.y,particle.z,particle.rotation); - this.drawUnit.alternativa3d::setVertexConstantsFromNumbers(offset++,particle.name_q,particle.name_Ts,particle.name_ej,particle.name_W5); - this.drawUnit.alternativa3d::setVertexConstantsFromNumbers(offset++,particle.red,particle.green,particle.blue,particle.alpha); - ++this.counter; - this.name_p3 = particle.z; - last = particle; - particle = particle.next; - } - last.next = Particle.collector; - Particle.collector = list; - } - - private function sortParticleList(list:Particle) : Particle - { - var left:Particle = list; - var right:Particle = list.next; - while(right != null && right.next != null) - { - list = list.next; - right = right.next.next; - } - right = list.next; - list.next = null; - if(left.next != null) - { - left = this.sortParticleList(left); - } - if(right.next != null) - { - right = this.sortParticleList(right); - } - var flag:Boolean = left.z > right.z; - if(flag) - { - list = left; - left = left.next; - } - else - { - list = right; - right = right.next; - } - var last:Particle = list; - while(left != null) - { - if(right == null) - { - last.next = left; - return list; - } - if(flag) - { - if(left.z > right.z) - { - last = left; - left = left.next; - } - else - { - last.next = right; - last = right; - right = right.next; - flag = false; - } - } - else if(right.z > left.z) - { - last = right; - right = right.next; - } - else - { - last.next = left; - last = left; - left = left.next; - flag = true; - } - } - last.next = right; - return list; - } - - private function drawConflictEffects(camera:Camera3D, effectList:ParticleEffect) : void - { - var particleList:Particle = null; - var next:ParticleEffect = null; - var last:Particle = null; - for(var effect:ParticleEffect = effectList; effect != null; ) - { - next = effect.alternativa3d::next; - effect.alternativa3d::next = null; - for(last = effect.alternativa3d::particleList; last.next != null; ) - { - last = last.next; - } - last.next = particleList; - particleList = effect.alternativa3d::particleList; - effect.alternativa3d::particleList = null; - if(camera.debug && effect.boundBox != null && Boolean(camera.alternativa3d::checkInDebug(this) & Debug.BOUNDS)) - { - Debug.alternativa3d::drawBoundBox(camera,effect.alternativa3d::aabb,alternativa3d::localToCameraTransform,16711680); - } - effect = next; - } - this.drawParticleList(camera,particleList); - } - } -} - diff --git a/src/alternativa/engine3d/effects/TextureAtlas.as b/src/alternativa/engine3d/effects/TextureAtlas.as deleted file mode 100644 index 03a6019..0000000 --- a/src/alternativa/engine3d/effects/TextureAtlas.as +++ /dev/null @@ -1,43 +0,0 @@ -package alternativa.engine3d.effects -{ - import alternativa.engine3d.resources.TextureResource; - - public class TextureAtlas - { - public var diffuse:TextureResource; - - public var opacity:TextureResource; - - public var columnsCount:int; - - public var rowsCount:int; - - public var rangeBegin:int; - - public var rangeLength:int; - - public var fps:int; - - public var loop:Boolean; - - public var originX:Number; - - public var originY:Number; - - public function TextureAtlas(diffuse:TextureResource, opacity:TextureResource = null, columnsCount:int = 1, rowsCount:int = 1, rangeBegin:int = 0, rangeLength:int = 1, fps:int = 30, loop:Boolean = false, originX:Number = 0.5, originY:Number = 0.5) - { - super(); - this.diffuse = diffuse; - this.opacity = opacity; - this.columnsCount = columnsCount; - this.rowsCount = rowsCount; - this.rangeBegin = rangeBegin; - this.rangeLength = rangeLength; - this.fps = fps; - this.loop = loop; - this.originX = originX; - this.originY = originY; - } - } -} - diff --git a/src/alternativa/engine3d/lights/AmbientLight.as b/src/alternativa/engine3d/lights/AmbientLight.as deleted file mode 100644 index 20a1603..0000000 --- a/src/alternativa/engine3d/lights/AmbientLight.as +++ /dev/null @@ -1,47 +0,0 @@ -package alternativa.engine3d.lights -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.Debug; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - - use namespace alternativa3d; - - public class AmbientLight extends Light3D - { - public function AmbientLight(color:uint) - { - super(); - this.color = color; - } - - override alternativa3d function calculateVisibility(camera:Camera3D) : void - { - camera.alternativa3d::ambient[0] += (color >> 16 & 0xFF) * intensity / 255; - camera.alternativa3d::ambient[1] += (color >> 8 & 0xFF) * intensity / 255; - camera.alternativa3d::ambient[2] += (color & 0xFF) * intensity / 255; - } - - override alternativa3d function collectDraws(camera:Camera3D, lights:Vector., lightsLength:int) : void - { - var debug:int = 0; - if(camera.debug) - { - debug = camera.alternativa3d::checkInDebug(this); - if(Boolean(debug & Debug.BOUNDS) && boundBox != null) - { - Debug.alternativa3d::drawBoundBox(camera,boundBox,alternativa3d::localToCameraTransform); - } - } - } - - override public function clone() : Object3D - { - var res:AmbientLight = new AmbientLight(color); - res.clonePropertiesFrom(this); - return res; - } - } -} - diff --git a/src/alternativa/engine3d/lights/DirectionalLight.as b/src/alternativa/engine3d/lights/DirectionalLight.as deleted file mode 100644 index 32a44cf..0000000 --- a/src/alternativa/engine3d/lights/DirectionalLight.as +++ /dev/null @@ -1,53 +0,0 @@ -package alternativa.engine3d.lights -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.Debug; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.shadows.ShadowRenderer; - - use namespace alternativa3d; - - public class DirectionalLight extends Light3D - { - public var shadow:ShadowRenderer; - - public function DirectionalLight(color:uint) - { - super(); - this.color = color; - } - - public function lookAt(x:Number, y:Number, z:Number) : void - { - var dx:Number = x - this.x; - var dy:Number = y - this.y; - var dz:Number = z - this.z; - rotationX = Math.atan2(dz,Math.sqrt(dx * dx + dy * dy)) - Math.PI / 2; - rotationY = 0; - rotationZ = -Math.atan2(dx,dy); - } - - override alternativa3d function collectDraws(camera:Camera3D, lights:Vector., lightsLength:int) : void - { - var debug:int = 0; - if(camera.debug) - { - debug = camera.alternativa3d::checkInDebug(this); - if(Boolean(debug & Debug.BOUNDS) && boundBox != null) - { - Debug.alternativa3d::drawBoundBox(camera,boundBox,alternativa3d::localToCameraTransform); - } - } - } - - override public function clone() : Object3D - { - var res:DirectionalLight = new DirectionalLight(color); - res.clonePropertiesFrom(this); - return res; - } - } -} - diff --git a/src/alternativa/engine3d/lights/OmniLight.as b/src/alternativa/engine3d/lights/OmniLight.as deleted file mode 100644 index c0607c6..0000000 --- a/src/alternativa/engine3d/lights/OmniLight.as +++ /dev/null @@ -1,273 +0,0 @@ -package alternativa.engine3d.lights -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.BoundBox; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.Debug; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.Transform3D; - - use namespace alternativa3d; - - public class OmniLight extends Light3D - { - public var attenuationBegin:Number; - - public var attenuationEnd:Number; - - public function OmniLight(color:uint, attenuationBegin:Number, attenuationEnd:Number) - { - super(); - this.color = color; - this.attenuationBegin = attenuationBegin; - this.attenuationEnd = attenuationEnd; - calculateBoundBox(); - } - - override alternativa3d function updateBoundBox(boundBox:BoundBox, hierarchy:Boolean, transform:Transform3D = null) : void - { - super.alternativa3d::updateBoundBox(boundBox,hierarchy,transform); - if(transform == null) - { - if(-this.attenuationEnd < boundBox.minX) - { - boundBox.minX = -this.attenuationEnd; - } - if(this.attenuationEnd > boundBox.maxX) - { - boundBox.maxX = this.attenuationEnd; - } - if(-this.attenuationEnd < boundBox.minY) - { - boundBox.minY = -this.attenuationEnd; - } - if(this.attenuationEnd > boundBox.maxY) - { - boundBox.maxY = this.attenuationEnd; - } - if(-this.attenuationEnd < boundBox.minZ) - { - boundBox.minZ = -this.attenuationEnd; - } - if(this.attenuationEnd > boundBox.maxZ) - { - boundBox.maxZ = this.attenuationEnd; - } - } - } - - override alternativa3d function collectDraws(camera:Camera3D, lights:Vector., lightsLength:int) : void - { - var debug:int = 0; - if(camera.debug) - { - debug = camera.alternativa3d::checkInDebug(this); - if(Boolean(debug & Debug.BOUNDS) && boundBox != null) - { - Debug.alternativa3d::drawBoundBox(camera,boundBox,alternativa3d::localToCameraTransform); - } - } - } - - override alternativa3d function checkBound(targetObject:Object3D) : Boolean - { - var rScale:Number = Number(Math.sqrt(name_cl.a * name_cl.a + name_cl.e * name_cl.e + name_cl.i * name_cl.i)); - rScale += Math.sqrt(name_cl.b * name_cl.b + name_cl.f * name_cl.f + name_cl.j * name_cl.j); - rScale += Math.sqrt(name_cl.c * name_cl.c + name_cl.g * name_cl.g + name_cl.k * name_cl.k); - rScale /= 3; - rScale *= this.attenuationEnd; - rScale *= rScale; - var len:Number = 0; - var bb:BoundBox = targetObject.boundBox; - var minX:Number = bb.minX; - var minY:Number = bb.minY; - var minZ:Number = bb.minZ; - var maxX:Number = bb.maxX; - var px:Number = Number(name_cl.d); - var py:Number = Number(name_cl.h); - var pz:Number = Number(name_cl.l); - var maxY:Number = bb.maxY; - var maxZ:Number = bb.maxZ; - if(px < minX) - { - if(py < minY) - { - if(pz < minZ) - { - len = (minX - px) * (minX - px) + (minY - py) * (minY - py) + (minZ - pz) * (minZ - pz); - return len < rScale; - } - if(pz < maxZ) - { - len = (minX - px) * (minX - px) + (minY - py) * (minY - py); - return len < rScale; - } - if(pz > maxZ) - { - len = (minX - px) * (minX - px) + (minY - py) * (minY - py) + (maxZ - pz) * (maxZ - pz); - return len < rScale; - } - } - else if(py < maxY) - { - if(pz < minZ) - { - len = (minX - px) * (minX - px) + (minZ - pz) * (minZ - pz); - return len < rScale; - } - if(pz < maxZ) - { - len = (minX - px) * (minX - px); - return len < rScale; - } - if(pz > maxZ) - { - len = (minX - px) * (minX - px) + (maxZ - pz) * (maxZ - pz); - return len < rScale; - } - } - else if(py > maxY) - { - if(pz < minZ) - { - len = (minX - px) * (minX - px) + (maxY - py) * (maxY - py) + (minZ - pz) * (minZ - pz); - return len < rScale; - } - if(pz < maxZ) - { - len = (minX - px) * (minX - px) + (maxY - py) * (maxY - py); - return len < rScale; - } - if(pz > maxZ) - { - len = (minX - px) * (minX - px) + (maxY - py) * (maxY - py) + (maxZ - pz) * (maxZ - pz); - return len < rScale; - } - } - } - else if(px < maxX) - { - if(py < minY) - { - if(pz < minZ) - { - len = (minY - py) * (minY - py) + (minZ - pz) * (minZ - pz); - return len < rScale; - } - if(pz < maxZ) - { - len = (minY - py) * (minY - py); - return len < rScale; - } - if(pz > maxZ) - { - len = (minY - py) * (minY - py) + (maxZ - pz) * (maxZ - pz); - return len < rScale; - } - } - else if(py < maxY) - { - if(pz < minZ) - { - len = (minZ - pz) * (minZ - pz); - return len < rScale; - } - if(pz < maxZ) - { - return true; - } - if(pz > maxZ) - { - len = (maxZ - pz) * (maxZ - pz); - return len < rScale; - } - } - else if(py > maxY) - { - if(pz < minZ) - { - len = (maxY - py) * (maxY - py) + (minZ - pz) * (minZ - pz); - return len < rScale; - } - if(pz < maxZ) - { - len = (maxY - py) * (maxY - py); - return len < rScale; - } - if(pz > maxZ) - { - len = (maxY - py) * (maxY - py) + (maxZ - pz) * (maxZ - pz); - return len < rScale; - } - } - } - else if(px > maxX) - { - if(py < minY) - { - if(pz < minZ) - { - len = (maxX - px) * (maxX - px) + (minY - py) * (minY - py) + (minZ - pz) * (minZ - pz); - return len < rScale; - } - if(pz < maxZ) - { - len = (maxX - px) * (maxX - px) + (minY - py) * (minY - py); - return len < rScale; - } - if(pz > maxZ) - { - len = (maxX - px) * (maxX - px) + (minY - py) * (minY - py) + (maxZ - pz) * (maxZ - pz); - return len < rScale; - } - } - else if(py < maxY) - { - if(pz < minZ) - { - len = (maxX - px) * (maxX - px) + (minZ - pz) * (minZ - pz); - return len < rScale; - } - if(pz < maxZ) - { - len = (maxX - px) * (maxX - px); - return len < rScale; - } - if(pz > maxZ) - { - len = (maxX - px) * (maxX - px) + (maxZ - pz) * (maxZ - pz); - return len < rScale; - } - } - else if(py > maxY) - { - if(pz < minZ) - { - len = (maxX - px) * (maxX - px) + (maxY - py) * (maxY - py) + (minZ - pz) * (minZ - pz); - return len < rScale; - } - if(pz < maxZ) - { - len = (maxX - px) * (maxX - px) + (maxY - py) * (maxY - py); - return len < rScale; - } - if(pz > maxZ) - { - len = (maxX - px) * (maxX - px) + (maxY - py) * (maxY - py) + (maxZ - pz) * (maxZ - pz); - return len < rScale; - } - } - } - return true; - } - - override public function clone() : Object3D - { - var res:OmniLight = new OmniLight(color,this.attenuationBegin,this.attenuationEnd); - res.clonePropertiesFrom(this); - return res; - } - } -} - diff --git a/src/alternativa/engine3d/lights/SpotLight.as b/src/alternativa/engine3d/lights/SpotLight.as deleted file mode 100644 index b5946aa..0000000 --- a/src/alternativa/engine3d/lights/SpotLight.as +++ /dev/null @@ -1,413 +0,0 @@ -package alternativa.engine3d.lights -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.BoundBox; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.Debug; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.Transform3D; - - use namespace alternativa3d; - - public class SpotLight extends Light3D - { - public var attenuationBegin:Number; - - public var attenuationEnd:Number; - - public var hotspot:Number; - - public var falloff:Number; - - public function SpotLight(color:uint, attenuationBegin:Number, attenuationEnd:Number, hotspot:Number, falloff:Number) - { - super(); - this.color = color; - this.attenuationBegin = attenuationBegin; - this.attenuationEnd = attenuationEnd; - this.hotspot = hotspot; - this.falloff = falloff; - calculateBoundBox(); - } - - override alternativa3d function updateBoundBox(boundBox:BoundBox, hierarchy:Boolean, transform:Transform3D = null) : void - { - var bottom:Number = NaN; - var r:Number = this.falloff < Math.PI ? Math.sin(this.falloff * 0.5) * this.attenuationEnd : this.attenuationEnd; - bottom = this.falloff < Math.PI ? 0 : Math.cos(this.falloff * 0.5) * this.attenuationEnd; - boundBox.minX = -r; - boundBox.minY = -r; - boundBox.minZ = bottom; - boundBox.maxX = r; - boundBox.maxY = r; - boundBox.maxZ = this.attenuationEnd; - } - - public function lookAt(x:Number, y:Number, z:Number) : void - { - var dx:Number = x - this.x; - var dy:Number = y - this.y; - var dz:Number = z - this.z; - rotationX = Math.atan2(dz,Math.sqrt(dx * dx + dy * dy)) - Math.PI / 2; - rotationY = 0; - rotationZ = -Math.atan2(dx,dy); - } - - override alternativa3d function collectDraws(camera:Camera3D, lights:Vector., lightsLength:int) : void - { - var debug:int = 0; - if(camera.debug) - { - debug = camera.alternativa3d::checkInDebug(this); - if(Boolean(debug & Debug.BOUNDS) && boundBox != null) - { - Debug.alternativa3d::drawBoundBox(camera,boundBox,alternativa3d::localToCameraTransform); - } - } - } - - override alternativa3d function checkBound(targetObject:Object3D) : Boolean - { - var sum:Number = NaN; - var pro:Number = NaN; - var minX:Number = boundBox.minX; - var minY:Number = boundBox.minY; - var minZ:Number = boundBox.minZ; - var maxX:Number = boundBox.maxX; - var maxY:Number = boundBox.maxY; - var maxZ:Number = boundBox.maxZ; - var w:Number = (maxX - minX) * 0.5; - var l:Number = (maxY - minY) * 0.5; - var h:Number = (maxZ - minZ) * 0.5; - var ax:Number = name_cl.a * w; - var ay:Number = name_cl.e * w; - var az:Number = name_cl.i * w; - var bx:Number = name_cl.b * l; - var by:Number = name_cl.f * l; - var bz:Number = name_cl.j * l; - var cx:Number = name_cl.c * h; - var cy:Number = name_cl.g * h; - var cz:Number = name_cl.k * h; - var objectBB:BoundBox = targetObject.boundBox; - var hw:Number = (objectBB.maxX - objectBB.minX) * 0.5; - var hl:Number = (objectBB.maxY - objectBB.minY) * 0.5; - var hh:Number = (objectBB.maxZ - objectBB.minZ) * 0.5; - var dx:Number = name_cl.a * (minX + w) + name_cl.b * (minY + l) + name_cl.c * (minZ + h) + name_cl.d - objectBB.minX - hw; - var dy:Number = name_cl.e * (minX + w) + name_cl.f * (minY + l) + name_cl.g * (minZ + h) + name_cl.h - objectBB.minY - hl; - var dz:Number = name_cl.i * (minX + w) + name_cl.j * (minY + l) + name_cl.k * (minZ + h) + name_cl.l - objectBB.minZ - hh; - sum = 0; - if(ax >= 0) - { - sum += ax; - } - else - { - sum -= ax; - } - if(bx >= 0) - { - sum += bx; - } - else - { - sum -= bx; - } - if(cx >= 0) - { - sum += cx; - } - else - { - sum -= cx; - } - sum += hw; - if(dx >= 0) - { - sum -= dx; - } - sum += dx; - if(sum <= 0) - { - return false; - } - sum = 0; - if(ay >= 0) - { - sum += ay; - } - else - { - sum -= ay; - } - if(by >= 0) - { - sum += by; - } - else - { - sum -= by; - } - if(cy >= 0) - { - sum += cy; - } - else - { - sum -= cy; - } - sum += hl; - if(dy >= 0) - { - sum -= dy; - } - else - { - sum += dy; - } - if(sum <= 0) - { - return false; - } - sum = 0; - if(az >= 0) - { - sum += az; - } - else - { - sum -= az; - } - if(bz >= 0) - { - sum += bz; - } - else - { - sum -= bz; - } - if(cz >= 0) - { - sum += cz; - } - else - { - sum -= cz; - } - sum += hl; - if(dz >= 0) - { - sum -= dz; - } - else - { - sum += dz; - } - if(sum <= 0) - { - return false; - } - sum = 0; - pro = name_cl.a * ax + name_cl.e * ay + name_cl.i * az; - if(pro >= 0) - { - sum += pro; - } - else - { - sum -= pro; - } - pro = name_cl.a * bx + name_cl.e * by + name_cl.i * bz; - if(pro >= 0) - { - sum += pro; - } - else - { - sum -= pro; - } - pro = name_cl.a * cx + name_cl.e * cy + name_cl.i * cz; - if(pro >= 0) - { - sum += pro; - } - else - { - sum -= pro; - } - if(name_cl.a >= 0) - { - sum += name_cl.a * hw; - } - else - { - sum -= name_cl.a * hw; - } - if(name_cl.e >= 0) - { - sum += name_cl.e * hl; - } - else - { - sum -= name_cl.e * hl; - } - if(name_cl.i >= 0) - { - sum += name_cl.i * hh; - } - else - { - sum -= name_cl.i * hh; - } - pro = name_cl.a * dx + name_cl.e * dy + name_cl.i * dz; - if(pro >= 0) - { - sum -= pro; - } - else - { - sum += pro; - } - if(sum <= 0) - { - return false; - } - sum = 0; - pro = name_cl.b * ax + name_cl.f * ay + name_cl.j * az; - if(pro >= 0) - { - sum += pro; - } - else - { - sum -= pro; - } - pro = name_cl.b * bx + name_cl.f * by + name_cl.j * bz; - if(pro >= 0) - { - sum += pro; - } - else - { - sum -= pro; - } - pro = name_cl.b * cx + name_cl.f * cy + name_cl.j * cz; - if(pro >= 0) - { - sum += pro; - } - else - { - sum -= pro; - } - if(name_cl.b >= 0) - { - sum += name_cl.b * hw; - } - else - { - sum -= name_cl.b * hw; - } - if(name_cl.f >= 0) - { - sum += name_cl.f * hl; - } - else - { - sum -= name_cl.f * hl; - } - if(name_cl.j >= 0) - { - sum += name_cl.j * hh; - } - else - { - sum -= name_cl.j * hh; - } - pro = name_cl.b * dx + name_cl.f * dy + name_cl.j * dz; - if(pro >= 0) - { - sum -= pro; - } - sum += pro; - if(sum <= 0) - { - return false; - } - sum = 0; - pro = name_cl.c * ax + name_cl.g * ay + name_cl.k * az; - if(pro >= 0) - { - sum += pro; - } - else - { - sum -= pro; - } - pro = name_cl.c * bx + name_cl.g * by + name_cl.k * bz; - if(pro >= 0) - { - sum += pro; - } - else - { - sum -= pro; - } - pro = name_cl.c * cx + name_cl.g * cy + name_cl.k * cz; - if(pro >= 0) - { - sum += pro; - } - else - { - sum -= pro; - } - if(name_cl.c >= 0) - { - sum += name_cl.c * hw; - } - else - { - sum -= name_cl.c * hw; - } - if(name_cl.g >= 0) - { - sum += name_cl.g * hl; - } - else - { - sum -= name_cl.g * hl; - } - if(name_cl.k >= 0) - { - sum += name_cl.k * hh; - } - else - { - sum -= name_cl.k * hh; - } - pro = name_cl.c * dx + name_cl.g * dy + name_cl.k * dz; - if(pro >= 0) - { - sum -= pro; - } - else - { - sum += pro; - } - if(sum <= 0) - { - return false; - } - return true; - } - - override public function clone() : Object3D - { - var res:SpotLight = new SpotLight(color,this.attenuationBegin,this.attenuationEnd,this.hotspot,this.falloff); - res.clonePropertiesFrom(this); - return res; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/ParserA3D.as b/src/alternativa/engine3d/loaders/ParserA3D.as deleted file mode 100644 index acff63f..0000000 --- a/src/alternativa/engine3d/loaders/ParserA3D.as +++ /dev/null @@ -1,883 +0,0 @@ -package alternativa.engine3d.loaders -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.BoundBox; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.core.VertexStream; - import alternativa.engine3d.lights.AmbientLight; - import alternativa.engine3d.lights.DirectionalLight; - import alternativa.engine3d.lights.OmniLight; - import alternativa.engine3d.lights.SpotLight; - import alternativa.engine3d.materials.A3DUtils; - import alternativa.engine3d.objects.Joint; - import alternativa.engine3d.objects.Mesh; - import alternativa.engine3d.objects.Skin; - import alternativa.engine3d.resources.ExternalTextureResource; - import alternativa.engine3d.resources.Geometry; - import alternativa.osgi.OSGi; - import alternativa.osgi.service.clientlog.IClientLog; - import alternativa.protocol.ICodec; - import alternativa.protocol.IProtocol; - import alternativa.protocol.OptionalMap; - import alternativa.protocol.ProtocolBuffer; - import alternativa.protocol.impl.OptionalMapCodecHelper; - import alternativa.protocol.impl.PacketHelper; - import alternativa.protocol.impl.Protocol; - import alternativa.protocol.info.TypeCodecInfo; - import alternativa.protocol.osgi.ProtocolActivator; - import alternativa.types.Long; - import commons.A3DMatrix; - import commons.Id; - import flash.geom.Matrix3D; - import flash.geom.Vector3D; - import flash.utils.ByteArray; - import flash.utils.Dictionary; - import flash.utils.Endian; - import platform.client.formats.a3d.osgi.Activator; - import platform.clients.fp10.libraries.alternativaprotocol.Activator; - import versions.version1.a3d.A3D; - import versions.version1.a3d.geometry.A3DGeometry; - import versions.version1.a3d.geometry.A3DIndexBuffer; - import versions.version1.a3d.geometry.A3DVertexBuffer; - import versions.version1.a3d.id.ParentId; - import versions.version1.a3d.materials.A3DImage; - import versions.version1.a3d.materials.A3DMap; - import versions.version1.a3d.materials.A3DMaterial; - import versions.version1.a3d.objects.A3DBox; - import versions.version1.a3d.objects.A3DObject; - import versions.version1.a3d.objects.A3DSurface; - import versions.version2.a3d.A3D2; - import versions.version2.a3d.geometry.A3D2IndexBuffer; - import versions.version2.a3d.geometry.A3D2VertexAttributes; - import versions.version2.a3d.geometry.A3D2VertexBuffer; - import versions.version2.a3d.materials.A3D2Image; - import versions.version2.a3d.materials.A3D2Map; - import versions.version2.a3d.materials.A3D2Material; - import versions.version2.a3d.objects.A3D2AmbientLight; - import versions.version2.a3d.objects.A3D2Box; - import versions.version2.a3d.objects.A3D2DirectionalLight; - import versions.version2.a3d.objects.A3D2Joint; - import versions.version2.a3d.objects.A3D2Mesh; - import versions.version2.a3d.objects.A3D2Object; - import versions.version2.a3d.objects.A3D2OmniLight; - import versions.version2.a3d.objects.A3D2Skin; - import versions.version2.a3d.objects.A3D2SpotLight; - import versions.version2.a3d.objects.A3D2Surface; - import versions.version2.a3d.objects.A3D2Transform; - - use namespace alternativa3d; - - public class ParserA3D - { - public var hierarchy:Vector.; - - public var objects:Vector.; - - private var maps:Dictionary; - - private var materials:Dictionary; - - private var protocol:Protocol; - - private var name_gk:Object; - - private var name_Y8:Boolean = false; - - public function ParserA3D() - { - super(); - this.init(); - } - - private static function convert1_2(source:A3D) : A3D2 - { - var i:int = 0; - var count:int = 0; - var sourceBox:A3DBox = null; - var destBox:A3D2Box = null; - var sourceGeometry:A3DGeometry = null; - var sourceImage:A3DImage = null; - var destImage:A3D2Image = null; - var sourceMap:A3DMap = null; - var destMap:A3D2Map = null; - var sourceMaterial:A3DMaterial = null; - var destMaterial:A3D2Material = null; - var sourceObject:A3DObject = null; - var destMesh:A3D2Mesh = null; - var destIndexBufferId:int = 0; - var destVertexBuffersIds:Vector. = null; - var sourceIndexBuffer:A3DIndexBuffer = null; - var sourceVertexBuffers:Vector. = null; - var destIndexBuffer:A3D2IndexBuffer = null; - var j:int = 0; - var inCount:int = 0; - var sourceVertexBuffer:A3DVertexBuffer = null; - var sourceAttributes:Vector. = null; - var destAttributes:Vector. = null; - var k:int = 0; - var kCount:int = 0; - var destVertexBuffer:A3D2VertexBuffer = null; - var attr:int = 0; - var _loc47_:A3D2Object = null; - var sourceBoxes:Vector. = source.boxes; - var destBoxes:Vector. = null; - if(sourceBoxes != null) - { - destBoxes = new Vector.(); - for(i = 0,count = int(sourceBoxes.length); i < count; i++) - { - sourceBox = sourceBoxes[i]; - destBox = new A3D2Box(sourceBox.box,sourceBox.id.id); - destBoxes[i] = destBox; - } - } - var sourceGeometries:Dictionary = new Dictionary(); - if(source.geometries != null) - { - for each(sourceGeometry in source.geometries) - { - sourceGeometries[sourceGeometry.id.id] = sourceGeometry; - } - } - var sourceImages:Vector. = source.images; - var destImages:Vector. = null; - if(sourceImages != null) - { - destImages = new Vector.(); - for(i = 0,count = int(sourceImages.length); i < count; i++) - { - sourceImage = sourceImages[i]; - destImage = new A3D2Image(sourceImage.id.id,sourceImage.url); - destImages[i] = destImage; - } - } - var sourceMaps:Vector. = source.maps; - var destMaps:Vector. = null; - if(sourceMaps != null) - { - destMaps = new Vector.(); - for(i = 0,count = int(sourceMaps.length); i < count; i++) - { - sourceMap = sourceMaps[i]; - destMap = new A3D2Map(sourceMap.channel,sourceMap.id.id,sourceMap.imageId.id); - destMaps[i] = destMap; - } - } - var sourceMaterials:Vector. = source.materials; - var destMaterials:Vector. = null; - if(sourceMaterials != null) - { - destMaterials = new Vector.(); - for(i = 0,count = int(sourceMaterials.length); i < count; i++) - { - sourceMaterial = sourceMaterials[i]; - destMaterial = new A3D2Material(idToInt(sourceMaterial.diffuseMapId),idToInt(sourceMaterial.glossinessMapId),idToInt(sourceMaterial.id),idToInt(sourceMaterial.lightMapId),idToInt(sourceMaterial.normalMapId),idToInt(sourceMaterial.opacityMapId),-1,idToInt(sourceMaterial.specularMapId)); - destMaterials[i] = destMaterial; - } - } - var sourceObjects:Vector. = source.objects; - var destObjects:Vector. = null; - var destMeshes:Vector. = null; - var destVertexBuffers:Vector. = null; - var destIndexBuffers:Vector. = null; - var lastIndexBufferIndex:uint = 0; - var lastVertexBufferIndex:uint = 0; - var objectsMap:Dictionary = new Dictionary(); - if(sourceObjects != null) - { - destMeshes = new Vector.(); - destObjects = new Vector.(); - destVertexBuffers = new Vector.(); - destIndexBuffers = new Vector.(); - for(i = 0,count = int(sourceObjects.length); i < count; i++) - { - sourceObject = sourceObjects[i]; - if(sourceObject.surfaces != null && sourceObject.surfaces.length > 0) - { - destMesh = null; - sourceGeometry = sourceGeometries[sourceObject.geometryId.id]; - destIndexBufferId = -1; - destVertexBuffersIds = new Vector.(); - if(sourceGeometry != null) - { - sourceIndexBuffer = sourceGeometry.indexBuffer; - sourceVertexBuffers = sourceGeometry.vertexBuffers; - destIndexBuffer = new A3D2IndexBuffer(sourceIndexBuffer.byteBuffer,lastIndexBufferIndex++,sourceIndexBuffer.indexCount); - destIndexBufferId = destIndexBuffer.id; - destIndexBuffers.push(destIndexBuffer); - for(j = 0,inCount = int(sourceVertexBuffers.length); j < inCount; j++) - { - sourceVertexBuffer = sourceVertexBuffers[j]; - sourceAttributes = sourceVertexBuffer.attributes; - destAttributes = new Vector.(); - for(k = 0,kCount = int(sourceAttributes.length); k < kCount; ) - { - attr = sourceAttributes[k]; - switch(attr) - { - case 0: - destAttributes[k] = A3D2VertexAttributes.POSITION; - break; - case 1: - destAttributes[k] = A3D2VertexAttributes.NORMAL; - break; - case 2: - destAttributes[k] = A3D2VertexAttributes.TANGENT4; - break; - case 3: - break; - case 4: - break; - case 5: - destAttributes[k] = A3D2VertexAttributes.TEXCOORD; - break; - } - k++; - } - destVertexBuffer = new A3D2VertexBuffer(destAttributes,sourceVertexBuffer.byteBuffer,lastVertexBufferIndex++,sourceVertexBuffer.vertexCount); - destVertexBuffers.push(destVertexBuffer); - destVertexBuffersIds.push(destVertexBuffer.id); - } - } - destMesh = new A3D2Mesh(idToInt(sourceObject.boundBoxId),idToLong(sourceObject.id),destIndexBufferId,sourceObject.name,convertParent1_2(sourceObject.parentId),convertSurfaces1_2(sourceObject.surfaces),new A3D2Transform(sourceObject.transformation.matrix),destVertexBuffersIds,sourceObject.visible); - destMeshes.push(destMesh); - objectsMap[sourceObject.id.id] = destMesh; - } - else - { - _loc47_ = new A3D2Object(idToInt(sourceObject.boundBoxId),idToLong(sourceObject.id),sourceObject.name,convertParent1_2(sourceObject.parentId),new A3D2Transform(sourceObject.transformation.matrix),sourceObject.visible); - destObjects.push(_loc47_); - objectsMap[sourceObject.id.id] = _loc47_; - } - } - } - return new A3D2(null,null,null,destBoxes,null,null,null,destImages,destIndexBuffers,null,destMaps,destMaterials,destMeshes != null && destMeshes.length > 0 ? destMeshes : null,destObjects != null && destObjects.length > 0 ? destObjects : null,null,null,null,null,destVertexBuffers); - } - - private static function idToInt(id:Id) : int - { - return id != null ? int(id.id) : -1; - } - - private static function idToLong(id:Id) : Long - { - return id != null ? Long.fromInt(id.id) : Long.fromInt(-1); - } - - private static function convertParent1_2(parentId:ParentId) : Long - { - if(parentId == null) - { - return null; - } - return parentId != null ? Long.fromInt(parentId.id) : null; - } - - private static function convertSurfaces1_2(source:Vector.) : Vector. - { - var sourceSurface:A3DSurface = null; - var destSurface:A3D2Surface = null; - var dest:Vector. = new Vector.(); - for(var i:int = 0, count:int = int(source.length); i < count; i++) - { - sourceSurface = source[i]; - destSurface = new A3D2Surface(sourceSurface.indexBegin,idToInt(sourceSurface.materialId),sourceSurface.numTriangles); - dest[i] = destSurface; - } - return dest; - } - - public function parse(input:ByteArray) : void - { - var version:int = 0; - try - { - input.position = 0; - version = int(input.readByte()); - if(version == 0) - { - this.parseVersion1(input); - } - else - { - this.parseVersionOver1(input); - } - } - catch(e:Error) - { - throw new Error("parsing failed",0); - } - } - - public function getObjectByName(name:String) : Object3D - { - var object:Object3D = null; - for each(object in this.objects) - { - if(object.name == name) - { - return object; - } - } - return null; - } - - private function init() : void - { - if(this.name_Y8) - { - return; - } - if(OSGi.getInstance() != null) - { - this.protocol = Protocol(OSGi.getInstance().getService(IProtocol)); - return; - } - OSGi.clientLog = new DummyClientLog(); - var osgi:OSGi = new OSGi(); - osgi.registerService(IClientLog,new DummyClientLog()); - new ProtocolActivator().start(osgi); - new platform.client.formats.a3d.osgi.Activator().start(osgi); - new platform.clients.fp10.libraries.alternativaprotocol.Activator().start(osgi); - this.protocol = Protocol(osgi.getService(IProtocol)); - this.name_Y8 = true; - } - - private function parseVersion1(input:ByteArray) : void - { - input.position = 4; - var nullMap:OptionalMap = OptionalMapCodecHelper.decodeNullMap(input); - nullMap.setReadPosition(0); - var data:ByteArray = new ByteArray(); - data.writeBytes(input,input.position); - data.position = 0; - var buffer:ProtocolBuffer = new ProtocolBuffer(data,data,nullMap); - var codec:ICodec = this.protocol.getCodec(new TypeCodecInfo(A3D,false)); - var _a3d:A3D = A3D(codec.decode(buffer)); - var a3d2:A3D2 = convert1_2(_a3d); - this.doParse2_0(a3d2); - } - - private function doParse2_0(a3d:A3D2) : void - { - var a3DObject:A3D2Object = null; - var a3DMesh:A3D2Mesh = null; - var a3DIndexBuffer:A3D2IndexBuffer = null; - var a3DVertexBuffer:A3D2VertexBuffer = null; - var a3DMaterial:A3D2Material = null; - var a3DBox:A3D2Box = null; - var a3DMap:A3D2Map = null; - var a3DImage:A3D2Image = null; - var a3DAmbientLight:A3D2AmbientLight = null; - var a3DOmniLight:A3D2OmniLight = null; - var a3DSpotLight:A3D2SpotLight = null; - var a3DDirLight:A3D2DirectionalLight = null; - var a3DSkin:A3D2Skin = null; - var a3DJoint:A3D2Joint = null; - var parent:Long = null; - var p:Object3D = null; - var object:Object3D = null; - var resJoint:Joint = null; - var resSkin:Mesh = null; - var resAmbientLight:AmbientLight = null; - var resObject:Object3D = null; - var resOmniLight:OmniLight = null; - var resSpotLight:SpotLight = null; - var resDirLight:DirectionalLight = null; - var resMesh:Mesh = null; - var objectsMap:Dictionary = new Dictionary(); - var a3DIndexBuffers:Dictionary = new Dictionary(); - var a3DVertexBuffers:Dictionary = new Dictionary(); - var a3DMaterials:Dictionary = new Dictionary(); - var a3DBoxes:Dictionary = new Dictionary(); - var a3DMaps:Dictionary = new Dictionary(); - var a3DImages:Dictionary = new Dictionary(); - var parents:Dictionary = new Dictionary(); - for each(a3DIndexBuffer in a3d.indexBuffers) - { - a3DIndexBuffers[a3DIndexBuffer.id] = a3DIndexBuffer; - } - for each(a3DVertexBuffer in a3d.vertexBuffers) - { - a3DVertexBuffers[a3DVertexBuffer.id] = a3DVertexBuffer; - } - for each(a3DBox in a3d.boxes) - { - a3DBoxes[a3DBox.id] = a3DBox; - } - for each(a3DMaterial in a3d.materials) - { - a3DMaterials[a3DMaterial.id] = a3DMaterial; - } - for each(a3DMap in a3d.maps) - { - a3DMaps[a3DMap.id] = a3DMap; - } - for each(a3DImage in a3d.images) - { - a3DImages[a3DImage.id] = a3DImage; - } - this.hierarchy = new Vector.(); - this.objects = new Vector.(); - this.maps = new Dictionary(); - this.materials = new Dictionary(); - this.name_gk = new Dictionary(); - for each(a3DJoint in a3d.joints) - { - resJoint = new Joint(); - resJoint.visible = a3DJoint.visible; - resJoint.name = a3DJoint.name; - parents[resJoint] = a3DJoint.parentId; - objectsMap[a3DJoint.id] = resJoint; - if(a3DJoint.parentId == null) - { - this.hierarchy.push(resJoint); - } - this.objects.push(resJoint); - this.decomposeTransformation(a3DJoint.transform,resJoint); - a3DBox = a3DBoxes[a3DJoint.boundBoxId]; - if(a3DBox != null) - { - this.parseBoundBox(a3DBox.box,resJoint); - } - } - for each(a3DSkin in a3d.skins) - { - resSkin = this.parseSkin(a3DSkin,a3DIndexBuffers,a3DVertexBuffers,a3DMaterials,a3DMaps,a3DImages); - resSkin.visible = a3DSkin.visible; - resSkin.name = a3DSkin.name; - parents[resSkin] = a3DSkin.parentId; - objectsMap[a3DSkin.id] = resSkin; - if(a3DSkin.parentId == null) - { - this.hierarchy.push(resSkin); - } - this.objects.push(resSkin); - this.decomposeTransformation(a3DSkin.transform,resSkin); - a3DBox = a3DBoxes[a3DSkin.boundBoxId]; - if(a3DBox != null) - { - this.parseBoundBox(a3DBox.box,resSkin); - } - } - for each(a3DAmbientLight in a3d.ambientLights) - { - resAmbientLight = new AmbientLight(a3DAmbientLight.color); - resAmbientLight.intensity = a3DAmbientLight.intensity; - resAmbientLight.visible = a3DAmbientLight.visible; - resAmbientLight.name = a3DAmbientLight.name; - parents[resAmbientLight] = a3DAmbientLight.parentId; - objectsMap[a3DAmbientLight.id] = resAmbientLight; - if(a3DAmbientLight.parentId == null) - { - this.hierarchy.push(resAmbientLight); - } - this.objects.push(resAmbientLight); - this.decomposeTransformation(a3DAmbientLight.transform,resAmbientLight); - a3DBox = a3DBoxes[a3DAmbientLight.boundBoxId]; - if(a3DBox != null) - { - this.parseBoundBox(a3DBox.box,resAmbientLight); - } - } - for each(a3DObject in a3d.objects) - { - resObject = new Object3D(); - resObject.visible = a3DObject.visible; - resObject.name = a3DObject.name; - parents[resObject] = a3DObject.parentId; - objectsMap[a3DObject.id] = resObject; - if(a3DObject.parentId == null) - { - this.hierarchy.push(resObject); - } - this.objects.push(resObject); - this.decomposeTransformation(a3DObject.transform,resObject); - a3DBox = a3DBoxes[a3DObject.boundBoxId]; - if(a3DBox != null) - { - this.parseBoundBox(a3DBox.box,resObject); - } - } - for each(a3DOmniLight in a3d.omniLights) - { - resOmniLight = new OmniLight(a3DOmniLight.color,a3DOmniLight.attenuationBegin,a3DOmniLight.attenuationEnd); - resOmniLight.visible = a3DOmniLight.visible; - resOmniLight.name = a3DOmniLight.name; - parents[resOmniLight] = a3DOmniLight.parentId; - objectsMap[a3DOmniLight.id] = resOmniLight; - if(a3DOmniLight.parentId == null) - { - this.hierarchy.push(resOmniLight); - } - this.objects.push(resOmniLight); - this.decomposeTransformation(a3DOmniLight.transform,resOmniLight); - } - for each(a3DSpotLight in a3d.spotLights) - { - resSpotLight = new SpotLight(a3DSpotLight.color,a3DSpotLight.attenuationBegin,a3DSpotLight.attenuationEnd,a3DSpotLight.hotspot,a3DSpotLight.falloff); - resSpotLight.visible = a3DSpotLight.visible; - resSpotLight.name = a3DSpotLight.name; - parents[resSpotLight] = a3DSpotLight.parentId; - objectsMap[a3DSpotLight.id] = resSpotLight; - if(a3DSpotLight.parentId == null) - { - this.hierarchy.push(resSpotLight); - } - this.objects.push(resSpotLight); - this.decomposeTransformation(a3DSpotLight.transform,resSpotLight); - } - for each(a3DDirLight in a3d.directionalLights) - { - resDirLight = new DirectionalLight(a3DDirLight.color); - resDirLight.visible = a3DDirLight.visible; - resDirLight.name = a3DDirLight.name; - parents[resDirLight] = a3DDirLight.parentId; - objectsMap[a3DDirLight.id] = resDirLight; - if(a3DDirLight.parentId == null) - { - this.hierarchy.push(resDirLight); - } - this.objects.push(resDirLight); - this.decomposeTransformation(a3DDirLight.transform,resDirLight); - } - for each(a3DMesh in a3d.meshes) - { - resMesh = this.parseMesh(a3DMesh,a3DIndexBuffers,a3DVertexBuffers,a3DMaterials,a3DMaps,a3DImages); - resMesh.visible = a3DMesh.visible; - resMesh.name = a3DMesh.name; - parents[resMesh] = a3DMesh.parentId; - objectsMap[a3DMesh.id] = resMesh; - if(a3DMesh.parentId == null) - { - this.hierarchy.push(resMesh); - } - this.objects.push(resMesh); - this.decomposeTransformation(a3DMesh.transform,resMesh); - a3DBox = a3DBoxes[a3DMesh.boundBoxId]; - if(a3DBox != null) - { - this.parseBoundBox(a3DBox.box,resMesh); - } - } - for each(object in objectsMap) - { - parent = parents[object]; - if(parent != null) - { - p = objectsMap[parent]; - p.addChild(object); - } - } - } - - private function parseSurfaceJoints(source:Vector.>, objectsMap:Dictionary) : Vector.> - { - var vector:Vector. = null; - var resultVector:Vector. = null; - var j:int = 0; - var jcount:int = 0; - var result:Vector.> = new Vector.>(); - for(var i:int = 0, count:int = int(source.length); i < count; i++) - { - vector = source[i]; - resultVector = new Vector.(); - for(j = 0,jcount = int(vector.length); j < jcount; j++) - { - resultVector[j] = objectsMap[vector[j]]; - } - result[i] = resultVector; - } - return result; - } - - private function parseVersionOver1(input:ByteArray) : void - { - input.position = 0; - var data:ByteArray = new ByteArray(); - var buffer:ProtocolBuffer = new ProtocolBuffer(data,data,new OptionalMap()); - PacketHelper.unwrapPacket(input,buffer); - input.position = 0; - var versionMajor:int = int(buffer.reader.readUnsignedShort()); - var versionMinor:int = int(buffer.reader.readUnsignedShort()); - switch(versionMajor) - { - case 2: - this.parseVersion2_0(buffer); - } - } - - private function parseVersion2_0(buffer:ProtocolBuffer) : void - { - var codec:ICodec = this.protocol.getCodec(new TypeCodecInfo(A3D2,false)); - var a3d:A3D2 = A3D2(codec.decode(buffer)); - this.doParse2_0(a3d); - } - - private function parseBoundBox(box:Vector., destination:Object3D) : void - { - destination.boundBox = new BoundBox(); - destination.boundBox.minX = box[0]; - destination.boundBox.minY = box[1]; - destination.boundBox.minZ = box[2]; - destination.boundBox.maxX = box[3]; - destination.boundBox.maxY = box[4]; - destination.boundBox.maxZ = box[5]; - } - - private function decomposeTransformation(transform:A3D2Transform, obj:Object3D) : void - { - if(transform == null) - { - return; - } - var matrix:A3DMatrix = transform.matrix; - var mat:Matrix3D = new Matrix3D(Vector.([matrix.a,matrix.e,matrix.i,0,matrix.b,matrix.f,matrix.j,0,matrix.c,matrix.g,matrix.k,0,matrix.d,matrix.h,matrix.l,1])); - var vecs:Vector. = mat.decompose(); - obj.x = vecs[0].x; - obj.y = vecs[0].y; - obj.z = vecs[0].z; - obj.rotationX = vecs[1].x; - obj.rotationY = vecs[1].y; - obj.rotationZ = vecs[1].z; - obj.scaleX = vecs[2].x; - obj.scaleY = vecs[2].y; - obj.scaleZ = vecs[2].z; - } - - private function decomposeBindTransformation(transform:A3D2Transform, obj:Joint) : void - { - if(transform == null) - { - return; - } - var matrix:A3DMatrix = transform.matrix; - var mat:Vector. = Vector.([matrix.a,matrix.b,matrix.c,matrix.d,matrix.e,matrix.f,matrix.g,matrix.h,matrix.i,matrix.j,matrix.k,matrix.l]); - obj.alternativa3d::setBindPoseMatrix(mat); - } - - private function parseMesh(a3DMesh:A3D2Mesh, indexBuffers:Dictionary, vertexBuffers:Dictionary, materials:Dictionary, maps:Dictionary, images:Dictionary) : Mesh - { - var s:A3D2Surface = null; - var m:ParserMaterial = null; - var res:Mesh = new Mesh(); - res.geometry = this.parseGeometry(a3DMesh.indexBufferId,a3DMesh.vertexBuffers,indexBuffers,vertexBuffers); - var surfaces:Vector. = a3DMesh.surfaces; - for(var i:int = 0; i < surfaces.length; i++) - { - s = surfaces[i]; - m = this.parseMaterial(materials[s.materialId],maps,images); - res.addSurface(m,s.indexBegin,s.numTriangles); - } - return res; - } - - private function parseSkin(a3DSkin:A3D2Skin, indexBuffers:Dictionary, vertexBuffers:Dictionary, materials:Dictionary, maps:Dictionary, images:Dictionary) : Skin - { - var s:A3D2Surface = null; - var m:ParserMaterial = null; - var res:Skin = new Skin(1,a3DSkin.joints.length); - res.geometry = this.parseGeometry(a3DSkin.indexBufferId,a3DSkin.vertexBuffers,indexBuffers,vertexBuffers); - var surfaces:Vector. = a3DSkin.surfaces; - for(var i:int = 0; i < surfaces.length; i++) - { - s = surfaces[i]; - m = this.parseMaterial(materials[s.materialId],maps,images); - res.addSurface(m,s.indexBegin,s.numTriangles); - } - return res; - } - - private function traceGeometry(geometry:Geometry) : void - { - var offset:int = 0; - var i:int = 0; - var attr:int = 0; - var vertexStream:VertexStream = geometry.alternativa3d::_vertexStreams[0]; - var prev:int = -1; - var stride:int = vertexStream.attributes.length * 4; - var length:int = vertexStream.data.length / stride; - var data:ByteArray = vertexStream.data; - for(var j:int = 0; j < length; j++) - { - offset = -4; - for(i = 0; i < stride; i++) - { - attr = int(vertexStream.attributes[i]); - offset += 4; - if(attr != prev) - { - switch(attr) - { - case VertexAttributes.JOINTS[0]: - data.position = j * stride + offset; - trace("JOINT0:",data.readFloat(),data.readFloat(),data.readFloat(),data.readFloat()); - break; - case VertexAttributes.JOINTS[1]: - data.position = j * stride + offset; - trace("JOINT1:",data.readFloat(),data.readFloat(),data.readFloat(),data.readFloat()); - } - prev = attr; - } - } - } - } - - private function parseGeometry(indexBufferID:int, vertexBuffersIDs:Vector., indexBuffers:Dictionary, vertexBuffers:Dictionary) : Geometry - { - var id:int = 0; - var geometry:Geometry = null; - var vertexCount:uint = 0; - var buffer:A3D2VertexBuffer = null; - var byteArray:ByteArray = null; - var offset:int = 0; - var attributes:Array = null; - var jointsOffset:int = 0; - var k:int = 0; - var attr:int = 0; - var numFloats:int = 0; - var t:int = 0; - var key:String = "i" + indexBufferID.toString(); - for each(id in vertexBuffersIDs) - { - key += "v" + id.toString(); - } - geometry = this.name_gk[key]; - if(geometry != null) - { - return geometry; - } - geometry = new Geometry(); - var a3dIB:A3D2IndexBuffer = indexBuffers[indexBufferID]; - var indices:Vector. = A3DUtils.byteArrayToVectorUint(a3dIB.byteBuffer); - var uvoffset:int = 0; - geometry.alternativa3d::_indices = indices; - var buffers:Vector. = vertexBuffersIDs; - for(var j:int = 0; j < buffers.length; j++) - { - buffer = vertexBuffers[buffers[j]]; - vertexCount = buffer.vertexCount; - byteArray = buffer.byteBuffer; - byteArray.endian = Endian.LITTLE_ENDIAN; - offset = 0; - attributes = new Array(); - jointsOffset = 0; - for(k = 0; k < buffer.attributes.length; k++) - { - switch(buffer.attributes[k]) - { - case A3D2VertexAttributes.POSITION: - attr = int(VertexAttributes.POSITION); - break; - case A3D2VertexAttributes.NORMAL: - attr = int(VertexAttributes.NORMAL); - break; - case A3D2VertexAttributes.TANGENT4: - attr = int(VertexAttributes.TANGENT4); - break; - case A3D2VertexAttributes.TEXCOORD: - attr = int(VertexAttributes.TEXCOORDS[uvoffset]); - uvoffset++; - break; - case A3D2VertexAttributes.JOINT: - attr = int(VertexAttributes.JOINTS[jointsOffset]); - jointsOffset++; - } - numFloats = VertexAttributes.getAttributeStride(attr); - numFloats = numFloats < 1 ? 1 : numFloats; - for(t = 0; t < numFloats; t++) - { - attributes[offset] = attr; - offset++; - } - } - geometry.addVertexStream(attributes); - geometry.alternativa3d::_vertexStreams[0].data = byteArray; - } - geometry.alternativa3d::_numVertices = buffers.length > 0 ? int(vertexCount) : 0; - this.name_gk[key] = geometry; - return geometry; - } - - private function parseMap(source:A3D2Map, images:Dictionary) : ExternalTextureResource - { - if(source == null) - { - return null; - } - var res:ExternalTextureResource = this.maps[source.imageId]; - if(res != null) - { - return res; - } - return this.maps[source.imageId] = new ExternalTextureResource(images[source.imageId].url); - } - - private function parseMaterial(source:A3D2Material, a3DMaps:Dictionary, images:Dictionary) : ParserMaterial - { - if(source == null) - { - return null; - } - var res:ParserMaterial = this.materials[source.id]; - if(res != null) - { - return res; - } - res = this.materials[source.id] = new ParserMaterial(); - res.textures["diffuse"] = this.parseMap(a3DMaps[source.diffuseMapId],images); - res.textures["emission"] = this.parseMap(a3DMaps[source.lightMapId],images); - res.textures["bump"] = this.parseMap(a3DMaps[source.normalMapId],images); - res.textures["specular"] = this.parseMap(a3DMaps[source.specularMapId],images); - res.textures["glossiness"] = this.parseMap(a3DMaps[source.glossinessMapId],images); - res.textures["transparent"] = this.parseMap(a3DMaps[source.opacityMapId],images); - return res; - } - } -} - -import alternativa.osgi.service.clientlog.IClientLog; -import alternativa.osgi.service.clientlog.IClientLogChannelListener; - -class DummyClientLog implements IClientLog -{ - public function DummyClientLog() - { - super(); - } - - public function logError(channelName:String, text:String, ... vars) : void - { - } - - public function log(channelName:String, text:String, ... rest) : void - { - } - - public function getChannelStrings(channelName:String) : Vector. - { - return null; - } - - public function addLogListener(listener:IClientLogChannelListener) : void - { - } - - public function removeLogListener(listener:IClientLogChannelListener) : void - { - } - - public function addLogChannelListener(channelName:String, listener:IClientLogChannelListener) : void - { - } - - public function removeLogChannelListener(channelName:String, listener:IClientLogChannelListener) : void - { - } - - public function getChannelNames() : Vector. - { - return null; - } -} diff --git a/src/alternativa/engine3d/loaders/ParserCollada.as b/src/alternativa/engine3d/loaders/ParserCollada.as deleted file mode 100644 index 64bbbad..0000000 --- a/src/alternativa/engine3d/loaders/ParserCollada.as +++ /dev/null @@ -1,440 +0,0 @@ -package alternativa.engine3d.loaders -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.animation.AnimationClip; - import alternativa.engine3d.animation.keys.Track; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.loaders.collada.DaeDocument; - import alternativa.engine3d.loaders.collada.DaeMaterial; - import alternativa.engine3d.loaders.collada.DaeNode; - import alternativa.engine3d.loaders.collada.DaeObject; - import alternativa.engine3d.resources.ExternalTextureResource; - import flash.utils.Dictionary; - - use namespace alternativa3d; - - public class ParserCollada - { - public var hierarchy:Vector.; - - public var objects:Vector.; - - public var lights:Vector.; - - public var materials:Vector.; - - public var name_eL:Vector.; - - private var name_W6:Dictionary; - - public function ParserCollada() - { - super(); - } - - public static function parseAnimation(data:XML) : AnimationClip - { - var document:DaeDocument = new DaeDocument(data,0); - var clip:AnimationClip = new AnimationClip(); - collectAnimation(clip,document.scene.nodes); - return clip.numTracks > 0 ? clip : null; - } - - private static function collectAnimation(clip:AnimationClip, nodes:Vector.) : void - { - var node:DaeNode = null; - var animation:AnimationClip = null; - var t:int = 0; - var numTracks:int = 0; - var track:Track = null; - for(var i:int = 0, count:int = int(nodes.length); i < count; i++) - { - node = nodes[i]; - animation = node.parseAnimation(); - if(animation != null) - { - for(t = 0,numTracks = animation.numTracks; t < numTracks; t++) - { - track = animation.getTrackAt(t); - clip.addTrack(track); - } - } - else - { - clip.addTrack(node.createStaticTransformTrack()); - } - collectAnimation(clip,node.nodes); - } - } - - public function clean() : void - { - this.objects = null; - this.hierarchy = null; - this.lights = null; - this.name_eL = null; - this.materials = null; - this.name_W6 = null; - } - - public function getObjectLayer(object:Object3D) : String - { - return this.name_W6[object]; - } - - private function init(data:XML, units:Number) : DaeDocument - { - this.clean(); - this.objects = new Vector.(); - this.hierarchy = new Vector.(); - this.lights = new Vector.(); - this.name_eL = new Vector.(); - this.materials = new Vector.(); - this.name_W6 = new Dictionary(true); - return new DaeDocument(data,units); - } - - public function parse(data:XML, baseURL:String = null, trimPaths:Boolean = false) : void - { - var i:int = 0; - var count:int = 0; - var document:DaeDocument = this.init(data,0); - if(document.scene != null) - { - this.parseNodes(document.scene.nodes,null,false); - this.parseMaterials(document.materials,baseURL,trimPaths); - for(i = 0,count = int(this.hierarchy.length); i < count; i++) - { - this.hierarchy[i].calculateBoundBox(); - } - } - } - - private function addObject(animatedObject:DaeObject, parent:Object3D, layer:String) : Object3D - { - var object:Object3D = Object3D(animatedObject.object); - this.objects.push(object); - if(parent == null) - { - this.hierarchy.push(object); - } - else - { - parent.addChild(object); - } - if(object is Light3D) - { - this.lights.push(Light3D(object)); - } - if(animatedObject.animation != null) - { - this.name_eL.push(animatedObject.animation); - } - if(Boolean(layer)) - { - this.name_W6[object] = layer; - } - return object; - } - - private function addObjects(animatedObjects:Vector., parent:Object3D, layer:String) : Object3D - { - var first:Object3D = this.addObject(animatedObjects[0],parent,layer); - for(var i:int = 1, count:int = int(animatedObjects.length); i < count; i++) - { - this.addObject(animatedObjects[i],parent,layer); - } - return first; - } - - private function hasSkinsInChildren(node:DaeNode) : Boolean - { - var child:DaeNode = null; - var nodes:Vector. = node.nodes; - for(var i:int = 0, count:int = int(nodes.length); i < count; ) - { - child = nodes[i]; - child.parse(); - if(child.skins != null) - { - return true; - } - if(this.hasSkinsInChildren(child)) - { - return true; - } - i++; - } - return false; - } - - private function parseNodes(nodes:Vector., parent:Object3D, skinsOnly:Boolean = false) : void - { - var node:DaeNode = null; - var container:Object3D = null; - for(var i:int = 0, count:int = int(nodes.length); i < count; ) - { - node = nodes[i]; - node.parse(); - container = null; - if(node.skins != null) - { - container = this.addObjects(node.skins,parent,node.layer); - } - else if(!skinsOnly && !node.skinOrTopmostJoint) - { - if(node.objects != null) - { - container = this.addObjects(node.objects,parent,node.layer); - } - else - { - container = new Object3D(); - container.name = node.cloneString(node.name); - this.addObject(node.applyAnimation(node.applyTransformations(container)),parent,node.layer); - } - } - else if(this.hasSkinsInChildren(node)) - { - container = new Object3D(); - container.name = node.cloneString(node.name); - this.addObject(node.applyAnimation(node.applyTransformations(container)),parent,node.layer); - this.parseNodes(node.nodes,container,skinsOnly || node.skinOrTopmostJoint); - } - if(container != null) - { - this.parseNodes(node.nodes,container,skinsOnly || node.skinOrTopmostJoint); - } - i++; - } - } - - private function trimPath(path:String) : String - { - var index:int = int(path.lastIndexOf("/")); - return index < 0 ? path : path.substr(index + 1); - } - - private function parseMaterials(materials:Object, baseURL:String, trimPaths:Boolean) : void - { - var tmaterial:ParserMaterial = null; - var material:DaeMaterial = null; - var resource:ExternalTextureResource = null; - var base:String = null; - var end:int = 0; - for each(material in materials) - { - if(material.used) - { - material.parse(); - this.materials.push(material.material); - } - } - if(trimPaths) - { - for each(tmaterial in this.materials) - { - for each(resource in tmaterial.textures) - { - if(resource != null && resource.url != null) - { - resource.url = this.trimPath(this.fixURL(resource.url)); - } - } - } - } - else - { - for each(tmaterial in this.materials) - { - for each(resource in tmaterial.textures) - { - if(resource != null && resource.url != null) - { - resource.url = this.fixURL(resource.url); - } - } - } - } - if(baseURL != null) - { - baseURL = this.fixURL(baseURL); - end = int(baseURL.lastIndexOf("/")); - base = end < 0 ? "" : baseURL.substr(0,end); - for each(tmaterial in this.materials) - { - for each(resource in tmaterial.textures) - { - if(resource != null && resource.url != null) - { - resource.url = this.resolveURL(resource.url,base); - } - } - } - } - } - - private function fixURL(url:String) : String - { - var pathStart:int = int(url.indexOf("://")); - pathStart = pathStart < 0 ? 0 : pathStart + 3; - var pathEnd:int = int(url.indexOf("?",pathStart)); - pathEnd = pathEnd < 0 ? int(url.indexOf("#",pathStart)) : pathEnd; - var path:String = url.substring(pathStart,pathEnd < 0 ? 2147483647 : pathEnd); - path = path.replace(/\\/g,"/"); - var fileIndex:int = int(url.indexOf("file://")); - if(fileIndex >= 0) - { - if(url.charAt(pathStart) == "/") - { - return "file://" + path + (pathEnd >= 0 ? url.substring(pathEnd) : ""); - } - return "file:///" + path + (pathEnd >= 0 ? url.substring(pathEnd) : ""); - } - return url.substring(0,pathStart) + path + (pathEnd >= 0 ? url.substring(pathEnd) : ""); - } - - private function mergePath(path:String, base:String, relative:Boolean = false) : String - { - var part:String = null; - var basePart:String = null; - var baseParts:Array = base.split("/"); - var parts:Array = path.split("/"); - for(var i:int = 0, count:int = int(parts.length); i < count; i++) - { - part = parts[i]; - if(part == "..") - { - basePart = baseParts.pop(); - while(basePart == "." || basePart == "" && basePart != null) - { - basePart = baseParts.pop(); - } - if(relative) - { - if(basePart == "..") - { - baseParts.push("..",".."); - } - else if(basePart == null) - { - baseParts.push(".."); - } - } - } - else - { - baseParts.push(part); - } - } - return baseParts.join("/"); - } - - private function resolveURL(url:String, base:String) : String - { - var queryAndFragmentIndex:int = 0; - var path:String = null; - var queryAndFragment:String = null; - var bPath:String = null; - var bSlashIndex:int = 0; - var bShemeIndex:int = 0; - var bAuthorityIndex:int = 0; - var bSheme:String = null; - var _loc13_:String = null; - if(base == "") - { - return url; - } - if(url.charAt(0) == "." && url.charAt(1) == "/") - { - return base + url.substr(1); - } - if(url.charAt(0) == "/") - { - return url; - } - if(url.charAt(0) == "." && url.charAt(1) == ".") - { - queryAndFragmentIndex = int(url.indexOf("?")); - queryAndFragmentIndex = queryAndFragmentIndex < 0 ? int(url.indexOf("#")) : queryAndFragmentIndex; - if(queryAndFragmentIndex < 0) - { - queryAndFragment = ""; - path = url; - } - else - { - queryAndFragment = url.substring(queryAndFragmentIndex); - path = url.substring(0,queryAndFragmentIndex); - } - bSlashIndex = int(base.indexOf("/")); - bShemeIndex = int(base.indexOf(":")); - bAuthorityIndex = int(base.indexOf("//")); - if(bAuthorityIndex < 0 || bAuthorityIndex > bSlashIndex) - { - if(bShemeIndex >= 0 && bShemeIndex < bSlashIndex) - { - bSheme = base.substring(0,bShemeIndex + 1); - bPath = base.substring(bShemeIndex + 1); - if(bPath.charAt(0) == "/") - { - return bSheme + "/" + this.mergePath(path,bPath.substring(1),false) + queryAndFragment; - } - return bSheme + this.mergePath(path,bPath,false) + queryAndFragment; - } - if(base.charAt(0) == "/") - { - return "/" + this.mergePath(path,base.substring(1),false) + queryAndFragment; - } - return this.mergePath(path,base,true) + queryAndFragment; - } - bSlashIndex = int(base.indexOf("/",bAuthorityIndex + 2)); - if(bSlashIndex >= 0) - { - _loc13_ = base.substring(0,bSlashIndex + 1); - bPath = base.substring(bSlashIndex + 1); - return _loc13_ + this.mergePath(path,bPath,false) + queryAndFragment; - } - _loc13_ = base; - return _loc13_ + "/" + this.mergePath(path,"",false); - } - var shemeIndex:int = int(url.indexOf(":")); - var slashIndex:int = int(url.indexOf("/")); - if(shemeIndex >= 0 && (shemeIndex < slashIndex || slashIndex < 0)) - { - return url; - } - return base + "/" + url; - } - - public function getObjectByName(name:String) : Object3D - { - var object:Object3D = null; - for each(object in this.objects) - { - if(object.name == name) - { - return object; - } - } - return null; - } - - public function getAnimationByObject(object:Object) : AnimationClip - { - var animation:AnimationClip = null; - var objects:Array = null; - for each(animation in this.name_eL) - { - objects = animation.name_Kq; - if(objects.indexOf(object) >= 0) - { - return animation; - } - } - return null; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/ParserMaterial.as b/src/alternativa/engine3d/loaders/ParserMaterial.as deleted file mode 100644 index f46afed..0000000 --- a/src/alternativa/engine3d/loaders/ParserMaterial.as +++ /dev/null @@ -1,86 +0,0 @@ -package alternativa.engine3d.loaders -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.materials.*; - import alternativa.engine3d.objects.Surface; - import alternativa.engine3d.resources.ExternalTextureResource; - import alternativa.engine3d.resources.Geometry; - import alternativa.engine3d.resources.TextureResource; - import avmplus.getQualifiedClassName; - import flash.utils.Dictionary; - import flash.utils.getDefinitionByName; - - use namespace alternativa3d; - - public class ParserMaterial extends Material - { - public var colors:Object; - - public var textures:Object; - - public var transparency:Number = 0; - - public var name_3m:String = "diffuse"; - - private var textureMaterial:TextureMaterial; - - private var name_h7:FillMaterial; - - public function ParserMaterial() - { - super(); - this.textures = new Object(); - this.colors = new Object(); - } - - override alternativa3d function fillResources(resources:Dictionary, resourceType:Class) : void - { - var texture:TextureResource = null; - super.alternativa3d::fillResources(resources,resourceType); - for each(texture in this.textures) - { - if(texture != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(texture)) as Class,resourceType))) - { - resources[texture] = true; - } - } - } - - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void - { - var map:ExternalTextureResource = null; - var colorO:Object = this.colors[this.name_3m]; - if(colorO != null) - { - if(this.name_h7 == null) - { - this.name_h7 = new FillMaterial(int(colorO)); - } - else - { - this.name_h7.color = int(colorO); - } - this.name_h7.alternativa3d::collectDraws(camera,surface,geometry,lights,lightsLength,objectRenderPriority); - } - else - { - map = this.textures[this.name_3m]; - if(map != null) - { - if(this.textureMaterial == null) - { - this.textureMaterial = new TextureMaterial(map); - } - else - { - this.textureMaterial.diffuseMap = map; - } - this.textureMaterial.alternativa3d::collectDraws(camera,surface,geometry,lights,lightsLength,objectRenderPriority); - } - } - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeArray.as b/src/alternativa/engine3d/loaders/collada/DaeArray.as deleted file mode 100644 index 7040c12..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeArray.as +++ /dev/null @@ -1,39 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - use namespace collada; - - public class DaeArray extends DaeElement - { - public var array:Array; - - public function DaeArray(data:XML, document:DaeDocument) - { - super(data,document); - } - - public function get type() : String - { - return String(data.localName()); - } - - override protected function parseImplementation() : Boolean - { - var count:int = 0; - this.array = parseStringArray(data); - var countXML:XML = data.@count[0]; - if(countXML != null) - { - count = int(parseInt(countXML.toString(),10)); - if(this.array.length < count) - { - document.logger.logNotEnoughDataError(data.@count[0]); - return false; - } - this.array.length = count; - return true; - } - return false; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeChannel.as b/src/alternativa/engine3d/loaders/collada/DaeChannel.as deleted file mode 100644 index f477eec..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeChannel.as +++ /dev/null @@ -1,232 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.animation.keys.NumberKey; - import alternativa.engine3d.animation.keys.NumberTrack; - import alternativa.engine3d.animation.keys.Track; - - use namespace alternativa3d; - - public class DaeChannel extends DaeElement - { - public static const PARAM_UNDEFINED:String = "undefined"; - - public static const PARAM_TRANSLATE_X:String = "x"; - - public static const PARAM_TRANSLATE_Y:String = "y"; - - public static const PARAM_TRANSLATE_Z:String = "z"; - - public static const PARAM_SCALE_X:String = "scaleX"; - - public static const PARAM_SCALE_Y:String = "scaleY"; - - public static const PARAM_SCALE_Z:String = "scaleZ"; - - public static const PARAM_ROTATION_X:String = "rotationX"; - - public static const PARAM_ROTATION_Y:String = "rotationY"; - - public static const PARAM_ROTATION_Z:String = "rotationZ"; - - public static const PARAM_TRANSLATE:String = "translate"; - - public static const PARAM_SCALE:String = "scale"; - - public static const PARAM_MATRIX:String = "matrix"; - - public var tracks:Vector.; - - public var name_dS:String = "undefined"; - - public var animName:String; - - public function DaeChannel(data:XML, document:DaeDocument) - { - super(data,document); - } - - public function get node() : DaeNode - { - var targetParts:Array = null; - var node:DaeNode = null; - var i:int = 0; - var count:int = 0; - var sid:String = null; - var targetXML:XML = data.@target[0]; - if(targetXML != null) - { - targetParts = targetXML.toString().split("/"); - node = document.findNodeByID(targetParts[0]); - if(node != null) - { - targetParts.pop(); - for(i = 1,count = int(targetParts.length); i < count; ) - { - sid = targetParts[i]; - node = node.getNodeBySid(sid); - if(node == null) - { - return null; - } - i++; - } - return node; - } - } - return null; - } - - override protected function parseImplementation() : Boolean - { - this.parseTransformationType(); - this.parseSampler(); - return true; - } - - private function parseTransformationType() : void - { - var transformationXML:XML = null; - var child:XML = null; - var attr:XML = null; - var componentName:String = null; - var axis:Array = null; - var targetXML:XML = data.@target[0]; - if(targetXML == null) - { - return; - } - var targetParts:Array = targetXML.toString().split("/"); - var sid:String = targetParts.pop(); - var sidParts:Array = sid.split("."); - var sidPartsCount:int = int(sidParts.length); - var node:DaeNode = this.node; - if(node == null) - { - return; - } - this.animName = node.animName; - var children:XMLList = node.data.children(); - for(var i:int = 0, count:int = int(children.length()); i < count; ) - { - child = children[i]; - attr = child.@sid[0]; - if(attr != null && attr.toString() == sidParts[0]) - { - transformationXML = child; - break; - } - i++; - } - var transformationName:String = transformationXML != null ? transformationXML.localName() as String : null; - if(sidPartsCount > 1) - { - componentName = sidParts[1]; - loop1: - switch(transformationName) - { - case "translate": - switch(componentName) - { - case "X": - this.name_dS = PARAM_TRANSLATE_X; - break loop1; - case "Y": - this.name_dS = PARAM_TRANSLATE_Y; - break loop1; - case "Z": - this.name_dS = PARAM_TRANSLATE_Z; - } - break; - case "rotate": - axis = parseNumbersArray(transformationXML); - switch(axis.indexOf(1)) - { - case 0: - this.name_dS = PARAM_ROTATION_X; - break loop1; - case 1: - this.name_dS = PARAM_ROTATION_Y; - break loop1; - case 2: - this.name_dS = PARAM_ROTATION_Z; - } - break; - case "scale": - switch(componentName) - { - case "X": - this.name_dS = PARAM_SCALE_X; - break loop1; - case "Y": - this.name_dS = PARAM_SCALE_Y; - break loop1; - case "Z": - this.name_dS = PARAM_SCALE_Z; - } - } - } - else - { - switch(transformationName) - { - case "translate": - this.name_dS = PARAM_TRANSLATE; - break; - case "scale": - this.name_dS = PARAM_SCALE; - break; - case "matrix": - this.name_dS = PARAM_MATRIX; - } - } - } - - private function parseSampler() : void - { - var track:NumberTrack = null; - var toRad:Number = NaN; - var key:NumberKey = null; - var sampler:DaeSampler = document.findSampler(data.@source[0]); - if(sampler != null) - { - sampler.parse(); - if(this.name_dS == PARAM_MATRIX) - { - this.tracks = Vector.([sampler.parseTransformationTrack(this.animName)]); - return; - } - if(this.name_dS == PARAM_TRANSLATE) - { - this.tracks = sampler.parsePointsTracks(this.animName,"x","y","z"); - return; - } - if(this.name_dS == PARAM_SCALE) - { - this.tracks = sampler.parsePointsTracks(this.animName,"scaleX","scaleY","scaleZ"); - return; - } - if(this.name_dS == PARAM_ROTATION_X || this.name_dS == PARAM_ROTATION_Y || this.name_dS == PARAM_ROTATION_Z) - { - track = sampler.parseNumbersTrack(this.animName,this.name_dS); - toRad = Math.PI / 180; - for(key = track.name_ku; key != null; key = key.alternativa3d::next) - { - key.name_4O *= toRad; - } - this.tracks = Vector.([track]); - return; - } - if(this.name_dS == PARAM_TRANSLATE_X || this.name_dS == PARAM_TRANSLATE_Y || this.name_dS == PARAM_TRANSLATE_Z || this.name_dS == PARAM_SCALE_X || this.name_dS == PARAM_SCALE_Y || this.name_dS == PARAM_SCALE_Z) - { - this.tracks = Vector.([sampler.parseNumbersTrack(this.animName,this.name_dS)]); - } - } - else - { - document.logger.logNotFoundError(data.@source[0]); - } - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeController.as b/src/alternativa/engine3d/loaders/collada/DaeController.as deleted file mode 100644 index aa29a91..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeController.as +++ /dev/null @@ -1,634 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import alternativa.engine3d.*; - import alternativa.engine3d.animation.AnimationClip; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.loaders.ParserMaterial; - import alternativa.engine3d.objects.Joint; - import alternativa.engine3d.objects.Skin; - import alternativa.engine3d.resources.Geometry; - import flash.utils.ByteArray; - import flash.utils.Dictionary; - import flash.utils.Endian; - - use namespace collada; - use namespace alternativa3d; - - public class DaeController extends DaeElement - { - private var name_A6:Vector.>; - - private var name_2j:Array; - - private var indices:Array; - - private var name_4h:DaeInput; - - private var name_NK:DaeInput; - - private var name_5O:int; - - private var geometry:Geometry; - - private var primitives:Vector.; - - private var name_1U:int = 0; - - private var name_I:Vector.; - - public function DaeController(data:XML, document:DaeDocument) - { - super(data,document); - } - - private function get daeGeometry() : DaeGeometry - { - var geom:DaeGeometry = document.findGeometry(data.skin.@source[0]); - if(geom == null) - { - document.logger.logNotFoundError(data.@source[0]); - } - return geom; - } - - override protected function parseImplementation() : Boolean - { - var i:int = 0; - var j:int = 0; - var count:int = 0; - var vertices:Vector. = null; - var source:Geometry = null; - var localMaxJointsPerVertex:int = 0; - var attributes:Array = null; - var numSourceAttributes:int = 0; - var index:int = 0; - var numMappings:int = 0; - var sourceData:ByteArray = null; - var data:ByteArray = null; - var byteArray:ByteArray = null; - var attribute:int = 0; - var vertexWeightsXML:XML = this.data.skin.vertex_weights[0]; - if(vertexWeightsXML == null) - { - return false; - } - var vcountsXML:XML = vertexWeightsXML.vcount[0]; - if(vcountsXML == null) - { - return false; - } - this.name_2j = parseIntsArray(vcountsXML); - var indicesXML:XML = vertexWeightsXML.v[0]; - if(indicesXML == null) - { - return false; - } - this.indices = parseIntsArray(indicesXML); - this.parseInputs(); - this.parseJointsBindMatrices(); - for(i = 0; i < this.name_2j.length; ) - { - count = int(this.name_2j[i]); - if(this.name_1U < count) - { - this.name_1U = count; - } - i++; - } - var geom:DaeGeometry = this.daeGeometry; - this.name_I = this.getBindShapeMatrix(); - if(geom != null) - { - geom.parse(); - vertices = geom.name_FV; - source = geom.geometry; - localMaxJointsPerVertex = this.name_1U % 2 != 0 ? this.name_1U + 1 : this.name_1U; - this.geometry = new Geometry(); - this.geometry.alternativa3d::_indices = source.alternativa3d::_indices.slice(); - attributes = source.getVertexStreamAttributes(0); - numSourceAttributes = int(attributes.length); - index = numSourceAttributes; - for(i = 0; i < localMaxJointsPerVertex; i += 2) - { - attribute = int(VertexAttributes.JOINTS[int(i / 2)]); - attributes[int(index++)] = attribute; - attributes[int(index++)] = attribute; - attributes[int(index++)] = attribute; - attributes[int(index++)] = attribute; - } - numMappings = int(attributes.length); - sourceData = source.alternativa3d::_vertexStreams[0].data; - data = new ByteArray(); - data.endian = Endian.LITTLE_ENDIAN; - data.length = 4 * numMappings * source.alternativa3d::_numVertices; - sourceData.position = 0; - for(i = 0; i < source.alternativa3d::_numVertices; i++) - { - data.position = 4 * numMappings * i; - for(j = 0; j < numSourceAttributes; j++) - { - data.writeFloat(sourceData.readFloat()); - } - } - byteArray = this.createVertexBuffer(vertices,localMaxJointsPerVertex); - byteArray.position = 0; - for(i = 0; i < source.alternativa3d::_numVertices; i++) - { - data.position = 4 * (numMappings * i + numSourceAttributes); - for(j = 0; j < localMaxJointsPerVertex; j++) - { - data.writeFloat(byteArray.readFloat()); - data.writeFloat(byteArray.readFloat()); - } - } - this.geometry.addVertexStream(attributes); - this.geometry.alternativa3d::_vertexStreams[0].data = data; - this.geometry.alternativa3d::_numVertices = source.alternativa3d::_numVertices; - this.transformVertices(this.geometry); - this.primitives = geom.primitives; - } - return true; - } - - private function transformVertices(geometry:Geometry) : void - { - var x:Number = NaN; - var y:Number = NaN; - var z:Number = NaN; - var data:ByteArray = geometry.alternativa3d::_vertexStreams[0].data; - var numMappings:int = int(geometry.alternativa3d::_vertexStreams[0].attributes.length); - for(var i:int = 0; i < geometry.alternativa3d::_numVertices; i++) - { - data.position = 4 * numMappings * i; - x = Number(data.readFloat()); - y = Number(data.readFloat()); - z = Number(data.readFloat()); - data.position -= 12; - data.writeFloat(x * this.name_I[0] + y * this.name_I[1] + z * this.name_I[2] + this.name_I[3]); - data.writeFloat(x * this.name_I[4] + y * this.name_I[5] + z * this.name_I[6] + this.name_I[7]); - data.writeFloat(x * this.name_I[8] + y * this.name_I[9] + z * this.name_I[10] + this.name_I[11]); - } - } - - private function createVertexBuffer(vertices:Vector., localMaxJointsPerVertex:int) : ByteArray - { - var i:int = 0; - var count:int = 0; - var vertexOutIndices:Vector. = null; - var vertex:DaeVertex = null; - var vec:Vector. = null; - var jointsPerVertex:int = 0; - var j:int = 0; - var k:int = 0; - var index:int = 0; - var jointIndex:int = 0; - var weightIndex:int = 0; - var jointsOffset:int = this.name_4h.offset; - var weightsOffset:int = this.name_NK.offset; - var weightsSource:DaeSource = this.name_NK.prepareSource(1); - var weights:Vector. = weightsSource.numbers; - var weightsStride:int = weightsSource.stride; - var verticesDict:Dictionary = new Dictionary(); - var byteArray:ByteArray = new ByteArray(); - byteArray.length = vertices.length * localMaxJointsPerVertex * 8; - byteArray.endian = Endian.LITTLE_ENDIAN; - for(i = 0,count = int(vertices.length); i < count; i++) - { - vertex = vertices[i]; - if(vertex != null) - { - vec = verticesDict[vertex.name_Eq]; - if(vec == null) - { - vec = verticesDict[vertex.name_Eq] = new Vector.(); - } - vec.push(vertex.name_AR); - } - } - var vertexIndex:int = 0; - for(i = 0,count = int(this.name_2j.length); i < count; i++) - { - jointsPerVertex = int(this.name_2j[i]); - vertexOutIndices = verticesDict[i]; - for(j = 0; j < vertexOutIndices.length; j++) - { - byteArray.position = vertexOutIndices[j] * localMaxJointsPerVertex * 8; - for(k = 0; k < jointsPerVertex; k++) - { - index = this.name_5O * (vertexIndex + k); - jointIndex = int(this.indices[int(index + jointsOffset)]); - if(jointIndex >= 0) - { - byteArray.writeFloat(jointIndex * 3); - weightIndex = int(this.indices[int(index + weightsOffset)]); - byteArray.writeFloat(weights[int(weightsStride * weightIndex)]); - } - else - { - byteArray.position += 8; - } - } - } - vertexIndex += jointsPerVertex; - } - byteArray.position = 0; - return byteArray; - } - - private function parseInputs() : void - { - var input:DaeInput = null; - var semantic:String = null; - var offset:int = 0; - var inputsList:XMLList = data.skin.vertex_weights.input; - var maxInputOffset:int = 0; - for(var i:int = 0, count:int = int(inputsList.length()); i < count; offset = input.offset,maxInputOffset = offset > maxInputOffset ? offset : maxInputOffset,i++) - { - input = new DaeInput(inputsList[i],document); - semantic = input.semantic; - if(semantic == null) - { - continue; - } - switch(semantic) - { - case "JOINT": - if(this.name_4h == null) - { - this.name_4h = input; - } - break; - case "WEIGHT": - if(this.name_NK == null) - { - this.name_NK = input; - } - break; - } - } - this.name_5O = maxInputOffset + 1; - } - - private function parseJointsBindMatrices() : void - { - var jointsXML:XML = null; - var jointsSource:DaeSource = null; - var stride:int = 0; - var count:int = 0; - var i:int = 0; - var index:int = 0; - var matrix:Vector. = null; - var j:int = 0; - jointsXML = data.skin.joints.input.(@semantic == "INV_BIND_MATRIX")[0]; - if(jointsXML != null) - { - jointsSource = document.findSource(jointsXML.@source[0]); - if(jointsSource != null) - { - if(jointsSource.parse() && jointsSource.numbers != null && jointsSource.stride >= 16) - { - stride = jointsSource.stride; - count = jointsSource.numbers.length / stride; - this.name_A6 = new Vector.>(count); - for(i = 0; i < count; i++) - { - index = stride * i; - matrix = new Vector.(16); - this.name_A6[i] = matrix; - for(j = 0; j < 16; j++) - { - matrix[j] = jointsSource.numbers[int(index + j)]; - } - } - } - } - else - { - document.logger.logNotFoundError(jointsXML.@source[0]); - } - } - } - - public function parseSkin(materials:Object, topmostJoints:Vector., skeletons:Vector.) : DaeObject - { - var numJoints:int = 0; - var skin:Skin = null; - var joints:Vector. = null; - var i:int = 0; - var p:DaePrimitive = null; - var instanceMaterial:DaeInstanceMaterial = null; - var material:ParserMaterial = null; - var daeMaterial:DaeMaterial = null; - var skinXML:XML = data.skin[0]; - if(skinXML != null) - { - this.name_I = this.getBindShapeMatrix(); - numJoints = int(this.name_A6.length); - skin = new Skin(this.name_1U,numJoints); - skin.geometry = this.geometry; - joints = this.addJointsToSkin(skin,topmostJoints,this.findNodes(skeletons)); - this.setJointsBindMatrices(joints); - skin.name_WA = this.collectRenderedJoints(joints,numJoints); - if(this.primitives != null) - { - for(i = 0; i < this.primitives.length; i++) - { - p = this.primitives[i]; - instanceMaterial = materials[p.materialSymbol]; - if(instanceMaterial != null) - { - daeMaterial = instanceMaterial.material; - if(daeMaterial != null) - { - daeMaterial.parse(); - material = daeMaterial.material; - daeMaterial.used = true; - } - } - skin.addSurface(material,p.indexBegin,p.numTriangles); - } - } - return new DaeObject(skin,this.mergeJointsClips(skin,joints)); - } - return null; - } - - private function collectRenderedJoints(joints:Vector., numJoints:int) : Vector. - { - var result:Vector. = new Vector.(); - for(var i:int = 0; i < numJoints; i++) - { - result[i] = Joint(joints[i].object); - } - return result; - } - - private function mergeJointsClips(skin:Skin, joints:Vector.) : AnimationClip - { - var animatedObject:DaeObject = null; - var clip:AnimationClip = null; - var object:Object3D = null; - var t:int = 0; - if(!this.hasJointsAnimation(joints)) - { - return null; - } - var result:AnimationClip = new AnimationClip(); - var resultObjects:Array = [skin]; - for(var i:int = 0, count:int = int(joints.length); i < count; i++) - { - animatedObject = joints[i]; - clip = animatedObject.animation; - if(clip != null) - { - for(t = 0; t < clip.numTracks; t++) - { - result.addTrack(clip.getTrackAt(t)); - } - } - else - { - result.addTrack(animatedObject.jointNode.createStaticTransformTrack()); - } - object = animatedObject.object; - object.name = animatedObject.jointNode.animName; - resultObjects.push(object); - } - result.name_Kq = resultObjects; - return result; - } - - private function hasJointsAnimation(joints:Vector.) : Boolean - { - var object:DaeObject = null; - for(var i:int = 0, count:int = int(joints.length); i < count; ) - { - object = joints[i]; - if(object.animation != null) - { - return true; - } - i++; - } - return false; - } - - private function setJointsBindMatrices(animatedJoints:Vector.) : void - { - var animatedJoint:DaeObject = null; - var bindMatrix:Vector. = null; - for(var i:int = 0, count:int = int(this.name_A6.length); i < count; i++) - { - animatedJoint = animatedJoints[i]; - bindMatrix = this.name_A6[i]; - Joint(animatedJoint.object).alternativa3d::setBindPoseMatrix(bindMatrix); - } - } - - private function addJointsToSkin(skin:Skin, topmostJoints:Vector., nodes:Vector.) : Vector. - { - var i:int = 0; - var topmostJoint:DaeNode = null; - var animatedJoint:DaeObject = null; - var nodesDictionary:Dictionary = new Dictionary(); - var count:int = int(nodes.length); - for(i = 0; i < count; i++) - { - nodesDictionary[nodes[i]] = i; - } - var animatedJoints:Vector. = new Vector.(count); - var numTopmostJoints:int = int(topmostJoints.length); - for(i = 0; i < numTopmostJoints; i++) - { - topmostJoint = topmostJoints[i]; - animatedJoint = this.addRootJointToSkin(skin,topmostJoint,animatedJoints,nodesDictionary); - this.addJointChildren(Joint(animatedJoint.object),animatedJoints,topmostJoint,nodesDictionary); - } - return animatedJoints; - } - - private function addRootJointToSkin(skin:Skin, node:DaeNode, animatedJoints:Vector., nodes:Dictionary) : DaeObject - { - var joint:Joint = new Joint(); - joint.name = cloneString(node.name); - skin.addChild(joint); - var animatedJoint:DaeObject = node.applyAnimation(node.applyTransformations(joint)); - animatedJoint.jointNode = node; - if(node in nodes) - { - animatedJoints[nodes[node]] = animatedJoint; - } - else - { - animatedJoints.push(animatedJoint); - } - return animatedJoint; - } - - private function addJointChildren(parent:Joint, animatedJoints:Vector., parentNode:DaeNode, nodes:Dictionary) : void - { - var object:DaeObject = null; - var child:DaeNode = null; - var joint:Joint = null; - var children:Vector. = parentNode.nodes; - for(var i:int = 0, count:int = int(children.length); i < count; ) - { - child = children[i]; - if(child in nodes) - { - joint = new Joint(); - joint.name = cloneString(child.name); - object = child.applyAnimation(child.applyTransformations(joint)); - object.jointNode = child; - animatedJoints[nodes[child]] = object; - parent.addChild(joint); - this.addJointChildren(joint,animatedJoints,child,nodes); - } - else if(this.hasJointInDescendants(child,nodes)) - { - joint = new Joint(); - joint.name = cloneString(child.name); - object = child.applyAnimation(child.applyTransformations(joint)); - object.jointNode = child; - animatedJoints.push(object); - parent.addChild(joint); - this.addJointChildren(joint,animatedJoints,child,nodes); - } - i++; - } - } - - private function hasJointInDescendants(parentNode:DaeNode, nodes:Dictionary) : Boolean - { - var child:DaeNode = null; - var children:Vector. = parentNode.nodes; - for(var i:int = 0, count:int = int(children.length); i < count; ) - { - child = children[i]; - if(child in nodes || this.hasJointInDescendants(child,nodes)) - { - return true; - } - i++; - } - return false; - } - - private function getBindShapeMatrix() : Vector. - { - var matrix:Array = null; - var i:int = 0; - var matrixXML:XML = data.skin.bind_shape_matrix[0]; - var res:Vector. = new Vector.(16,true); - if(matrixXML != null) - { - matrix = parseStringArray(matrixXML); - for(i = 0; i < matrix.length; i++) - { - res[i] = Number(matrix[i]); - } - } - return res; - } - - private function isRootJointNode(node:DaeNode, nodes:Dictionary) : Boolean - { - for(var parent:DaeNode = node.parent; parent != null; ) - { - if(parent in nodes) - { - return false; - } - parent = parent.parent; - } - return true; - } - - public function findRootJointNodes(skeletons:Vector.) : Vector. - { - var nodesDictionary:Dictionary = null; - var rootNodes:Vector. = null; - var node:DaeNode = null; - var nodes:Vector. = this.findNodes(skeletons); - var i:int = 0; - var count:int = int(nodes.length); - if(count > 0) - { - nodesDictionary = new Dictionary(); - for(i = 0; i < count; i++) - { - nodesDictionary[nodes[i]] = i; - } - rootNodes = new Vector.(); - for(i = 0; i < count; ) - { - node = nodes[i]; - if(this.isRootJointNode(node,nodesDictionary)) - { - rootNodes.push(node); - } - i++; - } - return rootNodes; - } - return null; - } - - private function findNode(nodeName:String, skeletons:Vector.) : DaeNode - { - var node:DaeNode = null; - var count:int = int(skeletons.length); - for(var i:int = 0; i < count; ) - { - node = skeletons[i].getNodeBySid(nodeName); - if(node != null) - { - return node; - } - i++; - } - return null; - } - - private function findNodes(skeletons:Vector.) : Vector. - { - var jointsXML:XML = null; - var jointsSource:DaeSource = null; - var stride:int = 0; - var count:int = 0; - var nodes:Vector. = null; - var i:int = 0; - var node:DaeNode = null; - jointsXML = data.skin.joints.input.(@semantic == "JOINT")[0]; - if(jointsXML != null) - { - jointsSource = document.findSource(jointsXML.@source[0]); - if(jointsSource != null) - { - if(jointsSource.parse() && jointsSource.names != null) - { - stride = jointsSource.stride; - count = jointsSource.names.length / stride; - nodes = new Vector.(count); - for(i = 0; i < count; i++) - { - node = this.findNode(jointsSource.names[int(stride * i)],skeletons); - if(node == null) - { - } - nodes[i] = node; - } - return nodes; - } - } - else - { - document.logger.logNotFoundError(jointsXML.@source[0]); - } - } - return null; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeDocument.as b/src/alternativa/engine3d/loaders/collada/DaeDocument.as deleted file mode 100644 index 284c998..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeDocument.as +++ /dev/null @@ -1,287 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - use namespace collada; - - public class DaeDocument - { - public var scene:DaeVisualScene; - - private var data:XML; - - internal var name_DR:Object; - - internal var arrays:Object; - - internal var vertices:Object; - - public var geometries:Object; - - internal var nodes:Object; - - internal var lights:Object; - - internal var images:Object; - - internal var effects:Object; - - internal var name_DW:Object; - - internal var name_GB:Object; - - public var materials:Object; - - internal var logger:DaeLogger; - - public var versionMajor:uint; - - public var versionMinor:uint; - - public var unitScaleFactor:Number = 1; - - public function DaeDocument(document:XML, units:Number) - { - super(); - this.data = document; - var versionComponents:Array = this.data.@version[0].toString().split(/[.,]/); - this.versionMajor = parseInt(versionComponents[1],10); - this.versionMinor = parseInt(versionComponents[2],10); - var colladaUnit:Number = Number(parseFloat(this.data.asset[0].unit[0].@meter)); - if(units > 0) - { - this.unitScaleFactor = colladaUnit / units; - } - else - { - this.unitScaleFactor = 1; - } - this.logger = new DaeLogger(); - this.constructStructures(); - this.constructScenes(); - this.registerInstanceControllers(); - this.constructAnimations(); - } - - private function getLocalID(url:XML) : String - { - var path:String = url.toString(); - if(path.charAt(0) == "#") - { - return path.substr(1); - } - this.logger.logExternalError(url); - return null; - } - - private function constructStructures() : void - { - var element:XML = null; - var source:DaeSource = null; - var light:DaeLight = null; - var image:DaeImage = null; - var effect:DaeEffect = null; - var material:DaeMaterial = null; - var geom:DaeGeometry = null; - var controller:DaeController = null; - var node:DaeNode = null; - this.name_DR = new Object(); - this.arrays = new Object(); - for each(element in this.data..source) - { - source = new DaeSource(element,this); - if(source.id != null) - { - this.name_DR[source.id] = source; - } - } - this.lights = new Object(); - for each(element in this.data.library_lights.light) - { - light = new DaeLight(element,this); - if(light.id != null) - { - this.lights[light.id] = light; - } - } - this.images = new Object(); - for each(element in this.data.library_images.image) - { - image = new DaeImage(element,this); - if(image.id != null) - { - this.images[image.id] = image; - } - } - this.effects = new Object(); - for each(element in this.data.library_effects.effect) - { - effect = new DaeEffect(element,this); - if(effect.id != null) - { - this.effects[effect.id] = effect; - } - } - this.materials = new Object(); - for each(element in this.data.library_materials.material) - { - material = new DaeMaterial(element,this); - if(material.id != null) - { - this.materials[material.id] = material; - } - } - this.geometries = new Object(); - this.vertices = new Object(); - for each(element in this.data.library_geometries.geometry) - { - geom = new DaeGeometry(element,this); - if(geom.id != null) - { - this.geometries[geom.id] = geom; - } - } - this.name_DW = new Object(); - for each(element in this.data.library_controllers.controller) - { - controller = new DaeController(element,this); - if(controller.id != null) - { - this.name_DW[controller.id] = controller; - } - } - this.nodes = new Object(); - for each(element in this.data.library_nodes.node) - { - node = new DaeNode(element,this); - if(node.id != null) - { - this.nodes[node.id] = node; - } - } - } - - private function constructScenes() : void - { - var element:XML = null; - var vscene:DaeVisualScene = null; - var vsceneURL:XML = this.data.scene.instance_visual_scene.@url[0]; - var vsceneID:String = this.getLocalID(vsceneURL); - for each(element in this.data.library_visual_scenes.visual_scene) - { - vscene = new DaeVisualScene(element,this); - if(vscene.id == vsceneID) - { - this.scene = vscene; - } - } - if(vsceneID != null && this.scene == null) - { - this.logger.logNotFoundError(vsceneURL); - } - } - - private function registerInstanceControllers() : void - { - var i:int = 0; - var count:int = 0; - if(this.scene != null) - { - for(i = 0,count = int(this.scene.nodes.length); i < count; i++) - { - this.scene.nodes[i].registerInstanceControllers(); - } - } - } - - private function constructAnimations() : void - { - var element:XML = null; - var sampler:DaeSampler = null; - var channel:DaeChannel = null; - var node:DaeNode = null; - this.name_GB = new Object(); - for each(element in this.data.library_animations..sampler) - { - sampler = new DaeSampler(element,this); - if(sampler.id != null) - { - this.name_GB[sampler.id] = sampler; - } - } - for each(element in this.data.library_animations..channel) - { - channel = new DaeChannel(element,this); - node = channel.node; - if(node != null) - { - node.addChannel(channel); - } - } - } - - public function findArray(url:XML) : DaeArray - { - return this.arrays[this.getLocalID(url)]; - } - - public function findSource(url:XML) : DaeSource - { - return this.name_DR[this.getLocalID(url)]; - } - - public function findLight(url:XML) : DaeLight - { - return this.lights[this.getLocalID(url)]; - } - - public function findImage(url:XML) : DaeImage - { - return this.images[this.getLocalID(url)]; - } - - public function findImageByID(id:String) : DaeImage - { - return this.images[id]; - } - - public function findEffect(url:XML) : DaeEffect - { - return this.effects[this.getLocalID(url)]; - } - - public function findMaterial(url:XML) : DaeMaterial - { - return this.materials[this.getLocalID(url)]; - } - - public function findVertices(url:XML) : DaeVertices - { - return this.vertices[this.getLocalID(url)]; - } - - public function findGeometry(url:XML) : DaeGeometry - { - return this.geometries[this.getLocalID(url)]; - } - - public function findNode(url:XML) : DaeNode - { - return this.nodes[this.getLocalID(url)]; - } - - public function findNodeByID(id:String) : DaeNode - { - return this.nodes[id]; - } - - public function findController(url:XML) : DaeController - { - return this.name_DW[this.getLocalID(url)]; - } - - public function findSampler(url:XML) : DaeSampler - { - return this.name_GB[this.getLocalID(url)]; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeEffect.as b/src/alternativa/engine3d/loaders/collada/DaeEffect.as deleted file mode 100644 index dc9d74c..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeEffect.as +++ /dev/null @@ -1,255 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import alternativa.engine3d.loaders.ParserMaterial; - import alternativa.engine3d.resources.ExternalTextureResource; - - use namespace collada; - - public class DaeEffect extends DaeElement - { - public static var commonAlways:Boolean = false; - - private var name_3x:Object; - - private var name_El:Object; - - private var name_3H:Object; - - private var diffuse:DaeEffectParam; - - private var ambient:DaeEffectParam; - - private var transparent:DaeEffectParam; - - private var transparency:DaeEffectParam; - - private var bump:DaeEffectParam; - - private var reflective:DaeEffectParam; - - private var emission:DaeEffectParam; - - private var specular:DaeEffectParam; - - public function DaeEffect(data:XML, document:DaeDocument) - { - super(data,document); - this.constructImages(); - } - - private function constructImages() : void - { - var element:XML = null; - var image:DaeImage = null; - var list:XMLList = data..image; - for each(element in list) - { - image = new DaeImage(element,document); - if(image.id != null) - { - document.images[image.id] = image; - } - } - } - - override protected function parseImplementation() : Boolean - { - var shader:XML; - var element:XML = null; - var param:DaeParam = null; - var technique:XML = null; - var bumpXML:XML = null; - var diffuseXML:XML = null; - var transparentXML:XML = null; - var transparencyXML:XML = null; - var ambientXML:XML = null; - var reflectiveXML:XML = null; - var emissionXML:XML = null; - var specularXML:XML = null; - this.name_3x = new Object(); - for each(element in data.newparam) - { - param = new DaeParam(element,document); - this.name_3x[param.sid] = param; - } - this.name_El = new Object(); - for each(element in data.profile_COMMON.newparam) - { - param = new DaeParam(element,document); - this.name_El[param.sid] = param; - } - this.name_3H = new Object(); - technique = data.profile_COMMON.technique[0]; - if(technique != null) - { - for each(element in technique.newparam) - { - param = new DaeParam(element,document); - this.name_3H[param.sid] = param; - } - } - shader = data.profile_COMMON.technique.*.(localName() == "constant" || localName() == "lambert" || localName() == "phong" || localName() == "blinn")[0]; - if(shader != null) - { - diffuseXML = null; - if(shader.localName() == "constant") - { - diffuseXML = shader.emission[0]; - } - else - { - diffuseXML = shader.diffuse[0]; - emissionXML = shader.emission[0]; - if(emissionXML != null) - { - this.emission = new DaeEffectParam(emissionXML,this); - } - } - if(diffuseXML != null) - { - this.diffuse = new DaeEffectParam(diffuseXML,this); - } - if(shader.localName() == "phong" || shader.localName() == "blinn") - { - specularXML = shader.specular[0]; - if(specularXML != null) - { - this.specular = new DaeEffectParam(specularXML,this); - } - } - transparentXML = shader.transparent[0]; - if(transparentXML != null) - { - this.transparent = new DaeEffectParam(transparentXML,this); - } - transparencyXML = shader.transparency[0]; - if(transparencyXML != null) - { - this.transparency = new DaeEffectParam(transparencyXML,this); - } - ambientXML = shader.ambient[0]; - if(ambientXML != null) - { - this.ambient = new DaeEffectParam(ambientXML,this); - } - reflectiveXML = shader.reflective[0]; - if(reflectiveXML != null) - { - this.reflective = new DaeEffectParam(reflectiveXML,this); - } - } - bumpXML = data.profile_COMMON.technique.extra.technique.(Boolean(hasOwnProperty("@profile")) && @profile == "OpenCOLLADA3dsMax").bump[0]; - if(bumpXML != null) - { - this.bump = new DaeEffectParam(bumpXML,this); - } - return true; - } - - internal function getParam(name:String, setparams:Object) : DaeParam - { - var param:DaeParam = setparams[name]; - if(param != null) - { - return param; - } - param = this.name_3H[name]; - if(param != null) - { - return param; - } - param = this.name_El[name]; - if(param != null) - { - return param; - } - return this.name_3x[name]; - } - - private function float4ToUint(value:Array, alpha:Boolean = true) : uint - { - var a:uint = 0; - var r:uint = value[0] * 255; - var g:uint = value[1] * 255; - var b:uint = value[2] * 255; - if(alpha) - { - a = value[3] * 255; - return a << 24 | r << 16 | g << 8 | b; - } - return r << 16 | g << 8 | b; - } - - public function getMaterial(setparams:Object) : ParserMaterial - { - var material:ParserMaterial = null; - if(this.diffuse != null) - { - material = new ParserMaterial(); - if(Boolean(this.diffuse)) - { - this.pushMap(material,this.diffuse,setparams); - } - if(this.specular != null) - { - this.pushMap(material,this.specular,setparams); - } - if(this.emission != null) - { - this.pushMap(material,this.emission,setparams); - } - if(this.transparency != null) - { - material.transparency = this.transparency.getFloat(setparams); - } - if(this.transparent != null) - { - this.pushMap(material,this.transparent,setparams); - } - if(this.bump != null) - { - this.pushMap(material,this.bump,setparams); - } - if(Boolean(this.ambient)) - { - this.pushMap(material,this.ambient,setparams); - } - if(Boolean(this.reflective)) - { - this.pushMap(material,this.reflective,setparams); - } - return material; - } - return null; - } - - private function pushMap(material:ParserMaterial, param:DaeEffectParam, setparams:Object) : void - { - var _loc5_:DaeImage = null; - var color:Array = param.getColor(setparams); - if(color != null) - { - material.colors[cloneString(param.data.localName())] = this.float4ToUint(color,true); - } - else - { - _loc5_ = param.getImage(setparams); - if(_loc5_ != null) - { - material.textures[cloneString(param.data.localName())] = new ExternalTextureResource(cloneString(_loc5_.init_from)); - } - } - } - - public function get mainTexCoords() : String - { - var channel:String = null; - channel = channel == null && this.diffuse != null ? this.diffuse.texCoord : channel; - channel = channel == null && this.transparent != null ? this.transparent.texCoord : channel; - channel = channel == null && this.bump != null ? this.bump.texCoord : channel; - channel = channel == null && this.emission != null ? this.emission.texCoord : channel; - return channel == null && this.specular != null ? this.specular.texCoord : channel; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeEffectParam.as b/src/alternativa/engine3d/loaders/collada/DaeEffectParam.as deleted file mode 100644 index 0562b91..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeEffectParam.as +++ /dev/null @@ -1,100 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - use namespace collada; - - public class DaeEffectParam extends DaeElement - { - private var effect:DaeEffect; - - public function DaeEffectParam(data:XML, effect:DaeEffect) - { - super(data,effect.document); - this.effect = effect; - } - - public function getFloat(setparams:Object) : Number - { - var param:DaeParam = null; - var floatXML:XML = data.float[0]; - if(floatXML != null) - { - return parseNumber(floatXML); - } - var paramRef:XML = data.param.@ref[0]; - if(paramRef != null) - { - param = this.effect.getParam(paramRef.toString(),setparams); - if(param != null) - { - return param.getFloat(); - } - } - return NaN; - } - - public function getColor(setparams:Object) : Array - { - var param:DaeParam = null; - var colorXML:XML = data.color[0]; - if(colorXML != null) - { - return parseNumbersArray(colorXML); - } - var paramRef:XML = data.param.@ref[0]; - if(paramRef != null) - { - param = this.effect.getParam(paramRef.toString(),setparams); - if(param != null) - { - return param.getFloat4(); - } - } - return null; - } - - private function get texture() : String - { - var attr:XML = data.texture.@texture[0]; - return attr == null ? null : attr.toString(); - } - - public function getSampler(setparams:Object) : DaeParam - { - var sid:String = this.texture; - if(sid != null) - { - return this.effect.getParam(sid,setparams); - } - return null; - } - - public function getImage(setparams:Object) : DaeImage - { - var surfaceSID:String = null; - var surface:DaeParam = null; - var sampler:DaeParam = this.getSampler(setparams); - if(sampler != null) - { - surfaceSID = sampler.surfaceSID; - if(surfaceSID != null) - { - surface = this.effect.getParam(surfaceSID,setparams); - if(surface != null) - { - return surface.image; - } - return null; - } - return sampler.image; - } - return document.findImageByID(this.texture); - } - - public function get texCoord() : String - { - var attr:XML = data.texture.@texcoord[0]; - return attr == null ? null : attr.toString(); - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeElement.as b/src/alternativa/engine3d/loaders/collada/DaeElement.as deleted file mode 100644 index 3da304f..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeElement.as +++ /dev/null @@ -1,109 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import flash.utils.ByteArray; - - use namespace collada; - - public class DaeElement - { - private static var _byteArray:ByteArray = new ByteArray(); - - public var document:DaeDocument; - - public var data:XML; - - private var name_Ba:int = -1; - - public function DaeElement(data:XML, document:DaeDocument) - { - super(); - this.document = document; - this.data = data; - } - - public function cloneString(str:String) : String - { - if(str == null) - { - return null; - } - _byteArray.position = 0; - _byteArray.writeUTF(str); - _byteArray.position = 0; - return _byteArray.readUTF(); - } - - public function parse() : Boolean - { - if(this.name_Ba < 0) - { - this.name_Ba = this.parseImplementation() ? 1 : 0; - return this.name_Ba != 0; - } - return this.name_Ba != 0; - } - - protected function parseImplementation() : Boolean - { - return true; - } - - protected function parseStringArray(element:XML) : Array - { - return element.text().toString().split(/\s+/); - } - - protected function parseNumbersArray(element:XML) : Array - { - var value:String = null; - var arr:Array = element.text().toString().split(/\s+/); - for(var i:int = 0, count:int = int(arr.length); i < count; i++) - { - value = arr[i]; - if(value.indexOf(",") != -1) - { - value = value.replace(/,/,"."); - } - arr[i] = parseFloat(value); - } - return arr; - } - - protected function parseIntsArray(element:XML) : Array - { - var value:String = null; - var arr:Array = element.text().toString().split(/\s+/); - for(var i:int = 0, count:int = int(arr.length); i < count; i++) - { - value = arr[i]; - arr[i] = parseInt(value,10); - } - return arr; - } - - protected function parseNumber(element:XML) : Number - { - var value:String = element.toString().replace(/,/,"."); - return parseFloat(value); - } - - public function get id() : String - { - var idXML:XML = this.data.@id[0]; - return idXML == null ? null : idXML.toString(); - } - - public function get sid() : String - { - var attr:XML = this.data.@sid[0]; - return attr == null ? null : attr.toString(); - } - - public function get name() : String - { - var nameXML:XML = this.data.@name[0]; - return nameXML == null ? null : nameXML.toString(); - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeGeometry.as b/src/alternativa/engine3d/loaders/collada/DaeGeometry.as deleted file mode 100644 index 42b1d79..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeGeometry.as +++ /dev/null @@ -1,209 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.loaders.ParserMaterial; - import alternativa.engine3d.objects.Mesh; - import alternativa.engine3d.resources.Geometry; - import flash.utils.ByteArray; - import flash.utils.Endian; - - use namespace collada; - use namespace alternativa3d; - - public class DaeGeometry extends DaeElement - { - internal var name_FV:Vector.; - - internal var primitives:Vector.; - - internal var geometry:Geometry; - - private var vertices:DaeVertices; - - public function DaeGeometry(data:XML, document:DaeDocument) - { - super(data,document); - this.constructVertices(); - } - - private function constructVertices() : void - { - var verticesXML:XML = data.mesh.vertices[0]; - if(verticesXML != null) - { - this.vertices = new DaeVertices(verticesXML,document); - document.vertices[this.vertices.id] = this.vertices; - } - } - - override protected function parseImplementation() : Boolean - { - var numVertices:int = 0; - var i:int = 0; - var p:DaePrimitive = null; - var channels:uint = 0; - var attributes:Array = null; - var index:int = 0; - var data:ByteArray = null; - var numMappings:int = 0; - var vertex:DaeVertex = null; - var j:int = 0; - if(this.vertices != null) - { - this.parsePrimitives(); - this.vertices.parse(); - numVertices = this.vertices.name_E6.numbers.length / this.vertices.name_E6.stride; - this.geometry = new Geometry(); - this.name_FV = new Vector.(numVertices); - channels = 0; - for(i = 0; i < this.primitives.length; ) - { - p = this.primitives[i]; - p.parse(); - if(p.verticesEquals(this.vertices)) - { - numVertices = int(this.name_FV.length); - channels |= p.fillGeometry(this.geometry,this.name_FV); - } - i++; - } - attributes = new Array(3); - attributes[0] = VertexAttributes.POSITION; - attributes[1] = VertexAttributes.POSITION; - attributes[2] = VertexAttributes.POSITION; - index = 3; - if(Boolean(channels & DaePrimitive.NORMALS)) - { - var _loc11_:* = index++; - attributes[_loc11_] = VertexAttributes.NORMAL; - var _loc12_:* = index++; - attributes[_loc12_] = VertexAttributes.NORMAL; - var _loc13_:* = index++; - attributes[_loc13_] = VertexAttributes.NORMAL; - } - if(Boolean(channels & DaePrimitive.TANGENT4)) - { - _loc11_ = index++; - attributes[_loc11_] = VertexAttributes.TANGENT4; - _loc12_ = index++; - attributes[_loc12_] = VertexAttributes.TANGENT4; - _loc13_ = index++; - attributes[_loc13_] = VertexAttributes.TANGENT4; - var _loc14_:* = index++; - attributes[_loc14_] = VertexAttributes.TANGENT4; - } - for(i = 0; i < 8; ) - { - if(Boolean(channels & DaePrimitive.TEXCOORDS[i])) - { - _loc11_ = index++; - attributes[_loc11_] = VertexAttributes.TEXCOORDS[i]; - _loc12_ = index++; - attributes[_loc12_] = VertexAttributes.TEXCOORDS[i]; - } - i++; - } - this.geometry.addVertexStream(attributes); - numVertices = int(this.name_FV.length); - data = new ByteArray(); - data.endian = Endian.LITTLE_ENDIAN; - numMappings = int(attributes.length); - data.length = 4 * numMappings * numVertices; - for(i = 0; i < numVertices; ) - { - vertex = this.name_FV[i]; - if(vertex != null) - { - data.position = 4 * numMappings * i; - data.writeFloat(vertex.x); - data.writeFloat(vertex.y); - data.writeFloat(vertex.z); - if(vertex.normal != null) - { - data.writeFloat(vertex.normal.x); - data.writeFloat(vertex.normal.y); - data.writeFloat(vertex.normal.z); - } - if(vertex.name_hC != null) - { - data.writeFloat(vertex.name_hC.x); - data.writeFloat(vertex.name_hC.y); - data.writeFloat(vertex.name_hC.z); - data.writeFloat(vertex.name_hC.w); - } - for(j = 0; j < vertex.uvs.length; ) - { - data.writeFloat(vertex.uvs[j]); - j++; - } - } - i++; - } - this.geometry.alternativa3d::_vertexStreams[0].data = data; - this.geometry.alternativa3d::_numVertices = numVertices; - return true; - } - return false; - } - - private function parsePrimitives() : void - { - var child:XML = null; - var _loc5_:DaePrimitive = null; - this.primitives = new Vector.(); - var children:XMLList = data.mesh.children(); - for(var i:int = 0, count:int = int(children.length()); i < count; ) - { - child = children[i]; - switch(child.localName()) - { - case "polygons": - case "polylist": - case "triangles": - case "trifans": - case "tristrips": - _loc5_ = new DaePrimitive(child,document); - this.primitives.push(_loc5_); - break; - } - i++; - } - } - - public function parseMesh(materials:Object) : Mesh - { - var mesh:Mesh = null; - var i:int = 0; - var p:DaePrimitive = null; - var instanceMaterial:DaeInstanceMaterial = null; - var material:ParserMaterial = null; - var daeMaterial:DaeMaterial = null; - if(data.mesh.length() > 0) - { - mesh = new Mesh(); - mesh.geometry = this.geometry; - for(i = 0; i < this.primitives.length; i++) - { - p = this.primitives[i]; - instanceMaterial = materials[p.materialSymbol]; - if(instanceMaterial != null) - { - daeMaterial = instanceMaterial.material; - if(daeMaterial != null) - { - daeMaterial.parse(); - material = daeMaterial.material; - daeMaterial.used = true; - } - } - mesh.addSurface(material,p.indexBegin,p.numTriangles); - } - mesh.calculateBoundBox(); - return mesh; - } - return null; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeImage.as b/src/alternativa/engine3d/loaders/collada/DaeImage.as deleted file mode 100644 index ef44834..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeImage.as +++ /dev/null @@ -1,29 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - use namespace collada; - - public class DaeImage extends DaeElement - { - public function DaeImage(data:XML, document:DaeDocument) - { - super(data,document); - } - - public function get init_from() : String - { - var refXML:XML = null; - var element:XML = data.init_from[0]; - if(element != null) - { - if(document.versionMajor > 4) - { - refXML = element.ref[0]; - return refXML == null ? null : refXML.text().toString(); - } - return element.text().toString(); - } - return null; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeInput.as b/src/alternativa/engine3d/loaders/collada/DaeInput.as deleted file mode 100644 index a9cfd67..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeInput.as +++ /dev/null @@ -1,54 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - use namespace collada; - - public class DaeInput extends DaeElement - { - public function DaeInput(data:XML, document:DaeDocument) - { - super(data,document); - } - - public function get semantic() : String - { - var attribute:XML = data.@semantic[0]; - return attribute == null ? null : attribute.toString(); - } - - public function get source() : XML - { - return data.@source[0]; - } - - public function get offset() : int - { - var attr:XML = data.@offset[0]; - return attr == null ? 0 : int(parseInt(attr.toString(),10)); - } - - public function get setNum() : int - { - var attr:XML = data.@set[0]; - return attr == null ? 0 : int(parseInt(attr.toString(),10)); - } - - public function prepareSource(minComponents:int) : DaeSource - { - var source:DaeSource = document.findSource(this.source); - if(source != null) - { - source.parse(); - if(source.numbers != null && source.stride >= minComponents) - { - return source; - } - } - else - { - document.logger.logNotFoundError(data.@source[0]); - } - return null; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeInstanceController.as b/src/alternativa/engine3d/loaders/collada/DaeInstanceController.as deleted file mode 100644 index 0683db3..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeInstanceController.as +++ /dev/null @@ -1,122 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import flash.utils.Dictionary; - - use namespace collada; - - public class DaeInstanceController extends DaeElement - { - public var node:DaeNode; - - public var topmostJoints:Vector.; - - public function DaeInstanceController(data:XML, document:DaeDocument, node:DaeNode) - { - super(data,document); - this.node = node; - } - - override protected function parseImplementation() : Boolean - { - var controller:DaeController = this.controller; - if(controller != null) - { - this.topmostJoints = controller.findRootJointNodes(this.skeletons); - if(this.topmostJoints != null && this.topmostJoints.length > 1) - { - this.replaceNodesByTopmost(this.topmostJoints); - } - } - return this.topmostJoints != null; - } - - private function replaceNodesByTopmost(nodes:Vector.) : void - { - var i:int = 0; - var node:DaeNode = null; - var parent:DaeNode = null; - var numNodes:int = int(nodes.length); - var parents:Dictionary = new Dictionary(); - for(i = 0; i < numNodes; i++) - { - node = nodes[i]; - for(parent = node.parent; parent != null; parent = parent.parent) - { - if(Boolean(parents[parent])) - { - parents[parent]++; - } - else - { - parents[parent] = 1; - } - } - } - for(i = 0; i < numNodes; i++) - { - node = nodes[i]; - while(true) - { - parent = node.parent; - if(!(parent != null && parents[parent] != numNodes)) - { - break; - } - node = node.parent; - } - nodes[i] = node; - } - } - - private function get controller() : DaeController - { - var controller:DaeController = document.findController(data.@url[0]); - if(controller == null) - { - document.logger.logNotFoundError(data.@url[0]); - } - return controller; - } - - private function get skeletons() : Vector. - { - var skeletons:Vector. = null; - var i:int = 0; - var count:int = 0; - var skeletonXML:XML = null; - var skel:DaeNode = null; - var list:XMLList = data.skeleton; - if(list.length() > 0) - { - skeletons = new Vector.(); - for(i = 0,count = int(list.length()); i < count; i++) - { - skeletonXML = list[i]; - skel = document.findNode(skeletonXML.text()[0]); - if(skel != null) - { - skeletons.push(skel); - } - else - { - document.logger.logNotFoundError(skeletonXML); - } - } - return skeletons; - } - return null; - } - - public function parseSkin(materials:Object) : DaeObject - { - var controller:DaeController = this.controller; - if(controller != null) - { - controller.parse(); - return controller.parseSkin(materials,this.topmostJoints,this.skeletons); - } - return null; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeInstanceMaterial.as b/src/alternativa/engine3d/loaders/collada/DaeInstanceMaterial.as deleted file mode 100644 index f38d90d..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeInstanceMaterial.as +++ /dev/null @@ -1,47 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - use namespace collada; - - public class DaeInstanceMaterial extends DaeElement - { - public function DaeInstanceMaterial(data:XML, document:DaeDocument) - { - super(data,document); - } - - public function get symbol() : String - { - var attribute:XML = data.@symbol[0]; - return attribute == null ? null : attribute.toString(); - } - - private function get target() : XML - { - return data.@target[0]; - } - - public function get material() : DaeMaterial - { - var mat:DaeMaterial = document.findMaterial(this.target); - if(mat == null) - { - document.logger.logNotFoundError(this.target); - } - return mat; - } - - public function getBindVertexInputSetNum(semantic:String) : int - { - var bindVertexInputXML:XML = null; - var setNumXML:XML = null; - bindVertexInputXML = data.bind_vertex_input.(@semantic == semantic)[0]; - if(bindVertexInputXML == null) - { - return 0; - } - setNumXML = bindVertexInputXML.@input_set[0]; - return setNumXML == null ? 0 : int(parseInt(setNumXML.toString(),10)); - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeLight.as b/src/alternativa/engine3d/loaders/collada/DaeLight.as deleted file mode 100644 index 9946bce..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeLight.as +++ /dev/null @@ -1,137 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.lights.AmbientLight; - import alternativa.engine3d.lights.DirectionalLight; - import alternativa.engine3d.lights.OmniLight; - import alternativa.engine3d.lights.SpotLight; - - use namespace collada; - - public class DaeLight extends DaeElement - { - public function DaeLight(data:XML, document:DaeDocument) - { - super(data,document); - } - - private function float4ToUint(value:Array) : uint - { - var r:uint = value[0] * 255; - var g:uint = value[1] * 255; - var b:uint = value[2] * 255; - return r << 16 | g << 8 | b | 4278190080; - } - - public function get revertDirection() : Boolean - { - var info:XML = data.technique_common.children()[0]; - return info == null ? false : info.localName() == "directional" || info.localName() == "spot"; - } - - public function parseLight() : Light3D - { - var info:XML = null; - var extra:XML = null; - var light:Light3D = null; - var color:uint = 0; - var constantAttenuationXML:XML = null; - var linearAttenuationXML:XML = null; - var linearAttenuation:Number = NaN; - var attenuationStart:Number = NaN; - var attenuationEnd:Number = NaN; - var dLight:DirectionalLight = null; - var oLight:OmniLight = null; - var hotspot:Number = NaN; - var fallof:Number = NaN; - var DEG2RAD:Number = NaN; - var sLight:SpotLight = null; - info = data.technique_common.children()[0]; - extra = data.extra.technique.(@profile[0] == "OpenCOLLADA3dsMax").light[0]; - light = null; - if(info != null) - { - color = this.float4ToUint(parseNumbersArray(info.color[0])); - linearAttenuation = 0; - attenuationStart = 0; - attenuationEnd = 1; - switch(info.localName()) - { - case "ambient": - light = new AmbientLight(color); - break; - case "directional": - dLight = new DirectionalLight(color); - light = dLight; - break; - case "point": - if(extra != null) - { - attenuationStart = parseNumber(extra.attenuation_far_start[0]); - attenuationEnd = parseNumber(extra.attenuation_far_end[0]); - } - else - { - constantAttenuationXML = info.constant_attenuation[0]; - linearAttenuationXML = info.linear_attenuation[0]; - if(constantAttenuationXML != null) - { - attenuationStart = -parseNumber(constantAttenuationXML); - } - if(linearAttenuationXML != null) - { - linearAttenuation = parseNumber(linearAttenuationXML); - } - if(linearAttenuation > 0) - { - attenuationEnd = 1 / linearAttenuation + attenuationStart; - } - else - { - attenuationEnd = attenuationStart + 1; - } - } - oLight = new OmniLight(color,attenuationStart,attenuationEnd); - light = oLight; - break; - case "spot": - hotspot = 0; - fallof = Math.PI / 4; - DEG2RAD = Math.PI / 180; - if(extra != null) - { - attenuationStart = parseNumber(extra.attenuation_far_start[0]); - attenuationEnd = parseNumber(extra.attenuation_far_end[0]); - hotspot = DEG2RAD * parseNumber(extra.hotspot_beam[0]); - fallof = DEG2RAD * parseNumber(extra.falloff[0]); - } - else - { - constantAttenuationXML = info.constant_attenuation[0]; - linearAttenuationXML = info.linear_attenuation[0]; - if(constantAttenuationXML != null) - { - attenuationStart = -parseNumber(constantAttenuationXML); - } - if(linearAttenuationXML != null) - { - linearAttenuation = parseNumber(linearAttenuationXML); - } - if(linearAttenuation > 0) - { - attenuationEnd = 1 / linearAttenuation + attenuationStart; - } - else - { - attenuationEnd = attenuationStart + 1; - } - } - sLight = new SpotLight(color,attenuationStart,attenuationEnd,hotspot,fallof); - light = sLight; - } - } - return light; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeLogger.as b/src/alternativa/engine3d/loaders/collada/DaeLogger.as deleted file mode 100644 index 86af6d5..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeLogger.as +++ /dev/null @@ -1,57 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - public class DaeLogger - { - public function DaeLogger() - { - super(); - } - - private function logMessage(message:String, element:XML) : void - { - var name:String = element.nodeKind() == "attribute" ? "@" + element.localName() : element.localName() + ""; - for(var parent:* = element.parent(); parent != null; ) - { - name = parent.localName() + "" + "." + name; - parent = parent.parent(); - } - trace(message,"| \"" + name + "\""); - } - - private function logError(message:String, element:XML) : void - { - this.logMessage("[ERROR] " + message,element); - } - - public function logExternalError(element:XML) : void - { - this.logError("External urls don\'t supported",element); - } - - public function logSkewError(element:XML) : void - { - this.logError(" don\'t supported",element); - } - - public function logJointInAnotherSceneError(element:XML) : void - { - this.logError("Joints in different scenes don\'t supported",element); - } - - public function logInstanceNodeError(element:XML) : void - { - this.logError(" don\'t supported",element); - } - - public function logNotFoundError(element:XML) : void - { - this.logError("Element with url \"" + element.toString() + "\" not found",element); - } - - public function logNotEnoughDataError(element:XML) : void - { - this.logError("Not enough data",element); - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeMaterial.as b/src/alternativa/engine3d/loaders/collada/DaeMaterial.as deleted file mode 100644 index 5bc48fb..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeMaterial.as +++ /dev/null @@ -1,57 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import alternativa.engine3d.loaders.ParserMaterial; - - use namespace collada; - - public class DaeMaterial extends DaeElement - { - public var material:ParserMaterial; - - public var mainTexCoords:String; - - public var used:Boolean = false; - - public function DaeMaterial(data:XML, document:DaeDocument) - { - super(data,document); - } - - private function parseSetParams() : Object - { - var element:XML = null; - var param:DaeParam = null; - var params:Object = new Object(); - var list:XMLList = data.instance_effect.setparam; - for each(element in list) - { - param = new DaeParam(element,document); - params[param.ref] = param; - } - return params; - } - - private function get effectURL() : XML - { - return data.instance_effect.@url[0]; - } - - override protected function parseImplementation() : Boolean - { - var effect:DaeEffect = document.findEffect(this.effectURL); - if(effect != null) - { - effect.parse(); - this.material = effect.getMaterial(this.parseSetParams()); - this.mainTexCoords = effect.mainTexCoords; - if(this.material != null) - { - this.material.name = cloneString(name); - } - return true; - } - return false; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeNode.as b/src/alternativa/engine3d/loaders/collada/DaeNode.as deleted file mode 100644 index 0c8c842..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeNode.as +++ /dev/null @@ -1,567 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import alternativa.engine3d.animation.AnimationClip; - import alternativa.engine3d.animation.keys.NumberTrack; - import alternativa.engine3d.animation.keys.Track; - import alternativa.engine3d.animation.keys.TransformTrack; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.objects.Mesh; - import alternativa.engine3d.objects.Skin; - import flash.geom.Matrix3D; - import flash.geom.Vector3D; - - use namespace collada; - - public class DaeNode extends DaeElement - { - public var scene:DaeVisualScene; - - public var parent:DaeNode; - - public var skinOrTopmostJoint:Boolean = false; - - private var channels:Vector.; - - private var name_DE:Vector.; - - public var nodes:Vector.; - - public var objects:Vector.; - - public var skins:Vector.; - - public function DaeNode(data:XML, document:DaeDocument, scene:DaeVisualScene = null, parent:DaeNode = null) - { - super(data,document); - this.scene = scene; - this.parent = parent; - this.constructNodes(); - } - - public function get animName() : String - { - var n:String = this.name; - return n == null ? this.id : n; - } - - private function constructNodes() : void - { - var node:DaeNode = null; - var nodesList:XMLList = data.node; - var count:int = int(nodesList.length()); - this.nodes = new Vector.(count); - for(var i:int = 0; i < count; i++) - { - node = new DaeNode(nodesList[i],document,this.scene,this); - if(node.id != null) - { - document.nodes[node.id] = node; - } - this.nodes[i] = node; - } - } - - internal function registerInstanceControllers() : void - { - var i:int = 0; - var instanceControllerXML:XML = null; - var instanceController:DaeInstanceController = null; - var jointNodes:Vector. = null; - var numNodes:int = 0; - var jointNode:DaeNode = null; - var j:int = 0; - var instanceControllerXMLs:XMLList = data.instance_controller; - var count:int = int(instanceControllerXMLs.length()); - for(i = 0; i < count; ) - { - this.skinOrTopmostJoint = true; - instanceControllerXML = instanceControllerXMLs[i]; - instanceController = new DaeInstanceController(instanceControllerXML,document,this); - if(instanceController.parse()) - { - jointNodes = instanceController.topmostJoints; - numNodes = int(jointNodes.length); - if(numNodes > 0) - { - jointNode = jointNodes[0]; - jointNode.addInstanceController(instanceController); - for(j = 0; j < numNodes; j++) - { - jointNodes[j].skinOrTopmostJoint = true; - } - } - } - i++; - } - count = int(this.nodes.length); - for(i = 0; i < count; i++) - { - this.nodes[i].registerInstanceControllers(); - } - } - - public function addChannel(channel:DaeChannel) : void - { - if(this.channels == null) - { - this.channels = new Vector.(); - } - this.channels.push(channel); - } - - public function addInstanceController(controller:DaeInstanceController) : void - { - if(this.name_DE == null) - { - this.name_DE = new Vector.(); - } - this.name_DE.push(controller); - } - - override protected function parseImplementation() : Boolean - { - this.skins = this.parseSkins(); - this.objects = this.parseObjects(); - return true; - } - - private function parseInstanceMaterials(geometry:XML) : Object - { - var instance:DaeInstanceMaterial = null; - var instances:Object = new Object(); - var list:XMLList = geometry.bind_material.technique_common.instance_material; - for(var i:int = 0, count:int = int(list.length()); i < count; i++) - { - instance = new DaeInstanceMaterial(list[i],document); - instances[instance.symbol] = instance; - } - return instances; - } - - public function getNodeBySid(sid:String) : DaeNode - { - var i:int = 0; - var temp:Vector.> = null; - var children:Vector. = null; - var count:int = 0; - var j:int = 0; - var node:DaeNode = null; - if(sid == this.sid) - { - return this; - } - var levelNodes:Vector.> = new Vector.>(); - var levelNodes2:Vector.> = new Vector.>(); - levelNodes.push(this.nodes); - for(var len:int = int(levelNodes.length); len > 0; ) - { - for(i = 0; i < len; i++) - { - children = levelNodes[i]; - count = int(children.length); - for(j = 0; j < count; ) - { - node = children[j]; - if(node.sid == sid) - { - return node; - } - if(node.nodes.length > 0) - { - levelNodes2.push(node.nodes); - } - j++; - } - } - temp = levelNodes; - levelNodes = levelNodes2; - levelNodes2 = temp; - levelNodes2.length = 0; - len = int(levelNodes.length); - } - return null; - } - - public function parseSkins() : Vector. - { - var instanceController:DaeInstanceController = null; - var skinAndAnimatedJoints:DaeObject = null; - var skin:Skin = null; - if(this.name_DE == null) - { - return null; - } - var skins:Vector. = new Vector.(); - for(var i:int = 0, count:int = int(this.name_DE.length); i < count; ) - { - instanceController = this.name_DE[i]; - instanceController.parse(); - skinAndAnimatedJoints = instanceController.parseSkin(this.parseInstanceMaterials(instanceController.data)); - if(skinAndAnimatedJoints != null) - { - skin = Skin(skinAndAnimatedJoints.object); - skin.name = cloneString(instanceController.node.name); - skins.push(skinAndAnimatedJoints); - } - i++; - } - return skins.length > 0 ? skins : null; - } - - public function parseObjects() : Vector. - { - var i:int = 0; - var count:int = 0; - var child:XML = null; - var _loc6_:DaeLight = null; - var _loc7_:DaeGeometry = null; - var light:Light3D = null; - var rotXMatrix:Matrix3D = null; - var mesh:Mesh = null; - var objects:Vector. = new Vector.(); - var children:XMLList = data.children(); - for(i = 0,count = int(children.length()); i < count; ) - { - child = children[i]; - switch(child.localName()) - { - case "instance_light": - _loc6_ = document.findLight(child.@url[0]); - if(_loc6_ != null) - { - light = _loc6_.parseLight(); - if(light != null) - { - light.name = cloneString(name); - if(_loc6_.revertDirection) - { - rotXMatrix = new Matrix3D(); - rotXMatrix.appendRotation(180,Vector3D.X_AXIS); - objects.push(new DaeObject(this.applyTransformations(light,rotXMatrix))); - } - else - { - objects.push(this.applyAnimation(this.applyTransformations(light))); - } - } - } - else - { - document.logger.logNotFoundError(child.@url[0]); - } - break; - case "instance_geometry": - _loc7_ = document.findGeometry(child.@url[0]); - if(_loc7_ != null) - { - _loc7_.parse(); - mesh = _loc7_.parseMesh(this.parseInstanceMaterials(child)); - if(mesh != null) - { - mesh.name = cloneString(name); - objects.push(this.applyAnimation(this.applyTransformations(mesh))); - } - } - else - { - document.logger.logNotFoundError(child.@url[0]); - } - break; - case "instance_node": - document.logger.logInstanceNodeError(child); - break; - } - i++; - } - return objects.length > 0 ? objects : null; - } - - private function getMatrix(initialMatrix:Matrix3D = null) : Matrix3D - { - var components:Array = null; - var child:XML = null; - var sid:XML = null; - var matrix:Matrix3D = initialMatrix == null ? new Matrix3D() : initialMatrix; - var children:XMLList = data.children(); - for(var i:int = children.length() - 1; i >= 0; i--) - { - child = children[i]; - sid = child.@sid[0]; - if(sid != null && sid.toString() == "post-rotationY") - { - continue; - } - switch(child.localName()) - { - case "scale": - components = parseNumbersArray(child); - matrix.appendScale(components[0],components[1],components[2]); - break; - case "rotate": - components = parseNumbersArray(child); - matrix.appendRotation(components[3],new Vector3D(components[0],components[1],components[2])); - break; - case "translate": - components = parseNumbersArray(child); - matrix.appendTranslation(components[0] * document.unitScaleFactor,components[1] * document.unitScaleFactor,components[2] * document.unitScaleFactor); - break; - case "matrix": - components = parseNumbersArray(child); - matrix.append(new Matrix3D(Vector.([components[0],components[4],components[8],components[12],components[1],components[5],components[9],components[13],components[2],components[6],components[10],components[14],components[3] * document.unitScaleFactor,components[7] * document.unitScaleFactor,components[11] * document.unitScaleFactor,components[15]]))); - break; - case "lookat": - break; - case "skew": - document.logger.logSkewError(child); - break; - } - } - return matrix; - } - - public function applyTransformations(object:Object3D, prepend:Matrix3D = null, append:Matrix3D = null) : Object3D - { - var matrix:Matrix3D = this.getMatrix(prepend); - if(append != null) - { - matrix.append(append); - } - var vs:Vector. = matrix.decompose(); - var t:Vector3D = vs[0]; - var r:Vector3D = vs[1]; - var s:Vector3D = vs[2]; - object.x = t.x; - object.y = t.y; - object.z = t.z; - object.rotationX = r.x; - object.rotationY = r.y; - object.rotationZ = r.z; - object.scaleX = s.x; - object.scaleY = s.y; - object.scaleZ = s.z; - return object; - } - - public function applyAnimation(object:Object3D) : DaeObject - { - var animation:AnimationClip = this.parseAnimation(object); - if(animation == null) - { - return new DaeObject(object); - } - object.name = this.animName; - animation.attach(object,false); - return new DaeObject(object,animation); - } - - public function parseAnimation(object:Object3D = null) : AnimationClip - { - if(this.channels == null || !this.hasTransformationAnimation()) - { - return null; - } - var channel:DaeChannel = this.getChannel(DaeChannel.PARAM_MATRIX); - if(channel != null) - { - return this.createClip(channel.tracks); - } - var clip:AnimationClip = new AnimationClip(); - var components:Vector. = object != null ? null : this.getMatrix().decompose(); - channel = this.getChannel(DaeChannel.PARAM_TRANSLATE); - if(channel != null) - { - this.addTracksToClip(clip,channel.tracks); - } - else - { - channel = this.getChannel(DaeChannel.PARAM_TRANSLATE_X); - if(channel != null) - { - this.addTracksToClip(clip,channel.tracks); - } - else - { - clip.addTrack(this.createValueStaticTrack("x",object == null ? Number(components[0].x) : object.x)); - } - channel = this.getChannel(DaeChannel.PARAM_TRANSLATE_Y); - if(channel != null) - { - this.addTracksToClip(clip,channel.tracks); - } - else - { - clip.addTrack(this.createValueStaticTrack("y",object == null ? Number(components[0].y) : object.y)); - } - channel = this.getChannel(DaeChannel.PARAM_TRANSLATE_Z); - if(channel != null) - { - this.addTracksToClip(clip,channel.tracks); - } - else - { - clip.addTrack(this.createValueStaticTrack("z",object == null ? Number(components[0].z) : object.z)); - } - } - channel = this.getChannel(DaeChannel.PARAM_ROTATION_X); - if(channel != null) - { - this.addTracksToClip(clip,channel.tracks); - } - else - { - clip.addTrack(this.createValueStaticTrack("rotationX",object == null ? Number(components[1].x) : object.rotationX)); - } - channel = this.getChannel(DaeChannel.PARAM_ROTATION_Y); - if(channel != null) - { - this.addTracksToClip(clip,channel.tracks); - } - else - { - clip.addTrack(this.createValueStaticTrack("rotationY",object == null ? Number(components[1].y) : object.rotationY)); - } - channel = this.getChannel(DaeChannel.PARAM_ROTATION_Z); - if(channel != null) - { - this.addTracksToClip(clip,channel.tracks); - } - else - { - clip.addTrack(this.createValueStaticTrack("rotationZ",object == null ? Number(components[1].z) : object.rotationZ)); - } - channel = this.getChannel(DaeChannel.PARAM_SCALE); - if(channel != null) - { - this.addTracksToClip(clip,channel.tracks); - } - else - { - channel = this.getChannel(DaeChannel.PARAM_SCALE_X); - if(channel != null) - { - this.addTracksToClip(clip,channel.tracks); - } - else - { - clip.addTrack(this.createValueStaticTrack("scaleX",object == null ? Number(components[2].x) : object.scaleX)); - } - channel = this.getChannel(DaeChannel.PARAM_SCALE_Y); - if(channel != null) - { - this.addTracksToClip(clip,channel.tracks); - } - else - { - clip.addTrack(this.createValueStaticTrack("scaleY",object == null ? Number(components[2].y) : object.scaleY)); - } - channel = this.getChannel(DaeChannel.PARAM_SCALE_Z); - if(channel != null) - { - this.addTracksToClip(clip,channel.tracks); - } - else - { - clip.addTrack(this.createValueStaticTrack("scaleZ",object == null ? Number(components[2].z) : object.scaleZ)); - } - } - if(clip.numTracks > 0) - { - return clip; - } - return null; - } - - private function createClip(tracks:Vector.) : AnimationClip - { - var clip:AnimationClip = new AnimationClip(); - for(var i:int = 0, count:int = int(tracks.length); i < count; i++) - { - clip.addTrack(tracks[i]); - } - return clip; - } - - private function addTracksToClip(clip:AnimationClip, tracks:Vector.) : void - { - for(var i:int = 0, count:int = int(tracks.length); i < count; i++) - { - clip.addTrack(tracks[i]); - } - } - - private function hasTransformationAnimation() : Boolean - { - var channel:DaeChannel = null; - var result:Boolean = false; - for(var i:int = 0, count:int = int(this.channels.length); i < count; ) - { - channel = this.channels[i]; - channel.parse(); - result = channel.name_dS == DaeChannel.PARAM_MATRIX; - result ||= channel.name_dS == DaeChannel.PARAM_TRANSLATE; - result ||= channel.name_dS == DaeChannel.PARAM_TRANSLATE_X; - result ||= channel.name_dS == DaeChannel.PARAM_TRANSLATE_Y; - result ||= channel.name_dS == DaeChannel.PARAM_TRANSLATE_Z; - result ||= channel.name_dS == DaeChannel.PARAM_ROTATION_X; - result ||= channel.name_dS == DaeChannel.PARAM_ROTATION_Y; - result ||= channel.name_dS == DaeChannel.PARAM_ROTATION_Z; - result ||= channel.name_dS == DaeChannel.PARAM_SCALE; - result ||= channel.name_dS == DaeChannel.PARAM_SCALE_X; - result ||= channel.name_dS == DaeChannel.PARAM_SCALE_Y; - result ||= channel.name_dS == DaeChannel.PARAM_SCALE_Z; - if(result) - { - return true; - } - i++; - } - return false; - } - - private function getChannel(param:String) : DaeChannel - { - var channel:DaeChannel = null; - for(var i:int = 0, count:int = int(this.channels.length); i < count; ) - { - channel = this.channels[i]; - channel.parse(); - if(channel.name_dS == param) - { - return channel; - } - i++; - } - return null; - } - - private function concatTracks(source:Vector., dest:Vector.) : void - { - for(var i:int = 0, count:int = int(source.length); i < count; i++) - { - dest.push(source[i]); - } - } - - private function createValueStaticTrack(property:String, value:Number) : Track - { - var track:NumberTrack = new NumberTrack(this.animName,property); - track.addKey(0,value); - return track; - } - - public function createStaticTransformTrack() : TransformTrack - { - var track:TransformTrack = new TransformTrack(this.animName); - track.addKey(0,this.getMatrix()); - return track; - } - - public function get layer() : String - { - var layerXML:XML = data.@layer[0]; - return layerXML == null ? null : layerXML.toString(); - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeObject.as b/src/alternativa/engine3d/loaders/collada/DaeObject.as deleted file mode 100644 index e1ef87d..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeObject.as +++ /dev/null @@ -1,22 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import alternativa.engine3d.animation.AnimationClip; - import alternativa.engine3d.core.Object3D; - - public class DaeObject - { - public var object:Object3D; - - public var animation:AnimationClip; - - public var jointNode:DaeNode; - - public function DaeObject(object:Object3D, animation:AnimationClip = null) - { - super(); - this.object = object; - this.animation = animation; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeParam.as b/src/alternativa/engine3d/loaders/collada/DaeParam.as deleted file mode 100644 index f206a6b..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeParam.as +++ /dev/null @@ -1,88 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - use namespace collada; - - public class DaeParam extends DaeElement - { - public function DaeParam(data:XML, document:DaeDocument) - { - super(data,document); - } - - public function get ref() : String - { - var attribute:XML = data.@ref[0]; - return attribute == null ? null : attribute.toString(); - } - - public function getFloat() : Number - { - var floatXML:XML = data.float[0]; - if(floatXML != null) - { - return parseNumber(floatXML); - } - return NaN; - } - - public function getFloat4() : Array - { - var components:Array = null; - var element:XML = data.float4[0]; - if(element == null) - { - element = data.float3[0]; - if(element != null) - { - components = parseNumbersArray(element); - components[3] = 1; - } - } - else - { - components = parseNumbersArray(element); - } - return components; - } - - public function get surfaceSID() : String - { - var element:XML = data.sampler2D.source[0]; - return element == null ? null : element.text().toString(); - } - - public function get wrap_s() : String - { - var element:XML = data.sampler2D.wrap_s[0]; - return element == null ? null : element.text().toString(); - } - - public function get image() : DaeImage - { - var image:DaeImage = null; - var init_from:XML = null; - var _loc4_:XML = null; - var surface:XML = data.surface[0]; - if(surface != null) - { - init_from = surface.init_from[0]; - if(init_from == null) - { - return null; - } - image = document.findImageByID(init_from.text().toString()); - } - else - { - _loc4_ = data.instance_image.@url[0]; - if(_loc4_ == null) - { - return null; - } - image = document.findImage(_loc4_); - } - return image; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaePrimitive.as b/src/alternativa/engine3d/loaders/collada/DaePrimitive.as deleted file mode 100644 index 80f9790..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaePrimitive.as +++ /dev/null @@ -1,391 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.resources.Geometry; - - use namespace collada; - use namespace alternativa3d; - - public class DaePrimitive extends DaeElement - { - internal static const NORMALS:int = 1; - - internal static const TANGENT4:int = 2; - - internal static const TEXCOORDS:Vector. = Vector.([8,16,32,64,128,256,512,1024]); - - internal var name_2g:DaeInput; - - internal var name_aL:Vector.; - - internal var name_Fl:DaeInput; - - internal var name_jU:Vector.; - - internal var name_ly:Vector.; - - internal var indices:Vector.; - - internal var name_5O:int; - - public var indexBegin:int; - - public var numTriangles:int; - - public function DaePrimitive(data:XML, document:DaeDocument) - { - super(data,document); - } - - override protected function parseImplementation() : Boolean - { - this.parseInputs(); - this.parseIndices(); - return true; - } - - private function get type() : String - { - return data.localName() as String; - } - - private function parseInputs() : void - { - var input:DaeInput = null; - var semantic:String = null; - var offset:int = 0; - this.name_aL = new Vector.(); - this.name_ly = new Vector.(); - this.name_jU = new Vector.(); - var inputsList:XMLList = data.input; - var maxInputOffset:int = 0; - for(var i:int = 0, count:int = int(inputsList.length()); i < count; offset = input.offset,maxInputOffset = offset > maxInputOffset ? offset : maxInputOffset,i++) - { - input = new DaeInput(inputsList[i],document); - semantic = input.semantic; - if(semantic == null) - { - continue; - } - switch(semantic) - { - case "VERTEX": - if(this.name_2g == null) - { - this.name_2g = input; - } - break; - case "TEXCOORD": - this.name_aL.push(input); - break; - case "NORMAL": - if(this.name_Fl == null) - { - this.name_Fl = input; - } - break; - case "TEXTANGENT": - this.name_ly.push(input); - break; - case "TEXBINORMAL": - this.name_jU.push(input); - break; - } - } - this.name_5O = maxInputOffset + 1; - } - - private function parseIndices() : void - { - var array:Array = null; - var _loc5_:XMLList = null; - var _loc6_:XMLList = null; - var j:int = 0; - this.indices = new Vector.(); - var vcount:Vector. = new Vector.(); - var i:int = 0; - var count:int = 0; - switch(data.localName()) - { - case "polylist": - case "polygons": - _loc5_ = data.vcount; - array = parseStringArray(_loc5_[0]); - i = 0; - count = int(array.length); - while(true) - { - if(i < count) - { - vcount.push(parseInt(array[i])); - i++; - continue; - } - } - case "triangles": - _loc6_ = data.p; - for(i = 0,count = int(_loc6_.length()); i < count; ) - { - array = parseStringArray(_loc6_[i]); - for(j = 0; j < array.length; j++) - { - this.indices.push(parseInt(array[j],10)); - } - if(vcount.length > 0) - { - this.indices = this.triangulate(this.indices,vcount); - } - i++; - } - } - } - - private function triangulate(input:Vector., vcount:Vector.) : Vector. - { - var indexIn:uint = 0; - var i:int = 0; - var j:int = 0; - var k:int = 0; - var count:int = 0; - var verticesCount:int = 0; - var attributesCount:int = 0; - var res:Vector. = new Vector.(); - var indexOut:uint = 0; - for(i = 0,count = int(vcount.length); i < count; i++) - { - verticesCount = vcount[i]; - attributesCount = verticesCount * this.name_5O; - if(verticesCount == 3) - { - j = 0; - while(j < attributesCount) - { - res[indexOut] = input[indexIn]; - j++; - indexIn++; - indexOut++; - } - } - else - { - for(j = 1; j < verticesCount - 1; ) - { - for(k = 0; k < this.name_5O; k++,indexOut++) - { - res[indexOut] = input[int(indexIn + k)]; - } - for(k = 0; k < this.name_5O; k++,indexOut++) - { - res[indexOut] = input[int(indexIn + this.name_5O * j + k)]; - } - for(k = 0; k < this.name_5O; k++,indexOut++) - { - res[indexOut] = input[int(indexIn + this.name_5O * (j + 1) + k)]; - } - j++; - } - indexIn += this.name_5O * verticesCount; - } - } - return res; - } - - public function fillGeometry(geometry:Geometry, vertices:Vector.) : uint - { - var tangentSource:DaeSource = null; - var binormalSource:DaeSource = null; - var normalSource:DaeSource = null; - var index:uint = 0; - var vertex:DaeVertex = null; - var s:DaeSource = null; - var j:int = 0; - if(this.name_2g == null) - { - return 0; - } - this.name_2g.parse(); - var numIndices:int = int(this.indices.length); - var daeVertices:DaeVertices = document.findVertices(this.name_2g.source); - if(daeVertices == null) - { - document.logger.logNotFoundError(this.name_2g.source); - return 0; - } - daeVertices.parse(); - var positionSource:DaeSource = daeVertices.name_E6; - var vertexStride:int = 3; - var mainSource:DaeSource = positionSource; - var mainInput:DaeInput = this.name_2g; - var channels:uint = 0; - var inputOffsets:Vector. = new Vector.(); - inputOffsets.push(this.name_2g.offset); - if(this.name_Fl != null) - { - normalSource = this.name_Fl.prepareSource(3); - inputOffsets.push(this.name_Fl.offset); - vertexStride += 3; - channels |= NORMALS; - if(this.name_ly.length > 0 && this.name_jU.length > 0) - { - tangentSource = this.name_ly[0].prepareSource(3); - inputOffsets.push(this.name_ly[0].offset); - binormalSource = this.name_jU[0].prepareSource(3); - inputOffsets.push(this.name_jU[0].offset); - vertexStride += 4; - channels |= TANGENT4; - } - } - var textureSources:Vector. = new Vector.(); - var numTexCoordsInputs:int = int(this.name_aL.length); - if(numTexCoordsInputs > 8) - { - numTexCoordsInputs = 8; - } - for(var i:int = 0; i < numTexCoordsInputs; ) - { - s = this.name_aL[i].prepareSource(2); - textureSources.push(s); - inputOffsets.push(this.name_aL[i].offset); - vertexStride += 2; - channels |= TEXCOORDS[i]; - i++; - } - var verticesLength:int = int(vertices.length); - this.indexBegin = geometry.alternativa3d::_indices.length; - for(i = 0; i < numIndices; i += this.name_5O) - { - index = this.indices[int(i + mainInput.offset)]; - vertex = vertices[index]; - if(vertex == null || !this.isEqual(vertex,this.indices,i,inputOffsets)) - { - if(vertex != null) - { - index = uint(verticesLength++); - } - vertex = new DaeVertex(); - vertices[index] = vertex; - vertex.name_Eq = this.indices[int(i + this.name_2g.offset)]; - vertex.addPosition(positionSource.numbers,vertex.name_Eq,positionSource.stride,document.unitScaleFactor); - if(normalSource != null) - { - vertex.addNormal(normalSource.numbers,this.indices[int(i + this.name_Fl.offset)],normalSource.stride); - } - if(tangentSource != null) - { - vertex.addTangentBiDirection(tangentSource.numbers,this.indices[int(i + this.name_ly[0].offset)],tangentSource.stride,binormalSource.numbers,this.indices[int(i + this.name_jU[0].offset)],binormalSource.stride); - } - for(j = 0; j < textureSources.length; ) - { - vertex.appendUV(textureSources[j].numbers,this.indices[int(i + this.name_aL[j].offset)],textureSources[j].stride); - j++; - } - } - vertex.name_AR = index; - geometry.alternativa3d::_indices.push(index); - } - this.numTriangles = (geometry.alternativa3d::_indices.length - this.indexBegin) / 3; - return channels; - } - - private function isEqual(vertex:DaeVertex, indices:Vector., index:int, offsets:Vector.) : Boolean - { - var numOffsets:int = int(offsets.length); - for(var j:int = 0; j < numOffsets; ) - { - if(vertex.indices[j] != indices[int(index + offsets[j])]) - { - return false; - } - j++; - } - return true; - } - - private function findInputBySet(inputs:Vector., setNum:int) : DaeInput - { - var input:DaeInput = null; - for(var i:int = 0, numInputs:int = int(inputs.length); i < numInputs; ) - { - input = inputs[i]; - if(input.setNum == setNum) - { - return input; - } - i++; - } - return null; - } - - private function getTexCoordsDatas(mainSetNum:int) : Vector. - { - var i:int = 0; - var texCoordsInput:DaeInput = null; - var texCoordsSource:DaeSource = null; - var data:VertexChannelData = null; - var mainInput:DaeInput = this.findInputBySet(this.name_aL,mainSetNum); - var numInputs:int = int(this.name_aL.length); - var datas:Vector. = new Vector.(); - for(i = 0; i < numInputs; ) - { - texCoordsInput = this.name_aL[i]; - texCoordsSource = texCoordsInput.prepareSource(2); - if(texCoordsSource != null) - { - data = new VertexChannelData(texCoordsSource.numbers,texCoordsSource.stride,texCoordsInput.offset,texCoordsInput.setNum); - if(texCoordsInput == mainInput) - { - datas.unshift(data); - } - else - { - datas.push(data); - } - } - i++; - } - return datas.length > 0 ? datas : null; - } - - public function verticesEquals(otherVertices:DaeVertices) : Boolean - { - var vertices:DaeVertices = document.findVertices(this.name_2g.source); - if(vertices == null) - { - document.logger.logNotFoundError(this.name_2g.source); - } - return vertices == otherVertices; - } - - public function get materialSymbol() : String - { - var attr:XML = data.@material[0]; - return attr == null ? null : attr.toString(); - } - } -} - -import flash.geom.Point; - -class VertexChannelData -{ - public var values:Vector.; - - public var stride:int; - - public var offset:int; - - public var index:int; - - public var channel:Vector.; - - public var inputSet:int; - - public function VertexChannelData(values:Vector., stride:int, offset:int, inputSet:int = 0) - { - super(); - this.values = values; - this.stride = stride; - this.offset = offset; - this.inputSet = inputSet; - } -} diff --git a/src/alternativa/engine3d/loaders/collada/DaeSampler.as b/src/alternativa/engine3d/loaders/collada/DaeSampler.as deleted file mode 100644 index f36c8fc..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeSampler.as +++ /dev/null @@ -1,135 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import alternativa.engine3d.animation.keys.NumberTrack; - import alternativa.engine3d.animation.keys.Track; - import alternativa.engine3d.animation.keys.TransformTrack; - import flash.geom.Matrix3D; - - use namespace collada; - - public class DaeSampler extends DaeElement - { - private var name_G6:Vector.; - - private var values:Vector.; - - private var name_JC:int; - - private var name_7i:int; - - public function DaeSampler(data:XML, document:DaeDocument) - { - super(data,document); - } - - override protected function parseImplementation() : Boolean - { - var inputSource:DaeSource = null; - var outputSource:DaeSource = null; - var input:DaeInput = null; - var semantic:String = null; - var inputsList:XMLList = data.input; - for(var i:int = 0, count:int = int(inputsList.length()); i < count; i++) - { - input = new DaeInput(inputsList[i],document); - semantic = input.semantic; - if(semantic == null) - { - continue; - } - switch(semantic) - { - case "INPUT": - inputSource = input.prepareSource(1); - if(inputSource != null) - { - this.name_G6 = inputSource.numbers; - this.name_JC = inputSource.stride; - } - break; - case "OUTPUT": - outputSource = input.prepareSource(1); - if(outputSource != null) - { - this.values = outputSource.numbers; - this.name_7i = outputSource.stride; - } - break; - } - } - return true; - } - - public function parseNumbersTrack(objectName:String, property:String) : NumberTrack - { - var track:NumberTrack = null; - var count:int = 0; - var i:int = 0; - if(this.name_G6 != null && this.values != null && this.name_JC > 0) - { - track = new NumberTrack(objectName,property); - count = this.name_G6.length / this.name_JC; - for(i = 0; i < count; i++) - { - track.addKey(this.name_G6[int(this.name_JC * i)],this.values[int(this.name_7i * i)]); - } - return track; - } - return null; - } - - public function parseTransformationTrack(objectName:String) : Track - { - var track:TransformTrack = null; - var count:int = 0; - var i:int = 0; - var index:int = 0; - var matrix:Matrix3D = null; - if(this.name_G6 != null && this.values != null && this.name_JC != 0) - { - track = new TransformTrack(objectName); - count = this.name_G6.length / this.name_JC; - for(i = 0; i < count; i++) - { - index = this.name_7i * i; - matrix = new Matrix3D(Vector.([this.values[index],this.values[index + 4],this.values[index + 8],this.values[index + 12],this.values[index + 1],this.values[index + 5],this.values[index + 9],this.values[index + 13],this.values[index + 2],this.values[index + 6],this.values[index + 10],this.values[index + 14],this.values[index + 3],this.values[index + 7],this.values[index + 11],this.values[index + 15]])); - track.addKey(this.name_G6[i * this.name_JC],matrix); - } - return track; - } - return null; - } - - public function parsePointsTracks(objectName:String, xProperty:String, yProperty:String, zProperty:String) : Vector. - { - var xTrack:NumberTrack = null; - var yTrack:NumberTrack = null; - var zTrack:NumberTrack = null; - var count:int = 0; - var i:int = 0; - var index:int = 0; - var time:Number = NaN; - if(this.name_G6 != null && this.values != null && this.name_JC != 0) - { - xTrack = new NumberTrack(objectName,xProperty); - xTrack.object = objectName; - yTrack = new NumberTrack(objectName,yProperty); - yTrack.object = objectName; - zTrack = new NumberTrack(objectName,zProperty); - zTrack.object = objectName; - count = this.name_G6.length / this.name_JC; - for(i = 0; i < count; i++) - { - index = i * this.name_7i; - time = this.name_G6[i * this.name_JC]; - xTrack.addKey(time,this.values[index]); - yTrack.addKey(time,this.values[index + 1]); - zTrack.addKey(time,this.values[index + 2]); - } - return Vector.([xTrack,yTrack,zTrack]); - } - return null; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeSource.as b/src/alternativa/engine3d/loaders/collada/DaeSource.as deleted file mode 100644 index 4e0ffd6..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeSource.as +++ /dev/null @@ -1,170 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - use namespace collada; - - public class DaeSource extends DaeElement - { - private const name_XM:String = "float_array"; - - private const name_g6:String = "int_array"; - - private const name_ZJ:String = "Name_array"; - - public var numbers:Vector.; - - public var name_op:Vector.; - - public var names:Vector.; - - public var stride:int; - - public function DaeSource(data:XML, document:DaeDocument) - { - super(data,document); - this.constructArrays(); - } - - private function constructArrays() : void - { - var child:XML = null; - var _loc5_:DaeArray = null; - var children:XMLList = data.children(); - for(var i:int = 0, count:int = int(children.length()); i < count; ) - { - child = children[i]; - switch(child.localName()) - { - case this.name_XM: - case this.name_g6: - case this.name_ZJ: - _loc5_ = new DaeArray(child,document); - if(_loc5_.id != null) - { - document.arrays[_loc5_.id] = _loc5_; - } - break; - } - i++; - } - } - - private function get accessor() : XML - { - return data.technique_common.accessor[0]; - } - - override protected function parseImplementation() : Boolean - { - var arrayXML:XML = null; - var array:DaeArray = null; - var countXML:String = null; - var count:int = 0; - var offsetXML:XML = null; - var strideXML:XML = null; - var offset:int = 0; - var stride:int = 0; - var accessor:XML = this.accessor; - if(accessor != null) - { - arrayXML = accessor.@source[0]; - array = arrayXML == null ? null : document.findArray(arrayXML); - if(array != null) - { - countXML = accessor.@count[0]; - if(countXML != null) - { - count = int(parseInt(countXML.toString(),10)); - offsetXML = accessor.@offset[0]; - strideXML = accessor.@stride[0]; - offset = offsetXML == null ? 0 : int(parseInt(offsetXML.toString(),10)); - stride = strideXML == null ? 1 : int(parseInt(strideXML.toString(),10)); - array.parse(); - if(array.array.length < offset + count * stride) - { - document.logger.logNotEnoughDataError(accessor); - return false; - } - this.stride = this.parseArray(offset,count,stride,array.array,array.type); - return true; - } - } - else - { - document.logger.logNotFoundError(arrayXML); - } - } - return false; - } - - private function numValidParams(params:XMLList) : int - { - var res:int = 0; - for(var i:int = 0, count:int = int(params.length()); i < count; ) - { - if(params[i].@name[0] != null) - { - res++; - } - i++; - } - return res; - } - - private function parseArray(offset:int, count:int, stride:int, array:Array, type:String) : int - { - var param:XML = null; - var j:int = 0; - var value:String = null; - var params:XMLList = this.accessor.param; - var arrStride:int = int(Math.max(this.numValidParams(params),stride)); - switch(type) - { - case this.name_XM: - this.numbers = new Vector.(int(arrStride * count)); - break; - case this.name_g6: - this.name_op = new Vector.(int(arrStride * count)); - break; - case this.name_ZJ: - this.names = new Vector.(int(arrStride * count)); - } - var curr:int = 0; - for(var i:int = 0; i < arrStride; ) - { - param = params[i]; - if(param == null || Boolean(param.hasOwnProperty("@name"))) - { - switch(type) - { - case this.name_XM: - for(j = 0; j < count; j++) - { - value = array[int(offset + stride * j + i)]; - if(value.indexOf(",") != -1) - { - value = value.replace(/,/,"."); - } - this.numbers[int(arrStride * j + curr)] = parseFloat(value); - } - break; - case this.name_g6: - for(j = 0; j < count; j++) - { - this.name_op[int(arrStride * j + curr)] = parseInt(array[int(offset + stride * j + i)],10); - } - break; - case this.name_ZJ: - for(j = 0; j < count; j++) - { - this.names[int(arrStride * j + curr)] = array[int(offset + stride * j + i)]; - } - } - curr++; - } - i++; - } - return arrStride; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeVertex.as b/src/alternativa/engine3d/loaders/collada/DaeVertex.as deleted file mode 100644 index 2d6173d..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeVertex.as +++ /dev/null @@ -1,74 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import flash.geom.Vector3D; - - public class DaeVertex - { - public var name_Eq:int; - - public var name_AR:int; - - public var indices:Vector. = new Vector.(); - - public var x:Number; - - public var y:Number; - - public var z:Number; - - public var uvs:Vector. = new Vector.(); - - public var normal:Vector3D; - - public var name_hC:Vector3D; - - public function DaeVertex() - { - super(); - } - - public function addPosition(data:Vector., dataIndex:int, stride:int, unitScaleFactor:Number) : void - { - this.indices.push(dataIndex); - var offset:int = stride * dataIndex; - this.x = data[int(offset)] * unitScaleFactor; - this.y = data[int(offset + 1)] * unitScaleFactor; - this.z = data[int(offset + 2)] * unitScaleFactor; - } - - public function addNormal(data:Vector., dataIndex:int, stride:int) : void - { - this.indices.push(dataIndex); - var offset:int = stride * dataIndex; - this.normal = new Vector3D(); - this.normal.x = data[int(offset++)]; - this.normal.y = data[int(offset++)]; - this.normal.z = data[offset]; - } - - public function addTangentBiDirection(tangentData:Vector., tangentDataIndex:int, tangentStride:int, biNormalData:Vector., biNormalDataIndex:int, biNormalStride:int) : void - { - this.indices.push(tangentDataIndex); - this.indices.push(biNormalDataIndex); - var tangentOffset:int = tangentStride * tangentDataIndex; - var biNormalOffset:int = biNormalStride * biNormalDataIndex; - var biNormalX:Number = biNormalData[int(biNormalOffset++)]; - var biNormalY:Number = biNormalData[int(biNormalOffset++)]; - var biNormalZ:Number = biNormalData[biNormalOffset]; - this.name_hC = new Vector3D(tangentData[int(tangentOffset++)],tangentData[int(tangentOffset++)],tangentData[tangentOffset]); - var crossX:Number = this.normal.y * this.name_hC.z - this.normal.z * this.name_hC.y; - var crossY:Number = this.normal.z * this.name_hC.x - this.normal.x * this.name_hC.z; - var crossZ:Number = this.normal.x * this.name_hC.y - this.normal.y * this.name_hC.x; - var dot:Number = crossX * biNormalX + crossY * biNormalY + crossZ * biNormalZ; - this.name_hC.w = dot < 0 ? -1 : 1; - } - - public function appendUV(data:Vector., dataIndex:int, stride:int) : void - { - this.indices.push(dataIndex); - this.uvs.push(data[int(dataIndex * stride)]); - this.uvs.push(1 - data[int(dataIndex * stride + 1)]); - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeVertices.as b/src/alternativa/engine3d/loaders/collada/DaeVertices.as deleted file mode 100644 index c36cec2..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeVertices.as +++ /dev/null @@ -1,33 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - import alternativa.engine3d.alternativa3d; - - use namespace alternativa3d; - use namespace collada; - - public class DaeVertices extends DaeElement - { - public var name_E6:DaeSource; - - public function DaeVertices(data:XML, document:DaeDocument) - { - super(data,document); - } - - override protected function parseImplementation() : Boolean - { - var inputXML:XML = null; - inputXML = data.input.(@semantic == "POSITION")[0]; - if(inputXML != null) - { - this.name_E6 = new DaeInput(inputXML,document).prepareSource(3); - if(this.name_E6 != null) - { - return true; - } - } - return false; - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/DaeVisualScene.as b/src/alternativa/engine3d/loaders/collada/DaeVisualScene.as deleted file mode 100644 index ba2faa5..0000000 --- a/src/alternativa/engine3d/loaders/collada/DaeVisualScene.as +++ /dev/null @@ -1,33 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - use namespace collada; - - public class DaeVisualScene extends DaeElement - { - public var nodes:Vector.; - - public function DaeVisualScene(data:XML, document:DaeDocument) - { - super(data,document); - this.constructNodes(); - } - - public function constructNodes() : void - { - var node:DaeNode = null; - var nodesList:XMLList = data.node; - var count:int = int(nodesList.length()); - this.nodes = new Vector.(count); - for(var i:int = 0; i < count; i++) - { - node = new DaeNode(nodesList[i],document,this); - if(node.id != null) - { - document.nodes[node.id] = node; - } - this.nodes[i] = node; - } - } - } -} - diff --git a/src/alternativa/engine3d/loaders/collada/collada.as b/src/alternativa/engine3d/loaders/collada/collada.as deleted file mode 100644 index dd91939..0000000 --- a/src/alternativa/engine3d/loaders/collada/collada.as +++ /dev/null @@ -1,5 +0,0 @@ -package alternativa.engine3d.loaders.collada -{ - public namespace collada = "http://www.collada.org/2005/11/COLLADASchema"; -} - diff --git a/src/alternativa/engine3d/materials/A3DUtils.as b/src/alternativa/engine3d/materials/A3DUtils.as deleted file mode 100644 index 8c32bea..0000000 --- a/src/alternativa/engine3d/materials/A3DUtils.as +++ /dev/null @@ -1,387 +0,0 @@ -package alternativa.engine3d.materials -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.materials.compiler.CommandType; - import alternativa.engine3d.materials.compiler.VariableType; - import avmplus.getQualifiedSuperclassName; - import flash.display3D.Context3D; - import flash.display3D.Context3DTextureFormat; - import flash.display3D.IndexBuffer3D; - import flash.display3D.VertexBuffer3D; - import flash.display3D.textures.Texture; - import flash.geom.Point; - import flash.utils.ByteArray; - import flash.utils.Dictionary; - import flash.utils.Endian; - import flash.utils.getDefinitionByName; - - use namespace alternativa3d; - - public class A3DUtils - { - private static var twoOperandsCommands:Dictionary; - - private static const DXT1:ByteArray = getDXT1(); - - private static const PVRTC:ByteArray = getPVRTC(); - - private static const ETC1:ByteArray = getETC1(); - - private static var programType:Vector. = Vector.(["VERTEX","FRAGMENT"]); - - private static var samplerDimension:Vector. = Vector.(["2D","cube","3D"]); - - private static var samplerWraping:Vector. = Vector.(["clamp","repeat"]); - - private static var samplerMipmap:Vector. = Vector.(["mipnone","mipnearest","miplinear"]); - - private static var samplerFilter:Vector. = Vector.(["nearest","linear"]); - - private static var swizzleType:Vector. = Vector.(["x","y","z","w"]); - - private static const O_CODE:uint = "o".charCodeAt(0); - - public function A3DUtils() - { - super(); - } - - private static function getDXT1() : ByteArray - { - var DXT1Data:Vector. = Vector.([65,84,70,0,2,71,2,2,2,3,0,0,12,0,0,0,16,0,0,85,105,56,0,0,0,0,0,157,73,73,188,1,8,0,0,0,5,0,1,188,1,0,16,0,0,0,74,0,0,0,128,188,4,0,1,0,0,0,1,0,0,0,129,188,4,0,1,0,0,0,2,0,0,0,192,188,4,0,1,0,0,0,90,0,0,0,193,188,4,0,1,0,0,0,66,0,0,0,0,0,0,0,36,195,221,111,3,78,254,75,177,133,61,119,118,141,201,10,87,77,80,72,79,84,79,0,25,0,192,122,0,0,0,1,96,0,160,0,10,0,0,160,0,0,0,4,111,255,0,1,0,0,1,0,224,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,114,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,16,0,0,85,105,56,0,0,0,0,0,157,73,73,188,1,8,0,0,0,5,0,1,188,1,0,16,0,0,0,74,0,0,0,128,188,4,0,1,0,0,0,1,0,0,0,129,188,4,0,1,0,0,0,2,0,0,0,192,188,4,0,1,0,0,0,90,0,0,0,193,188,4,0,1,0,0,0,66,0,0,0,0,0,0,0,36,195,221,111,3,78,254,75,177,133,61,119,118,141,201,10,87,77,80,72,79,84,79,0,25,0,192,122,0,0,0,1,96,0,160,0,10,0,0,160,0,0,0,4,111,255,0,1,0,0,1,0,224,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,114,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 - ,0,0,0,0,0,12,0,0,0,16,0,0,85,105,56,0,0,0,0,0,157,73,73,188,1,8,0,0,0,5,0,1,188,1,0,16,0,0,0,74,0,0,0,128,188,4,0,1,0,0,0,1,0,0,0,129,188,4,0,1,0,0,0,2,0,0,0,192,188,4,0,1,0,0,0,90,0,0,0,193,188,4,0,1,0,0,0,66,0,0,0,0,0,0,0,36,195,221,111,3,78,254,75,177,133,61,119,118,141,201,10,87,77,80,72,79,84,79,0,25,0,192,122,0,0,0,1,96,0,160,0,10,0,0,160,0,0,0,4,111,255,0,1,0,0,1,0,224,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,114,0,7,143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]); - return getData(DXT1Data); - } - - private static function getETC1() : ByteArray - { - var ETC1Data:Vector. = Vector.([65,84,70,0,2,104,2,2,2,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,16,0,0,0,255,252,0,0,0,0,12,0,0,0,16,0,0,127,233,56,0,0,0,0,0,157,73,73,188,1,8,0,0,0,5,0,1,188,1,0,16,0,0,0,74,0,0,0,128,188,4,0,1,0,0,0,1,0,0,0,129,188,4,0,1,0,0,0,2,0,0,0,192,188,4,0,1,0,0,0,90,0,0,0,193,188,4,0,1,0,0,0,66,0,0,0,0,0,0,0,36,195,221,111,3,78,254,75,177,133,61,119,118,141,201,9,87,77,80,72,79,84,79,0,25,0,192,120,0,0,0,1,96,0,160,0,10,0,0,160,0,0,0,4,111,255,0,1,0,0,1,0,208,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,114,0,7,143,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,16,0,0,0,255,252,0,0,0,0,12,0,0,0,16,0,0,127,233,56,0,0,0,0,0,157,73,73,188,1,8,0,0,0,5,0,1,188,1,0,16,0,0,0,74,0,0,0,128,188,4,0,1,0,0,0,1,0,0,0,129,188,4,0,1,0,0,0,2,0,0,0,192,188,4,0,1,0,0,0,90,0,0,0,193,188,4,0,1,0,0,0,66,0,0,0,0,0,0,0,36,195,221,111,3,78,254,75,177,133,61,119,118,141,201,9,87,77,80,72,79,84,79,0,25,0,192,120,0,0,0,1,96,0,160,0,10,0,0,160,0,0,0,4,111,255,0,1,0,0,1,0,208 - ,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,114,0,4,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,16,0,0,0,255,252,0,0,0,0,12,0,0,0,16,0,0,127,233,56,0,0,0,0,0,157,73,73,188,1,8,0,0,0,5,0,1,188,1,0,16,0,0,0,74,0,0,0,128,188,4,0,1,0,0,0,1,0,0,0,129,188,4,0,1,0,0,0,2,0,0,0,192,188,4,0,1,0,0,0,90,0,0,0,193,188,4,0,1,0,0,0,66,0,0,0,0,0,0,0,36,195,221,111,3,78,254,75,177,133,61,119,118,141,201,9,87,77,80,72,79,84,79,0,25,0,192,120,0,0,0,1,96,0,160,0,10,0,0,160,0,0,0,4,111,255,0,1,0,0,1,0,208,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,114,0,4,0]); - return getData(ETC1Data); - } - - private static function getPVRTC() : ByteArray - { - var PVRTCData:Vector. = Vector.([65,84,70,0,2,173,2,2,2,3,0,0,0,0,0,0,0,0,13,0,0,0,16,0,0,0,104,190,153,255,0,0,0,0,15,91,0,0,16,0,0,102,12,228,2,255,225,0,0,0,0,0,223,73,73,188,1,8,0,0,0,5,0,1,188,1,0,16,0,0,0,74,0,0,0,128,188,4,0,1,0,0,0,2,0,0,0,129,188,4,0,1,0,0,0,4,0,0,0,192,188,4,0,1,0,0,0,90,0,0,0,193,188,4,0,1,0,0,0,132,0,0,0,0,0,0,0,36,195,221,111,3,78,254,75,177,133,61,119,118,141,201,9,87,77,80,72,79,84,79,0,25,0,192,120,0,1,0,3,96,0,160,0,10,0,0,160,0,0,0,4,111,255,0,1,0,0,1,0,165,192,0,7,227,99,186,53,197,40,185,134,182,32,130,98,8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,143,192,120,64,6,16,34,52,192,196,65,132,90,98,68,16,17,68,60,91,8,48,76,35,192,97,132,71,76,33,164,97,1,2,194,12,19,8,240,29,132,24,38,17,224,48,194,35,166,16,210,48,128,128,24,68,121,132,52,204,32,32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,16,0,0,0,233,56,90,0,0,0,0,12,0,0,0,16,0,0,127,237,210,0,0,0,0,0,155,73,73,188,1,8,0,0,0,5,0,1,188,1,0,16,0,0,0,74,0,0,0,128,188,4,0,1,0,0,0,2,0,0,0,129,188,4,0 - ,1,0,0,0,4,0,0,0,192,188,4,0,1,0,0,0,90,0,0,0,193,188,4,0,1,0,0,0,64,0,0,0,0,0,0,0,36,195,221,111,3,78,254,75,177,133,61,119,118,141,201,9,87,77,80,72,79,84,79,0,25,0,192,120,0,1,0,3,96,0,160,0,10,0,0,160,0,0,0,4,111,255,0,1,0,0,1,0,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,200,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,16,0,0,0,233,56,90,0,0,0,0,12,0,0,0,16,0,0,127,237,210,0,0,0,0,0,155,73,73,188,1,8,0,0,0,5,0,1,188,1,0,16,0,0,0,74,0,0,0,128,188,4,0,1,0,0,0,2,0,0,0,129,188,4,0,1,0,0,0,4,0,0,0,192,188,4,0,1,0,0,0,90,0,0,0,193,188,4,0,1,0,0,0,64,0,0,0,0,0,0,0,36,195,221,111,3,78,254,75,177,133,61,119,118,141,201,9,87,77,80,72,79,84,79,0,25,0,192,120,0,1,0,3,96,0,160,0,10,0,0,160,0,0,0,4,111,255,0,1,0,0,1,0,188,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,200,0,0,0,0,0,0,0,0,0,0]); - return getData(PVRTCData); - } - - private static function getData(source:Vector.) : ByteArray - { - var result:ByteArray = new ByteArray(); - for(var i:int = 0, length:int = int(source.length); i < length; i++) - { - result.writeByte(source[i]); - } - return result; - } - - public static function getSizeFromATF(byteArray:ByteArray, size:Point) : void - { - byteArray.position = 7; - var w:int = int(byteArray.readByte()); - var h:int = int(byteArray.readByte()); - size.x = 1 << w; - size.y = 1 << h; - byteArray.position = 0; - } - - public static function getSupportedTextureFormat(context3D:Context3D) : String - { - var testTexture:Texture = context3D.createTexture(4,4,Context3DTextureFormat.COMPRESSED,false); - var result:String = TextureFormat.NONE; - try - { - testTexture.uploadCompressedTextureFromByteArray(DXT1,0); - result = TextureFormat.DXT1; - } - catch(e:Error) - { - result = TextureFormat.NONE; - } - if(result == TextureFormat.NONE) - { - try - { - testTexture.uploadCompressedTextureFromByteArray(PVRTC,0); - result = TextureFormat.PVRTC; - } - catch(e:Error) - { - result = TextureFormat.NONE; - } - } - if(result == TextureFormat.NONE) - { - try - { - testTexture.uploadCompressedTextureFromByteArray(ETC1,0); - result = TextureFormat.ETC1; - } - catch(e:Error) - { - result = TextureFormat.NONE; - } - } - testTexture.dispose(); - return result; - } - - public static function vectorNumberToByteArray(vector:Vector.) : ByteArray - { - var result:ByteArray = new ByteArray(); - result.endian = Endian.LITTLE_ENDIAN; - for(var i:int = 0; i < vector.length; i++) - { - result.writeFloat(vector[i]); - } - result.position = 0; - return result; - } - - public static function byteArrayToVectorUint(byteArray:ByteArray) : Vector. - { - var result:Vector. = new Vector.(); - var length:uint = 0; - byteArray.position = 0; - for(byteArray.endian = Endian.LITTLE_ENDIAN; byteArray.bytesAvailable > 0; ) - { - var _loc4_:* = length++; - result[_loc4_] = byteArray.readUnsignedShort(); - } - return result; - } - - public static function createVertexBufferFromByteArray(context:Context3D, byteArray:ByteArray, numVertices:uint, stride:uint = 3) : VertexBuffer3D - { - if(context == null) - { - throw new ReferenceError("context is not set"); - } - var buffer:VertexBuffer3D = context.createVertexBuffer(numVertices,stride); - buffer.uploadFromByteArray(byteArray,0,0,numVertices); - return buffer; - } - - public static function createVertexBufferFromVector(context:Context3D, vector:Vector., numVertices:uint, stride:uint = 3) : VertexBuffer3D - { - if(context == null) - { - throw new ReferenceError("context is not set"); - } - var buffer:VertexBuffer3D = context.createVertexBuffer(numVertices,stride); - var byteArray:ByteArray = A3DUtils.vectorNumberToByteArray(vector); - buffer.uploadFromByteArray(byteArray,0,0,numVertices); - return buffer; - } - - public static function createTextureFromByteArray(context:Context3D, byteArray:ByteArray, width:Number, height:Number, format:String) : Texture - { - if(context == null) - { - throw new ReferenceError("context is not set"); - } - var texture:Texture = context.createTexture(width,height,format,false); - texture.uploadCompressedTextureFromByteArray(byteArray,0); - return texture; - } - - public static function createIndexBufferFromByteArray(context:Context3D, byteArray:ByteArray, numIndices:uint) : IndexBuffer3D - { - if(context == null) - { - throw new ReferenceError("context is not set"); - } - var buffer:IndexBuffer3D = context.createIndexBuffer(numIndices); - buffer.uploadFromByteArray(byteArray,0,0,numIndices); - return buffer; - } - - public static function createIndexBufferFromVector(context:Context3D, vector:Vector., numIndices:int = -1) : IndexBuffer3D - { - if(context == null) - { - throw new ReferenceError("context is not set"); - } - var count:uint = numIndices > 0 ? uint(numIndices) : uint(vector.length); - var buffer:IndexBuffer3D = context.createIndexBuffer(count); - buffer.uploadFromVector(vector,0,count); - var byteArray:ByteArray = new ByteArray(); - byteArray.endian = Endian.LITTLE_ENDIAN; - for(var i:int = 0; i < count; i++) - { - byteArray.writeInt(vector[i]); - } - byteArray.position = 0; - buffer.uploadFromVector(vector,0,count); - return buffer; - } - - public static function disassemble(byteCode:ByteArray) : String - { - if(!twoOperandsCommands) - { - twoOperandsCommands = new Dictionary(); - twoOperandsCommands[1] = true; - twoOperandsCommands[2] = true; - twoOperandsCommands[3] = true; - twoOperandsCommands[4] = true; - twoOperandsCommands[6] = true; - twoOperandsCommands[11] = true; - twoOperandsCommands[17] = true; - twoOperandsCommands[18] = true; - twoOperandsCommands[19] = true; - twoOperandsCommands[23] = true; - twoOperandsCommands[24] = true; - twoOperandsCommands[25] = true; - twoOperandsCommands[40] = true; - twoOperandsCommands[41] = true; - twoOperandsCommands[42] = true; - } - var res:String = ""; - byteCode.position = 0; - if(byteCode.bytesAvailable < 7) - { - return "error in byteCode header"; - } - res += "magic = " + byteCode.readUnsignedByte().toString(16); - res += "\nversion = " + byteCode.readInt().toString(10); - res += "\nshadertypeid = " + byteCode.readUnsignedByte().toString(16); - var pType:String = programType[byteCode.readByte()]; - res += "\nshadertype = " + pType; - res += "\nsource\n"; - pType = pType.substring(0,1).toLowerCase(); - for(var lineNumber:uint = 1; byteCode.bytesAvailable - 24 >= 0; ) - { - res += (lineNumber++).toString() + ": " + getCommand(byteCode,pType) + "\n"; - } - if(byteCode.bytesAvailable > 0) - { - res += "\nunexpected byteCode length. extra bytes:" + byteCode.bytesAvailable; - } - return res; - } - - private static function getCommand(byteCode:ByteArray, programType:String) : String - { - var result:String = null; - var cmd:uint = uint(byteCode.readUnsignedInt()); - var command:String = CommandType.COMMAND_NAMES[cmd]; - var destNumber:uint = uint(byteCode.readUnsignedShort()); - var swizzle:uint = uint(byteCode.readByte()); - var s:String = ""; - var destSwizzle:uint = 0; - if(swizzle < 15) - { - s += "."; - s += (swizzle & 1) > 0 ? "x" : ""; - s += (swizzle & 2) > 0 ? "y" : ""; - s += (swizzle & 4) > 0 ? "z" : ""; - s += (swizzle & 8) > 0 ? "w" : ""; - destSwizzle = uint(s.length); - } - var destType:String = VariableType.TYPE_NAMES[byteCode.readUnsignedByte()].charAt(0); - if(destType.charCodeAt(0) == O_CODE) - { - result = command + " " + attachProgramPrefix(destType,programType) + s + ", "; - } - else - { - result = command + " " + attachProgramPrefix(destType,programType) + destNumber.toString() + s + ", "; - } - result += attachProgramPrefix(getSourceVariable(byteCode,destSwizzle),programType); - if(Boolean(twoOperandsCommands[cmd])) - { - if(cmd == 40) - { - result += ", " + attachProgramPrefix(getSamplerVariable(byteCode),programType); - } - else - { - result += ", " + attachProgramPrefix(getSourceVariable(byteCode,destSwizzle),programType); - } - } - else - { - byteCode.readDouble(); - } - return result; - } - - private static function attachProgramPrefix(variable:String, programType:String) : String - { - var char:uint = uint(variable.charCodeAt(0)); - if(char == "o".charCodeAt(0)) - { - return variable + (programType == "f" ? "c" : "p"); - } - if(char != "v".charCodeAt(0)) - { - return programType + variable; - } - return variable; - } - - private static function getSamplerVariable(byteCode:ByteArray) : String - { - var number:uint = uint(byteCode.readUnsignedInt()); - byteCode.readByte(); - var dim:uint = uint(byteCode.readByte() >> 4); - var wraping:uint = uint(byteCode.readByte() >> 4); - var n:uint = uint(byteCode.readByte()); - return "s" + number.toString() + " <" + samplerDimension[dim] + ", " + samplerWraping[wraping] + ", " + samplerFilter[n >> 4 & 0x0F] + ", " + samplerMipmap[n & 0x0F] + ">"; - } - - private static function getSourceVariable(byteCode:ByteArray, destSwizzle:uint) : String - { - var s1Number:uint = uint(byteCode.readUnsignedShort()); - var offset:uint = uint(byteCode.readUnsignedByte()); - var s:String = getSourceSwizzle(byteCode.readUnsignedByte(),destSwizzle); - var s1Type:String = VariableType.TYPE_NAMES[byteCode.readUnsignedByte()].charAt(0); - var indexType:String = VariableType.TYPE_NAMES[byteCode.readUnsignedByte()].charAt(0); - var comp:String = swizzleType[byteCode.readUnsignedByte()]; - if(byteCode.readUnsignedByte() > 0) - { - return s1Type + "[" + indexType + s1Number.toString() + "." + comp + (offset > 0 ? "+" + offset.toString() : "") + "]" + s; - } - return s1Type + s1Number.toString() + s; - } - - private static function getSourceSwizzle(swizzle:uint, destSwizzle:uint) : String - { - var s:String = ""; - if(swizzle != 228) - { - s += "."; - s += swizzleType[swizzle & 3]; - s += swizzleType[swizzle >> 2 & 3]; - s += swizzleType[swizzle >> 4 & 3]; - s += swizzleType[swizzle >> 6 & 3]; - s = s.substring(0,destSwizzle > 0 ? destSwizzle : Number(s.length)); - } - return s; - } - - alternativa3d static function checkParent(child:Class, parent:Class) : Boolean - { - var className:String = null; - var current:Class = child; - if(parent == null) - { - return true; - } - while(current != parent) - { - className = getQualifiedSuperclassName(current); - if(className == null) - { - return false; - } - current = getDefinitionByName(className) as Class; - } - return true; - } - } -} - diff --git a/src/alternativa/engine3d/materials/EnviromentMaterial.as b/src/alternativa/engine3d/materials/EnviromentMaterial.as deleted file mode 100644 index b57f63d..0000000 --- a/src/alternativa/engine3d/materials/EnviromentMaterial.as +++ /dev/null @@ -1,486 +0,0 @@ -package alternativa.engine3d.materials -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.RenderPriority; - import alternativa.engine3d.core.Transform3D; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.materials.compiler.VariableType; - import alternativa.engine3d.objects.Surface; - import alternativa.engine3d.resources.BitmapTextureResource; - import alternativa.engine3d.resources.Geometry; - import alternativa.engine3d.resources.TextureResource; - import avmplus.getQualifiedClassName; - import flash.display.BitmapData; - import flash.display3D.Context3DBlendFactor; - import flash.display3D.Context3DProgramType; - import flash.display3D.VertexBuffer3D; - import flash.utils.Dictionary; - import flash.utils.getDefinitionByName; - - use namespace alternativa3d; - - public class EnviromentMaterial extends TextureMaterial - { - alternativa3d static var fogTexture:TextureResource; - - private static var _programs:Dictionary = new Dictionary(); - - alternativa3d static const DISABLED:int = 0; - - alternativa3d static const SIMPLE:int = 1; - - alternativa3d static const ADVANCED:int = 2; - - alternativa3d static var fogMode:int = alternativa3d::DISABLED; - - alternativa3d static var fogNear:Number = 1000; - - alternativa3d static var fogFar:Number = 5000; - - alternativa3d static var fogMaxDensity:Number = 1; - - alternativa3d static var fogColorR:Number = 200 / 255; - - alternativa3d static var fogColorG:Number = 162 / 255; - - alternativa3d static var fogColorB:Number = 200 / 255; - - alternativa3d static const _passReflectionProcedure:Procedure = new Procedure(["#v1=vNormal","#v0=vPosition","mov v0, i0","mov v1, i1"],"passReflectionProcedure"); - - alternativa3d static const _applyReflectionProcedure:Procedure = new Procedure(["#v1=vNormal","#v0=vPosition","#s0=sCubeMap","#c0=cCamera","sub t0, v0, c0","dp3 t1.x, v1, t0","add t1.x, t1.x, t1.x","mul t1, v1, t1.x","sub t1, t0, t1","nrm t1.xyz, t1.xyz","tex o0, t1, s0 "],"applyReflectionProcedure"); - - alternativa3d static const _applyReflectionNormalMapProcedure:Procedure = new Procedure(["#s0=sCubeMap","#c0=cCamera","#v0=vPosition","sub t0, v0, c0","dp3 t1.x, i0.xyz, t0","add t1.x, t1.x, t1.x","mul t1, i0.xyz, t1.x","sub t1, t0, t1","nrm t1.xyz, t1.xyz","tex o0, t1, s0 "],"applyReflectionNormalMapProcedure"); - - alternativa3d static const _blendReflection:Procedure = new Procedure(["#c0=cAlpha","mul t1, i0, c0.y","mul t0.xyz, i1, c0.z","add t0.xyz, t1, t0","mov t0.w, i0.w","mov o0, t0"],"blendReflection"); - - alternativa3d static const _blendReflectionMap:Procedure = new Procedure(["#c0=cCamera","#c1=cAlpha","#s0=sReflection","#v0=vUV","tex t0, v0, s0 <2d,repeat,linear,miplinear>","mul t0, t0, c1.z","mul t1.xyz, i1, t0","sub t0, c0.www, t0","mul t2, i0, t0","add t0.xyz, t1, t2","mov t0.w, i0.w","mov o0, t0"],"blendReflectionMap"); - - private static const _passTBNRightProcedure:Procedure = getPassTBNProcedure(true); - - private static const _passTBNLeftProcedure:Procedure = getPassTBNProcedure(false); - - private static const _getNormalTangentProcedure:Procedure = new Procedure(["#v0=vTangent","#v1=vBinormal","#v2=vNormal","#v3=vUV","#c0=cCamera","#s0=sBump","tex t0, v3, s0 <2d,repeat,linear,miplinear>","add t0, t0, t0","sub t0.xyz, t0.xyz, c0.www","nrm t1.xyz, v0.xyz","dp3 o0.x, t0.xyz, t1.xyz","nrm t1.xyz, v1.xyz","dp3 o0.y, t0.xyz, t1.xyz","nrm t1.xyz, v2.xyz","dp3 o0.z, t0.xyz, t1.xyz","nrm o0.xyz, o0.xyz"],"getNormalTangentProcedure"); - - private static const _getNormalObjectProcedure:Procedure = new Procedure(["#v3=vUV","#c0=cCamera","#s0=sBump","tex t0, v3, s0 <2d,repeat,linear,miplinear>","add t0, t0, t0","sub t0.xyz, t0.xyz, c0.www","nrm o0.xyz, t0.xyz"],"getNormalObjectProcedure"); - - private static const passSimpleFogConstProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogSpace","dp4 t0.z, i0, c0","mov v0, t0.zzzz","sub v0.y, i0.w, t0.z"],"passSimpleFogConst"); - - private static const outputWithSimpleFogProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogColor","#c1=cFogRange","min t0.xy, v0.xy, c1.xy","max t0.xy, t0.xy, c1.zw","mul i0.xyz, i0.xyz, t0.y","mul t0.xyz, c0.xyz, t0.x","add i0.xyz, i0.xyz, t0.xyz","mov o0, i0"],"outputWithSimpleFog"); - - private static const postPassAdvancedFogConstProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogSpace","dp4 t0.z, i0, c0","mov v0, t0.zzzz","sub v0.y, i0.w, t0.z","mov v0.zw, i1.xwxw","mov o0, i1"],"postPassAdvancedFogConst"); - - private static const outputWithAdvancedFogProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogConsts","#c1=cFogRange","#s0=sFogTexture","min t0.xy, v0.xy, c1.xy","max t0.xy, t0.xy, c1.zw","mul i0.xyz, i0.xyz, t0.y","mov t1.xyzw, c0.yyzw","div t0.z, v0.z, v0.w","mul t0.z, t0.z, c0.x","add t1.x, t1.x, t0.z","tex t1, t1, s0 <2d, repeat, linear, miplinear>","mul t0.xyz, t1.xyz, t0.x","add i0.xyz, i0.xyz, t0.xyz","mov o0, i0"],"outputWithAdvancedFog"); - - private static const _applyLightMapProcedure:Procedure = new Procedure(["#v0=vUV1","#s0=sLightMap","tex t0, v0, s0 <2d,repeat,linear,mipnone>","add t0, t0, t0","mul i0.xyz, i0.xyz, t0.xyz","mov o0, i0"],"applyLightMapProcedure"); - - private static const _passLightMapUVProcedure:Procedure = new Procedure(["#a0=aUV1","#v0=vUV1","mov v0, a0"],"passLightMapUVProcedure"); - - private var name_NH:int = 0; - - public var normalMap:TextureResource; - - public var environmentMap:TextureResource; - - public var reflection:Number = 1; - - public var reflectionMap:TextureResource; - - public var lightMap:TextureResource; - - public var lightMapChannel:uint = 1; - - public function EnviromentMaterial(diffuseMap:TextureResource = null, environmentMap:TextureResource = null, normalMap:TextureResource = null, reflectionMap:TextureResource = null, lightMap:TextureResource = null, opacityMap:TextureResource = null, alpha:Number = 1) - { - super(diffuseMap,opacityMap,alpha); - this.environmentMap = environmentMap; - this.normalMap = normalMap; - this.reflectionMap = reflectionMap; - this.lightMap = lightMap; - } - - private static function getPassTBNProcedure(right:Boolean) : Procedure - { - var crsInSpace:String = right ? "crs t1.xyz, i0, i1" : "crs t1.xyz, i1, i0"; - return new Procedure(["#v0=vTangent","#v1=vBinormal","#v2=vNormal",crsInSpace,"mul t1.xyz, t1.xyz, i0.w","mov v0.x, i0.x","mov v0.y, t1.x","mov v0.z, i1.x","mov v0.w, i1.w","mov v1.x, i0.y","mov v1.y, t1.y","mov v1.z, i1.y","mov v1.w, i1.w","mov v2.x, i0.z","mov v2.y, t1.z","mov v2.z, i1.z","mov v2.w, i1.w"],"passTBNProcedure"); - } - - public function get normalMapSpace() : int - { - return this.name_NH; - } - - public function set normalMapSpace(value:int) : void - { - if(value != NormalMapSpace.TANGENT_RIGHT_HANDED && value != NormalMapSpace.TANGENT_LEFT_HANDED && value != NormalMapSpace.OBJECT) - { - throw new ArgumentError("Value must be a constant from the NormalMapSpace class"); - } - this.name_NH = value; - } - - override alternativa3d function fillResources(resources:Dictionary, resourceType:Class) : void - { - super.alternativa3d::fillResources(resources,resourceType); - if(this.environmentMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.environmentMap)) as Class,resourceType))) - { - resources[this.environmentMap] = true; - } - if(this.normalMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.normalMap)) as Class,resourceType))) - { - resources[this.normalMap] = true; - } - if(this.reflectionMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.reflectionMap)) as Class,resourceType))) - { - resources[this.reflectionMap] = true; - } - if(this.lightMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.lightMap)) as Class,resourceType))) - { - resources[this.lightMap] = true; - } - } - - private function final(targetObject:Object3D) : EnvironmentMaterialShaderProgram - { - var procedure:Procedure = null; - var outputProcedure:Procedure = null; - var nrmProcedure:Procedure = null; - var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); - var fragmentLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); - var positionVar:String = "aPosition"; - var normalVar:String = "aNormal"; - var tangentVar:String = "aTangent"; - vertexLinker.declareVariable(positionVar,VariableType.ATTRIBUTE); - vertexLinker.declareVariable(normalVar,VariableType.ATTRIBUTE); - if(targetObject.alternativa3d::transformProcedure != null) - { - positionVar = alternativa3d::appendPositionTransformProcedure(targetObject.alternativa3d::transformProcedure,vertexLinker); - } - if(targetObject.alternativa3d::deltaTransformProcedure != null) - { - vertexLinker.declareVariable("tTransformedNormal"); - procedure = targetObject.alternativa3d::deltaTransformProcedure.newInstance(); - vertexLinker.addProcedure(procedure); - vertexLinker.setInputParams(procedure,normalVar); - vertexLinker.setOutputParams(procedure,"tTransformedNormal"); - normalVar = "tTransformedNormal"; - if((this.name_NH == NormalMapSpace.TANGENT_RIGHT_HANDED || this.name_NH == NormalMapSpace.TANGENT_LEFT_HANDED) && this.normalMap != null) - { - vertexLinker.declareVariable(tangentVar,VariableType.ATTRIBUTE); - vertexLinker.declareVariable("tTransformedTangent"); - procedure = targetObject.alternativa3d::deltaTransformProcedure.newInstance(); - vertexLinker.addProcedure(procedure); - vertexLinker.setInputParams(procedure,tangentVar); - vertexLinker.setOutputParams(procedure,"tTransformedTangent"); - tangentVar = "tTransformedTangent"; - } - } - else if((this.name_NH == NormalMapSpace.TANGENT_RIGHT_HANDED || this.name_NH == NormalMapSpace.TANGENT_LEFT_HANDED) && this.normalMap != null) - { - vertexLinker.declareVariable(tangentVar,VariableType.ATTRIBUTE); - } - vertexLinker.addProcedure(_passLightMapUVProcedure); - vertexLinker.addProcedure(alternativa3d::_passReflectionProcedure); - vertexLinker.setInputParams(alternativa3d::_passReflectionProcedure,positionVar,normalVar); - vertexLinker.addProcedure(alternativa3d::_projectProcedure); - vertexLinker.setInputParams(alternativa3d::_projectProcedure,positionVar); - vertexLinker.addProcedure(alternativa3d::_passUVProcedure); - if(this.normalMap != null) - { - fragmentLinker.declareVariable("tNormal"); - if(this.name_NH == NormalMapSpace.TANGENT_RIGHT_HANDED || this.name_NH == NormalMapSpace.TANGENT_LEFT_HANDED) - { - nrmProcedure = this.name_NH == NormalMapSpace.TANGENT_RIGHT_HANDED ? _passTBNRightProcedure : _passTBNLeftProcedure; - vertexLinker.addProcedure(nrmProcedure); - vertexLinker.setInputParams(nrmProcedure,tangentVar,normalVar); - fragmentLinker.addProcedure(_getNormalTangentProcedure); - fragmentLinker.setOutputParams(_getNormalTangentProcedure,"tNormal"); - } - else - { - fragmentLinker.addProcedure(_getNormalObjectProcedure); - fragmentLinker.setOutputParams(_getNormalObjectProcedure,"tNormal"); - } - } - vertexLinker.link(); - fragmentLinker.declareVariable("tColor"); - if(name_L4) - { - fragmentLinker.addProcedure(alternativa3d::_samplerSetProcedureDiffuseAlpha); - fragmentLinker.setOutputParams(alternativa3d::_samplerSetProcedureDiffuseAlpha,"tColor"); - } - else if(opacityMap != null) - { - fragmentLinker.addProcedure(alternativa3d::_samplerSetProcedureOpacity); - fragmentLinker.setOutputParams(alternativa3d::_samplerSetProcedureOpacity,"tColor"); - } - else - { - fragmentLinker.addProcedure(alternativa3d::_samplerSetProcedure); - fragmentLinker.setOutputParams(alternativa3d::_samplerSetProcedure,"tColor"); - } - fragmentLinker.declareVariable("tReflection"); - if(this.normalMap != null) - { - fragmentLinker.addProcedure(alternativa3d::_applyReflectionNormalMapProcedure); - fragmentLinker.setInputParams(alternativa3d::_applyReflectionNormalMapProcedure,"tNormal"); - fragmentLinker.setOutputParams(alternativa3d::_applyReflectionNormalMapProcedure,"tReflection"); - } - else - { - fragmentLinker.addProcedure(alternativa3d::_applyReflectionProcedure); - fragmentLinker.setOutputParams(alternativa3d::_applyReflectionProcedure,"tReflection"); - } - fragmentLinker.addProcedure(_applyLightMapProcedure); - fragmentLinker.setInputParams(_applyLightMapProcedure,"tColor"); - fragmentLinker.setOutputParams(_applyLightMapProcedure,"tColor"); - if(this.reflectionMap != null) - { - fragmentLinker.addProcedure(alternativa3d::_blendReflectionMap); - fragmentLinker.setInputParams(alternativa3d::_blendReflectionMap,"tColor","tReflection"); - outputProcedure = alternativa3d::_blendReflectionMap; - } - else - { - fragmentLinker.addProcedure(alternativa3d::_blendReflection); - fragmentLinker.setInputParams(alternativa3d::_blendReflection,"tColor","tReflection"); - outputProcedure = alternativa3d::_blendReflection; - } - if(alternativa3d::fogMode == alternativa3d::SIMPLE || alternativa3d::fogMode == alternativa3d::ADVANCED) - { - fragmentLinker.declareVariable("outColor"); - fragmentLinker.setOutputParams(outputProcedure,"outColor"); - } - if(alternativa3d::fogMode == alternativa3d::SIMPLE) - { - vertexLinker.addProcedure(passSimpleFogConstProcedure); - vertexLinker.setInputParams(passSimpleFogConstProcedure,positionVar); - fragmentLinker.addProcedure(outputWithSimpleFogProcedure); - fragmentLinker.setInputParams(outputWithSimpleFogProcedure,"outColor"); - } - else if(alternativa3d::fogMode == alternativa3d::ADVANCED) - { - vertexLinker.declareVariable("tProjected"); - vertexLinker.setOutputParams(alternativa3d::_projectProcedure,"tProjected"); - vertexLinker.addProcedure(postPassAdvancedFogConstProcedure); - vertexLinker.setInputParams(postPassAdvancedFogConstProcedure,positionVar,"tProjected"); - fragmentLinker.addProcedure(outputWithAdvancedFogProcedure); - fragmentLinker.setInputParams(outputWithAdvancedFogProcedure,"outColor"); - } - fragmentLinker.link(); - fragmentLinker.setOppositeLinker(vertexLinker); - return new EnvironmentMaterialShaderProgram(vertexLinker,fragmentLinker); - } - - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void - { - var program:ShaderProgram = null; - var i:int = 0; - var lm:Transform3D = null; - var dist:Number = NaN; - var cLocal:Transform3D = null; - var halfW:Number = NaN; - var leftX:Number = NaN; - var leftY:Number = NaN; - var rightX:Number = NaN; - var rightY:Number = NaN; - var angle:Number = NaN; - var dx:Number = NaN; - var dy:Number = NaN; - var lens:Number = NaN; - var uScale:Number = NaN; - var uRight:Number = NaN; - var bmd:BitmapData = null; - if(diffuseMap == null || this.environmentMap == null || diffuseMap.alternativa3d::_texture == null || this.environmentMap.alternativa3d::_texture == null) - { - return; - } - if(!name_L4 && opacityMap != null && opacityMap.alternativa3d::_texture == null) - { - return; - } - var object:Object3D = surface.alternativa3d::object; - var positionBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - var uvBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TEXCOORDS[0]); - var normalsBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.NORMAL); - var tangentsBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TANGENT4); - if(positionBuffer == null || uvBuffer == null) - { - return; - } - var key:String = alternativa3d::fogMode.toString() + this.name_NH.toString() + (this.normalMap != null ? "N" : "n") + (opacityMap != null ? "O" : "o") + (name_L4 ? "D" : "d"); - var programs:Dictionary = _programs[object.alternativa3d::transformProcedure]; - if(programs == null) - { - programs = new Dictionary(false); - _programs[object.alternativa3d::transformProcedure] = programs; - program = this.final(object); - program.upload(camera.alternativa3d::context3D); - programs[key] = program; - } - else - { - program = programs[key]; - if(program == null) - { - program = this.final(object); - program.upload(camera.alternativa3d::context3D); - programs[key] = program; - } - } - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sLightMap"),this.lightMap.alternativa3d::_texture); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"),positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aUV"),uvBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[0]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[0]]); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aUV1"),uvBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[this.lightMapChannel]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[this.lightMapChannel]]); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aNormal"),normalsBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.NORMAL],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.NORMAL]); - object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); - drawUnit.alternativa3d::setProjectionConstants(camera,program.vertexShader.getVariableIndex("cProjMatrix"),object.alternativa3d::localToCameraTransform); - var camTransform:Transform3D = object.alternativa3d::cameraToLocalTransform; - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cCamera"),camTransform.d,camTransform.h,camTransform.l); - var envProgram:EnvironmentMaterialShaderProgram = program as EnvironmentMaterialShaderProgram; - if(this.normalMap != null) - { - drawUnit.alternativa3d::setTextureAt(envProgram.sBump,this.normalMap.alternativa3d::_texture); - if(this.name_NH == NormalMapSpace.TANGENT_RIGHT_HANDED || this.name_NH == NormalMapSpace.TANGENT_LEFT_HANDED) - { - drawUnit.alternativa3d::setVertexBufferAt(envProgram.aTangent,tangentsBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TANGENT4],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TANGENT4]); - } - } - if(this.reflectionMap != null) - { - drawUnit.alternativa3d::setTextureAt(envProgram.sReflection,this.reflectionMap.alternativa3d::_texture); - } - drawUnit.alternativa3d::setTextureAt(envProgram.sTexture,diffuseMap.alternativa3d::_texture); - drawUnit.alternativa3d::setTextureAt(envProgram.sCubeMap,this.environmentMap.alternativa3d::_texture); - var cameraToLocalTransform:Transform3D = object.alternativa3d::cameraToLocalTransform; - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(envProgram.cCamera,cameraToLocalTransform.d,cameraToLocalTransform.h,cameraToLocalTransform.l); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(envProgram.cAlpha,0,1 - this.reflection,this.reflection,alpha); - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sTexture"),diffuseMap.alternativa3d::_texture); - if(!name_L4 && opacityMap != null) - { - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sOpacity"),opacityMap.alternativa3d::_texture); - } - if(alternativa3d::fogMode == alternativa3d::SIMPLE || alternativa3d::fogMode == alternativa3d::ADVANCED) - { - lm = object.alternativa3d::localToCameraTransform; - dist = alternativa3d::fogFar - alternativa3d::fogNear; - drawUnit.alternativa3d::setVertexConstantsFromNumbers(program.vertexShader.getVariableIndex("cFogSpace"),lm.i / dist,lm.j / dist,lm.k / dist,(lm.l - alternativa3d::fogNear) / dist); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cFogRange"),alternativa3d::fogMaxDensity,1,0,1 - alternativa3d::fogMaxDensity); - } - if(alternativa3d::fogMode == alternativa3d::SIMPLE) - { - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cFogColor"),alternativa3d::fogColorR,alternativa3d::fogColorG,alternativa3d::fogColorB); - } - if(alternativa3d::fogMode == alternativa3d::ADVANCED) - { - if(alternativa3d::fogTexture == null) - { - bmd = new BitmapData(32,1,false,16711680); - for(i = 0; i < 32; i++) - { - bmd.setPixel(i,0,i / 32 * 255 << 16); - } - alternativa3d::fogTexture = new BitmapTextureResource(bmd); - alternativa3d::fogTexture.upload(camera.alternativa3d::context3D); - } - cLocal = camera.alternativa3d::localToGlobalTransform; - halfW = camera.view.width / 2; - leftX = -halfW * cLocal.a + camera.alternativa3d::focalLength * cLocal.c; - leftY = -halfW * cLocal.e + camera.alternativa3d::focalLength * cLocal.g; - rightX = halfW * cLocal.a + camera.alternativa3d::focalLength * cLocal.c; - rightY = halfW * cLocal.e + camera.alternativa3d::focalLength * cLocal.g; - angle = Math.atan2(leftY,leftX) - Math.PI / 2; - if(angle < 0) - { - angle += Math.PI * 2; - } - dx = rightX - leftX; - dy = rightY - leftY; - lens = Number(Math.sqrt(dx * dx + dy * dy)); - leftX /= lens; - leftY /= lens; - rightX /= lens; - rightY /= lens; - uScale = Math.acos(leftX * rightX + leftY * rightY) / Math.PI / 2; - uRight = angle / Math.PI / 2; - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cFogConsts"),0.5 * uScale,0.5 - uRight,0); - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sFogTexture"),alternativa3d::fogTexture.alternativa3d::_texture); - } - if(name_L4 || opacityMap != null || alpha < 1) - { - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.SOURCE_ALPHA; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.TRANSPARENT_SORT); - } - else - { - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.OPAQUE); - } - } - } -} - -import alternativa.engine3d.materials.compiler.Linker; -import alternativa.engine3d.materials.ShaderProgram; - -class EnvironmentMaterialShaderProgram extends ShaderProgram -{ - public var aTangent:int = -1; - - public var aNormal:int = -1; - - public var aPosition:int = -1; - - public var aUV:int = -1; - - public var cCamera:int = -1; - - public var cAlpha:int = -1; - - public var cProjMatrix:int = -1; - - public var sBump:int = -1; - - public var sTexture:int = -1; - - public var sOpacity:int = -1; - - public var sCubeMap:int = -1; - - public var sReflection:int = -1; - - public function EnvironmentMaterialShaderProgram(vertexShader:Linker, fragmentShader:Linker) - { - super(vertexShader,fragmentShader); - this.aPosition = vertexShader.getVariableIndex("aPosition"); - this.aNormal = vertexShader.getVariableIndex("aNormal"); - this.aUV = vertexShader.getVariableIndex("aUV"); - if(fragmentShader.containsVariable("sBump")) - { - this.sBump = fragmentShader.getVariableIndex("sBump"); - } - if(vertexShader.containsVariable("aTangent")) - { - this.aTangent = vertexShader.getVariableIndex("aTangent"); - } - if(fragmentShader.containsVariable("sReflection")) - { - this.sReflection = fragmentShader.getVariableIndex("sReflection"); - } - this.cProjMatrix = vertexShader.getVariableIndex("cProjMatrix"); - this.sTexture = fragmentShader.getVariableIndex("sTexture"); - this.sCubeMap = fragmentShader.getVariableIndex("sCubeMap"); - this.cCamera = fragmentShader.getVariableIndex("cCamera"); - this.cAlpha = fragmentShader.getVariableIndex("cAlpha"); - if(fragmentShader.containsVariable("sOpacity")) - { - this.sOpacity = fragmentShader.getVariableIndex("sOpacity"); - } - } -} diff --git a/src/alternativa/engine3d/materials/FillMaterial.as b/src/alternativa/engine3d/materials/FillMaterial.as deleted file mode 100644 index e877334..0000000 --- a/src/alternativa/engine3d/materials/FillMaterial.as +++ /dev/null @@ -1,113 +0,0 @@ -package alternativa.engine3d.materials -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.RenderPriority; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.materials.compiler.VariableType; - import alternativa.engine3d.objects.Surface; - import alternativa.engine3d.resources.Geometry; - import flash.display3D.Context3DBlendFactor; - import flash.display3D.Context3DProgramType; - import flash.display3D.VertexBuffer3D; - import flash.utils.Dictionary; - - use namespace alternativa3d; - - public class FillMaterial extends Material - { - private static var outColorProcedure:Procedure = new Procedure(["#c0=cColor","mov o0, c0"],"outColorProcedure"); - - private static var _programs:Dictionary = new Dictionary(); - - public var alpha:Number = 1; - - private var red:Number; - - private var green:Number; - - private var blue:Number; - - public function FillMaterial(color:uint = 8355711, alpha:Number = 1) - { - super(); - this.color = color; - this.alpha = alpha; - alternativa3d::priority = 1; - } - - public function get color() : uint - { - return (this.red * 255 << 16) + (this.green * 255 << 8) + this.blue * 255; - } - - public function set color(value:uint) : void - { - this.red = (value >> 16 & 0xFF) / 255; - this.green = (value >> 8 & 0xFF) / 255; - this.blue = (value & 0xFF) / 255; - } - - private function final(object:Object3D) : ShaderProgram - { - var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); - var positionVar:String = "aPosition"; - vertexLinker.declareVariable(positionVar,VariableType.ATTRIBUTE); - if(object.alternativa3d::transformProcedure != null) - { - positionVar = alternativa3d::appendPositionTransformProcedure(object.alternativa3d::transformProcedure,vertexLinker); - } - vertexLinker.addProcedure(alternativa3d::_projectProcedure); - vertexLinker.setInputParams(alternativa3d::_projectProcedure,positionVar); - var fragmentLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); - fragmentLinker.addProcedure(outColorProcedure); - fragmentLinker.setOppositeLinker(vertexLinker); - return new ShaderProgram(vertexLinker,fragmentLinker); - } - - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void - { - var object:Object3D = surface.alternativa3d::object; - var positionBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - if(positionBuffer == null) - { - return; - } - var program:ShaderProgram = _programs[object.alternativa3d::transformProcedure]; - if(program == null) - { - program = this.final(object); - program.upload(camera.alternativa3d::context3D); - _programs[object.alternativa3d::transformProcedure] = program; - } - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"),positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); - drawUnit.alternativa3d::setProjectionConstants(camera,program.vertexShader.getVariableIndex("cProjMatrix"),object.alternativa3d::localToCameraTransform); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cColor"),this.red,this.green,this.blue,this.alpha); - if(this.alpha < 1) - { - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.SOURCE_ALPHA; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.TRANSPARENT_SORT); - } - else - { - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.OPAQUE); - } - } - - override public function clone() : Material - { - var res:FillMaterial = new FillMaterial(this.color,this.alpha); - res.clonePropertiesFrom(this); - return res; - } - } -} - diff --git a/src/alternativa/engine3d/materials/FogMode.as b/src/alternativa/engine3d/materials/FogMode.as deleted file mode 100644 index 8c2e9a3..0000000 --- a/src/alternativa/engine3d/materials/FogMode.as +++ /dev/null @@ -1,17 +0,0 @@ -package alternativa.engine3d.materials -{ - public class FogMode - { - public static const DISABLED:int = 0; - - public static const SIMPLE:int = 1; - - public static const ADVANCED:int = 2; - - public function FogMode() - { - super(); - } - } -} - diff --git a/src/alternativa/engine3d/materials/Material.as b/src/alternativa/engine3d/materials/Material.as deleted file mode 100644 index 0457634..0000000 --- a/src/alternativa/engine3d/materials/Material.as +++ /dev/null @@ -1,85 +0,0 @@ -package alternativa.engine3d.materials -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Resource; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.materials.compiler.VariableType; - import alternativa.engine3d.objects.Surface; - import alternativa.engine3d.resources.Geometry; - import flash.utils.Dictionary; - - use namespace alternativa3d; - - public class Material - { - alternativa3d static const _projectProcedure:Procedure = getPojectProcedure(); - - public var name:String; - - alternativa3d var priority:int = 0; - - public function Material() - { - super(); - } - - private static function getPojectProcedure() : Procedure - { - var res:Procedure = new Procedure(["m44 o0, i0, c0"],"projectProcedure"); - res.assignVariableName(VariableType.CONSTANT,0,"cProjMatrix",4); - return res; - } - - alternativa3d function get canDrawInShadowMap() : Boolean - { - return true; - } - - alternativa3d function appendPositionTransformProcedure(transformProcedure:Procedure, vertexShader:Linker) : String - { - vertexShader.declareVariable("tTransformedPosition"); - vertexShader.addProcedure(transformProcedure); - vertexShader.setInputParams(transformProcedure,"aPosition"); - vertexShader.setOutputParams(transformProcedure,"tTransformedPosition"); - return "tTransformedPosition"; - } - - public function getResources(resourceType:Class = null) : Vector. - { - var key:* = undefined; - var res:Vector. = new Vector.(); - var dict:Dictionary = new Dictionary(); - var count:int = 0; - this.alternativa3d::fillResources(dict,resourceType); - for(key in dict) - { - var _loc8_:* = count++; - res[_loc8_] = key as Resource; - } - return res; - } - - alternativa3d function fillResources(resources:Dictionary, resourceType:Class) : void - { - } - - alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void - { - } - - public function clone() : Material - { - var res:Material = new Material(); - res.clonePropertiesFrom(this); - return res; - } - - protected function clonePropertiesFrom(source:Material) : void - { - } - } -} - diff --git a/src/alternativa/engine3d/materials/NormalMapSpace.as b/src/alternativa/engine3d/materials/NormalMapSpace.as deleted file mode 100644 index 1a868b4..0000000 --- a/src/alternativa/engine3d/materials/NormalMapSpace.as +++ /dev/null @@ -1,17 +0,0 @@ -package alternativa.engine3d.materials -{ - public class NormalMapSpace - { - public static const TANGENT_RIGHT_HANDED:int = 0; - - public static const TANGENT_LEFT_HANDED:int = 1; - - public static const OBJECT:int = 2; - - public function NormalMapSpace() - { - super(); - } - } -} - diff --git a/src/alternativa/engine3d/materials/ShaderProgram.as b/src/alternativa/engine3d/materials/ShaderProgram.as deleted file mode 100644 index cdb8786..0000000 --- a/src/alternativa/engine3d/materials/ShaderProgram.as +++ /dev/null @@ -1,57 +0,0 @@ -package alternativa.engine3d.materials -{ - import alternativa.engine3d.materials.compiler.Linker; - import flash.display3D.Context3D; - import flash.display3D.Program3D; - - public class ShaderProgram - { - public var program:Program3D; - - public var vertexShader:Linker; - - public var fragmentShader:Linker; - - public function ShaderProgram(vertexShader:Linker, fragmentShader:Linker) - { - super(); - this.vertexShader = vertexShader; - this.fragmentShader = fragmentShader; - } - - public function upload(context3D:Context3D) : void - { - if(this.program != null) - { - this.program.dispose(); - } - if(this.vertexShader != null && this.fragmentShader != null) - { - this.program = context3D.createProgram(); - try - { - this.program.upload(this.vertexShader.getByteCode(),this.fragmentShader.getByteCode()); - } - catch(e:Error) - { - trace(A3DUtils.disassemble(fragmentShader.getByteCode())); - throw e; - } - } - else - { - this.program = null; - } - } - - public function dispose() : void - { - if(this.program != null) - { - this.program.dispose(); - this.program = null; - } - } - } -} - diff --git a/src/alternativa/engine3d/materials/StandardMaterial.as b/src/alternativa/engine3d/materials/StandardMaterial.as deleted file mode 100644 index bf25e27..0000000 --- a/src/alternativa/engine3d/materials/StandardMaterial.as +++ /dev/null @@ -1,590 +0,0 @@ -package alternativa.engine3d.materials -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.RenderPriority; - import alternativa.engine3d.core.Transform3D; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.lights.DirectionalLight; - import alternativa.engine3d.lights.OmniLight; - import alternativa.engine3d.lights.SpotLight; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.materials.compiler.VariableType; - import alternativa.engine3d.objects.Surface; - import alternativa.engine3d.resources.BitmapTextureResource; - import alternativa.engine3d.resources.Geometry; - import alternativa.engine3d.resources.TextureResource; - import flash.display.BitmapData; - import flash.display3D.Context3DBlendFactor; - import flash.display3D.Context3DProgramType; - import flash.display3D.VertexBuffer3D; - import flash.utils.Dictionary; - import flash.utils.getDefinitionByName; - import flash.utils.getQualifiedClassName; - - use namespace alternativa3d; - - public class StandardMaterial extends TextureMaterial - { - alternativa3d static var fogTexture:TextureResource; - - alternativa3d static const DISABLED:int = 0; - - alternativa3d static const SIMPLE:int = 1; - - alternativa3d static const ADVANCED:int = 2; - - alternativa3d static var fogMode:int = alternativa3d::DISABLED; - - alternativa3d static var fogNear:Number = 1000; - - alternativa3d static var fogFar:Number = 5000; - - alternativa3d static var fogMaxDensity:Number = 1; - - alternativa3d static var fogColorR:Number = 200 / 255; - - alternativa3d static var fogColorG:Number = 162 / 255; - - alternativa3d static var fogColorB:Number = 200 / 255; - - private static const _programs:Dictionary = new Dictionary(); - - private static const _lightFragmentProcedures:Dictionary = new Dictionary(); - - private static const _passVaryingsProcedure:Procedure = new Procedure(["#v0=vPosition","#v1=vViewVector","#c0=cCameraPosition","mov v0, i0","sub t0, c0, i0","mov v1.xyz, t0.xyz","mov v1.w, c0.w"]); - - private static const _passTBNRightProcedure:Procedure = getPassTBNProcedure(true); - - private static const _passTBNLeftProcedure:Procedure = getPassTBNProcedure(false); - - private static const _ambientLightProcedure:Procedure = new Procedure(["#c0=cSurface","mov o0, i0","mov o1, c0.xxxx"],"ambientLightProcedure"); - - private static const _setGlossinessFromConstantProcedure:Procedure = new Procedure(["#c0=cSurface","mov o0.w, c0.y"],"setGlossinessFromConstantProcedure"); - - private static const _setGlossinessFromTextureProcedure:Procedure = new Procedure(["#v0=vUV","#c0=cSurface","#s0=sGlossiness","tex t0, v0, s0 <2d, repeat, linear, miplinear>","mul o0.w, t0.x, c0.y"],"setGlossinessFromTextureProcedure"); - - private static const _getNormalAndViewTangentProcedure:Procedure = new Procedure(["#v0=vTangent","#v1=vBinormal","#v2=vNormal","#v3=vUV","#v4=vViewVector","#c0=cAmbientColor","#s0=sBump","tex t0, v3, s0 <2d,repeat,linear,miplinear>","add t0, t0, t0","sub t0.xyz, t0.xyz, c0.www","nrm t1.xyz, v0.xyz","dp3 o0.x, t0.xyz, t1.xyz","nrm t1.xyz, v1.xyz","dp3 o0.y, t0.xyz, t1.xyz","nrm t1.xyz, v2.xyz","dp3 o0.z, t0.xyz, t1.xyz","nrm o0.xyz, o0.xyz","nrm o1.xyz, v4"],"getNormalAndViewTangentProcedure"); - - private static const _getNormalAndViewObjectProcedure:Procedure = new Procedure(["#v3=vUV","#v4=vViewVector","#c0=cAmbientColor","#s0=sBump","tex t0, v3, s0 <2d,repeat,linear,miplinear>","add t0, t0, t0","sub t0.xyz, t0.xyz, c0.www","nrm o0.xyz, t0.xyz","nrm o1.xyz, v4"],"getNormalAndViewObjectProcedure"); - - private static const _applySpecularProcedure:Procedure = new Procedure(["#v0=vUV","#s0=sSpecular","tex t0, v0, s0 <2d, repeat,linear,miplinear>","mul o0.xyz, o0.xyz, t0.xyz"],"applySpecularProcedure"); - - private static const _mulLightingProcedure:Procedure = new Procedure(["#s0=sTexture","#v0=vUV","#c0=cSurface","tex t0, v0, s0 <2d, repeat, linear, miplinear>","mul t0.xyz, t0.xyz, i0.xyz","mul t1.xyz, i1.xyz, c0.z","add t0.xyz, t0.xyz, t1.xyz","mov o0, t0"],"mulLightingProcedure"); - - private static const passSimpleFogConstProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogSpace","dp4 t0.z, i0, c0","mov v0, t0.zzzz","sub v0.y, i0.w, t0.z"],"passSimpleFogConst"); - - private static const outputWithSimpleFogProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogColor","#c1=cFogRange","min t0.xy, v0.xy, c1.xy","max t0.xy, t0.xy, c1.zw","mul i0.xyz, i0.xyz, t0.y","mul t0.xyz, c0.xyz, t0.x","add i0.xyz, i0.xyz, t0.xyz","mov o0, i0"],"outputWithSimpleFog"); - - private static const postPassAdvancedFogConstProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogSpace","dp4 t0.z, i0, c0","mov v0, t0.zzzz","sub v0.y, i0.w, t0.z","mov v0.zw, i1.xwxw","mov o0, i1"],"postPassAdvancedFogConst"); - - private static const outputWithAdvancedFogProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogConsts","#c1=cFogRange","#s0=sFogTexture","min t0.xy, v0.xy, c1.xy","max t0.xy, t0.xy, c1.zw","mul i0.xyz, i0.xyz, t0.y","mov t1.xyzw, c0.yyzw","div t0.z, v0.z, v0.w","mul t0.z, t0.z, c0.x","add t1.x, t1.x, t0.z","tex t1, t1, s0 <2d, repeat, linear, miplinear>","mul t0.xyz, t1.xyz, t0.x","add i0.xyz, i0.xyz, t0.xyz","mov o0, i0"],"outputWithAdvancedFog"); - - alternativa3d var name_ES:Boolean = false; - - alternativa3d var outputAlpha:Procedure = new Procedure(["#c0=cSurface","mov i0.w, c0.w","mov o0, i0"],"outputAlpha"); - - alternativa3d var outputDiffuseAlpha:Procedure = new Procedure(["#c0=cSurface","mul i0.w, i0.w, c0.w","mov o0, i0"],"outputDiffuseAlpha"); - - alternativa3d var outputOpacity:Procedure = new Procedure(["#c0=cSurface","#s0=sOpacity","#v0=vUV","tex t0, v0, s0 <2d, repeat,linear,miplinear>","mul i0.w, t0.x, c0.w","mov o0, i0"],"outputOpacity"); - - public var normalMap:TextureResource; - - private var name_NH:int = 0; - - public var specularMap:TextureResource; - - public var glossinessMap:TextureResource; - - public var glossiness:Number = 100; - - public var name_kj:Number = 1; - - public function StandardMaterial(diffuseMap:TextureResource, normalMap:TextureResource, specularMap:TextureResource = null, glossinessMap:TextureResource = null, opacityMap:TextureResource = null) - { - super(diffuseMap); - this.normalMap = normalMap; - this.specularMap = specularMap; - this.glossinessMap = glossinessMap; - this.opacityMap = opacityMap; - } - - private static function getPassTBNProcedure(right:Boolean) : Procedure - { - var crsInSpace:String = right ? "crs t1.xyz, i0, i1" : "crs t1.xyz, i1, i0"; - return new Procedure(["#v0=vTangent","#v1=vBinormal","#v2=vNormal",crsInSpace,"mul t1.xyz, t1.xyz, i0.w","mov v0.x, i0.x","mov v0.y, t1.x","mov v0.z, i1.x","mov v0.w, i1.w","mov v1.x, i0.y","mov v1.y, t1.y","mov v1.z, i1.y","mov v1.w, i1.w","mov v2.x, i0.z","mov v2.y, t1.z","mov v2.z, i1.z","mov v2.w, i1.w"],"passTBNProcedure"); - } - - public function get normalMapSpace() : int - { - return this.name_NH; - } - - public function set normalMapSpace(value:int) : void - { - if(value != NormalMapSpace.TANGENT_RIGHT_HANDED && value != NormalMapSpace.TANGENT_LEFT_HANDED && value != NormalMapSpace.OBJECT) - { - throw new ArgumentError("Value must be a constant from the NormalMapSpace class"); - } - this.name_NH = value; - } - - alternativa3d function getPassUVProcedure() : Procedure - { - return alternativa3d::_passUVProcedure; - } - - alternativa3d function setPassUVProcedureConstants(destination:DrawUnit, vertexLinker:Linker) : void - { - } - - private function final(object:Object3D, lights:Vector., directional:DirectionalLight, lightsLength:int) : ShaderProgram - { - var i:int = 0; - var outputProcedure:Procedure = null; - var procedure:Procedure = null; - var nrmProcedure:Procedure = null; - var shadowProc:Procedure = null; - var dirMulShadowProcedure:Procedure = null; - var light:Light3D = null; - var lightFragmentProcedure:Procedure = null; - var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); - var fragmentLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); - fragmentLinker.declareVariable("tTotalLight"); - fragmentLinker.declareVariable("tTotalHighLight"); - fragmentLinker.declareVariable("tNormal"); - fragmentLinker.declareVariable("cAmbientColor",VariableType.CONSTANT); - fragmentLinker.addProcedure(_ambientLightProcedure); - fragmentLinker.setInputParams(_ambientLightProcedure,"cAmbientColor"); - fragmentLinker.setOutputParams(_ambientLightProcedure,"tTotalLight","tTotalHighLight"); - var positionVar:String = "aPosition"; - var normalVar:String = "aNormal"; - var tangentVar:String = "aTangent"; - vertexLinker.declareVariable(positionVar,VariableType.ATTRIBUTE); - vertexLinker.declareVariable(tangentVar,VariableType.ATTRIBUTE); - vertexLinker.declareVariable(normalVar,VariableType.ATTRIBUTE); - if(object.alternativa3d::transformProcedure != null) - { - positionVar = alternativa3d::appendPositionTransformProcedure(object.alternativa3d::transformProcedure,vertexLinker); - } - vertexLinker.addProcedure(alternativa3d::_projectProcedure); - vertexLinker.setInputParams(alternativa3d::_projectProcedure,positionVar); - vertexLinker.addProcedure(this.alternativa3d::getPassUVProcedure()); - if(this.glossinessMap != null) - { - fragmentLinker.addProcedure(_setGlossinessFromTextureProcedure); - fragmentLinker.setOutputParams(_setGlossinessFromTextureProcedure,"tTotalHighLight"); - } - else - { - fragmentLinker.addProcedure(_setGlossinessFromConstantProcedure); - fragmentLinker.setOutputParams(_setGlossinessFromConstantProcedure,"tTotalHighLight"); - } - if(lightsLength > 0) - { - if(object.alternativa3d::deltaTransformProcedure != null) - { - vertexLinker.declareVariable("tTransformedNormal"); - procedure = object.alternativa3d::deltaTransformProcedure.newInstance(); - vertexLinker.addProcedure(procedure); - vertexLinker.setInputParams(procedure,normalVar); - vertexLinker.setOutputParams(procedure,"tTransformedNormal"); - normalVar = "tTransformedNormal"; - vertexLinker.declareVariable("tTransformedTangent"); - procedure = object.alternativa3d::deltaTransformProcedure.newInstance(); - vertexLinker.addProcedure(procedure); - vertexLinker.setInputParams(procedure,tangentVar); - vertexLinker.setOutputParams(procedure,"tTransformedTangent"); - tangentVar = "tTransformedTangent"; - } - vertexLinker.addProcedure(_passVaryingsProcedure); - vertexLinker.setInputParams(_passVaryingsProcedure,positionVar); - fragmentLinker.declareVariable("tViewVector"); - if(this.name_NH == NormalMapSpace.TANGENT_RIGHT_HANDED || this.name_NH == NormalMapSpace.TANGENT_LEFT_HANDED) - { - nrmProcedure = this.name_NH == NormalMapSpace.TANGENT_RIGHT_HANDED ? _passTBNRightProcedure : _passTBNLeftProcedure; - vertexLinker.addProcedure(nrmProcedure); - vertexLinker.setInputParams(nrmProcedure,tangentVar,normalVar); - fragmentLinker.addProcedure(_getNormalAndViewTangentProcedure); - fragmentLinker.setOutputParams(_getNormalAndViewTangentProcedure,"tNormal","tViewVector"); - } - else - { - fragmentLinker.addProcedure(_getNormalAndViewObjectProcedure); - fragmentLinker.setOutputParams(_getNormalAndViewObjectProcedure,"tNormal","tViewVector"); - } - if(directional != null) - { - vertexLinker.addProcedure(directional.shadow.getVShader()); - shadowProc = directional.shadow.getFShader(); - fragmentLinker.addProcedure(shadowProc); - fragmentLinker.setOutputParams(shadowProc,"tTotalLight"); - dirMulShadowProcedure = _lightFragmentProcedures[directional.shadow]; - if(dirMulShadowProcedure == null) - { - dirMulShadowProcedure = new Procedure(); - this.formDirectionalProcedure(dirMulShadowProcedure,directional,true); - } - fragmentLinker.addProcedure(dirMulShadowProcedure); - fragmentLinker.setInputParams(dirMulShadowProcedure,"tNormal","tViewVector","tTotalLight","cAmbientColor"); - fragmentLinker.setOutputParams(dirMulShadowProcedure,"tTotalLight","tTotalHighLight"); - } - for(i = 0; i < lightsLength; ) - { - light = lights[i]; - if(light != directional) - { - lightFragmentProcedure = _lightFragmentProcedures[light]; - if(lightFragmentProcedure == null) - { - lightFragmentProcedure = new Procedure(); - lightFragmentProcedure.name = "light" + i.toString(); - if(light is DirectionalLight) - { - this.formDirectionalProcedure(lightFragmentProcedure,light,false); - lightFragmentProcedure.name += "Directional"; - } - else if(light is OmniLight) - { - lightFragmentProcedure.compileFromArray(["#c0=c" + light.name_oG + "Position","#c1=c" + light.name_oG + "Color","#c2=c" + light.name_oG + "Radius","#v0=vPosition","sub t0, c0, v0","dp3 t0.w, t0.xyz, t0.xyz","nrm t0.xyz, t0.xyz","add t1.xyz, i1.xyz, t0.xyz","mov t1.w, c0.w","nrm t1.xyz, t1.xyz","dp3 t1.w, t1.xyz, i0.xyz","pow t1.w, t1.w, o1.w","sqt t1.x, t0.w","dp3 t0.w, t0.xyz, i0.xyz","sub t0.x, t1.x, c2.z","div t0.y, t0.x, c2.y","sub t0.x, c2.x, t0.y","sat t0.xw, t0.xw","mul t0.xyz, c1.xyz, t0.xxx","mul t1.xyz, t0.xyz, t1.w","add o1.xyz, o1.xyz, t1.xyz","mul t0.xyz, t0.xyz, t0.www","add o0.xyz, o0.xyz, t0.xyz"]); - lightFragmentProcedure.name += "Omni"; - } - else if(light is SpotLight) - { - lightFragmentProcedure.compileFromArray(["#c0=c" + light.name_oG + "Position","#c1=c" + light.name_oG + "Color","#c2=c" + light.name_oG + "Radius","#c3=c" + light.name_oG + "Axis","#v0=vPosition","sub t0, c0, v0","dp3 t0.w, t0, t0","nrm t0.xyz,t0.xyz","add t2.xyz, i1.xyz, t0.xyz","nrm t2.xyz, t2.xyz","dp3 t2.x, t2.xyz, i0.xyz","pow t2.x, t2.x, o1.w","dp3 t1.x, t0.xyz, c3.xyz","dp3 t0.x, t0, i0.xyz","sqt t0.w, t0.w","sub t0.w, t0.w, c2.y","div t0.y, t0.w, c2.x","sub t0.w, c0.w, t0.y","sub t0.y, t1.x, c2.w","div t0.y, t0.y, c2.z","sat t0.xyw,t0.xyw","mul t1.xyz,c1.xyz,t0.yyy","mul t1.xyz,t1.xyz,t0.www","mul t2.xyz, t2.x, t1.xyz","add o1.xyz, o1.xyz, t2.xyz","mul t1.xyz, t1.xyz, t0.xxx","add o0.xyz, o0.xyz, t1.xyz"]); - lightFragmentProcedure.name += "Spot"; - } - } - fragmentLinker.addProcedure(lightFragmentProcedure); - fragmentLinker.setInputParams(lightFragmentProcedure,"tNormal","tViewVector"); - fragmentLinker.setOutputParams(lightFragmentProcedure,"tTotalLight","tTotalHighLight"); - } - i++; - } - } - if(this.specularMap != null) - { - fragmentLinker.addProcedure(_applySpecularProcedure); - fragmentLinker.setOutputParams(_applySpecularProcedure,"tTotalHighLight"); - outputProcedure = _applySpecularProcedure; - } - fragmentLinker.declareVariable("outColor"); - fragmentLinker.addProcedure(_mulLightingProcedure); - fragmentLinker.setInputParams(_mulLightingProcedure,"tTotalLight","tTotalHighLight"); - fragmentLinker.setOutputParams(_mulLightingProcedure,"outColor"); - if(name_L4) - { - fragmentLinker.addProcedure(this.alternativa3d::outputDiffuseAlpha); - fragmentLinker.setInputParams(this.alternativa3d::outputDiffuseAlpha,"outColor"); - outputProcedure = this.alternativa3d::outputDiffuseAlpha; - } - else if(opacityMap != null) - { - fragmentLinker.addProcedure(this.alternativa3d::outputOpacity); - fragmentLinker.setInputParams(this.alternativa3d::outputOpacity,"outColor"); - outputProcedure = this.alternativa3d::outputOpacity; - } - else - { - fragmentLinker.addProcedure(this.alternativa3d::outputAlpha); - fragmentLinker.setInputParams(this.alternativa3d::outputAlpha,"outColor"); - outputProcedure = this.alternativa3d::outputAlpha; - } - if(alternativa3d::fogMode == alternativa3d::SIMPLE || alternativa3d::fogMode == alternativa3d::ADVANCED) - { - fragmentLinker.setOutputParams(outputProcedure,"outColor"); - } - if(alternativa3d::fogMode == alternativa3d::SIMPLE) - { - vertexLinker.addProcedure(passSimpleFogConstProcedure); - vertexLinker.setInputParams(passSimpleFogConstProcedure,positionVar); - fragmentLinker.addProcedure(outputWithSimpleFogProcedure); - fragmentLinker.setInputParams(outputWithSimpleFogProcedure,"outColor"); - } - else if(alternativa3d::fogMode == alternativa3d::ADVANCED) - { - vertexLinker.declareVariable("tProjected"); - vertexLinker.setOutputParams(alternativa3d::_projectProcedure,"tProjected"); - vertexLinker.addProcedure(postPassAdvancedFogConstProcedure); - vertexLinker.setInputParams(postPassAdvancedFogConstProcedure,positionVar,"tProjected"); - fragmentLinker.addProcedure(outputWithAdvancedFogProcedure); - fragmentLinker.setInputParams(outputWithAdvancedFogProcedure,"outColor"); - } - fragmentLinker.setOppositeLinker(vertexLinker); - return new ShaderProgram(vertexLinker,fragmentLinker); - } - - private function formDirectionalProcedure(procedure:Procedure, light:Light3D, useShadow:Boolean) : void - { - var source:Array = ["#c0=c" + light.name_oG + "Direction","#c1=c" + light.name_oG + "Color","add t0.xyz, i1.xyz, c0.xyz","mov t0.w, c0.w","nrm t0.xyz,t0.xyz","dp3 t0.w, t0.xyz, i0.xyz","pow t0.w, t0.w, o1.w","dp3 t0.x, i0.xyz, c0.xyz","sat t0.x, t0.x"]; - if(useShadow) - { - source.push("mul t0.x, t0.x, i2.x"); - source.push("mul t0.xyz, c1.xyz, t0.xxx"); - source.push("mov o0.xyz, t0.xyz"); - source.push("add o0.xyz, o0.xyz, i3.xyz"); - source.push("mul t0.w, i2.x, t0.w"); - source.push("mul o1.xyz, c1.xyz, t0.www"); - } - else - { - source.push("mul t0.xyz, c1.xyz, t0.xxxx"); - source.push("add o0, o0, t0.xyz"); - source.push("mul t0.xyz, c1.xyz, t0.w"); - source.push("add o1.xyz, o1.xyz, t0.xyz"); - } - procedure.compileFromArray(source); - } - - override alternativa3d function fillResources(resources:Dictionary, resourceType:Class) : void - { - super.alternativa3d::fillResources(resources,resourceType); - if(this.normalMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.normalMap)) as Class,resourceType))) - { - resources[this.normalMap] = true; - } - if(opacityMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(opacityMap)) as Class,resourceType))) - { - resources[opacityMap] = true; - } - if(this.glossinessMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.glossinessMap)) as Class,resourceType))) - { - resources[this.glossinessMap] = true; - } - if(this.specularMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.specularMap)) as Class,resourceType))) - { - resources[this.specularMap] = true; - } - } - - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void - { - var program:ShaderProgram = null; - var i:int = 0; - var light:Light3D = null; - var directional:DirectionalLight = null; - var camTransform:Transform3D = null; - var transform:Transform3D = null; - var rScale:Number = NaN; - var len:Number = NaN; - var omni:OmniLight = null; - var spot:SpotLight = null; - var falloff:Number = NaN; - var hotspot:Number = NaN; - var lm:Transform3D = null; - var dist:Number = NaN; - var cLocal:Transform3D = null; - var halfW:Number = NaN; - var leftX:Number = NaN; - var leftY:Number = NaN; - var rightX:Number = NaN; - var rightY:Number = NaN; - var angle:Number = NaN; - var dx:Number = NaN; - var dy:Number = NaN; - var lens:Number = NaN; - var uScale:Number = NaN; - var uRight:Number = NaN; - var bmd:BitmapData = null; - if(diffuseMap == null || this.normalMap == null || diffuseMap.alternativa3d::_texture == null || this.normalMap.alternativa3d::_texture == null) - { - return; - } - if(!name_L4 && opacityMap != null && opacityMap.alternativa3d::_texture == null) - { - return; - } - if(this.glossinessMap != null && this.glossinessMap.alternativa3d::_texture == null) - { - return; - } - if(this.specularMap != null && this.specularMap.alternativa3d::_texture == null) - { - return; - } - var object:Object3D = surface.alternativa3d::object; - var positionBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - var uvBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TEXCOORDS[0]); - var normalsBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.NORMAL); - var tangentsBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TANGENT4); - if(positionBuffer == null || uvBuffer == null) - { - return; - } - var key:String = alternativa3d::fogMode.toString() + this.name_NH.toString() + (this.glossinessMap != null ? "G" : "g") + (opacityMap != null ? "O" : "o") + (this.specularMap != null ? "S" : "s") + (name_L4 ? "D" : "d"); - for(i = 0; i < lightsLength; i++) - { - light = lights[i]; - if(light is DirectionalLight && directional == null && DirectionalLight(light).shadow != null) - { - directional = DirectionalLight(light); - key += "S"; - } - key += light.name_oG; - } - var programs:Dictionary = _programs[object.alternativa3d::transformProcedure]; - if(programs == null) - { - programs = new Dictionary(false); - _programs[object.alternativa3d::transformProcedure] = programs; - program = this.final(object,lights,directional,lightsLength); - program.upload(camera.alternativa3d::context3D); - programs[key] = program; - } - else - { - program = programs[key]; - if(program == null) - { - program = this.final(object,lights,directional,lightsLength); - program.upload(camera.alternativa3d::context3D); - programs[key] = program; - } - } - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"),positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aUV"),uvBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[0]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[0]]); - object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); - drawUnit.alternativa3d::setProjectionConstants(camera,program.vertexShader.getVariableIndex("cProjMatrix"),object.alternativa3d::localToCameraTransform); - drawUnit.alternativa3d::setFragmentConstantsFromVector(program.fragmentShader.getVariableIndex("cAmbientColor"),camera.alternativa3d::ambient,1); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cSurface"),0,this.glossiness,this.name_kj,alpha); - if(lightsLength > 0) - { - if(this.name_NH == NormalMapSpace.TANGENT_RIGHT_HANDED || this.name_NH == NormalMapSpace.TANGENT_LEFT_HANDED) - { - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aNormal"),normalsBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.NORMAL],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.NORMAL]); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aTangent"),tangentsBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TANGENT4],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TANGENT4]); - } - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sBump"),this.normalMap.alternativa3d::_texture); - camTransform = object.alternativa3d::cameraToLocalTransform; - drawUnit.alternativa3d::setVertexConstantsFromNumbers(program.vertexShader.getVariableIndex("cCameraPosition"),camTransform.d,camTransform.h,camTransform.l); - for(i = 0; i < lightsLength; ) - { - light = lights[i]; - if(light is DirectionalLight) - { - transform = light.name_cl; - len = Number(Math.sqrt(transform.c * transform.c + transform.g * transform.g + transform.k * transform.k)); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Direction"),-transform.c / len,-transform.g / len,-transform.k / len,1); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Color"),light.alternativa3d::red,light.alternativa3d::green,light.alternativa3d::blue); - } - else if(light is OmniLight) - { - omni = light as OmniLight; - transform = light.name_cl; - rScale = Number(Math.sqrt(transform.a * transform.a + transform.e * transform.e + transform.i * transform.i)); - rScale += Math.sqrt(transform.b * transform.b + transform.f * transform.f + transform.j * transform.j); - rScale += Math.sqrt(transform.c * transform.c + transform.g * transform.g + transform.k * transform.k); - rScale /= 3; - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Position"),transform.d,transform.h,transform.l); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Radius"),1,omni.attenuationEnd * rScale - omni.attenuationBegin * rScale,omni.attenuationBegin * rScale); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Color"),light.alternativa3d::red,light.alternativa3d::green,light.alternativa3d::blue); - } - else if(light is SpotLight) - { - spot = light as SpotLight; - transform = light.name_cl; - rScale = Number(Math.sqrt(transform.a * transform.a + transform.e * transform.e + transform.i * transform.i)); - rScale += Math.sqrt(transform.b * transform.b + transform.f * transform.f + transform.j * transform.j); - rScale += len = Number(Math.sqrt(transform.c * transform.c + transform.g * transform.g + transform.k * transform.k)); - rScale /= 3; - falloff = Number(Math.cos(spot.falloff * 0.5)); - hotspot = Number(Math.cos(spot.hotspot * 0.5)); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Position"),transform.d,transform.h,transform.l); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Axis"),-transform.c / len,-transform.g / len,-transform.k / len); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Radius"),spot.attenuationEnd * rScale - spot.attenuationBegin * rScale,spot.attenuationBegin * rScale,hotspot == falloff ? 0.000001 : hotspot - falloff,falloff); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Color"),light.alternativa3d::red,light.alternativa3d::green,light.alternativa3d::blue); - } - if(directional != null) - { - directional.shadow.applyShader(drawUnit,program,object,camera); - } - i++; - } - } - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sTexture"),diffuseMap.alternativa3d::_texture); - if(!name_L4 && opacityMap != null) - { - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sOpacity"),opacityMap.alternativa3d::_texture); - } - if(this.glossinessMap != null) - { - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sGlossiness"),this.glossinessMap.alternativa3d::_texture); - } - if(this.specularMap != null) - { - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sSpecular"),this.specularMap.alternativa3d::_texture); - } - this.alternativa3d::setPassUVProcedureConstants(drawUnit,program.vertexShader); - if(alternativa3d::fogMode == alternativa3d::SIMPLE || alternativa3d::fogMode == alternativa3d::ADVANCED) - { - lm = object.alternativa3d::localToCameraTransform; - dist = alternativa3d::fogFar - alternativa3d::fogNear; - drawUnit.alternativa3d::setVertexConstantsFromNumbers(program.vertexShader.getVariableIndex("cFogSpace"),lm.i / dist,lm.j / dist,lm.k / dist,(lm.l - alternativa3d::fogNear) / dist); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cFogRange"),alternativa3d::fogMaxDensity,1,0,1 - alternativa3d::fogMaxDensity); - } - if(alternativa3d::fogMode == alternativa3d::SIMPLE) - { - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cFogColor"),alternativa3d::fogColorR,alternativa3d::fogColorG,alternativa3d::fogColorB); - } - if(alternativa3d::fogMode == alternativa3d::ADVANCED) - { - if(alternativa3d::fogTexture == null) - { - bmd = new BitmapData(32,1,false,16711680); - for(i = 0; i < 32; i++) - { - bmd.setPixel(i,0,i / 32 * 255 << 16); - } - alternativa3d::fogTexture = new BitmapTextureResource(bmd); - alternativa3d::fogTexture.upload(camera.alternativa3d::context3D); - } - cLocal = camera.alternativa3d::localToGlobalTransform; - halfW = camera.view.width / 2; - leftX = -halfW * cLocal.a + camera.alternativa3d::focalLength * cLocal.c; - leftY = -halfW * cLocal.e + camera.alternativa3d::focalLength * cLocal.g; - rightX = halfW * cLocal.a + camera.alternativa3d::focalLength * cLocal.c; - rightY = halfW * cLocal.e + camera.alternativa3d::focalLength * cLocal.g; - angle = Math.atan2(leftY,leftX) - Math.PI / 2; - if(angle < 0) - { - angle += Math.PI * 2; - } - dx = rightX - leftX; - dy = rightY - leftY; - lens = Number(Math.sqrt(dx * dx + dy * dy)); - leftX /= lens; - leftY /= lens; - rightX /= lens; - rightY /= lens; - uScale = Math.acos(leftX * rightX + leftY * rightY) / Math.PI / 2; - uRight = angle / Math.PI / 2; - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cFogConsts"),0.5 * uScale,0.5 - uRight,0); - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sFogTexture"),alternativa3d::fogTexture.alternativa3d::_texture); - } - if(this.name_ES) - { - if(drawUnit.alternativa3d::object == null) - { - throw new Error(""); - } - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.OPAQUE); - } - else if(name_L4 || opacityMap != null || alpha < 1) - { - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.SOURCE_ALPHA; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.TRANSPARENT_SORT); - } - else - { - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.OPAQUE); - } - } - } -} - diff --git a/src/alternativa/engine3d/materials/TextureFormat.as b/src/alternativa/engine3d/materials/TextureFormat.as deleted file mode 100644 index 41cb01e..0000000 --- a/src/alternativa/engine3d/materials/TextureFormat.as +++ /dev/null @@ -1,19 +0,0 @@ -package alternativa.engine3d.materials -{ - public class TextureFormat - { - public static const NONE:String = "atf_none"; - - public static const DXT1:String = "atf_dxt1"; - - public static const ETC1:String = "atf_etc1"; - - public static const PVRTC:String = "atf_pvrtc"; - - public function TextureFormat() - { - super(); - } - } -} - diff --git a/src/alternativa/engine3d/materials/TextureMaterial.as b/src/alternativa/engine3d/materials/TextureMaterial.as deleted file mode 100644 index 491d6dc..0000000 --- a/src/alternativa/engine3d/materials/TextureMaterial.as +++ /dev/null @@ -1,163 +0,0 @@ -package alternativa.engine3d.materials -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.RenderPriority; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.materials.compiler.VariableType; - import alternativa.engine3d.objects.Surface; - import alternativa.engine3d.resources.Geometry; - import alternativa.engine3d.resources.TextureResource; - import avmplus.getQualifiedClassName; - import flash.display3D.Context3DBlendFactor; - import flash.display3D.Context3DProgramType; - import flash.display3D.VertexBuffer3D; - import flash.utils.Dictionary; - import flash.utils.getDefinitionByName; - - use namespace alternativa3d; - - public class TextureMaterial extends Material - { - alternativa3d static const _samplerSetProcedure:Procedure = new Procedure(["#v0=vUV","#s0=sTexture","#c0=cAlpha","tex t0, v0, s0 <2d, linear,repeat, miplinear>","mov t0.w, c0.w","mov o0, t0"],"samplerSetProcedure"); - - alternativa3d static const _samplerSetProcedureOpacity:Procedure = new Procedure(["#v0=vUV","#s0=sTexture","#s1=sOpacity","#c0=cAlpha","tex t0, v0, s0 <2d, linear,repeat, miplinear>","tex t1, v0, s1 <2d, linear,repeat, miplinear>","mov t0.w, t1.x","mul t0.w, t0.w, c0.w","mov o0, t0"],"samplerSetProcedureOpacity"); - - alternativa3d static const _samplerSetProcedureDiffuseAlpha:Procedure = new Procedure(["#v0=vUV","#s0=sTexture","#c0=cAlpha","tex t0, v0, s0 <2d, linear,repeat, miplinear>","mul t0.w, t0.w, c0.w","mov o0, t0"],"samplerSetProcedureDiffuseAlpha"); - - alternativa3d static const _passUVProcedure:Procedure = new Procedure(["#v0=vUV","#a0=aUV","mov v0, a0"],"passUVProcedure"); - - private static var _programs:Dictionary = new Dictionary(); - - public var diffuseMap:TextureResource; - - public var opacityMap:TextureResource; - - public var alpha:Number = 1; - - public var name_L4:Boolean = false; - - public function TextureMaterial(diffuseMap:TextureResource = null, opacityMap:TextureResource = null, alpha:Number = 1) - { - super(); - this.diffuseMap = diffuseMap; - this.opacityMap = opacityMap; - this.alpha = alpha; - } - - override alternativa3d function get canDrawInShadowMap() : Boolean - { - return !this.name_L4 && this.opacityMap == null; - } - - override alternativa3d function fillResources(resources:Dictionary, resourceType:Class) : void - { - super.alternativa3d::fillResources(resources,resourceType); - if(this.diffuseMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.diffuseMap)) as Class,resourceType))) - { - resources[this.diffuseMap] = true; - } - if(this.opacityMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.opacityMap)) as Class,resourceType))) - { - resources[this.opacityMap] = true; - } - } - - private function final(object:Object3D) : ShaderProgram - { - var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); - var positionVar:String = "aPosition"; - vertexLinker.declareVariable(positionVar,VariableType.ATTRIBUTE); - if(object.alternativa3d::transformProcedure != null) - { - positionVar = alternativa3d::appendPositionTransformProcedure(object.alternativa3d::transformProcedure,vertexLinker); - } - vertexLinker.addProcedure(alternativa3d::_projectProcedure); - vertexLinker.setInputParams(alternativa3d::_projectProcedure,positionVar); - vertexLinker.addProcedure(alternativa3d::_passUVProcedure); - var outProcedure:Procedure = this.name_L4 ? alternativa3d::_samplerSetProcedureDiffuseAlpha : (this.opacityMap != null ? alternativa3d::_samplerSetProcedureOpacity : alternativa3d::_samplerSetProcedure); - var fragmentLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); - fragmentLinker.addProcedure(outProcedure); - fragmentLinker.setOppositeLinker(vertexLinker); - return new ShaderProgram(vertexLinker,fragmentLinker); - } - - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void - { - var program:ShaderProgram = null; - var object:Object3D = surface.alternativa3d::object; - var positionBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - var uvBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TEXCOORDS[0]); - var key:int = this.name_L4 ? 2 : (this.opacityMap != null ? 1 : 0); - var optionsPrograms:Vector. = _programs[object.alternativa3d::transformProcedure]; - if(optionsPrograms == null) - { - optionsPrograms = new Vector.(3,true); - _programs[object.alternativa3d::transformProcedure] = optionsPrograms; - program = this.final(object); - program.upload(camera.alternativa3d::context3D); - optionsPrograms[key] = program; - } - else - { - program = optionsPrograms[key]; - if(program == null) - { - program = this.final(object); - program.upload(camera.alternativa3d::context3D); - optionsPrograms[key] = program; - } - } - if(positionBuffer == null || uvBuffer == null || this.diffuseMap == null || this.diffuseMap.alternativa3d::_texture == null) - { - return; - } - if(!this.name_L4 && this.opacityMap != null && this.opacityMap.alternativa3d::_texture == null) - { - return; - } - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"),positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aUV"),uvBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[0]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[0]]); - object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); - drawUnit.alternativa3d::setProjectionConstants(camera,program.vertexShader.getVariableIndex("cProjMatrix"),object.alternativa3d::localToCameraTransform); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cAlpha"),0,0,0,this.alpha); - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sTexture"),this.diffuseMap.alternativa3d::_texture); - if(!this.name_L4 && this.opacityMap != null) - { - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sOpacity"),this.opacityMap.alternativa3d::_texture); - } - if(this.name_L4 || this.opacityMap != null || this.alpha < 1) - { - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.SOURCE_ALPHA; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.TRANSPARENT_SORT); - } - else - { - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.OPAQUE); - } - } - - override public function clone() : Material - { - var res:TextureMaterial = new TextureMaterial(null,null,this.alpha); - res.clonePropertiesFrom(this); - return res; - } - - override protected function clonePropertiesFrom(source:Material) : void - { - super.clonePropertiesFrom(source); - var t:TextureMaterial = source as TextureMaterial; - this.diffuseMap = t.diffuseMap; - this.opacityMap = t.opacityMap; - } - } -} - diff --git a/src/alternativa/engine3d/materials/compiler/CommandType.as b/src/alternativa/engine3d/materials/compiler/CommandType.as deleted file mode 100644 index 5accef6..0000000 --- a/src/alternativa/engine3d/materials/compiler/CommandType.as +++ /dev/null @@ -1,77 +0,0 @@ -package alternativa.engine3d.materials.compiler -{ - public class CommandType - { - public static const MOV:uint = 0; - - public static const ADD:uint = 1; - - public static const SUB:uint = 2; - - public static const MUL:uint = 3; - - public static const DIV:uint = 4; - - public static const RCP:uint = 5; - - public static const MIN:uint = 6; - - public static const MAX:uint = 7; - - public static const FRC:uint = 8; - - public static const SQT:uint = 9; - - public static const RSQ:uint = 10; - - public static const POW:uint = 11; - - public static const LOG:uint = 12; - - public static const EXP:uint = 13; - - public static const NRM:uint = 14; - - public static const SIN:uint = 15; - - public static const COS:uint = 16; - - public static const CRS:uint = 17; - - public static const DP3:uint = 18; - - public static const DP4:uint = 19; - - public static const ABS:uint = 20; - - public static const NEG:uint = 21; - - public static const SAT:uint = 22; - - public static const M33:uint = 23; - - public static const M44:uint = 24; - - public static const M34:uint = 25; - - public static const KIL:uint = 39; - - public static const TEX:uint = 40; - - public static const SGE:uint = 41; - - public static const SLT:uint = 42; - - public static const DEF:uint = 128; - - public static const CAL:uint = 129; - - public static const COMMAND_NAMES:Vector. = Vector.(["mov","add","sub","mul","div","rcp","min","max","frc","sqt","rsq","pow","log","exp","nrm","sin","cos","crs","dp3","dp4","abs","neg","sat","m33","m44","m34","1a","1b","1c","1d","1e","1f","20","21","22","23","24","25","26","kil","tex","sge","slt"]); - - public function CommandType() - { - super(); - } - } -} - diff --git a/src/alternativa/engine3d/materials/compiler/DestinationVariable.as b/src/alternativa/engine3d/materials/compiler/DestinationVariable.as deleted file mode 100644 index 18849ec..0000000 --- a/src/alternativa/engine3d/materials/compiler/DestinationVariable.as +++ /dev/null @@ -1,67 +0,0 @@ -package alternativa.engine3d.materials.compiler -{ - import flash.utils.ByteArray; - - public class DestinationVariable extends Variable - { - public function DestinationVariable(source:String) - { - var regmask:uint = 0; - var cv:int = 0; - var maskLength:uint = 0; - var i:int = 0; - super(); - var strType:String = source.match(/[tovi]/)[0]; - index = parseInt(source.match(/\d+/)[0],10); - var swizzle:Array = source.match(/\.[xyzw]{1,4}/); - var maskmatch:String = Boolean(swizzle) ? swizzle[0] : null; - if(maskmatch != null) - { - regmask = 0; - maskLength = uint(maskmatch.length); - for(i = 1; i < maskLength; i++) - { - cv = maskmatch.charCodeAt(i) - X_CHAR_CODE; - if(cv == -1) - { - cv = 3; - } - regmask |= 1 << cv; - } - } - else - { - regmask = 15; - } - name_0J = regmask << 16 | index; - switch(strType) - { - case "t": - name_0J |= 33554432; - type = 2; - break; - case "o": - name_0J |= 50331648; - type = 3; - break; - case "v": - name_0J |= 67108864; - type = 4; - break; - case "i": - name_0J |= 100663296; - type = 6; - break; - default: - throw new ArgumentError("Wrong destination register type, must be \"t\" or \"o\" or \"v\", var = " + source); - } - } - - override public function writeToByteArray(byteCode:ByteArray, newIndex:int, newType:int) : void - { - byteCode.position = position; - byteCode.writeUnsignedInt(name_0J & ~0x0F00FFFF | newIndex | newType << 24); - } - } -} - diff --git a/src/alternativa/engine3d/materials/compiler/Linker.as b/src/alternativa/engine3d/materials/compiler/Linker.as deleted file mode 100644 index 8ef694d..0000000 --- a/src/alternativa/engine3d/materials/compiler/Linker.as +++ /dev/null @@ -1,407 +0,0 @@ -package alternativa.engine3d.materials.compiler -{ - import alternativa.engine3d.alternativa3d; - import flash.display3D.Context3DProgramType; - import flash.utils.ByteArray; - import flash.utils.Dictionary; - import flash.utils.Endian; - - use namespace alternativa3d; - - public class Linker - { - public var name_RT:int = 0; - - public var name_A:int = 0; - - public var type:String; - - private var name_2L:Vector. = new Vector.(); - - private var name_RU:ByteArray = new ByteArray(); - - private var name_8Z:Boolean; - - alternativa3d var name_3r:Object; - - private var name_c:Object = new Object(); - - private var name_T1:Linker; - - private var name_W8:Dictionary = new Dictionary(); - - private var name_f:Dictionary = new Dictionary(); - - private var name_Jf:Vector. = new Vector.(6,true); - - public function Linker(programType:String) - { - super(); - this.name_RU.endian = Endian.LITTLE_ENDIAN; - this.type = programType; - this.name_RU.writeByte(160); - this.name_RU.writeUnsignedInt(1); - this.name_RU.writeByte(161); - this.name_RU.writeByte(programType == Context3DProgramType.FRAGMENT ? 1 : 0); - } - - public function clear() : void - { - this.name_RU.length = 7; - this.name_Jf[0] = this.name_Jf[1] = this.name_Jf[2] = this.name_Jf[3] = this.name_Jf[4] = this.name_Jf[5] = 0; - this.name_2L.length = 0; - this.name_8Z = false; - this.name_A = 0; - this.name_RT = 0; - this.name_3r = null; - this.name_W8 = new Dictionary(); - this.name_f = new Dictionary(); - } - - public function addProcedure(procedure:Procedure) : void - { - this.name_8Z = true; - this.name_2L.push(procedure); - } - - public function declareVariable(name:String, type:uint = 2) : void - { - var v:Variable = null; - v = new Variable(); - v.index = -1; - v.type = type; - v.name = name; - this.name_c[name] = v; - } - - public function setInputParams(procedure:Procedure, ... args) : void - { - this.name_W8[procedure] = args; - } - - public function setOutputParams(procedure:Procedure, ... args) : void - { - this.name_f[procedure] = args; - } - - public function getVariableIndex(name:String) : int - { - if(this.name_8Z) - { - this.link(); - } - var variable:Variable = this.name_3r[name]; - if(variable == null) - { - throw new Error("Variable \"" + name + "\" not found"); - } - return variable.index; - } - - public function findVariable(name:String) : int - { - if(this.name_8Z) - { - this.link(); - } - var variable:Variable = this.name_3r[name]; - if(variable == null) - { - return -1; - } - return variable.index; - } - - public function containsVariable(name:String) : Boolean - { - if(this.name_8Z) - { - this.link(); - } - return this.name_3r[name] != null; - } - - public function getByteCode() : ByteArray - { - if(this.name_8Z) - { - this.link(); - } - return this.name_RU; - } - - public function setOppositeLinker(linker:Linker) : void - { - this.name_T1 = linker; - this.name_8Z = true; - } - - public function link() : void - { - var v:Variable = null; - var j:int = 0; - var numParams:int = 0; - var i:int = 0; - var p:Procedure = null; - var input:Array = null; - var output:Array = null; - var code:ByteArray = null; - var param:String = null; - var vars:Vector. = null; - var inParam:Variable = null; - var outParam:Variable = null; - if(this.name_8Z) - { - this.name_3r = new Object(); - this.name_RU.position = 7; - this.name_Jf[0] = 0; - this.name_Jf[1] = 0; - this.name_Jf[3] = 0; - this.name_Jf[4] = 0; - this.name_Jf[5] = 0; - this.name_A = 0; - this.name_RT = 0; - for each(v in this.name_c) - { - this.name_3r[v.name] = v; - } - for(i = 0; i < this.name_2L.length; i++) - { - p = this.name_2L[i]; - this.name_A += p.name_A; - this.name_RT += p.name_RT; - input = this.name_W8[p]; - output = this.name_f[p]; - code = new ByteArray(); - code.endian = Endian.LITTLE_ENDIAN; - p.byteCode.position = 0; - p.byteCode.readBytes(code,0,p.byteCode.length); - if(input != null) - { - numParams = int(input.length); - for(j = 0; j < numParams; ) - { - param = input[j]; - v = this.name_3r[param]; - if(v == null) - { - throw new Error("Input parameter not set. paramName = " + param); - } - if(p.name_d2[6].length > j) - { - inParam = p.name_d2[6][j]; - if(inParam == null) - { - throw new Error("Input parameter set, but not exist in code. paramName = " + param + ", register = i" + j.toString()); - } - if(this.name_c[v.name] != null && v.index < 0) - { - v.index = int(this.name_Jf[v.type]++); - } - while(inParam != null) - { - inParam.writeToByteArray(code,v.index,v.type); - inParam = inParam.next; - } - } - j++; - } - } - if(output != null) - { - numParams = int(output.length); - for(j = 0; j < numParams; j++) - { - param = output[j]; - v = this.name_3r[param]; - if(v == null) - { - if(!(j == 0 && i == this.name_2L.length - 1)) - { - throw new Error("Output parameter have not declared. paramName = " + param); - } - } - else - { - if(this.name_c[v.name] != null && v.index < 0) - { - if(v.type != 2) - { - throw new Error("Wrong output type:" + VariableType.TYPE_NAMES[v.type]); - } - v.index = int(this.name_Jf[v.type]++); - } - outParam = p.name_d2[3][j]; - if(outParam == null) - { - throw new Error("Output parameter set, but not exist in code. paramName = " + param + ", register = i" + j.toString()); - } - while(outParam != null) - { - outParam.writeToByteArray(code,v.index,v.type); - outParam = outParam.next; - } - } - } - } - vars = p.name_d2[2]; - for(j = 0; j < vars.length; j++) - { - v = vars[j]; - if(v != null) - { - while(v != null) - { - v.writeToByteArray(code,v.index + this.name_Jf[2],VariableType.TEMPORARY); - v = v.next; - } - } - } - this.name_Jf[VariableType.CONSTANT] += p.name_in; - this.resolveVariablesUsages(code,p.name_d2[0],VariableType.ATTRIBUTE); - this.resolveVariablesUsages(code,p.name_d2[1],VariableType.CONSTANT); - this.resolveVaryings(code,p.name_d2[4]); - this.resolveVariablesUsages(code,p.name_d2[5],VariableType.SAMPLER); - this.name_RU.writeBytes(code,0,code.length); - } - this.name_8Z = false; - } - } - - private function resolveVaryings(code:ByteArray, variableUsages:Vector.) : void - { - var vUsage:Variable = null; - var variable:Variable = null; - var type:uint = VariableType.VARYING; - if(this.name_T1 != null && this.name_T1.name_8Z) - { - this.name_T1.link(); - } - var oppositeVariables:Object = this.name_T1 != null ? this.name_T1.name_3r : null; - for(var j:uint = 0; j < variableUsages.length; j++) - { - vUsage = variableUsages[j]; - if(vUsage != null) - { - variable = this.name_3r[vUsage.name]; - if(variable == null) - { - variable = Variable.create(); - if(vUsage.name == null) - { - throw new Error("Varying is not assigned. Use \'assignVariableName\' method. register = " + vUsage.index); - } - this.name_3r[vUsage.name] = variable; - variable.name = vUsage.name; - if(oppositeVariables != null) - { - if(!(vUsage.name in oppositeVariables)) - { - throw new Error("Varying with this name is not assigned to opposite linker. name = " + vUsage.name); - } - variable.index = Variable(oppositeVariables[vUsage.name]).index; - } - else - { - variable.index = this.name_Jf[type]; - this.name_Jf[type] += vUsage.size; - } - variable.type = type; - } - while(Boolean(vUsage)) - { - vUsage.writeToByteArray(code,variable.index,variable.type); - vUsage = vUsage.next; - } - } - } - } - - private function resolveVariablesUsages(code:ByteArray, variableUsages:Vector., type:uint) : void - { - var vUsage:Variable = null; - var variable:Variable = null; - for(var j:int = 0; j < variableUsages.length; j++) - { - vUsage = variableUsages[j]; - if(vUsage != null) - { - variable = this.name_3r[vUsage.name]; - if(variable == null) - { - variable = Variable.create(); - if(vUsage.name != null) - { - this.name_3r[vUsage.name] = variable; - } - else if(!vUsage.isRelative) - { - throw new Error(VariableType.TYPE_NAMES[type] + " is not assigned. Use \"assignVariableName\" method. register = " + vUsage.index); - } - variable.name = vUsage.name; - variable.index = this.name_Jf[type]; - this.name_Jf[type] += vUsage.size; - variable.type = type; - } - else if(variable.index < 0) - { - variable.index = int(this.name_Jf[type]++); - } - while(vUsage != null) - { - vUsage.writeToByteArray(code,variable.index,variable.type); - vUsage = vUsage.next; - } - } - } - } - - public function describeLinkageInfo() : String - { - var str:String = null; - var p:Procedure = null; - var args:* = undefined; - var result:String = "LINKER:\n"; - var totalCodes:uint = 0; - var totalCommands:uint = 0; - for(var i:int = 0; i < this.name_2L.length; i++) - { - p = this.name_2L[i]; - if(p.name != null) - { - result += p.name + "("; - } - else - { - result += "#" + i.toString() + "("; - } - args = this.name_W8[p]; - if(args != null) - { - for each(str in args) - { - result += str + ","; - } - result = result.substr(0,result.length - 1); - } - result += ")"; - args = this.name_f[p]; - if(args != null) - { - result += "->("; - for each(str in args) - { - result += str + ","; - } - result = result.substr(0,result.length - 1); - result += ")"; - } - result += " [IS:" + p.name_RT.toString() + ", CMDS:" + p.name_A.toString() + "]\n"; - totalCodes += p.name_RT; - totalCommands += p.name_A; - } - return result + ("[IS:" + totalCodes.toString() + ", CMDS:" + totalCommands.toString() + "]\n"); - } - } -} - diff --git a/src/alternativa/engine3d/materials/compiler/Procedure.as b/src/alternativa/engine3d/materials/compiler/Procedure.as deleted file mode 100644 index 264855c..0000000 --- a/src/alternativa/engine3d/materials/compiler/Procedure.as +++ /dev/null @@ -1,370 +0,0 @@ -package alternativa.engine3d.materials.compiler -{ - import alternativa.engine3d.alternativa3d; - import flash.utils.ByteArray; - import flash.utils.Endian; - - use namespace alternativa3d; - - public class Procedure - { - public var name:String; - - public var byteCode:ByteArray = new ByteArray(); - - public var name_d2:Vector.> = new Vector.>(); - - public var name_RT:int = 0; - - public var name_A:int = 0; - - alternativa3d var name_in:uint = 0; - - public function Procedure(array:Array = null, name:String = null) - { - super(); - this.byteCode.endian = Endian.LITTLE_ENDIAN; - this.name = name; - if(array != null) - { - this.compileFromArray(array); - } - } - - public static function compileFromArray(source:Array, name:String = null) : Procedure - { - return new Procedure(source,name); - } - - public static function compileFromString(source:String, name:String = null) : Procedure - { - var proc:Procedure = new Procedure(null,name); - proc.compileFromString(source); - return proc; - } - - private function addVariableUsage(v:Variable) : void - { - var vars:Vector. = this.name_d2[v.type]; - var index:int = v.index; - if(index >= vars.length) - { - vars.length = index + 1; - } - else - { - v.next = vars[index]; - } - vars[index] = v; - } - - public function assignVariableName(type:uint, index:uint, name:String, size:uint = 1) : void - { - for(var v:Variable = this.name_d2[type][index]; v != null; ) - { - v.size = size; - v.name = name; - v = v.next; - } - } - - public function compileFromString(source:String) : void - { - var commands:Array = source.split("\n"); - this.compileFromArray(commands); - } - - public function compileFromArray(source:Array) : void - { - var cmd:String = null; - var declaration:Array = null; - var decArray:Array = null; - var regType:String = null; - var varIndex:int = 0; - var varName:String = null; - for(var i:int = 0; i < 7; i++) - { - this.name_d2[i] = new Vector.(); - } - this.byteCode.length = 0; - this.name_A = 0; - this.name_RT = 0; - var declarationStrings:Vector. = new Vector.(); - var count:int = int(source.length); - for(i = 0; i < count; i++) - { - cmd = source[i]; - declaration = cmd.match(/# *[acvs]\d{1,3} *= *[a-zA-Z0-9_]*/i); - if(declaration != null && declaration.length > 0) - { - declarationStrings.push(declaration[0]); - } - else - { - this.writeCommand(cmd); - } - } - for(i = 0,count = int(declarationStrings.length); i < count; ) - { - decArray = declarationStrings[i].split("="); - regType = decArray[0].match(/[acvs]/i); - varIndex = int(int(decArray[0].match(/\d{1,3}/i))); - varName = decArray[1].match(/[a-zA-Z0-9]*/i); - switch(regType.toLowerCase()) - { - case "a": - this.assignVariableName(VariableType.ATTRIBUTE,varIndex,varName); - break; - case "c": - this.assignVariableName(VariableType.CONSTANT,varIndex,varName); - break; - case "v": - this.assignVariableName(VariableType.VARYING,varIndex,varName); - break; - case "s": - this.assignVariableName(VariableType.SAMPLER,varIndex,varName); - break; - } - i++; - } - } - - public function assignConstantsArray(registersCount:uint = 1) : void - { - this.name_in = registersCount; - } - - private function writeCommand(source:String) : void - { - var destination:Variable = null; - var source1:SourceVariable = null; - var source2:Variable = null; - var type:uint = 0; - var s2v:SourceVariable = null; - var commentIndex:int = int(source.indexOf("//")); - if(commentIndex >= 0) - { - source = source.substr(0,commentIndex); - } - var operands:Array = source.match(/[A-Za-z]+(((\[.+\])|(\d+))(\.[xyzw]{1,4})?(\ *\<.*>)?)?/g); - if(operands.length < 2) - { - return; - } - var opCode:String = operands[0]; - if(opCode == "kil") - { - source1 = new SourceVariable(operands[1]); - } - else - { - destination = new DestinationVariable(operands[1]); - source1 = new SourceVariable(operands[2]); - this.addVariableUsage(destination); - } - this.addVariableUsage(source1); - switch(opCode) - { - case "mov": - type = CommandType.MOV; - ++this.name_RT; - break; - case "add": - type = CommandType.ADD; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - ++this.name_RT; - break; - case "sub": - type = CommandType.SUB; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - ++this.name_RT; - break; - case "mul": - type = CommandType.MUL; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - ++this.name_RT; - break; - case "div": - type = CommandType.DIV; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - ++this.name_RT; - break; - case "rcp": - type = CommandType.RCP; - ++this.name_RT; - break; - case "min": - type = CommandType.MIN; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - ++this.name_RT; - break; - case "max": - type = CommandType.MAX; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - ++this.name_RT; - break; - case "frc": - type = CommandType.FRC; - ++this.name_RT; - break; - case "sqt": - type = CommandType.SQT; - ++this.name_RT; - break; - case "rsq": - type = CommandType.RSQ; - ++this.name_RT; - break; - case "pow": - type = CommandType.POW; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - this.name_RT += 3; - break; - case "log": - type = CommandType.LOG; - ++this.name_RT; - break; - case "exp": - type = CommandType.EXP; - ++this.name_RT; - break; - case "nrm": - type = CommandType.NRM; - this.name_RT += 3; - break; - case "sin": - type = CommandType.SIN; - this.name_RT += 8; - break; - case "cos": - type = CommandType.COS; - this.name_RT += 8; - break; - case "crs": - type = CommandType.CRS; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - this.name_RT += 2; - break; - case "dp3": - type = CommandType.DP3; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - ++this.name_RT; - break; - case "dp4": - type = CommandType.DP4; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - ++this.name_RT; - break; - case "abs": - type = CommandType.ABS; - ++this.name_RT; - break; - case "neg": - type = CommandType.NEG; - ++this.name_RT; - break; - case "sat": - type = CommandType.SAT; - ++this.name_RT; - break; - case "m33": - type = CommandType.M33; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - this.name_RT += 3; - break; - case "m44": - type = CommandType.M44; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - this.name_RT += 4; - break; - case "m34": - type = CommandType.M34; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - this.name_RT += 3; - break; - case "kil": - type = CommandType.KIL; - ++this.name_RT; - break; - case "tex": - type = CommandType.TEX; - source2 = new SamplerVariable(operands[3]); - this.addVariableUsage(source2); - ++this.name_RT; - break; - case "sge": - type = CommandType.SGE; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - ++this.name_RT; - break; - case "slt": - type = CommandType.SLT; - source2 = new SourceVariable(operands[3]); - this.addVariableUsage(source2); - ++this.name_RT; - } - this.byteCode.writeUnsignedInt(type); - if(destination != null) - { - destination.position = this.byteCode.position; - this.byteCode.writeUnsignedInt(destination.name_0J); - } - else - { - this.byteCode.writeUnsignedInt(0); - } - source1.position = this.byteCode.position; - if(source1.relative != null) - { - this.addVariableUsage(source1.relative); - source1.relative.position = this.byteCode.position; - } - this.byteCode.writeUnsignedInt(source1.name_0J); - this.byteCode.writeUnsignedInt(source1.name_oc); - if(source2 != null) - { - s2v = source2 as SourceVariable; - source2.position = this.byteCode.position; - if(s2v != null && s2v.relative != null) - { - this.addVariableUsage(s2v.relative); - s2v.relative.position = s2v.position; - } - this.byteCode.writeUnsignedInt(source2.name_0J); - this.byteCode.writeUnsignedInt(source2.name_oc); - } - else - { - this.byteCode.position = this.byteCode.length = this.byteCode.length + 8; - } - ++this.name_A; - } - - public function newInstance() : Procedure - { - var res:Procedure = new Procedure(); - res.byteCode = this.byteCode; - res.name_d2 = this.name_d2; - res.name_RT = this.name_RT; - res.name_in = this.name_in; - res.name_A = this.name_A; - res.name = this.name; - return res; - } - } -} - diff --git a/src/alternativa/engine3d/materials/compiler/RelativeVariable.as b/src/alternativa/engine3d/materials/compiler/RelativeVariable.as deleted file mode 100644 index 5c2de0e..0000000 --- a/src/alternativa/engine3d/materials/compiler/RelativeVariable.as +++ /dev/null @@ -1,61 +0,0 @@ -package alternativa.engine3d.materials.compiler -{ - import flash.utils.ByteArray; - - public class RelativeVariable extends Variable - { - public function RelativeVariable(source:String) - { - super(); - var relname:Array = source.match(/[A-Za-z]/g); - index = parseInt(source.match(/\d+/g)[0],10); - switch(relname[0]) - { - case "a": - type = VariableType.ATTRIBUTE; - break; - case "c": - type = VariableType.CONSTANT; - break; - case "t": - type = VariableType.TEMPORARY; - break; - case "i": - type = VariableType.INPUT; - } - var selmatch:Array = source.match(/(\.[xyzw]{1,1})/); - if(selmatch.length == 0) - { - throw new Error("error: bad index register select"); - } - var relsel:int = selmatch[0].charCodeAt(1) - X_CHAR_CODE; - if(relsel == -1) - { - relsel = 3; - } - var relofs:Array = source.match(/\+\d{1,3}/g); - var reloffset:int = 0; - if(relofs.length > 0) - { - reloffset = int(parseInt(relofs[0],10)); - } - if(reloffset < 0 || reloffset > 255) - { - throw new Error("Error: index offset " + reloffset + " out of bounds. [0..255]"); - } - name_0J = reloffset << 16 | index; - name_oc |= type << 8; - name_oc |= relsel << 16; - name_oc |= 1 << 31; - } - - override public function writeToByteArray(byteCode:ByteArray, newIndex:int, newType:int) : void - { - byteCode.position = position; - byteCode.writeShort(newIndex); - byteCode.position = position + 5; - byteCode.writeByte(newType); - } - } -} - diff --git a/src/alternativa/engine3d/materials/compiler/SamplerVariable.as b/src/alternativa/engine3d/materials/compiler/SamplerVariable.as deleted file mode 100644 index 9aaeb64..0000000 --- a/src/alternativa/engine3d/materials/compiler/SamplerVariable.as +++ /dev/null @@ -1,94 +0,0 @@ -package alternativa.engine3d.materials.compiler -{ - import flash.utils.ByteArray; - - public class SamplerVariable extends Variable - { - public function SamplerVariable(source:String) - { - var opts:Array = null; - var op:String = null; - super(); - var strType:String = String(source.match(/[si]/g)[0]); - switch(strType) - { - case "s": - name_oc = VariableType.SAMPLER; - break; - case "i": - name_oc = VariableType.INPUT; - } - index = parseInt(source.match(/\d+/g)[0],10); - name_0J = index; - var optsi:int = int(source.search(/<.*>/g)); - if(optsi != -1) - { - opts = source.substring(optsi).match(/(\w+)/g); - } - type = name_oc; - var optsLength:uint = uint(opts.length); - for(var i:int = 0; i < optsLength; ) - { - op = opts[i]; - switch(op) - { - case "2d": - name_oc &= ~0xF000; - break; - case "3d": - name_oc &= ~0xF000; - name_oc |= 8192; - break; - case "cube": - name_oc &= ~0xF000; - name_oc |= 4096; - break; - case "mipnearest": - name_oc &= ~0x0F000000; - name_oc |= 16777216; - break; - case "miplinear": - name_oc &= ~0x0F000000; - name_oc |= 33554432; - break; - case "mipnone": - case "nomip": - name_oc &= ~0x0F000000; - break; - case "nearest": - name_oc &= ~4026531840; - break; - case "linear": - name_oc &= ~4026531840; - name_oc |= 268435456; - break; - case "centroid": - name_oc |= 4294967296; - break; - case "single": - name_oc |= 8589934592; - break; - case "depth": - name_oc |= 17179869184; - break; - case "repeat": - case "wrap": - name_oc &= ~0xF00000; - name_oc |= 1048576; - break; - case "clamp": - name_oc &= ~0xF00000; - break; - } - i++; - } - } - - override public function writeToByteArray(byteCode:ByteArray, newIndex:int, newType:int) : void - { - super.writeToByteArray(byteCode,newIndex,newType); - byteCode.position = position + 4; - } - } -} - diff --git a/src/alternativa/engine3d/materials/compiler/SourceVariable.as b/src/alternativa/engine3d/materials/compiler/SourceVariable.as deleted file mode 100644 index 1be5bf3..0000000 --- a/src/alternativa/engine3d/materials/compiler/SourceVariable.as +++ /dev/null @@ -1,111 +0,0 @@ -package alternativa.engine3d.materials.compiler -{ - import flash.utils.ByteArray; - - public class SourceVariable extends Variable - { - public var relative:RelativeVariable; - - public function SourceVariable(source:String) - { - var regmask:uint = 0; - var isRel:Boolean = false; - var cv:int = 0; - var maskLength:uint = 0; - var i:int = 0; - super(); - var strType:String = String(source.match(/[catsoiv]/g)[0]); - var relreg:Array = source.match(/\[.*\]/g); - isRel = relreg.length > 0; - if(isRel) - { - source = source.replace(relreg[0],"0"); - } - else - { - index = parseInt(source.match(/\d+/g)[0],10); - } - var swizzle:Array = source.match(/\.[xyzw]{1,4}/); - var maskmatch:String = Boolean(swizzle) ? swizzle[0] : null; - if(Boolean(maskmatch)) - { - regmask = 0; - maskLength = uint(maskmatch.length); - for(i = 1; i < maskLength; i++) - { - cv = maskmatch.charCodeAt(i) - X_CHAR_CODE; - if(cv == -1) - { - cv = 3; - } - regmask |= cv << (i - 1 << 1); - } - while(i <= 4) - { - regmask |= cv << (i - 1 << 1); - i++; - } - } - else - { - regmask = 228; - } - name_0J = regmask << 24 | index; - switch(strType) - { - case "a": - type = VariableType.ATTRIBUTE; - break; - case "c": - type = VariableType.CONSTANT; - break; - case "t": - type = VariableType.TEMPORARY; - break; - case "o": - type = VariableType.OUTPUT; - break; - case "v": - type = VariableType.VARYING; - break; - case "i": - type = VariableType.INPUT; - break; - default: - throw new ArgumentError("Wrong source register type, must be \"a\" or \"c\" or \"t\" or \"o\" or \"v\" or \"i\", var = " + source); - } - name_oc = type; - if(isRel) - { - this.relative = new RelativeVariable(relreg[0]); - name_0J |= this.relative.name_0J; - name_oc |= this.relative.name_oc; - isRelative = true; - } - } - - override public function get size() : uint - { - if(Boolean(this.relative)) - { - return 0; - } - return super.size; - } - - override public function writeToByteArray(byteCode:ByteArray, newIndex:int, newType:int) : void - { - if(this.relative == null) - { - super.writeToByteArray(byteCode,newIndex,newType); - } - else - { - byteCode.position = position + 2; - } - byteCode.position = position + 4; - byteCode.writeByte(newType); - } - } -} - diff --git a/src/alternativa/engine3d/materials/compiler/Variable.as b/src/alternativa/engine3d/materials/compiler/Variable.as deleted file mode 100644 index b4da815..0000000 --- a/src/alternativa/engine3d/materials/compiler/Variable.as +++ /dev/null @@ -1,69 +0,0 @@ -package alternativa.engine3d.materials.compiler -{ - import flash.utils.ByteArray; - - public class Variable - { - private static var collector:Variable; - - protected static const X_CHAR_CODE:Number = "x".charCodeAt(0); - - public var name:String; - - public var index:int; - - public var type:uint; - - public var position:uint = 0; - - public var next:Variable; - - public var name_0J:uint; - - public var name_oc:uint; - - public var isRelative:Boolean; - - private var name_RS:uint = 1; - - public function Variable() - { - super(); - } - - public static function create() : Variable - { - if(collector == null) - { - collector = new Variable(); - } - var output:Variable = collector; - collector = collector.next; - output.next = null; - return output; - } - - public function dispose() : void - { - this.next = collector; - collector = this; - } - - public function get size() : uint - { - return this.name_RS; - } - - public function set size(value:uint) : void - { - this.name_RS = value; - } - - public function writeToByteArray(byteCode:ByteArray, newIndex:int, newType:int) : void - { - byteCode.position = this.position; - byteCode.writeShort(newIndex); - } - } -} - diff --git a/src/alternativa/engine3d/materials/compiler/VariableType.as b/src/alternativa/engine3d/materials/compiler/VariableType.as deleted file mode 100644 index 3b77843..0000000 --- a/src/alternativa/engine3d/materials/compiler/VariableType.as +++ /dev/null @@ -1,27 +0,0 @@ -package alternativa.engine3d.materials.compiler -{ - public class VariableType - { - public static const ATTRIBUTE:uint = 0; - - public static const CONSTANT:uint = 1; - - public static const TEMPORARY:uint = 2; - - public static const OUTPUT:uint = 3; - - public static const VARYING:uint = 4; - - public static const SAMPLER:uint = 5; - - public static const INPUT:uint = 6; - - public static const TYPE_NAMES:Vector. = Vector.(["attribute","constant","temporary","output","varying","sampler","input"]); - - public function VariableType() - { - super(); - } - } -} - diff --git a/src/alternativa/engine3d/objects/Decal.as b/src/alternativa/engine3d/objects/Decal.as deleted file mode 100644 index 1c69765..0000000 --- a/src/alternativa/engine3d/objects/Decal.as +++ /dev/null @@ -1,79 +0,0 @@ -package alternativa.engine3d.objects -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.Debug; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.RenderPriority; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - - use namespace alternativa3d; - - public class Decal extends Mesh - { - private static var transformProcedureStatic:Procedure = new Procedure(["sub t0.xyz, c0.xyz, i0.xyz","dp3 t0.w, t0.xyz, c1.xyz","mul t0.w, t0.w, c0.w","nrm t0.xyz, t0.xyz","mul t0.xyz, t0.xyz, t0.w","add o0.xyz, i0.xyz, t0.xyz","mov o0.w, c1.w","#c0=cPos","#c1=cDir"],"DecalTransformProcedure"); - - public var offset:Number; - - public function Decal(offset:Number) - { - super(); - this.offset = offset; - alternativa3d::transformProcedure = transformProcedureStatic; - } - - override alternativa3d function collectDraws(camera:Camera3D, lights:Vector., lightsLength:int) : void - { - var surface:Surface = null; - var debug:int = 0; - for(var i:int = 0; i < name_Oy; ) - { - surface = name_eW[i]; - if(surface.material != null) - { - surface.material.alternativa3d::collectDraws(camera,surface,geometry,lights,lightsLength,RenderPriority.DECALS); - } - if(alternativa3d::listening) - { - camera.view.alternativa3d::addSurfaceToMouseEvents(surface,geometry,alternativa3d::transformProcedure); - } - i++; - } - if(camera.debug) - { - debug = camera.alternativa3d::checkInDebug(this); - if(Boolean(debug & Debug.BOUNDS) && boundBox != null) - { - Debug.alternativa3d::drawBoundBox(camera,boundBox,alternativa3d::localToCameraTransform); - } - } - } - - override alternativa3d function setTransformConstants(drawUnit:DrawUnit, surface:Surface, vertexShader:Linker, camera:Camera3D) : void - { - var dx:Number = -alternativa3d::cameraToLocalTransform.c; - var dy:Number = -alternativa3d::cameraToLocalTransform.g; - var dz:Number = -alternativa3d::cameraToLocalTransform.k; - var len:Number = this.offset / Math.sqrt(dx * dx + dy * dy + dz * dz) / camera.alternativa3d::focalLength; - drawUnit.alternativa3d::setVertexConstantsFromNumbers(vertexShader.getVariableIndex("cPos"),alternativa3d::cameraToLocalTransform.d,alternativa3d::cameraToLocalTransform.h,alternativa3d::cameraToLocalTransform.l,len); - drawUnit.alternativa3d::setVertexConstantsFromNumbers(vertexShader.getVariableIndex("cDir"),dx,dy,dz,1); - } - - override public function clone() : Object3D - { - var res:Decal = new Decal(this.offset); - res.clonePropertiesFrom(this); - return res; - } - - override protected function clonePropertiesFrom(source:Object3D) : void - { - super.clonePropertiesFrom(source); - this.offset = (source as Decal).offset; - } - } -} - diff --git a/src/alternativa/engine3d/objects/Joint.as b/src/alternativa/engine3d/objects/Joint.as deleted file mode 100644 index 413a3b9..0000000 --- a/src/alternativa/engine3d/objects/Joint.as +++ /dev/null @@ -1,62 +0,0 @@ -package alternativa.engine3d.objects -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.Transform3D; - - use namespace alternativa3d; - - public class Joint extends Object3D - { - alternativa3d var name_Dy:Transform3D = new Transform3D(); - - alternativa3d var bindPoseTransform:Transform3D = new Transform3D(); - - private var name_ar:Transform3D = new Transform3D(); - - public function Joint() - { - super(); - } - - alternativa3d function setBindPoseMatrix(matrix:Vector.) : void - { - this.alternativa3d::bindPoseTransform.initFromVector(matrix); - } - - alternativa3d function calculateTransform() : void - { - if(this.alternativa3d::bindPoseTransform != null) - { - this.name_Dy.combine(alternativa3d::localToGlobalTransform,this.alternativa3d::bindPoseTransform); - } - } - - override public function clone() : Object3D - { - var res:Joint = new Joint(); - res.clonePropertiesFrom(this); - return res; - } - - override protected function clonePropertiesFrom(source:Object3D) : void - { - var sourceJoint:Joint = null; - super.clonePropertiesFrom(source); - sourceJoint = source as Joint; - this.alternativa3d::bindPoseTransform.a = sourceJoint.alternativa3d::bindPoseTransform.a; - this.alternativa3d::bindPoseTransform.b = sourceJoint.alternativa3d::bindPoseTransform.b; - this.alternativa3d::bindPoseTransform.c = sourceJoint.alternativa3d::bindPoseTransform.c; - this.alternativa3d::bindPoseTransform.d = sourceJoint.alternativa3d::bindPoseTransform.d; - this.alternativa3d::bindPoseTransform.e = sourceJoint.alternativa3d::bindPoseTransform.e; - this.alternativa3d::bindPoseTransform.f = sourceJoint.alternativa3d::bindPoseTransform.f; - this.alternativa3d::bindPoseTransform.g = sourceJoint.alternativa3d::bindPoseTransform.g; - this.alternativa3d::bindPoseTransform.h = sourceJoint.alternativa3d::bindPoseTransform.h; - this.alternativa3d::bindPoseTransform.i = sourceJoint.alternativa3d::bindPoseTransform.i; - this.alternativa3d::bindPoseTransform.j = sourceJoint.alternativa3d::bindPoseTransform.j; - this.alternativa3d::bindPoseTransform.k = sourceJoint.alternativa3d::bindPoseTransform.k; - this.alternativa3d::bindPoseTransform.l = sourceJoint.alternativa3d::bindPoseTransform.l; - } - } -} - diff --git a/src/alternativa/engine3d/objects/Mesh.as b/src/alternativa/engine3d/objects/Mesh.as deleted file mode 100644 index ea8c86f..0000000 --- a/src/alternativa/engine3d/objects/Mesh.as +++ /dev/null @@ -1,187 +0,0 @@ -package alternativa.engine3d.objects -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.collisions.EllipsoidCollider; - import alternativa.engine3d.core.BoundBox; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.Debug; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.RayIntersectionData; - import alternativa.engine3d.core.Transform3D; - import alternativa.engine3d.materials.Material; - import alternativa.engine3d.resources.Geometry; - import flash.geom.Vector3D; - import flash.utils.Dictionary; - - use namespace alternativa3d; - - public class Mesh extends Object3D - { - public var geometry:Geometry; - - alternativa3d var name_eW:Vector. = new Vector.(); - - alternativa3d var name_Oy:int = 0; - - public function Mesh() - { - super(); - } - - override public function intersectRay(origin:Vector3D, direction:Vector3D) : RayIntersectionData - { - var contentData:RayIntersectionData = null; - var minTime:Number = NaN; - var s:Surface = null; - var data:RayIntersectionData = null; - var childrenData:RayIntersectionData = super.intersectRay(origin,direction); - if(boundBox != null && !boundBox.intersectRay(origin,direction)) - { - contentData = null; - } - else if(this.geometry != null) - { - minTime = 1e+22; - for each(s in this.name_eW) - { - data = this.geometry.alternativa3d::intersectRay(origin,direction,s.indexBegin,s.numTriangles); - if(data != null && data.time < minTime) - { - contentData = data; - contentData.object = this; - contentData.surface = s; - minTime = data.time; - } - } - } - if(childrenData == null) - { - return contentData; - } - if(contentData == null) - { - return childrenData; - } - return childrenData.time < contentData.time ? childrenData : contentData; - } - - public function addSurface(material:Material, indexBegin:uint, numTriangles:uint) : Surface - { - var res:Surface = new Surface(); - res.alternativa3d::object = this; - res.material = material; - res.indexBegin = indexBegin; - res.numTriangles = numTriangles; - var _loc5_:* = this.name_Oy++; - this.name_eW[_loc5_] = res; - return res; - } - - public function getSurface(index:int) : Surface - { - return this.name_eW[index]; - } - - public function get numSurfaces() : int - { - return this.name_Oy; - } - - public function setMaterialToAllSurfaces(material:Material) : void - { - for(var i:int = 0; i < this.name_eW.length; i++) - { - this.name_eW[i].material = material; - } - } - - override alternativa3d function get useLights() : Boolean - { - return true; - } - - override alternativa3d function updateBoundBox(boundBox:BoundBox, hierarchy:Boolean, transform:Transform3D = null) : void - { - super.alternativa3d::updateBoundBox(boundBox,hierarchy,transform); - if(this.geometry != null) - { - this.geometry.alternativa3d::updateBoundBox(boundBox,transform); - } - } - - override alternativa3d function fillResources(resources:Dictionary, hierarchy:Boolean = false, resourceType:Class = null) : void - { - var s:Surface = null; - if(this.geometry != null && (resourceType == null || this.geometry is resourceType)) - { - resources[this.geometry] = true; - } - for(var i:int = 0; i < this.name_Oy; ) - { - s = this.name_eW[i]; - if(s.material != null) - { - s.material.alternativa3d::fillResources(resources,resourceType); - } - i++; - } - super.alternativa3d::fillResources(resources,hierarchy,resourceType); - } - - override alternativa3d function collectDraws(camera:Camera3D, lights:Vector., lightsLength:int) : void - { - var surface:Surface = null; - var debug:int = 0; - for(var i:int = 0; i < this.name_Oy; ) - { - surface = this.name_eW[i]; - if(surface.material != null) - { - surface.material.alternativa3d::collectDraws(camera,surface,this.geometry,lights,lightsLength); - } - if(alternativa3d::listening) - { - camera.view.alternativa3d::addSurfaceToMouseEvents(surface,this.geometry,alternativa3d::transformProcedure); - } - i++; - } - if(camera.debug) - { - debug = camera.alternativa3d::checkInDebug(this); - if(Boolean(debug & Debug.BOUNDS) && boundBox != null) - { - Debug.alternativa3d::drawBoundBox(camera,boundBox,alternativa3d::localToCameraTransform); - } - } - } - - override alternativa3d function collectGeometry(collider:EllipsoidCollider, excludedObjects:Dictionary) : void - { - collider.alternativa3d::geometries.push(this.geometry); - collider.name_QK.push(alternativa3d::localToGlobalTransform); - } - - override public function clone() : Object3D - { - var res:Mesh = new Mesh(); - res.clonePropertiesFrom(this); - return res; - } - - override protected function clonePropertiesFrom(source:Object3D) : void - { - var s:Surface = null; - super.clonePropertiesFrom(source); - var mesh:Mesh = source as Mesh; - this.geometry = mesh.geometry; - this.name_Oy = 0; - this.name_eW.length = 0; - for each(s in mesh.name_eW) - { - this.addSurface(s.material,s.indexBegin,s.numTriangles); - } - } - } -} - diff --git a/src/alternativa/engine3d/objects/Skin.as b/src/alternativa/engine3d/objects/Skin.as deleted file mode 100644 index 590cba9..0000000 --- a/src/alternativa/engine3d/objects/Skin.as +++ /dev/null @@ -1,671 +0,0 @@ -package alternativa.engine3d.objects -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.Debug; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.materials.Material; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.materials.compiler.VariableType; - import alternativa.engine3d.resources.Geometry; - import flash.utils.ByteArray; - import flash.utils.Dictionary; - import flash.utils.Endian; - - use namespace alternativa3d; - - public class Skin extends Mesh - { - private static var _transformProcedures:Dictionary = new Dictionary(); - - private static var _deltaTransformProcedures:Dictionary = new Dictionary(); - - public var name_WA:Vector.; - - alternativa3d var name_Cq:Vector.>; - - alternativa3d var name_fB:Vector.; - - alternativa3d var name_do:Vector.; - - private var numJoints:int = 0; - - private var maxInfluences:int = 0; - - public function Skin(maxInfluences:int, numJoints:int) - { - super(); - this.numJoints = numJoints; - this.maxInfluences = maxInfluences; - this.name_WA = new Vector.(); - this.name_Cq = new Vector.>(); - this.name_fB = new Vector.(); - this.name_do = new Vector.(); - alternativa3d::transformProcedure = this.calculateTransformProcedure(maxInfluences,numJoints); - alternativa3d::deltaTransformProcedure = this.calculateDeltaTransformProcedure(maxInfluences,numJoints); - } - - override public function addSurface(material:Material, indexBegin:uint, numTriangles:uint) : Surface - { - this.name_fB[name_Oy] = alternativa3d::transformProcedure; - this.name_do[name_Oy] = alternativa3d::deltaTransformProcedure; - this.name_Cq[name_Oy] = this.name_WA; - return super.addSurface(material,indexBegin,numTriangles); - } - - private function divideSurface(limit:uint, iterations:uint, surface:Surface, jointsOffsets:Vector., jointBufferVertexSize:uint, inVertices:ByteArray, outVertices:ByteArray, outIndices:Vector., outSurfaces:Vector., outJointsMaps:Vector.) : uint - { - var i:int = 0; - var j:int = 0; - var count:int = 0; - var jointsLength:int = 0; - var index:uint = 0; - var group:Dictionary = null; - var key:* = undefined; - var key2:* = undefined; - var jointIndex:uint = 0; - var weight:Number = NaN; - var localNumJoints:uint = 0; - var newIndexBegin:uint = 0; - var jointsGroupLength:uint = 0; - var n:int = 0; - var faces:Dictionary = null; - var locatedIndices:Dictionary = null; - var resSurface:Surface = null; - var origin:uint = 0; - var sumWeight:Number = NaN; - var indexBegin:uint = uint(surface.indexBegin); - var indexCount:uint = uint(surface.numTriangles * 3); - var indices:Vector. = geometry.alternativa3d::_indices; - var groups:Dictionary = new Dictionary(); - for(i = int(indexBegin),count = int(indexBegin + indexCount); i < count; ) - { - group = groups[i] = new Dictionary(); - jointsGroupLength = 0; - for(n = 0; n < 3; n++) - { - index = indices[int(i + n)]; - for(j = 0,jointsLength = int(jointsOffsets.length); j < jointsLength; ) - { - inVertices.position = jointBufferVertexSize * index + jointsOffsets[j]; - jointIndex = uint(uint(inVertices.readFloat())); - weight = Number(inVertices.readFloat()); - if(weight > 0) - { - group[jointIndex] = true; - } - j++; - } - } - for(key in group) - { - jointsGroupLength++; - } - if(jointsGroupLength > limit) - { - throw new Error("Unable to divide Skin."); - } - i += 3; - } - var facesGroups:Dictionary = this.optimizeGroups(groups,limit,iterations); - var newIndex:uint = 0; - for(key in facesGroups) - { - faces = facesGroups[key]; - localNumJoints = 0; - group = groups[key]; - for(key2 in group) - { - if(group[key2] is Boolean) - { - group[key2] = 3 * localNumJoints++; - } - } - locatedIndices = new Dictionary(); - for(key2 in faces) - { - for(i = 0; i < 3; i++) - { - index = indices[int(key2 + i)]; - if(locatedIndices[index] != null) - { - outIndices.push(locatedIndices[index]); - } - else - { - locatedIndices[index] = newIndex; - outIndices.push(newIndex++); - outVertices.writeBytes(inVertices,index * jointBufferVertexSize,jointBufferVertexSize); - outVertices.position -= jointBufferVertexSize; - origin = uint(outVertices.position); - sumWeight = 0; - for(j = 0; j < jointsLength; ) - { - outVertices.position = origin + jointsOffsets[j]; - jointIndex = uint(uint(outVertices.readFloat())); - weight = Number(outVertices.readFloat()); - outVertices.position -= 8; - if(weight > 0) - { - outVertices.writeFloat(group[jointIndex]); - outVertices.writeFloat(weight); - sumWeight += weight; - } - j++; - } - if(sumWeight != 1) - { - for(j = 0; j < jointsLength; ) - { - outVertices.position = origin + jointsOffsets[j] + 4; - weight = Number(outVertices.readFloat()); - if(weight > 0) - { - outVertices.position -= 4; - outVertices.writeFloat(weight / sumWeight); - } - j++; - } - } - outVertices.position = origin + jointBufferVertexSize; - } - } - } - resSurface = new Surface(); - resSurface.alternativa3d::object = this; - resSurface.material = surface.material; - resSurface.indexBegin = newIndexBegin; - resSurface.numTriangles = (outIndices.length - newIndexBegin) / 3; - outSurfaces.push(resSurface); - outJointsMaps.push(group); - newIndexBegin = uint(outIndices.length); - } - return newIndex; - } - - private function optimizeGroups(groups:Dictionary, limit:uint, iterations:uint = 1) : Dictionary - { - var key:* = undefined; - var inKey:* = undefined; - var minLike:Number = NaN; - var group1:Dictionary = null; - var group2:Dictionary = null; - var like:Number = NaN; - var copyKey:* = undefined; - var indices:Dictionary = null; - var indices2:Dictionary = null; - var facesGroups:Dictionary = new Dictionary(); - for(var i:int = 1; i < iterations + 1; i++) - { - minLike = 1 - i / iterations; - for(key in groups) - { - group1 = groups[key]; - for(inKey in groups) - { - if(key != inKey) - { - group2 = groups[inKey]; - like = this.calculateLikeFactor(group1,group2,limit); - if(like >= minLike) - { - delete groups[inKey]; - for(copyKey in group2) - { - group1[copyKey] = true; - } - indices = facesGroups[key]; - if(indices == null) - { - indices = facesGroups[key] = new Dictionary(); - indices[key] = true; - } - indices2 = facesGroups[inKey]; - if(indices2 != null) - { - delete facesGroups[inKey]; - for(copyKey in indices2) - { - indices[copyKey] = true; - } - } - else - { - indices[inKey] = true; - } - } - } - } - } - } - return facesGroups; - } - - private function calculateLikeFactor(group1:Dictionary, group2:Dictionary, limit:uint) : Number - { - var key:* = undefined; - var unionCount:uint = 0; - var intersectCount:uint = 0; - var group1Count:uint = 0; - var group2Count:uint = 0; - for(key in group1) - { - unionCount++; - if(group2[key] != null) - { - intersectCount++; - } - group1Count++; - } - for(key in group2) - { - if(group1[key] == null) - { - unionCount++; - } - group2Count++; - } - if(unionCount > limit) - { - return -1; - } - return intersectCount / unionCount; - } - - public function divide(limit:uint, iterations:uint = 1) : void - { - var key:* = undefined; - var outIndices:Vector. = null; - var outVertices:ByteArray = null; - var outJointsMaps:Vector. = null; - var maxIndex:uint = 0; - var j:int = 0; - var count:int = 0; - var maxJoints:uint = 0; - var vec:Vector. = null; - var joints:Dictionary = null; - var index:uint = 0; - var attributes:Array = null; - var _loc30_:ByteArray = null; - var jointsBuffer:int = geometry.findVertexStreamByAttribute(VertexAttributes.JOINTS[0]); - var jointsOffsets:Vector. = new Vector.(); - var jointOffset:int = 0; - if(jointsBuffer >= 0) - { - jointOffset = geometry.getAttributeOffset(VertexAttributes.JOINTS[0]) * 4; - jointsOffsets.push(jointOffset); - jointsOffsets.push(jointOffset + 8); - var jbTest:int = geometry.findVertexStreamByAttribute(VertexAttributes.JOINTS[1]); - if(jbTest >= 0) - { - jointOffset = geometry.getAttributeOffset(VertexAttributes.JOINTS[1]) * 4; - jointsOffsets.push(jointOffset); - jointsOffsets.push(jointOffset + 8); - if(jointsBuffer != jbTest) - { - throw new Error("Cannot divide skin, all joinst must be in the same buffer"); - } - } - jbTest = geometry.findVertexStreamByAttribute(VertexAttributes.JOINTS[2]); - if(jbTest >= 0) - { - jointOffset = geometry.getAttributeOffset(VertexAttributes.JOINTS[2]) * 4; - jointsOffsets.push(jointOffset); - jointsOffsets.push(jointOffset + 8); - if(jointsBuffer != jbTest) - { - throw new Error("Cannot divide skin, all joinst must be in the same buffer"); - } - } - jbTest = geometry.findVertexStreamByAttribute(VertexAttributes.JOINTS[3]); - if(jbTest >= 0) - { - jointOffset = geometry.getAttributeOffset(VertexAttributes.JOINTS[3]) * 4; - jointsOffsets.push(jointOffset); - jointsOffsets.push(jointOffset + 8); - if(jointsBuffer != jbTest) - { - throw new Error("Cannot divide skin, all joinst must be in the same buffer"); - } - } - var outSurfaces:Vector. = new Vector.(); - var totalVertices:ByteArray = new ByteArray(); - totalVertices.endian = Endian.LITTLE_ENDIAN; - var totalIndices:Vector. = new Vector.(); - var totalIndicesLength:uint = 0; - var lastMaxIndex:uint = 0; - var lastSurfaceIndex:uint = 0; - var lastIndicesCount:uint = 0; - this.name_Cq.length = 0; - var jointsBufferNumMappings:int = int(geometry.alternativa3d::_vertexStreams[jointsBuffer].attributes.length); - var jointsBufferData:ByteArray = geometry.alternativa3d::_vertexStreams[jointsBuffer].data; - for(var i:int = 0; i < name_Oy; i++) - { - outIndices = new Vector.(); - outVertices = new ByteArray(); - outJointsMaps = new Vector.(); - outVertices.endian = Endian.LITTLE_ENDIAN; - maxIndex = this.divideSurface(limit,iterations,name_eW[i],jointsOffsets,jointsBufferNumMappings * 4,jointsBufferData,outVertices,outIndices,outSurfaces,outJointsMaps); - for(j = 0,count = int(outIndices.length); j < count; j++) - { - var _loc31_:* = totalIndicesLength++; - totalIndices[_loc31_] = lastMaxIndex + outIndices[j]; - } - for(j = 0,count = int(outJointsMaps.length); j < count; j++) - { - maxJoints = 0; - vec = this.name_Cq[j + lastSurfaceIndex] = new Vector.(); - joints = outJointsMaps[j]; - for(key in joints) - { - index = uint(uint(joints[key] / 3)); - if(vec.length < index) - { - vec.length = index + 1; - } - vec[index] = this.name_WA[uint(key / 3)]; - maxJoints++; - } - } - for(j = int(lastSurfaceIndex); j < outSurfaces.length; j++) - { - outSurfaces[j].indexBegin += lastIndicesCount; - } - lastSurfaceIndex += outJointsMaps.length; - lastIndicesCount += outIndices.length; - totalVertices.writeBytes(outVertices,0,outVertices.length); - lastMaxIndex += maxIndex; - } - name_eW = outSurfaces; - name_Oy = outSurfaces.length; - this.name_fB.length = name_Oy; - this.name_do.length = name_Oy; - for(i = 0; i < name_Oy; i++) - { - this.name_fB[i] = this.calculateTransformProcedure(this.maxInfluences,this.name_Cq[i].length); - this.name_do[i] = this.calculateDeltaTransformProcedure(this.maxInfluences,this.name_Cq[i].length); - } - var newGeometry:Geometry = new Geometry(); - newGeometry.alternativa3d::_indices = totalIndices; - for(i = 0; i < geometry.alternativa3d::_vertexStreams.length; i++) - { - attributes = geometry.alternativa3d::_vertexStreams[i].attributes; - newGeometry.addVertexStream(attributes); - if(i == jointsBuffer) - { - newGeometry.alternativa3d::_vertexStreams[i].data = totalVertices; - } - else - { - _loc30_ = new ByteArray(); - _loc30_.endian = Endian.LITTLE_ENDIAN; - _loc30_.writeBytes(geometry.alternativa3d::_vertexStreams[i].data); - newGeometry.alternativa3d::_vertexStreams[i].data = _loc30_; - } - } - newGeometry.alternativa3d::_numVertices = totalVertices.length / (newGeometry.alternativa3d::_vertexStreams[0].attributes.length << 2); - geometry = newGeometry; - return; - } - throw new Error("Cannot divide skin, joints[0] must be binded"); - } - - private function calculateJointsTransforms(root:Object3D) : void - { - for(var child:Object3D = root.alternativa3d::childrenList; child != null; child = child.alternativa3d::next) - { - if(child.alternativa3d::transformChanged) - { - child.alternativa3d::composeTransforms(); - } - child.alternativa3d::localToGlobalTransform.combine(root.alternativa3d::localToGlobalTransform,child.alternativa3d::transform); - if(child is Joint) - { - Joint(child).alternativa3d::calculateTransform(); - } - this.calculateJointsTransforms(child); - } - } - - override alternativa3d function collectDraws(camera:Camera3D, lights:Vector., lightsLength:int) : void - { - var surface:Surface = null; - var debug:int = 0; - if(geometry == null) - { - return; - } - for(var child:Object3D = alternativa3d::childrenList; child != null; ) - { - if(child.alternativa3d::transformChanged) - { - child.alternativa3d::composeTransforms(); - } - child.alternativa3d::localToGlobalTransform.copy(child.alternativa3d::transform); - if(child is Joint) - { - Joint(child).alternativa3d::calculateTransform(); - } - this.calculateJointsTransforms(child); - child = child.alternativa3d::next; - } - for(var i:int = 0; i < name_Oy; ) - { - surface = name_eW[i]; - alternativa3d::transformProcedure = this.name_fB[i]; - alternativa3d::deltaTransformProcedure = this.name_do[i]; - if(surface.material != null) - { - surface.material.alternativa3d::collectDraws(camera,surface,geometry,lights,lightsLength); - } - if(alternativa3d::listening) - { - camera.view.alternativa3d::addSurfaceToMouseEvents(surface,geometry,alternativa3d::transformProcedure); - } - i++; - } - if(camera.debug) - { - debug = camera.alternativa3d::checkInDebug(this); - if(Boolean(debug & Debug.BOUNDS) && boundBox != null) - { - Debug.alternativa3d::drawBoundBox(camera,boundBox,alternativa3d::localToCameraTransform); - } - } - } - - override alternativa3d function setTransformConstants(drawUnit:DrawUnit, surface:Surface, vertexShader:Linker, camera:Camera3D) : void - { - var i:int = 0; - var count:int = 0; - var attribute:int = 0; - var joint:Joint = null; - for(i = 0; i < this.maxInfluences; i += 2) - { - attribute = int(VertexAttributes.JOINTS[i >> 1]); - drawUnit.alternativa3d::setVertexBufferAt(vertexShader.getVariableIndex("joint" + i.toString()),geometry.alternativa3d::getVertexBuffer(attribute),geometry.alternativa3d::_attributesOffsets[attribute],VertexAttributes.alternativa3d::FORMATS[attribute]); - } - var surfaceIndex:int = int(name_eW.indexOf(surface)); - var joints:Vector. = this.name_Cq[surfaceIndex]; - for(i = 0,count = int(joints.length); i < count; i++) - { - joint = joints[i]; - drawUnit.alternativa3d::setVertexConstantsFromTransform(i * 3,joint.name_Dy); - } - } - - private function calculateTransformProcedure(maxInfluences:int, numJoints:int) : Procedure - { - var joint:int = 0; - var res:Procedure = _transformProcedures[maxInfluences | numJoints << 16]; - if(res != null) - { - return res; - } - res = _transformProcedures[maxInfluences | numJoints << 16] = new Procedure(null,"SkinTransformProcedure"); - var array:Array = []; - var j:int = 0; - for(var i:int = 0; i < maxInfluences; i++) - { - joint = int(int(i / 2)); - if(i % 2 == 0) - { - if(i == 0) - { - var _loc8_:* = j++; - array[_loc8_] = "m34 t0.xyz, i0, c[a" + joint + ".x]"; - var _loc9_:* = j++; - array[_loc9_] = "mul o0, t0.xyz, a" + joint + ".y"; - } - else - { - _loc8_ = j++; - array[_loc8_] = "m34 t0.xyz, i0, c[a" + joint + ".x]"; - _loc9_ = j++; - array[_loc9_] = "mul t0.xyz, t0.xyz, a" + joint + ".y"; - var _loc10_:* = j++; - array[_loc10_] = "add o0, o0, t0.xyz"; - } - } - else - { - _loc8_ = j++; - array[_loc8_] = "m34 t0.xyz, i0, c[a" + joint + ".z]"; - _loc9_ = j++; - array[_loc9_] = "mul t0.xyz, t0.xyz, a" + joint + ".w"; - _loc10_ = j++; - array[_loc10_] = "add o0, o0, t0.xyz"; - } - } - _loc8_ = j++; - array[_loc8_] = "mov o0.w, i0.w"; - res.compileFromArray(array); - res.assignConstantsArray(numJoints * 3); - for(i = 0; i < maxInfluences; i += 2) - { - res.assignVariableName(VariableType.ATTRIBUTE,int(i / 2),"joint" + i); - } - return res; - } - - private function calculateDeltaTransformProcedure(maxInfluences:int, numJoints:int) : Procedure - { - var joint:int = 0; - var res:Procedure = _deltaTransformProcedures[maxInfluences | numJoints << 16]; - if(res != null) - { - return res; - } - res = _deltaTransformProcedures[maxInfluences | numJoints << 16] = new Procedure(null,"SkinDeltaTransformProcedure"); - var array:Array = []; - var j:int = 0; - for(var i:int = 0; i < maxInfluences; i++) - { - joint = int(int(i / 2)); - if(i % 2 == 0) - { - if(i == 0) - { - var _loc8_:* = j++; - array[_loc8_] = "m33 t0.xyz, i0, c[a" + joint + ".x]"; - var _loc9_:* = j++; - array[_loc9_] = "mul o0, t0.xyz, a" + joint + ".y"; - } - else - { - _loc8_ = j++; - array[_loc8_] = "m33 t0.xyz, i0, c[a" + joint + ".x]"; - _loc9_ = j++; - array[_loc9_] = "mul t0.xyz, t0.xyz, a" + joint + ".y"; - var _loc10_:* = j++; - array[_loc10_] = "add o0, o0, t0.xyz"; - } - } - else - { - _loc8_ = j++; - array[_loc8_] = "m33 t0.xyz, i0, c[a" + joint + ".z]"; - _loc9_ = j++; - array[_loc9_] = "mul t0.xyz, t0.xyz, a" + joint + ".w"; - _loc10_ = j++; - array[_loc10_] = "add o0, o0, t0.xyz"; - } - } - _loc8_ = j++; - array[_loc8_] = "mov o0.w, i0.w"; - _loc9_ = j++; - array[_loc9_] = "nrm o0.xyz, o0.xyz"; - res.compileFromArray(array); - for(i = 0; i < maxInfluences; i += 2) - { - res.assignVariableName(VariableType.ATTRIBUTE,int(i / 2),"joint" + i); - } - return res; - } - - override public function clone() : Object3D - { - var res:Skin = new Skin(this.maxInfluences,this.numJoints); - res.clonePropertiesFrom(this); - return res; - } - - override protected function clonePropertiesFrom(source:Object3D) : void - { - super.clonePropertiesFrom(source); - var skin:Skin = Skin(source); - if(skin.name_WA != null) - { - this.name_WA = this.cloneJointsVector(skin.name_WA,skin); - } - for(var i:int = 0; i < name_Oy; ) - { - this.name_Cq[i] = this.cloneJointsVector(skin.name_Cq[i],skin); - this.name_fB[i] = this.calculateTransformProcedure(this.maxInfluences,this.name_Cq[i].length); - this.name_do[i] = this.calculateDeltaTransformProcedure(this.maxInfluences,this.name_Cq[i].length); - i++; - } - } - - private function cloneJointsVector(joints:Vector., skin:Skin) : Vector. - { - var joint:Joint = null; - var count:int = int(joints.length); - var result:Vector. = new Vector.(); - for(var i:int = 0; i < count; i++) - { - joint = joints[i]; - result[i] = Joint(this.findClonedJoint(joint,skin,this)); - } - return result; - } - - private function findClonedJoint(joint:Joint, parentSource:Object3D, parentDest:Object3D) : Object3D - { - var j:Object3D = null; - for(var srcChild:Object3D = parentSource.alternativa3d::childrenList, dstChild:Object3D = parentDest.alternativa3d::childrenList; srcChild != null; ) - { - if(srcChild == joint) - { - return dstChild; - } - if(srcChild.alternativa3d::childrenList != null) - { - j = this.findClonedJoint(joint,srcChild,dstChild); - if(j != null) - { - return j; - } - } - srcChild = srcChild.alternativa3d::next; - dstChild = dstChild.alternativa3d::next; - } - return null; - } - } -} - diff --git a/src/alternativa/engine3d/objects/SkyBox.as b/src/alternativa/engine3d/objects/SkyBox.as deleted file mode 100644 index fa43886..0000000 --- a/src/alternativa/engine3d/objects/SkyBox.as +++ /dev/null @@ -1,231 +0,0 @@ -package alternativa.engine3d.objects -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.RenderPriority; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.materials.Material; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.resources.Geometry; - - use namespace alternativa3d; - - public class SkyBox extends Mesh - { - public static const LEFT:String = "left"; - - public static const RIGHT:String = "right"; - - public static const BACK:String = "back"; - - public static const FRONT:String = "front"; - - public static const BOTTOM:String = "bottom"; - - public static const TOP:String = "top"; - - private static var transformProcedureStatic:Procedure = new Procedure(["sub t0.xyz, i0.xyz, c0.xyz","mul t0.x, t0.x, c0.w","mul t0.y, t0.y, c0.w","mul t0.z, t0.z, c0.w","add o0.xyz, t0.xyz, c0.xyz","mov o0.w, i0.w","#c0=cTrans"]); - - private var name_gj:Surface; - - private var name_69:Surface; - - private var name_EB:Surface; - - private var name_iw:Surface; - - private var name_1V:Surface; - - private var name_Oz:Surface; - - private var size:Number; - - public function SkyBox(size:Number, left:Material = null, right:Material = null, back:Material = null, front:Material = null, bottom:Material = null, top:Material = null, uvPadding:Number = 0) - { - super(); - size *= 0.5; - this.size = size; - geometry = new Geometry(24); - var attributes:Array = new Array(); - attributes[0] = VertexAttributes.POSITION; - attributes[1] = VertexAttributes.POSITION; - attributes[2] = VertexAttributes.POSITION; - attributes[6] = VertexAttributes.TEXCOORDS[0]; - attributes[7] = VertexAttributes.TEXCOORDS[0]; - geometry.addVertexStream(attributes); - geometry.setAttributeValues(VertexAttributes.POSITION,Vector.([-size,-size,size,-size,-size,-size,-size,size,-size,-size,size,size,size,size,size,size,size,-size,size,-size,-size,size,-size,size,size,-size,size,size,-size,-size,-size,-size,-size,-size,-size,size,-size,size,size,-size,size,-size,size,size,-size,size,size,size,-size,size,-size,-size,-size,-size,size,-size,-size,size,size,-size,-size,-size,size,-size,size,size,size,size,size,size,-size,size])); - geometry.setAttributeValues(VertexAttributes.TEXCOORDS[0],Vector.([uvPadding,uvPadding,uvPadding,1 - uvPadding,1 - uvPadding,1 - uvPadding,1 - uvPadding,uvPadding,uvPadding,uvPadding,uvPadding,1 - uvPadding,1 - uvPadding,1 - uvPadding,1 - uvPadding,uvPadding,uvPadding,uvPadding,uvPadding,1 - uvPadding,1 - uvPadding,1 - uvPadding,1 - uvPadding,uvPadding,uvPadding,uvPadding,uvPadding,1 - uvPadding,1 - uvPadding,1 - uvPadding,1 - uvPadding,uvPadding,uvPadding,uvPadding,uvPadding,1 - uvPadding,1 - uvPadding,1 - uvPadding,1 - uvPadding,uvPadding,uvPadding,uvPadding,uvPadding,1 - uvPadding,1 - uvPadding,1 - uvPadding,1 - uvPadding,uvPadding])); - geometry.indices = Vector.([0,1,3,2,3,1,4,5,7,6,7,5,8,9,11,10,11,9,12,13,15,14,15,13,16,17,19,18,19,17,20,21,23,22,23,21]); - this.name_gj = addSurface(left,0,2); - this.name_69 = addSurface(right,6,2); - this.name_EB = addSurface(back,12,2); - this.name_iw = addSurface(front,18,2); - this.name_1V = addSurface(bottom,24,2); - this.name_Oz = addSurface(top,30,2); - alternativa3d::transformProcedure = transformProcedureStatic; - } - - override alternativa3d function collectDraws(camera:Camera3D, lights:Vector., lightsLength:int) : void - { - var surface:Surface = null; - for(var i:int = 0; i < name_Oy; ) - { - surface = name_eW[i]; - if(surface.material != null) - { - surface.material.alternativa3d::collectDraws(camera,surface,geometry,lights,lightsLength,RenderPriority.SKY); - } - if(alternativa3d::listening) - { - camera.view.alternativa3d::addSurfaceToMouseEvents(surface,geometry,alternativa3d::transformProcedure); - } - i++; - } - } - - override alternativa3d function setTransformConstants(drawUnit:DrawUnit, surface:Surface, vertexShader:Linker, camera:Camera3D) : void - { - var dx:Number = NaN; - var dy:Number = NaN; - var dz:Number = NaN; - var len:Number = NaN; - var max:Number = 0; - dx = -this.size - alternativa3d::cameraToLocalTransform.d; - dy = -this.size - alternativa3d::cameraToLocalTransform.h; - dz = -this.size - alternativa3d::cameraToLocalTransform.l; - len = dx * dx + dy * dy + dz * dz; - if(len > max) - { - max = len; - } - dx = this.size - alternativa3d::cameraToLocalTransform.d; - dy = -this.size - alternativa3d::cameraToLocalTransform.h; - dz = -this.size - alternativa3d::cameraToLocalTransform.l; - len = dx * dx + dy * dy + dz * dz; - if(len > max) - { - max = len; - } - dx = this.size - alternativa3d::cameraToLocalTransform.d; - dy = this.size - alternativa3d::cameraToLocalTransform.h; - dz = -this.size - alternativa3d::cameraToLocalTransform.l; - len = dx * dx + dy * dy + dz * dz; - if(len > max) - { - max = len; - } - dx = -this.size - alternativa3d::cameraToLocalTransform.d; - dy = this.size - alternativa3d::cameraToLocalTransform.h; - dz = -this.size - alternativa3d::cameraToLocalTransform.l; - len = dx * dx + dy * dy + dz * dz; - if(len > max) - { - max = len; - } - dx = -this.size - alternativa3d::cameraToLocalTransform.d; - dy = -this.size - alternativa3d::cameraToLocalTransform.h; - dz = this.size - alternativa3d::cameraToLocalTransform.l; - len = dx * dx + dy * dy + dz * dz; - if(len > max) - { - max = len; - } - dx = this.size - alternativa3d::cameraToLocalTransform.d; - dy = -this.size - alternativa3d::cameraToLocalTransform.h; - dz = this.size - alternativa3d::cameraToLocalTransform.l; - len = dx * dx + dy * dy + dz * dz; - if(len > max) - { - max = len; - } - dx = this.size - alternativa3d::cameraToLocalTransform.d; - dy = this.size - alternativa3d::cameraToLocalTransform.h; - dz = this.size - alternativa3d::cameraToLocalTransform.l; - len = dx * dx + dy * dy + dz * dz; - if(len > max) - { - max = len; - } - dx = -this.size - alternativa3d::cameraToLocalTransform.d; - dy = this.size - alternativa3d::cameraToLocalTransform.h; - dz = this.size - alternativa3d::cameraToLocalTransform.l; - len = dx * dx + dy * dy + dz * dz; - if(len > max) - { - max = len; - } - drawUnit.alternativa3d::setVertexConstantsFromNumbers(0,alternativa3d::cameraToLocalTransform.d,alternativa3d::cameraToLocalTransform.h,alternativa3d::cameraToLocalTransform.l,camera.farClipping / Math.sqrt(max)); - } - - public function getSide(side:String) : Surface - { - switch(side) - { - case LEFT: - return this.name_gj; - case RIGHT: - return this.name_69; - case BACK: - return this.name_EB; - case FRONT: - return this.name_iw; - case BOTTOM: - return this.name_1V; - case TOP: - return this.name_Oz; - default: - return null; - } - } - - override public function clone() : Object3D - { - var res:SkyBox = new SkyBox(0); - res.clonePropertiesFrom(this); - return res; - } - - override protected function clonePropertiesFrom(source:Object3D) : void - { - var surface:Surface = null; - var newSurface:Surface = null; - super.clonePropertiesFrom(source); - var src:SkyBox = source as SkyBox; - for(var i:int = 0; i < src.name_Oy; ) - { - surface = src.name_eW[i]; - newSurface = name_eW[i]; - if(surface == src.name_gj) - { - this.name_gj = newSurface; - } - else if(surface == src.name_69) - { - this.name_69 = newSurface; - } - else if(surface == src.name_EB) - { - this.name_EB = newSurface; - } - else if(surface == src.name_iw) - { - this.name_iw = newSurface; - } - else if(surface == src.name_1V) - { - this.name_1V = newSurface; - } - else if(surface == src.name_Oz) - { - this.name_Oz = newSurface; - } - i++; - } - } - } -} - diff --git a/src/alternativa/engine3d/objects/Sprite3D.as b/src/alternativa/engine3d/objects/Sprite3D.as deleted file mode 100644 index f68ac56..0000000 --- a/src/alternativa/engine3d/objects/Sprite3D.as +++ /dev/null @@ -1,249 +0,0 @@ -package alternativa.engine3d.objects -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.BoundBox; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.Debug; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.RenderPriority; - import alternativa.engine3d.core.Transform3D; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.materials.Material; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.resources.Geometry; - import flash.display3D.Context3D; - import flash.utils.Dictionary; - - use namespace alternativa3d; - - public class Sprite3D extends Object3D - { - private static const geometries:Dictionary = new Dictionary(); - - private static var transformProcedureStatic:Procedure = new Procedure(["sub t0.z, i0.x, c3.x","sub t0.w, i0.y, c3.y","mul t0.z, t0.z, c3.z","mul t0.w, t0.w, c3.w","mov t1.z, c4.w","sin t1.x, t1.z","cos t1.y, t1.z","mul t1.z, t0.z, t1.y","mul t1.w, t0.w, t1.x","sub t0.x, t1.z, t1.w","mul t1.z, t0.z, t1.x","mul t1.w, t0.w, t1.y","add t0.y, t1.z, t1.w","add t0.x, t0.x, c4.x","add t0.y, t0.y, c4.y","add t0.z, i0.z, c4.z","mov t0.w, i0.w","dp4 o0.x, t0, c0","dp4 o0.y, t0, c1","dp4 o0.z, t0, c2","mov o0.w, t0.w","#c0=trans1","#c1=trans2","#c2=trans3","#c3=size","#c4=coords"]); - - private static var deltaTransformProcedureStatic:Procedure = new Procedure(["mov t1.z, c4.w","sin t1.x, t1.z","cos t1.y, t1.z","mul t1.z, i0.x, t1.y","mul t1.w, i0.y, t1.x","sub t0.x, t1.z, t1.w","mul t1.z, i0.x, t1.x","mul t1.w, i0.y, t1.y","add t0.y, t1.z, t1.w","mov t0.z, i0.z","mov t0.w, i0.w","dp3 o0.x, t0, c0","dp3 o0.y, t0, c1","dp3 o0.z, t0, c2","#c0=trans1","#c1=trans2","#c2=trans3","#c3=size","#c4=coords"]); - - public var originX:Number = 0.5; - - public var originY:Number = 0.5; - - public var rotation:Number = 0; - - public var width:Number; - - public var height:Number; - - public var perspectiveScale:Boolean = true; - - public var alwaysOnTop:Boolean = false; - - alternativa3d var surface:Surface; - - public function Sprite3D(width:Number, height:Number, material:Material = null) - { - super(); - this.width = width; - this.height = height; - this.alternativa3d::surface = new Surface(); - this.alternativa3d::surface.alternativa3d::object = this; - this.material = material; - this.alternativa3d::surface.indexBegin = 0; - this.alternativa3d::surface.numTriangles = 2; - alternativa3d::transformProcedure = transformProcedureStatic; - alternativa3d::deltaTransformProcedure = deltaTransformProcedureStatic; - } - - public function get material() : Material - { - return this.alternativa3d::surface.material; - } - - public function set material(value:Material) : void - { - this.alternativa3d::surface.material = value; - } - - override alternativa3d function fillResources(resources:Dictionary, hierarchy:Boolean = false, resourceType:Class = null) : void - { - if(this.alternativa3d::surface.material != null) - { - this.alternativa3d::surface.material.alternativa3d::fillResources(resources,resourceType); - } - super.alternativa3d::fillResources(resources,hierarchy,resourceType); - } - - override alternativa3d function collectDraws(camera:Camera3D, lights:Vector., lightsLength:int) : void - { - var debug:int = 0; - var geometry:Geometry = this.alternativa3d::getGeometry(camera.alternativa3d::context3D); - if(this.alternativa3d::surface.material != null) - { - this.alternativa3d::surface.material.alternativa3d::collectDraws(camera,this.alternativa3d::surface,geometry,lights,lightsLength,this.alwaysOnTop ? RenderPriority.NEXT_LAYER : -1); - } - if(alternativa3d::listening) - { - camera.view.alternativa3d::addSurfaceToMouseEvents(this.alternativa3d::surface,geometry,alternativa3d::transformProcedure); - } - if(camera.debug) - { - debug = camera.alternativa3d::checkInDebug(this); - if(Boolean(debug & Debug.BOUNDS) && boundBox != null) - { - Debug.alternativa3d::drawBoundBox(camera,boundBox,alternativa3d::localToCameraTransform); - } - } - } - - override alternativa3d function setTransformConstants(drawUnit:DrawUnit, surface:Surface, vertexShader:Linker, camera:Camera3D) : void - { - var scale:Number = Number(Math.sqrt(alternativa3d::localToCameraTransform.a * alternativa3d::localToCameraTransform.a + alternativa3d::localToCameraTransform.e * alternativa3d::localToCameraTransform.e + alternativa3d::localToCameraTransform.i * alternativa3d::localToCameraTransform.i)); - scale += Math.sqrt(alternativa3d::localToCameraTransform.b * alternativa3d::localToCameraTransform.b + alternativa3d::localToCameraTransform.f * alternativa3d::localToCameraTransform.f + alternativa3d::localToCameraTransform.j * alternativa3d::localToCameraTransform.j); - scale += Math.sqrt(alternativa3d::localToCameraTransform.c * alternativa3d::localToCameraTransform.c + alternativa3d::localToCameraTransform.g * alternativa3d::localToCameraTransform.g + alternativa3d::localToCameraTransform.k * alternativa3d::localToCameraTransform.k); - scale /= 3; - if(!this.perspectiveScale && !camera.orthographic) - { - scale *= alternativa3d::localToCameraTransform.l / camera.alternativa3d::focalLength; - } - drawUnit.alternativa3d::setVertexConstantsFromTransform(0,alternativa3d::cameraToLocalTransform); - drawUnit.alternativa3d::setVertexConstantsFromNumbers(3,this.originX,this.originY,this.width * scale,this.height * scale); - drawUnit.alternativa3d::setVertexConstantsFromNumbers(4,alternativa3d::localToCameraTransform.d,alternativa3d::localToCameraTransform.h,alternativa3d::localToCameraTransform.l,this.rotation); - } - - alternativa3d function getGeometry(context:Context3D) : Geometry - { - var attributes:Array = null; - var geometry:Geometry = geometries[context]; - if(geometry == null) - { - geometry = new Geometry(4); - attributes = new Array(); - attributes[0] = VertexAttributes.POSITION; - attributes[1] = VertexAttributes.POSITION; - attributes[2] = VertexAttributes.POSITION; - attributes[3] = VertexAttributes.NORMAL; - attributes[4] = VertexAttributes.NORMAL; - attributes[5] = VertexAttributes.NORMAL; - attributes[6] = VertexAttributes.TEXCOORDS[0]; - attributes[7] = VertexAttributes.TEXCOORDS[0]; - attributes[8] = VertexAttributes.TEXCOORDS[1]; - attributes[9] = VertexAttributes.TEXCOORDS[1]; - attributes[10] = VertexAttributes.TEXCOORDS[2]; - attributes[11] = VertexAttributes.TEXCOORDS[2]; - attributes[12] = VertexAttributes.TEXCOORDS[3]; - attributes[13] = VertexAttributes.TEXCOORDS[3]; - attributes[14] = VertexAttributes.TEXCOORDS[4]; - attributes[15] = VertexAttributes.TEXCOORDS[4]; - attributes[16] = VertexAttributes.TEXCOORDS[5]; - attributes[17] = VertexAttributes.TEXCOORDS[5]; - attributes[18] = VertexAttributes.TEXCOORDS[6]; - attributes[19] = VertexAttributes.TEXCOORDS[6]; - attributes[20] = VertexAttributes.TEXCOORDS[7]; - attributes[21] = VertexAttributes.TEXCOORDS[7]; - attributes[22] = VertexAttributes.TANGENT4; - attributes[23] = VertexAttributes.TANGENT4; - attributes[24] = VertexAttributes.TANGENT4; - attributes[25] = VertexAttributes.TANGENT4; - geometry.addVertexStream(attributes); - geometry.setAttributeValues(VertexAttributes.POSITION,Vector.([0,0,0,0,1,0,1,1,0,1,0,0])); - geometry.setAttributeValues(VertexAttributes.NORMAL,Vector.([0,0,-1,0,0,-1,0,0,-1,0,0,-1])); - geometry.setAttributeValues(VertexAttributes.TEXCOORDS[0],Vector.([0,0,0,1,1,1,1,0])); - geometry.setAttributeValues(VertexAttributes.TEXCOORDS[1],Vector.([0,0,0,1,1,1,1,0])); - geometry.setAttributeValues(VertexAttributes.TEXCOORDS[2],Vector.([0,0,0,1,1,1,1,0])); - geometry.setAttributeValues(VertexAttributes.TEXCOORDS[3],Vector.([0,0,0,1,1,1,1,0])); - geometry.setAttributeValues(VertexAttributes.TEXCOORDS[4],Vector.([0,0,0,1,1,1,1,0])); - geometry.setAttributeValues(VertexAttributes.TEXCOORDS[5],Vector.([0,0,0,1,1,1,1,0])); - geometry.setAttributeValues(VertexAttributes.TEXCOORDS[6],Vector.([0,0,0,1,1,1,1,0])); - geometry.setAttributeValues(VertexAttributes.TEXCOORDS[7],Vector.([0,0,0,1,1,1,1,0])); - geometry.indices = Vector.([0,1,3,2,3,1]); - geometry.upload(context); - geometries[context] = geometry; - } - return geometry; - } - - override public function clone() : Object3D - { - var res:Sprite3D = new Sprite3D(this.width,this.height); - res.clonePropertiesFrom(this); - return res; - } - - override protected function clonePropertiesFrom(source:Object3D) : void - { - super.clonePropertiesFrom(source); - var src:Sprite3D = source as Sprite3D; - this.width = src.width; - this.height = src.height; - this.material = src.material; - this.originX = src.originX; - this.originY = src.originY; - this.rotation = src.rotation; - this.perspectiveScale = src.perspectiveScale; - this.alwaysOnTop = src.alwaysOnTop; - } - - override alternativa3d function updateBoundBox(boundBox:BoundBox, hierarchy:Boolean, transform:Transform3D = null) : void - { - var ax:Number = NaN; - var ay:Number = NaN; - var az:Number = NaN; - var size:Number = NaN; - var ww:Number = this.width; - var hh:Number = this.height; - var w:Number = (this.originX >= 0.5 ? this.originX : 1 - this.originX) * ww; - var h:Number = (this.originY >= 0.5 ? this.originY : 1 - this.originY) * hh; - var radius:Number = Number(Math.sqrt(w * w + h * h)); - var cx:Number = 0; - var cy:Number = 0; - var cz:Number = 0; - if(transform != null) - { - ax = transform.a; - ay = transform.e; - az = transform.i; - size = Number(Math.sqrt(ax * ax + ay * ay + az * az)); - ax = transform.b; - ay = transform.f; - az = transform.j; - size += Math.sqrt(ax * ax + ay * ay + az * az); - ax = transform.c; - ay = transform.g; - az = transform.k; - size += Math.sqrt(ax * ax + ay * ay + az * az); - radius *= size / 3; - cx = transform.d; - cy = transform.h; - cz = transform.l; - } - if(cx - radius < boundBox.minX) - { - boundBox.minX = cx - radius; - } - if(cx + radius > boundBox.maxX) - { - boundBox.maxX = cx + radius; - } - if(cy - radius < boundBox.minY) - { - boundBox.minY = cy - radius; - } - if(cy + radius > boundBox.maxY) - { - boundBox.maxY = cy + radius; - } - if(cz - radius < boundBox.minZ) - { - boundBox.minZ = cz - radius; - } - if(cz + radius > boundBox.maxZ) - { - boundBox.maxZ = cz + radius; - } - } - } -} - diff --git a/src/alternativa/engine3d/objects/Surface.as b/src/alternativa/engine3d/objects/Surface.as deleted file mode 100644 index e14a7e6..0000000 --- a/src/alternativa/engine3d/objects/Surface.as +++ /dev/null @@ -1,35 +0,0 @@ -package alternativa.engine3d.objects -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.materials.Material; - - use namespace alternativa3d; - - public class Surface - { - public var material:Material; - - public var indexBegin:int = 0; - - public var numTriangles:int = 0; - - alternativa3d var object:Object3D; - - public function Surface() - { - super(); - } - - public function clone() : Surface - { - var res:Surface = new Surface(); - res.alternativa3d::object = this.alternativa3d::object; - res.material = this.material; - res.indexBegin = this.indexBegin; - res.numTriangles = this.numTriangles; - return res; - } - } -} - diff --git a/src/alternativa/engine3d/objects/WireFrame.as b/src/alternativa/engine3d/objects/WireFrame.as deleted file mode 100644 index bdaba6d..0000000 --- a/src/alternativa/engine3d/objects/WireFrame.as +++ /dev/null @@ -1,228 +0,0 @@ -package alternativa.engine3d.objects -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.BoundBox; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.Transform3D; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.materials.A3DUtils; - import alternativa.engine3d.materials.ShaderProgram; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.materials.compiler.VariableType; - import alternativa.engine3d.resources.Geometry; - import alternativa.engine3d.resources.WireGeometry; - import flash.display3D.Context3DProgramType; - import flash.geom.Vector3D; - import flash.utils.Dictionary; - import flash.utils.getDefinitionByName; - import flash.utils.getQualifiedClassName; - - use namespace alternativa3d; - - public class WireFrame extends Object3D - { - alternativa3d static const shaderProgram:ShaderProgram = initProgram(); - - public var thickness:Number = 1; - - alternativa3d var name_lc:Vector. = new Vector.(4,true); - - alternativa3d var geometry:WireGeometry; - - public function WireFrame(color:uint = 0, alpha:Number = 1, thickness:Number = 0.5) - { - super(); - this.color = color; - this.alpha = alpha; - this.thickness = thickness; - this.alternativa3d::geometry = new WireGeometry(); - } - - private static function initProgram() : ShaderProgram - { - var vertexShader:Linker = new Linker(Context3DProgramType.VERTEX); - var transform:Procedure = new Procedure(); - transform.compileFromArray(["mov t0, a0","mov t0.w, c0.y","m34 t0.xyz, t0, c2","m34 t1.xyz, a1, c2","sub t2, t1.xyz, t0.xyz","slt t5.x, t0.z, c1.z","sub t5.y, c0.y, t5.x","add t4.x, t0.z, c0.z","sub t4.y, t0.z, t1.z","add t4.y, t4.y, c0.w","div t4.z, t4.x, t4.y","mul t4.xyz, t4.zzz, t2.xyz","add t3.xyz, t0.xyz, t4.xyz","mul t0, t0, t5.y","mul t3.xyz, t3.xyz, t5.x","add t0, t0, t3.xyz","sub t2, t1.xyz, t0.xyz","crs t3.xyz, t2, t0","nrm t3.xyz, t3.xyz","mul t3.xyz, t3.xyz, a0.w","mul t3.xyz, t3.xyz, c1.w","mul t4.x, t0.z, c1.x","mul t3.xyz, t3.xyz, t4.xxx","add t0.xyz, t0.xyz, t3.xyz","m44 o0, t0, c5"]); - transform.assignVariableName(VariableType.ATTRIBUTE,0,"pos1"); - transform.assignVariableName(VariableType.ATTRIBUTE,1,"pos2"); - transform.assignVariableName(VariableType.CONSTANT,0,"ZERO"); - transform.assignVariableName(VariableType.CONSTANT,1,"consts"); - transform.assignVariableName(VariableType.CONSTANT,2,"worldView",3); - transform.assignVariableName(VariableType.CONSTANT,5,"proj",4); - vertexShader.addProcedure(transform); - vertexShader.link(); - var fragmentShader:Linker = new Linker(Context3DProgramType.FRAGMENT); - var fp:Procedure = new Procedure(); - fp.compileFromArray(["mov o0, c0"]); - fp.assignVariableName(VariableType.CONSTANT,0,"color"); - fragmentShader.addProcedure(fp); - fragmentShader.link(); - return new ShaderProgram(vertexShader,fragmentShader); - } - - public static function createLinesList(points:Vector., color:uint = 0, alpha:Number = 1, thickness:Number = 1) : WireFrame - { - var p0:Vector3D = null; - var p1:Vector3D = null; - var result:WireFrame = new WireFrame(color,alpha,thickness); - var geometry:WireGeometry = result.alternativa3d::geometry; - for(var i:uint = 0, count:uint = points.length - 1; i < count; i += 2) - { - p0 = points[i]; - p1 = points[i + 1]; - geometry.alternativa3d::addLine(p0.x,p0.y,p0.z,p1.x,p1.y,p1.z); - } - result.calculateBoundBox(); - return result; - } - - public static function createLineStrip(points:Vector., color:uint = 0, alpha:Number = 1, thickness:Number = 1) : WireFrame - { - var p0:Vector3D = null; - var p1:Vector3D = null; - var result:WireFrame = new WireFrame(color,alpha,thickness); - var geometry:WireGeometry = result.alternativa3d::geometry; - for(var i:uint = 0, count:uint = points.length - 1; i < count; i++) - { - p0 = points[i]; - p1 = points[i + 1]; - geometry.alternativa3d::addLine(p0.x,p0.y,p0.z,p1.x,p1.y,p1.z); - } - result.calculateBoundBox(); - return result; - } - - public static function createEdges(mesh:Mesh, color:uint = 0, alpha:Number = 1, thickness:Number = 1) : WireFrame - { - var index:uint = 0; - var v1x:Number = NaN; - var v1y:Number = NaN; - var v1z:Number = NaN; - var v2x:Number = NaN; - var v2y:Number = NaN; - var v2z:Number = NaN; - var v3x:Number = NaN; - var v3y:Number = NaN; - var v3z:Number = NaN; - var result:WireFrame = new WireFrame(color,alpha,thickness); - var geometry:Geometry = mesh.geometry; - var resultGeometry:WireGeometry = result.alternativa3d::geometry; - var edges:Dictionary = new Dictionary(); - var indices:Vector. = geometry.indices; - var vertices:Vector. = geometry.getAttributeValues(VertexAttributes.POSITION); - for(var i:int = 0, count:int = int(indices.length); i < count; ) - { - index = indices[i] * 3; - v1x = vertices[index]; - index++; - v1y = vertices[index]; - index++; - v1z = vertices[index]; - index = indices[int(i + 1)] * 3; - v2x = vertices[index]; - index++; - v2y = vertices[index]; - index++; - v2z = vertices[index]; - index = indices[int(i + 2)] * 3; - v3x = vertices[index]; - index++; - v3y = vertices[index]; - index++; - v3z = vertices[index]; - if(checkEdge(edges,v1x,v1y,v1z,v2x,v2y,v2z)) - { - resultGeometry.alternativa3d::addLine(v1x,v1y,v1z,v2x,v2y,v2z); - } - if(checkEdge(edges,v2x,v2y,v2z,v3x,v3y,v3z)) - { - resultGeometry.alternativa3d::addLine(v2x,v2y,v2z,v3x,v3y,v3z); - } - if(checkEdge(edges,v1x,v1y,v1z,v3x,v3y,v3z)) - { - resultGeometry.alternativa3d::addLine(v1x,v1y,v1z,v3x,v3y,v3z); - } - i += 3; - } - result.calculateBoundBox(); - result.alternativa3d::_x = mesh.alternativa3d::_x; - result.alternativa3d::_y = mesh.alternativa3d::_y; - result.alternativa3d::_z = mesh.alternativa3d::_z; - result.alternativa3d::_rotationX = mesh.alternativa3d::_rotationX; - result.alternativa3d::_rotationY = mesh.alternativa3d::_rotationY; - result.alternativa3d::_rotationZ = mesh.alternativa3d::_rotationZ; - result.alternativa3d::_scaleX = mesh.alternativa3d::_scaleX; - result.alternativa3d::_scaleY = mesh.alternativa3d::_scaleY; - result.alternativa3d::_scaleZ = mesh.alternativa3d::_scaleZ; - return result; - } - - private static function checkEdge(edges:Dictionary, v1x:Number, v1y:Number, v1z:Number, v2x:Number, v2y:Number, v2z:Number) : Boolean - { - var str:String = null; - if(v1x * v1x + v1y * v1y + v1z * v1z < v2x * v2x + v2y * v2y + v2z * v2z) - { - str = v1x.toString() + v1y.toString() + v1z.toString() + v2x.toString() + v2y.toString() + v2z.toString(); - } - else - { - str = v2x.toString() + v2y.toString() + v2z.toString() + v1x.toString() + v1y.toString() + v1z.toString(); - } - if(Boolean(edges[str])) - { - return false; - } - edges[str] = true; - return true; - } - - public function get alpha() : Number - { - return this.name_lc[3]; - } - - public function set alpha(value:Number) : void - { - this.name_lc[3] = value; - } - - public function get color() : uint - { - return this.name_lc[0] * 255 << 16 | this.name_lc[1] * 255 << 8 | this.name_lc[2] * 255; - } - - public function set color(value:uint) : void - { - this.name_lc[0] = (value >> 16 & 0xFF) / 255; - this.name_lc[1] = (value >> 8 & 0xFF) / 255; - this.name_lc[2] = (value & 0xFF) / 255; - } - - override alternativa3d function updateBoundBox(boundBox:BoundBox, hierarchy:Boolean, transform:Transform3D = null) : void - { - super.alternativa3d::updateBoundBox(boundBox,hierarchy,transform); - if(this.alternativa3d::geometry != null) - { - this.alternativa3d::geometry.alternativa3d::updateBoundBox(boundBox,transform); - } - } - - override alternativa3d function collectDraws(camera:Camera3D, lights:Vector., lightsLength:int) : void - { - this.alternativa3d::geometry.alternativa3d::getDrawUnits(camera,this.name_lc,this.thickness,this,alternativa3d::shaderProgram); - } - - override alternativa3d function fillResources(resources:Dictionary, hierarchy:Boolean = false, resourceType:Class = null) : void - { - super.alternativa3d::fillResources(resources,hierarchy,resourceType); - if(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.alternativa3d::geometry)) as Class,resourceType)) - { - resources[this.alternativa3d::geometry] = true; - } - } - } -} - diff --git a/src/alternativa/engine3d/primitives/Box.as b/src/alternativa/engine3d/primitives/Box.as deleted file mode 100644 index e76133d..0000000 --- a/src/alternativa/engine3d/primitives/Box.as +++ /dev/null @@ -1,289 +0,0 @@ -package alternativa.engine3d.primitives -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.BoundBox; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.materials.Material; - import alternativa.engine3d.objects.Mesh; - import alternativa.engine3d.resources.Geometry; - import flash.utils.ByteArray; - import flash.utils.Endian; - - use namespace alternativa3d; - - public class Box extends Mesh - { - public function Box(width:Number = 100, length:Number = 100, height:Number = 100, widthSegments:uint = 1, lengthSegments:uint = 1, heightSegments:uint = 1, reverse:Boolean = false, material:Material = null) - { - var x:int = 0; - var y:int = 0; - var z:int = 0; - var halfHeight:Number = NaN; - super(); - if(widthSegments <= 0 || lengthSegments <= 0 || heightSegments <= 0) - { - return; - } - var indices:Vector. = new Vector.(); - var wp:int = widthSegments + 1; - var lp:int = lengthSegments + 1; - var hp:int = heightSegments + 1; - var halfWidth:Number = width * 0.5; - var halfLength:Number = length * 0.5; - halfHeight = height * 0.5; - var wd:Number = 1 / widthSegments; - var ld:Number = 1 / lengthSegments; - var hd:Number = 1 / heightSegments; - var ws:Number = width / widthSegments; - var ls:Number = length / lengthSegments; - var hs:Number = height / heightSegments; - var vertices:ByteArray = new ByteArray(); - vertices.endian = Endian.LITTLE_ENDIAN; - var offset:uint = 0; - for(x = 0; x < wp; x++) - { - for(y = 0; y < lp; y++) - { - vertices.writeFloat(x * ws - halfWidth); - vertices.writeFloat(y * ls - halfLength); - vertices.writeFloat(-halfHeight); - vertices.writeFloat((widthSegments - x) * wd); - vertices.writeFloat((lengthSegments - y) * ld); - vertices.length = vertices.position = vertices.position + 28; - } - } - offset = uint(vertices.position); - for(x = 0; x < wp; x++) - { - for(y = 0; y < lp; ) - { - if(x < widthSegments && y < lengthSegments) - { - this.createFace(indices,vertices,(x + 1) * lp + y + 1,(x + 1) * lp + y,x * lp + y,x * lp + y + 1,0,0,-1,halfHeight,0,-1,0,0,reverse); - } - y++; - } - } - vertices.position = offset; - var o:uint = uint(wp * lp); - for(x = 0; x < wp; x++) - { - for(y = 0; y < lp; y++) - { - vertices.writeFloat(x * ws - halfWidth); - vertices.writeFloat(y * ls - halfLength); - vertices.writeFloat(halfHeight); - vertices.writeFloat(x * wd); - vertices.writeFloat((lengthSegments - y) * ld); - vertices.length = vertices.position = vertices.position + 28; - } - } - offset = uint(vertices.position); - for(x = 0; x < wp; x++) - { - for(y = 0; y < lp; ) - { - if(x < widthSegments && y < lengthSegments) - { - this.createFace(indices,vertices,o + x * lp + y,o + (x + 1) * lp + y,o + (x + 1) * lp + y + 1,o + x * lp + y + 1,0,0,1,halfHeight,0,-1,0,0,reverse); - } - y++; - } - } - vertices.position = offset; - o += wp * lp; - for(x = 0; x < wp; x++) - { - for(z = 0; z < hp; z++) - { - vertices.writeFloat(x * ws - halfWidth); - vertices.writeFloat(-halfLength); - vertices.writeFloat(z * hs - halfHeight); - vertices.writeFloat(x * wd); - vertices.writeFloat((heightSegments - z) * hd); - vertices.length = vertices.position = vertices.position + 28; - } - } - offset = uint(vertices.position); - for(x = 0; x < wp; x++) - { - for(z = 0; z < hp; ) - { - if(x < widthSegments && z < heightSegments) - { - this.createFace(indices,vertices,o + x * hp + z,o + (x + 1) * hp + z,o + (x + 1) * hp + z + 1,o + x * hp + z + 1,0,-1,0,halfLength,0,0,-1,0,reverse); - } - z++; - } - } - vertices.position = offset; - o += wp * hp; - for(x = 0; x < wp; x++) - { - for(z = 0; z < hp; z++) - { - vertices.writeFloat(x * ws - halfWidth); - vertices.writeFloat(halfLength); - vertices.writeFloat(z * hs - halfHeight); - vertices.writeFloat((widthSegments - x) * wd); - vertices.writeFloat((heightSegments - z) * hd); - vertices.length = vertices.position = vertices.position + 28; - } - } - offset = uint(vertices.position); - for(x = 0; x < wp; x++) - { - for(z = 0; z < hp; ) - { - if(x < widthSegments && z < heightSegments) - { - this.createFace(indices,vertices,o + x * hp + z,o + x * hp + z + 1,o + (x + 1) * hp + z + 1,o + (x + 1) * hp + z,0,1,0,halfLength,0,0,-1,0,reverse); - } - z++; - } - } - vertices.position = offset; - o += wp * hp; - for(y = 0; y < lp; y++) - { - for(z = 0; z < hp; z++) - { - vertices.writeFloat(-halfWidth); - vertices.writeFloat(y * ls - halfLength); - vertices.writeFloat(z * hs - halfHeight); - vertices.writeFloat((lengthSegments - y) * ld); - vertices.writeFloat((heightSegments - z) * hd); - vertices.length = vertices.position = vertices.position + 28; - } - } - offset = uint(vertices.position); - for(y = 0; y < lp; y++) - { - for(z = 0; z < hp; ) - { - if(y < lengthSegments && z < heightSegments) - { - this.createFace(indices,vertices,o + y * hp + z,o + y * hp + z + 1,o + (y + 1) * hp + z + 1,o + (y + 1) * hp + z,-1,0,0,halfWidth,0,0,-1,0,reverse); - } - z++; - } - } - vertices.position = offset; - o += lp * hp; - for(y = 0; y < lp; y++) - { - for(z = 0; z < hp; z++) - { - vertices.writeFloat(halfWidth); - vertices.writeFloat(y * ls - halfLength); - vertices.writeFloat(z * hs - halfHeight); - vertices.writeFloat(y * ld); - vertices.writeFloat((heightSegments - z) * hd); - vertices.length = vertices.position = vertices.position + 28; - } - } - for(y = 0; y < lp; y++) - { - for(z = 0; z < hp; ) - { - if(y < lengthSegments && z < heightSegments) - { - this.createFace(indices,vertices,o + y * hp + z,o + (y + 1) * hp + z,o + (y + 1) * hp + z + 1,o + y * hp + z + 1,1,0,0,halfWidth,0,0,-1,0,reverse); - } - z++; - } - } - geometry = new Geometry(); - geometry.alternativa3d::_indices = indices; - var attributes:Array = new Array(); - attributes[0] = VertexAttributes.POSITION; - attributes[1] = VertexAttributes.POSITION; - attributes[2] = VertexAttributes.POSITION; - attributes[3] = VertexAttributes.TEXCOORDS[0]; - attributes[4] = VertexAttributes.TEXCOORDS[0]; - attributes[5] = VertexAttributes.NORMAL; - attributes[6] = VertexAttributes.NORMAL; - attributes[7] = VertexAttributes.NORMAL; - attributes[8] = VertexAttributes.TANGENT4; - attributes[9] = VertexAttributes.TANGENT4; - attributes[10] = VertexAttributes.TANGENT4; - attributes[11] = VertexAttributes.TANGENT4; - geometry.addVertexStream(attributes); - geometry.alternativa3d::_vertexStreams[0].data = vertices; - geometry.alternativa3d::_numVertices = vertices.length / 48; - addSurface(material,0,indices.length / 3); - boundBox = new BoundBox(); - boundBox.minX = -halfWidth; - boundBox.minY = -halfLength; - boundBox.minZ = -halfHeight; - boundBox.maxX = halfWidth; - boundBox.maxY = halfLength; - boundBox.maxZ = halfHeight; - } - - private function createFace(indices:Vector., vertices:ByteArray, a:int, b:int, c:int, d:int, nx:Number, ny:Number, nz:Number, no:Number, tx:Number, ty:Number, tz:Number, tw:Number, reverse:Boolean) : void - { - var v:int = 0; - if(reverse) - { - nx = -nx; - ny = -ny; - nz = -nz; - no = -no; - v = a; - a = d; - d = v; - v = b; - b = c; - c = v; - } - indices.push(a); - indices.push(b); - indices.push(c); - indices.push(a); - indices.push(c); - indices.push(d); - vertices.position = a * 48 + 20; - vertices.writeFloat(nx); - vertices.writeFloat(ny); - vertices.writeFloat(nz); - vertices.writeFloat(tx); - vertices.writeFloat(ty); - vertices.writeFloat(tz); - vertices.writeFloat(tw); - vertices.position = b * 48 + 20; - vertices.writeFloat(nx); - vertices.writeFloat(ny); - vertices.writeFloat(nz); - vertices.writeFloat(tx); - vertices.writeFloat(ty); - vertices.writeFloat(tz); - vertices.writeFloat(tw); - vertices.position = c * 48 + 20; - vertices.writeFloat(nx); - vertices.writeFloat(ny); - vertices.writeFloat(nz); - vertices.writeFloat(tx); - vertices.writeFloat(ty); - vertices.writeFloat(tz); - vertices.writeFloat(tw); - vertices.position = d * 48 + 20; - vertices.writeFloat(nx); - vertices.writeFloat(ny); - vertices.writeFloat(nz); - vertices.writeFloat(tx); - vertices.writeFloat(ty); - vertices.writeFloat(tz); - vertices.writeFloat(tw); - } - - override public function clone() : Object3D - { - var res:Box = new Box(0,0,0,0,0,0); - res.clonePropertiesFrom(this); - return res; - } - } -} - diff --git a/src/alternativa/engine3d/resources/ATFTextureResource.as b/src/alternativa/engine3d/resources/ATFTextureResource.as deleted file mode 100644 index 5e24629..0000000 --- a/src/alternativa/engine3d/resources/ATFTextureResource.as +++ /dev/null @@ -1,62 +0,0 @@ -package alternativa.engine3d.resources -{ - import alternativa.engine3d.alternativa3d; - import flash.display3D.Context3D; - import flash.display3D.Context3DTextureFormat; - import flash.display3D.textures.CubeTexture; - import flash.display3D.textures.Texture; - import flash.utils.ByteArray; - - use namespace alternativa3d; - - public class ATFTextureResource extends TextureResource - { - public var data:ByteArray; - - public function ATFTextureResource(data:ByteArray) - { - super(); - this.data = data; - } - - override public function upload(context3D:Context3D) : void - { - var type:uint = 0; - var format:String = null; - if(alternativa3d::_texture != null) - { - alternativa3d::_texture.dispose(); - } - if(this.data != null) - { - this.data.position = 6; - type = uint(this.data.readByte()); - switch(type & 0x7F) - { - case 0: - format = Context3DTextureFormat.BGRA; - break; - case 1: - format = Context3DTextureFormat.BGRA; - break; - case 2: - format = Context3DTextureFormat.COMPRESSED; - } - if((type & ~0x7F) == 0) - { - alternativa3d::_texture = context3D.createTexture(1 << this.data.readByte(),1 << this.data.readByte(),format,false); - Texture(alternativa3d::_texture).uploadCompressedTextureFromByteArray(this.data,0); - } - else - { - alternativa3d::_texture = context3D.createCubeTexture(1 << this.data.readByte(),format,false); - CubeTexture(alternativa3d::_texture).uploadCompressedTextureFromByteArray(this.data,0); - } - return; - } - alternativa3d::_texture = null; - throw new Error("Cannot upload without data"); - } - } -} - diff --git a/src/alternativa/engine3d/resources/BitmapCubeTextureResource.as b/src/alternativa/engine3d/resources/BitmapCubeTextureResource.as deleted file mode 100644 index c57a671..0000000 --- a/src/alternativa/engine3d/resources/BitmapCubeTextureResource.as +++ /dev/null @@ -1,223 +0,0 @@ -package alternativa.engine3d.resources -{ - import alternativa.engine3d.alternativa3d; - import flash.display.BitmapData; - import flash.display3D.Context3D; - import flash.display3D.Context3DTextureFormat; - import flash.display3D.textures.CubeTexture; - import flash.filters.ConvolutionFilter; - import flash.geom.Matrix; - import flash.geom.Point; - import flash.geom.Rectangle; - - use namespace alternativa3d; - - public class BitmapCubeTextureResource extends TextureResource - { - private static var temporaryBitmapData:BitmapData; - - private static const filter:ConvolutionFilter = new ConvolutionFilter(2,2,[1,1,1,1],4,0,false,true); - - private static const rect:Rectangle = new Rectangle(); - - private static const point:Point = new Point(); - - private static const matrix:Matrix = new Matrix(0.5,0,0,0.5); - - public var left:BitmapData; - - public var right:BitmapData; - - public var top:BitmapData; - - public var bottom:BitmapData; - - public var front:BitmapData; - - public var back:BitmapData; - - public function BitmapCubeTextureResource(left:BitmapData, right:BitmapData, bottom:BitmapData, top:BitmapData, back:BitmapData, front:BitmapData) - { - super(); - this.left = left; - this.right = right; - this.bottom = bottom; - this.top = top; - this.back = back; - this.front = front; - } - - override public function upload(context3D:Context3D) : void - { - if(alternativa3d::_texture != null) - { - alternativa3d::_texture.dispose(); - } - alternativa3d::_texture = context3D.createCubeTexture(this.left.width,Context3DTextureFormat.BGRA,false); - var cubeTexture:CubeTexture = CubeTexture(alternativa3d::_texture); - filter.preserveAlpha = !this.left.transparent; - var bmp:BitmapData = temporaryBitmapData != null ? temporaryBitmapData : new BitmapData(this.left.width,this.left.height,this.left.transparent); - var level:int = 0; - cubeTexture.uploadFromBitmapData(this.left,1,level++); - var current:BitmapData = this.left; - rect.width = this.left.width; - rect.height = this.left.height; - while(rect.width % 2 == 0 || rect.height % 2 == 0) - { - bmp.applyFilter(current,rect,point,filter); - rect.width >>= 1; - rect.height >>= 1; - if(rect.width == 0) - { - rect.width = 1; - } - if(rect.height == 0) - { - rect.height = 1; - } - if(current != this.left) - { - current.dispose(); - } - current = new BitmapData(rect.width,rect.height,this.left.transparent,0); - current.draw(bmp,matrix,null,null,null,false); - cubeTexture.uploadFromBitmapData(current,1,level++); - } - level = 0; - cubeTexture.uploadFromBitmapData(this.right,0,level++); - current = this.right; - rect.width = this.right.width; - rect.height = this.right.height; - while(rect.width % 2 == 0 || rect.height % 2 == 0) - { - bmp.applyFilter(current,rect,point,filter); - rect.width >>= 1; - rect.height >>= 1; - if(rect.width == 0) - { - rect.width = 1; - } - if(rect.height == 0) - { - rect.height = 1; - } - if(current != this.right) - { - current.dispose(); - } - current = new BitmapData(rect.width,rect.height,this.right.transparent,0); - current.draw(bmp,matrix,null,null,null,false); - cubeTexture.uploadFromBitmapData(current,0,level++); - } - level = 0; - cubeTexture.uploadFromBitmapData(this.back,3,level++); - current = this.back; - rect.width = this.back.width; - rect.height = this.back.height; - while(rect.width % 2 == 0 || rect.height % 2 == 0) - { - bmp.applyFilter(current,rect,point,filter); - rect.width >>= 1; - rect.height >>= 1; - if(rect.width == 0) - { - rect.width = 1; - } - if(rect.height == 0) - { - rect.height = 1; - } - if(current != this.back) - { - current.dispose(); - } - current = new BitmapData(rect.width,rect.height,this.back.transparent,0); - current.draw(bmp,matrix,null,null,null,false); - cubeTexture.uploadFromBitmapData(current,3,level++); - } - level = 0; - cubeTexture.uploadFromBitmapData(this.front,2,level++); - current = this.front; - rect.width = this.front.width; - rect.height = this.front.height; - while(rect.width % 2 == 0 || rect.height % 2 == 0) - { - bmp.applyFilter(current,rect,point,filter); - rect.width >>= 1; - rect.height >>= 1; - if(rect.width == 0) - { - rect.width = 1; - } - if(rect.height == 0) - { - rect.height = 1; - } - if(current != this.front) - { - current.dispose(); - } - current = new BitmapData(rect.width,rect.height,this.front.transparent,0); - current.draw(bmp,matrix,null,null,null,false); - cubeTexture.uploadFromBitmapData(current,2,level++); - } - level = 0; - cubeTexture.uploadFromBitmapData(this.bottom,5,level++); - current = this.bottom; - rect.width = this.bottom.width; - rect.height = this.bottom.height; - while(rect.width % 2 == 0 || rect.height % 2 == 0) - { - bmp.applyFilter(current,rect,point,filter); - rect.width >>= 1; - rect.height >>= 1; - if(rect.width == 0) - { - rect.width = 1; - } - if(rect.height == 0) - { - rect.height = 1; - } - if(current != this.bottom) - { - current.dispose(); - } - current = new BitmapData(rect.width,rect.height,this.bottom.transparent,0); - current.draw(bmp,matrix,null,null,null,false); - cubeTexture.uploadFromBitmapData(current,5,level++); - } - level = 0; - cubeTexture.uploadFromBitmapData(this.top,4,level++); - current = this.top; - rect.width = this.top.width; - rect.height = this.top.height; - while(rect.width % 2 == 0 || rect.height % 2 == 0) - { - bmp.applyFilter(current,rect,point,filter); - rect.width >>= 1; - rect.height >>= 1; - if(rect.width == 0) - { - rect.width = 1; - } - if(rect.height == 0) - { - rect.height = 1; - } - if(current != this.top) - { - current.dispose(); - } - current = new BitmapData(rect.width,rect.height,this.top.transparent,0); - current.draw(bmp,matrix,null,null,null,false); - cubeTexture.uploadFromBitmapData(current,4,level++); - } - if(temporaryBitmapData == null) - { - bmp.dispose(); - } - } - } -} - diff --git a/src/alternativa/engine3d/resources/BitmapTextureResource.as b/src/alternativa/engine3d/resources/BitmapTextureResource.as deleted file mode 100644 index 98f043b..0000000 --- a/src/alternativa/engine3d/resources/BitmapTextureResource.as +++ /dev/null @@ -1,155 +0,0 @@ -package alternativa.engine3d.resources -{ - import alternativa.engine3d.alternativa3d; - import flash.display.BitmapData; - import flash.display3D.Context3D; - import flash.display3D.Context3DTextureFormat; - import flash.display3D.textures.Texture; - import flash.filters.ConvolutionFilter; - import flash.geom.Matrix; - import flash.geom.Point; - import flash.geom.Rectangle; - - use namespace alternativa3d; - - public class BitmapTextureResource extends TextureResource - { - private static const rect:Rectangle = new Rectangle(); - - private static const filter:ConvolutionFilter = new ConvolutionFilter(2,2,[1,1,1,1],4,0,false,true); - - private static const matrix:Matrix = new Matrix(0.5,0,0,0.5); - - private static const point:Point = new Point(); - - public var data:BitmapData; - - public function BitmapTextureResource(data:BitmapData) - { - super(); - this.data = data; - } - - alternativa3d static function createMips(texture:Texture, bitmapData:BitmapData) : void - { - rect.width = bitmapData.width; - rect.height = bitmapData.height; - var level:int = 1; - var bmp:BitmapData = new BitmapData(rect.width,rect.height,bitmapData.transparent); - var current:BitmapData = bitmapData; - while(rect.width % 2 == 0 || rect.height % 2 == 0) - { - bmp.applyFilter(current,rect,point,filter); - rect.width >>= 1; - rect.height >>= 1; - if(rect.width == 0) - { - rect.width = 1; - } - if(rect.height == 0) - { - rect.height = 1; - } - if(current != bitmapData) - { - current.dispose(); - } - current = new BitmapData(rect.width,rect.height,bitmapData.transparent,0); - current.draw(bmp,matrix,null,null,null,false); - texture.uploadFromBitmapData(current,level++); - } - if(current != bitmapData) - { - current.dispose(); - } - bmp.dispose(); - } - - override public function upload(context3D:Context3D) : void - { - var level:int = 0; - var bmp:BitmapData = null; - var current:BitmapData = null; - if(alternativa3d::_texture != null) - { - alternativa3d::_texture.dispose(); - } - if(this.data != null) - { - alternativa3d::_texture = context3D.createTexture(this.data.width,this.data.height,Context3DTextureFormat.BGRA,false); - filter.preserveAlpha = !this.data.transparent; - Texture(alternativa3d::_texture).uploadFromBitmapData(this.data,0); - level = 1; - bmp = new BitmapData(this.data.width,this.data.height,this.data.transparent); - current = this.data; - rect.width = this.data.width; - rect.height = this.data.height; - while(rect.width % 2 == 0 || rect.height % 2 == 0) - { - bmp.applyFilter(current,rect,point,filter); - rect.width >>= 1; - rect.height >>= 1; - if(rect.width == 0) - { - rect.width = 1; - } - if(rect.height == 0) - { - rect.height = 1; - } - if(current != this.data) - { - current.dispose(); - } - current = new BitmapData(rect.width,rect.height,this.data.transparent,0); - current.draw(bmp,matrix,null,null,null,false); - Texture(alternativa3d::_texture).uploadFromBitmapData(current,level++); - } - if(current != this.data) - { - current.dispose(); - } - bmp.dispose(); - return; - } - alternativa3d::_texture = null; - throw new Error("Cannot upload without data"); - } - - alternativa3d function createMips(texture:Texture, bitmapData:BitmapData) : void - { - rect.width = bitmapData.width; - rect.height = bitmapData.height; - var level:int = 1; - var bmp:BitmapData = new BitmapData(rect.width,rect.height,bitmapData.transparent); - var current:BitmapData = bitmapData; - while(rect.width % 2 == 0 || rect.height % 2 == 0) - { - bmp.applyFilter(current,rect,point,filter); - rect.width >>= 1; - rect.height >>= 1; - if(rect.width == 0) - { - rect.width = 1; - } - if(rect.height == 0) - { - rect.height = 1; - } - if(current != bitmapData) - { - current.dispose(); - } - current = new BitmapData(rect.width,rect.height,bitmapData.transparent,0); - current.draw(bmp,matrix,null,null,null,false); - texture.uploadFromBitmapData(current,level++); - } - if(current != bitmapData) - { - current.dispose(); - } - bmp.dispose(); - } - } -} - diff --git a/src/alternativa/engine3d/resources/ExternalTextureResource.as b/src/alternativa/engine3d/resources/ExternalTextureResource.as deleted file mode 100644 index f760a38..0000000 --- a/src/alternativa/engine3d/resources/ExternalTextureResource.as +++ /dev/null @@ -1,34 +0,0 @@ -package alternativa.engine3d.resources -{ - import alternativa.engine3d.alternativa3d; - import flash.display3D.Context3D; - import flash.display3D.textures.TextureBase; - - use namespace alternativa3d; - - public class ExternalTextureResource extends TextureResource - { - public var url:String; - - public function ExternalTextureResource(url:String) - { - super(); - this.url = url; - } - - override public function upload(context3D:Context3D) : void - { - } - - public function get data() : TextureBase - { - return alternativa3d::_texture; - } - - public function set data(value:TextureBase) : void - { - alternativa3d::_texture = value; - } - } -} - diff --git a/src/alternativa/engine3d/resources/Geometry.as b/src/alternativa/engine3d/resources/Geometry.as deleted file mode 100644 index c171f11..0000000 --- a/src/alternativa/engine3d/resources/Geometry.as +++ /dev/null @@ -1,681 +0,0 @@ -package alternativa.engine3d.resources -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.BoundBox; - import alternativa.engine3d.core.RayIntersectionData; - import alternativa.engine3d.core.Resource; - import alternativa.engine3d.core.Transform3D; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.core.VertexStream; - import flash.display3D.Context3D; - import flash.display3D.IndexBuffer3D; - import flash.display3D.VertexBuffer3D; - import flash.geom.Point; - import flash.geom.Vector3D; - import flash.utils.ByteArray; - import flash.utils.Endian; - - use namespace alternativa3d; - - public class Geometry extends Resource - { - alternativa3d var _vertexStreams:Vector. = new Vector.(); - - alternativa3d var name_EM:IndexBuffer3D; - - alternativa3d var _numVertices:int; - - alternativa3d var _indices:Vector. = new Vector.(); - - alternativa3d var name_GM:Vector. = new Vector.(); - - alternativa3d var _attributesOffsets:Vector. = new Vector.(); - - private var name_QD:Vector. = new Vector.(); - - public function Geometry(numVertices:int = 0) - { - super(); - this.alternativa3d::_numVertices = numVertices; - } - - public function get numTriangles() : int - { - return this.alternativa3d::_indices.length / 3; - } - - public function get indices() : Vector. - { - return this.alternativa3d::_indices.slice(); - } - - public function set indices(value:Vector.) : void - { - if(value == null) - { - this.alternativa3d::_indices.length = 0; - } - else - { - this.alternativa3d::_indices = value.slice(); - } - } - - public function get numVertices() : int - { - return this.alternativa3d::_numVertices; - } - - public function set numVertices(value:int) : void - { - var vBuffer:VertexStream = null; - var numMappings:int = 0; - if(this.alternativa3d::_numVertices != value) - { - for each(vBuffer in this.alternativa3d::_vertexStreams) - { - numMappings = int(vBuffer.attributes.length); - vBuffer.data.length = 4 * numMappings * value; - } - this.alternativa3d::_numVertices = value; - } - } - - public function addVertexStream(attributes:Array) : int - { - var next:uint = 0; - var numStandartFloats:int = 0; - var startIndex:int = 0; - var numMappings:int = int(attributes.length); - if(numMappings < 1) - { - throw new Error("Must be at least one attribute ​​to create the buffer."); - } - var vBuffer:VertexStream = new VertexStream(); - var newBufferIndex:int = int(this.alternativa3d::_vertexStreams.length); - var attribute:uint = uint(attributes[0]); - var stride:int = 1; - for(var i:int = 1; i <= numMappings; i++) - { - next = i < numMappings ? uint(attributes[i]) : 0; - if(next != attribute) - { - if(attribute != 0) - { - if(attribute < this.name_GM.length && this.name_GM[attribute] != null) - { - throw new Error("Attribute " + attribute + " already used in this geometry."); - } - numStandartFloats = VertexAttributes.getAttributeStride(attribute); - if(numStandartFloats != 0 && numStandartFloats != stride) - { - throw new Error("Standard attributes must be predefined size."); - } - if(this.name_GM.length < attribute) - { - this.name_GM.length = attribute + 1; - this.alternativa3d::_attributesOffsets.length = attribute + 1; - this.name_QD.length = attribute + 1; - } - startIndex = i - stride; - this.name_GM[attribute] = vBuffer; - this.alternativa3d::_attributesOffsets[attribute] = startIndex; - this.name_QD[attribute] = stride; - } - stride = 1; - } - else - { - stride++; - } - attribute = next; - } - vBuffer.attributes = attributes.slice(); - vBuffer.data = new ByteArray(); - vBuffer.data.endian = Endian.LITTLE_ENDIAN; - vBuffer.data.length = 4 * numMappings * this.alternativa3d::_numVertices; - this.alternativa3d::_vertexStreams[newBufferIndex] = vBuffer; - return newBufferIndex; - } - - public function get numVertexStreams() : int - { - return this.alternativa3d::_vertexStreams.length; - } - - public function getVertexStreamAttributes(index:int) : Array - { - return this.alternativa3d::_vertexStreams[index].attributes.slice(); - } - - public function hasAttribute(attribute:uint) : Boolean - { - return attribute < this.name_GM.length && this.name_GM[attribute] != null; - } - - public function findVertexStreamByAttribute(attribute:uint) : int - { - var i:int = 0; - var vBuffer:VertexStream = attribute < this.name_GM.length ? this.name_GM[attribute] : null; - if(vBuffer != null) - { - for(i = 0; i < this.alternativa3d::_vertexStreams.length; ) - { - if(this.alternativa3d::_vertexStreams[i] == vBuffer) - { - return i; - } - i++; - } - } - return -1; - } - - public function getAttributeOffset(attribute:uint) : int - { - var vBuffer:VertexStream = attribute < this.name_GM.length ? this.name_GM[attribute] : null; - if(vBuffer == null) - { - throw new Error("Attribute not found."); - } - return this.alternativa3d::_attributesOffsets[attribute]; - } - - public function setAttributeValues(attribute:uint, values:Vector.) : void - { - var srcIndex:int = 0; - var j:int = 0; - var vBuffer:VertexStream = attribute < this.name_GM.length ? this.name_GM[attribute] : null; - if(vBuffer == null) - { - throw new Error("Attribute not found."); - } - var stride:int = this.name_QD[attribute]; - if(values == null || values.length != stride * this.alternativa3d::_numVertices) - { - throw new Error("Values count must be the same."); - } - var numMappings:int = int(vBuffer.attributes.length); - var data:ByteArray = vBuffer.data; - var offset:int = this.alternativa3d::_attributesOffsets[attribute]; - for(var i:int = 0; i < this.alternativa3d::_numVertices; i++) - { - srcIndex = stride * i; - data.position = 4 * (numMappings * i + offset); - for(j = 0; j < stride; j++) - { - data.writeFloat(values[int(srcIndex + j)]); - } - } - } - - public function getAttributeValues(attribute:uint) : Vector. - { - var dstIndex:int = 0; - var j:int = 0; - var vBuffer:VertexStream = attribute < this.name_GM.length ? this.name_GM[attribute] : null; - if(vBuffer == null) - { - throw new Error("Attribute not found."); - } - var data:ByteArray = vBuffer.data; - var stride:int = this.name_QD[attribute]; - var result:Vector. = new Vector.(stride * this.alternativa3d::_numVertices); - var numMappings:int = int(vBuffer.attributes.length); - var offset:int = this.alternativa3d::_attributesOffsets[attribute]; - for(var i:int = 0; i < this.alternativa3d::_numVertices; i++) - { - data.position = 4 * (numMappings * i + offset); - dstIndex = stride * i; - for(j = 0; j < stride; j++) - { - result[int(dstIndex + j)] = data.readFloat(); - } - } - return result; - } - - override public function get isUploaded() : Boolean - { - return this.name_EM != null; - } - - override public function upload(context3D:Context3D) : void - { - var vBuffer:VertexStream = null; - var i:int = 0; - var numMappings:int = 0; - var data:ByteArray = null; - var numBuffers:int = int(this.alternativa3d::_vertexStreams.length); - if(this.name_EM != null) - { - this.name_EM.dispose(); - this.name_EM = null; - for(i = 0; i < numBuffers; i++) - { - vBuffer = this.alternativa3d::_vertexStreams[i]; - vBuffer.buffer.dispose(); - vBuffer.buffer = null; - } - } - if(this.alternativa3d::_indices.length <= 0 || this.alternativa3d::_numVertices <= 0) - { - return; - } - for(i = 0; i < numBuffers; ) - { - vBuffer = this.alternativa3d::_vertexStreams[i]; - numMappings = int(vBuffer.attributes.length); - data = vBuffer.data; - if(data == null) - { - throw new Error("Cannot upload without vertex buffer data."); - } - vBuffer.buffer = context3D.createVertexBuffer(this.alternativa3d::_numVertices,numMappings); - vBuffer.buffer.uploadFromByteArray(data,0,0,this.alternativa3d::_numVertices); - i++; - } - var numIndices:int = int(this.alternativa3d::_indices.length); - this.name_EM = context3D.createIndexBuffer(numIndices); - this.name_EM.uploadFromVector(this.alternativa3d::_indices,0,numIndices); - } - - override public function dispose() : void - { - var numBuffers:int = 0; - var i:int = 0; - var vBuffer:VertexStream = null; - if(this.name_EM != null) - { - this.name_EM.dispose(); - this.name_EM = null; - numBuffers = int(this.alternativa3d::_vertexStreams.length); - for(i = 0; i < numBuffers; i++) - { - vBuffer = this.alternativa3d::_vertexStreams[i]; - vBuffer.buffer.dispose(); - vBuffer.buffer = null; - } - } - } - - public function updateIndexBufferInContextFromVector(data:Vector., startOffset:int, count:int) : void - { - if(this.name_EM == null) - { - throw new Error("Geometry must be uploaded."); - } - this.name_EM.uploadFromVector(data,startOffset,count); - } - - public function updateIndexBufferInContextFromByteArray(data:ByteArray, byteArrayOffset:int, startOffset:int, count:int) : void - { - if(this.name_EM == null) - { - throw new Error("Geometry must be uploaded."); - } - this.name_EM.uploadFromByteArray(data,byteArrayOffset,startOffset,count); - } - - public function updateVertexBufferInContextFromVector(index:int, data:Vector., startVertex:int, numVertices:int) : void - { - if(this.name_EM == null) - { - throw new Error("Geometry must be uploaded."); - } - this.alternativa3d::_vertexStreams[index].buffer.uploadFromVector(data,startVertex,numVertices); - } - - public function updateVertexBufferInContextFromByteArray(index:int, data:ByteArray, byteArrayOffset:int, startVertex:int, numVertices:int) : void - { - if(this.name_EM == null) - { - throw new Error("Geometry must be uploaded."); - } - this.alternativa3d::_vertexStreams[index].buffer.uploadFromByteArray(data,byteArrayOffset,startVertex,numVertices); - } - - alternativa3d function intersectRay(origin:Vector3D, direction:Vector3D, indexBegin:uint, numTriangles:uint) : RayIntersectionData - { - var nax:Number = NaN; - var nay:Number = NaN; - var naz:Number = NaN; - var nau:Number = NaN; - var nav:Number = NaN; - var nbx:Number = NaN; - var nby:Number = NaN; - var nbz:Number = NaN; - var nbu:Number = NaN; - var nbv:Number = NaN; - var ncx:Number = NaN; - var ncy:Number = NaN; - var ncz:Number = NaN; - var ncu:Number = NaN; - var ncv:Number = NaN; - var nrmX:Number = NaN; - var nrmY:Number = NaN; - var nrmZ:Number = NaN; - var point:Vector3D = null; - var positionStream:VertexStream = null; - var uvStream:VertexStream = null; - var uvBuffer:ByteArray = null; - var uvOffset:uint = 0; - var uvStride:uint = 0; - var indexA:uint = 0; - var indexB:uint = 0; - var indexC:uint = 0; - var ax:Number = NaN; - var ay:Number = NaN; - var az:Number = NaN; - var au:Number = NaN; - var av:Number = NaN; - var bx:Number = NaN; - var by:Number = NaN; - var bz:Number = NaN; - var bu:Number = NaN; - var bv:Number = NaN; - var cx:Number = NaN; - var cy:Number = NaN; - var cz:Number = NaN; - var cu:Number = NaN; - var cv:Number = NaN; - var abx:Number = NaN; - var aby:Number = NaN; - var abz:Number = NaN; - var acx:Number = NaN; - var acy:Number = NaN; - var acz:Number = NaN; - var normalX:Number = NaN; - var normalY:Number = NaN; - var normalZ:Number = NaN; - var len:Number = NaN; - var dot:Number = NaN; - var offset:Number = NaN; - var time:Number = NaN; - var rx:Number = NaN; - var ry:Number = NaN; - var rz:Number = NaN; - var res:RayIntersectionData = null; - var abu:Number = NaN; - var abv:Number = NaN; - var acu:Number = NaN; - var acv:Number = NaN; - var det:Number = NaN; - var ima:Number = NaN; - var imb:Number = NaN; - var imc:Number = NaN; - var imd:Number = NaN; - var ime:Number = NaN; - var imf:Number = NaN; - var img:Number = NaN; - var imh:Number = NaN; - var ma:Number = NaN; - var mb:Number = NaN; - var mc:Number = NaN; - var md:Number = NaN; - var me:Number = NaN; - var mf:Number = NaN; - var mg:Number = NaN; - var mh:Number = NaN; - var ox:Number = Number(origin.x); - var oy:Number = Number(origin.y); - var oz:Number = Number(origin.z); - var dx:Number = Number(direction.x); - var dy:Number = Number(direction.y); - var dz:Number = Number(direction.z); - var minTime:Number = 1e+22; - var posAttribute:int = int(VertexAttributes.POSITION); - var uvAttribute:int = int(VertexAttributes.TEXCOORDS[0]); - if(VertexAttributes.POSITION >= this.name_GM.length || (positionStream = this.name_GM[posAttribute]) == null) - { - throw new Error("Raycast require POSITION attribute"); - } - var positionBuffer:ByteArray = positionStream.data; - var positionOffset:uint = uint(this.alternativa3d::_attributesOffsets[posAttribute] * 4); - var stride:uint = positionStream.attributes.length * 4; - var hasUV:Boolean = uvAttribute < this.name_GM.length && (uvStream = this.name_GM[uvAttribute]) != null; - if(hasUV) - { - uvBuffer = uvStream.data; - uvOffset = uint(this.alternativa3d::_attributesOffsets[uvAttribute] * 4); - uvStride = uvStream.attributes.length * 4; - } - if(numTriangles * 3 > this.indices.length) - { - throw new ArgumentError("index is out of bounds"); - } - for(var i:int = int(indexBegin), count:int = indexBegin + numTriangles * 3; i < count; ) - { - indexA = this.indices[i]; - indexB = this.indices[int(i + 1)]; - indexC = this.indices[int(i + 2)]; - positionBuffer.position = indexA * stride + positionOffset; - ax = Number(positionBuffer.readFloat()); - ay = Number(positionBuffer.readFloat()); - az = Number(positionBuffer.readFloat()); - positionBuffer.position = indexB * stride + positionOffset; - bx = Number(positionBuffer.readFloat()); - by = Number(positionBuffer.readFloat()); - bz = Number(positionBuffer.readFloat()); - positionBuffer.position = indexC * stride + positionOffset; - cx = Number(positionBuffer.readFloat()); - cy = Number(positionBuffer.readFloat()); - cz = Number(positionBuffer.readFloat()); - if(hasUV) - { - uvBuffer.position = indexA * uvStride + uvOffset; - au = Number(uvBuffer.readFloat()); - av = Number(uvBuffer.readFloat()); - uvBuffer.position = indexB * uvStride + uvOffset; - bu = Number(uvBuffer.readFloat()); - bv = Number(uvBuffer.readFloat()); - uvBuffer.position = indexC * uvStride + uvOffset; - cu = Number(uvBuffer.readFloat()); - cv = Number(uvBuffer.readFloat()); - } - abx = bx - ax; - aby = by - ay; - abz = bz - az; - acx = cx - ax; - acy = cy - ay; - acz = cz - az; - normalX = acz * aby - acy * abz; - normalY = acx * abz - acz * abx; - normalZ = acy * abx - acx * aby; - len = normalX * normalX + normalY * normalY + normalZ * normalZ; - if(len > 0.001) - { - len = 1 / Math.sqrt(len); - normalX *= len; - normalY *= len; - normalZ *= len; - } - dot = dx * normalX + dy * normalY + dz * normalZ; - if(dot < 0) - { - offset = ox * normalX + oy * normalY + oz * normalZ - (ax * normalX + ay * normalY + az * normalZ); - if(offset > 0) - { - time = -offset / dot; - if(point == null || time < minTime) - { - rx = ox + dx * time; - ry = oy + dy * time; - rz = oz + dz * time; - abx = bx - ax; - aby = by - ay; - abz = bz - az; - acx = rx - ax; - acy = ry - ay; - acz = rz - az; - if((acz * aby - acy * abz) * normalX + (acx * abz - acz * abx) * normalY + (acy * abx - acx * aby) * normalZ >= 0) - { - abx = cx - bx; - aby = cy - by; - abz = cz - bz; - acx = rx - bx; - acy = ry - by; - acz = rz - bz; - if((acz * aby - acy * abz) * normalX + (acx * abz - acz * abx) * normalY + (acy * abx - acx * aby) * normalZ >= 0) - { - abx = ax - cx; - aby = ay - cy; - abz = az - cz; - acx = rx - cx; - acy = ry - cy; - acz = rz - cz; - if((acz * aby - acy * abz) * normalX + (acx * abz - acz * abx) * normalY + (acy * abx - acx * aby) * normalZ >= 0) - { - if(time < minTime) - { - minTime = time; - if(point == null) - { - point = new Vector3D(); - } - point.x = rx; - point.y = ry; - point.z = rz; - nax = ax; - nay = ay; - naz = az; - nau = au; - nav = av; - nrmX = normalX; - nbx = bx; - nby = by; - nbz = bz; - nbu = bu; - nbv = bv; - nrmY = normalY; - ncx = cx; - ncy = cy; - ncz = cz; - ncu = cu; - ncv = cv; - nrmZ = normalZ; - } - } - } - } - } - } - } - i += 3; - } - if(point != null) - { - res = new RayIntersectionData(); - res.point = point; - res.time = minTime; - if(hasUV) - { - abx = nbx - nax; - aby = nby - nay; - abz = nbz - naz; - abu = nbu - nau; - abv = nbv - nav; - acx = ncx - nax; - acy = ncy - nay; - acz = ncz - naz; - acu = ncu - nau; - acv = ncv - nav; - det = -nrmX * acy * abz + acx * nrmY * abz + nrmX * aby * acz - abx * nrmY * acz - acx * aby * nrmZ + abx * acy * nrmZ; - ima = (-nrmY * acz + acy * nrmZ) / det; - imb = (nrmX * acz - acx * nrmZ) / det; - imc = (-nrmX * acy + acx * nrmY) / det; - imd = (nax * nrmY * acz - nrmX * nay * acz - nax * acy * nrmZ + acx * nay * nrmZ + nrmX * acy * naz - acx * nrmY * naz) / det; - ime = (nrmY * abz - aby * nrmZ) / det; - imf = (-nrmX * abz + abx * nrmZ) / det; - img = (nrmX * aby - abx * nrmY) / det; - imh = (nrmX * nay * abz - nax * nrmY * abz + nax * aby * nrmZ - abx * nay * nrmZ - nrmX * aby * naz + abx * nrmY * naz) / det; - ma = abu * ima + acu * ime; - mb = abu * imb + acu * imf; - mc = abu * imc + acu * img; - md = abu * imd + acu * imh + nau; - me = abv * ima + acv * ime; - mf = abv * imb + acv * imf; - mg = abv * imc + acv * img; - mh = abv * imd + acv * imh + nav; - res.uv = new Point(ma * point.x + mb * point.y + mc * point.z + md,me * point.x + mf * point.y + mg * point.z + mh); - } - return res; - } - return null; - } - - alternativa3d function getVertexBuffer(attribute:int) : VertexBuffer3D - { - var stream:VertexStream = null; - if(attribute < this.name_GM.length) - { - stream = this.name_GM[attribute]; - return stream != null ? stream.buffer : null; - } - return null; - } - - alternativa3d function updateBoundBox(boundBox:BoundBox, transform:Transform3D = null) : void - { - var vx:Number = NaN; - var vy:Number = NaN; - var vz:Number = NaN; - var x:Number = NaN; - var y:Number = NaN; - var z:Number = NaN; - var vBuffer:VertexStream = VertexAttributes.POSITION < this.name_GM.length ? this.name_GM[VertexAttributes.POSITION] : null; - if(vBuffer == null) - { - throw new Error("Cannot calculate BoundBox without data."); - } - var offset:int = this.alternativa3d::_attributesOffsets[VertexAttributes.POSITION]; - var numMappings:int = int(vBuffer.attributes.length); - var data:ByteArray = vBuffer.data; - for(var i:int = 0; i < this.alternativa3d::_numVertices; ) - { - data.position = 4 * (numMappings * i + offset); - vx = Number(data.readFloat()); - vy = Number(data.readFloat()); - vz = Number(data.readFloat()); - if(transform != null) - { - x = transform.a * vx + transform.b * vy + transform.c * vz + transform.d; - y = transform.e * vx + transform.f * vy + transform.g * vz + transform.h; - z = transform.i * vx + transform.j * vy + transform.k * vz + transform.l; - } - else - { - x = vx; - y = vy; - z = vz; - } - if(x < boundBox.minX) - { - boundBox.minX = x; - } - if(x > boundBox.maxX) - { - boundBox.maxX = x; - } - if(y < boundBox.minY) - { - boundBox.minY = y; - } - if(y > boundBox.maxY) - { - boundBox.maxY = y; - } - if(z < boundBox.minZ) - { - boundBox.minZ = z; - } - if(z > boundBox.maxZ) - { - boundBox.maxZ = z; - } - i++; - } - } - } -} - diff --git a/src/alternativa/engine3d/resources/TextureResource.as b/src/alternativa/engine3d/resources/TextureResource.as deleted file mode 100644 index 839afc1..0000000 --- a/src/alternativa/engine3d/resources/TextureResource.as +++ /dev/null @@ -1,33 +0,0 @@ -package alternativa.engine3d.resources -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Resource; - import flash.display3D.textures.TextureBase; - - use namespace alternativa3d; - - public class TextureResource extends Resource - { - alternativa3d var _texture:TextureBase; - - public function TextureResource() - { - super(); - } - - override public function get isUploaded() : Boolean - { - return this.alternativa3d::_texture != null; - } - - override public function dispose() : void - { - if(this.alternativa3d::_texture != null) - { - this.alternativa3d::_texture.dispose(); - this.alternativa3d::_texture = null; - } - } - } -} - diff --git a/src/alternativa/engine3d/resources/WireGeometry.as b/src/alternativa/engine3d/resources/WireGeometry.as deleted file mode 100644 index 363747e..0000000 --- a/src/alternativa/engine3d/resources/WireGeometry.as +++ /dev/null @@ -1,248 +0,0 @@ -package alternativa.engine3d.resources -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.BoundBox; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.RenderPriority; - import alternativa.engine3d.core.Resource; - import alternativa.engine3d.core.Transform3D; - import alternativa.engine3d.materials.ShaderProgram; - import flash.display3D.Context3D; - import flash.display3D.Context3DBlendFactor; - import flash.display3D.Context3DVertexBufferFormat; - import flash.display3D.IndexBuffer3D; - import flash.display3D.VertexBuffer3D; - - use namespace alternativa3d; - - public class WireGeometry extends Resource - { - private const name_VA:uint = 65500; - - private const name_Pp:Number = 2 * Math.tan(Math.PI / 6); - - private const name_SS:uint = 7; - - alternativa3d var vertexBuffers:Vector.; - - alternativa3d var indexBuffers:Vector.; - - private var name_Rz:Vector.; - - private var vertices:Vector.>; - - private var indices:Vector.>; - - private var name_ix:int = 0; - - private var name_dP:uint = 0; - - public function WireGeometry() - { - super(); - this.alternativa3d::vertexBuffers = new Vector.(1); - this.alternativa3d::indexBuffers = new Vector.(1); - this.clear(); - } - - override public function upload(context3D:Context3D) : void - { - var verts:Vector. = null; - var inds:Vector. = null; - var vBuffer:VertexBuffer3D = null; - var iBuffer:IndexBuffer3D = null; - for(var i:int = 0; i <= this.name_ix; ) - { - if(this.alternativa3d::vertexBuffers[i] != null) - { - this.alternativa3d::vertexBuffers[i].dispose(); - } - if(this.alternativa3d::indexBuffers[i] != null) - { - this.alternativa3d::indexBuffers[i].dispose(); - } - if(this.name_Rz[i] > 0) - { - verts = this.vertices[i]; - inds = this.indices[i]; - vBuffer = this.alternativa3d::vertexBuffers[i] = context3D.createVertexBuffer(verts.length / this.name_SS,this.name_SS); - vBuffer.uploadFromVector(verts,0,verts.length / this.name_SS); - iBuffer = this.alternativa3d::indexBuffers[i] = context3D.createIndexBuffer(inds.length); - iBuffer.uploadFromVector(inds,0,inds.length); - } - i++; - } - } - - override public function dispose() : void - { - for(var i:int = 0; i <= this.name_ix; ) - { - if(this.alternativa3d::vertexBuffers[i] != null) - { - this.alternativa3d::vertexBuffers[i].dispose(); - this.alternativa3d::vertexBuffers[i] = null; - } - if(this.alternativa3d::indexBuffers[i] != null) - { - this.alternativa3d::indexBuffers[i].dispose(); - this.alternativa3d::indexBuffers[i] = null; - } - i++; - } - } - - override public function get isUploaded() : Boolean - { - for(var i:int = 0; i <= this.name_ix; ) - { - if(this.alternativa3d::vertexBuffers[i] == null) - { - return false; - } - if(this.alternativa3d::indexBuffers[i] == null) - { - return false; - } - i++; - } - return true; - } - - public function clear() : void - { - this.dispose(); - this.vertices = new Vector.>(); - this.indices = new Vector.>(); - this.vertices[0] = new Vector.(); - this.indices[0] = new Vector.(); - this.name_Rz = new Vector.(1); - this.name_dP = 0; - } - - alternativa3d function updateBoundBox(boundBox:BoundBox, transform:Transform3D = null) : void - { - var j:int = 0; - var vcount:int = 0; - var verts:Vector. = null; - var vx:Number = NaN; - var vy:Number = NaN; - var vz:Number = NaN; - var x:Number = NaN; - var y:Number = NaN; - var z:Number = NaN; - for(var i:int = 0, count:int = int(this.vertices.length); i < count; i++) - { - for(j = 0,vcount = int(this.vertices[i].length); j < vcount; ) - { - verts = this.vertices[i]; - vx = verts[j]; - vy = verts[int(j + 1)]; - vz = verts[int(j + 2)]; - if(transform != null) - { - x = transform.a * vx + transform.b * vy + transform.c * vz + transform.d; - y = transform.e * vx + transform.f * vy + transform.g * vz + transform.h; - z = transform.i * vx + transform.j * vy + transform.k * vz + transform.l; - } - else - { - x = vx; - y = vy; - z = vz; - } - if(x < boundBox.minX) - { - boundBox.minX = x; - } - if(x > boundBox.maxX) - { - boundBox.maxX = x; - } - if(y < boundBox.minY) - { - boundBox.minY = y; - } - if(y > boundBox.maxY) - { - boundBox.maxY = y; - } - if(z < boundBox.minZ) - { - boundBox.minZ = z; - } - if(z > boundBox.maxZ) - { - boundBox.maxZ = z; - } - j += this.name_SS; - } - } - } - - alternativa3d function getDrawUnits(camera:Camera3D, color:Vector., thickness:Number, object:Object3D, shader:ShaderProgram) : void - { - var iBuffer:IndexBuffer3D = null; - var vBuffer:VertexBuffer3D = null; - var drawUnit:DrawUnit = null; - if(shader.program == null) - { - shader.upload(camera.alternativa3d::context3D); - } - for(var i:int = 0; i <= this.name_ix; ) - { - iBuffer = this.alternativa3d::indexBuffers[i]; - vBuffer = this.alternativa3d::vertexBuffers[i]; - if(iBuffer != null && vBuffer != null) - { - drawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,shader.program,iBuffer,0,this.name_Rz[i],shader); - drawUnit.alternativa3d::setVertexBufferAt(0,vBuffer,0,Context3DVertexBufferFormat.FLOAT_4); - drawUnit.alternativa3d::setVertexBufferAt(1,vBuffer,4,Context3DVertexBufferFormat.FLOAT_3); - drawUnit.alternativa3d::setVertexConstantsFromNumbers(0,0,1,-1,0.000001); - drawUnit.alternativa3d::setVertexConstantsFromNumbers(1,-this.name_Pp / camera.view.alternativa3d::_height,0,camera.nearClipping,thickness); - drawUnit.alternativa3d::setVertexConstantsFromTransform(2,object.alternativa3d::localToCameraTransform); - drawUnit.alternativa3d::setProjectionConstants(camera,5); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(0,color[0],color[1],color[2],color[3]); - if(color[3] < 1) - { - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.SOURCE_ALPHA; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,RenderPriority.TRANSPARENT_SORT); - } - else - { - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,RenderPriority.OPAQUE); - } - } - i++; - } - } - - alternativa3d function addLine(v1x:Number, v1y:Number, v1z:Number, v2x:Number, v2y:Number, v2z:Number) : void - { - var currentVertices:Vector. = this.vertices[this.name_ix]; - var currentIndices:Vector. = this.indices[this.name_ix]; - var verticesCount:uint = currentVertices.length / this.name_SS; - if(verticesCount > this.name_VA - 4) - { - this.name_dP = 0; - ++this.name_ix; - this.name_Rz[this.name_ix] = 0; - currentVertices = this.vertices[this.name_ix] = new Vector.(); - currentIndices = this.indices[this.name_ix] = new Vector.(); - this.alternativa3d::vertexBuffers.length = this.name_ix + 1; - this.alternativa3d::indexBuffers.length = this.name_ix + 1; - } - else - { - this.name_Rz[this.name_ix] += 2; - } - currentVertices.push(v1x,v1y,v1z,0.5,v2x,v2y,v2z,v2x,v2y,v2z,-0.5,v1x,v1y,v1z,v1x,v1y,v1z,-0.5,v2x,v2y,v2z,v2x,v2y,v2z,0.5,v1x,v1y,v1z); - currentIndices.push(this.name_dP,this.name_dP + 1,this.name_dP + 2,this.name_dP + 3,this.name_dP + 2,this.name_dP + 1); - this.name_dP += 4; - } - } -} - diff --git a/src/alternativa/engine3d/shadows/DirectionalShadowRenderer.as b/src/alternativa/engine3d/shadows/DirectionalShadowRenderer.as deleted file mode 100644 index cf8dda1..0000000 --- a/src/alternativa/engine3d/shadows/DirectionalShadowRenderer.as +++ /dev/null @@ -1,457 +0,0 @@ -package alternativa.engine3d.shadows -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.BoundBox; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.Transform3D; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.lights.DirectionalLight; - import alternativa.engine3d.materials.ShaderProgram; - import alternativa.engine3d.materials.TextureMaterial; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.materials.compiler.VariableType; - import alternativa.engine3d.objects.Mesh; - import alternativa.engine3d.objects.Surface; - import alternativa.engine3d.primitives.Box; - import alternativa.engine3d.resources.ExternalTextureResource; - import alternativa.engine3d.resources.TextureResource; - import flash.display3D.Context3D; - import flash.display3D.Context3DProgramType; - import flash.display3D.Context3DTextureFormat; - import flash.display3D.Context3DTriangleFace; - import flash.display3D.Program3D; - import flash.display3D.textures.Texture; - import flash.geom.Matrix3D; - import flash.geom.Vector3D; - - use namespace alternativa3d; - - public class DirectionalShadowRenderer extends ShadowRenderer - { - private static var directionalShadowMapProgram:Program3D; - - private static const constants:Vector. = Vector.([255,255 * 0.96,100,1]); - - private static var matrix:Matrix3D = new Matrix3D(); - - private static var transformToMatrixRawData:Vector. = new Vector.(16); - - private static var drawProjection:Matrix3D = new Matrix3D(); - - private static const objectToShadowMap:Matrix3D = new Matrix3D(); - - private static const localToGlobal:Transform3D = new Transform3D(); - - private static const vector:Vector. = new Vector.(16,false); - - public var offset:Vector3D = new Vector3D(); - - public var name_qg:Object3D; - - private var context:Context3D; - - private var shadowMap:Texture; - - private var name_FQ:Number; - - private var light:DirectionalLight; - - alternativa3d var name_UK:Matrix3D = new Matrix3D(); - - private var debugObject:Mesh; - - public var name_Vg:TextureMaterial = new TextureMaterial(); - - private var name_Ez:TextureResource = new ExternalTextureResource("null"); - - private var name_M:Number = 0; - - private var pcfOffsets:Vector.; - - private var name_1a:Boolean = false; - - private var name_bD:Matrix3D = new Matrix3D(); - - private var uvMatrix:Matrix3D = new Matrix3D(); - - private var center:Vector3D = new Vector3D(); - - private var rawData:Vector. = new Vector.(16); - - public function DirectionalShadowRenderer(context:Context3D, size:int, worldSize:Number, pcfSize:Number = 0) - { - super(); - this.context = context; - this.name_FQ = worldSize; - this.name_M = pcfSize / worldSize / 255; - if(this.name_M > 0) - { - this.pcfOffsets = Vector.([-this.name_M,-this.name_M,0,1 / 4,-this.name_M,this.name_M,0,1,this.name_M,-this.name_M,0,1,this.name_M,this.name_M,0,1]); - } - this.shadowMap = context.createTexture(size,size,Context3DTextureFormat.BGRA,true); - this.name_Ez.alternativa3d::_texture = this.shadowMap; - this.name_Vg.diffuseMap = this.name_Ez; - this.name_Vg.alpha = 0.9; - this.name_Vg.name_L4 = true; - this.debugObject = new Box(worldSize,worldSize,1,1,1,1,false,this.name_Vg); - this.debugObject.geometry.upload(context); - } - - alternativa3d static function copyMatrixFromTransform(matrix:Matrix3D, transform:Transform3D) : void - { - transformToMatrixRawData[0] = transform.a; - transformToMatrixRawData[1] = transform.e; - transformToMatrixRawData[2] = transform.i; - transformToMatrixRawData[3] = 0; - transformToMatrixRawData[4] = transform.b; - transformToMatrixRawData[5] = transform.f; - transformToMatrixRawData[6] = transform.j; - transformToMatrixRawData[7] = 0; - transformToMatrixRawData[8] = transform.c; - transformToMatrixRawData[9] = transform.g; - transformToMatrixRawData[10] = transform.k; - transformToMatrixRawData[11] = 0; - transformToMatrixRawData[12] = transform.d; - transformToMatrixRawData[13] = transform.h; - transformToMatrixRawData[14] = transform.l; - transformToMatrixRawData[15] = 1; - matrix.copyRawDataFrom(transformToMatrixRawData); - } - - alternativa3d static function drawObjectToShadowMap(context:Context3D, object:Object3D, light:DirectionalLight, projection:Matrix3D) : void - { - if(object is Mesh) - { - drawMeshToShadowMap(context,Mesh(object),projection); - } - for(var child:Object3D = object.alternativa3d::childrenList; child != null; ) - { - if(child.visible && child.useShadow) - { - if(child.alternativa3d::transformChanged) - { - child.alternativa3d::composeTransforms(); - } - child.alternativa3d::localToCameraTransform.combine(object.alternativa3d::localToCameraTransform,child.alternativa3d::transform); - alternativa3d::drawObjectToShadowMap(context,child,light,projection); - } - child = child.alternativa3d::next; - } - } - - private static function drawMeshToShadowMap(context:Context3D, mesh:Mesh, projection:Matrix3D) : void - { - var surface:Surface = null; - if(mesh.geometry == null || mesh.geometry.numTriangles == 0 || !mesh.geometry.isUploaded) - { - return; - } - alternativa3d::copyMatrixFromTransform(drawProjection,mesh.alternativa3d::localToCameraTransform); - drawProjection.append(projection); - if(directionalShadowMapProgram == null) - { - directionalShadowMapProgram = initMeshToShadowMapProgram(context); - } - context.setProgram(directionalShadowMapProgram); - context.setVertexBufferAt(0,mesh.geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION),mesh.geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - context.setProgramConstantsFromMatrix(Context3DProgramType.VERTEX,0,drawProjection,true); - context.setProgramConstantsFromVector(Context3DProgramType.VERTEX,4,Vector.([255,0,0,1])); - context.setProgramConstantsFromVector(Context3DProgramType.FRAGMENT,0,Vector.([1 / 255,0,0,1])); - context.setCulling(Context3DTriangleFace.BACK); - for(var i:int = 0; i < mesh.name_Oy; i++) - { - surface = mesh.name_eW[i]; - if(!(surface.material == null || !surface.material.alternativa3d::canDrawInShadowMap)) - { - context.drawTriangles(mesh.geometry.name_EM,surface.indexBegin,surface.numTriangles); - } - } - context.setVertexBufferAt(0,null); - } - - private static function initMeshToShadowMapProgram(context3d:Context3D) : Program3D - { - var vLinker:Linker = new Linker(Context3DProgramType.VERTEX); - var fLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); - var proc:Procedure = Procedure.compileFromArray(["#a0=a0","#c4=c4","#v0=v0","m44 t0, a0, c0","mul v0, t0, c4.x","mov o0, t0"]); - proc.assignVariableName(VariableType.CONSTANT,0,"c0",4); - vLinker.addProcedure(proc); - fLinker.addProcedure(Procedure.compileFromArray(["#v0=v0","#c0=c0","mov t0.xy, v0.zz","frc t0.y, v0.z","sub t0.x, v0.z, t0.y","mul t0.x, t0.x, c0.x","mov t0.z, c0.z","mov t0.w, c0.w","mov o0, t0"])); - var program:Program3D = context3d.createProgram(); - program.upload(vLinker.getByteCode(),fLinker.getByteCode()); - return program; - } - - private static function initVShader(index:int) : Procedure - { - var shader:Procedure = Procedure.compileFromArray(["m44 v0, a0, c0"]); - shader.assignVariableName(VariableType.ATTRIBUTE,0,"aPosition"); - shader.assignVariableName(VariableType.CONSTANT,0,index + "cTOSHADOW",4); - shader.assignVariableName(VariableType.VARYING,0,index + "vSHADOWSAMPLE"); - return shader; - } - - private static function initFShader(mult:Boolean, usePCF:Boolean, index:int, grayScale:Boolean = false) : Procedure - { - var i:int = 0; - var line:int = 0; - var shaderArr:Array = []; - var numPass:uint = usePCF ? 4 : 1; - for(i = 0; i < numPass; i++) - { - var _loc10_:* = line++; - shaderArr[_loc10_] = "mov t0.w, v0.z"; - var _loc11_:* = line++; - shaderArr[_loc11_] = "mul t0.w, t0.w, c4.y"; - if(usePCF) - { - var _loc12_:* = line++; - shaderArr[_loc12_] = "mul t1, c" + (i + 6).toString() + ", t0.w"; - var _loc13_:* = line++; - shaderArr[_loc13_] = "add t1, v0, t1"; - var _loc14_:* = line++; - shaderArr[_loc14_] = "tex t1, t1, s0 <2d,clamp,near,nomip>"; - } - else - { - _loc12_ = line++; - shaderArr[_loc12_] = "tex t1, v0, s0 <2d,clamp,near,nomip>"; - } - _loc12_ = line++; - shaderArr[_loc12_] = "mul t1.w, t1.x, c4.x"; - _loc13_ = line++; - shaderArr[_loc13_] = "add t1.w, t1.w, t1.y"; - _loc14_ = line++; - shaderArr[_loc14_] = "sub t2.z, t1.w, t0.w"; - var _loc15_:* = line++; - shaderArr[_loc15_] = "mul t2.z, t2.z, c4.z"; - var _loc16_:* = line++; - shaderArr[_loc16_] = "sat t2.z, t2.z"; - if(grayScale) - { - var _loc17_:* = line++; - shaderArr[_loc17_] = "add t2, t2.zzzz, t1.zzzz"; - } - else - { - _loc17_ = line++; - shaderArr[_loc17_] = "add t2.z, t2.z, t1.z"; - var _loc18_:* = line++; - shaderArr[_loc18_] = "add t2, t2.zzzz, c5"; - } - _loc17_ = line++; - shaderArr[_loc17_] = "sat t2, t2"; - if(usePCF) - { - if(i == 0) - { - _loc18_ = line++; - shaderArr[_loc18_] = "mov t3, t2"; - } - else - { - _loc18_ = line++; - shaderArr[_loc18_] = "add t3, t3, t2"; - } - } - } - if(usePCF) - { - _loc10_ = line++; - shaderArr[_loc10_] = "mul t2, t3, c6.w"; - } - if(grayScale) - { - _loc10_ = line++; - shaderArr[_loc10_] = "mov o0.w, t2.x"; - } - else if(mult) - { - _loc10_ = line++; - shaderArr[_loc10_] = "mul t0.xyz, i0.xyz, t2.xyz"; - _loc11_ = line++; - shaderArr[_loc11_] = "mov t0.w, i0.w"; - _loc12_ = line++; - shaderArr[_loc12_] = "mov o0, t0"; - } - else - { - _loc10_ = line++; - shaderArr[_loc10_] = "mov o0, t2"; - } - var shader:Procedure = Procedure.compileFromArray(shaderArr,"DirectionalShadowMap"); - shader.assignVariableName(VariableType.VARYING,0,index + "vSHADOWSAMPLE"); - shader.assignVariableName(VariableType.CONSTANT,4,index + "cConstants",1); - shader.assignVariableName(VariableType.CONSTANT,5,index + "cShadowColor",1); - if(usePCF) - { - for(i = 0; i < numPass; i++) - { - shader.assignVariableName(VariableType.CONSTANT,i + 6,"cDPCF" + i.toString(),1); - } - } - shader.assignVariableName(VariableType.SAMPLER,0,index + "sSHADOWMAP"); - return shader; - } - - public function get worldSize() : Number - { - return this.name_FQ; - } - - public function set worldSize(value:Number) : void - { - this.name_FQ = value; - var newDebug:Mesh = new Box(this.name_FQ,this.name_FQ,1,1,1,1,false,this.name_Vg); - newDebug.geometry.upload(this.context); - if(this.debugObject.alternativa3d::_parent != null) - { - this.debugObject.alternativa3d::_parent.addChild(newDebug); - this.debugObject.alternativa3d::_parent.removeChild(this.debugObject); - } - this.debugObject = newDebug; - } - - public function setLight(value:DirectionalLight) : void - { - this.light = value; - if(this.name_1a) - { - this.light.addChild(this.debugObject); - } - } - - override public function get debug() : Boolean - { - return this.name_1a; - } - - override public function set debug(value:Boolean) : void - { - this.name_1a = value; - if(this.name_1a) - { - if(this.light != null) - { - this.light.addChild(this.debugObject); - } - } - else if(this.debugObject.alternativa3d::_parent != null) - { - this.debugObject.alternativa3d::_parent.removeChild(this.debugObject); - } - } - - override alternativa3d function cullReciever(boundBox:BoundBox, object:Object3D) : Boolean - { - alternativa3d::copyMatrixFromTransform(matrix,object.alternativa3d::localToGlobalTransform); - matrix.append(this.name_UK); - return alternativa3d::cullObjectImplementation(boundBox,matrix); - } - - override public function update() : void - { - var root:Object3D = null; - active = true; - this.name_qg.alternativa3d::localToCameraTransform.compose(this.name_qg.alternativa3d::_x,this.name_qg.alternativa3d::_y,this.name_qg.alternativa3d::_z,this.name_qg.alternativa3d::_rotationX,this.name_qg.alternativa3d::_rotationY,this.name_qg.alternativa3d::_rotationZ,this.name_qg.alternativa3d::_scaleX,this.name_qg.alternativa3d::_scaleY,this.name_qg.alternativa3d::_scaleZ); - for(root = this.name_qg; root.alternativa3d::_parent != null; ) - { - root = root.alternativa3d::_parent; - root.alternativa3d::localToGlobalTransform.compose(root.alternativa3d::_x,root.alternativa3d::_y,root.alternativa3d::_z,root.alternativa3d::_rotationX,root.alternativa3d::_rotationY,root.alternativa3d::_rotationZ,root.alternativa3d::_scaleX,root.alternativa3d::_scaleY,root.alternativa3d::_scaleZ); - this.name_qg.alternativa3d::localToCameraTransform.append(root.alternativa3d::localToGlobalTransform); - } - this.light.alternativa3d::localToGlobalTransform.compose(this.light.alternativa3d::_x,this.light.alternativa3d::_y,this.light.alternativa3d::_z,this.light.alternativa3d::_rotationX,this.light.alternativa3d::_rotationY,this.light.alternativa3d::_rotationZ,this.light.alternativa3d::_scaleX,this.light.alternativa3d::_scaleY,this.light.alternativa3d::_scaleZ); - for(root = this.light; root.alternativa3d::_parent != null; ) - { - root = root.alternativa3d::_parent; - root.alternativa3d::localToGlobalTransform.compose(root.alternativa3d::_x,root.alternativa3d::_y,root.alternativa3d::_z,root.alternativa3d::_rotationX,root.alternativa3d::_rotationY,root.alternativa3d::_rotationZ,root.alternativa3d::_scaleX,root.alternativa3d::_scaleY,root.alternativa3d::_scaleZ); - this.light.alternativa3d::localToGlobalTransform.append(root.alternativa3d::localToGlobalTransform); - } - this.light.alternativa3d::globalToLocalTransform.copy(this.light.alternativa3d::localToGlobalTransform); - this.light.alternativa3d::globalToLocalTransform.invert(); - this.name_qg.alternativa3d::localToCameraTransform.append(this.light.alternativa3d::globalToLocalTransform); - var t:Transform3D = this.name_qg.alternativa3d::localToCameraTransform; - this.center.x = t.a * this.offset.x + t.b * this.offset.y + t.c * this.offset.z + t.d; - this.center.y = t.e * this.offset.x + t.f * this.offset.y + t.g * this.offset.z + t.h; - this.center.z = t.i * this.offset.x + t.j * this.offset.y + t.k * this.offset.z + t.l; - this.calculateShadowMapProjection(this.name_bD,this.uvMatrix,this.center,this.name_FQ,this.name_FQ,this.name_FQ); - alternativa3d::copyMatrixFromTransform(this.name_UK,this.light.alternativa3d::globalToLocalTransform); - this.name_UK.append(this.uvMatrix); - this.debugObject.x = this.center.x; - this.debugObject.y = this.center.y; - this.debugObject.z = this.center.z - this.name_FQ / 2; - this.name_Vg.diffuseMap = null; - this.context.setRenderToTexture(this.shadowMap,true,0,0); - this.context.clear(1,1,1,1); - cleanContext(this.context); - alternativa3d::drawObjectToShadowMap(this.context,this.name_qg,this.light,this.name_bD); - this.context.setRenderToBackBuffer(); - cleanContext(this.context); - this.name_Vg.diffuseMap = this.name_Ez; - } - - private function calculateShadowMapProjection(matrix:Matrix3D, uvMatrix:Matrix3D, offset:Vector3D, width:Number, height:Number, length:Number) : void - { - var halfW:Number = width / 2; - var halfH:Number = height / 2; - var halfL:Number = length / 2; - var frustumMinX:Number = offset.x - halfW; - var frustumMaxX:Number = offset.x + halfW; - var frustumMinY:Number = offset.y - halfH; - var frustumMaxY:Number = offset.y + halfH; - var frustumMinZ:Number = offset.z - halfL; - var frustumMaxZ:Number = offset.z + halfL; - this.rawData[0] = 2 / (frustumMaxX - frustumMinX); - this.rawData[5] = 2 / (frustumMaxY - frustumMinY); - this.rawData[10] = 1 / (frustumMaxZ - frustumMinZ); - this.rawData[12] = -0.5 * (frustumMaxX + frustumMinX) * this.rawData[0]; - this.rawData[13] = -0.5 * (frustumMaxY + frustumMinY) * this.rawData[5]; - this.rawData[14] = -frustumMinZ / (frustumMaxZ - frustumMinZ); - this.rawData[15] = 1; - matrix.rawData = this.rawData; - this.rawData[0] = 1 / (frustumMaxX - frustumMinX); - this.rawData[5] = -1 / (frustumMaxY - frustumMinY); - this.rawData[12] = 0.5 - 0.5 * (frustumMaxX + frustumMinX) * this.rawData[0]; - this.rawData[13] = 0.5 - 0.5 * (frustumMaxY + frustumMinY) * this.rawData[5]; - uvMatrix.rawData = this.rawData; - } - - override public function getVShader(index:int = 0) : Procedure - { - return initVShader(index); - } - - override public function getFShader(index:int = 0) : Procedure - { - return initFShader(false,this.name_M > 0,index); - } - - override public function getFIntensityShader() : Procedure - { - return initFShader(false,this.name_M > 0,0,true); - } - - override public function applyShader(drawUnit:DrawUnit, program:ShaderProgram, object:Object3D, camera:Camera3D, index:int = 0) : void - { - localToGlobal.combine(camera.alternativa3d::localToGlobalTransform,object.alternativa3d::localToCameraTransform); - alternativa3d::copyMatrixFromTransform(objectToShadowMap,localToGlobal); - objectToShadowMap.append(this.name_UK); - objectToShadowMap.copyRawDataTo(vector,0,true); - drawUnit.alternativa3d::setVertexConstantsFromVector(program.vertexShader.getVariableIndex(index + "cTOSHADOW"),vector,4); - drawUnit.alternativa3d::setFragmentConstantsFromVector(program.fragmentShader.getVariableIndex(index + "cConstants"),constants,1); - if(program.fragmentShader.containsVariable(index + "cShadowColor")) - { - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex(index + "cShadowColor"),camera.alternativa3d::ambient[0] / 2,camera.alternativa3d::ambient[1] / 2,camera.alternativa3d::ambient[2] / 2,1); - } - if(this.name_M > 0) - { - drawUnit.alternativa3d::setFragmentConstantsFromVector(program.fragmentShader.getVariableIndex("cDPCF0"),this.pcfOffsets,this.pcfOffsets.length / 4); - } - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex(index + "sSHADOWMAP"),this.shadowMap); - } - } -} - diff --git a/src/alternativa/engine3d/shadows/ShadowRenderer.as b/src/alternativa/engine3d/shadows/ShadowRenderer.as deleted file mode 100644 index 7e6391b..0000000 --- a/src/alternativa/engine3d/shadows/ShadowRenderer.as +++ /dev/null @@ -1,281 +0,0 @@ -package alternativa.engine3d.shadows -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.BoundBox; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.materials.ShaderProgram; - import alternativa.engine3d.materials.compiler.Procedure; - import flash.display3D.Context3D; - import flash.display3D.Context3DBlendFactor; - import flash.display3D.Context3DCompareMode; - import flash.geom.Matrix3D; - - use namespace alternativa3d; - - public class ShadowRenderer - { - private static var counter:int = 0; - - private static const boundVertices:Vector. = new Vector.(24); - - alternativa3d var name_if:String; - - public var active:Boolean = false; - - public function ShadowRenderer() - { - super(); - ++counter; - this.name_if = "M" + counter.toString(); - } - - alternativa3d function get needMultiplyBlend() : Boolean - { - return false; - } - - public function update() : void - { - } - - public function getVShader(index:int = 0) : Procedure - { - return null; - } - - public function getFShader(index:int = 0) : Procedure - { - return null; - } - - public function getFIntensityShader() : Procedure - { - throw new Error("Not implemented"); - } - - public function applyShader(destination:DrawUnit, program:ShaderProgram, object:Object3D, camera:Camera3D, index:int = 0) : void - { - } - - public function get debug() : Boolean - { - return false; - } - - public function set debug(value:Boolean) : void - { - } - - alternativa3d function cullReciever(boundBox:BoundBox, object:Object3D) : Boolean - { - return false; - } - - protected function cleanContext(context:Context3D) : void - { - context.setTextureAt(0,null); - context.setTextureAt(1,null); - context.setTextureAt(2,null); - context.setTextureAt(3,null); - context.setTextureAt(4,null); - context.setTextureAt(5,null); - context.setTextureAt(6,null); - context.setTextureAt(7,null); - context.setVertexBufferAt(1,null); - context.setVertexBufferAt(2,null); - context.setVertexBufferAt(3,null); - context.setVertexBufferAt(4,null); - context.setVertexBufferAt(5,null); - context.setVertexBufferAt(6,null); - context.setVertexBufferAt(7,null); - context.setDepthTest(true,Context3DCompareMode.LESS); - context.setBlendFactors(Context3DBlendFactor.ONE,Context3DBlendFactor.ZERO); - } - - alternativa3d function cullObjectImplementation(bounds:BoundBox, matrix:Matrix3D) : Boolean - { - var i:int = 0; - var infront:Boolean = false; - var behind:Boolean = false; - boundVertices[0] = bounds.minX; - boundVertices[1] = bounds.minY; - boundVertices[2] = bounds.minZ; - boundVertices[3] = bounds.maxX; - boundVertices[4] = bounds.minY; - boundVertices[5] = bounds.minZ; - boundVertices[6] = bounds.minX; - boundVertices[7] = bounds.maxY; - boundVertices[8] = bounds.minZ; - boundVertices[9] = bounds.maxX; - boundVertices[10] = bounds.maxY; - boundVertices[11] = bounds.minZ; - boundVertices[12] = bounds.minX; - boundVertices[13] = bounds.minY; - boundVertices[14] = bounds.maxZ; - boundVertices[15] = bounds.maxX; - boundVertices[16] = bounds.minY; - boundVertices[17] = bounds.maxZ; - boundVertices[18] = bounds.minX; - boundVertices[19] = bounds.maxY; - boundVertices[20] = bounds.maxZ; - boundVertices[21] = bounds.maxX; - boundVertices[22] = bounds.maxY; - boundVertices[23] = bounds.maxZ; - matrix.transformVectors(boundVertices,boundVertices); - i = 2; - infront = false; - behind = false; - while(i <= 23) - { - if(boundVertices[i] > 0) - { - infront = true; - if(behind) - { - break; - } - } - else - { - behind = true; - if(infront) - { - break; - } - } - i += 3; - } - if(behind) - { - if(!infront) - { - return false; - } - } - i = 0; - infront = false; - behind = false; - while(i <= 21) - { - if(boundVertices[i] > 0) - { - infront = true; - if(behind) - { - break; - } - } - else - { - behind = true; - if(infront) - { - break; - } - } - i += 3; - } - if(behind) - { - if(!infront) - { - return false; - } - } - i = 0; - infront = false; - behind = false; - while(i <= 21) - { - if(boundVertices[i] < 1) - { - infront = true; - if(behind) - { - break; - } - } - else - { - behind = true; - if(infront) - { - break; - } - } - i += 3; - } - if(behind) - { - if(!infront) - { - return false; - } - } - i = 1; - infront = false; - behind = false; - while(i <= 22) - { - if(boundVertices[i] > 0) - { - infront = true; - if(behind) - { - break; - } - } - else - { - behind = true; - if(infront) - { - break; - } - } - i += 3; - } - if(behind) - { - if(!infront) - { - return false; - } - } - i = 1; - infront = false; - behind = false; - while(i <= 22) - { - if(boundVertices[i] < 1) - { - infront = true; - if(behind) - { - break; - } - } - else - { - behind = true; - if(infront) - { - break; - } - } - i += 3; - } - if(behind) - { - if(!infront) - { - return false; - } - } - return true; - } - } -} - diff --git a/src/alternativa/engine3d/shadows/ShadowsSystem.as b/src/alternativa/engine3d/shadows/ShadowsSystem.as deleted file mode 100644 index 4031565..0000000 --- a/src/alternativa/engine3d/shadows/ShadowsSystem.as +++ /dev/null @@ -1,126 +0,0 @@ -package alternativa.engine3d.shadows -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Object3D; - import flash.utils.Dictionary; - - use namespace alternativa3d; - - public class ShadowsSystem - { - private static const MAX_SHADOWMAPS:int = 3; - - public var renderers:Vector. = new Vector.(); - - private var name_jy:Dictionary = new Dictionary(); - - private var name_gR:int; - - private var name_i:int; - - private var name_O0:Vector. = new Vector.(); - - private var name_aJ:int; - - public function ShadowsSystem() - { - super(); - } - - public function update(root:Object3D) : void - { - var renderer:ShadowRenderer = null; - if(this.renderers.length == 0) - { - return; - } - this.name_i = 0; - var num:int = int(this.renderers.length); - for(var i:int = 0; i < num; ) - { - renderer = this.renderers[i]; - renderer.update(); - if(renderer.active) - { - this.name_O0[this.name_i] = renderer; - ++this.name_i; - } - i++; - } - if(root.alternativa3d::transformChanged) - { - root.alternativa3d::composeTransforms(); - } - root.alternativa3d::localToGlobalTransform.copy(root.alternativa3d::transform); - this.name_gR = 0; - this.name_aJ = 0; - this.recursive(root); - } - - private function recursive(object:Object3D) : void - { - var value:Vector. = null; - var numRenderers:int = 0; - var i:int = 0; - var renderer:ShadowRenderer = null; - for(var child:Object3D = object.alternativa3d::childrenList; child != null; child = child.alternativa3d::next) - { - value = null; - numRenderers = 0; - if(child.visible) - { - if(child.alternativa3d::transformChanged) - { - child.alternativa3d::composeTransforms(); - } - child.alternativa3d::localToGlobalTransform.combine(object.alternativa3d::localToGlobalTransform,child.alternativa3d::transform); - for(i = 0; i < this.name_i; ) - { - renderer = this.name_O0[i]; - if(child.useShadow) - { - if(child.boundBox == null || renderer.alternativa3d::cullReciever(child.boundBox,child)) - { - ++this.name_gR; - if(value == null) - { - value = this.name_jy[child]; - if(value == null) - { - value = new Vector.(); - this.name_jy[child] = value; - } - else - { - value.length = 0; - } - } - value[numRenderers] = renderer; - numRenderers++; - } - } - i++; - } - this.recursive(child); - } - this.setRenderers(child,value,numRenderers); - } - } - - private function setRenderers(object:Object3D, renderers:Vector., numShadowRenderers:int) : void - { - if(numShadowRenderers > this.name_aJ) - { - this.name_aJ = numShadowRenderers; - } - if(numShadowRenderers > MAX_SHADOWMAPS) - { - numShadowRenderers = MAX_SHADOWMAPS; - renderers.length = MAX_SHADOWMAPS; - } - object.alternativa3d::shadowRenderers = renderers; - object.alternativa3d::numShadowRenderers = numShadowRenderers; - } - } -} - diff --git a/src/alternativa/engine3d/shadows/StaticShadowRenderer.as b/src/alternativa/engine3d/shadows/StaticShadowRenderer.as deleted file mode 100644 index 9c26dbc..0000000 --- a/src/alternativa/engine3d/shadows/StaticShadowRenderer.as +++ /dev/null @@ -1,499 +0,0 @@ -package alternativa.engine3d.shadows -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.BoundBox; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.Transform3D; - import alternativa.engine3d.lights.DirectionalLight; - import alternativa.engine3d.materials.ShaderProgram; - import alternativa.engine3d.materials.TextureMaterial; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.materials.compiler.VariableType; - import alternativa.engine3d.objects.Mesh; - import alternativa.engine3d.primitives.Box; - import alternativa.engine3d.resources.ExternalTextureResource; - import alternativa.engine3d.resources.TextureResource; - import flash.display3D.Context3D; - import flash.display3D.Context3DTextureFormat; - import flash.display3D.textures.Texture; - import flash.geom.Matrix3D; - import flash.geom.Vector3D; - import flash.utils.Dictionary; - - use namespace alternativa3d; - - public class StaticShadowRenderer extends ShadowRenderer - { - private static var pcfOffsets:Vector.; - - private static const constants:Vector. = Vector.([255,255,1000,1]); - - private static const points:Vector. = Vector.([new Vector3D(),new Vector3D(),new Vector3D(),new Vector3D(),new Vector3D(),new Vector3D(),new Vector3D(),new Vector3D(),new Vector3D(),new Vector3D(),new Vector3D(),new Vector3D(),new Vector3D(),new Vector3D(),new Vector3D(),new Vector3D()]); - - private static const objectToShadowMap:Transform3D = new Transform3D(); - - private static const objectToUVMap:Matrix3D = new Matrix3D(); - - public var context:Context3D; - - private const alpha:Number = 0.7; - - private var bounds:BoundBox = new BoundBox(); - - private var partSize:Number; - - private var name_f7:Vector.> = new Vector.>(); - - private var name_md:Vector.> = new Vector.>(); - - private var light:DirectionalLight; - - private var name_65:Transform3D = new Transform3D(); - - private var name_1a:Boolean = false; - - private var name_4u:Object3D; - - private var name_Mf:Dictionary = new Dictionary(); - - private var name_M:Number = 0; - - private var name_bD:Matrix3D = new Matrix3D(); - - private var rawData:Vector. = new Vector.(16); - - public function StaticShadowRenderer(context:Context3D, partSize:int, pcfSize:Number = 0) - { - super(); - this.context = context; - this.partSize = partSize; - this.name_M = pcfSize; - constants[3] = 1 - this.alpha; - } - - alternativa3d static function calculateBoundBox(boundBox:BoundBox, object:Object3D, hierarchy:Boolean = true) : void - { - var point:Vector3D = null; - var bb:BoundBox = null; - var transform:Transform3D = null; - var i:int = 0; - var x:Number = NaN; - var y:Number = NaN; - var z:Number = NaN; - var child:Object3D = null; - if(object.boundBox != null) - { - bb = object.boundBox; - point = points[0]; - point.x = bb.minX; - point.y = bb.minY; - point.z = bb.minZ; - point = points[1]; - point.x = bb.minX; - point.y = bb.minY; - point.z = bb.maxZ; - point = points[2]; - point.x = bb.minX; - point.y = bb.maxY; - point.z = bb.minZ; - point = points[3]; - point.x = bb.minX; - point.y = bb.maxY; - point.z = bb.maxZ; - point = points[4]; - point.x = bb.maxX; - point.y = bb.minY; - point.z = bb.minZ; - point = points[5]; - point.x = bb.maxX; - point.y = bb.minY; - point.z = bb.maxZ; - point = points[6]; - point.x = bb.maxX; - point.y = bb.maxY; - point.z = bb.minZ; - point = points[7]; - point.x = bb.maxX; - point.y = bb.maxY; - point.z = bb.maxZ; - transform = object.alternativa3d::localToCameraTransform; - for(i = 0; i < 8; ) - { - point = points[i]; - x = transform.a * point.x + transform.b * point.y + transform.c * point.z + transform.d; - y = transform.e * point.x + transform.f * point.y + transform.g * point.z + transform.h; - z = transform.i * point.x + transform.j * point.y + transform.k * point.z + transform.l; - if(x < boundBox.minX) - { - boundBox.minX = x; - } - if(x > boundBox.maxX) - { - boundBox.maxX = x; - } - if(y < boundBox.minY) - { - boundBox.minY = y; - } - if(y > boundBox.maxY) - { - boundBox.maxY = y; - } - if(z < boundBox.minZ) - { - boundBox.minZ = z; - } - if(z > boundBox.maxZ) - { - boundBox.maxZ = z; - } - i++; - } - } - if(hierarchy) - { - for(child = object.alternativa3d::childrenList; child != null; ) - { - if(child.visible) - { - if(child.alternativa3d::transformChanged) - { - child.alternativa3d::composeTransforms(); - } - child.alternativa3d::localToCameraTransform.combine(object.alternativa3d::localToCameraTransform,child.alternativa3d::transform); - alternativa3d::calculateBoundBox(boundBox,child); - } - child = child.alternativa3d::next; - } - } - } - - private static function initVShader(index:int) : Procedure - { - var shader:Procedure = Procedure.compileFromArray(["m44 v0, a0, c4"]); - shader.assignVariableName(VariableType.ATTRIBUTE,0,"aPosition"); - shader.assignVariableName(VariableType.CONSTANT,0,"cPROJ",4); - shader.assignVariableName(VariableType.CONSTANT,4,"cTOSHADOW",4); - shader.assignVariableName(VariableType.VARYING,0,"vSHADOWSAMPLE"); - return shader; - } - - private static function initFShader(mult:Boolean, usePCF:Boolean, index:int, grayScale:Boolean = false) : Procedure - { - var i:int = 0; - var line:int = 0; - var shaderArr:Array = []; - var numPass:uint = usePCF ? 4 : 1; - for(i = 0; i < numPass; i++) - { - var _loc10_:* = line++; - shaderArr[_loc10_] = "mov t0.w, v0.z"; - var _loc11_:* = line++; - shaderArr[_loc11_] = "mul t0.w, t0.w, c4.y"; - if(usePCF) - { - var _loc12_:* = line++; - shaderArr[_loc12_] = "add t1, v0, c" + (i + 5).toString() + ""; - var _loc13_:* = line++; - shaderArr[_loc13_] = "tex t1, t1, s0 <2d,clamp,near,nomip>"; - } - else - { - _loc12_ = line++; - shaderArr[_loc12_] = "tex t1, v0, s0 <2d,clamp,near,nomip>"; - } - _loc12_ = line++; - shaderArr[_loc12_] = "mul t1.w, t1.x, c4.x"; - _loc13_ = line++; - shaderArr[_loc13_] = "add t1.w, t1.w, t1.y"; - var _loc14_:* = line++; - shaderArr[_loc14_] = "sub t2.z, t1.w, t0.w"; - var _loc15_:* = line++; - shaderArr[_loc15_] = "mul t2.z, t2.z, c4.z"; - var _loc16_:* = line++; - shaderArr[_loc16_] = "sat t2.z, t2.z"; - var _loc17_:* = line++; - shaderArr[_loc17_] = "sat t2.z, t2.z"; - if(usePCF) - { - if(i == 0) - { - var _loc18_:* = line++; - shaderArr[_loc18_] = "mov t2.x, t2.z"; - } - else - { - _loc18_ = line++; - shaderArr[_loc18_] = "add t2.x, t2.x, t2.z"; - } - } - } - if(usePCF) - { - _loc10_ = line++; - shaderArr[_loc10_] = "mul t2.z, t2.x, c5.w"; - } - if(grayScale) - { - shaderArr.push("mov o0.w, t2.z"); - } - else if(mult) - { - shaderArr.push("mul t0.xyz, i0.xyz, t2.z"); - shaderArr.push("mov t0.w, i0.w"); - shaderArr.push("mov o0, t0"); - } - else - { - shaderArr.push("mov t0, t2.z"); - shaderArr.push("mov o0, t0"); - } - var shader:Procedure = Procedure.compileFromArray(shaderArr,"StaticShadowMap"); - shader.assignVariableName(VariableType.VARYING,0,"vSHADOWSAMPLE"); - shader.assignVariableName(VariableType.CONSTANT,4,"cConstants",1); - if(usePCF) - { - for(i = 0; i < numPass; i++) - { - shader.assignVariableName(VariableType.CONSTANT,i + 5,"cPCF" + i.toString(),1); - } - } - shader.assignVariableName(VariableType.SAMPLER,0,"sSHADOWMAP"); - return shader; - } - - public function addReciever(object:Object3D) : void - { - this.name_Mf[object] = true; - } - - public function removeReciever(object:Object3D) : void - { - delete this.name_Mf[object]; - } - - public function dispose() : void - { - var textures:Vector. = null; - var texture:Texture = null; - for each(textures in this.name_f7) - { - for each(texture in textures) - { - texture.dispose(); - } - } - this.name_f7.length = 0; - this.name_md.length = 0; - } - - override alternativa3d function cullReciever(boundBox:BoundBox, object:Object3D) : Boolean - { - return this.name_Mf[object]; - } - - public function calculateShadows(object:Object3D, light:DirectionalLight, widthPartsCount:int = 1, heightPartsCount:int = 1, overlap:Number = 0) : void - { - var root:Object3D = null; - var maps:Vector. = null; - var matrices:Vector. = null; - var yIndex:int = 0; - var leftX:Number = NaN; - var leftY:Number = NaN; - var width:Number = NaN; - var height:Number = NaN; - var uvMatrix:Matrix3D = null; - var shadowMap:Texture = null; - var texture:TextureResource = null; - var material:TextureMaterial = null; - var debugObject:Mesh = null; - var offset:Number = NaN; - this.light = light; - object.alternativa3d::localToCameraTransform.compose(object.alternativa3d::_x,object.alternativa3d::_y,object.alternativa3d::_z,object.alternativa3d::_rotationX,object.alternativa3d::_rotationY,object.alternativa3d::_rotationZ,object.alternativa3d::_scaleX,object.alternativa3d::_scaleY,object.alternativa3d::_scaleZ); - for(root = object; root.alternativa3d::_parent != null; ) - { - root = root.alternativa3d::_parent; - root.alternativa3d::localToGlobalTransform.compose(root.alternativa3d::_x,root.alternativa3d::_y,root.alternativa3d::_z,root.alternativa3d::_rotationX,root.alternativa3d::_rotationY,root.alternativa3d::_rotationZ,root.alternativa3d::_scaleX,root.alternativa3d::_scaleY,root.alternativa3d::_scaleZ); - object.alternativa3d::localToCameraTransform.append(root.alternativa3d::localToGlobalTransform); - } - light.alternativa3d::localToGlobalTransform.compose(light.alternativa3d::_x,light.alternativa3d::_y,light.alternativa3d::_z,light.alternativa3d::_rotationX,light.alternativa3d::_rotationY,light.alternativa3d::_rotationZ,light.alternativa3d::_scaleX,light.alternativa3d::_scaleY,light.alternativa3d::_scaleZ); - for(root = light; root.alternativa3d::_parent != null; ) - { - root = root.alternativa3d::_parent; - root.alternativa3d::localToGlobalTransform.compose(root.alternativa3d::_x,root.alternativa3d::_y,root.alternativa3d::_z,root.alternativa3d::_rotationX,root.alternativa3d::_rotationY,root.alternativa3d::_rotationZ,root.alternativa3d::_scaleX,root.alternativa3d::_scaleY,root.alternativa3d::_scaleZ); - light.alternativa3d::localToGlobalTransform.append(root.alternativa3d::localToGlobalTransform); - } - light.alternativa3d::globalToLocalTransform.copy(light.alternativa3d::localToGlobalTransform); - light.alternativa3d::globalToLocalTransform.invert(); - this.name_65.copy(light.alternativa3d::globalToLocalTransform); - object.alternativa3d::localToCameraTransform.append(light.alternativa3d::globalToLocalTransform); - this.bounds.reset(); - alternativa3d::calculateBoundBox(this.bounds,object); - var frustumMinX:Number = this.bounds.minX; - var frustumMaxX:Number = this.bounds.maxX; - var frustumMinY:Number = this.bounds.minY; - var frustumMaxY:Number = this.bounds.maxY; - var frustumMinZ:Number = this.bounds.minZ; - var frustumMaxZ:Number = this.bounds.maxZ; - var halfOverlap:Number = overlap * 0.5; - var partWorldWidth:Number = (frustumMaxX - frustumMinX) / widthPartsCount; - var partWorldHeight:Number = (frustumMaxY - frustumMinY) / heightPartsCount; - this.name_4u = new Object3D(); - if(this.name_1a) - { - light.addChild(this.name_4u); - } - for(var xIndex:int = 0; xIndex < widthPartsCount; ) - { - maps = new Vector.(); - matrices = new Vector.(); - for(yIndex = 0; yIndex < heightPartsCount; yIndex++) - { - leftX = frustumMinX + xIndex * partWorldWidth; - leftY = frustumMinY + yIndex * partWorldHeight; - if(xIndex == 0) - { - width = partWorldWidth + halfOverlap; - } - else if(xIndex == widthPartsCount - 1) - { - leftX -= halfOverlap; - width = partWorldWidth + halfOverlap; - } - else - { - leftX -= halfOverlap; - width = partWorldWidth + overlap; - } - if(yIndex == 0) - { - height = partWorldHeight + halfOverlap; - } - else if(yIndex == heightPartsCount - 1) - { - leftY -= halfOverlap; - height = partWorldHeight + halfOverlap; - } - else - { - leftY -= halfOverlap; - height = partWorldHeight + overlap; - } - uvMatrix = new Matrix3D(); - this.calculateShadowMapProjection(this.name_bD,uvMatrix,leftX,leftY,frustumMinZ,leftX + width,leftY + height,frustumMaxZ); - shadowMap = this.context.createTexture(this.partSize,this.partSize,Context3DTextureFormat.BGRA,true); - this.context.setRenderToTexture(shadowMap,true,0,0); - this.context.clear(1,1,1,0.5); - cleanContext(this.context); - DirectionalShadowRenderer.alternativa3d::drawObjectToShadowMap(this.context,object,light,this.name_bD); - cleanContext(this.context); - maps.push(shadowMap); - matrices.push(uvMatrix); - texture = new ExternalTextureResource(null); - texture.alternativa3d::_texture = shadowMap; - material = new TextureMaterial(texture); - material.name_L4 = true; - debugObject = new Box(width,height,1,1,1,1,false,material); - debugObject.geometry.upload(this.context); - debugObject.x = leftX + width / 2; - debugObject.y = leftY + height / 2; - debugObject.z = frustumMinZ; - this.name_4u.addChild(debugObject); - } - this.name_f7.push(maps); - this.name_md.push(matrices); - xIndex++; - } - this.context.setRenderToBackBuffer(); - if(this.name_M > 0) - { - offset = this.name_M / partWorldWidth; - pcfOffsets = Vector.([-offset,-offset,0,1 / 4,-offset,offset,0,1,offset,-offset,0,1,offset,offset,0,1]); - } - } - - private function calculateShadowMapProjection(matrix:Matrix3D, uvMatrix:Matrix3D, frustumMinX:Number, frustumMinY:Number, frustumMinZ:Number, frustumMaxX:Number, frustumMaxY:Number, frustumMaxZ:Number) : void - { - this.rawData[0] = 2 / (frustumMaxX - frustumMinX); - this.rawData[5] = 2 / (frustumMaxY - frustumMinY); - this.rawData[10] = 1 / (frustumMaxZ - frustumMinZ); - this.rawData[12] = -0.5 * (frustumMaxX + frustumMinX) * this.rawData[0]; - this.rawData[13] = -0.5 * (frustumMaxY + frustumMinY) * this.rawData[5]; - this.rawData[14] = -frustumMinZ / (frustumMaxZ - frustumMinZ); - this.rawData[15] = 1; - matrix.rawData = this.rawData; - this.rawData[0] = 1 / (frustumMaxX - frustumMinX); - this.rawData[5] = -1 / (frustumMaxY - frustumMinY); - this.rawData[12] = 0.5 - 0.5 * (frustumMaxX + frustumMinX) * this.rawData[0]; - this.rawData[13] = 0.5 - 0.5 * (frustumMaxY + frustumMinY) * this.rawData[5]; - uvMatrix.rawData = this.rawData; - } - - override public function get debug() : Boolean - { - return this.name_1a; - } - - override public function set debug(value:Boolean) : void - { - this.name_1a = value; - if(this.name_4u != null) - { - if(value) - { - if(this.light != null) - { - this.light.addChild(this.name_4u); - } - } - else if(this.name_4u.alternativa3d::_parent != null) - { - this.name_4u.alternativa3d::removeFromParent(); - } - } - } - - override public function getVShader(index:int = 0) : Procedure - { - return initVShader(index); - } - - override public function getFShader(index:int = 0) : Procedure - { - return initFShader(false,this.name_M > 0,index); - } - - override public function getFIntensityShader() : Procedure - { - return initFShader(false,this.name_M > 0,0,true); - } - - override public function applyShader(drawUnit:DrawUnit, program:ShaderProgram, object:Object3D, camera:Camera3D, index:int = 0) : void - { - objectToShadowMap.combine(camera.alternativa3d::localToGlobalTransform,object.alternativa3d::localToCameraTransform); - objectToShadowMap.append(this.name_65); - var coords:Vector3D = new Vector3D(objectToShadowMap.d,objectToShadowMap.h,objectToShadowMap.l); - var xIndex:int = (coords.x - this.bounds.minX) / (this.bounds.maxX - this.bounds.minX) * this.name_f7.length; - xIndex = xIndex < 0 ? 0 : (xIndex >= this.name_f7.length ? int(this.name_f7.length - 1) : xIndex); - var maps:Vector. = this.name_f7[xIndex]; - var matrices:Vector. = this.name_md[xIndex]; - var yIndex:int = (coords.y - this.bounds.minY) / (this.bounds.maxY - this.bounds.minY) * maps.length; - yIndex = yIndex < 0 ? 0 : (yIndex >= maps.length ? int(maps.length - 1) : yIndex); - var shadowMap:Texture = maps[yIndex]; - var uvMatrix:Matrix3D = matrices[yIndex]; - DirectionalShadowRenderer.alternativa3d::copyMatrixFromTransform(objectToUVMap,objectToShadowMap); - objectToUVMap.append(uvMatrix); - objectToUVMap.transpose(); - drawUnit.alternativa3d::setVertexConstantsFromVector(program.vertexShader.getVariableIndex("cTOSHADOW"),objectToUVMap.rawData,4); - drawUnit.alternativa3d::setFragmentConstantsFromVector(program.fragmentShader.getVariableIndex("cConstants"),constants,1); - if(this.name_M > 0) - { - drawUnit.alternativa3d::setFragmentConstantsFromVector(program.fragmentShader.getVariableIndex("cPCF0"),pcfOffsets,pcfOffsets.length >> 2); - } - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sSHADOWMAP"),shadowMap); - } - } -} - diff --git a/src/alternativa/tanks/TankTestTask.as b/src/alternativa/tanks/TankTestTask.as index 131028b..b81a0f6 100644 --- a/src/alternativa/tanks/TankTestTask.as +++ b/src/alternativa/tanks/TankTestTask.as @@ -107,6 +107,7 @@ package alternativa.tanks import flash.geom.ColorTransform; import flash.geom.Vector3D; import flash.ui.Keyboard; + import alternativa.engine3d.materials.StandardMaterial; use namespace alternativa3d; @@ -390,14 +391,14 @@ package alternativa.tanks while(_loc5_ < _loc1_.length) { _loc8_ = new TextureMaterial(_loc1_[_loc5_]); - _loc8_.name_L4 = true; + _loc8_.transparentPass = true; _loc4_[_loc5_] = _loc8_; _loc5_++; } var _loc6_:AnimatedSpriteEffect = AnimatedSpriteEffect(this.gameKernel.getObjectPoolManager().getObject(AnimatedSpriteEffect)); var _loc7_:Vector3 = new Vector3(Math.random() * 3000,Math.random() * 3000,1000 + Math.random() * 3000); _loc6_.init(300,300,_loc4_,_loc7_,0,0,30,true); - _loc2_.each(_loc6_); + _loc2_.addEffect(_loc6_); } private function createThunderShotEffect() : void @@ -409,7 +410,7 @@ package alternativa.tanks _loc3_.useResource(_loc2_); var _loc4_:ThunderShotEffect = ThunderShotEffect(this.gameKernel.getObjectPoolManager().getObject(ThunderShotEffect)); _loc4_.init(new DummyTurret(),_loc1_,_loc2_); - _loc3_.each(_loc4_); + _loc3_.addEffect(_loc4_); } private function selectPrevTurret() : void @@ -484,7 +485,7 @@ package alternativa.tanks this.name_T2 = FloatingTextEffect(this.gameKernel.getObjectPoolManager().getObject(FloatingTextEffect)); _loc1_ = TurretGraphicsComponent(this.activeTank.getComponentStrict(TurretGraphicsComponent)); this.name_T2.init(5000,_loc1_.getObject3D(),this.onFloatingTextEffectDestroy); - this.gameKernel.getRenderSystem().each(this.name_T2); + this.gameKernel.getRenderSystem().addEffect(this.name_T2); } this.name_T2.addMessage("Message " + Math.random(),65280); } @@ -702,14 +703,14 @@ package alternativa.tanks } } - private function createTracksMaterial(param1:TankHull) : TracksMaterial2 + private function createTracksMaterial(param1:TankHull) : StandardMaterial { var _loc2_:ByteArrayMap = param1.textureData; var _loc3_:ATFTextureResource = this.name_fa.getCompressedTextureResource(_loc2_.getValue(TankHullParser.KEY_TRACKS_DIFFUSE)); var _loc4_:ATFTextureResource = this.name_fa.getCompressedTextureResource(_loc2_.getValue(TankHullParser.KEY_TRACKS_NORMAL)); - var _loc5_:TracksMaterial2 = new TracksMaterial2(); + var _loc5_:StandardMaterial = new StandardMaterial(); _loc5_.glossiness = 65; - _loc5_.name_kj = 0.6; + _loc5_.specularPower = 0.6; _loc5_.diffuseMap = _loc3_; _loc5_.normalMap = _loc4_; if(_loc2_.getValue(TankHullParser.KEY_TRACKS_OPACITY) != null) @@ -754,7 +755,7 @@ package alternativa.tanks while(_loc11_ < _loc7_.length) { _loc18_ = new TextureMaterial(_loc7_[_loc11_]); - _loc18_.name_L4 = true; + _loc18_.transparentPass = true; _loc10_[_loc11_] = _loc18_; _loc11_++; } @@ -796,7 +797,7 @@ package alternativa.tanks while(_loc11_ < _loc7_.length) { _loc18_ = new TextureMaterial(_loc7_[_loc11_]); - _loc18_.name_L4 = true; + _loc18_.transparentPass = true; _loc10_[_loc11_] = _loc18_; _loc11_++; } @@ -949,12 +950,12 @@ package alternativa.tanks var _loc10_:ATFTextureResource = this.name_fa.getCompressedTextureResource(_loc7_.getValue(TankPartParser.KEY_SURFACE_MAP)); var _loc11_:BitmapTextureResource = this.name_fa.getBitmapTextureResource(param2); var _loc12_:BitmapTextureResource = this.name_fa.getBitmapTextureResource(param3); - var _loc13_:TankMaterial2 = new TankMaterial2(_loc11_,_loc8_,_loc9_,_loc10_); - var _loc14_:TankMaterial2 = new TankMaterial2(_loc12_,_loc8_,_loc9_,_loc10_); - _loc13_.name_jM = param4; - _loc13_.name_Sf = param5; - _loc14_.name_jM = param4; - _loc14_.name_Sf = param5; + var _loc13_:StandardMaterial = new StandardMaterial(_loc8_, _loc9_); + var _loc14_:StandardMaterial = new StandardMaterial(_loc8_, _loc9_); + // _loc13_.name_jM = param4; + // _loc13_.name_Sf = param5; + // _loc14_.name_jM = param4; + // _loc14_.name_Sf = param5; _loc6_.useResource(param1.geometry); if(param1 is TankHull) { @@ -1043,7 +1044,7 @@ package alternativa.tanks _loc9_ = this.getFrameMaterials(_loc8_); _loc10_ = AnimatedPlaneEffect(this.gameKernel.getObjectPoolManager().getObject(AnimatedPlaneEffect)); _loc10_.init(conShockSize.value,_loc6_,_loc7_,_loc9_,30,conShockSizeGrow.value); - this.gameKernel.getRenderSystem().each(_loc10_); + this.gameKernel.getRenderSystem().addEffect(_loc10_); } } } @@ -1071,7 +1072,7 @@ package alternativa.tanks _loc8_ = 400; _loc9_ = 25; _loc4_.init(600,600,_loc3_,_loc6_,_loc7_,_loc8_,_loc9_,false); - this.gameKernel.getRenderSystem().each(_loc4_); + this.gameKernel.getRenderSystem().addEffect(_loc4_); } } @@ -1127,7 +1128,7 @@ package alternativa.tanks _loc20_ = MovingAnimatedSprite(this.gameKernel.getObjectPoolManager().getObject(MovingAnimatedSprite)); _loc21_ = Math.random() * Math.PI; _loc20_.init(_loc9_,_loc9_,_loc11_,_loc13_,_loc14_,_loc8_,_loc21_,_loc7_,false); - this.gameKernel.getRenderSystem().each(_loc20_); + this.gameKernel.getRenderSystem().addEffect(_loc20_); _loc15_ = _loc15_ + 2 / 3 * Math.PI; _loc17_++; } @@ -1209,7 +1210,7 @@ class FrameMaterialsFactory implements IDataFactory { this.renderSystem.useResource(_loc2_[_loc5_]); _loc6_ = new TextureMaterial(_loc2_[_loc5_]); - _loc6_.name_L4 = true; + _loc6_.transparentPass = true; _loc4_[_loc5_] = _loc6_; _loc5_++; } @@ -1280,7 +1281,7 @@ class WeaponHitEffects implements IAreaOfEffectSFX { var _loc4_:AnimatedSpriteEffect = AnimatedSpriteEffect(this.gameKernel.getObjectPoolManager().getObject(AnimatedSpriteEffect)); _loc4_.init(600,600,this.frames,param1,0,50,30,false); - this.gameKernel.getRenderSystem().each(_loc4_); + this.gameKernel.getRenderSystem().addEffect(_loc4_); } } diff --git a/src/alternativa/tanks/game/effects/Fire.as b/src/alternativa/tanks/game/effects/Fire.as index 7575ff8..204970d 100644 --- a/src/alternativa/tanks/game/effects/Fire.as +++ b/src/alternativa/tanks/game/effects/Fire.as @@ -82,10 +82,10 @@ package alternativa.tanks.game.effects newFire.scale = scale; newFire.position = position; newFire.direction = direction; - particleSystem.each(newFire); + particleSystem.addEffect(newFire); },(live - 5 * ft) * 1000); } - setLife(name_gV[name_kf - 1] + smokePrototype.lifeTime); + setLife(timeKeys[keysCount - 1] + smokePrototype.lifeTime); } private function keyFrame1(keyTime:Number, time:Number) : void diff --git a/src/alternativa/tanks/game/effects/SimpleWeaponShotSFXComponent.as b/src/alternativa/tanks/game/effects/SimpleWeaponShotSFXComponent.as index 8a5ae12..2d9f0da 100644 --- a/src/alternativa/tanks/game/effects/SimpleWeaponShotSFXComponent.as +++ b/src/alternativa/tanks/game/effects/SimpleWeaponShotSFXComponent.as @@ -43,7 +43,7 @@ package alternativa.tanks.game.effects { var simpleWeaponShotEffect:SimpleWeaponShotEffect = SimpleWeaponShotEffect(this.gameKernel.getObjectPoolManager().getObject(SimpleWeaponShotEffect)); simpleWeaponShotEffect.init(barrelIndex,this.turret,this.shotTextureResource,100); - this.gameKernel.getRenderSystem().each(simpleWeaponShotEffect); + this.gameKernel.getRenderSystem().addEffect(simpleWeaponShotEffect); } } } @@ -86,7 +86,7 @@ class SimpleWeaponShotEffect extends PooledObject implements IGraphicEffect super(objectPool); this.mesh = new Plane(40,250,0,250 / 2); this.material = new TextureMaterial(); - this.material.name_L4 = true; + this.material.transparentPass = true; this.mesh.setMaterialToAllSurfaces(this.material); } diff --git a/src/alternativa/tanks/game/entities/map/A3DMapBuilder.as b/src/alternativa/tanks/game/entities/map/A3DMapBuilder.as index 0aefb00..fdfba64 100644 --- a/src/alternativa/tanks/game/entities/map/A3DMapBuilder.as +++ b/src/alternativa/tanks/game/entities/map/A3DMapBuilder.as @@ -6,7 +6,7 @@ package alternativa.tanks.game.entities.map import alternativa.engine3d.loaders.ParserA3D; import alternativa.engine3d.loaders.ParserCollada; import alternativa.engine3d.loaders.ParserMaterial; - import alternativa.engine3d.materials.EnviromentMaterial; + import alternativa.engine3d.materials.EnvironmentMaterial; import alternativa.engine3d.objects.Decal; import alternativa.engine3d.objects.Mesh; import alternativa.engine3d.objects.Surface; @@ -16,7 +16,7 @@ package alternativa.tanks.game.entities.map import alternativa.engine3d.resources.ExternalTextureResource; import alternativa.engine3d.resources.TextureResource; import alternativa.physics.collision.CollisionPrimitive; - import alternativa.tanks.game.entities.tank.graphics.materials.TreesMaterial; + import alternativa.engine3d.materials.StandardMaterial; import alternativa.tanks.game.physics.CollisionGroup; import alternativa.tanks.game.utils.PhysicsParsingUtils; import alternativa.tanks.game.utils.TaskSequence; @@ -122,13 +122,13 @@ package alternativa.tanks.game.entities.map meshName = mesh.name.toLowerCase(); if(meshName.indexOf("decal") >= 0) { - decal = new Decal(1.5); + decal = new Decal(); //XXX: in 8.16 it accepts an offset argument, it was set to 1.5 here before decal.name = meshName; decal.useShadow = true; decal.geometry = mesh.geometry; - decal.name_eW = mesh.name_eW; - decal.name_Oy = mesh.name_Oy; - for each(surface in decal.name_eW) + decal._surfaces = mesh._surfaces; + decal._surfacesLength = mesh._surfacesLength; + for each(surface in decal._surfaces) { surface.alternativa3d::object = decal; } @@ -167,7 +167,7 @@ package alternativa.tanks.game.entities.map var opacity:TextureResource = null; var emission:TextureResource = null; var reflection:TextureResource = null; - var envMaterial:EnviromentMaterial = null; + var envMaterial:EnvironmentMaterial = null; if(data != null) { parser = new ParserA3D(); @@ -192,13 +192,16 @@ package alternativa.tanks.game.entities.map if(diffName.indexOf("vetrino01") >= 0) { reflection = this.getCompressedTextureResource(new ExternalTextureResource("vetrino_rfl.atf"),resourceCache,this.mapFiles); - envMaterial = new EnviromentMaterial(diffuse,this.name_TE,null,reflection,emission,opacity); + envMaterial = new EnvironmentMaterial(diffuse,this.name_TE,null,reflection,emission,opacity); envMaterial.reflection = 0.4; surface.material = envMaterial; } else { - surface.material = new MapMaterial(diffuse,emission,1,opacity); + var mapMaterial:StandardMaterial = new StandardMaterial(diffuse, null, null, null, opacity); + mapMaterial.lightMap = emission; + mapMaterial.lightMapChannel = 1; + surface.material = mapMaterial; } } i++; @@ -216,8 +219,8 @@ package alternativa.tanks.game.entities.map var diffuseTextureResource:TextureResource = null; var emissionTextureResource:TextureResource = null; var opacityTextureResource:TextureResource = null; - var material:MapMaterial = null; - for each(surface in mesh.name_eW) + var material:StandardMaterial = null; + for each(surface in mesh._surfaces) { parserMaterial = surface.material as ParserMaterial; if(parserMaterial != null) @@ -225,13 +228,16 @@ package alternativa.tanks.game.entities.map diffuseTextureResource = this.getCompressedTextureResource(parserMaterial.textures["diffuse"],resourceCache,this.mapFiles); emissionTextureResource = this.getCompressedTextureResource(parserMaterial.textures["emission"],resourceCache,this.mapFiles); opacityTextureResource = this.getCompressedTextureResource(parserMaterial.textures["transparent"],resourceCache,this.mapFiles); + material = new StandardMaterial(diffuseTextureResource, null, null, null, opacityTextureResource); if(emissionTextureResource == null) { - material = new MapMaterial(diffuseTextureResource,fakeEmissionTextureResource,0,opacityTextureResource); + material.lightMap = fakeBumpTextureResource; + material.lightMapChannel = 0; } else { - material = new MapMaterial(diffuseTextureResource,emissionTextureResource,1,opacityTextureResource); + material.lightMap = fakeBumpTextureResource; + material.lightMapChannel = 1; } surface.material = material; } @@ -265,7 +271,7 @@ package alternativa.tanks.game.entities.map var diffuse:TextureResource = null; var bump:TextureResource = null; var opacity:TextureResource = null; - var trMaterial:TreesMaterial = null; + var trMaterial:StandardMaterial = null; if(data != null) { parser = new ParserA3D(); @@ -285,8 +291,8 @@ package alternativa.tanks.game.entities.map diffuse = this.getCompressedTextureResource(material.textures["diffuse"],resourceCache,this.mapFiles); bump = this.getCompressedTextureResource(material.textures["bump"],resourceCache,this.mapFiles); opacity = this.getCompressedTextureResource(material.textures["transparent"],resourceCache,this.mapFiles); - trMaterial = new TreesMaterial(diffuse,fakeBumpTextureResource,null,null,opacity); - trMaterial.name_kj = 0; + trMaterial = new StandardMaterial(diffuse,fakeBumpTextureResource,null,null,opacity); + trMaterial.specularPower = 0; trMaterial.alphaThreshold = 0.2; surface.material = trMaterial; } diff --git a/src/alternativa/tanks/game/entities/map/A3DMapComponent.as b/src/alternativa/tanks/game/entities/map/A3DMapComponent.as index b6f62b2..c5650be 100644 --- a/src/alternativa/tanks/game/entities/map/A3DMapComponent.as +++ b/src/alternativa/tanks/game/entities/map/A3DMapComponent.as @@ -403,7 +403,7 @@ package alternativa.tanks.game.entities.map this.name_9h = value; for each(decal in this.name_Zy.decals) { - decal.offset = this.name_9h; + //decal.offset = this.name_9h; //XXX: 8.32 does not have decal offset } IConsole(OSGi.getInstance().getService(IConsole)).addText("Decals offset: " + this.name_9h); } diff --git a/src/alternativa/tanks/game/entities/map/MapMaterial.as b/src/alternativa/tanks/game/entities/map/MapMaterial.as deleted file mode 100644 index 926b5c2..0000000 --- a/src/alternativa/tanks/game/entities/map/MapMaterial.as +++ /dev/null @@ -1,391 +0,0 @@ -package alternativa.tanks.game.entities.map -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.RenderPriority; - import alternativa.engine3d.core.Transform3D; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.materials.A3DUtils; - import alternativa.engine3d.materials.Material; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.materials.compiler.VariableType; - import alternativa.engine3d.objects.Surface; - import alternativa.engine3d.resources.BitmapTextureResource; - import alternativa.engine3d.resources.Geometry; - import alternativa.engine3d.resources.TextureResource; - import alternativa.engine3d.shadows.ShadowRenderer; - import avmplus.getQualifiedClassName; - import flash.display.BitmapData; - import flash.display3D.Context3DBlendFactor; - import flash.display3D.Context3DProgramType; - import flash.display3D.VertexBuffer3D; - import flash.utils.Dictionary; - import flash.utils.getDefinitionByName; - - use namespace alternativa3d; - - public class MapMaterial extends Material - { - private static var fogTexture:TextureResource; - - public static const DISABLED:int = 0; - - public static const SIMPLE:int = 1; - - public static const ADVANCED:int = 2; - - public static var fogMode:int = DISABLED; - - public static var fogNear:Number = 1000; - - public static var fogFar:Number = 5000; - - public static var fogMaxDensity:Number = 1; - - public static var fogColorR:Number = 200 / 255; - - public static var fogColorG:Number = 162 / 255; - - public static var fogColorB:Number = 200 / 255; - - private static var _programs:Dictionary = new Dictionary(); - - private static const getLightMapProcedure:Procedure = Procedure.compileFromArray(["#v0=vUV1","#s0=sLightMap","tex o0, v0, s0 <2d,repeat,linear,mipnone>"],"getLightMap"); - - private static const minShadowProcedure:Procedure = Procedure.compileFromArray(["min o0, o0, i0"],"minShadowProc"); - - private static const mulShadowProcedure:Procedure = Procedure.compileFromArray(["mul o0, o0, i0"],"mulShadowProc"); - - private static const applyLightMapProcedure:Procedure = Procedure.compileFromArray(["add i1, i1, i1","mul i0.xyz, i0.xyz, i1.xyz","mov o0, i0"],"applyLightMap"); - - private static const _passLightMapUVProcedure:Procedure = new Procedure(["#a0=aUV1","#v0=vUV1","mov v0, a0"],"passLightMapUV"); - - private static const passSimpleFogConstProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogSpace","dp4 t0.z, i0, c0","mov v0, t0.zzzz","sub v0.y, i0.w, t0.z"],"passSimpleFogConst"); - - private static const applyLightMapAndSimpleFogProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogColor","#c1=cFogRange","add i1, i1, i1","mul i0.xyz, i0.xyz, i1.xyz","min t0.xy, v0.xy, c1.xy","max t0.xy, t0.xy, c1.zw","mul i0.xyz, i0.xyz, t0.y","mul t0.xyz, c0.xyz, t0.x","add i0.xyz, i0.xyz, t0.xyz","mov o0, i0"],"applyLightMapAndSimpleFog"); - - private static const passAdvancedFogConstProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogSpace","dp4 t0.z, i0, c0","mov v0, t0.zzzz","sub v0.y, i0.w, t0.z","mov v0.zw, i1.xwxw","mov o0, i1"],"projAndPassAdvancedFogConst"); - - private static const applyLightMapAndAdvancedFogProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogConsts","#c1=cFogRange","#s0=sFogTexture","add i1, i1, i1","mul i0.xyz, i0.xyz, i1.xyz","min t0.xy, v0.xy, c1.xy","max t0.xy, t0.xy, c1.zw","mul i0.xyz, i0.xyz, t0.y","mov t1.xyzw, c0.yyzw","div t0.z, v0.z, v0.w","mul t0.z, t0.z, c0.x","add t1.x, t1.x, t0.z","tex t1, t1, s0 <2d, repeat, linear, miplinear>","mul t0.xyz, t1.xyz, t0.x","add i0.xyz, i0.xyz, t0.xyz","mov o0, i0"],"applyLightMapAndAdvancedFog"); - - alternativa3d static const outputOpacity:Procedure = new Procedure(["#v0=vUV","#s0=sTexture","#s1=sOpacity","#c0=cAlpha","tex t0, v0, s0 <2d, linear,repeat, miplinear>","tex t1, v0, s1 <2d, linear,repeat, miplinear>","mov t0.w, t1.x","sub t1.x, t1.x, c0.w","kil t1.x","mov o0, t0"],"samplerSetProcedureOpacity"); - - private static const passUVProcedure:Procedure = new Procedure(["#v0=vUV","#a0=aUV","mov v0, a0"],"passUVProcedure"); - - private static const diffuseProcedure:Procedure = new Procedure(["#v0=vUV","#s0=sTexture","#c0=cAlpha","tex t0, v0, s0 <2d, linear,repeat, miplinear>","mov t0.w, c0.w","mov o0, t0"],"diffuseProcedure"); - - private static const diffuseOpacityProcedure:Procedure = new Procedure(["#v0=vUV","#s0=sTexture","#s1=sOpacity","#c0=cAlpha","tex t0, v0, s0 <2d, linear,repeat, miplinear>","tex t1, v0, s1 <2d, linear,repeat, miplinear>","mov t0.w, t1.x","mul t0.w, t0.w, c0.w","mov o0, t0"],"diffuseOpacityProcedure"); - - public var diffuseMap:TextureResource; - - public var lightMap:TextureResource; - - public var lightMapChannel:uint = 0; - - public var opacityMap:TextureResource; - - public var alpha:Number = 1; - - public function MapMaterial(diffuseMap:TextureResource, lightMap:TextureResource, lightMapChannel:uint = 0, opacityMap:TextureResource = null) - { - super(); - this.diffuseMap = diffuseMap; - this.lightMap = lightMap; - this.lightMapChannel = lightMapChannel; - this.opacityMap = opacityMap; - } - - public static function setFogTexture(texture:TextureResource) : void - { - fogTexture = texture; - } - - override alternativa3d function fillResources(resources:Dictionary, resourceType:Class) : void - { - super.alternativa3d::fillResources(resources,resourceType); - if(this.diffuseMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.diffuseMap)) as Class,resourceType))) - { - resources[this.diffuseMap] = true; - } - if(this.lightMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.lightMap)) as Class,resourceType))) - { - resources[this.lightMap] = true; - } - if(this.opacityMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.opacityMap)) as Class,resourceType))) - { - resources[this.opacityMap] = true; - } - } - - private function final(targetObject:Object3D, shadows:Vector., numShadows:int) : MapMaterialProgram - { - var i:int = 0; - var renderer:ShadowRenderer = null; - var sProc:Procedure = null; - var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); - var positionVar:String = "aPosition"; - vertexLinker.declareVariable(positionVar,VariableType.ATTRIBUTE); - if(targetObject.alternativa3d::transformProcedure != null) - { - positionVar = alternativa3d::appendPositionTransformProcedure(targetObject.alternativa3d::transformProcedure,vertexLinker); - } - vertexLinker.addProcedure(alternativa3d::_projectProcedure); - vertexLinker.setInputParams(alternativa3d::_projectProcedure,positionVar); - vertexLinker.addProcedure(passUVProcedure); - vertexLinker.addProcedure(_passLightMapUVProcedure); - if(fogMode == SIMPLE) - { - vertexLinker.addProcedure(passSimpleFogConstProcedure); - vertexLinker.setInputParams(passSimpleFogConstProcedure,positionVar); - } - else if(fogMode == ADVANCED) - { - vertexLinker.declareVariable("tProjected"); - vertexLinker.setOutputParams(alternativa3d::_projectProcedure,"tProjected"); - vertexLinker.addProcedure(passAdvancedFogConstProcedure); - vertexLinker.setInputParams(passAdvancedFogConstProcedure,positionVar,"tProjected"); - } - var fragmentLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); - var procedure:Procedure = this.opacityMap == null ? diffuseProcedure : diffuseOpacityProcedure; - fragmentLinker.declareVariable("tOutColor"); - fragmentLinker.addProcedure(procedure); - fragmentLinker.setOutputParams(procedure,"tOutColor"); - if(shadows != null) - { - fragmentLinker.declareVariable("tLight"); - fragmentLinker.addProcedure(getLightMapProcedure); - fragmentLinker.setOutputParams(getLightMapProcedure,"tLight"); - fragmentLinker.declareVariable("tShadow"); - for(i = 0; i < numShadows; i++) - { - renderer = shadows[i]; - vertexLinker.addProcedure(renderer.getVShader(i)); - sProc = renderer.getFShader(i); - fragmentLinker.addProcedure(sProc); - fragmentLinker.setOutputParams(sProc,"tShadow"); - if(renderer.alternativa3d::needMultiplyBlend) - { - fragmentLinker.addProcedure(mulShadowProcedure); - fragmentLinker.setInputParams(mulShadowProcedure,"tShadow"); - fragmentLinker.setOutputParams(mulShadowProcedure,"tLight"); - } - else - { - fragmentLinker.addProcedure(minShadowProcedure); - fragmentLinker.setInputParams(minShadowProcedure,"tShadow"); - fragmentLinker.setOutputParams(minShadowProcedure,"tLight"); - } - } - } - else - { - fragmentLinker.declareVariable("tLight"); - fragmentLinker.addProcedure(getLightMapProcedure); - fragmentLinker.setOutputParams(getLightMapProcedure,"tLight"); - } - if(fogMode == SIMPLE) - { - fragmentLinker.addProcedure(applyLightMapAndSimpleFogProcedure); - fragmentLinker.setInputParams(applyLightMapAndSimpleFogProcedure,"tOutColor","tLight"); - } - else if(fogMode == ADVANCED) - { - fragmentLinker.addProcedure(applyLightMapAndAdvancedFogProcedure); - fragmentLinker.setInputParams(applyLightMapAndAdvancedFogProcedure,"tOutColor","tLight"); - } - else - { - fragmentLinker.addProcedure(applyLightMapProcedure); - fragmentLinker.setInputParams(applyLightMapProcedure,"tOutColor","tLight"); - } - fragmentLinker.setOppositeLinker(vertexLinker); - return new MapMaterialProgram(vertexLinker,fragmentLinker); - } - - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void - { - var i:int = 0; - var renderer:ShadowRenderer = null; - var lm:Transform3D = null; - var dist:Number = NaN; - var cLocal:Transform3D = null; - var halfW:Number = NaN; - var leftX:Number = NaN; - var leftY:Number = NaN; - var rightX:Number = NaN; - var rightY:Number = NaN; - var angle:Number = NaN; - var dx:Number = NaN; - var dy:Number = NaN; - var len:Number = NaN; - var uScale:Number = NaN; - var uRight:Number = NaN; - var bmd:BitmapData = null; - if(this.diffuseMap == null || this.diffuseMap.alternativa3d::_texture == null || this.lightMap == null || this.lightMap.alternativa3d::_texture == null) - { - return; - } - if(this.opacityMap != null && this.opacityMap.alternativa3d::_texture == null) - { - return; - } - var positionBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - var uvBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TEXCOORDS[0]); - var lightMapUVBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TEXCOORDS[this.lightMapChannel]); - if(positionBuffer == null || uvBuffer == null || lightMapUVBuffer == null) - { - return; - } - var object:Object3D = surface.alternativa3d::object; - var optionsPrograms:Vector. = _programs[object.alternativa3d::transformProcedure]; - if(optionsPrograms == null) - { - optionsPrograms = new Vector.(32,true); - _programs[object.alternativa3d::transformProcedure] = optionsPrograms; - } - var index:int = this.opacityMap == null ? 0 : 1; - if(fogMode > 0) - { - index |= 1 << fogMode; - } - var numShadows:int = object.alternativa3d::numShadowRenderers; - index |= numShadows << 3; - var program:MapMaterialProgram = optionsPrograms[index]; - if(program == null) - { - program = this.final(object,object.alternativa3d::shadowRenderers,numShadows); - program.upload(camera.alternativa3d::context3D); - optionsPrograms[index] = program; - } - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); - drawUnit.alternativa3d::setVertexBufferAt(program.aPosition,positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - drawUnit.alternativa3d::setVertexBufferAt(program.aUV,uvBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[0]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[0]]); - drawUnit.alternativa3d::setVertexBufferAt(program.aUV1,lightMapUVBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[this.lightMapChannel]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[this.lightMapChannel]]); - object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); - drawUnit.alternativa3d::setProjectionConstants(camera,program.cProjMatrix,object.alternativa3d::localToCameraTransform); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.cAlpha,0,0,0,this.alpha); - drawUnit.alternativa3d::setTextureAt(program.sTexture,this.diffuseMap.alternativa3d::_texture); - drawUnit.alternativa3d::setTextureAt(program.sLightMap,this.lightMap.alternativa3d::_texture); - if(this.opacityMap != null) - { - drawUnit.alternativa3d::setTextureAt(program.sOpacity,this.opacityMap.alternativa3d::_texture); - } - for(i = 0; i < numShadows; ) - { - renderer = object.alternativa3d::shadowRenderers[i]; - renderer.applyShader(drawUnit,program,object,camera,i); - i++; - } - if(fogMode == SIMPLE || fogMode == ADVANCED) - { - lm = object.alternativa3d::localToCameraTransform; - dist = fogFar - fogNear; - drawUnit.alternativa3d::setVertexConstantsFromNumbers(program.cFogSpace,lm.i / dist,lm.j / dist,lm.k / dist,(lm.l - fogNear) / dist); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.cFogRange,fogMaxDensity,1,0,1 - fogMaxDensity); - } - if(fogMode == SIMPLE) - { - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.cFogColor,fogColorR,fogColorG,fogColorB); - } - if(fogMode == ADVANCED) - { - if(fogTexture == null) - { - bmd = new BitmapData(32,1,false,16711680); - for(i = 0; i < 32; i++) - { - bmd.setPixel(i,0,i / 32 * 255 << 16); - } - fogTexture = new BitmapTextureResource(bmd); - fogTexture.upload(camera.alternativa3d::context3D); - } - cLocal = camera.alternativa3d::localToGlobalTransform; - halfW = camera.view.width / 2; - leftX = -halfW * cLocal.a + camera.alternativa3d::focalLength * cLocal.c; - leftY = -halfW * cLocal.e + camera.alternativa3d::focalLength * cLocal.g; - rightX = halfW * cLocal.a + camera.alternativa3d::focalLength * cLocal.c; - rightY = halfW * cLocal.e + camera.alternativa3d::focalLength * cLocal.g; - angle = Math.atan2(leftY,leftX) - Math.PI / 2; - if(angle < 0) - { - angle += Math.PI * 2; - } - dx = rightX - leftX; - dy = rightY - leftY; - len = Number(Math.sqrt(dx * dx + dy * dy)); - leftX /= len; - leftY /= len; - rightX /= len; - rightY /= len; - uScale = Math.acos(leftX * rightX + leftY * rightY) / Math.PI / 2; - uRight = angle / Math.PI / 2; - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.cFogConsts,0.5 * uScale,0.5 - uRight,0); - drawUnit.alternativa3d::setTextureAt(program.sFogTexture,fogTexture.alternativa3d::_texture); - } - if(this.opacityMap != null || this.alpha < 1) - { - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.SOURCE_ALPHA; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.TRANSPARENT_SORT); - } - else - { - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.OPAQUE); - } - } - } -} - -import alternativa.engine3d.materials.ShaderProgram; -import alternativa.engine3d.materials.compiler.Linker; - -class MapMaterialProgram extends ShaderProgram -{ - public var aPosition:int; - - public var aUV:int; - - public var aUV1:int; - - public var cProjMatrix:int; - - public var cAlpha:int; - - public var sTexture:int; - - public var sLightMap:int; - - public var sOpacity:int; - - public var cFogSpace:int; - - public var cFogRange:int; - - public var cFogColor:int; - - public var cFogConsts:int; - - public var sFogTexture:int; - - public function MapMaterialProgram(vertex:Linker, fragment:Linker) - { - super(vertex,fragment); - this.aPosition = vertex.findVariable("aPosition"); - this.aUV = vertex.findVariable("aUV"); - this.aUV1 = vertex.findVariable("aUV1"); - this.cProjMatrix = vertex.findVariable("cProjMatrix"); - this.cAlpha = fragment.findVariable("cAlpha"); - this.sTexture = fragment.findVariable("sTexture"); - this.sLightMap = fragment.findVariable("sLightMap"); - this.sOpacity = fragment.findVariable("sOpacity"); - this.cFogSpace = vertex.findVariable("cFogSpace"); - this.cFogRange = fragment.findVariable("cFogRange"); - this.cFogColor = fragment.findVariable("cFogColor"); - this.cFogConsts = fragment.findVariable("cFogConsts"); - this.sFogTexture = fragment.findVariable("sFogTexture"); - } -} diff --git a/src/alternativa/tanks/game/entities/map/VisibleLightMaterial.as b/src/alternativa/tanks/game/entities/map/VisibleLightMaterial.as index 24e5fef..79419ed 100644 --- a/src/alternativa/tanks/game/entities/map/VisibleLightMaterial.as +++ b/src/alternativa/tanks/game/entities/map/VisibleLightMaterial.as @@ -23,6 +23,7 @@ package alternativa.tanks.game.entities.map import flash.utils.Dictionary; import flash.utils.getDefinitionByName; import flash.utils.getQualifiedClassName; + import alternativa.engine3d.core.Renderer; use namespace alternativa3d; @@ -82,13 +83,12 @@ package alternativa.tanks.game.entities.map vertexLinker.addProcedure(passColorProcedure); vertexLinker.setInputParams(passColorProcedure,positionVar,normalVar); fragmentLinker.addProcedure(outputProcedure); - fragmentLinker.setOppositeLinker(vertexLinker); vertexLinker.link(); fragmentLinker.link(); return new ShaderProgram(vertexLinker,fragmentLinker); } - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void + override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, useShadow:Boolean, objectRenderPriority:int = -1) : void { if(this.texture == null || this.texture.alternativa3d::_texture == null) { @@ -109,7 +109,7 @@ package alternativa.tanks.game.entities.map program.upload(camera.alternativa3d::context3D); _programs[object.alternativa3d::transformProcedure] = program; } - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); + var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry._indexBuffer,surface.indexBegin,surface.numTriangles,program); drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"),positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aUV"),uvBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[0]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[0]]); drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aNormal"),normalsBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.NORMAL],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.NORMAL]); @@ -127,7 +127,7 @@ package alternativa.tanks.game.entities.map drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sTexture"),this.texture.alternativa3d::_texture); drawUnit.alternativa3d::blendSource = Context3DBlendFactor.ONE; drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ONE; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.TRANSPARENT_SORT); + camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : Renderer.TRANSPARENT_SORT); } } } diff --git a/src/alternativa/tanks/game/entities/tank/graphics/DirectionalShadowRendererConstructor.as b/src/alternativa/tanks/game/entities/tank/graphics/DirectionalShadowRendererConstructor.as deleted file mode 100644 index 920847e..0000000 --- a/src/alternativa/tanks/game/entities/tank/graphics/DirectionalShadowRendererConstructor.as +++ /dev/null @@ -1,46 +0,0 @@ -package alternativa.tanks.game.entities.tank.graphics -{ - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.lights.DirectionalLight; - import alternativa.engine3d.shadows.DirectionalShadowRenderer; - import alternativa.tanks.game.subsystems.rendersystem.IShadowRendererConstructor; - import alternativa.tanks.game.subsystems.rendersystem.RenderSystem; - - public class DirectionalShadowRendererConstructor implements IShadowRendererConstructor - { - private var object:Object3D; - - private var renderSystem:RenderSystem; - - private var consumer:IDirectionalShadowRendererConsumer; - - public function DirectionalShadowRendererConstructor(object:Object3D, renderSystem:RenderSystem, consumer:IDirectionalShadowRendererConsumer) - { - super(); - this.object = object; - this.renderSystem = renderSystem; - this.consumer = consumer; - } - - public function createShadowRenderer() : void - { - var worldSize:Number = NaN; - var textureSize:int = 0; - var pcfSize:int = 0; - var directionalShadowRenderer:DirectionalShadowRenderer = null; - var directionalLights:Vector. = this.renderSystem.lights.directionalLigths.lights; - if(directionalLights != null && directionalLights.length > 0) - { - worldSize = 1300; - textureSize = 256; - pcfSize = 4; - directionalShadowRenderer = new DirectionalShadowRenderer(this.renderSystem.getContext3D(),textureSize,worldSize,pcfSize); - directionalShadowRenderer.name_qg = this.object; - directionalShadowRenderer.setLight(directionalLights[0]); - this.renderSystem.addShadowRenderer(directionalShadowRenderer); - this.consumer.setShadowRenderer(directionalShadowRenderer); - } - } - } -} - diff --git a/src/alternativa/tanks/game/entities/tank/graphics/TankExplosionComponent.as b/src/alternativa/tanks/game/entities/tank/graphics/TankExplosionComponent.as index ead717f..bb9c35e 100644 --- a/src/alternativa/tanks/game/entities/tank/graphics/TankExplosionComponent.as +++ b/src/alternativa/tanks/game/entities/tank/graphics/TankExplosionComponent.as @@ -99,7 +99,7 @@ package alternativa.tanks.game.entities.tank.graphics } effect = AnimatedPlaneEffect(this.gameKernel.getObjectPoolManager().getObject(AnimatedPlaneEffect)); effect.init(actualSize,position,rotation,this.shockWaveFrames,SHOCK_WAVE_FPS,this.shockWaveGrowSpeed); - this.gameKernel.getRenderSystem().each(effect); + this.gameKernel.getRenderSystem().addEffect(effect); } } @@ -110,7 +110,7 @@ package alternativa.tanks.game.entities.tank.graphics position.z += 100; var rotation:Number = Math.random() * Math.PI; animatedSpriteEffect.init(600,600,this.explosionFrames,position,rotation,400,EXPLOSION_FPS,false); - this.gameKernel.getRenderSystem().each(animatedSpriteEffect); + this.gameKernel.getRenderSystem().addEffect(animatedSpriteEffect); } private function createSmoke(chassisPhysicsComponent:IChassisPhysicsComponent) : void @@ -136,7 +136,7 @@ package alternativa.tanks.game.entities.tank.graphics movingAnimatedSprite = MovingAnimatedSprite(this.gameKernel.getObjectPoolManager().getObject(MovingAnimatedSprite)); rotation = Math.random() * Math.PI; movingAnimatedSprite.init(400,400,this.smokeFrames,position,velocity,-1000,rotation,SMOKE_FPS,false); - this.gameKernel.getRenderSystem().each(movingAnimatedSprite); + this.gameKernel.getRenderSystem().addEffect(movingAnimatedSprite); rotationAngle += 2 / 3 * Math.PI; } } diff --git a/src/alternativa/tanks/game/entities/tank/graphics/chassis/tracked/TrackAnimator.as b/src/alternativa/tanks/game/entities/tank/graphics/chassis/tracked/TrackAnimator.as index 71cb8a0..1d06832 100644 --- a/src/alternativa/tanks/game/entities/tank/graphics/chassis/tracked/TrackAnimator.as +++ b/src/alternativa/tanks/game/entities/tank/graphics/chassis/tracked/TrackAnimator.as @@ -5,10 +5,11 @@ package alternativa.tanks.game.entities.tank.graphics.chassis.tracked import alternativa.engine3d.objects.Skin; import alternativa.tanks.game.entities.tank.graphics.materials.TracksMaterial2; import alternativa.tanks.game.entities.tank.physics.IChassisPhysicsComponent; + import alternativa.engine3d.materials.StandardMaterial; public class TrackAnimator { - public var material:TracksMaterial2; + public var material:StandardMaterial; public var physicsComponent:IChassisPhysicsComponent; @@ -89,7 +90,7 @@ package alternativa.tanks.game.entities.tank.graphics.chassis.tracked delta = newOffset - this.name_cr; this.name_cr = newOffset; } - this.material.vOffset = this.name_cr; + //this.material.vOffset = this.name_cr; } } diff --git a/src/alternativa/tanks/game/entities/tank/graphics/chassis/tracked/TrackedChassisGraphicsComponent.as b/src/alternativa/tanks/game/entities/tank/graphics/chassis/tracked/TrackedChassisGraphicsComponent.as index 5b26b1d..dd710e2 100644 --- a/src/alternativa/tanks/game/entities/tank/graphics/chassis/tracked/TrackedChassisGraphicsComponent.as +++ b/src/alternativa/tanks/game/entities/tank/graphics/chassis/tracked/TrackedChassisGraphicsComponent.as @@ -25,10 +25,11 @@ package alternativa.tanks.game.entities.tank.graphics.chassis.tracked import alternativa.tanks.game.subsystems.rendersystem.RenderSystem; import alternativa.tanks.game.subsystems.timesystem.TimeSystem; import flash.geom.Point; + import alternativa.engine3d.materials.StandardMaterial; use namespace alternativa3d; - public class TrackedChassisGraphicsComponent extends EntityComponent implements ITankGraphicsComponent, IDirectionalShadowRendererConsumer + public class TrackedChassisGraphicsComponent extends EntityComponent implements ITankGraphicsComponent { public static const TANK_CLICK:String = "tankClick"; @@ -64,10 +65,6 @@ package alternativa.tanks.game.entities.tank.graphics.chassis.tracked private var name_R4:TrackAnimator; - private var shadowRenderer:DirectionalShadowRenderer; - - private var name_5s:DirectionalShadowRendererConstructor; - public function TrackedChassisGraphicsComponent(hull:TankHull) { super(); @@ -79,11 +76,11 @@ package alternativa.tanks.game.entities.tank.graphics.chassis.tracked return this.hull; } - public function setTracksMaterial(tracksMaterial:TracksMaterial2) : void + public function setTracksMaterial(tracksMaterial:StandardMaterial) : void { - this.name_dh.material = TracksMaterial2(tracksMaterial.clone()); + this.name_dh.material = StandardMaterial(tracksMaterial.clone()); this.name_Ei.setMaterialToAllSurfaces(this.name_dh.material); - this.name_R4.material = TracksMaterial2(tracksMaterial.clone()); + this.name_R4.material = StandardMaterial(tracksMaterial.clone()); this.name_iA.setMaterialToAllSurfaces(this.name_R4.material); } @@ -100,16 +97,6 @@ package alternativa.tanks.game.entities.tank.graphics.chassis.tracked return this.name_nh; } - public function setShadowRenderer(shadowRenderer:DirectionalShadowRenderer) : void - { - this.shadowRenderer = shadowRenderer; - this.name_5s = null; - if(this.container != null) - { - this.gameKernel.getRenderSystem().addShadowRenderer(shadowRenderer); - } - } - public function setHull(newHull:TankHull) : void { var dUdY:Number = NaN; @@ -137,7 +124,7 @@ package alternativa.tanks.game.entities.tank.graphics.chassis.tracked this.name_R4 = new TrackAnimator(this.name_iA,this.name_M4,dUdY); if(this.hull.shadow != null) { - this.shadow = new Decal(100); + this.shadow = new Decal(); //XXX: offset = 100 this.shadow.geometry = this.hull.shadow.geometry; this.shadow.matrix = this.hull.shadow.matrix; this.shadow.addSurface(null,0,this.shadow.geometry.numTriangles); @@ -267,10 +254,6 @@ package alternativa.tanks.game.entities.tank.graphics.chassis.tracked if(this.name_nh != null) { this.container.addChild(this.name_nh); - if(this.shadowRenderer != null) - { - renderSystem.addShadowRenderer(this.shadowRenderer); - } } this.enableMouseListeners(); } @@ -283,10 +266,6 @@ package alternativa.tanks.game.entities.tank.graphics.chassis.tracked if(this.name_nh != null) { this.container.removeChild(this.name_nh); - if(this.shadowRenderer != null) - { - this.gameKernel.getRenderSystem().removeShadowRenderer(this.shadowRenderer); - } } this.container = null; } @@ -310,25 +289,10 @@ package alternativa.tanks.game.entities.tank.graphics.chassis.tracked { this.gameKernel = gameKernel; var renderSystem:RenderSystem = gameKernel.getRenderSystem(); - this.name_5s = new DirectionalShadowRendererConstructor(this.name_nh,renderSystem,this); - if(renderSystem.isShadowSystemReady()) - { - this.name_5s.createShadowRenderer(); - this.name_5s = null; - } - else - { - renderSystem.addShadowRendererConstructor(this.name_5s); - } } override public function removeFromGame(gameKernel:GameKernel) : void { - if(this.name_5s != null) - { - gameKernel.getRenderSystem().removeShadowRendererConstructor(this.name_5s); - this.name_5s = null; - } this.removeFromScene(); gameKernel = null; } diff --git a/src/alternativa/tanks/game/entities/tank/graphics/materials/GiShadowMaterial.as b/src/alternativa/tanks/game/entities/tank/graphics/materials/GiShadowMaterial.as index d15ac54..0d18106 100644 --- a/src/alternativa/tanks/game/entities/tank/graphics/materials/GiShadowMaterial.as +++ b/src/alternativa/tanks/game/entities/tank/graphics/materials/GiShadowMaterial.as @@ -26,6 +26,7 @@ package alternativa.tanks.game.entities.tank.graphics.materials import flash.utils.Dictionary; import flash.utils.getDefinitionByName; import flash.utils.getQualifiedClassName; + import alternativa.engine3d.core.Renderer; use namespace alternativa3d; @@ -118,11 +119,11 @@ package alternativa.tanks.game.entities.tank.graphics.materials fragmentLinker.addProcedure(outputWithAdvancedFogProcedure); fragmentLinker.setInputParams(outputWithAdvancedFogProcedure,"outColor"); } - fragmentLinker.setOppositeLinker(vertexLinker); + //fragmentLinker.setOppositeLinker(vertexLinker); return new ShaderProgram(vertexLinker,fragmentLinker); } - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void + override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, useShadow:Boolean, objectRenderPriority:int = -1) : void { var program:ShaderProgram = null; var lm:Transform3D = null; @@ -167,7 +168,7 @@ package alternativa.tanks.game.entities.tank.graphics.materials programs[fogMode] = program; } } - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); + var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry._indexBuffer,surface.indexBegin,surface.numTriangles,program); drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"),positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aUV"),uvBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[0]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[0]]); object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); @@ -230,7 +231,7 @@ package alternativa.tanks.game.entities.tank.graphics.materials drawUnit.alternativa3d::blendSource = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA; drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.SOURCE_ALPHA; } - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,RenderPriority.TANK_SHADOW); + camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,Renderer.DECALS); } override public function clone() : Material diff --git a/src/alternativa/tanks/game/entities/tank/graphics/materials/TankMaterial.as b/src/alternativa/tanks/game/entities/tank/graphics/materials/TankMaterial.as index f9d20a0..7727f4e 100644 --- a/src/alternativa/tanks/game/entities/tank/graphics/materials/TankMaterial.as +++ b/src/alternativa/tanks/game/entities/tank/graphics/materials/TankMaterial.as @@ -28,6 +28,7 @@ package alternativa.tanks.game.entities.tank.graphics.materials import flash.utils.Dictionary; import flash.utils.getDefinitionByName; import flash.utils.getQualifiedClassName; + import alternativa.engine3d.core.Renderer; use namespace alternativa3d; @@ -208,8 +209,8 @@ package alternativa.tanks.game.entities.tank.graphics.materials } if(directional != null) { - vertexLinker.addProcedure(directional.shadow.getVShader()); - shadowProc = directional.shadow.getFShader(); + vertexLinker.addProcedure(directional.shadow.vertexShadowProcedure); + shadowProc = directional.shadow.fragmentShadowProcedure; fragmentLinker.addProcedure(shadowProc); fragmentLinker.setOutputParams(shadowProc,"tTotalLight"); dirMulShadowProcedure = _lightFragmentProcedures[directional.shadow]; @@ -238,12 +239,12 @@ package alternativa.tanks.game.entities.tank.graphics.materials } else if(light is OmniLight) { - lightFragmentProcedure.compileFromArray(["#c0=c" + light.name_oG + "Position","#c1=c" + light.name_oG + "Color","#c2=c" + light.name_oG + "Radius","#v0=vPosition","sub t0, c0, v0","dp3 t0.w, t0.xyz, t0.xyz","nrm t0.xyz, t0.xyz","add t1.xyz, i1.xyz, t0.xyz","mov t1.w, c0.w","nrm t1.xyz, t1.xyz","dp3 t1.w, t1.xyz, i0.xyz","pow t1.w, t1.w, o1.w","sqt t1.x, t0.w","dp3 t0.w, t0.xyz, i0.xyz","sub t0.x, t1.x, c2.z","div t0.y, t0.x, c2.y","sub t0.x, c2.x, t0.y","sat t0.xw, t0.xw","mul t0.xyz, c1.xyz, t0.xxx","mul t1.xyz, t0.xyz, t1.w","add o1.xyz, o1.xyz, t1.xyz","mul t0.xyz, t0.xyz, t0.www","add o0.xyz, o0.xyz, t0.xyz"]); + lightFragmentProcedure.compileFromArray(["#c0=c" + light.lightID + "Position","#c1=c" + light.lightID + "Color","#c2=c" + light.lightID + "Radius","#v0=vPosition","sub t0, c0, v0","dp3 t0.w, t0.xyz, t0.xyz","nrm t0.xyz, t0.xyz","add t1.xyz, i1.xyz, t0.xyz","mov t1.w, c0.w","nrm t1.xyz, t1.xyz","dp3 t1.w, t1.xyz, i0.xyz","pow t1.w, t1.w, o1.w","sqt t1.x, t0.w","dp3 t0.w, t0.xyz, i0.xyz","sub t0.x, t1.x, c2.z","div t0.y, t0.x, c2.y","sub t0.x, c2.x, t0.y","sat t0.xw, t0.xw","mul t0.xyz, c1.xyz, t0.xxx","mul t1.xyz, t0.xyz, t1.w","add o1.xyz, o1.xyz, t1.xyz","mul t0.xyz, t0.xyz, t0.www","add o0.xyz, o0.xyz, t0.xyz"]); lightFragmentProcedure.name = i + "OmniLight"; } else if(light is SpotLight) { - lightFragmentProcedure.compileFromArray(["#c0=c" + light.name_oG + "Position","#c1=c" + light.name_oG + "Color","#c2=c" + light.name_oG + "Radius","#c3=c" + light.name_oG + "Axis","#v0=vPosition","sub t0, c0, v0","dp3 t0.w, t0, t0","nrm t0.xyz,t0.xyz","add t2.xyz, i1.xyz, t0.xyz","nrm t2.xyz, t2.xyz","dp3 t2.x, t2.xyz, i0.xyz","pow t2.x, t2.x, o1.w","dp3 t1.x, t0.xyz, c3.xyz","dp3 t0.x,t0,i0","sqt t0.w,t0.w","sub t0.w, t0.w, c2.y","div t0.y, t0.w, c2.x","sub t0.w, c0.w, t0.y","sub t0.y, t1.x, c2.w","div t0.y, t0.y, c2.z","sat t0.xyw,t0.xyw","mul t1.xyz,c1.xyz,t0.yyy","mul t1.xyz,t1.xyz,t0.www","mul t2.xyz, t2.x, t1.xyz","add o1.xyz, o1.xyz, t2.xyz","mul t1.xyz, t1.xyz, t0.xxx","add o0.xyz, o0.xyz, t1.xyz"]); + lightFragmentProcedure.compileFromArray(["#c0=c" + light.lightID + "Position","#c1=c" + light.lightID + "Color","#c2=c" + light.lightID + "Radius","#c3=c" + light.lightID + "Axis","#v0=vPosition","sub t0, c0, v0","dp3 t0.w, t0, t0","nrm t0.xyz,t0.xyz","add t2.xyz, i1.xyz, t0.xyz","nrm t2.xyz, t2.xyz","dp3 t2.x, t2.xyz, i0.xyz","pow t2.x, t2.x, o1.w","dp3 t1.x, t0.xyz, c3.xyz","dp3 t0.x,t0,i0","sqt t0.w,t0.w","sub t0.w, t0.w, c2.y","div t0.y, t0.w, c2.x","sub t0.w, c0.w, t0.y","sub t0.y, t1.x, c2.w","div t0.y, t0.y, c2.z","sat t0.xyw,t0.xyw","mul t1.xyz,c1.xyz,t0.yyy","mul t1.xyz,t1.xyz,t0.www","mul t2.xyz, t2.x, t1.xyz","add o1.xyz, o1.xyz, t2.xyz","mul t1.xyz, t1.xyz, t0.xxx","add o0.xyz, o0.xyz, t1.xyz"]); lightFragmentProcedure.name = i + "SpotLight"; } } @@ -264,7 +265,7 @@ package alternativa.tanks.game.entities.tank.graphics.materials fragmentLinker.addProcedure(_applySpecularProcedure); fragmentLinker.setOutputParams(_applySpecularProcedure,"tTotalHighLight"); } - if(name_L4) + if(transparentPass) { fragmentLinker.addProcedure(_mulLightingProcedureWithDiffuseAlpha); fragmentLinker.setInputParams(_mulLightingProcedureWithDiffuseAlpha,"tTotalLight","tTotalHighLight","outColor"); @@ -292,7 +293,6 @@ package alternativa.tanks.game.entities.tank.graphics.materials fragmentLinker.addProcedure(outputWithAdvancedFogProcedure); fragmentLinker.setInputParams(outputWithAdvancedFogProcedure,"outColor"); } - fragmentLinker.setOppositeLinker(vertexLinker); vertexLinker.link(); fragmentLinker.link(); return new ShaderProgram(vertexLinker,fragmentLinker); @@ -300,7 +300,7 @@ package alternativa.tanks.game.entities.tank.graphics.materials private function formDirectionalProcedure(procedure:Procedure, light:Light3D, useShadow:Boolean) : void { - var source:Array = ["#c0=c" + light.name_oG + "Direction","#c1=c" + light.name_oG + "Color","add t0.xyz, i1.xyz, c0.xyz","mov t0.w, c0.w","nrm t0.xyz,t0.xyz","dp3 t0.w, t0.xyz, i0.xyz","pow t0.w, t0.w, o1.w","dp3 t0.x, i0, c0.xyz","sat t0.x, t0.x"]; + var source:Array = ["#c0=c" + light.lightID + "Direction","#c1=c" + light.lightID + "Color","add t0.xyz, i1.xyz, c0.xyz","mov t0.w, c0.w","nrm t0.xyz,t0.xyz","dp3 t0.w, t0.xyz, i0.xyz","pow t0.w, t0.w, o1.w","dp3 t0.x, i0, c0.xyz","sat t0.x, t0.x"]; if(useShadow) { source.push("mul t0.x, t0.x, i2.x"); @@ -341,7 +341,7 @@ package alternativa.tanks.game.entities.tank.graphics.materials } } - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void + override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, useShadow:Boolean, objectRenderPriority:int = -1) : void { var light:Light3D = null; var i:int = 0; @@ -374,7 +374,7 @@ package alternativa.tanks.game.entities.tank.graphics.materials { return; } - if(!name_L4 && opacityMap != null && opacityMap.alternativa3d::_texture == null) + if(!transparentPass && opacityMap != null && opacityMap.alternativa3d::_texture == null) { return; } @@ -392,7 +392,7 @@ package alternativa.tanks.game.entities.tank.graphics.materials return; } lightsLength = lightsLength > 5 ? 5 : lightsLength; - var key:String = fogMode.toString() + (this.name_Vr ? "T" : "t") + (opacityMap != null ? "O" : "o") + (this.surfaceMap != null ? "S" : "s") + (name_L4 ? "D" : "d"); + var key:String = fogMode.toString() + (this.name_Vr ? "T" : "t") + (opacityMap != null ? "O" : "o") + (this.surfaceMap != null ? "S" : "s") + (transparentPass ? "D" : "d"); for(i = 0; i < lightsLength; i++) { light = lights[i]; @@ -401,7 +401,7 @@ package alternativa.tanks.game.entities.tank.graphics.materials directional = DirectionalLight(light); key += "S"; } - key += light.name_oG; + key += light.lightID; } var dict:Dictionary = _programs[object.alternativa3d::transformProcedure]; if(dict == null) @@ -422,7 +422,7 @@ package alternativa.tanks.game.entities.tank.graphics.materials dict[key] = program; } } - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); + var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry._indexBuffer,surface.indexBegin,surface.numTriangles,program); drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"),positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aUV"),uvBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[0]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[0]]); object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); @@ -455,41 +455,41 @@ package alternativa.tanks.game.entities.tank.graphics.materials light = lights[i]; if(light is DirectionalLight) { - transform = light.name_cl; + transform = light.lightToObjectTransform; len = Number(Math.sqrt(transform.c * transform.c + transform.g * transform.g + transform.k * transform.k)); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Direction"),-transform.c / len,-transform.g / len,-transform.k / len,1); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Color"),light.alternativa3d::red,light.alternativa3d::green,light.alternativa3d::blue); + drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Direction"),-transform.c / len,-transform.g / len,-transform.k / len,1); + drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Color"),light.alternativa3d::red,light.alternativa3d::green,light.alternativa3d::blue); } else if(light is OmniLight) { omni = light as OmniLight; - transform = light.name_cl; + transform = light.lightToObjectTransform; rScale = Number(Math.sqrt(transform.a * transform.a + transform.e * transform.e + transform.i * transform.i)); rScale += Math.sqrt(transform.b * transform.b + transform.f * transform.f + transform.j * transform.j); rScale += Math.sqrt(transform.c * transform.c + transform.g * transform.g + transform.k * transform.k); rScale /= 3; - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Position"),transform.d,transform.h,transform.l); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Radius"),1,omni.attenuationEnd * rScale - omni.attenuationBegin * rScale,omni.attenuationBegin * rScale); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Color"),light.alternativa3d::red,light.alternativa3d::green,light.alternativa3d::blue); + drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Position"),transform.d,transform.h,transform.l); + drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Radius"),1,omni.attenuationEnd * rScale - omni.attenuationBegin * rScale,omni.attenuationBegin * rScale); + drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Color"),light.alternativa3d::red,light.alternativa3d::green,light.alternativa3d::blue); } else if(light is SpotLight) { spot = light as SpotLight; - transform = light.name_cl; + transform = light.lightToObjectTransform; rScale = Number(Math.sqrt(transform.a * transform.a + transform.e * transform.e + transform.i * transform.i)); rScale += Math.sqrt(transform.b * transform.b + transform.f * transform.f + transform.j * transform.j); rScale += len = Number(Math.sqrt(transform.c * transform.c + transform.g * transform.g + transform.k * transform.k)); rScale /= 3; falloff = Number(Math.cos(spot.falloff * 0.5)); hotspot = Number(Math.cos(spot.hotspot * 0.5)); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Position"),transform.d,transform.h,transform.l); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Axis"),-transform.c / len,-transform.g / len,-transform.k / len); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Radius"),spot.attenuationEnd * rScale - spot.attenuationBegin * rScale,spot.attenuationBegin * rScale,hotspot == falloff ? 0.000001 : hotspot - falloff,falloff); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Color"),light.alternativa3d::red,light.alternativa3d::green,light.alternativa3d::blue); + drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Position"),transform.d,transform.h,transform.l); + drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Axis"),-transform.c / len,-transform.g / len,-transform.k / len); + drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Radius"),spot.attenuationEnd * rScale - spot.attenuationBegin * rScale,spot.attenuationBegin * rScale,hotspot == falloff ? 0.000001 : hotspot - falloff,falloff); + drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.lightID + "Color"),light.alternativa3d::red,light.alternativa3d::green,light.alternativa3d::blue); } if(directional != null) { - directional.shadow.applyShader(drawUnit,program,object,camera); + directional.shadow.setup(drawUnit,program.vertexShader,program.fragmentShader,surface); } i++; } @@ -541,15 +541,15 @@ package alternativa.tanks.game.entities.tank.graphics.materials drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cFogConsts"),0.5 * uScale,0.5 - uRight,0); drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sFogTexture"),fogTexture.alternativa3d::_texture); } - if(name_L4 || opacityMap != null || alpha < 1) + if(transparentPass || opacityMap != null || alpha < 1) { drawUnit.alternativa3d::blendSource = Context3DBlendFactor.SOURCE_ALPHA; drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.TRANSPARENT_SORT); + camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : Renderer.TRANSPARENT_SORT); } else { - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.OPAQUE); + camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : Renderer.OPAQUE); } } } diff --git a/src/alternativa/tanks/game/entities/tank/graphics/materials/TankMaterial2.as b/src/alternativa/tanks/game/entities/tank/graphics/materials/TankMaterial2.as deleted file mode 100644 index 058f2b7..0000000 --- a/src/alternativa/tanks/game/entities/tank/graphics/materials/TankMaterial2.as +++ /dev/null @@ -1,699 +0,0 @@ -package alternativa.tanks.game.entities.tank.graphics.materials -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.RenderPriority; - import alternativa.engine3d.core.Transform3D; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.lights.DirectionalLight; - import alternativa.engine3d.lights.OmniLight; - import alternativa.engine3d.materials.A3DUtils; - import alternativa.engine3d.materials.Material; - import alternativa.engine3d.materials.ShaderProgram; - import alternativa.engine3d.materials.TextureMaterial; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.materials.compiler.VariableType; - import alternativa.engine3d.objects.Surface; - import alternativa.engine3d.resources.BitmapTextureResource; - import alternativa.engine3d.resources.Geometry; - import alternativa.engine3d.resources.TextureResource; - import alternativa.engine3d.shadows.DirectionalShadowRenderer; - import alternativa.engine3d.shadows.ShadowRenderer; - import flash.display.BitmapData; - import flash.display3D.Context3DBlendFactor; - import flash.display3D.Context3DProgramType; - import flash.display3D.VertexBuffer3D; - import flash.utils.Dictionary; - import flash.utils.getDefinitionByName; - import flash.utils.getQualifiedClassName; - - use namespace alternativa3d; - - public class TankMaterial2 extends TextureMaterial - { - private static var fogTexture:TextureResource; - - public static const DISABLED:int = 0; - - public static const SIMPLE:int = 1; - - public static const ADVANCED:int = 2; - - public static var fogMode:int = DISABLED; - - public static var fogNear:Number = 1000; - - public static var fogFar:Number = 5000; - - public static var fogMaxDensity:Number = 1; - - public static var fogColorR:Number = 200 / 255; - - public static var fogColorG:Number = 162 / 255; - - public static var fogColorB:Number = 200 / 255; - - private static const passSimpleFogConstProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogSpace","dp4 t0.z, i0, c0","mov v0, t0.zzzz","sub v0.y, i0.w, t0.z"],"passSimpleFogConst"); - - private static const outputWithSimpleFogProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogColor","#c1=cFogRange","min t0.xy, v0.xy, c1.xy","max t0.xy, t0.xy, c1.zw","mul t1.xyz, c0.xyz, t0.x","mov t1.w, t0.y","mov o0, t1"],"outputWithSimpleFog"); - - private static const postPassAdvancedFogConstProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogSpace","dp4 t0.z, i0, c0","mov v0, t0.zzzz","sub v0.y, i0.w, t0.z","mov v0.zw, i1.xwxw","mov o0, i1"],"postPassAdvancedFogConst"); - - private static const outputWithAdvancedFogProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogConsts","#c1=cFogRange","#s0=sFogTexture","min t0.xy, v0.xy, c1.xy","max t0.xy, t0.xy, c1.zw","mov t1.xyzw, c0.yyzw","div t0.z, v0.z, v0.w","mul t0.z, t0.z, c0.x","add t1.x, t1.x, t0.z","tex t1, t1, s0 <2d, repeat, linear, miplinear>","mul t1.xyz, t1.xyz, t0.x","mov t1.w, t0.y","mov o0, t1"],"outputWithAdvancedFog"); - - private static const objectsProgramsSets:Dictionary = new Dictionary(); - - private static const lightContainer:Vector. = new Vector.(1,true); - - private static const actualLigths:Vector. = new Vector.(); - - private static const passUVProcedure:Procedure = new Procedure(["#a0=aUV","#v0=vUV","mov v0, a0"],"passUVProcedure"); - - private static const diffuseProcedure:Procedure = Procedure.compileFromArray(["#v0=vUV","#c0=cTiling","#s0=sColormap","#s1=sDiffuse","#s2=sSurface","mul t0, v0, c0","tex t1, t0, s0 <2d, repeat, linear, miplinear>","tex t0, v0, s1 <2d, clamp, linear, miplinear>","add t2, t0, t0","mul t2, t2, t1","tex t1, v0, s2 <2d, clamp, linear, miplinear>","mul t2, t2, t1.x","add t2, t2, t0","mul t0, t0, t1.x","sub o0, t2, t0"],"diffuse"); - - private static const setColorProcedure:Procedure = new Procedure(["mov o0, i0"],"setColorProcedure"); - - private static const outputWithLightProcedure:Procedure = new Procedure(["mul t0.xyz, i0.xyz, i1.xyz","mov t0.w, i1.w","mov o0, t0"],"outputWithLightProcedure"); - - private static const outputProcedure:Procedure = new Procedure(["mov o0, i0"],"outputProcedure"); - - private static const passVaryingsProcedure:Procedure = new Procedure(["#c0=cCamera","#v0=vPosition","#v1=vViewVector","mov v0, i0","sub t0, c0, i0","mov v1.xyz, t0.xyz","mov v1.w, c0.w"],"passVaryingsProcedure"); - - private static const getNormalAndViewProcedure:Procedure = new Procedure(["#v0=vUV","#v1=vViewVector","#c0=cSurface","#s0=sBump","tex t0, v0, s0 <2d,clamp,linear,miplinear>","add t0, t0, t0","sub t0.xyz, t0.xyz, c0.www","neg t0.y, t0.y","nrm o0.xyz, t0.xyz","nrm o1.xyz, v1"],"getNormalAndViewProcedure"); - - private static const getSpecularOptionsProcedure:Procedure = new Procedure(["#v0=vUV","#c0=cSurface","#s0=sSurface","tex t0, v0, s0 <2d, clamp, linear, miplinear>","mul i0.w, c0.y, t0.z","mul i1.w, c0.z, t0.y"],"getSpecularOptionsProcedure"); - - public var diffuse:TextureResource; - - public var colorMap:TextureResource; - - public var surfaceMap:TextureResource; - - public var name_jM:Number = 1; - - public var name_Sf:Number = 1; - - public var normalMap:TextureResource; - - public var glossiness:Number = 100; - - public var name_kj:Number = 1; - - private const outputWithSpecularProcedure:Procedure = new Procedure(["mul t0.xyz, i0.xyz, i1.xyz","add t0.xyz, t0.xyz, i2.xyz","mov t0.w, i1.w","mov o0, t0"],"outputWithSpecularProcedure"); - - public function TankMaterial2(colorMap:TextureResource = null, diffuse:TextureResource = null, normalMap:TextureResource = null, surfaceMap:TextureResource = null) - { - super(); - this.colorMap = colorMap; - this.diffuse = diffuse; - this.normalMap = normalMap; - this.surfaceMap = surfaceMap; - } - - public static function setFogTexture(texture:TextureResource) : void - { - fogTexture = texture; - } - - private static function directionalProcedure(light:Light3D, add:Boolean) : Procedure - { - return new Procedure(["#c0=c" + light.name_oG + "Direction","#c1=c" + light.name_oG + "Color","add t0.xyz, i1.xyz, c0.xyz","nrm t0.xyz, t0.xyz","dp3 t0.w, t0.xyz, i0.xyz","pow t0.w, t0.w, i0.w","mul t0.w, t0.w, i1.w","dp3 t0.x, i0.xyz, c0.xyz","sat t0.x, t0.x",add ? "mul t0.xyz, c1.xyz, t0.x" : "mul o0.xyz, c1.xyz, t0.x",add ? "add o0.xyz, o0.xyz, t0.xyz" : "mov o0.w, c0.w",add ? "mul t0.xyz, c1.xyz, t0.w" : "mul o1.xyz, c1.xyz, t0.w",add ? "add o1.xyz, o1.xyz, t0.xyz" : "mov o1.w, c0.w"],"directionalProcedure"); - } - - private static function omniProcedure(light:Light3D, add:Boolean) : Procedure - { - return new Procedure(["#c0=c" + light.name_oG + "Position","#c1=c" + light.name_oG + "Color","#c2=c" + light.name_oG + "Radius","#v0=vPosition","sub t0, c0, v0","dp3 t0.w, t0.xyz, t0.xyz","nrm t0.xyz, t0.xyz","add t1.xyz, i1.xyz, t0.xyz","mov t1.w, c0.w","nrm t1.xyz, t1.xyz","dp3 t1.w, t1.xyz, i0.xyz","pow t1.w, t1.w, i0.w","mul t1.w, t1.w, i1.w","sqt t1.x, t0.w","dp3 t0.w, t0.xyz, i0.xyz","sub t0.x, t1.x, c2.z","div t0.y, t0.x, c2.y","sub t0.x, c2.x, t0.y","sat t0.xw, t0.xw","mul t0.xyz, c1.xyz, t0.xxx",add ? "mul t1.xyz, t0.xyz, t0.w" : "mul o0.xyz, t0.xyz, t0.w",add ? "add o0.xyz, o0.xyz, t1.xyz" : "mov o0.w, c0.w",add ? "mul t1.xyz, t0.xyz, t1.w" : "mul o1.xyz, t0.xyz, t1.w",add ? "add o1.xyz, o1.xyz, t1.xyz" : "mov o1.w, c0.w"],"omniProcedure"); - } - - override alternativa3d function fillResources(resources:Dictionary, resourceType:Class) : void - { - super.alternativa3d::fillResources(resources,resourceType); - if(this.diffuse != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.diffuse)) as Class,resourceType))) - { - resources[this.diffuse] = true; - } - if(this.colorMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.colorMap)) as Class,resourceType))) - { - resources[this.colorMap] = true; - } - if(this.normalMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.normalMap)) as Class,resourceType))) - { - resources[this.normalMap] = true; - } - if(this.surfaceMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.surfaceMap)) as Class,resourceType))) - { - resources[this.surfaceMap] = true; - } - } - - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void - { - var i:int = 0; - var light:Light3D = null; - var shadowedLight:DirectionalLight = null; - var drawUnit:DrawUnit = null; - var shadowOrAmbientProgram:ShadowOrAmbientProgram = null; - var lightingProgram:LightingProgram = null; - var numShadows:int = 0; - var shadow:ShadowRenderer = null; - var lightsPrograms:Dictionary = null; - var fogProgram:FogProgram = null; - if(this.diffuse == null || this.colorMap == null || this.normalMap == null || this.surfaceMap == null || this.diffuse.alternativa3d::_texture == null || this.colorMap.alternativa3d::_texture == null || this.normalMap.alternativa3d::_texture == null || this.surfaceMap.alternativa3d::_texture == null) - { - return; - } - var object:Object3D = surface.alternativa3d::object; - var positionBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - var uvBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TEXCOORDS[0]); - if(positionBuffer == null || uvBuffer == null) - { - return; - } - var lightsKey:String = ""; - var actualLightsLength:int = 0; - for(i = 0; i < lightsLength; ) - { - light = lights[i]; - if(light is DirectionalLight && shadowedLight == null && DirectionalLight(light).shadow != null) - { - shadowedLight = DirectionalLight(light); - } - else if(actualLightsLength < 8 && (light is OmniLight || light is DirectionalLight)) - { - actualLigths[actualLightsLength] = light; - lightsKey += light.name_oG; - actualLightsLength++; - } - i++; - } - var programs:Array = objectsProgramsSets[object.alternativa3d::transformProcedure]; - if(programs == null) - { - programs = []; - objectsProgramsSets[object.alternativa3d::transformProcedure] = programs; - } - if(shadowedLight != null) - { - shadowOrAmbientProgram = programs[0]; - if(shadowOrAmbientProgram == null) - { - shadowOrAmbientProgram = this.setupShadowOrAmbient(object,shadowedLight.shadow,true); - shadowOrAmbientProgram.upload(camera.alternativa3d::context3D); - programs[0] = shadowOrAmbientProgram; - } - drawUnit = this.getShadowOrAmbientDrawUnit(shadowOrAmbientProgram,shadowedLight.shadow,true,camera,object,surface,geometry); - } - else - { - shadowOrAmbientProgram = programs[1]; - if(shadowOrAmbientProgram == null) - { - shadowOrAmbientProgram = this.setupShadowOrAmbient(object,null,true); - shadowOrAmbientProgram.upload(camera.alternativa3d::context3D); - programs[1] = shadowOrAmbientProgram; - } - drawUnit = this.getShadowOrAmbientDrawUnit(shadowOrAmbientProgram,null,true,camera,object,surface,geometry); - } - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.ONE; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ZERO; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,RenderPriority.TANK_OPAQUE); - if(shadowedLight != null) - { - numShadows = object.alternativa3d::shadowRenderers != null ? int(object.alternativa3d::shadowRenderers.length) : 0; - for(i = 0; i < numShadows; ) - { - shadow = object.alternativa3d::shadowRenderers[i]; - if(shadow is DirectionalShadowRenderer) - { - shadowOrAmbientProgram = programs[2]; - if(shadowOrAmbientProgram == null) - { - shadowOrAmbientProgram = this.setupShadowOrAmbient(object,shadow,false); - shadowOrAmbientProgram.upload(camera.alternativa3d::context3D); - programs[2] = shadowOrAmbientProgram; - } - drawUnit = this.getShadowOrAmbientDrawUnit(shadowOrAmbientProgram,shadow,false,camera,object,surface,geometry); - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.ZERO; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.SOURCE_COLOR; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,RenderPriority.SHADOWS); - } - i++; - } - lightingProgram = programs[3]; - if(lightingProgram == null) - { - lightContainer[0] = shadowedLight; - lightingProgram = this.setupLighting(object,lightContainer,1); - lightingProgram.upload(camera.alternativa3d::context3D); - programs[3] = lightingProgram; - } - drawUnit = this.getLightingDrawUnit(lightingProgram,lightContainer,1,camera,object,surface,geometry); - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.DESTINATION_ALPHA; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ONE; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,RenderPriority.SHADOWED_LIGHTS); - } - if(actualLightsLength > 0) - { - lightsPrograms = programs[4]; - if(lightsPrograms == null) - { - lightsPrograms = new Dictionary(false); - programs[4] = lightsPrograms; - } - lightingProgram = lightsPrograms[lightsKey]; - if(lightingProgram == null) - { - lightingProgram = this.setupLighting(object,actualLigths,actualLightsLength); - lightingProgram.upload(camera.alternativa3d::context3D); - lightsPrograms[lightsKey] = lightingProgram; - } - drawUnit = this.getLightingDrawUnit(lightingProgram,actualLigths,actualLightsLength,camera,object,surface,geometry); - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.ONE; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ONE; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,RenderPriority.LIGHTS); - } - if(fogMode == SIMPLE || fogMode == ADVANCED) - { - fogProgram = programs[int(fogMode + 4)]; - if(fogProgram == null) - { - fogProgram = this.setupFog(object); - fogProgram.upload(camera.alternativa3d::context3D); - programs[int(fogMode + 4)] = fogProgram; - } - drawUnit = this.getFogDrawUnit(fogProgram,camera,object,surface,geometry); - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.ONE; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.SOURCE_ALPHA; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,RenderPriority.FOG); - } - actualLigths.length = 0; - } - - private function setupShadowOrAmbient(object:Object3D, shadow:ShadowRenderer, ambient:Boolean) : ShadowOrAmbientProgram - { - var shadowProc:Procedure = null; - var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); - var fragmentLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); - var positionVar:String = "aPosition"; - vertexLinker.declareVariable(positionVar,VariableType.ATTRIBUTE); - if(object.alternativa3d::transformProcedure != null) - { - positionVar = alternativa3d::appendPositionTransformProcedure(object.alternativa3d::transformProcedure,vertexLinker); - } - vertexLinker.addProcedure(alternativa3d::_projectProcedure); - vertexLinker.setInputParams(alternativa3d::_projectProcedure,positionVar); - if(ambient) - { - vertexLinker.addProcedure(passUVProcedure); - } - var colorConst:String = ambient ? "cAmbient" : "cShadow"; - fragmentLinker.declareVariable(colorConst,VariableType.CONSTANT); - fragmentLinker.declareVariable("tLight"); - fragmentLinker.addProcedure(setColorProcedure); - fragmentLinker.setInputParams(setColorProcedure,colorConst); - fragmentLinker.setOutputParams(setColorProcedure,"tLight"); - if(shadow != null) - { - vertexLinker.addProcedure(shadow.getVShader()); - shadowProc = shadow.getFIntensityShader(); - fragmentLinker.addProcedure(shadowProc); - fragmentLinker.setOutputParams(shadowProc,"tLight"); - } - if(ambient) - { - fragmentLinker.declareVariable("tColor"); - fragmentLinker.addProcedure(diffuseProcedure); - fragmentLinker.setOutputParams(diffuseProcedure,"tColor"); - fragmentLinker.addProcedure(outputWithLightProcedure); - fragmentLinker.setInputParams(outputWithLightProcedure,"tColor","tLight"); - } - else - { - fragmentLinker.addProcedure(outputProcedure); - fragmentLinker.setInputParams(outputProcedure,"tLight"); - } - fragmentLinker.setOppositeLinker(vertexLinker); - return new ShadowOrAmbientProgram(vertexLinker,fragmentLinker); - } - - private function getShadowOrAmbientDrawUnit(program:ShadowOrAmbientProgram, shadow:ShadowRenderer, ambient:Boolean, camera:Camera3D, object:Object3D, surface:Surface, geometry:Geometry) : DrawUnit - { - var positionBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - var uvBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TEXCOORDS[0]); - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); - drawUnit.alternativa3d::setVertexBufferAt(program.aPosition,positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - if(ambient) - { - drawUnit.alternativa3d::setVertexBufferAt(program.aUV,uvBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[0]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[0]]); - } - object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); - drawUnit.alternativa3d::setProjectionConstants(camera,program.cProjMatrix,object.alternativa3d::localToCameraTransform); - if(ambient) - { - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.cAmbient,camera.alternativa3d::ambient[0],camera.alternativa3d::ambient[1],camera.alternativa3d::ambient[2],1); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.cTiling,this.name_jM,this.name_Sf,0,0); - drawUnit.alternativa3d::setTextureAt(program.sDiffuse,this.diffuse.alternativa3d::_texture); - drawUnit.alternativa3d::setTextureAt(program.sColormap,this.colorMap.alternativa3d::_texture); - drawUnit.alternativa3d::setTextureAt(program.sSurface,this.surfaceMap.alternativa3d::_texture); - } - else - { - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.cShadow,1,1,1,1); - } - if(shadow != null) - { - shadow.applyShader(drawUnit,program,object,camera); - } - return drawUnit; - } - - private function setupLighting(object:Object3D, lights:Vector., lightsLength:int) : LightingProgram - { - var procedure:Procedure = null; - var light:Light3D = null; - var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); - var fragmentLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); - var positionVar:String = "aPosition"; - vertexLinker.declareVariable(positionVar,VariableType.ATTRIBUTE); - if(object.alternativa3d::transformProcedure != null) - { - positionVar = alternativa3d::appendPositionTransformProcedure(object.alternativa3d::transformProcedure,vertexLinker); - } - vertexLinker.addProcedure(alternativa3d::_projectProcedure); - vertexLinker.setInputParams(alternativa3d::_projectProcedure,positionVar); - vertexLinker.addProcedure(passUVProcedure); - vertexLinker.addProcedure(passVaryingsProcedure); - vertexLinker.setInputParams(passVaryingsProcedure,positionVar); - fragmentLinker.declareVariable("tNormal"); - fragmentLinker.declareVariable("tView"); - fragmentLinker.addProcedure(getNormalAndViewProcedure); - fragmentLinker.setOutputParams(getNormalAndViewProcedure,"tNormal","tView"); - fragmentLinker.addProcedure(getSpecularOptionsProcedure); - fragmentLinker.setInputParams(getSpecularOptionsProcedure,"tNormal","tView"); - fragmentLinker.declareVariable("tLight"); - fragmentLinker.declareVariable("tHLight"); - var first:Boolean = true; - for(var i:int = 0; i < lightsLength; ) - { - light = lights[i]; - if(light is DirectionalLight) - { - procedure = directionalProcedure(light,!first); - fragmentLinker.addProcedure(procedure); - fragmentLinker.setInputParams(procedure,"tNormal","tView"); - fragmentLinker.setOutputParams(procedure,"tLight","tHLight"); - if(first) - { - first = false; - } - } - else if(light is OmniLight) - { - procedure = omniProcedure(light,!first); - fragmentLinker.addProcedure(procedure); - fragmentLinker.setInputParams(procedure,"tNormal","tView"); - fragmentLinker.setOutputParams(procedure,"tLight","tHLight"); - if(first) - { - first = false; - } - } - i++; - } - fragmentLinker.declareVariable("outColor"); - fragmentLinker.addProcedure(diffuseProcedure); - fragmentLinker.setOutputParams(diffuseProcedure,"outColor"); - fragmentLinker.addProcedure(this.outputWithSpecularProcedure); - fragmentLinker.setInputParams(this.outputWithSpecularProcedure,"outColor","tLight","tHLight"); - fragmentLinker.setOppositeLinker(vertexLinker); - return new LightingProgram(vertexLinker,fragmentLinker); - } - - private function getLightingDrawUnit(program:LightingProgram, lights:Vector., lightsLength:int, camera:Camera3D, object:Object3D, surface:Surface, geometry:Geometry) : DrawUnit - { - var rScale:Number = NaN; - var transform:Transform3D = null; - var light:Light3D = null; - var len:Number = NaN; - var omni:OmniLight = null; - var positionBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - var uvBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TEXCOORDS[0]); - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); - drawUnit.alternativa3d::setVertexBufferAt(program.aPosition,positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - drawUnit.alternativa3d::setVertexBufferAt(program.aUV,uvBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[0]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[0]]); - object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); - drawUnit.alternativa3d::setProjectionConstants(camera,program.cProjMatrix,object.alternativa3d::localToCameraTransform); - drawUnit.alternativa3d::setVertexConstantsFromNumbers(program.cCamera,object.alternativa3d::cameraToLocalTransform.d,object.alternativa3d::cameraToLocalTransform.h,object.alternativa3d::cameraToLocalTransform.l,1); - for(var i:int = 0; i < lightsLength; ) - { - light = lights[i]; - if(light is DirectionalLight) - { - transform = light.name_cl; - len = Number(Math.sqrt(transform.c * transform.c + transform.g * transform.g + transform.k * transform.k)); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Direction"),-transform.c / len,-transform.g / len,-transform.k / len,1); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Color"),light.alternativa3d::red,light.alternativa3d::green,light.alternativa3d::blue); - } - else if(light is OmniLight) - { - omni = OmniLight(light); - transform = light.name_cl; - rScale = Number(Math.sqrt(transform.a * transform.a + transform.e * transform.e + transform.i * transform.i)); - rScale += Math.sqrt(transform.b * transform.b + transform.f * transform.f + transform.j * transform.j); - rScale += Math.sqrt(transform.c * transform.c + transform.g * transform.g + transform.k * transform.k); - rScale /= 3; - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Position"),transform.d,transform.h,transform.l); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Radius"),1,omni.attenuationEnd * rScale - omni.attenuationBegin * rScale,omni.attenuationBegin * rScale); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Color"),light.alternativa3d::red,light.alternativa3d::green,light.alternativa3d::blue); - } - i++; - } - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.cSurface,0,this.glossiness,this.name_kj,1); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.cTiling,this.name_jM,this.name_Sf,0,0); - drawUnit.alternativa3d::setTextureAt(program.sDiffuse,this.diffuse.alternativa3d::_texture); - drawUnit.alternativa3d::setTextureAt(program.sColormap,this.colorMap.alternativa3d::_texture); - drawUnit.alternativa3d::setTextureAt(program.sSurface,this.surfaceMap.alternativa3d::_texture); - drawUnit.alternativa3d::setTextureAt(program.sBump,this.normalMap.alternativa3d::_texture); - return drawUnit; - } - - private function setupFog(object:Object3D) : FogProgram - { - var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); - var fragmentLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); - var positionVar:String = "aPosition"; - vertexLinker.declareVariable(positionVar,VariableType.ATTRIBUTE); - if(object.alternativa3d::transformProcedure != null) - { - positionVar = alternativa3d::appendPositionTransformProcedure(object.alternativa3d::transformProcedure,vertexLinker); - } - vertexLinker.addProcedure(alternativa3d::_projectProcedure); - vertexLinker.setInputParams(alternativa3d::_projectProcedure,positionVar); - if(fogMode == SIMPLE) - { - vertexLinker.addProcedure(passSimpleFogConstProcedure); - vertexLinker.setInputParams(passSimpleFogConstProcedure,positionVar); - fragmentLinker.addProcedure(outputWithSimpleFogProcedure); - } - else - { - vertexLinker.declareVariable("projected"); - vertexLinker.setOutputParams(alternativa3d::_projectProcedure,"projected"); - vertexLinker.addProcedure(postPassAdvancedFogConstProcedure); - vertexLinker.setInputParams(postPassAdvancedFogConstProcedure,positionVar,"projected"); - fragmentLinker.addProcedure(outputWithAdvancedFogProcedure); - } - fragmentLinker.setOppositeLinker(vertexLinker); - return new FogProgram(vertexLinker,fragmentLinker); - } - - private function getFogDrawUnit(program:FogProgram, camera:Camera3D, object:Object3D, surface:Surface, geometry:Geometry) : DrawUnit - { - var lm:Transform3D = null; - var dist:Number = NaN; - var cLocal:Transform3D = null; - var halfW:Number = NaN; - var leftX:Number = NaN; - var leftY:Number = NaN; - var rightX:Number = NaN; - var rightY:Number = NaN; - var angle:Number = NaN; - var dx:Number = NaN; - var dy:Number = NaN; - var lens:Number = NaN; - var uScale:Number = NaN; - var uRight:Number = NaN; - var bmd:BitmapData = null; - var i:int = 0; - var positionBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); - drawUnit.alternativa3d::setVertexBufferAt(program.aPosition,positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); - drawUnit.alternativa3d::setProjectionConstants(camera,program.cProjMatrix,object.alternativa3d::localToCameraTransform); - if(fogMode == SIMPLE || fogMode == ADVANCED) - { - lm = object.alternativa3d::localToCameraTransform; - dist = fogFar - fogNear; - drawUnit.alternativa3d::setVertexConstantsFromNumbers(program.cFogSpace,lm.i / dist,lm.j / dist,lm.k / dist,(lm.l - fogNear) / dist); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.cFogRange,fogMaxDensity,1,0,1 - fogMaxDensity); - } - if(fogMode == SIMPLE) - { - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.cFogColor,fogColorR,fogColorG,fogColorB); - } - if(fogMode == ADVANCED) - { - if(fogTexture == null) - { - bmd = new BitmapData(32,1,false,16711680); - for(i = 0; i < 32; i++) - { - bmd.setPixel(i,0,i / 32 * 255 << 16); - } - fogTexture = new BitmapTextureResource(bmd); - fogTexture.upload(camera.alternativa3d::context3D); - } - cLocal = camera.alternativa3d::localToGlobalTransform; - halfW = camera.view.width / 2; - leftX = -halfW * cLocal.a + camera.alternativa3d::focalLength * cLocal.c; - leftY = -halfW * cLocal.e + camera.alternativa3d::focalLength * cLocal.g; - rightX = halfW * cLocal.a + camera.alternativa3d::focalLength * cLocal.c; - rightY = halfW * cLocal.e + camera.alternativa3d::focalLength * cLocal.g; - angle = Math.atan2(leftY,leftX) - Math.PI / 2; - if(angle < 0) - { - angle += Math.PI * 2; - } - dx = rightX - leftX; - dy = rightY - leftY; - lens = Number(Math.sqrt(dx * dx + dy * dy)); - leftX /= lens; - leftY /= lens; - rightX /= lens; - rightY /= lens; - uScale = Math.acos(leftX * rightX + leftY * rightY) / Math.PI / 2; - uRight = angle / Math.PI / 2; - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.cFogConsts,0.5 * uScale,0.5 - uRight,0); - drawUnit.alternativa3d::setTextureAt(program.sFogTexture,fogTexture.alternativa3d::_texture); - } - return drawUnit; - } - - override public function clone() : Material - { - var cloned:TankMaterial2 = new TankMaterial2(this.colorMap,this.diffuse,this.normalMap,this.surfaceMap); - cloned.name_kj = this.name_kj; - cloned.glossiness = this.glossiness; - return cloned; - } - } -} - -import alternativa.engine3d.materials.ShaderProgram; -import alternativa.engine3d.materials.compiler.Linker; - -class ShadowOrAmbientProgram extends ShaderProgram -{ - public var aPosition:int; - - public var aUV:int; - - public var cProjMatrix:int; - - public var cAmbient:int; - - public var cTiling:int; - - public var sDiffuse:int; - - public var sColormap:int; - - public var sSurface:int; - - public var cShadow:int; - - public function ShadowOrAmbientProgram(vertex:Linker, fragment:Linker) - { - super(vertex,fragment); - this.aPosition = vertex.findVariable("aPosition"); - this.aUV = vertex.findVariable("aUV"); - this.cProjMatrix = vertex.findVariable("cProjMatrix"); - this.cAmbient = fragment.findVariable("cAmbient"); - this.cTiling = fragment.findVariable("cTiling"); - this.sDiffuse = fragment.findVariable("sDiffuse"); - this.sColormap = fragment.findVariable("sColormap"); - this.sSurface = fragment.findVariable("sSurface"); - this.cShadow = fragment.findVariable("cShadow"); - } -} - -class LightingProgram extends ShaderProgram -{ - public var aPosition:int; - - public var aUV:int; - - public var cProjMatrix:int; - - public var cCamera:int; - - public var cSurface:int; - - public var cTiling:int; - - public var sDiffuse:int; - - public var sColormap:int; - - public var sSurface:int; - - public var sBump:int; - - public function LightingProgram(vertex:Linker, fragment:Linker) - { - super(vertex,fragment); - this.aPosition = vertex.findVariable("aPosition"); - this.aUV = vertex.findVariable("aUV"); - this.cProjMatrix = vertex.findVariable("cProjMatrix"); - this.cCamera = vertex.findVariable("cCamera"); - this.cSurface = fragment.findVariable("cSurface"); - this.cTiling = fragment.findVariable("cTiling"); - this.sDiffuse = fragment.findVariable("sDiffuse"); - this.sColormap = fragment.findVariable("sColormap"); - this.sSurface = fragment.findVariable("sSurface"); - this.sBump = fragment.findVariable("sBump"); - } -} - -class FogProgram extends ShaderProgram -{ - public var aPosition:int; - - public var cProjMatrix:int; - - public var cFogSpace:int; - - public var cFogRange:int; - - public var cFogColor:int; - - public var cFogConsts:int; - - public var sFogTexture:int; - - public function FogProgram(vertex:Linker, fragment:Linker) - { - super(vertex,fragment); - this.aPosition = vertex.findVariable("aPosition"); - this.cProjMatrix = vertex.findVariable("cProjMatrix"); - this.cFogSpace = vertex.findVariable("cFogSpace"); - this.cFogRange = fragment.findVariable("cFogRange"); - this.cFogColor = fragment.findVariable("cFogColor"); - this.cFogConsts = fragment.findVariable("cFogConsts"); - this.sFogTexture = fragment.findVariable("sFogTexture"); - } -} diff --git a/src/alternativa/tanks/game/entities/tank/graphics/materials/TracksMaterial2.as b/src/alternativa/tanks/game/entities/tank/graphics/materials/TracksMaterial2.as deleted file mode 100644 index bff5774..0000000 --- a/src/alternativa/tanks/game/entities/tank/graphics/materials/TracksMaterial2.as +++ /dev/null @@ -1,593 +0,0 @@ -package alternativa.tanks.game.entities.tank.graphics.materials -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.Object3D; - import alternativa.engine3d.core.RenderPriority; - import alternativa.engine3d.core.Transform3D; - import alternativa.engine3d.core.VertexAttributes; - import alternativa.engine3d.lights.DirectionalLight; - import alternativa.engine3d.lights.OmniLight; - import alternativa.engine3d.materials.A3DUtils; - import alternativa.engine3d.materials.Material; - import alternativa.engine3d.materials.ShaderProgram; - import alternativa.engine3d.materials.TextureMaterial; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.materials.compiler.VariableType; - import alternativa.engine3d.objects.Surface; - import alternativa.engine3d.resources.BitmapTextureResource; - import alternativa.engine3d.resources.Geometry; - import alternativa.engine3d.resources.TextureResource; - import alternativa.engine3d.shadows.DirectionalShadowRenderer; - import alternativa.engine3d.shadows.ShadowRenderer; - import flash.display.BitmapData; - import flash.display3D.Context3DBlendFactor; - import flash.display3D.Context3DProgramType; - import flash.display3D.VertexBuffer3D; - import flash.utils.Dictionary; - import flash.utils.getDefinitionByName; - import flash.utils.getQualifiedClassName; - - use namespace alternativa3d; - - public class TracksMaterial2 extends TextureMaterial - { - private static var fogTexture:TextureResource; - - public static const DISABLED:int = 0; - - public static const SIMPLE:int = 1; - - public static const ADVANCED:int = 2; - - public static var fogMode:int = DISABLED; - - public static var fogNear:Number = 1000; - - public static var fogFar:Number = 5000; - - public static var fogMaxDensity:Number = 1; - - public static var fogColorR:Number = 200 / 255; - - public static var fogColorG:Number = 162 / 255; - - public static var fogColorB:Number = 200 / 255; - - private static const passSimpleFogConstProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogSpace","dp4 t0.z, i0, c0","mov v0, t0.zzzz","sub v0.y, i0.w, t0.z"],"passSimpleFogConst"); - - private static const outputWithSimpleFogProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogColor","#c1=cFogRange","min t0.xy, v0.xy, c1.xy","max t0.xy, t0.xy, c1.zw","mul t1.xyz, c0.xyz, t0.x","mov t1.w, t0.y","mov o0, t1"],"outputWithSimpleFog"); - - private static const postPassAdvancedFogConstProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogSpace","dp4 t0.z, i0, c0","mov v0, t0.zzzz","sub v0.y, i0.w, t0.z","mov v0.zw, i1.xwxw","mov o0, i1"],"postPassAdvancedFogConst"); - - private static const outputWithAdvancedFogProcedure:Procedure = new Procedure(["#v0=vZDistance","#c0=cFogConsts","#c1=cFogRange","#s0=sFogTexture","min t0.xy, v0.xy, c1.xy","max t0.xy, t0.xy, c1.zw","mov t1.xyzw, c0.yyzw","div t0.z, v0.z, v0.w","mul t0.z, t0.z, c0.x","add t1.x, t1.x, t0.z","tex t1, t1, s0 <2d, repeat, linear, miplinear>","mul t1.xyz, t1.xyz, t0.x","mov t1.w, t0.y","mov o0, t1"],"outputWithAdvancedFog"); - - private static const objectsProgramsSets:Dictionary = new Dictionary(); - - private static const lightContainer:Vector. = new Vector.(1,true); - - private static const actualLigths:Vector. = new Vector.(); - - private static const passUVProcedure:Procedure = Procedure.compileFromArray(["#a0=aUV","#v0=vUV","#c0=cUVOffsets","add v0, a0, c0"]); - - private static const diffuseProcedure:Procedure = Procedure.compileFromArray(["#v0=vUV","#s0=sDiffuse","tex t0, v0, s0 <2d, repeat, linear, miplinear>","mov o0, t0"],"diffuse"); - - private static const setColorProcedure:Procedure = new Procedure(["mov o0, i0"],"setColorProcedure"); - - private static const outputWithLightProcedure:Procedure = new Procedure(["mul t0.xyz, i0.xyz, i1.xyz","mov t0.w, i1.w","mov o0, t0"],"outputWithLightProcedure"); - - private static const outputProcedure:Procedure = new Procedure(["mov o0, i0"],"outputProcedure"); - - private static const passVaryingsProcedure:Procedure = new Procedure(["#c0=cCamera","#v0=vPosition","#v1=vViewVector","mov v0, i0","sub t0, c0, i0","mov v1.xyz, t0.xyz","mov v1.w, c0.w"],"passVaryingsProcedure"); - - private static const passTBNRightProcedure:Procedure = getPassTBNProcedure(true); - - private static const passTBNLeftProcedure:Procedure = getPassTBNProcedure(false); - - private static const getNormalAndViewProcedure:Procedure = new Procedure(["#v0=vTangent","#v1=vBinormal","#v2=vNormal","#v3=vUV","#v4=vViewVector","#c0=cSurface","#s0=sBump","tex t0, v3, s0 <2d,repeat,linear,miplinear>","add t0, t0, t0","sub t0.xyz, t0.xyz, c0.www","nrm t1.xyz, v0.xyz","dp3 o0.x, t0.xyz, t1.xyz","nrm t1.xyz, v1.xyz","dp3 o0.y, t0.xyz, t1.xyz","nrm t1.xyz, v2.xyz","dp3 o0.z, t0.xyz, t1.xyz","nrm o0.xyz, o0.xyz","nrm o1.xyz, v4"],"getNormalAndViewProcedure"); - - private static const getSpecularOptionsConstProcedure:Procedure = new Procedure(["#c0=cSurface","mov i0.w, c0.y","mov i1.w, c0.z"],"getSpecularOptionsConstProcedure"); - - public var uOffset:Number = 0; - - public var vOffset:Number = 0; - - public var normalMap:TextureResource; - - public var glossiness:Number = 100; - - public var name_kj:Number = 1; - - private const outputWithSpecularProcedure:Procedure = new Procedure(["mul t0.xyz, i0.xyz, i1.xyz","add t0.xyz, t0.xyz, i2.xyz","mov t0.w, i1.w","mov o0, t0"],"outputWithSpecularProcedure"); - - public function TracksMaterial2(diffuse:TextureResource = null, normalMap:TextureResource = null) - { - super(); - this.diffuseMap = diffuse; - this.normalMap = normalMap; - } - - public static function setFogTexture(texture:TextureResource) : void - { - fogTexture = texture; - } - - private static function getPassTBNProcedure(right:Boolean) : Procedure - { - var crsInSpace:String = right ? "crs t1.xyz, i0, i1" : "crs t1.xyz, i1, i0"; - return new Procedure(["#v0=vTangent","#v1=vBinormal","#v2=vNormal",crsInSpace,"mul t1.xyz, t1.xyz, i0.w","mov v0.x, i0.x","mov v0.y, t1.x","mov v0.z, i1.x","mov v0.w, i1.w","mov v1.x, i0.y","mov v1.y, t1.y","mov v1.z, i1.y","mov v1.w, i1.w","mov v2.x, i0.z","mov v2.y, t1.z","mov v2.z, i1.z","mov v2.w, i1.w"],"passTBNProcedure"); - } - - private static function directionalProcedure(light:Light3D, add:Boolean) : Procedure - { - return new Procedure(["#c0=c" + light.name_oG + "Direction","#c1=c" + light.name_oG + "Color","add t0.xyz, i1.xyz, c0.xyz","nrm t0.xyz, t0.xyz","dp3 t0.w, t0.xyz, i0.xyz","pow t0.w, t0.w, i0.w","mul t0.w, t0.w, i1.w","dp3 t0.x, i0.xyz, c0.xyz","sat t0.x, t0.x",add ? "mul t0.xyz, c1.xyz, t0.x" : "mul o0.xyz, c1.xyz, t0.x",add ? "add o0.xyz, o0.xyz, t0.xyz" : "mov o0.w, c0.w",add ? "mul t0.xyz, c1.xyz, t0.w" : "mul o1.xyz, c1.xyz, t0.w",add ? "add o1.xyz, o1.xyz, t0.xyz" : "mov o1.w, c0.w"],"directionalProcedure"); - } - - private static function omniProcedure(light:Light3D, add:Boolean) : Procedure - { - return new Procedure(["#c0=c" + light.name_oG + "Position","#c1=c" + light.name_oG + "Color","#c2=c" + light.name_oG + "Radius","#v0=vPosition","sub t0, c0, v0","dp3 t0.w, t0.xyz, t0.xyz","nrm t0.xyz, t0.xyz","add t1.xyz, i1.xyz, t0.xyz","mov t1.w, c0.w","nrm t1.xyz, t1.xyz","dp3 t1.w, t1.xyz, i0.xyz","pow t1.w, t1.w, i0.w","mul t1.w, t1.w, i1.w","sqt t1.x, t0.w","dp3 t0.w, t0.xyz, i0.xyz","sub t0.x, t1.x, c2.z","div t0.y, t0.x, c2.y","sub t0.x, c2.x, t0.y","sat t0.xw, t0.xw","mul t0.xyz, c1.xyz, t0.xxx",add ? "mul t1.xyz, t0.xyz, t0.w" : "mul o0.xyz, t0.xyz, t0.w",add ? "add o0.xyz, o0.xyz, t1.xyz" : "mov o0.w, c0.w",add ? "mul t1.xyz, t0.xyz, t1.w" : "mul o1.xyz, t0.xyz, t1.w",add ? "add o1.xyz, o1.xyz, t1.xyz" : "mov o1.w, c0.w"],"omniProcedure"); - } - - override alternativa3d function fillResources(resources:Dictionary, resourceType:Class) : void - { - super.alternativa3d::fillResources(resources,resourceType); - if(diffuseMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(diffuseMap)) as Class,resourceType))) - { - resources[diffuseMap] = true; - } - if(this.normalMap != null && Boolean(A3DUtils.alternativa3d::checkParent(getDefinitionByName(getQualifiedClassName(this.normalMap)) as Class,resourceType))) - { - resources[this.normalMap] = true; - } - } - - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void - { - var i:int = 0; - var light:Light3D = null; - var shadowedLight:DirectionalLight = null; - var drawUnit:DrawUnit = null; - var program:ShaderProgram = null; - var numShadows:int = 0; - var shadow:ShadowRenderer = null; - var lightsPrograms:Dictionary = null; - if(diffuseMap == null || this.normalMap == null || diffuseMap.alternativa3d::_texture == null || this.normalMap.alternativa3d::_texture == null) - { - return; - } - var object:Object3D = surface.alternativa3d::object; - var positionBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - var uvBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TEXCOORDS[0]); - var tangentBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TANGENT4); - var normalBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.NORMAL); - if(positionBuffer == null || uvBuffer == null || tangentBuffer == null || normalBuffer == null) - { - return; - } - var lightsKey:String = ""; - var actualLightsLength:int = 0; - for(i = 0; i < lightsLength; ) - { - light = lights[i]; - if(light is DirectionalLight && shadowedLight == null && DirectionalLight(light).shadow != null) - { - shadowedLight = DirectionalLight(light); - } - else if(actualLightsLength < 8 && (light is OmniLight || light is DirectionalLight)) - { - actualLigths[actualLightsLength] = light; - lightsKey += light.name_oG; - actualLightsLength++; - } - i++; - } - var programs:Array = objectsProgramsSets[object.alternativa3d::transformProcedure]; - if(programs == null) - { - programs = []; - objectsProgramsSets[object.alternativa3d::transformProcedure] = programs; - } - if(shadowedLight != null) - { - program = programs[0]; - if(program == null) - { - program = this.setupShadowOrAmbient(object,shadowedLight.shadow,true); - program.upload(camera.alternativa3d::context3D); - programs[0] = program; - } - drawUnit = this.getShadowOrAmbientDrawUnit(program,shadowedLight.shadow,true,camera,object,surface,geometry); - } - else - { - program = programs[1]; - if(program == null) - { - program = this.setupShadowOrAmbient(object,null,true); - program.upload(camera.alternativa3d::context3D); - programs[1] = program; - } - drawUnit = this.getShadowOrAmbientDrawUnit(program,null,true,camera,object,surface,geometry); - } - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.ONE; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ZERO; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,RenderPriority.TANK_OPAQUE); - if(shadowedLight != null) - { - numShadows = object.alternativa3d::shadowRenderers != null ? int(object.alternativa3d::shadowRenderers.length) : 0; - for(i = 0; i < numShadows; ) - { - shadow = object.alternativa3d::shadowRenderers[i]; - if(shadow is DirectionalShadowRenderer) - { - program = programs[2]; - if(program == null) - { - program = this.setupShadowOrAmbient(object,shadow,false); - program.upload(camera.alternativa3d::context3D); - programs[2] = program; - } - drawUnit = this.getShadowOrAmbientDrawUnit(program,shadow,false,camera,object,surface,geometry); - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.ZERO; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.SOURCE_COLOR; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,RenderPriority.SHADOWS); - } - i++; - } - program = programs[3]; - if(program == null) - { - lightContainer[0] = shadowedLight; - program = this.setupLighting(object,lightContainer,1); - program.upload(camera.alternativa3d::context3D); - programs[3] = program; - } - drawUnit = this.getLightingDrawUnit(program,lightContainer,1,camera,object,surface,geometry); - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.DESTINATION_ALPHA; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ONE; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,RenderPriority.SHADOWED_LIGHTS); - } - if(actualLightsLength > 0) - { - lightsPrograms = programs[4]; - if(lightsPrograms == null) - { - lightsPrograms = new Dictionary(false); - programs[4] = lightsPrograms; - } - program = lightsPrograms[lightsKey]; - if(program == null) - { - program = this.setupLighting(object,actualLigths,actualLightsLength); - program.upload(camera.alternativa3d::context3D); - lightsPrograms[lightsKey] = program; - } - drawUnit = this.getLightingDrawUnit(program,actualLigths,actualLightsLength,camera,object,surface,geometry); - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.ONE; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ONE; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,RenderPriority.LIGHTS); - } - if(fogMode == SIMPLE || fogMode == ADVANCED) - { - program = programs[int(fogMode + 4)]; - if(program == null) - { - program = this.setupFog(object); - program.upload(camera.alternativa3d::context3D); - programs[int(fogMode + 4)] = program; - } - drawUnit = this.getFogDrawUnit(program,camera,object,surface,geometry); - drawUnit.alternativa3d::blendSource = Context3DBlendFactor.ONE; - drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.SOURCE_ALPHA; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,RenderPriority.FOG); - } - actualLigths.length = 0; - } - - private function setupShadowOrAmbient(object:Object3D, shadow:ShadowRenderer, ambient:Boolean) : ShaderProgram - { - var shadowProc:Procedure = null; - var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); - var fragmentLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); - var positionVar:String = "aPosition"; - vertexLinker.declareVariable(positionVar,VariableType.ATTRIBUTE); - if(object.alternativa3d::transformProcedure != null) - { - positionVar = alternativa3d::appendPositionTransformProcedure(object.alternativa3d::transformProcedure,vertexLinker); - } - vertexLinker.addProcedure(alternativa3d::_projectProcedure); - vertexLinker.setInputParams(alternativa3d::_projectProcedure,positionVar); - if(ambient) - { - vertexLinker.addProcedure(passUVProcedure); - } - var colorConst:String = ambient ? "cAmbient" : "cShadow"; - fragmentLinker.declareVariable(colorConst,VariableType.CONSTANT); - fragmentLinker.declareVariable("tLight"); - fragmentLinker.addProcedure(setColorProcedure); - fragmentLinker.setInputParams(setColorProcedure,colorConst); - fragmentLinker.setOutputParams(setColorProcedure,"tLight"); - if(shadow != null) - { - vertexLinker.addProcedure(shadow.getVShader()); - shadowProc = shadow.getFIntensityShader(); - fragmentLinker.addProcedure(shadowProc); - fragmentLinker.setOutputParams(shadowProc,"tLight"); - } - if(ambient) - { - fragmentLinker.declareVariable("tColor"); - fragmentLinker.addProcedure(diffuseProcedure); - fragmentLinker.setOutputParams(diffuseProcedure,"tColor"); - fragmentLinker.addProcedure(outputWithLightProcedure); - fragmentLinker.setInputParams(outputWithLightProcedure,"tColor","tLight"); - } - else - { - fragmentLinker.addProcedure(outputProcedure); - fragmentLinker.setInputParams(outputProcedure,"tLight"); - } - fragmentLinker.setOppositeLinker(vertexLinker); - return new ShaderProgram(vertexLinker,fragmentLinker); - } - - private function getShadowOrAmbientDrawUnit(program:ShaderProgram, shadow:ShadowRenderer, ambient:Boolean, camera:Camera3D, object:Object3D, surface:Surface, geometry:Geometry) : DrawUnit - { - var positionBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - var uvBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TEXCOORDS[0]); - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"),positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - if(ambient) - { - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aUV"),uvBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[0]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[0]]); - } - object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); - drawUnit.alternativa3d::setProjectionConstants(camera,program.vertexShader.getVariableIndex("cProjMatrix"),object.alternativa3d::localToCameraTransform); - if(ambient) - { - drawUnit.alternativa3d::setVertexConstantsFromNumbers(program.vertexShader.getVariableIndex("cUVOffsets"),-this.uOffset,this.vOffset,0,0); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cAmbient"),camera.alternativa3d::ambient[0],camera.alternativa3d::ambient[1],camera.alternativa3d::ambient[2],1); - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sDiffuse"),diffuseMap.alternativa3d::_texture); - } - else - { - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cShadow"),1,1,1,1); - } - if(shadow != null) - { - shadow.applyShader(drawUnit,program,object,camera); - } - return drawUnit; - } - - private function setupLighting(object:Object3D, lights:Vector., lightsLength:int) : ShaderProgram - { - var procedure:Procedure = null; - var light:Light3D = null; - var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); - var fragmentLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); - var positionVar:String = "aPosition"; - vertexLinker.declareVariable(positionVar,VariableType.ATTRIBUTE); - if(object.alternativa3d::transformProcedure != null) - { - positionVar = alternativa3d::appendPositionTransformProcedure(object.alternativa3d::transformProcedure,vertexLinker); - } - vertexLinker.addProcedure(alternativa3d::_projectProcedure); - vertexLinker.setInputParams(alternativa3d::_projectProcedure,positionVar); - vertexLinker.addProcedure(passUVProcedure); - vertexLinker.addProcedure(passVaryingsProcedure); - vertexLinker.setInputParams(passVaryingsProcedure,positionVar); - vertexLinker.declareVariable("aTangent",VariableType.ATTRIBUTE); - vertexLinker.declareVariable("aNormal",VariableType.ATTRIBUTE); - vertexLinker.addProcedure(passTBNRightProcedure); - vertexLinker.setInputParams(passTBNRightProcedure,"aTangent","aNormal"); - fragmentLinker.declareVariable("tNormal"); - fragmentLinker.declareVariable("tView"); - fragmentLinker.addProcedure(getNormalAndViewProcedure); - fragmentLinker.setOutputParams(getNormalAndViewProcedure,"tNormal","tView"); - fragmentLinker.addProcedure(getSpecularOptionsConstProcedure); - fragmentLinker.setInputParams(getSpecularOptionsConstProcedure,"tNormal","tView"); - fragmentLinker.declareVariable("tLight"); - fragmentLinker.declareVariable("tHLight"); - var first:Boolean = true; - for(var i:int = 0; i < lightsLength; ) - { - light = lights[i]; - if(light is DirectionalLight) - { - procedure = directionalProcedure(light,!first); - fragmentLinker.addProcedure(procedure); - fragmentLinker.setInputParams(procedure,"tNormal","tView"); - fragmentLinker.setOutputParams(procedure,"tLight","tHLight"); - if(first) - { - first = false; - } - } - else if(light is OmniLight) - { - procedure = omniProcedure(light,!first); - fragmentLinker.addProcedure(procedure); - fragmentLinker.setInputParams(procedure,"tNormal","tView"); - fragmentLinker.setOutputParams(procedure,"tLight","tHLight"); - if(first) - { - first = false; - } - } - i++; - } - fragmentLinker.declareVariable("outColor"); - fragmentLinker.addProcedure(diffuseProcedure); - fragmentLinker.setOutputParams(diffuseProcedure,"outColor"); - fragmentLinker.addProcedure(this.outputWithSpecularProcedure); - fragmentLinker.setInputParams(this.outputWithSpecularProcedure,"outColor","tLight","tHLight"); - fragmentLinker.setOppositeLinker(vertexLinker); - return new ShaderProgram(vertexLinker,fragmentLinker); - } - - private function getLightingDrawUnit(program:ShaderProgram, lights:Vector., lightsLength:int, camera:Camera3D, object:Object3D, surface:Surface, geometry:Geometry) : DrawUnit - { - var rScale:Number = NaN; - var transform:Transform3D = null; - var light:Light3D = null; - var len:Number = NaN; - var omni:OmniLight = null; - var positionBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - var uvBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TEXCOORDS[0]); - var tangentBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.TANGENT4); - var normalBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.NORMAL); - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"),positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aUV"),uvBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[0]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[0]]); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aTangent"),tangentBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TANGENT4],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TANGENT4]); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aNormal"),normalBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.NORMAL],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.NORMAL]); - object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); - drawUnit.alternativa3d::setProjectionConstants(camera,program.vertexShader.getVariableIndex("cProjMatrix"),object.alternativa3d::localToCameraTransform); - drawUnit.alternativa3d::setVertexConstantsFromNumbers(program.vertexShader.getVariableIndex("cCamera"),object.alternativa3d::cameraToLocalTransform.d,object.alternativa3d::cameraToLocalTransform.h,object.alternativa3d::cameraToLocalTransform.l,1); - drawUnit.alternativa3d::setVertexConstantsFromNumbers(program.vertexShader.getVariableIndex("cUVOffsets"),-this.uOffset,this.vOffset,0,0); - for(var i:int = 0; i < lightsLength; ) - { - light = lights[i]; - if(light is DirectionalLight) - { - transform = light.name_cl; - len = Number(Math.sqrt(transform.c * transform.c + transform.g * transform.g + transform.k * transform.k)); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Direction"),-transform.c / len,-transform.g / len,-transform.k / len,1); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Color"),light.alternativa3d::red,light.alternativa3d::green,light.alternativa3d::blue); - } - else if(light is OmniLight) - { - omni = OmniLight(light); - transform = light.name_cl; - rScale = Number(Math.sqrt(transform.a * transform.a + transform.e * transform.e + transform.i * transform.i)); - rScale += Math.sqrt(transform.b * transform.b + transform.f * transform.f + transform.j * transform.j); - rScale += Math.sqrt(transform.c * transform.c + transform.g * transform.g + transform.k * transform.k); - rScale /= 3; - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Position"),transform.d,transform.h,transform.l); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Radius"),1,omni.attenuationEnd * rScale - omni.attenuationBegin * rScale,omni.attenuationBegin * rScale); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("c" + light.name_oG + "Color"),light.alternativa3d::red,light.alternativa3d::green,light.alternativa3d::blue); - } - i++; - } - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cSurface"),0,this.glossiness,this.name_kj,1); - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sDiffuse"),diffuseMap.alternativa3d::_texture); - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sBump"),this.normalMap.alternativa3d::_texture); - return drawUnit; - } - - private function setupFog(object:Object3D) : ShaderProgram - { - var vertexLinker:Linker = new Linker(Context3DProgramType.VERTEX); - var fragmentLinker:Linker = new Linker(Context3DProgramType.FRAGMENT); - var positionVar:String = "aPosition"; - vertexLinker.declareVariable(positionVar,VariableType.ATTRIBUTE); - if(object.alternativa3d::transformProcedure != null) - { - positionVar = alternativa3d::appendPositionTransformProcedure(object.alternativa3d::transformProcedure,vertexLinker); - } - vertexLinker.addProcedure(alternativa3d::_projectProcedure); - vertexLinker.setInputParams(alternativa3d::_projectProcedure,positionVar); - if(fogMode == SIMPLE) - { - vertexLinker.addProcedure(passSimpleFogConstProcedure); - vertexLinker.setInputParams(passSimpleFogConstProcedure,positionVar); - fragmentLinker.addProcedure(outputWithSimpleFogProcedure); - } - else - { - vertexLinker.declareVariable("projected"); - vertexLinker.setOutputParams(alternativa3d::_projectProcedure,"projected"); - vertexLinker.addProcedure(postPassAdvancedFogConstProcedure); - vertexLinker.setInputParams(postPassAdvancedFogConstProcedure,positionVar,"projected"); - fragmentLinker.addProcedure(outputWithAdvancedFogProcedure); - } - fragmentLinker.setOppositeLinker(vertexLinker); - return new ShaderProgram(vertexLinker,fragmentLinker); - } - - private function getFogDrawUnit(program:ShaderProgram, camera:Camera3D, object:Object3D, surface:Surface, geometry:Geometry) : DrawUnit - { - var lm:Transform3D = null; - var dist:Number = NaN; - var cLocal:Transform3D = null; - var halfW:Number = NaN; - var leftX:Number = NaN; - var leftY:Number = NaN; - var rightX:Number = NaN; - var rightY:Number = NaN; - var angle:Number = NaN; - var dx:Number = NaN; - var dy:Number = NaN; - var lens:Number = NaN; - var uScale:Number = NaN; - var uRight:Number = NaN; - var bmd:BitmapData = null; - var i:int = 0; - var positionBuffer:VertexBuffer3D = geometry.alternativa3d::getVertexBuffer(VertexAttributes.POSITION); - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); - drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"),positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); - object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); - drawUnit.alternativa3d::setProjectionConstants(camera,program.vertexShader.getVariableIndex("cProjMatrix"),object.alternativa3d::localToCameraTransform); - if(fogMode == SIMPLE || fogMode == ADVANCED) - { - lm = object.alternativa3d::localToCameraTransform; - dist = fogFar - fogNear; - drawUnit.alternativa3d::setVertexConstantsFromNumbers(program.vertexShader.getVariableIndex("cFogSpace"),lm.i / dist,lm.j / dist,lm.k / dist,(lm.l - fogNear) / dist); - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cFogRange"),fogMaxDensity,1,0,1 - fogMaxDensity); - } - if(fogMode == SIMPLE) - { - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cFogColor"),fogColorR,fogColorG,fogColorB); - } - if(fogMode == ADVANCED) - { - if(fogTexture == null) - { - bmd = new BitmapData(32,1,false,16711680); - for(i = 0; i < 32; i++) - { - bmd.setPixel(i,0,i / 32 * 255 << 16); - } - fogTexture = new BitmapTextureResource(bmd); - fogTexture.upload(camera.alternativa3d::context3D); - } - cLocal = camera.alternativa3d::localToGlobalTransform; - halfW = camera.view.width / 2; - leftX = -halfW * cLocal.a + camera.alternativa3d::focalLength * cLocal.c; - leftY = -halfW * cLocal.e + camera.alternativa3d::focalLength * cLocal.g; - rightX = halfW * cLocal.a + camera.alternativa3d::focalLength * cLocal.c; - rightY = halfW * cLocal.e + camera.alternativa3d::focalLength * cLocal.g; - angle = Math.atan2(leftY,leftX) - Math.PI / 2; - if(angle < 0) - { - angle += Math.PI * 2; - } - dx = rightX - leftX; - dy = rightY - leftY; - lens = Number(Math.sqrt(dx * dx + dy * dy)); - leftX /= lens; - leftY /= lens; - rightX /= lens; - rightY /= lens; - uScale = Math.acos(leftX * rightX + leftY * rightY) / Math.PI / 2; - uRight = angle / Math.PI / 2; - drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cFogConsts"),0.5 * uScale,0.5 - uRight,0); - drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sFogTexture"),fogTexture.alternativa3d::_texture); - } - return drawUnit; - } - - override public function clone() : Material - { - var cloned:TracksMaterial2 = new TracksMaterial2(diffuseMap,this.normalMap); - cloned.name_kj = this.name_kj; - cloned.glossiness = this.glossiness; - return cloned; - } - } -} - diff --git a/src/alternativa/tanks/game/entities/tank/graphics/materials/TreesMaterial.as b/src/alternativa/tanks/game/entities/tank/graphics/materials/TreesMaterial.as deleted file mode 100644 index cba5d05..0000000 --- a/src/alternativa/tanks/game/entities/tank/graphics/materials/TreesMaterial.as +++ /dev/null @@ -1,152 +0,0 @@ -package alternativa.tanks.game.entities.tank.graphics.materials -{ - import alternativa.engine3d.alternativa3d; - import alternativa.engine3d.core.Camera3D; - import alternativa.engine3d.core.DrawUnit; - import alternativa.engine3d.core.Light3D; - import alternativa.engine3d.core.RenderPriority; - import alternativa.engine3d.materials.Material; - import alternativa.engine3d.materials.StandardMaterial; - import alternativa.engine3d.materials.compiler.Linker; - import alternativa.engine3d.materials.compiler.Procedure; - import alternativa.engine3d.objects.Surface; - import alternativa.engine3d.resources.Geometry; - import alternativa.engine3d.resources.TextureResource; - - use namespace alternativa3d; - - public class TreesMaterial extends StandardMaterial - { - public static const DISABLED:int = 0; - - public static const SIMPLE:int = 1; - - public static const ADVANCED:int = 2; - - private static const uvProcedure:Procedure = Procedure.compileFromArray(["#v0=vUV","#a0=aUV","#c0=cUVOffsets","add v0, a0, c0"]); - - public var alphaThreshold:Number = 1; - - public var uOffset:Number = 0; - - public var vOffset:Number = 0; - - public function TreesMaterial(diffuseMap:TextureResource = null, normalMap:TextureResource = null, specularMap:TextureResource = null, glossinessMap:TextureResource = null, opacityMap:TextureResource = null, alphaThreshold:Number = 1) - { - super(diffuseMap,normalMap,specularMap,glossinessMap,opacityMap); - alternativa3d::outputAlpha = new Procedure(["#c0=cSurface","sub t0.w, i0.w, c0.w","kil t0.w","mov o0, i0"],"outputAlpha"); - alternativa3d::outputDiffuseAlpha = alternativa3d::outputAlpha; - alternativa3d::outputOpacity = new Procedure(["#c0=cSurface","#s0=sOpacity","#v0=vUV","tex t0, v0, s0 <2d, repeat,linear,miplinear>","mov i0.w, t0.x","sub t0.x, t0.x, c0.w","kil t0.x","mov o0, i0"],"outputOpacity"); - this.alphaThreshold = alphaThreshold; - this.name_ES = true; - } - - public static function get fogMode() : int - { - return StandardMaterial.alternativa3d::fogMode; - } - - public static function set fogMode(value:int) : void - { - StandardMaterial.alternativa3d::fogMode = value; - } - - public static function get fogNear() : Number - { - return StandardMaterial.alternativa3d::fogNear; - } - - public static function set fogNear(value:Number) : void - { - StandardMaterial.alternativa3d::fogNear = value; - } - - public static function get fogFar() : Number - { - return StandardMaterial.alternativa3d::fogFar; - } - - public static function set fogFar(value:Number) : void - { - StandardMaterial.alternativa3d::fogFar = value; - } - - public static function get fogMaxDensity() : Number - { - return StandardMaterial.alternativa3d::fogMaxDensity; - } - - public static function set fogMaxDensity(value:Number) : void - { - StandardMaterial.alternativa3d::fogMaxDensity = value; - } - - public static function get fogColorR() : Number - { - return StandardMaterial.alternativa3d::fogColorR; - } - - public static function set fogColorR(value:Number) : void - { - StandardMaterial.alternativa3d::fogColorR = value; - } - - public static function get fogColorG() : Number - { - return StandardMaterial.alternativa3d::fogColorG; - } - - public static function set fogColorG(value:Number) : void - { - StandardMaterial.alternativa3d::fogColorG = value; - } - - public static function get fogColorB() : Number - { - return StandardMaterial.alternativa3d::fogColorB; - } - - public static function set fogColorB(value:Number) : void - { - StandardMaterial.alternativa3d::fogColorB = value; - } - - public static function setFogTexture(texture:TextureResource) : void - { - StandardMaterial.alternativa3d::fogTexture = texture; - } - - override alternativa3d function getPassUVProcedure() : Procedure - { - return uvProcedure; - } - - override alternativa3d function setPassUVProcedureConstants(destination:DrawUnit, vertexLinker:Linker) : void - { - destination.alternativa3d::setVertexConstantsFromNumbers(vertexLinker.getVariableIndex("cUVOffsets"),-this.uOffset,this.vOffset,0,0); - } - - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void - { - lightsLength = lightsLength > 5 ? 5 : lightsLength; - alpha = 1 - this.alphaThreshold; - super.alternativa3d::collectDraws(camera,surface,geometry,lights,lightsLength,RenderPriority.TANK_OPAQUE); - } - - override public function clone() : Material - { - var cloned:TreesMaterial = new TreesMaterial(diffuseMap,normalMap,specularMap,glossinessMap); - cloned.opacityMap = opacityMap; - cloned.alpha = alpha; - cloned.name_L4 = name_L4; - cloned.glossiness = glossiness; - cloned.name_kj = name_kj; - cloned.normalMapSpace = normalMapSpace; - cloned.uOffset = this.uOffset; - cloned.vOffset = this.vOffset; - cloned.alphaThreshold = this.alphaThreshold; - return cloned; - } - } -} - diff --git a/src/alternativa/tanks/game/subsystems/rendersystem/BlendedMaterial.as b/src/alternativa/tanks/game/subsystems/rendersystem/BlendedMaterial.as index b77b805..be1bc24 100644 --- a/src/alternativa/tanks/game/subsystems/rendersystem/BlendedMaterial.as +++ b/src/alternativa/tanks/game/subsystems/rendersystem/BlendedMaterial.as @@ -23,7 +23,7 @@ package alternativa.tanks.game.subsystems.rendersystem this.blendModeDestination = blendModeDestination; } - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void + override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, useShadow:Boolean, objectRenderPriority:int = -1) : void { } } diff --git a/src/alternativa/tanks/game/subsystems/rendersystem/RenderSystem.as b/src/alternativa/tanks/game/subsystems/rendersystem/RenderSystem.as index a0bba98..aa48994 100644 --- a/src/alternativa/tanks/game/subsystems/rendersystem/RenderSystem.as +++ b/src/alternativa/tanks/game/subsystems/rendersystem/RenderSystem.as @@ -20,7 +20,6 @@ package alternativa.tanks.game.subsystems.rendersystem import alternativa.tanks.game.entities.tank.graphics.materials.TankMaterial; import alternativa.tanks.game.entities.tank.graphics.materials.TankMaterial2; import alternativa.tanks.game.entities.tank.graphics.materials.TracksMaterial2; - import alternativa.tanks.game.entities.tank.graphics.materials.TreesMaterial; import alternativa.tanks.game.subsystems.inputsystem.IInput; import alternativa.tanks.game.subsystems.inputsystem.KeyboardEventType; import alternativa.tanks.game.utils.BitFlags; @@ -35,6 +34,7 @@ package alternativa.tanks.game.subsystems.rendersystem import flash.events.Event; import flash.geom.Vector3D; import flash.ui.Keyboard; + import alternativa.engine3d.materials.StandardMaterial; use namespace alternativa3d; @@ -106,10 +106,6 @@ package alternativa.tanks.game.subsystems.rendersystem private var resourceManager:ResourceManager; - private var name_aD:ShadowsSystem; - - private var staticShadowRenderer:StaticShadowRenderer; - private var name_pR:Vector.; private var name_MI:Vector.; @@ -150,8 +146,6 @@ package alternativa.tanks.game.subsystems.rendersystem this.rootContainer.addChild(this.particleSystem); this.axisIndicator = new AxisIndicator(100); this.resourceManager = new ResourceManager(); - this.name_aD = new ShadowsSystem(); - this.staticShadowRenderer = new StaticShadowRenderer(null,1024,4); this.name_pR = new Vector.(); this.rootContainer.addEventListener(MouseEvent3D.CLICK,this.onClick); } @@ -160,7 +154,7 @@ package alternativa.tanks.game.subsystems.rendersystem { if(e.target is Decal) { - trace(e.target,e.target.name,Decal(e.target).offset,e.target.scaleX,e.target.scaleY,e.target.scaleZ); + trace(e.target,e.target.name,e.target.scaleX,e.target.scaleY,e.target.scaleZ); } else { @@ -175,16 +169,13 @@ package alternativa.tanks.game.subsystems.rendersystem public function setFogMode(mode:int) : void { - MapMaterial.fogMode = mode; TankMaterial.fogMode = mode; - TankMaterial2.fogMode = mode; - TracksMaterial2.fogMode = mode; - TreesMaterial.fogMode = mode; + StandardMaterial.fogMode = mode; SkyMaterial.fogMode = mode; GiShadowMaterial.fogMode = mode; if(mode == 1) { - this.particleSystem.fogFar = MapMaterial.fogFar; + this.particleSystem.fogFar = StandardMaterial.fogFar; } else { @@ -194,33 +185,24 @@ package alternativa.tanks.game.subsystems.rendersystem public function setFogNear(value:Number) : void { - MapMaterial.fogNear = value; TankMaterial.fogNear = value; - TankMaterial2.fogNear = value; - TracksMaterial2.fogNear = value; - TreesMaterial.fogNear = value; + StandardMaterial.fogNear = value; GiShadowMaterial.fogNear = value; this.particleSystem.fogNear = value; } public function setFogFar(value:Number) : void { - MapMaterial.fogFar = value; TankMaterial.fogFar = value; - TankMaterial2.fogFar = value; - TracksMaterial2.fogFar = value; - TreesMaterial.fogFar = value; + StandardMaterial.fogFar = value; GiShadowMaterial.fogFar = value; this.particleSystem.fogFar = value; } public function setMaxFogDensity(value:Number) : void { - MapMaterial.fogMaxDensity = value; TankMaterial.fogMaxDensity = value; - TankMaterial2.fogMaxDensity = value; - TracksMaterial2.fogMaxDensity = value; - TreesMaterial.fogMaxDensity = value; + StandardMaterial.fogMaxDensity = value; SkyMaterial.fogMaxDensity = value; GiShadowMaterial.fogMaxDensity = value; this.particleSystem.fogMaxDensity = value; @@ -231,28 +213,19 @@ package alternativa.tanks.game.subsystems.rendersystem var r:Number = (color >> 16 & 0xFF) / 255; var g:Number = (color >> 8 & 0xFF) / 255; var b:Number = (color & 0xFF) / 255; - MapMaterial.fogColorR = r; - MapMaterial.fogColorG = g; - MapMaterial.fogColorB = b; TankMaterial.fogColorR = r; TankMaterial.fogColorG = g; TankMaterial.fogColorB = b; - TankMaterial2.fogColorR = r; - TankMaterial2.fogColorG = g; - TankMaterial2.fogColorB = b; - TracksMaterial2.fogColorR = r; - TracksMaterial2.fogColorG = g; - TracksMaterial2.fogColorB = b; - TreesMaterial.fogColorR = r; - TreesMaterial.fogColorG = g; - TreesMaterial.fogColorB = b; + StandardMaterial.fogColorR = r; + StandardMaterial.fogColorG = g; + StandardMaterial.fogColorB = b; SkyMaterial.fogColorR = r; SkyMaterial.fogColorG = g; SkyMaterial.fogColorB = b; GiShadowMaterial.fogColorR = r; GiShadowMaterial.fogColorG = g; GiShadowMaterial.fogColorB = b; - this.particleSystem.name_IN = color; + this.particleSystem.fogColor = color; } public function setFogHorizonSize(value:Number) : void @@ -291,12 +264,9 @@ package alternativa.tanks.game.subsystems.rendersystem } this.name_Qk = new BitmapTextureResource(bitmapData); this.useResource(this.name_Qk); - MapMaterial.setFogTexture(this.name_Qk); TankMaterial.setFogTexture(this.name_Qk); - TankMaterial2.setFogTexture(this.name_Qk); GiShadowMaterial.setFogTexture(this.name_Qk); - TracksMaterial2.setFogTexture(this.name_Qk); - TreesMaterial.setFogTexture(this.name_Qk); + StandardMaterial.fogTexture = this.name_Qk; SkyMaterial.setFogTexture(this.name_Qk); } @@ -353,11 +323,6 @@ package alternativa.tanks.game.subsystems.rendersystem } } - public function getShadowSystem() : ShadowsSystem - { - return this.name_aD; - } - public function setAntialiasing(value:int) : void { this.view.antiAlias = value; @@ -368,27 +333,6 @@ package alternativa.tanks.game.subsystems.rendersystem return this.view.antiAlias; } - public function addShadowRenderer(renderer:ShadowRenderer) : void - { - if(renderer == null) - { - throw new ArgumentError("Parameter renderer is null"); - } - if(this.name_aD.renderers.indexOf(renderer) < 0) - { - this.name_aD.renderers.push(renderer); - } - } - - public function removeShadowRenderer(renderer:ShadowRenderer) : void - { - var index:int = int(this.name_aD.renderers.indexOf(renderer)); - if(index >= 0) - { - this.name_aD.renderers.splice(index,1); - } - } - public function setStage3D(stage3d:Stage3D) : void { this.stage3d = stage3d; @@ -545,7 +489,7 @@ package alternativa.tanks.game.subsystems.rendersystem this.name_WV.remove(renderer); } - public function each(effect:IGraphicEffect) : void + public function addEffect(effect:IGraphicEffect) : void { if(this.effects.indexOf(effect) >= 0) { @@ -558,7 +502,7 @@ package alternativa.tanks.game.subsystems.rendersystem public function addA3DEffect(effect:ParticleEffect) : void { - this.particleSystem.each(effect); + this.particleSystem.addEffect(effect); } public function setCameraController(controller:ICameraController) : void @@ -630,7 +574,6 @@ package alternativa.tanks.game.subsystems.rendersystem this.stage3d.context3D.clear(0,0,0,1,1,0,4294967295); this.stage3d.context3D.present(); this.resourceManager.clear(); - this.staticShadowRenderer.dispose(); } override public function run() : void @@ -681,22 +624,12 @@ package alternativa.tanks.game.subsystems.rendersystem this.axisIndicator.update(this.camera); } this.camera.startTimer(); - this.name_aD.update(this.rootContainer); this.camera.render(this.stage3d); this.camera.stopTimer(); } public function initStaticShadow(mainDirectionalLight:DirectionalLight) : void { - var staticShadowInitializer:StaticShadowInitializer = new StaticShadowInitializer(this.staticShadowRenderer,this.mapGeometryContainer,mainDirectionalLight); - if(this.isContext3DAvailable()) - { - staticShadowInitializer.execute(this.getContext3D()); - } - else - { - this.name_pR.push(staticShadowInitializer); - } } private function isContext3DAvailable() : Boolean @@ -723,7 +656,6 @@ package alternativa.tanks.game.subsystems.rendersystem var deferredAction:IDeferredAction = null; context3D.enableErrorChecking = false; this.resourceManager.setContext(context3D); - this.staticShadowRenderer.context = context3D; for each(var _loc5_ in this.name_pR) { deferredAction = _loc5_; @@ -757,7 +689,7 @@ package alternativa.tanks.game.subsystems.rendersystem object = objects[i]; textMarker = TextMarker(this.objectPoolManager.getObject(TextMarker)); textMarker.init(this.getOverlay("markers"),object.name || "[none]",object); - this.each(textMarker); + this.addEffect(textMarker); markers[i] = textMarker; } return markers; diff --git a/src/alternativa/tanks/game/subsystems/rendersystem/SkyMaterial.as b/src/alternativa/tanks/game/subsystems/rendersystem/SkyMaterial.as index d1d587d..74366c4 100644 --- a/src/alternativa/tanks/game/subsystems/rendersystem/SkyMaterial.as +++ b/src/alternativa/tanks/game/subsystems/rendersystem/SkyMaterial.as @@ -25,6 +25,7 @@ package alternativa.tanks.game.subsystems.rendersystem import flash.utils.Dictionary; import flash.utils.getDefinitionByName; import flash.utils.getQualifiedClassName; + import alternativa.engine3d.core.Renderer; use namespace alternativa3d; @@ -76,7 +77,7 @@ package alternativa.tanks.game.subsystems.rendersystem public var alpha:Number = 1; - public var name_L4:Boolean = false; + public var transparentPass:Boolean = false; public function SkyMaterial(diffuseMap:TextureResource = null, opacityMap:TextureResource = null, alpha:Number = 1) { @@ -152,12 +153,11 @@ package alternativa.tanks.game.subsystems.rendersystem fragmentLinker.setInputParams(outputWithAdvancedFogProcedure,"outColor"); } vertexLinker.link(); - fragmentLinker.setOppositeLinker(vertexLinker); fragmentLinker.link(); return new ShaderProgram(vertexLinker,fragmentLinker); } - override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, objectRenderPriority:int = -1) : void + override alternativa3d function collectDraws(camera:Camera3D, surface:Surface, geometry:Geometry, lights:Vector., lightsLength:int, useShadow:Boolean, objectRenderPriority:int = -1) : void { var program:ShaderProgram = null; var key:int = 0; @@ -181,7 +181,7 @@ package alternativa.tanks.game.subsystems.rendersystem { return; } - if(!this.name_L4 && this.opacityMap != null && this.opacityMap.alternativa3d::_texture == null) + if(!this.transparentPass && this.opacityMap != null && this.opacityMap.alternativa3d::_texture == null) { return; } @@ -198,15 +198,15 @@ package alternativa.tanks.game.subsystems.rendersystem optionsPrograms = []; _programs[object.alternativa3d::transformProcedure] = optionsPrograms; } - if(!this.name_L4 && !this.opacityMap) + if(!this.transparentPass && !this.opacityMap) { key = 0; } - else if(!this.name_L4 && Boolean(this.opacityMap)) + else if(!this.transparentPass && Boolean(this.opacityMap)) { key = 1; } - else if(this.name_L4) + else if(this.transparentPass) { key = 2; } @@ -218,14 +218,14 @@ package alternativa.tanks.game.subsystems.rendersystem program.upload(camera.alternativa3d::context3D); optionsPrograms[key] = program; } - var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry.name_EM,surface.indexBegin,surface.numTriangles,program); + var drawUnit:DrawUnit = camera.alternativa3d::renderer.alternativa3d::createDrawUnit(object,program.program,geometry._indexBuffer,surface.indexBegin,surface.numTriangles,program); drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aPosition"),positionBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.POSITION],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.POSITION]); drawUnit.alternativa3d::setVertexBufferAt(program.vertexShader.getVariableIndex("aUV"),uvBuffer,geometry.alternativa3d::_attributesOffsets[VertexAttributes.TEXCOORDS[0]],VertexAttributes.alternativa3d::FORMATS[VertexAttributes.TEXCOORDS[0]]); object.alternativa3d::setTransformConstants(drawUnit,surface,program.vertexShader,camera); drawUnit.alternativa3d::setProjectionConstants(camera,program.vertexShader.getVariableIndex("cProjMatrix"),object.alternativa3d::localToCameraTransform); drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cAlpha"),0,0,0,this.alpha); drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sTexture"),this.diffuseMap.alternativa3d::_texture); - if(Boolean(this.opacityMap) && !this.name_L4) + if(Boolean(this.opacityMap) && !this.transparentPass) { drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sOpacity"),this.opacityMap.alternativa3d::_texture); } @@ -277,15 +277,15 @@ package alternativa.tanks.game.subsystems.rendersystem drawUnit.alternativa3d::setFragmentConstantsFromNumbers(program.fragmentShader.getVariableIndex("cFogConsts"),0.5 * uScale,0.5 - uRight,0); drawUnit.alternativa3d::setTextureAt(program.fragmentShader.getVariableIndex("sFogTexture"),fogTexture.alternativa3d::_texture); } - if(this.name_L4 || this.opacityMap != null || this.alpha < 1) + if(this.transparentPass || this.opacityMap != null || this.alpha < 1) { drawUnit.alternativa3d::blendSource = Context3DBlendFactor.SOURCE_ALPHA; drawUnit.alternativa3d::blendDestination = Context3DBlendFactor.ONE_MINUS_SOURCE_ALPHA; - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.TRANSPARENT_SORT); + camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : Renderer.TRANSPARENT_SORT); } else { - camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : RenderPriority.OPAQUE); + camera.alternativa3d::renderer.alternativa3d::addDrawUnit(drawUnit,objectRenderPriority >= 0 ? objectRenderPriority : Renderer.OPAQUE); } } } diff --git a/src/alternativa/tanks/game/usertitle/UserTitle.as b/src/alternativa/tanks/game/usertitle/UserTitle.as index 7f9ab99..e21f404 100644 --- a/src/alternativa/tanks/game/usertitle/UserTitle.as +++ b/src/alternativa/tanks/game/usertitle/UserTitle.as @@ -132,7 +132,7 @@ package alternativa.tanks.game.usertitle this.resourceManager = this.resourceManager; this.textureResource = new BitmapTextureResource(null); this.material = new TextureMaterial(this.textureResource); - this.material.name_L4 = true; + this.material.transparentPass = true; this.sprite = new Sprite3D(100,100,this.material); this.sprite.material = this.material; this.sprite.perspectiveScale = false; diff --git a/src/alternativa/tanks/game/weapons/ammunition/plasma/PlasmaRoundEffectsFactory.as b/src/alternativa/tanks/game/weapons/ammunition/plasma/PlasmaRoundEffectsFactory.as index f5501a1..6829d5e 100644 --- a/src/alternativa/tanks/game/weapons/ammunition/plasma/PlasmaRoundEffectsFactory.as +++ b/src/alternativa/tanks/game/weapons/ammunition/plasma/PlasmaRoundEffectsFactory.as @@ -40,7 +40,7 @@ package alternativa.tanks.game.weapons.ammunition.plasma var effect:PlasmaRoundEffect = PlasmaRoundEffect(this.gameKernel.getObjectPoolManager().getObject(PlasmaRoundEffect)); var rotation:Number = Math.random() * Math.PI; effect.init(EFFECT_SIZE,EFFECT_SIZE,this.roundFrames,Vector3.ZERO,rotation,50,EFFECT_FPS,true,0.5,0.5); - this.gameKernel.getRenderSystem().each(effect); + this.gameKernel.getRenderSystem().addEffect(effect); return effect; } @@ -49,7 +49,7 @@ package alternativa.tanks.game.weapons.ammunition.plasma var explosionEffect:AnimatedSpriteEffect = AnimatedSpriteEffect(this.gameKernel.getObjectPoolManager().getObject(AnimatedSpriteEffect)); var rotation:Number = Math.random() * Math.PI; explosionEffect.init(EXPLOSION_EFFECT_SIZE,EXPLOSION_EFFECT_SIZE,this.explosionFrames,position,rotation,50,EXPLOSION_FPS,false,0.5,0.5); - this.gameKernel.getRenderSystem().each(explosionEffect); + this.gameKernel.getRenderSystem().addEffect(explosionEffect); } public function createRicochetEffects(position:Vector3, normal:Vector3, direction:Vector3) : void diff --git a/src/alternativa/tanks/game/weapons/ammunition/splashhit/debug/SmokyExplosion.as b/src/alternativa/tanks/game/weapons/ammunition/splashhit/debug/SmokyExplosion.as index fe40f7d..23b241d 100644 --- a/src/alternativa/tanks/game/weapons/ammunition/splashhit/debug/SmokyExplosion.as +++ b/src/alternativa/tanks/game/weapons/ammunition/splashhit/debug/SmokyExplosion.as @@ -107,7 +107,7 @@ package alternativa.tanks.game.weapons.ammunition.splashhit.debug addKey(3 * 0.03333333333333333,this.keyFrame4); addKey(4 * 0.03333333333333333,this.keyFrame5); addKey(4.7 * 0.03333333333333333,this.keyFrame6); - setLife(name_gV[name_kf - 1] + smokePrototype.lifeTime); + setLife(timeKeys[keysCount - 1] + smokePrototype.lifeTime); } private function keyFrame1(keyTime:Number, time:Number) : void diff --git a/src/alternativa/tanks/game/weapons/ammunition/splashhit/debug/SmokyShot.as b/src/alternativa/tanks/game/weapons/ammunition/splashhit/debug/SmokyShot.as index 51636cc..96c7b78 100644 --- a/src/alternativa/tanks/game/weapons/ammunition/splashhit/debug/SmokyShot.as +++ b/src/alternativa/tanks/game/weapons/ammunition/splashhit/debug/SmokyShot.as @@ -32,18 +32,18 @@ package alternativa.tanks.game.weapons.ammunition.splashhit.debug boundBox.maxY = 100; boundBox.maxZ = 100; addKey(0 * 0.03333333333333333,this.keyFrame1); - setLife(name_gV[name_kf - 1] + shotPrototype.lifeTime); + setLife(timeKeys[keysCount - 1] + shotPrototype.lifeTime); } private function keyFrame1(keyTime:Number, time:Number) : void { - pos.copyFrom(name_cF); + pos.copyFrom(keyDirection); pos.scaleBy(time * 100 + 25); shotPrototype.createParticle(this,time,pos,random() * 6.28,1,1,1,0); - pos.copyFrom(name_cF); + pos.copyFrom(keyDirection); pos.scaleBy(time * 300 + 32); shotPrototype.createParticle(this,time,pos,random() * 6.28,0.88,0.88,1,0); - pos.copyFrom(name_cF); + pos.copyFrom(keyDirection); pos.scaleBy(time * 400 + 39); shotPrototype.createParticle(this,time,pos,random() * 6.28,0.66,0.66,1,0); } diff --git a/src/alternativa/tanks/game/weapons/flamethrower/FlameThrower.as b/src/alternativa/tanks/game/weapons/flamethrower/FlameThrower.as index 167d932..27c0fdd 100644 --- a/src/alternativa/tanks/game/weapons/flamethrower/FlameThrower.as +++ b/src/alternativa/tanks/game/weapons/flamethrower/FlameThrower.as @@ -90,32 +90,32 @@ package alternativa.tanks.game.weapons.flamethrower addKey(keyTime,this.keyFrame1); i++; } - setLife(name_gV[name_kf - 1] + smokePrototype2.lifeTime); + setLife(timeKeys[keysCount - 1] + smokePrototype2.lifeTime); } private function keyFrame1(keyTime:Number, time:Number) : void { var ang:Number = 6 * 3.14 / 180; - dir.x = name_cF.x; - dir.y = name_cF.y; - dir.z = name_cF.z + 0.2; + dir.x = keyDirection.x; + dir.y = keyDirection.y; + dir.z = keyDirection.z + 0.2; dir.normalize(); - this.randomDirection(name_cF,ang,pos); + this.randomDirection(keyDirection,ang,pos); pos.scaleBy(time * 300 + 10); flashPrototype1.createParticle(this,time,pos,random() * 6.28,1,1,1,random() * flashPrototype1.atlas.rangeLength); - this.randomDirection(name_cF,ang,pos); + this.randomDirection(keyDirection,ang,pos); pos.scaleBy((time - 0.03333333333333333) * 150 + 10); flashPrototype2.createParticle(this,time,pos,random() * 6.28,1,1,1,random() * flashPrototype1.atlas.rangeLength); - this.randomDirection(name_cF,ang,pos); + this.randomDirection(keyDirection,ang,pos); pos.scaleBy((time - 0.03333333333333333 - 0.03333333333333333) * 80 + 10); flashPrototype3.createParticle(this,time,pos,random() * 6.28,1,1,1,random() * flashPrototype1.atlas.rangeLength); - this.randomDirection(name_cF,ang,pos); + this.randomDirection(keyDirection,ang,pos); pos.scaleBy(time * 240 + 10); firePrototype.createParticle(this,time,pos,random() * 6.28,1,1,1,-6 * 0.03333333333333333 * firePrototype.atlas.fps); this.randomDirection(dir,ang,pos); pos.scaleBy(time * 300 + 10); firePrototype.createParticle(this,time,pos,random() * 6.28,1,1,1,-6 * 0.03333333333333333 * firePrototype.atlas.fps); - this.randomDirection(name_cF,ang,pos); + this.randomDirection(keyDirection,ang,pos); pos.scaleBy(time * 300 + 10); smokePrototype1.createParticle(this,time,pos,random() * 6.28,1,1,1,random() * smokePrototype1.atlas.rangeLength); this.randomDirection(dir,ang,pos); diff --git a/src/alternativa/tanks/game/weapons/flamethrower/FlamethrowerSFXComponent.as b/src/alternativa/tanks/game/weapons/flamethrower/FlamethrowerSFXComponent.as index 5a51f20..8a6f2b5 100644 --- a/src/alternativa/tanks/game/weapons/flamethrower/FlamethrowerSFXComponent.as +++ b/src/alternativa/tanks/game/weapons/flamethrower/FlamethrowerSFXComponent.as @@ -79,7 +79,7 @@ package alternativa.tanks.game.weapons.flamethrower this.effect = FlamethrowerGraphicEffect(this.gameKernel.getObjectPoolManager().getObject(FlamethrowerGraphicEffect)); var collisionDetector:ICollisionDetector = this.gameKernel.getPhysicsSystem().getPhysicsScene().collisionDetector; this.effect.init(this.turret,flamethrowerSmokeAtlas,flamethrowerFlashAtlas,flamethrowerFireAtlas); - this.gameKernel.getRenderSystem().each(this.effect); + this.gameKernel.getRenderSystem().addEffect(this.effect); } public function stop() : void diff --git a/src/alternativa/tanks/game/weapons/thunder/effects/ThunderShotEffect.as b/src/alternativa/tanks/game/weapons/thunder/effects/ThunderShotEffect.as index 8b5f92b..88b247a 100644 --- a/src/alternativa/tanks/game/weapons/thunder/effects/ThunderShotEffect.as +++ b/src/alternativa/tanks/game/weapons/thunder/effects/ThunderShotEffect.as @@ -92,7 +92,7 @@ package alternativa.tanks.game.weapons.thunder.effects { super(objectPool); this.name_kg = new BlendedMaterial(); - this.name_kg.name_L4 = true; + this.name_kg.transparentPass = true; this.name_kg.blendModeSource = Context3DBlendFactor.ONE; this.name_kg.blendModeDestination = Context3DBlendFactor.ONE; this.createParticles();