blast wave

This commit is contained in:
RandomityGuy 2023-06-18 23:45:37 +05:30
parent 56e2180be8
commit d531000e69
5 changed files with 261 additions and 13 deletions

View file

@ -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;

View file

@ -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<Float> = null;
var teleportDisableTime:Null<Float> = 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;

View file

@ -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;

172
src/shapes/BlastWave.hx Normal file
View file

@ -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;
}
}
}

View file

@ -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;
}
}
}