cyberarm_engine 0.24.3 → 0.24.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (93) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +8 -8
  3. data/.rubocop.yml +7 -7
  4. data/.travis.yml +5 -5
  5. data/Gemfile +6 -6
  6. data/Gemfile.lock +24 -0
  7. data/LICENSE.txt +21 -21
  8. data/README.md +74 -74
  9. data/Rakefile +10 -10
  10. data/assets/shaders/fragment/g_buffer.glsl +30 -30
  11. data/assets/shaders/fragment/lighting.glsl +115 -69
  12. data/assets/shaders/include/light_struct.glsl +11 -11
  13. data/assets/shaders/include/material_struct.glsl +16 -16
  14. data/assets/shaders/vertex/g_buffer.glsl +28 -28
  15. data/assets/shaders/vertex/lighting.glsl +24 -24
  16. data/bin/console +14 -14
  17. data/bin/setup +8 -8
  18. data/cyberarm_engine.gemspec +36 -36
  19. data/lib/cyberarm_engine/animator.rb +219 -219
  20. data/lib/cyberarm_engine/background.rb +180 -179
  21. data/lib/cyberarm_engine/background_image.rb +93 -93
  22. data/lib/cyberarm_engine/background_nine_slice.rb +142 -142
  23. data/lib/cyberarm_engine/bounding_box.rb +150 -150
  24. data/lib/cyberarm_engine/builtin/intro_state.rb +130 -130
  25. data/lib/cyberarm_engine/cache/download_manager.rb +123 -123
  26. data/lib/cyberarm_engine/cache.rb +4 -4
  27. data/lib/cyberarm_engine/common.rb +128 -128
  28. data/lib/cyberarm_engine/config_file.rb +46 -46
  29. data/lib/cyberarm_engine/console/command.rb +157 -157
  30. data/lib/cyberarm_engine/console/commands/help_command.rb +43 -43
  31. data/lib/cyberarm_engine/console/subcommand.rb +99 -99
  32. data/lib/cyberarm_engine/console.rb +248 -248
  33. data/lib/cyberarm_engine/game_object.rb +244 -244
  34. data/lib/cyberarm_engine/game_state.rb +124 -124
  35. data/lib/cyberarm_engine/gosu_ext/draw_arc.rb +97 -97
  36. data/lib/cyberarm_engine/gosu_ext/draw_circle.rb +30 -30
  37. data/lib/cyberarm_engine/gosu_ext/draw_path.rb +17 -17
  38. data/lib/cyberarm_engine/model/material.rb +21 -21
  39. data/lib/cyberarm_engine/model/{model_object.rb → mesh.rb} +131 -131
  40. data/lib/cyberarm_engine/model/parser.rb +74 -74
  41. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -138
  42. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -154
  43. data/lib/cyberarm_engine/model.rb +216 -213
  44. data/lib/cyberarm_engine/model_cache.rb +31 -31
  45. data/lib/cyberarm_engine/notification.rb +82 -82
  46. data/lib/cyberarm_engine/notification_manager.rb +241 -241
  47. data/lib/cyberarm_engine/opengl/light.rb +52 -50
  48. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -46
  49. data/lib/cyberarm_engine/opengl/perspective_camera.rb +41 -38
  50. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -249
  51. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +167 -165
  52. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +307 -304
  53. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +33 -33
  54. data/lib/cyberarm_engine/opengl/shader.rb +408 -406
  55. data/lib/cyberarm_engine/opengl/texture.rb +69 -69
  56. data/lib/cyberarm_engine/opengl.rb +53 -40
  57. data/lib/cyberarm_engine/ray.rb +56 -56
  58. data/lib/cyberarm_engine/stats.rb +200 -200
  59. data/lib/cyberarm_engine/text.rb +260 -260
  60. data/lib/cyberarm_engine/timer.rb +23 -23
  61. data/lib/cyberarm_engine/transform.rb +296 -296
  62. data/lib/cyberarm_engine/trees/aabb_node.rb +126 -0
  63. data/lib/cyberarm_engine/trees/aabb_tree.rb +55 -0
  64. data/lib/cyberarm_engine/trees/aabb_tree_debug.rb +29 -0
  65. data/lib/cyberarm_engine/ui/border_canvas.rb +102 -102
  66. data/lib/cyberarm_engine/ui/dsl.rb +142 -142
  67. data/lib/cyberarm_engine/ui/element.rb +662 -662
  68. data/lib/cyberarm_engine/ui/elements/button.rb +100 -100
  69. data/lib/cyberarm_engine/ui/elements/check_box.rb +54 -54
  70. data/lib/cyberarm_engine/ui/elements/container.rb +404 -410
  71. data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -179
  72. data/lib/cyberarm_engine/ui/elements/edit_line.rb +297 -297
  73. data/lib/cyberarm_engine/ui/elements/flow.rb +15 -15
  74. data/lib/cyberarm_engine/ui/elements/image.rb +72 -72
  75. data/lib/cyberarm_engine/ui/elements/list_box.rb +79 -79
  76. data/lib/cyberarm_engine/ui/elements/menu.rb +27 -27
  77. data/lib/cyberarm_engine/ui/elements/menu_item.rb +6 -6
  78. data/lib/cyberarm_engine/ui/elements/progress.rb +93 -93
  79. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -6
  80. data/lib/cyberarm_engine/ui/elements/slider.rb +107 -107
  81. data/lib/cyberarm_engine/ui/elements/stack.rb +11 -11
  82. data/lib/cyberarm_engine/ui/elements/text_block.rb +216 -216
  83. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +67 -67
  84. data/lib/cyberarm_engine/ui/event.rb +54 -54
  85. data/lib/cyberarm_engine/ui/gui_state.rb +321 -321
  86. data/lib/cyberarm_engine/ui/style.rb +50 -50
  87. data/lib/cyberarm_engine/ui/theme.rb +225 -225
  88. data/lib/cyberarm_engine/vector.rb +312 -312
  89. data/lib/cyberarm_engine/version.rb +4 -4
  90. data/lib/cyberarm_engine/window.rb +195 -195
  91. data/lib/cyberarm_engine.rb +70 -78
  92. data/mrbgem.rake +29 -29
  93. metadata +8 -7
@@ -0,0 +1,126 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CyberarmEngine
4
+ class AABBTree
5
+ class AABBNode
6
+ attr_accessor :bounding_box, :parent, :object
7
+ attr_reader :a, :b
8
+
9
+ def initialize(parent:, object:, bounding_box:)
10
+ @parent = parent
11
+ @object = object
12
+ @bounding_box = bounding_box
13
+
14
+ @a = nil
15
+ @b = nil
16
+ end
17
+
18
+ def a=(leaf)
19
+ @a = leaf
20
+ @a.parent = self
21
+ end
22
+
23
+ def b=(leaf)
24
+ @b = leaf
25
+ @b.parent = self
26
+ end
27
+
28
+ def leaf?
29
+ @object
30
+ end
31
+
32
+ def insert_subtree(leaf)
33
+ if leaf?
34
+ new_node = AABBNode.new(parent: nil, object: nil, bounding_box: @bounding_box.union(leaf.bounding_box))
35
+
36
+ new_node.a = self
37
+ new_node.b = leaf
38
+
39
+ new_node
40
+ else
41
+ cost_a = @a.bounding_box.volume + @b.bounding_box.union(leaf.bounding_box).volume
42
+ cost_b = @b.bounding_box.volume + @a.bounding_box.union(leaf.bounding_box).volume
43
+
44
+ if cost_a == cost_b
45
+ cost_a = @a.proximity(leaf)
46
+ cost_b = @b.proximity(leaf)
47
+ end
48
+
49
+ if cost_b < cost_a
50
+ self.b = @b.insert_subtree(leaf)
51
+ else
52
+ self.a = @a.insert_subtree(leaf)
53
+ end
54
+
55
+ @bounding_box = @bounding_box.union(leaf.bounding_box)
56
+
57
+ self
58
+ end
59
+ end
60
+
61
+ def search_subtree(collider, items = [])
62
+ if @bounding_box.intersect?(collider)
63
+ if leaf?
64
+ items << self
65
+ else
66
+ @a.search_subtree(collider, items)
67
+ @b.search_subtree(collider, items)
68
+ end
69
+ end
70
+
71
+ items
72
+ end
73
+
74
+ def remove_subtree(leaf)
75
+ if leaf
76
+ self
77
+ elsif leaf.parent == self
78
+ other_child = other(leaf)
79
+ other_child.parent = @parent
80
+ other_child
81
+ else
82
+ leaf.parent.disown_child(leaf)
83
+ self
84
+ end
85
+ end
86
+
87
+ def other(leaf)
88
+ @a == leaf ? @b : @a
89
+ end
90
+
91
+ def disown_child(leaf)
92
+ value = other(leaf)
93
+ raise "Can not replace child of a leaf!" if @parent.leaf?
94
+ raise "Node is not a child of parent!" unless leaf.child_of?(@parent)
95
+
96
+ if @parent.a == self
97
+ @parent.a = value
98
+ else
99
+ @parent.b = value
100
+ end
101
+
102
+ @parent.update_bounding_box
103
+ end
104
+
105
+ def child_of?(leaf)
106
+ self == leaf.a || self == leaf.b
107
+ end
108
+
109
+ def proximity(leaf)
110
+ (@bounding_box - leaf.bounding_box).sum.abs
111
+ end
112
+
113
+ def update_bounding_box
114
+ node = self
115
+
116
+ unless node.leaf?
117
+ node.bounding_box = node.a.bounding_box.union(node.b.bounding_box)
118
+
119
+ while (node = node.parent)
120
+ node.bounding_box = node.a.bounding_box.union(node.b.bounding_box)
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CyberarmEngine
4
+ class AABBTree
5
+ include AABBTreeDebug
6
+
7
+ attr_reader :root, :objects, :branches, :leaves
8
+
9
+ def initialize
10
+ @objects = {}
11
+ @root = nil
12
+ @branches = 0
13
+ @leaves = 0
14
+ end
15
+
16
+ def insert(object, bounding_box)
17
+ raise "BoundingBox can't be nil!" unless bounding_box
18
+ raise "Object can't be nil!" unless object
19
+ # raise "Object already in tree!" if @objects[object] # FIXME
20
+
21
+ leaf = AABBNode.new(parent: nil, object: object, bounding_box: bounding_box.dup)
22
+ @objects[object] = leaf
23
+
24
+ insert_leaf(leaf)
25
+ end
26
+
27
+ def insert_leaf(leaf)
28
+ @root = @root ? @root.insert_subtree(leaf) : leaf
29
+ end
30
+
31
+ def update(object, bounding_box)
32
+ leaf = remove(object)
33
+ leaf.bounding_box = bounding_box
34
+ insert_leaf(leaf)
35
+ end
36
+
37
+ # Returns a list of all objects that collided with collider
38
+ def search(collider, return_nodes = false)
39
+ items = []
40
+ if @root
41
+ items = @root.search_subtree(collider)
42
+ items.map!(&:object) unless return_nodes
43
+ end
44
+
45
+ items
46
+ end
47
+
48
+ def remove(object)
49
+ leaf = @objects.delete(object)
50
+ @root = @root.remove_subtree(leaf) if leaf
51
+
52
+ leaf
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module CyberarmEngine
4
+ # Gets included into AABBTree
5
+ module AABBTreeDebug
6
+ def inspect
7
+ @branches = 0
8
+ @leaves = 0
9
+ if @root
10
+ node = @root
11
+
12
+ debug_search(node.a)
13
+ debug_search(node.b)
14
+ end
15
+
16
+ puts "<#{self.class}:#{object_id}> has #{@branches} branches and #{@leaves} leaves"
17
+ end
18
+
19
+ def debug_search(node)
20
+ if node.leaf?
21
+ @leaves += 1
22
+ else
23
+ @branches += 1
24
+ debug_search(node.a)
25
+ debug_search(node.b)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,102 +1,102 @@
1
- module CyberarmEngine
2
- class BorderCanvas
3
- attr_reader :element, :top, :right, :bottom, :left
4
-
5
- def initialize(element:)
6
- @element = element
7
-
8
- @top = Background.new
9
- @right = Background.new
10
- @bottom = Background.new
11
- @left = Background.new
12
- end
13
-
14
- def color=(color)
15
- if color.is_a?(Numeric)
16
- @top.background = color
17
- @right.background = color
18
- @bottom.background = color
19
- @left.background = color
20
-
21
- elsif color.is_a?(Gosu::Color)
22
- @top.background = color
23
- @right.background = color
24
- @bottom.background = color
25
- @left.background = color
26
-
27
- elsif color.is_a?(Array)
28
- if color.size == 1
29
- color = color.first
30
-
31
- elsif color.size == 2
32
- @top.background = color.first
33
- @right.background = color.first
34
- @bottom.background = color.last
35
- @left.background = color.last
36
-
37
- elsif color.size == 4
38
- @top.background = color[0]
39
- @right.background = color[1]
40
- @bottom.background = color[2]
41
- @left.background = color[3]
42
- else
43
- raise ArgumentError, "color array was empty or had wrong number of elements (expected 2 or 4 elements)"
44
- end
45
-
46
- elsif color.is_a?(Hash)
47
- @top.background = color[:top]
48
- @right.background = color[:right]
49
- @bottom.background = color[:bottom]
50
- @left.background = color[:left]
51
- else
52
- raise ArgumentError, "color '#{color}' of type '#{color.class}' was not able to be processed"
53
- end
54
- end
55
-
56
- def draw
57
- @top.draw
58
- @right.draw
59
- @bottom.draw
60
- @left.draw
61
- end
62
-
63
- def update
64
- # TOP
65
- @top.x = @element.x + @element.style.border_thickness_left
66
- @top.y = @element.y
67
- @top.z = @element.z
68
-
69
- @top.width = @element.width - @element.style.border_thickness_left
70
- @top.height = @element.style.border_thickness_top
71
-
72
- # RIGHT
73
- @right.x = @element.x + @element.width
74
- @right.y = @element.y + @element.style.border_thickness_top
75
- @right.z = @element.z
76
-
77
- @right.width = -@element.style.border_thickness_right
78
- @right.height = @element.height - @element.style.border_thickness_top
79
-
80
- # BOTTOM
81
- @bottom.x = @element.x
82
- @bottom.y = @element.y + @element.height
83
- @bottom.z = @element.z
84
-
85
- @bottom.width = @element.width - @element.style.border_thickness_right
86
- @bottom.height = -@element.style.border_thickness_bottom
87
-
88
- # LEFT
89
- @left.x = @element.x
90
- @left.y = @element.y
91
- @left.z = @element.z
92
-
93
- @left.width = @element.style.border_thickness_left
94
- @left.height = @element.height - @element.style.border_thickness_bottom
95
-
96
- @top.update
97
- @right.update
98
- @bottom.update
99
- @left.update
100
- end
101
- end
102
- end
1
+ module CyberarmEngine
2
+ class BorderCanvas
3
+ attr_reader :element, :top, :right, :bottom, :left
4
+
5
+ def initialize(element:)
6
+ @element = element
7
+
8
+ @top = Background.new
9
+ @right = Background.new
10
+ @bottom = Background.new
11
+ @left = Background.new
12
+ end
13
+
14
+ def color=(color)
15
+ if color.is_a?(Numeric)
16
+ @top.background = color
17
+ @right.background = color
18
+ @bottom.background = color
19
+ @left.background = color
20
+
21
+ elsif color.is_a?(Gosu::Color)
22
+ @top.background = color
23
+ @right.background = color
24
+ @bottom.background = color
25
+ @left.background = color
26
+
27
+ elsif color.is_a?(Array)
28
+ if color.size == 1
29
+ color = color.first
30
+
31
+ elsif color.size == 2
32
+ @top.background = color.first
33
+ @right.background = color.first
34
+ @bottom.background = color.last
35
+ @left.background = color.last
36
+
37
+ elsif color.size == 4
38
+ @top.background = color[0]
39
+ @right.background = color[1]
40
+ @bottom.background = color[2]
41
+ @left.background = color[3]
42
+ else
43
+ raise ArgumentError, "color array was empty or had wrong number of elements (expected 2 or 4 elements)"
44
+ end
45
+
46
+ elsif color.is_a?(Hash)
47
+ @top.background = color[:top]
48
+ @right.background = color[:right]
49
+ @bottom.background = color[:bottom]
50
+ @left.background = color[:left]
51
+ else
52
+ raise ArgumentError, "color '#{color}' of type '#{color.class}' was not able to be processed"
53
+ end
54
+ end
55
+
56
+ def draw
57
+ @top.draw
58
+ @right.draw
59
+ @bottom.draw
60
+ @left.draw
61
+ end
62
+
63
+ def update
64
+ # TOP
65
+ @top.x = @element.x + @element.style.border_thickness_left
66
+ @top.y = @element.y
67
+ @top.z = @element.z
68
+
69
+ @top.width = @element.width - @element.style.border_thickness_left
70
+ @top.height = @element.style.border_thickness_top
71
+
72
+ # RIGHT
73
+ @right.x = @element.x + @element.width
74
+ @right.y = @element.y + @element.style.border_thickness_top
75
+ @right.z = @element.z
76
+
77
+ @right.width = -@element.style.border_thickness_right
78
+ @right.height = @element.height - @element.style.border_thickness_top
79
+
80
+ # BOTTOM
81
+ @bottom.x = @element.x
82
+ @bottom.y = @element.y + @element.height
83
+ @bottom.z = @element.z
84
+
85
+ @bottom.width = @element.width - @element.style.border_thickness_right
86
+ @bottom.height = -@element.style.border_thickness_bottom
87
+
88
+ # LEFT
89
+ @left.x = @element.x
90
+ @left.y = @element.y
91
+ @left.z = @element.z
92
+
93
+ @left.width = @element.style.border_thickness_left
94
+ @left.height = @element.height - @element.style.border_thickness_bottom
95
+
96
+ @top.update
97
+ @right.update
98
+ @bottom.update
99
+ @left.update
100
+ end
101
+ end
102
+ end