
Код AS3:
private function buildMesh(_arg1:Mesh, _arg2:ObjectData, _arg3:AnimationData, _arg4:Number):void{
var _local9:int;
var _local10:int;
var _local11:Face;
var _local12:Vertex;
var _local14:int;
var _local16:Number;
var _local17:Number;
var _local18:Number;
var _local19:Number;
var _local20:Number;
var _local21:Number;
var _local22:Number;
var _local23:Number;
var _local24:Number;
var _local25:Number;
var _local26:Number;
var _local27:Number;
var _local28:Number;
var _local29:Boolean;
var _local30:Number;
var _local31:Number;
var _local32:Number;
var _local33:Face;
var _local34:String;
var _local35:Vector.<int>;
var _local36:MaterialData;
var _local37:Material;
var _local38:Wrapper;
var _local39:Number;
var _local40:Number;
var _local5:Vector.<Vertex> = new Vector.<Vertex>();
var _local6:Vector.<Face> = new Vector.<Face>();
var _local7:int;
var _local8:int;
var _local13:Boolean;
if (_arg3 != null){
_local16 = _arg2.a;
_local17 = _arg2.b;
_local18 = _arg2.c;
_local19 = _arg2.d;
_local20 = _arg2.e;
_local21 = _arg2.f;
_local22 = _arg2.g;
_local23 = _arg2.h;
_local24 = _arg2.i;
_local25 = _arg2.j;
_local26 = _arg2.k;
_local27 = _arg2.l;
_local28 = (1 / (((((((-(_local18) * _local21) * _local24) + ((_local17 * _local22) * _local24)) + ((_local18 * _local20) * _local25)) - ((_local16 * _local22) * _local25)) - ((_local17 * _local20) * _local26)) + ((_local16 * _local21) * _local26)));
_arg2.a = (((-(_local22) * _local25) + (_local21 * _local26)) * _local28);
_arg2.b = (((_local18 * _local25) - (_local17 * _local26)) * _local28);
_arg2.c = (((-(_local18) * _local21) + (_local17 * _local22)) * _local28);
_arg2.d = ((((((((_local19 * _local22) * _local25) - ((_local18 * _local23) * _local25)) - ((_local19 * _local21) * _local26)) + ((_local17 * _local23) * _local26)) + ((_local18 * _local21) * _local27)) - ((_local17 * _local22) * _local27)) * _local28);
_arg2.e = (((_local22 * _local24) - (_local20 * _local26)) * _local28);
_arg2.f = (((-(_local18) * _local24) + (_local16 * _local26)) * _local28);
_arg2.g = (((_local18 * _local20) - (_local16 * _local22)) * _local28);
_arg2.h = ((((((((_local18 * _local23) * _local24) - ((_local19 * _local22) * _local24)) + ((_local19 * _local20) * _local26)) - ((_local16 * _local23) * _local26)) - ((_local18 * _local20) * _local27)) + ((_local16 * _local22) * _local27)) * _local28);
_arg2.i = (((-(_local21) * _local24) + (_local20 * _local25)) * _local28);
_arg2.j = (((_local17 * _local24) - (_local16 * _local25)) * _local28);
_arg2.k = (((-(_local17) * _local20) + (_local16 * _local21)) * _local28);
_arg2.l = ((((((((_local19 * _local21) * _local24) - ((_local17 * _local23) * _local24)) - ((_local19 * _local20) * _local25)) + ((_local16 * _local23) * _local25)) + ((_local17 * _local20) * _local27)) - ((_local16 * _local21) * _local27)) * _local28);
if (_arg3.pivot != null){
_arg2.d = (_arg2.d - _arg3.pivot.x);
_arg2.h = (_arg2.h - _arg3.pivot.y);
_arg2.l = (_arg2.l - _arg3.pivot.z);
};
_local13 = true;
};
if (_arg2.vertices != null){
_local29 = ((!((_arg2.uvs == null))) && ((_arg2.uvs.length > 0)));
_local9 = 0;
_local10 = 0;
_local14 = _arg2.vertices.length;
while (_local9 < _local14) {
_local12 = new Vertex();
if (_local13){
var _temp1 = _local9;
_local9 = (_local9 + 1);
_local30 = _arg2.vertices[_temp1];
var _temp2 = _local9;
_local9 = (_local9 + 1);
_local31 = _arg2.vertices[_temp2];
var _temp3 = _local9;
_local9 = (_local9 + 1);
_local32 = _arg2.vertices[_temp3];
_local12.x = ((((_arg2.a * _local30) + (_arg2.b * _local31)) + (_arg2.c * _local32)) + _arg2.d);
_local12.y = ((((_arg2.e * _local30) + (_arg2.f * _local31)) + (_arg2.g * _local32)) + _arg2.h);
_local12.z = ((((_arg2.i * _local30) + (_arg2.j * _local31)) + (_arg2.k * _local32)) + _arg2.l);
} else {
var _temp4 = _local9;
_local9 = (_local9 + 1);
_local12.x = _arg2.vertices[_temp4];
var _temp5 = _local9;
_local9 = (_local9 + 1);
_local12.y = _arg2.vertices[_temp5];
var _temp6 = _local9;
_local9 = (_local9 + 1);
_local12.z = _arg2.vertices[_temp6];
};
_local12.x = (_local12.x * _arg4);
_local12.y = (_local12.y * _arg4);
_local12.z = (_local12.z * _arg4);
if (_local29){
var _temp7 = _local10;
_local10 = (_local10 + 1);
_local12.u = _arg2.uvs[_temp7];
var _temp8 = _local10;
_local10 = (_local10 + 1);
_local12.v = (1 - _arg2.uvs[_temp8]);
};
_local12.transformId = -1;
var _temp9 = _local7;
_local7 = (_local7 + 1);
var _local41 = _temp9;
_local5[_local41] = _local12;
_local12.next = _arg1.vertexList;
_arg1.vertexList = _local12;
};
};
if (_arg2.faces != null){
_local9 = 0;
_local14 = _arg2.faces.length;
while (_local9 < _local14) {
_local11 = new Face();
_local11.wrapper = new Wrapper();
_local11.wrapper.next = new Wrapper();
_local11.wrapper.next.next = new Wrapper();
var _temp10 = _local9;
_local9 = (_local9 + 1);
_local11.wrapper.vertex = _local5[_arg2.faces[_temp10]];
var _temp11 = _local9;
_local9 = (_local9 + 1);
_local11.wrapper.next.vertex = _local5[_arg2.faces[_temp11]];
var _temp12 = _local9;
_local9 = (_local9 + 1);
_local11.wrapper.next.next.vertex = _local5[_arg2.faces[_temp12]];
var _temp13 = _local8;
_local8 = (_local8 + 1);
_local41 = _temp13;
_local6[_local41] = _local11;
if (_local33 != null){
_local33.next = _local11;
} else {
_arg1.faceList = _local11;
};
_local33 = _local11;
};
};
if (_arg2.surfaces != null){
for (_local34 in _arg2.surfaces) {
_local35 = _arg2.surfaces[_local34];
_local36 = this.materialDatas[_local34];
_local37 = _local36.material;
_local9 = 0;
while (_local9 < _local35.length) {
_local11 = _local6[_local35[_local9]];
_local11.material = _local37;
if (_local36.matrix != null){
_local38 = _local11.wrapper;
while (_local38 != null) {
_local12 = _local38.vertex;
if (_local12.transformId < 0){
_local39 = _local12.u;
_local40 = _local12.v;
_local12.u = (((_local36.matrix.a * _local39) + (_local36.matrix.b * _local40)) + _local36.matrix.tx);
_local12.v = (((_local36.matrix.c * _local39) + (_local36.matrix.d * _local40)) + _local36.matrix.ty);
_local12.transformId = 0;
};
_local38 = _local38.next;
};
};
_local9++;
};
};
};
var _local15:FillMaterial = new FillMaterial(0x7F7F7F);
_local15.name = "default";
_local11 = _arg1.faceList;
while (_local11 != null) {
if (_local11.material == null){
_local11.material = _local15;
};
_local11 = _local11.next;
};
_arg1.calculateFacesNormals(true);
_arg1.calculateBounds();
}
private function parseUVs(_arg1:ObjectData):void{
var _local2:int = this.data.readUnsignedShort();
_arg1.uvs = new Vector.<Number>();
var _local3:int;
var _local4:int;
while (_local3 < _local2) {
var _temp1 = _local4;
_local4 = (_local4 + 1);
var _local5 = _temp1;
_arg1.uvs[_local5] = this.data.readFloat();
var _temp2 = _local4;
_local4 = (_local4 + 1);
var _local6 = _temp2;
_arg1.uvs[_local6] = this.data.readFloat();
_local3++;
};
}
private function parseObject(chunkInfo:ChunkInfo) : void
{
if(this.objectDatas == null)
{
this.objectDatas = new Object();
}
var object:ObjectData = new ObjectData();
object.name = this.getString(chunkInfo.dataPosition);
this.objectDatas[object.name] = object;
var offset:int = object.name.length + 1;
this.parseObjectChunk(object,chunkInfo.dataPosition + offset,chunkInfo.dataSize - offset);
}
private function parse3DChunk(_arg1:int, _arg2:int):void{
var _local3:ChunkInfo;
var _local4:MaterialData;
while (_arg2 >= 6) {
_local3 = this.readChunkInfo(_arg1);
switch (_local3.id){
case CHUNK_MATERIAL:
_local4 = new MaterialData();
this.parseMaterialChunk(_local4, _local3.dataPosition, _local3.dataSize);
break;
case CHUNK_OBJECT:
this.parseObject(_local3);
break;
};
_arg1 = _local3.nextChunkPosition;
_arg2 = (_arg2 - _local3.size);
};
}
private function buildContent(texturesBaseURL:String, scale:Number) : void
{
var materialName:* = null;
var objectName:* = null;
var objectData:* = null;
var object:* = null;
var materialData:* = null;
var mapData:* = null;
var materialMatrix:* = null;
var rot:Number = NaN;
var textureMaterial:* = null;
var fillMaterial:* = null;
var i:int = 0;
var length:int = 0;
var animationData:* = null;
var j:int = 0;
var nameCounter:int = 0;
var animationData2:* = null;
var newObjectData:* = null;
var newName:* = null;
for(materialName in this.materialDatas)
{
materialData = this.materialDatas[materialName];
mapData = materialData.diffuseMap;
if(mapData != null)
{
materialMatrix = new Matrix();
rot = mapData.rotation * Math.PI / 180;
materialMatrix.translate(-mapData.offsetU,mapData.offsetV);
materialMatrix.translate(-0.5,-0.5);
materialMatrix.rotate(-rot);
materialMatrix.scale(mapData.scaleU,mapData.scaleV);
materialMatrix.translate(0.5,0.5);
materialData.matrix = materialMatrix;
textureMaterial = new TextureMaterial();
textureMaterial.name = materialName;
textureMaterial.diffuseMapURL = texturesBaseURL + mapData.filename;
textureMaterial.opacityMapURL = materialData.opacityMap != null?texturesBaseURL + materialData.opacityMap.filename:null;
materialData.material = textureMaterial;
textureMaterial.name = materialData.name;
this.textureMaterials.push(textureMaterial);
}
else
{
fillMaterial = new FillMaterial(materialData.color);
materialData.material = fillMaterial;
fillMaterial.name = materialData.name;
}
this.materials.push(materialData.material);
}
if(this.animationDatas != null)
{
if(this.objectDatas != null)
{
length = this.animationDatas.length;
for(i = 0; i < length; )
{
animationData = this.animationDatas[i];
objectName = animationData.objectName;
objectData = this.objectDatas[objectName];
if(objectData != null)
{
for(j = i + 1,nameCounter = 1; j < length; )
{
animationData2 = this.animationDatas[j];
if(!animationData2.isInstance && objectName == animationData2.objectName)
{
newObjectData = new ObjectData();
newName = objectName + nameCounter++;
newObjectData.name = newName;
this.objectDatas[newName] = newObjectData;
animationData2.objectName = newName;
newObjectData.vertices = objectData.vertices;
newObjectData.uvs = objectData.uvs;
newObjectData.faces = objectData.faces;
newObjectData.surfaces = objectData.surfaces;
newObjectData.a = objectData.a;
newObjectData.b = objectData.b;
newObjectData.c = objectData.c;
newObjectData.d = objectData.d;
newObjectData.e = objectData.e;
newObjectData.f = objectData.f;
newObjectData.g = objectData.g;
newObjectData.h = objectData.h;
newObjectData.i = objectData.i;
newObjectData.j = objectData.j;
newObjectData.k = objectData.k;
newObjectData.l = objectData.l;
}
j++;
}
}
if(objectData != null && objectData.vertices != null)
{
object = new Mesh();
this.buildMesh(object as Mesh,objectData,animationData,scale);
}
else
{
object = new Object3D();
}
object.name = objectName;
animationData.object = object;
if(animationData.position != null)
{
object.x = animationData.position.x * scale;
object.y = animationData.position.y * scale;
object.z = animationData.position.z * scale;
}
if(animationData.rotation != null)
{
object.rotationX = animationData.rotation.x;
object.rotationY = animationData.rotation.y;
object.rotationZ = animationData.rotation.z;
}
if(animationData.scale != null)
{
object.scaleX = animationData.scale.x;
object.scaleY = animationData.scale.y;
object.scaleZ = animationData.scale.z;
}
i++;
}
for(i = 0; i < length; i++)
{
animationData = this.animationDatas[i];
this.objects.push(animationData.object);
this.parents.push(animationData.parentIndex == 65535?null:AnimationData(this.animationDatas[animationData.parentIndex]).object);
}
}
}
else
{
for(objectName in this.objectDatas)
{
objectData = this.objectDatas[objectName];
if(objectData.vertices != null)
{
object = new Mesh();
object.name = objectName;
this.buildMesh(object as Mesh,objectData,null,scale);
this.objects.push(object);
this.parents.push(null);
}
}
}
}