mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2025-10-30 08:11:25 +00:00
more ultra stuff and fixes
This commit is contained in:
parent
3fc960d3a2
commit
30ae3c5405
13 changed files with 127 additions and 89 deletions
|
|
@ -46,7 +46,7 @@ var dtsMaterials = [
|
|||
"bumper-rubber" => {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},
|
||||
"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-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) {
|
||||
var t0 = new Vector();
|
||||
var t1 = new Vector();
|
||||
|
|
@ -715,8 +722,8 @@ class DtsObject extends GameObject {
|
|||
var edge1 = new Vector();
|
||||
var edge2 = 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);
|
||||
edge2.set(vertices[i2].x - vertices[i0].x, vertices[i2].y - vertices[i0].y, vertices[i2].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, 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 fVar2 = vertices[i2].x - vertices[i0].x;
|
||||
var fVar4 = dtsMesh.uv[i1].x - dtsMesh.uv[i0].x;
|
||||
|
|
@ -773,25 +780,28 @@ class DtsObject extends GameObject {
|
|||
}
|
||||
|
||||
// v0
|
||||
t0.normalize();
|
||||
b0.normalized();
|
||||
normalizeSafe(t0);
|
||||
normalizeSafe(b0);
|
||||
var n0 = t0.cross(b0);
|
||||
n0.x *= -1;
|
||||
if (n0.dot(vertexNormals[i0]) < 0.0) {
|
||||
n0.scale(-1);
|
||||
}
|
||||
|
||||
// v1
|
||||
t1.normalize();
|
||||
b1.normalized();
|
||||
normalizeSafe(t1);
|
||||
normalizeSafe(b1);
|
||||
var n1 = t1.cross(b1);
|
||||
n1.x *= -1;
|
||||
if (n1.dot(vertexNormals[i1]) < 0.0) {
|
||||
n1.scale(-1);
|
||||
}
|
||||
|
||||
// v2
|
||||
t2.normalize();
|
||||
b2.normalized();
|
||||
normalizeSafe(t2);
|
||||
normalizeSafe(b2);
|
||||
var n2 = t2.cross(b2);
|
||||
n2.x *= -1;
|
||||
if (n2.dot(vertexNormals[i2]) < 0.0) {
|
||||
n2.scale(-1);
|
||||
}
|
||||
|
|
@ -802,9 +812,6 @@ class DtsObject extends GameObject {
|
|||
b0.x *= -1;
|
||||
b1.x *= -1;
|
||||
b2.x *= -1;
|
||||
n0.x *= -1;
|
||||
n1.x *= -1;
|
||||
n2.x *= -1;
|
||||
|
||||
return [
|
||||
{
|
||||
|
|
@ -866,17 +873,6 @@ class DtsObject extends GameObject {
|
|||
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(i2);
|
||||
geometrydata.indices.push(i3);
|
||||
|
|
@ -897,6 +893,17 @@ class DtsObject extends GameObject {
|
|||
|
||||
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;
|
||||
}
|
||||
} else if (drawType == TSDrawPrimitive.Strip) {
|
||||
|
|
@ -915,6 +922,17 @@ class DtsObject extends GameObject {
|
|||
|
||||
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++;
|
||||
}
|
||||
} else if (drawType == TSDrawPrimitive.Fan) {
|
||||
|
|
@ -926,6 +944,17 @@ class DtsObject extends GameObject {
|
|||
|
||||
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++;
|
||||
}
|
||||
}
|
||||
|
|
@ -1118,14 +1147,12 @@ class DtsObject extends GameObject {
|
|||
var v1 = this.dts.objectStates[sequence.baseObjectState + sequence.numKeyFrames * affectedCount + keyframeLow].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);
|
||||
meshVisibilities[visIterIdx] = v;
|
||||
updateSubObjectOpacity(visIterIdx);
|
||||
affectedCount++;
|
||||
} else {
|
||||
updateSubObjectOpacity(visIterIdx);
|
||||
meshVisibilities[visIterIdx] = this.dts.objectStates[visIterIdx].vis;
|
||||
}
|
||||
vis >>= 1;
|
||||
|
|
|
|||
|
|
@ -74,6 +74,8 @@ class InstanceManager {
|
|||
if (dtsShader != null) {
|
||||
if (instance.gameObject.animateSubObjectOpacities) {
|
||||
subOpacity = instance.gameObject.getSubObjectOpacity(instance.emptyObj);
|
||||
if (subOpacity == 0)
|
||||
continue; // Do not draw
|
||||
minfo.meshbatch.shadersChanged = true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -78,9 +78,11 @@ class MarbleWorldMacros {
|
|||
shape = new Helicopter(cast element);
|
||||
else if (dataBlockLowerCase == "eastereggitem")
|
||||
shape = new EasterEgg(cast element);
|
||||
else if (dataBlockLowerCase == "checkpointshape")
|
||||
else if (dataBlockLowerCase == "checkpointshape") {
|
||||
shape = new Checkpoint(cast element);
|
||||
else if (dataBlockLowerCase == "ductfan")
|
||||
if (_previousCheckpointTrigger != null)
|
||||
_previousCheckpointTrigger.checkpoint = cast shape;
|
||||
} else if (dataBlockLowerCase == "ductfan")
|
||||
shape = new DuctFan();
|
||||
else if (dataBlockLowerCase == "smallductfan")
|
||||
shape = new SmallDuctFan();
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package src;
|
||||
|
||||
import h3d.scene.fwd.Light;
|
||||
import rewind.RewindManager;
|
||||
import Macros.MarbleWorldMacros;
|
||||
#if js
|
||||
|
|
@ -156,12 +157,14 @@ class MarbleWorld extends Scheduler {
|
|||
public var newOrientationQuat = new Quat();
|
||||
|
||||
// Checkpoint
|
||||
var currentCheckpoint:{obj:DtsObject, elem:MissionElementBase} = null;
|
||||
var currentCheckpoint:DtsObject = null;
|
||||
var currentCheckpointTrigger:CheckpointTrigger = null;
|
||||
var checkpointCollectedGems:Map<Gem, Bool> = [];
|
||||
var checkpointHeldPowerup:PowerUp = null;
|
||||
var checkpointUp:Vector = null;
|
||||
var cheeckpointBlast:Float = 0;
|
||||
var checkpointSequence:Int = 0;
|
||||
var _previousCheckpointTrigger:CheckpointTrigger;
|
||||
|
||||
// Replay
|
||||
public var replay:Replay;
|
||||
|
|
@ -316,6 +319,7 @@ class MarbleWorld extends Scheduler {
|
|||
var ls = cast(scene.lightSystem, h3d.scene.fwd.LightSystem);
|
||||
|
||||
ls.ambientLight.load(ambientColor);
|
||||
// ls.shadowLight.setDirection(new Vector(0, 0, -1));
|
||||
this.ambient = ambientColor;
|
||||
// ls.perPixelLighting = false;
|
||||
|
||||
|
|
@ -461,6 +465,7 @@ class MarbleWorld extends Scheduler {
|
|||
this.checkpointHeldPowerup = null;
|
||||
this.checkpointUp = null;
|
||||
this.cheeckpointBlast = 0;
|
||||
this.checkpointSequence = 0;
|
||||
|
||||
if (this.endPad != null)
|
||||
this.endPad.inFinish = false;
|
||||
|
|
@ -493,7 +498,7 @@ class MarbleWorld extends Scheduler {
|
|||
|
||||
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();
|
||||
oldtransform.setPosition(startquat.position);
|
||||
this.marble.collider.setTransform(oldtransform);
|
||||
|
|
@ -723,6 +728,7 @@ class MarbleWorld extends Scheduler {
|
|||
trigger = new DestinationTrigger(element, cast this);
|
||||
} else if (datablockLowercase == "checkpointtrigger") {
|
||||
trigger = new CheckpointTrigger(element, cast this);
|
||||
_previousCheckpointTrigger = cast trigger;
|
||||
} else {
|
||||
Console.error("Unknown trigger: " + element.datablock);
|
||||
onFinish();
|
||||
|
|
@ -1721,22 +1727,20 @@ class MarbleWorld extends Scheduler {
|
|||
}
|
||||
|
||||
/** 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.obj == shape.obj)
|
||||
return;
|
||||
if (this.currentCheckpoint == shape)
|
||||
return 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) {
|
||||
disableOob = trigger.disableOOB;
|
||||
if (checkpointSequence > trigger.seqNum)
|
||||
return false;
|
||||
}
|
||||
checkpointSequence = trigger.seqNum;
|
||||
// (shape.srcElement as any) ?.disableOob || trigger?.element.disableOob;
|
||||
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.currentCheckpointTrigger = trigger;
|
||||
this.checkpointCollectedGems.clear();
|
||||
|
|
@ -1750,34 +1754,15 @@ class MarbleWorld extends Scheduler {
|
|||
this.checkpointHeldPowerup = this.marble.heldPowerup;
|
||||
this.displayAlert("Checkpoint reached!");
|
||||
AudioManager.playSound(ResourceLoader.getResource('data/sound/checkpoint.wav', ResourceLoader.getAudio, this.soundResources));
|
||||
return true;
|
||||
}
|
||||
|
||||
/** Resets to the last stored checkpoint state. */
|
||||
public function loadCheckpointState() {
|
||||
var marble = this.marble;
|
||||
// Determine where to spawn the marble
|
||||
var offset = new Vector(0, 0, 3);
|
||||
var add = ""; // (this.currentCheckpoint.srcElement as any)?.add || this.currentCheckpointTrigger?.element.add;
|
||||
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);
|
||||
var offset = new Vector(0, 0, 0.727843);
|
||||
var mpos = this.currentCheckpoint.getAbsPos().getPosition().add(offset);
|
||||
this.marble.setPosition(mpos.x, mpos.y, mpos.z);
|
||||
marble.velocity.load(new Vector(0, 0, 0));
|
||||
marble.omega.load(new Vector(0, 0, 0));
|
||||
|
|
@ -1786,7 +1771,7 @@ class MarbleWorld extends Scheduler {
|
|||
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}');
|
||||
// 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.CameraPitch = 0.45;
|
||||
this.marble.camera.nextCameraYaw = this.marble.camera.CameraYaw;
|
||||
|
|
@ -1804,9 +1789,6 @@ class MarbleWorld extends Scheduler {
|
|||
this.replay.recordMarbleStateFlags(false, false, true, false);
|
||||
}
|
||||
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 (@:privateAccess this.currentCheckpointTrigger.element.fields.exists('gravity')) {
|
||||
gravityField = @:privateAccess this.currentCheckpointTrigger.element.fields.get('gravity')[0];
|
||||
|
|
@ -1815,7 +1797,7 @@ class MarbleWorld extends Scheduler {
|
|||
if (MisParser.parseBoolean(gravityField)) {
|
||||
// In this case, we set the gravity to the relative "up" vector of the checkpoint shape.
|
||||
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);
|
||||
} else {
|
||||
// Otherwise, we restore gravity to what was stored.
|
||||
|
|
|
|||
|
|
@ -235,8 +235,7 @@ class MissionElementTrigger extends MissionElementBase {
|
|||
|
||||
// checkpoint stuff:
|
||||
var respawnpoint:Null<String>;
|
||||
var add:Null<String>;
|
||||
var sub:Null<String>;
|
||||
var sequence:Null<String>;
|
||||
var gravity:Null<String>;
|
||||
var disableOob:Null<String>;
|
||||
// teleport/destination trigger stuff:
|
||||
|
|
|
|||
|
|
@ -39,7 +39,7 @@ class RewindFrame {
|
|||
};
|
||||
|
||||
var checkpointState:{
|
||||
currentCheckpoint:{obj:DtsObject, elem:MissionElementBase},
|
||||
currentCheckpoint:DtsObject,
|
||||
currentCheckpointTrigger:CheckpointTrigger,
|
||||
checkpointCollectedGems:Map<Gem, Bool>,
|
||||
checkpointHeldPowerup:PowerUp,
|
||||
|
|
@ -91,10 +91,7 @@ class RewindFrame {
|
|||
timeState: oobState.timeState != null ? oobState.timeState.clone() : null
|
||||
};
|
||||
c.checkpointState = {
|
||||
currentCheckpoint: checkpointState.currentCheckpoint != null ? {
|
||||
obj: checkpointState.currentCheckpoint.obj,
|
||||
elem: checkpointState.currentCheckpoint.elem,
|
||||
} : null,
|
||||
currentCheckpoint: checkpointState.currentCheckpoint,
|
||||
currentCheckpointTrigger: checkpointState.currentCheckpointTrigger,
|
||||
checkpointCollectedGems: checkpointState.checkpointCollectedGems.copy(),
|
||||
checkpointHeldPowerup: checkpointState.checkpointHeldPowerup,
|
||||
|
|
|
|||
|
|
@ -91,6 +91,9 @@ class DefaultCubemapMaterial extends hxsl.Shader {
|
|||
outCol.z = a * pow(outCol.z, b);
|
||||
}
|
||||
|
||||
// outCol *= 0.001;
|
||||
// outCol += diffuse;
|
||||
// outCol *= (shading * bumpDot) + ambient;
|
||||
pixelColor = outCol;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@ class DirLight extends Light {
|
|||
}
|
||||
|
||||
override function getShadowDirection():h3d.Vector {
|
||||
return absPos.front();
|
||||
return new h3d.Vector(0, 0, -1);
|
||||
}
|
||||
|
||||
override function emit(ctx) {
|
||||
|
|
|
|||
|
|
@ -17,6 +17,7 @@ class AntiGravity extends PowerUp {
|
|||
this.pickUpName = "Gravity Defier";
|
||||
this.autoUse = true;
|
||||
this.useInstancing = true;
|
||||
this.animateSubObjectOpacities = true;
|
||||
if (norespawn)
|
||||
this.cooldownDuration = Math.NEGATIVE_INFINITY;
|
||||
}
|
||||
|
|
@ -59,8 +60,8 @@ class AntiGravity extends PowerUp {
|
|||
normalTex.mipMap = Nearest;
|
||||
var shader = new shaders.DefaultMaterial(diffuseTex, normalTex, 32, new h3d.Vector(0.8, 0.8, 0.6, 1), 1);
|
||||
shader.doGammaRamp = false;
|
||||
// var dtsTex = material.mainPass.getShader(shaders.DtsTexture);
|
||||
// dtsTex.passThrough = true;
|
||||
var dtsTex = material.mainPass.getShader(shaders.DtsTexture);
|
||||
dtsTex.passThrough = true;
|
||||
material.mainPass.removeShader(material.textureShader);
|
||||
material.mainPass.addShader(shader);
|
||||
var thisprops:Dynamic = material.getDefaultProps();
|
||||
|
|
@ -79,8 +80,7 @@ class AntiGravity extends PowerUp {
|
|||
var glowpass = material.mainPass.clone();
|
||||
glowpass.addShader(trivialShader);
|
||||
var dtsshader = glowpass.getShader(shaders.DtsTexture);
|
||||
if (dtsshader != null)
|
||||
glowpass.removeShader(dtsshader);
|
||||
dtsshader.passThrough = true;
|
||||
glowpass.setPassName("glow");
|
||||
glowpass.depthTest = LessEqual;
|
||||
glowpass.enableLights = false;
|
||||
|
|
@ -89,8 +89,7 @@ class AntiGravity extends PowerUp {
|
|||
material.mainPass.setPassName("glowPre");
|
||||
material.mainPass.addShader(trivialShader);
|
||||
dtsshader = material.mainPass.getShader(shaders.DtsTexture);
|
||||
if (dtsshader != null)
|
||||
material.mainPass.removeShader(dtsshader);
|
||||
dtsshader.passThrough = true;
|
||||
material.mainPass.enableLights = false;
|
||||
|
||||
var thisprops:Dynamic = material.getDefaultProps();
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ class Blast extends PowerUp {
|
|||
this.showSequences = true;
|
||||
this.identifier = "Blast";
|
||||
this.pickUpName = "Blast PowerUp";
|
||||
this.ambientRotate = false;
|
||||
this.autoUse = true;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -4,11 +4,14 @@ import collision.CollisionInfo;
|
|||
import mis.MisParser;
|
||||
import src.DtsObject;
|
||||
import src.ResourceLoader;
|
||||
import src.Util;
|
||||
import mis.MissionElement.MissionElementStaticShape;
|
||||
|
||||
class Checkpoint extends DtsObject {
|
||||
public var disableOOB = false;
|
||||
|
||||
var lastActivatedTime:Float = Math.POSITIVE_INFINITY;
|
||||
|
||||
var element:MissionElementStaticShape;
|
||||
|
||||
public function new(element:MissionElementStaticShape) {
|
||||
|
|
@ -29,11 +32,24 @@ class Checkpoint extends DtsObject {
|
|||
});
|
||||
}
|
||||
|
||||
public override function onMarbleContact(time:src.TimeState, ?contact:CollisionInfo) {
|
||||
this.level.saveCheckpointState({
|
||||
obj: this,
|
||||
elem: this.element
|
||||
}, null);
|
||||
public override function update(timeState:src.TimeState) {
|
||||
// Override the keyframe
|
||||
var currentCompletion = getCurrentCompletion(timeState);
|
||||
this.sequenceKeyframeOverride.set(this.dts.sequences[0], currentCompletion * (this.dts.sequences[0].numKeyFrames - 1));
|
||||
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) {
|
||||
|
|
@ -57,8 +73,7 @@ class Checkpoint extends DtsObject {
|
|||
material.mainPass.setPassName("glowPre");
|
||||
material.mainPass.addShader(trivialShader);
|
||||
dtsshader = material.mainPass.getShader(shaders.DtsTexture);
|
||||
if (dtsshader != null)
|
||||
material.mainPass.removeShader(dtsshader);
|
||||
dtsshader.passThrough = true;
|
||||
material.mainPass.enableLights = false;
|
||||
material.mainPass.setBlendMode(Alpha);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -43,6 +43,7 @@ class SuperJump extends PowerUp {
|
|||
this.isTSStatic = false;
|
||||
this.identifier = "SuperJump";
|
||||
this.pickUpName = "Jump Boost PowerUp";
|
||||
this.showSequences = false;
|
||||
sjEmitterParticleData = new ParticleData();
|
||||
sjEmitterParticleData.identifier = "superJumpParticle";
|
||||
sjEmitterParticleData.texture = ResourceLoader.getResource("data/particles/twirl.png", ResourceLoader.getTexture, this.textureResources);
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package triggers;
|
||||
|
||||
import shapes.Checkpoint;
|
||||
import h3d.Vector;
|
||||
import src.MarbleWorld;
|
||||
import mis.MissionElement.MissionElementTrigger;
|
||||
|
|
@ -9,12 +10,15 @@ import mis.MisParser;
|
|||
class CheckpointTrigger extends Trigger {
|
||||
public var disableOOB = false;
|
||||
public var add:Vector = null;
|
||||
public var checkpoint:Checkpoint;
|
||||
public var seqNum:Int;
|
||||
|
||||
override public function new(element:MissionElementTrigger, level:MarbleWorld) {
|
||||
super(element, level);
|
||||
|
||||
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.seqNum = element.fields.exists('sequence') ? Std.parseInt(element.sequence) : 1;
|
||||
}
|
||||
|
||||
public override function init(onFinish:() -> Void) {
|
||||
|
|
@ -25,9 +29,15 @@ class CheckpointTrigger extends Trigger {
|
|||
|
||||
public override function onMarbleEnter(time:src.TimeState) {
|
||||
super.onMarbleEnter(time);
|
||||
var shape = this.level.namedObjects.get(this.element.respawnpoint);
|
||||
var shape = checkpoint;
|
||||
if (shape == null)
|
||||
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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue