From 112aceb02c672f1e0465fa40f807c801301b0ade Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Thu, 28 Jul 2022 12:57:07 +0530 Subject: [PATCH] fix some graphical bugs --- src/DtsObject.hx | 24 ++++++------- src/InstanceManager.hx | 43 ++++++++++++++---------- src/ParticleSystem.hx | 71 +++++++++++++++++++++------------------ src/Sky.hx | 1 + src/shaders/Billboard.hx | 9 +++-- src/shaders/DtsTexture.hx | 2 +- 6 files changed, 85 insertions(+), 65 deletions(-) diff --git a/src/DtsObject.hx b/src/DtsObject.hx index b5048aba..b7eb3e21 100644 --- a/src/DtsObject.hx +++ b/src/DtsObject.hx @@ -372,21 +372,21 @@ class DtsObject extends GameObject { var texture = ResourceLoader.getResource(fullName, ResourceLoader.getTexture, this.textureResources); texture.wrap = Wrap.Repeat; material.texture = texture; - // if (this.useInstancing) { - // var dtsshader = new DtsTexture(); - // dtsshader.texture = texture; - // dtsshader.currentOpacity = 1; - // material.mainPass.removeShader(material.textureShader); - // material.mainPass.addShader(dtsshader); - // } + if (this.useInstancing) { + var dtsshader = new DtsTexture(); + dtsshader.texture = texture; + dtsshader.currentOpacity = 1; + material.mainPass.removeShader(material.textureShader); + material.mainPass.addShader(dtsshader); + } // TODO TRANSLUENCY SHIT } material.shadows = false; if (this.isCollideable) material.receiveShadows = true; if (material.texture == null && !iflMaterial) { - // var dtsshader = new DtsTexture(); - // dtsshader.currentOpacity = 1; + var dtsshader = new DtsTexture(); + dtsshader.currentOpacity = 1; // Make a 1x1 white texture #if hl var bitmap = new hxd.BitmapData(1, 1); @@ -403,9 +403,9 @@ class DtsObject extends GameObject { texture.wrap = Wrap.Repeat; #end material.texture = texture; - // dtsshader.texture = texture; - // material.mainPass.addShader(dtsshader); - // material.shadows = false; + dtsshader.texture = texture; + material.mainPass.addShader(dtsshader); + material.shadows = false; } if (flags & 4 > 0) { material.blendMode = BlendMode.Alpha; diff --git a/src/InstanceManager.hx b/src/InstanceManager.hx index 528e4e78..6c6d2bfc 100644 --- a/src/InstanceManager.hx +++ b/src/InstanceManager.hx @@ -39,6 +39,10 @@ class InstanceManager { var opaqueinstances = minfo.instances.filter(x -> x.gameObject.currentOpacity == 1); minfo.meshbatch.begin(opaqueinstances.length); for (instance in opaqueinstances) { // Draw the opaque shit first + var dtsShader = minfo.meshbatch.material.mainPass.getShader(DtsTexture); + if (dtsShader != null) { + dtsShader.currentOpacity = instance.gameObject.currentOpacity; + } var transform = instance.emptyObj.getAbsPos().clone(); minfo.meshbatch.material.mainPass.setPassName(minfo.mesh.material.mainPass.name); minfo.meshbatch.material.mainPass.enableLights = minfo.mesh.material.mainPass.enableLights; @@ -50,9 +54,12 @@ class InstanceManager { var transparentinstances = minfo.instances.filter(x -> x.gameObject.currentOpacity != 1); minfo.transparencymeshbatch.begin(transparentinstances.length); for (instance in transparentinstances) { // Non opaque shit - var dtsShader = minfo.transparencymeshbatch.material.mainPass.getShader(h3d.shader.Texture); + var dtsShader = minfo.transparencymeshbatch.material.mainPass.getShader(DtsTexture); + if (dtsShader != null) { + dtsShader.currentOpacity = instance.gameObject.currentOpacity; + } minfo.transparencymeshbatch.material.blendMode = Alpha; - minfo.transparencymeshbatch.material.color.a = instance.gameObject.currentOpacity; + // minfo.transparencymeshbatch.material.color.a = instance.gameObject.currentOpacity; // minfo.transparencymeshbatch.material.mainPass.setPassName(minfo.mesh.material.mainPass.name); minfo.transparencymeshbatch.shadersChanged = true; minfo.transparencymeshbatch.material.mainPass.enableLights = minfo.mesh.material.mainPass.enableLights; @@ -100,23 +107,23 @@ class InstanceManager { } if (isMesh) { var mat = cast(obj, Mesh).material; - // var dtsshader = mat.mainPass.getShader(DtsTexture); - // if (dtsshader != null) { - // minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader); - // minfo.meshbatch.material.mainPass.addShader(dtsshader); - // } - 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); - - minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.mainPass.getShader(PropsValues)); - minfo.transparencymeshbatch.material.mainPass.removeShader(minfo.transparencymeshbatch.material.mainPass.getShader(PropsValues)); - - var pbrshader = mat.mainPass.getShader(PropsValues); - if (pbrshader != null) { - minfo.meshbatch.material.mainPass.addShader(pbrshader); - minfo.transparencymeshbatch.material.mainPass.addShader(pbrshader); + var dtsshader = mat.mainPass.getShader(DtsTexture); + if (dtsshader != null) { + minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.textureShader); + minfo.meshbatch.material.mainPass.addShader(dtsshader); } + 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); + + // minfo.meshbatch.material.mainPass.removeShader(minfo.meshbatch.material.mainPass.getShader(PropsValues)); + // minfo.transparencymeshbatch.material.mainPass.removeShader(minfo.transparencymeshbatch.material.mainPass.getShader(PropsValues)); + + // var pbrshader = mat.mainPass.getShader(PropsValues); + // if (pbrshader != null) { + // minfo.meshbatch.material.mainPass.addShader(pbrshader); + // minfo.transparencymeshbatch.material.mainPass.addShader(pbrshader); + // } } minfos.push(minfo); } diff --git a/src/ParticleSystem.hx b/src/ParticleSystem.hx index e466e302..5561f562 100644 --- a/src/ParticleSystem.hx +++ b/src/ParticleSystem.hx @@ -81,20 +81,26 @@ class Particle { var t = this.currentAge / (this.lifeTime / 1000); - for (i in 1...4) { - if (this.o.times.length > i) { - if (this.o.times[i] >= t) { - var firstPart = t - this.o.times[i - 1]; - var total = this.o.times[i] - this.o.times[i - 1]; + // for (i in 1...4) { + // if (this.o.times.length > i) { + // if (this.o.times[i] >= t) { + // var firstPart = t - this.o.times[i - 1]; + // var total = this.o.times[i] - this.o.times[i - 1]; - firstPart /= total; + // firstPart /= total; - this.color = Util.lerpThreeVectors(this.o.colors[i - 1], this.o.colors[i], firstPart); - this.scale = Util.lerp(this.o.sizes[i - 1], this.o.sizes[i], firstPart); - break; - } - } - } + // // if (this.o.texture == 'particles/spark.png') { + // // if (this.o.colors[0].r == 1 && this.o.colors[0].g == 1) { + // // trace("HEREEEE"); + // // } + // // } + + // this.color = Util.lerpThreeVectors(this.o.colors[i - 1], this.o.colors[i], firstPart); + // this.scale = Util.lerp(this.o.sizes[i - 1], this.o.sizes[i], firstPart); + // break; + // } + // } + // } // var velElapsed = elapsed / 1000; // // velElapsed *= 0.001; @@ -104,30 +110,30 @@ class Particle { // // var pos = this.position.add(this.vel.multiply(velElapsed + this.o.acceleration * (velElapsed * velElapsed) / 2)); // // this.position = pos; - // this.rotation = (this.initialSpin + this.o.spinSpeed * elapsed / 1000) * Math.PI / 180; + this.rotation = (this.initialSpin + this.o.spinSpeed * elapsed / 1000) * Math.PI / 180; - // // Check where we are in the times array - // var indexLow = 0; - // var indexHigh = 1; - // for (i in 2...this.o.times.length) { - // if (this.o.times[indexHigh] >= completion) - // break; + // Check where we are in the times array + var indexLow = 0; + var indexHigh = 1; + for (i in 2...this.o.times.length) { + if (this.o.times[indexHigh] >= completion) + break; - // indexLow = indexHigh; - // indexHigh = i; - // } + indexLow = indexHigh; + indexHigh = i; + } - // if (this.o.times.length == 1) - // indexHigh = indexLow; - // var t = (completion - this.o.times[indexLow]) / (this.o.times[indexHigh] - this.o.times[indexLow]); + if (this.o.times.length == 1) + indexHigh = indexLow; + var t = (completion - this.o.times[indexLow]) / (this.o.times[indexHigh] - this.o.times[indexLow]); - // // Adjust color - // var color = Util.lerpThreeVectors(this.o.colors[indexLow], this.o.colors[indexHigh], t); - // this.color = color; - // // this.material.opacity = color.a * * 1.5; // Adjusted because additive mixing can be kind of extreme + // Adjust color + var color = Util.lerpThreeVectors(this.o.colors[indexLow], this.o.colors[indexHigh], t); + this.color = color; + // this.material.opacity = color.a * * 1.5; // Adjusted because additive mixing can be kind of extreme - // // Adjust sizing - // this.scale = Util.lerp(this.o.sizes[indexLow], this.o.sizes[indexHigh], t); + // Adjust sizing + this.scale = Util.lerp(this.o.sizes[indexLow], this.o.sizes[indexHigh], t); } } @@ -290,10 +296,11 @@ class ParticleManager { var particleShader = batch.meshBatch.material.mainPass.getShader(Billboard); particleShader.scale = instance.scale; particleShader.rotation = instance.rotation; + particleShader.color = instance.color; batch.meshBatch.material.blendMode = instance.o.blending; batch.meshBatch.material.mainPass.depthWrite = false; // batch.meshBatch.material.mainPass.setPassName("overlay"); - batch.meshBatch.material.color.load(instance.color); + // batch.meshBatch.material.color.load(instance.color); batch.meshBatch.shadersChanged = true; batch.meshBatch.setScale(instance.scale); batch.meshBatch.emitInstance(); diff --git a/src/Sky.hx b/src/Sky.hx index 37fa4159..24671f21 100644 --- a/src/Sky.hx +++ b/src/Sky.hx @@ -48,6 +48,7 @@ class Sky extends Object { // var renderer = cast(level.scene.renderer, h3d.scene.pbr.Renderer); var shad = new Skybox(texture); skyMesh.material.mainPass.addShader(shad); + skyMesh.material.mainPass.depthWrite = false; // skyMesh.material.shadows = false; } diff --git a/src/shaders/Billboard.hx b/src/shaders/Billboard.hx index 537cd719..d40e3aa6 100644 --- a/src/shaders/Billboard.hx +++ b/src/shaders/Billboard.hx @@ -12,17 +12,22 @@ class Billboard extends hxsl.Shader { @global var global:{ @perObject var modelView:Mat4; }; - @param var scale:Float; - @param var rotation:Float; + @perInstance @param var scale:Float; + @perInstance @param var rotation:Float; + @perInstance @param var color:Vec4; var relativePosition:Vec3; var projectedPosition:Vec4; var calculatedUV:Vec2; + var pixelColor:Vec4; function vertex() { var mid = 0.5; var uv = input.uv; calculatedUV.x = cos(rotation) * (uv.x - mid) + sin(rotation) * (uv.y - mid) + mid; calculatedUV.y = cos(rotation) * (uv.y - mid) - sin(rotation) * (uv.x - mid) + mid; } + function fragment() { + pixelColor *= color; + } function billboard(pos:Vec2, scale:Vec2):Vec4 { return (vec4(0, 0, 0, 1) * (global.modelView * camera.view) + vec4(pos * scale, 0, 0)); } diff --git a/src/shaders/DtsTexture.hx b/src/shaders/DtsTexture.hx index 2bb4e63d..50bde492 100644 --- a/src/shaders/DtsTexture.hx +++ b/src/shaders/DtsTexture.hx @@ -10,7 +10,7 @@ class DtsTexture extends hxsl.Shader { @const var specularAlpha:Bool; @range(0, 1) @param var killAlphaThreshold:Float; @param var texture:Sampler2D; - @param var currentOpacity:Float; + @perInstance @param var currentOpacity:Float; var calculatedUV:Vec2; var pixelColor:Vec4; var specColor:Vec3;