mirror of
https://github.com/MapMakersAndProgrammers/Alternativa3D.git
synced 2025-10-26 18:09:14 -07:00
FBX Preparing
This commit is contained in:
@@ -44,6 +44,7 @@ package alternativa.engine3d.loaders {
|
|||||||
var head:String = data.readUTFBytes(5);
|
var head:String = data.readUTFBytes(5);
|
||||||
data.position -= 5;
|
data.position -= 5;
|
||||||
|
|
||||||
|
// TODO: insert unsupported file format warning or error
|
||||||
switch (head) {
|
switch (head) {
|
||||||
case "; FBX":
|
case "; FBX":
|
||||||
fileReader = new ReaderText(data);
|
fileReader = new ReaderText(data);
|
||||||
@@ -80,7 +81,7 @@ package alternativa.engine3d.loaders {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
trace("parsed: 0 =", fileReader.getDepth());
|
// trace("parsed: 0 =", fileReader.getDepth());
|
||||||
|
|
||||||
ids = new IncrementalIDGenerator2();
|
ids = new IncrementalIDGenerator2();
|
||||||
a3d = new A3D2(new Vector.<A3D2AmbientLight>(), new Vector.<A3D2AnimationClip>(),
|
a3d = new A3D2(new Vector.<A3D2AmbientLight>(), new Vector.<A3D2AnimationClip>(),
|
||||||
@@ -93,21 +94,22 @@ package alternativa.engine3d.loaders {
|
|||||||
|
|
||||||
var key:String, nodeNames:Dictionary = new Dictionary();
|
var key:String, nodeNames:Dictionary = new Dictionary();
|
||||||
for (key in heap) {
|
for (key in heap) {
|
||||||
var node:KFbxNode = heap [key] as KFbxNode;
|
var node:KFbxNode = heap[key] as KFbxNode;
|
||||||
if (node) {
|
if (node) {
|
||||||
convertNode(node, nodeNames [node] = heapKeyToName(key));
|
convertNode(node, nodeNames [node] = heapKeyToName(key));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// for перебирает ключи в случайном порядке, посему парсим анимацию после всех нод
|
// for перебирает ключи в случайном порядке, посему парсим анимацию после всех нод
|
||||||
for (key in heap) {
|
for (key in heap) {
|
||||||
var animation:KFbxAnimStack = heap [key] as KFbxAnimStack;
|
var animation:KFbxAnimStack = heap[key] as KFbxAnimStack;
|
||||||
if (animation) {
|
if (animation) {
|
||||||
convertAnimation(animation, heapKeyToName(key), nodeNames);
|
convertAnimation(animation, heapKeyToName(key), nodeNames);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
complete(a3d);
|
complete(a3d);
|
||||||
trace("converted,", hierarchy.length, "(" + objects.length + ")");
|
// TODO: bound boxes calculation
|
||||||
|
// TODO: animation for skins and joints
|
||||||
|
// trace("converted,", hierarchy.length, "(" + objects.length + ")");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -218,22 +220,20 @@ package alternativa.engine3d.loaders {
|
|||||||
node2:KFbxNode):Vector.<A3D2Keyframe> {
|
node2:KFbxNode):Vector.<A3D2Keyframe> {
|
||||||
var nodeProperties:Object = {
|
var nodeProperties:Object = {
|
||||||
T:"LclTranslation", R:"LclRotation", S:"LclScaling"
|
T:"LclTranslation", R:"LclRotation", S:"LclScaling"
|
||||||
}
|
};
|
||||||
|
|
||||||
var frames:Vector.<A3D2Keyframe> = new Vector.<A3D2Keyframe>(times.length);
|
var frames:Vector.<A3D2Keyframe> = new Vector.<A3D2Keyframe>(times.length);
|
||||||
|
|
||||||
for (var i:int = 0, n:int = times.length; i < n; i++) {
|
for (var i:int = 0, n:int = times.length; i < n; i++) {
|
||||||
var t:Number = times [int(i)];
|
var t:Number = times [int(i)];
|
||||||
for each (var curve:KFbxAnimCurveNode in curves) {
|
for each (var curve:KFbxAnimCurveNode in curves) {
|
||||||
var property:Vector.<Number> = node2 [nodeProperties [curve.channel]];
|
var property:Vector.<Number> = node2[nodeProperties[curve.channel]];
|
||||||
if (property) {
|
if (property) {
|
||||||
for each (var terminalCurve:KFbxAnimCurveNode in curve.curveNodes) {
|
for each (var terminalCurve:KFbxAnimCurveNode in curve.curveNodes) {
|
||||||
|
|
||||||
if (terminalCurve.KeyTime.length == 0) {
|
if (terminalCurve.KeyTime.length == 0) {
|
||||||
// this does happen for some reason :(
|
// this does happen for some reason :(
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
var index:int;
|
var index:int;
|
||||||
switch (terminalCurve.channel) {
|
switch (terminalCurve.channel) {
|
||||||
case "X":
|
case "X":
|
||||||
@@ -251,20 +251,19 @@ package alternativa.engine3d.loaders {
|
|||||||
}
|
}
|
||||||
if (index >= 0) {
|
if (index >= 0) {
|
||||||
// совпадает время ключа?
|
// совпадает время ключа?
|
||||||
if ((terminalCurve.KeyTime.length > i) && (terminalCurve.KeyTime [int(i)] == t)) {
|
if ((terminalCurve.KeyTime.length > i) && (terminalCurve.KeyTime[int(i)] == t)) {
|
||||||
// да
|
// да
|
||||||
property [index] = terminalCurve.KeyValueFloat [int(i)];
|
property[index] = terminalCurve.KeyValueFloat [int(i)];
|
||||||
} else {
|
} else {
|
||||||
// нет, интерполируем
|
// нет, интерполируем
|
||||||
property [index] = terminalCurve.interpolateValue(t);
|
property[index] = terminalCurve.interpolateValue(t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SDK: The time unit in FBX (KTime) is 1/46186158000 of one second.
|
// SDK: The time unit in FBX (KTime) is 1/46186158000 of one second.
|
||||||
frames [i] = new A3D2Keyframe(t/4.6186158e10, convertMatrix(node2.calculateNodeTransformation()));
|
frames[i] = new A3D2Keyframe(t/4.6186158e10, convertMatrix(node2.calculateNodeTransformation()));
|
||||||
}
|
}
|
||||||
|
|
||||||
return frames;
|
return frames;
|
||||||
@@ -1147,7 +1146,6 @@ class IncrementalIDGenerator2 {
|
|||||||
result = this.objects [object] = Long.fromInt(this.lastID);
|
result = this.objects [object] = Long.fromInt(this.lastID);
|
||||||
this.lastID++;
|
this.lastID++;
|
||||||
}
|
}
|
||||||
;
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,16 +20,12 @@ package alternativa.engine3d.loaders.filmbox.versions {
|
|||||||
parseAmbientLight(reader.getRecordData(), heap);
|
parseAmbientLight(reader.getRecordData(), heap);
|
||||||
reader.stepOver();
|
reader.stepOver();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
// 3D объекты
|
// 3D объекты
|
||||||
case "Model":
|
case "Model":
|
||||||
data = reader.getRecordData();
|
data = reader.getRecordData();
|
||||||
parseModelRecord(data, stack, heap);
|
parseModelRecord(data, stack, heap);
|
||||||
reader.stepIn();
|
reader.stepIn();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
// разная хрень из Mesh
|
// разная хрень из Mesh
|
||||||
case "Vertices":
|
case "Vertices":
|
||||||
case "PolygonVertexIndex":
|
case "PolygonVertexIndex":
|
||||||
@@ -55,8 +51,6 @@ package alternativa.engine3d.loaders.filmbox.versions {
|
|||||||
addMeshLayerElement(null, stack, new KFbxLayerElementUV, 0);
|
addMeshLayerElement(null, stack, new KFbxLayerElementUV, 0);
|
||||||
reader.stepIn();
|
reader.stepIn();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
// поля слоёв
|
// поля слоёв
|
||||||
case "TextureUV":
|
case "TextureUV":
|
||||||
setPredefinedProperty(reader, stack, "UV");
|
setPredefinedProperty(reader, stack, "UV");
|
||||||
@@ -78,27 +72,23 @@ package alternativa.engine3d.loaders.filmbox.versions {
|
|||||||
setPredefinedProperty(reader, stack, recordName);
|
setPredefinedProperty(reader, stack, recordName);
|
||||||
reader.stepOver();
|
reader.stepOver();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "Material":
|
case "Material":
|
||||||
node = stack [stack.length - 1] as KFbxNode;
|
node = stack [stack.length - 1] as KFbxNode;
|
||||||
node.materials.push(object = new KFbxSurfaceMaterial);
|
node.materials.push(object = new KFbxSurfaceMaterial);
|
||||||
stack.push(object);
|
stack.push(object);
|
||||||
reader.stepIn();
|
reader.stepIn();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "Texture":
|
case "Texture":
|
||||||
node = stack [stack.length - 1] as KFbxNode;
|
node = stack [stack.length - 1] as KFbxNode;
|
||||||
node.textures.push(object = new KFbxTexture);
|
node.textures.push(object = new KFbxTexture);
|
||||||
stack.push(object);
|
stack.push(object);
|
||||||
reader.stepIn();
|
reader.stepIn();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case "Takes":
|
case "Takes":
|
||||||
// all nodes were parsed by now
|
// all nodes were parsed by now
|
||||||
buildHierarchy(heap);
|
buildHierarchy(heap);
|
||||||
reader.stepOver();
|
reader.stepOver();
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
reader.stepOver();
|
reader.stepOver();
|
||||||
break;
|
break;
|
||||||
@@ -108,7 +98,7 @@ package alternativa.engine3d.loaders.filmbox.versions {
|
|||||||
private function parseModelRecord(data:RecordData, stack:Array, heap:Object):void {
|
private function parseModelRecord(data:RecordData, stack:Array, heap:Object):void {
|
||||||
var node:KFbxNode = new KFbxNode;
|
var node:KFbxNode = new KFbxNode;
|
||||||
// can't determine attribute yet :(
|
// can't determine attribute yet :(
|
||||||
stack.push(heap [data.strings [0]] = node);
|
stack.push(heap[data.strings[0]] = node);
|
||||||
}
|
}
|
||||||
|
|
||||||
private function buildHierarchy(heap:Object):void {
|
private function buildHierarchy(heap:Object):void {
|
||||||
|
|||||||
@@ -125,7 +125,7 @@ package alternativa.engine3d.loaders.filmbox.versions {
|
|||||||
attr.Color = data.numbers;
|
attr.Color = data.numbers;
|
||||||
attr.Intensity = 100*((attr.Color.length > 3) ? attr.Color.pop() : 1);
|
attr.Intensity = 100*((attr.Color.length > 3) ? attr.Color.pop() : 1);
|
||||||
node.attributes.push(attr);
|
node.attributes.push(attr);
|
||||||
heap ["AmbientLight"] = node;
|
heap["AmbientLight"] = node;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user