dreemgl
Version:
DreemGL is an open-source multi-screen prototyping framework for mediated environments, with a visual editor and shader styling for webGL and DALi runtimes written in JavaScript. As a toolkit for gpu-accelerated multiscreen development, DreemGL includes
992 lines (927 loc) • 71.5 kB
HTML
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>CodeRay output</title>
<style type="text/css">
.CodeRay .line-numbers a {
text-decoration: inherit;
color: inherit;
}
body {
background-color: white;
padding: 0;
margin: 0;
}
.CodeRay {
background-color: hsl(0,0%,95%);
border: 1px solid silver;
color: black;
}
.CodeRay pre {
margin: 0px;
}
span.CodeRay { white-space: pre; border: 0px; padding: 2px; }
table.CodeRay { border-collapse: collapse; width: 100%; padding: 2px; }
table.CodeRay td { padding: 2px 4px; vertical-align: top; }
.CodeRay .line-numbers {
background-color: hsl(180,65%,90%);
color: gray;
text-align: right;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.CodeRay .line-numbers a {
background-color: hsl(180,65%,90%) !important;
color: gray !important;
text-decoration: none !important;
}
.CodeRay .line-numbers pre {
word-break: normal;
}
.CodeRay .line-numbers a:target { color: blue !important; }
.CodeRay .line-numbers .highlighted { color: red !important; }
.CodeRay .line-numbers .highlighted a { color: red !important; }
.CodeRay span.line-numbers { padding: 0px 4px; }
.CodeRay .line { display: block; float: left; width: 100%; }
.CodeRay .code { width: 100%; }
.CodeRay .debug { color: white !important; background: blue !important; }
.CodeRay .annotation { color:#007 }
.CodeRay .attribute-name { color:#b48 }
.CodeRay .attribute-value { color:#700 }
.CodeRay .binary { color:#549 }
.CodeRay .binary .char { color:#325 }
.CodeRay .binary .delimiter { color:#325 }
.CodeRay .char { color:#D20 }
.CodeRay .char .content { color:#D20 }
.CodeRay .char .delimiter { color:#710 }
.CodeRay .class { color:#B06; font-weight:bold }
.CodeRay .class-variable { color:#369 }
.CodeRay .color { color:#0A0 }
.CodeRay .comment { color:#777 }
.CodeRay .comment .char { color:#444 }
.CodeRay .comment .delimiter { color:#444 }
.CodeRay .constant { color:#036; font-weight:bold }
.CodeRay .decorator { color:#B0B }
.CodeRay .definition { color:#099; font-weight:bold }
.CodeRay .delimiter { color:black }
.CodeRay .directive { color:#088; font-weight:bold }
.CodeRay .docstring { color:#D42; }
.CodeRay .doctype { color:#34b }
.CodeRay .done { text-decoration: line-through; color: gray }
.CodeRay .entity { color:#800; font-weight:bold }
.CodeRay .error { color:#F00; background-color:#FAA }
.CodeRay .escape { color:#666 }
.CodeRay .exception { color:#C00; font-weight:bold }
.CodeRay .float { color:#60E }
.CodeRay .function { color:#06B; font-weight:bold }
.CodeRay .function .delimiter { color:#024; font-weight:bold }
.CodeRay .global-variable { color:#d70 }
.CodeRay .hex { color:#02b }
.CodeRay .id { color:#33D; font-weight:bold }
.CodeRay .include { color:#B44; font-weight:bold }
.CodeRay .inline { background-color: hsla(0,0%,0%,0.07); color: black }
.CodeRay .inline-delimiter { font-weight: bold; color: #666 }
.CodeRay .instance-variable { color:#33B }
.CodeRay .integer { color:#00D }
.CodeRay .imaginary { color:#f00 }
.CodeRay .important { color:#D00 }
.CodeRay .key { color: #606 }
.CodeRay .key .char { color: #60f }
.CodeRay .key .delimiter { color: #404 }
.CodeRay .keyword { color:#080; font-weight:bold }
.CodeRay .label { color:#970; font-weight:bold }
.CodeRay .local-variable { color:#950 }
.CodeRay .map .content { color:#808 }
.CodeRay .map .delimiter { color:#40A}
.CodeRay .map { background-color:hsla(200,100%,50%,0.06); }
.CodeRay .namespace { color:#707; font-weight:bold }
.CodeRay .octal { color:#40E }
.CodeRay .operator { }
.CodeRay .predefined { color:#369; font-weight:bold }
.CodeRay .predefined-constant { color:#069 }
.CodeRay .predefined-type { color:#0a8; font-weight:bold }
.CodeRay .preprocessor { color:#579 }
.CodeRay .pseudo-class { color:#00C; font-weight:bold }
.CodeRay .regexp { background-color:hsla(300,100%,50%,0.06); }
.CodeRay .regexp .content { color:#808 }
.CodeRay .regexp .delimiter { color:#404 }
.CodeRay .regexp .modifier { color:#C2C }
.CodeRay .reserved { color:#080; font-weight:bold }
.CodeRay .shell { background-color:hsla(120,100%,50%,0.06); }
.CodeRay .shell .content { color:#2B2 }
.CodeRay .shell .delimiter { color:#161 }
.CodeRay .string { background-color:hsla(0,100%,50%,0.05); }
.CodeRay .string .char { color: #b0b }
.CodeRay .string .content { color: #D20 }
.CodeRay .string .delimiter { color: #710 }
.CodeRay .string .modifier { color: #E40 }
.CodeRay .symbol { color:#A60 }
.CodeRay .symbol .content { color:#A60 }
.CodeRay .symbol .delimiter { color:#740 }
.CodeRay .tag { color:#070; font-weight:bold }
.CodeRay .type { color:#339; font-weight:bold }
.CodeRay .value { color: #088 }
.CodeRay .variable { color:#037 }
.CodeRay .insert { background: hsla(120,100%,50%,0.12) }
.CodeRay .delete { background: hsla(0,100%,50%,0.12) }
.CodeRay .change { color: #bbf; background: #007 }
.CodeRay .head { color: #f8f; background: #505 }
.CodeRay .head .filename { color: white; }
.CodeRay .delete .eyecatcher { background-color: hsla(0,100%,50%,0.2); border: 1px solid hsla(0,100%,45%,0.5); margin: -1px; border-bottom: none; border-top-left-radius: 5px; border-top-right-radius: 5px; }
.CodeRay .insert .eyecatcher { background-color: hsla(120,100%,50%,0.2); border: 1px solid hsla(120,100%,25%,0.5); margin: -1px; border-top: none; border-bottom-left-radius: 5px; border-bottom-right-radius: 5px; }
.CodeRay .insert .insert { color: #0c0; background:transparent; font-weight:bold }
.CodeRay .delete .delete { color: #c00; background:transparent; font-weight:bold }
.CodeRay .change .change { color: #88f }
.CodeRay .head .head { color: #f4f }
.CodeRay {
border: none;
}
</style>
</head>
<body>
<table class="CodeRay"><tr>
<td class="line-numbers"><pre><a href="#n1" name="n1">1</a>
<a href="#n2" name="n2">2</a>
<a href="#n3" name="n3">3</a>
<a href="#n4" name="n4">4</a>
<a href="#n5" name="n5">5</a>
<a href="#n6" name="n6">6</a>
<a href="#n7" name="n7">7</a>
<a href="#n8" name="n8">8</a>
<a href="#n9" name="n9">9</a>
<strong><a href="#n10" name="n10">10</a></strong>
<a href="#n11" name="n11">11</a>
<a href="#n12" name="n12">12</a>
<a href="#n13" name="n13">13</a>
<a href="#n14" name="n14">14</a>
<a href="#n15" name="n15">15</a>
<a href="#n16" name="n16">16</a>
<a href="#n17" name="n17">17</a>
<a href="#n18" name="n18">18</a>
<a href="#n19" name="n19">19</a>
<strong><a href="#n20" name="n20">20</a></strong>
<a href="#n21" name="n21">21</a>
<a href="#n22" name="n22">22</a>
<a href="#n23" name="n23">23</a>
<a href="#n24" name="n24">24</a>
<a href="#n25" name="n25">25</a>
<a href="#n26" name="n26">26</a>
<a href="#n27" name="n27">27</a>
<a href="#n28" name="n28">28</a>
<a href="#n29" name="n29">29</a>
<strong><a href="#n30" name="n30">30</a></strong>
<a href="#n31" name="n31">31</a>
<a href="#n32" name="n32">32</a>
<a href="#n33" name="n33">33</a>
<a href="#n34" name="n34">34</a>
<a href="#n35" name="n35">35</a>
<a href="#n36" name="n36">36</a>
<a href="#n37" name="n37">37</a>
<a href="#n38" name="n38">38</a>
<a href="#n39" name="n39">39</a>
<strong><a href="#n40" name="n40">40</a></strong>
<a href="#n41" name="n41">41</a>
<a href="#n42" name="n42">42</a>
<a href="#n43" name="n43">43</a>
<a href="#n44" name="n44">44</a>
<a href="#n45" name="n45">45</a>
<a href="#n46" name="n46">46</a>
<a href="#n47" name="n47">47</a>
<a href="#n48" name="n48">48</a>
<a href="#n49" name="n49">49</a>
<strong><a href="#n50" name="n50">50</a></strong>
<a href="#n51" name="n51">51</a>
<a href="#n52" name="n52">52</a>
<a href="#n53" name="n53">53</a>
<a href="#n54" name="n54">54</a>
<a href="#n55" name="n55">55</a>
<a href="#n56" name="n56">56</a>
<a href="#n57" name="n57">57</a>
<a href="#n58" name="n58">58</a>
<a href="#n59" name="n59">59</a>
<strong><a href="#n60" name="n60">60</a></strong>
<a href="#n61" name="n61">61</a>
<a href="#n62" name="n62">62</a>
<a href="#n63" name="n63">63</a>
<a href="#n64" name="n64">64</a>
<a href="#n65" name="n65">65</a>
<a href="#n66" name="n66">66</a>
<a href="#n67" name="n67">67</a>
<a href="#n68" name="n68">68</a>
<a href="#n69" name="n69">69</a>
<strong><a href="#n70" name="n70">70</a></strong>
<a href="#n71" name="n71">71</a>
<a href="#n72" name="n72">72</a>
<a href="#n73" name="n73">73</a>
<a href="#n74" name="n74">74</a>
<a href="#n75" name="n75">75</a>
<a href="#n76" name="n76">76</a>
<a href="#n77" name="n77">77</a>
<a href="#n78" name="n78">78</a>
<a href="#n79" name="n79">79</a>
<strong><a href="#n80" name="n80">80</a></strong>
<a href="#n81" name="n81">81</a>
<a href="#n82" name="n82">82</a>
<a href="#n83" name="n83">83</a>
<a href="#n84" name="n84">84</a>
<a href="#n85" name="n85">85</a>
<a href="#n86" name="n86">86</a>
<a href="#n87" name="n87">87</a>
<a href="#n88" name="n88">88</a>
<a href="#n89" name="n89">89</a>
<strong><a href="#n90" name="n90">90</a></strong>
<a href="#n91" name="n91">91</a>
<a href="#n92" name="n92">92</a>
<a href="#n93" name="n93">93</a>
<a href="#n94" name="n94">94</a>
<a href="#n95" name="n95">95</a>
<a href="#n96" name="n96">96</a>
<a href="#n97" name="n97">97</a>
<a href="#n98" name="n98">98</a>
<a href="#n99" name="n99">99</a>
<strong><a href="#n100" name="n100">100</a></strong>
<a href="#n101" name="n101">101</a>
<a href="#n102" name="n102">102</a>
<a href="#n103" name="n103">103</a>
<a href="#n104" name="n104">104</a>
<a href="#n105" name="n105">105</a>
<a href="#n106" name="n106">106</a>
<a href="#n107" name="n107">107</a>
<a href="#n108" name="n108">108</a>
<a href="#n109" name="n109">109</a>
<strong><a href="#n110" name="n110">110</a></strong>
<a href="#n111" name="n111">111</a>
<a href="#n112" name="n112">112</a>
<a href="#n113" name="n113">113</a>
<a href="#n114" name="n114">114</a>
<a href="#n115" name="n115">115</a>
<a href="#n116" name="n116">116</a>
<a href="#n117" name="n117">117</a>
<a href="#n118" name="n118">118</a>
<a href="#n119" name="n119">119</a>
<strong><a href="#n120" name="n120">120</a></strong>
<a href="#n121" name="n121">121</a>
<a href="#n122" name="n122">122</a>
<a href="#n123" name="n123">123</a>
<a href="#n124" name="n124">124</a>
<a href="#n125" name="n125">125</a>
<a href="#n126" name="n126">126</a>
<a href="#n127" name="n127">127</a>
<a href="#n128" name="n128">128</a>
<a href="#n129" name="n129">129</a>
<strong><a href="#n130" name="n130">130</a></strong>
<a href="#n131" name="n131">131</a>
<a href="#n132" name="n132">132</a>
<a href="#n133" name="n133">133</a>
<a href="#n134" name="n134">134</a>
<a href="#n135" name="n135">135</a>
<a href="#n136" name="n136">136</a>
<a href="#n137" name="n137">137</a>
<a href="#n138" name="n138">138</a>
<a href="#n139" name="n139">139</a>
<strong><a href="#n140" name="n140">140</a></strong>
<a href="#n141" name="n141">141</a>
<a href="#n142" name="n142">142</a>
<a href="#n143" name="n143">143</a>
<a href="#n144" name="n144">144</a>
<a href="#n145" name="n145">145</a>
<a href="#n146" name="n146">146</a>
<a href="#n147" name="n147">147</a>
<a href="#n148" name="n148">148</a>
<a href="#n149" name="n149">149</a>
<strong><a href="#n150" name="n150">150</a></strong>
<a href="#n151" name="n151">151</a>
<a href="#n152" name="n152">152</a>
<a href="#n153" name="n153">153</a>
<a href="#n154" name="n154">154</a>
<a href="#n155" name="n155">155</a>
<a href="#n156" name="n156">156</a>
<a href="#n157" name="n157">157</a>
<a href="#n158" name="n158">158</a>
<a href="#n159" name="n159">159</a>
<strong><a href="#n160" name="n160">160</a></strong>
<a href="#n161" name="n161">161</a>
<a href="#n162" name="n162">162</a>
<a href="#n163" name="n163">163</a>
<a href="#n164" name="n164">164</a>
<a href="#n165" name="n165">165</a>
<a href="#n166" name="n166">166</a>
<a href="#n167" name="n167">167</a>
<a href="#n168" name="n168">168</a>
<a href="#n169" name="n169">169</a>
<strong><a href="#n170" name="n170">170</a></strong>
<a href="#n171" name="n171">171</a>
<a href="#n172" name="n172">172</a>
<a href="#n173" name="n173">173</a>
<a href="#n174" name="n174">174</a>
<a href="#n175" name="n175">175</a>
<a href="#n176" name="n176">176</a>
<a href="#n177" name="n177">177</a>
<a href="#n178" name="n178">178</a>
<a href="#n179" name="n179">179</a>
<strong><a href="#n180" name="n180">180</a></strong>
<a href="#n181" name="n181">181</a>
<a href="#n182" name="n182">182</a>
<a href="#n183" name="n183">183</a>
<a href="#n184" name="n184">184</a>
<a href="#n185" name="n185">185</a>
<a href="#n186" name="n186">186</a>
<a href="#n187" name="n187">187</a>
<a href="#n188" name="n188">188</a>
<a href="#n189" name="n189">189</a>
<strong><a href="#n190" name="n190">190</a></strong>
<a href="#n191" name="n191">191</a>
<a href="#n192" name="n192">192</a>
<a href="#n193" name="n193">193</a>
<a href="#n194" name="n194">194</a>
<a href="#n195" name="n195">195</a>
<a href="#n196" name="n196">196</a>
<a href="#n197" name="n197">197</a>
<a href="#n198" name="n198">198</a>
<a href="#n199" name="n199">199</a>
<strong><a href="#n200" name="n200">200</a></strong>
<a href="#n201" name="n201">201</a>
<a href="#n202" name="n202">202</a>
<a href="#n203" name="n203">203</a>
<a href="#n204" name="n204">204</a>
<a href="#n205" name="n205">205</a>
<a href="#n206" name="n206">206</a>
<a href="#n207" name="n207">207</a>
<a href="#n208" name="n208">208</a>
<a href="#n209" name="n209">209</a>
<strong><a href="#n210" name="n210">210</a></strong>
<a href="#n211" name="n211">211</a>
<a href="#n212" name="n212">212</a>
<a href="#n213" name="n213">213</a>
<a href="#n214" name="n214">214</a>
<a href="#n215" name="n215">215</a>
<a href="#n216" name="n216">216</a>
<a href="#n217" name="n217">217</a>
<a href="#n218" name="n218">218</a>
<a href="#n219" name="n219">219</a>
<strong><a href="#n220" name="n220">220</a></strong>
<a href="#n221" name="n221">221</a>
<a href="#n222" name="n222">222</a>
<a href="#n223" name="n223">223</a>
<a href="#n224" name="n224">224</a>
<a href="#n225" name="n225">225</a>
<a href="#n226" name="n226">226</a>
<a href="#n227" name="n227">227</a>
<a href="#n228" name="n228">228</a>
<a href="#n229" name="n229">229</a>
<strong><a href="#n230" name="n230">230</a></strong>
<a href="#n231" name="n231">231</a>
<a href="#n232" name="n232">232</a>
<a href="#n233" name="n233">233</a>
<a href="#n234" name="n234">234</a>
<a href="#n235" name="n235">235</a>
<a href="#n236" name="n236">236</a>
<a href="#n237" name="n237">237</a>
<a href="#n238" name="n238">238</a>
<a href="#n239" name="n239">239</a>
<strong><a href="#n240" name="n240">240</a></strong>
<a href="#n241" name="n241">241</a>
<a href="#n242" name="n242">242</a>
<a href="#n243" name="n243">243</a>
<a href="#n244" name="n244">244</a>
<a href="#n245" name="n245">245</a>
<a href="#n246" name="n246">246</a>
<a href="#n247" name="n247">247</a>
<a href="#n248" name="n248">248</a>
<a href="#n249" name="n249">249</a>
<strong><a href="#n250" name="n250">250</a></strong>
<a href="#n251" name="n251">251</a>
<a href="#n252" name="n252">252</a>
<a href="#n253" name="n253">253</a>
<a href="#n254" name="n254">254</a>
<a href="#n255" name="n255">255</a>
<a href="#n256" name="n256">256</a>
<a href="#n257" name="n257">257</a>
<a href="#n258" name="n258">258</a>
<a href="#n259" name="n259">259</a>
<strong><a href="#n260" name="n260">260</a></strong>
<a href="#n261" name="n261">261</a>
<a href="#n262" name="n262">262</a>
<a href="#n263" name="n263">263</a>
<a href="#n264" name="n264">264</a>
<a href="#n265" name="n265">265</a>
<a href="#n266" name="n266">266</a>
<a href="#n267" name="n267">267</a>
<a href="#n268" name="n268">268</a>
<a href="#n269" name="n269">269</a>
<strong><a href="#n270" name="n270">270</a></strong>
<a href="#n271" name="n271">271</a>
<a href="#n272" name="n272">272</a>
<a href="#n273" name="n273">273</a>
<a href="#n274" name="n274">274</a>
<a href="#n275" name="n275">275</a>
<a href="#n276" name="n276">276</a>
<a href="#n277" name="n277">277</a>
<a href="#n278" name="n278">278</a>
<a href="#n279" name="n279">279</a>
<strong><a href="#n280" name="n280">280</a></strong>
<a href="#n281" name="n281">281</a>
<a href="#n282" name="n282">282</a>
<a href="#n283" name="n283">283</a>
<a href="#n284" name="n284">284</a>
<a href="#n285" name="n285">285</a>
<a href="#n286" name="n286">286</a>
<a href="#n287" name="n287">287</a>
<a href="#n288" name="n288">288</a>
<a href="#n289" name="n289">289</a>
<strong><a href="#n290" name="n290">290</a></strong>
<a href="#n291" name="n291">291</a>
<a href="#n292" name="n292">292</a>
<a href="#n293" name="n293">293</a>
<a href="#n294" name="n294">294</a>
<a href="#n295" name="n295">295</a>
<a href="#n296" name="n296">296</a>
<a href="#n297" name="n297">297</a>
<a href="#n298" name="n298">298</a>
<a href="#n299" name="n299">299</a>
<strong><a href="#n300" name="n300">300</a></strong>
<a href="#n301" name="n301">301</a>
<a href="#n302" name="n302">302</a>
<a href="#n303" name="n303">303</a>
<a href="#n304" name="n304">304</a>
<a href="#n305" name="n305">305</a>
<a href="#n306" name="n306">306</a>
<a href="#n307" name="n307">307</a>
<a href="#n308" name="n308">308</a>
<a href="#n309" name="n309">309</a>
<strong><a href="#n310" name="n310">310</a></strong>
<a href="#n311" name="n311">311</a>
<a href="#n312" name="n312">312</a>
<a href="#n313" name="n313">313</a>
<a href="#n314" name="n314">314</a>
<a href="#n315" name="n315">315</a>
<a href="#n316" name="n316">316</a>
<a href="#n317" name="n317">317</a>
<a href="#n318" name="n318">318</a>
<a href="#n319" name="n319">319</a>
<strong><a href="#n320" name="n320">320</a></strong>
<a href="#n321" name="n321">321</a>
<a href="#n322" name="n322">322</a>
<a href="#n323" name="n323">323</a>
<a href="#n324" name="n324">324</a>
<a href="#n325" name="n325">325</a>
<a href="#n326" name="n326">326</a>
<a href="#n327" name="n327">327</a>
<a href="#n328" name="n328">328</a>
<a href="#n329" name="n329">329</a>
<strong><a href="#n330" name="n330">330</a></strong>
<a href="#n331" name="n331">331</a>
<a href="#n332" name="n332">332</a>
<a href="#n333" name="n333">333</a>
<a href="#n334" name="n334">334</a>
<a href="#n335" name="n335">335</a>
<a href="#n336" name="n336">336</a>
<a href="#n337" name="n337">337</a>
<a href="#n338" name="n338">338</a>
<a href="#n339" name="n339">339</a>
<strong><a href="#n340" name="n340">340</a></strong>
<a href="#n341" name="n341">341</a>
<a href="#n342" name="n342">342</a>
<a href="#n343" name="n343">343</a>
<a href="#n344" name="n344">344</a>
<a href="#n345" name="n345">345</a>
<a href="#n346" name="n346">346</a>
<a href="#n347" name="n347">347</a>
<a href="#n348" name="n348">348</a>
<a href="#n349" name="n349">349</a>
<strong><a href="#n350" name="n350">350</a></strong>
<a href="#n351" name="n351">351</a>
<a href="#n352" name="n352">352</a>
<a href="#n353" name="n353">353</a>
<a href="#n354" name="n354">354</a>
<a href="#n355" name="n355">355</a>
<a href="#n356" name="n356">356</a>
<a href="#n357" name="n357">357</a>
<a href="#n358" name="n358">358</a>
<a href="#n359" name="n359">359</a>
<strong><a href="#n360" name="n360">360</a></strong>
<a href="#n361" name="n361">361</a>
<a href="#n362" name="n362">362</a>
<a href="#n363" name="n363">363</a>
<a href="#n364" name="n364">364</a>
<a href="#n365" name="n365">365</a>
<a href="#n366" name="n366">366</a>
<a href="#n367" name="n367">367</a>
<a href="#n368" name="n368">368</a>
<a href="#n369" name="n369">369</a>
<strong><a href="#n370" name="n370">370</a></strong>
<a href="#n371" name="n371">371</a>
<a href="#n372" name="n372">372</a>
<a href="#n373" name="n373">373</a>
<a href="#n374" name="n374">374</a>
<a href="#n375" name="n375">375</a>
<a href="#n376" name="n376">376</a>
<a href="#n377" name="n377">377</a>
<a href="#n378" name="n378">378</a>
<a href="#n379" name="n379">379</a>
<strong><a href="#n380" name="n380">380</a></strong>
<a href="#n381" name="n381">381</a>
<a href="#n382" name="n382">382</a>
<a href="#n383" name="n383">383</a>
<a href="#n384" name="n384">384</a>
<a href="#n385" name="n385">385</a>
<a href="#n386" name="n386">386</a>
<a href="#n387" name="n387">387</a>
<a href="#n388" name="n388">388</a>
<a href="#n389" name="n389">389</a>
<strong><a href="#n390" name="n390">390</a></strong>
<a href="#n391" name="n391">391</a>
<a href="#n392" name="n392">392</a>
<a href="#n393" name="n393">393</a>
<a href="#n394" name="n394">394</a>
<a href="#n395" name="n395">395</a>
<a href="#n396" name="n396">396</a>
<a href="#n397" name="n397">397</a>
<a href="#n398" name="n398">398</a>
<a href="#n399" name="n399">399</a>
<strong><a href="#n400" name="n400">400</a></strong>
<a href="#n401" name="n401">401</a>
<a href="#n402" name="n402">402</a>
<a href="#n403" name="n403">403</a>
<a href="#n404" name="n404">404</a>
<a href="#n405" name="n405">405</a>
<a href="#n406" name="n406">406</a>
<a href="#n407" name="n407">407</a>
<a href="#n408" name="n408">408</a>
<a href="#n409" name="n409">409</a>
<strong><a href="#n410" name="n410">410</a></strong>
<a href="#n411" name="n411">411</a>
<a href="#n412" name="n412">412</a>
<a href="#n413" name="n413">413</a>
<a href="#n414" name="n414">414</a>
<a href="#n415" name="n415">415</a>
<a href="#n416" name="n416">416</a>
<a href="#n417" name="n417">417</a>
<a href="#n418" name="n418">418</a>
<a href="#n419" name="n419">419</a>
<strong><a href="#n420" name="n420">420</a></strong>
<a href="#n421" name="n421">421</a>
<a href="#n422" name="n422">422</a>
<a href="#n423" name="n423">423</a>
<a href="#n424" name="n424">424</a>
<a href="#n425" name="n425">425</a>
<a href="#n426" name="n426">426</a>
<a href="#n427" name="n427">427</a>
<a href="#n428" name="n428">428</a>
<a href="#n429" name="n429">429</a>
<strong><a href="#n430" name="n430">430</a></strong>
<a href="#n431" name="n431">431</a>
<a href="#n432" name="n432">432</a>
<a href="#n433" name="n433">433</a>
<a href="#n434" name="n434">434</a>
<a href="#n435" name="n435">435</a>
<a href="#n436" name="n436">436</a>
<a href="#n437" name="n437">437</a>
<a href="#n438" name="n438">438</a>
<a href="#n439" name="n439">439</a>
<strong><a href="#n440" name="n440">440</a></strong>
<a href="#n441" name="n441">441</a>
<a href="#n442" name="n442">442</a>
<a href="#n443" name="n443">443</a>
<a href="#n444" name="n444">444</a>
<a href="#n445" name="n445">445</a>
<a href="#n446" name="n446">446</a>
<a href="#n447" name="n447">447</a>
<a href="#n448" name="n448">448</a>
<a href="#n449" name="n449">449</a>
<strong><a href="#n450" name="n450">450</a></strong>
<a href="#n451" name="n451">451</a>
<a href="#n452" name="n452">452</a>
<a href="#n453" name="n453">453</a>
<a href="#n454" name="n454">454</a>
<a href="#n455" name="n455">455</a>
<a href="#n456" name="n456">456</a>
<a href="#n457" name="n457">457</a>
<a href="#n458" name="n458">458</a>
<a href="#n459" name="n459">459</a>
<strong><a href="#n460" name="n460">460</a></strong>
<a href="#n461" name="n461">461</a>
<a href="#n462" name="n462">462</a>
<a href="#n463" name="n463">463</a>
<a href="#n464" name="n464">464</a>
<a href="#n465" name="n465">465</a>
<a href="#n466" name="n466">466</a>
<a href="#n467" name="n467">467</a>
<a href="#n468" name="n468">468</a>
<a href="#n469" name="n469">469</a>
<strong><a href="#n470" name="n470">470</a></strong>
<a href="#n471" name="n471">471</a>
<a href="#n472" name="n472">472</a>
<a href="#n473" name="n473">473</a>
<a href="#n474" name="n474">474</a>
<a href="#n475" name="n475">475</a>
<a href="#n476" name="n476">476</a>
<a href="#n477" name="n477">477</a>
<a href="#n478" name="n478">478</a>
<a href="#n479" name="n479">479</a>
<strong><a href="#n480" name="n480">480</a></strong>
<a href="#n481" name="n481">481</a>
<a href="#n482" name="n482">482</a>
<a href="#n483" name="n483">483</a>
<a href="#n484" name="n484">484</a>
<a href="#n485" name="n485">485</a>
<a href="#n486" name="n486">486</a>
<a href="#n487" name="n487">487</a>
<a href="#n488" name="n488">488</a>
<a href="#n489" name="n489">489</a>
<strong><a href="#n490" name="n490">490</a></strong>
<a href="#n491" name="n491">491</a>
<a href="#n492" name="n492">492</a>
<a href="#n493" name="n493">493</a>
<a href="#n494" name="n494">494</a>
<a href="#n495" name="n495">495</a>
<a href="#n496" name="n496">496</a>
<a href="#n497" name="n497">497</a>
<a href="#n498" name="n498">498</a>
<a href="#n499" name="n499">499</a>
<strong><a href="#n500" name="n500">500</a></strong>
<a href="#n501" name="n501">501</a>
<a href="#n502" name="n502">502</a>
<a href="#n503" name="n503">503</a>
<a href="#n504" name="n504">504</a>
<a href="#n505" name="n505">505</a>
<a href="#n506" name="n506">506</a>
<a href="#n507" name="n507">507</a>
<a href="#n508" name="n508">508</a>
<a href="#n509" name="n509">509</a>
<strong><a href="#n510" name="n510">510</a></strong>
<a href="#n511" name="n511">511</a>
<a href="#n512" name="n512">512</a>
</pre></td>
<td class="code"><pre><span class="comment">/* DreemGL is a collaboration between Teeming Society & Samsung Electronics, sponsored by Samsung and others.
Copyright 2015-2016 Teeming Society. Licensed under the Apache License, Version 2.0 (the "License"); You may not use this file except in compliance with the License.
You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and limitations under the License.*/</span>
define.<span class="reserved">class</span>(<span class="string"><span class="delimiter">'</span><span class="content">$system/base/shader</span><span class="delimiter">'</span></span>, <span class="keyword">function</span>(require, exports){
<span class="keyword">var</span> gltypes = require(<span class="string"><span class="delimiter">'</span><span class="content">$system/base/gltypes</span><span class="delimiter">'</span></span>)
exports.Texture =
<span class="local-variable">this</span>.Texture = require(<span class="string"><span class="delimiter">'</span><span class="content">./textureheadless</span><span class="delimiter">'</span></span>)
util = require(<span class="string"><span class="delimiter">'</span><span class="content">util</span><span class="delimiter">'</span></span>);
<span class="comment">// HeadlessApi is a static object to access the headless api</span>
HeadlessApi = require(<span class="string"><span class="delimiter">'</span><span class="content">./headless_api</span><span class="delimiter">'</span></span>)
<span class="comment">// HeadlessDreemgl is the interface between dreemgl and headless.</span>
HeadlessShader = require(<span class="string"><span class="delimiter">'</span><span class="content">./headless_shader</span><span class="delimiter">'</span></span>)
HeadlessActor = require(<span class="string"><span class="delimiter">'</span><span class="content">./headless_actor</span><span class="delimiter">'</span></span>)
<span class="comment">/**
* @method compileShader
* Compiles the shader, or use the cached version.
* Construct a mesh actor if necessary and attach to the view
* The 'this' pointer is an object like border or hardrect
* @param {Object} gldevice Instance of DeviceHeadless
* @return {Object} shader Object containing compiled shader information.
* In webgl this is an object returned by gl.createProgram
* In headless, this is a hash containing a headless_shader object
*/</span>
<span class="local-variable">this</span>.<span class="function">compileShader</span> = <span class="keyword">function</span>(gldevice){
<span class="comment">//console.log('*#*#*#*# compileShader', this.view ? this.view.id : '<SCREEN>');</span>
<span class="keyword">var</span> vtx_state = <span class="local-variable">this</span>.vtx_state
<span class="keyword">var</span> pix_state = <span class="local-variable">this</span>.pix_state
<span class="keyword">var</span> vtx_code = vtx_state.code
<span class="comment">//console.log('vtx_code', vtx_code);</span>
<span class="comment">//console.log('pix_code', pix_state.code_color);</span>
<span class="comment">//console.log('====== vtx_state call', vtx_state.call);</span>
<span class="keyword">var</span> pix_color = pix_state.code_color
<span class="keyword">var</span> pix_pick = pix_state.code_pick
<span class="keyword">var</span> pix_debug = pix_state.code_debug
<span class="keyword">var</span> gl = gldevice.gl
<span class="keyword">var</span> cache_id = vtx_code + pix_color + <span class="local-variable">this</span>.has_pick
<span class="comment">// Get the HeadlessShader object from a cache, or build one</span>
shader = gldevice.shadercache[cache_id]
<span class="comment">//if(shader) return this.headlessshader</span>
<span class="keyword">if</span> (!shader) {
<span class="comment">// shader is a hash of compiled information and headless objects</span>
shader = {
<span class="key">object_type</span>: <span class="string"><span class="delimiter">'</span><span class="content">(compiled_shader_data)</span><span class="delimiter">'</span></span>
,<span class="key">debug</span>: {}
,<span class="key">pick</span>: {}
,<span class="key">uniset</span>: {}
,<span class="key">unilocks</span>: {}
,<span class="key">refattr</span>: {}
,<span class="key">texlocs</span>: {}
};
<span class="comment">// Build a HeadlessShader object and attach to shader</span>
<span class="keyword">var</span> shadercode = vtx_state.code;
<span class="keyword">var</span> fragcode = pix_state.code_color;
shader.headlessshader = <span class="keyword">new</span> HeadlessShader(shadercode, fragcode);
<span class="comment">// Build information on uniforms, textures, and attributes</span>
<span class="local-variable">this</span>.getLocations(gl, shader, vtx_state, pix_state)
<span class="comment">//console.log('*** COMPILED ***');</span>
<span class="comment">//console.log('unilocks', shader.unilocks);</span>
<span class="comment">//console.log('uniset', shader.uniset);</span>
<span class="comment">//console.log('refattr', shader.refattr);</span>
<span class="comment">//console.log('texlocs', shader.texlocs);</span>
<span class="comment">//TODO. Remove?</span>
<span class="local-variable">this</span>.compile_use = <span class="predefined-constant">true</span>
<span class="keyword">if</span>(<span class="local-variable">this</span>.compile_use) <span class="local-variable">this</span>.compileUse(shader)
gldevice.shadercache[cache_id] = shader
<span class="comment">//Not supported by Headless (Yet)</span>
<span class="comment">// if(pix_debug){</span>
<span class="comment">// // compile the pick shader</span>
<span class="comment">// var pix_debug_shader = gl.createShader(gl.FRAGMENT_SHADER)</span>
<span class="comment">// gl.shaderSource(pix_debug_shader, pix_debug)</span>
<span class="comment">// gl.compileShader(pix_debug_shader)</span>
<span class="comment">// if (!gl.getShaderParameter(pix_debug_shader, gl.COMPILE_STATUS)){</span>
<span class="comment">// var err = gl.getShaderInfoLog(pix_debug_shader)</span>
<span class="comment">// console.log(err.toString(), this.annotateLines(pix_debug))</span>
<span class="comment">// throw new Error(err)</span>
<span class="comment">// }</span>
<span class="comment">//</span>
<span class="comment">// shader.debug = gl.createProgram()</span>
<span class="comment">// gl.attachShader(shader.debug, vtx_shader)</span>
<span class="comment">// gl.attachShader(shader.debug, pix_debug_shader)</span>
<span class="comment">// gl.linkProgram(shader.debug)</span>
<span class="comment">// // add our pick uniform</span>
<span class="comment">// this.getLocations(gl, shader.debug, vtx_state, pix_state)</span>
<span class="comment">// if(this.compile_use) this.compileUse(shader.debug)</span>
<span class="comment">// }</span>
<span class="comment">//</span>
<span class="comment">// if(this.has_pick){</span>
<span class="comment">// // compile the pick shader</span>
<span class="comment">// var pix_pick_shader = gl.createShader(gl.FRAGMENT_SHADER)</span>
<span class="comment">// gl.shaderSource(pix_pick_shader, pix_pick)</span>
<span class="comment">// gl.compileShader(pix_pick_shader)</span>
<span class="comment">// if (!gl.getShaderParameter(pix_pick_shader, gl.COMPILE_STATUS)){</span>
<span class="comment">// var err = gl.getShaderInfoLog(pix_pick_shader)</span>
<span class="comment">//</span>
<span class="comment">// console.log(err.toString(), this.annotateLines(pix))</span>
<span class="comment">// throw new Error(err)</span>
<span class="comment">// }</span>
<span class="comment">//</span>
<span class="comment">// shader.pick = gl.createProgram()</span>
<span class="comment">// gl.attachShader(shader.pick, vtx_shader)</span>
<span class="comment">// gl.attachShader(shader.pick, pix_pick_shader)</span>
<span class="comment">// gl.linkProgram(shader.pick)</span>
<span class="comment">// // add our pick uniform</span>
<span class="comment">// pix_state.uniforms['pickguid'] = vec3</span>
<span class="comment">//</span>
<span class="comment">// this.getLocations(gl, shader.pick, vtx_state, pix_state)</span>
<span class="comment">//</span>
<span class="comment">// if(this.compile_use) this.compileUse(shader.pick)</span>
<span class="comment">// }</span>
} <span class="comment">// if (!this.headlessshader) {</span>
<span class="comment">// Build missing headless objects (if they don't exist)</span>
<span class="comment">//console.log('shader', shader.object_type, shader);</span>
HeadlessApi.createHeadlessObjects(shader, <span class="local-variable">this</span>); <span class="comment">// shader);</span>
<span class="keyword">return</span> shader
}
<span class="local-variable">this</span>.<span class="function">useShader</span> = <span class="keyword">function</span>(gl, shader){
<span class="keyword">if</span>(shader.use) <span class="keyword">return</span> shader.use(gl, shader, <span class="local-variable">this</span>)
console.log(<span class="string"><span class="delimiter">'</span><span class="content">***************************************************************************************************OLD CODE RUNNING</span><span class="delimiter">'</span></span>);
}
<span class="local-variable">this</span>.compile_use = <span class="predefined-constant">true</span>
<span class="comment">// Override from shader.js (HEADLESS)</span>
<span class="local-variable">this</span>.<span class="function">mapUniforms</span> = <span class="keyword">function</span>(gl, shader, uniforms, uniset, unilocs){
<span class="comment">// headless uses registerAnimatableProperty to set a uniform</span>
<span class="keyword">for</span>(<span class="keyword">var</span> key <span class="keyword">in</span> uniforms) <span class="keyword">if</span>(!uniset[key]){
<span class="keyword">var</span> type = gltypes.getType(uniforms[key])
<span class="comment">//uniset[key] = gltypes.uniforms[type]</span>
uniset[key] = gltypes.uniforms[type]
<span class="keyword">var</span> loc = unilocs[key] = {
<span class="key">type</span>: type,
<span class="key">loc</span>: key <span class="comment">// Store the name, not the location</span>
}
<span class="keyword">if</span>(key.indexOf(<span class="string"><span class="delimiter">'</span><span class="content">_DOT_</span><span class="delimiter">'</span></span>) !== -<span class="integer">1</span>) loc.split = key.split(<span class="regexp"><span class="delimiter">/</span><span class="content">_DOT_</span><span class="delimiter">/</span></span>)
}
}
<span class="local-variable">this</span>.<span class="function">mapTextures</span> = <span class="keyword">function</span>(gl, shader, textures, texlocs){
<span class="keyword">for</span>(<span class="keyword">var</span> key <span class="keyword">in</span> textures){
<span class="keyword">var</span> tex = textures[key]
<span class="keyword">var</span> loc = texlocs[key] = {
<span class="key">loc</span>: key, <span class="comment">// Store the name, not the location</span>
<span class="key">samplerdef</span>: tex.samplerdef,
<span class="key">samplerid</span>: tex.samplerid,
<span class="key">name</span>: tex.name
}
<span class="keyword">if</span>(tex.name.indexOf(<span class="string"><span class="delimiter">'</span><span class="content">_DOT_</span><span class="delimiter">'</span></span>) !== -<span class="integer">1</span>) loc.split = tex.name.split(<span class="regexp"><span class="delimiter">/</span><span class="content">_DOT_</span><span class="delimiter">/</span></span>)
}
}
<span class="comment">// Template for generated code</span>
<span class="comment">// {object} gl stubbed out gl object</span>
<span class="comment">// {object} shader compiled shader object, containing headlessshader</span>
<span class="comment">// and headlessgeometry. (see compileShader in this file)</span>
<span class="comment">// {object} root display object (ex. border, hardrect), containing</span>
<span class="comment">// headlessmaterial, headlessrenderer, headlessactor.</span>
<span class="local-variable">this</span>.<span class="function">useShaderTemplate</span> = <span class="keyword">function</span>(gl, shader, root){
<span class="comment">// Create headless objects when first used</span>
<span class="keyword">if</span> (root && !root.headlessactor) {
HeadlessApi.createHeadlessActor(root, shader);
}
<span class="comment">//console.log('useShader', root.view ? root.view.id : 'screen', 'shader', shader.object_type, 'root', root.object_type)</span>
<span class="comment">// use the shader</span>
gl.useProgram(shader)
<span class="keyword">var</span> headless = HeadlessApi.headless
<span class="keyword">var</span> headlessactor = root ? root.headlessactor : <span class="predefined-constant">undefined</span>;
<span class="keyword">var</span> headlessmaterial = root ? root.headlessmaterial : <span class="predefined-constant">undefined</span>;
<span class="keyword">var</span> headlessgeometry = root.headlessgeometry;
<span class="comment">//console.log('headlessactor', headlessactor.id, 'shader', shader.headlessshader.id, 'geometry', headlessgeometry.id);</span>
<span class="comment">// set uniforms</span>
<span class="comment">//shader.addUniforms(shader.dreem_shader);</span>
SET_UNIFORMS
<span class="comment">// textures</span>
TEXTURE_START
<span class="keyword">var</span> texture = TEXTURE_VALUE
<span class="comment">// lets fetch the sampler</span>
<span class="keyword">var</span> gltex = texture.TEXTURE_SAMPLER
<span class="comment">// lets do the texture slots correct</span>
<span class="keyword">if</span>(!gltex){
<span class="keyword">if</span>(!texture.createGLTexture) texture = TEXTURE_VALUE = root.Texture.fromStub(texture)
gltex = texture.createGLTexture(gl, TEXTURE_ID, TEXTURE_INFO)
<span class="keyword">if</span> (texture.image) {
<span class="keyword">var</span> ti = TEXTURE_INFO
<span class="comment">// Simulate the DALi Sampler</span>
<span class="keyword">var</span> sampler = {};
<span class="comment">//FIX</span>
<span class="keyword">if</span> (headlessmaterial) {
<span class="keyword">var</span> index = headlessmaterial.addTexture(texture, ti.loc, sampler);
gltex.texture_index = index;
<span class="comment">//console.log('**** **** **** headless.addTexture', ti.loc, texture.image.getWidth(), texture.image.getHeight(), 'return index', index);</span>
}
}
<span class="keyword">if</span>(!gltex) <span class="keyword">return</span> <span class="integer">0</span>
}
<span class="keyword">else</span>{
gl.activeTexture(TEXTUREGL_ID) <span class="comment">// gl.TEXTURE0 + TEXTURE_ID</span>
gl.bindTexture(gl.TEXTURE_2D, gltex)
<span class="keyword">if</span>(texture.updateid !== gltex.updateid){
texture.updateGLTexture(gl, gltex)
<span class="keyword">if</span> (gltex.texture_index) {
<span class="keyword">var</span> headlessmaterial = root.headlessmaterial;
headlessmaterial.removeTexture(gltex.texture_index);
gltex.texture_index = <span class="predefined-constant">undefined</span>;
<span class="keyword">if</span> (texture.image) {
<span class="keyword">var</span> ti = TEXTURE_INFO
<span class="comment">// Simulate the DALi Sampler</span>
<span class="keyword">var</span> sampler = {};
<span class="keyword">var</span> index = headlessmaterial.addTexture(texture.image, ti.loc, sampler);
gltex.texture_index = index;
}
}
}
}
gl.uniform1i(TEXTURE_LOC, TEXTURE_ID)
TEXTURE_END
<span class="comment">// attributes</span>
<span class="comment">//shader.compileShader(this);</span>
<span class="comment">//console.log('---- ---- ---- addAttributeGeometry');</span>
<span class="comment">//shader.headlessgeometry.addAttributeGeometry(shader, shader.attrlocs);</span>
<span class="keyword">var</span> len = <span class="integer">0</span> <span class="comment">// pull the length out of the buffers</span>
<span class="keyword">var</span> lastbuf
ATTRLOC_START
<span class="keyword">var</span> buf = ATTRLOC_BUF
<span class="keyword">if</span>(lastbuf !== buf){
lastbuf = buf
<span class="keyword">if</span>(!buf.glvb) buf.glvb = gl.createBuffer()
<span class="keyword">if</span>(buf.length > len) len = buf.length
gl.bindBuffer(gl.ARRAY_BUFFER, buf.glvb)
<span class="keyword">if</span>(!buf.clean){
gl.bufferData(gl.ARRAY_BUFFER, buf.array, gl.STATIC_DRAW)
buf.clean = <span class="predefined-constant">true</span>
}
}
<span class="keyword">var</span> loc = ATTRLOC_LOC
gl.enableVertexAttribArray(loc)
ATTRLOC_ATTRIBPTR
ATTRLOC_END
<span class="keyword">var</span> headlessmaterial = root.headlessmaterial;
<span class="comment">// set up blend mode</span>
<span class="keyword">if</span>(root.alpha_blend_eq.op){
<span class="comment">//console.log('==== alpha_blend_eq.op');</span>
<span class="keyword">var</span> constant = root.constant
<span class="keyword">if</span>(constant) {
<span class="comment">//console.log('CONSTANT', constant[0], constant[1], constant[2], constant[3], 'Not implemented');</span>
gl.blendColor(constant[<span class="integer">0</span>], constant[<span class="integer">1</span>], constant[<span class="integer">2</span>], constant.length><span class="integer">3</span>? constant[<span class="integer">3</span>]: <span class="integer">1</span>)
}
gl.enable(gl.BLEND)
gl.blendEquationSeparate(root.color_blend_eq.op, root.alpha_blend_eq.op)
gl.blendFuncSeparate(
root.color_blend_eq.src,
root.color_blend_eq.dst,
root.alpha_blend_eq.src,
root.alpha_blend_eq.dst
)
<span class="comment">// HEADLESS</span>
<span class="comment">//console.log('*** full blend');</span>
headlessmaterial.setBlendMode(<span class="string"><span class="delimiter">'</span><span class="content">BLENDING_ON</span><span class="delimiter">'</span></span>);
headlessmaterial.setBlendEquation (root.color_blend_eq.op, root.color_blend_eq.op);
headlessmaterial.setBlendFunc(root.color_blend_eq.src, root.color_blend_eq.dst, root.alpha_blend_eq.src, root.alpha_blend_eq.dst);
}
<span class="keyword">else</span> <span class="keyword">if</span>(root.color_blend_eq.op){
<span class="comment">//console.log('BLEND', root.color_blend_eq);</span>
<span class="keyword">var</span> constant = root.constant
<span class="keyword">if</span> (constant) {
<span class="comment">//console.log('CONSTANT 2', constant[0], constant[1], constant[2], constant[3], 'Not implemented');</span>
gl.blendColor(constant[<span class="integer">0</span>], constant[<span class="integer">1</span>], constant[<span class="integer">2</span>], constant.length><span class="integer">3</span>? constant[<span class="integer">3</span>]: <span class="integer">1</span>)
}
gl.enable(gl.BLEND)
gl.blendEquation(root.color_blend_eq.op)
gl.blendFunc(root.color_blend_eq.src, root.color_blend_eq.dst)
headlessmaterial.setBlendMode(<span class="string"><span class="delimiter">'</span><span class="content">BLENDING_ON</span><span class="delimiter">'</span></span>);
headlessmaterial.setBlendEquation (root.color_blend_eq.op, r