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,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