cyberarm_engine 0.13.0 → 0.17.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 (73) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +8 -8
  3. data/.rubocop.yml +8 -0
  4. data/.travis.yml +5 -5
  5. data/Gemfile +6 -6
  6. data/LICENSE.txt +21 -21
  7. data/README.md +73 -43
  8. data/Rakefile +10 -10
  9. data/assets/textures/default.png +0 -0
  10. data/bin/console +14 -14
  11. data/bin/setup +8 -8
  12. data/cyberarm_engine.gemspec +39 -36
  13. data/lib/cyberarm_engine.rb +64 -47
  14. data/lib/cyberarm_engine/animator.rb +56 -54
  15. data/lib/cyberarm_engine/background.rb +179 -175
  16. data/lib/cyberarm_engine/background_nine_slice.rb +125 -0
  17. data/lib/cyberarm_engine/bounding_box.rb +150 -150
  18. data/lib/cyberarm_engine/cache.rb +4 -0
  19. data/lib/cyberarm_engine/cache/download_manager.rb +121 -0
  20. data/lib/cyberarm_engine/common.rb +96 -96
  21. data/lib/cyberarm_engine/config_file.rb +46 -0
  22. data/lib/cyberarm_engine/game_object.rb +248 -257
  23. data/lib/cyberarm_engine/game_state.rb +92 -89
  24. data/lib/cyberarm_engine/model.rb +207 -0
  25. data/lib/cyberarm_engine/model/material.rb +21 -0
  26. data/lib/cyberarm_engine/model/model_object.rb +131 -0
  27. data/lib/cyberarm_engine/model/parser.rb +74 -0
  28. data/lib/cyberarm_engine/model/parsers/collada_parser.rb +138 -0
  29. data/lib/cyberarm_engine/model/parsers/wavefront_parser.rb +154 -0
  30. data/lib/cyberarm_engine/model_cache.rb +31 -0
  31. data/lib/cyberarm_engine/opengl.rb +28 -0
  32. data/lib/cyberarm_engine/opengl/light.rb +50 -0
  33. data/lib/cyberarm_engine/opengl/orthographic_camera.rb +46 -0
  34. data/lib/cyberarm_engine/opengl/perspective_camera.rb +38 -0
  35. data/lib/cyberarm_engine/opengl/renderer/bounding_box_renderer.rb +249 -0
  36. data/lib/cyberarm_engine/opengl/renderer/g_buffer.rb +164 -0
  37. data/lib/cyberarm_engine/opengl/renderer/opengl_renderer.rb +289 -0
  38. data/lib/cyberarm_engine/opengl/renderer/renderer.rb +22 -0
  39. data/lib/cyberarm_engine/opengl/shader.rb +406 -0
  40. data/lib/cyberarm_engine/opengl/texture.rb +69 -0
  41. data/lib/cyberarm_engine/ray.rb +56 -56
  42. data/lib/cyberarm_engine/stats.rb +21 -0
  43. data/lib/cyberarm_engine/text.rb +160 -146
  44. data/lib/cyberarm_engine/timer.rb +23 -23
  45. data/lib/cyberarm_engine/transform.rb +296 -273
  46. data/lib/cyberarm_engine/ui/border_canvas.rb +102 -101
  47. data/lib/cyberarm_engine/ui/dsl.rb +138 -99
  48. data/lib/cyberarm_engine/ui/element.rb +315 -276
  49. data/lib/cyberarm_engine/ui/elements/button.rb +160 -67
  50. data/lib/cyberarm_engine/ui/elements/check_box.rb +51 -59
  51. data/lib/cyberarm_engine/ui/elements/container.rb +256 -176
  52. data/lib/cyberarm_engine/ui/elements/edit_box.rb +179 -0
  53. data/lib/cyberarm_engine/ui/elements/edit_line.rb +262 -172
  54. data/lib/cyberarm_engine/ui/elements/flow.rb +15 -17
  55. data/lib/cyberarm_engine/ui/elements/image.rb +72 -52
  56. data/lib/cyberarm_engine/ui/elements/label.rb +156 -50
  57. data/lib/cyberarm_engine/ui/elements/list_box.rb +82 -0
  58. data/lib/cyberarm_engine/ui/elements/progress.rb +51 -50
  59. data/lib/cyberarm_engine/ui/elements/radio.rb +6 -0
  60. data/lib/cyberarm_engine/ui/elements/slider.rb +104 -0
  61. data/lib/cyberarm_engine/ui/elements/stack.rb +11 -13
  62. data/lib/cyberarm_engine/ui/elements/text_block.rb +156 -0
  63. data/lib/cyberarm_engine/ui/elements/toggle_button.rb +65 -56
  64. data/lib/cyberarm_engine/ui/event.rb +47 -47
  65. data/lib/cyberarm_engine/ui/gui_state.rb +226 -135
  66. data/lib/cyberarm_engine/ui/style.rb +38 -37
  67. data/lib/cyberarm_engine/ui/theme.rb +182 -120
  68. data/lib/cyberarm_engine/vector.rb +293 -203
  69. data/lib/cyberarm_engine/version.rb +4 -4
  70. data/lib/cyberarm_engine/{engine.rb → window.rb} +114 -101
  71. metadata +88 -18
  72. data/lib/cyberarm_engine/gosu_ext/circle.rb +0 -9
  73. data/lib/cyberarm_engine/shader.rb +0 -262
@@ -1,203 +1,293 @@
1
- module CyberarmEngine
2
- class Vector
3
- def self.up
4
- Vector.new(0, 1, 0)
5
- end
6
-
7
- def self.down
8
- Vector.new(0, -1, 0)
9
- end
10
-
11
- def self.left
12
- Vector.new(-1, 0, 0)
13
- end
14
-
15
- def self.right
16
- Vector.new(1, 0, 0)
17
- end
18
-
19
- def self.forward
20
- Vector.new(0, 0, 1)
21
- end
22
-
23
- def self.backward
24
- Vector.new(0, 0, -1)
25
- end
26
-
27
- def initialize(x = 0, y = 0, z = 0, weight = 0)
28
- @x, @y, @z, @weight = x, y, z, weight
29
- end
30
-
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
- alias w weight
44
- alias w= weight=
45
-
46
- def ==(other)
47
- if other.is_a?(Numeric)
48
- @x == other &&
49
- @y == other &&
50
- @z == other &&
51
- @weight == other
52
- else
53
- @x == other.x &&
54
- @y == other.y &&
55
- @z == other.z &&
56
- @weight == other.weight
57
- end
58
- end
59
-
60
- def xy
61
- Vector.new(@x, @y)
62
- end
63
-
64
- # Performs math operation, excluding @weight
65
- private def operator(function, other)
66
- if other.is_a?(Numeric)
67
- Vector.new(
68
- @x.send(:"#{function}", other),
69
- @y.send(:"#{function}", other),
70
- @z.send(:"#{function}", other)
71
- )
72
- else
73
- Vector.new(
74
- @x.send(:"#{function}", other.x),
75
- @y.send(:"#{function}", other.y),
76
- @z.send(:"#{function}", other.z)
77
- )
78
- end
79
- end
80
-
81
- # Adds Vector and Numberic or Vector and Vector, excluding @weight
82
- def +(other)
83
- operator("+", other)
84
- end
85
-
86
- # Subtracts Vector and Numberic or Vector and Vector, excluding @weight
87
- def -(other)
88
- operator("-", other)
89
- end
90
-
91
- # Multiplies Vector and Numberic or Vector and Vector, excluding @weight
92
- def *(other)
93
- operator("*", other)
94
- end
95
-
96
- # Divides Vector and Numberic or Vector and Vector, excluding @weight
97
- def /(other)
98
- # Duplicated to protect from DivideByZero
99
- if other.is_a?(Numeric)
100
- Vector.new(
101
- (@x == 0 ? 0 : @x / other),
102
- (@y == 0 ? 0 : @y / other),
103
- (@z == 0 ? 0 : @z / other)
104
- )
105
- else
106
- Vector.new(
107
- (@x == 0 ? 0 : @x / other.x),
108
- (@y == 0 ? 0 : @y / other.y),
109
- (@z == 0 ? 0 : @z / other.z)
110
- )
111
- end
112
- end
113
-
114
- def dot(other)
115
- product = 0
116
-
117
- a = self.to_a
118
- b = other.to_a
119
-
120
- 3.times do |i|
121
- product = product + (a[i] * b[i])
122
- end
123
-
124
- return product
125
- end
126
-
127
- def cross(other)
128
- a = self.to_a
129
- b = other.to_a
130
-
131
- Vector.new(
132
- b[2] * a[1] - b[1] * a[2],
133
- b[0] * a[2] - b[2] * a[0],
134
- b[1] * a[0] - b[0] * a[1]
135
- )
136
- end
137
-
138
- # returns degrees
139
- def angle(other)
140
- Math.acos( self.normalized.dot(other.normalized) ) * 180 / Math::PI
141
- end
142
-
143
- # returns magnitude of Vector, ignoring #weight
144
- def magnitude
145
- Math.sqrt((@x * @x) + (@y * @y) + (@z * @z))
146
- end
147
-
148
- def normalized
149
- mag = magnitude
150
- self / Vector.new(mag, mag, mag)
151
- end
152
-
153
- def direction
154
- # z is pitch
155
- # y is yaw
156
- # x is roll
157
- _x = -Math.sin(@y.degrees_to_radians) * Math.cos(@z.degrees_to_radians)
158
- _y = Math.sin(@z.degrees_to_radians)
159
- _z = Math.cos(@y.degrees_to_radians) * Math.cos(@z.degrees_to_radians)
160
-
161
- Vector.new(_x, _y, _z)
162
- end
163
-
164
- def inverse
165
- Vector.new(1.0 / @x, 1.0 / @y, 1.0 / @z)
166
- end
167
-
168
- def sum
169
- @x + @y + @z
170
- end
171
-
172
- def lerp(other, factor)
173
- (self - other) * factor.clamp(0.0, 1.0)
174
- end
175
-
176
- # 2D distance using X and Y
177
- def distance(other)
178
- Math.sqrt((@x-other.x)**2 + (@y-other.y)**2)
179
- end
180
-
181
- # 2D distance using X and Z
182
- def gl_distance2d(other)
183
- Math.sqrt((@x-other.x)**2 + (@z-other.z)**2)
184
- end
185
-
186
- # 3D distance using X, Y, and Z
187
- def distance3d(other)
188
- Math.sqrt((@x-other.x)**2 + (@y-other.y)**2 + (@z-other.z)**2)
189
- end
190
-
191
- def to_a
192
- [@x, @y, @z, @weight]
193
- end
194
-
195
- def to_s
196
- "X: #{@x}, Y: #{@y}, Z: #{@z}, Weight: #{@weight}"
197
- end
198
-
199
- def to_h
200
- {x: @x, y: @y, z: @z, weight: @weight}
201
- end
202
- end
203
- end
1
+ module CyberarmEngine
2
+ class Vector
3
+ ##
4
+ # Creates a up vector
5
+ #
6
+ # Vector.new(0, 1, 0)
7
+ #
8
+ # @return [CyberarmEngine::Vector]
9
+ def self.up
10
+ Vector.new(0, 1, 0)
11
+ end
12
+
13
+ ##
14
+ # Creates a down vector
15
+ #
16
+ # Vector.new(0, -1, 0)
17
+ #
18
+ # @return [CyberarmEngine::Vector]
19
+ def self.down
20
+ Vector.new(0, -1, 0)
21
+ end
22
+
23
+ ##
24
+ # Creates a left vector
25
+ #
26
+ # Vector.new(-1, 0, 0)
27
+ #
28
+ # @return [CyberarmEngine::Vector]
29
+ def self.left
30
+ Vector.new(-1, 0, 0)
31
+ end
32
+
33
+ ##
34
+ # Creates a right vector
35
+ #
36
+ # Vector.new(1, 0, 0)
37
+ #
38
+ # @return [CyberarmEngine::Vector]
39
+ def self.right
40
+ Vector.new(1, 0, 0)
41
+ end
42
+
43
+ ##
44
+ # Creates a forward vector
45
+ #
46
+ # Vector.new(0, 0, 1)
47
+ #
48
+ # @return [CyberarmEngine::Vector]
49
+ def self.forward
50
+ Vector.new(0, 0, 1)
51
+ end
52
+
53
+ ##
54
+ # Creates a backward vector
55
+ #
56
+ # Vector.new(0, 0, -1)
57
+ #
58
+ # @return [CyberarmEngine::Vector]
59
+ def self.backward
60
+ Vector.new(0, 0, -1)
61
+ end
62
+
63
+ attr_accessor :x, :y, :z, :weight
64
+
65
+ def initialize(x = 0, y = 0, z = 0, weight = 0)
66
+ @x = x
67
+ @y = y
68
+ @z = z
69
+ @weight = weight
70
+ end
71
+
72
+ alias w weight
73
+ alias w= weight=
74
+
75
+ # @return [Boolean]
76
+ def ==(other)
77
+ if other.is_a?(Numeric)
78
+ @x == other &&
79
+ @y == other &&
80
+ @z == other &&
81
+ @weight == other
82
+ elsif other.is_a?(Vector)
83
+ @x == other.x &&
84
+ @y == other.y &&
85
+ @z == other.z &&
86
+ @weight == other.weight
87
+ else
88
+ other == self
89
+ end
90
+ end
91
+
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}
99
+ private def operator(function, other)
100
+ if other.is_a?(Numeric)
101
+ Vector.new(
102
+ @x.send(:"#{function}", other),
103
+ @y.send(:"#{function}", other),
104
+ @z.send(:"#{function}", other)
105
+ )
106
+ else
107
+ Vector.new(
108
+ @x.send(:"#{function}", other.x),
109
+ @y.send(:"#{function}", other.y),
110
+ @z.send(:"#{function}", other.z)
111
+ )
112
+ end
113
+ end
114
+
115
+ # Adds Vector and Numeric or Vector and Vector, excluding {weight}
116
+ # @return [CyberarmEngine::Vector]
117
+ def +(other)
118
+ operator("+", other)
119
+ end
120
+
121
+ # Subtracts Vector and Numeric or Vector and Vector, excluding {weight}
122
+ # @return [CyberarmEngine::Vector]
123
+ def -(other)
124
+ operator("-", other)
125
+ end
126
+
127
+ # Multiplies Vector and Numeric or Vector and Vector, excluding {weight}
128
+ # @return [CyberarmEngine::Vector]
129
+ def *(other)
130
+ operator("*", other)
131
+ end
132
+
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]
146
+ def /(other)
147
+ # Duplicated to protect from DivideByZero
148
+ if other.is_a?(Numeric)
149
+ Vector.new(
150
+ (@x == 0 ? 0 : @x / other),
151
+ (@y == 0 ? 0 : @y / other),
152
+ (@z == 0 ? 0 : @z / other)
153
+ )
154
+ else
155
+ Vector.new(
156
+ (@x == 0 ? 0 : @x / other.x),
157
+ (@y == 0 ? 0 : @y / other.y),
158
+ (@z == 0 ? 0 : @z / other.z)
159
+ )
160
+ end
161
+ end
162
+
163
+ # dot product of {Vector}
164
+ # @return [Integer|Float]
165
+ def dot(other)
166
+ product = 0
167
+
168
+ a = to_a
169
+ b = other.to_a
170
+
171
+ 3.times do |i|
172
+ product += (a[i] * b[i])
173
+ end
174
+
175
+ product
176
+ end
177
+
178
+ # cross product of {Vector}
179
+ # @return [CyberarmEngine::Vector]
180
+ def cross(other)
181
+ a = to_a
182
+ b = other.to_a
183
+
184
+ Vector.new(
185
+ b[2] * a[1] - b[1] * a[2],
186
+ b[0] * a[2] - b[2] * a[0],
187
+ b[1] * a[0] - b[0] * a[1]
188
+ )
189
+ end
190
+
191
+ # returns degrees
192
+ # @return [Float]
193
+ def angle(other)
194
+ Math.acos(normalized.dot(other.normalized)) * 180 / Math::PI
195
+ end
196
+
197
+ # returns magnitude of Vector, ignoring #weight
198
+ # @return [Float]
199
+ def magnitude
200
+ Math.sqrt((@x * @x) + (@y * @y) + (@z * @z))
201
+ end
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]
211
+ def normalized
212
+ mag = magnitude
213
+ self / Vector.new(mag, mag, mag)
214
+ end
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]
224
+ def direction
225
+ _x = -Math.sin(@y.degrees_to_radians) * Math.cos(@z.degrees_to_radians)
226
+ _y = Math.sin(@z.degrees_to_radians)
227
+ _z = Math.cos(@y.degrees_to_radians) * Math.cos(@z.degrees_to_radians)
228
+
229
+ Vector.new(_x, _y, _z)
230
+ end
231
+
232
+ # returns an inverse {Vector}
233
+ # @return [CyberarmEngine::Vector]
234
+ def inverse
235
+ Vector.new(1.0 / @x, 1.0 / @y, 1.0 / @z)
236
+ end
237
+
238
+ # Adds up values of {x}, {y}, and {z}
239
+ # @return [Integer|Float]
240
+ def sum
241
+ @x + @y + @z
242
+ end
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]
253
+ def lerp(other, factor)
254
+ (self - other) * factor.clamp(0.0, 1.0)
255
+ end
256
+
257
+ # 2D distance using X and Y
258
+ # @return [Float]
259
+ def distance(other)
260
+ Math.sqrt((@x - other.x)**2 + (@y - other.y)**2)
261
+ end
262
+
263
+ # 2D distance using X and Z
264
+ # @return [Float]
265
+ def gl_distance2d(other)
266
+ Math.sqrt((@x - other.x)**2 + (@z - other.z)**2)
267
+ end
268
+
269
+ # 3D distance using X, Y, and Z
270
+ # @return [Float]
271
+ def distance3d(other)
272
+ Math.sqrt((@x - other.x)**2 + (@y - other.y)**2 + (@z - other.z)**2)
273
+ end
274
+
275
+ # Converts {Vector} to Array
276
+ # @return [Array]
277
+ def to_a
278
+ [@x, @y, @z, @weight]
279
+ end
280
+
281
+ # Converts {Vector} to String
282
+ # @return [String]
283
+ def to_s
284
+ "X: #{@x}, Y: #{@y}, Z: #{@z}, Weight: #{@weight}"
285
+ end
286
+
287
+ # Converts {Vector} to Hash
288
+ # @return [Hash]
289
+ def to_h
290
+ { x: @x, y: @y, z: @z, weight: @weight }
291
+ end
292
+ end
293
+ end