cyberarm_engine 0.12.0 → 0.15.0

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -0
  3. data/Gemfile +1 -1
  4. data/README.md +33 -3
  5. data/Rakefile +1 -1
  6. data/assets/textures/default.png +0 -0
  7. data/cyberarm_engine.gemspec +11 -8
  8. data/lib/cyberarm_engine.rb +24 -4
  9. data/lib/cyberarm_engine/animator.rb +56 -0
  10. data/lib/cyberarm_engine/background.rb +19 -15
  11. data/lib/cyberarm_engine/background_nine_slice.rb +125 -0
  12. data/lib/cyberarm_engine/bounding_box.rb +18 -18
  13. data/lib/cyberarm_engine/cache.rb +4 -0
  14. data/lib/cyberarm_engine/cache/download_manager.rb +121 -0
  15. data/lib/cyberarm_engine/common.rb +16 -16
  16. data/lib/cyberarm_engine/config_file.rb +46 -0
  17. data/lib/cyberarm_engine/game_object.rb +63 -72
  18. data/lib/cyberarm_engine/game_state.rb +7 -4
  19. data/lib/cyberarm_engine/model.rb +207 -0
  20. data/lib/cyberarm_engine/model/material.rb +21 -0
  21. data/lib/cyberarm_engine/model/model_object.rb +131 -0
  22. data/lib/cyberarm_engine/model/parser.rb +74 -0
  23. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -0
  24. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -0
  25. data/lib/cyberarm_engine/model_cache.rb +31 -0
  26. data/lib/cyberarm_engine/opengl.rb +28 -0
  27. data/lib/cyberarm_engine/opengl/light.rb +50 -0
  28. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -0
  29. data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -0
  30. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -0
  31. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -0
  32. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +289 -0
  33. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -0
  34. data/lib/cyberarm_engine/opengl/shader.rb +406 -0
  35. data/lib/cyberarm_engine/opengl/texture.rb +69 -0
  36. data/lib/cyberarm_engine/ray.rb +5 -5
  37. data/lib/cyberarm_engine/stats.rb +21 -0
  38. data/lib/cyberarm_engine/text.rb +45 -31
  39. data/lib/cyberarm_engine/timer.rb +1 -1
  40. data/lib/cyberarm_engine/transform.rb +221 -9
  41. data/lib/cyberarm_engine/ui/border_canvas.rb +4 -3
  42. data/lib/cyberarm_engine/ui/dsl.rb +68 -50
  43. data/lib/cyberarm_engine/ui/element.rb +57 -18
  44. data/lib/cyberarm_engine/ui/elements/button.rb +86 -16
  45. data/lib/cyberarm_engine/ui/elements/check_box.rb +24 -32
  46. data/lib/cyberarm_engine/ui/elements/container.rb +88 -24
  47. data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -0
  48. data/lib/cyberarm_engine/ui/elements/edit_line.rb +180 -27
  49. data/lib/cyberarm_engine/ui/elements/flow.rb +1 -3
  50. data/lib/cyberarm_engine/ui/elements/image.rb +12 -9
  51. data/lib/cyberarm_engine/ui/elements/label.rb +96 -15
  52. data/lib/cyberarm_engine/ui/elements/list_box.rb +68 -0
  53. data/lib/cyberarm_engine/ui/elements/progress.rb +6 -5
  54. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -0
  55. data/lib/cyberarm_engine/ui/elements/slider.rb +104 -0
  56. data/lib/cyberarm_engine/ui/elements/stack.rb +1 -3
  57. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +40 -31
  58. data/lib/cyberarm_engine/ui/event.rb +8 -7
  59. data/lib/cyberarm_engine/ui/gui_state.rb +89 -6
  60. data/lib/cyberarm_engine/ui/style.rb +10 -9
  61. data/lib/cyberarm_engine/ui/theme.rb +39 -21
  62. data/lib/cyberarm_engine/vector.rb +132 -38
  63. data/lib/cyberarm_engine/version.rb +2 -2
  64. data/lib/cyberarm_engine/{engine.rb → window.rb} +30 -19
  65. metadata +87 -16
  66. data/lib/cyberarm_engine/shader.rb +0 -205
@@ -1,6 +1,7 @@
1
1
  module CyberarmEngine
2
2
  class BorderCanvas
3
3
  attr_reader :element, :top, :right, :bottom, :left
4
+
4
5
  def initialize(element:)
5
6
  @element = element
6
7
 
@@ -25,7 +26,7 @@ module CyberarmEngine
25
26
 
26
27
  elsif color.is_a?(Array)
27
28
  if color.size == 1
28
- color=color.first
29
+ color = color.first
29
30
 
30
31
  elsif color.size == 2
31
32
  @top.background = color.first
@@ -61,7 +62,7 @@ module CyberarmEngine
61
62
 
62
63
  def update
63
64
  # TOP
64
- @top.x = @element.x# + @element.border_thickness_left
65
+ @top.x = @element.x # + @element.border_thickness_left
65
66
  @top.y = @element.y
66
67
  @top.z = @element.z
67
68
 
@@ -98,4 +99,4 @@ module CyberarmEngine
98
99
  @left.update
99
100
  end
100
101
  end
101
- end
102
+ end
@@ -1,102 +1,120 @@
1
1
  module CyberarmEngine
2
2
  module DSL
3
3
  def flow(options = {}, &block)
4
- options[:parent] = @containers.last
5
- options[:theme] = current_theme
6
- _container = Element::Flow.new(options, block)
7
- @containers << _container
8
- _container.build
9
- _container.parent.add(_container)
10
- @containers.pop
11
-
12
- return _container
4
+ container(CyberarmEngine::Element::Flow, options, &block)
13
5
  end
14
6
 
15
7
  def stack(options = {}, &block)
16
- options[:parent] = @containers.last
17
- options[:theme] = current_theme
18
- _container = Element::Stack.new(options, block)
19
- @containers << _container
20
- _container.build
21
- _container.parent.add(_container)
22
- @containers.pop
23
-
24
- return _container
8
+ container(CyberarmEngine::Element::Stack, options, &block)
25
9
  end
26
10
 
27
11
  def label(text, options = {}, &block)
28
- options[:parent] = @containers.last
12
+ options[:parent] = element_parent
29
13
  options[:theme] = current_theme
30
- _element = Element::Label.new(text, options, block)
31
- @containers.last.add(_element)
32
14
 
33
- return _element
15
+ add_element(Element::Label.new(text, options, block))
34
16
  end
35
17
 
36
18
  def button(text, options = {}, &block)
37
- options[:parent] = @containers.last
19
+ options[:parent] = element_parent
20
+ options[:theme] = current_theme
21
+
22
+ add_element(Element::Button.new(text, options, block) { block.call if block.is_a?(Proc) })
23
+ end
24
+
25
+ def list_box(options = {}, &block)
26
+ options[:parent] = element_parent
38
27
  options[:theme] = current_theme
39
- _element = Element::Button.new(text, options, block) { if block.is_a?(Proc); block.call; end }
40
- @containers.last.add(_element)
41
28
 
42
- return _element
29
+ add_element(Element::ListBox.new(options, block) { block.call if block.is_a?(Proc) })
43
30
  end
44
31
 
45
32
  def edit_line(text, options = {}, &block)
46
- options[:parent] = @containers.last
33
+ options[:parent] = element_parent
47
34
  options[:theme] = current_theme
48
- _element = Element::EditLine.new(text, options, block)
49
- @containers.last.add(_element)
50
35
 
51
- return _element
36
+ add_element(Element::EditLine.new(text, options, block))
37
+ end
38
+
39
+ def edit_box(text, options = {}, &block)
40
+ options[:parent] = element_parent
41
+ options[:theme] = current_theme
42
+
43
+ add_element(Element::EditBox.new(text, options, block))
52
44
  end
53
45
 
54
46
  def toggle_button(options = {}, &block)
55
- options[:parent] = @containers.last
47
+ options[:parent] = element_parent
56
48
  options[:theme] = current_theme
57
- _element = Element::ToggleButton.new(options, block)
58
- @containers.last.add(_element)
59
49
 
60
- return _element
50
+ add_element(Element::ToggleButton.new(options, block))
61
51
  end
62
52
 
63
53
  def check_box(text, options = {}, &block)
64
- options[:parent] = @containers.last
54
+ options[:parent] = element_parent
65
55
  options[:theme] = current_theme
66
- _element = Element::CheckBox.new(text, options, block)
67
- @containers.last.add(_element)
68
56
 
69
- return _element
57
+ add_element(Element::CheckBox.new(text, options, block))
70
58
  end
71
59
 
72
60
  def image(path, options = {}, &block)
73
- options[:parent] = @containers.last
61
+ options[:parent] = element_parent
74
62
  options[:theme] = current_theme
75
- _element = Element::Image.new(path, options, block)
76
- @containers.last.add(_element)
77
63
 
78
- return _element
64
+ add_element(Element::Image.new(path, options, block))
79
65
  end
80
66
 
81
67
  def progress(options = {}, &block)
82
- options[:parent] = @containers.last
68
+ options[:parent] = element_parent
83
69
  options[:theme] = current_theme
84
- _element = Element::Progress.new(options, block)
85
- @containers.last.add(_element)
86
70
 
87
- return _element
71
+ add_element(Element::Progress.new(options, block))
72
+ end
73
+
74
+ def slider(options = {}, &block)
75
+ options[:parent] = element_parent
76
+ options[:theme] = current_theme
77
+
78
+ add_element(Element::Slider.new(options, block))
88
79
  end
89
80
 
90
81
  def background(color = Gosu::Color::NONE)
91
- @containers.last.style.background = color
82
+ element_parent.style.background = color
92
83
  end
93
84
 
94
85
  def theme(theme)
95
- @containers.last.options[:theme] = theme
86
+ element_parent.options[:theme] = theme
96
87
  end
97
88
 
98
89
  def current_theme
99
- @containers.last.options[:theme]
90
+ element_parent.options[:theme]
91
+ end
92
+
93
+ private def add_element(element)
94
+ element_parent.add(element)
95
+
96
+ element
97
+ end
98
+
99
+ private def element_parent
100
+ $__current_container__
101
+ end
102
+
103
+ private def container(klass, options = {}, &block)
104
+ options[:parent] = element_parent
105
+ options[:theme] = current_theme
106
+
107
+ _container = klass.new(options, block)
108
+
109
+ old_parent = element_parent
110
+ $__current_container__ = _container
111
+
112
+ _container.build
113
+ _container.parent.add(_container)
114
+
115
+ $__current_container__ = old_parent
116
+
117
+ _container
100
118
  end
101
119
  end
102
- end
120
+ end
@@ -4,7 +4,7 @@ module CyberarmEngine
4
4
  include Event
5
5
  include Common
6
6
 
7
- attr_accessor :x, :y, :z, :enabled
7
+ attr_accessor :x, :y, :z, :enabled, :tip
8
8
  attr_reader :parent, :options, :style, :event_handler, :background_canvas, :border_canvas
9
9
 
10
10
  def initialize(options = {}, block = nil)
@@ -16,9 +16,13 @@ module CyberarmEngine
16
16
  @focus = false
17
17
  @enabled = true
18
18
  @visible = true
19
+ @tip = @options[:tip] || ""
19
20
 
20
21
  @style = Style.new(options)
21
22
 
23
+ @root ||= nil
24
+ @gui_state ||= nil
25
+
22
26
  @x = @style.x
23
27
  @y = @style.y
24
28
  @z = @style.z
@@ -26,9 +30,6 @@ module CyberarmEngine
26
30
  @width = 0
27
31
  @height = 0
28
32
 
29
- @fixed_x = @x if @x != 0
30
- @fixed_y = @y if @y != 0
31
-
32
33
  @style.width = default(:width) || nil
33
34
  @style.height = default(:height) || nil
34
35
 
@@ -41,6 +42,7 @@ module CyberarmEngine
41
42
  end
42
43
 
43
44
  def stylize
45
+ set_static_position
44
46
  set_border_thickness(@style.border_thickness)
45
47
 
46
48
  set_padding(@style.padding)
@@ -51,6 +53,11 @@ module CyberarmEngine
51
53
  set_border_color(@style.border_color)
52
54
  end
53
55
 
56
+ def set_static_position
57
+ @x = @style.x if @style.x != 0
58
+ @y = @style.y if @style.y != 0
59
+ end
60
+
54
61
  def set_background(background)
55
62
  @style.background = background
56
63
  @style.background_canvas.background = background
@@ -95,7 +102,7 @@ module CyberarmEngine
95
102
  end
96
103
 
97
104
  def default_events
98
- [:left, :middle, :right].each do |button|
105
+ %i[left middle right].each do |button|
99
106
  event(:"#{button}_mouse_button")
100
107
  event(:"released_#{button}_mouse_button")
101
108
  event(:"clicked_#{button}_mouse_button")
@@ -110,6 +117,8 @@ module CyberarmEngine
110
117
  event(:leave)
111
118
 
112
119
  event(:blur)
120
+
121
+ event(:changed)
113
122
  end
114
123
 
115
124
  def enabled?
@@ -126,21 +135,26 @@ module CyberarmEngine
126
135
  end
127
136
 
128
137
  def show
138
+ bool = visible?
129
139
  @visible = true
130
- root.gui_state.request_recalculate
140
+ root.gui_state.request_recalculate unless bool
131
141
  end
132
142
 
133
143
  def hide
144
+ bool = visible?
134
145
  @visible = false
135
- root.gui_state.request_recalculate
146
+ root.gui_state.request_recalculate if bool
136
147
  end
137
148
 
138
149
  def draw
139
- return unless @visible
150
+ return unless visible?
140
151
 
141
152
  @style.background_canvas.draw
142
153
  @style.border_canvas.draw
143
- render
154
+
155
+ Gosu.clip_to(@x, @y, width, height) do
156
+ render
157
+ end
144
158
  end
145
159
 
146
160
  def update
@@ -152,12 +166,16 @@ module CyberarmEngine
152
166
  def button_up(id)
153
167
  end
154
168
 
169
+ def draggable?(_button)
170
+ false
171
+ end
172
+
155
173
  def render
156
174
  end
157
175
 
158
176
  def hit?(x, y)
159
177
  x.between?(@x, @x + width) &&
160
- y.between?(@y, @y + height)
178
+ y.between?(@y, @y + height)
161
179
  end
162
180
 
163
181
  def width
@@ -168,6 +186,14 @@ module CyberarmEngine
168
186
  end
169
187
  end
170
188
 
189
+ def content_width
190
+ @width
191
+ end
192
+
193
+ def noncontent_width
194
+ (inner_width + outer_width) - width
195
+ end
196
+
171
197
  def outer_width
172
198
  @style.margin_left + width + @style.margin_right
173
199
  end
@@ -184,6 +210,14 @@ module CyberarmEngine
184
210
  end
185
211
  end
186
212
 
213
+ def content_height
214
+ @height
215
+ end
216
+
217
+ def noncontent_height
218
+ (inner_height + outer_height) - height
219
+ end
220
+
187
221
  def outer_height
188
222
  @style.margin_top + height + @style.margin_bottom
189
223
  end
@@ -192,21 +226,20 @@ module CyberarmEngine
192
226
  (@style.border_thickness_top + @style.padding_top) + (@style.padding_bottom + @style.border_thickness_bottom)
193
227
  end
194
228
 
195
- private def dimensional_size(size, dimension)
196
- raise "dimension must be either :width or :height" unless dimension == :width || dimension == :height
229
+ def dimensional_size(size, dimension)
230
+ raise "dimension must be either :width or :height" unless %i[width height].include?(dimension)
231
+
197
232
  if size && size.is_a?(Numeric)
198
233
  if size.between?(0.0, 1.0)
199
- @parent.send(:"#{dimension}") * size
234
+ ((@parent.send(:"content_#{dimension}") - send(:"noncontent_#{dimension}")) * size).round
200
235
  else
201
236
  size
202
237
  end
203
- else
204
- nil
205
238
  end
206
239
  end
207
240
 
208
241
  def background=(_background)
209
- @style.background_canvas.background=(_background)
242
+ @style.background_canvas.background = (_background)
210
243
  update_background
211
244
  end
212
245
 
@@ -223,6 +256,8 @@ module CyberarmEngine
223
256
  end
224
257
 
225
258
  def root
259
+ return self if is_root?
260
+
226
261
  unless @root && @root.parent.nil?
227
262
  @root = parent
228
263
 
@@ -253,8 +288,12 @@ module CyberarmEngine
253
288
  raise "#{self.class}#value was not overridden!"
254
289
  end
255
290
 
256
- def value=(value)
291
+ def value=(_value)
257
292
  raise "#{self.class}#value= was not overridden!"
258
293
  end
294
+
295
+ def to_s
296
+ "#{self.class} x=#{x} y=#{y} width=#{width} height=#{height} value=#{value.is_a?(String) ? "\"#{value}\"" : value}"
297
+ end
259
298
  end
260
- end
299
+ end
@@ -1,21 +1,40 @@
1
1
  module CyberarmEngine
2
2
  class Element
3
3
  class Button < Label
4
- def initialize(text, options = {}, block = nil)
5
- super(text, options, block)
4
+ def initialize(text_or_image, options = {}, block = nil)
5
+ @image = nil
6
+ @scale_x = 1
7
+ @scale_y = 1
8
+
9
+ @image = text_or_image if text_or_image.is_a?(Gosu::Image)
10
+
11
+ super(text_or_image, options, block)
6
12
 
7
13
  @style.background_canvas.background = default(:background)
8
14
  end
9
15
 
10
16
  def render
11
- draw_text
17
+ if @image
18
+ draw_image
19
+ else
20
+ draw_text
21
+ end
22
+ end
23
+
24
+ def draw_image
25
+ @image.draw(
26
+ @style.border_thickness_left + @style.padding_left + @x,
27
+ @style.border_thickness_top + @style.padding_top + @y,
28
+ @z + 2,
29
+ @scale_x, @scale_y, @text.color
30
+ )
12
31
  end
13
32
 
14
33
  def draw_text
15
34
  @text.draw
16
35
  end
17
36
 
18
- def enter(sender)
37
+ def enter(_sender)
19
38
  @focus = false unless window.button_down?(Gosu::MsLeft)
20
39
 
21
40
  if @focus
@@ -26,42 +45,93 @@ module CyberarmEngine
26
45
  @text.color = default(:hover, :color)
27
46
  end
28
47
 
29
- return :handled
48
+ :handled
30
49
  end
31
50
 
32
- def left_mouse_button(sender, x, y)
51
+ def left_mouse_button(_sender, _x, _y)
33
52
  @focus = true
34
53
  @style.background_canvas.background = default(:active, :background)
35
54
  window.current_state.focus = self
36
55
  @text.color = default(:active, :color)
37
56
 
38
- return :handled
57
+ :handled
39
58
  end
40
59
 
41
- def released_left_mouse_button(sender,x, y)
60
+ def released_left_mouse_button(sender, _x, _y)
42
61
  enter(sender)
43
62
 
44
- return :handled
63
+ :handled
45
64
  end
46
65
 
47
- def clicked_left_mouse_button(sender, x, y)
66
+ def clicked_left_mouse_button(_sender, _x, _y)
48
67
  @block.call(self) if @block
49
68
 
50
- return :handled
69
+ :handled
51
70
  end
52
71
 
53
- def leave(sender)
72
+ def leave(_sender)
54
73
  @style.background_canvas.background = default(:background)
55
74
  @text.color = default(:color)
56
75
 
57
- return :handled
76
+ :handled
58
77
  end
59
78
 
60
- def blur(sender)
79
+ def blur(_sender)
61
80
  @focus = false
62
81
 
63
- return :handled
82
+ :handled
83
+ end
84
+
85
+ def recalculate
86
+ if @image
87
+ @width = 0
88
+ @height = 0
89
+
90
+ _width = dimensional_size(@style.image_width, :width)
91
+ _height = dimensional_size(@style.image_height, :height)
92
+
93
+ if _width && _height
94
+ @scale_x = _width.to_f / @image.width
95
+ @scale_y = _height.to_f / @image.height
96
+ elsif _width
97
+ @scale_x = _width.to_f / @image.width
98
+ @scale_y = @scale_x
99
+ elsif _height
100
+ @scale_y = _height.to_f / @image.height
101
+ @scale_x = @scale_y
102
+ else
103
+ @scale_x = 1
104
+ @scale_y = 1
105
+ end
106
+
107
+ @width = _width || @image.width.round * @scale_x
108
+ @height = _height || @image.height.round * @scale_y
109
+
110
+ update_background
111
+ else
112
+ super
113
+ end
114
+ end
115
+
116
+ def value
117
+ @image || super
118
+ end
119
+
120
+ def value=(value)
121
+ if value.is_a?(Gosu::Image)
122
+ @image = value
123
+ else
124
+ super
125
+ end
126
+
127
+ old_width = width
128
+ old_height = height
129
+ recalculate
130
+
131
+ root.gui_state.request_recalculate if old_width != width || old_height != height
132
+
133
+ publish(:changed, self.value)
64
134
  end
65
135
  end
66
136
  end
67
- end
137
+ end