cyberarm_engine 0.12.1 → 0.16.0

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