From 93d86bbd6a486ad0d4c4f9f97046ac59f037b846 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Wed, 15 Feb 2023 21:21:32 +0530 Subject: [PATCH] tsstatic envmaps --- src/DtsObject.hx | 28 ++++++++++++---------------- src/InstanceManager.hx | 6 ++++++ src/MarbleWorld.hx | 1 + src/shaders/EnvMap.hx | 31 +++++++++++++++++++++++++++++++ 4 files changed, 50 insertions(+), 16 deletions(-) create mode 100644 src/shaders/EnvMap.hx diff --git a/src/DtsObject.hx b/src/DtsObject.hx index 6bbf75b9..f4de6b7d 100644 --- a/src/DtsObject.hx +++ b/src/DtsObject.hx @@ -1,5 +1,7 @@ package src; +import shaders.EnvMap; +import h3d.shader.CubeMap; import dts.TSDrawPrimitive; import hxd.res.Sound; import h3d.col.Bounds; @@ -374,7 +376,11 @@ class DtsObject extends GameObject { if (fullName == null || (this.isTSStatic && ((flags & (1 << 31) > 0)))) { if (this.isTSStatic) { - Console.warn('Unsupported material type for ${fullName}, dts: ${this.dtsPath}'); + material.mainPass.enableLights = false; + if (flags & (1 << 31) > 0) { + environmentMaterial = material; + } + // Console.warn('Unsupported material type for ${fullName}, dts: ${this.dtsPath}'); // TODO USE PBR??? } } else if (Path.extension(fullName) == "ifl") { @@ -431,11 +437,8 @@ class DtsObject extends GameObject { material.receiveShadows = false; material.mainPass.depthWrite = false; } - // // TODO TRANSPARENCY SHIT if (flags & 8 > 0) { material.blendMode = BlendMode.Add; - // material.mainPass.setPassName("overlay"); - // material.textureShader.additive = true; } if (flags & 16 > 0) { material.blendMode = BlendMode.Sub; @@ -444,20 +447,13 @@ class DtsObject extends GameObject { if (flags & 32 > 0) { material.mainPass.enableLights = false; material.receiveShadows = false; - // material.mainPass.setPassName("overlay"); - // var pbrprops = material.mainPass.getShader(h3d.shader.pbr.PropsValues); - // pbrprops.emissiveValue = 1; - // pbrprops.roughnessValue = 1; - // pbrprops.occlusionValue = 0; - // pbrprops.metalnessValue = 0; } - // if (this.isTSStatic && !(flags & 64 > 0)) { - // // TODO THIS SHIT - // } - // ((flags & 32) || environmentMaterial) ? new Materia - - // material.mainPass.addShader(new AlphaMult()); + if (this.isTSStatic && !(flags & 64 > 0)) { + var reflectivity = this.dts.matNames.length == 1 ? 1 : (environmentMaterial != null ? 0.5 : 0.333); + var cubemapshader = new EnvMap(this.level.sky.cubemap, reflectivity); + material.mainPass.addShader(cubemapshader); + } this.materials.push(material); } diff --git a/src/InstanceManager.hx b/src/InstanceManager.hx index fde46045..f5610585 100644 --- a/src/InstanceManager.hx +++ b/src/InstanceManager.hx @@ -1,5 +1,7 @@ package src; +import shaders.EnvMap; +import h3d.shader.CubeMap; import shaders.NormalMaterial; import shaders.NoiseTileMaterial; import shaders.PhongMaterial; @@ -161,6 +163,10 @@ class InstanceManager { minfo.meshbatch.material.mainPass.addShader(nmapshdr); // minfo.meshbatch.material.mainPass.culling = mat.mainPass.culling; } + var cubemapshdr = mat.mainPass.getShader(EnvMap); + if (cubemapshdr != null) { + minfo.meshbatch.material.mainPass.addShader(cubemapshdr); + } minfo.transparencymeshbatch = new MeshBatch(cast(cast(obj, Mesh).primitive), cast(cast(obj, Mesh)).material.clone(), scene); minfo.transparencymeshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader); minfo.transparencymeshbatch.material.mainPass.addShader(dtsshader); diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index cfbfabcf..ef7fc285 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -884,6 +884,7 @@ class MarbleWorld extends Scheduler { if (obj is ForceObject) { this.forceObjects.push(cast obj); } + obj.isTSStatic = isTsStatic; obj.init(cast this, () -> { obj.update(this.timeState); if (obj.useInstancing) { diff --git a/src/shaders/EnvMap.hx b/src/shaders/EnvMap.hx new file mode 100644 index 00000000..318768c7 --- /dev/null +++ b/src/shaders/EnvMap.hx @@ -0,0 +1,31 @@ +package shaders; + +class EnvMap extends hxsl.Shader { + static var SRC = { + @param var envMap:SamplerCube; + @param var shininess:Float; + @global var camera:{ + var position:Vec3; + @var var dir:Vec3; + }; + var pixelColor:Vec4; + var transformedNormal:Vec3; + var pixelTransformedPosition:Vec3; + function fragment() { + var viewDir = normalize(camera.position - pixelTransformedPosition); + + var incidentRay = normalize(pixelTransformedPosition - camera.position); + var reflectionRay = reflect(incidentRay, transformedNormal); + + var reflectColor = envMap.get(reflectionRay); + + pixelColor = mix(pixelColor, reflectColor, shininess); + } + } + + public function new(skybox, shininess) { + super(); + this.envMap = skybox; + this.shininess = shininess; + } +}