ray 0.1.1 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +9 -6
- data/Rakefile +1 -5
- data/ext/audio.c +25 -19
- data/ext/audio_source.c +67 -39
- data/ext/color.c +19 -19
- data/ext/drawable.c +190 -31
- data/ext/extconf.rb +16 -14
- data/ext/gl.c +310 -30
- data/ext/gl_buffer.c +223 -2
- data/ext/gl_index_buffer.c +11 -0
- data/ext/gl_int_array.c +24 -22
- data/ext/gl_vertex.c +84 -49
- data/ext/image.c +115 -51
- data/ext/image_target.c +58 -10
- data/ext/input.c +73 -6
- data/ext/mo.c +583 -0
- data/ext/mo.h +189 -0
- data/ext/music.c +9 -8
- data/ext/pixel_bus.c +349 -0
- data/ext/polygon.c +68 -45
- data/ext/ray.c +1 -0
- data/ext/ray.h +19 -1
- data/ext/rect.c +9 -47
- data/ext/say.h +1 -2
- data/ext/say_all.h +6 -0
- data/ext/say_audio.h +3 -0
- data/ext/say_audio_context.c +1 -4
- data/ext/say_basic_type.c +24 -0
- data/ext/say_basic_type.h +4 -0
- data/ext/say_buffer.c +217 -88
- data/ext/say_buffer.h +20 -5
- data/ext/say_buffer_renderer.c +10 -7
- data/ext/say_buffer_renderer.h +1 -1
- data/ext/say_buffer_slice.c +70 -76
- data/ext/say_context.c +109 -22
- data/ext/say_context.h +14 -0
- data/ext/say_drawable.c +113 -25
- data/ext/say_drawable.h +23 -2
- data/ext/say_error.c +7 -2
- data/ext/say_font.c +30 -27
- data/ext/say_font.h +3 -6
- data/ext/say_get_proc.c +35 -0
- data/ext/say_image.c +102 -27
- data/ext/say_image.h +11 -4
- data/ext/say_image_target.c +88 -34
- data/ext/say_image_target.h +3 -2
- data/ext/say_index_buffer.c +31 -19
- data/ext/say_index_buffer.h +4 -2
- data/ext/say_index_buffer_slice.c +78 -70
- data/ext/say_music.c +4 -2
- data/ext/say_osx.h +3 -2
- data/ext/say_osx_context.h +37 -4
- data/ext/say_osx_window.h +32 -37
- data/ext/say_pixel_bus.c +163 -0
- data/ext/say_pixel_bus.h +44 -0
- data/ext/say_polygon.c +2 -2
- data/ext/say_shader.c +66 -62
- data/ext/say_shader.h +2 -0
- data/ext/say_sprite.c +1 -2
- data/ext/say_target.c +14 -23
- data/ext/say_target.h +3 -1
- data/ext/say_text.c +45 -7
- data/ext/say_text.h +12 -3
- data/ext/say_thread.c +13 -6
- data/ext/say_thread.h +1 -1
- data/ext/say_thread_variable.c +5 -5
- data/ext/say_vertex_type.c +79 -41
- data/ext/say_vertex_type.h +6 -2
- data/ext/say_view.c +10 -31
- data/ext/say_view.h +1 -5
- data/ext/say_win.h +2 -2
- data/ext/say_win_context.h +49 -11
- data/ext/say_win_window.h +30 -27
- data/ext/say_window.c +3 -3
- data/ext/say_x11.h +3 -1
- data/ext/say_x11_context.h +64 -10
- data/ext/say_x11_window.h +22 -17
- data/ext/shader.c +9 -0
- data/ext/sprite.c +7 -1
- data/ext/target.c +80 -28
- data/ext/text.c +43 -1
- data/ext/view.c +53 -1
- data/ext/window.c +4 -0
- data/lib/ray/animation_list.rb +17 -2
- data/lib/ray/audio_source.rb +11 -0
- data/lib/ray/color.rb +14 -0
- data/lib/ray/drawable.rb +23 -0
- data/lib/ray/dsl/event.rb +1 -9
- data/lib/ray/dsl/event_runner.rb +3 -4
- data/lib/ray/dsl/matcher.rb +20 -1
- data/lib/ray/effect.rb +116 -0
- data/lib/ray/effect/black_and_white.rb +38 -0
- data/lib/ray/effect/color_inversion.rb +16 -0
- data/lib/ray/effect/generator.rb +145 -0
- data/lib/ray/effect/grayscale.rb +32 -0
- data/lib/ray/game.rb +25 -5
- data/lib/ray/gl/vertex.rb +105 -26
- data/lib/ray/helper.rb +5 -0
- data/lib/ray/image.rb +54 -13
- data/lib/ray/image_target.rb +7 -0
- data/lib/ray/matrix.rb +26 -0
- data/lib/ray/music.rb +4 -0
- data/lib/ray/pixel_bus.rb +22 -0
- data/lib/ray/polygon.rb +17 -0
- data/lib/ray/pp.rb +28 -0
- data/lib/ray/ray.rb +7 -1
- data/lib/ray/rect.rb +7 -13
- data/lib/ray/scene.rb +24 -5
- data/lib/ray/scene_list.rb +9 -0
- data/lib/ray/shader.rb +11 -2
- data/lib/ray/sound.rb +4 -0
- data/lib/ray/sprite.rb +23 -62
- data/lib/ray/target.rb +25 -0
- data/lib/ray/text.rb +10 -0
- data/lib/ray/turtle.rb +9 -3
- data/lib/ray/vector.rb +18 -0
- data/lib/ray/vertex.rb +6 -0
- data/lib/ray/view.rb +22 -0
- data/samples/animation/sprite_motion.rb +0 -60
- data/samples/audio/{spacial.rb → spatial.rb} +1 -1
- data/samples/buffer/buffer.rb +1 -0
- data/samples/buffer/index_buffer.rb +2 -0
- data/samples/cptn_ruby/cptn_ruby.rb +6 -7
- data/samples/effects/effect.rb +39 -0
- data/samples/effects/grayscale.rb +27 -0
- data/samples/opengl/image.rb +7 -5
- data/samples/opengl/instancing.rb +159 -0
- data/samples/opengl/instancing.rbc +3231 -0
- data/samples/opengl/obj_loader.rb +9 -8
- data/samples/opengl/shader.rb +1 -3
- data/samples/shaders/geometry.rb +108 -38
- data/samples/shaders/geometry.rbc +2074 -0
- data/samples/shaders/shape.rb +2 -2
- data/samples/starfighter/starfighter.rb +5 -5
- data/samples/window/get_pixel.rb +1 -1
- data/test/animation_list_test.rb +18 -4
- data/test/drawable_test.rb +70 -1
- data/test/effect_generator_test.rb +63 -0
- data/test/effect_test.rb +61 -0
- data/test/game_test.rb +18 -0
- data/test/gl_buffer_test.rb +43 -1
- data/test/gl_index_buffer_test.rb +5 -0
- data/test/gl_vertex_test.rb +28 -1
- data/test/image_test.rb +5 -5
- data/test/input_test.rb +49 -0
- data/test/pixel_bus_test.rb +28 -0
- data/test/rect_test.rb +4 -0
- data/{samples/_media → test/res}/Beep.wav +0 -0
- data/samples/_media/CptnRuby Gem.png b/data/test/res/CptnRuby → Gem.png +0 -0
- data/samples/_media/CptnRuby Map.txt b/data/test/res/CptnRuby → Map.txt +0 -0
- data/samples/_media/CptnRuby Tileset.png b/data/test/res/CptnRuby → Tileset.png +0 -0
- data/{samples/_media → test/res}/CptnRuby.png +0 -0
- data/{samples/_media → test/res}/Space.png +0 -0
- data/{samples/_media → test/res}/Star.png +0 -0
- data/{samples/_media → test/res}/Starfighter.png +0 -0
- data/test/res/cube.obj +28 -0
- data/test/res/light3d.c +2 -2
- data/test/res/stone.png +0 -0
- data/test/scene_test.rb +3 -0
- data/test/sprite_test.rb +10 -0
- data/test/text_test.rb +31 -2
- data/test/view_test.rb +13 -1
- metadata +38 -17
- data/ext/say_array.c +0 -124
- data/ext/say_array.h +0 -34
- data/ext/say_table.c +0 -86
- data/ext/say_table.h +0 -24
@@ -0,0 +1,38 @@
|
|
1
|
+
module Ray
|
2
|
+
class Effect
|
3
|
+
# A black and white effect. It considers the grayscale level of the image,
|
4
|
+
# and sets pixels that are darker than a given value to black, and the
|
5
|
+
# others to white.
|
6
|
+
class BlackAndWhite < Effect
|
7
|
+
effect_name :black_and_white
|
8
|
+
attribute :ratio, :vec3
|
9
|
+
attribute :value, :float
|
10
|
+
|
11
|
+
# @param [Ray::Vector3] ratio Default ratio to compute grayscale
|
12
|
+
# @param [Float] value Minimal grayscale level of white pixels
|
13
|
+
def initialize(value = 0.5, ratio = [0.299, 0.587, 0.114])
|
14
|
+
@ratio = ratio
|
15
|
+
@value = value
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Ray::Vector3] ratio
|
19
|
+
attr_accessor :ratio
|
20
|
+
|
21
|
+
def defaults
|
22
|
+
{:ratio => @ratio, :value => @value}
|
23
|
+
end
|
24
|
+
|
25
|
+
def code
|
26
|
+
return <<code
|
27
|
+
vec4 do_black_and_white(ray_black_and_white args, vec4 color) {
|
28
|
+
float gray = dot(color.rgb, args.ratio);
|
29
|
+
if (gray > args.value)
|
30
|
+
return vec4(1, 1, 1, color.a);
|
31
|
+
else
|
32
|
+
return vec4(0, 0, 0, color.a);
|
33
|
+
}
|
34
|
+
code
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Ray
|
2
|
+
class Effect
|
3
|
+
# An effect to invert the color of a pixel. This preserves the alpha component.
|
4
|
+
class ColorInversion < Effect
|
5
|
+
effect_name :color_inversion
|
6
|
+
|
7
|
+
def code
|
8
|
+
return <<code
|
9
|
+
vec4 do_color_inversion(ray_color_inversion args, vec4 color) {
|
10
|
+
return vec4(vec3(1, 1, 1) - color.rgb, color.a);
|
11
|
+
}
|
12
|
+
code
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,145 @@
|
|
1
|
+
module Ray
|
2
|
+
class Effect
|
3
|
+
class Generator
|
4
|
+
include Enumerable
|
5
|
+
|
6
|
+
# @param [Integer] version GLSL version to use
|
7
|
+
# @yield Yields itself if a block is given
|
8
|
+
def initialize(version = 110)
|
9
|
+
@effects = []
|
10
|
+
@version = version
|
11
|
+
|
12
|
+
if version >= 130
|
13
|
+
@input = <<-input
|
14
|
+
in vec4 var_Color;
|
15
|
+
in vec2 var_TexCoord;
|
16
|
+
input
|
17
|
+
else
|
18
|
+
@input = <<-input
|
19
|
+
varying vec4 var_Color;
|
20
|
+
varying vec2 var_TexCoord;
|
21
|
+
input
|
22
|
+
end
|
23
|
+
|
24
|
+
@uniforms = <<-uniforms
|
25
|
+
uniform sampler2D in_Texture;
|
26
|
+
uniform bool in_TextureEnabled;
|
27
|
+
uniforms
|
28
|
+
|
29
|
+
@color = "color"
|
30
|
+
|
31
|
+
@default = <<-default
|
32
|
+
/* Apply default value */
|
33
|
+
vec4 color;
|
34
|
+
if (in_TextureEnabled)
|
35
|
+
color = texture#{"2D" if version<130}(in_Texture, var_TexCoord) * var_Color;
|
36
|
+
else
|
37
|
+
color = var_Color;
|
38
|
+
default
|
39
|
+
|
40
|
+
yield self if block_given?
|
41
|
+
end
|
42
|
+
|
43
|
+
# @param [Array<Ray:::Effect>] effects effects to add to the generator
|
44
|
+
def push(*effects)
|
45
|
+
@effects.concat effects
|
46
|
+
self
|
47
|
+
end
|
48
|
+
|
49
|
+
alias << push
|
50
|
+
|
51
|
+
def each(&block)
|
52
|
+
@effects.each(&block)
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return [Array<Ray::Effect>] All of the effects used by the generator
|
56
|
+
attr_reader :effects
|
57
|
+
alias to_a effects
|
58
|
+
|
59
|
+
# @return [Integer] GLSL version number
|
60
|
+
attr_reader :version
|
61
|
+
|
62
|
+
# @return [String] Code defining GLSL input (with varying or in, depending
|
63
|
+
# on the GLSL version).
|
64
|
+
attr_accessor :input
|
65
|
+
|
66
|
+
# @return [String] Code defining uniforms
|
67
|
+
attr_accessor :uniforms
|
68
|
+
|
69
|
+
# @return [String] Name of the variable containing the
|
70
|
+
# color once the default code is run. "color" by default.
|
71
|
+
attr_accessor :color
|
72
|
+
|
73
|
+
# @return [String] Code to ste the default color. It should apply
|
74
|
+
# texturing, for example.
|
75
|
+
attr_accessor :default
|
76
|
+
|
77
|
+
# @return [String] code of the pixel shader
|
78
|
+
def code
|
79
|
+
str = "#version #@version\n"
|
80
|
+
str << "\n"
|
81
|
+
|
82
|
+
str << input << "\n"
|
83
|
+
str << uniforms << "\n"
|
84
|
+
|
85
|
+
|
86
|
+
str << "out vec4 out_FragColor;\n" if version >= 130
|
87
|
+
str << "\n"
|
88
|
+
|
89
|
+
str << "/* Headers */\n"
|
90
|
+
each do |effect|
|
91
|
+
str << effect.header << "\n"
|
92
|
+
end
|
93
|
+
str << "\n"
|
94
|
+
|
95
|
+
str << "/* Structs */\n\n"
|
96
|
+
each do |effect|
|
97
|
+
str << effect.struct << "\n"
|
98
|
+
end
|
99
|
+
|
100
|
+
str << "/* Effects parameters */\n"
|
101
|
+
each do |effect|
|
102
|
+
str << "uniform ray_#{effect.name} #{effect.name};\n"
|
103
|
+
end
|
104
|
+
str << "\n"
|
105
|
+
|
106
|
+
str << "/* Functions */\n"
|
107
|
+
each do |effect|
|
108
|
+
str << effect.code << "\n"
|
109
|
+
end
|
110
|
+
|
111
|
+
str << "void main() {\n"
|
112
|
+
str << default << "\n"
|
113
|
+
|
114
|
+
each do |effect|
|
115
|
+
str << " if (#{effect.name}.enabled)\n"
|
116
|
+
str << " #@color = do_#{effect.name}(#{effect.name}, #@color);\n"
|
117
|
+
str << "\n"
|
118
|
+
end
|
119
|
+
|
120
|
+
if version >= 130
|
121
|
+
str << " out_FragColor = #@color;\n"
|
122
|
+
else
|
123
|
+
str << " gl_FragColor = #@color;\n"
|
124
|
+
end
|
125
|
+
|
126
|
+
str << "}\n"
|
127
|
+
end
|
128
|
+
|
129
|
+
# Generates a shader
|
130
|
+
# @param [Ray::Shader] shader Shader to compile and apply defaults to
|
131
|
+
# @return [Ray::Shader] shader
|
132
|
+
def build(shader = Ray::Shader.new)
|
133
|
+
shader.compile :frag => StringIO.new(code)
|
134
|
+
apply_defaults shader
|
135
|
+
shader
|
136
|
+
end
|
137
|
+
|
138
|
+
# Apply generator defaults to a shader
|
139
|
+
# @param [Ray::Shader] shader Shader to apply defaults to
|
140
|
+
def apply_defaults(shader)
|
141
|
+
each { |effect| effect.apply_defaults(shader) }
|
142
|
+
end
|
143
|
+
end
|
144
|
+
end
|
145
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module Ray
|
2
|
+
class Effect
|
3
|
+
# A grayscale effect. To accomplish it, it computes the dot product of the
|
4
|
+
# color by a ratio, and assigns the result to red, green, and blue
|
5
|
+
# components. Alpha component is preserved.
|
6
|
+
class Grayscale < Effect
|
7
|
+
effect_name :grayscale
|
8
|
+
attribute :ratio, :vec3
|
9
|
+
|
10
|
+
# @param [Ray::Vector3] ratio Default ratio
|
11
|
+
def initialize(ratio = [0.299, 0.587, 0.114])
|
12
|
+
@ratio = ratio
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Ray::Vector3] ratio
|
16
|
+
attr_accessor :ratio
|
17
|
+
|
18
|
+
def defaults
|
19
|
+
{:ratio => @ratio}
|
20
|
+
end
|
21
|
+
|
22
|
+
def code
|
23
|
+
return <<code
|
24
|
+
vec4 do_grayscale(ray_grayscale args, vec4 color) {
|
25
|
+
float gray = dot(color.rgb, args.ratio);
|
26
|
+
return vec4(gray, gray, gray, color.a);
|
27
|
+
}
|
28
|
+
code
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
data/lib/ray/game.rb
CHANGED
@@ -120,11 +120,31 @@ module Ray
|
|
120
120
|
@game_scenes.push(scene_name, *args)
|
121
121
|
end
|
122
122
|
|
123
|
-
# Pops the last scene
|
123
|
+
# Pops the last scene
|
124
124
|
def pop_scene
|
125
125
|
@game_scenes.pop
|
126
126
|
end
|
127
127
|
|
128
|
+
# Pops scenes while a condition is true
|
129
|
+
#
|
130
|
+
# @yield [scene] To determine if a scene must be popped.
|
131
|
+
# @yieldparam [Ray::Scene] scene The scene that will be popped
|
132
|
+
# @yieldreturn [Boolean] True to pop the next scene
|
133
|
+
def pop_scene_while
|
134
|
+
while yield scenes.current
|
135
|
+
scenes.current.pop_scene # ensure exit is set to false
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
# Pops scenes until a condition is met
|
140
|
+
#
|
141
|
+
# @yield (see #pop_scene_while)
|
142
|
+
# @yieldparam scene (see #pop_scene_while)
|
143
|
+
# @yieldreturn [Boolean] False to pop the next scene
|
144
|
+
def pop_scene_until
|
145
|
+
pop_scene_while { |o| !yield(o) }
|
146
|
+
end
|
147
|
+
|
128
148
|
# Registers a new scene with a given name. the block will be passed
|
129
149
|
# to klass.new.
|
130
150
|
#
|
@@ -136,6 +156,7 @@ module Ray
|
|
136
156
|
scene.game = self
|
137
157
|
scene.event_runner = event_runner
|
138
158
|
scene.window = @game_window
|
159
|
+
scene.name = name
|
139
160
|
end
|
140
161
|
|
141
162
|
# @return [Ray::Scene] scene register for a given name
|
@@ -183,14 +204,17 @@ module Ray
|
|
183
204
|
@game_scenes.clear
|
184
205
|
end
|
185
206
|
|
207
|
+
# @return [Ray::String]
|
186
208
|
def title
|
187
209
|
@game_title
|
188
210
|
end
|
189
211
|
|
212
|
+
# @return [Ray::SceneList]
|
190
213
|
def scenes
|
191
214
|
@game_scenes
|
192
215
|
end
|
193
216
|
|
217
|
+
# @return [Ray::Window]
|
194
218
|
def window
|
195
219
|
@game_window
|
196
220
|
end
|
@@ -210,10 +234,6 @@ module Ray
|
|
210
234
|
scene.event_runner = runner
|
211
235
|
end
|
212
236
|
end
|
213
|
-
|
214
|
-
def inspect
|
215
|
-
"game(#{title.inspect})"
|
216
|
-
end
|
217
237
|
end
|
218
238
|
|
219
239
|
# (see Ray::Game#initialize)
|
data/lib/ray/gl/vertex.rb
CHANGED
@@ -1,15 +1,51 @@
|
|
1
1
|
module Ray
|
2
2
|
module GL
|
3
3
|
class Vertex
|
4
|
+
include Ray::PP
|
5
|
+
|
4
6
|
@vertex_classes = {0 => Ray::Vertex}
|
5
7
|
|
8
|
+
class Instance
|
9
|
+
include Ray::PP
|
10
|
+
|
11
|
+
@instance_classes = {}
|
12
|
+
|
13
|
+
class << self
|
14
|
+
attr_reader :instance_classes
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.layout
|
18
|
+
@vertex_instance_layout
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
pairs = []
|
23
|
+
self.class.layout.each do |key, _, _, per_instance|
|
24
|
+
pairs << "#{key}=#{send(key)}" if per_instance
|
25
|
+
end
|
26
|
+
|
27
|
+
"#<#{self.class} #{pairs.join " "}>"
|
28
|
+
end
|
29
|
+
|
30
|
+
def pretty_print(q)
|
31
|
+
attr = []
|
32
|
+
self.class.layout.each do |key, _, _, per_instance|
|
33
|
+
attr << key if per_instance
|
34
|
+
end
|
35
|
+
|
36
|
+
pretty_print_attributes q, attr
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
6
40
|
# Creates a new Vertex class with a custom layout. Layout is an array of
|
7
|
-
# arrays, where each row contains 3 elements:
|
41
|
+
# arrays, where each row contains 3 or 4 elements:
|
8
42
|
#
|
9
43
|
# 1. Attribute name in Ruby
|
10
44
|
# 2. Attribute name in GLSL shaders
|
11
45
|
# 3. Attribute type, one of the following symbols: float, int, ubyte,
|
12
46
|
# bool, color, vector2, vector3.
|
47
|
+
# 4. Whether the attribute is only accessibel on a per-instance basis (as
|
48
|
+
# opposed to per-vertex, which is the default)
|
13
49
|
#
|
14
50
|
# Getters and setters are created for all of the attributes.
|
15
51
|
#
|
@@ -23,10 +59,13 @@ module Ray
|
|
23
59
|
# [:bool, "in_Bool", :bool],
|
24
60
|
# [:color, "in_Color", :color],
|
25
61
|
# [:vector2, "in_Vector2", :vector2],
|
26
|
-
# [:vector3, "in_Vector3", :vector3]
|
62
|
+
# [:vector3, "in_Vector3", :vector3],
|
63
|
+
#
|
64
|
+
# # per-instance data
|
65
|
+
# [:instance_color, "magic", :color, true]
|
27
66
|
# ]
|
28
67
|
def self.make(layout)
|
29
|
-
layout.each do |_, _, type|
|
68
|
+
layout.each do |_, _, type, _|
|
30
69
|
unless TypeMap.has_key? type
|
31
70
|
raise ArgumentError, "unknown type in a vertex: #{type.inspect}"
|
32
71
|
end
|
@@ -40,6 +79,20 @@ module Ray
|
|
40
79
|
@vertex_type_size = Vertex.size(vtype)
|
41
80
|
@vertex_type_layout = layout
|
42
81
|
|
82
|
+
if layout.any? { |_, _, _, per_instance| per_instance }
|
83
|
+
const_set :Instance, Class.new(Ray::GL::Vertex::Instance) {
|
84
|
+
@vertex_instance_type_id = vtype
|
85
|
+
@vertex_instance_size = Vertex.instance_size(vtype)
|
86
|
+
@vertex_instance_layout = layout
|
87
|
+
|
88
|
+
class << self
|
89
|
+
undef instance_classes
|
90
|
+
end
|
91
|
+
|
92
|
+
Vertex.define_layout self, layout, vtype, true
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
43
96
|
class << self
|
44
97
|
undef make
|
45
98
|
undef make_type
|
@@ -47,18 +100,51 @@ module Ray
|
|
47
100
|
undef offset_of
|
48
101
|
end
|
49
102
|
|
103
|
+
Vertex.define_layout self, layout, vtype, false
|
104
|
+
end
|
105
|
+
|
106
|
+
if @vertex_classes[vtype].const_defined? :Instance
|
107
|
+
Instance.instance_classes[vtype] = @vertex_classes[vtype]::Instance
|
108
|
+
end
|
109
|
+
|
110
|
+
@vertex_classes[vtype]
|
111
|
+
end
|
112
|
+
|
113
|
+
def self.layout
|
114
|
+
@vertex_type_layout
|
115
|
+
end
|
116
|
+
|
117
|
+
def self.default_for(type)
|
118
|
+
case type
|
119
|
+
when :float, :int, :ubyte then 0
|
120
|
+
when :bool then true
|
121
|
+
when :vector2 then Ray::Vector2[0, 0]
|
122
|
+
when :vector3 then Ray::Vector3[0, 0, 0]
|
123
|
+
when :color then Ray::Color.white
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
def self.define_layout(on, layout, vtype, instance = false)
|
128
|
+
argument_layout = layout.reject do |_, _, _, per_instance|
|
129
|
+
per_instance ^ instance
|
130
|
+
end
|
131
|
+
|
132
|
+
on.class_eval do
|
50
133
|
define_method :initialize do |*args|
|
51
134
|
if args.size > layout.size
|
52
|
-
|
53
|
-
|
135
|
+
msg = "wrong number of arguments: #{args.size} for" <<
|
136
|
+
" #{layout.size}"
|
137
|
+
raise ArgumentError, msg
|
54
138
|
end
|
55
139
|
|
56
|
-
|
57
|
-
send("#{attr}=", args[i] || default_for(type))
|
140
|
+
argument_layout.each_with_index do |(attr, _, type, _), i|
|
141
|
+
send("#{attr}=", args[i] || Vertex.default_for(type))
|
58
142
|
end
|
59
143
|
end
|
60
144
|
|
61
|
-
layout.each_with_index do |(attr, _, type), i|
|
145
|
+
layout.each_with_index do |(attr, _, type, per_instance), i|
|
146
|
+
next if per_instance ^ instance
|
147
|
+
|
62
148
|
offset = Vertex.offset_of(vtype, i)
|
63
149
|
|
64
150
|
# Faster than define_method.
|
@@ -77,29 +163,22 @@ module Ray
|
|
77
163
|
end
|
78
164
|
end
|
79
165
|
|
80
|
-
def self.layout
|
81
|
-
@vertex_type_layout
|
82
|
-
end
|
83
|
-
|
84
166
|
def to_s
|
85
|
-
|
86
|
-
|
167
|
+
pairs = []
|
168
|
+
self.class.layout.each do |key, _, _, per_instance|
|
169
|
+
pairs << "#{key}=#{send(key)}" unless per_instance
|
170
|
+
end
|
87
171
|
|
88
|
-
|
89
|
-
self.class.layout.map { |key, _, _|
|
90
|
-
"#{key}=#{send(key)}"
|
91
|
-
}.join " "
|
172
|
+
"#<#{self.class} #{pairs.join " "}>"
|
92
173
|
end
|
93
174
|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
when :bool then true
|
99
|
-
when :vector2 then Ray::Vector2[0, 0]
|
100
|
-
when :vector3 then Ray::Vector3[0, 0, 0]
|
101
|
-
when :color then Ray::Color.white
|
175
|
+
def pretty_print(q)
|
176
|
+
attr = []
|
177
|
+
self.class.layout.each do |key, _, _, per_instance|
|
178
|
+
attr << key unless per_instance
|
102
179
|
end
|
180
|
+
|
181
|
+
pretty_print_attributes q, attr
|
103
182
|
end
|
104
183
|
end
|
105
184
|
end
|