three-rb 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 (145) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +19 -0
  3. data/LICENSE +21 -0
  4. data/README.md +153 -0
  5. data/docs/browser-runtime.md +153 -0
  6. data/docs/implementation-plan.md +874 -0
  7. data/docs/loaded-assets-design.md +400 -0
  8. data/docs/next-work.md +107 -0
  9. data/docs/publishing.md +64 -0
  10. data/docs/release-readiness.md +83 -0
  11. data/examples/browser/README.md +54 -0
  12. data/examples/browser/assets/animated_triangle.gltf +123 -0
  13. data/examples/browser/assets/checker.svg +11 -0
  14. data/examples/browser/assets/compressed_triangle.gltf +74 -0
  15. data/examples/browser/assets/studio.hdr +5 -0
  16. data/examples/browser/assets/triangle.gltf +67 -0
  17. data/examples/browser/composition/README.md +35 -0
  18. data/examples/browser/composition/boot.mjs +6 -0
  19. data/examples/browser/composition/index.html +136 -0
  20. data/examples/browser/composition/main.rb +216 -0
  21. data/examples/browser/composition/smoke_test.mjs +266 -0
  22. data/examples/browser/cube/README.md +41 -0
  23. data/examples/browser/cube/boot.mjs +6 -0
  24. data/examples/browser/cube/index.html +142 -0
  25. data/examples/browser/cube/main.rb +62 -0
  26. data/examples/browser/cube/smoke_test.mjs +99 -0
  27. data/examples/browser/cubemap/README.md +23 -0
  28. data/examples/browser/cubemap/boot.mjs +6 -0
  29. data/examples/browser/cubemap/index.html +142 -0
  30. data/examples/browser/cubemap/main.rb +84 -0
  31. data/examples/browser/cubemap/smoke_test.mjs +91 -0
  32. data/examples/browser/gltf/README.md +23 -0
  33. data/examples/browser/gltf/boot.mjs +6 -0
  34. data/examples/browser/gltf/index.html +142 -0
  35. data/examples/browser/gltf/main.rb +105 -0
  36. data/examples/browser/gltf/smoke_test.mjs +162 -0
  37. data/examples/browser/picking/README.md +33 -0
  38. data/examples/browser/picking/boot.mjs +6 -0
  39. data/examples/browser/picking/index.html +142 -0
  40. data/examples/browser/picking/main.rb +113 -0
  41. data/examples/browser/picking/smoke_test.mjs +78 -0
  42. data/examples/browser/postprocessing/README.md +26 -0
  43. data/examples/browser/postprocessing/boot.mjs +6 -0
  44. data/examples/browser/postprocessing/index.html +142 -0
  45. data/examples/browser/postprocessing/main.rb +117 -0
  46. data/examples/browser/postprocessing/smoke_test.mjs +121 -0
  47. data/examples/browser/primitives/README.md +33 -0
  48. data/examples/browser/primitives/boot.mjs +6 -0
  49. data/examples/browser/primitives/index.html +142 -0
  50. data/examples/browser/primitives/main.rb +116 -0
  51. data/examples/browser/primitives/smoke_test.mjs +113 -0
  52. data/examples/browser/serialization/README.md +33 -0
  53. data/examples/browser/serialization/boot.mjs +6 -0
  54. data/examples/browser/serialization/index.html +142 -0
  55. data/examples/browser/serialization/main.rb +97 -0
  56. data/examples/browser/serialization/smoke_test.mjs +67 -0
  57. data/examples/browser/shared/boot.mjs +79 -0
  58. data/examples/browser/shared/smoke_test_helpers.mjs +151 -0
  59. data/examples/browser/textures/README.md +35 -0
  60. data/examples/browser/textures/boot.mjs +6 -0
  61. data/examples/browser/textures/index.html +142 -0
  62. data/examples/browser/textures/main.rb +142 -0
  63. data/examples/browser/textures/smoke_test.mjs +189 -0
  64. data/lib/three/animation/animation_action.rb +57 -0
  65. data/lib/three/animation/animation_clip.rb +22 -0
  66. data/lib/three/animation/animation_mixer.rb +43 -0
  67. data/lib/three/backends/base.rb +87 -0
  68. data/lib/three/backends/threejs/materialization.rb +143 -0
  69. data/lib/three/backends/threejs/parameters.rb +97 -0
  70. data/lib/three/backends/threejs/resource_management.rb +69 -0
  71. data/lib/three/backends/threejs/ruby_wasm_adapter.rb +873 -0
  72. data/lib/three/backends/threejs/synchronization.rb +224 -0
  73. data/lib/three/backends/threejs.rb +365 -0
  74. data/lib/three/cameras/camera.rb +39 -0
  75. data/lib/three/cameras/orthographic_camera.rb +107 -0
  76. data/lib/three/cameras/perspective_camera.rb +137 -0
  77. data/lib/three/constants.rb +40 -0
  78. data/lib/three/controls/orbit_controls.rb +118 -0
  79. data/lib/three/core/buffer_attribute.rb +151 -0
  80. data/lib/three/core/buffer_geometry.rb +181 -0
  81. data/lib/three/core/clock.rb +58 -0
  82. data/lib/three/core/event_dispatcher.rb +57 -0
  83. data/lib/three/core/layers.rb +75 -0
  84. data/lib/three/core/object3d.rb +331 -0
  85. data/lib/three/core/raycaster.rb +73 -0
  86. data/lib/three/dirty.rb +58 -0
  87. data/lib/three/exporters/three_json_exporter.rb +187 -0
  88. data/lib/three/geometries/box_geometry.rb +97 -0
  89. data/lib/three/geometries/plane_geometry.rb +70 -0
  90. data/lib/three/geometries/sphere_geometry.rb +107 -0
  91. data/lib/three/lights/ambient_light.rb +12 -0
  92. data/lib/three/lights/directional_light.rb +38 -0
  93. data/lib/three/lights/hemisphere_light.rb +34 -0
  94. data/lib/three/lights/light.rb +85 -0
  95. data/lib/three/lights/point_light.rb +33 -0
  96. data/lib/three/loaders/cube_texture_loader.rb +13 -0
  97. data/lib/three/loaders/gltf_loader.rb +48 -0
  98. data/lib/three/loaders/rgbe_loader.rb +15 -0
  99. data/lib/three/loaders/texture_loader.rb +13 -0
  100. data/lib/three/loaders/three_json_loader.rb +409 -0
  101. data/lib/three/materials/line_basic_material.rb +65 -0
  102. data/lib/three/materials/material.rb +158 -0
  103. data/lib/three/materials/mesh_basic_material.rb +64 -0
  104. data/lib/three/materials/mesh_lambert_material.rb +71 -0
  105. data/lib/three/materials/mesh_matcap_material.rb +86 -0
  106. data/lib/three/materials/mesh_normal_material.rb +42 -0
  107. data/lib/three/materials/mesh_phong_material.rb +119 -0
  108. data/lib/three/materials/mesh_physical_material.rb +155 -0
  109. data/lib/three/materials/mesh_standard_material.rb +149 -0
  110. data/lib/three/materials/mesh_toon_material.rb +98 -0
  111. data/lib/three/materials/points_material.rb +74 -0
  112. data/lib/three/materials/shadow_material.rb +45 -0
  113. data/lib/three/materials/sprite_material.rb +75 -0
  114. data/lib/three/math/color.rb +133 -0
  115. data/lib/three/math/euler.rb +197 -0
  116. data/lib/three/math/math_utils.rb +36 -0
  117. data/lib/three/math/matrix3.rb +255 -0
  118. data/lib/three/math/matrix4.rb +448 -0
  119. data/lib/three/math/quaternion.rb +277 -0
  120. data/lib/three/math/vector2.rb +95 -0
  121. data/lib/three/math/vector3.rb +396 -0
  122. data/lib/three/objects/external_object3d.rb +28 -0
  123. data/lib/three/objects/group.rb +12 -0
  124. data/lib/three/objects/instanced_mesh.rb +110 -0
  125. data/lib/three/objects/line.rb +41 -0
  126. data/lib/three/objects/mesh.rb +45 -0
  127. data/lib/three/objects/points.rb +41 -0
  128. data/lib/three/objects/sprite.rb +57 -0
  129. data/lib/three/postprocessing/dot_screen_pass.rb +83 -0
  130. data/lib/three/postprocessing/effect_composer.rb +56 -0
  131. data/lib/three/postprocessing/output_pass.rb +40 -0
  132. data/lib/three/postprocessing/render_pass.rb +42 -0
  133. data/lib/three/postprocessing/unreal_bloom_pass.rb +56 -0
  134. data/lib/three/renderers/renderer.rb +11 -0
  135. data/lib/three/renderers/threejs_renderer.rb +85 -0
  136. data/lib/three/scenes/scene.rb +29 -0
  137. data/lib/three/textures/cube_texture.rb +72 -0
  138. data/lib/three/textures/rgbe_texture.rb +45 -0
  139. data/lib/three/textures/texture.rb +200 -0
  140. data/lib/three/version.rb +5 -0
  141. data/lib/three-rb.rb +3 -0
  142. data/lib/three.rb +77 -0
  143. data/package.json +30 -0
  144. data/pnpm-lock.yaml +86 -0
  145. metadata +216 -0
@@ -0,0 +1,200 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../core/event_dispatcher"
4
+ require_relative "../constants"
5
+ require_relative "../dirty"
6
+ require_relative "../math/math_utils"
7
+ require_relative "../math/matrix3"
8
+ require_relative "../math/vector2"
9
+
10
+ module Three
11
+ class Texture < EventDispatcher
12
+ include Dirty
13
+
14
+ @next_id = 0
15
+
16
+ class << self
17
+ attr_accessor :next_id
18
+ end
19
+
20
+ attr_reader :id, :uuid, :source, :mapping, :color_space, :flip_y, :wrap_s, :wrap_t, :mag_filter, :min_filter
21
+ attr_reader :offset, :repeat, :center, :rotation, :matrix_auto_update, :matrix
22
+ attr_accessor :user_data
23
+
24
+ def initialize(
25
+ source = nil,
26
+ mapping: Three::UVMapping,
27
+ color_space: Three::NoColorSpace,
28
+ flip_y: true,
29
+ wrap_s: Three::ClampToEdgeWrapping,
30
+ wrap_t: Three::ClampToEdgeWrapping,
31
+ mag_filter: Three::LinearFilter,
32
+ min_filter: Three::LinearMipmapLinearFilter,
33
+ offset: nil,
34
+ repeat: nil,
35
+ center: nil,
36
+ rotation: 0,
37
+ matrix_auto_update: true,
38
+ matrix: nil
39
+ )
40
+ super()
41
+ @id = self.class.allocate_id
42
+ @uuid = MathUtils.generate_uuid
43
+ @source = source
44
+ @mapping = mapping
45
+ @color_space = color_space
46
+ @flip_y = flip_y
47
+ @wrap_s = wrap_s
48
+ @wrap_t = wrap_t
49
+ @mag_filter = mag_filter
50
+ @min_filter = min_filter
51
+ @offset = coerce_vector2(offset || [0, 0], field: :offset)
52
+ @repeat = coerce_vector2(repeat || [1, 1], field: :repeat)
53
+ @center = coerce_vector2(center || [0, 0], field: :center)
54
+ @rotation = rotation
55
+ @matrix_auto_update = matrix_auto_update
56
+ @matrix = coerce_matrix3(matrix || Matrix3.new)
57
+ @user_data = {}
58
+ bind_vector_changes
59
+ mark_dirty!
60
+ end
61
+
62
+ def source=(value)
63
+ @source = value
64
+ mark_dirty!(:parameters)
65
+ end
66
+
67
+ def mapping=(value)
68
+ @mapping = value
69
+ mark_dirty!(:parameters)
70
+ end
71
+
72
+ def color_space=(value)
73
+ @color_space = value
74
+ mark_dirty!(:parameters)
75
+ end
76
+
77
+ def flip_y=(value)
78
+ @flip_y = value
79
+ mark_dirty!(:parameters)
80
+ end
81
+
82
+ def wrap_s=(value)
83
+ @wrap_s = value
84
+ mark_dirty!(:parameters)
85
+ end
86
+
87
+ def wrap_t=(value)
88
+ @wrap_t = value
89
+ mark_dirty!(:parameters)
90
+ end
91
+
92
+ def mag_filter=(value)
93
+ @mag_filter = value
94
+ mark_dirty!(:parameters)
95
+ end
96
+
97
+ def min_filter=(value)
98
+ @min_filter = value
99
+ mark_dirty!(:parameters)
100
+ end
101
+
102
+ def repeat=(value)
103
+ @repeat = coerce_vector2(value, field: :repeat)
104
+ bind_vector_changes
105
+ mark_dirty!(:parameters)
106
+ end
107
+
108
+ def offset=(value)
109
+ @offset = coerce_vector2(value, field: :offset)
110
+ bind_vector_changes
111
+ mark_dirty!(:parameters)
112
+ end
113
+
114
+ def center=(value)
115
+ @center = coerce_vector2(value, field: :center)
116
+ bind_vector_changes
117
+ mark_dirty!(:parameters)
118
+ end
119
+
120
+ def rotation=(value)
121
+ @rotation = value
122
+ mark_dirty!(:parameters)
123
+ end
124
+
125
+ def matrix_auto_update=(value)
126
+ @matrix_auto_update = value
127
+ mark_dirty!(:parameters)
128
+ end
129
+
130
+ def matrix=(value)
131
+ @matrix = coerce_matrix3(value)
132
+ mark_dirty!(:parameters)
133
+ end
134
+
135
+ def update_matrix
136
+ @matrix.set_uv_transform(@offset.x, @offset.y, @repeat.x, @repeat.y, @rotation, @center.x, @center.y)
137
+ mark_dirty!(:parameters)
138
+ self
139
+ end
140
+
141
+ def dispose
142
+ dispatch_event(:dispose)
143
+ end
144
+
145
+ def to_h
146
+ {
147
+ uuid: @uuid,
148
+ type: "Texture",
149
+ source: @source,
150
+ mapping: @mapping,
151
+ color_space: @color_space,
152
+ flip_y: @flip_y,
153
+ wrap_s: @wrap_s,
154
+ wrap_t: @wrap_t,
155
+ mag_filter: @mag_filter,
156
+ min_filter: @min_filter,
157
+ offset: @offset.to_a,
158
+ repeat: @repeat.to_a,
159
+ center: @center.to_a,
160
+ rotation: @rotation,
161
+ matrix_auto_update: @matrix_auto_update,
162
+ matrix: @matrix.to_a
163
+ }
164
+ end
165
+
166
+ def self.allocate_id
167
+ id = Texture.next_id
168
+ Texture.next_id += 1
169
+ id
170
+ end
171
+
172
+ private
173
+
174
+ def coerce_vector2(value, field:)
175
+ return value if value.is_a?(Vector2)
176
+
177
+ array = value.to_ary if value.respond_to?(:to_ary)
178
+ array ||= value.to_a if value.respond_to?(:to_a)
179
+ return Vector2.new(array[0], array[1]) if array && array.length >= 2
180
+
181
+ raise TypeError, "#{field} must be a Three::Vector2 or an array-like [x, y]"
182
+ end
183
+
184
+ def coerce_matrix3(value)
185
+ return value if value.is_a?(Matrix3)
186
+
187
+ array = value.to_ary if value.respond_to?(:to_ary)
188
+ array ||= value.to_a if value.respond_to?(:to_a)
189
+ return Matrix3.new.from_array(array) if array && array.length >= 9
190
+
191
+ raise TypeError, "matrix must be a Three::Matrix3 or an array-like with 9 elements"
192
+ end
193
+
194
+ def bind_vector_changes
195
+ @offset.on_change { mark_dirty!(:parameters) }
196
+ @repeat.on_change { mark_dirty!(:parameters) }
197
+ @center.on_change { mark_dirty!(:parameters) }
198
+ end
199
+ end
200
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Three
4
+ VERSION = "0.1.0"
5
+ end
data/lib/three-rb.rb ADDED
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "three"
data/lib/three.rb ADDED
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "three/version"
4
+ require_relative "three/constants"
5
+ require_relative "three/dirty"
6
+ require_relative "three/math/math_utils"
7
+ require_relative "three/math/color"
8
+ require_relative "three/math/vector2"
9
+ require_relative "three/math/vector3"
10
+ require_relative "three/math/quaternion"
11
+ require_relative "three/math/matrix3"
12
+ require_relative "three/math/matrix4"
13
+ require_relative "three/math/euler"
14
+ require_relative "three/core/event_dispatcher"
15
+ require_relative "three/core/clock"
16
+ require_relative "three/core/layers"
17
+ require_relative "three/core/object3d"
18
+ require_relative "three/core/buffer_attribute"
19
+ require_relative "three/core/buffer_geometry"
20
+ require_relative "three/textures/texture"
21
+ require_relative "three/textures/cube_texture"
22
+ require_relative "three/textures/rgbe_texture"
23
+ require_relative "three/objects/external_object3d"
24
+ require_relative "three/objects/group"
25
+ require_relative "three/objects/mesh"
26
+ require_relative "three/objects/instanced_mesh"
27
+ require_relative "three/objects/line"
28
+ require_relative "three/objects/points"
29
+ require_relative "three/objects/sprite"
30
+ require_relative "three/scenes/scene"
31
+ require_relative "three/cameras/camera"
32
+ require_relative "three/cameras/perspective_camera"
33
+ require_relative "three/cameras/orthographic_camera"
34
+ require_relative "three/lights/light"
35
+ require_relative "three/lights/ambient_light"
36
+ require_relative "three/lights/directional_light"
37
+ require_relative "three/lights/point_light"
38
+ require_relative "three/lights/hemisphere_light"
39
+ require_relative "three/materials/material"
40
+ require_relative "three/materials/line_basic_material"
41
+ require_relative "three/materials/mesh_basic_material"
42
+ require_relative "three/materials/mesh_lambert_material"
43
+ require_relative "three/materials/mesh_matcap_material"
44
+ require_relative "three/materials/mesh_normal_material"
45
+ require_relative "three/materials/mesh_phong_material"
46
+ require_relative "three/materials/mesh_standard_material"
47
+ require_relative "three/materials/mesh_physical_material"
48
+ require_relative "three/materials/mesh_toon_material"
49
+ require_relative "three/materials/points_material"
50
+ require_relative "three/materials/shadow_material"
51
+ require_relative "three/materials/sprite_material"
52
+ require_relative "three/loaders/texture_loader"
53
+ require_relative "three/loaders/cube_texture_loader"
54
+ require_relative "three/loaders/rgbe_loader"
55
+ require_relative "three/loaders/gltf_loader"
56
+ require_relative "three/loaders/three_json_loader"
57
+ require_relative "three/geometries/box_geometry"
58
+ require_relative "three/geometries/plane_geometry"
59
+ require_relative "three/geometries/sphere_geometry"
60
+ require_relative "three/backends/base"
61
+ require_relative "three/backends/threejs"
62
+ require_relative "three/core/raycaster"
63
+ require_relative "three/animation/animation_clip"
64
+ require_relative "three/animation/animation_action"
65
+ require_relative "three/animation/animation_mixer"
66
+ require_relative "three/renderers/renderer"
67
+ require_relative "three/renderers/threejs_renderer"
68
+ require_relative "three/controls/orbit_controls"
69
+ require_relative "three/postprocessing/effect_composer"
70
+ require_relative "three/postprocessing/render_pass"
71
+ require_relative "three/postprocessing/unreal_bloom_pass"
72
+ require_relative "three/postprocessing/dot_screen_pass"
73
+ require_relative "three/postprocessing/output_pass"
74
+ require_relative "three/exporters/three_json_exporter"
75
+
76
+ module Three
77
+ end
data/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "three-rb",
3
+ "private": true,
4
+ "type": "module",
5
+ "packageManager": "pnpm@11.1.1",
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",
8
+ "test:browser:cube": "node examples/browser/cube/smoke_test.mjs",
9
+ "test:browser:composition": "node examples/browser/composition/smoke_test.mjs",
10
+ "test:browser:textures": "node examples/browser/textures/smoke_test.mjs",
11
+ "test:browser:cubemap": "node examples/browser/cubemap/smoke_test.mjs",
12
+ "test:browser:gltf": "node examples/browser/gltf/smoke_test.mjs",
13
+ "test:browser:serialization": "node examples/browser/serialization/smoke_test.mjs",
14
+ "test:browser:picking": "node examples/browser/picking/smoke_test.mjs",
15
+ "test:browser:primitives": "node examples/browser/primitives/smoke_test.mjs",
16
+ "test:browser:postprocessing": "node examples/browser/postprocessing/smoke_test.mjs",
17
+ "benchmark:browser": "pnpm benchmark:browser:mesh-sync && pnpm benchmark:browser:instanced-mesh-sync",
18
+ "benchmark:browser:mesh-sync": "node benchmarks/browser/mesh_sync/run.mjs",
19
+ "benchmark:browser:instanced-mesh-sync": "node benchmarks/browser/instanced_mesh_sync/run.mjs"
20
+ },
21
+ "dependencies": {
22
+ "@bjorn3/browser_wasi_shim": "0.4.2",
23
+ "@ruby/3.4-wasm-wasi": "2.9.4-2026-05-11-a",
24
+ "@ruby/wasm-wasi": "2.9.4-2026-05-11-a",
25
+ "three": "0.184.0"
26
+ },
27
+ "devDependencies": {
28
+ "playwright": "^1.60.0"
29
+ }
30
+ }
data/pnpm-lock.yaml ADDED
@@ -0,0 +1,86 @@
1
+ lockfileVersion: '9.0'
2
+
3
+ settings:
4
+ autoInstallPeers: true
5
+ excludeLinksFromLockfile: false
6
+
7
+ importers:
8
+
9
+ .:
10
+ dependencies:
11
+ '@bjorn3/browser_wasi_shim':
12
+ specifier: 0.4.2
13
+ version: 0.4.2
14
+ '@ruby/3.4-wasm-wasi':
15
+ specifier: 2.9.4-2026-05-11-a
16
+ version: 2.9.4-2026-05-11-a
17
+ '@ruby/wasm-wasi':
18
+ specifier: 2.9.4-2026-05-11-a
19
+ version: 2.9.4-2026-05-11-a
20
+ three:
21
+ specifier: 0.184.0
22
+ version: 0.184.0
23
+ devDependencies:
24
+ playwright:
25
+ specifier: ^1.60.0
26
+ version: 1.60.0
27
+
28
+ packages:
29
+
30
+ '@bjorn3/browser_wasi_shim@0.4.2':
31
+ resolution: {integrity: sha512-/iHkCVUG3VbcbmEHn5iIUpIrh7a7WPiwZ3sHy4HZKZzBdSadwdddYDZAII2zBvQYV0Lfi8naZngPCN7WPHI/hA==}
32
+
33
+ '@ruby/3.4-wasm-wasi@2.9.4-2026-05-11-a':
34
+ resolution: {integrity: sha512-qI32iuHxb1onVbbbfnZHOI109P13ZpvQf4KEMk4XyzVIDKYNHzJzwvRcZm6uPjtv9ekLeJBSSeqqImRP/sDNqQ==}
35
+
36
+ '@ruby/wasm-wasi@2.9.4-2026-05-11-a':
37
+ resolution: {integrity: sha512-DpS1BJFYldhSmy1gGa0GwD4cYw8qTu6FblQq6JVF0VVh+3ONPcvMGPHpVvwPeMve4tEsMkM6hOyTO8HshTcQ8Q==}
38
+
39
+ fsevents@2.3.2:
40
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
41
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
42
+ os: [darwin]
43
+
44
+ playwright-core@1.60.0:
45
+ resolution: {integrity: sha512-9bW6zvX/m0lEbgTKJ6YppOKx8H3VOPBMOCFh2irXFOT4BbHgrx5hPjwJYLT40Lu+4qtD36qKc/Hn56StUW57IA==}
46
+ engines: {node: '>=18'}
47
+ hasBin: true
48
+
49
+ playwright@1.60.0:
50
+ resolution: {integrity: sha512-hheHdokM8cdqCb0lcE3s+zT4t4W+vvjpGxsZlDnikarzx8tSzMebh3UiFtgqwFwnTnjYQcsyMF8ei2mCO/tpeA==}
51
+ engines: {node: '>=18'}
52
+ hasBin: true
53
+
54
+ three@0.184.0:
55
+ resolution: {integrity: sha512-wtTRjG92pM5eUg/KuUnHsqSAlPM296brTOcLgMRqEeylYTh/CdtvKUvCyyCQTzFuStieWxvZb8mVTMvdPyUpxg==}
56
+
57
+ tslib@2.8.1:
58
+ resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
59
+
60
+ snapshots:
61
+
62
+ '@bjorn3/browser_wasi_shim@0.4.2': {}
63
+
64
+ '@ruby/3.4-wasm-wasi@2.9.4-2026-05-11-a':
65
+ dependencies:
66
+ '@ruby/wasm-wasi': 2.9.4-2026-05-11-a
67
+
68
+ '@ruby/wasm-wasi@2.9.4-2026-05-11-a':
69
+ dependencies:
70
+ '@bjorn3/browser_wasi_shim': 0.4.2
71
+ tslib: 2.8.1
72
+
73
+ fsevents@2.3.2:
74
+ optional: true
75
+
76
+ playwright-core@1.60.0: {}
77
+
78
+ playwright@1.60.0:
79
+ dependencies:
80
+ playwright-core: 1.60.0
81
+ optionalDependencies:
82
+ fsevents: 2.3.2
83
+
84
+ three@0.184.0: {}
85
+
86
+ tslib@2.8.1: {}
metadata ADDED
@@ -0,0 +1,216 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: three-rb
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - LEF
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: minitest
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '6.0'
19
+ type: :development
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '6.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rake
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '13.0'
33
+ type: :development
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '13.0'
40
+ description: three-rb provides Ruby APIs for building 3D scenes, with browser rendering
41
+ through ruby.wasm and three.js.
42
+ email: []
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - CHANGELOG.md
48
+ - LICENSE
49
+ - README.md
50
+ - docs/browser-runtime.md
51
+ - docs/implementation-plan.md
52
+ - docs/loaded-assets-design.md
53
+ - docs/next-work.md
54
+ - docs/publishing.md
55
+ - docs/release-readiness.md
56
+ - 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
+ - examples/browser/composition/README.md
63
+ - examples/browser/composition/boot.mjs
64
+ - examples/browser/composition/index.html
65
+ - examples/browser/composition/main.rb
66
+ - examples/browser/composition/smoke_test.mjs
67
+ - examples/browser/cube/README.md
68
+ - examples/browser/cube/boot.mjs
69
+ - examples/browser/cube/index.html
70
+ - examples/browser/cube/main.rb
71
+ - examples/browser/cube/smoke_test.mjs
72
+ - examples/browser/cubemap/README.md
73
+ - examples/browser/cubemap/boot.mjs
74
+ - examples/browser/cubemap/index.html
75
+ - examples/browser/cubemap/main.rb
76
+ - examples/browser/cubemap/smoke_test.mjs
77
+ - examples/browser/gltf/README.md
78
+ - examples/browser/gltf/boot.mjs
79
+ - examples/browser/gltf/index.html
80
+ - examples/browser/gltf/main.rb
81
+ - examples/browser/gltf/smoke_test.mjs
82
+ - examples/browser/picking/README.md
83
+ - examples/browser/picking/boot.mjs
84
+ - examples/browser/picking/index.html
85
+ - examples/browser/picking/main.rb
86
+ - examples/browser/picking/smoke_test.mjs
87
+ - examples/browser/postprocessing/README.md
88
+ - examples/browser/postprocessing/boot.mjs
89
+ - examples/browser/postprocessing/index.html
90
+ - examples/browser/postprocessing/main.rb
91
+ - examples/browser/postprocessing/smoke_test.mjs
92
+ - examples/browser/primitives/README.md
93
+ - examples/browser/primitives/boot.mjs
94
+ - examples/browser/primitives/index.html
95
+ - examples/browser/primitives/main.rb
96
+ - examples/browser/primitives/smoke_test.mjs
97
+ - examples/browser/serialization/README.md
98
+ - examples/browser/serialization/boot.mjs
99
+ - examples/browser/serialization/index.html
100
+ - examples/browser/serialization/main.rb
101
+ - examples/browser/serialization/smoke_test.mjs
102
+ - examples/browser/shared/boot.mjs
103
+ - examples/browser/shared/smoke_test_helpers.mjs
104
+ - examples/browser/textures/README.md
105
+ - examples/browser/textures/boot.mjs
106
+ - examples/browser/textures/index.html
107
+ - examples/browser/textures/main.rb
108
+ - examples/browser/textures/smoke_test.mjs
109
+ - lib/three-rb.rb
110
+ - lib/three.rb
111
+ - lib/three/animation/animation_action.rb
112
+ - lib/three/animation/animation_clip.rb
113
+ - lib/three/animation/animation_mixer.rb
114
+ - lib/three/backends/base.rb
115
+ - lib/three/backends/threejs.rb
116
+ - lib/three/backends/threejs/materialization.rb
117
+ - lib/three/backends/threejs/parameters.rb
118
+ - lib/three/backends/threejs/resource_management.rb
119
+ - lib/three/backends/threejs/ruby_wasm_adapter.rb
120
+ - lib/three/backends/threejs/synchronization.rb
121
+ - lib/three/cameras/camera.rb
122
+ - lib/three/cameras/orthographic_camera.rb
123
+ - lib/three/cameras/perspective_camera.rb
124
+ - lib/three/constants.rb
125
+ - lib/three/controls/orbit_controls.rb
126
+ - lib/three/core/buffer_attribute.rb
127
+ - lib/three/core/buffer_geometry.rb
128
+ - lib/three/core/clock.rb
129
+ - lib/three/core/event_dispatcher.rb
130
+ - lib/three/core/layers.rb
131
+ - lib/three/core/object3d.rb
132
+ - lib/three/core/raycaster.rb
133
+ - lib/three/dirty.rb
134
+ - lib/three/exporters/three_json_exporter.rb
135
+ - lib/three/geometries/box_geometry.rb
136
+ - lib/three/geometries/plane_geometry.rb
137
+ - lib/three/geometries/sphere_geometry.rb
138
+ - lib/three/lights/ambient_light.rb
139
+ - lib/three/lights/directional_light.rb
140
+ - lib/three/lights/hemisphere_light.rb
141
+ - lib/three/lights/light.rb
142
+ - lib/three/lights/point_light.rb
143
+ - lib/three/loaders/cube_texture_loader.rb
144
+ - lib/three/loaders/gltf_loader.rb
145
+ - lib/three/loaders/rgbe_loader.rb
146
+ - lib/three/loaders/texture_loader.rb
147
+ - lib/three/loaders/three_json_loader.rb
148
+ - lib/three/materials/line_basic_material.rb
149
+ - lib/three/materials/material.rb
150
+ - lib/three/materials/mesh_basic_material.rb
151
+ - lib/three/materials/mesh_lambert_material.rb
152
+ - lib/three/materials/mesh_matcap_material.rb
153
+ - lib/three/materials/mesh_normal_material.rb
154
+ - lib/three/materials/mesh_phong_material.rb
155
+ - lib/three/materials/mesh_physical_material.rb
156
+ - lib/three/materials/mesh_standard_material.rb
157
+ - lib/three/materials/mesh_toon_material.rb
158
+ - lib/three/materials/points_material.rb
159
+ - lib/three/materials/shadow_material.rb
160
+ - lib/three/materials/sprite_material.rb
161
+ - lib/three/math/color.rb
162
+ - lib/three/math/euler.rb
163
+ - lib/three/math/math_utils.rb
164
+ - lib/three/math/matrix3.rb
165
+ - lib/three/math/matrix4.rb
166
+ - lib/three/math/quaternion.rb
167
+ - lib/three/math/vector2.rb
168
+ - lib/three/math/vector3.rb
169
+ - lib/three/objects/external_object3d.rb
170
+ - lib/three/objects/group.rb
171
+ - lib/three/objects/instanced_mesh.rb
172
+ - lib/three/objects/line.rb
173
+ - lib/three/objects/mesh.rb
174
+ - lib/three/objects/points.rb
175
+ - lib/three/objects/sprite.rb
176
+ - lib/three/postprocessing/dot_screen_pass.rb
177
+ - lib/three/postprocessing/effect_composer.rb
178
+ - lib/three/postprocessing/output_pass.rb
179
+ - lib/three/postprocessing/render_pass.rb
180
+ - lib/three/postprocessing/unreal_bloom_pass.rb
181
+ - lib/three/renderers/renderer.rb
182
+ - lib/three/renderers/threejs_renderer.rb
183
+ - lib/three/scenes/scene.rb
184
+ - lib/three/textures/cube_texture.rb
185
+ - lib/three/textures/rgbe_texture.rb
186
+ - lib/three/textures/texture.rb
187
+ - lib/three/version.rb
188
+ - package.json
189
+ - pnpm-lock.yaml
190
+ homepage: https://github.com/lef237/three-rb
191
+ licenses:
192
+ - MIT
193
+ metadata:
194
+ homepage_uri: https://github.com/lef237/three-rb
195
+ source_code_uri: https://github.com/lef237/three-rb/tree/main
196
+ changelog_uri: https://github.com/lef237/three-rb/blob/main/CHANGELOG.md
197
+ bug_tracker_uri: https://github.com/lef237/three-rb/issues
198
+ rubygems_mfa_required: 'true'
199
+ rdoc_options: []
200
+ require_paths:
201
+ - lib
202
+ required_ruby_version: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '3.2'
207
+ required_rubygems_version: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: '0'
212
+ requirements: []
213
+ rubygems_version: 3.6.9
214
+ specification_version: 4
215
+ summary: Ruby 3D library inspired by three.js.
216
+ test_files: []