From 809ad88770da6b44e8cea06daaed59645366ad26 Mon Sep 17 00:00:00 2001 From: luboslenco Date: Thu, 14 Sep 2023 17:45:53 +0200 Subject: [PATCH] [lab] Fix path-traced mode --- base/Sources/arm/App.hx | 8 +++++ base/Sources/arm/Enums.hx | 4 +++ base/Sources/arm/render/RenderPathBase.hx | 8 +++++ base/Sources/arm/render/RenderPathRaytrace.hx | 3 +- base/Sources/arm/ui/TabMeshes.hx | 33 +++++++++++++++++-- base/Sources/arm/ui/UIMenubar.hx | 3 ++ 6 files changed, 56 insertions(+), 3 deletions(-) diff --git a/base/Sources/arm/App.hx b/base/Sources/arm/App.hx index e2c1fc91..6eaca282 100644 --- a/base/Sources/arm/App.hx +++ b/base/Sources/arm/App.hx @@ -753,6 +753,14 @@ class App { // Default camera controls Context.raw.cameraControls = Config.raw.camera_controls; + + #if is_lab + arm.App.notifyOnNextFrame(function() { + arm.App.notifyOnNextFrame(function() { + @:privateAccess TabMeshes.setDefaultMesh(".Sphere"); + }); + }); + #end } else if (Context.raw.frame == 3) { Context.raw.ddirty = 3; diff --git a/base/Sources/arm/Enums.hx b/base/Sources/arm/Enums.hx index 2cb23d89..eeffb7c8 100644 --- a/base/Sources/arm/Enums.hx +++ b/base/Sources/arm/Enums.hx @@ -55,6 +55,7 @@ package arm; var ViewMetallic = 5; var ViewOpacity = 6; var ViewHeight = 7; + #if (is_paint || is_sculpt) var ViewEmission = 8; var ViewSubsurface = 9; var ViewTexCoord = 10; @@ -63,6 +64,9 @@ package arm; var ViewObjectID = 13; var ViewMask = 14; var ViewPathTrace = 15; + #else + var ViewPathTrace = 8; + #end } @:enum abstract ChannelType(Int) from Int to Int { diff --git a/base/Sources/arm/render/RenderPathBase.hx b/base/Sources/arm/render/RenderPathBase.hx index 17aa411e..79cd4b29 100644 --- a/base/Sources/arm/render/RenderPathBase.hx +++ b/base/Sources/arm/render/RenderPathBase.hx @@ -195,7 +195,11 @@ class RenderPathBase { #if (kha_direct3d12 || kha_vulkan || kha_metal) if (Context.raw.viewportMode == ViewPathTrace) { + #if is_paint var useLiveLayer = Context.raw.tool == ToolMaterial; + #else + var useLiveLayer = false; + #end RenderPathRaytrace.draw(useLiveLayer); return; } @@ -271,7 +275,11 @@ class RenderPathBase { drawGbuffer(); #if (kha_direct3d12 || kha_vulkan || kha_metal) + #if is_paint var useLiveLayer = Context.raw.tool == ToolMaterial; + #else + var useLiveLayer = false; + #end Context.raw.viewportMode == ViewPathTrace ? RenderPathRaytrace.draw(useLiveLayer) : drawCommands(); #else drawCommands(); diff --git a/base/Sources/arm/render/RenderPathRaytrace.hx b/base/Sources/arm/render/RenderPathRaytrace.hx index 844644c3..3e4a3794 100644 --- a/base/Sources/arm/render/RenderPathRaytrace.hx +++ b/base/Sources/arm/render/RenderPathRaytrace.hx @@ -139,7 +139,8 @@ class RenderPathRaytrace { var md = mo.data; var geom = md.geom; var mo_scale = mo.transform.scale.x; // Uniform scale only - vb_scale = mo.parent.transform.scale.x * md.scalePos * mo_scale; + vb_scale = md.scalePos * mo_scale; + if (mo.parent != null) vb_scale *= mo.parent.transform.scale.x; vb = geom.vertexBuffer; ib = geom.indexBuffers[0]; } diff --git a/base/Sources/arm/ui/TabMeshes.hx b/base/Sources/arm/ui/TabMeshes.hx index 7e7aef48..3ad9776e 100644 --- a/base/Sources/arm/ui/TabMeshes.hx +++ b/base/Sources/arm/ui/TabMeshes.hx @@ -2,6 +2,7 @@ package arm.ui; import zui.Zui; import zui.Id; +import iron.data.MeshData; import iron.object.MeshObject; import arm.util.MeshUtil; @@ -150,11 +151,39 @@ class TabMeshes { #if is_lab static function setDefaultMesh(name: String) { - var mo: MeshObject = cast iron.Scene.active.getChild(name); + var mo: MeshObject = null; + if (name == ".Plane" || name == ".Sphere") { + var mesh: Dynamic = name == ".Plane" ? new arm.geom.Plane(1, 1, 2048, 2048) : new arm.geom.Sphere(0.9, 2048, 1024, false, 3.0); + var raw = { + name: "Tessellated", + vertex_arrays: [ + { values: mesh.posa, attrib: "pos", data: "short4norm" }, + { values: mesh.nora, attrib: "nor", data: "short2norm" }, + { values: mesh.texa, attrib: "tex", data: "short2norm" } + ], + index_arrays: [ + { values: mesh.inda, material: 0 } + ], + scale_pos: mesh.scalePos, + scale_tex: mesh.scaleTex + }; + var md = new MeshData(raw, function(md: MeshData) {}); + mo = new MeshObject(md, Context.raw.paintObject.materials); + iron.Scene.active.meshes.remove(mo); + mo.name = "Tessellated"; + } + else { + mo = cast iron.Scene.active.getChild(name); + } + mo.visible = true; - iron.Scene.active.meshes = [mo]; Context.raw.ddirty = 2; Context.raw.paintObject = mo; + Project.paintObjects[0] = mo; + if (UIHeader.inst.worktab.position == Space3D) { + iron.Scene.active.meshes = [mo]; + } + #if (kha_direct3d12 || kha_vulkan || kha_metal) arm.render.RenderPathRaytrace.ready = false; #end diff --git a/base/Sources/arm/ui/UIMenubar.hx b/base/Sources/arm/ui/UIMenubar.hx index a4648424..0f0715cc 100644 --- a/base/Sources/arm/ui/UIMenubar.hx +++ b/base/Sources/arm/ui/UIMenubar.hx @@ -146,6 +146,9 @@ class UIMenubar { m.translate(0, 0, 1.5); Scene.active.camera.transform.setMatrix(m); } + #if (kha_direct3d12 || kha_vulkan || kha_metal) + arm.render.RenderPathRaytrace.ready = false; + #end } #end }