jax 0.0.0.1

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 (446) hide show
  1. data/.gitignore +12 -0
  2. data/.gitmodules +3 -0
  3. data/.rvmrc +7 -0
  4. data/Gemfile +4 -0
  5. data/README.rdoc +32 -0
  6. data/Rakefile +144 -0
  7. data/bin/jax +11 -0
  8. data/builtin/shaders/basic/common.ejs +11 -0
  9. data/builtin/shaders/basic/fragment.ejs +5 -0
  10. data/builtin/shaders/basic/vertex.ejs +13 -0
  11. data/builtin/shaders/depthmap/common.ejs +1 -0
  12. data/builtin/shaders/depthmap/fragment.ejs +5 -0
  13. data/builtin/shaders/depthmap/vertex.ejs +7 -0
  14. data/builtin/shaders/fog/common.ejs +7 -0
  15. data/builtin/shaders/fog/fragment.ejs +23 -0
  16. data/builtin/shaders/fog/manifest.yml +12 -0
  17. data/builtin/shaders/fog/material.js +34 -0
  18. data/builtin/shaders/fog/vertex.ejs +10 -0
  19. data/builtin/shaders/functions/depth_map.ejs +24 -0
  20. data/builtin/shaders/functions/lights.ejs +155 -0
  21. data/builtin/shaders/lighting/common.ejs +5 -0
  22. data/builtin/shaders/lighting/fragment.ejs +34 -0
  23. data/builtin/shaders/lighting/manifest.yml +4 -0
  24. data/builtin/shaders/lighting/material.js +26 -0
  25. data/builtin/shaders/lighting/vertex.ejs +7 -0
  26. data/builtin/shaders/normal_map/common.ejs +12 -0
  27. data/builtin/shaders/normal_map/fragment.ejs +26 -0
  28. data/builtin/shaders/normal_map/manifest.yml +17 -0
  29. data/builtin/shaders/normal_map/material.js +16 -0
  30. data/builtin/shaders/normal_map/vertex.ejs +57 -0
  31. data/builtin/shaders/paraboloid-depthmap/common.ejs +6 -0
  32. data/builtin/shaders/paraboloid-depthmap/fragment.ejs +8 -0
  33. data/builtin/shaders/paraboloid-depthmap/material.js +15 -0
  34. data/builtin/shaders/paraboloid-depthmap/vertex.ejs +26 -0
  35. data/builtin/shaders/shadow_map/common.ejs +14 -0
  36. data/builtin/shaders/shadow_map/fragment.ejs +66 -0
  37. data/builtin/shaders/shadow_map/manifest.yml +1 -0
  38. data/builtin/shaders/shadow_map/material.js +26 -0
  39. data/builtin/shaders/shadow_map/vertex.ejs +46 -0
  40. data/builtin/shaders/texture/common.ejs +4 -0
  41. data/builtin/shaders/texture/fragment.ejs +11 -0
  42. data/builtin/shaders/texture/manifest.yml +17 -0
  43. data/builtin/shaders/texture/material.js +18 -0
  44. data/builtin/shaders/texture/vertex.ejs +9 -0
  45. data/guides/assets/images/book_icon.gif +0 -0
  46. data/guides/assets/images/bullet.gif +0 -0
  47. data/guides/assets/images/chapters_icon.gif +0 -0
  48. data/guides/assets/images/check_bullet.gif +0 -0
  49. data/guides/assets/images/credits_pic_blank.gif +0 -0
  50. data/guides/assets/images/edge_badge.png +0 -0
  51. data/guides/assets/images/feature_tile.gif +0 -0
  52. data/guides/assets/images/footer_tile.gif +0 -0
  53. data/guides/assets/images/getting_started/clean_passing_jasmine_suite.png +0 -0
  54. data/guides/assets/images/getting_started/rock.png +0 -0
  55. data/guides/assets/images/getting_started/rock_normal.png +0 -0
  56. data/guides/assets/images/grey_bullet.gif +0 -0
  57. data/guides/assets/images/header_backdrop.png +0 -0
  58. data/guides/assets/images/header_tile.gif +0 -0
  59. data/guides/assets/images/icons/README +5 -0
  60. data/guides/assets/images/icons/callouts/1.png +0 -0
  61. data/guides/assets/images/icons/callouts/10.png +0 -0
  62. data/guides/assets/images/icons/callouts/11.png +0 -0
  63. data/guides/assets/images/icons/callouts/12.png +0 -0
  64. data/guides/assets/images/icons/callouts/13.png +0 -0
  65. data/guides/assets/images/icons/callouts/14.png +0 -0
  66. data/guides/assets/images/icons/callouts/15.png +0 -0
  67. data/guides/assets/images/icons/callouts/2.png +0 -0
  68. data/guides/assets/images/icons/callouts/3.png +0 -0
  69. data/guides/assets/images/icons/callouts/4.png +0 -0
  70. data/guides/assets/images/icons/callouts/5.png +0 -0
  71. data/guides/assets/images/icons/callouts/6.png +0 -0
  72. data/guides/assets/images/icons/callouts/7.png +0 -0
  73. data/guides/assets/images/icons/callouts/8.png +0 -0
  74. data/guides/assets/images/icons/callouts/9.png +0 -0
  75. data/guides/assets/images/icons/caution.png +0 -0
  76. data/guides/assets/images/icons/example.png +0 -0
  77. data/guides/assets/images/icons/home.png +0 -0
  78. data/guides/assets/images/icons/important.png +0 -0
  79. data/guides/assets/images/icons/next.png +0 -0
  80. data/guides/assets/images/icons/note.png +0 -0
  81. data/guides/assets/images/icons/prev.png +0 -0
  82. data/guides/assets/images/icons/tip.png +0 -0
  83. data/guides/assets/images/icons/up.png +0 -0
  84. data/guides/assets/images/icons/warning.png +0 -0
  85. data/guides/assets/images/nav_arrow.gif +0 -0
  86. data/guides/assets/images/tab_grey.gif +0 -0
  87. data/guides/assets/images/tab_info.gif +0 -0
  88. data/guides/assets/images/tab_note.gif +0 -0
  89. data/guides/assets/images/tab_red.gif +0 -0
  90. data/guides/assets/images/tab_yellow.gif +0 -0
  91. data/guides/assets/images/tab_yellow.png +0 -0
  92. data/guides/assets/javascripts/guides.js +7 -0
  93. data/guides/assets/javascripts/syntaxhighlighter/shBrushAS3.js +59 -0
  94. data/guides/assets/javascripts/syntaxhighlighter/shBrushAppleScript.js +75 -0
  95. data/guides/assets/javascripts/syntaxhighlighter/shBrushBash.js +59 -0
  96. data/guides/assets/javascripts/syntaxhighlighter/shBrushCSharp.js +65 -0
  97. data/guides/assets/javascripts/syntaxhighlighter/shBrushColdFusion.js +100 -0
  98. data/guides/assets/javascripts/syntaxhighlighter/shBrushCpp.js +97 -0
  99. data/guides/assets/javascripts/syntaxhighlighter/shBrushCss.js +91 -0
  100. data/guides/assets/javascripts/syntaxhighlighter/shBrushDelphi.js +55 -0
  101. data/guides/assets/javascripts/syntaxhighlighter/shBrushDiff.js +41 -0
  102. data/guides/assets/javascripts/syntaxhighlighter/shBrushErlang.js +52 -0
  103. data/guides/assets/javascripts/syntaxhighlighter/shBrushGroovy.js +67 -0
  104. data/guides/assets/javascripts/syntaxhighlighter/shBrushJScript.js +52 -0
  105. data/guides/assets/javascripts/syntaxhighlighter/shBrushJava.js +57 -0
  106. data/guides/assets/javascripts/syntaxhighlighter/shBrushJavaFX.js +58 -0
  107. data/guides/assets/javascripts/syntaxhighlighter/shBrushPerl.js +72 -0
  108. data/guides/assets/javascripts/syntaxhighlighter/shBrushPhp.js +88 -0
  109. data/guides/assets/javascripts/syntaxhighlighter/shBrushPlain.js +33 -0
  110. data/guides/assets/javascripts/syntaxhighlighter/shBrushPowerShell.js +74 -0
  111. data/guides/assets/javascripts/syntaxhighlighter/shBrushPython.js +64 -0
  112. data/guides/assets/javascripts/syntaxhighlighter/shBrushRuby.js +55 -0
  113. data/guides/assets/javascripts/syntaxhighlighter/shBrushSass.js +94 -0
  114. data/guides/assets/javascripts/syntaxhighlighter/shBrushScala.js +51 -0
  115. data/guides/assets/javascripts/syntaxhighlighter/shBrushSql.js +66 -0
  116. data/guides/assets/javascripts/syntaxhighlighter/shBrushVb.js +56 -0
  117. data/guides/assets/javascripts/syntaxhighlighter/shBrushXml.js +69 -0
  118. data/guides/assets/javascripts/syntaxhighlighter/shCore.js +17 -0
  119. data/guides/assets/stylesheets/fixes.css +16 -0
  120. data/guides/assets/stylesheets/main.css +445 -0
  121. data/guides/assets/stylesheets/print.css +52 -0
  122. data/guides/assets/stylesheets/reset.css +43 -0
  123. data/guides/assets/stylesheets/style.css +13 -0
  124. data/guides/assets/stylesheets/syntaxhighlighter/shCore.css +226 -0
  125. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDefault.css +328 -0
  126. data/guides/assets/stylesheets/syntaxhighlighter/shCoreDjango.css +331 -0
  127. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEclipse.css +339 -0
  128. data/guides/assets/stylesheets/syntaxhighlighter/shCoreEmacs.css +324 -0
  129. data/guides/assets/stylesheets/syntaxhighlighter/shCoreFadeToGrey.css +328 -0
  130. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMDUltra.css +324 -0
  131. data/guides/assets/stylesheets/syntaxhighlighter/shCoreMidnight.css +324 -0
  132. data/guides/assets/stylesheets/syntaxhighlighter/shCoreRDark.css +324 -0
  133. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDefault.css +117 -0
  134. data/guides/assets/stylesheets/syntaxhighlighter/shThemeDjango.css +120 -0
  135. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEclipse.css +128 -0
  136. data/guides/assets/stylesheets/syntaxhighlighter/shThemeEmacs.css +113 -0
  137. data/guides/assets/stylesheets/syntaxhighlighter/shThemeFadeToGrey.css +117 -0
  138. data/guides/assets/stylesheets/syntaxhighlighter/shThemeJaxGuides.css +116 -0
  139. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMDUltra.css +113 -0
  140. data/guides/assets/stylesheets/syntaxhighlighter/shThemeMidnight.css +113 -0
  141. data/guides/assets/stylesheets/syntaxhighlighter/shThemeRDark.css +113 -0
  142. data/guides/jax_guides.rb +41 -0
  143. data/guides/jax_guides/common.rb +7 -0
  144. data/guides/jax_guides/generator.rb +287 -0
  145. data/guides/jax_guides/helpers.rb +29 -0
  146. data/guides/jax_guides/indexer.rb +69 -0
  147. data/guides/jax_guides/levenshtein.rb +31 -0
  148. data/guides/jax_guides/textile_extensions.rb +61 -0
  149. data/guides/source/getting_started.textile +1171 -0
  150. data/guides/source/index.html.erb +50 -0
  151. data/guides/source/layout.html.erb +158 -0
  152. data/guides/source/lighting.textile +5 -0
  153. data/guides/source/materials.textile +5 -0
  154. data/guides/source/shaders.textile +5 -0
  155. data/guides/source/testing.textile +5 -0
  156. data/guides/w3c_validator.rb +91 -0
  157. data/jax.gems +1 -0
  158. data/jax.gemspec +40 -0
  159. data/lib/jax.rb +28 -0
  160. data/lib/jax/application.rb +92 -0
  161. data/lib/jax/application/configuration.rb +27 -0
  162. data/lib/jax/generators/app.rb +17 -0
  163. data/lib/jax/generators/app/app_generator.rb +78 -0
  164. data/lib/jax/generators/app/templates/Gemfile.tt +3 -0
  165. data/lib/jax/generators/app/templates/Rakefile +6 -0
  166. data/lib/jax/generators/app/templates/app/controllers/application_controller.js.tt +5 -0
  167. data/lib/jax/generators/app/templates/app/helpers/application_helper.js.tt +3 -0
  168. data/lib/jax/generators/app/templates/app/models/.empty_directory +0 -0
  169. data/lib/jax/generators/app/templates/app/resources/.empty_directory +0 -0
  170. data/lib/jax/generators/app/templates/app/views/.empty_directory +0 -0
  171. data/lib/jax/generators/app/templates/config/application.rb.tt +6 -0
  172. data/lib/jax/generators/app/templates/config/boot.rb +13 -0
  173. data/lib/jax/generators/app/templates/config/routes.rb.tt +5 -0
  174. data/lib/jax/generators/app/templates/public/javascripts/jax.js +7561 -0
  175. data/lib/jax/generators/app/templates/public/webgl_not_supported.html +26 -0
  176. data/lib/jax/generators/app/templates/script/jax +7 -0
  177. data/lib/jax/generators/app/templates/spec/javascripts/controllers/application_controller_spec.js +11 -0
  178. data/lib/jax/generators/app/templates/spec/javascripts/helpers/application_helper_spec.js +12 -0
  179. data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine.yml +90 -0
  180. data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine_config.rb +23 -0
  181. data/lib/jax/generators/app/templates/spec/javascripts/support/jasmine_runner.rb +32 -0
  182. data/lib/jax/generators/app/templates/spec/javascripts/support/spec_helpers/jax_spec_helper.js +216 -0
  183. data/lib/jax/generators/app/templates/spec/javascripts/support/spec_layout.html.erb +63 -0
  184. data/lib/jax/generators/commands.rb +81 -0
  185. data/lib/jax/generators/controller/USAGE +9 -0
  186. data/lib/jax/generators/controller/controller_generator.rb +59 -0
  187. data/lib/jax/generators/controller/templates/controller_source.js.tt +16 -0
  188. data/lib/jax/generators/controller/templates/controller_test.js.tt +11 -0
  189. data/lib/jax/generators/controller/templates/helper.js.tt +3 -0
  190. data/lib/jax/generators/controller/templates/helper_test.js.tt +12 -0
  191. data/lib/jax/generators/controller/templates/view.js.tt +4 -0
  192. data/lib/jax/generators/light_source/USAGE +14 -0
  193. data/lib/jax/generators/light_source/light_source_generator.rb +47 -0
  194. data/lib/jax/generators/light_source/templates/light.yml.tt +39 -0
  195. data/lib/jax/generators/material/USAGE +29 -0
  196. data/lib/jax/generators/material/material_generator.rb +81 -0
  197. data/lib/jax/generators/material/templates/append.yml.tt +7 -0
  198. data/lib/jax/generators/material/templates/material.yml.tt +33 -0
  199. data/lib/jax/generators/model/USAGE +5 -0
  200. data/lib/jax/generators/model/model_generator.rb +42 -0
  201. data/lib/jax/generators/model/templates/model.js.tt +11 -0
  202. data/lib/jax/generators/model/templates/test.js.tt +11 -0
  203. data/lib/jax/generators/script_jax_loader.rb +32 -0
  204. data/lib/jax/monkeypatch/jasmine.rb +3 -0
  205. data/lib/jax/monkeypatch/jasmine/config.rb +21 -0
  206. data/lib/jax/monkeypatch/jasmine/server.rb +50 -0
  207. data/lib/jax/packager.rb +58 -0
  208. data/lib/jax/packager/sprockets_template.rb +49 -0
  209. data/lib/jax/resource_compiler.rb +50 -0
  210. data/lib/jax/routes.rb +61 -0
  211. data/lib/jax/shader.rb +158 -0
  212. data/lib/jax/tasks/rake.rb +34 -0
  213. data/lib/jax/version.rb +12 -0
  214. data/public/images/brickwall.jpg +0 -0
  215. data/public/images/jacks.jpg +0 -0
  216. data/public/images/normal_map.jpg +0 -0
  217. data/public/images/rock.png +0 -0
  218. data/public/images/rockNormal.png +0 -0
  219. data/public/images/rss.png +0 -0
  220. data/public/webgl_not_supported.html +26 -0
  221. data/spec/example_app/Gemfile +1 -0
  222. data/spec/example_app/Rakefile +15 -0
  223. data/spec/example_app/app/controllers/application_controller.js +5 -0
  224. data/spec/example_app/app/controllers/courthouse_controller.js +24 -0
  225. data/spec/example_app/app/controllers/lighting_controller.js +69 -0
  226. data/spec/example_app/app/controllers/shadows_controller.js +130 -0
  227. data/spec/example_app/app/controllers/textures_controller.js +52 -0
  228. data/spec/example_app/app/helpers/application_helper.js +3 -0
  229. data/spec/example_app/app/helpers/textures_helper.js +3 -0
  230. data/spec/example_app/app/models/character.js +23 -0
  231. data/spec/example_app/app/models/door.js +10 -0
  232. data/spec/example_app/app/models/scene.js +19 -0
  233. data/spec/example_app/app/resources/characters/judge.yml +3 -0
  234. data/spec/example_app/app/resources/doors/courthouse_door.yml +5 -0
  235. data/spec/example_app/app/resources/light_sources/directional_light.yml +13 -0
  236. data/spec/example_app/app/resources/light_sources/point_light.yml +31 -0
  237. data/spec/example_app/app/resources/light_sources/spot_light.yml +15 -0
  238. data/spec/example_app/app/resources/light_sources/sun.yml +7 -0
  239. data/spec/example_app/app/resources/light_sources/textures_point.yml +34 -0
  240. data/spec/example_app/app/resources/materials/bricks.yml +36 -0
  241. data/spec/example_app/app/resources/materials/lighting_with_shadows.yml +27 -0
  242. data/spec/example_app/app/resources/scenes/courthouse.yml +4 -0
  243. data/spec/example_app/app/views/courthouse/index.js +4 -0
  244. data/spec/example_app/app/views/lighting/index.js +4 -0
  245. data/spec/example_app/app/views/shadows/index.js +6 -0
  246. data/spec/example_app/app/views/textures/index.js +4 -0
  247. data/spec/example_app/config/application.rb +6 -0
  248. data/spec/example_app/config/boot.rb +13 -0
  249. data/spec/example_app/config/routes.rb +6 -0
  250. data/spec/example_app/public/images/185__normalmap.png +0 -0
  251. data/spec/example_app/public/images/face_norm.jpg +0 -0
  252. data/spec/example_app/public/images/rock.png +0 -0
  253. data/spec/example_app/public/images/rockNormal.png +0 -0
  254. data/spec/example_app/public/images/rss.png +0 -0
  255. data/spec/example_app/public/webgl_not_supported.html +26 -0
  256. data/spec/example_app/script/jax +7 -0
  257. data/spec/example_app/spec/javascripts/controllers/textures_controller_spec.js +11 -0
  258. data/spec/example_app/spec/javascripts/helpers/application_helper_spec.js +12 -0
  259. data/spec/example_app/spec/javascripts/resources/directional_light_spec.js +16 -0
  260. data/spec/example_app/spec/javascripts/resources/point_light_spec.js +17 -0
  261. data/spec/example_app/spec/javascripts/resources/spot_light_spec.js +18 -0
  262. data/spec/example_app/spec/javascripts/support/jasmine.yml +89 -0
  263. data/spec/example_app/spec/javascripts/support/jasmine_runner.rb +32 -0
  264. data/spec/example_app/spec/javascripts/support/spec_helpers/jax_spec_helper.js +93 -0
  265. data/spec/example_app/spec/javascripts/support/spec_layout.html.erb +84 -0
  266. data/spec/generators/app_generator_spec.rb +46 -0
  267. data/spec/generators/controller_generator_spec.rb +68 -0
  268. data/spec/generators/light_generator_spec.rb +51 -0
  269. data/spec/generators/material_generator_spec.rb +35 -0
  270. data/spec/generators/model_generator_spec.rb +43 -0
  271. data/spec/javascripts/Player.js +58 -0
  272. data/spec/javascripts/helpers/SpecHelper.js +216 -0
  273. data/spec/javascripts/jax/builtin/materials/core_materials_spec.js +41 -0
  274. data/spec/javascripts/jax/builtin/materials/dual_paraboloid_spec.js +37 -0
  275. data/spec/javascripts/jax/builtin/materials/fog_spec.js +19 -0
  276. data/spec/javascripts/jax/builtin/materials/lighting_spec.js +19 -0
  277. data/spec/javascripts/jax/builtin/materials/normal_map_spec.js +19 -0
  278. data/spec/javascripts/jax/builtin/materials/shadow_map_spec.js +19 -0
  279. data/spec/javascripts/jax/builtin/materials/texture_spec.js +19 -0
  280. data/spec/javascripts/jax/builtin/meshes/cube_spec.js +10 -0
  281. data/spec/javascripts/jax/builtin/meshes/plane_spec.js +8 -0
  282. data/spec/javascripts/jax/builtin/meshes/quad_spec.js +8 -0
  283. data/spec/javascripts/jax/builtin/meshes/sphere_spec.js +8 -0
  284. data/spec/javascripts/jax/builtin/meshes/teapot_spec.js +8 -0
  285. data/spec/javascripts/jax/builtin/meshes/torus_spec.js +8 -0
  286. data/spec/javascripts/jax/compatibility_spec.js +50 -0
  287. data/spec/javascripts/jax/context_spec.js +82 -0
  288. data/spec/javascripts/jax/controller_spec.js +145 -0
  289. data/spec/javascripts/jax/core/delegation_spec.js +48 -0
  290. data/spec/javascripts/jax/core/events_spec.js +17 -0
  291. data/spec/javascripts/jax/core/matrix_stack_spec.js +28 -0
  292. data/spec/javascripts/jax/core/utils_spec.js +256 -0
  293. data/spec/javascripts/jax/helper_spec.js +33 -0
  294. data/spec/javascripts/jax/model_spec.js +87 -0
  295. data/spec/javascripts/jax/optimizations/material_limitations_spec.js +87 -0
  296. data/spec/javascripts/jax/optimizations/shaders/basic_spec.js +68 -0
  297. data/spec/javascripts/jax/prototype/extensions_spec.js +34 -0
  298. data/spec/javascripts/jax/route_set_spec.js +67 -0
  299. data/spec/javascripts/jax/view_manager_spec.js +17 -0
  300. data/spec/javascripts/jax/webgl/camera_spec.js +159 -0
  301. data/spec/javascripts/jax/webgl/framebuffer_spec.js +46 -0
  302. data/spec/javascripts/jax/webgl/lighting_spec.js +61 -0
  303. data/spec/javascripts/jax/webgl/material_spec.js +118 -0
  304. data/spec/javascripts/jax/webgl/mesh_spec.js +86 -0
  305. data/spec/javascripts/jax/webgl/shader/manifest_spec.js +60 -0
  306. data/spec/javascripts/jax/webgl/shader_chain_spec.js +192 -0
  307. data/spec/javascripts/jax/webgl/shader_spec.js +276 -0
  308. data/spec/javascripts/jax/webgl/tangent_space_spec.js +142 -0
  309. data/spec/javascripts/jax/webgl/texture_spec.js +162 -0
  310. data/spec/javascripts/jax/webgl_spec.js +5 -0
  311. data/spec/javascripts/jax/world_spec.js +88 -0
  312. data/spec/javascripts/jax_spec.js +27 -0
  313. data/spec/javascripts/support/jasmine.yml +85 -0
  314. data/spec/javascripts/support/jasmine_runner.rb +32 -0
  315. data/spec/lib/jax/routes_spec.rb +24 -0
  316. data/spec/lib/jax/shader_spec.rb +57 -0
  317. data/spec/lib/jax/tasks/jax_rake_spec.rb +79 -0
  318. data/spec/spec_helper.rb +11 -0
  319. data/spec/support/file_exist_matcher.rb +23 -0
  320. data/spec/support/spec_shell.rb +97 -0
  321. data/src/jax.js +84 -0
  322. data/src/jax/anim_frame.js +47 -0
  323. data/src/jax/builtin/all.js +7 -0
  324. data/src/jax/builtin/meshes/cube.js +62 -0
  325. data/src/jax/builtin/meshes/plane.js +36 -0
  326. data/src/jax/builtin/meshes/quad.js +80 -0
  327. data/src/jax/builtin/meshes/sphere.js +46 -0
  328. data/src/jax/builtin/meshes/teapot.js +38 -0
  329. data/src/jax/builtin/meshes/torus.js +46 -0
  330. data/src/jax/compatibility.js +140 -0
  331. data/src/jax/context.js +253 -0
  332. data/src/jax/controller.js +157 -0
  333. data/src/jax/core.js +39 -0
  334. data/src/jax/core/math.js +40 -0
  335. data/src/jax/core/matrix_stack.js +306 -0
  336. data/src/jax/core/util.js +226 -0
  337. data/src/jax/events.js +179 -0
  338. data/src/jax/geometry.js +3 -0
  339. data/src/jax/geometry/plane.js +59 -0
  340. data/src/jax/helper.js +8 -0
  341. data/src/jax/model.js +163 -0
  342. data/src/jax/prototype/class.js +78 -0
  343. data/src/jax/prototype/core.js +112 -0
  344. data/src/jax/prototype/extensions.js +124 -0
  345. data/src/jax/route_set.js +125 -0
  346. data/src/jax/vendor/ejs.js +4 -0
  347. data/src/jax/vendor/glMatrix.js +3 -0
  348. data/src/jax/view.js +37 -0
  349. data/src/jax/view_manager.js +46 -0
  350. data/src/jax/webgl.js +98 -0
  351. data/src/jax/webgl/camera.js +526 -0
  352. data/src/jax/webgl/core.js +6 -0
  353. data/src/jax/webgl/core/buffer.js +161 -0
  354. data/src/jax/webgl/core/edge.js +6 -0
  355. data/src/jax/webgl/core/events.js +25 -0
  356. data/src/jax/webgl/core/face.js +8 -0
  357. data/src/jax/webgl/core/framebuffer.js +206 -0
  358. data/src/jax/webgl/material.js +375 -0
  359. data/src/jax/webgl/mesh.js +412 -0
  360. data/src/jax/webgl/scene.js +11 -0
  361. data/src/jax/webgl/scene/frustum.js +260 -0
  362. data/src/jax/webgl/scene/light_manager.js +112 -0
  363. data/src/jax/webgl/scene/light_source.js +248 -0
  364. data/src/jax/webgl/shader.js +282 -0
  365. data/src/jax/webgl/shader/delegator.js +13 -0
  366. data/src/jax/webgl/shader/delegator/attribute.js +53 -0
  367. data/src/jax/webgl/shader/delegator/uniform.js +71 -0
  368. data/src/jax/webgl/shader/manifest.js +64 -0
  369. data/src/jax/webgl/shader/program.js +140 -0
  370. data/src/jax/webgl/shader_chain.js +256 -0
  371. data/src/jax/webgl/texture.js +312 -0
  372. data/src/jax/webgl/world.js +119 -0
  373. data/vendor/ejs/.svn/all-wcprops +17 -0
  374. data/vendor/ejs/.svn/entries +114 -0
  375. data/vendor/ejs/.svn/text-base/Eratta.txt.svn-base +3 -0
  376. data/vendor/ejs/.svn/text-base/license.txt.svn-base +21 -0
  377. data/vendor/ejs/Eratta.txt +3 -0
  378. data/vendor/ejs/example/.svn/all-wcprops +29 -0
  379. data/vendor/ejs/example/.svn/entries +164 -0
  380. data/vendor/ejs/example/.svn/prop-base/ejs.gif.svn-base +5 -0
  381. data/vendor/ejs/example/.svn/text-base/demo.html.svn-base +54 -0
  382. data/vendor/ejs/example/.svn/text-base/ejs.gif.svn-base +0 -0
  383. data/vendor/ejs/example/.svn/text-base/example.css.svn-base +31 -0
  384. data/vendor/ejs/example/.svn/text-base/example.js.svn-base +88 -0
  385. data/vendor/ejs/example/demo.html +54 -0
  386. data/vendor/ejs/example/ejs.gif +0 -0
  387. data/vendor/ejs/example/example.css +31 -0
  388. data/vendor/ejs/example/example.js +88 -0
  389. data/vendor/ejs/lib/.svn/all-wcprops +11 -0
  390. data/vendor/ejs/lib/.svn/entries +62 -0
  391. data/vendor/ejs/lib/.svn/text-base/ejs_fulljslint.js.svn-base +3774 -0
  392. data/vendor/ejs/lib/ejs_fulljslint.js +3774 -0
  393. data/vendor/ejs/license.txt +21 -0
  394. data/vendor/ejs/script/.svn/all-wcprops +17 -0
  395. data/vendor/ejs/script/.svn/entries +96 -0
  396. data/vendor/ejs/script/.svn/prop-base/yuicompressor-2.2.4.jar.svn-base +5 -0
  397. data/vendor/ejs/script/.svn/text-base/production.bat.svn-base +4 -0
  398. data/vendor/ejs/script/.svn/text-base/yuicompressor-2.2.4.jar.svn-base +0 -0
  399. data/vendor/ejs/script/production.bat +4 -0
  400. data/vendor/ejs/script/yuicompressor-2.2.4.jar +0 -0
  401. data/vendor/ejs/src/.svn/all-wcprops +17 -0
  402. data/vendor/ejs/src/.svn/entries +96 -0
  403. data/vendor/ejs/src/.svn/text-base/ejs.js.svn-base +505 -0
  404. data/vendor/ejs/src/.svn/text-base/view.js.svn-base +200 -0
  405. data/vendor/ejs/src/ejs.js +505 -0
  406. data/vendor/ejs/src/view.js +200 -0
  407. data/vendor/ejs/test/.svn/all-wcprops +23 -0
  408. data/vendor/ejs/test/.svn/entries +139 -0
  409. data/vendor/ejs/test/.svn/text-base/index.html.svn-base +18 -0
  410. data/vendor/ejs/test/.svn/text-base/setup_test.html.svn-base +44 -0
  411. data/vendor/ejs/test/.svn/text-base/sidebar.html.svn-base +28 -0
  412. data/vendor/ejs/test/included/.svn/all-wcprops +23 -0
  413. data/vendor/ejs/test/included/.svn/entries +130 -0
  414. data/vendor/ejs/test/included/.svn/text-base/prototype.js.svn-base +4184 -0
  415. data/vendor/ejs/test/included/.svn/text-base/test.css.svn-base +44 -0
  416. data/vendor/ejs/test/included/.svn/text-base/unittest.js.svn-base +564 -0
  417. data/vendor/ejs/test/included/prototype.js +4184 -0
  418. data/vendor/ejs/test/included/test.css +44 -0
  419. data/vendor/ejs/test/included/unittest.js +564 -0
  420. data/vendor/ejs/test/index.html +18 -0
  421. data/vendor/ejs/test/setup_test.html +44 -0
  422. data/vendor/ejs/test/sidebar.html +28 -0
  423. data/vendor/ejs/test/templates/.svn/all-wcprops +11 -0
  424. data/vendor/ejs/test/templates/.svn/entries +62 -0
  425. data/vendor/ejs/test/templates/.svn/text-base/test.ejs.svn-base +3 -0
  426. data/vendor/ejs/test/templates/test.ejs +3 -0
  427. data/vendor/ejs/test/tests/.svn/all-wcprops +23 -0
  428. data/vendor/ejs/test/tests/.svn/entries +130 -0
  429. data/vendor/ejs/test/tests/.svn/text-base/rendering.js.svn-base +94 -0
  430. data/vendor/ejs/test/tests/.svn/text-base/templating.js.svn-base +43 -0
  431. data/vendor/ejs/test/tests/.svn/text-base/views.js.svn-base +100 -0
  432. data/vendor/ejs/test/tests/rendering.js +94 -0
  433. data/vendor/ejs/test/tests/templating.js +43 -0
  434. data/vendor/ejs/test/tests/views.js +100 -0
  435. data/vendor/glmatrix/benchmark/js/CanvasMatrix.js +722 -0
  436. data/vendor/glmatrix/benchmark/js/EWGL_math.js +742 -0
  437. data/vendor/glmatrix/benchmark/js/mjs.js +1230 -0
  438. data/vendor/glmatrix/benchmark/matrix_benchmark.html +419 -0
  439. data/vendor/glmatrix/glMatrix-min.js +32 -0
  440. data/vendor/glmatrix/glMatrix.js +1815 -0
  441. data/vendor/glmatrix/unit tests/glMatrix-test.js +74 -0
  442. data/vendor/glmatrix/unit tests/qunit.css +119 -0
  443. data/vendor/glmatrix/unit tests/qunit.js +1069 -0
  444. data/vendor/glmatrix/unit tests/test_glMatrix.html +21 -0
  445. data/vendor/yuicompressor-2.4.2.jar +0 -0
  446. metadata +748 -0
@@ -0,0 +1,5 @@
1
+ Usage:
2
+ jax generate model NAME
3
+
4
+ Generates a new model, a test file, and a default resource file for it.
5
+
@@ -0,0 +1,42 @@
1
+ require 'active_support/core_ext'
2
+
3
+ module Jax
4
+ module Generators
5
+ module Model
6
+ class ModelGenerator < Jax::Generators::Command
7
+ include Thor::Actions
8
+ argument :model_name
9
+
10
+ def self.source_root
11
+ File.expand_path("templates", File.dirname(__FILE__))
12
+ end
13
+
14
+ def source
15
+ template 'model.js.tt', File.join("app/models", "#{file_name}.js")
16
+ end
17
+
18
+ def test
19
+ template 'test.js.tt', File.join('spec/javascripts/models', "#{file_name}_spec.js")
20
+ end
21
+
22
+ def resources
23
+ # empty_directory File.join("app", "resources", plural_name)
24
+ create_file File.join("app", "resources", plural_name, "default.yml"), "# default attribute values\n# (these will apply to all #{plural_name})"
25
+ end
26
+
27
+ protected
28
+ def file_name
29
+ model_name.underscore
30
+ end
31
+
32
+ def class_name
33
+ model_name.camelize
34
+ end
35
+
36
+ def plural_name
37
+ model_name.pluralize
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,11 @@
1
+ /**
2
+ * class <%=class_name%> < Jax.Model
3
+ *
4
+ **/
5
+ var <%=class_name%> = (function() {
6
+ return Jax.Model.create({
7
+ after_initialize: function() {
8
+
9
+ }
10
+ });
11
+ })();
@@ -0,0 +1,11 @@
1
+ describe("<%=class_name%>", function() {
2
+ var model;
3
+
4
+ beforeEach(function() {
5
+ model = new <%=class_name%>();
6
+ });
7
+
8
+ it("does something", function() {
9
+ expect(1).toEqual(1);
10
+ });
11
+ });
@@ -0,0 +1,32 @@
1
+ require 'pathname'
2
+
3
+ module Jax
4
+ module Generators
5
+ # Shamelessly lifted from Ruby on Rails
6
+ module ScriptJaxLoader
7
+ RUBY = File.join(*RbConfig::CONFIG.values_at("bindir", "ruby_install_name")) + RbConfig::CONFIG["EXEEXT"]
8
+ SCRIPT_JAX = File.join('script', 'jax')
9
+
10
+ def self.exec_script_jax!
11
+ cwd = Dir.pwd
12
+ return unless in_jax_application? || in_jax_application_subdirectory?
13
+ exec RUBY, SCRIPT_JAX, *ARGV if in_jax_application?
14
+ Dir.chdir("..") do
15
+ # Recurse in a chdir block: if the search fails we want to be sure
16
+ # the application is generated in the original working directory.
17
+ exec_script_jax! unless cwd == Dir.pwd
18
+ end
19
+ rescue SystemCallError
20
+ # could not chdir, no problem just return
21
+ end
22
+
23
+ def self.in_jax_application?
24
+ File.exists?(SCRIPT_JAX)
25
+ end
26
+
27
+ def self.in_jax_application_subdirectory?(path = Pathname.new(Dir.pwd))
28
+ File.exists?(File.join(path, SCRIPT_JAX)) || !path.root? && in_jax_application_subdirectory?(path.parent)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,3 @@
1
+ require 'jasmine'
2
+ require File.expand_path("jasmine/server", File.dirname(__FILE__))
3
+ require File.expand_path("jasmine/config", File.dirname(__FILE__))
@@ -0,0 +1,21 @@
1
+ module Jasmine
2
+ class Config
3
+ # overridden so that we can map source files separately from /public
4
+ def src_files
5
+ if simple_config['src_files']
6
+ match_files(src_dir, simple_config['src_files']).collect { |f| File.join("__src__", f) }
7
+ else
8
+ []
9
+ end
10
+ end
11
+
12
+ # new, used by overridden 'server.rb' so that we can map /public to root
13
+ def root_dir
14
+ if simple_config['root_dir']
15
+ File.join project_root, simple_config['root_dir']
16
+ else
17
+ project_root
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,50 @@
1
+ module Jasmine
2
+ class RunAdapter
3
+ alias _run run
4
+ # overridden method so that we can use a custom html file
5
+ #noinspection RubyUnusedLocalVariable
6
+ def run(focused_suite = nil)
7
+ # regenerate volatile files
8
+ Rake::Task['compile'].execute if $JAX_DEVELOPMENT # rebuild jax itself if we're in gem development
9
+ Rake::Task['jax:generate_files'].execute if !$JAX_RAKE # rebuild the project resources, routes, etc
10
+
11
+ custom_file = Jax.root && Jax.root.join("spec/javascripts/support/spec_layout.html.erb")
12
+ return _run(focused_suite) if !custom_file || !File.file?(custom_file)
13
+
14
+ jasmine_files = @jasmine_files
15
+ css_files = @jasmine_stylesheets + (@config.css_files || [])
16
+ js_files = @config.js_files(focused_suite)
17
+ body = ERB.new(File.read(custom_file)).result(binding)
18
+ [
19
+ 200,
20
+ { 'Content-Type' => 'text/html' },
21
+ [body]
22
+ ]
23
+ end
24
+ end
25
+
26
+ # overridden so that we can map source files separately from /public
27
+ def self.app(config)
28
+ Rack::Builder.app do
29
+ use Rack::Head
30
+
31
+ map("/run.html") { run Jasmine::Redirect.new('/') }
32
+ map("/__suite__") { run Jasmine::FocusedSuite.new(config) }
33
+
34
+ map("/__JASMINE_ROOT__") { run Rack::File.new(Jasmine.root) }
35
+ map(config.spec_path) { run Rack::File.new(config.spec_dir) }
36
+ map(config.root_path) { run Rack::File.new(config.project_root) }
37
+
38
+ map '/' do
39
+ run Rack::Cascade.new([
40
+ Rack::URLMap.new(
41
+ '/' => Rack::File.new(config.root_dir),
42
+ '/__src__' => Rack::File.new(config.src_dir)
43
+ ),
44
+
45
+ Jasmine::RunAdapter.new(config)
46
+ ])
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,58 @@
1
+ require 'sprockets'
2
+
3
+ class Jax::Packager
4
+ attr_reader :pkg_path, :path, :project
5
+ autoload :SprocketsTemplate, File.join(File.dirname(__FILE__), "packager/sprockets_template")
6
+
7
+ class << self
8
+ def invoke
9
+ pkg_dir = Jax.root.join("pkg")
10
+ rm_rf pkg_dir
11
+
12
+ package = new pkg_dir
13
+ puts package.project.template
14
+
15
+ package.build!
16
+
17
+ puts
18
+ puts "Build complete! Package is available at: "
19
+ puts " #{package.pkg_path}"
20
+ puts
21
+ end
22
+ end
23
+
24
+ def build!
25
+ @secretary.preprocessor.require(project)
26
+
27
+ mkdir_p File.dirname(@path)
28
+ @secretary.concatenation.save_to @path
29
+
30
+ file = File.open(@path, "a")
31
+ Jax.application.shaders.each { |shader| shader.save_to file }
32
+ Jax::ResourceCompiler.new.save(file)
33
+ Jax.application.routes.compile(file)
34
+
35
+ file.close
36
+
37
+ @secretary.install_assets
38
+ end
39
+
40
+ def initialize(pkg_path)
41
+ @pkg_path = pkg_path
42
+ @manifest = []
43
+
44
+ @path = File.join(@pkg_path, "javascripts/#{Jax.application.class.name.underscore}.js")
45
+ @secretary = Sprockets::Secretary.new(
46
+ :root => Jax.root,
47
+ :asset_root => @pkg_path.to_s,
48
+ :load_path => [Jax.root.to_s],
49
+ :source_files => []
50
+ )
51
+ @project = Jax::Packager::SprocketsTemplate.new(@secretary.environment)
52
+ end
53
+
54
+ private
55
+ def localized_path(fi)
56
+ fi.gsub(/^#{Regexp::escape Jax.root.to_s}[\/\\]?/, '')
57
+ end
58
+ end
@@ -0,0 +1,49 @@
1
+ class Jax::Packager::SprocketsTemplate < Sprockets::SourceFile
2
+ def initialize(environment)
3
+ pathname = environment.pathname_from(File.join(Jax.root, "template.js"))
4
+ super(environment, pathname)
5
+ end
6
+
7
+ def template
8
+ @template ||= begin
9
+ template = [
10
+ 'Jax.environment = Jax.PRODUCTION;',
11
+ '',
12
+ '//= provide "public/"',
13
+ ''
14
+ ]
15
+ Dir[Jax.root.join("app/**/*.js")].each do |jsfi|
16
+ if File.file?(jsfi)
17
+ relative_path = jsfi.sub(/^#{Regexp::escape Jax.root.to_s}[\/\\]?/, '')
18
+ template << "//= require \"#{relative_path}\""
19
+ end
20
+ end
21
+ template
22
+ end
23
+ end
24
+
25
+ def source_lines
26
+ # basically the same as super but with a string instead of a file
27
+ # TODO would templating be a worthy addition to Sprockets itself?
28
+ @lines ||= begin
29
+ lines = []
30
+ comments = []
31
+
32
+ template.each_with_index do |line, lineno|
33
+ lines << line = Sprockets::SourceLine.new(self, line, lineno+1)
34
+ if line.begins_pdoc_comment? || comments.any?
35
+ comments << line
36
+ end
37
+
38
+ if line.ends_multiline_comment?
39
+ if line.ends_pdoc_comment?
40
+ comments.each { |l| l.comment! }
41
+ end
42
+ comments.clear
43
+ end
44
+ end
45
+
46
+ lines
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,50 @@
1
+ class Jax::ResourceCompiler
2
+ def save(destination_file)
3
+ resources = gather_resources
4
+
5
+ if destination_file.kind_of?(IO)
6
+ save_resources destination_file, resources
7
+ else
8
+ mkdir_p File.dirname(destination_file)
9
+ File.open destination_file, "w" do |f|
10
+ save_resources f, resources
11
+ end
12
+ end
13
+ end
14
+
15
+ private
16
+ def save_resources(io, resources)
17
+ resources.each do |model_name, instances|
18
+ io.puts "#{model_name.camelize}.addResources(#{instances.to_json});"
19
+ end
20
+ end
21
+
22
+ def gather_resources
23
+ Dir[Jax.root.join("app/resources/**/*.yml")].inject({}) do |resources, yml|
24
+ model_name = File.basename(File.dirname(yml)).singularize
25
+ resource_id = File.basename(yml).sub(/^(.*)\..*$/, '\1')
26
+ hash = YAML::load(File.read(yml)) || {}
27
+
28
+ resources[model_name] ||= {}
29
+ resources[model_name].merge!({ resource_id => hash })
30
+ resources
31
+ end
32
+ end
33
+
34
+ # Camelizes the keys in this hash, except the first character,
35
+ # following the JavaScript variable naming conventions.
36
+ #
37
+ # If the camelized key already exists, no change is made.
38
+ def camelize_keys(hash)
39
+ hash.keys.each do |key|
40
+ camelized = key.gsub(/[_\-](.)/) { |m| $~[1].upcase }
41
+ unless hash.key?(camelized)
42
+ value = hash[camelized] = hash.delete(key)
43
+ if value.kind_of?(Hash)
44
+ camelize_keys(value)
45
+ end
46
+ end
47
+ end
48
+ hash
49
+ end
50
+ end
@@ -0,0 +1,61 @@
1
+ require 'active_support/core_ext'
2
+
3
+ module Jax
4
+ class Routes
5
+ def map(*args, &block)
6
+ if block_given?
7
+ instance_eval &block
8
+ else
9
+ if !args.empty?
10
+ @map ||= []
11
+ case args.length
12
+ when 1 then args.push(args[0], "index")
13
+ when 2 then args.push("index")
14
+ when 3 then ;
15
+ else raise ArgumentError, "expected #map(path, controller_name[, action_name]), got #{args.inspect}"
16
+ end
17
+ @map << args
18
+ end
19
+ end
20
+ @map
21
+ end
22
+
23
+ def compile(outfile)
24
+ if root
25
+ outfile.puts "Jax.routes.root(#{controller_name_for(root[0])}, #{root[1].inspect});"
26
+ end
27
+ map && map.each do |set|
28
+ path = set[0]
29
+ args = set[2..-1].collect { |s| s.inspect }.join(",")
30
+
31
+ outfile.puts "Jax.routes.map(#{path.inspect}, #{controller_name_for(set[1])}, #{args});"
32
+ end
33
+ end
34
+
35
+ def root(controller = nil, action = 'index')
36
+ if controller
37
+ @root = [controller, action]
38
+ end
39
+ @root
40
+ end
41
+
42
+ def reload!
43
+ load File.join(Jax.root, "config/routes.rb")
44
+ end
45
+
46
+ private
47
+ def controller_name_for(str)
48
+ ctrlr = str.to_s.camelize
49
+ ctrlr.sub! /^(.*)?::.*$/, '\1'
50
+ ctrlr = "#{ctrlr}Controller" unless ctrlr['Controller']
51
+ ctrlr
52
+ end
53
+
54
+ class << self
55
+ def load!
56
+ @loaded = true
57
+ require File.join(Jax.root, "config/routes.rb")
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,158 @@
1
+ class Jax::Shader
2
+ attr_reader :common, :fragment, :vertex
3
+ attr_accessor :name, :path, :exports, :manifest
4
+
5
+ def initialize(path, name = File.basename(path))
6
+ @exports = {}
7
+ @name = name
8
+ @path = path
9
+
10
+ detect_sources
11
+ end
12
+
13
+ def description
14
+ manifest && manifest['description']
15
+ end
16
+
17
+ def to_s
18
+ "Jax.shaders['#{name}'] = new Jax.Shader(#{js_options.gsub(/<%/, '<%')});"
19
+ end
20
+
21
+ def default_options
22
+ manifest && manifest['options'] || {}
23
+ end
24
+
25
+ def save_to(file_or_filename)
26
+ if file_or_filename.kind_of?(String)
27
+ File.open(filename, "w") { |f| f.puts to_s }
28
+ else file_or_filename.puts to_s
29
+ end
30
+ end
31
+
32
+ class << self
33
+ def from(path)
34
+ raise ArgumentError, "Expected path to be a directory" unless File.directory? path
35
+ new(path)
36
+ end
37
+ end
38
+
39
+ def common=(str)
40
+ @common = preprocess(str).inspect
41
+ end
42
+
43
+ def fragment=(str)
44
+ @fragment = preprocess(str).inspect
45
+ end
46
+
47
+ def vertex=(str)
48
+ @vertex = preprocess(str).inspect
49
+ end
50
+
51
+ def preprocess(str)
52
+ include_dependencies str
53
+ intercept_export_directives str
54
+ # intercept_import_directives str
55
+ # prepend_export_definitions str
56
+
57
+ str
58
+ end
59
+
60
+ private
61
+ def detect_sources
62
+ detect_ejs
63
+ detect_manifest
64
+ end
65
+
66
+ def detect_manifest
67
+ if File.file?(file = File.join(path, "manifest.yml"))
68
+ yml = YAML::load(File.read(file))
69
+ @manifest = yml || {}
70
+ end
71
+ end
72
+
73
+ def detect_ejs
74
+ %w(common fragment vertex).each do |name|
75
+ if File.file?(file = File.join(path, "#{name}.ejs"))
76
+ send("#{name}=", File.read(file))
77
+ end
78
+ end
79
+ end
80
+
81
+ def intercept_import_directives(str)
82
+ str.gsub! /import\s*\(\s*([^\s]*)\s*\)/ do
83
+ export_name($~[1])
84
+ end
85
+ end
86
+
87
+ def prepend_export_definitions(str)
88
+ exports.each do |name, export|
89
+ str.insert 0, "#{export[:type]} #{name};\n"
90
+ end
91
+ end
92
+
93
+ def intercept_export_directives(str)
94
+ intercept_export_directives_with_assignment(str)
95
+ intercept_export_directives_without_assignment(str)
96
+ end
97
+
98
+ def intercept_export_directives_without_assignment(str)
99
+ str.gsub! /export\s*\(\s*([^\s]*),\s*([^\s]*)\s*\);?/ do |match|
100
+ export $~[1], $~[2]
101
+ match # we'll do the rest on the JS side
102
+ end
103
+ end
104
+
105
+ def intercept_export_directives_with_assignment(str)
106
+ str.gsub! /export\s*\(\s*([^\s]*),\s*([^\s]*),\s*([^\s]*)\s*\);?/ do |match|
107
+ export $~[1], $~[2], $~[3]
108
+ match # we'll do the rest on the JS side
109
+ end
110
+ end
111
+
112
+ def export(type, name, value = name)
113
+ exports[name] ||= { :type => type, :value => value }
114
+ "#{exported_name(name)} = #{value};"
115
+ end
116
+
117
+ def include_dependencies(str)
118
+ # look for Sprockets-style require directives
119
+ str.gsub! /\/\/=\s*require\s*['"]([^'"]*)['"]/m do |sub|
120
+ filename = $~[1]
121
+ macro_name = "dependency_#{filename}".underscore.gsub(/[^a-zA-Z0-9_]/, '_')
122
+ <<-end_code
123
+ #ifndef #{macro_name}
124
+ #define #{macro_name}
125
+
126
+ #{File.read(File.join(path, "#{filename}.ejs"))}
127
+ #endif
128
+ end_code
129
+ end
130
+ end
131
+
132
+ def exported_name(name)
133
+ "_#{self.name}_#{name}"
134
+ end
135
+
136
+ def export_keys_as_js
137
+ "{" + exports.collect { |key,value| export_descriptor(key, value) }.join(",") + "}"
138
+ end
139
+
140
+ def export_descriptor(name, info)
141
+ "#{name.to_s.inspect}:#{info[:type].to_s.inspect}"
142
+ end
143
+
144
+ def js_options
145
+ result = "{"
146
+ %w(common fragment vertex).each do |segment|
147
+ data = send segment
148
+ if data
149
+ result += " #{segment}:#{data},\n"
150
+ end
151
+ end
152
+ result += "exports: #{export_keys_as_js},\n"
153
+ result += "name: #{name.inspect}"
154
+ result += "}"
155
+
156
+ result
157
+ end
158
+ end