<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Depth Sorting</title>
		<link>http://www.allegro.cc/forums/view/555858</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 29 Dec 2005 03:29:34 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m looking into what I <u>think</u> people call &#39;depth sorting&#39;. In that, I want to make sure that objects closer to the camera are drawn last so that they overlap objects further away.</p><p>I&#39;m using some code that I have adjusted from amarillion&#39;s mode 7 tutorial:</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">void</span> render_object <span class="k2">(</span><a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp, <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>obj, <a href="http://www.allegro.cc/manual/fixed" target="_blank"><span class="a">fixed</span></a> angle, <a href="http://www.allegro.cc/manual/fixed" target="_blank"><span class="a">fixed</span></a> cx, <a href="http://www.allegro.cc/manual/fixed" target="_blank"><span class="a">fixed</span></a> cy, <a href="http://www.allegro.cc/manual/fixed" target="_blank"><span class="a">fixed</span></a> cz, CAMERA_PARAMS camera<span class="k2">)</span></td></tr><tr><td class="number">2</td><td><span class="k2">{</span></td></tr><tr><td class="number">3</td><td>    </td></tr><tr><td class="number">4</td><td>    <span class="k1">int</span> width, height<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>    <span class="k1">int</span> screen_y, screen_x<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td>    <a href="http://www.allegro.cc/manual/fixed" target="_blank"><span class="a">fixed</span></a> obj_x <span class="k3">=</span> <a href="http://www.allegro.cc/manual/itofix" target="_blank"><span class="a">itofix</span></a><span class="k2">(</span><span class="n">160</span><span class="k2">)</span> <span class="k3">-</span> cx<span class="k2">;</span></td></tr><tr><td class="number">8</td><td>    <a href="http://www.allegro.cc/manual/fixed" target="_blank"><span class="a">fixed</span></a> obj_y <span class="k3">=</span> <a href="http://www.allegro.cc/manual/itofix" target="_blank"><span class="a">itofix</span></a><span class="k2">(</span><span class="n">100</span><span class="k2">)</span> <span class="k3">-</span> cy<span class="k2">;</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td>    <a href="http://www.allegro.cc/manual/fixed" target="_blank"><span class="a">fixed</span></a> space_x <span class="k3">=</span> fmul <span class="k2">(</span>obj_x, fcos <span class="k2">(</span>angle<span class="k2">)</span><span class="k2">)</span> <span class="k3">+</span> fmul <span class="k2">(</span>obj_y, fsin <span class="k2">(</span>angle<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>    <a href="http://www.allegro.cc/manual/fixed" target="_blank"><span class="a">fixed</span></a> space_y <span class="k3">=</span> <span class="k3">-</span>fmul <span class="k2">(</span>obj_x, fsin <span class="k2">(</span>angle<span class="k2">)</span><span class="k2">)</span> <span class="k3">+</span> fmul <span class="k2">(</span>obj_y, fcos <span class="k2">(</span>angle<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>    screen_x <span class="k3">=</span> bmp-&gt;w<span class="k3">/</span><span class="n">2</span> <span class="k3">+</span> <a href="http://www.allegro.cc/manual/fixtoi" target="_blank"><span class="a">fixtoi</span></a> <span class="k2">(</span>fmul <span class="k2">(</span>fdiv <span class="k2">(</span>camera.s_x, space_x<span class="k2">)</span>, space_y<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">14</td><td>    screen_y <span class="k3">=</span> <a href="http://www.allegro.cc/manual/fixtoi" target="_blank"><span class="a">fixtoi</span></a> <span class="k2">(</span>fdiv <span class="k2">(</span>fmul <span class="k2">(</span>cz, camera.s_y<span class="k2">)</span>, space_x<span class="k2">)</span><span class="k2">)</span> <span class="k3">-</span> camera.horizon<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td>    height <span class="k3">=</span> <a href="http://www.allegro.cc/manual/fixtoi" target="_blank"><span class="a">fixtoi</span></a> <span class="k2">(</span>obj-&gt;h <span class="k3">*</span> fdiv<span class="k2">(</span>camera.obj_s_y, space_x<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>    width <span class="k3">=</span> <a href="http://www.allegro.cc/manual/fixtoi" target="_blank"><span class="a">fixtoi</span></a> <span class="k2">(</span>obj-&gt;w <span class="k3">*</span> fdiv<span class="k2">(</span>camera.obj_s_x, space_x<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td>    <a href="http://www.allegro.cc/manual/stretch_sprite" target="_blank"><span class="a">stretch_sprite</span></a> <span class="k2">(</span>bmp, obj, screen_x <span class="k3">-</span> width <span class="k3">/</span> <span class="n">2</span>, screen_y <span class="k3">-</span> height, width, height<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">20</td><td>&#160;</td></tr><tr><td class="number">21</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>

Now, as far as I know, there are a few techniques to &#39;depth sort&#39; objects. One popular one is the Z-Buffer, if I&#39;m not mistaken. And that is where all objects that are visible are ordered by Z-Buffer and then pushed to render in that order.</p><p>Now, my problem is that the code above will take the Z coordinate, but uses it to adjust height, rather than &#39;distance&#39;. If I set a Z value of 1500 the objects will hover above the ground.</p><p>So I assume that I need to adjust the &#39;Y&#39; axis, instead. But I thought it best to ask before embarking on a guessing game! <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ngiacomelli)</author>
		<pubDate>Wed, 28 Dec 2005 04:43:27 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>When I wrote that article, I thought it would be logical to use space_x and space_y to refer to the mode 7 plane, and space_z for the height above the plane. What you want is to sort by space_x (after you&#39;ve done the rotation transformation).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (amarillion)</author>
		<pubDate>Wed, 28 Dec 2005 05:10:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">amarillion&#39;s mode 7 tutorial said:</div><div class="quote"><p>
Here is the code (circ11.c). To test your intelligence, I use not space_y but space_z to represent the upward direction.
</p></div></div><p>
You sort by depth, which may be represented by whatever variable you choose.</p><p>As a side note, your method is fine, but is not z-buffering.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Zaphos)</author>
		<pubDate>Wed, 28 Dec 2005 05:13:16 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Now, as far as I know, there are a few techniques to &#39;depth sort&#39; objects. One popular one is the Z-Buffer, if I&#39;m not mistaken. And that is where all objects that are visible are ordered by Z-Buffer and then pushed to render in that order.
</p></div></div><p>
Z-buffer is something completely different. In this method every pixel in addition to its RGB values has its depth stored. If you draw new pixel new depth is compared with the old one and if new pixel is closer then RGB and Z values are updated (if new pixel is behind the old one nothing happens). This way you don&#39;t have to care about in which order you draw. Also intersecting shapes are handled correctly (you can&#39;t draw them correctly by just sorting them). Z-buffer technique is used by all modern GPUs (at least these widely available) and it&#39;s extremely fast. Z-buffer values of nearby pixels are usually almost the same, so GPUs use compression and other algorithms to fully exploit this fact.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Krzysztof Kluczek)</author>
		<pubDate>Wed, 28 Dec 2005 06:51:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Can anyone give me the name of the method I&#39;m talking about?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ngiacomelli)</author>
		<pubDate>Wed, 28 Dec 2005 07:07:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>&quot;Depth sorting&quot; is a generic term used to describe this method - &quot;painter&#39;s algorithm&quot; is another one commonly seen. So, you basically have the right idea - create a list of the objects that need drawing, sort it, and draw them in that order. The standard C libraries provide qsort which is a suitable sorting algorithm, I&#39;m sure STL has lots of similar things so really all you have to think about is how you&#39;re going to represent your list and what factor you&#39;re going to sort by.</p><p>Of course, Amarillion has already answered the latter.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Wed, 28 Dec 2005 08:21:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>EDIT: Wrong! Bubble sort suffers terrible slow-down when there are too many objects. Shall try something else.</p><p>I&#39;ve written a bubble sort routine which works out quite nicely. I&#39;ll mark this as answered but if anyone has any objections to using a bubble sort with a linked-list... or for this method in general. Don&#39;t be afraid to say so <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="c">// bubble sort</span></td></tr><tr><td class="number">2</td><td><span class="k1">void</span> calculate_object_render_order<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">3</td><td>     </td></tr><tr><td class="number">4</td><td>     obj_list <span class="k3">*</span>tmp, <span class="k3">*</span>next<span class="k2">;</span></td></tr><tr><td class="number">5</td><td>     <span class="k1">int</span> tmpx, tmpy, tmpz, tmpv, tmpd<span class="k2">;</span></td></tr><tr><td class="number">6</td><td>     </td></tr><tr><td class="number">7</td><td>     tmp <span class="k3">=</span> next <span class="k3">=</span> head<span class="k2">;</span> </td></tr><tr><td class="number">8</td><td>     </td></tr><tr><td class="number">9</td><td>     <span class="k1">while</span> <span class="k2">(</span>tmp <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">10</td><td>           next <span class="k3">=</span> tmp<span class="k2">;</span></td></tr><tr><td class="number">11</td><td>           <span class="k1">while</span><span class="k2">(</span>next <span class="k3">!</span><span class="k3">=</span> NULL<span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">12</td><td>                      <span class="k1">if</span><span class="k2">(</span>tmp-&gt;x <span class="k3">&lt;</span> next-&gt;x<span class="k2">)</span> <span class="k2">{</span> </td></tr><tr><td class="number">13</td><td>                                </td></tr><tr><td class="number">14</td><td>                         tmpx <span class="k3">=</span> tmp-&gt;x<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>                         tmpy <span class="k3">=</span> tmp-&gt;y<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>                         tmpz <span class="k3">=</span> tmp-&gt;z<span class="k2">;</span></td></tr><tr><td class="number">17</td><td>                         tmpv <span class="k3">=</span> tmp-&gt;visible<span class="k2">;</span></td></tr><tr><td class="number">18</td><td>                         tmpd <span class="k3">=</span> tmp-&gt;distance<span class="k2">;</span></td></tr><tr><td class="number">19</td><td>                         </td></tr><tr><td class="number">20</td><td>                         tmp-&gt;x <span class="k3">=</span> next-&gt;x<span class="k2">;</span></td></tr><tr><td class="number">21</td><td>                         tmp-&gt;y <span class="k3">=</span> next-&gt;y<span class="k2">;</span></td></tr><tr><td class="number">22</td><td>                         tmp-&gt;z <span class="k3">=</span> next-&gt;z<span class="k2">;</span></td></tr><tr><td class="number">23</td><td>                         tmp-&gt;visible <span class="k3">=</span> next-&gt;visible<span class="k2">;</span></td></tr><tr><td class="number">24</td><td>                         tmp-&gt;distance <span class="k3">=</span> next-&gt;distance<span class="k2">;</span></td></tr><tr><td class="number">25</td><td>                         </td></tr><tr><td class="number">26</td><td>                         next-&gt;x <span class="k3">=</span> tmpx<span class="k2">;</span></td></tr><tr><td class="number">27</td><td>                         next-&gt;y <span class="k3">=</span> tmpy<span class="k2">;</span></td></tr><tr><td class="number">28</td><td>                         next-&gt;z <span class="k3">=</span> tmpz<span class="k2">;</span></td></tr><tr><td class="number">29</td><td>                         next-&gt;visible <span class="k3">=</span> tmpv<span class="k2">;</span></td></tr><tr><td class="number">30</td><td>                         next-&gt;distance <span class="k3">=</span> tmpd<span class="k2">;</span></td></tr><tr><td class="number">31</td><td>                         </td></tr><tr><td class="number">32</td><td>                      <span class="k2">}</span></td></tr><tr><td class="number">33</td><td>                      next <span class="k3">=</span> next-&gt;next<span class="k2">;</span>                      </td></tr><tr><td class="number">34</td><td>           <span class="k2">}</span></td></tr><tr><td class="number">35</td><td>           tmp <span class="k3">=</span> tmp-&gt;next<span class="k2">;</span></td></tr><tr><td class="number">36</td><td>     <span class="k2">}</span></td></tr><tr><td class="number">37</td><td>     </td></tr><tr><td class="number">38</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (ngiacomelli)</author>
		<pubDate>Wed, 28 Dec 2005 16:18:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>hmmm why not just swap the pointer instead of swapping all those members ?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Wed, 28 Dec 2005 16:44:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Bubble sort is not really a bad algorithm if array members don&#39;t swich places too often and is mostly sorted. </p><p>Of cource I would use the standard STL <a href="http://www.sgi.com/tech/stl/Vector.html">std::vector</a> of pointers (with preallocated space so no reallocations take place) and <a href="http://www.sgi.com/tech/stl/sort.html">std::sort</a> with custom comparator.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (HoHo)</author>
		<pubDate>Wed, 28 Dec 2005 17:00:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>
Bubble sort is not really a bad algorithm
</p></div></div><p>
Bubble Sort is just a dense version of Insertion Sort!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Harte)</author>
		<pubDate>Wed, 28 Dec 2005 19:09:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I suggest using std::sort for this - it uses one of O(n log n) algorithms and because it&#39;s template everything is inlined (unlike qsort, which has to call a function for each comparison), so it&#39;s really fast. It worked quite nice for me in Snake (my TINS/SpeedHack entry, I don&#39;t remember exactly which one). <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td><span class="k1">struct</span> tCompareFun <span class="k2">{</span></td></tr><tr><td class="number">2</td><td>  <span class="k1">bool</span> <span class="k1">operator</span> <span class="k2">(</span><span class="k2">)</span><span class="k2">(</span><span class="k1">const</span> tObject <span class="k3">*</span>a,<span class="k1">const</span> tObject <span class="k3">*</span>b<span class="k2">)</span> <span class="k1">const</span></td></tr><tr><td class="number">3</td><td>  <span class="k2">{</span></td></tr><tr><td class="number">4</td><td>    <span class="k1">return</span> a-&gt;z <span class="k3">&gt;</span> b-&gt;z<span class="k2">;</span>  <span class="c">// this operator should return a&lt;b</span></td></tr><tr><td class="number">5</td><td>                         <span class="c">// but we need reverse order</span></td></tr><tr><td class="number">6</td><td>  <span class="k2">}</span></td></tr><tr><td class="number">7</td><td><span class="k2">}</span><span class="k2">;</span></td></tr><tr><td class="number">8</td><td>&#160;</td></tr><tr><td class="number">9</td><td><span class="k1">void</span> draw_all<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">10</td><td><span class="k2">{</span></td></tr><tr><td class="number">11</td><td>  std::vector<span class="k3">&lt;</span>tObject<span class="k3">*</span><span class="k3">&gt;</span> objects<span class="k2">;</span></td></tr><tr><td class="number">12</td><td>&#160;</td></tr><tr><td class="number">13</td><td>  <span class="k1">for</span><span class="k2">(</span>o<span class="k3">=</span>first_object<span class="k2">;</span>o is an object<span class="k2">;</span>move o to next object<span class="k2">)</span></td></tr><tr><td class="number">14</td><td>    objects.push_back<span class="k2">(</span>o<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">15</td><td>&#160;</td></tr><tr><td class="number">16</td><td>  std::sort<span class="k2">(</span>objects.first<span class="k2">(</span><span class="k2">)</span>,objects.last<span class="k2">(</span><span class="k2">)</span>,tCompareFun<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">17</td><td>&#160;</td></tr><tr><td class="number">18</td><td>  std::vector<span class="k3">&lt;</span>tObject<span class="k3">*</span><span class="k3">&gt;</span><span class="k2">:</span><span class="k2">:</span>iterator p<span class="k2">;</span></td></tr><tr><td class="number">19</td><td>  <span class="k1">for</span><span class="k2">(</span>p<span class="k3">=</span>objects.begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>p<span class="k3">!</span><span class="k3">=</span>objects.end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="k3">+</span><span class="k3">+</span>p<span class="k2">)</span></td></tr><tr><td class="number">20</td><td>    <span class="k2">(</span><span class="k3">*</span>p<span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>draw<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">21</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Krzysztof Kluczek)</author>
		<pubDate>Wed, 28 Dec 2005 19:59:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>try &quot;grep -r qsort /allegro/examples/*.c&quot;
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Thu, 29 Dec 2005 03:29:34 +0000</pubDate>
	</item>
</rss>
