tag:blogger.com,1999:blog-37944906442059594262024-03-05T13:18:43.498+03:00Dmitry Timofeev.Net, C#, Unity 3D, MonoGame, XNA, Windows, Windows PhoneDmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.comBlogger49125tag:blogger.com,1999:blog-3794490644205959426.post-86376255807784180432017-05-17T10:04:00.000+03:002017-05-17T10:04:53.784+03:00DevExpress and MVP<div dir="ltr" style="text-align: left;" trbidi="on">
<br />
<div class="MsoNormal" style="margin: 0cm 0cm 8pt;">
Оказывается, у DevExpress, под броским названием «Join the Elite», тоже есть программа взаимодействия с MVP. </div>
<div class="MsoNormal" style="margin: 0cm 0cm 8pt;">
То есть, если вы MVP, то можно перейти по ссылке: <br />
<a href="https://www.devexpress.com/Home/Community/MVP.xml">https://www.devexpress.com/Home/Community/MVP.xml</a><br />
зарегистрироваться и получить Universal Subscription на 12 месяцев. </div>
<div class="MsoNormal" style="margin: 0cm 0cm 8pt;">
Эта вкусная подписка на полное меню их продуктов, что само по себе является очень приятным бонусом.</div>
<div class="MsoNormal" style="margin: 0cm 0cm 8pt;">
DevExpress спасибо! :)</div>
</div>
Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com0tag:blogger.com,1999:blog-3794490644205959426.post-6996738772764713902016-06-22T13:21:00.001+03:002016-06-22T13:21:23.339+03:00Unity3D: Sinusoidal Rotation<div dir="ltr" style="text-align: left;" trbidi="on">
Побаловался с синусами:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/p6k8fq4sme8/0.jpg" frameborder="0" height="480" src="https://www.youtube.com/embed/p6k8fq4sme8?feature=player_embedded" width="640"></iframe></div>
</div>
Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com0tag:blogger.com,1999:blog-3794490644205959426.post-84063645505572650262016-01-21T23:10:00.002+03:002016-01-23T15:03:18.299+03:00Unity3D – Chunky post process effect<div dir="ltr" style="text-align: left;" trbidi="on">
Мы периодически встречаемся с друзьями из старой (древней) команды "Accept Corp".<br />
SpeccyWiki: <a href="http://speccy.info/Accept_Corp">http://speccy.info/Accept_Corp</a><br />
Вспоминаем былые времена, что творили на ZX Spectrum, немножко ностальгируем. Это всегда приятные встречи старых друзей.<br />
<br />
Приветы:<br />
Phantom Lord (Дмитрий Селин)<br />
Cardinal (Виталий Казаков)<br />
M.O.T (Виктор Васильев)<br />
A.Soft (Владимир Коновалов)<br />
DJ.Wolf (Сергей Малышев)<br />
Cannibal (Григорий Садовой)<br />
FF-Soft (Александр Макушин)<br />
Shov (Олег Шашкин)<br />
Layabout (Егор Волкодамов)<br />
Y.Soft (Равиль Габитбаев)<br />
Visual Graphics (Павел Мирчук)<br />
<br />
К чему я это говорю? К тому что создание данного пост эффекта навеяно именно теми временами из 90х годов, когда появилась мода в Demo рендерить 3D сцены из блоков Chunky.<br />
<br />
Как это выглядит:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbnMVTzY9OVkAu8AhhgsDs7VO8gIqHuP3HsYVpW545xGJUM0ndacmw-mhGupMdDcD6reCbJX34OEUTO75V7jplH7tg7Vm2RT9LNy4mhbZIzeadXgwomMuv8Wqx06I868VlN_U4M-229ak/s1600/%25D0%25BF%25D1%2580%25D0%25B8%25D0%25BC%25D0%25B5%25D1%2580.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="104" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbnMVTzY9OVkAu8AhhgsDs7VO8gIqHuP3HsYVpW545xGJUM0ndacmw-mhGupMdDcD6reCbJX34OEUTO75V7jplH7tg7Vm2RT9LNy4mhbZIzeadXgwomMuv8Wqx06I868VlN_U4M-229ak/s320/%25D0%25BF%25D1%2580%25D0%25B8%25D0%25BC%25D0%25B5%25D1%2580.png" width="320" /></a></div>
<br />
Мы не будем останавливаться на моментах, описанных в предыдущей вводной статье:<br />
<a href="http://dtimofeev.blogspot.ru/2016/01/unity3d-simple-post-process-effect.html">Unity3D: Simple post process effect</a><br />
Пропустим очевидные манипуляции. К тому же в данном подходе много общего.<br />
<br />
Сама суть эффекта заключается в следующем:<br />
- результат эффекта будет монохромный, черные пиксели на белом фоне;<br />
- размер исходных блоков chunky сделаем 4x4 пикселя;<br />
- спрайты chunky будем выбирать из заранее подготовленной текстуры. Выглядит она как полоска 64x4 пикселя, логически это наши 16 спрайтов 4x4 пикселя:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx5WPndtAL0PuvotC0SK_Lvt-gV22gXmrO14LHH63YfwmOkQ6JA7ejdIv4ids3OUnnzhmy6EAk17EaHA4BBbRWB2xC40GpviIVprqe7qY4ITrk5hePB64RT7V1D3J7xSlpome8HryhMGc/s1600/chunky4x4_16.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhx5WPndtAL0PuvotC0SK_Lvt-gV22gXmrO14LHH63YfwmOkQ6JA7ejdIv4ids3OUnnzhmy6EAk17EaHA4BBbRWB2xC40GpviIVprqe7qY4ITrk5hePB64RT7V1D3J7xSlpome8HryhMGc/s1600/chunky4x4_16.png" /></a></div>
<br />
Маленькая правда? :) Для наглядности увеличим картинку в 4 раза:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBLpTh23d0iGf332uG15AtZRpnCOAfXUbMjwuCFjmWBd412n20t1LKuuJFi-J_5SAxTWADwTOrjyX2E2_IjR2BLx17NyFHqh_UQc1fzvpC948ObeLLPgoSl6KW5oec6pqTj-UX6kocVM/s1600/chunky4x4_16+x4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzBLpTh23d0iGf332uG15AtZRpnCOAfXUbMjwuCFjmWBd412n20t1LKuuJFi-J_5SAxTWADwTOrjyX2E2_IjR2BLx17NyFHqh_UQc1fzvpC948ObeLLPgoSl6KW5oec6pqTj-UX6kocVM/s1600/chunky4x4_16+x4.png" /></a></div>
<br />
- число спрайтов 16 соответствует количеству оттенков белого, которые мы будем использовать. Так же это обусловлено рисунком, комбинациями пикселей в каждой градации;<br />
- мы выбираем из текстуры экрана цвет, приводим к чёрно-белому, условно соответствующему очередному блоку;<br />
- приводим значение градации к индексу спрайта в листе chunky;<br />
- и выводим сам спрайт.<br />
<br />
А теперь по-настоящему.<br />
Код шейдера:<br />
<br />
<pre style="background: #303030; color: #f8e1c9; font-family: Consolas; font-size: 13;"><span style="color: #eddac0;">Shader</span> <span style="color: #ff80ff;">"Hidden/Chunky"</span>
<span style="color: silver;">{</span>
<span style="color: #eddac0;">Properties</span>
<span style="color: silver;">{</span>
<span style="color: #eddac0;">_MainTex</span><span style="color: silver;">(</span><span style="color: #ff80ff;">"Texture"</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">2</span><span style="color: #eddac0;">D</span><span style="color: silver;">)</span> <span style="color: silver;">=</span> <span style="color: #ff80ff;">"white"</span> <span style="color: silver;">{}</span>
<span style="color: #eddac0;">_SprTex</span><span style="color: silver;">(</span><span style="color: #ff80ff;">"Texture"</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">2</span><span style="color: #eddac0;">D</span><span style="color: silver;">)</span> <span style="color: silver;">=</span> <span style="color: #ff80ff;">"white"</span> <span style="color: silver;">{}</span>
<span style="color: silver;">}</span>
<span style="color: #eddac0;">SubShader</span>
<span style="color: silver;">{</span>
<span style="color: #eddac0;">Pass</span>
<span style="color: silver;">{</span>
<span style="color: #eddac0;">CGPROGRAM</span>
<span style="color: #cb97ff;">#pragma</span> <span style="color: #eddac0;">vertex</span> <span style="color: #eddac0;">vert_img</span>
<span style="color: #cb97ff;">#pragma</span> <span style="color: #eddac0;">fragment</span> <span style="color: #eddac0;">frag</span>
<span style="color: #cb97ff;">#include</span> <span style="color: #ff80ff;">"UnityCG.cginc"</span>
<span style="color: #40c4ff;">sampler2D</span> <span style="color: #eddac0;">_MainTex</span><span style="color: silver;">;</span>
<span style="color: #40c4ff;">sampler2D</span> <span style="color: #eddac0;">_SprTex</span><span style="color: silver;">;</span>
<span style="color: #40c4ff;">float4</span> <span style="color: #eddac0;">_Color</span> <span style="color: silver;">=</span> <span style="color: #40c4ff;">float4</span><span style="color: silver;">(</span><span style="color: #ff80ff;">1</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">1</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">1</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">1</span><span style="color: silver;">);</span>
<span style="color: #40c4ff;">float2</span> <span style="color: #eddac0;">BlockCount</span><span style="color: silver;">;</span>
<span style="color: #40c4ff;">float2</span> <span style="color: #eddac0;">BlockSize</span><span style="color: silver;">;</span>
<span style="color: #eddac0;">fixed4</span> <span style="color: #eddac0;">frag</span><span style="color: silver;">(</span><span style="color: #eddac0;">v2f_img</span> <span style="color: #eddac0;">i</span><span style="color: silver;">)</span> <span style="color: silver;">:</span> <span style="color: #eddac0;">SV_Target</span>
<span style="color: silver;">{</span>
<span style="color: lawngreen;">// (1)</span>
<span style="color: #40c4ff;">float2</span> <span style="color: #eddac0;">blockPos</span> <span style="color: silver;">=</span> <span style="color: #eddac0;">floor</span><span style="color: silver;">(</span><span style="color: #eddac0;">i</span><span style="color: silver;">.</span><span style="color: #eddac0;">uv</span> <span style="color: silver;">*</span> <span style="color: #eddac0;">BlockCount</span><span style="color: silver;">);</span>
<span style="color: #40c4ff;">float2</span> <span style="color: #eddac0;">blockCenter</span> <span style="color: silver;">=</span> <span style="color: #eddac0;">blockPos</span> <span style="color: silver;">*</span> <span style="color: #eddac0;">BlockSize</span> <span style="color: silver;">+</span> <span style="color: #eddac0;">BlockSize</span> <span style="color: silver;">*</span> <span style="color: #ff80ff;">0.5</span><span style="color: silver;">;</span>
<span style="color: lawngreen;">// (2)</span>
<span style="color: #40c4ff;">float4</span> <span style="color: #eddac0;">del</span> <span style="color: silver;">=</span> <span style="color: #40c4ff;">float4</span><span style="color: silver;">(</span><span style="color: #ff80ff;">1</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">1</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">1</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">1</span><span style="color: silver;">)</span> <span style="color: silver;">-</span> <span style="color: #eddac0;">_Color</span><span style="color: silver;">;</span>
<span style="color: lawngreen;">// (3)</span>
<span style="color: #40c4ff;">float4</span> <span style="color: #eddac0;">tex</span> <span style="color: silver;">=</span> <span style="color: #eddac0;">tex2D</span><span style="color: silver;">(</span><span style="color: #eddac0;">_MainTex</span><span style="color: silver;">,</span> <span style="color: #eddac0;">blockCenter</span><span style="color: silver;">)</span> <span style="color: silver;">-</span> <span style="color: #eddac0;">del</span><span style="color: silver;">;</span>
<span style="color: #40c4ff;">float</span> <span style="color: #eddac0;">grayscale</span> <span style="color: silver;">=</span> <span style="color: #eddac0;">dot</span><span style="color: silver;">(</span><span style="color: #eddac0;">tex</span><span style="color: silver;">.</span><span style="color: #eddac0;">rgb</span><span style="color: silver;">,</span> <span style="color: #40c4ff;">float3</span><span style="color: silver;">(</span><span style="color: #ff80ff;">0.3</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">0.59</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">0.11</span><span style="color: silver;">));</span>
<span style="color: #eddac0;">grayscale</span> <span style="color: silver;">=</span> <span style="color: #eddac0;">clamp</span><span style="color: silver;">(</span><span style="color: #eddac0;">grayscale</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">0.0</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">1.0</span><span style="color: silver;">);</span>
<span style="color: lawngreen;">// (4)</span>
<span style="color: #40c4ff;">float</span> <span style="color: #eddac0;">dx</span> <span style="color: silver;">=</span> <span style="color: #eddac0;">floor</span><span style="color: silver;">(</span><span style="color: #eddac0;">grayscale</span> <span style="color: silver;">*</span> <span style="color: #ff80ff;">16.0</span><span style="color: silver;">);</span>
<span style="color: lawngreen;">// (5)</span>
<span style="color: #40c4ff;">float2</span> <span style="color: #eddac0;">sprPos</span> <span style="color: silver;">=</span> <span style="color: #eddac0;">i</span><span style="color: silver;">.</span><span style="color: #eddac0;">uv</span><span style="color: silver;">;</span>
<span style="color: #eddac0;">sprPos</span> <span style="color: silver;">-=</span> <span style="color: #eddac0;">blockPos</span><span style="color: silver;">*</span><span style="color: #eddac0;">BlockSize</span><span style="color: silver;">;</span>
<span style="color: #eddac0;">sprPos</span><span style="color: silver;">.</span><span style="color: #eddac0;">x</span> <span style="color: silver;">/=</span> <span style="color: #ff80ff;">16</span><span style="color: silver;">;</span>
<span style="color: #eddac0;">sprPos</span> <span style="color: silver;">*=</span> <span style="color: #eddac0;">BlockCount</span><span style="color: silver;">;</span>
<span style="color: #eddac0;">sprPos</span><span style="color: silver;">.</span><span style="color: #eddac0;">x</span> <span style="color: silver;">+=</span> <span style="color: #ff80ff;">1.0</span> <span style="color: silver;">/</span> <span style="color: #ff80ff;">16.0</span> <span style="color: silver;">*</span> <span style="color: #eddac0;">dx</span><span style="color: silver;">;</span>
<span style="color: lawngreen;">// (6)</span>
<span style="color: #40c4ff;">float4</span> <span style="color: #eddac0;">tex2</span> <span style="color: silver;">=</span> <span style="color: #eddac0;">tex2D</span><span style="color: silver;">(</span><span style="color: #eddac0;">_SprTex</span><span style="color: silver;">,</span> <span style="color: #eddac0;">sprPos</span><span style="color: silver;">);</span>
<span style="color: #40c4ff;">return</span> <span style="color: #eddac0;">tex2</span><span style="color: silver;">;</span>
<span style="color: silver;">}</span>
<span style="color: #eddac0;">ENDCG</span>
<span style="color: silver;">}</span>
<span style="color: silver;">}</span>
<span style="color: silver;">}</span>
</pre>
<br />
Где:<br />
1) - Уже знакомое нам, по прошлой статье, приведение экранных координат к текстурным<br />
2) - Управление яркостью картинки, нужное больше для баловства и немножко для тестов;<br />
3) - Перевод в grayscale;<br />
4) - Индекс спрайта в листе;<br />
5) - Расчет координат спрайта в листе chunky;<br />
6) - Вывод.<br />
<br />
<pre style="background: #303030; color: #f8e1c9; font-family: Consolas; font-size: 13;"><span style="color: #40c4ff;">using</span> <span style="color: #eddac0;">UnityEngine</span><span style="color: gainsboro;">;</span>
<span style="color: #40c4ff;">using</span> <span style="color: #eddac0;">UnityStandardAssets</span><span style="color: silver;">.</span><span style="color: #eddac0;">ImageEffects</span><span style="color: gainsboro;">;</span>
<span style="color: #40c4ff;">namespace</span> <span style="color: #eddac0;">Assets</span><span style="color: silver;">.</span><span style="color: #eddac0;">Scripts</span><span style="color: silver;">.</span><span style="color: #eddac0;">PostEffects</span>
<span style="color: gainsboro;">{</span>
<span style="color: gainsboro;">[</span><span style="color: #4ec9b0;">ExecuteInEditMode</span><span style="color: gainsboro;">]</span>
<span style="color: gainsboro;">[</span><span style="color: #4ec9b0;">AddComponentMenu</span><span style="color: gainsboro;">(</span><span style="color: #ff80ff;">"Image Effects/Color Adjustments/Chunky"</span><span style="color: gainsboro;">)]</span>
<span style="color: #40c4ff;">public</span> <span style="color: #40c4ff;">class</span> <span style="color: #4ec9b0;">Chunky</span> <span style="color: gainsboro;">:</span> <span style="color: #4ec9b0;">ImageEffectBase</span>
<span style="color: gainsboro;">{</span>
<span style="color: #40c4ff;">public</span> <span style="color: #4ec9b0;">Texture2D</span> <span style="color: #eddac0;">SprTex</span><span style="color: gainsboro;">;</span>
<span style="color: #40c4ff;">public</span> <span style="color: #4ec9b0;">Color</span> <span style="color: #eddac0;">Color</span> <span style="color: silver;">=</span> <span style="color: #4ec9b0;">Color</span><span style="color: silver;">.</span><span style="color: #eddac0;">white</span><span style="color: gainsboro;">;</span>
<span style="color: #40c4ff;">private</span> <span style="color: #40c4ff;">void</span> <span style="color: #eddac0;">OnRenderImage</span><span style="color: gainsboro;">(</span><span style="color: #4ec9b0;">RenderTexture</span> <span style="color: #eddac0;">source</span><span style="color: gainsboro;">,</span> <span style="color: #4ec9b0;">RenderTexture</span> <span style="color: #eddac0;">destination</span><span style="color: gainsboro;">)</span>
<span style="color: gainsboro;">{</span>
<span style="color: #40c4ff;">float</span> <span style="color: #eddac0;">k</span> <span style="color: silver;">=</span> <span style="color: #4ec9b0;">Camera</span><span style="color: silver;">.</span><span style="color: #eddac0;">main</span><span style="color: silver;">.</span><span style="color: #eddac0;">aspect</span><span style="color: gainsboro;">;</span>
<span style="color: #40c4ff;">float</span> <span style="color: #eddac0;">w</span> <span style="color: silver;">=</span> <span style="color: #4ec9b0;">Camera</span><span style="color: silver;">.</span><span style="color: #eddac0;">main</span><span style="color: silver;">.</span><span style="color: #eddac0;">pixelWidth</span><span style="color: gainsboro;">;</span>
<span style="color: #40c4ff;">float</span> <span style="color: #eddac0;">h</span> <span style="color: silver;">=</span> <span style="color: #4ec9b0;">Camera</span><span style="color: silver;">.</span><span style="color: #eddac0;">main</span><span style="color: silver;">.</span><span style="color: #eddac0;">pixelHeight</span><span style="color: gainsboro;">;</span>
<span style="color: #4ec9b0;">Vector2</span> <span style="color: #eddac0;">count</span> <span style="color: silver;">=</span> <span style="color: #40c4ff;">new</span> <span style="color: #4ec9b0;">Vector2</span><span style="color: gainsboro;">(</span><span style="color: #eddac0;">w</span><span style="color: silver;">/</span><span style="color: #eddac0;">SprTex</span><span style="color: silver;">.</span><span style="color: #eddac0;">height</span><span style="color: gainsboro;">,</span> <span style="color: #eddac0;">h</span><span style="color: silver;">/</span><span style="color: #eddac0;">SprTex</span><span style="color: silver;">.</span><span style="color: #eddac0;">height</span><span style="color: gainsboro;">);</span>
<span style="color: #4ec9b0;">Vector2</span> <span style="color: #eddac0;">size</span> <span style="color: silver;">=</span> <span style="color: #40c4ff;">new</span> <span style="color: #4ec9b0;">Vector2</span><span style="color: gainsboro;">(</span><span style="color: #ff80ff;">1.0f</span><span style="color: silver;">/</span><span style="color: #eddac0;">count</span><span style="color: silver;">.</span><span style="color: #eddac0;">x</span><span style="color: gainsboro;">,</span> <span style="color: #ff80ff;">1.0f</span><span style="color: silver;">/</span><span style="color: #eddac0;">count</span><span style="color: silver;">.</span><span style="color: #eddac0;">y</span><span style="color: gainsboro;">);</span>
<span style="color: lawngreen;">//</span>
<span style="color: #eddac0;">material</span><span style="color: silver;">.</span><span style="color: #eddac0;">SetVector</span><span style="color: gainsboro;">(</span><span style="color: #ff80ff;">"BlockCount"</span><span style="color: gainsboro;">,</span> <span style="color: #eddac0;">count</span><span style="color: gainsboro;">);</span>
<span style="color: #eddac0;">material</span><span style="color: silver;">.</span><span style="color: #eddac0;">SetVector</span><span style="color: gainsboro;">(</span><span style="color: #ff80ff;">"BlockSize"</span><span style="color: gainsboro;">,</span> <span style="color: #eddac0;">size</span><span style="color: gainsboro;">);</span>
<span style="color: #eddac0;">material</span><span style="color: silver;">.</span><span style="color: #eddac0;">SetColor</span><span style="color: gainsboro;">(</span><span style="color: #ff80ff;">"_Color"</span><span style="color: gainsboro;">,</span> <span style="color: #eddac0;">Color</span><span style="color: gainsboro;">);</span>
<span style="color: #eddac0;">material</span><span style="color: silver;">.</span><span style="color: #eddac0;">SetTexture</span><span style="color: gainsboro;">(</span><span style="color: #ff80ff;">"_SprTex"</span><span style="color: gainsboro;">,</span> <span style="color: #eddac0;">SprTex</span><span style="color: gainsboro;">);</span>
<span style="color: #4ec9b0;">Graphics</span><span style="color: silver;">.</span><span style="color: #eddac0;">Blit</span><span style="color: gainsboro;">(</span><span style="color: #eddac0;">source</span><span style="color: gainsboro;">,</span> <span style="color: #eddac0;">destination</span><span style="color: gainsboro;">,</span> <span style="color: #eddac0;">material</span><span style="color: gainsboro;">);</span>
<span style="color: gainsboro;">}</span>
<span style="color: gainsboro;">}</span>
<span style="color: gainsboro;">}</span></pre>
<br />
Ни чего сложного не добавилось.<br />
<br />
Знакомый нам исходный экран:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpQDtwGcWQydZaMgj2ukn3URt9JNYpaTf5mapgSTNAi1TZk9WwkJR9eI3387ml3SQW0uBPpc3xHwappzylsGBSRkphblp0ViLJpMQwsaKqe5ouH71AZGH2cvd6OKzrhAr0NLXDUTfmjSo/s1600/%25D0%25A0%25D0%25B5%25D0%25B7%25D1%2583%25D0%25BB%25D1%258C%25D1%2582%25D0%25B0%25D1%25820.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjpQDtwGcWQydZaMgj2ukn3URt9JNYpaTf5mapgSTNAi1TZk9WwkJR9eI3387ml3SQW0uBPpc3xHwappzylsGBSRkphblp0ViLJpMQwsaKqe5ouH71AZGH2cvd6OKzrhAr0NLXDUTfmjSo/s320/%25D0%25A0%25D0%25B5%25D0%25B7%25D1%2583%25D0%25BB%25D1%258C%25D1%2582%25D0%25B0%25D1%25820.png" width="320" /></a></div>
<br />
<br />
Результат:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-CR3kmzbl5y9WUpML8bAGFITzVWYRm2Nqh1t6ZHT9ZuPIE50mVpd6fk5i75cK36rfpaTszMX_4E-yJDaa2FHijjVarZMr-pO-Yo7oiiRXzpBnSr4JPeiesm1kg8ok06P9po_n2mrecWw/s1600/%25D0%25A0%25D0%25B5%25D0%25B7%25D1%2583%25D0%25BB%25D1%258C%25D1%2582%25D0%25B0%25D1%2582.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-CR3kmzbl5y9WUpML8bAGFITzVWYRm2Nqh1t6ZHT9ZuPIE50mVpd6fk5i75cK36rfpaTszMX_4E-yJDaa2FHijjVarZMr-pO-Yo7oiiRXzpBnSr4JPeiesm1kg8ok06P9po_n2mrecWw/s320/%25D0%25A0%25D0%25B5%25D0%25B7%25D1%2583%25D0%25BB%25D1%258C%25D1%2582%25D0%25B0%25D1%2582.png" width="320" /></a></div>
<br />
<div>
Конечно на живую в fullscreen и в динамике выглядит по интереснее.<br />
Но, в любом случае, на картинки лучше кликать для просмотра.</div>
</div>
Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com0tag:blogger.com,1999:blog-3794490644205959426.post-6860846283952338222016-01-20T22:46:00.000+03:002016-01-23T14:56:41.735+03:00Unity3D: Simple post process effect<div dir="ltr" style="text-align: left;" trbidi="on">
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="MsoNormal" style="text-align: left;">
В этой статье мы рассмотрим:</div>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
- порядок создания простого пост эффекта; <o:p></o:p></div>
<div class="MsoNormal">
- некоторые нюансы приведения размеров.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Для
наших экспериментов нам потребуется сцена, с объектами или картинками, не
важно, главное по пестрее. Я набросал такую:<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH-HUNRcKmaFDfvAJaA_cXqPVo1XmdD-NfyFKZ5jEilC-J9gMGfnQyD3rTnlahT6ZvyTE7uD-EFjHmOp3_TXZaDPYrOoAtXc0tVVIHYQ33Q6mYhD41PgREeCCcRGdyPp2jR75lHV1xdQQ/s1600/Scene.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="236" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhH-HUNRcKmaFDfvAJaA_cXqPVo1XmdD-NfyFKZ5jEilC-J9gMGfnQyD3rTnlahT6ZvyTE7uD-EFjHmOp3_TXZaDPYrOoAtXc0tVVIHYQ33Q6mYhD41PgREeCCcRGdyPp2jR75lHV1xdQQ/s320/Scene.jpg" width="320" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
На этой
сцене отлаживался не один пост эффект, поэтому все что на ней присутствует –
закономерно и не лишнее.<o:p></o:p></div>
<div class="MsoNormal">
Подготовим
файлы. Мы будем работать с файлом шейдера и скриптом.<o:p></o:p></div>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
Начнем
с шейдера. <o:p></o:p></div>
<div class="MsoNormal" style="text-align: left;">
В папке Assets кликаем правой кнопкой мыши и выбираем:<o:p></o:p></div>
<div class="MsoNormal">
Create->Shader-> NewImageEffectShader.<o:p></o:p></div>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
Нам
будет предложено на выбор несколько типов шейдеров, но это не так важно,
внутренности мы перепишем. Я переименовал созданный файл в «Pixelation».
Открываем и зачищаем от всего лишнего до такого вида:<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<pre style="background: #303030; color: #f8e1c9; font-family: Consolas; font-size: 13;"><span style="color: #eddac0;">Shader</span> <span style="color: #ff80ff;">"Hidden/Pixelation Effect"</span>
<span style="color: silver;">{</span>
<span style="color: #eddac0;">Properties</span>
<span style="color: silver;">{</span>
<span style="color: #eddac0;">_MainTex</span> <span style="color: silver;">(</span><span style="color: #ff80ff;">"Texture"</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">2</span><span style="color: #eddac0;">D</span><span style="color: silver;">)</span> <span style="color: silver;">=</span> <span style="color: #ff80ff;">"white"</span> <span style="color: silver;">{}</span>
<span style="color: silver;">}</span>
<span style="color: #eddac0;">SubShader</span>
<span style="color: silver;">{</span>
<span style="color: #eddac0;">Pass</span>
<span style="color: silver;">{</span>
<span style="color: #eddac0;">CGPROGRAM</span>
<span style="color: #cb97ff;">#pragma</span> <span style="color: #eddac0;">vertex</span> <span style="color: #eddac0;">vert_img</span>
<span style="color: #cb97ff;">#pragma</span> <span style="color: #eddac0;">fragment</span> <span style="color: #eddac0;">frag</span>
<span style="color: #cb97ff;">#include</span> <span style="color: #ff80ff;">"UnityCG.cginc"</span>
<span style="color: #eddac0;">fixed4</span> <span style="color: #eddac0;">frag</span> <span style="color: silver;">(</span><span style="color: #eddac0;">v2f_img</span> <span style="color: #eddac0;">i</span><span style="color: silver;">)</span> <span style="color: silver;">:</span> <span style="color: #eddac0;">SV_Target</span>
<span style="color: silver;">{</span>
<span style="color: silver;">}</span>
<span style="color: #eddac0;">ENDCG</span>
<span style="color: silver;">}</span>
<span style="color: silver;">}</span>
<span style="color: silver;">}</span>
</pre>
</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Обратите внимание на то, что входные данные пиксельного
(фрагментного, привык я к терминологии HLSL) шейдера описывает структура
v2f_img. Ее вполне достаточно для нас.<o:p></o:p></div>
<div class="MsoNormal">
Далее добавляем входные параметры шейдера и необходимый код
как в примере:<o:p></o:p></div>
<div class="MsoNormal">
<span lang="EN-US"><br /></span>
<pre style="background: #303030; color: #f8e1c9; font-family: Consolas; font-size: 13;"><span style="color: #eddac0;">Shader</span> <span style="color: #ff80ff;">"Hidden/Pixelation Effect"</span>
<span style="color: silver;">{</span>
<span style="color: #eddac0;">Properties</span>
<span style="color: silver;">{</span>
<span style="color: #eddac0;">_MainTex</span> <span style="color: silver;">(</span><span style="color: #ff80ff;">"Texture"</span><span style="color: silver;">,</span> <span style="color: #ff80ff;">2</span><span style="color: #eddac0;">D</span><span style="color: silver;">)</span> <span style="color: silver;">=</span> <span style="color: #ff80ff;">"white"</span> <span style="color: silver;">{}</span>
<span style="color: silver;">}</span>
<span style="color: #eddac0;">SubShader</span>
<span style="color: silver;">{</span>
<span style="color: #eddac0;">Pass</span>
<span style="color: silver;">{</span>
<span style="color: #eddac0;">CGPROGRAM</span>
<span style="color: #cb97ff;">#pragma</span> <span style="color: #eddac0;">vertex</span> <span style="color: #eddac0;">vert_img</span>
<span style="color: #cb97ff;">#pragma</span> <span style="color: #eddac0;">fragment</span> <span style="color: #eddac0;">frag</span>
<span style="color: #cb97ff;">#include</span> <span style="color: #ff80ff;">"UnityCG.cginc"</span>
<span style="color: #40c4ff;">sampler2D</span> <span style="color: #eddac0;">_MainTex</span><span style="color: silver;">;</span>
<span style="color: #40c4ff;">float2</span> <span style="color: #eddac0;">BlockCount</span><span style="color: silver;">;</span>
<span style="color: #40c4ff;">float2</span> <span style="color: #eddac0;">BlockSize</span><span style="color: silver;">;</span>
<span style="color: #eddac0;">fixed4</span> <span style="color: #eddac0;">frag</span> <span style="color: silver;">(</span><span style="color: #eddac0;">v2f_img</span> <span style="color: #eddac0;">i</span><span style="color: silver;">)</span> <span style="color: silver;">:</span> <span style="color: #eddac0;">SV_Target</span>
<span style="color: silver;">{</span>
<span style="color: #40c4ff;">float2</span> <span style="color: #eddac0;">blockPos</span> <span style="color: silver;">=</span> <span style="color: #eddac0;">floor</span><span style="color: silver;">(</span><span style="color: #eddac0;">i</span><span style="color: silver;">.</span><span style="color: #eddac0;">uv</span> <span style="color: silver;">*</span> <span style="color: #eddac0;">BlockCount</span><span style="color: silver;">);</span>
<span style="color: #40c4ff;">float2</span> <span style="color: #eddac0;">blockCenter</span> <span style="color: silver;">=</span> <span style="color: #eddac0;">blockPos</span> <span style="color: silver;">*</span> <span style="color: #eddac0;">BlockSize</span> <span style="color: silver;">+</span> <span style="color: #eddac0;">BlockSize</span> <span style="color: silver;">*</span> <span style="color: #ff80ff;">0.5</span><span style="color: silver;">;</span>
<span style="color: #40c4ff;">float4</span> <span style="color: #eddac0;">tex</span> <span style="color: silver;">=</span> <span style="color: #eddac0;">tex2D</span><span style="color: silver;">(</span><span style="color: #eddac0;">_MainTex</span><span style="color: silver;">,</span> <span style="color: #eddac0;">blockCenter</span><span style="color: silver;">);</span>
<span style="color: #40c4ff;">return</span> <span style="color: #eddac0;">tex</span><span style="color: silver;">;</span>
<span style="color: silver;">}</span>
<span style="color: #eddac0;">ENDCG</span>
<span style="color: silver;">}</span>
<span style="color: silver;">}</span>
<span style="color: silver;">}</span>
</pre>
<span lang="EN-US"><br /></span>
<span lang="EN-US">sampler2D
_MainTex – </span>буфер экрана как
текстура<span lang="EN-US">;</span></div>
<div class="MsoNormal">
float2 BlockCount – количество кирпичиков на экране (псевдопикселей)
по X и Y;<o:p></o:p></div>
<div class="MsoNormal">
float2 BlockSize – размеры кирпичиков тоже по X и Y;<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal" style="text-indent: 35.4pt;">
Шейдер простой, вся суть в
функции floor. Из справки:<o:p></o:p></div>
<div class="MsoNormal">
floor(x) - возвращает самое большое целое число, которое
является меньше чем или равным x.<o:p></o:p></div>
<div class="MsoNormal">
Назначение и подготовку BlockCount и BlockSize рассмотрим в
скрипте эффекта.<o:p></o:p></div>
<div class="MsoNormal">
Как создать новый скрипт я писать не буду, но стоит уточнить
вот что.<o:p></o:p></div>
<div class="MsoNormal">
Нам потребуется импортировать некоторые стандартные ассеты,
а именно:<o:p></o:p></div>
<div class="MsoNormal">
Assets->Import package->Effects <o:p></o:p></div>
<div class="MsoNormal">
С точки зрения изучения пост эффектов нам интересен весь
пакет, в дальнейшем можно самостоятельно почитать типовые эффекты, входящие в
него. Но пока на нужен только ImageEffectBase.cs что бы наследовать от него
класс нашего скрипта.<o:p></o:p></div>
<div class="MsoNormal" style="text-indent: 35.4pt;">
В результате у нас должен
получиться вот такой код:<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<pre style="background: #303030; color: #f8e1c9; font-family: Consolas; font-size: 13;"><span style="color: #40c4ff;">using</span> <span style="color: #eddac0;">UnityEngine</span><span style="color: gainsboro;">;</span>
<span style="color: #40c4ff;">using</span> <span style="color: #eddac0;">UnityStandardAssets</span><span style="color: silver;">.</span><span style="color: #eddac0;">ImageEffects</span><span style="color: gainsboro;">;</span>
<span style="color: #40c4ff;">namespace</span> <span style="color: #eddac0;">Assets</span><span style="color: silver;">.</span><span style="color: #eddac0;">Scripts</span><span style="color: silver;">.</span><span style="color: #eddac0;">PostEffects</span>
<span style="color: gainsboro;">{</span>
<span style="color: gainsboro;">[</span><span style="color: #4ec9b0;">ExecuteInEditMode</span><span style="color: gainsboro;">]</span>
<span style="color: gainsboro;">[</span><span style="color: #4ec9b0;">AddComponentMenu</span><span style="color: gainsboro;">(</span><span style="color: #ff80ff;">"Image Effects/Color Adjustments/Pixelation"</span><span style="color: gainsboro;">)]</span>
<span style="color: #40c4ff;">public</span> <span style="color: #40c4ff;">class</span> <span style="color: #4ec9b0;">Pixelation</span> <span style="color: gainsboro;">:</span> <span style="color: #4ec9b0;">ImageEffectBase</span>
<span style="color: gainsboro;">{</span>
<span style="color: gainsboro;">[</span><span style="color: #4ec9b0;">Range</span><span style="color: gainsboro;">(</span><span style="color: #ff80ff;">64.0f</span><span style="color: gainsboro;">,</span> <span style="color: #ff80ff;">512.0f</span><span style="color: gainsboro;">)]</span>
<span style="color: #40c4ff;">public</span> <span style="color: #40c4ff;">float</span> <span style="color: #eddac0;">BlockCount</span> <span style="color: silver;">=</span> <span style="color: #ff80ff;">256</span><span style="color: gainsboro;">;</span>
<span style="color: #40c4ff;">private</span> <span style="color: #40c4ff;">void</span> <span style="color: #eddac0;">OnRenderImage</span><span style="color: gainsboro;">(</span><span style="color: #4ec9b0;">RenderTexture</span> <span style="color: #eddac0;">source</span><span style="color: gainsboro;">,</span> <span style="color: #4ec9b0;">RenderTexture</span> <span style="color: #eddac0;">destination</span><span style="color: gainsboro;">)</span>
<span style="color: gainsboro;">{</span>
<span style="color: #40c4ff;">float</span> <span style="color: #eddac0;">k</span> <span style="color: silver;">=</span> <span style="color: #4ec9b0;">Camera</span><span style="color: silver;">.</span><span style="color: #eddac0;">main</span><span style="color: silver;">.</span><span style="color: #eddac0;">aspect</span><span style="color: gainsboro;">;</span>
<span style="color: #4ec9b0;">Vector2</span> <span style="color: #eddac0;">count</span> <span style="color: silver;">=</span> <span style="color: #40c4ff;">new</span> <span style="color: #4ec9b0;">Vector2</span><span style="color: gainsboro;">(</span><span style="color: #eddac0;">BlockCount</span><span style="color: gainsboro;">,</span> <span style="color: #eddac0;">BlockCount</span><span style="color: silver;">/</span><span style="color: #eddac0;">k</span><span style="color: gainsboro;">);</span>
<span style="color: #4ec9b0;">Vector2</span> <span style="color: #eddac0;">size</span> <span style="color: silver;">=</span> <span style="color: #40c4ff;">new</span> <span style="color: #4ec9b0;">Vector2</span><span style="color: gainsboro;">(</span><span style="color: #ff80ff;">1.0f</span><span style="color: silver;">/</span><span style="color: #eddac0;">count</span><span style="color: silver;">.</span><span style="color: #eddac0;">x</span><span style="color: gainsboro;">,</span> <span style="color: #ff80ff;">1.0f</span><span style="color: silver;">/</span><span style="color: #eddac0;">count</span><span style="color: silver;">.</span><span style="color: #eddac0;">y</span><span style="color: gainsboro;">);</span>
<span style="color: lawngreen;">//</span>
<span style="color: #eddac0;">material</span><span style="color: silver;">.</span><span style="color: #eddac0;">SetVector</span><span style="color: gainsboro;">(</span><span style="color: #ff80ff;">"BlockCount"</span><span style="color: gainsboro;">,</span> <span style="color: #eddac0;">count</span><span style="color: gainsboro;">);</span>
<span style="color: #eddac0;">material</span><span style="color: silver;">.</span><span style="color: #eddac0;">SetVector</span><span style="color: gainsboro;">(</span><span style="color: #ff80ff;">"BlockSize"</span><span style="color: gainsboro;">,</span> <span style="color: #eddac0;">size</span><span style="color: gainsboro;">);</span>
<span style="color: #4ec9b0;">Graphics</span><span style="color: silver;">.</span><span style="color: #eddac0;">Blit</span><span style="color: gainsboro;">(</span><span style="color: #eddac0;">source</span><span style="color: gainsboro;">,</span> <span style="color: #eddac0;">destination</span><span style="color: gainsboro;">,</span> <span style="color: #eddac0;">material</span><span style="color: gainsboro;">);</span>
<span style="color: gainsboro;">}</span>
<span style="color: gainsboro;">}</span>
<span style="color: gainsboro;">}</span>
</pre>
</div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Где:<o:p></o:p></div>
<div class="MsoNormal">
BlockCount – исходное количество блоков по горизонтали;<o:p></o:p></div>
<div class="MsoNormal">
k – понятно из определения, коэффициент соотношения сторон
экрана;<o:p></o:p></div>
<div class="MsoNormal">
count – вектор в который складываем расчетные значения
количества кирпичиков по горизонтали и вертикали;<o:p></o:p></div>
<div class="MsoNormal">
size – расчетное значение размеров кирпичиков, основанное на
их количестве и коэффициенте соотношения сторон экрана.<o:p></o:p></div>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
Может
быть лишнее, но я хотел бы пояснить то, что в шейдере мы имеем дело с
текстурами размером (1f, 1f) не зависимо от их реальных размеров в пикселях. И
т.к. текстурные координаты носят относительный характер, то эту самую
относительность мы и выражаем в size. Для пущей очевидности замечу, что size
делает условные пикселы квадратными на всех разрешениях мониторов с разным
соотношением сторон.<o:p></o:p></div>
<div class="MsoNormal">
<o:p></o:p></div>
<div class="MsoNormal">
Далее
файл скрипта перетаскиваем на объект нашей сцены - камеру, в поле скрипта
Shader перетаскиваем наш шейдер. Итог:<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj933VHCxwAV9ttu8H3E_7KmPzTI89owU992eGjMKYRYC2gz1nQn5EG4c7ImxS9_08xrzPBnHaR0a-r-00um72dj0gUtFFiR5GGOyNgBx04M2GUP5WpK1DFuCGa_kTQlDJcKUXxEX0vmU4/s1600/Inspector.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj933VHCxwAV9ttu8H3E_7KmPzTI89owU992eGjMKYRYC2gz1nQn5EG4c7ImxS9_08xrzPBnHaR0a-r-00um72dj0gUtFFiR5GGOyNgBx04M2GUP5WpK1DFuCGa_kTQlDJcKUXxEX0vmU4/s320/Inspector.jpg" width="320" /></a></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
Готово. <o:p></o:p></div>
<div class="MsoNormal">
Запускаем.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/rhNK7MMXNYs/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/rhNK7MMXNYs?feature=player_embedded" width="320"></iframe></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
</div>
<div class="MsoNormal">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIr6PceIhinwSKLt_jzaBQHJas7CP3I7AvVqTODjhjXCgnUuSXFhgjm7AMyLSVD3lHCxcZWdd035WujmdGJAPqgawC0dOo50xHJKfavrlVbK_qhPo6QNGErdkIwlsnKYlpsadxT4rnkcc/s1600/screen.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiIr6PceIhinwSKLt_jzaBQHJas7CP3I7AvVqTODjhjXCgnUuSXFhgjm7AMyLSVD3lHCxcZWdd035WujmdGJAPqgawC0dOo50xHJKfavrlVbK_qhPo6QNGErdkIwlsnKYlpsadxT4rnkcc/s320/screen.jpg" width="244" /></a></div>
<br /></div>
</div>
Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com2tag:blogger.com,1999:blog-3794490644205959426.post-66899155388472182552015-02-01T14:41:00.000+03:002015-02-04T22:18:51.743+03:00HLSL: Шейдер воды<div dir="ltr" style="text-align: left;" trbidi="on">
Какое то время назад я показывал, в своей <a href="http://dtimofeev.blogspot.ru/2009/08/xna-water-video.html" target="_blank">публикации</a>, видео с примером реализации воды.<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/ez68CI5yYF8/0.jpg" frameborder="0" height="416" src="http://www.youtube.com/embed/ez68CI5yYF8?feature=player_embedded" width="500"></iframe></div>
<br />
<br />
По многочисленным просьбам решил открыть код своего шейдера Water.fx:<br />
<br />
float4x4 mWorld;<br />
float4x4 mWorldBack;<br />
float4x4 mWVP;<br />
float4x4 mWVPreflection;<br />
<br />
float3 LightDir;<br />
float3 ViewDir;<br />
<br />
float waveHeight;<br />
float2 windDelCoord;<br />
<br />
float width = 1000;<br />
float heught = 1000;<br />
<br />
Texture texRefraction;<br />
sampler RefractionMapSampler = sampler_state<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>texture = <texrefraction> ; </texrefraction><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>magfilter = ANISOTROPIC;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>minfilter = LINEAR;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mipfilter = LINEAR;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>MaxAnisotropy = 8;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>AddressU = mirror;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>AddressV = mirror;<br />
};<br />
<br />
Texture texReflection;<br />
sampler ReflectionMapSampler = sampler_state<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>texture = <texreflection> ; </texreflection><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>magfilter = ANISOTROPIC;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>minfilter = LINEAR;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mipfilter = LINEAR;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>MaxAnisotropy = 8;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>AddressU = mirror;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>AddressV = mirror;<br />
};<br />
<br />
Texture texBumpMapA;<br />
sampler BumpMapSamplerA = sampler_state<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>texture = <texbumpmapa> ; </texbumpmapa><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>magfilter = ANISOTROPIC;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>minfilter = LINEAR;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mipfilter = LINEAR;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>MaxAnisotropy = 8;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>AddressU = mirror;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>AddressV = mirror;<br />
};<br />
<br />
Texture texBumpMapB;<br />
sampler BumpMapSamplerB = sampler_state<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>texture = <texbumpmapb> ; </texbumpmapb><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>magfilter = LINEAR;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>minfilter = LINEAR;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>mipfilter = LINEAR;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>AddressU = mirror;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>AddressV = mirror;<br />
};<br />
<br />
struct VertexShaderInput<br />
{<br />
float4 Position : POSITION0;<br />
float2 TexCoord : TEXCOORD0;<br />
};<br />
<br />
struct VertexShaderOutput<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float4 Position : POSITION0;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float4 TexCoordReflectionMap : TEXCOORD1;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float4 TexCoordRefractionMap : TEXCOORD2;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float2 TexCoordBumpMap : TEXCOORD3;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float4 Position3D : TEXCOORD4;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 LightTS : TEXCOORD5;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 ViewTS : TEXCOORD6;<br />
};<br />
<br />
VertexShaderOutput VertexShaderFunction(VertexShaderInput input)<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>VertexShaderOutput output;<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float4 worldPosition = mul(input.Position, mWorld);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>output.Position = mul(input.Position, mWVP);<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>output.TexCoordReflectionMap = mul(input.Position, mWVPreflection);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>output.TexCoordRefractionMap = output.Position;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>output.TexCoordBumpMap = input.TexCoord;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>output.Position3D = worldPosition;<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 tangent = float3(1,0,0);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 binormal = float3(0,0,1);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 normal = float3(0,1,0);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3x3 matTS = float3x3( tangent, binormal, normal );<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 Light = mul(LightDir, mWorldBack) - worldPosition;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 View = mul(ViewDir, mWorldBack) - worldPosition;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>output.LightTS = normalize(mul(Light, matTS));<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>output.ViewTS = normalize(mul(View, matTS));<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return output;<br />
}<br />
<br />
float4<span class="Apple-tab-span" style="white-space: pre;"> </span>cSpecularColor = float4(1, 1, 1, 1);<br />
float<span class="Apple-tab-span" style="white-space: pre;"> </span>fSpecularExponent = 300;<br />
<br />
float4 WaterPS(VertexShaderOutput input) : COLOR0<br />
{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 Distance = input.Position3D - ViewDir;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float rDistance = abs(length(Distance));<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float rDistanceY = abs(length(Distance.y));<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float rDistanceXZ = abs(length(Distance.xz));<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float lerpDistanceA = 1 - saturate(rDistanceXZ / 1000);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float lerpDistanceB = 0.0;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>if(rDistance > 50.0f)<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>lerpDistanceB = 1 - saturate(rDistance) / (1 * width);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>else<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>{<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>lerpDistanceB = saturate(rDistanceXZ / 50.0f);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>}<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// reflection<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float2 TexCoorReflection;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>TexCoorReflection.x = input.TexCoordReflectionMap.x / input.TexCoordReflectionMap.w / 2.0f + 0.5f;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>TexCoorReflection.y = -input.TexCoordReflectionMap.y / input.TexCoordReflectionMap.w / 2.0f + 0.5f;<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 bumpNormalA = tex2D(BumpMapSamplerA, input.TexCoordBumpMap * 16 + windDelCoord) * 2 - 1;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 bumpNormalB = tex2D(BumpMapSamplerB, input.TexCoordBumpMap * 256 - windDelCoord * 2 ) * 2 - 1;<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float2 moveA = bumpNormalA.xy * waveHeight * lerpDistanceA;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float2 moveB = bumpNormalB.xy * 0.2 * lerpDistanceB;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float2 TextCoordMove = moveA + moveB;<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float2 TexCoordsMoveReflection = TexCoorReflection * 0.75f + TextCoordMove;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float4 reflectiveColor = tex2D(ReflectionMapSampler, TexCoordsMoveReflection) * 0.7f;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 NormalTS = tex2D( BumpMapSamplerA, input.TexCoordBumpMap * 16 + windDelCoord) * 2 - 1;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>NormalTS = normalize( NormalTS);<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 vReflectionTS = normalize( 2 * dot( input.ViewTS, NormalTS * 2 ) * NormalTS - input.ViewTS );<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float fRdotL = dot( vReflectionTS, input.LightTS );<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float4 cSpecular = saturate( pow( fRdotL, fSpecularExponent )) * cSpecularColor;<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float light = clamp(dot(NormalTS, input.LightTS) * (reflectiveColor + cSpecular), 0, 1);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>reflectiveColor += light * 0.9;<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// refraction<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float2 TexCoordRefraction;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>TexCoordRefraction.x = input.TexCoordRefractionMap.x / input.TexCoordRefractionMap.w / 2.0f + 0.5f;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>TexCoordRefraction.y = -input.TexCoordRefractionMap.y / input.TexCoordRefractionMap.w / 2.0f + 0.5f;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float2 TexCoordsMoveRefraction = TexCoordRefraction + TextCoordMove;// * lerpDistanceRefracion;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float4 refractiveColor = tex2D(RefractionMapSampler, TexCoordsMoveRefraction);<br />
<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 eyeVector = normalize(ViewDir - input.Position3D);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float3 normalVector = float3(0,1,0);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float fNdotV = dot(eyeVector, normalVector);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float fFresnel = 1.0 - fNdotV;<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span><br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>// result<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>float4 resultColor = lerp(refractiveColor, reflectiveColor, fFresnel);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>//resultColor.rgb *= (1.0 + resultColor.a * 1.2);<br />
<span class="Apple-tab-span" style="white-space: pre;"> </span>return resultColor;<br />
}<br />
<br />
technique Water<br />
{<br />
pass P0<br />
{<br />
VertexShader = compile vs_2_0 VertexShaderFunction();<br />
PixelShader = compile ps_3_0 WaterPS();<br />
}<br />
}<br />
<div>
<br /></div>
</div>
Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com0tag:blogger.com,1999:blog-3794490644205959426.post-36285440097094090832015-02-01T13:43:00.000+03:002015-02-01T13:44:39.660+03:00Unity 3D: Управление персонажем мышкой, вид с верху<div dir="ltr" style="text-align: left;" trbidi="on">
<b>Решаем задачу:</b><br />
<br />
- Вид с верху;<br />
- Персонаж (спрайт) должен перемещаться к месту клика мышью;<br />
- Персонаж должен поворачиваться по направлению движения.<br />
<br />
<b>Решение:</b><br />
<br />
using UnityEngine;<br />
<br />
public class Player : MonoBehaviour<br />
{<br />
<br />
private Vector3 _positionMove;<br />
private float _speed = 1f;<br />
<br />
private void Start()<br />
{<br />
_positionMove = transform.position;<br />
}<br />
<br />
private void Update()<br />
{<br />
UpdateInput();<br />
UpdateMove();<br />
}<br />
<br />
private void UpdateInput()<br />
{<br />
if (Input.GetMouseButtonDown(0))<br />
{<br />
_positionMove =<br />
UnityEngine.Camera.main.ScreenToWorldPoint(Input.mousePosition);<br />
_positionMove.z = 0;<br />
}<br />
}<br />
<br />
private void UpdateMove()<br />
{<br />
float moveDelta = (_positionMove - transform.position).magnitude;<br />
if (moveDelta <= _speed * Time.deltaTime)<br />
{<br />
transform.position = _positionMove;<br />
return;<br />
}<br />
Vector3 moveDir = _positionMove - transform.position;<br />
//<br />
float angle = Mathf.Atan2(moveDir.y, moveDir.x) * Mathf.Rad2Deg - 90;<br />
transform.rotation = Quaternion.Euler(new Vector3(0, 0, angle));<br />
//<br />
moveDir.Normalize();<br />
transform.position += moveDir * _speed * Time.deltaTime;<br />
}<br />
}<br />
<div>
<br /></div>
</div>
Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com1tag:blogger.com,1999:blog-3794490644205959426.post-6964815266483228322015-02-01T13:37:00.002+03:002015-02-01T13:44:08.044+03:00Unity 3D: FPS script<div dir="ltr" style="text-align: left;" trbidi="on">
Скриптов для подсчета fps в Unity много. Способы подсчета основываются на различных исходных данных и принципах. На данный момент выбрал такой вариант:<br />
<br />
using UnityEngine;<br />
<br />
public class Fps : MonoBehaviour<br />
{<br />
private const float UpdateInterval = 1.0f;<br />
private float _timeleft;<br />
private float _lastTime;<br />
private float _timeSpan;<br />
private int _lastFrame;<br />
private int _frames;<br />
private float _fps;<br />
<br />
void Update()<br />
{<br />
_timeleft += Time.deltaTime;<br />
if (_timeleft > UpdateInterval)<br />
{<br />
_timeleft -= UpdateInterval;<br />
_frames = Time.frameCount - _lastFrame;<br />
_lastFrame = Time.frameCount;<br />
_timeSpan = Time.realtimeSinceStartup - _lastTime;<br />
_lastTime = Time.realtimeSinceStartup;<br />
_fps = Mathf.RoundToInt(_frames/_timeSpan);<br />
}<br />
}<br />
<br />
void OnGUI()<br />
{<br />
GUI.Box(new Rect(10, 10, 70, 25), string.Format("fps {0}", _fps));<br />
}<br />
}</div>
Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com0tag:blogger.com,1999:blog-3794490644205959426.post-15278141942268803432015-01-23T01:01:00.002+03:002015-01-23T01:01:52.442+03:00XNAdev.ru переехал на новый домен XNAdev-ru.1gb.ru<div dir="ltr" style="text-align: left;" trbidi="on">
По бестолковым и не зависящим от нас обстоятельствам бывший сайт и форум XNAdev.ru переехал на новый домен - <a href="http://xnadev-ru.1gb.ru/">http://xnadev-ru.1gb.ru</a></div>
Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com0tag:blogger.com,1999:blog-3794490644205959426.post-24390999163245361822012-11-11T22:48:00.000+04:002012-11-11T22:48:33.254+04:00Распаковка DxtCompressed текстур<br/>
<div dir="ltr" style="text-align: left;" trbidi="on">
Статья актуальна для разработки в XNA Game Studio и MonoGame.
<br/>
<br/>
MSDN Library: <a href="http://msdn.microsoft.com/en-us/library/bb147243(v=vs.85).aspx" target="_blank">Opaque and 1-Bit Alpha Textures (Direct3D 9)</a>
<br/>
<br/>
В данной статье приведу пример распаковки DxtCompressed текстуры. DxtCompressed текстуры имеют несколько форматов сжатия. Ниже приведенный пример распаковки предназначен для работы с форматом DXT1. В моих проектах это наиболее распространенный применяемый формат. В DXT1 прозрачность кодируется только двумя значениями 0 и 1 т.е. ни какой полу прозрачности, что дает преимущество сжатия в 4 раза. Для сравнения в DXT5 поддерживает полу прозрачность, которая кодируется отдельным блоком, за счет чего текстура жмется всего в 2 раза.
<br/>
<br/>
Для чего может понадобиться распаковка текстуры? Например, что бы по признаку прозрачности построить области проходимости игрового уровня, а так же многое другое.
<br/>
<br/>
Код примера можно разбить на части:
<br/>- загрузка DxtCompressed текстуры;
<br/>- распаковка и преобразование в массив цветов Color[];
<br/>- преобразование массива цветов в обычную текстуру;
<br/>- вывод текстуры на экран для визуальной проверки.
<br/>
<br/>
Для работы примера необходимо:
<br/>- создать новый проект Windows Game (4.0);
<br/>- в Content добавить нашу DXT1 текстуру;
<br/>- в свойствах этой текстуры переключить параметр "Texture Format" с "Color" в "DxtCompressed"
<br/>
<br/>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib8zZJibU-09fcjDncAL_8B5mKqEMe9042izwxAQrBjXw0x3IRns-pU05-uKjTsxlR4kKC9yy1RHDkZz2DrSvwojQ2sSkGaqV24Kevx2e_0WpKXay-RY2PDU5Y9UnEh_ltOGCjtKbS1bk/s1600/texture+property.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="242" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEib8zZJibU-09fcjDncAL_8B5mKqEMe9042izwxAQrBjXw0x3IRns-pU05-uKjTsxlR4kKC9yy1RHDkZz2DrSvwojQ2sSkGaqV24Kevx2e_0WpKXay-RY2PDU5Y9UnEh_ltOGCjtKbS1bk/s320/texture+property.jpg" width="320" /></a></div>
<br/>- добавляем код из примера.
<br />
<br />
Код:
<br />
<br />
<div style="text-align: left;">
<span style="font-size: x-small;">
<!-- Start block. Created with Code4Blog for Microsoft Visual Studio 2010. Copyright (c)2010 Vitaly Zayko http://zayko.net -->
<div style="color:black;overflow:auto;width:99.5%;">
<pre style="margin:0em;"> <span style="color:#f8e1c9"></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">using<span style="color:#f8e1c9"> <span style="color:#eddac0">System<span style="color:#f8e1c9">;</span></span></span></span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">using<span style="color:#f8e1c9"> <span style="color:#eddac0">Microsoft<span style="color:#c0c0c0">.<span style="color:#eddac0">Xna<span style="color:#c0c0c0">.<span style="color:#eddac0">Framework<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">using<span style="color:#f8e1c9"> <span style="color:#eddac0">Microsoft<span style="color:#c0c0c0">.<span style="color:#eddac0">Xna<span style="color:#c0c0c0">.<span style="color:#eddac0">Framework<span style="color:#c0c0c0">.<span style="color:#eddac0">Content<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">using<span style="color:#f8e1c9"> <span style="color:#eddac0">Microsoft<span style="color:#c0c0c0">.<span style="color:#eddac0">Xna<span style="color:#c0c0c0">.<span style="color:#eddac0">Framework<span style="color:#c0c0c0">.<span style="color:#eddac0">Graphics<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">using<span style="color:#f8e1c9"> <span style="color:#eddac0">Microsoft<span style="color:#c0c0c0">.<span style="color:#eddac0">Xna<span style="color:#c0c0c0">.<span style="color:#eddac0">Framework<span style="color:#c0c0c0">.<span style="color:#eddac0">Input<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">namespace<span style="color:#f8e1c9"> <span style="color:#eddac0">DxtCompressed<span style="color:#f8e1c9"></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">public<span style="color:#f8e1c9"> <span style="color:#40c4ff">class<span style="color:#f8e1c9"> <span style="color:#00ffff">Game1<span style="color:#f8e1c9"> : <span style="color:#eddac0">Microsoft<span style="color:#c0c0c0">.<span style="color:#eddac0">Xna<span style="color:#c0c0c0">.<span style="color:#eddac0">Framework<span style="color:#c0c0c0">.<span style="color:#00ffff">Game<span style="color:#f8e1c9"></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#00ffff">GraphicsDeviceManager<span style="color:#f8e1c9"> <span style="color:#eddac0">_graphics<span style="color:#f8e1c9">;</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#00ffff">SpriteBatch<span style="color:#f8e1c9"> <span style="color:#eddac0">_spriteBatch<span style="color:#f8e1c9">;</span></span></span></span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#00ffff">Texture2D<span style="color:#f8e1c9"> <span style="color:#eddac0">_dxtCompressedTexture<span style="color:#f8e1c9">;</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#00ffff">Texture2D<span style="color:#f8e1c9"> <span style="color:#eddac0">_colorTexture<span style="color:#f8e1c9">;</span></span></span></span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">public<span style="color:#f8e1c9"> <span style="color:#eddac0">Game1<span style="color:#f8e1c9">()</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">_graphics<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#00ffff">GraphicsDeviceManager<span style="color:#f8e1c9">(<span style="color:#40c4ff">this<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">Content<span style="color:#c0c0c0">.<span style="color:#eddac0">RootDirectory<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#ff80ff">"Content"<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">protected<span style="color:#f8e1c9"> <span style="color:#40c4ff">override<span style="color:#f8e1c9"> <span style="color:#40c4ff">void<span style="color:#f8e1c9"> <span style="color:#eddac0">LoadContent<span style="color:#f8e1c9">()</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">_spriteBatch<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#00ffff">SpriteBatch<span style="color:#f8e1c9">(<span style="color:#eddac0">GraphicsDevice<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">_dxtCompressedTexture<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">Content<span style="color:#c0c0c0">.<span style="color:#eddac0">Load<span style="color:#c0c0c0"><<span style="color:#00ffff">Texture2D<span style="color:#c0c0c0">><span style="color:#f8e1c9">(<span style="color:#ff80ff">"512x256"<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">_colorTexture<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">Unpacking<span style="color:#f8e1c9">(<span style="color:#eddac0">_dxtCompressedTexture<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">protected<span style="color:#f8e1c9"> <span style="color:#40c4ff">override<span style="color:#f8e1c9"> <span style="color:#40c4ff">void<span style="color:#f8e1c9"> <span style="color:#eddac0">Update<span style="color:#f8e1c9">(<span style="color:#00ffff">GameTime<span style="color:#f8e1c9"> <span style="color:#eddac0">gameTime<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">if<span style="color:#f8e1c9">(<span style="color:#00ffff">Keyboard<span style="color:#c0c0c0">.<span style="color:#eddac0">GetState<span style="color:#f8e1c9">()<span style="color:#c0c0c0">.<span style="color:#eddac0">IsKeyDown<span style="color:#f8e1c9">(<span style="color:#00ffff">Keys<span style="color:#c0c0c0">.<span style="color:#eddac0">Escape<span style="color:#f8e1c9">))</span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">Exit<span style="color:#f8e1c9">();</span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">protected<span style="color:#f8e1c9"> <span style="color:#40c4ff">override<span style="color:#f8e1c9"> <span style="color:#40c4ff">void<span style="color:#f8e1c9"> <span style="color:#eddac0">Draw<span style="color:#f8e1c9">(<span style="color:#00ffff">GameTime<span style="color:#f8e1c9"> <span style="color:#eddac0">gameTime<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">GraphicsDevice<span style="color:#c0c0c0">.<span style="color:#eddac0">Clear<span style="color:#f8e1c9">(<span style="color:#00ffff">Color<span style="color:#c0c0c0">.<span style="color:#eddac0">CornflowerBlue<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">_spriteBatch<span style="color:#c0c0c0">.<span style="color:#eddac0">Begin<span style="color:#f8e1c9">();</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">_spriteBatch<span style="color:#c0c0c0">.<span style="color:#eddac0">Draw<span style="color:#f8e1c9">(<span style="color:#eddac0">_colorTexture<span style="color:#f8e1c9">, <span style="color:#00ffff">Vector2<span style="color:#c0c0c0">.<span style="color:#eddac0">Zero<span style="color:#f8e1c9">, <span style="color:#00ffff">Color<span style="color:#c0c0c0">.<span style="color:#eddac0">White<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">_spriteBatch<span style="color:#c0c0c0">.<span style="color:#eddac0">End<span style="color:#f8e1c9">();</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">public<span style="color:#f8e1c9"> <span style="color:#40c4ff">struct<span style="color:#f8e1c9"> <span style="color:#00ffff">DXT1pixel<span style="color:#f8e1c9"></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">public<span style="color:#f8e1c9"> <span style="color:#40c4ff">ushort<span style="color:#f8e1c9"> <span style="color:#eddac0">color0<span style="color:#f8e1c9">;</span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">public<span style="color:#f8e1c9"> <span style="color:#40c4ff">ushort<span style="color:#f8e1c9"> <span style="color:#eddac0">color1<span style="color:#f8e1c9">;</span></span></span></span></span></span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">public<span style="color:#f8e1c9"> <span style="color:#40c4ff">byte<span style="color:#f8e1c9">[,] <span style="color:#eddac0">pixel<span style="color:#f8e1c9">;</span></span></span></span></span></span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">public<span style="color:#f8e1c9"> <span style="color:#eddac0">DXT1pixel<span style="color:#f8e1c9">(<span style="color:#40c4ff">byte<span style="color:#f8e1c9">[] <span style="color:#eddac0">b<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">color0<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#ff80ff">0<span style="color:#f8e1c9">;</span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">color0<span style="color:#f8e1c9"> <span style="color:#c0c0c0">|=<span style="color:#f8e1c9"> (<span style="color:#40c4ff">ushort<span style="color:#f8e1c9">)(<span style="color:#eddac0">b<span style="color:#f8e1c9">[<span style="color:#ff80ff">1<span style="color:#f8e1c9">] <span style="color:#c0c0c0"><<<span style="color:#f8e1c9"> <span style="color:#ff80ff">8<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">color0<span style="color:#f8e1c9"> <span style="color:#c0c0c0">|=<span style="color:#f8e1c9"> (<span style="color:#40c4ff">ushort<span style="color:#f8e1c9">)<span style="color:#eddac0">b<span style="color:#f8e1c9">[<span style="color:#ff80ff">0<span style="color:#f8e1c9">];</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">color1<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#ff80ff">0<span style="color:#f8e1c9">;</span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">color1<span style="color:#f8e1c9"> <span style="color:#c0c0c0">|=<span style="color:#f8e1c9"> (<span style="color:#40c4ff">ushort<span style="color:#f8e1c9">)(<span style="color:#eddac0">b<span style="color:#f8e1c9">[<span style="color:#ff80ff">3<span style="color:#f8e1c9">] <span style="color:#c0c0c0"><<<span style="color:#f8e1c9"> <span style="color:#ff80ff">8<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">color1<span style="color:#f8e1c9"> <span style="color:#c0c0c0">|=<span style="color:#f8e1c9"> (<span style="color:#40c4ff">ushort<span style="color:#f8e1c9">)<span style="color:#eddac0">b<span style="color:#f8e1c9">[<span style="color:#ff80ff">2<span style="color:#f8e1c9">];</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">pixel<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#40c4ff">byte<span style="color:#f8e1c9">[<span style="color:#ff80ff">4<span style="color:#f8e1c9">, <span style="color:#ff80ff">4<span style="color:#f8e1c9">];</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">byte<span style="color:#f8e1c9">[] <span style="color:#eddac0">bbbb<span style="color:#f8e1c9">;</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">for<span style="color:#f8e1c9">(<span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">i<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#ff80ff">0<span style="color:#f8e1c9">; <span style="color:#eddac0">i<span style="color:#f8e1c9"> <span style="color:#c0c0c0"><<span style="color:#f8e1c9"> <span style="color:#ff80ff">4<span style="color:#f8e1c9">; <span style="color:#eddac0">i<span style="color:#c0c0c0">++<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">bbbb<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">DecompressByte<span style="color:#f8e1c9">(<span style="color:#eddac0">b<span style="color:#f8e1c9">[<span style="color:#eddac0">i<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#ff80ff">4<span style="color:#f8e1c9">]);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">pixel<span style="color:#f8e1c9">[<span style="color:#ff80ff">0<span style="color:#f8e1c9">, <span style="color:#eddac0">i<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">bbbb<span style="color:#f8e1c9">[<span style="color:#ff80ff">0<span style="color:#f8e1c9">];</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">pixel<span style="color:#f8e1c9">[<span style="color:#ff80ff">1<span style="color:#f8e1c9">, <span style="color:#eddac0">i<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">bbbb<span style="color:#f8e1c9">[<span style="color:#ff80ff">1<span style="color:#f8e1c9">];</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">pixel<span style="color:#f8e1c9">[<span style="color:#ff80ff">2<span style="color:#f8e1c9">, <span style="color:#eddac0">i<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">bbbb<span style="color:#f8e1c9">[<span style="color:#ff80ff">2<span style="color:#f8e1c9">];</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">pixel<span style="color:#f8e1c9">[<span style="color:#ff80ff">3<span style="color:#f8e1c9">, <span style="color:#eddac0">i<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">bbbb<span style="color:#f8e1c9">[<span style="color:#ff80ff">3<span style="color:#f8e1c9">];</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">private<span style="color:#f8e1c9"> <span style="color:#40c4ff">byte<span style="color:#f8e1c9">[] <span style="color:#eddac0">DecompressByte<span style="color:#f8e1c9">(<span style="color:#40c4ff">byte<span style="color:#f8e1c9"> <span style="color:#eddac0">b<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">byte<span style="color:#f8e1c9">[] <span style="color:#eddac0">bb<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#40c4ff">byte<span style="color:#f8e1c9">[<span style="color:#ff80ff">4<span style="color:#f8e1c9">];</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">for<span style="color:#f8e1c9">(<span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">i<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#ff80ff">0<span style="color:#f8e1c9">; <span style="color:#eddac0">i<span style="color:#f8e1c9"> <span style="color:#c0c0c0"><<span style="color:#f8e1c9"> <span style="color:#ff80ff">4<span style="color:#f8e1c9">; <span style="color:#eddac0">i<span style="color:#c0c0c0">++<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">bb<span style="color:#f8e1c9">[<span style="color:#eddac0">i<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> (<span style="color:#40c4ff">byte<span style="color:#f8e1c9">)(<span style="color:#eddac0">b<span style="color:#f8e1c9"> <span style="color:#c0c0c0">&<span style="color:#f8e1c9"> <span style="color:#ff80ff">0x03<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">b<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> (<span style="color:#40c4ff">byte<span style="color:#f8e1c9">)(<span style="color:#eddac0">b<span style="color:#f8e1c9"> <span style="color:#c0c0c0">>><span style="color:#f8e1c9"> <span style="color:#ff80ff">2<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">return<span style="color:#f8e1c9"> <span style="color:#eddac0">bb<span style="color:#f8e1c9">;</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">private<span style="color:#f8e1c9"> <span style="color:#00ffff">Color<span style="color:#f8e1c9"> <span style="color:#eddac0">WordToColor<span style="color:#f8e1c9">(<span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">word<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">r<span style="color:#f8e1c9">,<span style="color:#eddac0">g<span style="color:#f8e1c9">,<span style="color:#eddac0">b<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">b<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">word<span style="color:#f8e1c9"> <span style="color:#c0c0c0">&<span style="color:#f8e1c9"> <span style="color:#ff80ff">0x1f<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">word<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">word<span style="color:#f8e1c9"> <span style="color:#c0c0c0">>><span style="color:#f8e1c9"> <span style="color:#ff80ff">5<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">g<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">word<span style="color:#f8e1c9"> <span style="color:#c0c0c0">&<span style="color:#f8e1c9"> <span style="color:#ff80ff">0x3f<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">word<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">word<span style="color:#f8e1c9"> <span style="color:#c0c0c0">>><span style="color:#f8e1c9"> <span style="color:#ff80ff">6<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">r<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">word<span style="color:#f8e1c9">;</span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">return<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#00ffff">Color<span style="color:#f8e1c9">(<span style="color:#eddac0">r<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">8<span style="color:#f8e1c9">, <span style="color:#eddac0">g<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">4<span style="color:#f8e1c9">, <span style="color:#eddac0">b<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">8<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">public<span style="color:#f8e1c9"> <span style="color:#00ffff">Texture2D<span style="color:#f8e1c9"> <span style="color:#eddac0">Unpacking<span style="color:#f8e1c9">(<span style="color:#00ffff">Texture2D<span style="color:#f8e1c9"> <span style="color:#eddac0">dxtTexture<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">if<span style="color:#f8e1c9">(<span style="color:#eddac0">dxtTexture<span style="color:#c0c0c0">.<span style="color:#eddac0">Format<span style="color:#f8e1c9"> <span style="color:#c0c0c0">!=<span style="color:#f8e1c9"> <span style="color:#00ffff">SurfaceFormat<span style="color:#c0c0c0">.<span style="color:#eddac0">Dxt1<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">return<span style="color:#f8e1c9"> <span style="color:#40c4ff">null<span style="color:#f8e1c9">;</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">_width<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">dxtTexture<span style="color:#c0c0c0">.<span style="color:#eddac0">Width<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">_height<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">dxtTexture<span style="color:#c0c0c0">.<span style="color:#eddac0">Height<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">w<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">_width<span style="color:#f8e1c9"> <span style="color:#c0c0c0">>><span style="color:#f8e1c9"> <span style="color:#ff80ff">2<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">h<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">_height<span style="color:#f8e1c9"> <span style="color:#c0c0c0">>><span style="color:#f8e1c9"> <span style="color:#ff80ff">2<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">byte<span style="color:#f8e1c9">[] <span style="color:#eddac0">color<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#40c4ff">byte<span style="color:#f8e1c9">[<span style="color:#eddac0">w<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#eddac0">h<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">8<span style="color:#f8e1c9">];</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">dxtTexture<span style="color:#c0c0c0">.<span style="color:#eddac0">GetData<span style="color:#c0c0c0"><<span style="color:#40c4ff">byte<span style="color:#c0c0c0">><span style="color:#f8e1c9">(<span style="color:#eddac0">color<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#7cfc00">//<span style="color:#f8e1c9"></span></span></pre>
<pre style="margin:0em;"> <span style="color:#00ffff">DXT1pixel<span style="color:#f8e1c9">[,] <span style="color:#eddac0">dxt<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#00ffff">DXT1pixel<span style="color:#f8e1c9">[<span style="color:#eddac0">w<span style="color:#f8e1c9">, <span style="color:#eddac0">h<span style="color:#f8e1c9">];</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">i<span style="color:#f8e1c9">;</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">byte<span style="color:#f8e1c9">[] <span style="color:#eddac0">b<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#40c4ff">byte<span style="color:#f8e1c9">[<span style="color:#ff80ff">8<span style="color:#f8e1c9">];</span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">for<span style="color:#f8e1c9">(<span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">y<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#ff80ff">0<span style="color:#f8e1c9">; <span style="color:#eddac0">y<span style="color:#f8e1c9"> <span style="color:#c0c0c0"><<span style="color:#f8e1c9"> <span style="color:#eddac0">h<span style="color:#f8e1c9">; <span style="color:#eddac0">y<span style="color:#c0c0c0">++<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">for<span style="color:#f8e1c9">(<span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">x<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#ff80ff">0<span style="color:#f8e1c9">; <span style="color:#eddac0">x<span style="color:#f8e1c9"> <span style="color:#c0c0c0"><<span style="color:#f8e1c9"> <span style="color:#eddac0">w<span style="color:#f8e1c9">; <span style="color:#eddac0">x<span style="color:#c0c0c0">++<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">i<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> (<span style="color:#eddac0">y<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#eddac0">w<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#eddac0">x<span style="color:#f8e1c9">) <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">8<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#00ffff">Array<span style="color:#c0c0c0">.<span style="color:#eddac0">Copy<span style="color:#f8e1c9">(<span style="color:#eddac0">color<span style="color:#f8e1c9">, <span style="color:#eddac0">i<span style="color:#f8e1c9">, <span style="color:#eddac0">b<span style="color:#f8e1c9">, <span style="color:#ff80ff">0<span style="color:#f8e1c9">, <span style="color:#ff80ff">8<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">dxt<span style="color:#f8e1c9">[<span style="color:#eddac0">x<span style="color:#f8e1c9">, <span style="color:#eddac0">y<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#00ffff">DXT1pixel<span style="color:#f8e1c9">(<span style="color:#eddac0">b<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">i<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#ff80ff">0<span style="color:#f8e1c9">;</span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#00ffff">Color<span style="color:#f8e1c9">[] <span style="color:#eddac0">newColor<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#00ffff">Color<span style="color:#f8e1c9">[<span style="color:#eddac0">_width<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#eddac0">_height<span style="color:#f8e1c9">];</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">for<span style="color:#f8e1c9">(<span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">y<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#ff80ff">0<span style="color:#f8e1c9">; <span style="color:#eddac0">y<span style="color:#f8e1c9"> <span style="color:#c0c0c0"><<span style="color:#f8e1c9"> <span style="color:#eddac0">h<span style="color:#f8e1c9">; <span style="color:#eddac0">y<span style="color:#c0c0c0">++<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">for<span style="color:#f8e1c9">(<span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">x<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#ff80ff">0<span style="color:#f8e1c9">; <span style="color:#eddac0">x<span style="color:#f8e1c9"> <span style="color:#c0c0c0"><<span style="color:#f8e1c9"> <span style="color:#eddac0">w<span style="color:#f8e1c9">; <span style="color:#eddac0">x<span style="color:#c0c0c0">++<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">for<span style="color:#f8e1c9">(<span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">yy<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#ff80ff">0<span style="color:#f8e1c9">; <span style="color:#eddac0">yy<span style="color:#f8e1c9"> <span style="color:#c0c0c0"><<span style="color:#f8e1c9"> <span style="color:#ff80ff">4<span style="color:#f8e1c9">; <span style="color:#eddac0">yy<span style="color:#c0c0c0">++<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">for<span style="color:#f8e1c9">(<span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">xx<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#ff80ff">0<span style="color:#f8e1c9">; <span style="color:#eddac0">xx<span style="color:#f8e1c9"> <span style="color:#c0c0c0"><<span style="color:#f8e1c9"> <span style="color:#ff80ff">4<span style="color:#f8e1c9">; <span style="color:#eddac0">xx<span style="color:#c0c0c0">++<span style="color:#f8e1c9">)</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">int<span style="color:#f8e1c9"> <span style="color:#eddac0">ic<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> (<span style="color:#eddac0">y<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">4<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#eddac0">yy<span style="color:#f8e1c9">) <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#eddac0">_width<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#eddac0">x<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">4<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#eddac0">xx<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#00ffff">Color<span style="color:#f8e1c9"> <span style="color:#eddac0">color0<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">WordToColor<span style="color:#f8e1c9">(<span style="color:#eddac0">dxt<span style="color:#f8e1c9">[<span style="color:#eddac0">x<span style="color:#f8e1c9">, <span style="color:#eddac0">y<span style="color:#f8e1c9">]<span style="color:#c0c0c0">.<span style="color:#eddac0">color0<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#00ffff">Color<span style="color:#f8e1c9"> <span style="color:#eddac0">color1<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">WordToColor<span style="color:#f8e1c9">(<span style="color:#eddac0">dxt<span style="color:#f8e1c9">[<span style="color:#eddac0">x<span style="color:#f8e1c9">, <span style="color:#eddac0">y<span style="color:#f8e1c9">]<span style="color:#c0c0c0">.<span style="color:#eddac0">color1<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">if<span style="color:#f8e1c9">(<span style="color:#eddac0">dxt<span style="color:#f8e1c9">[<span style="color:#eddac0">x<span style="color:#f8e1c9">, <span style="color:#eddac0">y<span style="color:#f8e1c9">]<span style="color:#c0c0c0">.<span style="color:#eddac0">color0<span style="color:#f8e1c9"> <span style="color:#c0c0c0">><span style="color:#f8e1c9"> <span style="color:#eddac0">dxt<span style="color:#f8e1c9">[<span style="color:#eddac0">x<span style="color:#f8e1c9">, <span style="color:#eddac0">y<span style="color:#f8e1c9">]<span style="color:#c0c0c0">.<span style="color:#eddac0">color1<span style="color:#f8e1c9">) </span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#00ffff">Color<span style="color:#f8e1c9"> <span style="color:#eddac0">color2<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#00ffff">Color<span style="color:#f8e1c9">(</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> (<span style="color:#40c4ff">int<span style="color:#f8e1c9">)(<span style="color:#eddac0">color0<span style="color:#c0c0c0">.<span style="color:#eddac0">R<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">0.66f<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#eddac0">color1<span style="color:#c0c0c0">.<span style="color:#eddac0">R<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">0.34f<span style="color:#f8e1c9">),</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> (<span style="color:#40c4ff">int<span style="color:#f8e1c9">)(<span style="color:#eddac0">color0<span style="color:#c0c0c0">.<span style="color:#eddac0">G<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">0.66f<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#eddac0">color1<span style="color:#c0c0c0">.<span style="color:#eddac0">G<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">0.34f<span style="color:#f8e1c9">),</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> (<span style="color:#40c4ff">int<span style="color:#f8e1c9">)(<span style="color:#eddac0">color0<span style="color:#c0c0c0">.<span style="color:#eddac0">B<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">0.66f<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#eddac0">color1<span style="color:#c0c0c0">.<span style="color:#eddac0">B<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">0.34f<span style="color:#f8e1c9">));</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#00ffff">Color<span style="color:#f8e1c9"> <span style="color:#eddac0">color3<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#00ffff">Color<span style="color:#f8e1c9">(</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> (<span style="color:#40c4ff">int<span style="color:#f8e1c9">)(<span style="color:#eddac0">color0<span style="color:#c0c0c0">.<span style="color:#eddac0">R<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">0.34f<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#eddac0">color1<span style="color:#c0c0c0">.<span style="color:#eddac0">R<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">0.66f<span style="color:#f8e1c9">),</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> (<span style="color:#40c4ff">int<span style="color:#f8e1c9">)(<span style="color:#eddac0">color0<span style="color:#c0c0c0">.<span style="color:#eddac0">G<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">0.34f<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#eddac0">color1<span style="color:#c0c0c0">.<span style="color:#eddac0">G<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">0.66f<span style="color:#f8e1c9">),</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> (<span style="color:#40c4ff">int<span style="color:#f8e1c9">)(<span style="color:#eddac0">color0<span style="color:#c0c0c0">.<span style="color:#eddac0">B<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">0.34f<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#eddac0">color1<span style="color:#c0c0c0">.<span style="color:#eddac0">B<span style="color:#f8e1c9"> <span style="color:#c0c0c0">*<span style="color:#f8e1c9"> <span style="color:#ff80ff">0.66f<span style="color:#f8e1c9">));</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">switch<span style="color:#f8e1c9">(<span style="color:#eddac0">dxt<span style="color:#f8e1c9">[<span style="color:#eddac0">x<span style="color:#f8e1c9">, <span style="color:#eddac0">y<span style="color:#f8e1c9">]<span style="color:#c0c0c0">.<span style="color:#eddac0">pixel<span style="color:#f8e1c9">[<span style="color:#eddac0">xx<span style="color:#f8e1c9">, <span style="color:#eddac0">yy<span style="color:#f8e1c9">])</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">case<span style="color:#f8e1c9"> <span style="color:#ff80ff">0x00<span style="color:#f8e1c9">:</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">newColor<span style="color:#f8e1c9">[<span style="color:#eddac0">ic<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">color0<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">break<span style="color:#f8e1c9">;</span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">case<span style="color:#f8e1c9"> <span style="color:#ff80ff">0x01<span style="color:#f8e1c9">:</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">newColor<span style="color:#f8e1c9">[<span style="color:#eddac0">ic<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">color1<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">break<span style="color:#f8e1c9">;</span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">case<span style="color:#f8e1c9"> <span style="color:#ff80ff">0x02<span style="color:#f8e1c9">:</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">newColor<span style="color:#f8e1c9">[<span style="color:#eddac0">ic<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">color2<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">break<span style="color:#f8e1c9">;</span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">case<span style="color:#f8e1c9"> <span style="color:#ff80ff">0x03<span style="color:#f8e1c9">:</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">newColor<span style="color:#f8e1c9">[<span style="color:#eddac0">ic<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">color3<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">break<span style="color:#f8e1c9">;</span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">else<span style="color:#f8e1c9"> </span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#00ffff">Color<span style="color:#f8e1c9"> <span style="color:#eddac0">color2<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#00ffff">Color<span style="color:#f8e1c9">(</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> (<span style="color:#40c4ff">int<span style="color:#f8e1c9">)(<span style="color:#eddac0">color0<span style="color:#c0c0c0">.<span style="color:#eddac0">R<span style="color:#f8e1c9"> <span style="color:#c0c0c0">/<span style="color:#f8e1c9"> <span style="color:#ff80ff">2<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#eddac0">color1<span style="color:#c0c0c0">.<span style="color:#eddac0">R<span style="color:#f8e1c9"> <span style="color:#c0c0c0">/<span style="color:#f8e1c9"> <span style="color:#ff80ff">2<span style="color:#f8e1c9">),</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> (<span style="color:#40c4ff">int<span style="color:#f8e1c9">)(<span style="color:#eddac0">color0<span style="color:#c0c0c0">.<span style="color:#eddac0">G<span style="color:#f8e1c9"> <span style="color:#c0c0c0">/<span style="color:#f8e1c9"> <span style="color:#ff80ff">2<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#eddac0">color1<span style="color:#c0c0c0">.<span style="color:#eddac0">G<span style="color:#f8e1c9"> <span style="color:#c0c0c0">/<span style="color:#f8e1c9"> <span style="color:#ff80ff">2<span style="color:#f8e1c9">),</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> (<span style="color:#40c4ff">int<span style="color:#f8e1c9">)(<span style="color:#eddac0">color0<span style="color:#c0c0c0">.<span style="color:#eddac0">B<span style="color:#f8e1c9"> <span style="color:#c0c0c0">/<span style="color:#f8e1c9"> <span style="color:#ff80ff">2<span style="color:#f8e1c9"> <span style="color:#c0c0c0">+<span style="color:#f8e1c9"> <span style="color:#eddac0">color1<span style="color:#c0c0c0">.<span style="color:#eddac0">B<span style="color:#f8e1c9"> <span style="color:#c0c0c0">/<span style="color:#f8e1c9"> <span style="color:#ff80ff">2<span style="color:#f8e1c9">));</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#00ffff">Color<span style="color:#f8e1c9"> <span style="color:#eddac0">color3<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#00ffff">Color<span style="color:#c0c0c0">.<span style="color:#eddac0">Transparent<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">switch<span style="color:#f8e1c9">(<span style="color:#eddac0">dxt<span style="color:#f8e1c9">[<span style="color:#eddac0">x<span style="color:#f8e1c9">, <span style="color:#eddac0">y<span style="color:#f8e1c9">]<span style="color:#c0c0c0">.<span style="color:#eddac0">pixel<span style="color:#f8e1c9">[<span style="color:#eddac0">xx<span style="color:#f8e1c9">, <span style="color:#eddac0">yy<span style="color:#f8e1c9">])</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">{</span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">case<span style="color:#f8e1c9"> <span style="color:#ff80ff">0x00<span style="color:#f8e1c9">:</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">newColor<span style="color:#f8e1c9">[<span style="color:#eddac0">ic<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">color0<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">break<span style="color:#f8e1c9">;</span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">case<span style="color:#f8e1c9"> <span style="color:#ff80ff">0x01<span style="color:#f8e1c9">:</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">newColor<span style="color:#f8e1c9">[<span style="color:#eddac0">ic<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">color1<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">break<span style="color:#f8e1c9">;</span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">case<span style="color:#f8e1c9"> <span style="color:#ff80ff">0x02<span style="color:#f8e1c9">:</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">newColor<span style="color:#f8e1c9">[<span style="color:#eddac0">ic<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">color2<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">break<span style="color:#f8e1c9">;</span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">case<span style="color:#f8e1c9"> <span style="color:#ff80ff">0x03<span style="color:#f8e1c9">:</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">newColor<span style="color:#f8e1c9">[<span style="color:#eddac0">ic<span style="color:#f8e1c9">] <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#eddac0">color3<span style="color:#f8e1c9">;</span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">break<span style="color:#f8e1c9">;</span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#00ffff">Texture2D<span style="color:#f8e1c9"> <span style="color:#eddac0">t<span style="color:#f8e1c9"> <span style="color:#c0c0c0">=<span style="color:#f8e1c9"> <span style="color:#40c4ff">new<span style="color:#f8e1c9"> <span style="color:#00ffff">Texture2D<span style="color:#f8e1c9">(<span style="color:#eddac0">_graphics<span style="color:#c0c0c0">.<span style="color:#eddac0">GraphicsDevice<span style="color:#f8e1c9">, <span style="color:#eddac0">_width<span style="color:#f8e1c9">, <span style="color:#eddac0">_height<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">t<span style="color:#c0c0c0">.<span style="color:#eddac0">SetData<span style="color:#c0c0c0"><<span style="color:#00ffff">Color<span style="color:#c0c0c0">><span style="color:#f8e1c9">(<span style="color:#eddac0">newColor<span style="color:#f8e1c9">);</span></span></span></span></span></span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#40c4ff">return<span style="color:#f8e1c9"> <span style="color:#eddac0">t<span style="color:#f8e1c9">;</span></span></span></span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> <span style="color:#eddac0">}</span></pre>
<pre style="margin:0em;"> </pre>
<pre style="margin:0em;"> </pre>
</div>
<!-- End block -->
</div>
</span>
<div style="color: black; overflow: auto; width: 99.5%;">
<pre style="margin: 0em;"> </pre>
<pre style="margin: 0em;"> </pre>
<pre style="margin: 0em;"> </pre>
<pre style="margin: 0em;"> </pre>
</div>
</div>
Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com3tag:blogger.com,1999:blog-3794490644205959426.post-74209965356977462252012-11-11T12:45:00.004+04:002012-11-11T18:41:45.376+04:00Как работать с XNA Game Studio в Visual Studio 2012?<div dir="ltr" style="text-align: left;" trbidi="on">
Александр Сороколетов подсказал волшебную статью:<br />
<a href="http://stackoverflow.com/questions/10881005/how-to-install-xna-game-studio-on-visual-studio-2012">How to install XNA game studio on Visual Studio 2012?</a></div>
Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com0tag:blogger.com,1999:blog-3794490644205959426.post-76446404532799182352011-10-15T16:04:00.003+04:002015-02-04T22:20:32.214+03:00"GB&W Lite" [wp7][game][release]<div dir="ltr" style="text-align: left;" trbidi="on">
Выпустил лайт версию игры GB&W.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb1Pfcy15QGewwwEYwUCsNbmp9FVu5vUQv-qomfRvikHMAXKJlIGWkNjXskLmFa_Oo0ftsd3pMLo4WZSuraiHhlQl1aOX_Nz99810NuEEFk68BoaaDxyB6i72smJ_FqvjK39KtYedtXEk/s1600/0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjb1Pfcy15QGewwwEYwUCsNbmp9FVu5vUQv-qomfRvikHMAXKJlIGWkNjXskLmFa_Oo0ftsd3pMLo4WZSuraiHhlQl1aOX_Nz99810NuEEFk68BoaaDxyB6i72smJ_FqvjK39KtYedtXEk/s320/0.png" width="192" /></a></div>
<br />
Вот видео с мастер классом по прохождению 19го уровня:<br />
<br />
<iframe allowfullscreen="" frameborder="0" height="480" src="http://www.youtube.com/embed/kWtSphWZeQk?hd=1" width="640"></iframe><br />
<br />
игру можно найти тут:
<br />
<div class="XnaCgp_shell_background" id="xnaCgpShellBackground">
<div class="XnaCgp_shell_body_shadow" id="xnaCgpShellBodyShadow">
<div class="XnaCgp_shell_body" id="xnaCgpShellBody">
<div id="appDContentContainer">
<div>
<div id="appDContentId">
<div>
<div>
<div>
<div id="MetadataInstanceId">
<div class="appDMetadataInstanceColumnsNoMargin">
<div class="appDMetadataColRight">
<div>
<div class="appDMetadataProperty">
<span class="styleC"><a href="http://windowsphone.com/s?appid=127a61e4-a6a9-4c0a-b4e4-b1469856d22b">http://windowsphone.com/s?appid=127a61e4-a6a9-4c0a-b4e4-b1469856d22b</a></span></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<br />
<br />
Как видите есть ряд изменений в оформлении, они коснулись и полной версии приложения для которого вышло соответствующее обновление.<br />
<br />
Оказалось, при первой публикации лайт версии,
GB&W занимает в памяти более 90 МБ (на сколько не скажу). Очень много анимированной растровой рафики. Лайт версию пришлось немного порезать. Получается для GB&W мне в свое время сделали скидку :).</div>Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com10tag:blogger.com,1999:blog-3794490644205959426.post-83424914297716960242011-07-13T21:33:00.007+04:002011-07-13T22:30:47.473+04:00Компромисс в выборе между классом и структуройНа тему навела вот эта статья <a href="http://www.calabonga.com/Blog/ViewPost.aspx?id=93">"NET 4.0: Class vs Struct или в чём различия между Классом и Структурой"</a> . Давно уже собирался собрать для себя набор иерархии универсальных коллекций, которые не попадают под сборку мусора. Тема в очередной раз стала интересна после моего известного эксперимента с Windows Phone 7. Очень сомневаюсь, что моя статья будет полезна для бизнес-приложений. Меня больше интересует данная тема для использования в XNA/DirectX и как область применения - игры. <br />
<br />
Приглашаю вас обсудить данный вопрос.<br />
<br />
И так, условия задачи:<br />
- Нужна коллекция элементов для описания, например, системы частиц (это может быть все что угодно). Такая штука в которой в среднем 60 раз в секунду добавляются и удаляются сотни элементов.<br />
- Изменения в коллекции не должны влиять на сборку мусора.<br />
- Нельзя использовать структуры! Только ссылочные типы.<br />
- Запрещено создавать и удалять классы, за исключением первой инициализации.<br />
- Физическое количество элементов в коллекции должно быть постоянным. Т.к. изменение длинны массива достаточно накладная операция, а количество элементов должно постоянно плавать, то подойдет подобие кеша. Ограничение - разработчику желательно четко знать максимально возможное количество элементов в такой коллекции. А это значит игра должна быть грамотно спроектирована. Хотя лазейку я оставлю.<br />
<br />
<br />
<b>Набросал вот такой черновик.</b><br />
<br />
Базовый класс для элемента коллекции:<br />
<br />
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> TElementConstLength
{
<span class="kwrd">private</span> <span class="kwrd">int</span> indexInCollection = -1;
<span class="kwrd">internal</span> <span class="kwrd">int</span> IndexInCollection { get { <span class="kwrd">return</span> indexInCollection; } }
<span class="kwrd">internal</span> <span class="kwrd">void</span> SetIndexInCollection(<span class="kwrd">int</span> i)
{
indexInCollection = i;
}
}</pre><br />
<br />
Базовый класс для коллекции:<br />
<br />
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> TCollectionConstLength<T> <span class="kwrd">where</span> T : TElementConstLength, <span class="kwrd">new</span>()
{
<span class="kwrd">private</span> T[] elements;
<span class="kwrd">private</span> <span class="kwrd">int</span> count = 0;
<span class="rem">/// <summary></span>
<span class="rem">/// Количество живых элементов</span>
<span class="rem">/// </summary></span>
<span class="kwrd">public</span> <span class="kwrd">int</span> Count { get { <span class="kwrd">return</span> count; } }
<span class="kwrd">private</span> <span class="kwrd">int</span> end = -1;
<span class="rem">/// <summary></span>
<span class="rem">/// Инициализация колекции</span>
<span class="rem">/// </summary></span>
<span class="rem">/// <param name="length">Длинна коллекции</param></span>
<span class="kwrd">public</span> TCollectionConstLength(<span class="kwrd">int</span> length)
{
elements = <span class="kwrd">new</span> T[length];
}
<span class="rem">/// <summary></span>
<span class="rem">/// Доступ к элементу по индексу</span>
<span class="rem">/// </summary></span>
<span class="rem">/// <param name="index">Индекс</param></span>
<span class="rem">/// <returns>Элемент</returns></span>
<span class="kwrd">public</span> T <span class="kwrd">this</span>[<span class="kwrd">int</span> index]
{
get { <span class="kwrd">return</span> elements[index]; }
}
<span class="rem">/// <summary></span>
<span class="rem">/// Выделение места под новый элемент</span>
<span class="rem">/// </summary></span>
<span class="rem">/// <returns>Новый элемент</returns></span>
<span class="kwrd">public</span> <span class="kwrd">virtual</span> T GetNew() <span class="rem">// = Add</span>
{
<span class="rem">// если список полон, для режима отладки</span>
<span class="kwrd">if</span>(end == elements.Length - 1)
Array.Resize(<span class="kwrd">ref</span> elements, elements.Length + 1);
<span class="rem">// </span>
end++;
count++;
<span class="rem">// если не инициализирован элемент</span>
<span class="kwrd">if</span>(elements[end] == <span class="kwrd">null</span>)
{
elements[end] = <span class="kwrd">new</span> T();
elements[end].SetIndexInCollection(end);
}
<span class="rem">//</span>
<span class="kwrd">return</span> elements[end];
}
<span class="rem">/// <summary></span>
<span class="rem">/// Очистка списка</span>
<span class="rem">/// </summary></span>
<span class="kwrd">public</span> <span class="kwrd">void</span> Clear()
{
end = -1;
count = 0;
}
<span class="rem">/// <summary></span>
<span class="rem">/// Удаление элемента по индексу</span>
<span class="rem">/// </summary></span>
<span class="rem">/// <param name="index">Индекс</param></span>
<span class="kwrd">public</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> Remove(<span class="kwrd">int</span> index)
{
<span class="rem">// выход за пределы</span>
<span class="kwrd">if</span>(index < 0 || index > end)
<span class="kwrd">return</span>;
<span class="kwrd">if</span>(index < end)
{
<span class="rem">// рокировка элементов</span>
T temp = elements[end];
elements[end] = elements[index];
elements[index] = temp;
<span class="rem">// рокировка индексов</span>
<span class="kwrd">int</span> i = elements[end].IndexInCollection;
elements[end].SetIndexInCollection(elements[index].IndexInCollection);
elements[index].SetIndexInCollection(i);
}
<span class="rem">// уменьшаем список</span>
end--;
count--;
}
<span class="rem">/// <summary></span>
<span class="rem">/// Удаление элемента</span>
<span class="rem">/// </summary></span>
<span class="rem">/// <param name="e">Элемент</param></span>
<span class="kwrd">public</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> Remove(T e)
{
<span class="rem">// проверка на соответствие ссылок (защита от тупости)</span>
<span class="kwrd">if</span>(e != elements[e.IndexInCollection])
<span class="kwrd">return</span>;
Remove(e.IndexInCollection);
}
}</pre><br />
Вот пример для тестов:<br />
<br />
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">namespace</span> CollectionConstLength
{
<span class="kwrd">public</span> <span class="kwrd">class</span> ElementTest : TElementConstLength
{
<span class="kwrd">private</span> <span class="kwrd">string</span> name;
<span class="kwrd">public</span> <span class="kwrd">string</span> Name { get { <span class="kwrd">return</span> name; } set { name = <span class="kwrd">value</span>; } }
<span class="kwrd">public</span> ElementTest() { }
}
<span class="kwrd">class</span> Program
{
<span class="kwrd">static</span> TCollectionConstLength<ElementTest> item;
<span class="kwrd">static</span> <span class="kwrd">void</span> Main(<span class="kwrd">string</span>[] args)
{
item = <span class="kwrd">new</span> TCollectionConstLength<ElementTest>(5);
ElementTest et;
<span class="kwrd">for</span>(<span class="kwrd">int</span> i = 0; i < 5; i++)
{
et = item.GetNew();
et.Name = i.ToString();
}
<span class="rem">//</span>
Print();
<span class="rem">//</span>
item.Remove(item[1]);
Print();
<span class="rem">//</span>
Console.ReadKey();
}
<span class="kwrd">static</span> <span class="kwrd">void</span> Print()
{
Console.WriteLine(<span class="str">"//--------------------------------"</span>);
<span class="kwrd">for</span>(<span class="kwrd">int</span> i = 0; i < item.Count; i++)
{
Console.WriteLine(
<span class="kwrd">string</span>.Format(<span class="str">"index - {0}; name - \"{1}\";"</span>,
item[i].IndexInCollection,
item[i].Name));
}
Console.WriteLine(<span class="str">"//--------------------------------"</span>);
}
}
}</pre><br />
<br />
Пример наращивания функционала через наследование:<br />
<br />
- Расширенный класс элемента:<br />
<br />
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> TUpdate : TElementConstLength
{
<span class="kwrd">public</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> Update() { }
}</pre><br />
- Расширенный класс коллекции<br />
<br />
<pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> TUpdateCollection<T> : TCollectionConstLength<T> <span class="kwrd">where</span> T : TUpdate, <span class="kwrd">new</span>()
{
<span class="kwrd">public</span> TUpdateCollection(<span class="kwrd">int</span> l) : <span class="kwrd">base</span>(l) { }
<span class="kwrd">public</span> <span class="kwrd">virtual</span> <span class="kwrd">void</span> Update()
{
<span class="kwrd">for</span>(<span class="kwrd">int</span> i = 0; i < <span class="kwrd">base</span>.Count; i++)
{
<span class="kwrd">base</span>[i].Update();
}
}
}</pre><br />
<br />
Данный подход позволяет исключить сборку мусора и равномерно распределить нагрузку на процессор. Для каждого наследника от базового класса нужно добавить метод заполняющий поля данного класса, что делает процесс инициализации нового члена коллекции похожим на инициализацию структуры.<br />
<br />
Давайте пообщаемся на эту тему.<br />
Так же буду рад ссылкам на статьи с подобными темами и изысканиями.Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com22tag:blogger.com,1999:blog-3794490644205959426.post-5719129160640899562011-07-06T19:31:00.002+04:002015-02-04T22:23:15.764+03:00От идеи до реализации: история игры GB&W<div align="center">Написал о создании игры статью для wp7rocks.com</div><div align="center"><br />
</div><div align="center"><a href="http://www.wp7rocks.com/2011/07/gb.html">"От идеи до реализации: история игры GB&W"</a></div><br />
<div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWHVptAl1V1vstrKPVnmsyAS_bsrFaiWiC9eCREzhkrJ72av9n5noVU9DZtvDRZGjmPhLfmICfGNQCmOYHCSRcTLykgsCX7pqG7LRrX95FfFiXwi-UuPw4Lg4UhkONBxOc175ytl2wKGc/s1600/480x800.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgWHVptAl1V1vstrKPVnmsyAS_bsrFaiWiC9eCREzhkrJ72av9n5noVU9DZtvDRZGjmPhLfmICfGNQCmOYHCSRcTLykgsCX7pqG7LRrX95FfFiXwi-UuPw4Lg4UhkONBxOc175ytl2wKGc/s320/480x800.png" width="192" /></a></div>Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com0tag:blogger.com,1999:blog-3794490644205959426.post-37632079796471535572011-07-02T20:51:00.002+04:002011-07-02T20:54:32.955+04:00Лето ... Юмор ...<div dir="ltr" style="text-align: left;" trbidi="on"><br />
<div class="MsoNormal"></div><div class="MsoNormal"><i>Бред конечно, но когда пытаешься сосредоточиться на работе, а тебе при этом постоянно мешают, еще эта жара - именно такие мысли лезут в голову:</i></div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><span style="color: #f6b26b;">Тенгизи</span>: к сожалению, пока некогда :(( работа... осенью закуплю девайсы и морозными зимними вечерами... :)</div><div class="MsoNormal"><span style="color: #ffd966;">Dmitry</span>: да.. да..)))</div><div class="MsoNormal"><span style="color: #ffd966;">Dmitry</span>: я вот тут думаю, как бы до морозных вечеров обороты набрать, что бы потом только щепки летели)))</div><div class="MsoNormal"><span style="color: #f6b26b;">Тенгизи</span>: лето... мозги вообще ничего делать не хотят... :((</div><div class="MsoNormal"><span style="color: #f6b26b;">Тенгизи</span>: у нас жара вторую неделю... жесть...</div><div class="MsoNormal"><span style="color: #ffd966;">Dmitry</span>: ищу стимулы, у нас тоже пекло)</div><div class="MsoNormal"><span style="color: #f6b26b;">Тенгизи</span>: ну у вас-то еще бы!</div><div class="MsoNormal"><span style="color: #ffd966;">Dmitry</span>: )))</div><div class="MsoNormal"><span style="color: #f6b26b;">Тенгизи</span>: мы-то люди северные, к жаре не привычные</div><div class="MsoNormal"><span style="color: #ffd966;">Dmitry</span>: да я лето из за лени ненавижу)))</div><div class="MsoNormal"><span style="color: #f6b26b;">Тенгизи</span>: хотя я 17 лет в минводах прожил, но тут уже адаптировался... )</div><div class="MsoNormal"><span style="color: #ffd966;">Dmitry</span>: у меня такое подозрение, что для того что бы я смог раскрыть все свои способности, по максимуму, и реализовать их - меня нужно запереть на какой ни будь полярной станции и не выпускать.</div><div class="MsoNormal"><span style="color: #ffd966;">Dmitry</span>: только с компом и интернетом)))</div><div class="MsoNormal"><span style="color: #ffd966;">Dmitry</span>: и раз в неделю привозить еду и женщин)))))))))))</div><div class="MsoNormal"><span style="color: #ffd966;">Dmitry</span>: ух ...</div><div class="MsoNormal"><span style="color: #f6b26b;">Тенгизи</span>: у меня такое же мнение!!! сто пудово! если запереть - реализуемся...</div><div class="MsoNormal"><span style="color: #f6b26b;">Тенгизи</span>: даже женщин на хрен не возите, только отвлекать будут... потерплю тройку месяцев ))))</div><div class="MsoNormal"><span style="color: #ffd966;">Dmitry</span>: раз в неделю можно часок расслабиться)))</div><div class="MsoNormal"><span style="color: #f6b26b;">Тенгизи</span>: при таком раскладе даже в покер научится играть можно профессионально... ))</div><div class="MsoNormal"><span style="color: #f6b26b;">Тенгизи</span>: ну.. если часок... но потом чтоб СРАЗУ УВОЗИЛИ! :))</div><div class="MsoNormal"><span style="color: #ffd966;">Dmitry</span>: прилетела на вертолете, еды привезла, удовлетворила и улетела)))</div><div class="MsoNormal"><span style="color: #ffd966;">Dmitry</span>: идеал женщины)))</div><div class="MsoNormal"><span style="color: #f6b26b;">Тенгизи</span>: )))))))</div><div class="MsoNormal"><span style="color: #f6b26b;">Тенгизи</span>: к тому же чтоб глухонемая была ))</div><div class="MsoNormal"><span style="color: #ffd966;">Dmitry</span>: не вопрос)))<br />
<br />
<i>Приятно осознавать, что ты не один такой :)</i> </div></div>Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com0tag:blogger.com,1999:blog-3794490644205959426.post-26737310874692023272011-07-02T13:36:00.001+04:002011-07-02T13:40:05.950+04:00"GB&W" in "Top WP7 Games : June 2011 [ POLL ]"<div dir="ltr" style="text-align: left;" trbidi="on">Сайт <a href="http://www.bestwp7games.com/">bestwp7games.com</a> предложил голосование за игры для Windows Phone 7 вышедшие в июне. В этом списке на ряду с топовыми играми, имеющими статут xbox live, каким то образом, оказалась и наша игра GB&W. Приглашаю вас присоединиться к нашей группе болельщиков и принять участие в голосовании.<br />
<br />
<a href="http://www.bestwp7games.com/top-wp7-games-june-2011-poll.html"><span style="font-size: large;"><span style="color: orange;">Проголосовать можно тут</span></span></a><br />
<br />
Регистрация не нужна. Достаточно выбрать соответствующий пункт и подтвердить кнопкой "vote".<br />
<br />
<span style="font-size: large;">Всем огромное спасибо за отклик и участие!</span><br />
<br />
<i>P.S. Топовым играм, имеющим статус xbox live и команду поддержки, хватает внимания, загрузок и покупок, а вот нам бы все это даже очень не помешало.</i></div>Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com0tag:blogger.com,1999:blog-3794490644205959426.post-35328257770395643362011-06-13T23:22:00.001+04:002015-02-04T22:23:32.164+03:00GB&W - Update v1.4Это уже 4-е обновление. <br />
<br />
Сейчас доступно:<br />
- 40 уровней.<br />
- 14 типов кирпичей<br />
- 14 бонусов<br />
<br />
Одна из последних добавленный пакостей это кирпич с кодовым названием "Биомасса". Он не прерывно плодиться с постоянной скоростью, кроме того он подвержен влиянию 2х бонусов:<br />
- катализатор, единовременно ускоряющий рост общего объема биомассы<br />
- заморозка, соответственно временно останавливающий рост биомассы.<br />
<br />
Вот новое видео:<br />
<iframe width="480" height="390" src="http://www.youtube.com/embed/h5m0uhxfOWg" frameborder="0" allowfullscreen></iframe>Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com11tag:blogger.com,1999:blog-3794490644205959426.post-73048396976062721322011-05-18T22:48:00.002+04:002015-02-04T22:24:28.911+03:00GB&W и Конкурс мобильных приложений<div dir="ltr" style="text-align: left;" trbidi="on">С начала главный вопрос на повестке дня).<br />
<br />
Сегодня зарегистрировал свой проект в конкурсе мобильных приложений под Windows Phone 7 на сайте конференции <a href="http://event.msdevcon.ru/wp7.aspx"><span style="color: #f6b26b;">DevCon•11</span></a>. В конкурсе участвует следующее видео:<br />
<iframe allowfullscreen="" frameborder="0" height="480" src="http://www.youtube.com/embed/B2TBZFYYzWU?hd=1" width="480"></iframe><br />
<br />
Ребят у меня к вам просьба - кому симпатичен данный проект, пожалуйста не пожалейте 5 секунд своего времени, проголосуйте за него, для меня важен каждый Ваш голос. Ниже кнопочка для голосования:<br />
<a href="http://wp7-contest.cloudapp.net/Vote/116ad744-87c2-4e95-a755-152ee6397247"><img src="http://wp7-contest.cloudapp.net/Images/vote.png" /></a><br />
Заранее благодарен.<br />
<br />
Наконец то завершена работа над первым релизом игры. Почему первым? Потому что в планах добавлять уровни в следующих обновлениях. Сейчас приложение находится на этапе публикации в Marketplace.</div>Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com12tag:blogger.com,1999:blog-3794490644205959426.post-7670317407768054322011-04-23T15:05:00.011+04:002015-02-04T22:25:07.056+03:00GB&W - Windows Phone 7 game preview 3Не пугайтесь обилию выпадающих бонусов. Это один из первых десяти обучающих уровней. Десятка разбита по применению тематических бонусов их комбинаций.<br />
В этом уровне первый раз появляется усиление на пулемет, который в свою очередь превращается в нечто иное :).<br />
<br />
Рекомендую смотреть в качестве 720p (сейчас 480p)<br />
<br />
<iframe title="YouTube video player" width="480" height="800" src="http://www.youtube.com/embed/keu3-XGnJ2I?hd=1" frameborder="0" allowfullscreen></iframe><br />
<br />
Мне часто задают вопрос - как происходит управление в игре и как целиться? Все просто. Кораблик управляется одним касанием и постоянно находится под пальцем. Пулеметы наводятся на ближайшую цель в радиусе поражения. Вторым касанием на кнопки в верхней панели активируется тяжелое вооружение:<br />
ракета I - открыть/закрыть подвеску, для экономии боезапаса. Само наводится и поражает ближайшего бота. При потере цели в процессе подлета (цель уничтожена др. ракетой и т.д.) находит и атакует следующую ближайшую.<br />
ракета II - пуск. Само наводится и поражает/запечатывает ближайшую шахту из которой появляются боты.<br />
ракета III - активация ракеты. Второе нажатие в области экрана помечает область поражения и происходит старт. Так же взрывается от столкновения с кирпичами.<br />
<br />
Я потратил какое то время на изменение своего Touch класса. Теперь он понимает второе касание типа Tap при активном первом касании. Т.е. можно не прерываясь контролить кораблик и активировать ракетные бонусы.Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com1tag:blogger.com,1999:blog-3794490644205959426.post-76591325303533699362011-03-23T23:57:00.000+03:002015-02-04T22:23:04.712+03:00"Guns, Balls & Walls" - Windows Phone 7 game preview 2Делюсь очередным видео. Музыкальное сопровождение отключено по политическим соображениям. Еще нет четкой договоренности с композитором.<br />
<br />
<iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/BSSHp9zlpDg" frameborder="0" allowfullscreen></iframe>Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com5tag:blogger.com,1999:blog-3794490644205959426.post-13513717388761629602011-03-07T16:22:00.004+03:002015-02-04T22:22:51.560+03:00"Guns, Balls & Walls" - Windows Phone 7 game previewИгра предназначается для Windows Phone 7 marketplace.<br />
Cуть игры - смешанный коктейль трех направлений:<br />
1) арканоид - основная идея и условия прохождения уровня.<br />
2) аэрохоккей - расширенные правила взаимодействия биты(battleship) и мяча<br />
3) хардкорный 2d шутер - пулеметы, ракеты, враги, кровь, взрывы ... боже дай мне сил остановиться :))).<br />
<br />
Отладочный уровень:<br />
<iframe title="YouTube video player" width="480" height="390" src="http://www.youtube.com/embed/q_ab-4F6Lf0" frameborder="0" allowfullscreen></iframe><br />
<br />
Планируется сменное оружие для обоих типов вооружения, <br />
а так же их прокачка. Возможные параметры: дальность, урон, скорострельность. Пока остановимся на стандартных амбициях.<br />
<br />
В целом данный проект является экспериментом, в том числе и в 2d.<br />
Очень много времени уходит на рисование, особенно что касается на первый взгляд не заметных деталей таких как кровь на решетках вентиляторов и т.д. . Примерное соотношение времени = (день рисую) / (час программирую). С самим вопросом рисования проблем нет, но не набита рука, плюс, например, если в карандаше я нарисую все что угодно, то ощущение цвета нужно еще нарабатывать. Радует то, что по мере работы прокачка движется. Мега респект создателям графического редактора Paint.net<br />
<br />
Windows Phone 7 радует своими возможностями. По предварительным подсчетам, в данном приложении, запас на частицы порядка 4000 штук. Возможно при желании у меня получится и больше. Время покажет.Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com15tag:blogger.com,1999:blog-3794490644205959426.post-47087433079559771122011-02-10T01:32:00.007+03:002011-02-10T23:16:19.274+03:00XNA GUI library for Windows & Windows Phone 7. General Presentation FoundationВот на таком эпическом названии остановился мой выбор). В основном такая идея была продиктована большой схожестью названий и возможностей элементов библиотеки с технологией Windows Presentation Foundation. Это как бы должно с первых шагов подвести пользователя к мысли что все просто и знакомо в обращении. В библиотеке есть еще места которые можно в перспективе рефакторить для еще большей схожести, но всему свое время. У меня ушло очень много времени на создание сайта на сильверлайте. Именно сильверлайт я выбрал по причине отсутствия необходимости учить для меня что то новое, т.к. я ни когда не работал в области web и это мой первый сайт.<br />
<br />
Пересекая очередной финиш, хочу выразить огромную благодарность за помощь, советы и творческие обсуждения своим друзьям:<br />
- Сергей Лутай - <a href="http://lutay.uneta.com.ua">блог</a> - <a href="http://twitter.com/sergeylutay">твиттер</a><br />
- Сергей Звездин - <a href="http://blog.zwezdin.com/ru/">блог</a><br />
- Ильшат Хабибуллин<br />
Спасибо ребят).<br />
<br />
Сам сайт продукта <a href="http://generalpf.ru">http://generalpf.ru</a>Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com12tag:blogger.com,1999:blog-3794490644205959426.post-33438571481560782562011-02-10T00:32:00.000+03:002011-02-10T00:32:05.074+03:00Comments for Vic Gundotra message:"#feb11 Two turkeys do not make an Eagle"Забавный мужик этот Vic Gundotra. Он является вице-президентом по разработкам в Google. В своем блоге он оставил такое сообщение "#feb11 Two turkeys do not make an Eagle", что по нашему звучит как "11 февраля Из двух индеек не получится Орла". Мало кто сомневается, что речь идет о возможном альянсе Microsoft и Nokia. <br />
<br />
Заерзали значит, это хорошо). На уровне вице-президента публичные цирки происходят.<br />
<br />
"Кроме мяса, индейки дают много ценного пуха и пера" <a href="http://ru.wikipedia.org/wiki/Домашняя_индейка">[Домашняя индейка]</a>, а орел?))).<br />
<br />
У одной индейки богатый опыт в области мобильных решений, правда ОС не сахар, видимо софт не их занятие. У другой большой потенциал с софтом и возможностями. Есть повод для переживаний).Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com2tag:blogger.com,1999:blog-3794490644205959426.post-19489963209626110952011-01-14T18:16:00.001+03:002011-01-14T18:21:21.967+03:00XNA, GarbageCollector, SynchronizeWithVerticalRetrace, IsFixedTimeStep – используйте правила и будет вам счастье …И так по порядку. Что значат эти термины:<br />
<br />
<i>SynchronizeWithVerticalRetrace</i> – public properties GraphicsDeviceManager. Gets or sets a value that indicates whether to sync to the vertical trace (vsync) when presenting the back buffer (MSDN). Эта штука синхронизирует переключение back buffers с частотой обновления экрана монитора. Зная, как технически происходит обновление изображения на мониторе, можно сказать, что включение данного параметра нужно для предотвращения разрезания изображения при смене кадров.<br />
<br />
<i>IsFixedTimeStep</i> - public properties Microsoft.Xna.Framework.Game. Gets or sets a value indicating whether to use fixed time steps (MSDN). Параметр, отвечающий за включение или отключение режима, который отвечает за ограничение частоты вызовов метода Update.<br />
<br />
<i>GarbageCollector</i> – системный сборщик мусора. Конкретно нас будет интересовать класс System.GC .<br />
<br />
Как работают SynchronizeWithVerticalRetrace и IsFixedTimeStep. Есть четыре сочетания данных флагов:<br />
1. <i>SynchronizeWithVerticalRetrace = false</i> и <i>IsFixedTimeStep = false</i><br />
В этом случае графические буферы меняются по мере их рисования, не дожидаясь синхроимпульса, синхронно вызывается метод Update.<br />
Особенности: обычно в приложении не требуется вызывать метод Update с максимально возможной частотой. При SynchronizeWithVerticalRetrace = false мы имеем возможность измерять значение fps превышающее частоту обновления монитора. Активно пользуюсь при отладке приложения.<br />
2. <i>SynchronizeWithVerticalRetrace = false</i> и <i>IsFixedTimeStep = true</i><br />
В этом случае мы можем дополнительно контролировать частоту вызова методов Update и Draw и устанавливать фиксированный интервал через свойство TargetElapsedTime.<br />
Особенности: сомнительное удовольствие применять данный подход повсеместно. Он подходит, для каких либо исключительных случаев, в которых его применение полностью обоснованно. Не пользуюсь.<br />
3. <i>SynchronizeWithVerticalRetrace = true</i> и <i>IsFixedTimeStep = false</i><br />
Тут все просто, обновляем, рендерим, ждем синхронизации, меняем back buffers и по новой.<br />
Особенности: невозможно измерить значение fps выше частоты обновления монитора. Пользуюсь.<br />
4. <i>SynchronizeWithVerticalRetrace = true</i> и <i>IsFixedTimeStep = true</i> <br />
Интересный случай. Если время синхронизации меньше IsFixedTimeStep, то ждем следующей синхронизации и только после этого выполняется Update и Draw. Если же время синхронизации больше IsFixedTimeStep, то по факту выполнения синхронизации не медленно выполняется Update и Draw. Эдакий хромающий ослик без одной ноги).<br />
Особенности: теряюсь в догадках где это можно применить, точно не мой профиль). В некоторых случаях при значениях TargetElapsedTime/ vsyncTime = 1.5f (примерно) можно на глаз заметить не равномерное обновления экрана. Не пользуюсь.<br />
<br />
Уже теплее. И так, о главном). Если вы написали приложение|игру используя XNA, применили из вышеописанных приемов 1й или 3й и в вашем приложении наблюдаются периодические задержки, а вы к тому же нечайно вспомнили «слова которые нельзя произносить» - Garbage Collector ))). Главное не паникуйте, при этом не обязательно писать в различных форумах Ваше мнение о .net и XNA, крутости и преимуществах C++. Все это от нервов, нервы от не знания, не знание от лени, лень от глупости, но это лечится.<br />
<br />
Как пользуется Garbage Collector’ом рядовой «пользователь» Visual Studio? Да ни как. Он полагается на настройки по умолчанию для Garbage Collector’а. Настройки по умолчанию рассчитаны на так называемые бизнес приложения, для динамичной работы с DirectX нужно доработать.<br />
<br />
По умолчанию Garbage Collector выполняет освобождение памяти в любом случае не синхронно с работой Update. Мертвый груз копится и освобождается в непредсказуемый, для логики вашего приложения, момент. Самый простой выход – это делать в начале очередного Update:<br />
<i>System.GC.Collect(1);</i><br />
Где 1 это номер поколения, значение подобрано экспериментально.<br />
<br />
С другой стороны может быть не целесообразно перегибать палку и выполнять сборку мусора 60 раз в секунду при включенной синхронизации (если у монитора такая рабочая частота обновления экрана) или более 60 раз при выключенной синхронизации.<br />
По этому можно сделать так:<br />
<!-- code formatted by http://manoli.net/csharpformat/ --><br />
<pre class="csharpcode"><span class="kwrd">using</span> System;
<span class="kwrd">using</span> System.ComponentModel;
<span class="kwrd">using</span> Microsoft.Xna.Framework;
<span class="kwrd">namespace</span> GeneralPresentationFoundation.gSystem.gGarbageCollector
{
<span class="kwrd">public</span> <span class="kwrd">class</span> GarbageCollector
{
<span class="kwrd">private</span> BackgroundWorker bw = <span class="kwrd">new</span> BackgroundWorker();
<span class="kwrd">private</span> <span class="kwrd">int</span> stepNumber = 0;
<span class="kwrd">private</span> <span class="kwrd">int</span> sleepStep = 1;
<span class="kwrd">public</span> <span class="kwrd">int</span> SleepStep { get { <span class="kwrd">return</span> sleepStep; } set { sleepStep = <span class="kwrd">value</span>; } }
<span class="kwrd">public</span> GarbageCollector()
{
Init();
}
<span class="kwrd">public</span> GarbageCollector(<span class="kwrd">int</span> sleepStep)
{
<span class="kwrd">this</span>.sleepStep = sleepStep;
Init();
}
<span class="kwrd">private</span> <span class="kwrd">void</span> Init()
{
bw.DoWork += <span class="kwrd">new</span> DoWorkEventHandler(bw_DoWork);
}
<span class="kwrd">public</span> <span class="kwrd">void</span> Update()
{
<span class="kwrd">if</span>(!bw.IsBusy)
{
stepNumber++;
<span class="kwrd">if</span>(stepNumber == sleepStep)
{
stepNumber = 0;
bw.RunWorkerAsync();
}
}
}
<span class="kwrd">private</span> <span class="kwrd">void</span> bw_DoWork(Object sender, EventArgs e)
{
GC.Collect(1);
}
}
}</pre><br />
Возможно не везде будет полезным применение потока, это просто мой случай.<br />
GarbageCollector gc = new GarbageCollector(20);<br />
т.е. при частоте монитора 60 Гц - 3 раза в секунду.Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com3tag:blogger.com,1999:blog-3794490644205959426.post-6612101694826118142010-12-01T14:50:00.002+03:002010-12-01T14:53:42.459+03:00RSDN совместно с MSDN сообщают о новом конкурсе статей по технологиям MicrosoftRSDN совместно с MSDN сообщают о новом конкурсе статей по технологиям Microsoft, посвященных одной из двух тем: <br />
- Возможности операционной системы Windows 7 <br />
- .NET <br />
На конкурс принимаются русскоязычные технические статьи, присланные на адрес submit@rsdn.ru в период с 12 октября по 31 января 2011 года.<br />
Первые три места получают:<br />
1 Notebok Acer "Aspire 3820TG-5464G50iks"<br />
2 Коммуникатор HTC "HD2 T8585"<br />
3 XBox 360<br />
<br />
Участники, написавшие интересные статьи, но не попавшие в первую тройку, получат специальные призы от жюри:<br />
4 Microsoft "Wireless Laser Desktop 7000"<br />
5 Microsoft "Natural Ergonomic Keyboard 4000"<br />
6 Microsoft "Wireless Arc Mouse" ZJA-00010<br />
<br />
<a href="http://www.rsdn.ru">Подробности тут</a>Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com0tag:blogger.com,1999:blog-3794490644205959426.post-20688997135106015942010-10-14T18:36:00.000+04:002010-10-14T18:36:08.245+04:00GPF - "WPF" for XNAGPF - на таком рабочем названии библиотеки я остановился.<br />
<br />
Сегодня закончил модуль 3d форм - это такой штука, обеспечивающая <br />
функционал добавления в сцену объектов на плоские грани которых можно проецировать формы и оперировать ими указателем мыши.<br />
<br />
Пока не стал возиться с наложением форм на не плоские поверхности по<br />
причине того, что это нарушит совместимость с Windows Phone 7 экземпляром библиотеки.<br />
<br />
Вот такое видео:<br />
<br />
<object width="480" height="320"><param name="movie" value="http://www.youtube.com/v/HahT-fzWxj4?fs=1&hl=ru_RU"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/HahT-fzWxj4?fs=1&hl=ru_RU" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="320"></embed></object><br />
<br />
Показал Expander, DataGrid, Table.<br />
Со стилями элементов опять не поиграл. Оставил на потом)Dmitry Timofeevhttp://www.blogger.com/profile/05545583070070386907noreply@blogger.com30