<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Mapping a texture on a sphere.</title>
		<link>http://www.allegro.cc/forums/view/186206</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Thu, 30 May 2002 15:35:06 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I planning a game where the player rolls balls around. Very exciting. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>Anyway, I need to map a texture on a 2d circle so that it looks like a ball in 3d. The texture is 64x64 in this case and the ball is a circle with a radius of 16 pixels. </p><p>What I would like is a lookup table for the circle so I know what pixel to draw from the texture.</p><p>Has anyone got some cool mathematic formulas or something for this? I&#039;m pretty sure someone has posted a question like this before and that someone else wrote something with a picture of the earth mapped on a circle... Any ideas?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Johan Peitz)</author>
		<pubDate>Fri, 24 May 2002 16:54:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Maybe the easiest way is to use a rotating sprite...</p><p>formulas with sin/cosine are nice but you can&#039;t really use then to fill an entire circle.</p><p>If you do something like this:</p><p>for (r=0;r&lt;50;r++){<br />for (t=0;t&lt;256;t++){<br />x=r*sin(2*PI*t/256);<br />y=r*cos(2*pi*t/256);<br />draw_pixel(x,y);<br />}}</p><p>you&#039;ll see that there are points missing.</p><p>Shade8-)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Shade)</author>
		<pubDate>Fri, 24 May 2002 17:14:53 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hmm... Maybe I didn&#039;t express myself very clear. I don&#039;t want to simply rotate a sprite. I want to wrap a texture around a ball.</p><p>The thought was to create a lookup table for a circle and the map the texture to the circle. The effect of getting the ball to roll would be achieved by shifting the texture. But! How to I calculate the lookup?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Johan Peitz)</author>
		<pubDate>Fri, 24 May 2002 19:05:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Johan, I think I have some old Allegro demo code of this very thing. I will find it on my HD later tonight and let you know.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Paul Pridham)</author>
		<pubDate>Fri, 24 May 2002 21:28:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>also there&#039;s this library once made for allegro, maybe it was plush or p3d...whatever, it had several routines for rendering &quot;3d&quot; spheres, i.e. the all-famous, vectorballs having their textures projected and even shaded in different ways. it doesn&#039;t include perspective warp, but you don&#039;t actually notice that for spheres unless they&#039;re very close, or your fov is very twisted.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gabhonga)</author>
		<pubDate>Fri, 24 May 2002 21:38:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You could use ray-tracing. With this technique you can get perfect spheres, because it uses the sphere formula. I don&#039;t know how to do it, maybe someone can help you.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Oscar Giner)</author>
		<pubDate>Fri, 24 May 2002 23:07:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I posted code to do this on [AGP] a little while ago. I&#039;m not at my computer (for a few months), so I can&#039;t send it to you. Perhaps you can ask there if someone still has a copy of it.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bob)</author>
		<pubDate>Fri, 24 May 2002 23:45:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>How come I was just asking the same question? <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /> <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> I&#039;ve already tried to make my own one, but it doesn&#039;t exactly look like a sphere... or actually I didn&#039;t even expect it to... I KNEW it&#039;d look like a pyramid with a circle bottom...</p><p>If I remember corrent the concept I&#039;m using is:</p><p>For every upleft pixel: Count the current radius. Divide it with the maxium radius to get the number &#039;m&#039;. Now, use a special function (I&#039;ve got a wrong one) which gets the number &#039;m&#039; and produces the number &#039;n&#039;. Now we divide &#039;n&#039; with &#039;m&#039; and get the number &#039;k&#039;. Then, the current upright position where we&#039;ll read the color is  (centreX -k * (centreX -currentX), centreY -k * ( centreY -currentY )).<br />Current up-right, lower-left and lower-right coordinates can be calculated similar way using the same &#039;k&#039;...</p><p>OK I somehow think I didn&#039;t get it correct. But what is this function that takes &#039;m&#039; and returns &#039;n&#039;? <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" /> <img src="http://www.allegro.cc/forums/smileys/huh.gif" alt="???" />
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fladimir da Gorf)</author>
		<pubDate>Sat, 25 May 2002 02:02:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>hmm...if anyone finds a good sollution/explanation to this problem, please post info here!<br />however, it might prove interesting too look for people mad about maps...<br />I&#039;ve once tried to map a texture onto a sphere using (quite logical...) spherical coordinates, i.e. for each vertex I calculated the latitude and longitude angles and just made them u and v! <img src="http://www.allegro.cc/forums/smileys/cheesy.gif" alt=":D" /><br />this &quot;worked&quot; pretty nice, but distorted the texture somewhat, so you have to be careful when drawing it, expecially the area around the poles will be somewhat warped together!! I believe there&#039;s other ways to map square textures to a sphere that give better results.<br />for 2d (without any 3d model in between) you&#039;d have to go raytracing...sounds complicated, but for a simple sphere it&#039;s quite easy and can be optimized a lot...<br />another idea that might be even faster would be to implement one of those classical 2d lens effects (basically an array with texture offsets that warps anything it&#039;s applied to a bit like a magnifying glass). by calculating the lens like half of a sphere and scrolling/rotating the texture underneath, it might also do the trick (quite fast even!)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gabhonga)</author>
		<pubDate>Sat, 25 May 2002 02:31:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>&quot;maybe it was plush or p3d&quot;</p><p>I searched for both of them and it heavily seems they used 3D code and an older allegro version (and even DJGPP makefiles I think...) So....?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Fladimir da Gorf)</author>
		<pubDate>Sat, 25 May 2002 03:22:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>wasn&#039;t p3d slurped up by allegro? Or did it get removed?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Sat, 25 May 2002 03:29:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yes, p3d was merged into Allegro. However, p3d did NOT do sphere mapping of any kind.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bob)</author>
		<pubDate>Sat, 25 May 2002 06:01:50 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>hmm, it could be that it was called &quot;more3d&quot;. yes, it&#039;s quite old, but it had this textured sphere rendering code that wasn&#039;t actually fast, but worked fine :-)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gabhonga)</author>
		<pubDate>Sat, 25 May 2002 06:43:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Ok ppl, here&#039;s some results then. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /></p><p>1) Paul Pridham mailed me some code by a guy named David Lenhart. I haven&#039;t really looked at it that much and I haven&#039;t managed to compile it, it uses some old version of allegro I think and I didn&#039;t bother. Get it here: [url <a href="http://www.dtek.chalmers.se/~d98peitz/junk/earth.zip">http://www.dtek.chalmers.se/~d98peitz/junk/earth.zip</a>]</p><p>2) My own version. Using lookup tables and is not very mathematically correct, but it&#039;s fast enough and looks ok. Instead of sphere-mapping I apply some kind of lens filter to the texture and shows. Get it here: [url <a href="http://www.dtek.chalmers.se/~d98peitz/junk/balls.zip">http://www.dtek.chalmers.se/~d98peitz/junk/balls.zip</a>]</p><p>Feel free ta ask questions and/or come with imporvements.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Johan Peitz)</author>
		<pubDate>Sat, 25 May 2002 14:28:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>hehe well, and I finally remembered (&amp; then searched my hd, and even found!!!) the library that was able of doing &quot;3d&quot; spheres!! actually the code is quite messy to read, but it works and it&#039;s also quite good commented...the name was AllegPak!! (har, the only one allegro 3d lib I hadn&#039;t mentioned yet <img src="http://www.allegro.cc/forums/smileys/rolleyes.gif" alt="::)" />)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gabhonga)</author>
		<pubDate>Sat, 25 May 2002 17:44:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>hmm, well anyone got a MingW32 edition of the code.  I erased my DJGPP compiler because windowsXP forced me to.... or do you at least have an executable I can look at so maybe I can rewrite it if the effect looks good.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Steve Terry)</author>
		<pubDate>Sat, 25 May 2002 21:24:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Some years back I played with a spherical texture mapping algorithm using lookup tables that was developed by a Hans Kopp.  I apparently don&#039;t have his original source, but I found my variation of his algorithm written for Allegro.</p><p>His algorithm in a nutshell: It is relatively easy to wrap a texture on a sphere for rotations about the sphere&#039;s N-S pole axis.  For this you need a lookup table from pixel coordinate to spherical coordinate.  Add the rotation (longitude), and finally convert spherical to texture coordinates.  The problem is when you want the sphere to rotate on all 3 axis.  Hans&#039; solution was to recognize the ease of rotating on a N-S pole axis and so created a lookup table that transformed a spherical coordinate such that one of the E-W axis is rotated to the N-S axis.  After the coordinate system transformation, just add the now-longitudinal rotation.  Perform this transformation once more, and you have rotation for all 3 axes.  
</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">/* TEX_SIZE needs to be &lt;=256 due to coord_transform_table holding shorts.</span></td></tr><tr><td class="number">2</td><td><span class="c">    In this code, it needs to be a power of 2, but a couple of minor tweaks, </span></td></tr><tr><td class="number">3</td><td><span class="c">    and this constraint can go away */</span></td></tr><tr><td class="number">4</td><td><span class="p">#define TEX_SIZE 256 </span></td></tr><tr><td class="number">5</td><td><span class="p">#define ASPECT_RATIO 1.05</span></td></tr><tr><td class="number">6</td><td><span class="p">#ifndef M_PI</span></td></tr><tr><td class="number">7</td><td><span class="p">#define M_PI  3.14159265</span></td></tr><tr><td class="number">8</td><td><span class="p">#endif</span></td></tr><tr><td class="number">9</td><td>&#160;</td></tr><tr><td class="number">10</td><td><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k3">*</span>coord_transform_table<span class="k2">;</span></td></tr><tr><td class="number">11</td><td><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k3">*</span>screen2sphere_table<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="c">// unsigned short *texture; // Texture table; a 1D array holding the texture; used for convenience because the spherical coordinates are held in one variable.</span></td></tr><tr><td class="number">14</td><td>&#160;</td></tr><tr><td class="number">15</td><td><span class="k1">void</span> Spherical2Cartesian<span class="k2">(</span><span class="k1">int</span> alpha, <span class="k1">int</span> beta, <span class="k1">double</span> <span class="k3">*</span>x, <span class="k1">double</span> <span class="k3">*</span>y, <span class="k1">double</span> <span class="k3">*</span>z<span class="k2">)</span></td></tr><tr><td class="number">16</td><td><span class="k2">{</span></td></tr><tr><td class="number">17</td><td>   <span class="c">/* Convert to radians */</span></td></tr><tr><td class="number">18</td><td>   <span class="k1">double</span> alpha1 <span class="k3">=</span> <span class="k2">(</span><span class="k1">double</span><span class="k2">)</span>alpha <span class="k3">*</span> <span class="n">2</span> <span class="k3">*</span> M_PI <span class="k3">/</span> TEX_SIZE<span class="k2">;</span></td></tr><tr><td class="number">19</td><td>   <span class="k1">double</span> beta1  <span class="k3">=</span> <span class="k2">(</span><span class="k1">double</span><span class="k2">)</span><span class="k2">(</span>beta <span class="k3">-</span> TEX_SIZE<span class="k3">/</span><span class="n">2</span><span class="k2">)</span> <span class="k3">*</span> M_PI <span class="k3">/</span> TEX_SIZE<span class="k2">;</span></td></tr><tr><td class="number">20</td><td>   </td></tr><tr><td class="number">21</td><td>   <span class="c">/* Convert to Cartesian */</span></td></tr><tr><td class="number">22</td><td>   <span class="k3">*</span>x <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>alpha1<span class="k2">)</span> <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>beta1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">23</td><td>   <span class="k3">*</span>y <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>beta1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">24</td><td>   <span class="k3">*</span>z <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>alpha1<span class="k2">)</span> <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>beta1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">25</td><td><span class="k2">}</span></td></tr><tr><td class="number">26</td><td>&#160;</td></tr><tr><td class="number">27</td><td><span class="k1">void</span> Cartesian2Sphere<span class="k2">(</span><span class="k1">double</span> x, <span class="k1">double</span> y, <span class="k1">double</span> z, <span class="k1">int</span> <span class="k3">*</span>alpha, <span class="k1">int</span> <span class="k3">*</span>beta<span class="k2">)</span></td></tr><tr><td class="number">28</td><td><span class="k2">{</span></td></tr><tr><td class="number">29</td><td>   <span class="k1">double</span> beta1, alpha1, w<span class="k2">;</span></td></tr><tr><td class="number">30</td><td>   </td></tr><tr><td class="number">31</td><td>   <span class="c">/* convert to Spherical Coordinates */</span> </td></tr><tr><td class="number">32</td><td>   beta1 <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_46.html" target="_blank">asin</a><span class="k2">(</span>y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">33</td><td>   <span class="k1">if</span> <span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_303.html" target="_blank">fabs</a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>beta1<span class="k2">)</span><span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>  <span class="c">// we'll be dividing by cos(beta1)</span></td></tr><tr><td class="number">34</td><td>      w <span class="k3">=</span> x <span class="k3">/</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>beta1<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">35</td><td>      <span class="k1">if</span> <span class="k2">(</span>w <span class="k3">&gt;</span> <span class="n">1</span><span class="k2">)</span> w <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span> <span class="k1">if</span> <span class="k2">(</span>w <span class="k3">&lt;</span> <span class="k3">-</span><span class="n">1</span><span class="k2">)</span> w <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>   <span class="c">// Check bounds</span></td></tr><tr><td class="number">36</td><td>      alpha1 <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_40.html" target="_blank">acos</a><span class="k2">(</span>w<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">37</td><td>      <span class="k1">if</span> <span class="k2">(</span>z<span class="k3">/</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>beta1<span class="k2">)</span> <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="c">// Check for wrapping around top/bottom of sphere</span></td></tr><tr><td class="number">38</td><td>         alpha1 <span class="k3">=</span> <span class="n">2</span> <span class="k3">*</span> M_PI <span class="k3">-</span> alpha1<span class="k2">;</span></td></tr><tr><td class="number">39</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">40</td><td>   <span class="k1">else</span> </td></tr><tr><td class="number">41</td><td>      alpha1 <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">42</td><td>   </td></tr><tr><td class="number">43</td><td>  <span class="c">/* Convert to texture coordinates */</span> </td></tr><tr><td class="number">44</td><td>   <span class="k3">*</span>alpha <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>alpha1 <span class="k3">/</span> <span class="k2">(</span>M_PI <span class="k3">*</span> <span class="n">2</span><span class="k2">)</span> <span class="k3">*</span> SIZEOFTEX<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">45</td><td>   <span class="k3">*</span>beta  <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>beta1 <span class="k3">/</span> M_PI <span class="k3">*</span> SIZEOFTEX <span class="k3">+</span> SIZEOFTEX<span class="k3">/</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">46</td><td>   </td></tr><tr><td class="number">47</td><td>  <span class="c">/* 'Clip' the texture coordinates */</span></td></tr><tr><td class="number">48</td><td>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">*</span>alpha <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">*</span>alpha <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">49</td><td>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">*</span>alpha <span class="k3">&gt;</span><span class="k3">=</span> SIZEOFTEX<span class="k2">)</span> <span class="k3">*</span>alpha <span class="k3">=</span> SIZEOFTEX-1<span class="k2">;</span></td></tr><tr><td class="number">50</td><td>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">*</span>beta <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k3">*</span>beta <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">51</td><td>   <span class="k1">if</span> <span class="k2">(</span><span class="k3">*</span>beta <span class="k3">&gt;</span><span class="k3">=</span> SIZEOFTEX<span class="k2">)</span> <span class="k3">*</span>beta <span class="k3">=</span> SIZEOFTEX-1<span class="k2">;</span></td></tr><tr><td class="number">52</td><td><span class="k2">}</span></td></tr><tr><td class="number">53</td><td>&#160;</td></tr><tr><td class="number">54</td><td><span class="k1">void</span> CreateTextureTable<span class="k2">(</span><span class="k1">const</span> <span class="k1">char</span> <span class="k3">*</span>filename, <span class="k1">unsigned</span> <span class="k1">short</span> <span class="k3">*</span>texture<span class="k2">)</span> </td></tr><tr><td class="number">55</td><td><span class="c">/* unsigned short for 16 bit, can use int for 32 bit, char for 8 bit */</span></td></tr><tr><td class="number">56</td><td><span class="k2">{</span></td></tr><tr><td class="number">57</td><td>   <span class="k1">int</span> i, j<span class="k2">;</span></td></tr><tr><td class="number">58</td><td>   <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>bmp<span class="k2">;</span></td></tr><tr><td class="number">59</td><td>&#160;</td></tr><tr><td class="number">60</td><td>   bmp <span class="k3">=</span> <a href="http://www.allegro.cc/manual/load_bmp" target="_blank"><span class="a">load_bmp</span></a><span class="k2">(</span>filename, NULL<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">61</td><td>   </td></tr><tr><td class="number">62</td><td>   <span class="k1">for</span> <span class="k2">(</span>i<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> i<span class="k3">&lt;</span>TEX_SIZE<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">63</td><td>      <span class="k1">for</span> <span class="k2">(</span>j<span class="k3">=</span><span class="n">0</span><span class="k2">;</span> j<span class="k3">&lt;</span>TEX_SIZE<span class="k3">+</span><span class="n">1</span><span class="k2">;</span> j<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> </td></tr><tr><td class="number">64</td><td>         texture<span class="k2">[</span>j<span class="k3">*</span>TEX_SIZE<span class="k3">+</span>i<span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span>bmp, i<span class="k3">*</span>bmp-&gt;w<span class="k3">/</span>TEX_SIZE, j<span class="k3">*</span>bmp-&gt;h<span class="k3">/</span>TEX_SIZE<span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">65</td><td><span class="k2">}</span></td></tr><tr><td class="number">66</td><td>&#160;</td></tr><tr><td class="number">67</td><td><span class="k1">void</span> InitLookupTables<span class="k2">(</span><span class="k2">)</span></td></tr><tr><td class="number">68</td><td><span class="k2">{</span></td></tr><tr><td class="number">69</td><td>   <span class="k1">int</span> alpha, beta<span class="k2">;</span> <span class="c">// Spherical Coordinates</span></td></tr><tr><td class="number">70</td><td>   <span class="k1">int</span> i, j<span class="k2">;</span></td></tr><tr><td class="number">71</td><td>   <span class="k1">double</span> x, y, z<span class="k2">;</span> <span class="c">// Cartesian coordinates </span></td></tr><tr><td class="number">72</td><td>&#160;</td></tr><tr><td class="number">73</td><td>   coord_transform_table <span class="k3">=</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k3">*</span><span class="k2">)</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span><span class="k2">(</span>TEX_SIZE<span class="k3">*</span><span class="k2">(</span>TEX_SIZE<span class="k3">+</span><span class="n">1</span><span class="k2">)</span><span class="k3">*</span><span class="k1">sizeof</span><span class="k2">(</span><span class="k1">short</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">74</td><td>&#160;</td></tr><tr><td class="number">75</td><td>   screen2sphere_table <span class="k3">=</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k3">*</span><span class="k2">)</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span>TEX_SIZE <span class="k3">*</span> <span class="k1">sizeof</span><span class="k2">(</span><span class="k1">short</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">76</td><td>&#160;</td></tr><tr><td class="number">77</td><td>   <span class="c">/* Compute the Lookup Table for the Switching between </span></td></tr><tr><td class="number">78</td><td><span class="c">      the Coordinate-Systems */</span></td></tr><tr><td class="number">79</td><td>   <span class="k1">for</span><span class="k2">(</span>j <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> j <span class="k3">&lt;</span> TEX_SIZE<span class="k3">+</span><span class="n">1</span><span class="k2">;</span> j<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span></td></tr><tr><td class="number">80</td><td>      <span class="k1">for</span><span class="k2">(</span>i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> TEX_SIZE<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">81</td><td>       <span class="c">/* Convert Spherical Coord. to Cartesian Coord. */</span></td></tr><tr><td class="number">82</td><td>         Spherical2Cartesian<span class="k2">(</span>i, j, <span class="k3">&amp;</span>x, <span class="k3">&amp;</span>y, <span class="k3">&amp;</span>z<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">83</td><td>       <span class="c">/* Convert Cartesian Coord. to Spherical Coord. </span></td></tr><tr><td class="number">84</td><td><span class="c">          Notice it's not x,y,z but x,z,y */</span></td></tr><tr><td class="number">85</td><td>         Cartesian2Sphere<span class="k2">(</span>x, z, y, <span class="k3">&amp;</span>alpha, <span class="k3">&amp;</span>beta<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">86</td><td>         <span class="c">/* lower order of bits occupied by alpha, </span></td></tr><tr><td class="number">87</td><td><span class="c">            upper order shifted by TEX_SIZE occupied by beta */</span></td></tr><tr><td class="number">88</td><td>         coord_transform_table<span class="k2">[</span>i <span class="k3">+</span> j<span class="k3">*</span>TEX_SIZE<span class="k2">]</span> <span class="k3">=</span> alpha <span class="k3">+</span> beta<span class="k3">*</span>TEX_SIZE<span class="k2">;</span>  </td></tr><tr><td class="number">89</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">90</td><td>&#160;</td></tr><tr><td class="number">91</td><td>   <span class="c">/* Compute the Lookup Table that is used to</span></td></tr><tr><td class="number">92</td><td><span class="c">    convert the 2D Screen Coordinates to the initial</span></td></tr><tr><td class="number">93</td><td><span class="c">    Spherical Coordinates */</span></td></tr><tr><td class="number">94</td><td>   <span class="k1">for</span><span class="k2">(</span>i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> TEX_SIZE<span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">95</td><td>      screen2sphere_table<span class="k3">&lt;</span>i&gt; <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_40.html" target="_blank">acos</a><span class="k2">(</span><span class="k2">(</span><span class="k1">double</span><span class="k2">)</span><span class="k2">(</span>i-TEX_SIZE<span class="k3">/</span><span class="n">2</span><span class="k3">+</span><span class="n">1</span><span class="k2">)</span> <span class="k3">*</span> <span class="n">2</span><span class="k3">/</span>TEX_SIZE<span class="k2">)</span> </td></tr><tr><td class="number">96</td><td>                               <span class="k3">*</span> TEX_SIZE<span class="k3">/</span>M_PI<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">97</td><td>      screen2sphere_table<span class="k3">&lt;</span>i&gt; %<span class="k3">=</span> TEX_SIZE<span class="k2">;</span></td></tr><tr><td class="number">98</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">99</td><td><span class="k2">}</span></td></tr><tr><td class="number">100</td><td>&#160;</td></tr><tr><td class="number">101</td><td><span class="k1">void</span> DrawSphere<span class="k2">(</span><span class="k1">int</span> phi, <span class="k1">int</span> theta, <span class="k1">int</span> psi, <span class="k1">int</span> radius, <span class="k1">unsigned</span> <span class="k1">short</span> <span class="k3">*</span>texture,</td></tr><tr><td class="number">102</td><td>                <a href="http://www.allegro.cc/manual/BITMAP" target="_blank"><span class="a">BITMAP</span></a> <span class="k3">*</span>dest, <span class="k1">int</span> center_x, <span class="k1">int</span> center_y<span class="k2">)</span></td></tr><tr><td class="number">103</td><td><span class="c">/* Unoptimized for clarity; */</span></td></tr><tr><td class="number">104</td><td><span class="k2">{</span></td></tr><tr><td class="number">105</td><td>   <span class="k1">int</span> x, y<span class="k2">;</span>            <span class="c">// current Pixel-Position </span></td></tr><tr><td class="number">106</td><td>   <span class="k1">int</span> xr<span class="k2">;</span>              <span class="c">// Half Width of Sphere (pixels) in current scanline </span></td></tr><tr><td class="number">107</td><td>   <span class="k1">int</span> beta1, alpha1<span class="k2">;</span>   <span class="c">// initial spherical coordinates </span></td></tr><tr><td class="number">108</td><td>   <a href="http://www.allegro.cc/manual/fixed" target="_blank"><span class="a">fixed</span></a> xinc, xscaled<span class="k2">;</span> <span class="c">// auxiliary variables </span></td></tr><tr><td class="number">109</td><td>   <span class="k1">int</span> alpha_beta2,alpha_beta3<span class="k2">;</span>  </td></tr><tr><td class="number">110</td><td>       <span class="c">/* spherical coordinates of the 2nd and 3rd rotated system </span></td></tr><tr><td class="number">111</td><td><span class="c">          (the 2 coordinates are stored in a single integer)       */</span></td></tr><tr><td class="number">112</td><td>&#160;</td></tr><tr><td class="number">113</td><td>  <span class="c">/* For all Scanlines ... */</span></td></tr><tr><td class="number">114</td><td>   <span class="k1">for</span><span class="k2">(</span>y <span class="k3">=</span> <span class="k3">-</span>radius<span class="k3">+</span><span class="n">1</span><span class="k2">;</span>y <span class="k3">&lt;</span> radius<span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">115</td><td>      <span class="c">/* compute the Width of the Sphere in this Scanline */</span></td></tr><tr><td class="number">116</td><td>      xr <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span>radius<span class="k3">*</span>radius <span class="k3">-</span> y<span class="k3">*</span>y<span class="k2">)</span> <span class="k3">*</span> ASPECT_RATIO<span class="k2">)</span><span class="k2">;</span> <span class="c">// Can be turned into fixed point</span></td></tr><tr><td class="number">117</td><td>      <span class="k1">if</span> <span class="k2">(</span>xr<span class="k3">=</span><span class="k3">=</span><span class="n">0</span><span class="k2">)</span> xr <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span></td></tr><tr><td class="number">118</td><td>      </td></tr><tr><td class="number">119</td><td>    <span class="c">/* computer the first Spherical Coordinate beta */</span></td></tr><tr><td class="number">120</td><td>      beta1 <span class="k3">=</span> screen2sphere_table<span class="k2">[</span><span class="k2">(</span>y<span class="k3">+</span>radius<span class="k2">)</span> <span class="k3">*</span> TEX_SIZE<span class="k3">/</span><span class="k2">(</span><span class="n">2</span><span class="k3">*</span>radius<span class="k2">)</span><span class="k2">]</span> <span class="k3">*</span> TEX_SIZE<span class="k2">;</span></td></tr><tr><td class="number">121</td><td>      xinc <span class="k3">=</span> <span class="k2">(</span>TEX_SIZE <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">16</span><span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span><span class="n">2</span><span class="k3">*</span>xr<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">122</td><td>      xscaled <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span></td></tr><tr><td class="number">123</td><td>&#160;</td></tr><tr><td class="number">124</td><td>    <span class="c">/* For all Pixels in this Scanline ... */</span></td></tr><tr><td class="number">125</td><td>      <span class="k1">for</span><span class="k2">(</span>x <span class="k3">=</span> <span class="k3">-</span>xr<span class="k2">;</span> x <span class="k3">&lt;</span> xr<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span></td></tr><tr><td class="number">126</td><td>       <span class="c">/* compute the second Spherical Coordinate alpha */</span></td></tr><tr><td class="number">127</td><td>       alpha1 <span class="k3">=</span> screen2sphere_table<span class="k2">[</span>xscaled <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">16</span><span class="k2">]</span> <span class="k3">/</span> <span class="n">2</span><span class="k2">;</span></td></tr><tr><td class="number">128</td><td>       xscaled <span class="k3">+</span><span class="k3">=</span> xinc<span class="k2">;</span></td></tr><tr><td class="number">129</td><td>      </td></tr><tr><td class="number">130</td><td>       alpha1 <span class="k3">=</span> alpha1 <span class="k3">+</span> phi<span class="k2">;</span>    </td></tr><tr><td class="number">131</td><td>       <span class="c">/* Rotate Texture in the first Coordinate-System (alpha,beta);</span></td></tr><tr><td class="number">132</td><td><span class="c">            Switch to the next Coordinate-System and rotate there       */</span></td></tr><tr><td class="number">133</td><td>       alpha_beta2 <span class="k3">=</span> coord_transform_table<span class="k2">[</span>beta1 <span class="k3">+</span> alpha1<span class="k2">]</span> <span class="k3">+</span> theta<span class="k2">;</span></td></tr><tr><td class="number">134</td><td>       <span class="c">/* the same Procedure again ... */</span></td></tr><tr><td class="number">135</td><td>       alpha_beta3 <span class="k3">=</span> coord_transform_table<span class="k2">[</span>alpha_beta2<span class="k2">]</span> <span class="k3">+</span> psi<span class="k2">;</span></td></tr><tr><td class="number">136</td><td>     </td></tr><tr><td class="number">137</td><td>       <span class="c">/* draw the Pixel */</span></td></tr><tr><td class="number">138</td><td>         <a href="http://www.allegro.cc/manual/putpixel" target="_blank"><span class="a">putpixel</span></a><span class="k2">(</span>dest, x<span class="k3">+</span>center_x, y<span class="k3">+</span>center_y, texture<span class="k2">[</span>alpha_beta3<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span> </td></tr><tr><td class="number">139</td><td>      <span class="k2">}</span></td></tr><tr><td class="number">140</td><td>   <span class="k2">}</span></td></tr><tr><td class="number">141</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Plucky)</author>
		<pubDate>Sun, 26 May 2002 00:22:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Just this week I made a small program which draws a globe if you give it a rectangular world map.<br /><a href="http://www.chariot.net.au/~theloves/circ.zip"> circ.zip (245kB) </a> includes code, exe and bmp.<br />The current orientation of the ball is stored as a matrix, and you can rotate it a few different ways. Lookup tables are used to convert each screen x,y to (x,y,z) which are converted by the matrix to another x,y,z which worked out which pixel of the rectangular map to use. Slow compared to polygons I think, but if you&#039;re using a small enough ball, you&#039;ll be alright. There may be room more more optimization in my code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Eric Love)</author>
		<pubDate>Wed, 29 May 2002 08:27:15 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hi Johan,<br />I read your code, very impressive result with so small things <img src="http://www.allegro.cc/forums/smileys/shocked.gif" alt=":o" /><br />Have you found this lookup table ? I&#039;m no sarcastic.<br />I have not complete understand it (render_ball) but I&#039;m working on it!<br />I&#039;d like to use some stuff like this in my games.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kloks)</author>
		<pubDate>Wed, 29 May 2002 21:33:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Pucky&#039;s code works great too, and you can use spheres of any size, it also runs a bit slow, but if you cange teh putpixel to a direct memory access and maybe the sqrt() function in draw sprite to a fixed point notation some speed might be improved.. though it ran fast enough for me.  I got about 140fps with a radius of 128, and 70fps at radius of 256, that fills the entire screen at 640x480.  The effect is good, and you can rotate on all three axis.</p><p>Problems with code<br />- SIZEOFTEX undeclared, define it as 256<br />- Parse error line blah, add another )<br />- uncomment the *texture<br />- malloc your texture before creating the texture table<br />- FREE all used memory (all three pointers)<br />- psi, theta, and phi range between 0 and 255, going over will trash the look-up tables and the program.<br />- texture size must be 256x256x16, but it looks great anyway.</p><p>called like:
</p><div class="source-code snippet"><div class="inner"><pre>InitLookupTables<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
texture <span class="k3">=</span> <span class="k2">(</span><span class="k1">unsigned</span> <span class="k1">short</span> <span class="k3">*</span><span class="k2">)</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_551.html" target="_blank">malloc</a><span class="k2">(</span><span class="k1">sizeof</span><span class="k2">(</span><span class="k1">short</span><span class="k2">)</span> <span class="k3">*</span> TEX_SIZE <span class="k3">*</span> TEX_SIZE<span class="k2">)</span><span class="k2">;</span>
CreateTextureTable<span class="k2">(</span><span class="s">"Earth2.bmp"</span>, texture<span class="k2">)</span><span class="k2">;</span>
<span class="k1">do</span><span class="k2">{</span>
    clear<span class="k2">(</span>buffer<span class="k2">)</span><span class="k2">;</span>
    DrawSphere<span class="k2">(</span>phi, theta, psi, radius, texture, buffer, <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a> <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">1</span>, <a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a> <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">1</span><span class="k2">)</span><span class="k2">;</span> 
    <a href="http://www.allegro.cc/manual/blit" target="_blank"><span class="a">blit</span></a><span class="k2">(</span>buffer, <a href="http://www.allegro.cc/manual/screen" target="_blank"><span class="a">screen</span></a>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span>, <a href="http://www.allegro.cc/manual/SCREEN_W" target="_blank"><span class="a">SCREEN_W</span></a>, <a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span><span class="k1">while</span><span class="k2">(</span><span class="k3">!</span><a href="http://www.allegro.cc/manual/key" target="_blank"><span class="a">key</span></a><span class="k2">[</span>KEY_ESC<span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Steve Terry)</author>
		<pubDate>Wed, 29 May 2002 23:02:09 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Kloks, glad you like it. <img src="http://www.allegro.cc/forums/smileys/smiley.gif" alt=":)" /> I made up the lookup table myself. I had a general idea of what I wanted and then I tweaked it until it looked ok. </p><p>It is not by any means a very stringent way to solve the problem. Also, it does not map a texture on a sphere. It&#039;s more like a lens funciton on a texture, giving the impression of a ball. This is mostly noticeable on the red/white squared ball. All squares are really squares, and this is not possible on a sphere.</p><p>Feel free to use what ever you want of the code.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Johan Peitz)</author>
		<pubDate>Wed, 29 May 2002 23:19:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sorry about the sloppy code.  I just lifted it out my test code, and obviously spent little time cleaning it up.  Thanks Steve for picking through it and cleaning it up.  </p><p>I had TEX_SIZE and SIZEOFTEX, which are the same.</p><p>I commented out *texture because the code could handle more than one.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>texture size must be 256x256x16, but it looks great anyway.</p></div></div><p>
Actually not quite true.  The texture <b>table</b> is size TEX_SIZE x TEX_SIZE x 16.  But when loading a texture, the texture could be of any size... it would just get crudely stretched to TEX_SIZE x TEX_SIZE.  Also you can change the color depth of the texture table as well.  A better stretching algorithm would improve the look of the texture.  Also the element size of the texture table need not be 16 bits; it could be 8 bit or 32 bits depending on color depth. </p><p>TEX_SIZE is limited to 256 because it is stuffing two numbers into a short.  TEX_SIZE can be expanded to 65536 if the lookup table was a 32 bit array.  However you run the risk of the table not fitting in memory cache. </p><p>Also the code makes no distinction between texture size TEX_SIZE and the number of bits occupied by the low and high order data when stuffing the two values into one.  A few tweaks and you can make this distinction such that TEX_SIZE need not be a power of 2.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>psi, theta, and phi range between 0 and 255, going over will trash the look-up tables and the program.</p></div></div><p>
Should have pointed this out earlier.  Somewhere in the code, one should have <span class="source-code">psi %<span class="k3">=</span> TEX_SIZE<span class="k2">;</span></span> or the equivalent.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>if you cange teh putpixel to a direct memory access and maybe the sqrt() function in draw sprite to a fixed point notation some speed might be improved</p></div></div><p>
You can unroll the loop a bit along with direct memory access to increase speed.  For example with 16 bit color:
</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">unsigned</span> <span class="k1">int</span> color<span class="k2">;</span></td></tr><tr><td class="number">2</td><td>      <span class="k1">unsigned</span> <span class="k1">int</span> address <span class="k3">=</span> <a href="http://www.allegro.cc/manual/bmp_write_line" target="_blank"><span class="a">bmp_write_line</span></a><span class="k2">(</span>dest, y<span class="k3">+</span>center_y<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">3</td><td>      <span class="c">/* For all Pixels in this Scanline ... */</span> </td></tr><tr><td class="number">4</td><td>      <span class="k1">for</span><span class="k2">(</span>x <span class="k3">=</span> <span class="k3">-</span>xr<span class="k2">;</span> x <span class="k3">&lt;</span> xr<span class="k2">;</span> x<span class="k3">+</span><span class="k3">=</span><span class="n">2</span><span class="k2">)</span> <span class="k2">{</span> </td></tr><tr><td class="number">5</td><td>         alpha1 <span class="k3">=</span> screen2sphere_table<span class="k2">[</span>xscaled <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">16</span><span class="k2">]</span> <span class="k3">/</span> <span class="n">2</span><span class="k2">;</span> </td></tr><tr><td class="number">6</td><td>         xscaled <span class="k3">+</span><span class="k3">=</span> xinc<span class="k2">;</span>        </td></tr><tr><td class="number">7</td><td>         alpha1 <span class="k3">=</span> alpha1 <span class="k3">+</span> phi<span class="k2">;</span>     </td></tr><tr><td class="number">8</td><td>         alpha_beta2 <span class="k3">=</span> coord_transform_table<span class="k2">[</span>beta1 <span class="k3">+</span> alpha1<span class="k2">]</span> <span class="k3">+</span> theta<span class="k2">;</span> </td></tr><tr><td class="number">9</td><td>         alpha_beta3 <span class="k3">=</span> coord_transform_table<span class="k2">[</span>alpha_beta2<span class="k2">]</span> <span class="k3">+</span> psi<span class="k2">;</span> </td></tr><tr><td class="number">10</td><td>         color <span class="k3">=</span> texture<span class="k2">[</span>alpha_beta3<span class="k2">]</span> <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">16</span><span class="k2">;</span></td></tr><tr><td class="number">11</td><td>&#160;</td></tr><tr><td class="number">12</td><td>      <span class="c">/* Repeat */</span></td></tr><tr><td class="number">13</td><td>         alpha1 <span class="k3">=</span> screen2sphere_table<span class="k2">[</span>xscaled <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">16</span><span class="k2">]</span> <span class="k3">/</span> <span class="n">2</span><span class="k2">;</span> </td></tr><tr><td class="number">14</td><td>         xscaled <span class="k3">+</span><span class="k3">=</span> xinc<span class="k2">;</span>        </td></tr><tr><td class="number">15</td><td>         alpha1 <span class="k3">=</span> alpha1 <span class="k3">+</span> phi<span class="k2">;</span>     </td></tr><tr><td class="number">16</td><td>         alpha_beta2 <span class="k3">=</span> coord_transform_table<span class="k2">[</span>beta1 <span class="k3">+</span> alpha1<span class="k2">]</span> <span class="k3">+</span> theta<span class="k2">;</span> </td></tr><tr><td class="number">17</td><td>         alpha_beta3 <span class="k3">=</span> coord_transform_table<span class="k2">[</span>alpha_beta2<span class="k2">]</span> <span class="k3">+</span> psi<span class="k2">;</span> </td></tr><tr><td class="number">18</td><td>         color <span class="k3">|</span><span class="k3">=</span> texture<span class="k2">[</span>alpha_beta3<span class="k2">]</span><span class="k2">;</span></td></tr><tr><td class="number">19</td><td>&#160;</td></tr><tr><td class="number">20</td><td>         <span class="c">/* draw 2 pixels */</span> </td></tr><tr><td class="number">21</td><td>         bmp_write32<span class="k2">(</span>address<span class="k3">+</span><span class="k2">(</span>x<span class="k3">+</span>center_x<span class="k2">)</span><span class="k3">*</span><span class="n">2</span>, color<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">22</td><td>      <span class="k2">}</span></td></tr></tbody></table></div></div><p>
Obviously you can do the same with 8 bit color by unrolling the loop 4 times.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Plucky)</author>
		<pubDate>Wed, 29 May 2002 23:48:57 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>hehe, cool, well it doesn&#039;t give much of a speed-up using the 32 bit packed way, and oddly it gives some weird fuzzy stuff around teh pixel blocks the other one doesn&#039;t have.  That&#039;s okay anyway.  But now i&#039;m wondering if anyone has any tutorials on how to do the packed routines.  I&#039;ve tried incorperating them in other functions I&#039;ve made and it doesn&#039;t quite work.  My way was just doing this:<br />((short *)dest -&gt; line[y+center_y])[x + center_x] = texture[alpha_beta3];<br />which gave the same amount of speed-up.  <br />Another method I&#039;ve ran across is this:<br />color = (color |(color&lt;&lt; 16)) &amp; 0x07E0F81F;<br />color = ((color * alpha)&gt;&gt; 5) &amp; 0x07E0F81F;<br />color = color|(color &gt;&gt; 16);<br />for doing faster blurs, it also does not work:&#039;(<br />Oh and be sure to check that y+center_y and x+center_x are within dest-&gt;w and dest-&gt;h or you will murder the program.  <br />I&#039;m kinda new at learning how to optimize in Allegro, but I caught onto fixed point, bitshifts, and vectors fast.  <br />For now i&#039;m forced to use:<br />r = getr16(color);<br />r*=a;<br />g = getg16(color);<br />g*=a;<br />b = getb16(color);<br />b*=a;<br />((short *)src -&gt; line[y])[x] = makecol16(r, g, b);<br />which is quite um .. crappy.<br />[edit]<br />The color = (color | color &lt;&lt; 16... stuff i&#039;m not trying to put that into yoru function, i&#039;m just wondering if there are any tutorials or if someone could help me out on incorperating that into my functions.<br />[/edit]
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Steve Terry)</author>
		<pubDate>Thu, 30 May 2002 00:22:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Steve: I did write an <a href="http://pages.infinit.net/voidstar/prog/articles/optimizing3.html">article</a> about this.<br />Also, this code <i>fades</i>. It doesn&#039;t blur. And it only works with 5.6.5 packed pixel formats.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Bob)</author>
		<pubDate>Thu, 30 May 2002 00:55:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>hehe yeah i&#039;ve seen that code before, yes it takes one pixel and fades it by a factor from 0 to 32.  I think it was used in fade16.c which worked ok. I think i&#039;ll just have to play with the code a bit more.  I also had an example of blending two colors using the same technique, but I misplaced it or something.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Steve Terry)</author>
		<pubDate>Thu, 30 May 2002 01:18:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>to blend two colour by a factor, you first fade both colours: one by factor, and the other one by the negative factor (i.e. if factor is 0..31 then the neg.factor is 31-f. or f^31(xor operation)).<br />then you finally add the two scaled colours together, and got your blended version.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Gabhonga)</author>
		<pubDate>Thu, 30 May 2002 06:35:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thank you Johan.<br />I don&#039;t know if I will use your lens effect but I&#039;m interest in graphic modifications like that.<br />Good work!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kloks)</author>
		<pubDate>Thu, 30 May 2002 15:35:05 +0000</pubDate>
	</item>
</rss>
