diff --git a/build/lib/openfl.rb b/build/lib/openfl.rb index 48815e2..9248f45 100644 --- a/build/lib/openfl.rb +++ b/build/lib/openfl.rb @@ -128,6 +128,10 @@ def make_nmml if @target == 'flash' && is_defined('debug') xml.haxedef :name => 'fdb' end + + if @target == 'flash' && is_defined('telemetry') + xml.haxedef :name => 'advanced-telemetry' + end } end diff --git a/src/dust/entities/Entities.hx b/src/dust/entities/Entities.hx index 3e6e438..a0d42d7 100644 --- a/src/dust/entities/Entities.hx +++ b/src/dust/entities/Entities.hx @@ -3,7 +3,7 @@ package dust.entities; import dust.entities.Entity; import dust.entities.Entities; import dust.lists.PooledList; -import dust.lists.Pool; +import dust.pooling.data.Pool; import dust.bitfield.BitfieldFactory; class Entities diff --git a/src/dust/entities/Entity.hx b/src/dust/entities/Entity.hx index fbeb7d7..bfe0474 100644 --- a/src/dust/entities/Entity.hx +++ b/src/dust/entities/Entity.hx @@ -1,5 +1,6 @@ package dust.entities; +import dust.pooling.data.Pooled; import dust.entities.Entity; import dust.bitfield.Bitfield; @@ -76,7 +77,9 @@ class Entity } inline public function satisfies(collectionBitfield:Bitfield):Bool + { return bitfield.isSubset(collectionBitfield); + } inline public function dispose() { @@ -108,7 +111,13 @@ class Entity for (componentID in cached) { if (!bitfield.get(componentID)) + { + var component = components[componentID]; components[componentID] = null; + + if (Std.is(component, Pooled)) + cast(component, Pooled).release(); + } } untyped cached.length = 0; } @@ -120,7 +129,9 @@ class Entity } inline function getComponent(index:Int):T + { return cast components[index]; + } macro public function has(self:ExprOf, component:Expr):Expr { @@ -129,11 +140,17 @@ class Entity } inline function hasComponent(index:Int):Bool + { return bitfield.get(index); + } inline public function iterator():Iterator - return components.iterator(); + { + return components.iterator(); + } public function toString():String + { return '[Entity $id (${bitfield.toString()})]'; + } } diff --git a/src/dust/graphics/systems/PainterSystem.hx b/src/dust/graphics/systems/PainterSystem.hx index 7185484..0e93b78 100644 --- a/src/dust/graphics/systems/PainterSystem.hx +++ b/src/dust/graphics/systems/PainterSystem.hx @@ -3,7 +3,7 @@ package dust.graphics.systems; import dust.camera.data.Camera; import dust.graphics.data.Painters; import dust.collections.api.Collection; -import dust.lists.Pool; +import dust.pooling.data.Pool; import dust.lists.SortedList; import dust.systems.System; diff --git a/src/dust/inspector/control/InspectorPopulator.hx b/src/dust/inspector/control/InspectorPopulator.hx index c49a72a..d886d03 100644 --- a/src/dust/inspector/control/InspectorPopulator.hx +++ b/src/dust/inspector/control/InspectorPopulator.hx @@ -19,20 +19,10 @@ class InspectorPopulator } } - function getType(entity:Entity, component:Component) + function getType(entity:Entity, component:Dynamic):Class { var type = Type.getClass(component); - if (entity.has(type)) - return type; - - while (type != Component) - { - type = cast Type.getSuperClass(type); - if (entity.has(type) && entity.get(type) == component) - return type; - } - - return null; + return entity.has(type) ? type : null; } function addField(inspector:Inspector, component:Class, field:String) diff --git a/src/dust/inspector/data/FieldHash.hx b/src/dust/inspector/data/FieldHash.hx index af6136c..1b86e1e 100644 --- a/src/dust/inspector/data/FieldHash.hx +++ b/src/dust/inspector/data/FieldHash.hx @@ -1,3 +1,3 @@ package dust.inspector.data; -typedef FieldHash = Hash; +typedef FieldHash = Map; diff --git a/src/dust/inspector/data/InspectedField.hx b/src/dust/inspector/data/InspectedField.hx index e30aea3..7cc4aff 100644 --- a/src/dust/inspector/data/InspectedField.hx +++ b/src/dust/inspector/data/InspectedField.hx @@ -34,5 +34,7 @@ class InspectedField } public function toString():String - return name + { + return name; + } } \ No newline at end of file diff --git a/src/dust/inspector/data/Inspector.hx b/src/dust/inspector/data/Inspector.hx index 38675b6..ab77b56 100644 --- a/src/dust/inspector/data/Inspector.hx +++ b/src/dust/inspector/data/Inspector.hx @@ -48,5 +48,7 @@ class Inspector } public function iterator():Iterator - return new InspectorIterator(typeHash) + { + return new InspectorIterator(typeHash); + } } diff --git a/src/dust/inspector/data/InspectorIterator.hx b/src/dust/inspector/data/InspectorIterator.hx index 847ebc7..c22c33d 100644 --- a/src/dust/inspector/data/InspectorIterator.hx +++ b/src/dust/inspector/data/InspectorIterator.hx @@ -22,7 +22,9 @@ class InspectorIterator } public function hasNext():Bool - return fieldIterator.hasNext() || typeIterator.hasNext() + { + return fieldIterator.hasNext() || typeIterator.hasNext(); + } public function next():InspectedField { @@ -37,14 +39,28 @@ class NullTypeIterator { public function new() {} - public function hasNext():Bool return false - public function next():FieldHash return null + public function hasNext():Bool + { + return false; + } + + public function next():FieldHash + { + return null; + } } class NullFieldIterator { public function new() {} - public function hasNext():Bool return false - public function next():InspectedField return null + public function hasNext():Bool + { + return false; + } + + public function next():InspectedField + { + return null; + } } diff --git a/src/dust/inspector/data/TypeHash.hx b/src/dust/inspector/data/TypeHash.hx index c55506d..504a97c 100644 --- a/src/dust/inspector/data/TypeHash.hx +++ b/src/dust/inspector/data/TypeHash.hx @@ -1,3 +1,3 @@ package dust.inspector.data; -typedef TypeHash = IntHash; \ No newline at end of file +typedef TypeHash = Map; \ No newline at end of file diff --git a/src/dust/interactive/data/TouchInteractive.hx b/src/dust/interactive/data/TouchInteractive.hx index 0878537..12d153a 100644 --- a/src/dust/interactive/data/TouchInteractive.hx +++ b/src/dust/interactive/data/TouchInteractive.hx @@ -9,5 +9,9 @@ typedef TouchInteractiveResponse = {isAtPosition:Bool, distance:Float}; interface TouchInteractive { function isAtPosition(entity:Entity, mouse:Position):TouchInteractiveResponse; - function draw(entity:Entity, graphics:Graphics):Void; } + +interface DrawableTouchInteractive extends TouchInteractive +{ + function draw(entity:Entity, graphics:Graphics):Void; +} \ No newline at end of file diff --git a/src/dust/lists/PooledList.hx b/src/dust/lists/PooledList.hx index e69fc3c..7e319e2 100644 --- a/src/dust/lists/PooledList.hx +++ b/src/dust/lists/PooledList.hx @@ -1,5 +1,6 @@ package dust.lists; +import dust.pooling.data.Pool; import dust.lists.LinkedListItem; import dust.lists.LinkedList; diff --git a/src/dust/multitouch/systems/MouseTouchSystem.hx b/src/dust/multitouch/systems/MouseTouchSystem.hx index 51fdbbc..8faf4ca 100644 --- a/src/dust/multitouch/systems/MouseTouchSystem.hx +++ b/src/dust/multitouch/systems/MouseTouchSystem.hx @@ -1,7 +1,7 @@ package dust.multitouch.systems; import dust.app.data.App; -import dust.lists.Pool; +import dust.pooling.data.Pool; import dust.lists.LinkedList; import dust.lists.PooledList; import dust.systems.System; diff --git a/src/dust/multitouch/systems/MultiTouchSystem.hx b/src/dust/multitouch/systems/MultiTouchSystem.hx index 66cd065..27fab5a 100644 --- a/src/dust/multitouch/systems/MultiTouchSystem.hx +++ b/src/dust/multitouch/systems/MultiTouchSystem.hx @@ -4,7 +4,7 @@ import dust.multitouch.data.DragZoomGesture; import dust.multitouch.data.Touch; import flash.display.Sprite; import flash.display.Stage; -import dust.lists.Pool; +import dust.pooling.data.Pool; import dust.lists.LinkedList; import dust.lists.PooledList; import dust.multitouch.control.Touches; diff --git a/src/dust/multitouch/systems/PaintTouchesSystem.hx b/src/dust/multitouch/systems/PaintTouchesSystem.hx index 30df180..7711e5c 100644 --- a/src/dust/multitouch/systems/PaintTouchesSystem.hx +++ b/src/dust/multitouch/systems/PaintTouchesSystem.hx @@ -4,7 +4,7 @@ import flash.display.DisplayObjectContainer; import dust.multitouch.data.Touch; import dust.math.Random; import flash.display.Sprite; -import dust.lists.Pool; +import dust.pooling.data.Pool; import dust.lists.LinkedList; import dust.lists.PooledList; import dust.multitouch.control.Touches; diff --git a/src/dust/pooling/PoolingConfig.hx b/src/dust/pooling/PoolingConfig.hx new file mode 100644 index 0000000..4b92052 --- /dev/null +++ b/src/dust/pooling/PoolingConfig.hx @@ -0,0 +1,21 @@ +package dust.pooling; + +import dust.pooling.system.SimplePoolFactory; +import dust.pooling.system.PoolFactory; +import dust.context.Config; +import dust.context.DependentConfig; + +class PoolingConfig implements DependentConfig +{ + @inject public var injector:Injector; + + public function dependencies():Array> + { + return []; + } + + public function configure() + { + injector.mapSingletonOf(PoolFactory, SimplePoolFactory); + } +} \ No newline at end of file diff --git a/src/dust/lists/Pool.hx b/src/dust/pooling/data/Pool.hx similarity index 98% rename from src/dust/lists/Pool.hx rename to src/dust/pooling/data/Pool.hx index 0498791..28d52d7 100644 --- a/src/dust/lists/Pool.hx +++ b/src/dust/pooling/data/Pool.hx @@ -1,4 +1,4 @@ -package dust.lists; +package dust.pooling.data; using Lambda; diff --git a/src/dust/pooling/data/Pooled.hx b/src/dust/pooling/data/Pooled.hx new file mode 100644 index 0000000..390b846 --- /dev/null +++ b/src/dust/pooling/data/Pooled.hx @@ -0,0 +1,6 @@ +package dust.pooling.data; + +interface Pooled +{ + public function release():Void; +} diff --git a/src/dust/pooling/system/PoolFactory.hx b/src/dust/pooling/system/PoolFactory.hx new file mode 100644 index 0000000..196704f --- /dev/null +++ b/src/dust/pooling/system/PoolFactory.hx @@ -0,0 +1,8 @@ +package dust.pooling.system; + +import dust.pooling.data.Pool; + +interface PoolFactory +{ + function make(count:Int, factory:Void->T):Pool; +} diff --git a/src/dust/pooling/system/SimplePoolFactory.hx b/src/dust/pooling/system/SimplePoolFactory.hx new file mode 100644 index 0000000..c015996 --- /dev/null +++ b/src/dust/pooling/system/SimplePoolFactory.hx @@ -0,0 +1,13 @@ +package dust.pooling.system; + +import dust.pooling.data.Pool; + +class SimplePoolFactory implements PoolFactory +{ + public function make(count:Int, factory:Void->T):Pool + { + var pool = new Pool(factory); + pool.populate(count); + return pool; + } +} diff --git a/test/TestSuite.hx b/test/TestSuite.hx index 80e48cd..593d737 100644 --- a/test/TestSuite.hx +++ b/test/TestSuite.hx @@ -43,11 +43,12 @@ import dust.keys.impl.KeyControlsTest; import dust.keys.KeysConfigTest; import dust.lists.LinkedListTest; import dust.lists.PooledListTest; -import dust.lists.PoolTest; import dust.lists.SimpleListTest; import dust.lists.SortedListTest; import dust.mainmenu.MainMenuConfigTest; import dust.ParentInjectorTest; +import dust.pooling.data.PoolTest; +import dust.pooling.PoolingConfigTest; import dust.position.PositionTest; import dust.quadtree.control.LineSegmentIntersectionTest; import dust.quadtree.data.QuadTreeAtomTest; @@ -130,11 +131,12 @@ class TestSuite extends massive.munit.TestSuite add(dust.keys.KeysConfigTest); add(dust.lists.LinkedListTest); add(dust.lists.PooledListTest); - add(dust.lists.PoolTest); add(dust.lists.SimpleListTest); add(dust.lists.SortedListTest); add(dust.mainmenu.MainMenuConfigTest); add(dust.ParentInjectorTest); + add(dust.pooling.data.PoolTest); + add(dust.pooling.PoolingConfigTest); add(dust.position.PositionTest); add(dust.quadtree.control.LineSegmentIntersectionTest); add(dust.quadtree.data.QuadTreeAtomTest); diff --git a/test/dust/entities/EntityTest.hx b/test/dust/entities/EntityTest.hx index 90f0cd9..8ad214c 100644 --- a/test/dust/entities/EntityTest.hx +++ b/test/dust/entities/EntityTest.hx @@ -4,7 +4,7 @@ import dust.bitfield.MockComponentB; import dust.bitfield.MockComponentA; import dust.bitfield.BitfieldFactory; import dust.entities.Entities; -import dust.lists.Pool; +import dust.pooling.data.Pool; import dust.bitfield.Bitfield; import dust.entities.Entity; import massive.munit.async.AsyncFactory; diff --git a/test/dust/pooling/PoolingConfigTest.hx b/test/dust/pooling/PoolingConfigTest.hx new file mode 100644 index 0000000..65321fe --- /dev/null +++ b/test/dust/pooling/PoolingConfigTest.hx @@ -0,0 +1,46 @@ +package dust.pooling; + +import dust.pooling.data.Pool; +import dust.pooling.system.PoolFactory; +import flash.display.Sprite; +import dust.context.Context; + +class PoolingConfigTest +{ + var context:Context; + var factory:PoolFactory; + + function setupContext() + { + context = new Context() + .configure(PoolingConfig) + .start(new Sprite()); + } + + function makePool():Pool + { + factory = context.injector.getInstance(PoolFactory); + return factory.make(100, MockPooledA.make); + } + + @Test public function sanityTest() + { + setupContext(); + } + + @Test public function mapsPoolFactory() + { + setupContext(); + var pool = makePool(); + } +} + +class MockPooledA +{ + public static function make():MockPooledA + { + return new MockPooledA(); + } + + public function new() {} +} \ No newline at end of file diff --git a/test/dust/lists/PoolTest.hx b/test/dust/pooling/data/PoolTest.hx similarity index 90% rename from test/dust/lists/PoolTest.hx rename to test/dust/pooling/data/PoolTest.hx index 73e9b98..a458c0b 100644 --- a/test/dust/lists/PoolTest.hx +++ b/test/dust/pooling/data/PoolTest.hx @@ -1,6 +1,7 @@ -package dust.lists; +package dust.pooling.data; -import dust.lists.Pool; +import dust.lists.MockData; +import dust.pooling.data.Pool; import massive.munit.async.AsyncFactory; class PoolTest