From 48132d8ea33fd6eaf4f98971b1a6b27573ebfa2a Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Mon, 14 Jun 2021 21:40:32 +0530 Subject: [PATCH] Dump DtsTexture, fix the blending bugs and shit, fix triggers --- src/DifBuilder.hx | 2 ++ src/DtsObject.hx | 20 +++++++----- src/InstanceManager.hx | 31 +++++++++++------- src/InteriorObject.hx | 2 +- src/Main.hx | 4 --- src/Marble.hx | 1 - src/MarbleWorld.hx | 66 ++++++++++++++++++++++++++++++--------- src/ParticleSystem.hx | 7 +++-- src/Sky.hx | 12 +++++-- src/gui/PlayGui.hx | 4 +-- src/shaders/DtsTexture.hx | 4 +-- src/shapes/Gem.hx | 9 +++++- src/triggers/Trigger.hx | 31 ++++++++++++++---- 13 files changed, 138 insertions(+), 55 deletions(-) diff --git a/src/DifBuilder.hx b/src/DifBuilder.hx index c24778a4..92b8283b 100644 --- a/src/DifBuilder.hx +++ b/src/DifBuilder.hx @@ -1,5 +1,6 @@ package src; +import h3d.shader.pbr.PropsValues; import h3d.mat.Material; import src.ResourceLoader; import src.PathedInterior; @@ -302,6 +303,7 @@ class DifBuilder { } else { material = Material.create(); } + // material.mainPass.addShader(new h3d.shader.pbr.PropsValues(1, 0, 0, 1)); // material.mainPass.wireframe = true; var mesh = new Mesh(prim, material, itr); diff --git a/src/DtsObject.hx b/src/DtsObject.hx index 76305db1..fb746d4d 100644 --- a/src/DtsObject.hx +++ b/src/DtsObject.hx @@ -333,11 +333,11 @@ class DtsObject extends GameObject { 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); + // var dtsshader = new DtsTexture(); + // dtsshader.texture = texture; + // dtsshader.currentOpacity = 1; + // material.mainPass.removeShader(material.textureShader); + // material.mainPass.addShader(dtsshader); // } // TODO TRANSLUENCY SHIT } @@ -354,11 +354,15 @@ class DtsObject extends GameObject { } if (flags & 4 > 0) { material.blendMode = BlendMode.Alpha; - material.mainPass.culling = h3d.mat.Data.Face.Front; + material.mainPass.depthWrite = false; + // material.mainPass.culling = h3d.mat.Data.Face.Front; } // TODO TRANSPARENCY SHIT - if (flags & 8 > 0) + if (flags & 8 > 0) { material.blendMode = BlendMode.Add; + material.mainPass.setPassName("overlay"); + // material.textureShader.additive = true; + } if (flags & 16 > 0) material.blendMode = BlendMode.Sub; @@ -367,7 +371,7 @@ class DtsObject extends GameObject { // } // ((flags & 32) || environmentMaterial) ? new Materia - material.mainPass.addShader(new AlphaMult()); + // material.mainPass.addShader(new AlphaMult()); this.materials.push(material); } diff --git a/src/InstanceManager.hx b/src/InstanceManager.hx index 08311ac9..49d91191 100644 --- a/src/InstanceManager.hx +++ b/src/InstanceManager.hx @@ -40,6 +40,7 @@ class InstanceManager { minfo.meshbatch.begin(opaqueinstances.length); for (instance in opaqueinstances) { // Draw the opaque shit first var transform = instance.emptyObj.getAbsPos().clone(); + minfo.meshbatch.material.mainPass.setPassName(minfo.mesh.material.mainPass.name); minfo.meshbatch.setTransform(transform); minfo.meshbatch.emitInstance(); } @@ -48,12 +49,15 @@ 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(DtsTexture); + var dtsShader = minfo.transparencymeshbatch.material.mainPass.getShader(h3d.shader.Texture); minfo.transparencymeshbatch.material.blendMode = Alpha; - if (dtsShader != null) { - dtsShader.currentOpacity = instance.gameObject.currentOpacity; - minfo.transparencymeshbatch.shadersChanged = true; - } + minfo.transparencymeshbatch.material.color.a = instance.gameObject.currentOpacity; + minfo.transparencymeshbatch.material.mainPass.setPassName(minfo.mesh.material.mainPass.name); + minfo.transparencymeshbatch.shadersChanged = true; + // if (dtsShader != null) { + // dtsShader.currentOpacity = instance.gameObject.currentOpacity; + // minfo.transparencymeshbatch.shadersChanged = true; + // } var transform = instance.emptyObj.getAbsPos().clone(); minfo.transparencymeshbatch.setTransform(transform); minfo.transparencymeshbatch.emitInstance(); @@ -93,14 +97,17 @@ 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); - } + // 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.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) { diff --git a/src/InteriorObject.hx b/src/InteriorObject.hx index b7326143..775163ad 100644 --- a/src/InteriorObject.hx +++ b/src/InteriorObject.hx @@ -10,7 +10,7 @@ import h3d.scene.Object; class InteriorObject extends GameObject { public var collider:CollisionEntity; public var interiorFile:String; - public var useInstancing = true; + public var useInstancing = false; public function new() { super(); diff --git a/src/Main.hx b/src/Main.hx index 9446c1f2..ab9de451 100644 --- a/src/Main.hx +++ b/src/Main.hx @@ -61,10 +61,6 @@ class Main extends hxd.App { world = new MarbleWorld(s3d, s2d, mission); - var dirlight = new DirLight(new Vector(0.5, 0.5, -0.5), s3d); - dirlight.enableSpecular = true; - s3d.lightSystem.ambientLight.set(0.3, 0.3, 0.3); - world.init(); // s3d.camera. diff --git a/src/Marble.hx b/src/Marble.hx index dcc0dc99..38f01c77 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -329,7 +329,6 @@ class Marble extends GameObject { for (i in 0...contacts.length) { var sVel = this.velocity.sub(contacts[i].velocity); var surfaceDot = contacts[i].normal.dot(sVel); - trace(contacts[i].normal.length()); if ((!looped && surfaceDot < 0) || surfaceDot < -SurfaceDotThreshold) { var velLen = this.velocity.length(); diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index 9af98a79..5a6bcf58 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -1,5 +1,7 @@ package src; +import h3d.scene.pbr.DirLight; +import h3d.col.Bounds; import triggers.HelpTrigger; import triggers.InBoundsTrigger; import triggers.OutOfBoundsTrigger; @@ -127,18 +129,47 @@ class MarbleWorld extends Scheduler { }; scanMission(this.mission.root); + this.initScene(); + + this.addSimGroup(this.mission.root); + this.playGui.formatGemCounter(this.gemCount, this.totalGems); + } + + public function initScene() { this.collisionWorld = new CollisionWorld(); this.playGui = new PlayGui(); this.instanceManager = new InstanceManager(scene); this.particleManager = new ParticleManager(cast this); + + var renderer = cast(this.scene.renderer, h3d.scene.pbr.Renderer); + + renderer.skyMode = Hide; + + for (element in mission.root.elements) { + if (element._type != MissionElementType.Sun) + continue; + + var sunElement:MissionElementSun = cast element; + + var directionalColor = MisParser.parseVector4(sunElement.color); + var ambientColor = MisParser.parseVector4(sunElement.ambient); + var sunDirection = MisParser.parseVector3(sunElement.direction); + sunDirection.x = -sunDirection.x; + + scene.lightSystem.ambientLight.load(ambientColor); + + var sunlight = new DirLight(sunDirection, scene); + sunlight.color = directionalColor; + } + + // var skyElement:MissionElementSky = cast this.mission.root.elements.filter((element) -> element._type == MissionElementType.Sky)[0]; + this.sky = new Sky(); sky.dmlPath = "data/skies/sky_day.dml"; + sky.init(cast this); playGui.init(scene2d); scene.addChild(sky); - - this.addSimGroup(this.mission.root); - this.playGui.formatGemCounter(this.gemCount, this.totalGems); } public function start() { @@ -427,8 +458,6 @@ class MarbleWorld extends Scheduler { public function addTrigger(element:MissionElementTrigger) { var trigger:Trigger = null; - return; - // Create a trigger based on type if (element.datablock == "OutOfBoundsTrigger") { trigger = new OutOfBoundsTrigger(element, cast this); @@ -627,17 +656,26 @@ class MarbleWorld extends Scheduler { } if (contact.go is Trigger) { var trigger:Trigger = cast contact.go; - var contacttest = trigger.collider.sphereIntersection(contactsphere, timeState); - if (contacttest.length != 0) { - trigger.onMarbleContact(timeState); - } + var triggeraabb = trigger.collider.boundingBox; - trigger.onMarbleInside(timeState); - if (!this.shapeOrTriggerInside.contains(contact.go)) { - this.shapeOrTriggerInside.push(contact.go); - trigger.onMarbleEnter(timeState); + var box = new Bounds(); + var center = marble.collider.transform.getPosition(); + var radius = marble._radius; + box.xMin = center.x - radius; + box.yMin = center.y - radius; + box.zMin = center.z - radius; + box.xMax = center.x + radius; + box.yMax = center.y + radius; + box.zMax = center.z + radius; + + if (triggeraabb.collide(box)) { + trigger.onMarbleInside(timeState); + if (!this.shapeOrTriggerInside.contains(contact.go)) { + this.shapeOrTriggerInside.push(contact.go); + trigger.onMarbleEnter(timeState); + } + inside.push(contact.go); } - inside.push(contact.go); } } } diff --git a/src/ParticleSystem.hx b/src/ParticleSystem.hx index 8ad47a4b..2386f811 100644 --- a/src/ParticleSystem.hx +++ b/src/ParticleSystem.hx @@ -291,6 +291,7 @@ class ParticleManager { particleShader.scale = instance.scale; particleShader.rotation = instance.rotation; batch.meshBatch.material.blendMode = instance.o.blending; + batch.meshBatch.material.mainPass.setPassName("overlay"); batch.meshBatch.material.color.load(instance.color); batch.meshBatch.shadersChanged = true; batch.meshBatch.setScale(instance.scale); @@ -321,9 +322,11 @@ class ParticleManager { prim.uvs = [new UV(0, 0), new UV(0, 1), new UV(1, 0), new UV(1, 1)]; prim.addNormals(); var mat = Material.create(particleData.texture); - mat.mainPass.addShader(new h3d.shader.pbr.PropsValues(1, 0, 0, 1)); + // matshader.texture = mat.texture; + mat.mainPass.enableLights = false; + mat.mainPass.setPassName("overlay"); + // mat.mainPass.addShader(new h3d.shader.pbr.PropsValues(1, 0, 0, 1)); mat.texture.wrap = Wrap.Repeat; - mat.blendMode = Alpha; var billboardShader = new Billboard(); mat.mainPass.addShader(billboardShader); var mb = new MeshBatch(prim, mat, this.scene); diff --git a/src/Sky.hx b/src/Sky.hx index 4ecf506f..1719f521 100644 --- a/src/Sky.hx +++ b/src/Sky.hx @@ -28,12 +28,20 @@ class Sky extends Object { var skyMesh = new h3d.scene.Mesh(sky, this); skyMesh.material.mainPass.culling = Front; // This is such a hack - skyMesh.material.mainPass.addShader(new h3d.shader.pbr.PropsValues(1, 0, 0, 1)); + // skyMesh.material.mainPass.addShader(new h3d.shader.pbr.PropsValues(1, 0, 0, 1)); + skyMesh.material.mainPass.enableLights = false; + skyMesh.material.receiveShadows = false; skyMesh.material.blendMode = None; + var pbrprops = skyMesh.material.mainPass.getShader(PropsValues); + pbrprops.emissiveValue = 1; + pbrprops.roughnessValue = 0; + pbrprops.occlusionValue = 0; + pbrprops.metalnessValue = 1; + skyMesh.scale(200); var env = new Environment(texture); env.compute(); - var renderer = cast(level.scene.renderer, h3d.scene.pbr.Renderer); + // var renderer = cast(level.scene.renderer, h3d.scene.pbr.Renderer); var shad = new h3d.shader.pbr.CubeLod(texture); skyMesh.material.mainPass.addShader(shad); skyMesh.material.shadows = false; diff --git a/src/gui/PlayGui.hx b/src/gui/PlayGui.hx index 55aecb00..bc5d5feb 100644 --- a/src/gui/PlayGui.hx +++ b/src/gui/PlayGui.hx @@ -234,9 +234,9 @@ class PlayGui { this.helpTextForeground.text = text; this.helpTextBackground.text = text; helpTextForeground.x = scene2d.width / 2 - helpTextForeground.textWidth / 2; - helpTextForeground.y = scene2d.height - 102; + helpTextForeground.y = scene2d.height * 0.45; helpTextBackground.x = scene2d.width / 2 - helpTextBackground.textWidth / 2 + 1; - helpTextBackground.y = scene2d.height - 102 + 1; + helpTextBackground.y = scene2d.height * 0.45 + 1; } public function setPowerupImage(powerupIdentifier:String) { diff --git a/src/shaders/DtsTexture.hx b/src/shaders/DtsTexture.hx index 1b68bd4d..2bb4e63d 100644 --- a/src/shaders/DtsTexture.hx +++ b/src/shaders/DtsTexture.hx @@ -22,12 +22,12 @@ class DtsTexture extends hxsl.Shader { if (killAlpha && c.a - killAlphaThreshold < 0) discard; if (additive) - pixelColor += c; + pixelColor = c; else pixelColor *= c; if (specularAlpha) specColor *= c.aaa; - pixelColor.a = c.a * currentOpacity; + pixelColor.a *= c.a * currentOpacity; } } diff --git a/src/shapes/Gem.hx b/src/shapes/Gem.hx index 35975b73..fcbe298f 100644 --- a/src/shapes/Gem.hx +++ b/src/shapes/Gem.hx @@ -15,6 +15,7 @@ class Gem extends DtsObject { ambientRotate = true; isCollideable = false; pickedUp = false; + useInstancing = true; showSequences = false; // Gems actually have an animation for the little shiny thing, but the actual game ignores that. I get it, it was annoying as hell. var GEM_COLORS = ["blue", "red", "yellow", "purple", "green", "turquoise", "orange", "black"]; @@ -29,7 +30,13 @@ class Gem extends DtsObject { super.init(level); for (material in this.materials) { - material.mainPass.addShader(new PropsValues(1, 0, 0, 1)); + material.mainPass.enableLights = false; + var pbrprops = material.mainPass.getShader(h3d.shader.pbr.PropsValues); + pbrprops.emissiveValue = 1; + pbrprops.roughnessValue = 0; + pbrprops.occlusionValue = 0; + pbrprops.metalnessValue = 1; + // material.mainPass.addShader(new PropsValues(1, 0, 0, 1)); } } diff --git a/src/triggers/Trigger.hx b/src/triggers/Trigger.hx index f2e5fe3d..f881a6d4 100644 --- a/src/triggers/Trigger.hx +++ b/src/triggers/Trigger.hx @@ -1,5 +1,8 @@ package triggers; +import h3d.scene.Mesh; +import h3d.mat.Material; +import h3d.prim.Cube; import h3d.col.Bounds; import h3d.Matrix; import h3d.Vector; @@ -23,10 +26,10 @@ class Trigger extends GameObject { this.level = level; var coordinates = MisParser.parseNumberList(element.polyhedron); - var origin = new Vector(coordinates[0], coordinates[1], coordinates[2]); - var d1 = new Vector(coordinates[3], coordinates[4], coordinates[5]); - var d2 = new Vector(coordinates[6], coordinates[7], coordinates[8]); - var d3 = new Vector(coordinates[9], coordinates[10], coordinates[11]); + var origin = new Vector(-coordinates[0], coordinates[1], coordinates[2]); + var d1 = new Vector(-coordinates[3], coordinates[4], coordinates[5]); + var d2 = new Vector(-coordinates[6], coordinates[7], coordinates[8]); + var d3 = new Vector(-coordinates[9], coordinates[10], coordinates[11]); // Create the 8 points of the parallelepiped var p1 = origin.clone(); @@ -40,18 +43,34 @@ class Trigger extends GameObject { var mat = new Matrix(); var quat = MisParser.parseRotation(element.rotation); + // quat.x = -quat.x; + // quat.w = -quat.w; quat.toMatrix(mat); var scale = MisParser.parseVector3(element.scale); mat.scale(scale.x, scale.y, scale.z); - mat.setPosition(MisParser.parseVector3(element.position)); + var pos = MisParser.parseVector3(element.position); + pos.x = -pos.x; + // mat.setPosition(pos); var vertices = [p1, p2, p3, p4, p5, p6, p7, p8].map((vert) -> vert.transformed(mat)); var boundingbox = new Bounds(); for (vector in vertices) { - boundingbox.addPoint(vector.toPoint()); + boundingbox.addPoint(vector.add(pos).toPoint()); } collider = new BoxCollisionEntity(boundingbox, this); + + // var cub = new Cube(boundingbox.xSize, boundingbox.ySize, boundingbox.zSize); + // cub.addUVs(); + // cub.addNormals(); + // var mat = Material.create(); + // mat.mainPass.wireframe = true; + // var mesh = new Mesh(cub, mat, level.scene); + // // var m1 = new Mesh(cub, mat, level.scene); + // // m1.setPosition(boundingbox.xMin, boundingbox.yMin, boundingbox.zMin); + // // var m2 = new Mesh(cub, mat, level.scene); + // // m2.setPosition(boundingbox.xMax, boundingbox.yMax, boundingbox.zMax); + // mesh.setPosition(boundingbox.xMin, boundingbox.yMin, boundingbox.zMin); } }