Class: CyberarmEngine::AABBTree

Inherits:
Object
  • Object
show all
Includes:
AABBTreeDebug
Defined in:
lib/cyberarm_engine/trees/aabb_node.rb,
lib/cyberarm_engine/trees/aabb_tree.rb

Defined Under Namespace

Classes: AABBNode

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from AABBTreeDebug

#debug_search, #inspect

Constructor Details

#initializeAABBTree

Returns a new instance of AABBTree.



9
10
11
12
13
14
# File 'lib/cyberarm_engine/trees/aabb_tree.rb', line 9

def initialize
  @objects = {}
  @root = nil
  @branches = 0
  @leaves   = 0
end

Instance Attribute Details

#branchesObject (readonly)

Returns the value of attribute branches.



7
8
9
# File 'lib/cyberarm_engine/trees/aabb_tree.rb', line 7

def branches
  @branches
end

#leavesObject (readonly)

Returns the value of attribute leaves.



7
8
9
# File 'lib/cyberarm_engine/trees/aabb_tree.rb', line 7

def leaves
  @leaves
end

#objectsObject (readonly)

Returns the value of attribute objects.



7
8
9
# File 'lib/cyberarm_engine/trees/aabb_tree.rb', line 7

def objects
  @objects
end

#rootObject (readonly)

Returns the value of attribute root.



7
8
9
# File 'lib/cyberarm_engine/trees/aabb_tree.rb', line 7

def root
  @root
end

Instance Method Details

#insert(object, bounding_box) ⇒ Object



16
17
18
19
20
21
22
23
24
25
# File 'lib/cyberarm_engine/trees/aabb_tree.rb', line 16

def insert(object, bounding_box)
  raise "BoundingBox can't be nil!" unless bounding_box
  raise "Object can't be nil!" unless object
  # raise "Object already in tree!" if @objects[object] # FIXME

  leaf = AABBNode.new(parent: nil, object: object, bounding_box: bounding_box.dup)
  @objects[object] = leaf

  insert_leaf(leaf)
end

#insert_leaf(leaf) ⇒ Object



27
28
29
# File 'lib/cyberarm_engine/trees/aabb_tree.rb', line 27

def insert_leaf(leaf)
  @root = @root ? @root.insert_subtree(leaf) : leaf
end

#remove(object) ⇒ Object



48
49
50
51
52
53
# File 'lib/cyberarm_engine/trees/aabb_tree.rb', line 48

def remove(object)
  leaf  = @objects.delete(object)
  @root = @root.remove_subtree(leaf) if leaf

  leaf
end

#search(collider, return_nodes = false) ⇒ Object

Returns a list of all objects that collided with collider



38
39
40
41
42
43
44
45
46
# File 'lib/cyberarm_engine/trees/aabb_tree.rb', line 38

def search(collider, return_nodes = false)
  items = []
  if @root
    items = @root.search_subtree(collider)
    items.map!(&:object) unless return_nodes
  end

  items
end

#update(object, bounding_box) ⇒ Object



31
32
33
34
35
# File 'lib/cyberarm_engine/trees/aabb_tree.rb', line 31

def update(object, bounding_box)
  leaf = remove(object)
  leaf.bounding_box = bounding_box
  insert_leaf(leaf)
end