From b6f33c7052d503244ca4833722531efccce533ff Mon Sep 17 00:00:00 2001 From: luboslenco Date: Sun, 17 Jan 2021 15:50:42 +0100 Subject: [PATCH] Fix material split for obj import --- Sources/arm/io/ImportObj.hx | 31 ++++++++++++++++++++++++++++--- 1 file changed, 28 insertions(+), 3 deletions(-) diff --git a/Sources/arm/io/ImportObj.hx b/Sources/arm/io/ImportObj.hx index 3a7ea70e..d655f79a 100644 --- a/Sources/arm/io/ImportObj.hx +++ b/Sources/arm/io/ImportObj.hx @@ -56,13 +56,37 @@ class ImportObj { texa1 = parts[j].texa != null ? parts[j].texa : null; inda0 = parts[i].inda; inda1 = parts[j].inda; + var voff = Std.int(posa0.length / 4); + // Repack merged positions + var posa32 = new kha.arrays.Float32Array(Std.int(posa0.length / 4) * 3 + Std.int(posa1.length / 4) * 3); + for (k in 0...Std.int(posa0.length / 4)) { + posa32[k * 3 ] = posa0[k * 4 ] / 32767 * parts[i].scalePos; + posa32[k * 3 + 1] = posa0[k * 4 + 1] / 32767 * parts[i].scalePos; + posa32[k * 3 + 2] = posa0[k * 4 + 2] / 32767 * parts[i].scalePos; + } + for (k in 0...Std.int(posa1.length / 4)) { + posa32[voff * 3 + k * 3 ] = posa1[k * 4 ] / 32767 * parts[j].scalePos; + posa32[voff * 3 + k * 3 + 1] = posa1[k * 4 + 1] / 32767 * parts[j].scalePos; + posa32[voff * 3 + k * 3 + 2] = posa1[k * 4 + 2] / 32767 * parts[j].scalePos; + } + var scalePos = 0.0; + for (k in 0...posa32.length) { + var f = Math.abs(posa32[k]); + if (scalePos < f) scalePos = f; + } + var inv = 32767 * (1 / scalePos); var posa = new kha.arrays.Int16Array(posa0.length + posa1.length); + for (k in 0...Std.int(posa.length / 4)) { + posa[k * 4 ] = Std.int(posa32[k * 3 ] * inv); + posa[k * 4 + 1] = Std.int(posa32[k * 3 + 1] * inv); + posa[k * 4 + 2] = Std.int(posa32[k * 3 + 2] * inv); + } + for (k in 0...Std.int(posa0.length / 4)) posa[k * 4 + 3] = posa0[k * 4 + 3]; + for (k in 0...Std.int(posa1.length / 4)) posa[posa0.length + k * 4 + 3] = posa1[k * 4 + 3]; + // Merge normals and uvs var nora = new kha.arrays.Int16Array(nora0.length + nora1.length); var texa = (texa0 != null && texa1 != null) ? new kha.arrays.Int16Array(texa0.length + texa1.length) : null; var inda = new kha.arrays.Uint32Array(inda0.length + inda1.length); - var voff = Std.int(posa0.length / 4); - js.Syntax.code("posa.set(posa0)"); - js.Syntax.code("posa.set(posa1, posa0.length)"); js.Syntax.code("nora.set(nora0)"); js.Syntax.code("nora.set(nora1, nora0.length)"); if (texa != null) { @@ -75,6 +99,7 @@ class ImportObj { parts[i].nora = nora; parts[i].texa = texa; parts[i].inda = inda; + parts[i].scalePos = scalePos; parts.splice(j, 1); } else j++;