webxr 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.
- checksums.yaml +7 -0
- data/.rspec +3 -0
- data/CHANGELOG.md +7 -0
- data/README.md +138 -0
- data/Rakefile +21 -0
- data/examples/ar_demo.html +238 -0
- data/examples/ar_hit_test.rb +157 -0
- data/examples/basic_vr.rb +110 -0
- data/examples/controller_input.rb +91 -0
- data/examples/hand_tracking.rb +124 -0
- data/examples/hello_webxr.html +288 -0
- data/examples/inline_demo.html +261 -0
- data/examples/server.rb +34 -0
- data/examples/vr_scene_demo.html +330 -0
- data/lib/webxr/ar/anchor.rb +83 -0
- data/lib/webxr/ar/hit_test_result.rb +54 -0
- data/lib/webxr/ar/hit_test_source.rb +34 -0
- data/lib/webxr/ar/ray.rb +90 -0
- data/lib/webxr/constants.rb +61 -0
- data/lib/webxr/core/frame.rb +155 -0
- data/lib/webxr/core/render_state.rb +47 -0
- data/lib/webxr/core/session.rb +212 -0
- data/lib/webxr/core/system.rb +122 -0
- data/lib/webxr/errors.rb +18 -0
- data/lib/webxr/events/input_source_event.rb +53 -0
- data/lib/webxr/events/reference_space_event.rb +44 -0
- data/lib/webxr/events/session_event.rb +56 -0
- data/lib/webxr/geometry/pose.rb +49 -0
- data/lib/webxr/geometry/rigid_transform.rb +73 -0
- data/lib/webxr/geometry/view.rb +68 -0
- data/lib/webxr/geometry/viewer_pose.rb +40 -0
- data/lib/webxr/geometry/viewport.rb +55 -0
- data/lib/webxr/hand/hand.rb +197 -0
- data/lib/webxr/hand/joint_pose.rb +33 -0
- data/lib/webxr/hand/joint_space.rb +74 -0
- data/lib/webxr/helpers/input_helper.rb +142 -0
- data/lib/webxr/helpers/rendering_helper.rb +94 -0
- data/lib/webxr/helpers/session_manager.rb +105 -0
- data/lib/webxr/input/gamepad.rb +115 -0
- data/lib/webxr/input/gamepad_button.rb +36 -0
- data/lib/webxr/input/input_source.rb +101 -0
- data/lib/webxr/input/input_source_array.rb +86 -0
- data/lib/webxr/js_wrapper.rb +116 -0
- data/lib/webxr/layers/layer.rb +28 -0
- data/lib/webxr/layers/webgl_binding.rb +69 -0
- data/lib/webxr/layers/webgl_layer.rb +102 -0
- data/lib/webxr/layers/webgl_sub_image.rb +59 -0
- data/lib/webxr/spaces/bounded_reference_space.rb +43 -0
- data/lib/webxr/spaces/reference_space.rb +51 -0
- data/lib/webxr/spaces/space.rb +18 -0
- data/lib/webxr/version.rb +5 -0
- data/lib/webxr.rb +73 -0
- data/webxr.gemspec +33 -0
- metadata +111 -0
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module WebXR
|
|
4
|
+
# XRBoundedReferenceSpace - A reference space with defined boundaries
|
|
5
|
+
# Used for room-scale VR where the user has defined play area boundaries
|
|
6
|
+
class BoundedReferenceSpace < ReferenceSpace
|
|
7
|
+
# @param js_bounded_space [JS::Object] The XRBoundedReferenceSpace JavaScript object
|
|
8
|
+
def initialize(js_bounded_space)
|
|
9
|
+
super(js_bounded_space)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Get the space type
|
|
13
|
+
# @return [String]
|
|
14
|
+
def type
|
|
15
|
+
"bounded-reference-space"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Get the boundary polygon vertices
|
|
19
|
+
# The points define the floor-level boundary polygon
|
|
20
|
+
# @return [Array<Hash>] Array of points with :x, :y, :z, :w keys
|
|
21
|
+
def bounds_geometry
|
|
22
|
+
js_bounds = js_prop(:boundsGeometry)
|
|
23
|
+
return [] if js_bounds.nil?
|
|
24
|
+
|
|
25
|
+
js_array_to_a(js_bounds).map do |js_point|
|
|
26
|
+
{
|
|
27
|
+
x: js_point[:x].to_f,
|
|
28
|
+
y: js_point[:y].to_f,
|
|
29
|
+
z: js_point[:z].to_f,
|
|
30
|
+
w: js_point[:w].to_f
|
|
31
|
+
}
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# Create a new bounded reference space with an offset transform
|
|
36
|
+
# @param origin_offset [RigidTransform] The offset transform
|
|
37
|
+
# @return [BoundedReferenceSpace]
|
|
38
|
+
def with_origin_offset(origin_offset)
|
|
39
|
+
js_space = js_call(:getOffsetReferenceSpace, origin_offset.js)
|
|
40
|
+
BoundedReferenceSpace.new(js_space)
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module WebXR
|
|
4
|
+
# XRReferenceSpace - A tracked reference coordinate space
|
|
5
|
+
class ReferenceSpace < Space
|
|
6
|
+
# @param js_reference_space [JS::Object] The XRReferenceSpace JavaScript object
|
|
7
|
+
def initialize(js_reference_space)
|
|
8
|
+
super(js_reference_space)
|
|
9
|
+
@reset_callbacks = []
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Get the space type
|
|
13
|
+
# @return [String]
|
|
14
|
+
def type
|
|
15
|
+
"reference-space"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Create a new reference space with an offset transform
|
|
19
|
+
# @param origin_offset [RigidTransform] The offset transform
|
|
20
|
+
# @return [ReferenceSpace]
|
|
21
|
+
def with_origin_offset(origin_offset)
|
|
22
|
+
js_space = js_call(:getOffsetReferenceSpace, origin_offset.js)
|
|
23
|
+
ReferenceSpace.new(js_space)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
# Register a callback for reset events
|
|
27
|
+
# Reset events occur when the reference space origin changes
|
|
28
|
+
# (e.g., user recenters the view)
|
|
29
|
+
# @yield [ReferenceSpaceEvent] Called when the space is reset
|
|
30
|
+
# @return [void]
|
|
31
|
+
def on_reset(&block)
|
|
32
|
+
return unless block_given?
|
|
33
|
+
|
|
34
|
+
@reset_callbacks << block
|
|
35
|
+
setup_reset_listener if @reset_callbacks.size == 1
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
private
|
|
39
|
+
|
|
40
|
+
def setup_reset_listener
|
|
41
|
+
callback = ->(js_event) { dispatch_reset(js_event) }
|
|
42
|
+
js_callback = JS.eval("(function(event) { return $callback.call(event); })")
|
|
43
|
+
js_call(:addEventListener, "reset", js_callback)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def dispatch_reset(js_event)
|
|
47
|
+
event = ReferenceSpaceEvent.new(js_event)
|
|
48
|
+
@reset_callbacks.each { |cb| cb.call(event) }
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module WebXR
|
|
4
|
+
# XRSpace - Base class for coordinate spaces
|
|
5
|
+
# Represents a coordinate system that can be tracked in XR
|
|
6
|
+
class Space < JSWrapper
|
|
7
|
+
# @param js_space [JS::Object] The XRSpace JavaScript object
|
|
8
|
+
def initialize(js_space)
|
|
9
|
+
super(js_space)
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
# Get the space type (for debugging/identification)
|
|
13
|
+
# @return [String]
|
|
14
|
+
def type
|
|
15
|
+
"space"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
data/lib/webxr.rb
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "webxr/version"
|
|
4
|
+
require_relative "webxr/errors"
|
|
5
|
+
require_relative "webxr/constants"
|
|
6
|
+
require_relative "webxr/js_wrapper"
|
|
7
|
+
|
|
8
|
+
# Core classes
|
|
9
|
+
require_relative "webxr/core/system"
|
|
10
|
+
require_relative "webxr/core/session"
|
|
11
|
+
require_relative "webxr/core/frame"
|
|
12
|
+
require_relative "webxr/core/render_state"
|
|
13
|
+
|
|
14
|
+
# Spaces
|
|
15
|
+
require_relative "webxr/spaces/space"
|
|
16
|
+
require_relative "webxr/spaces/reference_space"
|
|
17
|
+
require_relative "webxr/spaces/bounded_reference_space"
|
|
18
|
+
|
|
19
|
+
# Geometry
|
|
20
|
+
require_relative "webxr/geometry/rigid_transform"
|
|
21
|
+
require_relative "webxr/geometry/pose"
|
|
22
|
+
require_relative "webxr/geometry/viewer_pose"
|
|
23
|
+
require_relative "webxr/geometry/view"
|
|
24
|
+
require_relative "webxr/geometry/viewport"
|
|
25
|
+
|
|
26
|
+
# Input
|
|
27
|
+
require_relative "webxr/input/input_source"
|
|
28
|
+
require_relative "webxr/input/input_source_array"
|
|
29
|
+
require_relative "webxr/input/gamepad"
|
|
30
|
+
require_relative "webxr/input/gamepad_button"
|
|
31
|
+
|
|
32
|
+
# Layers
|
|
33
|
+
require_relative "webxr/layers/layer"
|
|
34
|
+
require_relative "webxr/layers/webgl_layer"
|
|
35
|
+
require_relative "webxr/layers/webgl_binding"
|
|
36
|
+
require_relative "webxr/layers/webgl_sub_image"
|
|
37
|
+
|
|
38
|
+
# Events
|
|
39
|
+
require_relative "webxr/events/session_event"
|
|
40
|
+
require_relative "webxr/events/input_source_event"
|
|
41
|
+
require_relative "webxr/events/reference_space_event"
|
|
42
|
+
|
|
43
|
+
# Hand Tracking
|
|
44
|
+
require_relative "webxr/hand/joint_space"
|
|
45
|
+
require_relative "webxr/hand/joint_pose"
|
|
46
|
+
require_relative "webxr/hand/hand"
|
|
47
|
+
|
|
48
|
+
# AR Features
|
|
49
|
+
require_relative "webxr/ar/ray"
|
|
50
|
+
require_relative "webxr/ar/anchor"
|
|
51
|
+
require_relative "webxr/ar/hit_test_source"
|
|
52
|
+
require_relative "webxr/ar/hit_test_result"
|
|
53
|
+
|
|
54
|
+
# Helpers
|
|
55
|
+
require_relative "webxr/helpers/session_manager"
|
|
56
|
+
require_relative "webxr/helpers/rendering_helper"
|
|
57
|
+
require_relative "webxr/helpers/input_helper"
|
|
58
|
+
|
|
59
|
+
module WebXR
|
|
60
|
+
class << self
|
|
61
|
+
# Check if WebXR is available in the current environment
|
|
62
|
+
# @return [Boolean]
|
|
63
|
+
def available?
|
|
64
|
+
System.available?
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
# Get the XRSystem singleton instance
|
|
68
|
+
# @return [System, nil]
|
|
69
|
+
def system
|
|
70
|
+
System.instance
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
data/webxr.gemspec
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require_relative "lib/webxr/version"
|
|
4
|
+
|
|
5
|
+
Gem::Specification.new do |spec|
|
|
6
|
+
spec.name = "webxr"
|
|
7
|
+
spec.version = WebXR::VERSION
|
|
8
|
+
spec.authors = ["Yudai Takada"]
|
|
9
|
+
spec.email = ["t.yudai92@gmail.com"]
|
|
10
|
+
|
|
11
|
+
spec.summary = "WebXR Device API bindings for Ruby"
|
|
12
|
+
spec.description = "Complete Ruby bindings for the WebXR Device API, enabling VR/AR application development in Ruby via ruby.wasm"
|
|
13
|
+
spec.homepage = "https://github.com/ydah/webxr-ruby"
|
|
14
|
+
spec.license = "MIT"
|
|
15
|
+
spec.required_ruby_version = ">= 3.2.0"
|
|
16
|
+
|
|
17
|
+
spec.metadata["homepage_uri"] = spec.homepage
|
|
18
|
+
spec.metadata["source_code_uri"] = spec.homepage
|
|
19
|
+
spec.metadata["changelog_uri"] = "#{spec.homepage}/blob/main/CHANGELOG.md"
|
|
20
|
+
spec.metadata["rubygems_mfa_required"] = "true"
|
|
21
|
+
|
|
22
|
+
spec.files = Dir.chdir(__dir__) do
|
|
23
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
|
24
|
+
(File.expand_path(f) == __FILE__) ||
|
|
25
|
+
f.start_with?(*%w[bin/ test/ spec/ features/ .git .github appveyor Gemfile])
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
spec.bindir = "exe"
|
|
29
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
|
30
|
+
spec.require_paths = ["lib"]
|
|
31
|
+
|
|
32
|
+
spec.add_dependency "js", "~> 2.0"
|
|
33
|
+
end
|
metadata
ADDED
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: webxr
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Yudai Takada
|
|
8
|
+
bindir: exe
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: js
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - "~>"
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '2.0'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - "~>"
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '2.0'
|
|
26
|
+
description: Complete Ruby bindings for the WebXR Device API, enabling VR/AR application
|
|
27
|
+
development in Ruby via ruby.wasm
|
|
28
|
+
email:
|
|
29
|
+
- t.yudai92@gmail.com
|
|
30
|
+
executables: []
|
|
31
|
+
extensions: []
|
|
32
|
+
extra_rdoc_files: []
|
|
33
|
+
files:
|
|
34
|
+
- ".rspec"
|
|
35
|
+
- CHANGELOG.md
|
|
36
|
+
- README.md
|
|
37
|
+
- Rakefile
|
|
38
|
+
- examples/ar_demo.html
|
|
39
|
+
- examples/ar_hit_test.rb
|
|
40
|
+
- examples/basic_vr.rb
|
|
41
|
+
- examples/controller_input.rb
|
|
42
|
+
- examples/hand_tracking.rb
|
|
43
|
+
- examples/hello_webxr.html
|
|
44
|
+
- examples/inline_demo.html
|
|
45
|
+
- examples/server.rb
|
|
46
|
+
- examples/vr_scene_demo.html
|
|
47
|
+
- lib/webxr.rb
|
|
48
|
+
- lib/webxr/ar/anchor.rb
|
|
49
|
+
- lib/webxr/ar/hit_test_result.rb
|
|
50
|
+
- lib/webxr/ar/hit_test_source.rb
|
|
51
|
+
- lib/webxr/ar/ray.rb
|
|
52
|
+
- lib/webxr/constants.rb
|
|
53
|
+
- lib/webxr/core/frame.rb
|
|
54
|
+
- lib/webxr/core/render_state.rb
|
|
55
|
+
- lib/webxr/core/session.rb
|
|
56
|
+
- lib/webxr/core/system.rb
|
|
57
|
+
- lib/webxr/errors.rb
|
|
58
|
+
- lib/webxr/events/input_source_event.rb
|
|
59
|
+
- lib/webxr/events/reference_space_event.rb
|
|
60
|
+
- lib/webxr/events/session_event.rb
|
|
61
|
+
- lib/webxr/geometry/pose.rb
|
|
62
|
+
- lib/webxr/geometry/rigid_transform.rb
|
|
63
|
+
- lib/webxr/geometry/view.rb
|
|
64
|
+
- lib/webxr/geometry/viewer_pose.rb
|
|
65
|
+
- lib/webxr/geometry/viewport.rb
|
|
66
|
+
- lib/webxr/hand/hand.rb
|
|
67
|
+
- lib/webxr/hand/joint_pose.rb
|
|
68
|
+
- lib/webxr/hand/joint_space.rb
|
|
69
|
+
- lib/webxr/helpers/input_helper.rb
|
|
70
|
+
- lib/webxr/helpers/rendering_helper.rb
|
|
71
|
+
- lib/webxr/helpers/session_manager.rb
|
|
72
|
+
- lib/webxr/input/gamepad.rb
|
|
73
|
+
- lib/webxr/input/gamepad_button.rb
|
|
74
|
+
- lib/webxr/input/input_source.rb
|
|
75
|
+
- lib/webxr/input/input_source_array.rb
|
|
76
|
+
- lib/webxr/js_wrapper.rb
|
|
77
|
+
- lib/webxr/layers/layer.rb
|
|
78
|
+
- lib/webxr/layers/webgl_binding.rb
|
|
79
|
+
- lib/webxr/layers/webgl_layer.rb
|
|
80
|
+
- lib/webxr/layers/webgl_sub_image.rb
|
|
81
|
+
- lib/webxr/spaces/bounded_reference_space.rb
|
|
82
|
+
- lib/webxr/spaces/reference_space.rb
|
|
83
|
+
- lib/webxr/spaces/space.rb
|
|
84
|
+
- lib/webxr/version.rb
|
|
85
|
+
- webxr.gemspec
|
|
86
|
+
homepage: https://github.com/ydah/webxr-ruby
|
|
87
|
+
licenses:
|
|
88
|
+
- MIT
|
|
89
|
+
metadata:
|
|
90
|
+
homepage_uri: https://github.com/ydah/webxr-ruby
|
|
91
|
+
source_code_uri: https://github.com/ydah/webxr-ruby
|
|
92
|
+
changelog_uri: https://github.com/ydah/webxr-ruby/blob/main/CHANGELOG.md
|
|
93
|
+
rubygems_mfa_required: 'true'
|
|
94
|
+
rdoc_options: []
|
|
95
|
+
require_paths:
|
|
96
|
+
- lib
|
|
97
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
98
|
+
requirements:
|
|
99
|
+
- - ">="
|
|
100
|
+
- !ruby/object:Gem::Version
|
|
101
|
+
version: 3.2.0
|
|
102
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
103
|
+
requirements:
|
|
104
|
+
- - ">="
|
|
105
|
+
- !ruby/object:Gem::Version
|
|
106
|
+
version: '0'
|
|
107
|
+
requirements: []
|
|
108
|
+
rubygems_version: 4.0.3
|
|
109
|
+
specification_version: 4
|
|
110
|
+
summary: WebXR Device API bindings for Ruby
|
|
111
|
+
test_files: []
|