<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Performance issue regarding al_put_pixel and raycasting</title>
		<link>http://www.allegro.cc/forums/view/616285</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 21 May 2016 04:32:38 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Hello, im attempting to follow <a href="http://lodev.org/cgtutor/raycasting.html"> this</a> tutorial to make a raycaster game like wolfenstien 3D but the tutorial it uses the SDL library instead of allegro and i&#39;ve run into some major performance hits when trying to follow the second part of the tutorial involving textured walls. I&#39;ve converted his code into allegro quite easily and everything works as intended, its just that performance drops significantly when i&#39;m looking at a wall and close to a wall (presumable because it has to run through the drawing loop more times). Ive already searched around for potential solutions to my problem and i think that ive narrowed it down to it just being an issue with al_put_pixel(). ive tried following suggestions like locking bitmaps and drawing to another buffer bitmap first and then drawing that to the back buffer to render but none of them have worked. i dont know if thats because im implementing them wrong or what but id appreciate if i could get some help and maybe specific suggestions for how to implement the code that will make it more efficient. Thanks.</p><p>Here is the entirety of the code, its a bit messy because i copied and pasted bits from that tutorial i linked above. if you would like clarification of something please ask. thanks for the help.</p><p>(i had to omit the definition of worldMap because this post is too long)</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">   1</span><span class="p">#include &lt;cmath&gt;</span>
<span class="number">   2</span><span class="p">#include &lt;string&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;vector&gt;</span>
<span class="number">   4</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">   5</span>
<span class="number">   6</span><span class="p">#include"allegro5/allegro5.h"</span>
<span class="number">   7</span><span class="p">#include"allegro5/allegro_primitives.h"</span>
<span class="number">   8</span><span class="p">#include"allegro5/allegro_image.h"</span>
<span class="number">   9</span><span class="p">#include"allegro5/allegro_font.h"</span>
<span class="number">  10</span><span class="p">#include"allegro5/allegro_ttf.h"</span>
<span class="number">  11</span>
<span class="number">  12</span><span class="p">#include"stdint.h"</span>
<span class="number">  13</span>
<span class="number">  14</span><span class="p">#define screenWidth 1280</span>
<span class="number">  15</span><span class="p">#define screenHeight 720</span>
<span class="number">  16</span><span class="p">#define mapWidth 24</span>
<span class="number">  17</span><span class="p">#define mapHeight 24</span>
<span class="number">  18</span><span class="p">#define texWidth 64</span>
<span class="number">  19</span><span class="p">#define texHeight 64</span>
<span class="number">  20</span>
<span class="number">  21</span><span class="k1">int</span> worldMap<span class="k2">[</span>mapWidth<span class="k2">]</span><span class="k2">[</span>mapHeight<span class="k2">]</span><span class="k2">;</span>
<span class="number">  22</span>
<span class="number">  23</span><span class="k1">bool</span> keys<span class="k2">[</span><span class="k2">]</span> <span class="k3">=</span> <span class="k2">{</span> <span class="k1">false</span>, <span class="k1">false</span>, <span class="k1">false</span>, <span class="k1">false</span>, <span class="k1">false</span>, <span class="k1">false</span>, <span class="k1">false</span>, <span class="k1">false</span> <span class="k2">}</span><span class="k2">;</span>
<span class="number">  24</span><span class="k1">enum</span> keys <span class="k2">{</span> UP, DOWN, LEFT, RIGHT, SPACE, ENTER, MOUSELEFT, MOUSERIGHT <span class="k2">}</span><span class="k2">;</span>
<span class="number">  25</span>
<span class="number">  26</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span>
<span class="number">  27</span><span class="k2">{</span>
<span class="number">  28</span>  <span class="k1">bool</span> done <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  29</span>  <span class="k1">bool</span> redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  30</span>
<span class="number">  31</span>  <span class="k1">int</span> mouseX <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  32</span>  <span class="k1">int</span> mouseY <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  33</span>
<span class="number">  34</span>  <span class="k1">double</span> posX <span class="k3">=</span> <span class="n">22</span>, posY <span class="k3">=</span> <span class="n">12</span><span class="k2">;</span>  <span class="c">//x and y start position</span>
<span class="number">  35</span>  <span class="k1">double</span> dirX <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span>, dirY <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="c">//initial direction vector</span>
<span class="number">  36</span>  <span class="k1">double</span> planeX <span class="k3">=</span> <span class="n">0</span>, planeY <span class="k3">=</span> <span class="n">0</span>.<span class="n">66</span><span class="k2">;</span> <span class="c">//the 2d raycaster version of camera plane</span>
<span class="number">  37</span>
<span class="number">  38</span>  <span class="k1">double</span> moveSpeed <span class="k3">=</span> <span class="n">0</span>.<span class="n">075</span><span class="k2">;</span> <span class="c">//the constant value is in squares/second</span>
<span class="number">  39</span>  <span class="k1">double</span> rotSpeed <span class="k3">=</span> <span class="n">0</span>.<span class="n">05</span><span class="k2">;</span> <span class="c">//the constant value is in radians/second</span>
<span class="number">  40</span>
<span class="number">  41</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a> <span class="k3">*</span>display <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  42</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>eventQueue <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  43</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_TIMER"><span class="a">ALLEGRO_TIMER</span></a> <span class="k3">*</span>timer <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  44</span>
<span class="number">  45</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_FONT"><span class="a">ALLEGRO_FONT</span></a> <span class="k3">*</span><a href="http://www.allegro.cc/manual/font"><span class="a">font</span></a> <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  46</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>titleImage <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  47</span>
<span class="number">  48</span>  <a href="http://www.delorie.com/djgpp/doc/libc/libc_739.html" target="_blank">srand</a><span class="k2">(</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_821.html" target="_blank">time</a><span class="k2">(</span>NULL<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  49</span>
<span class="number">  50</span>  <a href="http://www.allegro.cc/manual/al_init"><span class="a">al_init</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  51</span>  <a href="http://www.allegro.cc/manual/al_init_primitives_addon"><span class="a">al_init_primitives_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  52</span>  <a href="http://www.allegro.cc/manual/al_init_image_addon"><span class="a">al_init_image_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  53</span>  <a href="http://www.allegro.cc/manual/al_init_font_addon"><span class="a">al_init_font_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  54</span>  <a href="http://www.allegro.cc/manual/al_init_ttf_addon"><span class="a">al_init_ttf_addon</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  55</span>  <a href="http://www.allegro.cc/manual/al_install_mouse"><span class="a">al_install_mouse</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  56</span>  <a href="http://www.allegro.cc/manual/al_install_keyboard"><span class="a">al_install_keyboard</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  57</span>
<span class="number">  58</span>  <a href="http://www.allegro.cc/manual/al_set_new_bitmap_flags"><span class="a">al_set_new_bitmap_flags</span></a><span class="k2">(</span>ALLEGRO_VIDEO_BITMAP<span class="k2">)</span><span class="k2">;</span>
<span class="number">  59</span>
<span class="number">  60</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a><span class="k3">*</span> texture<span class="k2">[</span><span class="n">6</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  61</span>
<span class="number">  62</span>  texture<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span><span class="s">"redbrick.png"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  63</span>  texture<span class="k2">[</span><span class="n">1</span><span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span><span class="s">"eagle.png"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  64</span>  texture<span class="k2">[</span><span class="n">2</span><span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span><span class="s">"purplestone.png"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  65</span>  texture<span class="k2">[</span><span class="n">3</span><span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span><span class="s">"mossy.png"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  66</span>  texture<span class="k2">[</span><span class="n">4</span><span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span><span class="s">"bluestone.png"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  67</span>  texture<span class="k2">[</span><span class="n">5</span><span class="k2">]</span> <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_load_bitmap"><span class="a">al_load_bitmap</span></a><span class="k2">(</span><span class="s">"colorstone.png"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  68</span>
<span class="number">  69</span>  <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> i <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> i <span class="k3">&lt;</span> <span class="n">6</span><span class="k2">;</span> i<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number">  70</span>    <a href="http://www.allegro.cc/manual/al_lock_bitmap"><span class="a">al_lock_bitmap</span></a><span class="k2">(</span>texture<span class="k2">[</span>i<span class="k2">]</span>, <a href="http://www.allegro.cc/manual/al_get_bitmap_format"><span class="a">al_get_bitmap_format</span></a><span class="k2">(</span>texture<span class="k2">[</span>i<span class="k2">]</span><span class="k2">)</span>, ALLEGRO_LOCK_READONLY<span class="k2">)</span><span class="k2">;</span>
<span class="number">  71</span>
<span class="number">  72</span>  <span class="k1">int</span> w <span class="k3">=</span> screenWidth<span class="k2">;</span>
<span class="number">  73</span>  <span class="k1">int</span> h <span class="k3">=</span> screenHeight<span class="k2">;</span>
<span class="number">  74</span>
<span class="number">  75</span>  display <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_display"><span class="a">al_create_display</span></a><span class="k2">(</span>w, h<span class="k2">)</span><span class="k2">;</span>
<span class="number">  76</span>  eventQueue <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_event_queue"><span class="a">al_create_event_queue</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  77</span>  timer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_timer"><span class="a">al_create_timer</span></a><span class="k2">(</span><span class="n">1</span>.<span class="n">0</span> <span class="k3">/</span> <span class="n">60</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  78</span>
<span class="number">  79</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>eventQueue, <a href="http://www.allegro.cc/manual/al_get_timer_event_source"><span class="a">al_get_timer_event_source</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  80</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>eventQueue, <a href="http://www.allegro.cc/manual/al_get_display_event_source"><span class="a">al_get_display_event_source</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  81</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>eventQueue, <a href="http://www.allegro.cc/manual/al_get_keyboard_event_source"><span class="a">al_get_keyboard_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  82</span>  <a href="http://www.allegro.cc/manual/al_register_event_source"><span class="a">al_register_event_source</span></a><span class="k2">(</span>eventQueue, <a href="http://www.allegro.cc/manual/al_get_mouse_event_source"><span class="a">al_get_mouse_event_source</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  83</span>
<span class="number">  84</span>  <a href="http://www.allegro.cc/manual/al_start_timer"><span class="a">al_start_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  85</span>  <span class="k1">while</span> <span class="k2">(</span><span class="k3">!</span>done<span class="k2">)</span>
<span class="number">  86</span>  <span class="k2">{</span>
<span class="number">  87</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> ev<span class="k2">;</span>
<span class="number">  88</span>    <a href="http://www.allegro.cc/manual/al_wait_for_event"><span class="a">al_wait_for_event</span></a><span class="k2">(</span>eventQueue, <span class="k3">&amp;</span>ev<span class="k2">)</span><span class="k2">;</span>
<span class="number">  89</span>
<span class="number">  90</span>    <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_DOWN<span class="k2">)</span>
<span class="number">  91</span>    <span class="k2">{</span>
<span class="number">  92</span>      <span class="k1">switch</span> <span class="k2">(</span>ev.keyboard.keycode<span class="k2">)</span>
<span class="number">  93</span>      <span class="k2">{</span>
<span class="number">  94</span>      <span class="k1">case</span> ALLEGRO_KEY_UP:
<span class="number">  95</span>        keys<span class="k2">[</span>UP<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  96</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number">  97</span>      <span class="k1">case</span> ALLEGRO_KEY_DOWN:
<span class="number">  98</span>        keys<span class="k2">[</span>DOWN<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number">  99</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 100</span>      <span class="k1">case</span> ALLEGRO_KEY_LEFT:
<span class="number"> 101</span>        keys<span class="k2">[</span>LEFT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 102</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 103</span>      <span class="k1">case</span> ALLEGRO_KEY_RIGHT:
<span class="number"> 104</span>        keys<span class="k2">[</span>RIGHT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 105</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 106</span>      <span class="k1">case</span> ALLEGRO_KEY_SPACE:
<span class="number"> 107</span>        keys<span class="k2">[</span>SPACE<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 108</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 109</span>      <span class="k1">case</span> ALLEGRO_KEY_ENTER:
<span class="number"> 110</span>        keys<span class="k2">[</span>ENTER<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 111</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 112</span>      <span class="k2">}</span>
<span class="number"> 113</span>    <span class="k2">}</span>
<span class="number"> 114</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_KEY_UP<span class="k2">)</span>
<span class="number"> 115</span>    <span class="k2">{</span>
<span class="number"> 116</span>      <span class="k1">switch</span> <span class="k2">(</span>ev.keyboard.keycode<span class="k2">)</span>
<span class="number"> 117</span>      <span class="k2">{</span>
<span class="number"> 118</span>      <span class="k1">case</span> ALLEGRO_KEY_UP:
<span class="number"> 119</span>        keys<span class="k2">[</span>UP<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 120</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 121</span>      <span class="k1">case</span> ALLEGRO_KEY_DOWN:
<span class="number"> 122</span>        keys<span class="k2">[</span>DOWN<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 123</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 124</span>      <span class="k1">case</span> ALLEGRO_KEY_LEFT:
<span class="number"> 125</span>        keys<span class="k2">[</span>LEFT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 126</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 127</span>      <span class="k1">case</span> ALLEGRO_KEY_RIGHT:
<span class="number"> 128</span>        keys<span class="k2">[</span>RIGHT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 129</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 130</span>      <span class="k1">case</span> ALLEGRO_KEY_SPACE:
<span class="number"> 131</span>        keys<span class="k2">[</span>SPACE<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 132</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 133</span>      <span class="k1">case</span> ALLEGRO_KEY_ENTER:
<span class="number"> 134</span>        keys<span class="k2">[</span>ENTER<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 135</span>        <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 136</span>      <span class="k2">}</span>
<span class="number"> 137</span>    <span class="k2">}</span>
<span class="number"> 138</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_MOUSE_BUTTON_DOWN<span class="k2">)</span>
<span class="number"> 139</span>    <span class="k2">{</span>
<span class="number"> 140</span>      <span class="k1">if</span> <span class="k2">(</span>ev.mouse.button <span class="k3">&amp;</span> <span class="n">1</span><span class="k2">)</span>
<span class="number"> 141</span>      <span class="k2">{</span>
<span class="number"> 142</span>        keys<span class="k2">[</span>MOUSELEFT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 143</span>      <span class="k2">}</span>
<span class="number"> 144</span>      <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.mouse.button <span class="k3">&amp;</span> <span class="n">2</span><span class="k2">)</span>
<span class="number"> 145</span>      <span class="k2">{</span>
<span class="number"> 146</span>        keys<span class="k2">[</span>MOUSERIGHT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 147</span>      <span class="k2">}</span>
<span class="number"> 148</span>    <span class="k2">}</span>
<span class="number"> 149</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_MOUSE_BUTTON_UP<span class="k2">)</span>
<span class="number"> 150</span>    <span class="k2">{</span>
<span class="number"> 151</span>      <span class="k1">if</span> <span class="k2">(</span>ev.mouse.button <span class="k3">&amp;</span> <span class="n">1</span><span class="k2">)</span>
<span class="number"> 152</span>      <span class="k2">{</span>
<span class="number"> 153</span>        keys<span class="k2">[</span>MOUSELEFT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 154</span>      <span class="k2">}</span>
<span class="number"> 155</span>      <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.mouse.button <span class="k3">&amp;</span> <span class="n">2</span><span class="k2">)</span>
<span class="number"> 156</span>      <span class="k2">{</span>
<span class="number"> 157</span>        keys<span class="k2">[</span>MOUSERIGHT<span class="k2">]</span> <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 158</span>      <span class="k2">}</span>
<span class="number"> 159</span>    <span class="k2">}</span>
<span class="number"> 160</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_MOUSE_AXES<span class="k2">)</span>
<span class="number"> 161</span>    <span class="k2">{</span>
<span class="number"> 162</span>      mouseX <span class="k3">=</span> ev.mouse.x<span class="k2">;</span>
<span class="number"> 163</span>      mouseY <span class="k3">=</span> ev.mouse.y<span class="k2">;</span>
<span class="number"> 164</span>    <span class="k2">}</span>
<span class="number"> 165</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_DISPLAY_CLOSE<span class="k2">)</span>
<span class="number"> 166</span>    <span class="k2">{</span>
<span class="number"> 167</span>      done <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 168</span>    <span class="k2">}</span>
<span class="number"> 169</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>ev.type <span class="k3">=</span><span class="k3">=</span> ALLEGRO_EVENT_TIMER<span class="k2">)</span>
<span class="number"> 170</span>    <span class="k2">{</span>
<span class="number"> 171</span>
<span class="number"> 172</span>      <span class="k1">if</span> <span class="k2">(</span>keys<span class="k2">[</span>RIGHT<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 173</span>      <span class="k2">{</span>
<span class="number"> 174</span>        <span class="c">//both camera direction and camera plane must be rotated</span>
<span class="number"> 175</span>        <span class="k1">double</span> oldDirX <span class="k3">=</span> dirX<span class="k2">;</span>
<span class="number"> 176</span>        dirX <span class="k3">=</span> dirX <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span><span class="k3">-</span>rotSpeed<span class="k2">)</span> <span class="k3">-</span> dirY <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span><span class="k3">-</span>rotSpeed<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 177</span>        dirY <span class="k3">=</span> oldDirX <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span><span class="k3">-</span>rotSpeed<span class="k2">)</span> <span class="k3">+</span> dirY <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span><span class="k3">-</span>rotSpeed<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 178</span>        <span class="k1">double</span> oldPlaneX <span class="k3">=</span> planeX<span class="k2">;</span>
<span class="number"> 179</span>        planeX <span class="k3">=</span> planeX <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span><span class="k3">-</span>rotSpeed<span class="k2">)</span> <span class="k3">-</span> planeY <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span><span class="k3">-</span>rotSpeed<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 180</span>        planeY <span class="k3">=</span> oldPlaneX <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span><span class="k3">-</span>rotSpeed<span class="k2">)</span> <span class="k3">+</span> planeY <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span><span class="k3">-</span>rotSpeed<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 181</span>      <span class="k2">}</span>
<span class="number"> 182</span>      <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>keys<span class="k2">[</span>LEFT<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 183</span>      <span class="k2">{</span>
<span class="number"> 184</span>        <span class="c">//both camera direction and camera plane must be rotated</span>
<span class="number"> 185</span>        <span class="k1">double</span> oldDirX <span class="k3">=</span> dirX<span class="k2">;</span>
<span class="number"> 186</span>        dirX <span class="k3">=</span> dirX <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>rotSpeed<span class="k2">)</span> <span class="k3">-</span> dirY <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>rotSpeed<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 187</span>        dirY <span class="k3">=</span> oldDirX <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>rotSpeed<span class="k2">)</span> <span class="k3">+</span> dirY <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>rotSpeed<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 188</span>        <span class="k1">double</span> oldPlaneX <span class="k3">=</span> planeX<span class="k2">;</span>
<span class="number"> 189</span>        planeX <span class="k3">=</span> planeX <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>rotSpeed<span class="k2">)</span> <span class="k3">-</span> planeY <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>rotSpeed<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 190</span>        planeY <span class="k3">=</span> oldPlaneX <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_728.html" target="_blank">sin</a><span class="k2">(</span>rotSpeed<span class="k2">)</span> <span class="k3">+</span> planeY <span class="k3">*</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_113.html" target="_blank">cos</a><span class="k2">(</span>rotSpeed<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 191</span>      <span class="k2">}</span>
<span class="number"> 192</span>      <span class="k1">if</span> <span class="k2">(</span>keys<span class="k2">[</span>UP<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 193</span>      <span class="k2">{</span>
<span class="number"> 194</span>        <span class="k1">if</span> <span class="k2">(</span>worldMap<span class="k2">[</span><span class="k1">int</span><span class="k2">(</span>posX <span class="k3">+</span> dirX <span class="k3">*</span> moveSpeed<span class="k2">)</span><span class="k2">]</span><span class="k2">[</span><span class="k1">int</span><span class="k2">(</span>posY<span class="k2">)</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> <span class="k1">false</span><span class="k2">)</span> posX <span class="k3">+</span><span class="k3">=</span> dirX <span class="k3">*</span> moveSpeed<span class="k2">;</span>
<span class="number"> 195</span>        <span class="k1">if</span> <span class="k2">(</span>worldMap<span class="k2">[</span><span class="k1">int</span><span class="k2">(</span>posX<span class="k2">)</span><span class="k2">]</span><span class="k2">[</span><span class="k1">int</span><span class="k2">(</span>posY <span class="k3">+</span> dirY <span class="k3">*</span> moveSpeed<span class="k2">)</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> <span class="k1">false</span><span class="k2">)</span> posY <span class="k3">+</span><span class="k3">=</span> dirY <span class="k3">*</span> moveSpeed<span class="k2">;</span>
<span class="number"> 196</span>      <span class="k2">}</span>
<span class="number"> 197</span>      <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>keys<span class="k2">[</span>DOWN<span class="k2">]</span><span class="k2">)</span>
<span class="number"> 198</span>      <span class="k2">{</span>
<span class="number"> 199</span>        <span class="k1">if</span> <span class="k2">(</span>worldMap<span class="k2">[</span><span class="k1">int</span><span class="k2">(</span>posX <span class="k3">-</span> dirX <span class="k3">*</span> moveSpeed<span class="k2">)</span><span class="k2">]</span><span class="k2">[</span><span class="k1">int</span><span class="k2">(</span>posY<span class="k2">)</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> <span class="k1">false</span><span class="k2">)</span> posX <span class="k3">-</span><span class="k3">=</span> dirX <span class="k3">*</span> moveSpeed<span class="k2">;</span>
<span class="number"> 200</span>        <span class="k1">if</span> <span class="k2">(</span>worldMap<span class="k2">[</span><span class="k1">int</span><span class="k2">(</span>posX<span class="k2">)</span><span class="k2">]</span><span class="k2">[</span><span class="k1">int</span><span class="k2">(</span>posY <span class="k3">-</span> dirY <span class="k3">*</span> moveSpeed<span class="k2">)</span><span class="k2">]</span> <span class="k3">=</span><span class="k3">=</span> <span class="k1">false</span><span class="k2">)</span> posY <span class="k3">-</span><span class="k3">=</span> dirY <span class="k3">*</span> moveSpeed<span class="k2">;</span>
<span class="number"> 201</span>      <span class="k2">}</span>
<span class="number"> 202</span>
<span class="number"> 203</span>      redraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 204</span>    <span class="k2">}</span>
<span class="number"> 205</span>    <span class="k1">if</span> <span class="k2">(</span>redraw <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.allegro.cc/manual/al_is_event_queue_empty"><span class="a">al_is_event_queue_empty</span></a><span class="k2">(</span>eventQueue<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 206</span>    <span class="k2">{</span>
<span class="number"> 207</span>      redraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 208</span>
<span class="number"> 209</span>      <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, w, h <span class="k3">/</span> <span class="n">2</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">47</span>, <span class="n">79</span>, <span class="n">79</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 210</span>      <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="n">0</span>, h <span class="k3">/</span> <span class="n">2</span>, w, h, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">112</span>, <span class="n">128</span>, <span class="n">144</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 211</span>
<span class="number"> 212</span>      <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> x <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> x <span class="k3">&lt;</span> w<span class="k2">;</span> x<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 213</span>      <span class="k2">{</span>
<span class="number"> 214</span>
<span class="number"> 215</span>        <span class="c">//calculate ray position and direction</span>
<span class="number"> 216</span>        <span class="k1">double</span> cameraX <span class="k3">=</span> <span class="n">2</span> <span class="k3">*</span> x <span class="k3">/</span> <span class="k1">double</span><span class="k2">(</span>w<span class="k2">)</span> <span class="k3">-</span> <span class="n">1</span><span class="k2">;</span> <span class="c">//x-coordinate in camera space</span>
<span class="number"> 217</span>        <span class="k1">double</span> rayPosX <span class="k3">=</span> posX<span class="k2">;</span>
<span class="number"> 218</span>        <span class="k1">double</span> rayPosY <span class="k3">=</span> posY<span class="k2">;</span>
<span class="number"> 219</span>        <span class="k1">double</span> rayDirX <span class="k3">=</span> dirX <span class="k3">+</span> planeX <span class="k3">*</span> cameraX<span class="k2">;</span>
<span class="number"> 220</span>        <span class="k1">double</span> rayDirY <span class="k3">=</span> dirY <span class="k3">+</span> planeY <span class="k3">*</span> cameraX<span class="k2">;</span>
<span class="number"> 221</span>        <span class="c">//which box of the map we're in</span>
<span class="number"> 222</span>        <span class="k1">int</span> mapX <span class="k3">=</span> <span class="k1">int</span><span class="k2">(</span>rayPosX<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 223</span>        <span class="k1">int</span> mapY <span class="k3">=</span> <span class="k1">int</span><span class="k2">(</span>rayPosY<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 224</span>
<span class="number"> 225</span>        <span class="c">//length of ray from current position to next x or y-side</span>
<span class="number"> 226</span>        <span class="k1">double</span> sideDistX<span class="k2">;</span>
<span class="number"> 227</span>        <span class="k1">double</span> sideDistY<span class="k2">;</span>
<span class="number"> 228</span>
<span class="number"> 229</span>        <span class="c">//length of ray from one x or y-side to next x or y-side</span>
<span class="number"> 230</span>        <span class="k1">double</span> deltaDistX <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span><span class="n">1</span> <span class="k3">+</span> <span class="k2">(</span>rayDirY <span class="k3">*</span> rayDirY<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span>rayDirX <span class="k3">*</span> rayDirX<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 231</span>        <span class="k1">double</span> deltaDistY <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span><span class="n">1</span> <span class="k3">+</span> <span class="k2">(</span>rayDirX <span class="k3">*</span> rayDirX<span class="k2">)</span> <span class="k3">/</span> <span class="k2">(</span>rayDirY <span class="k3">*</span> rayDirY<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 232</span>        <span class="k1">double</span> perpWallDist<span class="k2">;</span>
<span class="number"> 233</span>
<span class="number"> 234</span>        <span class="c">//what direction to step in x or y-direction (either +1 or -1)</span>
<span class="number"> 235</span>        <span class="k1">int</span> stepX<span class="k2">;</span>
<span class="number"> 236</span>        <span class="k1">int</span> stepY<span class="k2">;</span>
<span class="number"> 237</span>
<span class="number"> 238</span>        <span class="k1">int</span> hit <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span> <span class="c">//was there a wall hit?</span>
<span class="number"> 239</span>        <span class="k1">int</span> side<span class="k2">;</span> <span class="c">//was a NS or a EW wall hit?</span>
<span class="number"> 240</span>        <span class="c">//calculate step and initial sideDist</span>
<span class="number"> 241</span>        <span class="k1">if</span> <span class="k2">(</span>rayDirX <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 242</span>        <span class="k2">{</span>
<span class="number"> 243</span>          stepX <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 244</span>          sideDistX <span class="k3">=</span> <span class="k2">(</span>rayPosX <span class="k3">-</span> mapX<span class="k2">)</span> <span class="k3">*</span> deltaDistX<span class="k2">;</span>
<span class="number"> 245</span>        <span class="k2">}</span>
<span class="number"> 246</span>        <span class="k1">else</span>
<span class="number"> 247</span>        <span class="k2">{</span>
<span class="number"> 248</span>          stepX <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 249</span>          sideDistX <span class="k3">=</span> <span class="k2">(</span>mapX <span class="k3">+</span> <span class="n">1</span>.<span class="n">0</span> <span class="k3">-</span> rayPosX<span class="k2">)</span> <span class="k3">*</span> deltaDistX<span class="k2">;</span>
<span class="number"> 250</span>        <span class="k2">}</span>
<span class="number"> 251</span>        <span class="k1">if</span> <span class="k2">(</span>rayDirY <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 252</span>        <span class="k2">{</span>
<span class="number"> 253</span>          stepY <span class="k3">=</span> <span class="k3">-</span><span class="n">1</span><span class="k2">;</span>
<span class="number"> 254</span>          sideDistY <span class="k3">=</span> <span class="k2">(</span>rayPosY <span class="k3">-</span> mapY<span class="k2">)</span> <span class="k3">*</span> deltaDistY<span class="k2">;</span>
<span class="number"> 255</span>        <span class="k2">}</span>
<span class="number"> 256</span>        <span class="k1">else</span>
<span class="number"> 257</span>        <span class="k2">{</span>
<span class="number"> 258</span>          stepY <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 259</span>          sideDistY <span class="k3">=</span> <span class="k2">(</span>mapY <span class="k3">+</span> <span class="n">1</span>.<span class="n">0</span> <span class="k3">-</span> rayPosY<span class="k2">)</span> <span class="k3">*</span> deltaDistY<span class="k2">;</span>
<span class="number"> 260</span>        <span class="k2">}</span>
<span class="number"> 261</span>        <span class="c">//perform DDA</span>
<span class="number"> 262</span>        <span class="k1">while</span> <span class="k2">(</span>hit <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span>
<span class="number"> 263</span>        <span class="k2">{</span>
<span class="number"> 264</span>          <span class="c">//jump to next map square, OR in x-direction, OR in y-direction</span>
<span class="number"> 265</span>          <span class="k1">if</span> <span class="k2">(</span>sideDistX <span class="k3">&lt;</span> sideDistY<span class="k2">)</span>
<span class="number"> 266</span>          <span class="k2">{</span>
<span class="number"> 267</span>            sideDistX <span class="k3">+</span><span class="k3">=</span> deltaDistX<span class="k2">;</span>
<span class="number"> 268</span>            mapX <span class="k3">+</span><span class="k3">=</span> stepX<span class="k2">;</span>
<span class="number"> 269</span>            side <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 270</span>          <span class="k2">}</span>
<span class="number"> 271</span>          <span class="k1">else</span>
<span class="number"> 272</span>          <span class="k2">{</span>
<span class="number"> 273</span>            sideDistY <span class="k3">+</span><span class="k3">=</span> deltaDistY<span class="k2">;</span>
<span class="number"> 274</span>            mapY <span class="k3">+</span><span class="k3">=</span> stepY<span class="k2">;</span>
<span class="number"> 275</span>            side <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 276</span>          <span class="k2">}</span>
<span class="number"> 277</span>          <span class="c">//Check if ray has hit a wall</span>
<span class="number"> 278</span>          <span class="k1">if</span> <span class="k2">(</span>worldMap<span class="k2">[</span>mapX<span class="k2">]</span><span class="k2">[</span>mapY<span class="k2">]</span> <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> hit <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 279</span>        <span class="k2">}</span>
<span class="number"> 280</span>        <span class="c">//Calculate distance projected on camera direction (oblique distance will give fisheye effect!)</span>
<span class="number"> 281</span>        <span class="k1">if</span> <span class="k2">(</span>side <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> perpWallDist <span class="k3">=</span> <span class="k2">(</span>mapX <span class="k3">-</span> rayPosX <span class="k3">+</span> <span class="k2">(</span><span class="n">1</span> <span class="k3">-</span> stepX<span class="k2">)</span> <span class="k3">/</span> <span class="n">2</span><span class="k2">)</span> <span class="k3">/</span> rayDirX<span class="k2">;</span>
<span class="number"> 282</span>        <span class="k1">else</span>           perpWallDist <span class="k3">=</span> <span class="k2">(</span>mapY <span class="k3">-</span> rayPosY <span class="k3">+</span> <span class="k2">(</span><span class="n">1</span> <span class="k3">-</span> stepY<span class="k2">)</span> <span class="k3">/</span> <span class="n">2</span><span class="k2">)</span> <span class="k3">/</span> rayDirY<span class="k2">;</span>
<span class="number"> 283</span>
<span class="number"> 284</span>        <span class="c">//Calculate height of line to draw on screen</span>
<span class="number"> 285</span>        <span class="k1">int</span> lineHeight <span class="k3">=</span> <span class="k2">(</span><span class="k1">int</span><span class="k2">)</span><span class="k2">(</span>h <span class="k3">/</span> perpWallDist<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 286</span>
<span class="number"> 287</span>        <span class="c">//calculate lowest and highest pixel to fill in current stripe</span>
<span class="number"> 288</span>        <span class="k1">int</span> drawStart <span class="k3">=</span> <span class="k3">-</span>lineHeight <span class="k3">/</span> <span class="n">2</span> <span class="k3">+</span> h <span class="k3">/</span> <span class="n">2</span><span class="k2">;</span>
<span class="number"> 289</span>        <span class="k1">if</span> <span class="k2">(</span>drawStart <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span>drawStart <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 290</span>        <span class="k1">int</span> drawEnd <span class="k3">=</span> lineHeight <span class="k3">/</span> <span class="n">2</span> <span class="k3">+</span> h <span class="k3">/</span> <span class="n">2</span><span class="k2">;</span>
<span class="number"> 291</span>        <span class="k1">if</span> <span class="k2">(</span>drawEnd <span class="k3">&gt;</span><span class="k3">=</span> h<span class="k2">)</span>drawEnd <span class="k3">=</span> h <span class="k3">-</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 292</span>
<span class="number"> 293</span>        <span class="c">//texturing calculations</span>
<span class="number"> 294</span>        <span class="k1">int</span> texNum <span class="k3">=</span> worldMap<span class="k2">[</span>mapX<span class="k2">]</span><span class="k2">[</span>mapY<span class="k2">]</span> <span class="k3">-</span> <span class="n">1</span><span class="k2">;</span> <span class="c">//1 subtracted from it so that texture 0 can be used!</span>
<span class="number"> 295</span>
<span class="number"> 296</span>        <span class="c">//calculate value of wallX</span>
<span class="number"> 297</span>        <span class="k1">double</span> wallX<span class="k2">;</span> <span class="c">//where exactly the wall was hit</span>
<span class="number"> 298</span>        <span class="k1">if</span> <span class="k2">(</span>side <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span><span class="k2">)</span> wallX <span class="k3">=</span> rayPosY <span class="k3">+</span> perpWallDist <span class="k3">*</span> rayDirY<span class="k2">;</span>
<span class="number"> 299</span>        <span class="k1">else</span>           wallX <span class="k3">=</span> rayPosX <span class="k3">+</span> perpWallDist <span class="k3">*</span> rayDirX<span class="k2">;</span>
<span class="number"> 300</span>        wallX <span class="k3">-</span><span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_330.html" target="_blank">floor</a><span class="k2">(</span><span class="k2">(</span>wallX<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 301</span>
<span class="number"> 302</span>        <span class="c">//x coordinate on the texture</span>
<span class="number"> 303</span>        <span class="k1">int</span> texX <span class="k3">=</span> <span class="k1">int</span><span class="k2">(</span>wallX <span class="k3">*</span> <span class="k1">double</span><span class="k2">(</span>texWidth<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 304</span>        <span class="k1">if</span> <span class="k2">(</span>side <span class="k3">=</span><span class="k3">=</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> rayDirX <span class="k3">&gt;</span> <span class="n">0</span><span class="k2">)</span> texX <span class="k3">=</span> texWidth <span class="k3">-</span> texX <span class="k3">-</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 305</span>        <span class="k1">if</span> <span class="k2">(</span>side <span class="k3">=</span><span class="k3">=</span> <span class="n">1</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> rayDirY <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> texX <span class="k3">=</span> texWidth <span class="k3">-</span> texX <span class="k3">-</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 306</span>
<span class="number"> 307</span>        <span class="c">//al_set_target_bitmap(buffer);</span>
<span class="number"> 308</span>        <span class="k1">for</span> <span class="k2">(</span><span class="k1">int</span> y <span class="k3">=</span> drawStart<span class="k2">;</span> y <span class="k3">&lt;</span> drawEnd<span class="k2">;</span> y<span class="k3">+</span><span class="k3">+</span><span class="k2">)</span>
<span class="number"> 309</span>        <span class="k2">{</span>
<span class="number"> 310</span>          <span class="k1">int</span> d <span class="k3">=</span> y <span class="k3">*</span> <span class="n">256</span> <span class="k3">-</span> h <span class="k3">*</span> <span class="n">128</span> <span class="k3">+</span> lineHeight <span class="k3">*</span> <span class="n">128</span><span class="k2">;</span>  <span class="c">//256 and 128 factors to avoid floats</span>
<span class="number"> 311</span>          <span class="k1">int</span> texY <span class="k3">=</span> <span class="k2">(</span><span class="k2">(</span>d <span class="k3">*</span> texHeight<span class="k2">)</span> <span class="k3">/</span> lineHeight<span class="k2">)</span> <span class="k3">/</span> <span class="n">256</span><span class="k2">;</span>
<span class="number"> 312</span>          <a href="http://www.allegro.cc/manual/al_draw_pixel"><span class="a">al_draw_pixel</span></a><span class="k2">(</span>x, y, <a href="http://www.allegro.cc/manual/al_get_pixel"><span class="a">al_get_pixel</span></a><span class="k2">(</span>texture<span class="k2">[</span>texNum<span class="k2">]</span>, texX, texY<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 313</span>        <span class="k2">}</span>
<span class="number"> 314</span>      <span class="k2">}</span>
<span class="number"> 315</span>
<span class="number"> 316</span>      <a href="http://www.allegro.cc/manual/al_flip_display"><span class="a">al_flip_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 317</span>      <a href="http://www.allegro.cc/manual/al_clear_to_color"><span class="a">al_clear_to_color</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 318</span>    <span class="k2">}</span>
<span class="number"> 319</span>  <span class="k2">}</span>
<span class="number"> 320</span>
<span class="number"> 321</span>  <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>texture<span class="k2">[</span><span class="n">0</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 322</span>  <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>texture<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 323</span>  <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>texture<span class="k2">[</span><span class="n">2</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 324</span>  <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>texture<span class="k2">[</span><span class="n">3</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 325</span>  <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>texture<span class="k2">[</span><span class="n">4</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 326</span>  <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>texture<span class="k2">[</span><span class="n">5</span><span class="k2">]</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 327</span>
<span class="number"> 328</span>  <a href="http://www.allegro.cc/manual/al_destroy_display"><span class="a">al_destroy_display</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 329</span>  <a href="http://www.allegro.cc/manual/al_destroy_event_queue"><span class="a">al_destroy_event_queue</span></a><span class="k2">(</span>eventQueue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 330</span>  <a href="http://www.allegro.cc/manual/al_destroy_timer"><span class="a">al_destroy_timer</span></a><span class="k2">(</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 331</span>
<span class="number"> 332</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 333</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (FlyingFromage)</author>
		<pubDate>Fri, 20 May 2016 00:30:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Allegro5 is different than old SDL in that it is hardware accelerated, which has bad performance on per-pixel operations.</p><p>Try to lock your texture for write only, write out the pixels manually, then render the texture instead of draw operations. Make sure allegro does not preserve the texture.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 20 May 2016 02:58:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Also try making 1x1 rectangles using the primitive addon. I know it sounds strange, but I&#39;ve had better performance using that.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Chris Katko)</author>
		<pubDate>Fri, 20 May 2016 03:03:01 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for the replies but could you please explain to me what you mean by (im quite new to graphics and allegro)
</p><div class="quote_container"><div class="title"><a href="https://www.allegro.cc/forums/reply/616285">jmasterx</a> said:</div><div class="quote"><p>write out the pixels manually, then render the texture instead of draw operations</p></div></div><p>
thanks for the help.</p><p>edit: i tried using the primitive add on to draw rectangles instead and that worsened the issue
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (FlyingFromage)</author>
		<pubDate>Fri, 20 May 2016 03:20:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Right now, you are asking the graphics card to draw n pixels of rectangles and it has to send the verticies and texture coords for each call to al_draw_pixel.</p><p>Allegro can instead allow you to create a texture using al_create_bitmap.<br />You then lock it <a href="https://www.allegro.cc/manual/5/al_lock_bitmap">https://www.allegro.cc/manual/5/al_lock_bitmap</a> and that puts it in RAM. Once in RAM, you access and write to the individual pixels... in RAM.</p><p>You then release the lock that sends the texture to the graphics card and then you draw it to the screen. This should be much faster.
</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">inline</span> <span class="k1">void</span> write_pixel_argb_8888<span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_LOCKED_REGION"><span class="a">ALLEGRO_LOCKED_REGION</span></a> <span class="k3">*</span>region, <span class="k1">int</span> x, <span class="k1">int</span> y, <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> <span class="k3">&amp;</span>col<span class="k2">)</span>
<span class="k2">{</span>
  <span class="k1">uint32_t</span> <span class="k3">*</span>ptr32<span class="k2">;</span>
  <span class="k1">unsigned</span> <span class="k1">char</span> r, g, b, a<span class="k2">;</span>
  <a href="http://www.allegro.cc/manual/al_unmap_rgba"><span class="a">al_unmap_rgba</span></a><span class="k2">(</span>col, <span class="k3">&amp;</span>r, <span class="k3">&amp;</span>g, <span class="k3">&amp;</span>b, <span class="k3">&amp;</span>a<span class="k2">)</span><span class="k2">;</span>
  ptr32 <span class="k3">=</span> <span class="k2">(</span><span class="k1">uint32_t</span> <span class="k3">*</span><span class="k2">)</span>region-&gt;data <span class="k3">+</span> x <span class="k3">+</span> y<span class="k3">*</span><span class="k2">(</span>region-&gt;pitch<span class="k3">/</span><span class="n">4</span><span class="k2">)</span><span class="k2">;</span>
  <span class="k3">*</span>ptr32 <span class="k3">=</span> <span class="k2">(</span>a <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">24</span><span class="k2">)</span> <span class="k3">|</span> <span class="k2">(</span>r <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>g <span class="k3">&lt;</span><span class="k3">&lt;</span> <span class="n">8</span><span class="k2">)</span> <span class="k3">|</span> b<span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 20 May 2016 04:05:56 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you could attach all the code as a zip that might help.</p><p>Just looking at the code, are you clear on the difference between <span class="source-code"><a href="http://www.allegro.cc/manual/al_put_pixel"><span class="a">al_put_pixel</span></a></span> and <span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_pixel"><span class="a">al_draw_pixel</span></a></span>? Locking the screen with ALLEGRO_LOCK_WRITEONLY should increase speed. Also I think your bitmaps ought to be loaded as memory bitmaps, not video for fastest access. Another thing (I&#39;m not sure if this is still true or ever has been true for allegro 5!) if you create the display before loading the bitmaps it will ensure they have the same pixel format.</p><p>Finally, I know that MSVC compiles in a lot of bounds checking if you use STL containers in debug mode - could that be an issue for you?</p><p>If none of that helps you will have to go to direct access as jmasterx suggests.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Fri, 20 May 2016 10:59:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for all of the suggestions guys. unfortunately i think im just too much of a novice to figure this out because I&#39;ve tried implementing all of your suggestions multiple times but its either not working or im not doing it correctly (probably the latter). I appreciate the help though, thanks for your time.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (FlyingFromage)</author>
		<pubDate>Fri, 20 May 2016 11:22:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Don&#39;t give up now <img src="http://www.allegro.cc/forums/smileys/undecided.gif" alt=":-/" /></p><p>I had a quick try and I got it to run OK (admittedly not as quickly as I remember  Wolfenstein running back in 1993 but that was only running at 320x200 IIRC)</p><p>I changed line 58 to use ALLEGRO_MEMORY_BITMAP and dropped the locking code on lines 69-70.<br />I changed al_draw_pixel to al_put_pixel on line 312.<br />Finally I added on line 211
</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_lock_bitmap"><span class="a">al_lock_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_backbuffer"><span class="a">al_get_backbuffer</span></a><span class="k2">(</span>display<span class="k2">)</span>, ALLEGRO_PIXEL_FORMAT_ANY, ALLEGRO_LOCK_READWRITE<span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p> <br />and on line 315
</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_unlock_bitmap"><span class="a">al_unlock_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_backbuffer"><span class="a">al_get_backbuffer</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Does that help any with your system?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Peter Hull)</author>
		<pubDate>Fri, 20 May 2016 13:27:20 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If it&#39;s a per pixel operation, why not using a Pixel Shader ?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (GullRaDriel)</author>
		<pubDate>Fri, 20 May 2016 13:28:40 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for the extra help Peter Hull, i implemented everything that you said to do and it did help but not to the extent i&#39;m looking for still. Im still trying to figure out how to implement jmsaterx&#39;s solution but i always end up with worse results (and weird artifact-ing).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (FlyingFromage)</author>
		<pubDate>Fri, 20 May 2016 21:46:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here is an implementation of what I was talking about.</p><p>I also did some basic optimizations to avoid multiplications in the tight loop.<br /><a href="https://www.allegro.cc/files/attachment/610374">https://www.allegro.cc/files/attachment/610374</a><br />I&#39;m getting a great framerate compared to your original code.</p><p>Some of your logic that you do in the render could be optimized/cached in memory.</p><p>Those 2 square roots are not cheap.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Sat, 21 May 2016 02:37:38 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>One trick I did for my ray casting demo was create vertical, 1px wide subbitmap &quot;slices&quot; of each wall texture.</p><p>So rather than copying pixels, you just draw that sub-bitmaps when rendering a wall.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Mark Oates)</author>
		<pubDate>Sat, 21 May 2016 03:12:42 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks for the help all! with your implementation jmasterx, there was an issue where whenever the camera got really close to the wall it sometimes had a massive performance drop for a couple seconds and then would be just fine afterwards. But i fixed that by not locking the texture bitmaps which didn&#39;t affect the general performance noticeably.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (FlyingFromage)</author>
		<pubDate>Sat, 21 May 2016 04:32:38 +0000</pubDate>
	</item>
</rss>
