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.
- checksums.yaml +7 -0
- data/LICENSE.txt +21 -0
- data/README.md +207 -0
- data/Rakefile +8 -0
- data/docs/api.md +85 -0
- data/docs/tutorial.md +344 -0
- data/examples/01_spinning_cube.rb +13 -0
- data/examples/02_primitives.rb +21 -0
- data/examples/03_pbr_materials.rb +20 -0
- data/examples/04_lights.rb +22 -0
- data/examples/05_directional_shadow.rb +23 -0
- data/examples/06_transparency.rb +19 -0
- data/examples/07_texture.rb +22 -0
- data/examples/08_shader_material.rb +30 -0
- data/examples/09_gltf_loader.rb +24 -0
- data/examples/10_animation.rb +21 -0
- data/examples/11_scene_graph.rb +20 -0
- data/examples/12_orbit_controls.rb +13 -0
- data/examples/13_orthographic_camera.rb +18 -0
- data/examples/14_raycaster.rb +14 -0
- data/examples/15_offscreen.rb +22 -0
- data/examples/16_msaa.rb +13 -0
- data/examples/17_physics_binding.rb +22 -0
- data/examples/18_custom_geometry.rb +22 -0
- data/examples/19_imgui_stats.rb +24 -0
- data/examples/20_window_adapters.rb +15 -0
- data/examples/README.md +11 -0
- data/examples/support/demo.rb +49 -0
- data/lib/stagecraft/animation/action.rb +79 -0
- data/lib/stagecraft/animation/clip.rb +15 -0
- data/lib/stagecraft/animation/mixer.rb +97 -0
- data/lib/stagecraft/animation/track.rb +122 -0
- data/lib/stagecraft/app.rb +61 -0
- data/lib/stagecraft/cameras/camera.rb +15 -0
- data/lib/stagecraft/cameras/orthographic_camera.rb +60 -0
- data/lib/stagecraft/cameras/perspective_camera.rb +69 -0
- data/lib/stagecraft/color.rb +56 -0
- data/lib/stagecraft/controls/orbit_controls.rb +119 -0
- data/lib/stagecraft/core/attribute.rb +91 -0
- data/lib/stagecraft/core/bounding.rb +131 -0
- data/lib/stagecraft/core/geometry.rb +155 -0
- data/lib/stagecraft/core/mesh.rb +26 -0
- data/lib/stagecraft/core/node.rb +163 -0
- data/lib/stagecraft/core/observed_value.rb +182 -0
- data/lib/stagecraft/core/raycaster.rb +62 -0
- data/lib/stagecraft/core/scene.rb +11 -0
- data/lib/stagecraft/core/skin.rb +23 -0
- data/lib/stagecraft/geometries.rb +200 -0
- data/lib/stagecraft/lights/ambient_light.rb +10 -0
- data/lib/stagecraft/lights/directional_light.rb +31 -0
- data/lib/stagecraft/lights/light.rb +30 -0
- data/lib/stagecraft/lights/point_light.rb +23 -0
- data/lib/stagecraft/lights/spot_light.rb +36 -0
- data/lib/stagecraft/loaders/gltf_loader.rb +387 -0
- data/lib/stagecraft/materials/material.rb +58 -0
- data/lib/stagecraft/materials/pbr_material.rb +75 -0
- data/lib/stagecraft/materials/shader_material.rb +21 -0
- data/lib/stagecraft/materials/unlit_material.rb +26 -0
- data/lib/stagecraft/physics_binding.rb +63 -0
- data/lib/stagecraft/renderer/features.rb +58 -0
- data/lib/stagecraft/renderer/frame.rb +45 -0
- data/lib/stagecraft/renderer/frame_resources.rb +467 -0
- data/lib/stagecraft/renderer/gpu_context.rb +120 -0
- data/lib/stagecraft/renderer/pipeline_cache.rb +59 -0
- data/lib/stagecraft/renderer/pipeline_factory.rb +470 -0
- data/lib/stagecraft/renderer/render_list.rb +80 -0
- data/lib/stagecraft/renderer/renderer.rb +336 -0
- data/lib/stagecraft/renderer/resource_cache.rb +176 -0
- data/lib/stagecraft/renderer/shaders/common.wgsl +48 -0
- data/lib/stagecraft/renderer/shaders/pbr.wgsl +251 -0
- data/lib/stagecraft/renderer/shaders/shadow.wgsl +37 -0
- data/lib/stagecraft/renderer/shaders/skinning.wgsl +6 -0
- data/lib/stagecraft/renderer/shaders/tonemap.wgsl +37 -0
- data/lib/stagecraft/renderer/shaders/unlit.wgsl +89 -0
- data/lib/stagecraft/renderer/shaders.rb +64 -0
- data/lib/stagecraft/renderer/stats.rb +41 -0
- data/lib/stagecraft/renderer/uniform_packer.rb +91 -0
- data/lib/stagecraft/renderer/wgpu_compatibility.rb +41 -0
- data/lib/stagecraft/textures/cube_texture.rb +16 -0
- data/lib/stagecraft/textures/sampler_state.rb +58 -0
- data/lib/stagecraft/textures/texture.rb +71 -0
- data/lib/stagecraft/version.rb +5 -0
- data/lib/stagecraft/window/adapter.rb +38 -0
- data/lib/stagecraft/window/glfw.rb +67 -0
- data/lib/stagecraft/window/sdl3.rb +57 -0
- data/lib/stagecraft.rb +60 -0
- 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,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: []
|