<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Calculating ceiling and floor textures in a raycaster</title>
		<link>http://www.allegro.cc/forums/view/374305</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sun, 20 Jun 2004 02:50:09 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well, I decided to start working on my raycaster idea again.  I remember a little while after I started working on mine there was some sort of craze around here with them, so I figure by now everyone&#39;s written their own Duke3D clone and I&#39;m way behind the times...</p><p>But anyways, I was wondering if anyone would share the math involved for texturing the floor and ceiling.  I can&#39;t seem to figure out the math on this one.  I have some triangles written down on paper with two similar triangles ... but I&#39;m not sure if they&#39;re related or what and I&#39;m babbling now.</p><p>So if anyone could explain the formulas (or just tell them to me <img src="http://www.allegro.cc/forums/smileys/tongue.gif" alt=":P" />) I&#39;d appreciate it.</p><p>Thanks!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (StevenVI)</author>
		<pubDate>Sat, 19 Jun 2004 06:37:07 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>
I never actually implemented it in mine, but the tutorial we were all referencing during the craze (<a href="http://www.permadi.com/tutorial/raycast/">this one</a>) shows how to do it. Most of what I learnt about the raycasting implementation I got from there ...
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (23yrold3yrold)</author>
		<pubDate>Sat, 19 Jun 2004 07:27:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>233yrold3yrold: Thanks, I do have that tutorial in my reference list.  I looked over the pages on texturing the floors, and it was pretty vague and I couldn&#39;t quite understand it.  I have an &quot;almost-working&quot; implementation at the moment.  It moves left and right with the camera properly, but not forward or backwards (the product of a couple guesses in math and stealing code from another program which I wasn&#39;t up to disecting in it&#39;s entirety.)</p><p>This is what I have (the <b>decimal</b> function returns the decimal portion of a floating point number):
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">for</span><span class="k2">(</span>row<span class="k3">=</span>bot<span class="k3">+</span><span class="n">1</span><span class="k2">;</span> row<span class="k3">&lt;</span><a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k2">;</span> row<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span> <span class="k2">{</span>
  <span class="c">// get ratio of viewer height to pixel height</span>
  <span class="k1">float</span> ratio <span class="k3">=</span> player_height<span class="k3">/</span><span class="k2">(</span>row-<span class="k2">(</span><a href="http://www.allegro.cc/manual/SCREEN_H" target="_blank"><span class="a">SCREEN_H</span></a><span class="k3">/</span><span class="n">2</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>

  <span class="c">// get distance to visible pixel</span>
  <span class="k1">float</span> distance <span class="k3">=</span> ratio<span class="k3">*</span>VIEWPLANE_DISTANCE<span class="k3">/</span>my_cos<span class="k2">(</span>i<span class="k3">*</span>ANGLE_BETWEEN_RAYS-FOV2<span class="k2">)</span><span class="k2">;</span>

  <span class="c">// rotate distance to ray angle</span>
  <span class="k1">float</span> x <span class="k3">=</span> decimal<span class="k2">(</span><span class="k2">(</span><span class="k3">-</span>distance <span class="k3">*</span> my_sin<span class="k2">(</span>ray<span class="k3">&lt;</span>i&gt;.angle<span class="k2">)</span><span class="k2">)</span><span class="k3">+</span>player_x<span class="k2">)</span><span class="k3">*</span>floor_texture-&gt;w<span class="k2">;</span>
  <span class="k1">float</span> y <span class="k3">=</span> decimal<span class="k2">(</span><span class="k2">(</span>distance <span class="k3">*</span> my_cos<span class="k2">(</span>ray<span class="k3">&lt;</span>i&gt;.angle<span class="k2">)</span><span class="k2">)</span><span class="k3">+</span>player_y<span class="k2">)</span><span class="k3">*</span>floor_texture-&gt;h<span class="k2">;</span>

  <a href="http://www.allegro.cc/manual/putpixel" target="_blank"><span class="a">putpixel</span></a><span class="k2">(</span>buffer,i,row,<a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span>floor_texture,<span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>x,<span class="k2">(</span><span class="k1">int</span><span class="k2">)</span>y<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

(And please no kiddies commenting on the fact that it&#39;s not optimised.  That&#39;s for once it works properly.)  The x/sin and y/cos is from the other program I looked at.  I tried a bunch of combinations on the x= and y= lines and none of them worked (and understanding the math would most definitely make this baby work for me, maybe if I just sat here and thought for another few minutes...)
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (StevenVI)</author>
		<pubDate>Sat, 19 Jun 2004 07:47:36 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This is how I do my floor casting:
</p><div class="source-code"><div class="toolbar"></div><div class="inner"><table width="100%"><tbody><tr><td class="number">1</td><td>&#160;</td></tr><tr><td class="number">2</td><td><span class="c">/* this is how to find rayangle */</span></td></tr><tr><td class="number">3</td><td><span class="k1">float</span> column_angle <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_49.html" target="_blank">atan</a><span class="k2">(</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span> <span class="k2">(</span> column <span class="k3">-</span> <span class="k2">(</span>SCREEN_WIDTH<span class="k3">/</span><span class="n">2</span><span class="k2">)</span> <span class="k2">)</span> <span class="k3">/</span> SCREEN_HEIGHT<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">4</td><td><span class="k1">float</span> rayangle <span class="k3">=</span> player.angle<span class="k3">+</span>column_angle<span class="k2">;</span></td></tr><tr><td class="number">5</td><td><span class="c">/**/</span>      </td></tr><tr><td class="number">6</td><td>&#160;</td></tr><tr><td class="number">7</td><td><span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> row<span class="k3">=</span>bot<span class="k2">;</span> row<span class="k3">&lt;</span><span class="k3">=</span>SCREEN_H-1<span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>row<span class="k2">)</span></td></tr><tr><td class="number">8</td><td><span class="k2">{</span></td></tr><tr><td class="number">9</td><td>distance <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>PLAYER_HEIGHT <span class="k3">/</span> <span class="k2">(</span>row-SCREEN_H<span class="k3">/</span><span class="n">2</span><span class="k2">)</span> <span class="k2">)</span><span class="k3">*</span> PROJ_PLANE <span class="k3">*</span> cos_column_angle<span class="k2">;</span></td></tr><tr><td class="number">10</td><td>      </td></tr><tr><td class="number">11</td><td>x <span class="k3">=</span> <span class="k3">-</span>distance <span class="k3">*</span> <span class="k2">(</span>sin_rayangle<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">12</td><td>y <span class="k3">=</span> distance <span class="k3">*</span> <span class="k2">(</span>cos_rayangle<span class="k2">)</span><span class="k2">;</span></td></tr><tr><td class="number">13</td><td>&#160;</td></tr><tr><td class="number">14</td><td>x<span class="k3">+</span><span class="k3">=</span>player.x<span class="k2">;</span></td></tr><tr><td class="number">15</td><td>y<span class="k3">+</span><span class="k3">=</span>player.y<span class="k2">;</span></td></tr><tr><td class="number">16</td><td>      </td></tr><tr><td class="number">17</td><td>tile <span class="k3">=</span> map.floor<span class="k2">[</span>x&gt;&gt;6<span class="k2">]</span><span class="k2">[</span>y&gt;&gt;6<span class="k2">]</span>.tile<span class="k2">;</span></td></tr><tr><td class="number">18</td><td>&#160;</td></tr><tr><td class="number">19</td><td><span class="c">/* Might need this - it will crash if 'tile' is out of bounds  </span></td></tr><tr><td class="number">20</td><td><span class="c">if(x&gt;=MAP_WIDTH*64 || x&lt;0) tile = 2;</span></td></tr><tr><td class="number">21</td><td><span class="c">if(y&gt;=MAP_HEIGHT*64 || y&lt;0) tile = 2;</span></td></tr><tr><td class="number">22</td><td><span class="c">*/</span></td></tr><tr><td class="number">23</td><td>    </td></tr><tr><td class="number">24</td><td> <a href="http://www.allegro.cc/manual/putpixel" target="_blank"><span class="a">putpixel</span></a><span class="k2">(</span>buf,column,row,<a href="http://www.allegro.cc/manual/getpixel" target="_blank"><span class="a">getpixel</span></a><span class="k2">(</span>tex,x<span class="k3">&amp;</span><span class="n">63</span>,y<span class="k3">&amp;</span><span class="n">63</span><span class="k2">)</span><span class="k2">;</span>      </td></tr><tr><td class="number">25</td><td>&#160;</td></tr><tr><td class="number">26</td><td>      </td></tr><tr><td class="number">27</td><td><span class="k2">}</span></td></tr></tbody></table></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Roman Tech.)</author>
		<pubDate>Sat, 19 Jun 2004 09:09:10 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m rendering floors the same way as in code posted above, but still this is really bad approach to rendering floors. Most FPPs (Doom, Duke3d) were rendering floors in horizontal lines. This will spare you per-pixel division since it&#39;s essentially the same as rendering vertical walls then. Anyway, mixing column and row rendering doesn&#39;t seem to be easy.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Krzysztof Kluczek)</author>
		<pubDate>Sat, 19 Jun 2004 17:09:52 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>You should actually draw all your floors first (far to near), then walls (near to far with some kind of per-ray z-buffer, or far to near without).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Kitty Cat)</author>
		<pubDate>Sun, 20 Jun 2004 02:50:09 +0000</pubDate>
	</item>
</rss>
