mittsu 0.1.1 → 0.1.2

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 (92) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -1
  3. data/README.md +1 -1
  4. data/lib/mittsu/cameras/orthographic_camera.rb +13 -0
  5. data/lib/mittsu/cameras/perspective_camera.rb +11 -0
  6. data/lib/mittsu/core/geometry.rb +12 -9
  7. data/lib/mittsu/core/object_3d.rb +33 -66
  8. data/lib/mittsu/lights/ambient_light.rb +8 -0
  9. data/lib/mittsu/lights/directional_light.rb +9 -0
  10. data/lib/mittsu/lights/hemisphere_light.rb +9 -0
  11. data/lib/mittsu/lights/point_light.rb +11 -0
  12. data/lib/mittsu/lights/spot_light.rb +13 -0
  13. data/lib/mittsu/loaders.rb +1 -0
  14. data/lib/mittsu/loaders/mtl_loader.rb +5 -12
  15. data/lib/mittsu/loaders/obj_loader.rb +212 -0
  16. data/lib/mittsu/loaders/obj_mtl_loader.rb +11 -207
  17. data/lib/mittsu/materials/material.rb +5 -2
  18. data/lib/mittsu/materials/mesh_basic_material.rb +0 -9
  19. data/lib/mittsu/math/color.rb +44 -104
  20. data/lib/mittsu/math/matrix3.rb +8 -1
  21. data/lib/mittsu/math/matrix4.rb +6 -0
  22. data/lib/mittsu/math/vector.rb +251 -0
  23. data/lib/mittsu/math/vector2.rb +14 -213
  24. data/lib/mittsu/math/vector3.rb +61 -351
  25. data/lib/mittsu/math/vector4.rb +45 -295
  26. data/lib/mittsu/objects/line.rb +12 -2
  27. data/lib/mittsu/objects/mesh.rb +18 -9
  28. data/lib/mittsu/renderers/glfw_window.rb +15 -13
  29. data/lib/mittsu/renderers/opengl/core/opengl_geometry.rb +253 -0
  30. data/lib/mittsu/renderers/opengl/core/opengl_object_3d.rb +131 -0
  31. data/lib/mittsu/renderers/opengl/lights/opengl_ambient_light.rb +26 -0
  32. data/lib/mittsu/renderers/opengl/lights/opengl_directional_light.rb +35 -0
  33. data/lib/mittsu/renderers/opengl/lights/opengl_hemisphere_light.rb +42 -0
  34. data/lib/mittsu/renderers/opengl/lights/opengl_light.rb +52 -0
  35. data/lib/mittsu/renderers/opengl/lights/opengl_point_light.rb +36 -0
  36. data/lib/mittsu/renderers/opengl/lights/opengl_spot_light.rb +47 -0
  37. data/lib/mittsu/renderers/opengl/materials/opengl_line_basic_material.rb +16 -0
  38. data/lib/mittsu/renderers/opengl/materials/opengl_material.rb +275 -0
  39. data/lib/mittsu/renderers/opengl/materials/opengl_mesh_basic_material.rb +69 -0
  40. data/lib/mittsu/renderers/opengl/materials/opengl_mesh_lambert_material.rb +29 -0
  41. data/lib/mittsu/renderers/opengl/materials/opengl_mesh_phong_material.rb +40 -0
  42. data/lib/mittsu/renderers/opengl/materials/opengl_shader_material.rb +11 -0
  43. data/lib/mittsu/renderers/opengl/objects/opengl_group.rb +8 -0
  44. data/lib/mittsu/renderers/opengl/objects/opengl_line.rb +54 -0
  45. data/lib/mittsu/renderers/opengl/objects/opengl_mesh.rb +77 -0
  46. data/lib/mittsu/renderers/opengl/opengl_buffer.rb +5 -0
  47. data/lib/mittsu/renderers/opengl/opengl_debug.rb +49 -7
  48. data/lib/mittsu/renderers/opengl/opengl_default_target.rb +54 -0
  49. data/lib/mittsu/renderers/opengl/opengl_geometry_group.rb +763 -0
  50. data/lib/mittsu/renderers/opengl/opengl_geometry_like.rb +130 -0
  51. data/lib/mittsu/renderers/opengl/opengl_helper.rb +161 -0
  52. data/lib/mittsu/renderers/opengl/opengl_implementations.rb +61 -0
  53. data/lib/mittsu/renderers/opengl/opengl_light_renderer.rb +43 -0
  54. data/lib/mittsu/renderers/opengl/opengl_mittsu_params.rb +53 -0
  55. data/lib/mittsu/renderers/opengl/opengl_program.rb +147 -296
  56. data/lib/mittsu/renderers/opengl/opengl_state.rb +3 -5
  57. data/lib/mittsu/renderers/opengl/plugins/shadow_map_plugin.rb +12 -10
  58. data/lib/mittsu/renderers/opengl/scenes/opengl_scene.rb +8 -0
  59. data/lib/mittsu/renderers/opengl/textures/opengl_compressed_texture.rb +21 -0
  60. data/lib/mittsu/renderers/opengl/textures/opengl_cube_texture.rb +75 -0
  61. data/lib/mittsu/renderers/opengl/textures/opengl_data_texture.rb +23 -0
  62. data/lib/mittsu/renderers/opengl/textures/opengl_texture.rb +111 -0
  63. data/lib/mittsu/renderers/opengl_render_target.rb +117 -2
  64. data/lib/mittsu/renderers/opengl_renderer.rb +653 -2978
  65. data/lib/mittsu/renderers/shaders/rbsl_loader.rb +166 -0
  66. data/lib/mittsu/renderers/shaders/shader_chunk.rb +6 -9
  67. data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_fragment.glsl +36 -37
  68. data/lib/mittsu/renderers/shaders/shader_lib.rb +26 -403
  69. data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_fragment.rbsl +37 -0
  70. data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_uniforms.rbslu +3 -0
  71. data/lib/mittsu/renderers/shaders/shader_lib/basic/basic_vertex.rbsl +33 -0
  72. data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_fragment.rbsl +12 -0
  73. data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_uniforms.rbslu +2 -0
  74. data/lib/mittsu/renderers/shaders/shader_lib/cube/cube_vertex.rbsl +12 -0
  75. data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_fragment.rbsl +26 -0
  76. data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_uniforms.rbslu +0 -0
  77. data/lib/mittsu/renderers/shaders/shader_lib/depth_rgba/depth_rgba_vertex.rbsl +12 -0
  78. data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_fragment.rbsl +56 -0
  79. data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_uniforms.rbslu +7 -0
  80. data/lib/mittsu/renderers/shaders/shader_lib/lambert/lambert_vertex.rbsl +37 -0
  81. data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_fragment.rbsl +45 -0
  82. data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_uniforms.rbslu +11 -0
  83. data/lib/mittsu/renderers/shaders/shader_lib/phong/phong_vertex.rbsl +43 -0
  84. data/lib/mittsu/renderers/shaders/shader_templates/fragment.glsl.erb +105 -0
  85. data/lib/mittsu/renderers/shaders/shader_templates/vertex.glsl.erb +143 -0
  86. data/lib/mittsu/renderers/shaders/uniforms_lib.rb +54 -55
  87. data/lib/mittsu/textures/texture.rb +5 -2
  88. data/lib/mittsu/version.rb +1 -1
  89. data/run_all_examples.sh +7 -0
  90. metadata +77 -28
  91. data/.ruby-version +0 -1
  92. data/lib/mittsu/core/hash_object.rb +0 -19
@@ -0,0 +1,166 @@
1
+ module Mittsu
2
+ module RBSLLoader
3
+ UNIFORM_RGX = /uniform\s+(\S+)\s+(\w+)(|\s+\=\s+(.+));/
4
+ COLOR_RGX = /color\(([^\)]*)\)/
5
+
6
+ class << self
7
+ def load_shader(shader, chunks)
8
+ shader.lines.flat_map(&:chomp).map{ |line|
9
+ if line =~ /(\s*)#include\s+(\w+)/
10
+ indentation = $1
11
+ chunk_name = $2.to_sym
12
+
13
+ chunks[chunk_name].lines.map(&:chomp).map{ |l|
14
+ "#{indentation}#{l}"
15
+ }
16
+ else
17
+ line
18
+ end
19
+ }.join("\n") + "\n"
20
+ end
21
+
22
+ def extract_array_contents(str)
23
+ /\[([^\]]+)\]/.match(str)[1]
24
+ end
25
+
26
+ def parse_int(str)
27
+ str.to_i
28
+ end
29
+
30
+ (2..4).each do |n|
31
+ define_method("parse_ivec#{n}") do |str|
32
+ str =~ /ivec#{n}\(([^\)]+)\)/
33
+ $1.split(',').map(&:strip).map(&:to_i).take(n)
34
+ end
35
+ end
36
+
37
+ def parse_float(str)
38
+ str.to_f
39
+ end
40
+
41
+ def parse_single_color(values)
42
+ if values.length == 1
43
+ values = values.map(&:to_i)
44
+ else
45
+ values = values.map(&:to_f)
46
+ end
47
+ Color.new(*values)
48
+ end
49
+
50
+ def parse_color(str)
51
+ str =~ COLOR_RGX
52
+ values = $1.split(',').map(&:strip)
53
+ parse_single_color(values)
54
+ end
55
+
56
+ def parse_color_array(str)
57
+ str = extract_array_contents(str)
58
+ str.scan(COLOR_RGX).map{ |m|
59
+ values = m.first.split(',').map(&:strip)
60
+ parse_single_color(values)
61
+ }
62
+ end
63
+
64
+ def parse_int_array(str)
65
+ str = extract_array_contents(str)
66
+ str.split(',').map(&:strip).map(&:to_i)
67
+ end
68
+
69
+ def parse_float_array(str)
70
+ str = extract_array_contents(str)
71
+ str.split(',').map(&:strip).map(&:to_f)
72
+ end
73
+
74
+ [Vector2, Vector3, Vector4].each do |vectorClass|
75
+ define_method("parse_vec#{vectorClass::DIMENSIONS}") do |str|
76
+ str =~ /vec#{vectorClass::DIMENSIONS}\(([^\)]+)\)/
77
+ values = $1.split(',').map(&:strip).map(&:to_f).take(vectorClass::DIMENSIONS)
78
+ vectorClass.new(*values)
79
+ end
80
+ end
81
+
82
+ (2..4).each do |n|
83
+ define_method("parse_ivec#{n}_array") do |str|
84
+ str = extract_array_contents(str)
85
+ str.scan(/ivec#{n}\(([^\)]+)\)/).map{ |m| m.first.split(',').map(&:strip).map(&:to_i).take(n) }
86
+ end
87
+ end
88
+
89
+ [Vector2, Vector3, Vector4].each do |vectorClass|
90
+ define_method("parse_vec#{vectorClass::DIMENSIONS}_array") do |str|
91
+ str = extract_array_contents(str)
92
+ str.scan(/vec#{vectorClass::DIMENSIONS}\(([^\)]+)\)/).map{ |m|
93
+ values = m.first.split(',').map(&:strip).map(&:to_f).take(vectorClass::DIMENSIONS)
94
+ vectorClass.new(*values)
95
+ }
96
+ end
97
+ end
98
+
99
+ [Matrix3, Matrix4].each do |matrixClass|
100
+ define_method("parse_mat#{matrixClass::DIMENSIONS}") do |str|
101
+ str =~ /mat#{matrixClass::DIMENSIONS}\(([^\)]+)\)/
102
+ values = $1.split(',').map(&:strip).map(&:to_f).take(matrixClass::DIMENSIONS * matrixClass::DIMENSIONS)
103
+ matrixClass.new().tap { |mat| mat.set(*values) }
104
+ end
105
+ end
106
+
107
+ [Matrix3, Matrix4].each do |matrixClass|
108
+ define_method("parse_mat#{matrixClass::DIMENSIONS}_array") do |str|
109
+ str = extract_array_contents(str)
110
+ str.scan(/mat#{matrixClass::DIMENSIONS}\(([^\)]+)\)/).map{ |m|
111
+ values = m.first.split(',').map(&:strip).map(&:to_f).take(matrixClass::DIMENSIONS * matrixClass::DIMENSIONS)
112
+ matrixClass.new().tap { |mat| mat.set(*values) }
113
+ }
114
+ end
115
+ end
116
+
117
+ def parse_texture(_str)
118
+ nil
119
+ end
120
+
121
+ def parse_texture_array(_str)
122
+ []
123
+ end
124
+
125
+ def parse_uniform(uniform)
126
+ uniform =~ UNIFORM_RGX
127
+ type_str = $1
128
+ type = type_str.to_sym
129
+ is_array = type_str.end_with?('[]')
130
+ name = $2
131
+ value_str = $4
132
+ value = is_array ? [] : nil
133
+ if value_str && !value_str.empty?
134
+ value = send("parse_#{type.to_s.gsub(/\[\]/, '_array')}".to_s, value_str)
135
+ end
136
+ [name, Uniform.new(type, value)]
137
+ end
138
+
139
+ def load_uniforms(uniforms, uniforms_lib)
140
+ uniform_strings = nil;
141
+ in_uniform = false
142
+
143
+ uniforms.lines.map(&:strip).each_with_object({}) { |line, hash|
144
+ if in_uniform
145
+ uniform_strings << line
146
+ if line.end_with?(';')
147
+ in_uniform = false
148
+ name, value = parse_uniform(uniform_strings.join(' '))
149
+ hash[name] = value
150
+ end
151
+ elsif line =~ /#include\s+(\w+)/
152
+ uniforms_lib[$1.to_sym].map { |(k, v)| hash[k] = v.clone }
153
+ elsif line.start_with?('uniform')
154
+ if line.end_with?(';')
155
+ name, value = parse_uniform(line)
156
+ hash[name] = value
157
+ else
158
+ in_uniform = true
159
+ uniform_strings = [line]
160
+ end
161
+ end
162
+ }
163
+ end
164
+ end
165
+ end
166
+ end
@@ -1,12 +1,9 @@
1
1
  module Mittsu
2
- ShaderChunk = {}.tap do |chunks|
3
- Dir.new(File.join(__dir__, 'shader_chunk')).each do |file_name|
4
- next unless file_name.end_with? '.glsl'
5
- file_path = File.join(__dir__, 'shader_chunk', file_name)
6
- chunk_name = File.basename(file_name, '.glsl')
7
- chunk = File.read(file_path)
8
- # chunk = "// #{chunk_name}\n#{chunk}"
9
- chunks[chunk_name.to_sym] = chunk
10
- end
2
+ ShaderChunk = Hash.new do |chunks, key|
3
+ file_name = "#{key.to_s}.glsl"
4
+ file_path = File.join(__dir__, 'shader_chunk', file_name)
5
+ chunk = File.read(file_path)
6
+ # chunk = "// #{chunk_name}\n#{chunk}"
7
+ chunks[key] = chunk
11
8
  end
12
9
  end
@@ -18,9 +18,8 @@
18
18
  float fDepth;
19
19
  vec3 shadowColor = vec3( 1.0 );
20
20
 
21
- for( int i = 0; i < MAX_SHADOWS; i ++ ) {
22
-
23
- vec3 shadowCoord = vShadowCoord[ i ].xyz / vShadowCoord[ i ].w;
21
+ <% parameters[:max_shadows].times do |i| %>
22
+ vec3 shadowCoord = vShadowCoord[ <%= i %> ].xyz / vShadowCoord[ <%= i %> ].w;
24
23
 
25
24
  // if ( something && something ) breaks ATI OpenGL shader compiler
26
25
  // if ( all( something, something ) ) using this instead
@@ -47,7 +46,7 @@
47
46
 
48
47
  if ( frustumTest ) {
49
48
 
50
- shadowCoord.z += shadowBias[ i ];
49
+ shadowCoord.z += shadowBias[ <%= i %> ];
51
50
 
52
51
  #if defined( SHADOWMAP_TYPE_PCF )
53
52
 
@@ -64,10 +63,10 @@
64
63
  for ( float y = -1.25; y <= 1.25; y += 1.25 )
65
64
  for ( float x = -1.25; x <= 1.25; x += 1.25 ) {
66
65
 
67
- vec4 rgbaDepth = texture( shadowMap[ i ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );
66
+ vec4 rgbaDepth = texture( shadowMap[ <%= i %> ], vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy );
68
67
 
69
68
  // doesn't seem to produce any noticeable visual difference compared to simple texture lookup
70
- //vec4 rgbaDepth = textureProj( shadowMap[ i ], vec4( vShadowCoord[ i ].w * ( vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy ), 0.05, vShadowCoord[ i ].w ) );
69
+ //vec4 rgbaDepth = textureProj( shadowMap[ <%= i %> ], vec4( vShadowCoord[ <%= i %> ].w * ( vec2( x * xPixelOffset, y * yPixelOffset ) + shadowCoord.xy ), 0.05, vShadowCoord[ <%= i %> ].w ) );
71
70
 
72
71
  float fDepth = unpackDepth( rgbaDepth );
73
72
 
@@ -82,42 +81,42 @@
82
81
 
83
82
  const float shadowDelta = 1.0 / 9.0;
84
83
 
85
- float xPixelOffset = 1.0 / shadowMapSize[ i ].x;
86
- float yPixelOffset = 1.0 / shadowMapSize[ i ].y;
84
+ float xPixelOffset = 1.0 / shadowMapSize[ <%= i %> ].x;
85
+ float yPixelOffset = 1.0 / shadowMapSize[ <%= i %> ].y;
87
86
 
88
87
  float dx0 = -1.25 * xPixelOffset;
89
88
  float dy0 = -1.25 * yPixelOffset;
90
89
  float dx1 = 1.25 * xPixelOffset;
91
90
  float dy1 = 1.25 * yPixelOffset;
92
91
 
93
- fDepth = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );
92
+ fDepth = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( dx0, dy0 ) ) );
94
93
  if ( fDepth < shadowCoord.z ) shadow += shadowDelta;
95
94
 
96
- fDepth = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );
95
+ fDepth = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );
97
96
  if ( fDepth < shadowCoord.z ) shadow += shadowDelta;
98
97
 
99
- fDepth = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );
98
+ fDepth = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( dx1, dy0 ) ) );
100
99
  if ( fDepth < shadowCoord.z ) shadow += shadowDelta;
101
100
 
102
- fDepth = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );
101
+ fDepth = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );
103
102
  if ( fDepth < shadowCoord.z ) shadow += shadowDelta;
104
103
 
105
- fDepth = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy ) );
104
+ fDepth = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy ) );
106
105
  if ( fDepth < shadowCoord.z ) shadow += shadowDelta;
107
106
 
108
- fDepth = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );
107
+ fDepth = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );
109
108
  if ( fDepth < shadowCoord.z ) shadow += shadowDelta;
110
109
 
111
- fDepth = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );
110
+ fDepth = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( dx0, dy1 ) ) );
112
111
  if ( fDepth < shadowCoord.z ) shadow += shadowDelta;
113
112
 
114
- fDepth = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );
113
+ fDepth = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );
115
114
  if ( fDepth < shadowCoord.z ) shadow += shadowDelta;
116
115
 
117
- fDepth = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );
116
+ fDepth = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( dx1, dy1 ) ) );
118
117
  if ( fDepth < shadowCoord.z ) shadow += shadowDelta;
119
118
 
120
- shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );
119
+ shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ <%= i %> ] * shadow ) );
121
120
 
122
121
  #elif defined( SHADOWMAP_TYPE_PCF_SOFT )
123
122
 
@@ -127,8 +126,8 @@
127
126
 
128
127
  float shadow = 0.0;
129
128
 
130
- float xPixelOffset = 1.0 / shadowMapSize[ i ].x;
131
- float yPixelOffset = 1.0 / shadowMapSize[ i ].y;
129
+ float xPixelOffset = 1.0 / shadowMapSize[ <%= i %> ].x;
130
+ float yPixelOffset = 1.0 / shadowMapSize[ <%= i %> ].y;
132
131
 
133
132
  float dx0 = -1.0 * xPixelOffset;
134
133
  float dy0 = -1.0 * yPixelOffset;
@@ -138,15 +137,15 @@
138
137
  mat3 shadowKernel;
139
138
  mat3 depthKernel;
140
139
 
141
- depthKernel[0][0] = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy0 ) ) );
142
- depthKernel[0][1] = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );
143
- depthKernel[0][2] = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( dx0, dy1 ) ) );
144
- depthKernel[1][0] = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );
145
- depthKernel[1][1] = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy ) );
146
- depthKernel[1][2] = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );
147
- depthKernel[2][0] = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy0 ) ) );
148
- depthKernel[2][1] = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );
149
- depthKernel[2][2] = unpackDepth( texture( shadowMap[ i ], shadowCoord.xy + vec2( dx1, dy1 ) ) );
140
+ depthKernel[0][0] = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( dx0, dy0 ) ) );
141
+ depthKernel[0][1] = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( dx0, 0.0 ) ) );
142
+ depthKernel[0][2] = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( dx0, dy1 ) ) );
143
+ depthKernel[1][0] = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( 0.0, dy0 ) ) );
144
+ depthKernel[1][1] = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy ) );
145
+ depthKernel[1][2] = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( 0.0, dy1 ) ) );
146
+ depthKernel[2][0] = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( dx1, dy0 ) ) );
147
+ depthKernel[2][1] = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( dx1, 0.0 ) ) );
148
+ depthKernel[2][2] = unpackDepth( texture( shadowMap[ <%= i %> ], shadowCoord.xy + vec2( dx1, dy1 ) ) );
150
149
 
151
150
  vec3 shadowZ = vec3( shadowCoord.z );
152
151
  shadowKernel[0] = vec3(lessThan(depthKernel[0], shadowZ ));
@@ -158,7 +157,7 @@
158
157
  shadowKernel[2] = vec3(lessThan(depthKernel[2], shadowZ ));
159
158
  shadowKernel[2] *= vec3(0.25);
160
159
 
161
- vec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[i].xy );
160
+ vec2 fractionalCoord = 1.0 - fract( shadowCoord.xy * shadowMapSize[<%= i %>].xy );
162
161
 
163
162
  shadowKernel[0] = mix( shadowKernel[1], shadowKernel[0], fractionalCoord.x );
164
163
  shadowKernel[1] = mix( shadowKernel[2], shadowKernel[1], fractionalCoord.x );
@@ -171,22 +170,22 @@
171
170
 
172
171
  shadow = dot( shadowValues, vec4( 1.0 ) );
173
172
 
174
- shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ i ] * shadow ) );
173
+ shadowColor = shadowColor * vec3( ( 1.0 - shadowDarkness[ <%= i %> ] * shadow ) );
175
174
 
176
175
  #else
177
176
 
178
- vec4 rgbaDepth = texture( shadowMap[ i ], shadowCoord.xy );
177
+ vec4 rgbaDepth = texture( shadowMap[ <%= i %> ], shadowCoord.xy );
179
178
  float fDepth = unpackDepth( rgbaDepth );
180
179
 
181
180
  if ( fDepth < shadowCoord.z )
182
181
 
183
182
  // spot with multiple shadows is darker
184
183
 
185
- shadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ i ] );
184
+ shadowColor = shadowColor * vec3( 1.0 - shadowDarkness[ <%= i %> ] );
186
185
 
187
186
  // spot with multiple shadows has the same color as single shadow spot
188
187
 
189
- // shadowColor = min( shadowColor, vec3( shadowDarkness[ i ] ) );
188
+ // shadowColor = min( shadowColor, vec3( shadowDarkness[ <%= i %> ] ) );
190
189
 
191
190
  #endif
192
191
 
@@ -197,17 +196,17 @@
197
196
 
198
197
  #ifdef SHADOWMAP_CASCADE
199
198
 
200
- if ( inFrustum && inFrustumCount == 1 ) outgoingLight *= frustumColors[ i ];
199
+ if ( inFrustum && inFrustumCount == 1 ) outgoingLight *= frustumColors[ <%= i %> ];
201
200
 
202
201
  #else
203
202
 
204
- if ( inFrustum ) outgoingLight *= frustumColors[ i ];
203
+ if ( inFrustum ) outgoingLight *= frustumColors[ <%= i %> ];
205
204
 
206
205
  #endif
207
206
 
208
207
  #endif
209
208
 
210
- }
209
+ <% end %>
211
210
 
212
211
  // NOTE: I am unsure if this is correct in linear space. -bhouston, Dec 29, 2014
213
212
  shadowColor = inputToLinear( shadowColor );
@@ -1,6 +1,7 @@
1
1
  require 'mittsu/renderers/shaders/uniforms_utils'
2
2
  require 'mittsu/renderers/shaders/uniforms_lib'
3
3
  require 'mittsu/renderers/shaders/shader_chunk'
4
+ require 'mittsu/renderers/shaders/rbsl_loader'
4
5
 
5
6
  module Mittsu
6
7
  class ShaderLib_Instance
@@ -10,411 +11,33 @@ module Mittsu
10
11
  @vertex_shader = options.fetch(:vertex_shader)
11
12
  @fragment_shader = options.fetch(:fragment_shader)
12
13
  end
13
- end
14
-
15
- ShaderLib = {
16
- basic: ShaderLib_Instance.new(
17
- uniforms: UniformsUtils.merge([
18
- UniformsLib[:common],
19
- UniformsLib[:fog],
20
- UniformsLib[:shadowmap]
21
- ]),
22
-
23
- vertex_shader: [
24
- ShaderChunk[:common],
25
- ShaderChunk[:map_pars_vertex],
26
- ShaderChunk[:lightmap_pars_vertex],
27
- ShaderChunk[:envmap_pars_vertex],
28
- ShaderChunk[:color_pars_vertex],
29
- ShaderChunk[:morphtarget_pars_vertex],
30
- ShaderChunk[:skinning_pars_vertex],
31
- ShaderChunk[:shadowmap_pars_vertex],
32
- ShaderChunk[:logdepthbuf_pars_vertex],
33
-
34
- "void main() {",
35
-
36
- ShaderChunk[:map_vertex],
37
- ShaderChunk[:lightmap_vertex],
38
- ShaderChunk[:color_vertex],
39
- ShaderChunk[:skinbase_vertex],
40
-
41
- " #ifdef USE_ENVMAP",
42
-
43
- ShaderChunk[:morphnormal_vertex],
44
- ShaderChunk[:skinnormal_vertex],
45
- ShaderChunk[:defaultnormal_vertex],
46
-
47
- " #endif",
48
-
49
- ShaderChunk[:morphtarget_vertex],
50
- ShaderChunk[:skin_vertex],
51
- ShaderChunk[:default_vertex],
52
- ShaderChunk[:logdepthbuf_vertex],
53
-
54
- ShaderChunk[:worldpos_vertex],
55
- ShaderChunk[:envmap_vertex],
56
- ShaderChunk[:shadowmap_vertex],
57
-
58
- "}"
59
-
60
- ].join("\n"),
61
-
62
- fragment_shader: [
63
-
64
- "uniform vec3 diffuse;",
65
- "uniform float opacity;",
66
-
67
- ShaderChunk[:common],
68
- ShaderChunk[:color_pars_fragment],
69
- ShaderChunk[:map_pars_fragment],
70
- ShaderChunk[:alphamap_pars_fragment],
71
- ShaderChunk[:lightmap_pars_fragment],
72
- ShaderChunk[:envmap_pars_fragment],
73
- ShaderChunk[:fog_pars_fragment],
74
- ShaderChunk[:shadowmap_pars_fragment],
75
- ShaderChunk[:specularmap_pars_fragment],
76
- ShaderChunk[:logdepthbuf_pars_fragment],
77
-
78
- "void main() {",
79
-
80
- " vec3 outgoingLight = vec3( 0.0 );", # outgoing light does not have an alpha, the surface does
81
- " vec4 diffuseColor = vec4( diffuse, opacity );",
82
-
83
- ShaderChunk[:logdepthbuf_fragment],
84
- ShaderChunk[:map_fragment],
85
- ShaderChunk[:color_fragment],
86
- ShaderChunk[:alphamap_fragment],
87
- ShaderChunk[:alphatest_fragment],
88
- ShaderChunk[:specularmap_fragment],
89
-
90
- " outgoingLight = diffuseColor.rgb;", # simple shader
91
-
92
- ShaderChunk[:lightmap_fragment], # TODO: Light map on an otherwise unlit surface doesn't make sense.
93
- ShaderChunk[:envmap_fragment],
94
- ShaderChunk[:shadowmap_fragment], # TODO: Shadows on an otherwise unlit surface doesn't make sense.
95
-
96
- ShaderChunk[:linear_to_gamma_fragment],
97
-
98
- ShaderChunk[:fog_fragment],
99
-
100
- " fragColor = vec4( outgoingLight, diffuseColor.a );", # TODO, this should be pre-multiplied to allow for bright highlights on very transparent objects
101
-
102
- "}"
103
-
104
- ].join("\n")
105
- ),
106
- lambert: ShaderLib_Instance.new(
107
- uniforms: UniformsUtils.merge([
108
- UniformsLib[:common],
109
- UniformsLib[:fog],
110
- UniformsLib[:lights],
111
- UniformsLib[:shadow_map],
112
- {
113
- 'emissive' => Uniform.new(:c, Color.new(0x000000)),
114
- 'wrapRGB' => Uniform.new(:v3, Vector3.new(1.0, 1.0, 1.0))
115
- }
116
- ]),
117
- vertex_shader: [
118
- '#define LAMBERT',
119
- 'out vec3 vLightFront;',
120
- '#ifdef DOUBLE_SIDED',
121
- ' out vec3 vLightBack;',
122
- '#endif',
123
- ShaderChunk[:common],
124
- ShaderChunk[:map_pars_vertex],
125
- ShaderChunk[:lightmap_pars_vertex],
126
- ShaderChunk[:envmap_pars_vertex],
127
- ShaderChunk[:lights_lambert_pars_vertex],
128
- ShaderChunk[:color_pars_vertex],
129
- ShaderChunk[:morphtarget_pars_vertex],
130
- ShaderChunk[:skinning_pars_vertex],
131
- ShaderChunk[:shadowmap_pars_vertex],
132
- ShaderChunk[:logdepthbuf_pars_vertex],
133
- 'void main() {',
134
-
135
- ShaderChunk[:map_vertex],
136
- ShaderChunk[:lightmap_vertex],
137
- ShaderChunk[:color_vertex],
138
-
139
- ShaderChunk[:morphnormal_vertex],
140
- ShaderChunk[:skinbase_vertex],
141
- ShaderChunk[:skinnormal_vertex],
142
- ShaderChunk[:defaultnormal_vertex],
143
-
144
- ShaderChunk[:morphtarget_vertex],
145
- ShaderChunk[:skinning_vertex],
146
- ShaderChunk[:default_vertex],
147
- ShaderChunk[:logdepthbuf_vertex],
148
-
149
- ShaderChunk[:worldpos_vertex],
150
- ShaderChunk[:envmap_vertex],
151
- ShaderChunk[:lights_lambert_vertex],
152
- ShaderChunk[:shadowmap_vertex],
153
-
154
- '}',
155
- ].join("\n"),
156
- fragment_shader: [
157
- 'uniform vec3 diffuse;',
158
- 'uniform vec3 emissive;',
159
- 'uniform float opacity;',
160
-
161
- 'in vec3 vLightFront;',
162
-
163
- '#ifdef DOUBLE_SIDED',
164
- ' in vec3 vLightBack;',
165
- '#endif',
166
-
167
- ShaderChunk[:common],
168
- ShaderChunk[:color_pars_fragment],
169
- ShaderChunk[:map_pars_fragment],
170
- ShaderChunk[:alphamap_pars_fragment],
171
- ShaderChunk[:lightmap_pars_fragment],
172
- ShaderChunk[:envmap_pars_fragment],
173
- ShaderChunk[:fog_pars_fragment],
174
- ShaderChunk[:shadowmap_pars_fragment],
175
- ShaderChunk[:specularmap_pars_fragment],
176
- ShaderChunk[:logdepthbuf_pars_fragment],
177
-
178
- 'void main() {',
179
-
180
- ' vec3 outgoingLight = vec3( 0.0 );', # outgoing light does not have an alpha, the surface does
181
- ' vec4 diffuseColor = vec4( diffuse, opacity );',
182
-
183
- ShaderChunk[:logdepthbuf_fragment],
184
- ShaderChunk[:map_fragment],
185
- ShaderChunk[:color_fragment],
186
- ShaderChunk[:alphamap_fragment],
187
- ShaderChunk[:alphatest_fragment],
188
- ShaderChunk[:specularmap_fragment],
189
-
190
- ' #ifdef DOUBLE_SIDED',
191
-
192
- #'float isFront = float( gl_FrontFacing );',
193
- #'fragColor.xyz *= isFront * vLightFront + ( 1.0 - isFront ) * vLightBack;',
194
-
195
- ' if ( gl_FrontFacing )',
196
- ' outgoingLight += diffuseColor.rgb * vLightFront + emissive;',
197
- ' else',
198
- ' outgoingLight += diffuseColor.rgb * vLightBack + emissive;',
199
-
200
- ' #else',
201
-
202
- ' outgoingLight += diffuseColor.rgb * vLightFront + emissive;',
203
-
204
- ' #endif',
205
-
206
- ShaderChunk[:lightmap_fragment],
207
- ShaderChunk[:envmap_fragment],
208
- ShaderChunk[:shadowmap_fragment],
209
14
 
210
- ShaderChunk[:linear_to_gamma_fragment],
211
-
212
- ShaderChunk[:fog_fragment],
213
-
214
- # ' fragColor = vec4( outgoingLight, diffuseColor.a );', # TODO, this should be pre-multiplied to allow for bright highlights on very transparent objects
215
-
216
- ' fragColor = vec4(outgoingLight, diffuseColor.a);',
217
- '}'
218
- ].join("\n")
219
- ),
220
- phong: ShaderLib_Instance.new(
221
- uniforms: UniformsUtils.merge([
222
- UniformsLib[:common],
223
- UniformsLib[:bump],
224
- UniformsLib[:normal_map],
225
- UniformsLib[:fog],
226
- UniformsLib[:lights],
227
- UniformsLib[:shadow_map],
228
- {
229
- 'emissive' => Uniform.new(:c, Color.new(0x000000)),
230
- 'specular' => Uniform.new(:c, Color.new(0x111111)),
231
- 'shininess' => Uniform.new(:f, 30.0),
232
- 'wrapRGB' => Uniform.new(:v3, Vector3.new(1.0, 1.0, 1.0))
233
- }
234
- ]),
235
- vertex_shader: [
236
- '#define PHONG',
237
- 'out vec3 vViewPosition;',
238
- '#ifndef FLAT_SHADED',
239
- ' out vec3 vNormal;',
240
- '#endif',
241
-
242
- ShaderChunk[:common],
243
- ShaderChunk[:map_pars_vertex],
244
- ShaderChunk[:lightmap_pars_vertex],
245
- ShaderChunk[:envmap_pars_vertex],
246
- ShaderChunk[:lights_phong_pars_vertex],
247
- ShaderChunk[:color_pars_vertex],
248
- ShaderChunk[:morphtarget_pars_vertex],
249
- ShaderChunk[:skinning_pars_vertex],
250
- ShaderChunk[:shadowmap_pars_vertex],
251
- ShaderChunk[:logdepthbuf_pars_vertex],
252
-
253
- 'void main() {',
254
-
255
- ShaderChunk[:map_vertex],
256
- ShaderChunk[:lightmap_vertex],
257
- ShaderChunk[:color_vertex],
258
-
259
- ShaderChunk[:morphnormal_vertex],
260
- ShaderChunk[:skinbase_vertex],
261
- ShaderChunk[:skinnormal_vertex],
262
- ShaderChunk[:defaultnormal_vertex],
263
-
264
- '#ifndef FLAT_SHADED', # Normal computed with derivatives when FLAT_SHADED
265
- ' vNormal = normalize( transformedNormal );',
266
- '#endif',
267
-
268
- ShaderChunk[:morphtarget_vertex],
269
- ShaderChunk[:skinning_vertex],
270
- ShaderChunk[:default_vertex],
271
- ShaderChunk[:logdepthbuf_vertex],
272
-
273
- ' vViewPosition = -mvPosition.xyz;',
274
-
275
- ShaderChunk[:worldpos_vertex],
276
- ShaderChunk[:envmap_vertex],
277
- ShaderChunk[:lights_phong_vertex],
278
- ShaderChunk[:shadowmap_vertex],
279
- '}'
280
- ].join("\n"),
281
- fragment_shader: [
282
- '#define PHONG',
283
-
284
- 'uniform vec3 diffuse;',
285
- 'uniform vec3 emissive;',
286
- 'uniform vec3 specular;',
287
- 'uniform float shininess;',
288
- 'uniform float opacity;',
289
-
290
- ShaderChunk[:common],
291
- ShaderChunk[:color_pars_fragment],
292
- ShaderChunk[:map_pars_fragment],
293
- ShaderChunk[:alphamap_pars_fragment],
294
- ShaderChunk[:lightmap_pars_fragment],
295
- ShaderChunk[:envmap_pars_fragment],
296
- ShaderChunk[:fog_pars_fragment],
297
- ShaderChunk[:lights_phong_pars_fragment],
298
- ShaderChunk[:shadowmap_pars_fragment],
299
- ShaderChunk[:bumpmap_pars_fragment],
300
- ShaderChunk[:normalmap_pars_fragment],
301
- ShaderChunk[:specularmap_pars_fragment],
302
- ShaderChunk[:logdepthbuf_pars_fragment],
303
-
304
- 'void main() {',
305
-
306
- ' vec3 outgoingLight = vec3( 0.0 );', # outgoing light does not have an alpha, the surface does
307
- ' vec4 diffuseColor = vec4( diffuse, opacity );',
308
-
309
- ShaderChunk[:logdepthbuf_fragment],
310
- ShaderChunk[:map_fragment],
311
- ShaderChunk[:color_fragment],
312
- ShaderChunk[:alphamap_fragment],
313
- ShaderChunk[:alphatest_fragment],
314
- ShaderChunk[:specularmap_fragment],
315
-
316
- ShaderChunk[:lights_phong_fragment],
317
-
318
- ShaderChunk[:lightmap_fragment],
319
- ShaderChunk[:envmap_fragment],
320
- ShaderChunk[:shadowmap_fragment],
321
-
322
- ShaderChunk[:linear_to_gamma_fragment],
323
-
324
- ShaderChunk[:fog_fragment],
325
-
326
- ' fragColor = vec4( outgoingLight, diffuseColor.a );', # TODO, this should be pre-multiplied to allow for bright highlights on very transparent objects
327
-
328
- '}'
329
- ].join("\n")
330
- ),
331
- # TODO:
332
- # particle_basic
333
- # dashed
334
- # depth
335
- # normal
336
- cube: ShaderLib_Instance.new(
337
- uniforms: {
338
- 'tCube' => Uniform.new(:t, nil),
339
- 'tFlip' => Uniform.new(:f, -1.0)
340
- },
341
- vertex_shader: [
342
- 'out vec3 vWorldPosition;',
343
-
344
- ShaderChunk[:common],
345
- ShaderChunk[:logdepthbuf_pars_vertex],
346
-
347
- 'void main() {',
348
- ' vWorldPosition = transformDirection( position, modelMatrix );',
349
- ' gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );',
350
- ShaderChunk[:logdepthbuf_vertex],
351
- '}'
352
- ].join("\n"),
353
- fragment_shader: [
354
- 'uniform samplerCube tCube;',
355
- 'uniform float tFlip;',
356
-
357
- 'in vec3 vWorldPosition;',
358
-
359
- ShaderChunk[:common],
360
- ShaderChunk[:logdepthbuf_pars_fragment],
361
-
362
- 'void main() {',
363
- ' fragColor = texture( tCube, vec3( tFlip * vWorldPosition.x, vWorldPosition.yz ) );',
364
- ShaderChunk[:logdepthbuf_fragment],
365
- '}'
366
- ].join("\n")
367
- ),
368
- # equirect
369
- depth_rgba: ShaderLib_Instance.new(
370
- uniforms: {},
371
- vertex_shader: [
372
- ShaderChunk[:common],
373
- ShaderChunk[:morphtarget_pars_vertex],
374
- ShaderChunk[:skinning_pars_vertex],
375
- ShaderChunk[:logdepthbuf_pars_vertex],
376
-
377
- 'void main() {',
378
- ShaderChunk[:skinbase_vertex],
379
- ShaderChunk[:morphtarget_vertex],
380
- ShaderChunk[:skinning_vertex],
381
- ShaderChunk[:default_vertex],
382
- ShaderChunk[:logdepthbuf_vertex],
383
- '}'
384
- ].join("\n"),
385
- fragment_shader: [
386
- ShaderChunk[:common],
387
- ShaderChunk[:logdepthbuf_pars_fragment],
388
-
389
- 'vec4 pack_depth( const in float depth ) {',
390
-
391
- ' const vec4 bit_shift = vec4( 256.0 * 256.0 * 256.0, 256.0 * 256.0, 256.0, 1.0 );',
392
- ' const vec4 bit_mask = vec4( 0.0, 1.0 / 256.0, 1.0 / 256.0, 1.0 / 256.0 );',
393
- ' vec4 res = mod( depth * bit_shift * vec4( 255 ), vec4( 256 ) ) / vec4( 255 );', # ' vec4 res = fract( depth * bit_shift );',
394
- ' res -= res.xxyz * bit_mask;',
395
- ' return res;',
396
-
397
- '}',
398
-
399
- 'void main() {',
400
- ShaderChunk[:logdepthbuf_fragment],
401
-
402
- ' #ifdef USE_LOGDEPTHBUF_EXT',
403
-
404
- ' fragColor = pack_depth( gl_FragDepthEXT );',
405
-
406
- ' #else',
15
+ def self.load_from_file(name)
16
+ ShaderLib_Instance.new(
17
+ uniforms: RBSLLoader.load_uniforms(File.read(File.join(__dir__, 'shader_lib', name, "#{name}_uniforms.rbslu")), UniformsLib),
18
+ vertex_shader: RBSLLoader.load_shader(File.read(File.join(__dir__, 'shader_lib', name, "#{name}_vertex.rbsl")), ShaderChunk),
19
+ fragment_shader: RBSLLoader.load_shader(File.read(File.join(__dir__, 'shader_lib', name, "#{name}_fragment.rbsl")), ShaderChunk)
20
+ )
21
+ end
22
+ end
23
+ private_constant :ShaderLib_Instance
407
24
 
408
- ' fragColor = pack_depth( gl_FragCoord.z );',
25
+ SHADER_LIB_HASH = Hash.new { |h, k|
26
+ h[k] = ShaderLib_Instance.load_from_file(k.to_s)
27
+ }
409
28
 
410
- ' #endif',
29
+ class ShaderLib
30
+ def self.create_shader(id, options={})
31
+ shader = self[id]
32
+ {
33
+ uniforms: UniformsUtils.clone(shader.uniforms),
34
+ vertex_shader: shader.vertex_shader,
35
+ fragment_shader: shader.fragment_shader
36
+ }.merge(options)
37
+ end
411
38
 
412
- #'fragColor = pack_depth( gl_FragCoord.z / gl_FragCoord.w );',
413
- #'float z = ( ( gl_FragCoord.z / gl_FragCoord.w ) - 3.0 ) / ( 4000.0 - 3.0 );',
414
- #'fragColor = pack_depth( z );',
415
- #'fragColor = vec4( z, z, z, 1.0 );',
416
- '}'
417
- ].join("\n")
418
- )
419
- }
39
+ def self.[](id)
40
+ SHADER_LIB_HASH[id]
41
+ end
42
+ end
420
43
  end