📄 dae.as.svn-base
字号:
package org.papervision3d.objects.parsers{ import flash.events.Event; import flash.events.ProgressEvent; import flash.utils.ByteArray; import flash.utils.Dictionary; import org.ascollada.ASCollada; import org.ascollada.core.*; import org.ascollada.fx.*; import org.ascollada.io.DaeReader; import org.ascollada.namespaces.*; import org.ascollada.types.*; import org.papervision3d.core.animation.*; import org.papervision3d.core.animation.channel.*; import org.papervision3d.core.geom.*; import org.papervision3d.core.geom.renderables.*; import org.papervision3d.core.material.AbstractLightShadeMaterial; import org.papervision3d.core.math.*; import org.papervision3d.core.proto.*; import org.papervision3d.events.FileLoadEvent; import org.papervision3d.materials.*; import org.papervision3d.materials.shaders.ShadedMaterial; import org.papervision3d.materials.special.*; import org.papervision3d.materials.utils.*; import org.papervision3d.objects.DisplayObject3D; import org.papervision3d.objects.special.Joint3D; import org.papervision3d.objects.special.Skin3D; /** * @author Tim Knip */ public class DAE extends DisplayObject3D implements IAnimationDataProvider { use namespace collada; /** Default line color for splines. */ public static var DEFAULT_LINE_COLOR:uint = 0xffff00; /** Default line width for splines */ public static var DEFAULT_LINE_WIDTH:Number = 0; /** */ public var COLLADA:XML; /** */ public var filename:String; /** */ public var fileTitle:String; /** */ public var baseUrl:String; /** Path where the textures should be loaded from. */ public var texturePath:String; /** */ public var parser:DaeReader; /** */ public var document:DaeDocument; /** * Constructor. */ public function DAE() { super(); } /** * Gets the default FPS. */ public function get fps():uint { return 20; } /** * Gets a animation channel by its name. * * @param name * * @return the found channel. */ public function getAnimationChannelByName(name:String):AbstractChannel3D { return null; } /** * Gets all animation channels for a target. * <p>NOTE: when target is null, all channels for this object are returned.</p> * * @param target The target to get the channels for. * * @return Array of AnimationChannel3D. */ public function getAnimationChannels(target:DisplayObject3D=null):Array { var channels:Array = new Array(); if(target == null) { for each(var array:Array in _channelsByTarget) channels = channels.concat(array); } else if(_channelsByTarget[target]) { channels = channels.concat(_channelsByTarget[target]); } else return null; return channels; } /** * Gets animation channels by clip name. * * @param name The clip name * * @return Array of AnimationChannel3D. */ public function getAnimationChannelsByClip(name:String):Array { return null; } /** * Loads the COLLADA. * * @param asset The url, an XML object or a ByteArray specifying the COLLADA file. * @param materials An optional materialsList. */ public function load(asset:*, materials:MaterialsList = null):void { this.materials = materials || new MaterialsList(); buildFileInfo(asset); this.parser = new DaeReader(); this.parser.addEventListener(Event.COMPLETE, onParseComplete); this.parser.addEventListener(ProgressEvent.PROGRESS, onParseProgress); if(asset is XML) { this.COLLADA = asset as XML; this.parser.loadDocument(asset); } else if(asset is ByteArray) { this.COLLADA = new XML(ByteArray(asset)); this.parser.loadDocument(asset); } else if(asset is String) { this.filename = String(asset); this.parser.read(this.filename); } else { throw new Error("load : unknown asset type!"); } } /** * Removes a child. * * @param child The child to remove * * @return The removed child */ override public function removeChild(child:DisplayObject3D):DisplayObject3D { var object:DisplayObject3D = getChildByName(child.name, true); if(object) { var parent:DisplayObject3D = DisplayObject3D(object.parent); if(parent) { var removed:DisplayObject3D = parent.removeChild(object); if(removed) return removed; } } return null; } /** * Replaces a material by its name. * * @param material * @param name * @return */ public function replaceMaterialByName(material:MaterialObject3D, name:String):void { if(!this.materials) return; var existingMaterial:MaterialObject3D = this.materials.getMaterialByName(name); if(!existingMaterial) return; if(this.material === existingMaterial) this.material = material; existingMaterial = this.materials.removeMaterial(existingMaterial); existingMaterial.unregisterObject(this); material = this.materials.addMaterial(material, name); updateMaterials(this, existingMaterial, material); } /** * Replaces materials by its name. * * @param materials */ public function replaceMaterials(materials:MaterialsList):void { } /** * Sets the material for a child DisplayObject3D. * * @param child A child DisplayObject3D of this DAE. * @param material The new material for the child. */ public function setChildMaterial(child:DisplayObject3D, material:MaterialObject3D ):void { if(!child) return; child.material = material; if(child.geometry && child.geometry.faces) { for each( var triangle:Triangle3D in child.geometry.faces ) triangle.material = material; } } /** * Sets the material for a child DisplayObject3D by the child's name. * * @param childName The name of the DisplayObject3D. * @param material The new material for the child. */ public function setChildMaterialByName(childName:String, material:MaterialObject3D):void { setChildMaterial(getChildByName(childName, true), material); } /** * Builds a animation channel for an object. * * @param matrixStackChannel the target object's channel * @param target The target object * @param channel The DaeChannel */ private function buildAnimationChannel(target:DisplayObject3D, channel:DaeChannel):MatrixChannel3D { //if(channel.syntax.isArrayAccess) // return; var node:DaeNode = _objectToNode[target]; if(!node) throw new Error("Couldn't find the targeted object!"); var matrixChannel:MatrixChannel3D = new MatrixChannel3D(this, target, channel.syntax.targetSID); var transform:DaeTransform = node.findMatrixBySID(channel.syntax.targetSID); if(!transform) throw new Error("Couldn't find the targeted object's transform!"); var matrix:Matrix3D; var matrixProp:String; var arrayMember:String; var data:Array; var i:int; if(channel.syntax.isArrayAccess) { arrayMember = channel.syntax.arrayMember.join(""); switch(arrayMember) { case "(0)(0)": matrixProp = "n11"; break; case "(1)(0)": matrixProp = "n12"; break; case "(2)(0)": matrixProp = "n13"; break; case "(3)(0)": matrixProp = "n14"; break; case "(0)(1)": matrixProp = "n21"; break; case "(1)(1)": matrixProp = "n22"; break; case "(2)(1)": matrixProp = "n23"; break; case "(3)(1)": matrixProp = "n24"; break; case "(0)(2)": matrixProp = "n31"; break; case "(1)(2)": matrixProp = "n32"; break; case "(2)(2)": matrixProp = "n33"; break; case "(3)(2)": matrixProp = "n34"; break; default: throw new Error(arrayMember); } } switch(transform.type) { case "matrix": if(channel.syntax.isFullAccess) { for(i = 0; i < channel.input.length; i++) { data = channel.output[i]; matrix = new Matrix3D(data); matrixChannel.addKeyFrame(new AnimationKeyFrame3D("keyframe_" + i, channel.input[i], [matrix])); } } else if(channel.syntax.isArrayAccess) { matrix = Matrix3D.clone(target.transform); for(i = 0; i < channel.input.length; i++) { matrix[matrixProp] = channel.output[i]; matrixChannel.addKeyFrame(new AnimationKeyFrame3D("keyframe_" + i, channel.input[i], [matrix])); } } else { throw new Error("Don't know how to handle this channel: " + channel.syntax); } break; case "rotate": if(channel.syntax.isFullAccess) { for(i = 0; i < channel.input.length; i++) { data = channel.output[i]; matrix = Matrix3D.rotationMatrix(data[0], data[1], data[2], data[3] * (Math.PI/180)); matrixChannel.addKeyFrame(new AnimationKeyFrame3D("keyframe_" + i, channel.input[i], [matrix])); } } else if(channel.syntax.isDotAccess) { switch(channel.syntax.member) { case "ANGLE": for(i = 0; i < channel.input.length; i++) { var angle:Number = channel.output[i] * (Math.PI/180); matrix = Matrix3D.rotationMatrix(transform.values[0], transform.values[1], transform.values[2], angle); matrixChannel.addKeyFrame(new AnimationKeyFrame3D("keyframe_" + i, channel.input[i], [matrix])); } break; default: throw new Error("Don't know how to handle this channel: " + channel.syntax); } } else { throw new Error("Don't know how to handle this channel: " + channel.syntax); } break; case "scale": if(channel.syntax.isFullAccess) { for(i = 0; i < channel.input.length; i++) { data = channel.output[i]; matrix = Matrix3D.scaleMatrix(data[0], data[1], data[2]); matrixChannel.addKeyFrame(new AnimationKeyFrame3D("keyframe_" + i, channel.input[i], [matrix])); } } else { throw new Error("Don't know how to handle this channel: " + channel.syntax); } break; case "translate": if(channel.syntax.isFullAccess) { for(i = 0; i < channel.input.length; i++) { data = channel.output[i]; matrix = Matrix3D.translationMatrix(data[0], data[1], data[2]); matrixChannel.addKeyFrame(new AnimationKeyFrame3D("keyframe_" + i, channel.input[i], [matrix])); } } else { throw new Error("Don't know how to handle this channel: " + channel.syntax); } break; default: throw new Error("Unknown transform type!"); } return matrixChannel; } /** * Build all animation channels. */ private function buildAnimationChannels():void { var target:DisplayObject3D; var channel:DaeChannel; var channelsByObject:Dictionary = new Dictionary(true); var i:int; _channelsByTarget = new Dictionary(true); for each(var animation:DaeAnimation in this.document.animations) { for(i = 0; i < animation.channels.length; i++) { channel = animation.channels[i]; target = _colladaIDToObject[channel.syntax.targetID]; if(!target) throw new Error("damn"); if(!channelsByObject[target]) channelsByObject[target] = new Array(); channelsByObject[target].push(channel); } } for(var object:* in channelsByObject)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -