mittsu 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (203) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +10 -0
  3. data/.travis.yml +3 -0
  4. data/CODE_OF_CONDUCT.md +13 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +21 -0
  7. data/README.md +39 -0
  8. data/Rakefile +7 -0
  9. data/bin/console +14 -0
  10. data/bin/setup +7 -0
  11. data/examples/01_-_Default1noCulling.png +0 -0
  12. data/examples/01_scene_example.rb +14 -0
  13. data/examples/02_box_mesh_example.rb +30 -0
  14. data/examples/02_sphere_mesh_example.rb +30 -0
  15. data/examples/03_complex_object_example.rb +52 -0
  16. data/examples/04_ambient_light_example.rb +33 -0
  17. data/examples/04_dir_light_example.rb +36 -0
  18. data/examples/04_hemi_light_example.rb +30 -0
  19. data/examples/04_point_light_example.rb +50 -0
  20. data/examples/04_spot_light_example.rb +44 -0
  21. data/examples/05_earth_example.rb +42 -0
  22. data/examples/05_earth_moon_example.rb +46 -0
  23. data/examples/05_texture_example.rb +32 -0
  24. data/examples/06_cube_texture_example.rb +36 -0
  25. data/examples/06_skybox_example.rb +60 -0
  26. data/examples/07_earth_normal_example.rb +36 -0
  27. data/examples/08_shadow_example.rb +87 -0
  28. data/examples/09_line_example.rb +52 -0
  29. data/examples/10_obj_loader_example.rb +68 -0
  30. data/examples/11_character_input_example.rb +18 -0
  31. data/examples/11_continuous_keyboard_input_example.rb +35 -0
  32. data/examples/11_keyboard_input_example.rb +43 -0
  33. data/examples/12_mouse_click_example.rb +38 -0
  34. data/examples/12_mouse_motion_example.rb +35 -0
  35. data/examples/12_mouse_scroll_example.rb +36 -0
  36. data/examples/12_orbit_zoom_example.rb +68 -0
  37. data/examples/13_joystick_example.rb +80 -0
  38. data/examples/cubemap/tron_bk.png +0 -0
  39. data/examples/cubemap/tron_dn.png +0 -0
  40. data/examples/cubemap/tron_ft.png +0 -0
  41. data/examples/cubemap/tron_lf.png +0 -0
  42. data/examples/cubemap/tron_rt.png +0 -0
  43. data/examples/cubemap/tron_up.png +0 -0
  44. data/examples/earth.png +0 -0
  45. data/examples/earth_normal.png +0 -0
  46. data/examples/example_helper.rb +2 -0
  47. data/examples/male-02-1noCulling.png +0 -0
  48. data/examples/male02.mtl +54 -0
  49. data/examples/male02.obj +13888 -0
  50. data/examples/moon.png +0 -0
  51. data/examples/orig_02_-_Defaul1noCulling.png +0 -0
  52. data/examples/texture.png +0 -0
  53. data/lib/mittsu.rb +15 -0
  54. data/lib/mittsu/cameras.rb +4 -0
  55. data/lib/mittsu/cameras/camera.rb +34 -0
  56. data/lib/mittsu/cameras/cube_camera.rb +74 -0
  57. data/lib/mittsu/cameras/orthographic_camera.rb +53 -0
  58. data/lib/mittsu/cameras/perspective_camera.rb +115 -0
  59. data/lib/mittsu/constants.rb +160 -0
  60. data/lib/mittsu/core.rb +10 -0
  61. data/lib/mittsu/core/buffer_attribute.rb +87 -0
  62. data/lib/mittsu/core/buffer_geometry.rb +694 -0
  63. data/lib/mittsu/core/clock.rb +44 -0
  64. data/lib/mittsu/core/dynamic_buffer_attribute.rb +16 -0
  65. data/lib/mittsu/core/event_dispatcher.rb +39 -0
  66. data/lib/mittsu/core/face3.rb +30 -0
  67. data/lib/mittsu/core/geometry.rb +596 -0
  68. data/lib/mittsu/core/hash_array.rb +36 -0
  69. data/lib/mittsu/core/hash_object.rb +19 -0
  70. data/lib/mittsu/core/object_3d.rb +421 -0
  71. data/lib/mittsu/core/raycaster.rb +78 -0
  72. data/lib/mittsu/extras.rb +3 -0
  73. data/lib/mittsu/extras/geometries.rb +2 -0
  74. data/lib/mittsu/extras/geometries/box_geometry.rb +108 -0
  75. data/lib/mittsu/extras/geometries/sphere_geometry.rb +88 -0
  76. data/lib/mittsu/extras/helpers.rb +1 -0
  77. data/lib/mittsu/extras/helpers/camera_helper.rb +155 -0
  78. data/lib/mittsu/extras/image.rb +3 -0
  79. data/lib/mittsu/extras/image_utils.rb +80 -0
  80. data/lib/mittsu/lights.rb +7 -0
  81. data/lib/mittsu/lights/ambient_light.rb +16 -0
  82. data/lib/mittsu/lights/area_light.rb +24 -0
  83. data/lib/mittsu/lights/directional_light.rb +131 -0
  84. data/lib/mittsu/lights/hemisphere_light.rb +29 -0
  85. data/lib/mittsu/lights/light.rb +21 -0
  86. data/lib/mittsu/lights/point_light.rb +27 -0
  87. data/lib/mittsu/lights/spot_light.rb +104 -0
  88. data/lib/mittsu/loaders.rb +7 -0
  89. data/lib/mittsu/loaders/cache.rb +53 -0
  90. data/lib/mittsu/loaders/file_loader.rb +22 -0
  91. data/lib/mittsu/loaders/image_loader.rb +32 -0
  92. data/lib/mittsu/loaders/loader.rb +212 -0
  93. data/lib/mittsu/loaders/loading_manager.rb +17 -0
  94. data/lib/mittsu/loaders/mtl_loader.rb +242 -0
  95. data/lib/mittsu/loaders/obj_mtl_loader.rb +225 -0
  96. data/lib/mittsu/materials.rb +7 -0
  97. data/lib/mittsu/materials/line_basic_material.rb +39 -0
  98. data/lib/mittsu/materials/material.rb +156 -0
  99. data/lib/mittsu/materials/mesh_basic_material.rb +122 -0
  100. data/lib/mittsu/materials/mesh_face_material.rb +30 -0
  101. data/lib/mittsu/materials/mesh_lambert_material.rb +126 -0
  102. data/lib/mittsu/materials/mesh_phong_material.rb +152 -0
  103. data/lib/mittsu/materials/shader_material.rb +108 -0
  104. data/lib/mittsu/math.rb +105 -0
  105. data/lib/mittsu/math/box2.rb +135 -0
  106. data/lib/mittsu/math/box3.rb +194 -0
  107. data/lib/mittsu/math/color.rb +252 -0
  108. data/lib/mittsu/math/color_keywords.rb +151 -0
  109. data/lib/mittsu/math/euler.rb +182 -0
  110. data/lib/mittsu/math/frustum.rb +106 -0
  111. data/lib/mittsu/math/line3.rb +76 -0
  112. data/lib/mittsu/math/matrix3.rb +163 -0
  113. data/lib/mittsu/math/matrix4.rb +581 -0
  114. data/lib/mittsu/math/plane.rb +128 -0
  115. data/lib/mittsu/math/quaternion.rb +309 -0
  116. data/lib/mittsu/math/ray.rb +292 -0
  117. data/lib/mittsu/math/sphere.rb +91 -0
  118. data/lib/mittsu/math/spline.rb +128 -0
  119. data/lib/mittsu/math/triangle.rb +121 -0
  120. data/lib/mittsu/math/vector2.rb +238 -0
  121. data/lib/mittsu/math/vector3.rb +491 -0
  122. data/lib/mittsu/math/vector4.rb +414 -0
  123. data/lib/mittsu/objects.rb +3 -0
  124. data/lib/mittsu/objects/group.rb +8 -0
  125. data/lib/mittsu/objects/line.rb +143 -0
  126. data/lib/mittsu/objects/mesh.rb +243 -0
  127. data/lib/mittsu/renderers.rb +1 -0
  128. data/lib/mittsu/renderers/glfw_window.rb +216 -0
  129. data/lib/mittsu/renderers/opengl/opengl_debug.rb +38 -0
  130. data/lib/mittsu/renderers/opengl/opengl_program.rb +402 -0
  131. data/lib/mittsu/renderers/opengl/opengl_shader.rb +58 -0
  132. data/lib/mittsu/renderers/opengl/opengl_state.rb +207 -0
  133. data/lib/mittsu/renderers/opengl/plugins/shadow_map_plugin.rb +416 -0
  134. data/lib/mittsu/renderers/opengl_render_target.rb +87 -0
  135. data/lib/mittsu/renderers/opengl_renderer.rb +3376 -0
  136. data/lib/mittsu/renderers/shaders/shader_chunk.rb +12 -0
  137. data/lib/mittsu/renderers/shaders/shader_chunk/alphamap_fragment.glsl +5 -0
  138. data/lib/mittsu/renderers/shaders/shader_chunk/alphamap_pars_fragment.glsl +5 -0
  139. data/lib/mittsu/renderers/shaders/shader_chunk/alphatest_fragment.glsl +5 -0
  140. data/lib/mittsu/renderers/shaders/shader_chunk/bumpmap_pars_fragment.glsl +40 -0
  141. data/lib/mittsu/renderers/shaders/shader_chunk/color_fragment.glsl +5 -0
  142. data/lib/mittsu/renderers/shaders/shader_chunk/color_pars_fragment.glsl +5 -0
  143. data/lib/mittsu/renderers/shaders/shader_chunk/color_pars_vertex.glsl +5 -0
  144. data/lib/mittsu/renderers/shaders/shader_chunk/color_vertex.glsl +5 -0
  145. data/lib/mittsu/renderers/shaders/shader_chunk/common.glsl +60 -0
  146. data/lib/mittsu/renderers/shaders/shader_chunk/default_vertex.glsl +15 -0
  147. data/lib/mittsu/renderers/shaders/shader_chunk/defaultnormal_vertex.glsl +21 -0
  148. data/lib/mittsu/renderers/shaders/shader_chunk/envmap_fragment.glsl +62 -0
  149. data/lib/mittsu/renderers/shaders/shader_chunk/envmap_pars_fragment.glsl +21 -0
  150. data/lib/mittsu/renderers/shaders/shader_chunk/envmap_pars_vertex.glsl +7 -0
  151. data/lib/mittsu/renderers/shaders/shader_chunk/envmap_vertex.glsl +17 -0
  152. data/lib/mittsu/renderers/shaders/shader_chunk/fog_fragment.glsl +26 -0
  153. data/lib/mittsu/renderers/shaders/shader_chunk/fog_pars_fragment.glsl +15 -0
  154. data/lib/mittsu/renderers/shaders/shader_chunk/lightmap_fragment.glsl +5 -0
  155. data/lib/mittsu/renderers/shaders/shader_chunk/lightmap_pars_fragment.glsl +6 -0
  156. data/lib/mittsu/renderers/shaders/shader_chunk/lightmap_pars_vertex.glsl +5 -0
  157. data/lib/mittsu/renderers/shaders/shader_chunk/lightmap_vertex.glsl +5 -0
  158. data/lib/mittsu/renderers/shaders/shader_chunk/lights_lambert_pars_vertex.glsl +43 -0
  159. data/lib/mittsu/renderers/shaders/shader_chunk/lights_lambert_vertex.glsl +196 -0
  160. data/lib/mittsu/renderers/shaders/shader_chunk/lights_phong_fragment.glsl +243 -0
  161. data/lib/mittsu/renderers/shaders/shader_chunk/lights_phong_pars_fragment.glsl +58 -0
  162. data/lib/mittsu/renderers/shaders/shader_chunk/lights_phong_pars_vertex.glsl +5 -0
  163. data/lib/mittsu/renderers/shaders/shader_chunk/lights_phong_vertex.glsl +5 -0
  164. data/lib/mittsu/renderers/shaders/shader_chunk/linear_to_gamma_fragment.glsl +2 -0
  165. data/lib/mittsu/renderers/shaders/shader_chunk/logdepthbuf_fragment.glsl +5 -0
  166. data/lib/mittsu/renderers/shaders/shader_chunk/logdepthbuf_pars_fragment.glsl +12 -0
  167. data/lib/mittsu/renderers/shaders/shader_chunk/logdepthbuf_pars_vertex.glsl +11 -0
  168. data/lib/mittsu/renderers/shaders/shader_chunk/logdepthbuf_vertex.glsl +15 -0
  169. data/lib/mittsu/renderers/shaders/shader_chunk/map_fragment.glsl +9 -0
  170. data/lib/mittsu/renderers/shaders/shader_chunk/map_pars_fragment.glsl +11 -0
  171. data/lib/mittsu/renderers/shaders/shader_chunk/map_pars_vertex.glsl +6 -0
  172. data/lib/mittsu/renderers/shaders/shader_chunk/map_particle_fragment.glsl +5 -0
  173. data/lib/mittsu/renderers/shaders/shader_chunk/map_particle_pars_fragment.glsl +6 -0
  174. data/lib/mittsu/renderers/shaders/shader_chunk/map_vertex.glsl +5 -0
  175. data/lib/mittsu/renderers/shaders/shader_chunk/morphnormal_vertex.glsl +12 -0
  176. data/lib/mittsu/renderers/shaders/shader_chunk/morphtarget_pars_vertex.glsl +13 -0
  177. data/lib/mittsu/renderers/shaders/shader_chunk/morphtarget_vertex.glsl +20 -0
  178. data/lib/mittsu/renderers/shaders/shader_chunk/normalmap_pars_fragment.glsl +27 -0
  179. data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_fragment.glsl +217 -0
  180. data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_pars_fragment.glsl +19 -0
  181. data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_pars_vertex.glsl +6 -0
  182. data/lib/mittsu/renderers/shaders/shader_chunk/shadowmap_vertex.glsl +9 -0
  183. data/lib/mittsu/renderers/shaders/shader_chunk/skinbase_vertex.glsl +8 -0
  184. data/lib/mittsu/renderers/shaders/shader_chunk/skinning_pars_vertex.glsl +47 -0
  185. data/lib/mittsu/renderers/shaders/shader_chunk/skinning_vertex.glsl +20 -0
  186. data/lib/mittsu/renderers/shaders/shader_chunk/skinnormal_vertex.glsl +20 -0
  187. data/lib/mittsu/renderers/shaders/shader_chunk/specularmap_fragment.glsl +12 -0
  188. data/lib/mittsu/renderers/shaders/shader_chunk/specularmap_pars_fragment.glsl +5 -0
  189. data/lib/mittsu/renderers/shaders/shader_chunk/worldpos_vertex.glsl +17 -0
  190. data/lib/mittsu/renderers/shaders/shader_lib.rb +420 -0
  191. data/lib/mittsu/renderers/shaders/uniforms_lib.rb +107 -0
  192. data/lib/mittsu/renderers/shaders/uniforms_utils.rb +31 -0
  193. data/lib/mittsu/scenes.rb +1 -0
  194. data/lib/mittsu/scenes/scene.rb +27 -0
  195. data/lib/mittsu/textures.rb +5 -0
  196. data/lib/mittsu/textures/compressed_texture.rb +30 -0
  197. data/lib/mittsu/textures/cube_texture.rb +19 -0
  198. data/lib/mittsu/textures/data_texture.rb +17 -0
  199. data/lib/mittsu/textures/texture.rb +92 -0
  200. data/lib/mittsu/textures/video_texture.rb +17 -0
  201. data/lib/mittsu/version.rb +4 -0
  202. data/mittsu.gemspec +31 -0
  203. metadata +357 -0
@@ -0,0 +1,38 @@
1
+ require 'opengl'
2
+
3
+ ERROR_STRINGS = {
4
+ OpenGL::GL_NO_ERROR => 'NO_ERROR',
5
+ OpenGL::GL_INVALID_ENUM => 'INVALID_ENUM',
6
+ OpenGL::GL_INVALID_VALUE => 'INVALID_VALUE',
7
+ OpenGL::GL_INVALID_OPERATION => 'INVALID_OPERATION',
8
+ OpenGL::GL_STACK_OVERFLOW => 'STACK_OVERFLOW',
9
+ OpenGL::GL_STACK_UNDERFLOW => 'STACK_UNDERFLOW',
10
+ OpenGL::GL_OUT_OF_MEMORY => 'OUT_OF_MEMORY',
11
+ # OpenGL::GL_TABLE_TOO_LARGE => 'TABLE_TOO_LARGE'
12
+ }
13
+
14
+ module OpenGLDebug
15
+ module OpenGLProxy
16
+ extend OpenGL
17
+ end
18
+
19
+ def self.load_lib
20
+ OpenGL.load_lib
21
+ end
22
+
23
+ OpenGL.constants.each do |c|
24
+ const_set c, OpenGL.const_get(c)
25
+ end
26
+
27
+ OpenGL.instance_methods.each do |m|
28
+ define_method m do |*args|
29
+ r = OpenGLProxy.send(m, *args)
30
+ call = "#{m}(#{args.map { |s| s.to_s[0..20] }.join(', ')})"
31
+ ret = r.nil? ? '' : " => #{r}"
32
+ puts "#{call}#{ret}"
33
+ e = OpenGLProxy.glGetError
34
+ raise "ERROR: #{m} => #{ERROR_STRINGS[e]}" unless e == OpenGL::GL_NO_ERROR
35
+ r
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,402 @@
1
+ require 'mittsu/renderers/opengl/opengl_shader'
2
+
3
+ module Mittsu
4
+ class OpenGLProgram
5
+ attr_reader :id, :program, :uniforms, :attributes
6
+ attr_accessor :code, :used_times, :attributes, :vertex_shader, :fragment_shader
7
+
8
+ def initialize(renderer, code, material, parameters)
9
+ defines = material.defines || {} # TODO: setting to default object... ?
10
+ uniforms = material[:_opengl_shader][:uniforms]
11
+ attributes = material.attributes || [] # TODO: setting to default array... ?
12
+
13
+ vertex_shader = material[:_opengl_shader][:vertex_shader]
14
+ fragment_shader = material[:_opengl_shader][:fragment_shader]
15
+
16
+ # TODO: necessary for OpenGL?
17
+ # index0_attribute_name = material.index0_attribute_name
18
+ #
19
+ # if index0_attribute_name.nil? && parameters[:morph_targets]
20
+ # # programs with morph_targets displace position of attribute 0
21
+ #
22
+ # index0_attribute_name = 'position'
23
+ # end
24
+
25
+ shadow_map_type_define = 'SHADOWMAP_TYPE_BASIC'
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',
150
+
151
+ '#ifdef USE_MORPHTARGETS',
152
+
153
+ ' in vec3 morphTarget0;',
154
+ ' in vec3 morphTarget1;',
155
+ ' in vec3 morphTarget2;',
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?
191
+
192
+ custom_defines,
193
+
194
+ "#define MAX_DIR_LIGHTS #{parameters[:max_dir_lights]}",
195
+ "#define MAX_POINT_LIGHTS #{parameters[:max_point_lights]}",
196
+ "#define MAX_SPOT_LIGHTS #{parameters[:max_spot_lights]}",
197
+ "#define MAX_HEMI_LIGHTS #{parameters[:max_hemi_lights]}",
198
+
199
+ "#define MAX_SHADOWS #{parameters[:max_shadows]}",
200
+
201
+ parameters[:alpha_test] ? "#define ALPHATEST #{parameters[:alpha_test].to_f}" : '',
202
+
203
+ renderer.gamma_input ? '#define GAMMA_INPUT' : '',
204
+ renderer.gamma_output ? '#define GAMMA_OUTPUT' : '',
205
+ "#define GAMMA_FACTOR #{gamma_factor_define}",
206
+
207
+ (parameters[:use_fog] && parameters[:fog]) ? '#define USE_FOG' : '',
208
+ (parameters[:use_fog] && parameters[:fog_exp]) ? '#define FOG_EXP2' : '',
209
+
210
+ parameters[:map] ? '#define USE_MAP' : '',
211
+ parameters[:env_map] ? '#define USE_ENVMAP' : '',
212
+ parameters[:env_map] ? "#define #{env_map_type_define}" : '',
213
+ parameters[:env_map] ? "#define #{env_map_mode_define}" : '',
214
+ parameters[:env_map] ? "#define #{env_map_blending_define}" : '',
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' : '',
221
+
222
+ parameters[:flat_shading] ? '#define FLAT_SHADED' : '',
223
+
224
+ parameters[:metal] ? '#define METAL' : '',
225
+ parameters[:wrap_around] ? '#define WRAP_AROUND' : '',
226
+ parameters[:double_sided] ? '#define DOUBLE_SIDED' : '',
227
+ parameters[:flip_sided] ? '#define FLIP_SIDED' : '',
228
+
229
+
230
+ parameters[:shadow_map_enabled] ? '#define USE_SHADOWMAP' : '',
231
+ parameters[:shadow_map_enabled] ? "#define #{shadow_map_type_define}" : '',
232
+ parameters[:shadow_map_debug] ? '#define SHADOWMAP_DEBUG' : '',
233
+ parameters[:'shadow_map_cascade'] ? '#define SHADOWMAP_CASCADE' : '',
234
+
235
+ parameters[:logarithmic_depth_buffer] ? '#define USE_LOGDEPTHBUF' : '',
236
+ #renderer._glExtensionFragDepth ? '#define USE_LOGDEPTHBUF_EXT' : '',
237
+
238
+ 'uniform mat4 viewMatrix;',
239
+ 'uniform vec3 cameraPosition;',
240
+
241
+ 'layout(location = 0) out vec4 fragColor;'
242
+ ].reject(&:empty?).join("\n") + "\n"
243
+ end
244
+
245
+ gl_vertex_shader = OpenGLShader.new(GL_VERTEX_SHADER, prefix_vertex + vertex_shader)
246
+ gl_fragment_shader = OpenGLShader.new(GL_FRAGMENT_SHADER, prefix_fragment + fragment_shader)
247
+
248
+ glAttachShader(@program, gl_vertex_shader.shader)
249
+ glAttachShader(@program, gl_fragment_shader.shader)
250
+
251
+ # if !index0_attribute_name.nil?
252
+ # TODO: is this necessary in OpenGL ???
253
+ # Force a particular attribute to index 0.
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
256
+
257
+ # glBindAttributeLocation(program, 0, index0_attribute_name)
258
+ # end
259
+
260
+ glLinkProgram(@program)
261
+
262
+ log_info = program_info_log
263
+
264
+ if !link_status
265
+ puts "ERROR: Mittsu::OpenGLProgram: shader error: #{glGetError}, GL_INVALID_STATUS, #{glGetProgramParameter(program, GL_VALIDATE_STATUS)}, glGetProgramParameterInfoLog, #{program_log_info}"
266
+ end
267
+
268
+ if !log_info.empty?
269
+ puts "WARNING: Mittsu::OpenGLProgram: glGetProgramInfoLog, #{log_info}"
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
274
+
275
+ # clean up
276
+
277
+ glDeleteShader(gl_vertex_shader.shader)
278
+ glDeleteShader(gl_fragment_shader.shader)
279
+
280
+ # cache uniform locations
281
+
282
+ identifiers = [
283
+ 'viewMatrix',
284
+ 'modelViewMatrix',
285
+ 'projectionMatrix',
286
+ 'normalMatrix',
287
+ 'modelMatrix',
288
+ 'cameraPosition',
289
+ 'morphTargetInfluences',
290
+ 'bindMatrix',
291
+ 'bindMatrixInverse'
292
+ ]
293
+
294
+ if parameters[:use_vertex_texture]
295
+ identifiers << 'boneTexture'
296
+ identifiers << 'boneTextureWidth'
297
+ identifiers << 'boneTextureHeight'
298
+ else
299
+ identifiers << 'boneGlobalMatrices'
300
+ end
301
+
302
+ if parameters[:logarithmic_depth_buffer]
303
+ identifiers << 'logDepthBufFC'
304
+ end
305
+
306
+ uniforms.each do |k, v|
307
+ identifiers << k.to_s
308
+ end
309
+
310
+ @uniforms = cache_uniform_locations(program, identifiers)
311
+
312
+ # cache attributes locations
313
+
314
+ identifiers = [
315
+ 'position',
316
+ 'normal',
317
+ 'uv',
318
+ 'uv2',
319
+ 'tangent',
320
+ 'color',
321
+ 'skinIndex',
322
+ 'skinWeight',
323
+ 'lineDistance'
324
+ ]
325
+
326
+ parameters[:max_morph_targets].times do |i|
327
+ identifiers << "morphTarget#{i}"
328
+ end
329
+
330
+ parameters[:max_morph_normals].times do |i|
331
+ identifiers << "morphNormal#{i}"
332
+ end
333
+
334
+ attributes.each do |k, v|
335
+ identifiers << k
336
+ end
337
+
338
+ @attributes = cache_attribute_locations(program, identifiers)
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
+
375
+ 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
+ ''
399
+ end
400
+ end
401
+ end
402
+ end
@@ -0,0 +1,58 @@
1
+ require 'fiddle'
2
+
3
+ module Mittsu
4
+ class OpenGLShader
5
+ attr_reader :shader
6
+
7
+ def initialize(type, string)
8
+ @shader = glCreateShader(type)
9
+ # filename = type == GL_VERTEX_SHADER ? 'vertex.glsl' : 'fragment.glsl'
10
+ # File.write filename, string
11
+
12
+ string_pointer = Fiddle::Pointer[string]
13
+ string_length = Fiddle::Pointer[string.length]
14
+
15
+ glShaderSource(@shader, 1, string_pointer.ref, string_length.ref)
16
+ glCompileShader(@shader)
17
+
18
+ if !compile_status
19
+ puts "ERROR: Mittsu::OpenGLShader: Shader couldn't compile"
20
+ end
21
+
22
+ log_info = shader_info_log
23
+ if !log_info.empty?
24
+ puts "WARNING: Mittsu::OpenGLShader: glGetShaderInfoLog, #{log_info}"
25
+ puts add_line_numbers(string)
26
+ end
27
+ end
28
+
29
+ private
30
+
31
+ def compile_status
32
+ ptr = ' '*8
33
+ glGetShaderiv @shader, GL_COMPILE_STATUS, ptr
34
+ ptr.unpack('L')[0]
35
+ end
36
+
37
+ def shader_info_log
38
+ ptr = ' '*8
39
+ glGetShaderiv @shader, GL_INFO_LOG_LENGTH, ptr
40
+ length = ptr.unpack('L')[0]
41
+
42
+ if length > 0
43
+ log = ' '*length
44
+ glGetShaderInfoLog @shader, length, ptr, log
45
+ log.unpack("A#{length}")[0]
46
+ else
47
+ ''
48
+ end
49
+ end
50
+
51
+ def add_line_numbers(string)
52
+ string.split("\n").each_with_index.map { |line, i|
53
+ line_number = "#{i + 1}".rjust(4, ' ')
54
+ "#{line_number}: #{line}"
55
+ }.join("\n")
56
+ end
57
+ end
58
+ end