cyberarm_engine 0.13.1 → 0.17.1

Sign up to get free protection for your applications and to get access to all the features.
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