You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Trac3r-rust/doc/src/sfml_rust/canvas/canvas_state.rs.html

1179 lines
89 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Source to the Rust file `src/canvas/canvas_state.rs`."><meta name="keywords" content="rust, rustlang, rust-lang"><title>canvas_state.rs.html -- source</title><link rel="stylesheet" type="text/css" href="../../../normalize.css"><link rel="stylesheet" type="text/css" href="../../../rustdoc.css" id="mainThemeStyle"><link rel="stylesheet" type="text/css" href="../../../dark.css"><link rel="stylesheet" type="text/css" href="../../../light.css" id="themeStyle"><script src="../../../storage.js"></script><noscript><link rel="stylesheet" href="../../../noscript.css"></noscript><link rel="shortcut icon" href="../../../favicon.ico"><style type="text/css">#crate-search{background-image:url("../../../down-arrow.svg");}</style></head><body class="rustdoc source"><!--[if lte IE 8]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><nav class="sidebar"><div class="sidebar-menu">&#9776;</div><a href='../../../sfml_rust/index.html'><div class='logo-container'><img src='../../../rust-logo.png' alt='logo'></div></a></nav><div class="theme-picker"><button id="theme-picker" aria-label="Pick another theme!"><img src="../../../brush.svg" width="18" alt="Pick another theme!"></button><div id="theme-choices"></div></div><script src="../../../theme.js"></script><nav class="sub"><form class="search-form js-only"><div class="search-container"><div><select id="crate-search"><option value="All crates">All crates</option></select><input class="search-input" name="search" autocomplete="off" spellcheck="false" placeholder="Click or press S to search, ? for more options…" type="search"></div><a id="settings-menu" href="../../../settings.html"><img src="../../../wheel.svg" width="18" alt="Change settings"></a></div></form></nav><section id="main" class="content"><pre class="line-numbers"><span id="1"> 1</span>
<span id="2"> 2</span>
<span id="3"> 3</span>
<span id="4"> 4</span>
<span id="5"> 5</span>
<span id="6"> 6</span>
<span id="7"> 7</span>
<span id="8"> 8</span>
<span id="9"> 9</span>
<span id="10"> 10</span>
<span id="11"> 11</span>
<span id="12"> 12</span>
<span id="13"> 13</span>
<span id="14"> 14</span>
<span id="15"> 15</span>
<span id="16"> 16</span>
<span id="17"> 17</span>
<span id="18"> 18</span>
<span id="19"> 19</span>
<span id="20"> 20</span>
<span id="21"> 21</span>
<span id="22"> 22</span>
<span id="23"> 23</span>
<span id="24"> 24</span>
<span id="25"> 25</span>
<span id="26"> 26</span>
<span id="27"> 27</span>
<span id="28"> 28</span>
<span id="29"> 29</span>
<span id="30"> 30</span>
<span id="31"> 31</span>
<span id="32"> 32</span>
<span id="33"> 33</span>
<span id="34"> 34</span>
<span id="35"> 35</span>
<span id="36"> 36</span>
<span id="37"> 37</span>
<span id="38"> 38</span>
<span id="39"> 39</span>
<span id="40"> 40</span>
<span id="41"> 41</span>
<span id="42"> 42</span>
<span id="43"> 43</span>
<span id="44"> 44</span>
<span id="45"> 45</span>
<span id="46"> 46</span>
<span id="47"> 47</span>
<span id="48"> 48</span>
<span id="49"> 49</span>
<span id="50"> 50</span>
<span id="51"> 51</span>
<span id="52"> 52</span>
<span id="53"> 53</span>
<span id="54"> 54</span>
<span id="55"> 55</span>
<span id="56"> 56</span>
<span id="57"> 57</span>
<span id="58"> 58</span>
<span id="59"> 59</span>
<span id="60"> 60</span>
<span id="61"> 61</span>
<span id="62"> 62</span>
<span id="63"> 63</span>
<span id="64"> 64</span>
<span id="65"> 65</span>
<span id="66"> 66</span>
<span id="67"> 67</span>
<span id="68"> 68</span>
<span id="69"> 69</span>
<span id="70"> 70</span>
<span id="71"> 71</span>
<span id="72"> 72</span>
<span id="73"> 73</span>
<span id="74"> 74</span>
<span id="75"> 75</span>
<span id="76"> 76</span>
<span id="77"> 77</span>
<span id="78"> 78</span>
<span id="79"> 79</span>
<span id="80"> 80</span>
<span id="81"> 81</span>
<span id="82"> 82</span>
<span id="83"> 83</span>
<span id="84"> 84</span>
<span id="85"> 85</span>
<span id="86"> 86</span>
<span id="87"> 87</span>
<span id="88"> 88</span>
<span id="89"> 89</span>
<span id="90"> 90</span>
<span id="91"> 91</span>
<span id="92"> 92</span>
<span id="93"> 93</span>
<span id="94"> 94</span>
<span id="95"> 95</span>
<span id="96"> 96</span>
<span id="97"> 97</span>
<span id="98"> 98</span>
<span id="99"> 99</span>
<span id="100">100</span>
<span id="101">101</span>
<span id="102">102</span>
<span id="103">103</span>
<span id="104">104</span>
<span id="105">105</span>
<span id="106">106</span>
<span id="107">107</span>
<span id="108">108</span>
<span id="109">109</span>
<span id="110">110</span>
<span id="111">111</span>
<span id="112">112</span>
<span id="113">113</span>
<span id="114">114</span>
<span id="115">115</span>
<span id="116">116</span>
<span id="117">117</span>
<span id="118">118</span>
<span id="119">119</span>
<span id="120">120</span>
<span id="121">121</span>
<span id="122">122</span>
<span id="123">123</span>
<span id="124">124</span>
<span id="125">125</span>
<span id="126">126</span>
<span id="127">127</span>
<span id="128">128</span>
<span id="129">129</span>
<span id="130">130</span>
<span id="131">131</span>
<span id="132">132</span>
<span id="133">133</span>
<span id="134">134</span>
<span id="135">135</span>
<span id="136">136</span>
<span id="137">137</span>
<span id="138">138</span>
<span id="139">139</span>
<span id="140">140</span>
<span id="141">141</span>
<span id="142">142</span>
<span id="143">143</span>
<span id="144">144</span>
<span id="145">145</span>
<span id="146">146</span>
<span id="147">147</span>
<span id="148">148</span>
<span id="149">149</span>
<span id="150">150</span>
<span id="151">151</span>
<span id="152">152</span>
<span id="153">153</span>
<span id="154">154</span>
<span id="155">155</span>
<span id="156">156</span>
<span id="157">157</span>
<span id="158">158</span>
<span id="159">159</span>
<span id="160">160</span>
<span id="161">161</span>
<span id="162">162</span>
<span id="163">163</span>
<span id="164">164</span>
<span id="165">165</span>
<span id="166">166</span>
<span id="167">167</span>
<span id="168">168</span>
<span id="169">169</span>
<span id="170">170</span>
<span id="171">171</span>
<span id="172">172</span>
<span id="173">173</span>
<span id="174">174</span>
<span id="175">175</span>
<span id="176">176</span>
<span id="177">177</span>
<span id="178">178</span>
<span id="179">179</span>
<span id="180">180</span>
<span id="181">181</span>
<span id="182">182</span>
<span id="183">183</span>
<span id="184">184</span>
<span id="185">185</span>
<span id="186">186</span>
<span id="187">187</span>
<span id="188">188</span>
<span id="189">189</span>
<span id="190">190</span>
<span id="191">191</span>
<span id="192">192</span>
<span id="193">193</span>
<span id="194">194</span>
<span id="195">195</span>
<span id="196">196</span>
<span id="197">197</span>
<span id="198">198</span>
<span id="199">199</span>
<span id="200">200</span>
<span id="201">201</span>
<span id="202">202</span>
<span id="203">203</span>
<span id="204">204</span>
<span id="205">205</span>
<span id="206">206</span>
<span id="207">207</span>
<span id="208">208</span>
<span id="209">209</span>
<span id="210">210</span>
<span id="211">211</span>
<span id="212">212</span>
<span id="213">213</span>
<span id="214">214</span>
<span id="215">215</span>
<span id="216">216</span>
<span id="217">217</span>
<span id="218">218</span>
<span id="219">219</span>
<span id="220">220</span>
<span id="221">221</span>
<span id="222">222</span>
<span id="223">223</span>
<span id="224">224</span>
<span id="225">225</span>
<span id="226">226</span>
<span id="227">227</span>
<span id="228">228</span>
<span id="229">229</span>
<span id="230">230</span>
<span id="231">231</span>
<span id="232">232</span>
<span id="233">233</span>
<span id="234">234</span>
<span id="235">235</span>
<span id="236">236</span>
<span id="237">237</span>
<span id="238">238</span>
<span id="239">239</span>
<span id="240">240</span>
<span id="241">241</span>
<span id="242">242</span>
<span id="243">243</span>
<span id="244">244</span>
<span id="245">245</span>
<span id="246">246</span>
<span id="247">247</span>
<span id="248">248</span>
<span id="249">249</span>
<span id="250">250</span>
<span id="251">251</span>
<span id="252">252</span>
<span id="253">253</span>
<span id="254">254</span>
<span id="255">255</span>
<span id="256">256</span>
<span id="257">257</span>
<span id="258">258</span>
<span id="259">259</span>
<span id="260">260</span>
<span id="261">261</span>
<span id="262">262</span>
<span id="263">263</span>
<span id="264">264</span>
<span id="265">265</span>
<span id="266">266</span>
<span id="267">267</span>
<span id="268">268</span>
<span id="269">269</span>
<span id="270">270</span>
<span id="271">271</span>
<span id="272">272</span>
<span id="273">273</span>
<span id="274">274</span>
<span id="275">275</span>
<span id="276">276</span>
<span id="277">277</span>
<span id="278">278</span>
<span id="279">279</span>
<span id="280">280</span>
<span id="281">281</span>
<span id="282">282</span>
<span id="283">283</span>
<span id="284">284</span>
<span id="285">285</span>
<span id="286">286</span>
<span id="287">287</span>
<span id="288">288</span>
<span id="289">289</span>
<span id="290">290</span>
<span id="291">291</span>
<span id="292">292</span>
<span id="293">293</span>
<span id="294">294</span>
<span id="295">295</span>
<span id="296">296</span>
<span id="297">297</span>
<span id="298">298</span>
<span id="299">299</span>
<span id="300">300</span>
<span id="301">301</span>
<span id="302">302</span>
<span id="303">303</span>
<span id="304">304</span>
<span id="305">305</span>
<span id="306">306</span>
<span id="307">307</span>
<span id="308">308</span>
<span id="309">309</span>
<span id="310">310</span>
<span id="311">311</span>
<span id="312">312</span>
<span id="313">313</span>
<span id="314">314</span>
<span id="315">315</span>
<span id="316">316</span>
<span id="317">317</span>
<span id="318">318</span>
<span id="319">319</span>
<span id="320">320</span>
<span id="321">321</span>
<span id="322">322</span>
<span id="323">323</span>
<span id="324">324</span>
<span id="325">325</span>
<span id="326">326</span>
<span id="327">327</span>
<span id="328">328</span>
<span id="329">329</span>
<span id="330">330</span>
<span id="331">331</span>
<span id="332">332</span>
<span id="333">333</span>
<span id="334">334</span>
<span id="335">335</span>
<span id="336">336</span>
<span id="337">337</span>
<span id="338">338</span>
<span id="339">339</span>
<span id="340">340</span>
<span id="341">341</span>
<span id="342">342</span>
<span id="343">343</span>
<span id="344">344</span>
<span id="345">345</span>
<span id="346">346</span>
<span id="347">347</span>
<span id="348">348</span>
<span id="349">349</span>
<span id="350">350</span>
<span id="351">351</span>
<span id="352">352</span>
<span id="353">353</span>
<span id="354">354</span>
<span id="355">355</span>
<span id="356">356</span>
<span id="357">357</span>
<span id="358">358</span>
<span id="359">359</span>
<span id="360">360</span>
<span id="361">361</span>
<span id="362">362</span>
<span id="363">363</span>
<span id="364">364</span>
<span id="365">365</span>
<span id="366">366</span>
<span id="367">367</span>
<span id="368">368</span>
<span id="369">369</span>
<span id="370">370</span>
<span id="371">371</span>
<span id="372">372</span>
<span id="373">373</span>
<span id="374">374</span>
<span id="375">375</span>
<span id="376">376</span>
<span id="377">377</span>
<span id="378">378</span>
<span id="379">379</span>
<span id="380">380</span>
<span id="381">381</span>
<span id="382">382</span>
<span id="383">383</span>
<span id="384">384</span>
<span id="385">385</span>
<span id="386">386</span>
<span id="387">387</span>
<span id="388">388</span>
<span id="389">389</span>
<span id="390">390</span>
<span id="391">391</span>
<span id="392">392</span>
<span id="393">393</span>
<span id="394">394</span>
<span id="395">395</span>
<span id="396">396</span>
<span id="397">397</span>
<span id="398">398</span>
<span id="399">399</span>
<span id="400">400</span>
<span id="401">401</span>
<span id="402">402</span>
<span id="403">403</span>
<span id="404">404</span>
<span id="405">405</span>
<span id="406">406</span>
<span id="407">407</span>
<span id="408">408</span>
<span id="409">409</span>
<span id="410">410</span>
<span id="411">411</span>
<span id="412">412</span>
<span id="413">413</span>
<span id="414">414</span>
<span id="415">415</span>
<span id="416">416</span>
<span id="417">417</span>
<span id="418">418</span>
<span id="419">419</span>
<span id="420">420</span>
<span id="421">421</span>
<span id="422">422</span>
<span id="423">423</span>
<span id="424">424</span>
<span id="425">425</span>
<span id="426">426</span>
<span id="427">427</span>
<span id="428">428</span>
<span id="429">429</span>
<span id="430">430</span>
<span id="431">431</span>
<span id="432">432</span>
<span id="433">433</span>
<span id="434">434</span>
<span id="435">435</span>
<span id="436">436</span>
<span id="437">437</span>
<span id="438">438</span>
<span id="439">439</span>
<span id="440">440</span>
<span id="441">441</span>
<span id="442">442</span>
<span id="443">443</span>
<span id="444">444</span>
<span id="445">445</span>
<span id="446">446</span>
<span id="447">447</span>
<span id="448">448</span>
<span id="449">449</span>
<span id="450">450</span>
<span id="451">451</span>
<span id="452">452</span>
<span id="453">453</span>
<span id="454">454</span>
<span id="455">455</span>
<span id="456">456</span>
<span id="457">457</span>
<span id="458">458</span>
<span id="459">459</span>
<span id="460">460</span>
<span id="461">461</span>
<span id="462">462</span>
<span id="463">463</span>
<span id="464">464</span>
<span id="465">465</span>
<span id="466">466</span>
<span id="467">467</span>
<span id="468">468</span>
<span id="469">469</span>
<span id="470">470</span>
<span id="471">471</span>
<span id="472">472</span>
<span id="473">473</span>
<span id="474">474</span>
<span id="475">475</span>
<span id="476">476</span>
<span id="477">477</span>
<span id="478">478</span>
<span id="479">479</span>
<span id="480">480</span>
<span id="481">481</span>
<span id="482">482</span>
<span id="483">483</span>
<span id="484">484</span>
<span id="485">485</span>
<span id="486">486</span>
<span id="487">487</span>
<span id="488">488</span>
<span id="489">489</span>
<span id="490">490</span>
<span id="491">491</span>
<span id="492">492</span>
<span id="493">493</span>
<span id="494">494</span>
<span id="495">495</span>
<span id="496">496</span>
<span id="497">497</span>
<span id="498">498</span>
<span id="499">499</span>
<span id="500">500</span>
<span id="501">501</span>
<span id="502">502</span>
<span id="503">503</span>
<span id="504">504</span>
<span id="505">505</span>
<span id="506">506</span>
<span id="507">507</span>
<span id="508">508</span>
<span id="509">509</span>
<span id="510">510</span>
<span id="511">511</span>
<span id="512">512</span>
<span id="513">513</span>
<span id="514">514</span>
<span id="515">515</span>
<span id="516">516</span>
<span id="517">517</span>
<span id="518">518</span>
<span id="519">519</span>
<span id="520">520</span>
<span id="521">521</span>
<span id="522">522</span>
<span id="523">523</span>
<span id="524">524</span>
<span id="525">525</span>
<span id="526">526</span>
<span id="527">527</span>
<span id="528">528</span>
<span id="529">529</span>
<span id="530">530</span>
<span id="531">531</span>
<span id="532">532</span>
<span id="533">533</span>
<span id="534">534</span>
<span id="535">535</span>
<span id="536">536</span>
<span id="537">537</span>
<span id="538">538</span>
<span id="539">539</span>
<span id="540">540</span>
<span id="541">541</span>
<span id="542">542</span>
<span id="543">543</span>
<span id="544">544</span>
<span id="545">545</span>
<span id="546">546</span>
<span id="547">547</span>
<span id="548">548</span>
<span id="549">549</span>
<span id="550">550</span>
<span id="551">551</span>
<span id="552">552</span>
<span id="553">553</span>
<span id="554">554</span>
<span id="555">555</span>
<span id="556">556</span>
<span id="557">557</span>
<span id="558">558</span>
<span id="559">559</span>
<span id="560">560</span>
<span id="561">561</span>
<span id="562">562</span>
<span id="563">563</span>
<span id="564">564</span>
<span id="565">565</span>
<span id="566">566</span>
<span id="567">567</span>
<span id="568">568</span>
<span id="569">569</span>
<span id="570">570</span>
<span id="571">571</span>
<span id="572">572</span>
<span id="573">573</span>
<span id="574">574</span>
<span id="575">575</span>
<span id="576">576</span>
<span id="577">577</span>
<span id="578">578</span>
<span id="579">579</span>
<span id="580">580</span>
<span id="581">581</span>
<span id="582">582</span>
<span id="583">583</span>
<span id="584">584</span>
<span id="585">585</span>
<span id="586">586</span>
<span id="587">587</span>
<span id="588">588</span>
</pre><div class="example-wrap"><pre class="rust ">
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">command_buffer</span>::{<span class="ident">AutoCommandBufferBuilder</span>, <span class="ident">DynamicState</span>};
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">collections</span>::{<span class="ident">HashMap</span>, <span class="ident">HashSet</span>};
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">buffer</span>::{<span class="ident">BufferAccess</span>, <span class="ident">BufferUsage</span>, <span class="ident">ImmutableBuffer</span>, <span class="ident">CpuAccessibleBuffer</span>};
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">sync</span>::<span class="ident">Arc</span>;
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">format</span>::{<span class="ident">ClearValue</span>, <span class="ident">Format</span>, <span class="ident">R8Unorm</span>, <span class="ident">ClearValuesTuple</span>};
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">framebuffer</span>::{<span class="ident">FramebufferAbstract</span>, <span class="ident">Framebuffer</span>, <span class="ident">RenderPass</span>, <span class="ident">RenderPassAbstract</span>};
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">device</span>::{<span class="ident">Device</span>, <span class="ident">Queue</span>};
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">instance</span>::<span class="ident">PhysicalDevice</span>;
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">image</span>::<span class="ident">immutable</span>::<span class="ident">ImmutableImage</span>;
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">image</span>::{<span class="ident">Dimensions</span>, <span class="ident">ImageAccess</span>, <span class="ident">ImageDimensions</span>, <span class="ident">SwapchainImage</span>, <span class="ident">ImageUsage</span>, <span class="ident">AttachmentImage</span>, <span class="ident">ImageLayout</span>};
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">sampler</span>::{<span class="ident">Sampler</span>, <span class="ident">SamplerAddressMode</span>, <span class="ident">MipmapMode</span>, <span class="ident">Filter</span>};
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">descriptor</span>::<span class="ident">DescriptorSet</span>;
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">descriptor</span>::<span class="ident">descriptor_set</span>::<span class="ident">PersistentDescriptorSet</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">path</span>::<span class="ident">PathBuf</span>;
<span class="kw">use</span> <span class="ident">image</span>::<span class="ident">GenericImageView</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">iter</span>::<span class="ident">FromIterator</span>;
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">swapchain</span>::<span class="ident">Capabilities</span>;
<span class="kw">use</span> <span class="ident">winit</span>::<span class="ident">Window</span>;
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">pipeline</span>::<span class="ident">viewport</span>::<span class="ident">Viewport</span>;
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">descriptor</span>::<span class="ident">descriptor</span>::<span class="ident">DescriptorDescTy</span>::<span class="ident">TexelBuffer</span>;
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">canvas</span>::<span class="ident">canvas_frame</span>::{<span class="ident">CanvasFrame</span>};
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">hash</span>::<span class="ident">Hash</span>;
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">pipeline</span>::<span class="ident">depth_stencil</span>::{<span class="ident">StencilFaceFlags</span>, <span class="ident">DynamicStencilValue</span>};
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">memory</span>::<span class="ident">pool</span>::<span class="ident">PotentialDedicatedAllocation</span>::<span class="ident">Generic</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">borrow</span>::<span class="ident">Borrow</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">fs</span>::<span class="ident">File</span>;
<span class="kw">use</span> <span class="ident">std</span>::<span class="ident">io</span>::<span class="ident">Read</span>;
<span class="kw">use</span> <span class="ident">rusttype</span>::{<span class="ident">Font</span>, <span class="ident">PositionedGlyph</span>, <span class="ident">Scale</span>, <span class="ident">Rect</span>, <span class="ident">point</span>, <span class="ident">GlyphId</span>, <span class="ident">Line</span>, <span class="ident">Curve</span>, <span class="ident">Segment</span>};
<span class="kw">use</span> <span class="ident">vulkano</span>::<span class="ident">pipeline</span>::<span class="ident">vertex</span>::{<span class="ident">VertexDefinition</span>, <span class="ident">Vertex</span>};
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">canvas</span>::<span class="ident">managed</span>::<span class="ident">shader</span>::<span class="ident">dynamic_vertex</span>::<span class="ident">RuntimeVertexDef</span>;
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">canvas</span>::<span class="ident">managed</span>::<span class="ident">handles</span>::{<span class="ident">CanvasTextureHandle</span>, <span class="ident">CanvasImageHandle</span>, <span class="ident">CanvasFontHandle</span>, <span class="ident">CompiledShaderHandle</span>, <span class="ident">Handle</span>, <span class="ident">DrawableHandle</span>};
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">canvas</span>::<span class="ident">managed</span>::<span class="ident">gpu_buffers</span>::{<span class="ident">CanvasImage</span>, <span class="ident">CanvasTexture</span>, <span class="ident">CanvasFont</span>};
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">canvas</span>::<span class="ident">managed</span>::<span class="ident">shader</span>::<span class="ident">shader_common</span>::<span class="ident">CompiledShader</span>;
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">canvas</span>::<span class="ident">managed</span>::<span class="ident">shader</span>::<span class="ident">generic_shader</span>::<span class="ident">GenericShader</span>;
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">VertexTypes</span>;
<span class="kw">use</span> <span class="kw">crate</span>::<span class="ident">util</span>::<span class="ident">vertex</span>::{<span class="ident">TextVertex3D</span>, <span class="ident">TextureVertex3D</span>, <span class="ident">ImageVertex3D</span>, <span class="ident">ColorVertex3D</span>, <span class="ident">CanvasFrameAllocation</span>};
<span class="kw">use</span> <span class="ident">shade_runner</span>::<span class="ident">Input</span>;
<span class="doccomment">/// Canvas state is used for storage of texture and image buffers in addition to vertex buffers</span>
<span class="doccomment">/// Canvas state also contains logic for writing the stored buffers to the command_buffer</span>
<span class="attribute">#[<span class="ident">derive</span>(<span class="ident">Clone</span>)]</span>
<span class="kw">pub</span> <span class="kw">struct</span> <span class="ident">CanvasState</span> {
<span class="doccomment">/// Generated during new()</span>
<span class="ident">dynamic_state</span>: <span class="ident">DynamicState</span>,
<span class="doccomment">/// Generated during new()</span>
<span class="ident">sampler</span>: <span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">Sampler</span><span class="op">&gt;</span>,
<span class="doccomment">/// hold the image, texture, and Fonts the same was as we do CompuState</span>
<span class="ident">image_buffers</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CanvasImage</span><span class="op">&gt;</span><span class="op">&gt;</span>,
<span class="ident">texture_buffers</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CanvasTexture</span><span class="op">&gt;</span><span class="op">&gt;</span>,
<span class="ident">font_buffers</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CanvasFont</span><span class="op">&gt;</span><span class="op">&gt;</span>,
<span class="doccomment">/// Compiled Graphics pipelines have a handle which self describe their position in this vector</span>
<span class="ident">shader_buffers</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">CompiledShader</span><span class="op">&gt;</span><span class="op">&gt;</span><span class="op">&gt;</span>,
<span class="doccomment">/// Looks like we gotta hold onto the queue for managing textures</span>
<span class="ident">queue</span>: <span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">Queue</span><span class="op">&gt;</span>,
<span class="ident">device</span>: <span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">Device</span><span class="op">&gt;</span>,
<span class="ident">render_pass</span>: <span class="ident">Arc</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">RenderPassAbstract</span> <span class="op">+</span> <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span><span class="op">&gt;</span>,
}
<span class="kw">impl</span> <span class="ident">CanvasState</span> {
<span class="doccomment">/// This method is called once during initialization, then again whenever the window is resized</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">window_size_dependent_setup</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">images</span>: <span class="kw-2">&amp;</span>[<span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">SwapchainImage</span><span class="op">&lt;</span><span class="ident">Window</span><span class="op">&gt;</span><span class="op">&gt;</span>])
<span class="op">-</span><span class="op">&gt;</span> <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">FramebufferAbstract</span> <span class="op">+</span> <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span><span class="op">&gt;</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">dimensions</span> <span class="op">=</span> <span class="ident">images</span>[<span class="number">0</span>].<span class="ident">dimensions</span>();
<span class="self">self</span>.<span class="ident">dynamic_state</span>.<span class="ident">viewports</span> <span class="op">=</span>
<span class="prelude-val">Some</span>(<span class="macro">vec</span><span class="macro">!</span>[<span class="ident">Viewport</span> {
<span class="ident">origin</span>: [<span class="number">0.0</span>, <span class="number">0.0</span>],
<span class="ident">dimensions</span>: [<span class="ident">dimensions</span>.<span class="ident">width</span>() <span class="kw">as</span> <span class="ident">f32</span>, <span class="ident">dimensions</span>.<span class="ident">height</span>() <span class="kw">as</span> <span class="ident">f32</span>],
<span class="ident">depth_range</span>: <span class="number">0.0</span>..<span class="number">1.0</span>,
}]);
<span class="kw">let</span> <span class="ident">dimensions</span> <span class="op">=</span> [<span class="ident">dimensions</span>.<span class="ident">width</span>(), <span class="ident">dimensions</span>.<span class="ident">height</span>()];
<span class="kw">let</span> <span class="ident">depth_buffer</span> <span class="op">=</span> <span class="ident">AttachmentImage</span>::<span class="ident">transient</span>(<span class="self">self</span>.<span class="ident">device</span>.<span class="ident">clone</span>(), <span class="ident">dimensions</span>, <span class="ident">Format</span>::<span class="ident">D32Sfloat_S8Uint</span>).<span class="ident">unwrap</span>();
<span class="ident">images</span>.<span class="ident">iter</span>().<span class="ident">map</span>(<span class="op">|</span><span class="ident">image</span><span class="op">|</span> {
<span class="ident">Arc</span>::<span class="ident">new</span>(
<span class="ident">Framebuffer</span>::<span class="ident">start</span>(<span class="self">self</span>.<span class="ident">render_pass</span>.<span class="ident">clone</span>())
.<span class="ident">add</span>(<span class="ident">image</span>.<span class="ident">clone</span>()).<span class="ident">unwrap</span>()
.<span class="ident">add</span>(<span class="ident">depth_buffer</span>.<span class="ident">clone</span>()).<span class="ident">unwrap</span>()
.<span class="ident">build</span>().<span class="ident">unwrap</span>()
) <span class="kw">as</span> <span class="ident">Arc</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">FramebufferAbstract</span> <span class="op">+</span> <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span><span class="op">&gt;</span>
}).<span class="ident">collect</span>::<span class="op">&lt;</span><span class="ident">Vec</span><span class="op">&lt;</span><span class="kw">_</span><span class="op">&gt;</span><span class="op">&gt;</span>()
}
<span class="doccomment">/// Creates a Canvas State. Which at this point is pretty empty</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">new</span>(<span class="ident">queue</span>: <span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">Queue</span><span class="op">&gt;</span>,
<span class="ident">device</span>: <span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">Device</span><span class="op">&gt;</span>,
<span class="ident">physical</span>: <span class="ident">PhysicalDevice</span>,
<span class="ident">capabilities</span>: <span class="ident">Capabilities</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">CanvasState</span> {
<span class="kw">let</span> <span class="ident">format</span> <span class="op">=</span> <span class="ident">capabilities</span>.<span class="ident">supported_formats</span>[<span class="number">0</span>].<span class="number">0</span>;
<span class="kw">let</span> <span class="ident">render_pass</span> <span class="op">=</span> <span class="ident">Arc</span>::<span class="ident">new</span>(<span class="ident">vulkano</span>::<span class="macro">single_pass_renderpass</span><span class="macro">!</span>(
<span class="ident">device</span>.<span class="ident">clone</span>(),
<span class="comment">// Attachments are outgoing like f_color</span>
<span class="ident">attachments</span>: {
<span class="comment">// `color` is a custom name we give to the first and only attachment.</span>
<span class="ident">color</span>: {
<span class="comment">// `load: Clear` means that we ask the GPU to clear the content of this</span>
<span class="comment">// attachment at the start of the drawing.</span>
<span class="ident">load</span>: <span class="ident">Clear</span>,
<span class="comment">// `store: Store` means that we ask the GPU to store the output of the draw</span>
<span class="comment">// in the actual image. We could also ask it to discard the result.</span>
<span class="ident">store</span>: <span class="ident">Store</span>,
<span class="comment">// `format: &lt;ty&gt;` indicates the type of the format of the image. This has to</span>
<span class="comment">// be one of the types of the `vulkano::format` module (or alternatively one</span>
<span class="comment">// of your structs that implements the `FormatDesc` trait). Here we use the</span>
<span class="comment">// same format as the swapchain.</span>
<span class="ident">format</span>: <span class="ident">format</span>,
<span class="ident">samples</span>: <span class="number">1</span>,
},
<span class="ident">depth</span>: {
<span class="ident">load</span>: <span class="ident">Clear</span>,
<span class="ident">store</span>: <span class="ident">DontCare</span>,
<span class="ident">format</span>: <span class="ident">Format</span>::<span class="ident">D32Sfloat_S8Uint</span>,
<span class="ident">samples</span>: <span class="number">1</span>,
}
},
<span class="ident">pass</span>: {
<span class="comment">// We use the attachment named `color` as the one and only color attachment.</span>
<span class="ident">color</span>: [<span class="ident">color</span>],
<span class="comment">// No depth-stencil attachment is indicated with empty brackets.</span>
<span class="ident">depth_stencil</span>: {<span class="ident">depth</span>}
}
).<span class="ident">unwrap</span>());
<span class="ident">CanvasState</span> {
<span class="comment">// TODO: Might need to move this</span>
<span class="ident">dynamic_state</span>: <span class="ident">DynamicState</span> {
<span class="ident">line_width</span>: <span class="prelude-val">None</span>,
<span class="ident">viewports</span>: <span class="prelude-val">None</span>,
<span class="ident">scissors</span>: <span class="prelude-val">None</span>,
<span class="ident">compare_mask</span>: <span class="prelude-val">Some</span>(<span class="ident">DynamicStencilValue</span> {
<span class="ident">face</span>: <span class="ident">StencilFaceFlags</span>::<span class="ident">StencilFrontAndBack</span>,
<span class="ident">value</span>: <span class="number">0xFF</span>,
}),
<span class="ident">write_mask</span>: <span class="prelude-val">Some</span>(<span class="ident">DynamicStencilValue</span> {
<span class="ident">face</span>: <span class="ident">StencilFaceFlags</span>::<span class="ident">StencilFrontAndBack</span>,
<span class="ident">value</span>: <span class="number">0xFF</span>,
}),
<span class="ident">reference</span>: <span class="prelude-val">Some</span>(<span class="ident">DynamicStencilValue</span> {
<span class="ident">face</span>: <span class="ident">StencilFaceFlags</span>::<span class="ident">StencilFrontAndBack</span>,
<span class="ident">value</span>: <span class="number">0xFF</span>,
}),
},
<span class="ident">sampler</span>: <span class="ident">Sampler</span>::<span class="ident">new</span>(<span class="ident">device</span>.<span class="ident">clone</span>(),
<span class="ident">Filter</span>::<span class="ident">Linear</span>, <span class="ident">Filter</span>::<span class="ident">Linear</span>,
<span class="ident">MipmapMode</span>::<span class="ident">Nearest</span>,
<span class="ident">SamplerAddressMode</span>::<span class="ident">Repeat</span>, <span class="ident">SamplerAddressMode</span>::<span class="ident">Repeat</span>,
<span class="ident">SamplerAddressMode</span>::<span class="ident">Repeat</span>, <span class="number">0.0</span>, <span class="number">1.0</span>, <span class="number">0.0</span>, <span class="number">0.0</span>).<span class="ident">unwrap</span>(),
<span class="ident">image_buffers</span>: <span class="macro">vec</span><span class="macro">!</span>[],
<span class="ident">texture_buffers</span>: <span class="macro">vec</span><span class="macro">!</span>[],
<span class="ident">shader_buffers</span>: <span class="macro">vec</span><span class="macro">!</span>[],
<span class="ident">font_buffers</span>: <span class="macro">vec</span><span class="macro">!</span>[],
<span class="ident">queue</span>: <span class="ident">queue</span>.<span class="ident">clone</span>(),
<span class="ident">device</span>: <span class="ident">device</span>.<span class="ident">clone</span>(),
<span class="ident">render_pass</span>: <span class="ident">render_pass</span>.<span class="ident">clone</span>(),
}
}
<span class="doccomment">/// Using the dimensions and suggested usage, load a CanvasImage and return it&#39;s handle</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">create_image</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">dimensions</span>: (<span class="ident">u32</span>, <span class="ident">u32</span>), <span class="ident">usage</span>: <span class="ident">ImageUsage</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CanvasImageHandle</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">handle</span> <span class="op">=</span> <span class="ident">Arc</span>::<span class="ident">new</span>(<span class="ident">CanvasImageHandle</span> { <span class="ident">handle</span>: <span class="self">self</span>.<span class="ident">image_buffers</span>.<span class="ident">len</span>() <span class="kw">as</span> <span class="ident">u32</span> });
<span class="kw">let</span> <span class="ident">image</span> <span class="op">=</span> <span class="ident">CanvasImage</span> {
<span class="ident">handle</span>: <span class="ident">handle</span>.<span class="ident">clone</span>(),
<span class="ident">buffer</span>: <span class="ident">AttachmentImage</span>::<span class="ident">with_usage</span>(
<span class="self">self</span>.<span class="ident">device</span>.<span class="ident">clone</span>(),
[<span class="ident">dimensions</span>.<span class="number">0</span>, <span class="ident">dimensions</span>.<span class="number">1</span>],
<span class="ident">Format</span>::<span class="ident">R8G8B8A8Uint</span>,
<span class="ident">usage</span>).<span class="ident">unwrap</span>(),
<span class="ident">size</span>: <span class="ident">dimensions</span>,
};
<span class="self">self</span>.<span class="ident">image_buffers</span>.<span class="ident">push</span>(<span class="ident">Arc</span>::<span class="ident">new</span>(<span class="ident">image</span>));
<span class="ident">handle</span>
}
<span class="doccomment">/// Return the image buffer from an input image handle</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get_image</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">image_handle</span>: <span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CanvasImageHandle</span><span class="op">&gt;</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">AttachmentImage</span><span class="op">&gt;</span> {
<span class="self">self</span>.<span class="ident">image_buffers</span>.<span class="ident">get</span>((<span class="kw-2">*</span><span class="ident">image_handle</span>).<span class="ident">clone</span>().<span class="ident">get_handle</span>() <span class="kw">as</span> <span class="ident">usize</span>).<span class="ident">unwrap</span>()
.<span class="ident">clone</span>().<span class="ident">buffer</span>.<span class="ident">clone</span>()
}
<span class="doccomment">/// Load a texture buffer from an input filename</span>
<span class="kw">fn</span> <span class="ident">get_texture_from_file</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">image_filename</span>: <span class="ident">String</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">ImmutableImage</span><span class="op">&lt;</span><span class="ident">Format</span><span class="op">&gt;</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">project_root</span> <span class="op">=</span>
<span class="ident">std</span>::<span class="ident">env</span>::<span class="ident">current_dir</span>()
.<span class="ident">expect</span>(<span class="string">&quot;failed to get root directory&quot;</span>);
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">compute_path</span> <span class="op">=</span> <span class="ident">project_root</span>.<span class="ident">clone</span>();
<span class="ident">compute_path</span>.<span class="ident">push</span>(<span class="ident">PathBuf</span>::<span class="ident">from</span>(<span class="string">&quot;resources/images/&quot;</span>));
<span class="ident">compute_path</span>.<span class="ident">push</span>(<span class="ident">PathBuf</span>::<span class="ident">from</span>(<span class="ident">image_filename</span>));
<span class="kw">let</span> <span class="ident">img</span> <span class="op">=</span> <span class="ident">image</span>::<span class="ident">open</span>(<span class="ident">compute_path</span>).<span class="ident">expect</span>(<span class="string">&quot;Couldn&#39;t find image&quot;</span>);
<span class="kw">let</span> <span class="ident">xy</span> <span class="op">=</span> <span class="ident">img</span>.<span class="ident">dimensions</span>();
<span class="kw">let</span> <span class="ident">data_length</span> <span class="op">=</span> <span class="ident">xy</span>.<span class="number">0</span> <span class="op">*</span> <span class="ident">xy</span>.<span class="number">1</span> <span class="op">*</span> <span class="number">4</span>;
<span class="kw">let</span> <span class="ident">pixel_count</span> <span class="op">=</span> <span class="ident">img</span>.<span class="ident">raw_pixels</span>().<span class="ident">len</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">image_buffer</span> <span class="op">=</span> <span class="ident">Vec</span>::<span class="ident">new</span>();
<span class="kw">if</span> <span class="ident">pixel_count</span> <span class="op">!</span><span class="op">=</span> <span class="ident">data_length</span> <span class="kw">as</span> <span class="ident">usize</span> {
<span class="macro">println</span><span class="macro">!</span>(<span class="string">&quot;Creating apha channel...&quot;</span>);
<span class="kw">for</span> <span class="ident">i</span> <span class="kw">in</span> <span class="ident">img</span>.<span class="ident">raw_pixels</span>().<span class="ident">iter</span>() {
<span class="kw">if</span> (<span class="ident">image_buffer</span>.<span class="ident">len</span>() <span class="op">+</span> <span class="number">1</span>) <span class="op">%</span> <span class="number">4</span> <span class="op">=</span><span class="op">=</span> <span class="number">0</span> {
<span class="ident">image_buffer</span>.<span class="ident">push</span>(<span class="number">255</span>);
}
<span class="ident">image_buffer</span>.<span class="ident">push</span>(<span class="kw-2">*</span><span class="ident">i</span>);
}
<span class="ident">image_buffer</span>.<span class="ident">push</span>(<span class="number">255</span>);
} <span class="kw">else</span> {
<span class="ident">image_buffer</span> <span class="op">=</span> <span class="ident">img</span>.<span class="ident">raw_pixels</span>();
}
<span class="kw">let</span> (<span class="ident">texture</span>, <span class="ident">tex_future</span>) <span class="op">=</span> <span class="ident">ImmutableImage</span>::<span class="ident">from_iter</span>(
<span class="ident">image_buffer</span>.<span class="ident">iter</span>().<span class="ident">cloned</span>(),
<span class="ident">Dimensions</span>::<span class="ident">Dim2d</span> { <span class="ident">width</span>: <span class="ident">xy</span>.<span class="number">0</span>, <span class="ident">height</span>: <span class="ident">xy</span>.<span class="number">1</span> },
<span class="ident">Format</span>::<span class="ident">R8G8B8A8Srgb</span>,
<span class="self">self</span>.<span class="ident">queue</span>.<span class="ident">clone</span>(),
).<span class="ident">unwrap</span>();
<span class="ident">texture</span>
}
<span class="doccomment">/// Load a texture using it&#39;s filename from a file. Returns the handle of the loaded texture</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">load_texture</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">filename</span>: <span class="ident">String</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CanvasTextureHandle</span><span class="op">&gt;</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">texture_buffer</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">get_texture_from_file</span>(<span class="ident">filename</span>.<span class="ident">clone</span>());
<span class="kw">let</span> <span class="ident">handle</span> <span class="op">=</span> <span class="ident">Arc</span>::<span class="ident">new</span>(<span class="ident">CanvasTextureHandle</span> {
<span class="ident">handle</span>: <span class="self">self</span>.<span class="ident">texture_buffers</span>.<span class="ident">len</span>() <span class="kw">as</span> <span class="ident">u32</span>
});
<span class="kw">let</span> <span class="ident">texture</span> <span class="op">=</span> <span class="ident">Arc</span>::<span class="ident">new</span>(<span class="ident">CanvasTexture</span> {
<span class="ident">handle</span>: <span class="ident">handle</span>.<span class="ident">clone</span>(),
<span class="ident">buffer</span>: <span class="self">self</span>.<span class="ident">get_texture_from_file</span>(<span class="ident">filename</span>.<span class="ident">clone</span>()),
<span class="ident">name</span>: <span class="ident">filename</span>.<span class="ident">clone</span>(),
<span class="ident">size</span>: (<span class="number">0</span>, <span class="number">0</span>),
});
<span class="self">self</span>.<span class="ident">texture_buffers</span>.<span class="ident">push</span>(<span class="ident">texture</span>);
<span class="prelude-val">Some</span>(<span class="ident">handle</span>)
}
<span class="doccomment">/// Load and Compile a shader with the filename at resources/shaders</span>
<span class="doccomment">/// Takes physical and capabilities as we don&#39;t store that in Canvas</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">load_shader</span><span class="op">&lt;</span><span class="ident">T</span>: <span class="lifetime">&#39;static</span>, <span class="ident">V</span><span class="op">&gt;</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="self">self</span>,
<span class="ident">filename</span>: <span class="ident">String</span>,
<span class="ident">physical</span>: <span class="ident">PhysicalDevice</span>,
<span class="ident">capabilities</span>: <span class="ident">Capabilities</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CompiledShaderHandle</span><span class="op">&gt;</span><span class="op">&gt;</span>
<span class="kw">where</span> <span class="ident">T</span>: <span class="ident">CompiledShader</span>, <span class="ident">V</span>: <span class="ident">Vertex</span> {
<span class="kw">let</span> <span class="ident">handle</span> <span class="op">=</span> <span class="ident">Arc</span>::<span class="ident">new</span>(<span class="ident">CompiledShaderHandle</span> {
<span class="ident">handle</span>: <span class="self">self</span>.<span class="ident">shader_buffers</span>.<span class="ident">len</span>() <span class="kw">as</span> <span class="ident">u32</span>
});
<span class="kw">let</span> <span class="ident">shader</span>: <span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">CompiledShader</span><span class="op">&gt;</span> <span class="op">=</span> <span class="ident">Box</span>::<span class="ident">new</span>(<span class="ident">T</span>::<span class="ident">new</span>::<span class="op">&lt;</span><span class="ident">V</span><span class="op">&gt;</span>(
<span class="ident">filename</span>.<span class="ident">clone</span>(),
<span class="self">self</span>.<span class="ident">device</span>.<span class="ident">clone</span>(),
<span class="ident">handle</span>.<span class="ident">clone</span>(),
<span class="self">self</span>.<span class="ident">render_pass</span>.<span class="ident">clone</span>(),
));
<span class="self">self</span>.<span class="ident">shader_buffers</span>.<span class="ident">push</span>(<span class="ident">Arc</span>::<span class="ident">new</span>(<span class="ident">shader</span>));
<span class="prelude-val">Some</span>(<span class="ident">handle</span>)
}
<span class="doccomment">/// Using the dimensions and suggested usage, load a CanvasImage and return it&#39;s handle</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">load_font</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">name</span>: <span class="ident">String</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CanvasFontHandle</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">handle</span> <span class="op">=</span> <span class="ident">Arc</span>::<span class="ident">new</span>(<span class="ident">CanvasFontHandle</span> { <span class="ident">handle</span>: <span class="self">self</span>.<span class="ident">font_buffers</span>.<span class="ident">len</span>() <span class="kw">as</span> <span class="ident">u32</span> });
<span class="self">self</span>.<span class="ident">font_buffers</span>.<span class="ident">push</span>(<span class="ident">Arc</span>::<span class="ident">new</span>({
<span class="kw">let</span> <span class="ident">font</span> <span class="op">=</span> <span class="ident">Font</span>::<span class="ident">from_bytes</span>({
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">f</span> <span class="op">=</span> <span class="ident">File</span>::<span class="ident">open</span>(<span class="string">&quot;resources/fonts/sansation.ttf&quot;</span>).<span class="ident">expect</span>(<span class="string">&quot;Font file not found&quot;</span>);
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">font_data</span> <span class="op">=</span> <span class="ident">Vec</span>::<span class="ident">new</span>();
<span class="ident">f</span>.<span class="ident">read_to_end</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="ident">font_data</span>).<span class="ident">expect</span>(<span class="string">&quot;Dont know&quot;</span>);
<span class="ident">font_data</span>
}).<span class="ident">unwrap</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">current_x</span> <span class="op">=</span> <span class="number">0</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">current_y</span> <span class="op">=</span> <span class="number">0</span>;
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">accumulator</span> <span class="op">=</span> <span class="ident">Vec</span>::<span class="ident">new</span>();
<span class="kw">for</span> <span class="ident">i</span> <span class="kw">in</span> (<span class="number">0</span>..<span class="number">255</span>) {
<span class="kw">let</span> <span class="ident">glyph</span> <span class="op">=</span> <span class="ident">font</span>.<span class="ident">glyph</span>(<span class="string">&#39;d&#39;</span>);
<span class="kw">let</span> <span class="ident">s</span> <span class="op">=</span> <span class="ident">glyph</span>.<span class="ident">scaled</span>(<span class="ident">Scale</span> { <span class="ident">x</span>: <span class="number">1.0</span>, <span class="ident">y</span>: <span class="number">1.0</span> });
<span class="kw">let</span> <span class="ident">shape</span> <span class="op">=</span> <span class="ident">s</span>.<span class="ident">shape</span>().<span class="ident">unwrap</span>();
<span class="kw">for</span> <span class="ident">contour</span> <span class="kw">in</span> <span class="ident">shape</span> {
<span class="kw">for</span> <span class="ident">segment</span> <span class="kw">in</span> <span class="ident">contour</span>.<span class="ident">segments</span> {
<span class="kw">match</span> <span class="ident">segment</span> {
<span class="ident">Segment</span>::<span class="ident">Line</span>(<span class="ident">l</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">accumulator</span>.<span class="ident">push</span>(<span class="ident">TextVertex3D</span> {
<span class="ident">position</span>: [<span class="ident">l</span>.<span class="ident">p</span>[<span class="number">0</span>].<span class="ident">x</span> <span class="kw">as</span> <span class="ident">f32</span>, <span class="ident">l</span>.<span class="ident">p</span>[<span class="number">0</span>].<span class="ident">y</span> <span class="kw">as</span> <span class="ident">f32</span>, <span class="number">0.0</span>],
});
}
<span class="ident">Segment</span>::<span class="ident">Curve</span>(<span class="ident">c</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">accumulator</span>.<span class="ident">push</span>(<span class="ident">TextVertex3D</span> {
<span class="ident">position</span>: [<span class="ident">c</span>.<span class="ident">p</span>[<span class="number">0</span>].<span class="ident">x</span> <span class="kw">as</span> <span class="ident">f32</span>, <span class="ident">c</span>.<span class="ident">p</span>[<span class="number">0</span>].<span class="ident">y</span> <span class="kw">as</span> <span class="ident">f32</span>, <span class="number">0.0</span>],
});
}
}
}
}
}
<span class="ident">CanvasFont</span> {
<span class="ident">handle</span>: <span class="ident">handle</span>.<span class="ident">clone</span>(),
<span class="ident">font</span>: <span class="ident">font</span>.<span class="ident">clone</span>(),
<span class="ident">name</span>: <span class="ident">name</span>,
<span class="ident">buffer</span>: <span class="ident">ImmutableBuffer</span>::<span class="ident">from_iter</span>(
<span class="ident">accumulator</span>.<span class="ident">iter</span>().<span class="ident">cloned</span>(),
<span class="ident">BufferUsage</span>::<span class="ident">vertex_buffer</span>(), <span class="self">self</span>.<span class="ident">queue</span>.<span class="ident">clone</span>()).<span class="ident">unwrap</span>().<span class="number">0</span>,
}
}));
<span class="ident">handle</span>
}
<span class="doccomment">/// Using the texture name, iterates through the stored textures and matches by the name</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get_texture_handle</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">texture_name</span>: <span class="ident">String</span>)
<span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CanvasTextureHandle</span><span class="op">&gt;</span><span class="op">&gt;</span> {
<span class="kw">for</span> <span class="ident">i</span> <span class="kw">in</span> <span class="self">self</span>.<span class="ident">texture_buffers</span>.<span class="ident">clone</span>() {
<span class="kw">if</span> <span class="ident">i</span>.<span class="ident">name</span> <span class="op">=</span><span class="op">=</span> <span class="ident">texture_name</span> {
<span class="kw">return</span> <span class="prelude-val">Some</span>(<span class="ident">i</span>.<span class="ident">handle</span>.<span class="ident">clone</span>());
}
}
<span class="prelude-val">None</span>
}
<span class="doccomment">/// Using the shader name, iterates through the stored shaders and matches by the name</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get_shader_handle</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">shader_name</span>: <span class="ident">String</span>)
<span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CompiledShaderHandle</span><span class="op">&gt;</span><span class="op">&gt;</span> {
<span class="kw">for</span> <span class="ident">shader</span> <span class="kw">in</span> <span class="self">self</span>.<span class="ident">shader_buffers</span>.<span class="ident">clone</span>() {
<span class="kw">if</span> <span class="ident">shader</span>.<span class="ident">get_name</span>() <span class="op">=</span><span class="op">=</span> <span class="ident">shader_name</span> {
<span class="kw">return</span> <span class="prelude-val">Some</span>(<span class="ident">shader</span>.<span class="ident">get_handle</span>().<span class="ident">clone</span>());
}
}
<span class="prelude-val">None</span>
}
<span class="doccomment">/// Using the font name, iterates through the stored fonts and matches by the name</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get_font_handle</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">font_name</span>: <span class="ident">String</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="prelude-ty">Option</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CanvasFontHandle</span><span class="op">&gt;</span><span class="op">&gt;</span> {
<span class="kw">for</span> <span class="ident">font</span> <span class="kw">in</span> <span class="self">self</span>.<span class="ident">font_buffers</span>.<span class="ident">clone</span>() {
<span class="kw">if</span> <span class="ident">font</span>.<span class="ident">name</span> <span class="op">=</span><span class="op">=</span> <span class="ident">font_name</span> {
<span class="kw">return</span> <span class="prelude-val">Some</span>(<span class="ident">font</span>.<span class="ident">handle</span>.<span class="ident">clone</span>());
}
}
<span class="prelude-val">None</span>
}
<span class="doccomment">/// Using the texture handle, grab the stored texture and return the buffer</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">get_texture</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">texture_handle</span>: <span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CanvasTextureHandle</span><span class="op">&gt;</span>)
<span class="op">-</span><span class="op">&gt;</span> <span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">ImmutableImage</span><span class="op">&lt;</span><span class="ident">Format</span><span class="op">&gt;</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">handle</span> <span class="op">=</span> <span class="ident">texture_handle</span>.<span class="ident">get_handle</span>() <span class="kw">as</span> <span class="ident">usize</span>;
<span class="kw">if</span> <span class="kw">let</span> <span class="prelude-val">Some</span>(<span class="ident">i</span>) <span class="op">=</span> <span class="self">self</span>.<span class="ident">texture_buffers</span>.<span class="ident">get</span>(<span class="ident">handle</span>) {
<span class="kw">return</span> <span class="ident">i</span>.<span class="ident">clone</span>().<span class="ident">buffer</span>.<span class="ident">clone</span>();
} <span class="kw">else</span> {
<span class="macro">panic</span><span class="macro">!</span>(<span class="string">&quot;{} : Texture not loaded&quot;</span>, <span class="ident">handle</span>);
}
}
<span class="doccomment">/// Builds the descriptor set for solid colors using the input kernel (needs to support solid colors)</span>
<span class="kw">fn</span> <span class="ident">get_solid_color_descriptor_set</span>(<span class="kw-2">&amp;</span><span class="self">self</span>, <span class="ident">kernel</span>: <span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">GenericShader</span><span class="op">&gt;</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">DescriptorSet</span> <span class="op">+</span> <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span><span class="op">&gt;</span> {
<span class="kw">let</span> <span class="ident">o</span>: <span class="ident">Box</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">DescriptorSet</span> <span class="op">+</span> <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span><span class="op">&gt;</span> <span class="op">=</span> <span class="ident">Box</span>::<span class="ident">new</span>(
<span class="ident">PersistentDescriptorSet</span>::<span class="ident">start</span>(
<span class="ident">kernel</span>.<span class="ident">clone</span>().<span class="ident">get_pipeline</span>().<span class="ident">clone</span>(), <span class="number">0</span>,
).<span class="ident">build</span>().<span class="ident">unwrap</span>());
<span class="ident">o</span>
}
<span class="doccomment">/// Consume and allocate the canvas frame data to the GPU</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">allocate</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="self">self</span>, <span class="ident">canvas_frame</span>: <span class="ident">CanvasFrame</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">CanvasFrameAllocation</span> {
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">colored_vertex_buffer</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">ColorVertex3D</span><span class="op">&gt;</span> <span class="op">=</span> <span class="ident">Vec</span>::<span class="ident">default</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">textured_vertex_buffer</span>: <span class="ident">HashMap</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CanvasTextureHandle</span><span class="op">&gt;</span>, <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">TextureVertex3D</span><span class="op">&gt;</span><span class="op">&gt;</span> <span class="op">=</span> <span class="ident">HashMap</span>::<span class="ident">new</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">image_vertex_buffer</span>: <span class="ident">HashMap</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CanvasImageHandle</span><span class="op">&gt;</span>, <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">ImageVertex3D</span><span class="op">&gt;</span><span class="op">&gt;</span> <span class="op">=</span> <span class="ident">HashMap</span>::<span class="ident">new</span>();
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">text_instances</span>: <span class="ident">HashMap</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="ident">CanvasFontHandle</span><span class="op">&gt;</span>, <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">TextVertex3D</span><span class="op">&gt;</span><span class="op">&gt;</span> <span class="op">=</span> <span class="ident">HashMap</span>::<span class="ident">new</span>();
<span class="kw">for</span> <span class="ident">value</span> <span class="kw">in</span> <span class="ident">canvas_frame</span>.<span class="ident">map</span> {
<span class="kw">match</span> <span class="ident">value</span> {
<span class="ident">VertexTypes</span>::<span class="ident">TextureType</span>(<span class="ident">vertices</span>, <span class="ident">handle</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">textured_vertex_buffer</span>.<span class="ident">entry</span>(<span class="ident">handle</span>).<span class="ident">or_insert</span>(<span class="ident">vertices</span>.<span class="ident">clone</span>()).<span class="ident">extend</span>(<span class="ident">vertices</span>);
}
<span class="ident">VertexTypes</span>::<span class="ident">ImageType</span>(<span class="ident">vertices</span>, <span class="ident">handle</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">image_vertex_buffer</span>.<span class="ident">entry</span>(<span class="ident">handle</span>).<span class="ident">or_insert</span>(<span class="ident">vertices</span>.<span class="ident">clone</span>()).<span class="ident">extend</span>(<span class="ident">vertices</span>);
}
<span class="ident">VertexTypes</span>::<span class="ident">ColorType</span>(<span class="ident">vertices</span>) <span class="op">=</span><span class="op">&gt;</span> {
<span class="ident">colored_vertex_buffer</span>.<span class="ident">extend</span>(<span class="ident">vertices</span>);
}
<span class="ident">VertexTypes</span>::<span class="ident">ThreeDType</span>(<span class="ident">vertices</span>) <span class="op">=</span><span class="op">&gt;</span> {}
};
};
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">allocated_colored_buffer</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span>(<span class="kw">dyn</span> <span class="ident">BufferAccess</span> <span class="op">+</span> <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span>)<span class="op">&gt;</span><span class="op">&gt;</span> <span class="op">=</span> <span class="ident">Vec</span>::<span class="ident">new</span>();
<span class="kw">if</span> <span class="op">!</span><span class="ident">colored_vertex_buffer</span>.<span class="ident">is_empty</span>() {
<span class="ident">allocated_colored_buffer</span>.<span class="ident">push</span>(<span class="ident">ImmutableBuffer</span>::<span class="ident">from_iter</span>(
<span class="ident">colored_vertex_buffer</span>.<span class="ident">iter</span>().<span class="ident">cloned</span>(),
<span class="ident">BufferUsage</span>::<span class="ident">vertex_buffer</span>(),
<span class="self">self</span>.<span class="ident">queue</span>.<span class="ident">clone</span>(),
).<span class="ident">unwrap</span>().<span class="number">0</span>);
}
<span class="ident">CanvasFrameAllocation</span> {
<span class="ident">colored_vertex_buffer</span>: <span class="ident">allocated_colored_buffer</span>,
<span class="ident">textured_vertex_buffer</span>: <span class="ident">textured_vertex_buffer</span>.<span class="ident">into_iter</span>().<span class="ident">map</span>(<span class="op">|</span>(<span class="ident">k</span>, <span class="ident">v</span>)<span class="op">|</span> {
(<span class="ident">k</span>,
<span class="ident">ImmutableBuffer</span>::<span class="ident">from_iter</span>(
<span class="ident">v</span>.<span class="ident">iter</span>().<span class="ident">cloned</span>(),
<span class="ident">BufferUsage</span>::<span class="ident">vertex_buffer</span>(),
<span class="self">self</span>.<span class="ident">queue</span>.<span class="ident">clone</span>(),
).<span class="ident">unwrap</span>().<span class="number">0</span> <span class="kw">as</span> <span class="ident">Arc</span><span class="op">&lt;</span>(<span class="kw">dyn</span> <span class="ident">BufferAccess</span> <span class="op">+</span> <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span>)<span class="op">&gt;</span>)
}).<span class="ident">collect</span>(),
<span class="ident">image_vertex_buffer</span>: <span class="ident">image_vertex_buffer</span>.<span class="ident">into_iter</span>().<span class="ident">map</span>(<span class="op">|</span>(<span class="ident">k</span>, <span class="ident">v</span>)<span class="op">|</span> {
(<span class="ident">k</span>,
<span class="ident">ImmutableBuffer</span>::<span class="ident">from_iter</span>(
<span class="ident">v</span>.<span class="ident">iter</span>().<span class="ident">cloned</span>(),
<span class="ident">BufferUsage</span>::<span class="ident">vertex_buffer</span>(),
<span class="self">self</span>.<span class="ident">queue</span>.<span class="ident">clone</span>(),
).<span class="ident">unwrap</span>().<span class="number">0</span> <span class="kw">as</span> <span class="ident">Arc</span><span class="op">&lt;</span>(<span class="kw">dyn</span> <span class="ident">BufferAccess</span> <span class="op">+</span> <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span>)<span class="op">&gt;</span>)
}).<span class="ident">collect</span>(),
<span class="ident">text_instances</span>: <span class="ident">Default</span>::<span class="ident">default</span>(),
}
}
<span class="doccomment">/// Pushes the draw commands to the command buffer. Requires the framebuffers and</span>
<span class="doccomment">/// image number to be passed in as they are taken care of by the vkprocessor</span>
<span class="kw">pub</span> <span class="kw">fn</span> <span class="ident">draw_commands</span>(<span class="kw-2">&amp;</span><span class="kw-2">mut</span> <span class="self">self</span>,
<span class="kw-2">mut</span> <span class="ident">command_buffer</span>: <span class="ident">AutoCommandBufferBuilder</span>,
<span class="ident">framebuffers</span>: <span class="ident">Vec</span><span class="op">&lt;</span><span class="ident">Arc</span><span class="op">&lt;</span><span class="kw">dyn</span> <span class="ident">FramebufferAbstract</span> <span class="op">+</span> <span class="ident">Send</span> <span class="op">+</span> <span class="ident">Sync</span><span class="op">&gt;</span><span class="op">&gt;</span>,
<span class="ident">image_num</span>: <span class="ident">usize</span>,
<span class="ident">allocated_buffers</span>: <span class="ident">CanvasFrameAllocation</span>) <span class="op">-</span><span class="op">&gt;</span> <span class="ident">AutoCommandBufferBuilder</span> {
<span class="comment">// Specify the color to clear the framebuffer with i.e. blue</span>
<span class="kw">let</span> <span class="ident">clear_values</span> <span class="op">=</span> <span class="macro">vec</span><span class="macro">!</span>(
<span class="ident">ClearValue</span>::<span class="ident">Float</span>([<span class="number">0.0</span>, <span class="number">0.0</span>, <span class="number">1.0</span>, <span class="number">1.0</span>]),
<span class="ident">ClearValue</span>::<span class="ident">DepthStencil</span>((<span class="number">1.0</span>, <span class="number">0x00</span>)),
);
<span class="self">self</span>.<span class="ident">dynamic_state</span> <span class="op">=</span> <span class="ident">DynamicState</span> {
<span class="ident">line_width</span>: <span class="prelude-val">None</span>,
<span class="ident">viewports</span>: <span class="self">self</span>.<span class="ident">dynamic_state</span>.<span class="ident">viewports</span>.<span class="ident">clone</span>(),
<span class="ident">scissors</span>: <span class="prelude-val">None</span>,
<span class="ident">compare_mask</span>: <span class="prelude-val">None</span>,
<span class="ident">write_mask</span>: <span class="prelude-val">None</span>,
<span class="ident">reference</span>: <span class="prelude-val">None</span>,
};
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">command_buffer</span> <span class="op">=</span> <span class="ident">command_buffer</span>.<span class="ident">begin_render_pass</span>(
<span class="ident">framebuffers</span>[<span class="ident">image_num</span>].<span class="ident">clone</span>(), <span class="bool-val">false</span>, <span class="ident">clear_values</span>.<span class="ident">clone</span>(),
).<span class="ident">unwrap</span>();
<span class="comment">// Solid colors</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">shader</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">shader_buffers</span>.<span class="ident">get</span>(
<span class="self">self</span>.<span class="ident">get_shader_handle</span>(<span class="ident">String</span>::<span class="ident">from</span>(<span class="string">&quot;color-passthrough&quot;</span>))
.<span class="ident">unwrap</span>().<span class="ident">clone</span>().<span class="ident">get_handle</span>() <span class="kw">as</span> <span class="ident">usize</span>
).<span class="ident">unwrap</span>();
<span class="comment">// This looks a little weird as colored_vertex_buffer is a vec of GPU allocated vecs.</span>
<span class="comment">// But we can pass in multiple vertex buffers</span>
<span class="kw">if</span> <span class="op">!</span><span class="ident">allocated_buffers</span>.<span class="ident">colored_vertex_buffer</span>.<span class="ident">is_empty</span>() {
<span class="ident">command_buffer</span> <span class="op">=</span> <span class="ident">command_buffer</span>.<span class="ident">draw</span>(
<span class="ident">shader</span>.<span class="ident">get_pipeline</span>().<span class="ident">clone</span>(),
<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">dynamic_state</span>.<span class="ident">clone</span>(),
<span class="ident">allocated_buffers</span>.<span class="ident">colored_vertex_buffer</span>.<span class="ident">clone</span>(),
(), (),
).<span class="ident">unwrap</span>();
}
<span class="comment">// Images</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">shader</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">shader_buffers</span>.<span class="ident">get</span>(
<span class="self">self</span>.<span class="ident">get_shader_handle</span>(<span class="ident">String</span>::<span class="ident">from</span>(<span class="string">&quot;simple_image&quot;</span>))
.<span class="ident">unwrap</span>().<span class="ident">clone</span>().<span class="ident">get_handle</span>() <span class="kw">as</span> <span class="ident">usize</span>
).<span class="ident">unwrap</span>();
<span class="kw">if</span> <span class="op">!</span><span class="ident">allocated_buffers</span>.<span class="ident">image_vertex_buffer</span>.<span class="ident">is_empty</span>() {
<span class="kw">for</span> (<span class="ident">image_handle</span>, <span class="ident">vertex_buffer</span>) <span class="kw">in</span> <span class="ident">allocated_buffers</span>.<span class="ident">image_vertex_buffer</span>.<span class="ident">clone</span>() {
<span class="kw">let</span> <span class="ident">handle</span> <span class="op">=</span> <span class="ident">image_handle</span>.<span class="ident">clone</span>().<span class="ident">get_handle</span>() <span class="kw">as</span> <span class="ident">usize</span>;
<span class="kw">let</span> <span class="ident">descriptor_set</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">image_buffers</span>.<span class="ident">get</span>(<span class="ident">handle</span>).<span class="ident">clone</span>().<span class="ident">unwrap</span>().<span class="ident">clone</span>()
.<span class="ident">get_descriptor_set</span>(<span class="ident">shader</span>.<span class="ident">get_pipeline</span>().<span class="ident">clone</span>());
<span class="ident">command_buffer</span> <span class="op">=</span> <span class="ident">command_buffer</span>.<span class="ident">draw</span>(
<span class="ident">shader</span>.<span class="ident">get_pipeline</span>().<span class="ident">clone</span>(),
<span class="comment">// Multiple vertex buffers must have their definition in the pipeline!</span>
<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">dynamic_state</span>.<span class="ident">clone</span>(), <span class="macro">vec</span><span class="macro">!</span>[<span class="ident">vertex_buffer</span>],
<span class="macro">vec</span><span class="macro">!</span>[<span class="ident">descriptor_set</span>], (),
).<span class="ident">unwrap</span>();
}
}
<span class="comment">// Textures</span>
<span class="kw">let</span> <span class="kw-2">mut</span> <span class="ident">shader</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">shader_buffers</span>.<span class="ident">get</span>(
<span class="self">self</span>.<span class="ident">get_shader_handle</span>(<span class="ident">String</span>::<span class="ident">from</span>(<span class="string">&quot;simple_texture&quot;</span>))
.<span class="ident">unwrap</span>().<span class="ident">clone</span>().<span class="ident">get_handle</span>() <span class="kw">as</span> <span class="ident">usize</span>
).<span class="ident">unwrap</span>();
<span class="kw">if</span> <span class="op">!</span><span class="ident">allocated_buffers</span>.<span class="ident">textured_vertex_buffer</span>.<span class="ident">is_empty</span>() {
<span class="kw">for</span> (<span class="ident">texture_handle</span>, <span class="ident">vertex_buffer</span>) <span class="kw">in</span> <span class="ident">allocated_buffers</span>.<span class="ident">textured_vertex_buffer</span>.<span class="ident">clone</span>() {
<span class="kw">let</span> <span class="ident">handle</span> <span class="op">=</span> <span class="ident">texture_handle</span>.<span class="ident">clone</span>().<span class="ident">get_handle</span>() <span class="kw">as</span> <span class="ident">usize</span>;
<span class="kw">let</span> <span class="ident">descriptor_set</span> <span class="op">=</span> <span class="self">self</span>.<span class="ident">texture_buffers</span>.<span class="ident">get</span>(<span class="ident">handle</span>).<span class="ident">clone</span>().<span class="ident">unwrap</span>().<span class="ident">clone</span>()
.<span class="ident">get_descriptor_set</span>(<span class="ident">shader</span>.<span class="ident">get_pipeline</span>(), <span class="self">self</span>.<span class="ident">sampler</span>.<span class="ident">clone</span>());
<span class="ident">command_buffer</span> <span class="op">=</span> <span class="ident">command_buffer</span>.<span class="ident">draw</span>(
<span class="ident">shader</span>.<span class="ident">get_pipeline</span>().<span class="ident">clone</span>(),
<span class="comment">// Multiple vertex buffers must have their definition in the pipeline!</span>
<span class="kw-2">&amp;</span><span class="self">self</span>.<span class="ident">dynamic_state</span>.<span class="ident">clone</span>(), <span class="macro">vec</span><span class="macro">!</span>[<span class="ident">vertex_buffer</span>],
<span class="macro">vec</span><span class="macro">!</span>[<span class="ident">descriptor_set</span>], (),
).<span class="ident">unwrap</span>();
}
}
<span class="comment">// Text</span>
<span class="comment">// let mut shader = self.shader_buffers.get(</span>
<span class="comment">// self.get_shader_handle(String::from(&quot;simple_text&quot;))</span>
<span class="comment">// .unwrap().clone().get_handle() as usize</span>
<span class="comment">// ).unwrap();</span>
<span class="comment">//</span>
<span class="comment">// if !self.text_instances.is_empty() {</span>
<span class="comment">// for (font_handle, instance_buffer) in self.text_instances.clone() {</span>
<span class="comment">// let handle = font_handle.clone().handle as usize;</span>
<span class="comment">// let font = self.font_buffers.get(handle).clone().unwrap().clone();</span>
<span class="comment">// let descriptor_set = CanvasFont::get_descriptor_set(shader.get_pipeline());</span>
<span class="comment">//</span>
<span class="comment">// command_buffer = command_buffer.draw(</span>
<span class="comment">// shader.get_pipeline().clone(),</span>
<span class="comment">// // Multiple vertex buffers must have their definition in the pipeline!</span>
<span class="comment">// &amp;self.dynamic_state.clone(),</span>
<span class="comment">// vec![font.get_vertex_buffer().clone(), instance_buffer.clone()],</span>
<span class="comment">// (), (),</span>
<span class="comment">// ).unwrap();</span>
<span class="comment">// }</span>
<span class="comment">// }</span>
<span class="ident">command_buffer</span>
.<span class="ident">end_render_pass</span>()
.<span class="ident">unwrap</span>()
}
}
</pre></div>
</section><section id="search" class="content hidden"></section><section class="footer"></section><aside id="help" class="hidden"><div><h1 class="hidden">Help</h1><div class="shortcuts"><h2>Keyboard Shortcuts</h2><dl><dt><kbd>?</kbd></dt><dd>Show this help dialog</dd><dt><kbd>S</kbd></dt><dd>Focus the search field</dd><dt><kbd></kbd></dt><dd>Move up in search results</dd><dt><kbd></kbd></dt><dd>Move down in search results</dd><dt><kbd></kbd></dt><dd>Switch tab</dd><dt><kbd>&#9166;</kbd></dt><dd>Go to active search result</dd><dt><kbd>+</kbd></dt><dd>Expand all sections</dd><dt><kbd>-</kbd></dt><dd>Collapse all sections</dd></dl></div><div class="infos"><h2>Search Tricks</h2><p>Prefix searches with a type followed by a colon (e.g., <code>fn:</code>) to restrict the search to a given type.</p><p>Accepted types are: <code>fn</code>, <code>mod</code>, <code>struct</code>, <code>enum</code>, <code>trait</code>, <code>type</code>, <code>macro</code>, and <code>const</code>.</p><p>Search functions by type signature (e.g., <code>vec -> usize</code> or <code>* -> vec</code>)</p><p>Search multiple things at once by splitting your query with comma (e.g., <code>str,u8</code> or <code>String,struct:Vec,test</code>)</p></div></div></aside><script>window.rootPath = "../../../";window.currentCrate = "sfml_rust";</script><script src="../../../aliases.js"></script><script src="../../../main.js"></script><script src="../../../source-script.js"></script><script src="../../../source-files.js"></script><script defer src="../../../search-index.js"></script></body></html>