File: src\classes\ObjectPool.js
/**
* Manages pools for various types of objects, provides methods for creating and freeing pooled objects
*
* @class ObjectPool
* @static
*/
Goblin.ObjectPool = {
/**
* key/value map of registered types
*
* @property types
* @private
*/
types: {},
/**
* key/pool map of object type - to - object pool
*
* @property pools
* @private
*/
pools: {},
/**
* registers a type of object to be available in pools
*
* @param key {String} key associated with the object to register
* @param constructing_function {Function} function which will return a new object
*/
registerType: function( key, constructing_function ) {
this.types[ key ] = constructing_function;
this.pools[ key ] = [];
},
/**
* retrieve a free object from the specified pool, or creates a new object if one is not available
*
* @param key {String} key of the object type to retrieve
* @return {Mixed} object of the type asked for, when done release it with `ObjectPool.freeObject`
*/
getObject: function( key ) {
var pool = this.pools[ key ];
if ( pool.length !== 0 ) {
return pool.pop();
} else {
return this.types[ key ]();
}
},
/**
* adds on object to the object pool so it can be reused
*
* @param key {String} type of the object being freed, matching the key given to `registerType`
* @param object {Mixed} object to release into the pool
*/
freeObject: function( key, object ) {
if ( object.removeAllListeners != null ) {
object.removeAllListeners();
}
this.pools[ key ].push( object );
}
};
// register the objects used in Goblin
Goblin.ObjectPool.registerType( 'ContactDetails', function() { return new Goblin.ContactDetails(); } );
Goblin.ObjectPool.registerType( 'ContactManifold', function() { return new Goblin.ContactManifold(); } );
Goblin.ObjectPool.registerType( 'GJK2SupportPoint', function() { return new Goblin.GjkEpa2.SupportPoint( new Goblin.Vector3(), new Goblin.Vector3(), new Goblin.Vector3() ); } );
Goblin.ObjectPool.registerType( 'ConstraintRow', function() { return new Goblin.ConstraintRow(); } );
Goblin.ObjectPool.registerType( 'ContactConstraint', function() { return new Goblin.ContactConstraint(); } );
Goblin.ObjectPool.registerType( 'FrictionConstraint', function() { return new Goblin.FrictionConstraint(); } );
Goblin.ObjectPool.registerType( 'RayIntersection', function() { return new Goblin.RayIntersection(); } );
Goblin.ObjectPool.registerType( 'RigidBodyProxy', function() { return new Goblin.RigidBodyProxy(); } );