From 97e8f5a753996325a00178d7ffbd84330b9cbca2 Mon Sep 17 00:00:00 2001 From: RandomityGuy <31925790+RandomityGuy@users.noreply.github.com> Date: Wed, 17 Jul 2024 16:27:24 +0530 Subject: [PATCH] more optimizations for mp --- src/ForceObject.hx | 18 ++++++++---------- src/Marble.hx | 7 ++++--- src/collision/CollisionWorld.hx | 2 +- src/octree/Octree.hx | 4 ++-- src/octree/OctreeNode.hx | 9 ++++++--- 5 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/ForceObject.hx b/src/ForceObject.hx index 21069996..7e343240 100644 --- a/src/ForceObject.hx +++ b/src/ForceObject.hx @@ -22,11 +22,11 @@ typedef ForceData = { class ForceObject extends DtsObject { var forceDatas:Array; - public function getForce(pos:Vector) { + public function getForce(pos:Vector, outForce:Vector) { + if (pos.distanceSq(this.getAbsPos().getPosition()) > 50 * 50) + return; var strength = 0.0; var dot = 0.0; - var posVec = new Vector(); - var retForce = new Vector(); for (forceData in forceDatas) { if (forceData.forceType == NoForce) { continue; @@ -40,7 +40,7 @@ class ForceObject extends DtsObject { nodeVec = forceData.forceVector; } - posVec = pos.sub(node.getPosition()); + var posVec = pos.sub(node.getPosition()); dot = posVec.length(); if (forceData.forceRadius < dot) { @@ -52,23 +52,21 @@ class ForceObject extends DtsObject { if (forceType == ForceSpherical) { dot = strength / dot; - retForce = retForce.add(posVec.multiply(dot)); + outForce.load(outForce.add(posVec.multiply(dot))); } if (forceType == ForceField) { - retForce = retForce.add(nodeVec.multiply(strength)); + outForce.load(outForce.add(nodeVec.multiply(strength))); } if (forceType == ForceCone) { - posVec = posVec.multiply(1 / dot); + posVec.load(posVec.multiply(1 / dot)); var newDot = nodeVec.dot(posVec); var arc = forceData.forceArc; if (arc < newDot) { - retForce = retForce.add(posVec.multiply(strength).multiply(newDot - arc).multiply(1 / (1 - arc))); + outForce.load(outForce.add(posVec.multiply(strength).multiply(newDot - arc).multiply(1 / (1 - arc)))); } } } - - return retForce; } } diff --git a/src/Marble.hx b/src/Marble.hx index e5b6425c..d292f6ed 100644 --- a/src/Marble.hx +++ b/src/Marble.hx @@ -705,12 +705,13 @@ class Marble extends GameObject { if (helicopter) { A.load(A.multiply(0.25)); } - if (this.level != null) { + if (this.level != null && level.forceObjects.length > 0) { var mass = this.getMass(); + var externalForce = new Vector(); for (obj in level.forceObjects) { - var force = cast(obj, ForceObject).getForce(this.collider.transform.getPosition()); - A.load(A.add(force.multiply(1 / mass))); + cast(obj, ForceObject).getForce(this.collider.transform.getPosition(), externalForce); } + A.load(A.add(externalForce.multiply(1 / mass))); } if (contacts.length != 0 && this.mode != Start) { diff --git a/src/collision/CollisionWorld.hx b/src/collision/CollisionWorld.hx index 7fd589a4..193ae001 100644 --- a/src/collision/CollisionWorld.hx +++ b/src/collision/CollisionWorld.hx @@ -28,7 +28,7 @@ class CollisionWorld { public function new() { this.octree = new Octree(); - this.dynamicOctree = new Octree(); + this.dynamicOctree = new Octree(true); this.staticWorld = new CollisionEntity(null); } diff --git a/src/octree/Octree.hx b/src/octree/Octree.hx index 03b86ca3..c3289024 100644 --- a/src/octree/Octree.hx +++ b/src/octree/Octree.hx @@ -16,8 +16,8 @@ class Octree { var prevBoundSearch:Bounds; var boundSearchCache:Array; - public function new() { - this.root = new OctreeNode(this, 0); + public function new(disableMerge:Bool = false) { + this.root = new OctreeNode(this, 0, disableMerge); this.objectToNode = new Map(); } diff --git a/src/octree/OctreeNode.hx b/src/octree/OctreeNode.hx index 7de6f848..9d9457c5 100644 --- a/src/octree/OctreeNode.hx +++ b/src/octree/OctreeNode.hx @@ -32,7 +32,9 @@ class OctreeNode implements IOctreeElement { public var depth:Int; - public function new(octree:Octree, depth:Int) { + var disableMerge:Bool; + + public function new(octree:Octree, depth:Int, disableMerge:Bool = false) { this.octree = octree; this.depth = depth; this.xMin = 0; @@ -41,6 +43,7 @@ class OctreeNode implements IOctreeElement { this.xMax = 1; this.yMax = 1; this.zMax = 1; + this.disableMerge = disableMerge; } public function insert(object:IOctreeObject) { @@ -90,7 +93,7 @@ class OctreeNode implements IOctreeElement { public function createOctants() { this.octants = []; for (i in 0...8) { - var newNode = new OctreeNode(this.octree, this.depth + 1); + var newNode = new OctreeNode(this.octree, this.depth + 1, disableMerge); newNode.parent = this; var newSize = new Vector(xMax - xMin, yMax - yMin, zMax - zMin); newNode.xMin = this.xMin + newSize.x * ((i & 1) >> 0); @@ -137,7 +140,7 @@ class OctreeNode implements IOctreeElement { } public function merge() { - if (this.count > 8 || (this.octants == null)) + if (this.count > 8 || (this.octants == null) || disableMerge) return; // Add all objects in the octants back to this node for (i in 0...8) {