diff --git a/src/CameraController.hx b/src/CameraController.hx index 2e09de3f..2a3db8d6 100644 --- a/src/CameraController.hx +++ b/src/CameraController.hx @@ -1,5 +1,6 @@ package src; +import h3d.col.Bounds; import h3d.col.Plane; import h3d.mat.Material; import h3d.prim.Cube; @@ -239,18 +240,23 @@ class CameraController extends Object { var rayCastDirection = camera.pos.sub(rayCastOrigin); rayCastDirection = rayCastDirection.add(rayCastDirection.normalized().multiply(2)); - var results = level.collisionWorld.rayCast(rayCastOrigin, rayCastDirection); + var rayCastLen = rayCastDirection.length(); - var firstHit:octree.OctreeIntersection = null; + var results = level.collisionWorld.rayCast(rayCastOrigin, rayCastDirection.normalized(), rayCastLen); + + var firstHit:octree.IOctreeObject.RayIntersectionData = null; + var firstHitDistance = 1e8; for (result in results) { - if (!processedShapes.contains(result.object) && (firstHit == null || (result.distance < firstHit.distance))) { + if (!processedShapes.contains(result.object) + && (firstHit == null || (rayCastOrigin.distance(result.point) < firstHitDistance))) { firstHit = result; + firstHitDistance = rayCastOrigin.distance(result.point); processedShapes.push(result.object); } } if (firstHit != null) { - if (firstHit.distance < CameraDistance) { + if (firstHitDistance < CameraDistance) { // camera.pos = marblePosition.sub(directionVector.multiply(firstHit.distance * 0.7)); var plane = new Plane(firstHit.normal.x, firstHit.normal.y, firstHit.normal.z, firstHit.point.dot(firstHit.normal)); var normal = firstHit.normal.multiply(-1); diff --git a/src/DtsObject.hx b/src/DtsObject.hx index 13dd8461..66354d56 100644 --- a/src/DtsObject.hx +++ b/src/DtsObject.hx @@ -814,12 +814,6 @@ class DtsObject extends GameObject { for (i in info.indices) { if (pos >= prim.points.length) { meshIndex++; - if (prim.buffer != null) { - // prim.addNormals(); - // for (norm in prim.normals) - // norm = norm.multiply(-1); - prim.flush(); - } mesh.primitive = prim; mesh = cast info.geometry.children[meshIndex]; prim = cast mesh.primitive; diff --git a/src/InstanceManager.hx b/src/InstanceManager.hx index 877158b7..1e6032ad 100644 --- a/src/InstanceManager.hx +++ b/src/InstanceManager.hx @@ -25,7 +25,9 @@ typedef MeshInstance = { } class InstanceManager { - var objects:Map> = new Map(); + var objects:Array> = []; + + var objectMap:Map = []; var scene:Scene; public function new(scene:Scene) { @@ -33,7 +35,7 @@ class InstanceManager { } public function update(dt:Float) { - for (obj => meshes in objects) { + for (meshes in objects) { for (minfo in meshes) { if (minfo.meshbatch != null) { var opaqueinstances = minfo.instances.filter(x -> x.gameObject.currentOpacity == 1); @@ -43,7 +45,7 @@ class InstanceManager { if (dtsShader != null) { dtsShader.currentOpacity = instance.gameObject.currentOpacity; } - var transform = instance.emptyObj.getAbsPos().clone(); + var transform = instance.emptyObj.getAbsPos(); minfo.meshbatch.material.mainPass.setPassName(minfo.mesh.material.mainPass.name); minfo.meshbatch.material.mainPass.enableLights = minfo.mesh.material.mainPass.enableLights; minfo.meshbatch.setTransform(transform); @@ -68,7 +70,7 @@ class InstanceManager { // dtsShader.currentOpacity = instance.gameObject.currentOpacity; // minfo.transparencymeshbatch.shadersChanged = true; // } - var transform = instance.emptyObj.getAbsPos().clone(); + var transform = instance.emptyObj.getAbsPos(); minfo.transparencymeshbatch.setTransform(transform); minfo.transparencymeshbatch.emitInstance(); } @@ -89,7 +91,7 @@ class InstanceManager { if (isInstanced(object)) { // Add existing instance var objs = getAllChildren(object); - var minfos = objects.get(object.identifier); + 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}); } @@ -129,13 +131,15 @@ class InstanceManager { } minfos.push(minfo); } - objects.set(object.identifier, minfos); + var curidx = objects.length; + objects.push(minfos); + objectMap.set(object.identifier, curidx); } } public function getObjectBounds(object:GameObject) { if (isInstanced(object)) { - var minfos = objects.get(object.identifier); + var minfos = objects[objectMap.get(object.identifier)]; var invmat = minfos[0].instances[0].gameObject.getInvPos(); var b = minfos[0].instances[0].gameObject.getBounds().clone(); b.transform(invmat); @@ -149,7 +153,7 @@ class InstanceManager { } public function isInstanced(object:GameObject) { - if (objects.exists(object.identifier)) + if (objectMap.exists(object.identifier)) return true; return false; } diff --git a/src/ParticleSystem.hx b/src/ParticleSystem.hx index 5561f562..d2c3f5b7 100644 --- a/src/ParticleSystem.hx +++ b/src/ParticleSystem.hx @@ -269,7 +269,8 @@ class ParticleEmitter { } class ParticleManager { - var particlebatches:Map = new Map(); + var particlebatches:Array = []; + var particlebatchMap:Map = []; var level:MarbleWorld; var scene:Scene; var currentTime:Float; @@ -283,12 +284,12 @@ class ParticleManager { public function update(currentTime:Float, dt:Float) { this.currentTime = currentTime; - for (obj => batch in particlebatches) { + for (batch in particlebatches) { for (instance in batch.instances) instance.update(currentTime, dt); } this.tick(dt); - for (obj => batch in particlebatches) { + for (batch in particlebatches) { batch.meshBatch.begin(batch.instances.length); for (instance in batch.instances) { if (instance.currentAge != 0) { @@ -310,8 +311,8 @@ class ParticleManager { } public function addParticle(particleData:ParticleData, particle:Particle) { - if (particlebatches.exists(particleData.identifier)) { - particlebatches.get(particleData.identifier).instances.push(particle); + if (particlebatchMap.exists(particleData.identifier)) { + particlebatches[particlebatchMap.get(particleData.identifier)].instances.push(particle); } else { var pts = [ new Point(-0.5, -0.5, 0), @@ -343,13 +344,15 @@ class ParticleManager { instances: [particle], meshBatch: mb }; - particlebatches.set(particleData.identifier, batch); + var curidx = particlebatches.length; + particlebatches.push(batch); + particlebatchMap.set(particleData.identifier, curidx); } } public function removeParticle(particleData:ParticleData, particle:Particle) { - if (particlebatches.exists(particleData.identifier)) { - particlebatches.get(particleData.identifier).instances.remove(particle); + if (particlebatchMap.exists(particleData.identifier)) { + particlebatches[particlebatchMap.get(particleData.identifier)].instances.remove(particle); } } diff --git a/src/ResourceLoader.hx b/src/ResourceLoader.hx index dc283f7e..941abe7c 100644 --- a/src/ResourceLoader.hx +++ b/src/ResourceLoader.hx @@ -39,6 +39,9 @@ class ResourceLoader { // static var threadPool:FixedThreadPool = new FixedThreadPool(4); public static function init(scene2d:h2d.Scene, onLoadedFunc:Void->Void) { + // hxd.res.Resource.LIVE_UPDATE = false; // Disable live update to save frames + @:privateAccess hxd.res.Image.ENABLE_AUTO_WATCH = false; + // @:privateAccess hxd.res.Sound.ENABLE_AUTO_WATCH = false; #if (js || android) var mfileSystem = ManifestBuilder.create("data"); var mloader = new ManifestLoader(mfileSystem); @@ -140,6 +143,7 @@ class ResourceLoader { return audioCache.get(path); if (fileSystem.exists(path)) { var snd = loader.load(path).toSound(); + // @:privateAccess snd.watchCallb(); var audioresource = new Resource(snd, path, audioCache, snd -> snd.dispose()); audioCache.set(path, audioresource); return audioresource; diff --git a/src/collision/CollisionWorld.hx b/src/collision/CollisionWorld.hx index 4f4b3e03..913fff0f 100644 --- a/src/collision/CollisionWorld.hx +++ b/src/collision/CollisionWorld.hx @@ -88,11 +88,22 @@ class CollisionWorld { return contacts; } - public function rayCast(rayStart:Vector, rayDirection:Vector) { + public function rayCast(rayStart:Vector, rayDirection:Vector, rayLength:Float) { // return []; rayStart.w = 1; rayDirection.w = 1; - return this.octree.raycast(rayStart, rayDirection); + var bounds = new Bounds(); + bounds.addPos(rayStart.x, rayStart.y, rayStart.z); + bounds.addPos(rayStart.x + + rayDirection.x * rayLength, rayStart.y + + rayDirection.y * rayLength, rayStart.z + + rayDirection.z * rayLength); + var objs = this.octree.boundingSearch(bounds).map(x -> cast(x, CollisionEntity)); + var results = []; + for (obj in objs) { + results = results.concat(obj.rayCast(rayStart, rayDirection)); + } + return results; } public function addEntity(entity:CollisionEntity) {