more ultra stuff and fixes

This commit is contained in:
RandomityGuy 2023-06-15 01:18:50 +05:30
parent f69f959765
commit 9e15f6b7b4
13 changed files with 127 additions and 89 deletions

View file

@ -46,7 +46,7 @@ var dtsMaterials = [
"bumper-rubber" => {friction: 0.5, restitution: 0.0, force: 15.0}, "bumper-rubber" => {friction: 0.5, restitution: 0.0, force: 15.0},
"triang-side" => {friction: 0.5, restitution: 0.0, force: 15.0}, "triang-side" => {friction: 0.5, restitution: 0.0, force: 15.0},
"triang-top" => {friction: 0.5, restitution: 0.0, force: 15.0}, "triang-top" => {friction: 0.5, restitution: 0.0, force: 15.0},
"pball-round-side" => {friction: 0.5, restitution: 0.0, force: 15.0}, "bumper" => {friction: 0.5, restitution: 0.0, force: 15.0},
"pball-round-top" => {friction: 0.5, restitution: 0.0, force: 15.0}, "pball-round-top" => {friction: 0.5, restitution: 0.0, force: 15.0},
"pball-round-bottm" => {friction: 0.5, restitution: 0.0, force: 15.0} "pball-round-bottm" => {friction: 0.5, restitution: 0.0, force: 15.0}
]; ];
@ -705,6 +705,13 @@ class DtsObject extends GameObject {
}); });
} }
function normalizeSafe(v:Vector) {
var mag = ((v.x * v.x) <= 1e-4) && ((v.y * v.y) <= 1e-4) && ((v.z * v.z) <= 1e-4) ? 0.0 : v.length();
if (mag > 1e-4) {
v.scale(1 / mag);
}
}
function createTextureSpaceMatrix(i0:Int, i1:Int, i2:Int) { function createTextureSpaceMatrix(i0:Int, i1:Int, i2:Int) {
var t0 = new Vector(); var t0 = new Vector();
var t1 = new Vector(); var t1 = new Vector();
@ -715,8 +722,8 @@ class DtsObject extends GameObject {
var edge1 = new Vector(); var edge1 = new Vector();
var edge2 = new Vector(); var edge2 = new Vector();
var cp = new Vector(); var cp = new Vector();
edge1.set(vertices[i1].x - vertices[i0].x, vertices[i1].y - vertices[i0].y, vertices[i1].z - vertices[i0].z); edge1.set(vertices[i1].x - vertices[i0].x, dtsMesh.uv[i1].x - dtsMesh.uv[i0].x, dtsMesh.uv[i1].y - dtsMesh.uv[i0].y);
edge2.set(vertices[i2].x - vertices[i0].x, vertices[i2].y - vertices[i0].y, vertices[i2].z - vertices[i0].z); edge2.set(vertices[i2].x - vertices[i0].x, dtsMesh.uv[i2].x - dtsMesh.uv[i0].x, dtsMesh.uv[i2].y - dtsMesh.uv[i0].y);
var fVar1 = vertices[i1].x - vertices[i0].x; var fVar1 = vertices[i1].x - vertices[i0].x;
var fVar2 = vertices[i2].x - vertices[i0].x; var fVar2 = vertices[i2].x - vertices[i0].x;
var fVar4 = dtsMesh.uv[i1].x - dtsMesh.uv[i0].x; var fVar4 = dtsMesh.uv[i1].x - dtsMesh.uv[i0].x;
@ -773,25 +780,28 @@ class DtsObject extends GameObject {
} }
// v0 // v0
t0.normalize(); normalizeSafe(t0);
b0.normalized(); normalizeSafe(b0);
var n0 = t0.cross(b0); var n0 = t0.cross(b0);
n0.x *= -1;
if (n0.dot(vertexNormals[i0]) < 0.0) { if (n0.dot(vertexNormals[i0]) < 0.0) {
n0.scale(-1); n0.scale(-1);
} }
// v1 // v1
t1.normalize(); normalizeSafe(t1);
b1.normalized(); normalizeSafe(b1);
var n1 = t1.cross(b1); var n1 = t1.cross(b1);
n1.x *= -1;
if (n1.dot(vertexNormals[i1]) < 0.0) { if (n1.dot(vertexNormals[i1]) < 0.0) {
n1.scale(-1); n1.scale(-1);
} }
// v2 // v2
t2.normalize(); normalizeSafe(t2);
b2.normalized(); normalizeSafe(b2);
var n2 = t2.cross(b2); var n2 = t2.cross(b2);
n2.x *= -1;
if (n2.dot(vertexNormals[i2]) < 0.0) { if (n2.dot(vertexNormals[i2]) < 0.0) {
n2.scale(-1); n2.scale(-1);
} }
@ -802,9 +812,6 @@ class DtsObject extends GameObject {
b0.x *= -1; b0.x *= -1;
b1.x *= -1; b1.x *= -1;
b2.x *= -1; b2.x *= -1;
n0.x *= -1;
n1.x *= -1;
n2.x *= -1;
return [ return [
{ {
@ -866,17 +873,6 @@ class DtsObject extends GameObject {
geometrydata.normals.push(new Vector(normal.x, normal.y, normal.z)); geometrydata.normals.push(new Vector(normal.x, normal.y, normal.z));
} }
var tbn = createTextureSpaceMatrix(i1, i2, i3);
geometrydata.tangents.push(tbn[0].tangent);
geometrydata.tangents.push(tbn[1].tangent);
geometrydata.tangents.push(tbn[2].tangent);
geometrydata.bitangents.push(tbn[0].bitangent);
geometrydata.bitangents.push(tbn[1].bitangent);
geometrydata.bitangents.push(tbn[2].bitangent);
geometrydata.texNormals.push(tbn[0].normal);
geometrydata.texNormals.push(tbn[1].normal);
geometrydata.texNormals.push(tbn[2].normal);
geometrydata.indices.push(i1); geometrydata.indices.push(i1);
geometrydata.indices.push(i2); geometrydata.indices.push(i2);
geometrydata.indices.push(i3); geometrydata.indices.push(i3);
@ -897,6 +893,17 @@ class DtsObject extends GameObject {
addTriangleFromIndices(i1, i2, i3, materialIndex); addTriangleFromIndices(i1, i2, i3, materialIndex);
var tbn = createTextureSpaceMatrix(dtsMesh.indices[i], dtsMesh.indices[i + 1], dtsMesh.indices[i + 2]);
geometrydata.tangents.push(tbn[2].tangent);
geometrydata.tangents.push(tbn[1].tangent);
geometrydata.tangents.push(tbn[0].tangent);
geometrydata.bitangents.push(tbn[2].bitangent);
geometrydata.bitangents.push(tbn[1].bitangent);
geometrydata.bitangents.push(tbn[0].bitangent);
geometrydata.texNormals.push(tbn[2].normal);
geometrydata.texNormals.push(tbn[1].normal);
geometrydata.texNormals.push(tbn[0].normal);
i += 3; i += 3;
} }
} else if (drawType == TSDrawPrimitive.Strip) { } else if (drawType == TSDrawPrimitive.Strip) {
@ -915,6 +922,17 @@ class DtsObject extends GameObject {
addTriangleFromIndices(i1, i2, i3, materialIndex); addTriangleFromIndices(i1, i2, i3, materialIndex);
var tbn = createTextureSpaceMatrix(dtsMesh.indices[i], dtsMesh.indices[i + 1], dtsMesh.indices[i + 2]);
geometrydata.tangents.push(tbn[2].tangent);
geometrydata.tangents.push(tbn[1].tangent);
geometrydata.tangents.push(tbn[0].tangent);
geometrydata.bitangents.push(tbn[2].bitangent);
geometrydata.bitangents.push(tbn[1].bitangent);
geometrydata.bitangents.push(tbn[0].bitangent);
geometrydata.texNormals.push(tbn[2].normal);
geometrydata.texNormals.push(tbn[1].normal);
geometrydata.texNormals.push(tbn[0].normal);
k++; k++;
} }
} else if (drawType == TSDrawPrimitive.Fan) { } else if (drawType == TSDrawPrimitive.Fan) {
@ -926,6 +944,17 @@ class DtsObject extends GameObject {
addTriangleFromIndices(i1, i2, i3, materialIndex); addTriangleFromIndices(i1, i2, i3, materialIndex);
var tbn = createTextureSpaceMatrix(dtsMesh.indices[primitive.firstElement], dtsMesh.indices[i + 1], dtsMesh.indices[i + 2]);
geometrydata.tangents.push(tbn[2].tangent);
geometrydata.tangents.push(tbn[1].tangent);
geometrydata.tangents.push(tbn[0].tangent);
geometrydata.bitangents.push(tbn[2].bitangent);
geometrydata.bitangents.push(tbn[1].bitangent);
geometrydata.bitangents.push(tbn[0].bitangent);
geometrydata.texNormals.push(tbn[2].normal);
geometrydata.texNormals.push(tbn[1].normal);
geometrydata.texNormals.push(tbn[0].normal);
i++; i++;
} }
} }
@ -1118,14 +1147,12 @@ class DtsObject extends GameObject {
var v1 = this.dts.objectStates[sequence.baseObjectState + sequence.numKeyFrames * affectedCount + keyframeLow].vis; var v1 = this.dts.objectStates[sequence.baseObjectState + sequence.numKeyFrames * affectedCount + keyframeLow].vis;
var v2 = this.dts.objectStates[sequence.baseObjectState + sequence.numKeyFrames * affectedCount + keyframeHigh].vis; var v2 = this.dts.objectStates[sequence.baseObjectState + sequence.numKeyFrames * affectedCount + keyframeHigh].vis;
if (this.identifier == "RoundBumper") {
trace('Bumper: ${v1} ${v2}');
}
var v = Util.lerp(v1, v2, t); var v = Util.lerp(v1, v2, t);
meshVisibilities[visIterIdx] = v; meshVisibilities[visIterIdx] = v;
updateSubObjectOpacity(visIterIdx); updateSubObjectOpacity(visIterIdx);
affectedCount++; affectedCount++;
} else { } else {
updateSubObjectOpacity(visIterIdx);
meshVisibilities[visIterIdx] = this.dts.objectStates[visIterIdx].vis; meshVisibilities[visIterIdx] = this.dts.objectStates[visIterIdx].vis;
} }
vis >>= 1; vis >>= 1;

View file

@ -74,6 +74,8 @@ class InstanceManager {
if (dtsShader != null) { if (dtsShader != null) {
if (instance.gameObject.animateSubObjectOpacities) { if (instance.gameObject.animateSubObjectOpacities) {
subOpacity = instance.gameObject.getSubObjectOpacity(instance.emptyObj); subOpacity = instance.gameObject.getSubObjectOpacity(instance.emptyObj);
if (subOpacity == 0)
continue; // Do not draw
minfo.meshbatch.shadersChanged = true; minfo.meshbatch.shadersChanged = true;
} }

View file

@ -78,9 +78,11 @@ class MarbleWorldMacros {
shape = new Helicopter(cast element); shape = new Helicopter(cast element);
else if (dataBlockLowerCase == "eastereggitem") else if (dataBlockLowerCase == "eastereggitem")
shape = new EasterEgg(cast element); shape = new EasterEgg(cast element);
else if (dataBlockLowerCase == "checkpointshape") else if (dataBlockLowerCase == "checkpointshape") {
shape = new Checkpoint(cast element); shape = new Checkpoint(cast element);
else if (dataBlockLowerCase == "ductfan") if (_previousCheckpointTrigger != null)
_previousCheckpointTrigger.checkpoint = cast shape;
} else if (dataBlockLowerCase == "ductfan")
shape = new DuctFan(); shape = new DuctFan();
else if (dataBlockLowerCase == "smallductfan") else if (dataBlockLowerCase == "smallductfan")
shape = new SmallDuctFan(); shape = new SmallDuctFan();

View file

@ -1,5 +1,6 @@
package src; package src;
import h3d.scene.fwd.Light;
import rewind.RewindManager; import rewind.RewindManager;
import Macros.MarbleWorldMacros; import Macros.MarbleWorldMacros;
#if js #if js
@ -157,12 +158,14 @@ class MarbleWorld extends Scheduler {
public var newOrientationQuat = new Quat(); public var newOrientationQuat = new Quat();
// Checkpoint // Checkpoint
var currentCheckpoint:{obj:DtsObject, elem:MissionElementBase} = null; var currentCheckpoint:DtsObject = null;
var currentCheckpointTrigger:CheckpointTrigger = null; var currentCheckpointTrigger:CheckpointTrigger = null;
var checkpointCollectedGems:Map<Gem, Bool> = []; var checkpointCollectedGems:Map<Gem, Bool> = [];
var checkpointHeldPowerup:PowerUp = null; var checkpointHeldPowerup:PowerUp = null;
var checkpointUp:Vector = null; var checkpointUp:Vector = null;
var cheeckpointBlast:Float = 0; var cheeckpointBlast:Float = 0;
var checkpointSequence:Int = 0;
var _previousCheckpointTrigger:CheckpointTrigger;
// Replay // Replay
public var replay:Replay; public var replay:Replay;
@ -317,6 +320,7 @@ class MarbleWorld extends Scheduler {
var ls = cast(scene.lightSystem, h3d.scene.fwd.LightSystem); var ls = cast(scene.lightSystem, h3d.scene.fwd.LightSystem);
ls.ambientLight.load(ambientColor); ls.ambientLight.load(ambientColor);
// ls.shadowLight.setDirection(new Vector(0, 0, -1));
this.ambient = ambientColor; this.ambient = ambientColor;
// ls.perPixelLighting = false; // ls.perPixelLighting = false;
@ -463,6 +467,7 @@ class MarbleWorld extends Scheduler {
this.checkpointHeldPowerup = null; this.checkpointHeldPowerup = null;
this.checkpointUp = null; this.checkpointUp = null;
this.cheeckpointBlast = 0; this.cheeckpointBlast = 0;
this.checkpointSequence = 0;
if (this.endPad != null) if (this.endPad != null)
this.endPad.inFinish = false; this.endPad.inFinish = false;
@ -495,7 +500,7 @@ class MarbleWorld extends Scheduler {
var startquat = this.getStartPositionAndOrientation(); var startquat = this.getStartPositionAndOrientation();
this.marble.setPosition(startquat.position.x, startquat.position.y, startquat.position.z + 1.5); this.marble.setPosition(startquat.position.x, startquat.position.y, startquat.position.z + 0.727843);
var oldtransform = this.marble.collider.transform.clone(); var oldtransform = this.marble.collider.transform.clone();
oldtransform.setPosition(startquat.position); oldtransform.setPosition(startquat.position);
this.marble.collider.setTransform(oldtransform); this.marble.collider.setTransform(oldtransform);
@ -725,6 +730,7 @@ class MarbleWorld extends Scheduler {
trigger = new DestinationTrigger(element, cast this); trigger = new DestinationTrigger(element, cast this);
} else if (datablockLowercase == "checkpointtrigger") { } else if (datablockLowercase == "checkpointtrigger") {
trigger = new CheckpointTrigger(element, cast this); trigger = new CheckpointTrigger(element, cast this);
_previousCheckpointTrigger = cast trigger;
} else { } else {
Console.error("Unknown trigger: " + element.datablock); Console.error("Unknown trigger: " + element.datablock);
onFinish(); onFinish();
@ -1723,22 +1729,20 @@ class MarbleWorld extends Scheduler {
} }
/** Sets a new active checkpoint. */ /** Sets a new active checkpoint. */
public function saveCheckpointState(shape:{obj:DtsObject, elem:MissionElementBase}, trigger:CheckpointTrigger = null) { public function saveCheckpointState(shape:DtsObject, trigger:CheckpointTrigger = null) {
if (this.currentCheckpoint != null) if (this.currentCheckpoint != null)
if (this.currentCheckpoint.obj == shape.obj) if (this.currentCheckpoint == shape)
return; return false;
var disableOob = false; var disableOob = false;
if (shape != null) {
if (shape.elem.fields.exists('disableOob')) {
disableOob = MisParser.parseBoolean(shape.elem.fields.get('disableOob')[0]);
}
}
if (trigger != null) { if (trigger != null) {
disableOob = trigger.disableOOB; disableOob = trigger.disableOOB;
if (checkpointSequence > trigger.seqNum)
return false;
} }
checkpointSequence = trigger.seqNum;
// (shape.srcElement as any) ?.disableOob || trigger?.element.disableOob; // (shape.srcElement as any) ?.disableOob || trigger?.element.disableOob;
if (disableOob && this.outOfBounds) if (disableOob && this.outOfBounds)
return; // The checkpoint is configured to not work when the player is already OOB return false; // The checkpoint is configured to not work when the player is already OOB
this.currentCheckpoint = shape; this.currentCheckpoint = shape;
this.currentCheckpointTrigger = trigger; this.currentCheckpointTrigger = trigger;
this.checkpointCollectedGems.clear(); this.checkpointCollectedGems.clear();
@ -1752,34 +1756,15 @@ class MarbleWorld extends Scheduler {
this.checkpointHeldPowerup = this.marble.heldPowerup; this.checkpointHeldPowerup = this.marble.heldPowerup;
this.displayAlert("Checkpoint reached!"); this.displayAlert("Checkpoint reached!");
AudioManager.playSound(ResourceLoader.getResource('data/sound/checkpoint.wav', ResourceLoader.getAudio, this.soundResources)); AudioManager.playSound(ResourceLoader.getResource('data/sound/checkpoint.wav', ResourceLoader.getAudio, this.soundResources));
return true;
} }
/** Resets to the last stored checkpoint state. */ /** Resets to the last stored checkpoint state. */
public function loadCheckpointState() { public function loadCheckpointState() {
var marble = this.marble; var marble = this.marble;
// Determine where to spawn the marble // Determine where to spawn the marble
var offset = new Vector(0, 0, 3); var offset = new Vector(0, 0, 0.727843);
var add = ""; // (this.currentCheckpoint.srcElement as any)?.add || this.currentCheckpointTrigger?.element.add; var mpos = this.currentCheckpoint.getAbsPos().getPosition().add(offset);
if (this.currentCheckpoint.elem.fields.exists('add')) {
add = this.currentCheckpoint.elem.fields.get('add')[0];
}
var sub = "";
if (this.currentCheckpoint.elem.fields.exists('sub')) {
sub = this.currentCheckpoint.elem.fields.get('sub')[0];
}
if (this.currentCheckpointTrigger != null) {
if (this.currentCheckpointTrigger.add != null)
offset = this.currentCheckpointTrigger.add;
}
if (add != "") {
offset = MisParser.parseVector3(add);
offset.x = -offset.x;
}
if (sub != "") {
offset = MisParser.parseVector3(sub).multiply(-1);
offset.x = -offset.x;
}
var mpos = this.currentCheckpoint.obj.getAbsPos().getPosition().add(offset);
this.marble.setPosition(mpos.x, mpos.y, mpos.z); this.marble.setPosition(mpos.x, mpos.y, mpos.z);
marble.velocity.load(new Vector(0, 0, 0)); marble.velocity.load(new Vector(0, 0, 0));
marble.omega.load(new Vector(0, 0, 0)); marble.omega.load(new Vector(0, 0, 0));
@ -1788,7 +1773,7 @@ class MarbleWorld extends Scheduler {
Console.log('Marble Velocity: ${marble.velocity.x} ${marble.velocity.y} ${marble.velocity.z}'); Console.log('Marble Velocity: ${marble.velocity.x} ${marble.velocity.y} ${marble.velocity.z}');
Console.log('Marble Angular: ${marble.omega.x} ${marble.omega.y} ${marble.omega.z}'); Console.log('Marble Angular: ${marble.omega.x} ${marble.omega.y} ${marble.omega.z}');
// Set camera orientation // Set camera orientation
var euler = this.currentCheckpoint.obj.getRotationQuat().toEuler(); var euler = this.currentCheckpoint.getRotationQuat().toEuler();
this.marble.camera.CameraYaw = euler.z + Math.PI / 2; this.marble.camera.CameraYaw = euler.z + Math.PI / 2;
this.marble.camera.CameraPitch = 0.45; this.marble.camera.CameraPitch = 0.45;
this.marble.camera.nextCameraYaw = this.marble.camera.CameraYaw; this.marble.camera.nextCameraYaw = this.marble.camera.CameraYaw;
@ -1806,9 +1791,6 @@ class MarbleWorld extends Scheduler {
this.replay.recordMarbleStateFlags(false, false, true, false); this.replay.recordMarbleStateFlags(false, false, true, false);
} }
var gravityField = ""; // (this.currentCheckpoint.srcElement as any) ?.gravity || this.currentCheckpointTrigger?.element.gravity; var gravityField = ""; // (this.currentCheckpoint.srcElement as any) ?.gravity || this.currentCheckpointTrigger?.element.gravity;
if (this.currentCheckpoint.elem.fields.exists('gravity')) {
gravityField = this.currentCheckpoint.elem.fields.get('gravity')[0];
}
if (this.currentCheckpointTrigger != null) { if (this.currentCheckpointTrigger != null) {
if (@:privateAccess this.currentCheckpointTrigger.element.fields.exists('gravity')) { if (@:privateAccess this.currentCheckpointTrigger.element.fields.exists('gravity')) {
gravityField = @:privateAccess this.currentCheckpointTrigger.element.fields.get('gravity')[0]; gravityField = @:privateAccess this.currentCheckpointTrigger.element.fields.get('gravity')[0];
@ -1817,7 +1799,7 @@ class MarbleWorld extends Scheduler {
if (MisParser.parseBoolean(gravityField)) { if (MisParser.parseBoolean(gravityField)) {
// In this case, we set the gravity to the relative "up" vector of the checkpoint shape. // In this case, we set the gravity to the relative "up" vector of the checkpoint shape.
var up = new Vector(0, 0, 1); var up = new Vector(0, 0, 1);
up.transform(this.currentCheckpoint.obj.getRotationQuat().toMatrix()); up.transform(this.currentCheckpoint.getRotationQuat().toMatrix());
this.setUp(up, this.timeState, true); this.setUp(up, this.timeState, true);
} else { } else {
// Otherwise, we restore gravity to what was stored. // Otherwise, we restore gravity to what was stored.

View file

@ -235,8 +235,7 @@ class MissionElementTrigger extends MissionElementBase {
// checkpoint stuff: // checkpoint stuff:
var respawnpoint:Null<String>; var respawnpoint:Null<String>;
var add:Null<String>; var sequence:Null<String>;
var sub:Null<String>;
var gravity:Null<String>; var gravity:Null<String>;
var disableOob:Null<String>; var disableOob:Null<String>;
// teleport/destination trigger stuff: // teleport/destination trigger stuff:

View file

@ -39,7 +39,7 @@ class RewindFrame {
}; };
var checkpointState:{ var checkpointState:{
currentCheckpoint:{obj:DtsObject, elem:MissionElementBase}, currentCheckpoint:DtsObject,
currentCheckpointTrigger:CheckpointTrigger, currentCheckpointTrigger:CheckpointTrigger,
checkpointCollectedGems:Map<Gem, Bool>, checkpointCollectedGems:Map<Gem, Bool>,
checkpointHeldPowerup:PowerUp, checkpointHeldPowerup:PowerUp,
@ -91,10 +91,7 @@ class RewindFrame {
timeState: oobState.timeState != null ? oobState.timeState.clone() : null timeState: oobState.timeState != null ? oobState.timeState.clone() : null
}; };
c.checkpointState = { c.checkpointState = {
currentCheckpoint: checkpointState.currentCheckpoint != null ? { currentCheckpoint: checkpointState.currentCheckpoint,
obj: checkpointState.currentCheckpoint.obj,
elem: checkpointState.currentCheckpoint.elem,
} : null,
currentCheckpointTrigger: checkpointState.currentCheckpointTrigger, currentCheckpointTrigger: checkpointState.currentCheckpointTrigger,
checkpointCollectedGems: checkpointState.checkpointCollectedGems.copy(), checkpointCollectedGems: checkpointState.checkpointCollectedGems.copy(),
checkpointHeldPowerup: checkpointState.checkpointHeldPowerup, checkpointHeldPowerup: checkpointState.checkpointHeldPowerup,

View file

@ -91,6 +91,9 @@ class DefaultCubemapMaterial extends hxsl.Shader {
outCol.z = a * pow(outCol.z, b); outCol.z = a * pow(outCol.z, b);
} }
// outCol *= 0.001;
// outCol += diffuse;
// outCol *= (shading * bumpDot) + ambient;
pixelColor = outCol; pixelColor = outCol;
} }
} }

View file

@ -33,7 +33,7 @@ class DirLight extends Light {
} }
override function getShadowDirection():h3d.Vector { override function getShadowDirection():h3d.Vector {
return absPos.front(); return new h3d.Vector(0, 0, -1);
} }
override function emit(ctx) { override function emit(ctx) {

View file

@ -17,6 +17,7 @@ class AntiGravity extends PowerUp {
this.pickUpName = "Gravity Defier"; this.pickUpName = "Gravity Defier";
this.autoUse = true; this.autoUse = true;
this.useInstancing = true; this.useInstancing = true;
this.animateSubObjectOpacities = true;
if (norespawn) if (norespawn)
this.cooldownDuration = Math.NEGATIVE_INFINITY; this.cooldownDuration = Math.NEGATIVE_INFINITY;
} }
@ -59,8 +60,8 @@ class AntiGravity extends PowerUp {
normalTex.mipMap = Nearest; normalTex.mipMap = Nearest;
var shader = new shaders.DefaultMaterial(diffuseTex, normalTex, 32, new h3d.Vector(0.8, 0.8, 0.6, 1), 1); var shader = new shaders.DefaultMaterial(diffuseTex, normalTex, 32, new h3d.Vector(0.8, 0.8, 0.6, 1), 1);
shader.doGammaRamp = false; shader.doGammaRamp = false;
// var dtsTex = material.mainPass.getShader(shaders.DtsTexture); var dtsTex = material.mainPass.getShader(shaders.DtsTexture);
// dtsTex.passThrough = true; dtsTex.passThrough = true;
material.mainPass.removeShader(material.textureShader); material.mainPass.removeShader(material.textureShader);
material.mainPass.addShader(shader); material.mainPass.addShader(shader);
var thisprops:Dynamic = material.getDefaultProps(); var thisprops:Dynamic = material.getDefaultProps();
@ -79,8 +80,7 @@ class AntiGravity extends PowerUp {
var glowpass = material.mainPass.clone(); var glowpass = material.mainPass.clone();
glowpass.addShader(trivialShader); glowpass.addShader(trivialShader);
var dtsshader = glowpass.getShader(shaders.DtsTexture); var dtsshader = glowpass.getShader(shaders.DtsTexture);
if (dtsshader != null) dtsshader.passThrough = true;
glowpass.removeShader(dtsshader);
glowpass.setPassName("glow"); glowpass.setPassName("glow");
glowpass.depthTest = LessEqual; glowpass.depthTest = LessEqual;
glowpass.enableLights = false; glowpass.enableLights = false;
@ -89,8 +89,7 @@ class AntiGravity extends PowerUp {
material.mainPass.setPassName("glowPre"); material.mainPass.setPassName("glowPre");
material.mainPass.addShader(trivialShader); material.mainPass.addShader(trivialShader);
dtsshader = material.mainPass.getShader(shaders.DtsTexture); dtsshader = material.mainPass.getShader(shaders.DtsTexture);
if (dtsshader != null) dtsshader.passThrough = true;
material.mainPass.removeShader(dtsshader);
material.mainPass.enableLights = false; material.mainPass.enableLights = false;
var thisprops:Dynamic = material.getDefaultProps(); var thisprops:Dynamic = material.getDefaultProps();

View file

@ -14,6 +14,7 @@ class Blast extends PowerUp {
this.showSequences = true; this.showSequences = true;
this.identifier = "Blast"; this.identifier = "Blast";
this.pickUpName = "Blast PowerUp"; this.pickUpName = "Blast PowerUp";
this.ambientRotate = false;
this.autoUse = true; this.autoUse = true;
} }

View file

@ -4,11 +4,14 @@ import collision.CollisionInfo;
import mis.MisParser; import mis.MisParser;
import src.DtsObject; import src.DtsObject;
import src.ResourceLoader; import src.ResourceLoader;
import src.Util;
import mis.MissionElement.MissionElementStaticShape; import mis.MissionElement.MissionElementStaticShape;
class Checkpoint extends DtsObject { class Checkpoint extends DtsObject {
public var disableOOB = false; public var disableOOB = false;
var lastActivatedTime:Float = Math.POSITIVE_INFINITY;
var element:MissionElementStaticShape; var element:MissionElementStaticShape;
public function new(element:MissionElementStaticShape) { public function new(element:MissionElementStaticShape) {
@ -29,11 +32,24 @@ class Checkpoint extends DtsObject {
}); });
} }
public override function onMarbleContact(time:src.TimeState, ?contact:CollisionInfo) { public override function update(timeState:src.TimeState) {
this.level.saveCheckpointState({ // Override the keyframe
obj: this, var currentCompletion = getCurrentCompletion(timeState);
elem: this.element this.sequenceKeyframeOverride.set(this.dts.sequences[0], currentCompletion * (this.dts.sequences[0].numKeyFrames - 1));
}, null); this.sequenceKeyframeOverride.set(this.dts.sequences[1], 0); // Always
super.update(timeState);
}
function getCurrentCompletion(timeState:src.TimeState) {
var elapsed = timeState.timeSinceLoad - this.lastActivatedTime;
var completion = Util.clamp(elapsed / this.dts.sequences[0].duration, 0, 1);
return completion;
}
override function reset() {
super.reset();
lastActivatedTime = Math.POSITIVE_INFINITY;
meshVisibilities = [0, 1, 0]; // pls
} }
override function postProcessMaterial(matName:String, material:h3d.mat.Material) { override function postProcessMaterial(matName:String, material:h3d.mat.Material) {
@ -57,8 +73,7 @@ class Checkpoint extends DtsObject {
material.mainPass.setPassName("glowPre"); material.mainPass.setPassName("glowPre");
material.mainPass.addShader(trivialShader); material.mainPass.addShader(trivialShader);
dtsshader = material.mainPass.getShader(shaders.DtsTexture); dtsshader = material.mainPass.getShader(shaders.DtsTexture);
if (dtsshader != null) dtsshader.passThrough = true;
material.mainPass.removeShader(dtsshader);
material.mainPass.enableLights = false; material.mainPass.enableLights = false;
material.mainPass.setBlendMode(Alpha); material.mainPass.setBlendMode(Alpha);
} }

View file

@ -43,6 +43,7 @@ class SuperJump extends PowerUp {
this.isTSStatic = false; this.isTSStatic = false;
this.identifier = "SuperJump"; this.identifier = "SuperJump";
this.pickUpName = "Jump Boost PowerUp"; this.pickUpName = "Jump Boost PowerUp";
this.showSequences = false;
sjEmitterParticleData = new ParticleData(); sjEmitterParticleData = new ParticleData();
sjEmitterParticleData.identifier = "superJumpParticle"; sjEmitterParticleData.identifier = "superJumpParticle";
sjEmitterParticleData.texture = ResourceLoader.getResource("data/particles/twirl.png", ResourceLoader.getTexture, this.textureResources); sjEmitterParticleData.texture = ResourceLoader.getResource("data/particles/twirl.png", ResourceLoader.getTexture, this.textureResources);

View file

@ -1,5 +1,6 @@
package triggers; package triggers;
import shapes.Checkpoint;
import h3d.Vector; import h3d.Vector;
import src.MarbleWorld; import src.MarbleWorld;
import mis.MissionElement.MissionElementTrigger; import mis.MissionElement.MissionElementTrigger;
@ -9,12 +10,15 @@ import mis.MisParser;
class CheckpointTrigger extends Trigger { class CheckpointTrigger extends Trigger {
public var disableOOB = false; public var disableOOB = false;
public var add:Vector = null; public var add:Vector = null;
public var checkpoint:Checkpoint;
public var seqNum:Int;
override public function new(element:MissionElementTrigger, level:MarbleWorld) { override public function new(element:MissionElementTrigger, level:MarbleWorld) {
super(element, level); super(element, level);
this.disableOOB = element.fields.exists('disableOob') ? MisParser.parseBoolean(element.fields['disableOob'][0]) : false; this.disableOOB = element.fields.exists('disableOob') ? MisParser.parseBoolean(element.fields['disableOob'][0]) : false;
this.add = element.fields.exists('add') ? MisParser.parseVector3(element.fields['add'][0]) : null; this.add = element.fields.exists('add') ? MisParser.parseVector3(element.fields['add'][0]) : null;
this.seqNum = element.fields.exists('sequence') ? Std.parseInt(element.sequence) : 1;
} }
public override function init(onFinish:() -> Void) { public override function init(onFinish:() -> Void) {
@ -25,9 +29,15 @@ class CheckpointTrigger extends Trigger {
public override function onMarbleEnter(time:src.TimeState) { public override function onMarbleEnter(time:src.TimeState) {
super.onMarbleEnter(time); super.onMarbleEnter(time);
var shape = this.level.namedObjects.get(this.element.respawnpoint); var shape = checkpoint;
if (shape == null) if (shape == null)
return; return;
this.level.saveCheckpointState(shape, this); if (this.level.saveCheckpointState(shape, this)) {
shape.lastActivatedTime = time.timeSinceLoad;
for (obj in this.level.dtsObjects) {
if (obj.identifier == "Checkpoint" && obj != shape)
cast(obj, Checkpoint).lastActivatedTime = Math.POSITIVE_INFINITY;
}
}
} }
} }