Add leenkx/Sources/leenkx/trait/physics/PhysicsCache.hx
This commit is contained in:
98
leenkx/Sources/leenkx/trait/physics/PhysicsCache.hx
Normal file
98
leenkx/Sources/leenkx/trait/physics/PhysicsCache.hx
Normal file
@ -0,0 +1,98 @@
|
||||
package leenkx.trait.physics;
|
||||
|
||||
import iron.object.Object;
|
||||
|
||||
class PhysicsCache {
|
||||
#if lnx_physics
|
||||
static var rbCache: Map<Int, Dynamic> = new Map();
|
||||
static var contactsCache: Map<Int, Array<Dynamic>> = new Map();
|
||||
static var physicsFrame: Int = 0;
|
||||
static var lastQueryFrame: Int = -1;
|
||||
#end
|
||||
|
||||
public static function getCachedRigidBody(object: Object): Dynamic {
|
||||
#if (!lnx_physics)
|
||||
return null;
|
||||
#else
|
||||
if (object == null) return null;
|
||||
|
||||
var cached = rbCache.get(object.uid);
|
||||
if (cached != null) return cached;
|
||||
|
||||
#if lnx_bullet
|
||||
var rb = object.getTrait(leenkx.trait.physics.bullet.RigidBody);
|
||||
#else
|
||||
var rb = object.getTrait(leenkx.trait.physics.oimo.RigidBody);
|
||||
#end
|
||||
|
||||
if (rb != null) rbCache.set(object.uid, rb);
|
||||
return rb;
|
||||
#end
|
||||
}
|
||||
|
||||
public static function getCachedContacts(rb: Dynamic): Array<Dynamic> {
|
||||
#if (!lnx_physics)
|
||||
return null;
|
||||
#else
|
||||
if (rb == null) return null;
|
||||
|
||||
var rbObjectId = (rb.object != null) ? rb.object.uid : -1;
|
||||
|
||||
if (rbObjectId == -1) {
|
||||
#if lnx_bullet
|
||||
if (leenkx.trait.physics.bullet.PhysicsWorld.active == null) return null;
|
||||
return leenkx.trait.physics.bullet.PhysicsWorld.active.getContacts(rb);
|
||||
#else
|
||||
if (leenkx.trait.physics.oimo.PhysicsWorld.active == null) return null;
|
||||
return leenkx.trait.physics.oimo.PhysicsWorld.active.getContacts(rb);
|
||||
#end
|
||||
}
|
||||
|
||||
if (lastQueryFrame == physicsFrame) {
|
||||
var cached = contactsCache.get(rbObjectId);
|
||||
if (cached != null) return cached;
|
||||
}
|
||||
|
||||
lastQueryFrame = physicsFrame;
|
||||
|
||||
var cached = contactsCache.get(rbObjectId);
|
||||
if (cached != null) return cached;
|
||||
|
||||
#if lnx_bullet
|
||||
if (leenkx.trait.physics.bullet.PhysicsWorld.active == null) return null;
|
||||
var contacts = leenkx.trait.physics.bullet.PhysicsWorld.active.getContacts(rb);
|
||||
#else
|
||||
if (leenkx.trait.physics.oimo.PhysicsWorld.active == null) return null;
|
||||
var contacts = leenkx.trait.physics.oimo.PhysicsWorld.active.getContacts(rb);
|
||||
#end
|
||||
|
||||
if (contacts != null) {
|
||||
contactsCache.set(rbObjectId, contacts);
|
||||
}
|
||||
|
||||
return contacts;
|
||||
#end
|
||||
}
|
||||
|
||||
public static inline function hasContactWith(contacts: Array<Dynamic>, target: Dynamic): Bool {
|
||||
#if (!lnx_physics)
|
||||
return false;
|
||||
#else
|
||||
return contacts != null && target != null && contacts.indexOf(target) >= 0;
|
||||
#end
|
||||
}
|
||||
|
||||
public static function clearCache() {
|
||||
#if lnx_physics
|
||||
rbCache.clear();
|
||||
contactsCache.clear();
|
||||
#end
|
||||
}
|
||||
|
||||
public static function clearContactsCache() {
|
||||
#if lnx_physics
|
||||
physicsFrame++;
|
||||
contactsCache.clear();
|
||||
#end
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user