mittsu 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
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,7 @@
1
+ require 'mittsu/loaders/cache'
2
+ require 'mittsu/loaders/loader'
3
+ require 'mittsu/loaders/loading_manager'
4
+ require 'mittsu/loaders/image_loader'
5
+ require 'mittsu/loaders/file_loader'
6
+ require 'mittsu/loaders/mtl_loader'
7
+ require 'mittsu/loaders/obj_mtl_loader'
@@ -0,0 +1,53 @@
1
+ module Mittsu
2
+ module Cache
3
+ @@files = {}
4
+
5
+ def self.add(key, file)
6
+ @@files[key] = file
7
+ end
8
+
9
+ def self.get(key)
10
+ @@files[key]
11
+ end
12
+
13
+ def self.remove(key)
14
+ @@files.delete(key)
15
+ end
16
+
17
+ def self.clear
18
+ @@files.clear
19
+ end
20
+ end
21
+ end
22
+
23
+ # files: {},
24
+ #
25
+ # add: function ( key, file ) {
26
+ #
27
+ # // console.log( 'THREE.Cache', 'Adding key:', key );
28
+ #
29
+ # this.files[ key ] = file;
30
+ #
31
+ # },
32
+ #
33
+ # get: function ( key ) {
34
+ #
35
+ # // console.log( 'THREE.Cache', 'Checking key:', key );
36
+ #
37
+ # return this.files[ key ];
38
+ #
39
+ # },
40
+ #
41
+ # remove: function ( key ) {
42
+ #
43
+ # delete this.files[ key ];
44
+ #
45
+ # },
46
+ #
47
+ # clear: function () {
48
+ #
49
+ # this.files = {}
50
+ #
51
+ # }
52
+ #
53
+ # };
@@ -0,0 +1,22 @@
1
+ module Mittsu
2
+ class FileLoader
3
+ def initialize(manager = nil)
4
+ @manager = manager || DefaultLoadingManager
5
+ end
6
+
7
+ def load(url)
8
+ cached = Cache.get(url)
9
+
10
+ return cached unless cached.nil?
11
+
12
+ @manager.item_start(url)
13
+
14
+ text = File.read(url)
15
+ Cache.add(url, text)
16
+
17
+ @manager.item_end(url)
18
+
19
+ text
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,32 @@
1
+ require 'rmagick'
2
+ require 'mittsu/extras/image'
3
+
4
+ module Mittsu
5
+ class ImageLoader
6
+ attr_accessor :manager
7
+
8
+ def initialize(manager = DefaultLoadingManager)
9
+ @manager = manager
10
+ end
11
+
12
+ def load(url, flip: false, flop: false)
13
+ chache_url = "#{url}?flip=#{flip}&flop=#{flop}"
14
+ cached = Cache.get(url)
15
+ return cached unless cached.nil?
16
+
17
+ rm_image = Magick::Image.read(url).first
18
+ rm_image = rm_image.flip if flip
19
+ rm_image = rm_image.flop if flop
20
+ rgba_data = rm_image.to_blob { |i|
21
+ i.format = "RGBA"
22
+ i.depth = 8
23
+ }
24
+
25
+ image = Image.new(rm_image.columns, rm_image.rows, rgba_data)
26
+
27
+ Cache.add(url, image)
28
+ @manager.item_start(url)
29
+ image
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,212 @@
1
+ module Mittsu
2
+ class Loader
3
+ def initialize(show_status = false)
4
+ @image_loader = ImageLoader.new
5
+ end
6
+
7
+ def init_materials(materials, texture_path)
8
+ materials.map do |m|
9
+ create_material(m, texture_path)
10
+ end
11
+ end
12
+
13
+ def needs_tangents(materials)
14
+ materials.each do |m|
15
+ return true if m.is_a?(ShareMaterial)
16
+ end
17
+ false
18
+ end
19
+
20
+ def create_material(m, texture_path)
21
+ # defaults
22
+
23
+ mtype = 'MeshLambertMaterial'
24
+ mpars = {
25
+ color: 0xeeeeee,
26
+ opactity: 1.0,
27
+ map: nil,
28
+ light_map: nil,
29
+ normal_map: nil,
30
+ bump_map: nil,
31
+ wireframe: false
32
+ }
33
+
34
+ # parameters from model file
35
+
36
+ if m.shading
37
+ shading = m.shading.downcase
38
+
39
+ if shading == 'phong'
40
+ mtype = 'MeshPhongMaterial'
41
+ elsif shading == 'basic'
42
+ mtype = 'MeshBasicMaterial'
43
+ end
44
+ end
45
+
46
+ if m.blending && Mittsu.const_get(m.blending)
47
+ mpars[:blending] = Mittsu.const_get(m.blending)
48
+ end
49
+
50
+ mpars[:transparent] = m.transparent if !m.transparent.nil?
51
+ mpars[:transparent] = true if m.opacity && m.opacity < 1.0
52
+ mpars[:depth_test] = m.depth_test if !m.depth_test.nil?
53
+ mpars[:depth_write] = m.depth_write if !m.depth_write.nil?
54
+ mpars[:visible] = m.visible if !m.visible.nil?
55
+ mpars[:flip_sided] = BackSide if !m.flip_sided.nil?
56
+ mpars[:double_sided] = DoubleSide if !m.double_sided.nil?
57
+ mpars[:wireframe] = m.wireframe if !m.wireframe.nil?
58
+
59
+ if !m.vertex_colors.nil?
60
+ if m.vertex_colors == 'face'
61
+ mpars[:vertex_colors] = FaceColors
62
+ elsif !m.vertex_colors.empty?
63
+ mpars[:vertex_colors] = VertexColors
64
+ end
65
+ end
66
+
67
+ # colors
68
+
69
+ if m.color_diffuse
70
+ mpars[:color] = rgb2hex(m.color_diffuse)
71
+ elsif m.dgb_color
72
+ mpars[:color] = m.dgb_color
73
+ end
74
+
75
+ if m.color_specular
76
+ mpars[:specular] = rgb2hex(m.color_specular)
77
+ end
78
+
79
+ if m.color_emissive
80
+ mpars[:emissive] = rgb2hex(m.color_emissive)
81
+ end
82
+
83
+ # modifiers
84
+
85
+ if !m.transparency.nil?
86
+ puts "WARNING: Mitsu::Loader: transparency has been renamed to opacity"
87
+ m.opacity = m.transparency
88
+ end
89
+
90
+ if !m.opacity.nil?
91
+ mpars[:opacity] = m.opacity
92
+ end
93
+
94
+ if m.specular_coef
95
+ mpars[:shininess] = m.specular_coef
96
+ end
97
+
98
+ # textures
99
+
100
+ if m.map_diffuse && texture_path
101
+ create_texture(mpars, 'map', m.map_diffuse, m.map_diffuse_repeat, m.map_diffuse_offset, m.map_diffuse_wrap, m.map_diffuse_anisotropy)
102
+ end
103
+
104
+ if m.map_light && texture_path
105
+ create_texture(mpars, 'light_map', m.map_light, m.map_light_repeat, m.map_light_offset, m.map_light_wrap, m.map_light_anisotropy)
106
+ end
107
+
108
+ if m.map_bump && texture_path
109
+ create_texture(mpars, 'bump_map', m.map_bump, m.map_bump_repeat, m.map_bump_offset, m.map_bump_wrap, m.map_bump_anisotropy)
110
+ end
111
+
112
+ if m.map_normal && texture_path
113
+ create_texture(mpars, 'normal_map', m.map_normal, m.map_normal_repeat, m.map_normal_offset, m.map_normal_wrap, m.map_normal_anisotropy)
114
+ end
115
+
116
+ if m.map_specular && texture_path
117
+ create_texture(mpars, 'specular_map', m.map_specular, m.map_specular_repeat, m.map_specular_offset, m.map_specular_wrap, m.map_specular_anisotropy)
118
+ end
119
+
120
+ if m.map_alpha && texture_path
121
+ create_texture(mpars, 'alpha_map', m.map_alpha, m.map_alpha_repeat, m.map_alpha_offset, m.map_alpha_wrap, m.map_alpha_anisotropy)
122
+ end
123
+
124
+ #
125
+
126
+ if m.map_bump_scale
127
+ mpars[:bump_scale] = m.map_bump_scale
128
+ end
129
+
130
+ if m.map_normal_factor
131
+ mpars[:normal_scale] = Vector2.new(m.map_normal_factor, m.map_normal_factor)
132
+ end
133
+
134
+ Mittsu.const_get(mtype).new(mpars).tap do |material|
135
+ material.name = m.dbg_name if !m.dbg_name.nil?
136
+ end
137
+ end
138
+
139
+ module Handlers
140
+ def self.add(regex, loader)
141
+ @@handlers ||= {}
142
+ @@handlers[regex] = loader
143
+ end
144
+
145
+ def self.get(file)
146
+ @@handlers ||= {}
147
+ @@handlers.find(-> () { [nil, nil] }) { |regex, loader| regex =~ file }[1]
148
+ end
149
+ end
150
+
151
+ private
152
+
153
+ def nearest_pow2(n)
154
+ l = Math.log(n) / Math::LN2
155
+ Math.pow(2, Math.round(l))
156
+ end
157
+
158
+ def create_texture(where, name, source_file, repeat, offset, wrap, anisotropy)
159
+ full_path = File.join(texture_path, source_file)
160
+
161
+ loader = Handlers.get(full_path)
162
+
163
+ if !loader.nil?
164
+ texture = loader.load full_path
165
+ else
166
+ texture = Texture.new
167
+
168
+ loader = @image_loader
169
+ image = loader.load full_path
170
+
171
+ if !Math.power_of_two?(image.width) || !Math.power_of_two?(image.height)
172
+ # TODO: resize image to power of two
173
+ else
174
+ texture.image = image
175
+ end
176
+
177
+ texture.needs_update = true
178
+ end
179
+
180
+ texture.source_file = source_file
181
+
182
+ if repeat
183
+ texture.repeat.set(repeat[0], repeat[1])
184
+
185
+ texture.wrap_s = RepeatWrapping if repeat[0] != 1
186
+ texture.wrap_t = RepeatWrapping if repeat[1] != 1
187
+ end
188
+
189
+ if offset
190
+ texture.offset.set(offset[0], offset[1])
191
+ end
192
+
193
+ if wrap
194
+ wrap_map = {
195
+ repeat: RepeatWrapping,
196
+ mirror: MirroredRepeatWrapping
197
+ }
198
+
199
+ texture.wrap_s = wrap_map[wrap[0]] unless wrap_map[wrap[0]].nil?
200
+ texture.wrap_t = wrap_map[wrap[1]] unless wrap_map[wrap[1]].nil?
201
+ end
202
+
203
+ texture.anisotropy = anisotropy if anisotropy
204
+
205
+ where[name] = texture
206
+ end
207
+
208
+ def rgb2hex(rgb)
209
+ (rgb[0] * 255 << 16) + (rgb[1] * 255 << 8) + rgb[2] * 255
210
+ end
211
+ end
212
+ end
@@ -0,0 +1,17 @@
1
+ module Mittsu
2
+ class LoadingManager
3
+ def initialize
4
+ @loaded, @total = 0, 0
5
+ end
6
+
7
+ def item_start(url)
8
+ @total += 1
9
+ end
10
+
11
+ def item_end(url)
12
+ @loaded += 1
13
+ end
14
+ end
15
+
16
+ DefaultLoadingManager = LoadingManager.new
17
+ end
@@ -0,0 +1,242 @@
1
+ module Mittsu
2
+ class MTLLoader
3
+ include EventDispatcher
4
+
5
+ def initialize(base_url, options = {}) # TODO: cross_origin?
6
+ @base_url = base_url
7
+ @options = options
8
+ # @cross_origin = cross_origin
9
+ end
10
+
11
+ def load(url)
12
+ loader = FileLoader.new
13
+ # loader.cross_origin = @cross_origin
14
+
15
+ text = loader.load File.join(@base_url, url)
16
+ parse(text)
17
+ end
18
+
19
+ def parse(text)
20
+ lines = text.split("\n")
21
+ info = {}
22
+ delimiter_pattern = /\s+/
23
+ materials_info = {}
24
+
25
+ lines.each do |line|
26
+ line = line.strip
27
+
28
+ next if line.empty? || line.start_with?('#')
29
+
30
+ pos = line.index(' ')
31
+
32
+ key = ( pos >= 0 ) ? line[0...pos] : line
33
+ key = key.downcase
34
+
35
+ value = ( pos >= 0 ) ? line[pos + 1..-1] : ""
36
+ value = value.strip
37
+
38
+ if key == "newmtl"
39
+ # New material
40
+
41
+ info = { name: value };
42
+ materials_info[value] = info
43
+ elsif info
44
+ if key == "ka" || key == "kd" || key == "ks"
45
+ ss = value.split(delimiter_pattern).take(3)
46
+ info[key] = [ss[0].to_f, ss[1].to_f, ss[2].to_f]
47
+ else
48
+ info[key] = value
49
+ end
50
+ end
51
+ end
52
+
53
+ MaterialCreator.new(@base_url, @options).tap do |material_creator|
54
+ material_creator.set_materials(materials_info)
55
+ end
56
+ end
57
+
58
+ class MaterialCreator
59
+ def initialize(base_url, options = nil)
60
+ @base_url = base_url
61
+ @options = options
62
+ @material_info = {}
63
+ @materials = {}
64
+ @materials_array = []
65
+ @name_lookup = {}
66
+
67
+ @side = (@options || {}).fetch(:side, FrontSide)
68
+ @wrap = (@options || {}).fetch(:wrap, RepeatWrapping)
69
+ end
70
+
71
+ def set_materials(materials_info)
72
+ @materials_info = convert materials_info
73
+ @materials = {}
74
+ @materials_array = []
75
+ @name_lookup = {}
76
+ end
77
+
78
+ def convert(materials_info)
79
+ return materials_info if !@options
80
+
81
+ converted = {}
82
+
83
+ materials_info.each do |mn, mat|
84
+ covmat = {}
85
+ converted[mn] = covmat
86
+
87
+ mat.each do |prop, value|
88
+ save = true
89
+ lprop = prop.to_s.downcase
90
+
91
+ case lprop
92
+ when 'kd', 'ka', 'ks'
93
+ # Diffuse color, (color under white light) using RGB values
94
+
95
+ if @options && @options[:normalize_rgb]
96
+ value = [value[0] / 255.0, value[1] / 255.0, value[2] / 255.0]
97
+ end
98
+
99
+ if @options && @options[:ignore_zero_rgbs]
100
+ if value.take(3).any?(&:zero?)
101
+ # ignore
102
+ save = false
103
+ end
104
+ end
105
+ when 'd'
106
+ # According to MTL format (http://paulbourke.net/dataformats/mtl/):
107
+ # d is dissolve for current material
108
+ # factor of 1.0 is fully opaque, a factor of 0 is fully dissolved (completely transparent)
109
+
110
+ if @options && @options[:invert_transparency]
111
+ value = 1.0 - value
112
+ end
113
+ end
114
+
115
+ covmat[lprop] = value if save
116
+ end
117
+ end
118
+
119
+ converted
120
+ end
121
+
122
+ def preload
123
+ @materials_info.each_key do |mn|
124
+ create mn
125
+ end
126
+ end
127
+
128
+ def get_index(material_name)
129
+ @name_lookup[material_name]
130
+ end
131
+
132
+ def get_as_array
133
+ @materials_info.keys.each_with_index do |mn, index|
134
+ @materials_array[index] = create mn
135
+ @name_lookup[mn] = index
136
+ end
137
+
138
+ @materials_array
139
+ end
140
+
141
+ def create(material_name)
142
+ if @materials[material_name].nil?
143
+ create_material(material_name)
144
+ end
145
+
146
+ @materials[material_name]
147
+ end
148
+
149
+ def load_texture(url, mapping = nil)
150
+ loader = Loader::Handlers.get(url)
151
+
152
+ if !loader.nil?
153
+ texture = loader.load url
154
+ else
155
+ texture = Texture.new
156
+
157
+ loader = ImageLoader.new
158
+ # loader.cross_origin = @cross_origin # TODO: ???
159
+ image = loader.load url
160
+
161
+ texture.image = ensure_power_of_two(image)
162
+ texture.needs_update = true
163
+ end
164
+
165
+ texture.mapping = mapping unless mapping.nil?
166
+
167
+ texture
168
+ end
169
+
170
+ private
171
+
172
+ def create_material(material_name)
173
+ mat = @materials_info[material_name]
174
+ params = {
175
+ name: material_name,
176
+ side: @side
177
+ }
178
+
179
+ mat.each do |prop, value|
180
+ case prop.downcase
181
+ when 'kd'
182
+ # Diffuse color (color under white light) using RGB values
183
+ params[:diffuse] = Color.new.from_array(value)
184
+ when 'ka'
185
+ # Ambient color (color under shadow) using RGB value
186
+ when 'ks'
187
+ # Specular color (color when light is reflected from shiny surface) using RGB values
188
+ params[:specular] = Color.new.from_array(value)
189
+ when 'map_kd'
190
+ # Diffuse texture map
191
+ params[:map] = load_texture File.join(@base_url, value)
192
+ params[:map].wrap_s = @wrap
193
+ params[:map].wrap_t = @wrap
194
+ when 'ns'
195
+ # The specular exponent (defines the focus of the specular highlight)
196
+ # A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.
197
+ params[:shininess] = value.to_f
198
+ when 'd'
199
+ # According to MTL format (http://paulbourke.net/dataformats/mtl/):
200
+ # d is dissolve for current material
201
+ # factor of 1.0 is fully opaque, a factor of 0 is fully dissolved (completely transparent)
202
+
203
+ if value.to_f < 1
204
+ params[:transparent] = true
205
+ params[:opacity] = value.to_f
206
+ end
207
+ when 'map_bump', 'bump'
208
+ # Bump texture map
209
+ if !params[:bump_map]
210
+ params[:bump_map] = load_texture File.join(@base_url, value)
211
+ params[:bump_map].wrap_s = @wrap
212
+ params[:bump_map].wrap_t = @wrap
213
+ end
214
+ end
215
+ end
216
+
217
+ if params[:diffuse]
218
+ params[:color] = params[:diffuse]
219
+ end
220
+
221
+ @materials[material_name] = MeshPhongMaterial.new(params)
222
+ end
223
+
224
+ def ensure_power_of_two(image)
225
+ if !Math.power_of_two?(image.width) || !Math.power_of_two?(image.height)
226
+ # TODO: resize image ???
227
+ end
228
+ image
229
+ end
230
+
231
+ def next_highest_power_of_two(x)
232
+ x -= 1
233
+ i = 1
234
+ while i < 32
235
+ x = x | x >> i
236
+ i <<= 1
237
+ end
238
+ x + 1
239
+ end
240
+ end
241
+ end
242
+ end