three-rb 0.1.0 → 0.2.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 (50) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +21 -1
  3. data/README.md +64 -3
  4. data/docs/browser-runtime.md +90 -24
  5. data/docs/next-work.md +9 -5
  6. data/docs/publishing.md +116 -23
  7. data/docs/release-readiness.md +5 -3
  8. data/docs/standalone-browser-app.md +102 -0
  9. data/examples/browser/README.md +6 -0
  10. data/examples/browser/composition/main.rb +41 -61
  11. data/examples/browser/cube/main.rb +4 -34
  12. data/examples/browser/cubemap/main.rb +16 -39
  13. data/examples/browser/gltf/main.rb +28 -48
  14. data/examples/browser/picking/main.rb +27 -53
  15. data/examples/browser/postprocessing/main.rb +23 -42
  16. data/examples/browser/primitives/main.rb +18 -41
  17. data/examples/browser/ruby/README.md +22 -0
  18. data/examples/browser/ruby/boot.mjs +6 -0
  19. data/examples/browser/ruby/index.html +142 -0
  20. data/examples/browser/ruby/main.rb +313 -0
  21. data/examples/browser/ruby/smoke_test.mjs +126 -0
  22. data/examples/browser/serialization/main.rb +19 -41
  23. data/examples/browser/shared/boot.mjs +37 -5
  24. data/examples/browser/textures/main.rb +21 -39
  25. data/exe/three-rb +55 -0
  26. data/lib/three/backends/threejs/materialization.rb +6 -0
  27. data/lib/three/backends/threejs/parameters.rb +17 -0
  28. data/lib/three/backends/threejs/ruby_wasm_adapter.rb +166 -59
  29. data/lib/three/backends/threejs/synchronization.rb +38 -4
  30. data/lib/three/backends/threejs.rb +24 -0
  31. data/lib/three/browser.rb +389 -0
  32. data/lib/three/constants.rb +6 -0
  33. data/lib/three/core/buffer_attribute.rb +5 -1
  34. data/lib/three/core/buffer_geometry.rb +29 -1
  35. data/lib/three/core/object3d.rb +39 -1
  36. data/lib/three/exporters/three_json_exporter.rb +3 -0
  37. data/lib/three/generators/browser_example.rb +315 -0
  38. data/lib/three/geometries/text_geometry.rb +41 -0
  39. data/lib/three/loaders/font_loader.rb +29 -0
  40. data/lib/three/loaders/three_json_loader.rb +92 -46
  41. data/lib/three/materials/material.rb +2 -1
  42. data/lib/three/math/matrix4.rb +27 -0
  43. data/lib/three/renderers/threejs_renderer.rb +19 -0
  44. data/lib/three/scenes/fog.rb +86 -0
  45. data/lib/three/scenes/scene.rb +19 -1
  46. data/lib/three/textures/texture.rb +2 -1
  47. data/lib/three/version.rb +1 -1
  48. data/lib/three.rb +4 -0
  49. data/package.json +2 -1
  50. metadata +16 -3
@@ -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.0"
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.0
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,6 +54,7 @@ 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
59
  - examples/browser/assets/animated_triangle.gltf
58
60
  - examples/browser/assets/checker.svg
@@ -94,6 +96,11 @@ files:
94
96
  - examples/browser/primitives/index.html
95
97
  - examples/browser/primitives/main.rb
96
98
  - examples/browser/primitives/smoke_test.mjs
99
+ - examples/browser/ruby/README.md
100
+ - examples/browser/ruby/boot.mjs
101
+ - examples/browser/ruby/index.html
102
+ - examples/browser/ruby/main.rb
103
+ - examples/browser/ruby/smoke_test.mjs
97
104
  - examples/browser/serialization/README.md
98
105
  - examples/browser/serialization/boot.mjs
99
106
  - examples/browser/serialization/index.html
@@ -106,6 +113,7 @@ files:
106
113
  - examples/browser/textures/index.html
107
114
  - examples/browser/textures/main.rb
108
115
  - examples/browser/textures/smoke_test.mjs
116
+ - exe/three-rb
109
117
  - lib/three-rb.rb
110
118
  - lib/three.rb
111
119
  - lib/three/animation/animation_action.rb
@@ -118,6 +126,7 @@ files:
118
126
  - lib/three/backends/threejs/resource_management.rb
119
127
  - lib/three/backends/threejs/ruby_wasm_adapter.rb
120
128
  - lib/three/backends/threejs/synchronization.rb
129
+ - lib/three/browser.rb
121
130
  - lib/three/cameras/camera.rb
122
131
  - lib/three/cameras/orthographic_camera.rb
123
132
  - lib/three/cameras/perspective_camera.rb
@@ -132,15 +141,18 @@ files:
132
141
  - lib/three/core/raycaster.rb
133
142
  - lib/three/dirty.rb
134
143
  - lib/three/exporters/three_json_exporter.rb
144
+ - lib/three/generators/browser_example.rb
135
145
  - lib/three/geometries/box_geometry.rb
136
146
  - lib/three/geometries/plane_geometry.rb
137
147
  - lib/three/geometries/sphere_geometry.rb
148
+ - lib/three/geometries/text_geometry.rb
138
149
  - lib/three/lights/ambient_light.rb
139
150
  - lib/three/lights/directional_light.rb
140
151
  - lib/three/lights/hemisphere_light.rb
141
152
  - lib/three/lights/light.rb
142
153
  - lib/three/lights/point_light.rb
143
154
  - lib/three/loaders/cube_texture_loader.rb
155
+ - lib/three/loaders/font_loader.rb
144
156
  - lib/three/loaders/gltf_loader.rb
145
157
  - lib/three/loaders/rgbe_loader.rb
146
158
  - lib/three/loaders/texture_loader.rb
@@ -180,6 +192,7 @@ files:
180
192
  - lib/three/postprocessing/unreal_bloom_pass.rb
181
193
  - lib/three/renderers/renderer.rb
182
194
  - lib/three/renderers/threejs_renderer.rb
195
+ - lib/three/scenes/fog.rb
183
196
  - lib/three/scenes/scene.rb
184
197
  - lib/three/textures/cube_texture.rb
185
198
  - lib/three/textures/rgbe_texture.rb