cyberarm_engine 0.12.1 → 0.16.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 (68) 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 +25 -7
  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 +86 -50
  43. data/lib/cyberarm_engine/ui/element.rb +60 -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 +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 +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 +8 -7
  60. data/lib/cyberarm_engine/ui/gui_state.rb +94 -6
  61. data/lib/cyberarm_engine/ui/style.rb +10 -9
  62. data/lib/cyberarm_engine/ui/theme.rb +85 -22
  63. data/lib/cyberarm_engine/vector.rb +132 -38
  64. data/lib/cyberarm_engine/version.rb +2 -2
  65. data/lib/cyberarm_engine/{engine.rb → window.rb} +32 -19
  66. metadata +88 -17
  67. data/lib/cyberarm_engine/gosu_ext/circle.rb +0 -9
  68. 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,138 @@
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
 
11
+ # TODO: Remove in version 0.16.0+
27
12
  def label(text, options = {}, &block)
28
- options[:parent] = @containers.last
13
+ options[:parent] = element_parent
29
14
  options[:theme] = current_theme
30
- _element = Element::Label.new(text, options, block)
31
- @containers.last.add(_element)
32
15
 
33
- return _element
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
34
34
  end
35
35
 
36
36
  def button(text, options = {}, &block)
37
- options[:parent] = @containers.last
37
+ options[:parent] = element_parent
38
38
  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
39
 
42
- return _element
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) })
43
48
  end
44
49
 
45
50
  def edit_line(text, options = {}, &block)
46
- options[:parent] = @containers.last
51
+ options[:parent] = element_parent
47
52
  options[:theme] = current_theme
48
- _element = Element::EditLine.new(text, options, block)
49
- @containers.last.add(_element)
50
53
 
51
- return _element
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))
52
62
  end
53
63
 
54
64
  def toggle_button(options = {}, &block)
55
- options[:parent] = @containers.last
65
+ options[:parent] = element_parent
56
66
  options[:theme] = current_theme
57
- _element = Element::ToggleButton.new(options, block)
58
- @containers.last.add(_element)
59
67
 
60
- return _element
68
+ add_element(Element::ToggleButton.new(options, block))
61
69
  end
62
70
 
63
71
  def check_box(text, options = {}, &block)
64
- options[:parent] = @containers.last
72
+ options[:parent] = element_parent
65
73
  options[:theme] = current_theme
66
- _element = Element::CheckBox.new(text, options, block)
67
- @containers.last.add(_element)
68
74
 
69
- return _element
75
+ add_element(Element::CheckBox.new(text, options, block))
70
76
  end
71
77
 
72
78
  def image(path, options = {}, &block)
73
- options[:parent] = @containers.last
79
+ options[:parent] = element_parent
74
80
  options[:theme] = current_theme
75
- _element = Element::Image.new(path, options, block)
76
- @containers.last.add(_element)
77
81
 
78
- return _element
82
+ add_element(Element::Image.new(path, options, block))
79
83
  end
80
84
 
81
85
  def progress(options = {}, &block)
82
- options[:parent] = @containers.last
86
+ options[:parent] = element_parent
83
87
  options[:theme] = current_theme
84
- _element = Element::Progress.new(options, block)
85
- @containers.last.add(_element)
86
88
 
87
- return _element
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))
88
97
  end
89
98
 
90
99
  def background(color = Gosu::Color::NONE)
91
- @containers.last.style.background = color
100
+ element_parent.style.background = color
92
101
  end
93
102
 
94
103
  def theme(theme)
95
- @containers.last.options[:theme] = theme
104
+ element_parent.options[:theme] = theme
96
105
  end
97
106
 
98
107
  def current_theme
99
- @containers.last.options[:theme]
108
+ element_parent.options[:theme]
109
+ end
110
+
111
+ private def add_element(element)
112
+ element_parent.add(element)
113
+
114
+ element
115
+ end
116
+
117
+ private def element_parent
118
+ $__current_container__
119
+ end
120
+
121
+ private def container(klass, options = {}, &block)
122
+ options[:parent] = element_parent
123
+ options[:theme] = current_theme
124
+
125
+ _container = klass.new(options, block)
126
+
127
+ old_parent = element_parent
128
+ $__current_container__ = _container
129
+
130
+ _container.build
131
+ _container.parent.add(_container)
132
+
133
+ $__current_container__ = old_parent
134
+
135
+ _container
100
136
  end
101
137
  end
102
- 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
 
@@ -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,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