three-rb 0.1.0 → 0.2.1

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 (61) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +33 -1
  3. data/README.md +66 -3
  4. data/docs/browser-runtime.md +92 -24
  5. data/docs/loaded-assets-design.md +1 -1
  6. data/docs/next-work.md +9 -5
  7. data/docs/publishing.md +119 -23
  8. data/docs/release-readiness.md +5 -3
  9. data/docs/standalone-browser-app.md +106 -0
  10. data/examples/browser/README.md +8 -0
  11. data/examples/browser/composition/main.rb +44 -64
  12. data/examples/browser/cube/main.rb +4 -34
  13. data/examples/browser/cubemap/assets/checker.svg +11 -0
  14. data/examples/browser/cubemap/main.rb +17 -40
  15. data/examples/browser/gltf/main.rb +30 -50
  16. data/examples/browser/picking/main.rb +27 -53
  17. data/examples/browser/postprocessing/main.rb +23 -42
  18. data/examples/browser/primitives/assets/checker.svg +11 -0
  19. data/examples/browser/primitives/main.rb +19 -42
  20. data/examples/browser/ruby/README.md +24 -0
  21. data/examples/browser/ruby/boot.mjs +6 -0
  22. data/examples/browser/ruby/index.html +142 -0
  23. data/examples/browser/ruby/main.rb +313 -0
  24. data/examples/browser/ruby/smoke_test.mjs +126 -0
  25. data/examples/browser/serialization/assets/checker.svg +11 -0
  26. data/examples/browser/serialization/main.rb +20 -42
  27. data/examples/browser/shared/boot.mjs +37 -5
  28. data/examples/browser/textures/assets/checker.svg +11 -0
  29. data/examples/browser/textures/assets/studio.hdr +5 -0
  30. data/examples/browser/textures/main.rb +23 -41
  31. data/exe/three-rb +56 -0
  32. data/lib/three/backends/threejs/materialization.rb +6 -0
  33. data/lib/three/backends/threejs/parameters.rb +17 -0
  34. data/lib/three/backends/threejs/ruby_wasm_adapter.rb +166 -59
  35. data/lib/three/backends/threejs/synchronization.rb +38 -4
  36. data/lib/three/backends/threejs.rb +24 -0
  37. data/lib/three/browser.rb +389 -0
  38. data/lib/three/constants.rb +6 -0
  39. data/lib/three/core/buffer_attribute.rb +5 -1
  40. data/lib/three/core/buffer_geometry.rb +29 -1
  41. data/lib/three/core/object3d.rb +39 -1
  42. data/lib/three/exporters/three_json_exporter.rb +3 -0
  43. data/lib/three/generators/browser_example.rb +396 -0
  44. data/lib/three/geometries/text_geometry.rb +41 -0
  45. data/lib/three/loaders/font_loader.rb +29 -0
  46. data/lib/three/loaders/three_json_loader.rb +92 -46
  47. data/lib/three/materials/material.rb +2 -1
  48. data/lib/three/math/matrix4.rb +27 -0
  49. data/lib/three/renderers/threejs_renderer.rb +19 -0
  50. data/lib/three/scenes/fog.rb +86 -0
  51. data/lib/three/scenes/scene.rb +19 -1
  52. data/lib/three/textures/texture.rb +2 -1
  53. data/lib/three/version.rb +1 -1
  54. data/lib/three.rb +4 -0
  55. data/package.json +2 -1
  56. metadata +26 -8
  57. /data/examples/browser/{assets → composition/assets}/checker.svg +0 -0
  58. /data/examples/browser/{assets → gltf/assets}/animated_triangle.gltf +0 -0
  59. /data/examples/browser/{assets → gltf/assets}/compressed_triangle.gltf +0 -0
  60. /data/examples/browser/{assets → gltf/assets}/triangle.gltf +0 -0
  61. /data/examples/browser/{assets → ruby/assets}/studio.hdr +0 -0
@@ -13,6 +13,7 @@ module Three
13
13
  0, 0, 1, 0,
14
14
  0, 0, 0, 1
15
15
  ]
16
+ @on_change_callback = proc {}
16
17
 
17
18
  set(*values) unless values.empty?
18
19
  end
@@ -34,6 +35,7 @@ module Three
34
35
  @elements[7] = n42
35
36
  @elements[11] = n43
36
37
  @elements[15] = n44
38
+ changed!
37
39
  self
38
40
  end
39
41
 
@@ -52,6 +54,7 @@ module Three
52
54
 
53
55
  def copy(matrix)
54
56
  @elements = matrix.elements.dup
57
+ changed!
55
58
  self
56
59
  end
57
60
 
@@ -59,6 +62,7 @@ module Three
59
62
  @elements[12] = matrix.elements[12]
60
63
  @elements[13] = matrix.elements[13]
61
64
  @elements[14] = matrix.elements[14]
65
+ changed!
62
66
  self
63
67
  end
64
68
 
@@ -101,6 +105,7 @@ module Three
101
105
  @elements[14] = z
102
106
  end
103
107
 
108
+ changed!
104
109
  self
105
110
  end
106
111
 
@@ -169,11 +174,13 @@ module Three
169
174
  @elements[7] = a41 * b12 + a42 * b22 + a43 * b32 + a44 * b42
170
175
  @elements[11] = a41 * b13 + a42 * b23 + a43 * b33 + a44 * b43
171
176
  @elements[15] = a41 * b14 + a42 * b24 + a43 * b34 + a44 * b44
177
+ changed!
172
178
  self
173
179
  end
174
180
 
175
181
  def multiply_scalar(scalar)
176
182
  @elements.map! { |value| value * scalar }
183
+ changed!
177
184
  self
178
185
  end
179
186
 
@@ -215,6 +222,7 @@ module Three
215
222
  @elements[3], @elements[12] = @elements[12], @elements[3]
216
223
  @elements[7], @elements[13] = @elements[13], @elements[7]
217
224
  @elements[11], @elements[14] = @elements[14], @elements[11]
225
+ changed!
218
226
  self
219
227
  end
220
228
 
@@ -270,6 +278,7 @@ module Three
270
278
  @elements[13] = (n11 * t10 - n21 * t8 + n31 * t7) * det_inv
271
279
  @elements[14] = (n24 * t2 - n14 * t4 - n34 * t1) * det_inv
272
280
  @elements[15] = (n13 * t4 - n23 * t2 + n33 * t1) * det_inv
281
+ changed!
273
282
  self
274
283
  end
275
284
 
@@ -286,6 +295,7 @@ module Three
286
295
  @elements[3] *= vector.x
287
296
  @elements[7] *= vector.y
288
297
  @elements[11] *= vector.z
298
+ changed!
289
299
  self
290
300
  end
291
301
 
@@ -313,6 +323,7 @@ module Three
313
323
  @elements[7] = 0
314
324
  @elements[11] = -1
315
325
  @elements[15] = 0
326
+ changed!
316
327
  self
317
328
  end
318
329
 
@@ -340,6 +351,7 @@ module Three
340
351
  @elements[7] = 0
341
352
  @elements[11] = 0
342
353
  @elements[15] = 1
354
+ changed!
343
355
  self
344
356
  end
345
357
 
@@ -383,6 +395,7 @@ module Three
383
395
  @elements[13] = position.y
384
396
  @elements[14] = position.z
385
397
  @elements[15] = 1
398
+ changed!
386
399
  self
387
400
  end
388
401
 
@@ -419,9 +432,17 @@ module Three
419
432
 
420
433
  def from_array(array, offset = 0)
421
434
  16.times { |index| @elements[index] = array[index + offset] }
435
+ changed!
422
436
  self
423
437
  end
424
438
 
439
+ def on_change(&callback)
440
+ @on_change_callback = callback || proc {}
441
+ self
442
+ end
443
+
444
+ alias _on_change on_change
445
+
425
446
  def to_a
426
447
  @elements.dup
427
448
  end
@@ -444,5 +465,11 @@ module Three
444
465
  def inspect
445
466
  "#<#{self.class} elements=#{@elements.inspect}>"
446
467
  end
468
+
469
+ private
470
+
471
+ def changed!
472
+ @on_change_callback.call
473
+ end
447
474
  end
448
475
  end
@@ -33,6 +33,16 @@ module Three
33
33
  self
34
34
  end
35
35
 
36
+ def tone_mapping=(value)
37
+ @backend.set_renderer_tone_mapping(@handle, value)
38
+ value
39
+ end
40
+
41
+ def tone_mapping_exposure=(value)
42
+ @backend.set_renderer_tone_mapping_exposure(@handle, value)
43
+ value
44
+ end
45
+
36
46
  def configure_shadow_map(enabled: nil, type: nil, auto_update: nil)
37
47
  @backend.set_renderer_shadow_map(@handle, enabled: enabled, type: type, auto_update: auto_update)
38
48
  self
@@ -55,6 +65,15 @@ module Three
55
65
  self
56
66
  end
57
67
 
68
+ def on_dispose(object, &block)
69
+ @backend.add_event_listener(object, :dispose, block)
70
+ self
71
+ end
72
+
73
+ def cached?(object)
74
+ @backend.cached?(object)
75
+ end
76
+
58
77
  def traverse_handles(object, &block)
59
78
  return enum_for(:traverse_handles, object) unless block
60
79
 
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../dirty"
4
+ require_relative "../math/color"
5
+ require_relative "../math/math_utils"
6
+
7
+ module Three
8
+ class Fog
9
+ include Dirty
10
+
11
+ attr_reader :uuid, :color, :name, :type, :near, :far
12
+
13
+ def initialize(color = 0xffffff, near: 1, far: 1000, name: "")
14
+ @uuid = MathUtils.generate_uuid
15
+ @type = "Fog"
16
+ @name = name
17
+ @color = color.is_a?(Color) ? color : Color.new(color)
18
+ @near = near
19
+ @far = far
20
+ bind_color_changes
21
+ mark_dirty!
22
+ end
23
+
24
+ def name=(value)
25
+ @name = value
26
+ mark_dirty!(:parameters)
27
+ end
28
+
29
+ def color=(value)
30
+ @color = value.is_a?(Color) ? value : Color.new(value)
31
+ bind_color_changes
32
+ mark_dirty!(:parameters)
33
+ end
34
+
35
+ def near=(value)
36
+ @near = value
37
+ mark_dirty!(:parameters)
38
+ end
39
+
40
+ def far=(value)
41
+ @far = value
42
+ mark_dirty!(:parameters)
43
+ end
44
+
45
+ def to_h
46
+ {
47
+ type: @type,
48
+ name: @name,
49
+ color: @color.hex,
50
+ near: @near,
51
+ far: @far
52
+ }
53
+ end
54
+
55
+ private
56
+
57
+ def bind_color_changes
58
+ @color.on_change { mark_dirty!(:parameters) }
59
+ end
60
+ end
61
+
62
+ class FogExp2 < Fog
63
+ attr_reader :density
64
+
65
+ def initialize(color = 0xffffff, density: 0.00025, name: "")
66
+ super(color, near: nil, far: nil, name: name)
67
+ @type = "FogExp2"
68
+ @density = density
69
+ mark_dirty!
70
+ end
71
+
72
+ def density=(value)
73
+ @density = value
74
+ mark_dirty!(:parameters)
75
+ end
76
+
77
+ def to_h
78
+ {
79
+ type: @type,
80
+ name: name,
81
+ color: color.hex,
82
+ density: @density
83
+ }
84
+ end
85
+ end
86
+ end
@@ -5,7 +5,7 @@ require_relative "../core/object3d"
5
5
  module Three
6
6
  class Scene < Object3D
7
7
  attr_reader :background, :environment
8
- attr_accessor :fog, :override_material
8
+ attr_reader :fog, :override_material
9
9
 
10
10
  def initialize
11
11
  super
@@ -25,5 +25,23 @@ module Three
25
25
  @environment = value
26
26
  mark_dirty!(:scene)
27
27
  end
28
+
29
+ def fog=(value)
30
+ replace_scene_resource(:fog, value)
31
+ end
32
+
33
+ def override_material=(value)
34
+ replace_scene_resource(:override_material, value)
35
+ end
36
+
37
+ private
38
+
39
+ def replace_scene_resource(name, value)
40
+ current = instance_variable_get(:"@#{name}")
41
+ current.remove_dirty_dependent(self) if current.respond_to?(:remove_dirty_dependent)
42
+ instance_variable_set(:"@#{name}", value)
43
+ value.add_dirty_dependent(self) if value.respond_to?(:add_dirty_dependent)
44
+ mark_dirty!(:scene)
45
+ end
28
46
  end
29
47
  end
@@ -159,7 +159,8 @@ module Three
159
159
  center: @center.to_a,
160
160
  rotation: @rotation,
161
161
  matrix_auto_update: @matrix_auto_update,
162
- matrix: @matrix.to_a
162
+ matrix: @matrix.to_a,
163
+ user_data: @user_data
163
164
  }
164
165
  end
165
166
 
data/lib/three/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Three
4
- VERSION = "0.1.0"
4
+ VERSION = "0.2.1"
5
5
  end
data/lib/three.rb CHANGED
@@ -27,6 +27,7 @@ require_relative "three/objects/instanced_mesh"
27
27
  require_relative "three/objects/line"
28
28
  require_relative "three/objects/points"
29
29
  require_relative "three/objects/sprite"
30
+ require_relative "three/scenes/fog"
30
31
  require_relative "three/scenes/scene"
31
32
  require_relative "three/cameras/camera"
32
33
  require_relative "three/cameras/perspective_camera"
@@ -52,11 +53,13 @@ require_relative "three/materials/sprite_material"
52
53
  require_relative "three/loaders/texture_loader"
53
54
  require_relative "three/loaders/cube_texture_loader"
54
55
  require_relative "three/loaders/rgbe_loader"
56
+ require_relative "three/loaders/font_loader"
55
57
  require_relative "three/loaders/gltf_loader"
56
58
  require_relative "three/loaders/three_json_loader"
57
59
  require_relative "three/geometries/box_geometry"
58
60
  require_relative "three/geometries/plane_geometry"
59
61
  require_relative "three/geometries/sphere_geometry"
62
+ require_relative "three/geometries/text_geometry"
60
63
  require_relative "three/backends/base"
61
64
  require_relative "three/backends/threejs"
62
65
  require_relative "three/core/raycaster"
@@ -72,6 +75,7 @@ require_relative "three/postprocessing/unreal_bloom_pass"
72
75
  require_relative "three/postprocessing/dot_screen_pass"
73
76
  require_relative "three/postprocessing/output_pass"
74
77
  require_relative "three/exporters/three_json_exporter"
78
+ require_relative "three/browser"
75
79
 
76
80
  module Three
77
81
  end
data/package.json CHANGED
@@ -4,7 +4,8 @@
4
4
  "type": "module",
5
5
  "packageManager": "pnpm@11.1.1",
6
6
  "scripts": {
7
- "test:browser": "pnpm test:browser:cube && pnpm test:browser:composition && pnpm test:browser:textures && pnpm test:browser:cubemap && pnpm test:browser:gltf && pnpm test:browser:serialization && pnpm test:browser:picking && pnpm test:browser:primitives && pnpm test:browser:postprocessing",
7
+ "test:browser": "pnpm test:browser:ruby && pnpm test:browser:cube && pnpm test:browser:composition && pnpm test:browser:textures && pnpm test:browser:cubemap && pnpm test:browser:gltf && pnpm test:browser:serialization && pnpm test:browser:picking && pnpm test:browser:primitives && pnpm test:browser:postprocessing",
8
+ "test:browser:ruby": "node examples/browser/ruby/smoke_test.mjs",
8
9
  "test:browser:cube": "node examples/browser/cube/smoke_test.mjs",
9
10
  "test:browser:composition": "node examples/browser/composition/smoke_test.mjs",
10
11
  "test:browser:textures": "node examples/browser/textures/smoke_test.mjs",
metadata CHANGED
@@ -1,11 +1,11 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: three-rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - LEF
8
- bindir: bin
8
+ bindir: exe
9
9
  cert_chain: []
10
10
  date: 1980-01-02 00:00:00.000000000 Z
11
11
  dependencies:
@@ -40,7 +40,8 @@ dependencies:
40
40
  description: three-rb provides Ruby APIs for building 3D scenes, with browser rendering
41
41
  through ruby.wasm and three.js.
42
42
  email: []
43
- executables: []
43
+ executables:
44
+ - three-rb
44
45
  extensions: []
45
46
  extra_rdoc_files: []
46
47
  files:
@@ -53,13 +54,10 @@ files:
53
54
  - docs/next-work.md
54
55
  - docs/publishing.md
55
56
  - docs/release-readiness.md
57
+ - docs/standalone-browser-app.md
56
58
  - examples/browser/README.md
57
- - examples/browser/assets/animated_triangle.gltf
58
- - examples/browser/assets/checker.svg
59
- - examples/browser/assets/compressed_triangle.gltf
60
- - examples/browser/assets/studio.hdr
61
- - examples/browser/assets/triangle.gltf
62
59
  - examples/browser/composition/README.md
60
+ - examples/browser/composition/assets/checker.svg
63
61
  - examples/browser/composition/boot.mjs
64
62
  - examples/browser/composition/index.html
65
63
  - examples/browser/composition/main.rb
@@ -70,11 +68,15 @@ files:
70
68
  - examples/browser/cube/main.rb
71
69
  - examples/browser/cube/smoke_test.mjs
72
70
  - examples/browser/cubemap/README.md
71
+ - examples/browser/cubemap/assets/checker.svg
73
72
  - examples/browser/cubemap/boot.mjs
74
73
  - examples/browser/cubemap/index.html
75
74
  - examples/browser/cubemap/main.rb
76
75
  - examples/browser/cubemap/smoke_test.mjs
77
76
  - examples/browser/gltf/README.md
77
+ - examples/browser/gltf/assets/animated_triangle.gltf
78
+ - examples/browser/gltf/assets/compressed_triangle.gltf
79
+ - examples/browser/gltf/assets/triangle.gltf
78
80
  - examples/browser/gltf/boot.mjs
79
81
  - examples/browser/gltf/index.html
80
82
  - examples/browser/gltf/main.rb
@@ -90,11 +92,19 @@ files:
90
92
  - examples/browser/postprocessing/main.rb
91
93
  - examples/browser/postprocessing/smoke_test.mjs
92
94
  - examples/browser/primitives/README.md
95
+ - examples/browser/primitives/assets/checker.svg
93
96
  - examples/browser/primitives/boot.mjs
94
97
  - examples/browser/primitives/index.html
95
98
  - examples/browser/primitives/main.rb
96
99
  - examples/browser/primitives/smoke_test.mjs
100
+ - examples/browser/ruby/README.md
101
+ - examples/browser/ruby/assets/studio.hdr
102
+ - examples/browser/ruby/boot.mjs
103
+ - examples/browser/ruby/index.html
104
+ - examples/browser/ruby/main.rb
105
+ - examples/browser/ruby/smoke_test.mjs
97
106
  - examples/browser/serialization/README.md
107
+ - examples/browser/serialization/assets/checker.svg
98
108
  - examples/browser/serialization/boot.mjs
99
109
  - examples/browser/serialization/index.html
100
110
  - examples/browser/serialization/main.rb
@@ -102,10 +112,13 @@ files:
102
112
  - examples/browser/shared/boot.mjs
103
113
  - examples/browser/shared/smoke_test_helpers.mjs
104
114
  - examples/browser/textures/README.md
115
+ - examples/browser/textures/assets/checker.svg
116
+ - examples/browser/textures/assets/studio.hdr
105
117
  - examples/browser/textures/boot.mjs
106
118
  - examples/browser/textures/index.html
107
119
  - examples/browser/textures/main.rb
108
120
  - examples/browser/textures/smoke_test.mjs
121
+ - exe/three-rb
109
122
  - lib/three-rb.rb
110
123
  - lib/three.rb
111
124
  - lib/three/animation/animation_action.rb
@@ -118,6 +131,7 @@ files:
118
131
  - lib/three/backends/threejs/resource_management.rb
119
132
  - lib/three/backends/threejs/ruby_wasm_adapter.rb
120
133
  - lib/three/backends/threejs/synchronization.rb
134
+ - lib/three/browser.rb
121
135
  - lib/three/cameras/camera.rb
122
136
  - lib/three/cameras/orthographic_camera.rb
123
137
  - lib/three/cameras/perspective_camera.rb
@@ -132,15 +146,18 @@ files:
132
146
  - lib/three/core/raycaster.rb
133
147
  - lib/three/dirty.rb
134
148
  - lib/three/exporters/three_json_exporter.rb
149
+ - lib/three/generators/browser_example.rb
135
150
  - lib/three/geometries/box_geometry.rb
136
151
  - lib/three/geometries/plane_geometry.rb
137
152
  - lib/three/geometries/sphere_geometry.rb
153
+ - lib/three/geometries/text_geometry.rb
138
154
  - lib/three/lights/ambient_light.rb
139
155
  - lib/three/lights/directional_light.rb
140
156
  - lib/three/lights/hemisphere_light.rb
141
157
  - lib/three/lights/light.rb
142
158
  - lib/three/lights/point_light.rb
143
159
  - lib/three/loaders/cube_texture_loader.rb
160
+ - lib/three/loaders/font_loader.rb
144
161
  - lib/three/loaders/gltf_loader.rb
145
162
  - lib/three/loaders/rgbe_loader.rb
146
163
  - lib/three/loaders/texture_loader.rb
@@ -180,6 +197,7 @@ files:
180
197
  - lib/three/postprocessing/unreal_bloom_pass.rb
181
198
  - lib/three/renderers/renderer.rb
182
199
  - lib/three/renderers/threejs_renderer.rb
200
+ - lib/three/scenes/fog.rb
183
201
  - lib/three/scenes/scene.rb
184
202
  - lib/three/textures/cube_texture.rb
185
203
  - lib/three/textures/rgbe_texture.rb