cyberarm_engine 0.13.1 → 0.17.1

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 (67) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -0
  3. data/Gemfile +1 -1
  4. data/README.md +1 -1
  5. data/Rakefile +1 -1
  6. data/assets/textures/default.png +0 -0
  7. data/cyberarm_engine.gemspec +12 -9
  8. data/lib/cyberarm_engine.rb +20 -5
  9. data/lib/cyberarm_engine/animator.rb +6 -4
  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 +2 -2
  17. data/lib/cyberarm_engine/game_object.rb +63 -72
  18. data/lib/cyberarm_engine/game_state.rb +6 -3
  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/{shader.rb → opengl/shader.rb} +51 -43
  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 +43 -20
  41. data/lib/cyberarm_engine/ui/border_canvas.rb +4 -3
  42. data/lib/cyberarm_engine/ui/dsl.rb +49 -10
  43. data/lib/cyberarm_engine/ui/element.rb +73 -21
  44. data/lib/cyberarm_engine/ui/elements/button.rb +121 -28
  45. data/lib/cyberarm_engine/ui/elements/check_box.rb +25 -33
  46. data/lib/cyberarm_engine/ui/elements/container.rb +113 -33
  47. data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -0
  48. data/lib/cyberarm_engine/ui/elements/edit_line.rb +145 -45
  49. data/lib/cyberarm_engine/ui/elements/flow.rb +1 -3
  50. data/lib/cyberarm_engine/ui/elements/image.rb +32 -12
  51. data/lib/cyberarm_engine/ui/elements/label.rb +122 -16
  52. data/lib/cyberarm_engine/ui/elements/list_box.rb +82 -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/text_block.rb +156 -0
  58. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +40 -31
  59. data/lib/cyberarm_engine/ui/event.rb +7 -7
  60. data/lib/cyberarm_engine/ui/gui_state.rb +118 -6
  61. data/lib/cyberarm_engine/ui/style.rb +10 -9
  62. data/lib/cyberarm_engine/ui/theme.rb +84 -22
  63. data/lib/cyberarm_engine/vector.rb +33 -30
  64. data/lib/cyberarm_engine/version.rb +2 -2
  65. data/lib/cyberarm_engine/{engine.rb → window.rb} +32 -19
  66. metadata +87 -18
  67. data/lib/cyberarm_engine/gosu_ext/circle.rb +0 -9
@@ -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
@@ -8,53 +8,92 @@ module CyberarmEngine
8
8
  container(CyberarmEngine::Element::Stack, options, &block)
9
9
  end
10
10
 
11
+ # TODO: Remove in version 0.16.0+
11
12
  def label(text, options = {}, &block)
12
13
  options[:parent] = element_parent
13
14
  options[:theme] = current_theme
14
15
 
15
- add_element( Element::Label.new(text, options, block) )
16
+ add_element(Element::TextBlock.new(text, options, block))
17
+ end
18
+
19
+ [
20
+ "Banner",
21
+ "Title",
22
+ "Subtitle",
23
+ "Tagline",
24
+ "Caption",
25
+ "Para",
26
+ "Inscription"
27
+ ].each do |const|
28
+ define_method(:"#{const.downcase}") do |text, options = {}, &block|
29
+ options[:parent] = element_parent
30
+ options[:theme] = current_theme
31
+
32
+ add_element(Element.const_get(const).new(text, options, block))
33
+ end
16
34
  end
17
35
 
18
36
  def button(text, options = {}, &block)
19
37
  options[:parent] = element_parent
20
38
  options[:theme] = current_theme
21
39
 
22
- add_element( Element::Button.new(text, options, block) { if block.is_a?(Proc); block.call; end } )
40
+ add_element(Element::Button.new(text, options, block) { block.call if block.is_a?(Proc) })
41
+ end
42
+
43
+ def list_box(options = {}, &block)
44
+ options[:parent] = element_parent
45
+ options[:theme] = current_theme
46
+
47
+ add_element(Element::ListBox.new(options, block) { block.call if block.is_a?(Proc) })
23
48
  end
24
49
 
25
50
  def edit_line(text, options = {}, &block)
26
51
  options[:parent] = element_parent
27
52
  options[:theme] = current_theme
28
53
 
29
- add_element( Element::EditLine.new(text, options, block) )
54
+ add_element(Element::EditLine.new(text, options, block))
55
+ end
56
+
57
+ def edit_box(text, options = {}, &block)
58
+ options[:parent] = element_parent
59
+ options[:theme] = current_theme
60
+
61
+ add_element(Element::EditBox.new(text, options, block))
30
62
  end
31
63
 
32
64
  def toggle_button(options = {}, &block)
33
65
  options[:parent] = element_parent
34
66
  options[:theme] = current_theme
35
67
 
36
- add_element( Element::ToggleButton.new(options, block) )
68
+ add_element(Element::ToggleButton.new(options, block))
37
69
  end
38
70
 
39
71
  def check_box(text, options = {}, &block)
40
72
  options[:parent] = element_parent
41
73
  options[:theme] = current_theme
42
74
 
43
- add_element( Element::CheckBox.new(text, options, block) )
75
+ add_element(Element::CheckBox.new(text, options, block))
44
76
  end
45
77
 
46
78
  def image(path, options = {}, &block)
47
79
  options[:parent] = element_parent
48
80
  options[:theme] = current_theme
49
81
 
50
- add_element( Element::Image.new(path, options, block) )
82
+ add_element(Element::Image.new(path, options, block))
51
83
  end
52
84
 
53
85
  def progress(options = {}, &block)
54
86
  options[:parent] = element_parent
55
87
  options[:theme] = current_theme
56
88
 
57
- add_element( Element::Progress.new(options, block) )
89
+ add_element(Element::Progress.new(options, block))
90
+ end
91
+
92
+ def slider(options = {}, &block)
93
+ options[:parent] = element_parent
94
+ options[:theme] = current_theme
95
+
96
+ add_element(Element::Slider.new(options, block))
58
97
  end
59
98
 
60
99
  def background(color = Gosu::Color::NONE)
@@ -72,7 +111,7 @@ module CyberarmEngine
72
111
  private def add_element(element)
73
112
  element_parent.add(element)
74
113
 
75
- return element
114
+ element
76
115
  end
77
116
 
78
117
  private def element_parent
@@ -93,7 +132,7 @@ module CyberarmEngine
93
132
 
94
133
  $__current_container__ = old_parent
95
134
 
96
- return _container
135
+ _container
97
136
  end
98
137
  end
99
- end
138
+ 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)
@@ -13,12 +13,16 @@ module CyberarmEngine
13
13
  @options = options
14
14
  @block = block
15
15
 
16
- @focus = false
17
- @enabled = true
18
- @visible = true
16
+ @focus = @options[:focus].nil? ? false : @options[:focus]
17
+ @enabled = @options[:enabled].nil? ? true : @options[:enabled]
18
+ @visible = @options[:visible].nil? ? true : @options[:visible]
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
 
@@ -38,9 +39,12 @@ module CyberarmEngine
38
39
  stylize
39
40
 
40
41
  default_events
42
+
43
+ root.gui_state.request_focus(self) if @options[:autofocus]
41
44
  end
42
45
 
43
46
  def stylize
47
+ set_static_position
44
48
  set_border_thickness(@style.border_thickness)
45
49
 
46
50
  set_padding(@style.padding)
@@ -51,6 +55,11 @@ module CyberarmEngine
51
55
  set_border_color(@style.border_color)
52
56
  end
53
57
 
58
+ def set_static_position
59
+ @x = @style.x if @style.x != 0
60
+ @y = @style.y if @style.y != 0
61
+ end
62
+
54
63
  def set_background(background)
55
64
  @style.background = background
56
65
  @style.background_canvas.background = background
@@ -95,7 +104,7 @@ module CyberarmEngine
95
104
  end
96
105
 
97
106
  def default_events
98
- [:left, :middle, :right].each do |button|
107
+ %i[left middle right].each do |button|
99
108
  event(:"#{button}_mouse_button")
100
109
  event(:"released_#{button}_mouse_button")
101
110
  event(:"clicked_#{button}_mouse_button")
@@ -109,7 +118,10 @@ module CyberarmEngine
109
118
  event(:hover)
110
119
  event(:leave)
111
120
 
121
+ event(:focus)
112
122
  event(:blur)
123
+
124
+ event(:changed)
113
125
  end
114
126
 
115
127
  def enabled?
@@ -126,21 +138,26 @@ module CyberarmEngine
126
138
  end
127
139
 
128
140
  def show
141
+ bool = visible?
129
142
  @visible = true
130
- root.gui_state.request_recalculate
143
+ root.gui_state.request_recalculate unless bool
131
144
  end
132
145
 
133
146
  def hide
147
+ bool = visible?
134
148
  @visible = false
135
- root.gui_state.request_recalculate
149
+ root.gui_state.request_recalculate if bool
136
150
  end
137
151
 
138
152
  def draw
139
- return unless @visible
153
+ return unless visible?
140
154
 
141
155
  @style.background_canvas.draw
142
156
  @style.border_canvas.draw
143
- render
157
+
158
+ Gosu.clip_to(@x, @y, width, height) do
159
+ render
160
+ end
144
161
  end
145
162
 
146
163
  def update
@@ -152,12 +169,16 @@ module CyberarmEngine
152
169
  def button_up(id)
153
170
  end
154
171
 
172
+ def draggable?(_button)
173
+ false
174
+ end
175
+
155
176
  def render
156
177
  end
157
178
 
158
179
  def hit?(x, y)
159
180
  x.between?(@x, @x + width) &&
160
- y.between?(@y, @y + height)
181
+ y.between?(@y, @y + height)
161
182
  end
162
183
 
163
184
  def width
@@ -208,21 +229,36 @@ module CyberarmEngine
208
229
  (@style.border_thickness_top + @style.padding_top) + (@style.padding_bottom + @style.border_thickness_bottom)
209
230
  end
210
231
 
211
- private def dimensional_size(size, dimension)
212
- raise "dimension must be either :width or :height" unless dimension == :width || dimension == :height
232
+ def scroll_width
233
+ @children.sum { |c| c.width } + noncontent_width
234
+ end
235
+
236
+ def scroll_height
237
+ @children.sum { |c| c.height } + noncontent_height
238
+ end
239
+
240
+ def max_scroll_width
241
+ scroll_width - width
242
+ end
243
+
244
+ def max_scroll_height
245
+ scroll_height - height
246
+ end
247
+
248
+ def dimensional_size(size, dimension)
249
+ raise "dimension must be either :width or :height" unless %i[width height].include?(dimension)
250
+
213
251
  if size && size.is_a?(Numeric)
214
252
  if size.between?(0.0, 1.0)
215
- ((@parent.send(:"content_#{dimension}") - self.send(:"noncontent_#{dimension}") - 1) * size).round
253
+ ((@parent.send(:"content_#{dimension}") - send(:"noncontent_#{dimension}")) * size).round
216
254
  else
217
255
  size
218
256
  end
219
- else
220
- nil
221
257
  end
222
258
  end
223
259
 
224
260
  def background=(_background)
225
- @style.background_canvas.background=(_background)
261
+ @style.background_canvas.background = (_background)
226
262
  update_background
227
263
  end
228
264
 
@@ -239,6 +275,8 @@ module CyberarmEngine
239
275
  end
240
276
 
241
277
  def root
278
+ return self if is_root?
279
+
242
280
  unless @root && @root.parent.nil?
243
281
  @root = parent
244
282
 
@@ -258,6 +296,12 @@ module CyberarmEngine
258
296
  @gui_state != nil
259
297
  end
260
298
 
299
+ def focus(_)
300
+ warn "#{self.class}#focus was not overridden!"
301
+
302
+ :handled
303
+ end
304
+
261
305
  def recalculate
262
306
  raise "#{self.class}#recalculate was not overridden!"
263
307
  end
@@ -269,8 +313,16 @@ module CyberarmEngine
269
313
  raise "#{self.class}#value was not overridden!"
270
314
  end
271
315
 
272
- def value=(value)
316
+ def value=(_value)
273
317
  raise "#{self.class}#value= was not overridden!"
274
318
  end
319
+
320
+ def to_s
321
+ "#{self.class} x=#{x} y=#{y} width=#{width} height=#{height} value=#{value.is_a?(String) ? "\"#{value}\"" : value}"
322
+ end
323
+
324
+ def inspect
325
+ to_s
326
+ end
275
327
  end
276
- end
328
+ end
@@ -1,67 +1,160 @@
1
1
  module CyberarmEngine
2
2
  class Element
3
- class Button < Label
4
- def initialize(text, options = {}, block = nil)
5
- super(text, options, block)
3
+ class Button < TextBlock
4
+ def initialize(text_or_image, options = {}, block = nil)
5
+ @image = nil
6
+ @scale_x = 1
7
+ @scale_y = 1
6
8
 
7
- @style.background_canvas.background = default(:background)
9
+ @image = text_or_image if text_or_image.is_a?(Gosu::Image)
10
+
11
+ super(text_or_image, options, block)
12
+
13
+ @style.background_canvas.background = @style.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
- if @focus
22
- @style.background_canvas.background = default(:active, :background)
23
- @text.color = default(:active, :color)
40
+ if !@enabled
41
+ @style.background_canvas.background = @style.disabled[:background]
42
+ @text.color = @style.disabled[:color]
43
+ elsif @focus
44
+ @style.background_canvas.background = @style.active[:background]
45
+ @text.color = @style.active[:color]
24
46
  else
25
- @style.background_canvas.background = default(:hover, :background)
26
- @text.color = default(:hover, :color)
47
+ @style.background_canvas.background = @style.hover[:background]
48
+ @text.color = @style.hover[:color]
27
49
  end
28
50
 
29
- return :handled
51
+ :handled
30
52
  end
31
53
 
32
- def left_mouse_button(sender, x, y)
54
+ def left_mouse_button(_sender, _x, _y)
33
55
  @focus = true
34
- @style.background_canvas.background = default(:active, :background)
56
+
57
+ unless @enabled
58
+ @style.background_canvas.background = @style.disabled[:background]
59
+ @text.color = @style.disabled[:color]
60
+ else
61
+ @style.background_canvas.background = @style.active[:background]
62
+ @text.color = @style.active[:color]
63
+ end
64
+
35
65
  window.current_state.focus = self
36
- @text.color = default(:active, :color)
37
66
 
38
- return :handled
67
+ :handled
39
68
  end
40
69
 
41
- def released_left_mouse_button(sender,x, y)
70
+ def released_left_mouse_button(sender, _x, _y)
42
71
  enter(sender)
43
72
 
44
- return :handled
73
+ :handled
45
74
  end
46
75
 
47
- def clicked_left_mouse_button(sender, x, y)
48
- @block.call(self) if @block
76
+ def clicked_left_mouse_button(_sender, _x, _y)
77
+ @block.call(self) if @enabled && @block
49
78
 
50
- return :handled
79
+ :handled
51
80
  end
52
81
 
53
- def leave(sender)
54
- @style.background_canvas.background = default(:background)
55
- @text.color = default(:color)
82
+ def leave(_sender)
83
+ unless @enabled
84
+ @style.background_canvas.background = @style.disabled[:background]
85
+ @text.color = @style.disabled[:color]
86
+ else
87
+ @style.background_canvas.background = @style.background
88
+ @text.color = @style.color
89
+ end
56
90
 
57
- return :handled
91
+ :handled
58
92
  end
59
93
 
60
- def blur(sender)
94
+ def blur(_sender)
61
95
  @focus = false
62
96
 
63
- return :handled
97
+ :handled
98
+ end
99
+
100
+ def recalculate
101
+ unless @enabled
102
+ @style.background_canvas.background = @style.disabled[:background]
103
+ @text.color = @style.disabled[:color]
104
+ else
105
+ @style.background_canvas.background = @style.background
106
+ @text.color = @style.color
107
+ end
108
+
109
+ if @image
110
+ @width = 0
111
+ @height = 0
112
+
113
+ _width = dimensional_size(@style.image_width, :width)
114
+ _height = dimensional_size(@style.image_height, :height)
115
+
116
+ if _width && _height
117
+ @scale_x = _width.to_f / @image.width
118
+ @scale_y = _height.to_f / @image.height
119
+ elsif _width
120
+ @scale_x = _width.to_f / @image.width
121
+ @scale_y = @scale_x
122
+ elsif _height
123
+ @scale_y = _height.to_f / @image.height
124
+ @scale_x = @scale_y
125
+ else
126
+ @scale_x = 1
127
+ @scale_y = 1
128
+ end
129
+
130
+ @width = _width || @image.width.round * @scale_x
131
+ @height = _height || @image.height.round * @scale_y
132
+
133
+ update_background
134
+ else
135
+ super
136
+ end
137
+ end
138
+
139
+ def value
140
+ @image || super
141
+ end
142
+
143
+ def value=(value)
144
+ if value.is_a?(Gosu::Image)
145
+ @image = value
146
+ else
147
+ super
148
+ end
149
+
150
+ old_width = width
151
+ old_height = height
152
+ recalculate
153
+
154
+ root.gui_state.request_recalculate if old_width != width || old_height != height
155
+
156
+ publish(:changed, self.value)
64
157
  end
65
158
  end
66
159
  end
67
- end
160
+ end