mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2026-04-26 12:41:40 +00:00
blast wave
This commit is contained in:
parent
c63efec2bf
commit
e910bd9c40
5 changed files with 261 additions and 13 deletions
|
|
@ -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;
|
affectedCount = 0;
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,7 @@
|
||||||
package src;
|
package src;
|
||||||
|
|
||||||
|
import shapes.HelicopterImage;
|
||||||
|
import shapes.BlastWave;
|
||||||
import collision.CollisionHull;
|
import collision.CollisionHull;
|
||||||
import dif.Plane;
|
import dif.Plane;
|
||||||
import shaders.marble.ClassicGlass;
|
import shaders.marble.ClassicGlass;
|
||||||
|
|
@ -233,11 +235,13 @@ class Marble extends GameObject {
|
||||||
public var lastContactNormal:Vector;
|
public var lastContactNormal:Vector;
|
||||||
|
|
||||||
var forcefield:DtsObject;
|
var forcefield:DtsObject;
|
||||||
var helicopter:DtsObject;
|
var helicopter:HelicopterImage;
|
||||||
|
var blastWave:BlastWave;
|
||||||
var superBounceEnableTime:Float = -1e8;
|
var superBounceEnableTime:Float = -1e8;
|
||||||
var shockAbsorberEnableTime:Float = -1e8;
|
var shockAbsorberEnableTime:Float = -1e8;
|
||||||
var helicopterEnableTime:Float = -1e8;
|
var helicopterEnableTime:Float = -1e8;
|
||||||
var megaMarbleEnableTime:Float = -1e8;
|
var megaMarbleEnableTime:Float = -1e8;
|
||||||
|
var blastUseTime:Float = -1e8;
|
||||||
|
|
||||||
var teleportEnableTime:Null<Float> = null;
|
var teleportEnableTime:Null<Float> = null;
|
||||||
var teleportDisableTime:Null<Float> = null;
|
var teleportDisableTime:Null<Float> = null;
|
||||||
|
|
@ -436,6 +440,13 @@ class Marble extends GameObject {
|
||||||
// marbleMaterial.mainPass.addShader(new MarbleReflection(this.cubemapRenderer.cubemap));
|
// 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 = new DtsObject();
|
||||||
this.forcefield.dtsPath = "data/shapes/images/glow_bounce.dts";
|
this.forcefield.dtsPath = "data/shapes/images/glow_bounce.dts";
|
||||||
this.forcefield.useInstancing = true;
|
this.forcefield.useInstancing = true;
|
||||||
|
|
@ -447,20 +458,18 @@ class Marble extends GameObject {
|
||||||
this.forcefield.z = 1e8;
|
this.forcefield.z = 1e8;
|
||||||
this.forcefield.isBoundingBoxCollideable = false;
|
this.forcefield.isBoundingBoxCollideable = false;
|
||||||
|
|
||||||
this.helicopter = new DtsObject();
|
this.helicopter = new HelicopterImage();
|
||||||
this.helicopter.dtsPath = "data/shapes/images/helicopter_image.dts";
|
|
||||||
this.helicopter.useInstancing = true;
|
|
||||||
this.helicopter.identifier = "HelicopterImage";
|
|
||||||
this.helicopter.showSequences = true;
|
|
||||||
this.helicopter.isBoundingBoxCollideable = false;
|
this.helicopter.isBoundingBoxCollideable = false;
|
||||||
// this.addChild(this.helicopter);
|
// this.addChild(this.helicopter);
|
||||||
this.helicopter.x = 1e8;
|
this.helicopter.x = 1e8;
|
||||||
this.helicopter.y = 1e8;
|
this.helicopter.y = 1e8;
|
||||||
this.helicopter.z = 1e8;
|
this.helicopter.z = 1e8;
|
||||||
|
this.helicopter.scale(0.3 / 0.2);
|
||||||
|
|
||||||
var worker = new ResourceLoaderWorker(onFinish);
|
var worker = new ResourceLoaderWorker(onFinish);
|
||||||
worker.addTask(fwd -> level.addDtsObject(this.forcefield, fwd));
|
worker.addTask(fwd -> level.addDtsObject(this.forcefield, fwd));
|
||||||
worker.addTask(fwd -> level.addDtsObject(this.helicopter, fwd));
|
worker.addTask(fwd -> level.addDtsObject(this.helicopter, fwd));
|
||||||
|
worker.addTask(fwd -> level.addDtsObject(this.blastWave, fwd));
|
||||||
worker.run();
|
worker.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1867,6 +1876,12 @@ class Marble extends GameObject {
|
||||||
this.helicopter.setPosition(1e8, 1e8, 1e8);
|
this.helicopter.setPosition(1e8, 1e8, 1e8);
|
||||||
this.helicopterSound.pause = true;
|
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() {
|
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);
|
var impulse = this.level.currentUp.multiply(Math.max(Math.sqrt(this.level.blastAmount), this.level.blastAmount) * 10);
|
||||||
this.applyImpulse(impulse);
|
this.applyImpulse(impulse);
|
||||||
AudioManager.playSound(ResourceLoader.getResource('data/sound/use_blast.wav', ResourceLoader.getAudio, this.soundResources));
|
AudioManager.playSound(ResourceLoader.getResource('data/sound/use_blast.wav', ResourceLoader.getAudio, this.soundResources));
|
||||||
this.level.particleManager.createEmitter(this.level.blastAmount > 1 ? blastMaxParticleOptions : blastParticleOptions,
|
this.blastWave.doSequenceOnceBeginTime = this.level.timeState.timeSinceLoad;
|
||||||
this.level.blastAmount > 1 ? blastMaxEmitterData : blastEmitterData, this.getAbsPos().getPosition(), () -> {
|
this.blastUseTime = this.level.timeState.currentAttemptTime;
|
||||||
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.level.blastAmount = 0;
|
this.level.blastAmount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1946,6 +1957,7 @@ class Marble extends GameObject {
|
||||||
this.shockAbsorberEnableTime = Math.NEGATIVE_INFINITY;
|
this.shockAbsorberEnableTime = Math.NEGATIVE_INFINITY;
|
||||||
this.helicopterEnableTime = Math.NEGATIVE_INFINITY;
|
this.helicopterEnableTime = Math.NEGATIVE_INFINITY;
|
||||||
this.megaMarbleEnableTime = Math.NEGATIVE_INFINITY;
|
this.megaMarbleEnableTime = Math.NEGATIVE_INFINITY;
|
||||||
|
this.blastUseTime = Math.NEGATIVE_INFINITY;
|
||||||
this.lastContactNormal = new Vector(0, 0, 1);
|
this.lastContactNormal = new Vector(0, 0, 1);
|
||||||
this.contactEntities = [];
|
this.contactEntities = [];
|
||||||
this.cloak = false;
|
this.cloak = false;
|
||||||
|
|
|
||||||
|
|
@ -479,7 +479,7 @@ class PlayGui {
|
||||||
|
|
||||||
blastBar.addChild(blastFillUltra);
|
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.position = new Vector(0, 0);
|
||||||
blastFrame.extent = new Vector(170, 83);
|
blastFrame.extent = new Vector(170, 83);
|
||||||
blastFrame.xScale = (scene2d.height - 82 * 2) / 480;
|
blastFrame.xScale = (scene2d.height - 82 * 2) / 480;
|
||||||
|
|
|
||||||
172
src/shapes/BlastWave.hx
Normal file
172
src/shapes/BlastWave.hx
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
39
src/shapes/HelicopterImage.hx
Normal file
39
src/shapes/HelicopterImage.hx
Normal 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue