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.
Files changed (54) hide show
  1. checksums.yaml +7 -0
  2. data/.rspec +3 -0
  3. data/CHANGELOG.md +7 -0
  4. data/README.md +138 -0
  5. data/Rakefile +21 -0
  6. data/examples/ar_demo.html +238 -0
  7. data/examples/ar_hit_test.rb +157 -0
  8. data/examples/basic_vr.rb +110 -0
  9. data/examples/controller_input.rb +91 -0
  10. data/examples/hand_tracking.rb +124 -0
  11. data/examples/hello_webxr.html +288 -0
  12. data/examples/inline_demo.html +261 -0
  13. data/examples/server.rb +34 -0
  14. data/examples/vr_scene_demo.html +330 -0
  15. data/lib/webxr/ar/anchor.rb +83 -0
  16. data/lib/webxr/ar/hit_test_result.rb +54 -0
  17. data/lib/webxr/ar/hit_test_source.rb +34 -0
  18. data/lib/webxr/ar/ray.rb +90 -0
  19. data/lib/webxr/constants.rb +61 -0
  20. data/lib/webxr/core/frame.rb +155 -0
  21. data/lib/webxr/core/render_state.rb +47 -0
  22. data/lib/webxr/core/session.rb +212 -0
  23. data/lib/webxr/core/system.rb +122 -0
  24. data/lib/webxr/errors.rb +18 -0
  25. data/lib/webxr/events/input_source_event.rb +53 -0
  26. data/lib/webxr/events/reference_space_event.rb +44 -0
  27. data/lib/webxr/events/session_event.rb +56 -0
  28. data/lib/webxr/geometry/pose.rb +49 -0
  29. data/lib/webxr/geometry/rigid_transform.rb +73 -0
  30. data/lib/webxr/geometry/view.rb +68 -0
  31. data/lib/webxr/geometry/viewer_pose.rb +40 -0
  32. data/lib/webxr/geometry/viewport.rb +55 -0
  33. data/lib/webxr/hand/hand.rb +197 -0
  34. data/lib/webxr/hand/joint_pose.rb +33 -0
  35. data/lib/webxr/hand/joint_space.rb +74 -0
  36. data/lib/webxr/helpers/input_helper.rb +142 -0
  37. data/lib/webxr/helpers/rendering_helper.rb +94 -0
  38. data/lib/webxr/helpers/session_manager.rb +105 -0
  39. data/lib/webxr/input/gamepad.rb +115 -0
  40. data/lib/webxr/input/gamepad_button.rb +36 -0
  41. data/lib/webxr/input/input_source.rb +101 -0
  42. data/lib/webxr/input/input_source_array.rb +86 -0
  43. data/lib/webxr/js_wrapper.rb +116 -0
  44. data/lib/webxr/layers/layer.rb +28 -0
  45. data/lib/webxr/layers/webgl_binding.rb +69 -0
  46. data/lib/webxr/layers/webgl_layer.rb +102 -0
  47. data/lib/webxr/layers/webgl_sub_image.rb +59 -0
  48. data/lib/webxr/spaces/bounded_reference_space.rb +43 -0
  49. data/lib/webxr/spaces/reference_space.rb +51 -0
  50. data/lib/webxr/spaces/space.rb +18 -0
  51. data/lib/webxr/version.rb +5 -0
  52. data/lib/webxr.rb +73 -0
  53. data/webxr.gemspec +33 -0
  54. 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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module WebXR
4
+ VERSION = "0.1.0"
5
+ 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: []