From d531000e69abbee0a1ecf6910f8c45b83a951a3d Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Sun, 18 Jun 2023 23:45:37 +0530 Subject: [PATCH] blast wave --- src/DtsObject.hx | 25 +++++ src/Marble.hx | 36 ++++--- src/gui/PlayGui.hx | 2 +- src/shapes/BlastWave.hx | 172 ++++++++++++++++++++++++++++++++++ src/shapes/HelicopterImage.hx | 39 ++++++++ 5 files changed, 261 insertions(+), 13 deletions(-) create mode 100644 src/shapes/BlastWave.hx create mode 100644 src/shapes/HelicopterImage.hx diff --git a/src/DtsObject.hx b/src/DtsObject.hx index c351bf12..d13407af 100644 --- a/src/DtsObject.hx +++ b/src/DtsObject.hx @@ -1251,6 +1251,31 @@ class DtsObject extends GameObject { } } } + + if (sequence.flags & 4 > 0) { // Arbitrary scales + for (i in 0...this.dts.nodes.length) { + var affected = ((1 << i) & scale) != 0; + + if (affected) { + var scale1 = this.dts.nodeArbitraryScaleFactors[sequence.baseScale + sequence.numKeyFrames * affectedCount + keyframeLow]; + var scale2 = this.dts.nodeArbitraryScaleFactors[sequence.baseScale + sequence.numKeyFrames * affectedCount + keyframeHigh]; + + var v1 = new Vector(scale1.x, scale1.y, scale1.z); + var v2 = new Vector(scale2.x, scale2.y, scale2.z); + + var scaleVec = Util.lerpThreeVectors(v1, v2, t); + this.graphNodes[i].scaleX = scaleVec.x; + this.graphNodes[i].scaleY = scaleVec.y; + this.graphNodes[i].scaleZ = scaleVec.z; + affectedCount++; + propagateDirtyFlags(i); + } else { + this.graphNodes[i].scaleX = 1; + this.graphNodes[i].scaleY = 1; + this.graphNodes[i].scaleZ = 1; + } + } + } } affectedCount = 0; diff --git a/src/Marble.hx b/src/Marble.hx index b17fd407..bdbd0a82 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -1,5 +1,7 @@ package src; +import shapes.HelicopterImage; +import shapes.BlastWave; import collision.CollisionHull; import dif.Plane; import shaders.marble.ClassicGlass; @@ -233,11 +235,13 @@ class Marble extends GameObject { public var lastContactNormal:Vector; var forcefield:DtsObject; - var helicopter:DtsObject; + var helicopter:HelicopterImage; + var blastWave:BlastWave; var superBounceEnableTime:Float = -1e8; var shockAbsorberEnableTime:Float = -1e8; var helicopterEnableTime:Float = -1e8; var megaMarbleEnableTime:Float = -1e8; + var blastUseTime:Float = -1e8; var teleportEnableTime:Null = null; var teleportDisableTime:Null = null; @@ -436,6 +440,13 @@ class Marble extends GameObject { // marbleMaterial.mainPass.addShader(new MarbleReflection(this.cubemapRenderer.cubemap)); // } + this.blastWave = new BlastWave(); + // this.addChild(this.blastWave); + this.blastWave.x = 1e8; + this.blastWave.y = 1e8; + this.blastWave.z = 1e8; + this.blastWave.isBoundingBoxCollideable = false; + this.forcefield = new DtsObject(); this.forcefield.dtsPath = "data/shapes/images/glow_bounce.dts"; this.forcefield.useInstancing = true; @@ -447,20 +458,18 @@ class Marble extends GameObject { this.forcefield.z = 1e8; this.forcefield.isBoundingBoxCollideable = false; - this.helicopter = new DtsObject(); - this.helicopter.dtsPath = "data/shapes/images/helicopter_image.dts"; - this.helicopter.useInstancing = true; - this.helicopter.identifier = "HelicopterImage"; - this.helicopter.showSequences = true; + this.helicopter = new HelicopterImage(); this.helicopter.isBoundingBoxCollideable = false; // this.addChild(this.helicopter); this.helicopter.x = 1e8; this.helicopter.y = 1e8; this.helicopter.z = 1e8; + this.helicopter.scale(0.3 / 0.2); var worker = new ResourceLoaderWorker(onFinish); worker.addTask(fwd -> level.addDtsObject(this.forcefield, fwd)); worker.addTask(fwd -> level.addDtsObject(this.helicopter, fwd)); + worker.addTask(fwd -> level.addDtsObject(this.blastWave, fwd)); worker.run(); } @@ -1867,6 +1876,12 @@ class Marble extends GameObject { this.helicopter.setPosition(1e8, 1e8, 1e8); this.helicopterSound.pause = true; } + if (currentTime - this.blastUseTime < this.blastWave.dts.sequences[0].duration) { + this.blastWave.setPosition(x, y, z); + this.blastWave.setRotationQuat(this.level.getOrientationQuat(this.level.timeState.currentAttemptTime)); + } else { + this.blastWave.setPosition(1e8, 1e8, 1e8); + } } public function useBlast() { @@ -1875,12 +1890,8 @@ class Marble extends GameObject { var impulse = this.level.currentUp.multiply(Math.max(Math.sqrt(this.level.blastAmount), this.level.blastAmount) * 10); this.applyImpulse(impulse); AudioManager.playSound(ResourceLoader.getResource('data/sound/use_blast.wav', ResourceLoader.getAudio, this.soundResources)); - this.level.particleManager.createEmitter(this.level.blastAmount > 1 ? blastMaxParticleOptions : blastParticleOptions, - this.level.blastAmount > 1 ? blastMaxEmitterData : blastEmitterData, this.getAbsPos().getPosition(), () -> { - this.getAbsPos().getPosition().add(this.level.currentUp.multiply(-this._radius * 0.4)); - }, - new Vector(1, 1, - 1).add(new Vector(Math.abs(this.level.currentUp.x), Math.abs(this.level.currentUp.y), Math.abs(this.level.currentUp.z)).multiply(-0.8))); + this.blastWave.doSequenceOnceBeginTime = this.level.timeState.timeSinceLoad; + this.blastUseTime = this.level.timeState.currentAttemptTime; this.level.blastAmount = 0; } @@ -1946,6 +1957,7 @@ class Marble extends GameObject { this.shockAbsorberEnableTime = Math.NEGATIVE_INFINITY; this.helicopterEnableTime = Math.NEGATIVE_INFINITY; this.megaMarbleEnableTime = Math.NEGATIVE_INFINITY; + this.blastUseTime = Math.NEGATIVE_INFINITY; this.lastContactNormal = new Vector(0, 0, 1); this.contactEntities = []; this.cloak = false; diff --git a/src/gui/PlayGui.hx b/src/gui/PlayGui.hx index a36329ad..de0a1c89 100644 --- a/src/gui/PlayGui.hx +++ b/src/gui/PlayGui.hx @@ -479,7 +479,7 @@ class PlayGui { blastBar.addChild(blastFillUltra); - blastFrame = new GuiImage(ResourceLoader.getResource("data/ui/game/powerbar.png", ResourceLoader.getImage, this.imageResources).toTile()); + blastFrame = new GuiImage(ResourceLoader.getResource("data/ui/game/pc/powerbar.png", ResourceLoader.getImage, this.imageResources).toTile()); blastFrame.position = new Vector(0, 0); blastFrame.extent = new Vector(170, 83); blastFrame.xScale = (scene2d.height - 82 * 2) / 480; diff --git a/src/shapes/BlastWave.hx b/src/shapes/BlastWave.hx new file mode 100644 index 00000000..13fb35e5 --- /dev/null +++ b/src/shapes/BlastWave.hx @@ -0,0 +1,172 @@ +package shapes; + +import h3d.mat.Material; +import src.DtsObject; +import src.ResourceLoader; + +class BlastWave extends DtsObject { + public function new() { + super(); + this.dtsPath = "data/shapes/images/distort.dts"; + this.isCollideable = false; + this.isTSStatic = false; + this.identifier = "BlastWave"; + this.useInstancing = true; + this.animateSubObjectOpacities = true; + this.doSequenceOnce = true; + } + + public override function init(level:src.MarbleWorld, onFinish:() -> Void) { + super.init(level, onFinish); + } + + override function update(timeState:src.TimeState) { + super.update(timeState); + } + + override function postProcessMaterial(matName:String, material:Material) { + if (matName == "refract") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/images/blast_glow.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + // aa + var trivialShader = new shaders.TrivialMaterial(diffuseTex); + material.mainPass.removeShader(material.textureShader); + var glowpass = material.mainPass.clone(); + + glowpass.addShader(trivialShader); + var dtsshader = glowpass.getShader(shaders.DtsTexture); + dtsshader.passThrough = true; + glowpass.setPassName("glow"); + glowpass.depthTest = LessEqual; + glowpass.depthWrite = false; + glowpass.enableLights = false; + glowpass.setBlendMode(Alpha); + // glowpass.blendSrc = SrcAlpha; + // glowpass.blendDst = OneMinusSrcAlpha; + material.addPass(glowpass); + + material.mainPass.setPassName("glowPreNoRender"); + material.mainPass.removeShader(material.textureShader); + material.mainPass.addShader(trivialShader); + dtsshader = material.mainPass.getShader(shaders.DtsTexture); + dtsshader.passThrough = true; + material.mainPass.enableLights = false; + + // var thisprops:Dynamic = material.getDefaultProps(); + // thisprops.light = false; // We will calculate our own lighting + // material.props = thisprops; + material.shadows = false; + // material.blendMode = Alpha; + material.mainPass.depthWrite = false; + } + + if (matName == "blastwave") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/images/blastwave.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + // aa + var trivialShader = new shaders.TrivialMaterial(diffuseTex); + material.mainPass.removeShader(material.textureShader); + var glowpass = material.mainPass.clone(); + + glowpass.addShader(trivialShader); + var dtsshader = glowpass.getShader(shaders.DtsTexture); + dtsshader.passThrough = true; + glowpass.setPassName("glow"); + glowpass.depthTest = LessEqual; + glowpass.depthWrite = false; + glowpass.enableLights = false; + glowpass.setBlendMode(Alpha); + // glowpass.blendSrc = SrcAlpha; + // glowpass.blendDst = OneMinusSrcAlpha; + material.addPass(glowpass); + + material.mainPass.setPassName("glowPreNoRender"); + material.mainPass.removeShader(material.textureShader); + material.mainPass.addShader(trivialShader); + dtsshader = material.mainPass.getShader(shaders.DtsTexture); + dtsshader.passThrough = true; + material.mainPass.enableLights = false; + + // var thisprops:Dynamic = material.getDefaultProps(); + // thisprops.light = false; // We will calculate our own lighting + // material.props = thisprops; + material.shadows = false; + // material.blendMode = Alpha; + material.mainPass.depthWrite = false; + } + + if (matName == "endpad_glow") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/pads/endpad_glow.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + // aa + var trivialShader = new shaders.TrivialMaterial(diffuseTex); + material.mainPass.removeShader(material.textureShader); + var glowpass = material.mainPass.clone(); + + glowpass.addShader(trivialShader); + var dtsshader = glowpass.getShader(shaders.DtsTexture); + dtsshader.passThrough = true; + glowpass.setPassName("glow"); + glowpass.depthTest = LessEqual; + glowpass.depthWrite = false; + glowpass.enableLights = false; + glowpass.setBlendMode(Alpha); + // glowpass.blendSrc = SrcAlpha; + // glowpass.blendDst = OneMinusSrcAlpha; + material.addPass(glowpass); + + material.mainPass.setPassName("glowPreNoRender"); + material.mainPass.removeShader(material.textureShader); + material.mainPass.addShader(trivialShader); + dtsshader = material.mainPass.getShader(shaders.DtsTexture); + dtsshader.passThrough = true; + material.mainPass.enableLights = false; + + // var thisprops:Dynamic = material.getDefaultProps(); + // thisprops.light = false; // We will calculate our own lighting + // material.props = thisprops; + material.shadows = false; + // material.blendMode = Alpha; + material.mainPass.depthWrite = false; + } + + if (matName == "corona") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/images/corona.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + // aa + var trivialShader = new shaders.TrivialMaterial(diffuseTex); + material.mainPass.removeShader(material.textureShader); + var glowpass = material.mainPass.clone(); + + glowpass.addShader(trivialShader); + var dtsshader = glowpass.getShader(shaders.DtsTexture); + dtsshader.passThrough = true; + glowpass.setPassName("glow"); + glowpass.depthTest = LessEqual; + glowpass.depthWrite = false; + glowpass.enableLights = false; + glowpass.setBlendMode(Alpha); + // glowpass.blendSrc = SrcAlpha; + // glowpass.blendDst = OneMinusSrcAlpha; + material.addPass(glowpass); + + material.mainPass.setPassName("glowPreNoRender"); + material.mainPass.removeShader(material.textureShader); + material.mainPass.addShader(trivialShader); + dtsshader = material.mainPass.getShader(shaders.DtsTexture); + dtsshader.passThrough = true; + material.mainPass.enableLights = false; + + // var thisprops:Dynamic = material.getDefaultProps(); + // thisprops.light = false; // We will calculate our own lighting + // material.props = thisprops; + material.shadows = false; + // material.blendMode = Alpha; + material.mainPass.depthWrite = false; + } + } +} diff --git a/src/shapes/HelicopterImage.hx b/src/shapes/HelicopterImage.hx new file mode 100644 index 00000000..546e951a --- /dev/null +++ b/src/shapes/HelicopterImage.hx @@ -0,0 +1,39 @@ +package shapes; + +import h3d.mat.Material; +import src.DtsObject; +import src.ResourceLoader; + +class HelicopterImage extends DtsObject { + public function new() { + super(); + this.dtsPath = "data/shapes/images/helicopter_image.dts"; + this.isCollideable = false; + this.isTSStatic = false; + this.identifier = "HelicopterImage"; + this.useInstancing = true; + } + + public override function init(level:src.MarbleWorld, onFinish:() -> Void) { + super.init(level, onFinish); + } + + override function postProcessMaterial(matName:String, material:Material) { + if (matName == "copter_skin") { + var diffuseTex = ResourceLoader.getTexture("data/shapes/images/copter_skin.png").resource; + diffuseTex.wrap = Repeat; + diffuseTex.mipMap = Nearest; + var shader = new shaders.DefaultNormalMaterial(diffuseTex, 32, new h3d.Vector(1, 1, 1, 1), 1); + shader.doGammaRamp = false; + var dtsTex = material.mainPass.getShader(shaders.DtsTexture); + dtsTex.passThrough = true; + material.mainPass.removeShader(material.textureShader); + material.mainPass.addShader(shader); + var thisprops:Dynamic = material.getDefaultProps(); + thisprops.light = false; // We will calculate our own lighting + material.props = thisprops; + material.shadows = false; + material.receiveShadows = true; + } + } +}