package package_123 { import alternativa.engine3d.*; import flash.utils.ByteArray; import flash.utils.Dictionary; import flash.utils.Endian; import package_116.name_641; import package_124.name_705; import package_19.name_528; import package_19.name_700; import package_21.name_126; import package_21.name_78; import package_28.name_119; use namespace collada; use namespace alternativa3d; public class name_735 extends class_43 { private var var_726:Vector.>; private var var_725:Array; private var indices:Array; private var var_728:name_784; private var var_727:name_784; private var var_729:int; private var geometry:name_119; private var primitives:Vector.; private var var_724:int = 0; private var var_723:Vector.; public function name_735(data:XML, document:name_707) { super(data,document); } private function get method_912() : name_736 { var geom:name_736 = 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:name_119 = 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.var_725 = method_867(vcountsXML); var indicesXML:XML = vertexWeightsXML.v[0]; if(indicesXML == null) { return false; } this.indices = method_867(indicesXML); this.method_909(); this.method_906(); for(i = 0; i < this.var_725.length; ) { count = int(this.var_725[i]); if(this.var_724 < count) { this.var_724 = count; } i++; } var geom:name_736 = this.method_912; this.var_723 = this.method_904(); if(geom != null) { geom.method_314(); vertices = geom.var_716; source = geom.geometry; localMaxJointsPerVertex = this.var_724 % 2 != 0 ? this.var_724 + 1 : this.var_724; this.geometry = new name_119(); this.geometry.alternativa3d::_indices = source.alternativa3d::_indices.slice(); attributes = source.method_279(0); numSourceAttributes = int(attributes.length); index = numSourceAttributes; for(i = 0; i < localMaxJointsPerVertex; i += 2) { attribute = int(name_126.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.method_908(this.geometry); this.primitives = geom.primitives; } return true; } private function method_908(geometry:name_119) : 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.var_723[0] + y * this.var_723[1] + z * this.var_723[2] + this.var_723[3]); data.writeFloat(x * this.var_723[4] + y * this.var_723[5] + z * this.var_723[6] + this.var_723[7]); data.writeFloat(x * this.var_723[8] + y * this.var_723[9] + z * this.var_723[10] + this.var_723[11]); } } private function createVertexBuffer(vertices:Vector., localMaxJointsPerVertex:int) : ByteArray { var i:int = 0; var count:int = 0; var vertexOutIndices:Vector. = null; var vertex:name_770 = 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.var_728.offset; var weightsOffset:int = this.var_727.offset; var weightsSource:name_740 = this.var_727.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_785]; if(vec == null) { vec = verticesDict[vertex.name_785] = new Vector.(); } vec.push(vertex.name_786); } } var vertexIndex:int = 0; for(i = 0,count = int(this.var_725.length); i < count; i++) { jointsPerVertex = int(this.var_725[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.var_729 * (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 method_909() : void { var input:name_784 = 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,var count:int = int(inputsList.length()); i < count; offset = input.offset,maxInputOffset = offset > maxInputOffset ? offset : maxInputOffset,i++) { input = new name_784(inputsList[i],document); semantic = input.semantic; if(semantic == null) { continue; } switch(semantic) { case "JOINT": if(this.var_728 == null) { this.var_728 = input; } break; case "WEIGHT": if(this.var_727 == null) { this.var_727 = input; } break; } } this.var_729 = maxInputOffset + 1; } private function method_906() : void { var jointsXML:XML = null; var jointsSource:name_740 = 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.method_314() && jointsSource.numbers != null && jointsSource.stride >= 16) { stride = jointsSource.stride; count = jointsSource.numbers.length / stride; this.var_726 = new Vector.>(count); for(i = 0; i < count; i++) { index = stride * i; matrix = new Vector.(16); this.var_726[i] = matrix; for(j = 0; j < 16; j++) { matrix[j] = jointsSource.numbers[int(index + j)]; } } } } else { document.logger.logNotFoundError(jointsXML.@source[0]); } } } public function method_429(materials:Object, topmostJoints:Vector., skeletons:Vector.) : name_711 { var numJoints:int = 0; var skin:name_528 = null; var joints:Vector. = null; var i:int = 0; var p:name_768 = null; var instanceMaterial:name_758 = null; var material:name_641 = null; var daeMaterial:name_713 = null; var skinXML:XML = data.skin[0]; if(skinXML != null) { this.var_723 = this.method_904(); numJoints = int(this.var_726.length); skin = new name_528(this.var_724,numJoints); skin.geometry = this.geometry; joints = this.method_915(skin,topmostJoints,this.method_902(skeletons)); this.method_910(joints); skin.var_631 = this.method_905(joints,numJoints); if(this.primitives != null) { for(i = 0; i < this.primitives.length; i++) { p = this.primitives[i]; instanceMaterial = materials[p.name_774]; if(instanceMaterial != null) { daeMaterial = instanceMaterial.material; if(daeMaterial != null) { daeMaterial.method_314(); material = daeMaterial.material; daeMaterial.used = true; } } skin.addSurface(material,p.indexBegin,p.numTriangles); } } return new name_711(skin,this.method_913(skin,joints)); } return null; } private function method_905(joints:Vector., numJoints:int) : Vector. { var result:Vector. = new Vector.(); for(var i:int = 0; i < numJoints; i++) { result[i] = name_700(joints[i].object); } return result; } private function method_913(skin:name_528, joints:Vector.) : name_705 { var animatedObject:name_711 = null; var clip:name_705 = null; var object:name_78 = null; var t:int = 0; if(!this.method_911(joints)) { return null; } var result:name_705 = new name_705(); var resultObjects:Array = [skin]; for(var i:int = 0,var 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.name_712(clip.name_716(t)); } } else { result.name_712(animatedObject.jointNode.name_715()); } object = animatedObject.object; object.name = animatedObject.jointNode.method_872; resultObjects.push(object); } result.alternativa3d::var_346 = resultObjects; return result; } private function method_911(joints:Vector.) : Boolean { var object:name_711 = null; for(var i:int = 0,var count:int = int(joints.length); i < count; ) { object = joints[i]; if(object.animation != null) { return true; } i++; } return false; } private function method_910(animatedJoints:Vector.) : void { var animatedJoint:name_711 = null; var bindMatrix:Vector. = null; for(var i:int = 0,var count:int = int(this.var_726.length); i < count; i++) { animatedJoint = animatedJoints[i]; bindMatrix = this.var_726[i]; name_700(animatedJoint.object).alternativa3d::name_701(bindMatrix); } } private function method_915(skin:name_528, topmostJoints:Vector., nodes:Vector.) : Vector. { var i:int = 0; var topmostJoint:name_706 = null; var animatedJoint:name_711 = 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.method_914(skin,topmostJoint,animatedJoints,nodesDictionary); this.method_901(name_700(animatedJoint.object),animatedJoints,topmostJoint,nodesDictionary); } return animatedJoints; } private function method_914(skin:name_528, node:name_706, animatedJoints:Vector., nodes:Dictionary) : name_711 { var joint:name_700 = new name_700(); joint.name = name_708(node.name); skin.addChild(joint); var animatedJoint:name_711 = node.name_714(node.name_710(joint)); animatedJoint.jointNode = node; if(node in nodes) { animatedJoints[nodes[node]] = animatedJoint; } else { animatedJoints.push(animatedJoint); } return animatedJoint; } private function method_901(parent:name_700, animatedJoints:Vector., parentNode:name_706, nodes:Dictionary) : void { var object:name_711 = null; var child:name_706 = null; var joint:name_700 = null; var children:Vector. = parentNode.nodes; for(var i:int = 0,var count:int = int(children.length); i < count; ) { child = children[i]; if(child in nodes) { joint = new name_700(); joint.name = name_708(child.name); object = child.name_714(child.name_710(joint)); object.jointNode = child; animatedJoints[nodes[child]] = object; parent.addChild(joint); this.method_901(joint,animatedJoints,child,nodes); } else if(this.method_903(child,nodes)) { joint = new name_700(); joint.name = name_708(child.name); object = child.name_714(child.name_710(joint)); object.jointNode = child; animatedJoints.push(object); parent.addChild(joint); this.method_901(joint,animatedJoints,child,nodes); } i++; } } private function method_903(parentNode:name_706, nodes:Dictionary) : Boolean { var child:name_706 = null; var children:Vector. = parentNode.nodes; for(var i:int = 0,var count:int = int(children.length); i < count; ) { child = children[i]; if(child in nodes || this.method_903(child,nodes)) { return true; } i++; } return false; } private function method_904() : 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 = name_565(matrixXML); for(i = 0; i < matrix.length; i++) { res[i] = Number(matrix[i]); } } return res; } private function method_907(node:name_706, nodes:Dictionary) : Boolean { for(var parent:name_706 = node.parent; parent != null; ) { if(parent in nodes) { return false; } parent = parent.parent; } return true; } public function method_916(skeletons:Vector.) : Vector. { var nodesDictionary:Dictionary = null; var rootNodes:Vector. = null; var node:name_706 = null; var nodes:Vector. = this.method_902(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.method_907(node,nodesDictionary)) { rootNodes.push(node); } i++; } return rootNodes; } return null; } private function findNode(nodeName:String, skeletons:Vector.) : name_706 { var node:name_706 = 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 method_902(skeletons:Vector.) : Vector. { var jointsXML:XML = null; var jointsSource:name_740 = null; var stride:int = 0; var count:int = 0; var nodes:Vector. = null; var i:int = 0; var node:name_706 = null; jointsXML = data.skin.joints.input.(@semantic == "JOINT")[0]; if(jointsXML != null) { jointsSource = document.findSource(jointsXML.@source[0]); if(jointsSource != null) { if(jointsSource.method_314() && 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; } } }