mittsu 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +2 -1
- data/README.md +1 -1
- data/lib/mittsu/cameras/orthographic_camera.rb +13 -0
- data/lib/mittsu/cameras/perspective_camera.rb +11 -0
- data/lib/mittsu/core/geometry.rb +12 -9
- data/lib/mittsu/core/object_3d.rb +33 -66
- data/lib/mittsu/lights/ambient_light.rb +8 -0
- data/lib/mittsu/lights/directional_light.rb +9 -0
- data/lib/mittsu/lights/hemisphere_light.rb +9 -0
- data/lib/mittsu/lights/point_light.rb +11 -0
- data/lib/mittsu/lights/spot_light.rb +13 -0
- data/lib/mittsu/loaders.rb +1 -0
- data/lib/mittsu/loaders/mtl_loader.rb +5 -12
- data/lib/mittsu/loaders/obj_loader.rb +212 -0
- data/lib/mittsu/loaders/obj_mtl_loader.rb +11 -207
- data/lib/mittsu/materials/material.rb +5 -2
- data/lib/mittsu/materials/mesh_basic_material.rb +0 -9
- data/lib/mittsu/math/color.rb +44 -104
- data/lib/mittsu/math/matrix3.rb +8 -1
- data/lib/mittsu/math/matrix4.rb +6 -0
- data/lib/mittsu/math/vector.rb +251 -0
- data/lib/mittsu/math/vector2.rb +14 -213
- data/lib/mittsu/math/vector3.rb +61 -351
- data/lib/mittsu/math/vector4.rb +45 -295
- data/lib/mittsu/objects/line.rb +12 -2
- data/lib/mittsu/objects/mesh.rb +18 -9
- data/lib/mittsu/renderers/glfw_window.rb +15 -13
- data/lib/mittsu/renderers/opengl/core/opengl_geometry.rb +253 -0
- data/lib/mittsu/renderers/opengl/core/opengl_object_3d.rb +131 -0
- data/lib/mittsu/renderers/opengl/lights/opengl_ambient_light.rb +26 -0
- data/lib/mittsu/renderers/opengl/lights/opengl_directional_light.rb +35 -0
- data/lib/mittsu/renderers/opengl/lights/opengl_hemisphere_light.rb +42 -0
- data/lib/mittsu/renderers/opengl/lights/opengl_light.rb +52 -0
- data/lib/mittsu/renderers/opengl/lights/opengl_point_light.rb +36 -0
- data/lib/mittsu/renderers/opengl/lights/opengl_spot_light.rb +47 -0
- data/lib/mittsu/renderers/opengl/materials/opengl_line_basic_material.rb +16 -0
- data/lib/mittsu/renderers/opengl/materials/opengl_material.rb +275 -0
- data/lib/mittsu/renderers/opengl/materials/opengl_mesh_basic_material.rb +69 -0
- data/lib/mittsu/renderers/opengl/materials/opengl_mesh_lambert_material.rb +29 -0
- data/lib/mittsu/renderers/opengl/materials/opengl_mesh_phong_material.rb +40 -0
- data/lib/mittsu/renderers/opengl/materials/opengl_shader_material.rb +11 -0
- data/lib/mittsu/renderers/opengl/objects/opengl_group.rb +8 -0
- data/lib/mittsu/renderers/opengl/objects/opengl_line.rb +54 -0
- data/lib/mittsu/renderers/opengl/objects/opengl_mesh.rb +77 -0
- data/lib/mittsu/renderers/opengl/opengl_buffer.rb +5 -0
- data/lib/mittsu/renderers/opengl/opengl_debug.rb +49 -7
- data/lib/mittsu/renderers/opengl/opengl_default_target.rb +54 -0
- data/lib/mittsu/renderers/opengl/opengl_geometry_group.rb +763 -0
- data/lib/mittsu/renderers/opengl/opengl_geometry_like.rb +130 -0
- data/lib/mittsu/renderers/opengl/opengl_helper.rb +161 -0
- data/lib/mittsu/renderers/opengl/opengl_implementations.rb +61 -0
- data/lib/mittsu/renderers/opengl/opengl_light_renderer.rb +43 -0
- data/lib/mittsu/renderers/opengl/opengl_mittsu_params.rb +53 -0
- data/lib/mittsu/renderers/opengl/opengl_program.rb +147 -296
- data/lib/mittsu/renderers/opengl/opengl_state.rb +3 -5
- data/lib/mittsu/renderers/opengl/plugins/shadow_map_plugin.rb +12 -10
- data/lib/mittsu/renderers/opengl/scenes/opengl_scene.rb +8 -0
- data/lib/mittsu/renderers/opengl/textures/opengl_compressed_texture.rb +21 -0
- data/lib/mittsu/renderers/opengl/textures/opengl_cube_texture.rb +75 -0
- data/lib/mittsu/renderers/opengl/textures/opengl_data_texture.rb +23 -0
- data/lib/mittsu/renderers/opengl/textures/opengl_texture.rb +111 -0
- data/lib/mittsu/renderers/opengl_render_target.rb +117 -2
- data/lib/mittsu/renderers/opengl_renderer.rb +653 -2978
- data/lib/mittsu/renderers/shaders/rbsl_loader.rb +166 -0
- data/lib/mittsu/renderers/shaders/shader_chunk.rb +6 -9
- data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_fragment.glsl +36 -37
- data/lib/mittsu/renderers/shaders/shader_lib.rb +26 -403
- data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_fragment.rbsl +37 -0
- data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_uniforms.rbslu +3 -0
- data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_vertex.rbsl +33 -0
- data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_fragment.rbsl +12 -0
- data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_uniforms.rbslu +2 -0
- data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_vertex.rbsl +12 -0
- data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_fragment.rbsl +26 -0
- data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_uniforms.rbslu +0 -0
- data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_vertex.rbsl +12 -0
- data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_fragment.rbsl +56 -0
- data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_uniforms.rbslu +7 -0
- data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_vertex.rbsl +37 -0
- data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_fragment.rbsl +45 -0
- data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_uniforms.rbslu +11 -0
- data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_vertex.rbsl +43 -0
- data/lib/mittsu/renderers/shaders/shader_templates/fragment.glsl.erb +105 -0
- data/lib/mittsu/renderers/shaders/shader_templates/vertex.glsl.erb +143 -0
- data/lib/mittsu/renderers/shaders/uniforms_lib.rb +54 -55
- data/lib/mittsu/textures/texture.rb +5 -2
- data/lib/mittsu/version.rb +1 -1
- data/run_all_examples.sh +7 -0
- metadata +77 -28
- data/.ruby-version +0 -1
- data/lib/mittsu/core/hash_object.rb +0 -19
@@ -1,3 +1,5 @@
|
|
1
|
+
require 'erb'
|
2
|
+
|
1
3
|
require 'mittsu/renderers/opengl/opengl_shader'
|
2
4
|
|
3
5
|
module Mittsu
|
@@ -6,12 +8,23 @@ module Mittsu
|
|
6
8
|
attr_accessor :code, :used_times, :attributes, :vertex_shader, :fragment_shader
|
7
9
|
|
8
10
|
def initialize(renderer, code, material, parameters)
|
9
|
-
|
10
|
-
|
11
|
-
|
11
|
+
@id = (@@id ||= 1).tap { @@id += 1 }
|
12
|
+
@renderer = renderer
|
13
|
+
|
14
|
+
compile_and_link_program(material, parameters)
|
15
|
+
|
16
|
+
material_impl = material.implementation(@renderer)
|
17
|
+
cache_uniform_locations(material_impl.shader[:uniforms] || {}, parameters)
|
18
|
+
cache_attribute_locations(material.attributes || {}, parameters)
|
19
|
+
|
20
|
+
@code = code
|
21
|
+
@used_times = 2
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
12
25
|
|
13
|
-
|
14
|
-
|
26
|
+
def compile_and_link_program(material, parameters)
|
27
|
+
@program = glCreateProgram
|
15
28
|
|
16
29
|
# TODO: necessary for OpenGL?
|
17
30
|
# index0_attribute_name = material.index0_attribute_name
|
@@ -22,263 +35,156 @@ module Mittsu
|
|
22
35
|
# index0_attribute_name = 'position'
|
23
36
|
# end
|
24
37
|
|
25
|
-
|
26
|
-
|
27
|
-
if parameters[:shadow_map_type] == PCFShadowMap
|
28
|
-
shadow_map_type_define = 'SHADOWMAP_TYPE_PCF_SOFT'
|
29
|
-
elsif parameters[:shadow_map_type] == PCFSoftShadowMap
|
30
|
-
shadow_map_type_define = 'SHADOWMAP_TYPE_PCF_SOFT'
|
31
|
-
end
|
32
|
-
|
33
|
-
env_map_type_define = 'ENVMAP_TYPE_CUBE'
|
34
|
-
env_map_mode_define = 'ENVMAP_MODE_REFLECTION'
|
35
|
-
env_map_blending_define = 'ENVMAP_BLENDING_MULTIPLY'
|
36
|
-
|
37
|
-
if parameters[:env_map]
|
38
|
-
case material.env_map.mapping
|
39
|
-
when CubeReflectionMapping, CubeRefractionMapping
|
40
|
-
env_map_type_define = 'ENVMAP_TYPE_CUBE'
|
41
|
-
when EquirectangularReflectionMapping, EquirectangularRefractionMapping
|
42
|
-
env_map_type_define = 'ENVMAP_TYPE_EQUIREC'
|
43
|
-
when SphericalReflectionMapping
|
44
|
-
env_map_type_define = 'ENVMAP_TYPE_SPHERE'
|
45
|
-
end
|
46
|
-
|
47
|
-
case material.env_map.mapping
|
48
|
-
when CubeRefractionMapping, EquirectangularRefractionMapping
|
49
|
-
env_map_mode_define 'ENVMAP_MODE_REFRACTION'
|
50
|
-
end
|
51
|
-
|
52
|
-
case material.combine
|
53
|
-
when MultiplyOperation
|
54
|
-
env_map_blending_define = 'ENVMAP_BLENDING_MULTIPLY'
|
55
|
-
when MixOperation
|
56
|
-
env_map_blending_define = 'ENVMAP_BLENDING_MIX'
|
57
|
-
when AddOperation
|
58
|
-
env_map_blending_define = 'ENVMAP_BLENDING_ADD'
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
gamma_factor_define = (renderer.gamma_factor > 0) ? renderer.gamma_factor : 1.0
|
63
|
-
|
64
|
-
# puts 'building new program'
|
65
|
-
|
66
|
-
#
|
67
|
-
|
68
|
-
custom_defines = generate_defines(defines)
|
69
|
-
|
70
|
-
#
|
71
|
-
|
72
|
-
@program = glCreateProgram
|
73
|
-
|
74
|
-
if false # material.is_a?(RawShaderMaterial) # TODO: when RawShaderMaterial exists
|
75
|
-
prefix_vertex = ''
|
76
|
-
prefix_fragment = ''
|
77
|
-
else
|
78
|
-
prefix_vertex = [
|
79
|
-
'#version 330',
|
80
|
-
# TODO: do we need precision for an OpenGL program?
|
81
|
-
# "precision #{parameters[:precision]} float;",
|
82
|
-
# "precision #{parameters[:precision]} int;",
|
83
|
-
|
84
|
-
custom_defines,
|
85
|
-
|
86
|
-
parameters[:supports_vertex_textures] ? '#define VERTEX_TEXTURES' : '',
|
87
|
-
|
88
|
-
renderer.gamma_input ? '#define GAMMA_INPUT' : '',
|
89
|
-
renderer.gamma_output ? '#define GAMMA_OUTPUT' : '',
|
90
|
-
"#define GAMMA_FACTOR #{gamma_factor_define}",
|
91
|
-
|
92
|
-
"#define MAX_DIR_LIGHTS #{parameters[:max_dir_lights]}",
|
93
|
-
"#define MAX_POINT_LIGHTS #{parameters[:max_point_lights]}",
|
94
|
-
"#define MAX_SPOT_LIGHTS #{parameters[:max_spot_lights]}",
|
95
|
-
"#define MAX_HEMI_LIGHTS #{parameters[:max_hemi_lights]}",
|
96
|
-
|
97
|
-
"#define MAX_SHADOWS #{parameters[:max_shadows]}",
|
98
|
-
|
99
|
-
"#define MAX_BONES #{parameters[:max_bones]}",
|
100
|
-
|
101
|
-
parameters[:map] ? '#define USE_MAP' : '',
|
102
|
-
parameters[:env_map] ? '#define USE_ENVMAP' : '',
|
103
|
-
parameters[:env_map] ? "#define #{env_map_mode_define}" : '',
|
104
|
-
parameters[:light_map] ? '#define USE_LIGHTMAP' : '',
|
105
|
-
parameters[:bump_map] ? '#define USE_BUMPMAP' : '',
|
106
|
-
parameters[:normal_map] ? '#define USE_NORMALMAP' : '',
|
107
|
-
parameters[:specular_map] ? '#define USE_SPECULARMAP' : '',
|
108
|
-
parameters[:alpha_map] ? '#define USE_ALPHAMAP' : '',
|
109
|
-
parameters[:vertex_colors] ? '#define USE_COLOR' : '',
|
110
|
-
|
111
|
-
parameters[:flat_shading] ? '#define FLAT_SHADED': '',
|
112
|
-
|
113
|
-
parameters[:skinning] ? '#define USE_SKINNING' : '',
|
114
|
-
parameters[:use_vertex_texture] ? '#define BONE_TEXTURE' : '',
|
115
|
-
|
116
|
-
parameters[:morph_targets] ? '#define USE_MORPHTARGETS' : '',
|
117
|
-
parameters[:morph_normals] ? '#define USE_MORPHNORMALS' : '',
|
118
|
-
parameters[:wrap_around] ? '#define WRAP_AROUND' : '',
|
119
|
-
parameters[:double_sided] ? '#define DOUBLE_SIDED' : '',
|
120
|
-
parameters[:flip_sided] ? '#define FLIP_SIDED' : '',
|
121
|
-
|
122
|
-
parameters[:shadow_map_enabled] ? '#define USE_SHADOWMAP' : '',
|
123
|
-
parameters[:shadow_map_enabled] ? "#define #{shadow_map_type_define}" : '',
|
124
|
-
parameters[:shadow_map_debug] ? '#define SHADOWMAP_DEBUG' : '',
|
125
|
-
parameters[:shadow_map_cascade] ? '#define SHADOWMAP_CASCADE' : '',
|
126
|
-
|
127
|
-
parameters[:size_attenuation] ? '#define USE_SIZEATTENUATION' : '',
|
128
|
-
|
129
|
-
parameters[:logarithmic_depth_buffer] ? '#define USE_LOGDEPTHBUF' : '',
|
130
|
-
#renderer._glExtensionFragDepth ? '#define USE_LOGDEPTHBUF_EXT' : '',
|
131
|
-
|
132
|
-
|
133
|
-
'uniform mat4 modelMatrix;',
|
134
|
-
'uniform mat4 modelViewMatrix;',
|
135
|
-
'uniform mat4 projectionMatrix;',
|
136
|
-
'uniform mat4 viewMatrix;',
|
137
|
-
'uniform mat3 normalMatrix;',
|
138
|
-
'uniform vec3 cameraPosition;',
|
139
|
-
|
140
|
-
'in vec3 position;',
|
141
|
-
'in vec3 normal;',
|
142
|
-
'in vec2 uv;',
|
143
|
-
'in vec2 uv2;',
|
144
|
-
|
145
|
-
'#ifdef USE_COLOR',
|
146
|
-
|
147
|
-
' in vec3 color;',
|
148
|
-
|
149
|
-
'#endif',
|
38
|
+
compile_shaders(material, parameters)
|
150
39
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
' in vec3 morphTarget3;',
|
157
|
-
|
158
|
-
' #ifdef USE_MORPHNORMALS',
|
159
|
-
|
160
|
-
' in vec3 morphNormal0;',
|
161
|
-
' in vec3 morphNormal1;',
|
162
|
-
' in vec3 morphNormal2;',
|
163
|
-
' in vec3 morphNormal3;',
|
164
|
-
|
165
|
-
' #else',
|
166
|
-
|
167
|
-
' in vec3 morphTarget4;',
|
168
|
-
' in vec3 morphTarget5;',
|
169
|
-
' in vec3 morphTarget6;',
|
170
|
-
' in vec3 morphTarget7;',
|
171
|
-
|
172
|
-
' #endif',
|
173
|
-
|
174
|
-
'#endif',
|
175
|
-
|
176
|
-
'#ifdef USE_SKINNING',
|
177
|
-
|
178
|
-
' in vec4 skinIndex;',
|
179
|
-
' in vec4 skinWeight;',
|
180
|
-
|
181
|
-
'#endif',
|
182
|
-
].reject(&:empty?).join("\n") + "\n"
|
183
|
-
|
184
|
-
prefix_fragment = [
|
185
|
-
'#version 330',
|
186
|
-
# TODO: do we need precision for an OpenGL program?
|
187
|
-
# "precison #{parameters[:precision]} float;",
|
188
|
-
# "precison #{parameters[:precision]} int;",
|
189
|
-
|
190
|
-
# (parameters[:bump_map] || parameters[:normal_map] || parameters[:flat_shading]) ? '#extension GL_OES_standard_derivatives : enable' : '', # TODO: oes extension in OpenGL?
|
40
|
+
# if !index0_attribute_name.nil?
|
41
|
+
# TODO: is this necessary in OpenGL ???
|
42
|
+
# Force a particular attribute to index 0.
|
43
|
+
# because potentially expensive emulation is done by __browser__ if attribute 0 is disabled. (no browser here!)
|
44
|
+
# And, color, for example is often automatically bound to index 0 so disabling it
|
191
45
|
|
192
|
-
|
46
|
+
# glBindAttributeLocation(program, 0, index0_attribute_name)
|
47
|
+
# end
|
193
48
|
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
49
|
+
glLinkProgram(@program)
|
50
|
+
check_for_link_errors
|
51
|
+
post_link_clean_up
|
52
|
+
end
|
198
53
|
|
199
|
-
|
54
|
+
def generate_defines(defines)
|
55
|
+
chunks = []
|
200
56
|
|
201
|
-
|
57
|
+
defines.each do |d, value|
|
58
|
+
next if value == false
|
202
59
|
|
203
|
-
|
204
|
-
|
205
|
-
|
60
|
+
chunk = "#define #{d} #{value}"
|
61
|
+
chunks << chunk
|
62
|
+
end
|
206
63
|
|
207
|
-
|
208
|
-
|
64
|
+
chunks.join("\n")
|
65
|
+
end
|
209
66
|
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
parameters[:light_map] ? '#define USE_LIGHTMAP' : '',
|
216
|
-
parameters[:bump_map] ? '#define USE_BUMPMAP' : '',
|
217
|
-
parameters[:normal_map] ? '#define USE_NORMALMAP' : '',
|
218
|
-
parameters[:specular_map] ? '#define USE_SPECULARMAP' : '',
|
219
|
-
parameters[:alpha_map] ? '#define USE_ALPHAMAP' : '',
|
220
|
-
parameters[:vertex_colors] ? '#define USE_COLOR' : '',
|
67
|
+
def link_status
|
68
|
+
ptr = ' '*8
|
69
|
+
glGetProgramiv @program, GL_LINK_STATUS, ptr
|
70
|
+
ptr.unpack('L')[0]
|
71
|
+
end
|
221
72
|
|
222
|
-
|
73
|
+
def program_info_log
|
74
|
+
ptr = ' '*8
|
75
|
+
glGetProgramiv @program, GL_INFO_LOG_LENGTH, ptr
|
76
|
+
length = ptr.unpack('L')[0]
|
223
77
|
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
78
|
+
if length > 0
|
79
|
+
log = ' '*length
|
80
|
+
glGetProgramInfoLog @program, length, ptr, log
|
81
|
+
log.unpack("A#{length}")[0]
|
82
|
+
else
|
83
|
+
''
|
84
|
+
end
|
85
|
+
end
|
228
86
|
|
87
|
+
def check_for_link_errors
|
88
|
+
log_info = program_info_log
|
229
89
|
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
parameters[:'shadow_map_cascade'] ? '#define SHADOWMAP_CASCADE' : '',
|
90
|
+
if !link_status
|
91
|
+
puts "ERROR: Mittsu::OpenGLProgram: shader error: #{glGetError}, GL_INVALID_STATUS, #{glGetProgramParameter(program, GL_VALIDATE_STATUS)}, glGetProgramParameterInfoLog, #{log_info}"
|
92
|
+
end
|
234
93
|
|
235
|
-
|
236
|
-
|
94
|
+
if !log_info.empty?
|
95
|
+
puts "WARNING: Mittsu::OpenGLProgram: glGetProgramInfoLog, #{log_info}"
|
96
|
+
# TODO: useless in OpenGL ???
|
97
|
+
# puts "WARNING: #{glGetExtension( 'OPENGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader )}"
|
98
|
+
# puts "WARNING: #{glGetExtension( 'OPENGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader )}"
|
99
|
+
end
|
100
|
+
end
|
237
101
|
|
238
|
-
|
239
|
-
|
102
|
+
def get_shadow_map_define(shadow_map_param)
|
103
|
+
case shadow_map_param
|
104
|
+
when PCFShadowMap
|
105
|
+
'SHADOWMAP_TYPE_PCF'
|
106
|
+
when PCFSoftShadowMap
|
107
|
+
'SHADOWMAP_TYPE_PCF_SOFT'
|
108
|
+
else
|
109
|
+
'SHADOWMAP_TYPE_BASIC'
|
110
|
+
end
|
111
|
+
end
|
240
112
|
|
241
|
-
|
242
|
-
|
113
|
+
def get_env_map_type_define(env_map_param, material)
|
114
|
+
return 'ENVMAP_TYPE_CUBE' unless env_map_param
|
115
|
+
case material.env_map.mapping
|
116
|
+
when CubeReflectionMapping, CubeRefractionMapping
|
117
|
+
'ENVMAP_TYPE_CUBE'
|
118
|
+
when EquirectangularReflectionMapping, EquirectangularRefractionMapping
|
119
|
+
'ENVMAP_TYPE_EQUIREC'
|
120
|
+
when SphericalReflectionMapping
|
121
|
+
'ENVMAP_TYPE_SPHERE'
|
122
|
+
else
|
123
|
+
'ENVMAP_TYPE_CUBE'
|
243
124
|
end
|
125
|
+
end
|
244
126
|
|
245
|
-
|
246
|
-
|
127
|
+
def get_env_map_mode_define(env_map_param, material)
|
128
|
+
return 'ENVMAP_MODE_REFLECTION' unless env_map_param
|
129
|
+
case material.env_map.mapping
|
130
|
+
when CubeRefractionMapping, EquirectangularRefractionMapping
|
131
|
+
'ENVMAP_MODE_REFRACTION'
|
132
|
+
else
|
133
|
+
'ENVMAP_MODE_REFLECTION'
|
134
|
+
end
|
135
|
+
end
|
247
136
|
|
248
|
-
|
249
|
-
|
137
|
+
def get_env_map_blending_define(env_map_param, material)
|
138
|
+
return 'ENVMAP_BLENDING_MULTIPLY' unless env_map_param
|
139
|
+
case material.combine
|
140
|
+
when MultiplyOperation
|
141
|
+
'ENVMAP_BLENDING_MULTIPLY'
|
142
|
+
when MixOperation
|
143
|
+
'ENVMAP_BLENDING_MIX'
|
144
|
+
when AddOperation
|
145
|
+
'ENVMAP_BLENDING_ADD'
|
146
|
+
else
|
147
|
+
'ENVMAP_BLENDING_MULTIPLY'
|
148
|
+
end
|
149
|
+
end
|
250
150
|
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
# because potentially expensive emulation is done by __browser__ if attribute 0 is disabled. (no browser here!)
|
255
|
-
# And, color, for example is often automatically bound to index 0 so disabling it
|
151
|
+
def compile_shaders(material, parameters)
|
152
|
+
material_impl = material.implementation(@renderer)
|
153
|
+
shadow_map_type_define = get_shadow_map_define(parameters[:shadow_map_type])
|
256
154
|
|
257
|
-
|
258
|
-
|
155
|
+
env_map_type_define = get_env_map_type_define(parameters[:env_map], material)
|
156
|
+
env_map_mode_define = get_env_map_mode_define(parameters[:env_map], material)
|
157
|
+
env_map_blending_define = get_env_map_blending_define(parameters[:env_map], material)
|
259
158
|
|
260
|
-
|
159
|
+
gamma_factor_define = (@renderer.gamma_factor > 0) ? @renderer.gamma_factor : 1.0
|
261
160
|
|
262
|
-
|
161
|
+
custom_defines = generate_defines(material.defines || {})
|
263
162
|
|
264
|
-
if
|
265
|
-
|
163
|
+
if false # material.is_a?(RawShaderMaterial) # TODO: when RawShaderMaterial exists
|
164
|
+
prefix_vertex = ''
|
165
|
+
prefix_fragment = ''
|
166
|
+
else
|
167
|
+
prefix_vertex = File.read(File.expand_path('../../shaders/shader_templates/vertex.glsl.erb', __FILE__))
|
168
|
+
prefix_fragment = File.read(File.expand_path('../../shaders/shader_templates/fragment.glsl.erb', __FILE__))
|
266
169
|
end
|
267
170
|
|
268
|
-
|
269
|
-
|
270
|
-
# TODO: useless in OpenGL ???
|
271
|
-
# puts "WARNING: #{glGetExtension( 'OPENGL_debug_shaders' ).getTranslatedShaderSource( glVertexShader )}"
|
272
|
-
# puts "WARNING: #{glGetExtension( 'OPENGL_debug_shaders' ).getTranslatedShaderSource( glFragmentShader )}"
|
273
|
-
end
|
171
|
+
@vertex_shader = OpenGLShader.new(GL_VERTEX_SHADER, compile_shader_template(prefix_vertex + material_impl.shader[:vertex_shader], binding))
|
172
|
+
@fragment_shader = OpenGLShader.new(GL_FRAGMENT_SHADER, compile_shader_template(prefix_fragment + material_impl.shader[:fragment_shader], binding))
|
274
173
|
|
275
|
-
|
174
|
+
glAttachShader(@program, @vertex_shader.shader)
|
175
|
+
glAttachShader(@program, @fragment_shader.shader)
|
176
|
+
end
|
276
177
|
|
277
|
-
|
278
|
-
|
178
|
+
def compile_shader_template(template, b)
|
179
|
+
ERB.new(template).result(b)
|
180
|
+
end
|
279
181
|
|
280
|
-
|
182
|
+
def post_link_clean_up
|
183
|
+
glDeleteShader(@vertex_shader.shader)
|
184
|
+
glDeleteShader(@fragment_shader.shader)
|
185
|
+
end
|
281
186
|
|
187
|
+
def cache_uniform_locations(uniforms, parameters)
|
282
188
|
identifiers = [
|
283
189
|
'viewMatrix',
|
284
190
|
'modelViewMatrix',
|
@@ -307,10 +213,13 @@ module Mittsu
|
|
307
213
|
identifiers << k.to_s
|
308
214
|
end
|
309
215
|
|
310
|
-
@uniforms =
|
311
|
-
|
312
|
-
|
216
|
+
@uniforms = {}
|
217
|
+
identifiers.each do |id|
|
218
|
+
@uniforms[id] = glGetUniformLocation(program, id)
|
219
|
+
end
|
220
|
+
end
|
313
221
|
|
222
|
+
def cache_attribute_locations(attributes, parameters)
|
314
223
|
identifiers = [
|
315
224
|
'position',
|
316
225
|
'normal',
|
@@ -335,67 +244,9 @@ module Mittsu
|
|
335
244
|
identifiers << k
|
336
245
|
end
|
337
246
|
|
338
|
-
@attributes =
|
339
|
-
|
340
|
-
@id = (@@id ||= 1).tap { @@id += 1 }
|
341
|
-
@code = code
|
342
|
-
@used_times = 2
|
343
|
-
@vertex_shader = gl_vertex_shader
|
344
|
-
@fragment_shader = gl_fragment_shader
|
345
|
-
end
|
346
|
-
|
347
|
-
private
|
348
|
-
|
349
|
-
def generate_defines(defines)
|
350
|
-
chunks = []
|
351
|
-
|
352
|
-
defines.each do |d, value|
|
353
|
-
next if value == false
|
354
|
-
|
355
|
-
chunk = "#define #{d} #{value}"
|
356
|
-
chunks << chunk
|
357
|
-
end
|
358
|
-
|
359
|
-
chunks.join("\n")
|
360
|
-
end
|
361
|
-
|
362
|
-
def cache_uniform_locations(program, identifiers)
|
363
|
-
uniforms = {}
|
364
|
-
|
365
|
-
identifiers.each do |id|
|
366
|
-
uniforms[id] = glGetUniformLocation(program, id)
|
367
|
-
end
|
368
|
-
|
369
|
-
uniforms
|
370
|
-
end
|
371
|
-
|
372
|
-
def cache_attribute_locations(program, identifiers)
|
373
|
-
attributes = {}
|
374
|
-
|
247
|
+
@attributes = {}
|
375
248
|
identifiers.each do |id|
|
376
|
-
attributes[id] = glGetAttribLocation(program, id)
|
377
|
-
end
|
378
|
-
|
379
|
-
attributes
|
380
|
-
end
|
381
|
-
|
382
|
-
def link_status
|
383
|
-
ptr = ' '*8
|
384
|
-
glGetProgramiv @program, GL_LINK_STATUS, ptr
|
385
|
-
ptr.unpack('L')[0]
|
386
|
-
end
|
387
|
-
|
388
|
-
def program_info_log
|
389
|
-
ptr = ' '*8
|
390
|
-
glGetProgramiv @program, GL_INFO_LOG_LENGTH, ptr
|
391
|
-
length = ptr.unpack('L')[0]
|
392
|
-
|
393
|
-
if length > 0
|
394
|
-
log = ' '*length
|
395
|
-
glGetProgramInfoLog @program, length, ptr, log
|
396
|
-
log.unpack("A#{length}")[0]
|
397
|
-
else
|
398
|
-
''
|
249
|
+
@attributes[id] = glGetAttribLocation(program, id)
|
399
250
|
end
|
400
251
|
end
|
401
252
|
end
|