mirror of
https://github.com/RandomityGuy/MBHaxe.git
synced 2025-10-30 08:11:25 +00:00
finally implement marble picker
This commit is contained in:
parent
151fb54ac0
commit
51349ed423
11 changed files with 577 additions and 60 deletions
BIN
data/missions/special/marblepicker.dif
Normal file
BIN
data/missions/special/marblepicker.dif
Normal file
Binary file not shown.
97
data/missions/special/marblepicker.mis
Normal file
97
data/missions/special/marblepicker.mis
Normal file
|
|
@ -0,0 +1,97 @@
|
|||
//--- OBJECT WRITE BEGIN ---
|
||||
new SimGroup(MissionGroup) {
|
||||
|
||||
new ScriptObject(MissionInfo) {
|
||||
desc = "MarblePicker";
|
||||
type = "advanced";
|
||||
gameType = "Special";
|
||||
level = "99";
|
||||
time = "10000";
|
||||
isInDemoMode = "1";
|
||||
include = "1";
|
||||
difficulty = "1";
|
||||
name = "MarblePicker";
|
||||
guid = "{05E97996-657C-45B2-A39E-C6BCC6160D8F}";
|
||||
};
|
||||
new MissionArea(MissionArea) {
|
||||
area = "-360 -648 720 1296";
|
||||
flightCeiling = "300";
|
||||
flightCeilingRange = "20";
|
||||
locked = "true";
|
||||
};
|
||||
new Sky(Sky) {
|
||||
position = "336 136 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
hidden = "0";
|
||||
materialList = "~/data/skies/sky_beginner.dml";
|
||||
cloudHeightPer[0] = "0";
|
||||
cloudHeightPer[1] = "0";
|
||||
cloudHeightPer[2] = "0";
|
||||
cloudSpeed1 = "0.0001";
|
||||
cloudSpeed2 = "0.0002";
|
||||
cloudSpeed3 = "0.0003";
|
||||
visibleDistance = "1500";
|
||||
fogDistance = "1000";
|
||||
fogColor = "0.600000 0.600000 0.600000 1.000000";
|
||||
fogStorm1 = "0";
|
||||
fogStorm2 = "0";
|
||||
fogStorm3 = "0";
|
||||
fogVolume1 = "-1 7.45949e-031 1.3684e-038";
|
||||
fogVolume2 = "-1 1.07208e-014 8.756e-014";
|
||||
fogVolume3 = "-1 5.1012e-010 2.05098e-008";
|
||||
windVelocity = "1 0 0";
|
||||
windEffectPrecipitation = "0";
|
||||
SkySolidColor = "0.600000 0.600000 0.600000 1.000000";
|
||||
useSkyTextures = "1";
|
||||
renderBottomTexture = "1";
|
||||
noRenderBans = "1";
|
||||
renderBanOffsetHeight = "50";
|
||||
skyGlow = "0";
|
||||
skyGlowColor = "0.000000 0.000000 0.000000 0.000000";
|
||||
fogVolumeColor3 = "128.000000 128.000000 128.000000 14435505.000000";
|
||||
fogVolumeColor1 = "128.000000 128.000000 128.000000 0.000000";
|
||||
fogVolumeColor2 = "128.000000 128.000000 128.000000 0.000004";
|
||||
};
|
||||
new Sun() {
|
||||
direction = "-0.614021 0.433884 -0.659336";
|
||||
color = "1.400000 1.200000 0.400000 1.000000";
|
||||
ambient = "0.440000 0.440000 0.440000 1.000000";
|
||||
shadowColor = "0.000000 0.000000 0.150000 0.350000";
|
||||
};
|
||||
new StaticShape() {
|
||||
position = "0 0 -600";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
hidden = "0";
|
||||
dataBlock = "astrolabeShape";
|
||||
};
|
||||
new InteriorInstance() {
|
||||
position = "0 0 0";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
hidden = "0";
|
||||
interiorFile = "./marblepicker.dif";
|
||||
showTerrainInside = "0";
|
||||
};
|
||||
new SpawnSphere() {
|
||||
position = "0 -2 -1";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "1 1 1";
|
||||
dataBlock = "CameraSpawnSphereMarker";
|
||||
radius = "1";
|
||||
sphereWeight = "100";
|
||||
indoorWeight = "100";
|
||||
outdoorWeight = "100";
|
||||
};
|
||||
new Trigger(Bounds) {
|
||||
position = "-5.5 7.5 -4";
|
||||
rotation = "1 0 0 0";
|
||||
scale = "11 15 22";
|
||||
hidden = "0";
|
||||
dataBlock = "InBoundsTrigger";
|
||||
polyhedron = "0.0000000 0.0000000 0.0000000 1.0000000 0.0000000 0.0000000 0.0000000 -1.0000000 0.0000000 0.0000000 0.0000000 1.0000000";
|
||||
};
|
||||
};
|
||||
//--- OBJECT WRITE END ---
|
||||
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
package src;
|
||||
|
||||
import collision.CollisionWorld;
|
||||
import shaders.EnvMap;
|
||||
import h3d.shader.CubeMap;
|
||||
import dts.TSDrawPrimitive;
|
||||
|
|
@ -85,6 +86,7 @@ class DtsObject extends GameObject {
|
|||
var dtsResource:Resource<DtsFile>;
|
||||
|
||||
var level:MarbleWorld;
|
||||
var collisionWorld:CollisionWorld;
|
||||
|
||||
var materials:Array<Material> = [];
|
||||
var materialInfos:Map<Material, Array<String>> = new Map();
|
||||
|
|
@ -135,8 +137,10 @@ class DtsObject extends GameObject {
|
|||
this.dts.importSequences(this.sequencePath);
|
||||
|
||||
this.directoryPath = Path.directory(this.dtsPath);
|
||||
if (level != null)
|
||||
if (level != null) {
|
||||
this.level = level;
|
||||
this.collisionWorld = this.level.collisionWorld;
|
||||
}
|
||||
|
||||
isInstanced = false;
|
||||
if (this.level != null)
|
||||
|
|
@ -1099,7 +1103,7 @@ class DtsObject extends GameObject {
|
|||
super.setTransform(mat);
|
||||
if (this.isBoundingBoxCollideable) {
|
||||
this.boundingCollider.setTransform(mat);
|
||||
this.level.collisionWorld.updateTransform(this.boundingCollider);
|
||||
this.collisionWorld.updateTransform(this.boundingCollider);
|
||||
}
|
||||
for (i in 0...this.dirtyTransforms.length) {
|
||||
this.dirtyTransforms[i] = true;
|
||||
|
|
@ -1447,7 +1451,7 @@ class DtsObject extends GameObject {
|
|||
var absTform = this.graphNodes[this.colliders[i].userData].getAbsPos().clone();
|
||||
if (this.colliders[i] != null) {
|
||||
this.colliders[i].setTransform(absTform);
|
||||
this.level.collisionWorld.updateTransform(this.colliders[i]);
|
||||
this.collisionWorld.updateTransform(this.colliders[i]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package src;
|
||||
|
||||
import collision.CollisionWorld;
|
||||
import src.MarbleWorld;
|
||||
import src.DifBuilder;
|
||||
import h3d.Matrix;
|
||||
|
|
@ -12,6 +13,7 @@ class InteriorObject extends GameObject {
|
|||
public var interiorFile:String;
|
||||
public var useInstancing = true;
|
||||
public var level:MarbleWorld;
|
||||
public var collisionWorld:CollisionWorld;
|
||||
|
||||
public function new() {
|
||||
super();
|
||||
|
|
@ -21,13 +23,16 @@ class InteriorObject extends GameObject {
|
|||
public function init(level:MarbleWorld, onFinish:Void->Void) {
|
||||
this.identifier = this.interiorFile;
|
||||
this.level = level;
|
||||
if (this.level != null)
|
||||
this.collisionWorld = this.level.collisionWorld;
|
||||
DifBuilder.loadDif(this.interiorFile, cast this, onFinish, -1, this.isCollideable);
|
||||
}
|
||||
|
||||
public override function setTransform(transform:Matrix) {
|
||||
super.setTransform(transform);
|
||||
collider.setTransform(transform);
|
||||
if (level != null)
|
||||
this.level.collisionWorld.updateTransform(this.collider);
|
||||
if (this.isCollideable) {
|
||||
collider.setTransform(transform);
|
||||
collisionWorld.updateTransform(this.collider);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
107
src/Marble.hx
107
src/Marble.hx
|
|
@ -192,6 +192,7 @@ class Marble extends GameObject {
|
|||
public var omega:Vector;
|
||||
|
||||
public var level:MarbleWorld;
|
||||
public var collisionWorld:CollisionWorld;
|
||||
|
||||
public var _radius = 0.2;
|
||||
|
||||
|
|
@ -315,8 +316,10 @@ class Marble extends GameObject {
|
|||
|
||||
public function init(level:MarbleWorld, onFinish:Void->Void) {
|
||||
this.level = level;
|
||||
if (this.level != null)
|
||||
this.collisionWorld = this.level.collisionWorld;
|
||||
|
||||
var isUltra = level.mission.game.toLowerCase() == "ultra";
|
||||
var isUltra = true;
|
||||
|
||||
var marbleDts = new DtsObject();
|
||||
Console.log("Marble: " + Settings.optionsSettings.marbleModel + " (" + Settings.optionsSettings.marbleSkin + ")");
|
||||
|
|
@ -332,7 +335,8 @@ class Marble extends GameObject {
|
|||
// mat.mainPass.culling = None;
|
||||
|
||||
if (Settings.optionsSettings.reflectiveMarble) {
|
||||
this.cubemapRenderer = new CubemapRenderer(level.scene, level.sky);
|
||||
var csky = level != null ? level.sky : (@:privateAccess MarbleGame.instance.previewWorld.sky);
|
||||
this.cubemapRenderer = new CubemapRenderer(MarbleGame.instance.scene, csky);
|
||||
|
||||
if (Settings.optionsSettings.marbleShader == null
|
||||
|| Settings.optionsSettings.marbleShader == "Default"
|
||||
|
|
@ -342,8 +346,7 @@ class Marble extends GameObject {
|
|||
} else {
|
||||
// Generate tangents for next shaders, only for Ultra
|
||||
for (node in marbleDts.graphNodes) {
|
||||
for (ch in node.children) {
|
||||
var chmesh = cast(ch, Mesh);
|
||||
for (chmesh in node.getMeshes()) {
|
||||
var chpoly = cast(chmesh.primitive, mesh.Polygon);
|
||||
chpoly.addTangents();
|
||||
}
|
||||
|
|
@ -483,10 +486,14 @@ class Marble extends GameObject {
|
|||
this.helicopter.z = 1e8;
|
||||
this.helicopter.scale(0.3 / 0.2);
|
||||
|
||||
var worker = new ResourceLoaderWorker(onFinish);
|
||||
worker.addTask(fwd -> level.addDtsObject(this.helicopter, fwd));
|
||||
worker.addTask(fwd -> level.addDtsObject(this.blastWave, fwd));
|
||||
worker.run();
|
||||
if (this.controllable) {
|
||||
var worker = new ResourceLoaderWorker(onFinish);
|
||||
worker.addTask(fwd -> level.addDtsObject(this.helicopter, fwd));
|
||||
worker.addTask(fwd -> level.addDtsObject(this.blastWave, fwd));
|
||||
worker.run();
|
||||
} else {
|
||||
onFinish();
|
||||
}
|
||||
}
|
||||
|
||||
function findContacts(collisiomWorld:CollisionWorld, timeState:TimeState) {
|
||||
|
|
@ -502,28 +509,34 @@ class Marble extends GameObject {
|
|||
|
||||
public function getMarbleAxis() {
|
||||
var motiondir = new Vector(0, -1, 0);
|
||||
motiondir.transform(Matrix.R(0, 0, camera.CameraYaw));
|
||||
motiondir.transform(level.newOrientationQuat.toMatrix());
|
||||
var updir = this.level.currentUp;
|
||||
var sidedir = motiondir.cross(updir);
|
||||
if (this.controllable) {
|
||||
motiondir.transform(Matrix.R(0, 0, camera.CameraYaw));
|
||||
motiondir.transform(level.newOrientationQuat.toMatrix());
|
||||
var updir = this.level.currentUp;
|
||||
var sidedir = motiondir.cross(updir);
|
||||
|
||||
sidedir.normalize();
|
||||
motiondir = updir.cross(sidedir);
|
||||
return [sidedir, motiondir, updir];
|
||||
sidedir.normalize();
|
||||
motiondir = updir.cross(sidedir);
|
||||
return [sidedir, motiondir, updir];
|
||||
} else {
|
||||
return [new Vector(1, 0, 0), motiondir, new Vector(0, 0, 1)];
|
||||
}
|
||||
}
|
||||
|
||||
function getExternalForces(currentTime:Float, m:Move, dt:Float) {
|
||||
if (this.mode == Finish)
|
||||
return this.velocity.multiply(-16);
|
||||
var gWorkGravityDir = this.level.currentUp.multiply(-1);
|
||||
var gWorkGravityDir = this.level != null ? this.level.currentUp.multiply(-1) : new Vector(0, 0, -1);
|
||||
var A = new Vector();
|
||||
A = gWorkGravityDir.multiply(this._gravity);
|
||||
if (currentTime - this.helicopterEnableTime < 5) {
|
||||
A = A.multiply(0.25);
|
||||
}
|
||||
for (obj in level.forceObjects) {
|
||||
var force = cast(obj, ForceObject).getForce(this.collider.transform.getPosition());
|
||||
A = A.add(force.multiply(1 / _mass));
|
||||
if (this.level != null) {
|
||||
for (obj in level.forceObjects) {
|
||||
var force = cast(obj, ForceObject).getForce(this.collider.transform.getPosition());
|
||||
A = A.add(force.multiply(1 / _mass));
|
||||
}
|
||||
}
|
||||
if (contacts.length != 0 && this.mode != Start) {
|
||||
var contactForce = 0.0;
|
||||
|
|
@ -575,7 +588,7 @@ class Marble extends GameObject {
|
|||
}
|
||||
|
||||
function computeMoveForces(m:Move, aControl:Vector, desiredOmega:Vector) {
|
||||
var currentGravityDir = this.level.currentUp.multiply(-1);
|
||||
var currentGravityDir = this.level != null ? this.level.currentUp.multiply(-1) : new Vector(0, 0, -1);
|
||||
var R = currentGravityDir.multiply(-this._radius);
|
||||
var rollVelocity = this.omega.cross(R);
|
||||
var axes = this.getMarbleAxis();
|
||||
|
|
@ -751,7 +764,7 @@ class Marble extends GameObject {
|
|||
function applyContactForces(dt:Float, m:Move, isCentered:Bool, aControl:Vector, desiredOmega:Vector, A:Vector) {
|
||||
var a = new Vector();
|
||||
this._slipAmount = 0;
|
||||
var gWorkGravityDir = this.level.currentUp.multiply(-1);
|
||||
var gWorkGravityDir = this.level != null ? this.level.currentUp.multiply(-1) : new Vector(0, 0, -1);
|
||||
var bestSurface = -1;
|
||||
var bestNormalForce = 0.0;
|
||||
for (i in 0...contacts.length) {
|
||||
|
|
@ -852,6 +865,8 @@ class Marble extends GameObject {
|
|||
}
|
||||
|
||||
function bounceEmitter(speed:Float, normal:Vector) {
|
||||
if (!this.controllable)
|
||||
return;
|
||||
if (this.bounceEmitDelay == 0 && this._minBounceSpeed <= speed) {
|
||||
this.level.particleManager.createEmitter(bounceParticleOptions, this.bounceEmitterData,
|
||||
this.collider.transform.getPosition().sub(normal.multiply(_radius)), null, new Vector(1, 1, 1).add(normal.multiply(-0.8)));
|
||||
|
|
@ -1002,7 +1017,7 @@ class Marble extends GameObject {
|
|||
searchbox.addSpherePos(position.x, position.y, position.z, _radius);
|
||||
searchbox.addSpherePos(position.x + velocity.x * deltaT, position.y + velocity.y * deltaT, position.z + velocity.z * deltaT, _radius);
|
||||
|
||||
var foundObjs = this.level.collisionWorld.boundingSearch(searchbox);
|
||||
var foundObjs = this.collisionWorld.boundingSearch(searchbox);
|
||||
|
||||
var finalT = deltaT;
|
||||
var found = false;
|
||||
|
|
@ -1339,7 +1354,7 @@ class Marble extends GameObject {
|
|||
|
||||
var position = this.collider.transform.getPosition();
|
||||
|
||||
var foundObjs = this.level.collisionWorld.boundingSearch(searchbox);
|
||||
var foundObjs = this.collisionWorld.boundingSearch(searchbox);
|
||||
// var foundObjs = this.contactEntities;
|
||||
|
||||
function toDifPoint(vec:Vector) {
|
||||
|
|
@ -1758,14 +1773,14 @@ class Marble extends GameObject {
|
|||
}
|
||||
}
|
||||
|
||||
if (this.level.isWatching) {
|
||||
if (this.controllable && this.level.isWatching) {
|
||||
if (this.level.replay.currentPlaybackFrame.marbleStateFlags.has(Jumped))
|
||||
move.jump = true;
|
||||
if (this.level.replay.currentPlaybackFrame.marbleStateFlags.has(UsedPowerup))
|
||||
move.powerup = true;
|
||||
move.d = new Vector(this.level.replay.currentPlaybackFrame.marbleX, this.level.replay.currentPlaybackFrame.marbleY, 0);
|
||||
} else {
|
||||
if (this.level.isRecording) {
|
||||
if (this.controllable && this.level.isRecording) {
|
||||
this.level.replay.recordMarbleStateFlags(move.jump, move.powerup, false, false);
|
||||
this.level.replay.recordMarbleInput(move.d.x, move.d.y);
|
||||
}
|
||||
|
|
@ -1774,27 +1789,29 @@ class Marble extends GameObject {
|
|||
playedSounds = [];
|
||||
advancePhysics(timeState, move, collisionWorld, pathedInteriors);
|
||||
|
||||
if (!this.level.isWatching) {
|
||||
if (this.level.isRecording) {
|
||||
this.level.replay.recordMarbleState(this.getAbsPos().getPosition(), this.velocity, this.getRotationQuat(), this.omega);
|
||||
if (this.controllable) {
|
||||
if (!this.level.isWatching) {
|
||||
if (this.level.isRecording) {
|
||||
this.level.replay.recordMarbleState(this.getAbsPos().getPosition(), this.velocity, this.getRotationQuat(), this.omega);
|
||||
}
|
||||
} else {
|
||||
var expectedPos = this.level.replay.currentPlaybackFrame.marblePosition.clone();
|
||||
var expectedVel = this.level.replay.currentPlaybackFrame.marbleVelocity.clone();
|
||||
var expectedOmega = this.level.replay.currentPlaybackFrame.marbleAngularVelocity.clone();
|
||||
|
||||
this.setPosition(expectedPos.x, expectedPos.y, expectedPos.z);
|
||||
var tform = this.level.replay.currentPlaybackFrame.marbleOrientation.toMatrix();
|
||||
|
||||
tform.setPosition(new Vector(expectedPos.x, expectedPos.y, expectedPos.z));
|
||||
this.collider.setTransform(tform);
|
||||
this.velocity = expectedVel;
|
||||
var rQuat = this.level.replay.currentPlaybackFrame.marbleOrientation.clone();
|
||||
this.setRotationQuat(rQuat);
|
||||
this.omega = expectedOmega;
|
||||
}
|
||||
} else {
|
||||
var expectedPos = this.level.replay.currentPlaybackFrame.marblePosition.clone();
|
||||
var expectedVel = this.level.replay.currentPlaybackFrame.marbleVelocity.clone();
|
||||
var expectedOmega = this.level.replay.currentPlaybackFrame.marbleAngularVelocity.clone();
|
||||
|
||||
this.setPosition(expectedPos.x, expectedPos.y, expectedPos.z);
|
||||
var tform = this.level.replay.currentPlaybackFrame.marbleOrientation.toMatrix();
|
||||
|
||||
tform.setPosition(new Vector(expectedPos.x, expectedPos.y, expectedPos.z));
|
||||
this.collider.setTransform(tform);
|
||||
this.velocity = expectedVel;
|
||||
var rQuat = this.level.replay.currentPlaybackFrame.marbleOrientation.clone();
|
||||
this.setRotationQuat(rQuat);
|
||||
this.omega = expectedOmega;
|
||||
}
|
||||
|
||||
if (this.controllable && !this.level.rewinding) {
|
||||
if (this.controllable && this.level != null && !this.level.rewinding) {
|
||||
this.camera.update(timeState.currentAttemptTime, timeState.dt);
|
||||
}
|
||||
|
||||
|
|
@ -1922,6 +1939,8 @@ class Marble extends GameObject {
|
|||
}
|
||||
|
||||
public function updatePowerupStates(currentTime:Float, dt:Float) {
|
||||
if (!this.controllable)
|
||||
return;
|
||||
if (currentTime - this.helicopterEnableTime < 5) {
|
||||
this.helicopter.setPosition(x, y, z);
|
||||
this.helicopter.setRotationQuat(this.level.getOrientationQuat(currentTime));
|
||||
|
|
@ -1939,6 +1958,8 @@ class Marble extends GameObject {
|
|||
}
|
||||
|
||||
public function getMass() {
|
||||
if (this.level == null)
|
||||
return 1;
|
||||
if (this.level.timeState.currentAttemptTime - this.megaMarbleEnableTime < 10) {
|
||||
return 5;
|
||||
} else {
|
||||
|
|
|
|||
|
|
@ -324,14 +324,16 @@ class MarbleGame {
|
|||
previewWorld.destroyAllObjects();
|
||||
}
|
||||
|
||||
public function setPreviewMission(misname:String, onFinish:() -> Void) {
|
||||
public function setPreviewMission(misname:String, onFinish:() -> Void, physics:Bool = false) {
|
||||
Console.log("Setting preview mission " + misname);
|
||||
previewWorld.loadMission(misname, onFinish);
|
||||
previewWorld.loadMission(misname, onFinish, physics);
|
||||
}
|
||||
|
||||
public function render(e:h3d.Engine) {
|
||||
if (world != null && !world._disposed)
|
||||
world.render(e);
|
||||
if (previewWorld != null && world == null)
|
||||
previewWorld.render(e);
|
||||
canvas.renderEngine(e);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -57,6 +57,7 @@ class PathedInterior extends InteriorObject {
|
|||
onFinish(null);
|
||||
var pathedInterior = new PathedInterior();
|
||||
pathedInterior.level = level;
|
||||
pathedInterior.collisionWorld = level.collisionWorld;
|
||||
|
||||
DifBuilder.loadDif(difFile, pathedInterior, () -> {
|
||||
pathedInterior.identifier = difFile + interiorElement.interiorindex;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
package src;
|
||||
|
||||
import collision.CollisionWorld;
|
||||
import mis.MissionElement.MissionElementSky;
|
||||
import shapes.Astrolabe;
|
||||
import src.Sky;
|
||||
|
|
@ -49,10 +50,12 @@ import src.Console;
|
|||
import src.TimeState;
|
||||
import src.MissionList;
|
||||
import src.Settings;
|
||||
import src.Marble;
|
||||
|
||||
class PreviewWorld extends Scheduler {
|
||||
var scene:Scene;
|
||||
var instanceManager:InstanceManager;
|
||||
var collisionWorld:CollisionWorld;
|
||||
|
||||
var misFile:MisFile;
|
||||
var currentMission:String;
|
||||
|
|
@ -63,6 +66,7 @@ class PreviewWorld extends Scheduler {
|
|||
|
||||
var interiors:Array<InteriorObject> = [];
|
||||
var dtsObjects:Array<DtsObject> = [];
|
||||
var marbles:Array<Marble> = [];
|
||||
|
||||
var sky:Sky;
|
||||
|
||||
|
|
@ -126,18 +130,22 @@ class PreviewWorld extends Scheduler {
|
|||
}
|
||||
}
|
||||
|
||||
public function loadMission(misname:String, onFinish:() -> Void) {
|
||||
public function loadMission(misname:String, onFinish:() -> Void, physics:Bool = false) {
|
||||
if (currentMission == misname) {
|
||||
onFinish();
|
||||
return;
|
||||
}
|
||||
_loadToken++;
|
||||
currentMission = misname;
|
||||
var groupName = (misname + "group").toLowerCase();
|
||||
var group = levelGroups.get(groupName);
|
||||
if (group != null) {
|
||||
destroyAllObjects();
|
||||
this.currentMission = misname;
|
||||
this.instanceManager = new InstanceManager(scene);
|
||||
if (physics)
|
||||
this.collisionWorld = new CollisionWorld();
|
||||
else
|
||||
this.collisionWorld = null;
|
||||
|
||||
var p = new h3d.prim.Cube(0.001, 0.001, 0.001);
|
||||
p.addUVs();
|
||||
|
|
@ -182,8 +190,12 @@ class PreviewWorld extends Scheduler {
|
|||
}
|
||||
}
|
||||
|
||||
var difficulty = "beginner";
|
||||
var mis = MissionList.missionsFilenameLookup.get((misname + '.mis').toLowerCase());
|
||||
var difficulty = ["beginner", "intermediate", "advanced"][mis.difficultyIndex];
|
||||
if (misname == "marblepicker")
|
||||
difficulty = "advanced";
|
||||
else
|
||||
difficulty = ["beginner", "intermediate", "advanced"][mis.difficultyIndex];
|
||||
|
||||
var curToken = _loadToken;
|
||||
|
||||
|
|
@ -205,7 +217,7 @@ class PreviewWorld extends Scheduler {
|
|||
addInteriorFromMis(cast elem, curToken, () -> {
|
||||
itrAddTime += Console.time() - startTime;
|
||||
fwd();
|
||||
});
|
||||
}, physics);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
|
@ -268,18 +280,23 @@ class PreviewWorld extends Scheduler {
|
|||
|
||||
public function destroyAllObjects() {
|
||||
currentMission = null;
|
||||
collisionWorld = null;
|
||||
for (itr in interiors) {
|
||||
itr.dispose();
|
||||
}
|
||||
for (shape in dtsObjects) {
|
||||
shape.dispose();
|
||||
}
|
||||
for (marb in marbles) {
|
||||
marb.dispose();
|
||||
}
|
||||
interiors = [];
|
||||
dtsObjects = [];
|
||||
marbles = [];
|
||||
scene.removeChildren();
|
||||
}
|
||||
|
||||
public function addInteriorFromMis(element:MissionElementInteriorInstance, token:Int, onFinish:Void->Void) {
|
||||
public function addInteriorFromMis(element:MissionElementInteriorInstance, token:Int, onFinish:Void->Void, physics:Bool = false) {
|
||||
var difPath = getDifPath(element.interiorfile);
|
||||
if (difPath == "" || token != _loadToken) {
|
||||
onFinish();
|
||||
|
|
@ -288,6 +305,7 @@ class PreviewWorld extends Scheduler {
|
|||
Console.log('Adding interior: ${difPath}');
|
||||
var interior = new InteriorObject();
|
||||
interior.interiorFile = difPath;
|
||||
interior.isCollideable = physics;
|
||||
// DifBuilder.loadDif(difPath, interior);
|
||||
// this.interiors.push(interior);
|
||||
this.addInterior(interior, token, () -> {
|
||||
|
|
@ -315,12 +333,12 @@ class PreviewWorld extends Scheduler {
|
|||
mat.multiply(mat, tmat);
|
||||
|
||||
interior.setTransform(mat);
|
||||
interior.isCollideable = hasCollision;
|
||||
interior.isCollideable = hasCollision && physics;
|
||||
onFinish();
|
||||
});
|
||||
}, physics);
|
||||
}
|
||||
|
||||
function addInterior(obj:InteriorObject, token:Int, onFinish:Void->Void) {
|
||||
function addInterior(obj:InteriorObject, token:Int, onFinish:Void->Void, physics:Bool = false) {
|
||||
if (token != _loadToken) {
|
||||
onFinish();
|
||||
return;
|
||||
|
|
@ -335,6 +353,10 @@ class PreviewWorld extends Scheduler {
|
|||
this.instanceManager.addObject(obj);
|
||||
else
|
||||
this.scene.addChild(obj);
|
||||
if (physics) {
|
||||
this.collisionWorld.addEntity(obj.collider);
|
||||
obj.collisionWorld = this.collisionWorld;
|
||||
}
|
||||
onFinish();
|
||||
});
|
||||
}
|
||||
|
|
@ -543,12 +565,44 @@ class PreviewWorld extends Scheduler {
|
|||
return "";
|
||||
}
|
||||
|
||||
public function spawnMarble(onFinish:Marble->Void) {
|
||||
var marb = new Marble();
|
||||
marb.controllable = false;
|
||||
marb.init(null, () -> {
|
||||
marb.collisionWorld = this.collisionWorld;
|
||||
this.collisionWorld.addMovingEntity(marb.collider);
|
||||
this.scene.addChild(marb);
|
||||
this.marbles.push(marb);
|
||||
onFinish(marb);
|
||||
});
|
||||
}
|
||||
|
||||
public function removeMarble(marb:Marble) {
|
||||
if (this.marbles.remove(marb)) {
|
||||
this.scene.removeChild(marb);
|
||||
this.collisionWorld.removeMovingEntity(marb.collider);
|
||||
marb.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
public function update(dt:Float) {
|
||||
timeState.dt = dt;
|
||||
timeState.timeSinceLoad += dt;
|
||||
for (dts in dtsObjects) {
|
||||
dts.update(timeState);
|
||||
}
|
||||
for (marb in marbles) {
|
||||
marb.update(timeState, this.collisionWorld, []);
|
||||
}
|
||||
this.instanceManager.render();
|
||||
}
|
||||
|
||||
public function render(e:h3d.Engine) {
|
||||
for (marble in marbles) {
|
||||
if (marble != null && marble.cubemapRenderer != null) {
|
||||
marble.cubemapRenderer.position.load(marble.getAbsPos().getPosition());
|
||||
marble.cubemapRenderer.render(e, 0.002);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -120,6 +120,12 @@ class CollisionWorld {
|
|||
this.dynamicEntitySet.set(entity, true);
|
||||
}
|
||||
|
||||
public function removeMovingEntity(entity:CollisionEntity) {
|
||||
this.dynamicEntities.remove(entity);
|
||||
this.dynamicOctree.remove(entity);
|
||||
this.dynamicEntitySet.remove(entity);
|
||||
}
|
||||
|
||||
public function updateTransform(entity:CollisionEntity) {
|
||||
if (!dynamicEntitySet.exists(entity)) {
|
||||
this.octree.update(entity);
|
||||
|
|
|
|||
327
src/gui/MarblePickerGui.hx
Normal file
327
src/gui/MarblePickerGui.hx
Normal file
|
|
@ -0,0 +1,327 @@
|
|||
package gui;
|
||||
|
||||
import src.Marble;
|
||||
import src.MarbleGame;
|
||||
import gui.GuiControl.MouseState;
|
||||
import hxd.res.BitmapFont;
|
||||
import h3d.Vector;
|
||||
import src.ResourceLoader;
|
||||
import src.Settings;
|
||||
|
||||
class MarblePickerGui extends GuiImage {
|
||||
public function new() {
|
||||
var marbleData = [
|
||||
{
|
||||
name: "1",
|
||||
dts: "data/shapes/balls/marble01.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "2",
|
||||
dts: "data/shapes/balls/marble03.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "3",
|
||||
dts: "data/shapes/balls/marble04.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "4",
|
||||
dts: "data/shapes/balls/marble05.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "5",
|
||||
dts: "data/shapes/balls/marble06.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "6",
|
||||
dts: "data/shapes/balls/marble07.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "7",
|
||||
dts: "data/shapes/balls/marble12.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "8",
|
||||
dts: "data/shapes/balls/marble15.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicGlassPureSphere"
|
||||
},
|
||||
{
|
||||
name: "9",
|
||||
dts: "data/shapes/balls/marble02.dts",
|
||||
skin: "base",
|
||||
shader: "CrystalMarb"
|
||||
},
|
||||
{
|
||||
name: "10",
|
||||
dts: "data/shapes/balls/marble26.dts",
|
||||
skin: "base",
|
||||
shader: "CrystalMarb"
|
||||
},
|
||||
{
|
||||
name: "11",
|
||||
dts: "data/shapes/balls/marble27.dts",
|
||||
skin: "base",
|
||||
shader: "CrystalMarb"
|
||||
},
|
||||
{
|
||||
name: "12",
|
||||
dts: "data/shapes/balls/marble28.dts",
|
||||
skin: "base",
|
||||
shader: "CrystalMarb"
|
||||
},
|
||||
{
|
||||
name: "13",
|
||||
dts: "data/shapes/balls/marble29.dts",
|
||||
skin: "base",
|
||||
shader: "CrystalMarb"
|
||||
},
|
||||
{
|
||||
name: "14",
|
||||
dts: "data/shapes/balls/marble30.dts",
|
||||
skin: "base",
|
||||
shader: "CrystalMarb"
|
||||
},
|
||||
{
|
||||
name: "15",
|
||||
dts: "data/shapes/balls/marble11.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMetal"
|
||||
},
|
||||
{
|
||||
name: "16",
|
||||
dts: "data/shapes/balls/marble18.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarbGlass18"
|
||||
},
|
||||
{
|
||||
name: "17",
|
||||
dts: "data/shapes/balls/marble20.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarbGlass20"
|
||||
},
|
||||
{
|
||||
name: "18",
|
||||
dts: "data/shapes/balls/marble33.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMetal"
|
||||
},
|
||||
{
|
||||
name: "19",
|
||||
dts: "data/shapes/balls/marble34.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb2"
|
||||
},
|
||||
{
|
||||
name: "20",
|
||||
dts: "data/shapes/balls/marble09.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "21",
|
||||
dts: "data/shapes/balls/marble13.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "22",
|
||||
dts: "data/shapes/balls/marble14.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "23",
|
||||
dts: "data/shapes/balls/marble17.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "24",
|
||||
dts: "data/shapes/balls/marble19.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "25",
|
||||
dts: "data/shapes/balls/marble21.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "26",
|
||||
dts: "data/shapes/balls/marble22.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "27",
|
||||
dts: "data/shapes/balls/marble23.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "28",
|
||||
dts: "data/shapes/balls/marble24.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "29",
|
||||
dts: "data/shapes/balls/marble25.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "30",
|
||||
dts: "data/shapes/balls/marble31.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "31",
|
||||
dts: "data/shapes/balls/marble32.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "32",
|
||||
dts: "data/shapes/balls/marble08.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb"
|
||||
},
|
||||
{
|
||||
name: "33",
|
||||
dts: "data/shapes/balls/marble10.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb2"
|
||||
},
|
||||
{
|
||||
name: "34",
|
||||
dts: "data/shapes/balls/marble16.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
},
|
||||
{
|
||||
name: "35",
|
||||
dts: "data/shapes/balls/marble35.dts",
|
||||
skin: "base",
|
||||
shader: "ClassicMarb3"
|
||||
}
|
||||
];
|
||||
|
||||
var res = ResourceLoader.getImage("data/ui/xbox/BG_fadeOutSoftEdge.png").resource.toTile();
|
||||
super(res);
|
||||
var domcasual32fontdata = ResourceLoader.getFileEntry("data/font/DomCasualD.fnt");
|
||||
var domcasual32b = new BitmapFont(domcasual32fontdata.entry);
|
||||
@:privateAccess domcasual32b.loader = ResourceLoader.loader;
|
||||
var domcasual32 = domcasual32b.toSdfFont(cast 42 * Settings.uiScale, MultiChannel);
|
||||
|
||||
this.horizSizing = Width;
|
||||
this.vertSizing = Height;
|
||||
this.position = new Vector();
|
||||
this.extent = new Vector(640, 480);
|
||||
|
||||
var scene2d = MarbleGame.canvas.scene2d;
|
||||
|
||||
var offsetX = (scene2d.width - 1280) / 2;
|
||||
var offsetY = (scene2d.height - 720) / 2;
|
||||
|
||||
var subX = 640 - (scene2d.width - offsetX) * 640 / scene2d.width;
|
||||
var subY = 480 - (scene2d.height - offsetY) * 480 / scene2d.height;
|
||||
|
||||
var innerCtrl = new GuiControl();
|
||||
innerCtrl.position = new Vector(offsetX, offsetY);
|
||||
innerCtrl.extent = new Vector(640 - subX, 480 - subY);
|
||||
innerCtrl.horizSizing = Width;
|
||||
innerCtrl.vertSizing = Height;
|
||||
this.addChild(innerCtrl);
|
||||
|
||||
var coliseumfontdata = ResourceLoader.getFileEntry("data/font/ColiseumRR.fnt");
|
||||
var coliseumb = new BitmapFont(coliseumfontdata.entry);
|
||||
@:privateAccess coliseumb.loader = ResourceLoader.loader;
|
||||
var coliseum = coliseumb.toSdfFont(cast 44 * Settings.uiScale, MultiChannel);
|
||||
|
||||
var rootTitle = new GuiText(coliseum);
|
||||
rootTitle.position = new Vector(100, 30);
|
||||
rootTitle.extent = new Vector(1120, 80);
|
||||
rootTitle.text.textColor = 0xFFFFFF;
|
||||
rootTitle.text.text = "SELECT MARBLE APPEARANCE";
|
||||
rootTitle.text.alpha = 0.5;
|
||||
innerCtrl.addChild(rootTitle);
|
||||
var myMarb:Marble = null;
|
||||
|
||||
var prevPreview = @:privateAccess MarbleGame.instance.previewWorld.currentMission;
|
||||
|
||||
MarbleGame.instance.setPreviewMission("marblepicker", () -> {
|
||||
@:privateAccess MarbleGame.instance.previewWorld.spawnMarble(marb -> {
|
||||
var spawnPos = @:privateAccess MarbleGame.instance.scene.camera.pos.add(new Vector(0, 1, 1));
|
||||
var velAdd = new Vector((1 - 2 * Math.random()) * 2, (1 - 2 * Math.random()) * 1.5, (1 - 2 * Math.random()) * 1);
|
||||
velAdd = velAdd.add(new Vector(0, 3, 0));
|
||||
marb.setMarblePosition(spawnPos.x, spawnPos.y, spawnPos.z);
|
||||
marb.velocity.load(velAdd);
|
||||
myMarb = marb;
|
||||
});
|
||||
}, true);
|
||||
|
||||
var yPos = 160;
|
||||
|
||||
var mbOpt = new GuiXboxOptionsList(1, "Marble Type", marbleData.map(x -> x.name), 0.5, 118);
|
||||
mbOpt.vertSizing = Bottom;
|
||||
mbOpt.horizSizing = Right;
|
||||
mbOpt.alwaysActive = true;
|
||||
mbOpt.position = new Vector(380, yPos);
|
||||
mbOpt.extent = new Vector(815, 94);
|
||||
mbOpt.onChangeFunc = (idx) -> {
|
||||
var selectedMarble = marbleData[idx];
|
||||
Settings.optionsSettings.marbleIndex = idx;
|
||||
Settings.optionsSettings.marbleCategoryIndex = 0;
|
||||
Settings.optionsSettings.marbleSkin = selectedMarble.skin;
|
||||
Settings.optionsSettings.marbleModel = selectedMarble.dts;
|
||||
Settings.optionsSettings.marbleShader = selectedMarble.shader;
|
||||
@:privateAccess MarbleGame.instance.previewWorld.removeMarble(myMarb);
|
||||
@:privateAccess MarbleGame.instance.previewWorld.spawnMarble(marb -> {
|
||||
var spawnPos = @:privateAccess MarbleGame.instance.scene.camera.pos.add(new Vector(0, 1, 1));
|
||||
var velAdd = new Vector((1 - 2 * Math.random()) * 2, (1 - 2 * Math.random()) * 1.5, (1 - 2 * Math.random()) * 1);
|
||||
velAdd = velAdd.add(new Vector(0, 3, 0));
|
||||
marb.setMarblePosition(spawnPos.x, spawnPos.y, spawnPos.z);
|
||||
marb.velocity.load(velAdd);
|
||||
myMarb = marb;
|
||||
});
|
||||
return true;
|
||||
}
|
||||
innerCtrl.addChild(mbOpt);
|
||||
|
||||
var bottomBar = new GuiControl();
|
||||
bottomBar.position = new Vector(0, 590);
|
||||
bottomBar.extent = new Vector(640, 200);
|
||||
bottomBar.horizSizing = Width;
|
||||
bottomBar.vertSizing = Bottom;
|
||||
innerCtrl.addChild(bottomBar);
|
||||
|
||||
var backButton = new GuiXboxButton("Ok", 160);
|
||||
backButton.position = new Vector(960, 0);
|
||||
backButton.vertSizing = Bottom;
|
||||
backButton.horizSizing = Right;
|
||||
backButton.gamepadAccelerator = ["OK"];
|
||||
backButton.pressedAction = (e) -> {
|
||||
MarbleGame.canvas.setContent(new OptionsListGui());
|
||||
MarbleGame.instance.setPreviewMission(prevPreview, () -> {}, false);
|
||||
};
|
||||
|
||||
bottomBar.addChild(backButton);
|
||||
}
|
||||
}
|
||||
|
|
@ -55,7 +55,7 @@ class OptionsListGui extends GuiImage {
|
|||
innerCtrl.addChild(btnList);
|
||||
|
||||
btnList.addButton(3, 'Marble Appearance', (e) -> {
|
||||
MarbleGame.canvas.pushDialog(new MarbleSelectGui());
|
||||
MarbleGame.canvas.setContent(new MarblePickerGui());
|
||||
});
|
||||
btnList.addButton(3, 'Input and Sound Options', (e) -> {
|
||||
MarbleGame.canvas.setContent(new InputOptionsGui(pauseGui));
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue