diff --git a/Sources/arm/Project.hx b/Sources/arm/Project.hx index fb9bd337..7cc03cf7 100644 --- a/Sources/arm/Project.hx +++ b/Sources/arm/Project.hx @@ -113,7 +113,8 @@ class Project { if (UITrait.inst.projectType > 0) { var mesh:Dynamic = UITrait.inst.projectType == 1 ? - new iron.format.proc.Sphere(1, 512, 256) : + // new iron.format.proc.Sphere(1, 512, 256) : + new iron.format.proc.Plane(1, 1, 512, 512) : new iron.format.proc.Plane(1, 1, 512, 512); var raw = { name: "Tesselated", @@ -131,7 +132,7 @@ class Project { var md = new MeshData(raw, function(md:MeshData) {}); Data.cachedMeshes.set("SceneTesselated", md); - if (UITrait.inst.projectType == 2) { + if (UITrait.inst.projectType == 1 || UITrait.inst.projectType == 2) { ViewportUtil.setView(0, 0, 1, 0, 0, 0); // Top ViewportUtil.orbit(0, Math.PI / 6); // Orbit down } @@ -201,7 +202,8 @@ typedef TProjectFormat = { } typedef TLayerData = { - public var res:Int; + public var res:Int; // Width pixels + public var bpp:Int; // Bits per pixel public var texpaint:haxe.io.Bytes; public var texpaint_nor:haxe.io.Bytes; public var texpaint_pack:haxe.io.Bytes; diff --git a/Sources/arm/io/ExportArm.hx b/Sources/arm/io/ExportArm.hx index d5fcaa17..1ee99bba 100644 --- a/Sources/arm/io/ExportArm.hx +++ b/Sources/arm/io/ExportArm.hx @@ -55,10 +55,14 @@ class ExportArm { } } + var bitsPos = UITrait.inst.bitsHandle.position; + var bpp = bitsPos == 0 ? 8 : bitsPos == 1 ? 16 : 32; + var ld:Array = []; for (l in Project.layers) { ld.push({ res: l.texpaint.width, + bpp: bpp, texpaint: Lz4.encode(l.texpaint.getPixels()), texpaint_nor: Lz4.encode(l.texpaint_nor.getPixels()), texpaint_pack: Lz4.encode(l.texpaint_pack.getPixels()), diff --git a/Sources/arm/io/ImportArm.hx b/Sources/arm/io/ImportArm.hx index f987aaf0..f9237fdb 100644 --- a/Sources/arm/io/ImportArm.hx +++ b/Sources/arm/io/ImportArm.hx @@ -4,6 +4,8 @@ import haxe.io.Bytes; import kha.Window; import kha.Blob; import kha.Image; +import kha.graphics4.TextureFormat; +import kha.graphics4.DepthStencilFormat; import iron.data.MaterialData; import iron.data.MeshData; import iron.data.Data; @@ -143,7 +145,13 @@ class ImportArm { Context.paintObject.skip_context = "paint"; Context.mergedObject.visible = true; - UITrait.inst.resHandle.position = Config.getTextureResPos(project.layer_datas[0].res); + var l0 = project.layer_datas[0]; + UITrait.inst.resHandle.position = Config.getTextureResPos(l0.res); + if (l0.bpp == null) l0.bpp = 8; // TODO: deprecated + var bitsPos = l0.bpp == 8 ? 0 : l0.bpp == 16 ? 1 : 2; + UITrait.inst.bitsHandle.position = bitsPos; + var bytesPerPixel = Std.int(l0.bpp / 8); + var format = l0.bpp == 8 ? TextureFormat.RGBA32 : l0.bpp == 16 ? TextureFormat.RGBA64 : TextureFormat.RGBA128; if (Project.layers[0].texpaint.width != Config.getTextureRes()) { for (l in Project.layers) l.resizeAndSetBits(); @@ -152,14 +160,16 @@ class ImportArm { rts.get("texpaint_blend0").image.unload(); rts.get("texpaint_blend0").raw.width = Config.getTextureRes(); rts.get("texpaint_blend0").raw.height = Config.getTextureRes(); - rts.get("texpaint_blend0").image = Image.createRenderTarget(Config.getTextureRes(), Config.getTextureRes(), kha.graphics4.TextureFormat.L8, kha.graphics4.DepthStencilFormat.NoDepthAndStencil); + rts.get("texpaint_blend0").image = Image.createRenderTarget(Config.getTextureRes(), Config.getTextureRes(), TextureFormat.L8, DepthStencilFormat.NoDepthAndStencil); rts.get("texpaint_blend1").image.unload(); rts.get("texpaint_blend1").raw.width = Config.getTextureRes(); rts.get("texpaint_blend1").raw.height = Config.getTextureRes(); - rts.get("texpaint_blend1").image = Image.createRenderTarget(Config.getTextureRes(), Config.getTextureRes(), kha.graphics4.TextureFormat.L8, kha.graphics4.DepthStencilFormat.NoDepthAndStencil); + rts.get("texpaint_blend1").image = Image.createRenderTarget(Config.getTextureRes(), Config.getTextureRes(), TextureFormat.L8, DepthStencilFormat.NoDepthAndStencil); Context.brushBlendDirty = true; } + + // for (l in Project.layers) l.unload(); Project.layers = []; for (i in 0...project.layer_datas.length) { @@ -168,19 +178,19 @@ class ImportArm { Project.layers.push(l); // TODO: create render target from bytes - var texpaint = Image.fromBytes(Lz4.decode(ld.texpaint, ld.res * ld.res * 4), ld.res, ld.res); + var texpaint = Image.fromBytes(Lz4.decode(ld.texpaint, ld.res * ld.res * 4 * bytesPerPixel), ld.res, ld.res, format); l.texpaint.g2.begin(false); l.texpaint.g2.drawImage(texpaint, 0, 0); l.texpaint.g2.end(); // texpaint.unload(); - var texpaint_nor = Image.fromBytes(Lz4.decode(ld.texpaint_nor, ld.res * ld.res * 4), ld.res, ld.res); + var texpaint_nor = Image.fromBytes(Lz4.decode(ld.texpaint_nor, ld.res * ld.res * 4 * bytesPerPixel), ld.res, ld.res, format); l.texpaint_nor.g2.begin(false); l.texpaint_nor.g2.drawImage(texpaint_nor, 0, 0); l.texpaint_nor.g2.end(); // texpaint_nor.unload(); - var texpaint_pack = Image.fromBytes(Lz4.decode(ld.texpaint_pack, ld.res * ld.res * 4), ld.res, ld.res); + var texpaint_pack = Image.fromBytes(Lz4.decode(ld.texpaint_pack, ld.res * ld.res * 4 * bytesPerPixel), ld.res, ld.res, format); l.texpaint_pack.g2.begin(false); l.texpaint_pack.g2.drawImage(texpaint_pack, 0, 0); l.texpaint_pack.g2.end(); @@ -188,7 +198,7 @@ class ImportArm { if (ld.texpaint_mask != null) { l.createMask(0, false); - var texpaint_mask = Image.fromBytes(Lz4.decode(ld.texpaint_mask, ld.res * ld.res), ld.res, ld.res, kha.graphics4.TextureFormat.L8); + var texpaint_mask = Image.fromBytes(Lz4.decode(ld.texpaint_mask, ld.res * ld.res), ld.res, ld.res, TextureFormat.L8); l.texpaint_mask.g2.begin(false); l.texpaint_mask.g2.drawImage(texpaint_mask, 0, 0); l.texpaint_mask.g2.end(); diff --git a/Sources/arm/nodes/MaterialBuilder.hx b/Sources/arm/nodes/MaterialBuilder.hx index b86d0f68..2dc46929 100644 --- a/Sources/arm/nodes/MaterialBuilder.hx +++ b/Sources/arm/nodes/MaterialBuilder.hx @@ -995,16 +995,11 @@ class MaterialBuilder { // Height if (heightUsed) { - frag.write('vec4 vech;'); - frag.write('vech.x = textureOffsetShared(texpaint_pack, texCoord, ivec2(-1, 0)).a;'); - frag.write('vech.y = textureOffsetShared(texpaint_pack, texCoord, ivec2(1, 0)).a;'); - frag.write('vech.z = textureOffsetShared(texpaint_pack, texCoord, ivec2(0, -1)).a;'); - frag.write('vech.w = textureOffsetShared(texpaint_pack, texCoord, ivec2(0, 1)).a;'); - // Displace normal strength - frag.write('vech *= 15 * 7; float h1 = vech.x - vech.y; float h2 = vech.z - vech.w;'); - frag.write('vec3 va = normalize(vec3(2.0, 0.0, h1));'); - frag.write('vec3 vb = normalize(vec3(0.0, 2.0, h2));'); - frag.write('vec3 vc = normalize(vec3(h1, h2, 2.0));'); + frag.write('float bump_res_x = dFdx(pack.a) * 32.0;'); + frag.write('float bump_res_y = dFdy(pack.a) * 32.0;'); + frag.write('vec3 va = normalize(vec3(1.0, 0.0, bump_res_x));'); + frag.write('vec3 vb = normalize(vec3(0.0, 1.0, bump_res_y));'); + frag.write('vec3 vc = normalize(vec3(bump_res_x, bump_res_y, 1.0));'); frag.write('n = normalize(mul(n, mat3(va, vb, vc)));'); } // diff --git a/Sources/arm/nodes/NodesMaterial.hx b/Sources/arm/nodes/NodesMaterial.hx index 05d69b5e..c89fdffd 100644 --- a/Sources/arm/nodes/NodesMaterial.hx +++ b/Sources/arm/nodes/NodesMaterial.hx @@ -1241,14 +1241,14 @@ class NodesMaterial { { name: "blend_type", type: "ENUM", - data: ["Mix", "Add", "Multiply", "Subtract", "Screen", "Divide", "Difference", "Darken", "Lighten", "Soft Light"], + data: ["Mix", "Add", "Multiply", "Subtract", "Screen", "Divide", "Difference", "Darken", "Lighten", "Overlay", "Dodge", "Burn", "Hue", "Saturation", "Value", "Color", "Soft Light", "Linear Light"], default_value: 0, output: 0 }, { name: "use_clamp", type: "BOOL", - default_value: "false", + default_value: false, output: 0 } ] @@ -1673,7 +1673,7 @@ class NodesMaterial { { name: "use_clamp", type: "BOOL", - default_value: "false", + default_value: false, output: 0 } ] diff --git a/Sources/arm/ui/UINodes.hx b/Sources/arm/ui/UINodes.hx index 251adecc..fdc3a6af 100644 --- a/Sources/arm/ui/UINodes.hx +++ b/Sources/arm/ui/UINodes.hx @@ -463,7 +463,7 @@ class UINodes { } public function acceptDrag(assetIndex:Int) { - var n = NodesMaterial.createImageTexture(); + var n = canvasType == 0 ? NodesMaterial.createImageTexture() : NodesBrush.createImageTexture(); n.buttons[0].default_value = assetIndex; nodes.nodesSelected = [n]; }