From e94a522360e6069e3bcb07ca90d6fb9f63997d7e Mon Sep 17 00:00:00 2001 From: unknown Date: Tue, 23 Oct 2018 00:50:48 +0200 Subject: [PATCH] Import formats --- Sources/arm/UITrait.hx | 112 +++++++++++++++++++++++++++++++++++++++-- 1 file changed, 109 insertions(+), 3 deletions(-) diff --git a/Sources/arm/UITrait.hx b/Sources/arm/UITrait.hx index 6a74775a..323df815 100644 --- a/Sources/arm/UITrait.hx +++ b/Sources/arm/UITrait.hx @@ -2448,11 +2448,117 @@ void main() { function importBlend(path:String) { iron.data.Data.getBlob(path, function(b:kha.Blob) { var bl = new iron.format.blend.Blend(b); + var m = bl.get("Mesh")[0]; - trace(bl.version); + 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 kha.arrays.Uint32Array(numtri * 3); + for (i in 0...inda.length) inda[i] = i; - // var obj = ; - // makeMesh(obj, path); + var posa = new kha.arrays.Float32Array(numtri * 3 * 3); + var nora = new kha.arrays.Float32Array(numtri * 3 * 3); + var hasuv = m.get("mloopuv") != null; + var texa = hasuv ? new kha.arrays.Float32Array(numtri * 3 * 2) : null; + + var tri = 0; + var vec = new iron.math.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 + 0).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"); + posa[tri * 9 + 0] = co0[0]; + posa[tri * 9 + 1] = co0[1]; + posa[tri * 9 + 2] = co0[2]; + posa[tri * 9 + 3] = co1[0]; + posa[tri * 9 + 4] = co1[1]; + posa[tri * 9 + 5] = co1[2]; + posa[tri * 9 + 6] = co2[0]; + posa[tri * 9 + 7] = co2[1]; + posa[tri * 9 + 8] = co2[2]; + vec.set(no0[0] / 32767, no0[1] / 32767, no0[2] / 32767).normalize(); // shortmax + nora[tri * 9 + 0] = vec.x; + nora[tri * 9 + 1] = vec.y; + nora[tri * 9 + 2] = vec.z; + vec.set(no1[0] / 32767, no1[1] / 32767, no1[2] / 32767).normalize(); + nora[tri * 9 + 3] = vec.x; + nora[tri * 9 + 4] = vec.y; + nora[tri * 9 + 5] = vec.z; + vec.set(no2[0] / 32767, no2[1] / 32767, no2[2] / 32767).normalize(); + nora[tri * 9 + 6] = vec.x; + nora[tri * 9 + 7] = vec.y; + nora[tri * 9 + 8] = vec.z; + var uv0:kha.arrays.Float32Array = null; + var uv1:kha.arrays.Float32Array = null; + var uv2:kha.arrays.Float32Array = null; + if (hasuv) { + uv0 = m.get("mloopuv", loopstart + 0).get("uv"); + uv1 = m.get("mloopuv", loopstart + 1).get("uv"); + uv2 = m.get("mloopuv", loopstart + 2).get("uv"); + texa[tri * 6 + 0] = uv0[0]; + texa[tri * 6 + 1] = 1.0 - uv0[1]; + texa[tri * 6 + 2] = uv1[0]; + texa[tri * 6 + 3] = 1.0 - uv1[1]; + texa[tri * 6 + 4] = uv2[0]; + texa[tri * 6 + 5] = 1.0 - uv2[1]; + } + tri++; + + 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"); + posa[tri * 9 + 0] = co2[0]; + posa[tri * 9 + 1] = co2[1]; + posa[tri * 9 + 2] = co2[2]; + posa[tri * 9 + 3] = co3[0]; + posa[tri * 9 + 4] = co3[1]; + posa[tri * 9 + 5] = co3[2]; + posa[tri * 9 + 6] = co0[0]; + posa[tri * 9 + 7] = co0[1]; + posa[tri * 9 + 8] = co0[2]; + vec.set(no2[0] / 32767, no2[1] / 32767, no2[2] / 32767).normalize(); // shortmax + nora[tri * 9 + 0] = vec.x; + nora[tri * 9 + 1] = vec.y; + nora[tri * 9 + 2] = vec.z; + vec.set(no3[0] / 32767, no3[1] / 32767, no3[2] / 32767).normalize(); + nora[tri * 9 + 3] = vec.x; + nora[tri * 9 + 4] = vec.y; + nora[tri * 9 + 5] = vec.z; + vec.set(no0[0] / 32767, no0[1] / 32767, no0[2] / 32767).normalize(); + nora[tri * 9 + 6] = vec.x; + nora[tri * 9 + 7] = vec.y; + nora[tri * 9 + 8] = vec.z; + if (hasuv) { + var uv3 = m.get("mloopuv", loopstart + 3).get("uv"); + texa[tri * 6 + 0] = uv2[0]; + texa[tri * 6 + 1] = 1.0 - uv2[1]; + texa[tri * 6 + 2] = uv3[0]; + texa[tri * 6 + 3] = 1.0 - uv3[1]; + texa[tri * 6 + 4] = uv0[0]; + texa[tri * 6 + 5] = 1.0 - uv0[1]; + } + tri++; + } + } + } + + var obj = {posa: posa, nora: nora, texa: texa, inda: inda}; + makeMesh(obj, path); }); }