mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2026-04-26 12:41:40 +00:00
more ultra stuff and fixes
This commit is contained in:
parent
f69f959765
commit
9e15f6b7b4
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},
|
"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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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.
|
||||||
|
|
|
||||||
|
|
@ -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:
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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) {
|
||||||
|
|
|
||||||
|
|
@ -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();
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue