Improve blend mesh import
This commit is contained in:
@@ -330,7 +330,7 @@ class Handle {
|
||||
var size = 0;
|
||||
if (n.indexOf('*') >= 0) size = block.blend.pointerSize;
|
||||
else size = dna.typesLength[typeIndex];
|
||||
if (n.indexOf('[') > 0) size *= Std.parseInt(n.substring(n.indexOf('[') + 1, n.indexOf(']')));
|
||||
if (n.indexOf('[') > 0) size *= getArrayLen(n);
|
||||
return size;
|
||||
}
|
||||
function baseName(s:String):String {
|
||||
@@ -338,7 +338,10 @@ class Handle {
|
||||
if (s.charAt(s.length - 1) == ']') s = s.substring(0, s.indexOf('['));
|
||||
return s;
|
||||
}
|
||||
public function get(name:String, index = 0, asType:String = null):Dynamic {
|
||||
function getArrayLen(s:String):Int {
|
||||
return Std.parseInt(s.substring(s.indexOf('[') + 1, s.indexOf(']')));
|
||||
}
|
||||
public function get(name:String, index = 0, asType:String = null, arrayLen = 0):Dynamic {
|
||||
// Return raw type or structure
|
||||
var dna = ds.dna;
|
||||
for (i in 0...ds.fieldNames.length) {
|
||||
@@ -360,7 +363,7 @@ class Handle {
|
||||
var blend = block.blend;
|
||||
blend.pos = block.pos + newOffset;
|
||||
var isArray = dnaName.charAt(dnaName.length - 1) == ']';
|
||||
var len = isArray ? Std.parseInt(dnaName.substring(dnaName.indexOf('[') + 1, dnaName.indexOf(']'))) : 1;
|
||||
var len = isArray ? (arrayLen > 0 ? arrayLen : getArrayLen(dnaName)) : 1;
|
||||
switch (type) {
|
||||
case 'int': return isArray ? blend.read32array(len) : blend.read32();
|
||||
case 'char': return isArray ? blend.readString() : blend.read8();
|
||||
|
||||
+168
-130
@@ -27,150 +27,188 @@ class ImportBlend {
|
||||
return;
|
||||
}
|
||||
|
||||
// var obs = bl.get("Object");
|
||||
// var ob = obs[0];
|
||||
// var name:String = ob.get("id").get("name");
|
||||
// name = name.substring(2, name.length);
|
||||
// trace(ob.get("type")); // 1
|
||||
var obs = bl.get("Object");
|
||||
if (obs == null || obs.length == 0) { ImportMesh.makeMesh(null, path); return; }
|
||||
|
||||
var m = bl.get("Mesh")[0];
|
||||
if (m == null) { ImportMesh.makeMesh(null, path); return; }
|
||||
var first = true;
|
||||
for (ob in obs) {
|
||||
if (ob.get("type") != 1) continue;
|
||||
|
||||
var totpoly = m.get("totpoly");
|
||||
var numtri = 0;
|
||||
for (i in 0...totpoly) {
|
||||
var poly = m.get("mpoly", i);
|
||||
var totloop = poly.get("totloop");
|
||||
numtri += totloop == 3 ? 1 : 2;
|
||||
}
|
||||
var inda = new Uint32Array(numtri * 3);
|
||||
for (i in 0...inda.length) inda[i] = i;
|
||||
var name:String = ob.get("id").get("name");
|
||||
name = name.substring(2, name.length);
|
||||
|
||||
var posa32 = new Float32Array(numtri * 3 * 4);
|
||||
var posa = new Int16Array(numtri * 3 * 4);
|
||||
var nora = new Int16Array(numtri * 3 * 2);
|
||||
var hasuv = m.get("mloopuv") != null;
|
||||
var texa = hasuv ? new Int16Array(numtri * 3 * 2) : null;
|
||||
var m:Dynamic = ob.get("data", 0, "Mesh");
|
||||
if (m == null) continue;
|
||||
|
||||
var tri = 0;
|
||||
var vec0 = new Vec4();
|
||||
var vec1 = new Vec4();
|
||||
var vec2 = new Vec4();
|
||||
var vec3 = new Vec4();
|
||||
for (i in 0...totpoly) {
|
||||
var poly = m.get("mpoly", i);
|
||||
var loopstart = poly.get("loopstart");
|
||||
var totloop = poly.get("totloop");
|
||||
if (totloop >= 3) {
|
||||
var v0 = m.get("mvert", m.get("mloop", loopstart ).get("v"));
|
||||
var v1 = m.get("mvert", m.get("mloop", loopstart + 1).get("v"));
|
||||
var v2 = m.get("mvert", m.get("mloop", loopstart + 2).get("v"));
|
||||
var co0 = v0.get("co");
|
||||
var co1 = v1.get("co");
|
||||
var co2 = v2.get("co");
|
||||
var no0 = v0.get("no");
|
||||
var no1 = v1.get("no");
|
||||
var no2 = v2.get("no");
|
||||
vec0.set(no0[0] / 32767, no0[1] / 32767, no0[2] / 32767).normalize(); // shortmax
|
||||
vec1.set(no1[0] / 32767, no1[1] / 32767, no1[2] / 32767).normalize();
|
||||
vec2.set(no2[0] / 32767, no2[1] / 32767, no2[2] / 32767).normalize();
|
||||
posa32[tri * 9 ] = co0[0];
|
||||
posa32[tri * 9 + 1] = co0[1];
|
||||
posa32[tri * 9 + 2] = co0[2];
|
||||
posa32[tri * 9 + 3] = co1[0];
|
||||
posa32[tri * 9 + 4] = co1[1];
|
||||
posa32[tri * 9 + 5] = co1[2];
|
||||
posa32[tri * 9 + 6] = co2[0];
|
||||
posa32[tri * 9 + 7] = co2[1];
|
||||
posa32[tri * 9 + 8] = co2[2];
|
||||
posa[tri * 12 + 3] = Std.int(vec0.z * 32767);
|
||||
posa[tri * 12 + 7] = Std.int(vec1.z * 32767);
|
||||
posa[tri * 12 + 11] = Std.int(vec2.z * 32767);
|
||||
nora[tri * 6 ] = Std.int(vec0.x * 32767);
|
||||
nora[tri * 6 + 1] = Std.int(vec0.y * 32767);
|
||||
nora[tri * 6 + 2] = Std.int(vec1.x * 32767);
|
||||
nora[tri * 6 + 3] = Std.int(vec1.y * 32767);
|
||||
nora[tri * 6 + 4] = Std.int(vec2.x * 32767);
|
||||
nora[tri * 6 + 5] = Std.int(vec2.y * 32767);
|
||||
var totpoly = m.get("totpoly");
|
||||
if (totpoly == 0) continue;
|
||||
|
||||
var uv0:Float32Array = null;
|
||||
var uv1:Float32Array = null;
|
||||
var uv2:Float32Array = null;
|
||||
if (hasuv) {
|
||||
uv0 = m.get("mloopuv", loopstart ).get("uv");
|
||||
uv1 = m.get("mloopuv", loopstart + 1).get("uv");
|
||||
uv2 = m.get("mloopuv", loopstart + 2).get("uv");
|
||||
texa[tri * 6 ] = Std.int(uv0[0] * 32767);
|
||||
texa[tri * 6 + 1] = Std.int((1.0 - uv0[1]) * 32767);
|
||||
texa[tri * 6 + 2] = Std.int(uv1[0] * 32767);
|
||||
texa[tri * 6 + 3] = Std.int((1.0 - uv1[1]) * 32767);
|
||||
texa[tri * 6 + 4] = Std.int(uv2[0] * 32767);
|
||||
texa[tri * 6 + 5] = Std.int((1.0 - uv2[1]) * 32767);
|
||||
}
|
||||
tri++;
|
||||
var numtri = 0;
|
||||
for (i in 0...totpoly) {
|
||||
var poly = m.get("mpoly", i);
|
||||
var totloop = poly.get("totloop");
|
||||
numtri += totloop - 2;
|
||||
}
|
||||
var inda = new Uint32Array(numtri * 3);
|
||||
for (i in 0...inda.length) inda[i] = i;
|
||||
|
||||
if (totloop >= 4) {
|
||||
var v3 = m.get("mvert", m.get("mloop", loopstart + 3).get("v"));
|
||||
var co3 = v3.get("co");
|
||||
var no3 = v3.get("no");
|
||||
vec3.set(no3[0] / 32767, no3[1] / 32767, no3[2] / 32767).normalize();
|
||||
posa32[tri * 9 ] = co2[0];
|
||||
posa32[tri * 9 + 1] = co2[1];
|
||||
posa32[tri * 9 + 2] = co2[2];
|
||||
posa32[tri * 9 + 3] = co3[0];
|
||||
posa32[tri * 9 + 4] = co3[1];
|
||||
posa32[tri * 9 + 5] = co3[2];
|
||||
posa32[tri * 9 + 6] = co0[0];
|
||||
posa32[tri * 9 + 7] = co0[1];
|
||||
posa32[tri * 9 + 8] = co0[2];
|
||||
posa[tri * 12 + 3] = Std.int(vec2.z * 32767);
|
||||
posa[tri * 12 + 7] = Std.int(vec3.z * 32767);
|
||||
posa[tri * 12 + 11] = Std.int(vec0.z * 32767);
|
||||
nora[tri * 6 ] = Std.int(vec2.x * 32767);
|
||||
nora[tri * 6 + 1] = Std.int(vec2.y * 32767);
|
||||
nora[tri * 6 + 2] = Std.int(vec3.x * 32767);
|
||||
nora[tri * 6 + 3] = Std.int(vec3.y * 32767);
|
||||
nora[tri * 6 + 4] = Std.int(vec0.x * 32767);
|
||||
nora[tri * 6 + 5] = Std.int(vec0.y * 32767);
|
||||
var posa32 = new Float32Array(numtri * 3 * 4);
|
||||
var posa = new Int16Array(numtri * 3 * 4);
|
||||
var nora = new Int16Array(numtri * 3 * 2);
|
||||
var hasuv = m.get("mloopuv") != null;
|
||||
var texa = hasuv ? new Int16Array(numtri * 3 * 2) : null;
|
||||
|
||||
var tri = 0;
|
||||
var vec0 = new Vec4();
|
||||
var vec1 = new Vec4();
|
||||
var vec2 = new Vec4();
|
||||
var vec3 = new Vec4();
|
||||
for (i in 0...totpoly) {
|
||||
var poly = m.get("mpoly", i);
|
||||
var loopstart = poly.get("loopstart");
|
||||
var totloop = poly.get("totloop");
|
||||
if (totloop == 3) {
|
||||
var v0 = m.get("mvert", m.get("mloop", loopstart ).get("v"));
|
||||
var v1 = m.get("mvert", m.get("mloop", loopstart + 1).get("v"));
|
||||
var v2 = m.get("mvert", m.get("mloop", loopstart + 2).get("v"));
|
||||
var co0 = v0.get("co");
|
||||
var co1 = v1.get("co");
|
||||
var co2 = v2.get("co");
|
||||
var no0 = v0.get("no");
|
||||
var no1 = v1.get("no");
|
||||
var no2 = v2.get("no");
|
||||
vec0.set(no0[0] / 32767, no0[1] / 32767, no0[2] / 32767).normalize(); // shortmax
|
||||
vec1.set(no1[0] / 32767, no1[1] / 32767, no1[2] / 32767).normalize();
|
||||
vec2.set(no2[0] / 32767, no2[1] / 32767, no2[2] / 32767).normalize();
|
||||
posa32[tri * 9 ] = co0[0];
|
||||
posa32[tri * 9 + 1] = co0[1];
|
||||
posa32[tri * 9 + 2] = co0[2];
|
||||
posa32[tri * 9 + 3] = co1[0];
|
||||
posa32[tri * 9 + 4] = co1[1];
|
||||
posa32[tri * 9 + 5] = co1[2];
|
||||
posa32[tri * 9 + 6] = co2[0];
|
||||
posa32[tri * 9 + 7] = co2[1];
|
||||
posa32[tri * 9 + 8] = co2[2];
|
||||
posa[tri * 12 + 3] = Std.int(vec0.z * 32767);
|
||||
posa[tri * 12 + 7] = Std.int(vec1.z * 32767);
|
||||
posa[tri * 12 + 11] = Std.int(vec2.z * 32767);
|
||||
nora[tri * 6 ] = Std.int(vec0.x * 32767);
|
||||
nora[tri * 6 + 1] = Std.int(vec0.y * 32767);
|
||||
nora[tri * 6 + 2] = Std.int(vec1.x * 32767);
|
||||
nora[tri * 6 + 3] = Std.int(vec1.y * 32767);
|
||||
nora[tri * 6 + 4] = Std.int(vec2.x * 32767);
|
||||
nora[tri * 6 + 5] = Std.int(vec2.y * 32767);
|
||||
if (hasuv) {
|
||||
var uv3 = m.get("mloopuv", loopstart + 3).get("uv");
|
||||
texa[tri * 6 ] = Std.int(uv2[0] * 32767);
|
||||
texa[tri * 6 + 1] = Std.int((1.0 - uv2[1]) * 32767);
|
||||
texa[tri * 6 + 2] = Std.int(uv3[0] * 32767);
|
||||
texa[tri * 6 + 3] = Std.int((1.0 - uv3[1]) * 32767);
|
||||
texa[tri * 6 + 4] = Std.int(uv0[0] * 32767);
|
||||
texa[tri * 6 + 5] = Std.int((1.0 - uv0[1]) * 32767);
|
||||
var uv0:Float32Array = m.get("mloopuv", loopstart ).get("uv");
|
||||
var uv1:Float32Array = m.get("mloopuv", loopstart + 1).get("uv");
|
||||
var uv2:Float32Array = m.get("mloopuv", loopstart + 2).get("uv");
|
||||
texa[tri * 6 ] = Std.int(uv0[0] * 32767);
|
||||
texa[tri * 6 + 1] = Std.int((1.0 - uv0[1]) * 32767);
|
||||
texa[tri * 6 + 2] = Std.int(uv1[0] * 32767);
|
||||
texa[tri * 6 + 3] = Std.int((1.0 - uv1[1]) * 32767);
|
||||
texa[tri * 6 + 4] = Std.int(uv2[0] * 32767);
|
||||
texa[tri * 6 + 5] = Std.int((1.0 - uv2[1]) * 32767);
|
||||
}
|
||||
tri++;
|
||||
}
|
||||
else {
|
||||
var v0 = m.get("mvert", m.get("mloop", loopstart + totloop - 1).get("v"));
|
||||
var v1 = m.get("mvert", m.get("mloop", loopstart).get("v"));
|
||||
var co0 = v0.get("co");
|
||||
var co1 = v1.get("co");
|
||||
var no0 = v0.get("no");
|
||||
var no1 = v1.get("no");
|
||||
vec0.set(no0[0] / 32767, no0[1] / 32767, no0[2] / 32767).normalize(); // shortmax
|
||||
vec1.set(no1[0] / 32767, no1[1] / 32767, no1[2] / 32767).normalize();
|
||||
var uv0:Float32Array = null;
|
||||
var uv1:Float32Array = null;
|
||||
var uv2:Float32Array = null;
|
||||
if (hasuv) {
|
||||
uv0 = m.get("mloopuv", loopstart + totloop - 1).get("uv");
|
||||
uv1 = m.get("mloopuv", loopstart).get("uv");
|
||||
}
|
||||
for (j in 0...totloop - 2) {
|
||||
var v2 = m.get("mvert", m.get("mloop", loopstart + j + 1).get("v"));
|
||||
var co2 = v2.get("co");
|
||||
var no2 = v2.get("no");
|
||||
vec2.set(no2[0] / 32767, no2[1] / 32767, no2[2] / 32767).normalize();
|
||||
posa32[tri * 9 ] = co0[0];
|
||||
posa32[tri * 9 + 1] = co0[1];
|
||||
posa32[tri * 9 + 2] = co0[2];
|
||||
posa32[tri * 9 + 3] = co1[0];
|
||||
posa32[tri * 9 + 4] = co1[1];
|
||||
posa32[tri * 9 + 5] = co1[2];
|
||||
posa32[tri * 9 + 6] = co2[0];
|
||||
posa32[tri * 9 + 7] = co2[1];
|
||||
posa32[tri * 9 + 8] = co2[2];
|
||||
posa[tri * 12 + 3] = Std.int(vec0.z * 32767);
|
||||
posa[tri * 12 + 7] = Std.int(vec1.z * 32767);
|
||||
posa[tri * 12 + 11] = Std.int(vec2.z * 32767);
|
||||
nora[tri * 6 ] = Std.int(vec0.x * 32767);
|
||||
nora[tri * 6 + 1] = Std.int(vec0.y * 32767);
|
||||
nora[tri * 6 + 2] = Std.int(vec1.x * 32767);
|
||||
nora[tri * 6 + 3] = Std.int(vec1.y * 32767);
|
||||
nora[tri * 6 + 4] = Std.int(vec2.x * 32767);
|
||||
nora[tri * 6 + 5] = Std.int(vec2.y * 32767);
|
||||
co1 = co2;
|
||||
no1 = no2;
|
||||
vec1.setFrom(vec2);
|
||||
if (hasuv) {
|
||||
uv2 = m.get("mloopuv", loopstart + j + 1).get("uv");
|
||||
texa[tri * 6 ] = Std.int(uv0[0] * 32767);
|
||||
texa[tri * 6 + 1] = Std.int((1.0 - uv0[1]) * 32767);
|
||||
texa[tri * 6 + 2] = Std.int(uv1[0] * 32767);
|
||||
texa[tri * 6 + 3] = Std.int((1.0 - uv1[1]) * 32767);
|
||||
texa[tri * 6 + 4] = Std.int(uv2[0] * 32767);
|
||||
texa[tri * 6 + 5] = Std.int((1.0 - uv2[1]) * 32767);
|
||||
uv1 = uv2;
|
||||
}
|
||||
tri++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Apply world matrix
|
||||
var obmat = ob.get("obmat", 0, "float", 16);
|
||||
var mat = iron.math.Mat4.fromFloat32Array(obmat).transpose();
|
||||
var v = new iron.math.Vec4();
|
||||
for (i in 0...Std.int(posa32.length / 3)) {
|
||||
v.set(posa32[i * 3], posa32[i * 3 + 1], posa32[i * 3 + 2]);
|
||||
v.applymat4(mat);
|
||||
posa32[i * 3 ] = v.x;
|
||||
posa32[i * 3 + 1] = v.y;
|
||||
posa32[i * 3 + 2] = v.z;
|
||||
}
|
||||
mat.getInverse(mat);
|
||||
mat.transpose3x3();
|
||||
for (i in 0...Std.int(nora.length / 2)) {
|
||||
v.set(nora[i * 2] / 32767, nora[i * 2 + 1] / 32767, posa[i * 4 + 3] / 32767);
|
||||
v.applymat(mat);
|
||||
v.normalize();
|
||||
nora[i * 2 ] = Std.int(v.x * 32767);
|
||||
nora[i * 2 + 1] = Std.int(v.y * 32767);
|
||||
posa[i * 4 + 3] = Std.int(v.z * 32767);
|
||||
}
|
||||
|
||||
// Pack positions to (-1, 1) range
|
||||
var scalePos = 0.0;
|
||||
for (i in 0...posa32.length) {
|
||||
var f = Math.abs(posa32[i]);
|
||||
if (scalePos < f) scalePos = f;
|
||||
}
|
||||
var inv = 1 / scalePos;
|
||||
for (i in 0...Std.int(posa32.length / 3)) {
|
||||
posa[i * 4 ] = Std.int(posa32[i * 3 ] * 32767 * inv);
|
||||
posa[i * 4 + 1] = Std.int(posa32[i * 3 + 1] * 32767 * inv);
|
||||
posa[i * 4 + 2] = Std.int(posa32[i * 3 + 2] * 32767 * inv);
|
||||
}
|
||||
|
||||
var obj = {posa: posa, nora: nora, texa: texa, inda: inda, name: name, scalePos: scalePos, scaleTes: 1.0};
|
||||
|
||||
first ? ImportMesh.makeMesh(obj, path) : ImportMesh.addMesh(obj);
|
||||
first = false;
|
||||
}
|
||||
|
||||
// Pack positions to (-1, 1) range
|
||||
var hx = 0.0;
|
||||
var hy = 0.0;
|
||||
var hz = 0.0;
|
||||
for (i in 0...Std.int(posa32.length / 3)) {
|
||||
var f = Math.abs(posa32[i * 3]);
|
||||
if (hx < f) hx = f;
|
||||
f = Math.abs(posa32[i * 3 + 1]);
|
||||
if (hy < f) hy = f;
|
||||
f = Math.abs(posa32[i * 3 + 2]);
|
||||
if (hz < f) hz = f;
|
||||
}
|
||||
var scalePos = Math.max(hx, Math.max(hy, hz));
|
||||
var inv = 1 / scalePos;
|
||||
for (i in 0...Std.int(posa32.length / 3)) {
|
||||
posa[i * 4 ] = Std.int(posa32[i * 3 ] * 32767 * inv);
|
||||
posa[i * 4 + 1] = Std.int(posa32[i * 3 + 1] * 32767 * inv);
|
||||
posa[i * 4 + 2] = Std.int(posa32[i * 3 + 2] * 32767 * inv);
|
||||
}
|
||||
|
||||
var name:String = m.get("id").get("name");
|
||||
name = name.substring(2, name.length);
|
||||
var obj = {posa: posa, nora: nora, texa: texa, inda: inda, name: name, scalePos: scalePos, scaleTes: 1.0};
|
||||
ImportMesh.makeMesh(obj, path);
|
||||
Data.deleteBlob(path);
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user