diff --git a/Assets/plugins/embed/uv_unwrap.js b/Assets/plugins/embed/uv_unwrap.js new file mode 100644 index 00000000..19813b95 --- /dev/null +++ b/Assets/plugins/embed/uv_unwrap.js @@ -0,0 +1,88 @@ + +let a = Krom_uv_unwrap; +class R { + get buffer() { return Krom_uv_unwrap._buffer(); } +} +let r = new R(); + +// uv_unwrap.js +let plugin = new arm.Plugin(); +let h1 = new zui.Handle(); +plugin.drawUI = function(ui) { + if (ui.panel(h1, "UV Unwrap")) { + if (ui.button("Unwrap Mesh")) { + + for (const po of arm.Project.paintObjects) { + + let raw = po.data.raw; + let positions = raw.vertex_arrays[0].values; + let normals = raw.vertex_arrays[1].values; + let indices = raw.index_arrays[0].values; + let vertexCount = positions.length / 4; + let indexCount = indices.length; + + a._setVertexCount(vertexCount); + a._setIndexCount(indexCount); + let pa = new Float32Array(r.buffer, a._setPositions(), vertexCount * 3); + let na = new Float32Array(r.buffer, a._setNormals(), vertexCount * 3); + let ia = new Uint32Array(r.buffer, a._setIndices(), indexCount); + + let inv = 1 / 32767; + + for (let i = 0; i < vertexCount; i++) { + pa[i * 3 ] = positions[i * 4 ] * inv; + pa[i * 3 + 1] = positions[i * 4 + 1] * inv; + pa[i * 3 + 2] = positions[i * 4 + 2] * inv; + na[i * 3 ] = normals [i * 2 ] * inv; + na[i * 3 + 1] = normals [i * 2 + 1] * inv; + na[i * 3 + 2] = positions[i * 4 + 3] * inv; + } + for (let i = 0; i < indexCount; i++) { + ia[i] = indices[i]; + } + + a._unwrap(); + + vertexCount = a._getVertexCount(); + indexCount = a._getIndexCount(); + pa = new Float32Array(r.buffer, a._getPositions(), vertexCount * 3); + na = new Float32Array(r.buffer, a._getNormals(), vertexCount * 3); + let ua = new Float32Array(r.buffer, a._getUVs(), vertexCount * 2); + ia = new Uint32Array(r.buffer, a._getIndices(), indexCount); + + let pa16 = new Int16Array(vertexCount * 4); + let na16 = new Int16Array(vertexCount * 2); + let ua16 = new Int16Array(vertexCount * 2); + let ia32 = new Uint32Array(indexCount); + + for (let i = 0; i < vertexCount; i++) { + pa16[i * 4 ] = pa[i * 3 ] / inv; + pa16[i * 4 + 1] = pa[i * 3 + 1] / inv; + pa16[i * 4 + 2] = pa[i * 3 + 2] / inv; + pa16[i * 4 + 3] = na[i * 3 + 2] / inv; + na16[i * 2 ] = na[i * 3 ] / inv; + na16[i * 2 + 1] = na[i * 3 + 1] / inv; + ua16[i * 2 ] = ua[i * 2 ] / inv; + ua16[i * 2 + 1] = ua[i * 2 + 1] / inv; + } + for (let i = 0; i < indexCount; i++) { + ia32[i] = ia[i]; + } + + po.data.raw.vertex_arrays[0].values = pa16; + po.data.raw.vertex_arrays[1].values = na16; + po.data.raw.vertex_arrays[2].values = ua16; + po.data.raw.index_arrays[0].values = ia32; + + let geom = po.data.geom; + geom.indices[0] = ia32; + geom.ready = false; + geom.build(); + + a._destroy(); + } + + arm.MeshUtil.mergeMesh(); + } + } +} diff --git a/Assets/plugins/import_gltf_glb.js b/Assets/plugins/wasm/import_gltf_glb.js similarity index 100% rename from Assets/plugins/import_gltf_glb.js rename to Assets/plugins/wasm/import_gltf_glb.js diff --git a/Assets/plugins/import_gltf_glb.wasm b/Assets/plugins/wasm/import_gltf_glb.wasm similarity index 100% rename from Assets/plugins/import_gltf_glb.wasm rename to Assets/plugins/wasm/import_gltf_glb.wasm diff --git a/Assets/plugins/import_svg.js b/Assets/plugins/wasm/import_svg.js similarity index 100% rename from Assets/plugins/import_svg.js rename to Assets/plugins/wasm/import_svg.js diff --git a/Assets/plugins/import_svg.wasm b/Assets/plugins/wasm/import_svg.wasm similarity index 100% rename from Assets/plugins/import_svg.wasm rename to Assets/plugins/wasm/import_svg.wasm diff --git a/Assets/plugins/import_usdc.js b/Assets/plugins/wasm/import_usdc.js similarity index 100% rename from Assets/plugins/import_usdc.js rename to Assets/plugins/wasm/import_usdc.js diff --git a/Assets/plugins/import_usdc.wasm b/Assets/plugins/wasm/import_usdc.wasm similarity index 100% rename from Assets/plugins/import_usdc.wasm rename to Assets/plugins/wasm/import_usdc.wasm diff --git a/Assets/plugins/uv_unwrap.js b/Assets/plugins/wasm/uv_unwrap.js similarity index 100% rename from Assets/plugins/uv_unwrap.js rename to Assets/plugins/wasm/uv_unwrap.js diff --git a/Assets/plugins/uv_unwrap.wasm b/Assets/plugins/wasm/uv_unwrap.wasm similarity index 100% rename from Assets/plugins/uv_unwrap.wasm rename to Assets/plugins/wasm/uv_unwrap.wasm diff --git a/README.md b/README.md index 3bea0923..98f1a07d 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,7 @@ cp -a build/krom/ armorcore/Deployment cd armorcore git apply patch/ios_document_picker.diff --directory=Kinc git apply patch/metal_depth.diff --directory=Kinc +git clone https://github.com/armory3d/armorpaint_plugins Libraries/plugins node Kinc/make ios -g metal # Open generated Xcode project `build/ArmorPaint.xcodeproj` # Set iOS Deployment Target to 11.0 diff --git a/khafile.js b/khafile.js index 72389e08..2d06c373 100644 --- a/khafile.js +++ b/khafile.js @@ -9,6 +9,7 @@ let raytrace = d3d12 || vulkan; let metal = process.argv.indexOf("metal") >= 0; let vr = process.argv.indexOf("--vr") >= 0; let snapshot = process.argv.indexOf("--snapshot") >= 0; +let plugin_embed = ios; let project = new Project("ArmorPaint"); project.addSources("Sources"); @@ -28,6 +29,12 @@ project.addAssets("Assets/keymap_presets/*", { destination: "data/keymap_presets project.addAssets("Assets/locale/*", { destination: "data/locale/{name}" }); project.addAssets("Assets/licenses/**", { destination: "data/licenses/{name}" }); project.addAssets("Assets/plugins/*", { destination: "data/plugins/{name}" }); +if (plugin_embed) { + project.addAssets("Assets/plugins/embed/*", { destination: "data/plugins/{name}" }); +} +else { + project.addAssets("Assets/plugins/wasm/*", { destination: "data/plugins/{name}" }); +} project.addAssets("Assets/meshes/*", { destination: "data/meshes/{name}" }); project.addAssets("Libraries/armorbase/Assets/licenses/**", { destination: "data/licenses/{name}" }); project.addAssets("Libraries/armorbase/Assets/themes/*.json", { destination: "data/themes/{name}" });