cyberarm_engine 0.12.0 → 0.15.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 (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,11 +1,11 @@
1
1
  module Gosu
2
2
  class Color
3
- def _dump(level)
3
+ def _dump(_level)
4
4
  [
5
- "%02X" % self.alpha,
6
- "%02X" % self.red,
7
- "%02X" % self.green,
8
- "%02X" % self.blue
5
+ "%02X" % alpha,
6
+ "%02X" % red,
7
+ "%02X" % green,
8
+ "%02X" % blue
9
9
  ].join
10
10
  end
11
11
 
@@ -21,17 +21,18 @@ module CyberarmEngine
21
21
  @hash = Marshal.load(Marshal.dump(hash))
22
22
  end
23
23
 
24
- def method_missing(method, *args, &block)
24
+ def method_missing(method, *args)
25
25
  if method.to_s.end_with?("=")
26
26
  raise "Did not expect more than 1 argument" if args.size > 1
27
- return @hash[method.to_s.sub("=", "").to_sym] = args.first
27
+
28
+ @hash[method.to_s.sub("=", "").to_sym] = args.first
28
29
 
29
30
  elsif args.size == 0
30
- return @hash[method]
31
+ @hash[method]
31
32
 
32
33
  else
33
34
  raise ArgumentError, "Did not expect arguments"
34
35
  end
35
36
  end
36
37
  end
37
- end
38
+ end
@@ -11,17 +11,21 @@ module CyberarmEngine
11
11
 
12
12
  def theme_defaults(options)
13
13
  raise "Error" unless self.class.ancestors.include?(CyberarmEngine::Element)
14
+
14
15
  _theme = THEME
15
- _theme = _theme.merge(options[:theme]) if options[:theme]
16
+ _theme = deep_merge(_theme, options[:theme]) if options[:theme]
16
17
  _theme.delete(:theme) if options[:theme]
17
18
 
18
19
  hash = {}
19
20
  class_names = self.class.ancestors
20
- class_names = class_names[0..class_names.index(CyberarmEngine::Element)].map! {|c| c.to_s.split("::").last.to_sym}.reverse!
21
+ class_names = class_names[0..class_names.index(CyberarmEngine::Element)].map! do |c|
22
+ c.to_s.split("::").last.to_sym
23
+ end.reverse!
21
24
 
22
25
  class_names.each do |klass|
23
26
  next unless data = _theme.dig(klass)
24
- data.each do |key, value|
27
+
28
+ data.each do |_key, _value|
25
29
  hash.merge!(data)
26
30
  end
27
31
  end
@@ -32,7 +36,7 @@ module CyberarmEngine
32
36
  # Derived from Rails Hash#deep_merge!
33
37
  # Enables passing partial themes through Element options without issue
34
38
  def deep_merge(original, intergrate, &block)
35
- hash = original.merge(intergrate) do |key, this_val, other_val|
39
+ original.merge(intergrate) do |key, this_val, other_val|
36
40
  if this_val.is_a?(Hash) && other_val.is_a?(Hash)
37
41
  deep_merge(this_val, other_val, &block)
38
42
  elsif block_given?
@@ -41,8 +45,6 @@ module CyberarmEngine
41
45
  other_val
42
46
  end
43
47
  end
44
-
45
- return hash
46
48
  end
47
49
 
48
50
  THEME = {
@@ -51,28 +53,30 @@ module CyberarmEngine
51
53
  y: 0,
52
54
  z: 30,
53
55
 
54
- width: nil,
56
+ width: nil,
55
57
  height: nil,
56
- color: Gosu::Color::WHITE,
58
+ color: Gosu::Color::WHITE,
57
59
  background: Gosu::Color::NONE,
58
- margin: 0,
59
- padding: 0,
60
+ margin: 0,
61
+ padding: 0,
60
62
  border_thickness: 0,
61
63
  border_color: Gosu::Color::NONE,
62
- border_radius: 0,
64
+ border_radius: 0
63
65
  },
64
66
 
65
67
  Button: { # < Label
66
- margin: 1,
67
- padding: 4,
68
+ margin: 1,
69
+ padding: 4,
68
70
  border_thickness: 1,
69
71
  border_color: ["ffd59674".hex, "ffff8746".hex],
70
72
  border_radius: 0,
71
73
  background: ["ffc75e61".to_i(16), "ffe26623".to_i(16)],
74
+ text_align: :center,
75
+ text_wrap: :none,
72
76
 
73
77
  hover: {
74
- color: Gosu::Color.rgb(200,200,200),
75
- background: ["ffB23E41".to_i(16), "ffFF7C00".to_i(16)],
78
+ color: Gosu::Color.rgb(200, 200, 200),
79
+ background: ["ffB23E41".to_i(16), "ffFF7C00".to_i(16)]
76
80
  },
77
81
 
78
82
  active: {
@@ -88,18 +92,23 @@ module CyberarmEngine
88
92
  caret_width: 2,
89
93
  caret_color: Gosu::Color::WHITE,
90
94
  caret_interval: 500,
95
+ selection_color: Gosu::Color.rgba(255, 128, 50, 200),
96
+ text_align: :left
91
97
  },
92
98
 
93
99
  Image: { # < Element
100
+ color: Gosu::Color::WHITE,
94
101
  retro: false
95
102
  },
96
103
 
97
104
  Label: { # < Element
98
- text_size: 28,
99
- text_shadow: false,
100
- font: "Arial",
101
- margin: 0,
102
- padding: 2
105
+ text_size: 28,
106
+ text_wrap: :none, # :word_wrap, :break_word, :none
107
+ text_shadow: false,
108
+ text_align: :left,
109
+ font: "Arial",
110
+ margin: 0,
111
+ padding: 2
103
112
  },
104
113
 
105
114
  ToggleButton: { # < Button
@@ -111,7 +120,16 @@ module CyberarmEngine
111
120
  height: 36,
112
121
  background: 0xff111111,
113
122
  fraction_background: [0xffc75e61, 0xffe26623],
114
- border_thickness: 4,
123
+ border_thickness: 1,
124
+ border_color: [0xffd59674, 0xffff8746]
125
+ },
126
+
127
+ Slider: { # < Element
128
+ width: 250,
129
+ height: 36,
130
+ background: 0xff111111,
131
+ fraction_background: [0xffc75e61, 0xffe26623],
132
+ border_thickness: 1,
115
133
  border_color: [0xffd59674, 0xffff8746]
116
134
  }
117
135
  }.freeze
@@ -1,63 +1,101 @@
1
1
  module CyberarmEngine
2
2
  class Vector
3
+ ##
4
+ # Creates a up vector
5
+ #
6
+ # Vector.new(0, 1, 0)
7
+ #
8
+ # @return [CyberarmEngine::Vector]
3
9
  def self.up
4
10
  Vector.new(0, 1, 0)
5
11
  end
6
12
 
13
+ ##
14
+ # Creates a down vector
15
+ #
16
+ # Vector.new(0, -1, 0)
17
+ #
18
+ # @return [CyberarmEngine::Vector]
7
19
  def self.down
8
20
  Vector.new(0, -1, 0)
9
21
  end
10
22
 
23
+ ##
24
+ # Creates a left vector
25
+ #
26
+ # Vector.new(-1, 0, 0)
27
+ #
28
+ # @return [CyberarmEngine::Vector]
11
29
  def self.left
12
30
  Vector.new(-1, 0, 0)
13
31
  end
14
32
 
33
+ ##
34
+ # Creates a right vector
35
+ #
36
+ # Vector.new(1, 0, 0)
37
+ #
38
+ # @return [CyberarmEngine::Vector]
15
39
  def self.right
16
40
  Vector.new(1, 0, 0)
17
41
  end
18
42
 
43
+ ##
44
+ # Creates a forward vector
45
+ #
46
+ # Vector.new(0, 0, 1)
47
+ #
48
+ # @return [CyberarmEngine::Vector]
19
49
  def self.forward
20
50
  Vector.new(0, 0, 1)
21
51
  end
22
52
 
53
+ ##
54
+ # Creates a backward vector
55
+ #
56
+ # Vector.new(0, 0, -1)
57
+ #
58
+ # @return [CyberarmEngine::Vector]
23
59
  def self.backward
24
60
  Vector.new(0, 0, -1)
25
61
  end
26
62
 
63
+ attr_accessor :x, :y, :z, :weight
64
+
27
65
  def initialize(x = 0, y = 0, z = 0, weight = 0)
28
- @x, @y, @z, @weight = x, y, z, weight
66
+ @x = x
67
+ @y = y
68
+ @z = z
69
+ @weight = weight
29
70
  end
30
71
 
31
- def x; @x; end
32
- def x=(n); @x = n; end
33
-
34
- def y; @y; end
35
- def y=(n); @y = n; end
36
-
37
- def z; @z; end
38
- def z=(n); @z = n; end
39
-
40
- def weight; @weight; end
41
- def weight=(n); @weight = n; end
42
-
43
72
  alias w weight
44
73
  alias w= weight=
45
74
 
75
+ # @return [Boolean]
46
76
  def ==(other)
47
77
  if other.is_a?(Numeric)
48
78
  @x == other &&
49
- @y == other &&
50
- @z == other &&
51
- @weight == other
52
- else
79
+ @y == other &&
80
+ @z == other &&
81
+ @weight == other
82
+ elsif other.is_a?(Vector)
53
83
  @x == other.x &&
54
- @y == other.y &&
55
- @z == other.z &&
56
- @weight == other.weight
84
+ @y == other.y &&
85
+ @z == other.z &&
86
+ @weight == other.weight
87
+ else
88
+ other == self
57
89
  end
58
90
  end
59
91
 
60
- # Performs math operation, excluding @weight
92
+ # Create a new vector using {x} and {y} values
93
+ # @return [CyberarmEngine::Vector]
94
+ def xy
95
+ Vector.new(@x, @y)
96
+ end
97
+
98
+ # Performs math operation, excluding {weight}
61
99
  private def operator(function, other)
62
100
  if other.is_a?(Numeric)
63
101
  Vector.new(
@@ -74,22 +112,37 @@ module CyberarmEngine
74
112
  end
75
113
  end
76
114
 
77
- # Adds Vector and Numberic or Vector and Vector, excluding @weight
115
+ # Adds Vector and Numeric or Vector and Vector, excluding {weight}
116
+ # @return [CyberarmEngine::Vector]
78
117
  def +(other)
79
118
  operator("+", other)
80
119
  end
81
120
 
82
- # Subtracts Vector and Numberic or Vector and Vector, excluding @weight
121
+ # Subtracts Vector and Numeric or Vector and Vector, excluding {weight}
122
+ # @return [CyberarmEngine::Vector]
83
123
  def -(other)
84
124
  operator("-", other)
85
125
  end
86
126
 
87
- # Multiplies Vector and Numberic or Vector and Vector, excluding @weight
127
+ # Multiplies Vector and Numeric or Vector and Vector, excluding {weight}
128
+ # @return [CyberarmEngine::Vector]
88
129
  def *(other)
89
130
  operator("*", other)
90
131
  end
91
132
 
92
- # Divides Vector and Numberic or Vector and Vector, excluding @weight
133
+ def multiply_transform(transform)
134
+ e = transform.elements
135
+
136
+ x = @x * e[0] + @y * e[1] + @z * e[2] + 1 * e[3]
137
+ y = @x * e[4] + @y * e[5] + @z * e[6] + 1 * e[7]
138
+ z = @x * e[8] + @y * e[9] + @z * e[10] + 1 * e[11]
139
+ w = @x * e[12] + @y * e[13] + @z * e[14] + 1 * e[15]
140
+
141
+ Vector.new(x / 1, y / 1, z / 1, w / 1)
142
+ end
143
+
144
+ # Divides Vector and Numeric or Vector and Vector, excluding {weight}
145
+ # @return [CyberarmEngine::Vector]
93
146
  def /(other)
94
147
  # Duplicated to protect from DivideByZero
95
148
  if other.is_a?(Numeric)
@@ -107,21 +160,25 @@ module CyberarmEngine
107
160
  end
108
161
  end
109
162
 
163
+ # dot product of {Vector}
164
+ # @return [Integer|Float]
110
165
  def dot(other)
111
166
  product = 0
112
167
 
113
- a = self.to_a
168
+ a = to_a
114
169
  b = other.to_a
115
170
 
116
171
  3.times do |i|
117
- product = product + (a[i] * b[i])
172
+ product += (a[i] * b[i])
118
173
  end
119
174
 
120
- return product
175
+ product
121
176
  end
122
177
 
178
+ # cross product of {Vector}
179
+ # @return [CyberarmEngine::Vector]
123
180
  def cross(other)
124
- a = self.to_a
181
+ a = to_a
125
182
  b = other.to_a
126
183
 
127
184
  Vector.new(
@@ -132,24 +189,39 @@ module CyberarmEngine
132
189
  end
133
190
 
134
191
  # returns degrees
192
+ # @return [Float]
135
193
  def angle(other)
136
- Math.acos( self.normalized.dot(other.normalized) ) * 180 / Math::PI
194
+ Math.acos(normalized.dot(other.normalized)) * 180 / Math::PI
137
195
  end
138
196
 
139
197
  # returns magnitude of Vector, ignoring #weight
198
+ # @return [Float]
140
199
  def magnitude
141
200
  Math.sqrt((@x * @x) + (@y * @y) + (@z * @z))
142
201
  end
143
202
 
203
+ ##
204
+ # returns normalized {Vector}
205
+ #
206
+ # @example
207
+ # CyberarmEngine::Vector.new(50, 21.2, 45).normalized
208
+ # # => <CyberarmEngine::Vector:0x001 @x=0.7089... @y=0.3005... @z=0.6380... @weight=0>
209
+ #
210
+ # @return [CyberarmEngine::Vector]
144
211
  def normalized
145
212
  mag = magnitude
146
213
  self / Vector.new(mag, mag, mag)
147
214
  end
148
215
 
216
+ # returns a direction {Vector}
217
+ #
218
+ # z is pitch
219
+ #
220
+ # y is yaw
221
+ #
222
+ # x is roll
223
+ # @return [CyberarmEngine::Vector]
149
224
  def direction
150
- # z is pitch
151
- # y is yaw
152
- # x is roll
153
225
  _x = -Math.sin(@y.degrees_to_radians) * Math.cos(@z.degrees_to_radians)
154
226
  _y = Math.sin(@z.degrees_to_radians)
155
227
  _z = Math.cos(@y.degrees_to_radians) * Math.cos(@z.degrees_to_radians)
@@ -157,43 +229,65 @@ module CyberarmEngine
157
229
  Vector.new(_x, _y, _z)
158
230
  end
159
231
 
232
+ # returns an inverse {Vector}
233
+ # @return [CyberarmEngine::Vector]
160
234
  def inverse
161
235
  Vector.new(1.0 / @x, 1.0 / @y, 1.0 / @z)
162
236
  end
163
237
 
238
+ # Adds up values of {x}, {y}, and {z}
239
+ # @return [Integer|Float]
164
240
  def sum
165
241
  @x + @y + @z
166
242
  end
167
243
 
244
+ ##
245
+ # Linear interpolation: smoothly transition between two {Vector}
246
+ #
247
+ # CyberarmEngine::Vector.new(100, 100, 100).lerp( CyberarmEngine::Vector.new(0, 0, 0), 0.75 )
248
+ # # => <CyberarmEngine::Vector:0x0001 @x=75.0, @y=75.0, @z=75.0, @weight=0>
249
+ #
250
+ # @param other [CyberarmEngine::Vector | Integer | Float] value to subtract from
251
+ # @param factor [Float] how complete transition to _other_ is, in range [0.0..1.0]
252
+ # @return [CyberarmEngine::Vector]
168
253
  def lerp(other, factor)
169
254
  (self - other) * factor.clamp(0.0, 1.0)
170
255
  end
171
256
 
172
257
  # 2D distance using X and Y
258
+ # @return [Float]
173
259
  def distance(other)
174
- Math.sqrt((@x-other.x)**2 + (@y-other.y)**2)
260
+ Math.sqrt((@x - other.x)**2 + (@y - other.y)**2)
175
261
  end
176
262
 
177
263
  # 2D distance using X and Z
264
+ # @return [Float]
178
265
  def gl_distance2d(other)
179
- Math.sqrt((@x-other.x)**2 + (@z-other.z)**2)
266
+ Math.sqrt((@x - other.x)**2 + (@z - other.z)**2)
180
267
  end
181
268
 
182
269
  # 3D distance using X, Y, and Z
270
+ # @return [Float]
183
271
  def distance3d(other)
184
- Math.sqrt((@x-other.x)**2 + (@y-other.y)**2 + (@z-other.z)**2)
272
+ Math.sqrt((@x - other.x)**2 + (@y - other.y)**2 + (@z - other.z)**2)
185
273
  end
186
274
 
275
+ # Converts {Vector} to Array
276
+ # @return [Array]
187
277
  def to_a
188
278
  [@x, @y, @z, @weight]
189
279
  end
190
280
 
281
+ # Converts {Vector} to String
282
+ # @return [String]
191
283
  def to_s
192
284
  "X: #{@x}, Y: #{@y}, Z: #{@z}, Weight: #{@weight}"
193
285
  end
194
286
 
287
+ # Converts {Vector} to Hash
288
+ # @return [Hash]
195
289
  def to_h
196
- {x: @x, y: @y, z: @z, weight: @weight}
290
+ { x: @x, y: @y, z: @z, weight: @weight }
197
291
  end
198
292
  end
199
- end
293
+ end