diff --git a/src/DtsObject.hx b/src/DtsObject.hx index c73c1edc..04286ed1 100644 --- a/src/DtsObject.hx +++ b/src/DtsObject.hx @@ -1032,6 +1032,7 @@ class DtsObject extends GameObject { public override function dispose() { super.dispose(); + this.level = null; this.dtsResource.release(); } } diff --git a/src/InstanceManager.hx b/src/InstanceManager.hx index 3807b8f2..424eec96 100644 --- a/src/InstanceManager.hx +++ b/src/InstanceManager.hx @@ -19,16 +19,25 @@ import h3d.scene.Mesh; import h3d.scene.MeshBatch; import src.MarbleGame; -typedef MeshBatchInfo = { +@:publicFields +class MeshBatchInfo { var instances:Array; var meshbatch:MeshBatch; - var ?transparencymeshbatch:MeshBatch; + var transparencymeshbatch:MeshBatch; var mesh:Mesh; + + public function new() {} } -typedef MeshInstance = { +@:publicFields +class MeshInstance { var emptyObj:Object; var gameObject:GameObject; + + public function new(eo, go) { + this.emptyObj = eo; + this.gameObject = go; + } } class InstanceManager { @@ -122,7 +131,7 @@ class InstanceManager { var objs = getAllChildren(object); var minfos = objects[objectMap.get(object.identifier)]; // objects.get(object.identifier); for (i in 0...objs.length) { - minfos[i].instances.push({emptyObj: objs[i], gameObject: object}); + minfos[i].instances.push(new MeshInstance(objs[i], object)); } } else { // First time appending the thing so bruh @@ -131,11 +140,11 @@ class InstanceManager { var minfos = []; for (obj in objs) { var isMesh = obj is Mesh; - var minfo:MeshBatchInfo = { - instances: [{emptyObj: obj, gameObject: object}], - meshbatch: isMesh ? new MeshBatch(cast(cast(obj, Mesh).primitive), cast(cast(obj, Mesh)).material.clone(), scene) : null, - mesh: isMesh ? cast obj : null - } + var minfo:MeshBatchInfo = new MeshBatchInfo(); + minfo.instances = [new MeshInstance(obj, object)]; + minfo.meshbatch = isMesh ? new MeshBatch(cast(cast(obj, Mesh).primitive), cast(cast(obj, Mesh)).material.clone(), scene) : null; + minfo.mesh = isMesh ? cast obj : null; + if (isMesh) { var mat = cast(obj, Mesh).material; var dtsshader = mat.mainPass.getShader(DtsTexture); diff --git a/src/MarbleGame.hx b/src/MarbleGame.hx index 10ba709a..c88d840b 100644 --- a/src/MarbleGame.hx +++ b/src/MarbleGame.hx @@ -221,7 +221,7 @@ class MarbleGame { world.setCursorLock(false); exitGameDlg = new ExitGameDlg((sender) -> { canvas.popDialog(exitGameDlg); - if (world.isRecording) { + if (getWorld().isRecording) { MarbleGame.canvas.pushDialog(new ReplayNameDlg(() -> { quitMission(); })); @@ -231,10 +231,10 @@ class MarbleGame { }, (sender) -> { canvas.popDialog(exitGameDlg); paused = !paused; - world.setCursorLock(true); + getWorld().setCursorLock(true); }, (sender) -> { canvas.popDialog(exitGameDlg); - world.restart(true); + getWorld().restart(true); // world.setCursorLock(true); paused = !paused; }); @@ -249,6 +249,11 @@ class MarbleGame { } } + public function getWorld() { + // So that we don't actually store this somewhere in any closure stack + return world; + } + public function quitMission() { Console.log("Quitting mission"); world.setCursorLock(false); diff --git a/src/MarbleWorld.hx b/src/MarbleWorld.hx index e9f51c4a..5df2ca4c 100644 --- a/src/MarbleWorld.hx +++ b/src/MarbleWorld.hx @@ -1952,28 +1952,44 @@ class MarbleWorld extends Scheduler { for (interior in this.interiors) { interior.dispose(); } + interiors = null; for (pathedInteriors in this.pathedInteriors) { pathedInteriors.dispose(); } + pathedInteriors = null; for (marble in this.marbles) { marble.dispose(); } + marbles = null; for (dtsObject in this.dtsObjects) { dtsObject.dispose(); } + dtsObjects = null; for (trigger in this.triggers) { trigger.dispose(); } + triggers = null; for (soundResource in this.soundResources) { soundResource.release(); } for (textureResource in this.textureResources) { textureResource.release(); } + gems = null; if (sky != null) sky.dispose(); + instanceManager = null; + collisionWorld = null; + particleManager = null; + namedObjects = null; + shapeOrTriggerInside = null; + shapeImmunity = null; + currentCheckpoint = null; + checkpointCollectedGems = null; + marble = null; + this._disposed = true; AudioManager.stopAllSounds(); AudioManager.playShell();