/doc/symbols/src/src_Material.js.html

https://github.com/fossil/WebGLU · HTML · 218 lines · 218 code · 0 blank · 0 comment · 0 complexity · 5d5de6c2698cfb787888a8e979a147db MD5 · raw file

  1. <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"> <style>
  2. .KEYW {color: #933;}
  3. .COMM {color: #bbb; font-style: italic;}
  4. .NUMB {color: #393;}
  5. .STRN {color: #393;}
  6. .REGX {color: #339;}
  7. .line {border-right: 1px dotted #666; color: #666; font-style: normal;}
  8. </style></head><body><pre><span class='line'> 1</span> <span class="COMM">/** @ignore Wrapper function to allow multifile or single file organization */</span><span class="WHIT">
  9. <span class='line'> 2</span> </span><span class="NAME">$W.initMaterial</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  10. <span class='line'> 3</span>
  11. <span class='line'> 4</span> </span><span class="WHIT"> </span><span class="COMM">/* @class Creates a new material from the provided definition.
  12. <span class='line'> 5</span> * Definition is JS object (possibly loaded from JSON) in
  13. <span class='line'> 6</span> * the following format
  14. <span class='line'> 7</span> * {
  15. <span class='line'> 8</span> * name: "matName", // The name this material will be refered to by.
  16. <span class='line'> 9</span> * // Must be unique within this application
  17. <span class='line'> 10</span> *
  18. <span class='line'> 11</span> * program: {
  19. <span class='line'> 12</span> * name: "prgName", // If there already exists a shader program
  20. <span class='line'> 13</span> * // with this name, it will be used. Otherwise
  21. <span class='line'> 14</span> * // one will be created as defined here.
  22. <span class='line'> 15</span> * shaders: [ // List of shaders in this program.
  23. <span class='line'> 16</span> * // As with the program itself, if a shader with the
  24. <span class='line'> 17</span> * // given name already exists it will take precedence
  25. <span class='line'> 18</span> * // over creating a new shader.
  26. <span class='line'> 19</span> * {name: "FS", path: "FS.frag"},
  27. <span class='line'> 20</span> * {name: "VS", type: $W.GL.VERTEX_SHADER, source: "..."},
  28. <span class='line'> 21</span> * // etc.
  29. <span class='line'> 22</span> * ]
  30. <span class='line'> 23</span> * },
  31. <span class='line'> 24</span> *
  32. <span class='line'> 25</span> * textures: [
  33. <span class='line'> 26</span> * // type can be `Image`, `Video`, or `Canvas`
  34. <span class='line'> 27</span> * {name:"tex", type:"Image", path:"tex.jpg"},
  35. <span class='line'> 28</span> * // etc.
  36. <span class='line'> 29</span> * ]
  37. <span class='line'> 30</span> * }
  38. <span class='line'> 31</span> * or
  39. <span class='line'> 32</span> * {
  40. <span class='line'> 33</span> * path: "mat.json"
  41. <span class='line'> 34</span> * }
  42. <span class='line'> 35</span> * where mat.json is a file containing JSON in the first format
  43. <span class='line'> 36</span> */</span><span class="WHIT">
  44. <span class='line'> 37</span> </span><span class="WHIT"> </span><span class="NAME">$W.Material</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="PUNC">(</span><span class="NAME">materialDef</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  45. <span class='line'> 38</span>
  46. <span class='line'> 39</span> </span><span class="WHIT"> </span><span class="NAME">this.name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
  47. <span class='line'> 40</span> </span><span class="WHIT"> </span><span class="NAME">this.program</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
  48. <span class='line'> 41</span> </span><span class="WHIT"> </span><span class="NAME">this.uniforms</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
  49. <span class='line'> 42</span> </span><span class="WHIT"> </span><span class="NAME">this.attributes</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
  50. <span class='line'> 43</span> </span><span class="WHIT"> </span><span class="NAME">this.textures</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
  51. <span class='line'> 44</span> </span><span class="WHIT"> </span><span class="NAME">this.framebuffer</span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">;</span><span class="WHIT">
  52. <span class='line'> 45</span>
  53. <span class='line'> 46</span> </span><span class="WHIT"> </span><span class="NAME">this.setUniformAction</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">MAT_setUniformAction</span><span class="PUNC">(</span><span class="NAME">name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">action</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  54. <span class='line'> 47</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">uniform</span><span class="PUNC">;</span><span class="WHIT">
  55. <span class='line'> 48</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">this.uniforms.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  56. <span class='line'> 49</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">this.uniforms</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="NAME">name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  57. <span class='line'> 50</span> </span><span class="WHIT"> </span><span class="NAME">uniform</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.uniforms</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
  58. <span class='line'> 51</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  59. <span class='line'> 52</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  60. <span class='line'> 53</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">uniform</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="KEYW">null</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT"> </span><span class="WHIT">
  61. <span class='line'> 54</span> </span><span class="WHIT"> </span><span class="NAME">uniform.action</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">action</span><span class="PUNC">;</span><span class="WHIT">
  62. <span class='line'> 55</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  63. <span class='line'> 56</span> </span><span class="WHIT"> </span><span class="NAME">console.warn</span><span class="PUNC">(</span><span class="STRN">"Cannot set uniform action for nonexistant uniform `"</span><span class="PUNC">+</span><span class="WHIT">
  64. <span class='line'> 57</span> </span><span class="WHIT"> </span><span class="NAME">name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">"`"</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  65. <span class='line'> 58</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  66. <span class='line'> 59</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
  67. <span class='line'> 60</span>
  68. <span class='line'> 61</span> </span><span class="WHIT"> </span><span class="NAME">this.setupUniforms</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">MAT_setupUniforms</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  69. <span class='line'> 62</span> </span><span class="WHIT"> </span><span class="NAME">this.uniforms</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
  70. <span class='line'> 63</span> </span><span class="WHIT"> </span><span class="NAME">this.attributes</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
  71. <span class='line'> 64</span>
  72. <span class='line'> 65</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">this.program.uniforms.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  73. <span class='line'> 66</span> </span><span class="WHIT"> </span><span class="NAME">this.uniforms.push</span><span class="PUNC">(</span><span class="NAME">this.program.uniforms</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">.</span><span class="NAME">clone</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  74. <span class='line'> 67</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  75. <span class='line'> 68</span>
  76. <span class='line'> 69</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">this.program.attributes.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  77. <span class='line'> 70</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">attrib</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">this.program.attributes</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
  78. <span class='line'> 71</span>
  79. <span class='line'> 72</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">attrib.location</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="PUNC">-</span><span class="NUMB">1</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  80. <span class='line'> 73</span> </span><span class="WHIT"> </span><span class="NAME">this.attributes.push</span><span class="PUNC">(</span><span class="NAME">attrib.clone</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  81. <span class='line'> 74</span> </span><span class="WHIT"> </span><span class="NAME">$W.GL.enableVertexAttribArray</span><span class="PUNC">(</span><span class="NAME">attrib.location</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  82. <span class='line'> 75</span>
  83. <span class='line'> 76</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  84. <span class='line'> 77</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  85. <span class='line'> 78</span>
  86. <span class='line'> 79</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
  87. <span class='line'> 80</span>
  88. <span class='line'> 81</span> </span><span class="WHIT"> </span><span class="NAME">this.setupTextureUniforms</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">MAT_setupTextureUniforms</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  89. <span class='line'> 82</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">this.textures.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  90. <span class='line'> 83</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">action</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">genMultiTextureAction</span><span class="PUNC">(</span><span class="NAME">i</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  91. <span class='line'> 84</span> </span><span class="WHIT"> </span><span class="NAME">this.setUniformAction</span><span class="PUNC">(</span><span class="STRN">'wglu_mat_texture'</span><span class="PUNC">+</span><span class="NAME">i</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">action</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  92. <span class='line'> 85</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  93. <span class='line'> 86</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
  94. <span class='line'> 87</span>
  95. <span class='line'> 88</span> </span><span class="WHIT"> </span><span class="NAME">this.initFromDef</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">MAT_initFromDef</span><span class="PUNC">(</span><span class="NAME">matDef</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  96. <span class='line'> 89</span> </span><span class="WHIT"> </span><span class="COMM">// If we've been provided a path, use that file.</span><span class="WHIT">
  97. <span class='line'> 90</span> </span><span class="WHIT"> </span><span class="COMM">// Allow for name override.</span><span class="WHIT">
  98. <span class='line'> 91</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">matDef.path</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  99. <span class='line'> 92</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">matDef.name</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  100. <span class='line'> 93</span> </span><span class="WHIT"> </span><span class="NAME">this.name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">matDef.name</span><span class="PUNC">;</span><span class="WHIT">
  101. <span class='line'> 94</span> </span><span class="WHIT"> </span><span class="NAME">matDef</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$W.util.loadFileAsJSON</span><span class="PUNC">(</span><span class="NAME">matDef.path</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  102. <span class='line'> 95</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  103. <span class='line'> 96</span> </span><span class="WHIT"> </span><span class="NAME">matDef</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$W.util.loadFileAsJSON</span><span class="PUNC">(</span><span class="NAME">matDef.path</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  104. <span class='line'> 97</span> </span><span class="WHIT"> </span><span class="NAME">this.name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">matDef.name</span><span class="PUNC">;</span><span class="WHIT">
  105. <span class='line'> 98</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  106. <span class='line'> 99</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  107. <span class='line'>100</span> </span><span class="WHIT"> </span><span class="NAME">this.name</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">matDef.name</span><span class="PUNC">;</span><span class="WHIT">
  108. <span class='line'>101</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  109. <span class='line'>102</span>
  110. <span class='line'>103</span> </span><span class="WHIT"> </span><span class="NAME">$W.log</span><span class="PUNC">(</span><span class="NAME">matDef.name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  111. <span class='line'>104</span>
  112. <span class='line'>105</span> </span><span class="WHIT"> </span><span class="NAME">$W.log</span><span class="PUNC">(</span><span class="STRN">'creating material `'</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="NAME">this.name</span><span class="WHIT"> </span><span class="PUNC">+</span><span class="WHIT"> </span><span class="STRN">'`'</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  113. <span class='line'>106</span> </span><span class="WHIT"> </span><span class="NAME">$W.indentLog</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  114. <span class='line'>107</span>
  115. <span class='line'>108</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">initProgram</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">MAT_initProgram</span><span class="PUNC">(</span><span class="NAME">prgDef</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  116. <span class='line'>109</span> </span><span class="WHIT"> </span><span class="COMM">// If a program of the name specified in the material doesn't already</span><span class="WHIT">
  117. <span class='line'>110</span> </span><span class="WHIT"> </span><span class="COMM">// exist, create it with the specified parameters.</span><span class="WHIT">
  118. <span class='line'>111</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">program</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">$W.programs</span><span class="PUNC">[</span><span class="NAME">prgDef.name</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
  119. <span class='line'>112</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">program</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  120. <span class='line'>113</span>
  121. <span class='line'>114</span> </span><span class="WHIT"> </span><span class="NAME">program</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">$W.GLSL.ShaderProgram</span><span class="PUNC">(</span><span class="NAME">prgDef.name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  122. <span class='line'>115</span>
  123. <span class='line'>116</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">prgDef.shaders.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  124. <span class='line'>117</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">shaderDef</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">prgDef.shaders</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
  125. <span class='line'>118</span>
  126. <span class='line'>119</span> </span><span class="WHIT"> </span><span class="COMM">// Load shader from file</span><span class="WHIT">
  127. <span class='line'>120</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">shaderDef.path</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  128. <span class='line'>121</span> </span><span class="WHIT"> </span><span class="NAME">program.attachShader</span><span class="PUNC">(</span><span class="NAME">shaderDef.name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">shaderDef.path</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  129. <span class='line'>122</span>
  130. <span class='line'>123</span> </span><span class="WHIT"> </span><span class="COMM">// Load shader from source code</span><span class="WHIT">
  131. <span class='line'>124</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">shaderDef.source</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  132. <span class='line'>125</span> </span><span class="WHIT"> </span><span class="NAME">program.attachShader</span><span class="PUNC">(</span><span class="NAME">shaderDef.name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">shaderDef.source</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">shaderDef.type</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  133. <span class='line'>126</span>
  134. <span class='line'>127</span> </span><span class="WHIT"> </span><span class="COMM">// Load shader from embedded script</span><span class="WHIT">
  135. <span class='line'>128</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  136. <span class='line'>129</span> </span><span class="WHIT"> </span><span class="NAME">program.attachShader</span><span class="PUNC">(</span><span class="NAME">shaderDef.id</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  137. <span class='line'>130</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  138. <span class='line'>131</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  139. <span class='line'>132</span> </span><span class="WHIT"> </span><span class="NAME">program.use</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  140. <span class='line'>133</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  141. <span class='line'>134</span>
  142. <span class='line'>135</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">program</span><span class="WHIT">
  143. <span class='line'>136</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
  144. <span class='line'>137</span>
  145. <span class='line'>138</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">initTextures</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">function</span><span class="WHIT"> </span><span class="NAME">MAT_initTextures</span><span class="PUNC">(</span><span class="NAME">texDef</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  146. <span class='line'>139</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">textures</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="PUNC">[</span><span class="PUNC">]</span><span class="WHIT">
  147. <span class='line'>140</span>
  148. <span class='line'>141</span> </span><span class="WHIT"> </span><span class="COMM">// If textures specified in the material do not exist, create them.</span><span class="WHIT">
  149. <span class='line'>142</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">texDef</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">!==</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  150. <span class='line'>143</span> </span><span class="WHIT"> </span><span class="KEYW">for</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NUMB">0</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="WHIT"> </span><span class="PUNC">&lt;</span><span class="WHIT"> </span><span class="NAME">texDef.length</span><span class="PUNC">;</span><span class="WHIT"> </span><span class="NAME">i</span><span class="PUNC">++</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  151. <span class='line'>144</span> </span><span class="WHIT"> </span><span class="KEYW">var</span><span class="WHIT"> </span><span class="NAME">texture</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">texDef</span><span class="PUNC">[</span><span class="NAME">i</span><span class="PUNC">]</span><span class="PUNC">;</span><span class="WHIT">
  152. <span class='line'>145</span>
  153. <span class='line'>146</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="KEYW">typeof</span><span class="PUNC">(</span><span class="NAME">$W.textures</span><span class="PUNC">[</span><span class="NAME">texture.name</span><span class="PUNC">]</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">'undefined'</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  154. <span class='line'>147</span>
  155. <span class='line'>148</span> </span><span class="WHIT"> </span><span class="COMM">// type is Image, Canvas, or Video. this calls</span><span class="WHIT">
  156. <span class='line'>149</span> </span><span class="WHIT"> </span><span class="COMM">// ImageTexture, CanvasTexture or VideoTexture.</span><span class="WHIT">
  157. <span class='line'>150</span> </span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">texture.type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"Image"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  158. <span class='line'>151</span> </span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">$W.ImageTexture</span><span class="PUNC">(</span><span class="NAME">texture.name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">texture.path</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  159. <span class='line'>152</span>
  160. <span class='line'>153</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">texture.type</span><span class="WHIT"> </span><span class="PUNC">==</span><span class="WHIT"> </span><span class="STRN">"Canvas"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  161. <span class='line'>154</span> </span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">$W.CanvasTexture</span><span class="PUNC">(</span><span class="NAME">texDef.name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="WHIT">
  162. <span class='line'>155</span> </span><span class="WHIT"> </span><span class="NAME">document.getElementById</span><span class="PUNC">(</span><span class="NAME">texture.element_id</span><span class="PUNC">)</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  163. <span class='line'>156</span>
  164. <span class='line'>157</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="KEYW">else</span><span class="WHIT"> </span><span class="KEYW">if</span><span class="WHIT"> </span><span class="PUNC">(</span><span class="NAME">texture.type</span><span class="WHIT"> </span><span class="PUNC">===</span><span class="WHIT"> </span><span class="STRN">"Video"</span><span class="PUNC">)</span><span class="WHIT"> </span><span class="PUNC">{</span><span class="WHIT">
  165. <span class='line'>158</span> </span><span class="WHIT"> </span><span class="WHIT">
  166. <span class='line'>159</span> </span><span class="WHIT"> </span><span class="KEYW">new</span><span class="WHIT"> </span><span class="NAME">$W.VideoTexture</span><span class="PUNC">(</span><span class="NAME">texture.name</span><span class="PUNC">,</span><span class="WHIT"> </span><span class="NAME">texture.path</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  167. <span class='line'>160</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  168. <span class='line'>161</span>
  169. <span class='line'>162</span> </span><span class="WHIT"> </span><span class="NAME">textures.push</span><span class="PUNC">(</span><span class="NAME">texture.name</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  170. <span class='line'>163</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  171. <span class='line'>164</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  172. <span class='line'>165</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="WHIT">
  173. <span class='line'>166</span> </span><span class="WHIT"> </span><span class="KEYW">return</span><span class="WHIT"> </span><span class="NAME">textures</span><span class="WHIT">
  174. <span class='line'>167</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
  175. <span class='line'>168</span>
  176. <span class='line'>169</span> </span><span class="WHIT"> </span><span class="NAME">this.program</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">initProgram</span><span class="PUNC">(</span><span class="NAME">matDef.program</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  177. <span class='line'>170</span> </span><span class="WHIT"> </span><span class="NAME">this.setupUniforms</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  178. <span class='line'>171</span>
  179. <span class='line'>172</span> </span><span class="WHIT"> </span><span class="NAME">this.textures</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="NAME">initTextures</span><span class="PUNC">(</span><span class="NAME">matDef.textures</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  180. <span class='line'>173</span> </span><span class="WHIT"> </span><span class="NAME">this.setupTextureUniforms</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  181. <span class='line'>174</span>
  182. <span class='line'>175</span> </span><span class="WHIT"> </span><span class="NAME">$W.log</span><span class="PUNC">(</span><span class="KEYW">this</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  183. <span class='line'>176</span>
  184. <span class='line'>177</span> </span><span class="WHIT"> </span><span class="NAME">$W.dedentLog</span><span class="PUNC">(</span><span class="PUNC">)</span><span class="PUNC">;</span><span class="WHIT">
  185. <span class='line'>178</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
  186. <span class='line'>179</span>
  187. <span class='line'>180</span> </span><span class="WHIT"> </span><span class="NAME">this.initFromDef</span><span class="PUNC">(</span><span class="NAME">materialDef</span><span class="PUNC">)</span><span class="WHIT">
  188. <span class='line'>181</span>
  189. <span class='line'>182</span> </span><span class="WHIT"> </span><span class="NAME">$W.materials</span><span class="PUNC">[</span><span class="NAME">this.name</span><span class="PUNC">]</span><span class="WHIT"> </span><span class="PUNC">=</span><span class="WHIT"> </span><span class="KEYW">this</span><span class="PUNC">;</span><span class="WHIT">
  190. <span class='line'>183</span> </span><span class="WHIT"> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
  191. <span class='line'>184</span> </span><span class="PUNC">}</span><span class="PUNC">;</span><span class="WHIT">
  192. <span class='line'>185</span>
  193. <span class='line'>186</span> </span><span class="COMM">/** @author Benjamin DeLillo */</span><span class="WHIT">
  194. <span class='line'>187</span> </span><span class="COMM">/*
  195. <span class='line'>188</span> * Copyright (c) 2009-2010 Benjamin P. DeLillo
  196. <span class='line'>189</span> *
  197. <span class='line'>190</span> * Permission is hereby granted, free of charge, to any person
  198. <span class='line'>191</span> * obtaining a copy of this software and associated documentation
  199. <span class='line'>192</span> * files (the "Software"), to deal in the Software without
  200. <span class='line'>193</span> * restriction, including without limitation the rights to use,
  201. <span class='line'>194</span> * copy, modify, merge, publish, distribute, sublicense, and/or sell
  202. <span class='line'>195</span> * copies of the Software, and to permit persons to whom the
  203. <span class='line'>196</span> * Software is furnished to do so, subject to the following
  204. <span class='line'>197</span> * conditions:
  205. <span class='line'>198</span> *
  206. <span class='line'>199</span> * The above copyright notice and this permission notice shall be
  207. <span class='line'>200</span> * included in all copies or substantial portions of the Software.
  208. <span class='line'>201</span> *
  209. <span class='line'>202</span> * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  210. <span class='line'>203</span> * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
  211. <span class='line'>204</span> * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  212. <span class='line'>205</span> * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
  213. <span class='line'>206</span> * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
  214. <span class='line'>207</span> * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  215. <span class='line'>208</span> * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
  216. <span class='line'>209</span> * OTHER DEALINGS IN THE SOFTWARE.
  217. <span class='line'>210</span> */</span><span class="WHIT">
  218. <span class='line'>211</span> </span></pre></body></html>