From 5da40db99c656d83128407bbb86cda9f8e9e61ad Mon Sep 17 00:00:00 2001 From: e2002e Date: Wed, 21 Feb 2024 13:05:05 +0100 Subject: [PATCH 1/5] update clipmaps data in iron. --- Sources/iron/App.hx | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/Sources/iron/App.hx b/Sources/iron/App.hx index 9e09b76a..39d1ce21 100644 --- a/Sources/iron/App.hx +++ b/Sources/iron/App.hx @@ -35,6 +35,9 @@ class App { done(); kha.System.notifyOnFrames(render); kha.Scheduler.addTimeTask(update, 0, iron.system.Time.delta); + #if (rp_voxels != "Off") + kha.Scheduler.addTimeTask(update_clipmaps, 0, iron.system.Time.delta / Main.voxelgiClipmapCount); + #end } public static function reset() { @@ -46,6 +49,26 @@ class App { if (onResets != null) for (f in onResets) f(); } + #if (rp_voxels != "Off") + static function update_clipmaps() { + var texelSize = Main.voxelgiVoxelSize * 2.0 * Math.pow(2.0, armory.renderpath.Clipmap.clipmapLevel); + var camera = iron.Scene.active.camera; + var center = new iron.math.Vec3( + Math.floor(camera.transform.worldx() / texelSize) * texelSize, + Math.floor(camera.transform.worldy() / texelSize) * texelSize, + Math.floor(camera.transform.worldz() / texelSize) * texelSize + ); + + armory.renderpath.Clipmap.clipmap_center_last.x = Std.int((armory.renderpath.Clipmap.clipmap_center.x - center.x) / texelSize); + armory.renderpath.Clipmap.clipmap_center_last.y = Std.int((armory.renderpath.Clipmap.clipmap_center.y - center.y) / texelSize); + armory.renderpath.Clipmap.clipmap_center_last.z = Std.int((armory.renderpath.Clipmap.clipmap_center.z - center.z) / texelSize); + + armory.renderpath.Clipmap.clipmap_center = center; + + armory.renderpath.Clipmap.clipmapLevel = (armory.renderpath.Clipmap.clipmapLevel + 1) % Main.voxelgiClipmapCount; + } + #end + static function update() { if (Scene.active == null || !Scene.active.ready) return; if (pauseUpdates) return; From 6408dd9ff084ba78ba1ef521211c558899c51437 Mon Sep 17 00:00:00 2001 From: e2002e Date: Mon, 25 Mar 2024 10:38:05 +0100 Subject: [PATCH 2/5] bumb --- Sources/iron/App.hx | 23 ---------------------- Sources/iron/RenderPath.hx | 32 +++++++++++++++++++++++++++++-- Sources/iron/object/MeshObject.hx | 4 ++-- Sources/iron/object/Uniforms.hx | 9 +++++++-- 4 files changed, 39 insertions(+), 29 deletions(-) diff --git a/Sources/iron/App.hx b/Sources/iron/App.hx index 39d1ce21..9e09b76a 100644 --- a/Sources/iron/App.hx +++ b/Sources/iron/App.hx @@ -35,9 +35,6 @@ class App { done(); kha.System.notifyOnFrames(render); kha.Scheduler.addTimeTask(update, 0, iron.system.Time.delta); - #if (rp_voxels != "Off") - kha.Scheduler.addTimeTask(update_clipmaps, 0, iron.system.Time.delta / Main.voxelgiClipmapCount); - #end } public static function reset() { @@ -49,26 +46,6 @@ class App { if (onResets != null) for (f in onResets) f(); } - #if (rp_voxels != "Off") - static function update_clipmaps() { - var texelSize = Main.voxelgiVoxelSize * 2.0 * Math.pow(2.0, armory.renderpath.Clipmap.clipmapLevel); - var camera = iron.Scene.active.camera; - var center = new iron.math.Vec3( - Math.floor(camera.transform.worldx() / texelSize) * texelSize, - Math.floor(camera.transform.worldy() / texelSize) * texelSize, - Math.floor(camera.transform.worldz() / texelSize) * texelSize - ); - - armory.renderpath.Clipmap.clipmap_center_last.x = Std.int((armory.renderpath.Clipmap.clipmap_center.x - center.x) / texelSize); - armory.renderpath.Clipmap.clipmap_center_last.y = Std.int((armory.renderpath.Clipmap.clipmap_center.y - center.y) / texelSize); - armory.renderpath.Clipmap.clipmap_center_last.z = Std.int((armory.renderpath.Clipmap.clipmap_center.z - center.z) / texelSize); - - armory.renderpath.Clipmap.clipmap_center = center; - - armory.renderpath.Clipmap.clipmapLevel = (armory.renderpath.Clipmap.clipmapLevel + 1) % Main.voxelgiClipmapCount; - } - #end - static function update() { if (Scene.active == null || !Scene.active.ready) return; if (pauseUpdates) return; diff --git a/Sources/iron/RenderPath.hx b/Sources/iron/RenderPath.hx index 3d3132c7..3d158d02 100644 --- a/Sources/iron/RenderPath.hx +++ b/Sources/iron/RenderPath.hx @@ -62,7 +62,7 @@ class RenderPath { var lastFrameTime = 0.0; var loading = 0; var cachedShaderContexts: Map = new Map(); - var depthBuffers: Array<{name: String, format: String}> = []; + public var depthBuffers: Array<{name: String, format: String}> = []; var additionalTargets: Array; #if rp_voxels @@ -112,6 +112,34 @@ class RenderPath { numTrisShadow = 0; #end + #if (rp_voxels != "Off") + armory.renderpath.RenderPathCreator.clipmapLevel = (armory.renderpath.RenderPathCreator.clipmapLevel + 1) % Main.voxelgiClipmapCount; + var clipmap = armory.renderpath.RenderPathCreator.clipmaps[armory.renderpath.RenderPathCreator.clipmapLevel]; + + clipmap.voxelSize = armory.renderpath.RenderPathCreator.clipmaps[0].voxelSize * Math.pow(2.0, armory.renderpath.RenderPathCreator.clipmapLevel); + + var texelSize = 2.0 * clipmap.voxelSize; + var camera = iron.Scene.active.camera; + var center = new iron.math.Vec3( + Math.floor(camera.transform.worldx() / texelSize) * texelSize, + Math.floor(camera.transform.worldy() / texelSize) * texelSize, + Math.floor(camera.transform.worldz() / texelSize) * texelSize + ); + + clipmap.offset_prev.x = Std.int((clipmap.center.x - center.x) / texelSize); + clipmap.offset_prev.y = Std.int((clipmap.center.y - center.y) / texelSize); + clipmap.offset_prev.z = Std.int((clipmap.center.z - center.z) / texelSize); + clipmap.center = center; + + var res = armory.renderpath.Inc.getVoxelRes(); + var extents = new iron.math.Vec3(clipmap.voxelSize * res, clipmap.voxelSize * res, clipmap.voxelSize * res); + if (clipmap.extents.x != extents.x || clipmap.extents.y != extents.y || clipmap.extents.z != extents.z) + { + armory.renderpath.RenderPathCreator.pre_clear = true; + } + clipmap.extents = extents; + #end + // Render to screen or probe var cam = Scene.active.camera; isProbePlanar = cam != null && cam.renderTarget != null; @@ -539,7 +567,7 @@ class RenderPath { } } - // Resize textures + // Resize textures FIXME: this doesn't seam to resize 2D images (not renderTargets) for (rt in renderTargets) { if (rt != null && rt.raw.width == 0) { App.notifyOnInit(rt.image.unload); diff --git a/Sources/iron/object/MeshObject.hx b/Sources/iron/object/MeshObject.hx index 089144fa..53b40858 100644 --- a/Sources/iron/object/MeshObject.hx +++ b/Sources/iron/object/MeshObject.hx @@ -168,7 +168,7 @@ class MeshObject extends Object { if (force_context != null && force_context != context) return setCulled(isShadow, true); #if (!arm_voxelgi_revox) // No revox - do not voxelize moving objects - if (context == "voxel" && raw != null && raw.mobile == true) return setCulled(isShadow, true); + //if (context == "voxel" && raw != null && raw.mobile == true) return setCulled(isShadow, true); #end return setCulled(isShadow, false); @@ -185,7 +185,7 @@ class MeshObject extends Object { // particleSystems for update, particleOwner for render if (particleSystems != null || particleOwner != null) radiusScale *= 1000; #end - if (context == "voxel") radiusScale *= 100; + //if (context == "voxel") radiusScale *= 100; if (data.geom.instanced) radiusScale *= 100; var isShadow = context == "shadowmap"; var frustumPlanes = isShadow ? light.frustumPlanes : camera.frustumPlanes; diff --git a/Sources/iron/object/Uniforms.hx b/Sources/iron/object/Uniforms.hx index 5eabdeba..0c473182 100644 --- a/Sources/iron/object/Uniforms.hx +++ b/Sources/iron/object/Uniforms.hx @@ -178,9 +178,14 @@ class Uniforms { } if (isImage) { - g.setImageTexture(context.textureUnits[j], rt.image); // image2D/3D // Multiple voxel volumes, always set params - g.setTexture3DParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.PointFilter, MipMapFilter.LinearMipFilter); + g.setImageTexture(context.textureUnits[j], rt.image); // image2D/3D + if (rt.raw.depth <= 1) { + g.setTextureParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.LinearFilter, MipMapFilter.LinearMipFilter); + } + else { + g.setTexture3DParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.LinearFilter, MipMapFilter.NoMipFilter); + } paramsSet = true; } else if (rt.isCubeMap) { From 847d0c401112b8c3f31442c2230916a74d6bba6f Mon Sep 17 00:00:00 2001 From: e2002e Date: Tue, 26 Mar 2024 14:39:24 +0100 Subject: [PATCH 3/5] reinit voxel's resolve image in case resize() is called. --- Sources/iron/RenderPath.hx | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Sources/iron/RenderPath.hx b/Sources/iron/RenderPath.hx index 3d158d02..7f63a1d8 100644 --- a/Sources/iron/RenderPath.hx +++ b/Sources/iron/RenderPath.hx @@ -567,7 +567,7 @@ class RenderPath { } } - // Resize textures FIXME: this doesn't seam to resize 2D images (not renderTargets) + // Resize textures FIXME: this doesn't seem to resize 2D images for (rt in renderTargets) { if (rt != null && rt.raw.width == 0) { App.notifyOnInit(rt.image.unload); @@ -581,6 +581,16 @@ class RenderPath { rt.image.setDepthStencilFrom(depthToRenderTarget.get(rt.depthStencilFrom).image); } } + + #if (rp_voxels != "Off") + #if (rp_voxels == "Voxel GI") + armory.renderpath.Inc.initGI("voxels_diffuse"); + armory.renderpath.Inc.initGI("voxels_specular"); + #else + armory.renderpath.Inc.initGI("voxels_ao"); + #end + armory.renderpath.RenderPathCreator.res_pre_clear = true; + #end } public function createRenderTarget(t: RenderTargetRaw): RenderTarget { From a5da1c1d184bf9105503f37e8d7909d855f295a9 Mon Sep 17 00:00:00 2001 From: e2002e Date: Tue, 26 Mar 2024 20:29:57 +0100 Subject: [PATCH 4/5] set texture3D parameters; --- Sources/iron/object/Uniforms.hx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/iron/object/Uniforms.hx b/Sources/iron/object/Uniforms.hx index 0c473182..3e067637 100644 --- a/Sources/iron/object/Uniforms.hx +++ b/Sources/iron/object/Uniforms.hx @@ -181,10 +181,10 @@ class Uniforms { // Multiple voxel volumes, always set params g.setImageTexture(context.textureUnits[j], rt.image); // image2D/3D if (rt.raw.depth <= 1) { - g.setTextureParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.LinearFilter, MipMapFilter.LinearMipFilter); + g.setTextureParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.LinearFilter, MipMapFilter.NoMipFilter); } else { - g.setTexture3DParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.LinearFilter, MipMapFilter.NoMipFilter); + g.setTexture3DParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.AnisotropicFilter, MipMapFilter.NoMipFilter); } paramsSet = true; } From efd9e7daba9200486ab4675d1f4514c1f536e947 Mon Sep 17 00:00:00 2001 From: e2002e Date: Wed, 27 Mar 2024 10:44:07 +0100 Subject: [PATCH 5/5] setup texture parameters for voxels. --- Sources/iron/object/Uniforms.hx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/iron/object/Uniforms.hx b/Sources/iron/object/Uniforms.hx index 3e067637..9cdfb4f6 100644 --- a/Sources/iron/object/Uniforms.hx +++ b/Sources/iron/object/Uniforms.hx @@ -184,7 +184,7 @@ class Uniforms { g.setTextureParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.LinearFilter, MipMapFilter.NoMipFilter); } else { - g.setTexture3DParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.AnisotropicFilter, MipMapFilter.NoMipFilter); + g.setTexture3DParameters(context.textureUnits[j], TextureAddressing.Clamp, TextureAddressing.Clamp, TextureAddressing.Clamp, TextureFilter.LinearFilter, TextureFilter.LinearFilter, MipMapFilter.LinearMipFilter); } paramsSet = true; }