cyberarm_engine 0.12.0 → 0.15.0

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