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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +21 -1
- data/README.md +64 -3
- data/docs/browser-runtime.md +90 -24
- data/docs/next-work.md +9 -5
- data/docs/publishing.md +116 -23
- data/docs/release-readiness.md +5 -3
- data/docs/standalone-browser-app.md +102 -0
- data/examples/browser/README.md +6 -0
- data/examples/browser/composition/main.rb +41 -61
- data/examples/browser/cube/main.rb +4 -34
- data/examples/browser/cubemap/main.rb +16 -39
- data/examples/browser/gltf/main.rb +28 -48
- data/examples/browser/picking/main.rb +27 -53
- data/examples/browser/postprocessing/main.rb +23 -42
- data/examples/browser/primitives/main.rb +18 -41
- data/examples/browser/ruby/README.md +22 -0
- data/examples/browser/ruby/boot.mjs +6 -0
- data/examples/browser/ruby/index.html +142 -0
- data/examples/browser/ruby/main.rb +313 -0
- data/examples/browser/ruby/smoke_test.mjs +126 -0
- data/examples/browser/serialization/main.rb +19 -41
- data/examples/browser/shared/boot.mjs +37 -5
- data/examples/browser/textures/main.rb +21 -39
- data/exe/three-rb +55 -0
- data/lib/three/backends/threejs/materialization.rb +6 -0
- data/lib/three/backends/threejs/parameters.rb +17 -0
- data/lib/three/backends/threejs/ruby_wasm_adapter.rb +166 -59
- data/lib/three/backends/threejs/synchronization.rb +38 -4
- data/lib/three/backends/threejs.rb +24 -0
- data/lib/three/browser.rb +389 -0
- data/lib/three/constants.rb +6 -0
- data/lib/three/core/buffer_attribute.rb +5 -1
- data/lib/three/core/buffer_geometry.rb +29 -1
- data/lib/three/core/object3d.rb +39 -1
- data/lib/three/exporters/three_json_exporter.rb +3 -0
- data/lib/three/generators/browser_example.rb +315 -0
- data/lib/three/geometries/text_geometry.rb +41 -0
- data/lib/three/loaders/font_loader.rb +29 -0
- data/lib/three/loaders/three_json_loader.rb +92 -46
- data/lib/three/materials/material.rb +2 -1
- data/lib/three/math/matrix4.rb +27 -0
- data/lib/three/renderers/threejs_renderer.rb +19 -0
- data/lib/three/scenes/fog.rb +86 -0
- data/lib/three/scenes/scene.rb +19 -1
- data/lib/three/textures/texture.rb +2 -1
- data/lib/three/version.rb +1 -1
- data/lib/three.rb +4 -0
- data/package.json +2 -1
- metadata +16 -3
data/lib/three/math/matrix4.rb
CHANGED
|
@@ -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
|
data/lib/three/scenes/scene.rb
CHANGED
|
@@ -5,7 +5,7 @@ require_relative "../core/object3d"
|
|
|
5
5
|
module Three
|
|
6
6
|
class Scene < Object3D
|
|
7
7
|
attr_reader :background, :environment
|
|
8
|
-
|
|
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
|
data/lib/three/version.rb
CHANGED
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.
|
|
4
|
+
version: 0.2.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- LEF
|
|
8
|
-
bindir:
|
|
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
|