3rb 0.1.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 (100) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +2 -0
  3. data/3rb.gemspec +29 -0
  4. data/CHANGELOG.md +12 -0
  5. data/LICENSE +21 -0
  6. data/README.md +321 -0
  7. data/Rakefile +13 -0
  8. data/examples/01_hello_cube.rb +29 -0
  9. data/examples/02_basic_geometries.rb +56 -0
  10. data/examples/03_materials.rb +61 -0
  11. data/examples/04_lighting.rb +63 -0
  12. data/examples/05_animation.rb +79 -0
  13. data/examples/06_custom_shader.rb +92 -0
  14. data/examples/07_scene_graph.rb +74 -0
  15. data/examples/08_orbit_controls.rb +50 -0
  16. data/examples/09_3d_chart.rb +71 -0
  17. data/examples/10_procedural_terrain.rb +140 -0
  18. data/examples/11_particle_system.rb +68 -0
  19. data/examples/12_model_loader.rb +73 -0
  20. data/examples/13_game_prototype.rb +145 -0
  21. data/examples/14_utah_teapot.rb +291 -0
  22. data/examples/15_stanford_bunny.rb +200 -0
  23. data/examples/16_cornell_box.rb +373 -0
  24. data/examples/17_weird_fractal4.rb +130 -0
  25. data/examples/18_platonic_solids.rb +268 -0
  26. data/lib/3rb/animation/animation_clip.rb +287 -0
  27. data/lib/3rb/animation/animation_mixer.rb +366 -0
  28. data/lib/3rb/cameras/camera.rb +50 -0
  29. data/lib/3rb/cameras/orthographic_camera.rb +92 -0
  30. data/lib/3rb/cameras/perspective_camera.rb +103 -0
  31. data/lib/3rb/controls/orbit_controls.rb +341 -0
  32. data/lib/3rb/core/buffer_attribute.rb +172 -0
  33. data/lib/3rb/core/group.rb +9 -0
  34. data/lib/3rb/core/object3d.rb +298 -0
  35. data/lib/3rb/core/scene.rb +78 -0
  36. data/lib/3rb/dsl/helpers.rb +57 -0
  37. data/lib/3rb/dsl/scene_builder.rb +288 -0
  38. data/lib/3rb/ffi/glfw.rb +61 -0
  39. data/lib/3rb/ffi/opengl.rb +137 -0
  40. data/lib/3rb/ffi/platform.rb +65 -0
  41. data/lib/3rb/geometries/box_geometry.rb +101 -0
  42. data/lib/3rb/geometries/buffer_geometry.rb +345 -0
  43. data/lib/3rb/geometries/cone_geometry.rb +29 -0
  44. data/lib/3rb/geometries/cylinder_geometry.rb +149 -0
  45. data/lib/3rb/geometries/plane_geometry.rb +75 -0
  46. data/lib/3rb/geometries/sphere_geometry.rb +93 -0
  47. data/lib/3rb/geometries/torus_geometry.rb +77 -0
  48. data/lib/3rb/lights/ambient_light.rb +9 -0
  49. data/lib/3rb/lights/directional_light.rb +57 -0
  50. data/lib/3rb/lights/hemisphere_light.rb +26 -0
  51. data/lib/3rb/lights/light.rb +27 -0
  52. data/lib/3rb/lights/point_light.rb +68 -0
  53. data/lib/3rb/lights/rect_area_light.rb +35 -0
  54. data/lib/3rb/lights/spot_light.rb +88 -0
  55. data/lib/3rb/loaders/gltf_loader.rb +304 -0
  56. data/lib/3rb/loaders/loader.rb +94 -0
  57. data/lib/3rb/loaders/obj_loader.rb +186 -0
  58. data/lib/3rb/loaders/texture_loader.rb +55 -0
  59. data/lib/3rb/materials/basic_material.rb +70 -0
  60. data/lib/3rb/materials/lambert_material.rb +102 -0
  61. data/lib/3rb/materials/material.rb +114 -0
  62. data/lib/3rb/materials/phong_material.rb +106 -0
  63. data/lib/3rb/materials/shader_material.rb +104 -0
  64. data/lib/3rb/materials/standard_material.rb +106 -0
  65. data/lib/3rb/math/color.rb +246 -0
  66. data/lib/3rb/math/euler.rb +156 -0
  67. data/lib/3rb/math/math_utils.rb +132 -0
  68. data/lib/3rb/math/matrix3.rb +269 -0
  69. data/lib/3rb/math/matrix4.rb +501 -0
  70. data/lib/3rb/math/quaternion.rb +337 -0
  71. data/lib/3rb/math/vector2.rb +216 -0
  72. data/lib/3rb/math/vector3.rb +366 -0
  73. data/lib/3rb/math/vector4.rb +233 -0
  74. data/lib/3rb/native/gl.rb +382 -0
  75. data/lib/3rb/native/native.rb +55 -0
  76. data/lib/3rb/native/window.rb +111 -0
  77. data/lib/3rb/native.rb +9 -0
  78. data/lib/3rb/objects/line.rb +116 -0
  79. data/lib/3rb/objects/mesh.rb +40 -0
  80. data/lib/3rb/objects/points.rb +71 -0
  81. data/lib/3rb/renderers/opengl_renderer.rb +567 -0
  82. data/lib/3rb/renderers/renderer.rb +60 -0
  83. data/lib/3rb/renderers/shader_lib.rb +100 -0
  84. data/lib/3rb/textures/cube_texture.rb +26 -0
  85. data/lib/3rb/textures/data_texture.rb +35 -0
  86. data/lib/3rb/textures/render_target.rb +125 -0
  87. data/lib/3rb/textures/texture.rb +190 -0
  88. data/lib/3rb/version.rb +5 -0
  89. data/lib/3rb.rb +86 -0
  90. data/shaders/basic.frag +19 -0
  91. data/shaders/basic.vert +15 -0
  92. data/shaders/common/lights.glsl +53 -0
  93. data/shaders/common/uniforms.glsl +9 -0
  94. data/shaders/lambert.frag +37 -0
  95. data/shaders/lambert.vert +22 -0
  96. data/shaders/phong.frag +51 -0
  97. data/shaders/phong.vert +28 -0
  98. data/shaders/standard.frag +92 -0
  99. data/shaders/standard.vert +28 -0
  100. metadata +155 -0
@@ -0,0 +1,269 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sunrb
4
+ class Matrix3
5
+ attr_reader :elements
6
+
7
+ def initialize
8
+ @elements = [
9
+ 1.0, 0.0, 0.0,
10
+ 0.0, 1.0, 0.0,
11
+ 0.0, 0.0, 1.0
12
+ ]
13
+ end
14
+
15
+ def set(n11, n12, n13, n21, n22, n23, n31, n32, n33)
16
+ @elements[0] = n11.to_f
17
+ @elements[3] = n12.to_f
18
+ @elements[6] = n13.to_f
19
+ @elements[1] = n21.to_f
20
+ @elements[4] = n22.to_f
21
+ @elements[7] = n23.to_f
22
+ @elements[2] = n31.to_f
23
+ @elements[5] = n32.to_f
24
+ @elements[8] = n33.to_f
25
+ self
26
+ end
27
+
28
+ def identity
29
+ set(
30
+ 1, 0, 0,
31
+ 0, 1, 0,
32
+ 0, 0, 1
33
+ )
34
+ end
35
+
36
+ def copy(m)
37
+ @elements = m.elements.dup
38
+ self
39
+ end
40
+
41
+ def clone
42
+ Matrix3.new.copy(self)
43
+ end
44
+
45
+ def *(other)
46
+ clone.multiply!(other)
47
+ end
48
+
49
+ def multiply!(other)
50
+ ae = @elements
51
+ be = other.elements
52
+
53
+ a11 = ae[0]
54
+ a12 = ae[3]
55
+ a13 = ae[6]
56
+ a21 = ae[1]
57
+ a22 = ae[4]
58
+ a23 = ae[7]
59
+ a31 = ae[2]
60
+ a32 = ae[5]
61
+ a33 = ae[8]
62
+
63
+ b11 = be[0]
64
+ b12 = be[3]
65
+ b13 = be[6]
66
+ b21 = be[1]
67
+ b22 = be[4]
68
+ b23 = be[7]
69
+ b31 = be[2]
70
+ b32 = be[5]
71
+ b33 = be[8]
72
+
73
+ @elements[0] = a11 * b11 + a12 * b21 + a13 * b31
74
+ @elements[3] = a11 * b12 + a12 * b22 + a13 * b32
75
+ @elements[6] = a11 * b13 + a12 * b23 + a13 * b33
76
+
77
+ @elements[1] = a21 * b11 + a22 * b21 + a23 * b31
78
+ @elements[4] = a21 * b12 + a22 * b22 + a23 * b32
79
+ @elements[7] = a21 * b13 + a22 * b23 + a23 * b33
80
+
81
+ @elements[2] = a31 * b11 + a32 * b21 + a33 * b31
82
+ @elements[5] = a31 * b12 + a32 * b22 + a33 * b32
83
+ @elements[8] = a31 * b13 + a32 * b23 + a33 * b33
84
+
85
+ self
86
+ end
87
+
88
+ def premultiply!(other)
89
+ tmp = other * self
90
+ copy(tmp)
91
+ end
92
+
93
+ def determinant
94
+ a = @elements[0]
95
+ b = @elements[3]
96
+ c = @elements[6]
97
+ d = @elements[1]
98
+ e = @elements[4]
99
+ f = @elements[7]
100
+ g = @elements[2]
101
+ h = @elements[5]
102
+ i = @elements[8]
103
+
104
+ a * e * i - a * f * h - b * d * i + b * f * g + c * d * h - c * e * g
105
+ end
106
+
107
+ def transpose
108
+ clone.transpose!
109
+ end
110
+
111
+ def transpose!
112
+ tmp = @elements[1]
113
+ @elements[1] = @elements[3]
114
+ @elements[3] = tmp
115
+
116
+ tmp = @elements[2]
117
+ @elements[2] = @elements[6]
118
+ @elements[6] = tmp
119
+
120
+ tmp = @elements[5]
121
+ @elements[5] = @elements[7]
122
+ @elements[7] = tmp
123
+
124
+ self
125
+ end
126
+
127
+ def invert
128
+ clone.invert!
129
+ end
130
+
131
+ def invert!
132
+ e = @elements
133
+
134
+ n11 = e[0]
135
+ n21 = e[1]
136
+ n31 = e[2]
137
+ n12 = e[3]
138
+ n22 = e[4]
139
+ n32 = e[5]
140
+ n13 = e[6]
141
+ n23 = e[7]
142
+ n33 = e[8]
143
+
144
+ t11 = n33 * n22 - n32 * n23
145
+ t12 = n32 * n13 - n33 * n12
146
+ t13 = n23 * n12 - n22 * n13
147
+
148
+ det = n11 * t11 + n21 * t12 + n31 * t13
149
+
150
+ return identity if det.zero?
151
+
152
+ det_inv = 1.0 / det
153
+
154
+ e[0] = t11 * det_inv
155
+ e[1] = (n31 * n23 - n33 * n21) * det_inv
156
+ e[2] = (n32 * n21 - n31 * n22) * det_inv
157
+
158
+ e[3] = t12 * det_inv
159
+ e[4] = (n33 * n11 - n31 * n13) * det_inv
160
+ e[5] = (n31 * n12 - n32 * n11) * det_inv
161
+
162
+ e[6] = t13 * det_inv
163
+ e[7] = (n21 * n13 - n23 * n11) * det_inv
164
+ e[8] = (n22 * n11 - n21 * n12) * det_inv
165
+
166
+ self
167
+ end
168
+
169
+ def set_from_matrix4(m)
170
+ me = m.elements
171
+
172
+ set(
173
+ me[0], me[4], me[8],
174
+ me[1], me[5], me[9],
175
+ me[2], me[6], me[10]
176
+ )
177
+ end
178
+
179
+ def get_normal_matrix(matrix4)
180
+ set_from_matrix4(matrix4).invert!.transpose!
181
+ end
182
+
183
+ def make_rotation(theta)
184
+ c = Math.cos(theta)
185
+ s = Math.sin(theta)
186
+
187
+ set(
188
+ c, -s, 0,
189
+ s, c, 0,
190
+ 0, 0, 1
191
+ )
192
+ end
193
+
194
+ def make_scale(sx, sy)
195
+ set(
196
+ sx, 0, 0,
197
+ 0, sy, 0,
198
+ 0, 0, 1
199
+ )
200
+ end
201
+
202
+ def make_translation(tx, ty)
203
+ set(
204
+ 1, 0, tx,
205
+ 0, 1, ty,
206
+ 0, 0, 1
207
+ )
208
+ end
209
+
210
+ def scale!(sx, sy)
211
+ @elements[0] *= sx
212
+ @elements[3] *= sx
213
+ @elements[6] *= sx
214
+ @elements[1] *= sy
215
+ @elements[4] *= sy
216
+ @elements[7] *= sy
217
+ self
218
+ end
219
+
220
+ def rotate!(theta)
221
+ c = Math.cos(theta)
222
+ s = Math.sin(theta)
223
+
224
+ a11 = @elements[0]
225
+ a12 = @elements[3]
226
+ a13 = @elements[6]
227
+ a21 = @elements[1]
228
+ a22 = @elements[4]
229
+ a23 = @elements[7]
230
+
231
+ @elements[0] = c * a11 + s * a21
232
+ @elements[3] = c * a12 + s * a22
233
+ @elements[6] = c * a13 + s * a23
234
+
235
+ @elements[1] = -s * a11 + c * a21
236
+ @elements[4] = -s * a12 + c * a22
237
+ @elements[7] = -s * a13 + c * a23
238
+
239
+ self
240
+ end
241
+
242
+ def translate!(tx, ty)
243
+ @elements[0] += tx * @elements[2]
244
+ @elements[3] += tx * @elements[5]
245
+ @elements[6] += tx * @elements[8]
246
+ @elements[1] += ty * @elements[2]
247
+ @elements[4] += ty * @elements[5]
248
+ @elements[7] += ty * @elements[8]
249
+ self
250
+ end
251
+
252
+ def ==(other)
253
+ return false unless other.is_a?(Matrix3)
254
+
255
+ @elements.each_with_index do |e, i|
256
+ return false if (e - other.elements[i]).abs > Float::EPSILON
257
+ end
258
+ true
259
+ end
260
+
261
+ def to_a
262
+ @elements.dup
263
+ end
264
+
265
+ def inspect
266
+ "#<Sunrb::Matrix3 #{@elements.inspect}>"
267
+ end
268
+ end
269
+ end