stagecraft 1.0.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 (87) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE.txt +21 -0
  3. data/README.md +207 -0
  4. data/Rakefile +8 -0
  5. data/docs/api.md +85 -0
  6. data/docs/tutorial.md +344 -0
  7. data/examples/01_spinning_cube.rb +13 -0
  8. data/examples/02_primitives.rb +21 -0
  9. data/examples/03_pbr_materials.rb +20 -0
  10. data/examples/04_lights.rb +22 -0
  11. data/examples/05_directional_shadow.rb +23 -0
  12. data/examples/06_transparency.rb +19 -0
  13. data/examples/07_texture.rb +22 -0
  14. data/examples/08_shader_material.rb +30 -0
  15. data/examples/09_gltf_loader.rb +24 -0
  16. data/examples/10_animation.rb +21 -0
  17. data/examples/11_scene_graph.rb +20 -0
  18. data/examples/12_orbit_controls.rb +13 -0
  19. data/examples/13_orthographic_camera.rb +18 -0
  20. data/examples/14_raycaster.rb +14 -0
  21. data/examples/15_offscreen.rb +22 -0
  22. data/examples/16_msaa.rb +13 -0
  23. data/examples/17_physics_binding.rb +22 -0
  24. data/examples/18_custom_geometry.rb +22 -0
  25. data/examples/19_imgui_stats.rb +24 -0
  26. data/examples/20_window_adapters.rb +15 -0
  27. data/examples/README.md +11 -0
  28. data/examples/support/demo.rb +49 -0
  29. data/lib/stagecraft/animation/action.rb +79 -0
  30. data/lib/stagecraft/animation/clip.rb +15 -0
  31. data/lib/stagecraft/animation/mixer.rb +97 -0
  32. data/lib/stagecraft/animation/track.rb +122 -0
  33. data/lib/stagecraft/app.rb +61 -0
  34. data/lib/stagecraft/cameras/camera.rb +15 -0
  35. data/lib/stagecraft/cameras/orthographic_camera.rb +60 -0
  36. data/lib/stagecraft/cameras/perspective_camera.rb +69 -0
  37. data/lib/stagecraft/color.rb +56 -0
  38. data/lib/stagecraft/controls/orbit_controls.rb +119 -0
  39. data/lib/stagecraft/core/attribute.rb +91 -0
  40. data/lib/stagecraft/core/bounding.rb +131 -0
  41. data/lib/stagecraft/core/geometry.rb +155 -0
  42. data/lib/stagecraft/core/mesh.rb +26 -0
  43. data/lib/stagecraft/core/node.rb +163 -0
  44. data/lib/stagecraft/core/observed_value.rb +182 -0
  45. data/lib/stagecraft/core/raycaster.rb +62 -0
  46. data/lib/stagecraft/core/scene.rb +11 -0
  47. data/lib/stagecraft/core/skin.rb +23 -0
  48. data/lib/stagecraft/geometries.rb +200 -0
  49. data/lib/stagecraft/lights/ambient_light.rb +10 -0
  50. data/lib/stagecraft/lights/directional_light.rb +31 -0
  51. data/lib/stagecraft/lights/light.rb +30 -0
  52. data/lib/stagecraft/lights/point_light.rb +23 -0
  53. data/lib/stagecraft/lights/spot_light.rb +36 -0
  54. data/lib/stagecraft/loaders/gltf_loader.rb +387 -0
  55. data/lib/stagecraft/materials/material.rb +58 -0
  56. data/lib/stagecraft/materials/pbr_material.rb +75 -0
  57. data/lib/stagecraft/materials/shader_material.rb +21 -0
  58. data/lib/stagecraft/materials/unlit_material.rb +26 -0
  59. data/lib/stagecraft/physics_binding.rb +63 -0
  60. data/lib/stagecraft/renderer/features.rb +58 -0
  61. data/lib/stagecraft/renderer/frame.rb +45 -0
  62. data/lib/stagecraft/renderer/frame_resources.rb +467 -0
  63. data/lib/stagecraft/renderer/gpu_context.rb +120 -0
  64. data/lib/stagecraft/renderer/pipeline_cache.rb +59 -0
  65. data/lib/stagecraft/renderer/pipeline_factory.rb +470 -0
  66. data/lib/stagecraft/renderer/render_list.rb +80 -0
  67. data/lib/stagecraft/renderer/renderer.rb +336 -0
  68. data/lib/stagecraft/renderer/resource_cache.rb +176 -0
  69. data/lib/stagecraft/renderer/shaders/common.wgsl +48 -0
  70. data/lib/stagecraft/renderer/shaders/pbr.wgsl +251 -0
  71. data/lib/stagecraft/renderer/shaders/shadow.wgsl +37 -0
  72. data/lib/stagecraft/renderer/shaders/skinning.wgsl +6 -0
  73. data/lib/stagecraft/renderer/shaders/tonemap.wgsl +37 -0
  74. data/lib/stagecraft/renderer/shaders/unlit.wgsl +89 -0
  75. data/lib/stagecraft/renderer/shaders.rb +64 -0
  76. data/lib/stagecraft/renderer/stats.rb +41 -0
  77. data/lib/stagecraft/renderer/uniform_packer.rb +91 -0
  78. data/lib/stagecraft/renderer/wgpu_compatibility.rb +41 -0
  79. data/lib/stagecraft/textures/cube_texture.rb +16 -0
  80. data/lib/stagecraft/textures/sampler_state.rb +58 -0
  81. data/lib/stagecraft/textures/texture.rb +71 -0
  82. data/lib/stagecraft/version.rb +5 -0
  83. data/lib/stagecraft/window/adapter.rb +38 -0
  84. data/lib/stagecraft/window/glfw.rb +67 -0
  85. data/lib/stagecraft/window/sdl3.rb +57 -0
  86. data/lib/stagecraft.rb +60 -0
  87. metadata +187 -0
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stagecraft
4
+ module Textures
5
+ SamplerState = Data.define(
6
+ :wrap_u, :wrap_v, :wrap_w, :mag_filter, :min_filter, :mipmap_filter,
7
+ :lod_min, :lod_max, :compare, :max_anisotropy
8
+ ) do
9
+ FILTERS = %i[nearest linear].freeze
10
+
11
+ def initialize(wrap_u: :repeat, wrap_v: :repeat, wrap_w: :repeat,
12
+ mag_filter: :linear, min_filter: :linear, mipmap_filter: :linear,
13
+ lod_min: 0.0, lod_max: 32.0, compare: nil, max_anisotropy: 1)
14
+ super(
15
+ wrap_u: normalize_wrap(wrap_u),
16
+ wrap_v: normalize_wrap(wrap_v),
17
+ wrap_w: normalize_wrap(wrap_w),
18
+ mag_filter: mag_filter.to_sym,
19
+ min_filter: min_filter.to_sym,
20
+ mipmap_filter: mipmap_filter.to_sym,
21
+ lod_min: Float(lod_min),
22
+ lod_max: Float(lod_max),
23
+ compare: compare&.to_sym,
24
+ max_anisotropy: Integer(max_anisotropy)
25
+ )
26
+ validate!
27
+ end
28
+
29
+ private
30
+
31
+ def normalize_wrap(value)
32
+ {
33
+ repeat: :repeat,
34
+ mirrored_repeat: :mirror_repeat,
35
+ mirror_repeat: :mirror_repeat,
36
+ clamp_to_edge: :clamp_to_edge
37
+ }.fetch(value.to_sym)
38
+ end
39
+
40
+ def validate!
41
+ raise ArgumentError, "mag_filter must be :nearest or :linear" unless FILTERS.include?(mag_filter)
42
+ raise ArgumentError, "min_filter must be :nearest or :linear" unless FILTERS.include?(min_filter)
43
+ unless FILTERS.include?(mipmap_filter)
44
+ raise ArgumentError, "mipmap_filter must be :nearest or :linear"
45
+ end
46
+ raise ArgumentError, "lod_min must be non-negative" if lod_min.negative?
47
+ raise ArgumentError, "lod_max must be at least lod_min" if lod_max < lod_min
48
+ unless max_anisotropy.between?(1, 16)
49
+ raise ArgumentError, "max_anisotropy must be between 1 and 16"
50
+ end
51
+ return if max_anisotropy == 1 ||
52
+ [mag_filter, min_filter, mipmap_filter].all? { |filter| filter == :linear }
53
+
54
+ raise ArgumentError, "anisotropic filtering requires linear filters"
55
+ end
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stagecraft
4
+ module Textures
5
+ class Texture
6
+ attr_reader :image, :sampler, :color_space, :version
7
+
8
+ def initialize(image = nil, sampler: SamplerState.new, color_space: nil)
9
+ @version = 0
10
+ @disposed = false
11
+ @dispose_callbacks = []
12
+ self.image = image
13
+ self.sampler = sampler
14
+ self.color_space = color_space
15
+ end
16
+
17
+ def self.load(source, **options)
18
+ require "texel"
19
+ color_space = options.delete(:color_space)
20
+ channels = options.delete(:channels)
21
+ image = Texel.load(source, channels:, color_space:)
22
+ new(image, color_space:, **options)
23
+ end
24
+
25
+ def image=(value)
26
+ assign(:@image, value)
27
+ end
28
+
29
+ def sampler=(value)
30
+ raise ArgumentError, "expected a SamplerState" unless value.is_a?(SamplerState)
31
+
32
+ assign(:@sampler, value)
33
+ end
34
+
35
+ def color_space=(value)
36
+ assign(:@color_space, value&.to_sym)
37
+ end
38
+
39
+ def on_dispose(&block)
40
+ @dispose_callbacks << block
41
+ self
42
+ end
43
+
44
+ def dispose
45
+ return self if @disposed
46
+
47
+ @disposed = true
48
+ @version += 1
49
+ @dispose_callbacks.each { |callback| callback.call(self) }
50
+ @dispose_callbacks.clear
51
+ self
52
+ end
53
+
54
+ def disposed?
55
+ @disposed
56
+ end
57
+
58
+ private
59
+
60
+ def assign(variable, value)
61
+ return value if instance_variable_defined?(variable) && instance_variable_get(variable) == value
62
+
63
+ instance_variable_set(variable, value)
64
+ @version += 1
65
+ value
66
+ end
67
+ end
68
+ end
69
+
70
+ Texture = Textures::Texture
71
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stagecraft
4
+ VERSION = "1.0.0"
5
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stagecraft
4
+ module Window
5
+ class Adapter
6
+ def initialize
7
+ @callbacks = Hash.new { |hash, key| hash[key] = [] }
8
+ end
9
+
10
+ def on_pointer_button(&block)
11
+ subscribe(:pointer_button, &block)
12
+ end
13
+
14
+ def on_pointer_move(&block)
15
+ subscribe(:pointer_move, &block)
16
+ end
17
+
18
+ def on_scroll(&block)
19
+ subscribe(:scroll, &block)
20
+ end
21
+
22
+ def on_resize(&block)
23
+ subscribe(:resize, &block)
24
+ end
25
+
26
+ private
27
+
28
+ def subscribe(event, &block)
29
+ @callbacks[event] << block
30
+ self
31
+ end
32
+
33
+ def emit(event, ...)
34
+ @callbacks[event].each { |callback| callback.call(...) }
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,67 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stagecraft
4
+ module Window
5
+ class Glfw < Adapter
6
+ attr_reader :native
7
+
8
+ def initialize(title:, width:, height:, resizable: true, surface_factory: nil)
9
+ super()
10
+ require "glfw"
11
+ ::GLFW.init
12
+ @native = ::GLFW::Window.new(
13
+ width, height, title,
14
+ client_api: ::GLFW::GLFW_NO_API,
15
+ resizable:
16
+ )
17
+ @surface_factory = surface_factory
18
+ attach_callbacks
19
+ end
20
+
21
+ def create_surface(instance)
22
+ return @surface_factory.call(instance, native) if @surface_factory
23
+
24
+ raise Error, <<~MESSAGE.strip
25
+ glfw-ruby does not expose a portable WebGPU surface handle; pass surface_factory:
26
+ or use window: :sdl3, whose native surface bridge is built into wgpu
27
+ MESSAGE
28
+ end
29
+
30
+ def poll_events
31
+ ::GLFW.poll_events
32
+ []
33
+ end
34
+
35
+ def should_close?
36
+ native.should_close?
37
+ end
38
+
39
+ def drawable_size
40
+ native.framebuffer_size
41
+ end
42
+
43
+ def close
44
+ native.destroy
45
+ ::GLFW.terminate
46
+ end
47
+
48
+ private
49
+
50
+ def attach_callbacks
51
+ native.on_mouse_button do |_window, button, action, _mods|
52
+ x, y = native.cursor_pos
53
+ emit(:pointer_button, button, action == :press, x, y)
54
+ end
55
+ native.on_cursor_pos do |_window, x, y|
56
+ previous = @cursor_position || [x, y]
57
+ @cursor_position = [x, y]
58
+ emit(:pointer_move, x, y, x - previous[0], y - previous[1])
59
+ end
60
+ native.on_scroll { |_window, x, y| emit(:scroll, x, y) }
61
+ native.on_resize { |_window, width, height| emit(:resize, width, height) }
62
+ end
63
+ end
64
+
65
+ GLFW = Glfw
66
+ end
67
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Stagecraft
4
+ module Window
5
+ class Sdl3 < Adapter
6
+ attr_reader :native
7
+
8
+ def initialize(title:, width:, height:, resizable: true)
9
+ super()
10
+ require "wgpu"
11
+ require "wgpu/window"
12
+ @native = WGPU::Window::SDLWindow.new(title:, width:, height:, resizable:)
13
+ @close_requested = false
14
+ end
15
+
16
+ def create_surface(instance)
17
+ native.create_surface(instance)
18
+ end
19
+
20
+ def poll_events
21
+ events = native.poll_events
22
+ events.each { |event| dispatch(event) }
23
+ events
24
+ end
25
+
26
+ def should_close?
27
+ @close_requested
28
+ end
29
+
30
+ def drawable_size
31
+ native.drawable_size
32
+ end
33
+
34
+ def close
35
+ native.close
36
+ end
37
+
38
+ private
39
+
40
+ def dispatch(event)
41
+ @close_requested = true if event.quit? ||
42
+ (event.respond_to?(:close_requested?) && event.close_requested?)
43
+ if event.mouse_button_down? || event.mouse_button_up?
44
+ emit(:pointer_button, event.button, event.mouse_button_down?, event.x, event.y)
45
+ elsif event.mouse_motion?
46
+ emit(:pointer_move, event.x, event.y, event.xrel, event.yrel)
47
+ elsif event.is_a?(::SDL3::MouseWheelEvent)
48
+ emit(:scroll, event.x, event.y)
49
+ elsif event.respond_to?(:resized?) && event.resized?
50
+ emit(:resize, event.data1, event.data2)
51
+ end
52
+ end
53
+ end
54
+
55
+ SDL3 = Sdl3
56
+ end
57
+ end
data/lib/stagecraft.rb ADDED
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "larb"
4
+
5
+ require_relative "stagecraft/version"
6
+ require_relative "stagecraft/color"
7
+ require_relative "stagecraft/core/observed_value"
8
+ require_relative "stagecraft/core/bounding"
9
+ require_relative "stagecraft/core/node"
10
+ require_relative "stagecraft/core/scene"
11
+ require_relative "stagecraft/core/mesh"
12
+ require_relative "stagecraft/core/attribute"
13
+ require_relative "stagecraft/core/geometry"
14
+ require_relative "stagecraft/core/raycaster"
15
+ require_relative "stagecraft/core/skin"
16
+ require_relative "stagecraft/cameras/camera"
17
+ require_relative "stagecraft/cameras/perspective_camera"
18
+ require_relative "stagecraft/cameras/orthographic_camera"
19
+ require_relative "stagecraft/lights/light"
20
+ require_relative "stagecraft/lights/ambient_light"
21
+ require_relative "stagecraft/lights/directional_light"
22
+ require_relative "stagecraft/lights/point_light"
23
+ require_relative "stagecraft/lights/spot_light"
24
+ require_relative "stagecraft/materials/material"
25
+ require_relative "stagecraft/materials/unlit_material"
26
+ require_relative "stagecraft/materials/pbr_material"
27
+ require_relative "stagecraft/materials/shader_material"
28
+ require_relative "stagecraft/textures/sampler_state"
29
+ require_relative "stagecraft/textures/texture"
30
+ require_relative "stagecraft/textures/cube_texture"
31
+ require_relative "stagecraft/geometries"
32
+ require_relative "stagecraft/physics_binding"
33
+ require_relative "stagecraft/renderer/stats"
34
+ require_relative "stagecraft/renderer/features"
35
+ require_relative "stagecraft/renderer/render_list"
36
+ require_relative "stagecraft/renderer/pipeline_cache"
37
+ require_relative "stagecraft/renderer/shaders"
38
+ require_relative "stagecraft/renderer/uniform_packer"
39
+ require_relative "stagecraft/renderer/resource_cache"
40
+ require_relative "stagecraft/renderer/frame"
41
+ require_relative "stagecraft/renderer/wgpu_compatibility"
42
+ require_relative "stagecraft/renderer/gpu_context"
43
+ require_relative "stagecraft/renderer/frame_resources"
44
+ require_relative "stagecraft/renderer/pipeline_factory"
45
+ require_relative "stagecraft/renderer/renderer"
46
+ require_relative "stagecraft/window/adapter"
47
+ require_relative "stagecraft/window/sdl3"
48
+ require_relative "stagecraft/window/glfw"
49
+ require_relative "stagecraft/controls/orbit_controls"
50
+ require_relative "stagecraft/animation/track"
51
+ require_relative "stagecraft/animation/clip"
52
+ require_relative "stagecraft/animation/action"
53
+ require_relative "stagecraft/animation/mixer"
54
+ require_relative "stagecraft/loaders/gltf_loader"
55
+ require_relative "stagecraft/app"
56
+
57
+ module Stagecraft
58
+ class Error < StandardError; end
59
+ class DisposedError < Error; end
60
+ end
metadata ADDED
@@ -0,0 +1,187 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: stagecraft
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.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: larb
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '1.0'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '1.0'
26
+ - !ruby/object:Gem::Dependency
27
+ name: rgltf
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '1.0'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '1.0'
40
+ - !ruby/object:Gem::Dependency
41
+ name: texel
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '0.1'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '0.1'
54
+ - !ruby/object:Gem::Dependency
55
+ name: wgpu
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '1.1'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '1.1'
68
+ description: |-
69
+ Stagecraft combines a hierarchical scene graph, glTF assets, animation,
70
+ physically based materials, and a WebGPU renderer behind a Ruby-friendly API.
71
+ email:
72
+ - t.yudai92@gmail.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - LICENSE.txt
78
+ - README.md
79
+ - Rakefile
80
+ - docs/api.md
81
+ - docs/tutorial.md
82
+ - examples/01_spinning_cube.rb
83
+ - examples/02_primitives.rb
84
+ - examples/03_pbr_materials.rb
85
+ - examples/04_lights.rb
86
+ - examples/05_directional_shadow.rb
87
+ - examples/06_transparency.rb
88
+ - examples/07_texture.rb
89
+ - examples/08_shader_material.rb
90
+ - examples/09_gltf_loader.rb
91
+ - examples/10_animation.rb
92
+ - examples/11_scene_graph.rb
93
+ - examples/12_orbit_controls.rb
94
+ - examples/13_orthographic_camera.rb
95
+ - examples/14_raycaster.rb
96
+ - examples/15_offscreen.rb
97
+ - examples/16_msaa.rb
98
+ - examples/17_physics_binding.rb
99
+ - examples/18_custom_geometry.rb
100
+ - examples/19_imgui_stats.rb
101
+ - examples/20_window_adapters.rb
102
+ - examples/README.md
103
+ - examples/support/demo.rb
104
+ - lib/stagecraft.rb
105
+ - lib/stagecraft/animation/action.rb
106
+ - lib/stagecraft/animation/clip.rb
107
+ - lib/stagecraft/animation/mixer.rb
108
+ - lib/stagecraft/animation/track.rb
109
+ - lib/stagecraft/app.rb
110
+ - lib/stagecraft/cameras/camera.rb
111
+ - lib/stagecraft/cameras/orthographic_camera.rb
112
+ - lib/stagecraft/cameras/perspective_camera.rb
113
+ - lib/stagecraft/color.rb
114
+ - lib/stagecraft/controls/orbit_controls.rb
115
+ - lib/stagecraft/core/attribute.rb
116
+ - lib/stagecraft/core/bounding.rb
117
+ - lib/stagecraft/core/geometry.rb
118
+ - lib/stagecraft/core/mesh.rb
119
+ - lib/stagecraft/core/node.rb
120
+ - lib/stagecraft/core/observed_value.rb
121
+ - lib/stagecraft/core/raycaster.rb
122
+ - lib/stagecraft/core/scene.rb
123
+ - lib/stagecraft/core/skin.rb
124
+ - lib/stagecraft/geometries.rb
125
+ - lib/stagecraft/lights/ambient_light.rb
126
+ - lib/stagecraft/lights/directional_light.rb
127
+ - lib/stagecraft/lights/light.rb
128
+ - lib/stagecraft/lights/point_light.rb
129
+ - lib/stagecraft/lights/spot_light.rb
130
+ - lib/stagecraft/loaders/gltf_loader.rb
131
+ - lib/stagecraft/materials/material.rb
132
+ - lib/stagecraft/materials/pbr_material.rb
133
+ - lib/stagecraft/materials/shader_material.rb
134
+ - lib/stagecraft/materials/unlit_material.rb
135
+ - lib/stagecraft/physics_binding.rb
136
+ - lib/stagecraft/renderer/features.rb
137
+ - lib/stagecraft/renderer/frame.rb
138
+ - lib/stagecraft/renderer/frame_resources.rb
139
+ - lib/stagecraft/renderer/gpu_context.rb
140
+ - lib/stagecraft/renderer/pipeline_cache.rb
141
+ - lib/stagecraft/renderer/pipeline_factory.rb
142
+ - lib/stagecraft/renderer/render_list.rb
143
+ - lib/stagecraft/renderer/renderer.rb
144
+ - lib/stagecraft/renderer/resource_cache.rb
145
+ - lib/stagecraft/renderer/shaders.rb
146
+ - lib/stagecraft/renderer/shaders/common.wgsl
147
+ - lib/stagecraft/renderer/shaders/pbr.wgsl
148
+ - lib/stagecraft/renderer/shaders/shadow.wgsl
149
+ - lib/stagecraft/renderer/shaders/skinning.wgsl
150
+ - lib/stagecraft/renderer/shaders/tonemap.wgsl
151
+ - lib/stagecraft/renderer/shaders/unlit.wgsl
152
+ - lib/stagecraft/renderer/stats.rb
153
+ - lib/stagecraft/renderer/uniform_packer.rb
154
+ - lib/stagecraft/renderer/wgpu_compatibility.rb
155
+ - lib/stagecraft/textures/cube_texture.rb
156
+ - lib/stagecraft/textures/sampler_state.rb
157
+ - lib/stagecraft/textures/texture.rb
158
+ - lib/stagecraft/version.rb
159
+ - lib/stagecraft/window/adapter.rb
160
+ - lib/stagecraft/window/glfw.rb
161
+ - lib/stagecraft/window/sdl3.rb
162
+ homepage: https://github.com/ydah/stagecraft
163
+ licenses:
164
+ - MIT
165
+ metadata:
166
+ allowed_push_host: https://rubygems.org
167
+ homepage_uri: https://github.com/ydah/stagecraft
168
+ source_code_uri: https://github.com/ydah/stagecraft
169
+ rubygems_mfa_required: 'true'
170
+ rdoc_options: []
171
+ require_paths:
172
+ - lib
173
+ required_ruby_version: !ruby/object:Gem::Requirement
174
+ requirements:
175
+ - - ">="
176
+ - !ruby/object:Gem::Version
177
+ version: 3.2.0
178
+ required_rubygems_version: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - ">="
181
+ - !ruby/object:Gem::Version
182
+ version: '0'
183
+ requirements: []
184
+ rubygems_version: 4.0.6
185
+ specification_version: 4
186
+ summary: A three.js-like scene graph and WebGPU renderer for Ruby
187
+ test_files: []