<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>Should Allegro on OpenGL in Windows&#39;s cpu be fluctuating?</title>
		<link>http://www.allegro.cc/forums/view/607562</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Fri, 10 Jun 2011 07:47:00 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>*Title should say CPU Usage</p><p>For my game, I want to use GLSL shaders so I explicitly set the ALLEGRO_OPENGL flag when creating a display. However, in Windows, it causes the cpu usage to fluctuate quite a bit compared to Direct3D. This is consistent with anything I compile with Allegro. Is this normal, is it actually consuming what it says?</p><p>This happens on my laptop which has an NVidia GeFoce 9400m video card. It also fluctuates on my PC too though, and both have latest drivers.</p><p>Is it because there is a substantial advantage to using Direct3D on Windows? If so, would CG be a better alternative?</p><p>Thanks
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Thu, 09 Jun 2011 21:47:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Can you give me an example I can compile to test it? I have the same 9400M in my laptop. It really should not be doing that, if it is there might be a bug somewhere. One thing that might be an issue is reloading the matrices all the time. I noticed that using PROGRAMMBLE_PIPELINE is a bit slower running than those that don&#39;t use shaders (on iphone). My first guess in that case was transferring matrices into shaders. Anyway, I will test an example if you have one.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Thu, 09 Jun 2011 22:15:06 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;ve attached an exe I made which uses a shader. Although it happens even when shaders are not used. It goes anywhere from 5 to 50% on mine. But what it&#39;s doing is rather simple. Without shaders in D3D this runs consistently around 3%.</p><p>The SRC is a test bed and a bit of a mess but it might help:
</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="c">//Allegro 5 </span>
<span class="number">   2</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">   3</span><span class="p">#include &lt;allegro5/allegro5.h&gt;</span>
<span class="number">   4</span><span class="p">#include &lt;allegro5/allegro_image.h&gt;</span>
<span class="number">   5</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">   6</span><span class="p">#include &lt;allegro5/allegro_font.h&gt;</span>
<span class="number">   7</span><span class="p">#include &lt;allegro5/allegro_ttf.h&gt;</span>
<span class="number">   8</span><span class="p">#include &lt;allegro5/allegro_opengl.h&gt;</span>
<span class="number">   9</span>
<span class="number">  10</span><span class="p">#include &lt;allegro5/allegro_native_dialog.h&gt;</span>
<span class="number">  11</span><span class="p">#include &lt;stdlib.h&gt;</span>
<span class="number">  12</span><span class="p">#include &lt;vector&gt; </span>
<span class="number">  13</span><span class="p">#include &lt;string&gt;</span>
<span class="number">  14</span><span class="p">#include &lt;ctime&gt;</span>
<span class="number">  15</span><span class="p">#include &lt;iostream&gt;</span>
<span class="number">  16</span><span class="p">#include &lt;fstream&gt;</span>
<span class="number">  17</span><span class="p">#include "SKALE/Skeleton.hpp"</span>
<span class="number">  18</span><span class="p">#include "SKALE/IKSolver.hpp"</span>
<span class="number">  19</span><span class="p">#include &lt;math.h&gt;</span>
<span class="number">  20</span>
<span class="number">  21</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>backbuffer <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  22</span>GLhandleARB tinter<span class="k2">;</span>
<span class="number">  23</span>GLhandleARB tinter_shader<span class="k2">;</span>
<span class="number">  24</span>
<span class="number">  25</span>skl::IKSolver solver<span class="k2">;</span>
<span class="number">  26</span>
<span class="number">  27</span> <span class="k1">float</span> r <span class="k3">=</span> <span class="n">0</span>.<span class="n">5</span>, g <span class="k3">=</span> <span class="n">0</span>.<span class="n">5</span>, b <span class="k3">=</span> <span class="n">1</span>, ratio <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number">  28</span> <span class="k1">int</span> dir <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number">  29</span>
<span class="number">  30</span> std::ifstream myFile <span class="k3">=</span> std::ifstream<span class="k2">(</span><span class="s">"shader.txt"</span>,std::ios::in<span class="k2">)</span><span class="k2">;</span>
<span class="number">  31</span>
<span class="number">  32</span> <span class="k1">double</span> start<span class="k2">;</span>
<span class="number">  33</span> GLint loc<span class="k2">;</span>
<span class="number">  34</span>
<span class="number">  35</span><span class="p">#define FRAME_RATE 60</span>
<span class="number">  36</span>
<span class="number">  37</span><span class="c">//Globals</span>
<span class="number">  38</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">  39</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">  40</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT"><span class="a">ALLEGRO_EVENT</span></a> event<span class="k2">;</span>
<span class="number">  41</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_QUEUE"><span class="a">ALLEGRO_EVENT_QUEUE</span></a> <span class="k3">*</span>queue <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  42</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>rope<span class="k2">;</span>
<span class="number">  43</span><span class="k1">bool</span> done <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number">  44</span>skl::Skeleton skeleton<span class="k2">;</span>
<span class="number">  45</span>
<span class="number">  46</span>std::string shader<span class="k2">;</span>
<span class="number">  47</span>
<span class="number">  48</span><span class="k1">const</span> <span class="k1">char</span><span class="k3">*</span> shade<span class="k2">[</span><span class="n">1</span><span class="k2">]</span><span class="k2">;</span>
<span class="number">  49</span>
<span class="number">  50</span><span class="k1">void</span> loadShader<span class="k2">(</span><span class="k2">)</span>
<span class="number">  51</span><span class="k2">{</span>
<span class="number">  52</span>  <span class="c">// Open the file</span>
<span class="number">  53</span>  std::ifstream File<span class="k2">(</span><span class="s">"shader.txt"</span>, std::ios::in<span class="k2">)</span><span class="k2">;</span>
<span class="number">  54</span>  <span class="k1">if</span> <span class="k2">(</span><span class="k3">!</span>File.is_open<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span> <span class="k2">}</span><span class="c">// Get the size of the file</span>
<span class="number">  55</span>  File.seekg<span class="k2">(</span><span class="n">0</span>, std::ios::end<span class="k2">)</span><span class="k2">;</span><span class="k1">int</span> Size <span class="k3">=</span> File.tellg<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  56</span>  File.seekg<span class="k2">(</span><span class="n">0</span>, std::ios::beg<span class="k2">)</span><span class="k2">;</span>
<span class="number">  57</span>  File.clear<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span><span class="c">// Read in the shader source code</span>
<span class="number">  58</span>  <span class="k1">char</span> <span class="k3">*</span>Source <span class="k3">=</span> <span class="k1">new</span> <span class="k1">char</span><span class="k2">[</span>Size <span class="k3">+</span> <span class="n">1</span><span class="k2">]</span><span class="k2">;</span><a href="http://www.delorie.com/djgpp/doc/libc/libc_569.html" target="_blank">memset</a><span class="k2">(</span>Source, <span class="n">0</span>, Size<span class="k2">)</span><span class="k2">;</span>
<span class="number">  59</span>  File.read<span class="k2">(</span>Source, Size<span class="k2">)</span><span class="k2">;</span>
<span class="number">  60</span>  File.close<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  61</span>  Source<span class="k2">[</span>Size<span class="k2">]</span> <span class="k3">=</span> <span class="s">'\0'</span><span class="k2">;</span>
<span class="number">  62</span>
<span class="number">  63</span>  shade<span class="k2">[</span><span class="n">0</span><span class="k2">]</span> <span class="k3">=</span> Source<span class="k2">;</span>
<span class="number">  64</span>
<span class="number">  65</span><span class="k2">}</span>
<span class="number">  66</span><span class="k1">void</span> resizeBackBufferToDisplay<span class="k2">(</span><span class="k2">)</span>
<span class="number">  67</span><span class="k2">{</span>
<span class="number">  68</span>  <span class="k1">if</span><span class="k2">(</span>backbuffer<span class="k2">)</span>
<span class="number">  69</span>  <span class="k2">{</span>
<span class="number">  70</span>    <a href="http://www.allegro.cc/manual/al_destroy_bitmap"><span class="a">al_destroy_bitmap</span></a><span class="k2">(</span>backbuffer<span class="k2">)</span><span class="k2">;</span>
<span class="number">  71</span>    backbuffer <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number">  72</span>  <span class="k2">}</span>
<span class="number">  73</span>
<span class="number">  74</span>  backbuffer <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_create_bitmap"><span class="a">al_create_bitmap</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>,
<span class="number">  75</span>    <a href="http://www.allegro.cc/manual/al_get_display_height"><span class="a">al_get_display_height</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  76</span><span class="k2">}</span>
<span class="number">  77</span><span class="k1">void</span> initializeAllegro<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  78</span>  <span class="c">//Initialize Allegro</span>
<span class="number">  79</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</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">  80</span>  <span class="k2">{</span>
<span class="number">  81</span>    <span class="k1">throw</span> std::exception<span class="k2">(</span><span class="s">"Allegro failed to initialize"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  82</span>  <span class="k2">}</span>
<span class="number">  83</span>
<span class="number">  84</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</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">  85</span>  <span class="k2">{</span>
<span class="number">  86</span>    <span class="k1">throw</span> std::exception<span class="k2">(</span><span class="s">"Allegro image addon failed to initialize"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  87</span>  <span class="k2">}</span>
<span class="number">  88</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">  89</span>
<span class="number">  90</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</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">  91</span>  <span class="k2">{</span>
<span class="number">  92</span>    <span class="k1">throw</span> std::exception<span class="k2">(</span><span class="s">"Allegro ttf addon failed to initialize"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  93</span>  <span class="k2">}</span>
<span class="number">  94</span>
<span class="number">  95</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</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">  96</span>  <span class="k2">{</span>
<span class="number">  97</span>    <span class="k1">throw</span> std::exception<span class="k2">(</span><span class="s">"Allegro primitives addon failed to initialize"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  98</span>  <span class="k2">}</span>
<span class="number">  99</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</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"> 100</span>  <span class="k2">{</span>
<span class="number"> 101</span>    <span class="k1">throw</span> std::exception<span class="k2">(</span><span class="s">"Allegro mouse failed to initialize"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 102</span>  <span class="k2">}</span>
<span class="number"> 103</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</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"> 104</span>  <span class="k2">{</span>
<span class="number"> 105</span>    <span class="k1">throw</span> std::exception<span class="k2">(</span><span class="s">"Allegro keyboard failed to initialize"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 106</span>  <span class="k2">}</span>
<span class="number"> 107</span>  
<span class="number"> 108</span>  <span class="c">// Start a timer to regulate speed</span>
<span class="number"> 109</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>FRAME_RATE<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 110</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"> 111</span>
<span class="number"> 112</span>  <span class="c">//show screen</span>
<span class="number"> 113</span>
<span class="number"> 114</span>  <a href="http://www.allegro.cc/manual/al_set_new_display_flags"><span class="a">al_set_new_display_flags</span></a><span class="k2">(</span>ALLEGRO_RESIZABLE <span class="k3">|</span> ALLEGRO_OPENGL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 115</span>
<span class="number"> 116</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><span class="n">640</span>,<span class="n">480</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 117</span>
<span class="number"> 118</span>  <span class="k1">if</span><span class="k2">(</span><span class="k3">!</span>display<span class="k2">)</span>
<span class="number"> 119</span>  <span class="k2">{</span>
<span class="number"> 120</span>    done <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 121</span>  <span class="k2">}</span>
<span class="number"> 122</span>  <span class="c">//show the mouse</span>
<span class="number"> 123</span>  <a href="http://www.allegro.cc/manual/al_show_mouse_cursor"><span class="a">al_show_mouse_cursor</span></a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span> 
<span class="number"> 124</span>
<span class="number"> 125</span>
<span class="number"> 126</span>
<span class="number"> 127</span>  <span class="c">//Window Title</span>
<span class="number"> 128</span>  <a href="http://www.allegro.cc/manual/al_set_window_title"><span class="a">al_set_window_title</span></a><span class="k2">(</span>display,<span class="s">"SKALE - Example"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 129</span>
<span class="number"> 130</span>  queue <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"> 131</span>
<span class="number"> 132</span>  rope <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">"rope.png"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 133</span>  resizeBackBufferToDisplay<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 134</span>
<span class="number"> 135</span>  loadShader<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 136</span>
<span class="number"> 137</span>  tinter_shader <span class="k3">=</span> glCreateShaderObjectARB<span class="k2">(</span>GL_FRAGMENT_SHADER_ARB<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 138</span>
<span class="number"> 139</span>  glShaderSourceARB<span class="k2">(</span>tinter_shader, <span class="n">1</span>, shade, NULL<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 140</span>  glCompileShaderARB<span class="k2">(</span>tinter_shader<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 141</span>  tinter <span class="k3">=</span> glCreateProgramObjectARB<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 142</span>  glAttachObjectARB<span class="k2">(</span>tinter, tinter_shader<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 143</span>  glLinkProgramARB<span class="k2">(</span>tinter<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 144</span>  <span class="k1">char</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_542.html" target="_blank">log</a><span class="k2">[</span><span class="n">500</span><span class="k2">]</span><span class="k2">;</span>
<span class="number"> 145</span>
<span class="number"> 146</span>  glGetProgramInfoLog<span class="k2">(</span>tinter,<span class="n">500</span>,NULL,<a href="http://www.delorie.com/djgpp/doc/libc/libc_542.html" target="_blank">log</a><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 147</span>  std::cout <span class="k3">&lt;</span><span class="k3">&lt;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_542.html" target="_blank">log</a> <span class="k3">&lt;</span><span class="k3">&lt;</span> std::endl<span class="k2">;</span>
<span class="number"> 148</span>
<span class="number"> 149</span>  loc <span class="k3">=</span> glGetUniformLocationARB<span class="k2">(</span>tinter, <span class="s">"backBuffer"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 150</span>  glUniform1iARB<span class="k2">(</span>loc, <a href="http://www.allegro.cc/manual/al_get_opengl_texture"><span class="a">al_get_opengl_texture</span></a><span class="k2">(</span>backbuffer<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 151</span>
<span class="number"> 152</span><span class="k2">}</span>
<span class="number"> 153</span>
<span class="number"> 154</span><span class="k1">void</span> buildSkeleton<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 155</span><span class="k2">{</span>
<span class="number"> 156</span>  skeleton.load<span class="k2">(</span><span class="s">"Skeleton.txt"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 157</span>
<span class="number"> 158</span><span class="k2">}</span>
<span class="number"> 159</span>
<span class="number"> 160</span><span class="k1">bool</span> Inisde<span class="k2">(</span><span class="k1">float</span> x,<span class="k1">float</span> y,<span class="k1">float</span> l,<span class="k1">float</span> t,<span class="k1">float</span> r,<span class="k1">float</span> b <span class="k2">)</span>
<span class="number"> 161</span><span class="k2">{</span>
<span class="number"> 162</span> <span class="k1">return</span> x <span class="k3">&gt;</span> l <span class="k3">&amp;</span><span class="k3">&amp;</span> x <span class="k3">&lt;</span> r <span class="k3">&amp;</span><span class="k3">&amp;</span> y <span class="k3">&gt;</span> t <span class="k3">&amp;</span><span class="k3">&amp;</span> y <span class="k3">&lt;</span> b<span class="k2">;</span>
<span class="number"> 163</span><span class="k2">}</span>
<span class="number"> 164</span>
<span class="number"> 165</span>skl::Bone<span class="k3">*</span> findBone<span class="k2">(</span><span class="k1">float</span> x, <span class="k1">float</span> y, skl::Bone<span class="k3">*</span> root<span class="k2">)</span>
<span class="number"> 166</span><span class="k2">{</span>
<span class="number"> 167</span>  <span class="k1">float</span> x1, y1, x2, y2<span class="k2">;</span>
<span class="number"> 168</span>
<span class="number"> 169</span>  x1 <span class="k3">=</span> root-&gt;getFrameX<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 170</span>  x2 <span class="k3">=</span> root-&gt;getFrameX<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 171</span>  y1 <span class="k3">=</span> root-&gt;getFrameY<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 172</span>  y2 <span class="k3">=</span> root-&gt;getFrameY<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 173</span>
<span class="number"> 174</span>  x1 <span class="k3">-</span><span class="k3">=</span> <span class="n">12</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 175</span>  y1 <span class="k3">-</span><span class="k3">=</span> <span class="n">12</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 176</span>  x2 <span class="k3">+</span><span class="k3">=</span> <span class="n">12</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 177</span>  y2 <span class="k3">+</span><span class="k3">=</span> <span class="n">12</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 178</span>
<span class="number"> 179</span>  <span class="k1">if</span><span class="k2">(</span>Inisde<span class="k2">(</span>x,y,x1,y1,x2,y2<span class="k2">)</span><span class="k2">)</span>
<span class="number"> 180</span>  <span class="k2">{</span>
<span class="number"> 181</span>    <span class="k1">return</span> root<span class="k2">;</span>
<span class="number"> 182</span>  <span class="k2">}</span>
<span class="number"> 183</span>
<span class="number"> 184</span>  skl::Bone<span class="k3">*</span> result <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 185</span>  <span class="k1">for</span><span class="k2">(</span>std::list<span class="k3">&lt;</span>skl::Bone&gt;::iterator it <span class="k3">=</span> root-&gt;begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> root-&gt;end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>it <span class="k2">)</span>
<span class="number"> 186</span>  <span class="k2">{</span>
<span class="number"> 187</span>    result <span class="k3">=</span> findBone<span class="k2">(</span>x,y,<span class="k3">&amp;</span><span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 188</span>    <span class="k1">if</span><span class="k2">(</span>result<span class="k2">)</span>
<span class="number"> 189</span>    <span class="k2">{</span>
<span class="number"> 190</span>      <span class="k1">return</span> result<span class="k2">;</span>
<span class="number"> 191</span>    <span class="k2">}</span>
<span class="number"> 192</span>  <span class="k2">}</span>
<span class="number"> 193</span>
<span class="number"> 194</span>  <span class="k1">return</span> NULL<span class="k2">;</span>
<span class="number"> 195</span><span class="k2">}</span>
<span class="number"> 196</span><span class="k1">bool</span> inverse <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 197</span><span class="k1">int</span> fr <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 198</span><span class="k1">void</span> renderSkeleton<span class="k2">(</span>skl::Bone<span class="k3">*</span> root<span class="k2">)</span>
<span class="number"> 199</span><span class="k2">{</span>
<span class="number"> 200</span>
<span class="number"> 201</span>  <span class="k1">if</span><span class="k2">(</span>root-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number"> 202</span>  <span class="k2">{</span>
<span class="number"> 203</span>  
<span class="number"> 204</span>    <a href="http://www.allegro.cc/manual/al_draw_scaled_rotated_bitmap"><span class="a">al_draw_scaled_rotated_bitmap</span></a><span class="k2">(</span>rope,<a href="http://www.allegro.cc/manual/al_get_bitmap_width"><span class="a">al_get_bitmap_width</span></a><span class="k2">(</span>rope<span class="k2">)</span> <span class="k3">/</span> <span class="n">2</span>.<span class="n">0f</span>,
<span class="number"> 205</span>      <span class="n">0</span>,
<span class="number"> 206</span>      root-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getFrameX<span class="k2">(</span><span class="k2">)</span>, root-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getFrameY<span class="k2">(</span><span class="k2">)</span>,<span class="n">0</span>.<span class="n">1f</span>,<span class="k2">(</span>root-&gt;getLength<span class="k2">(</span><span class="k2">)</span> <span class="k3">*</span> <span class="n">1</span>.<span class="n">1f</span><span class="k2">)</span> <span class="k3">/</span>
<span class="number"> 207</span>      <a href="http://www.allegro.cc/manual/al_get_bitmap_height"><span class="a">al_get_bitmap_height</span></a><span class="k2">(</span>rope<span class="k2">)</span> ,root-&gt;getFrameAngle<span class="k2">(</span><span class="k2">)</span> <span class="k3">-</span> <span class="k2">(</span><span class="n">3</span>.<span class="n">1415f</span> <span class="k3">/</span> <span class="n">2</span>.<span class="n">0f</span><span class="k2">)</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 208</span>    
<span class="number"> 209</span>    <a href="http://www.allegro.cc/manual/al_draw_line"><span class="a">al_draw_line</span></a><span class="k2">(</span>
<span class="number"> 210</span>      root-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getFrameX<span class="k2">(</span><span class="k2">)</span>,root-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getFrameY<span class="k2">(</span><span class="k2">)</span>,
<span class="number"> 211</span>      root-&gt;getFrameX<span class="k2">(</span><span class="k2">)</span>,root-&gt;getFrameY<span class="k2">(</span><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">255</span>,<span class="n">0</span>,<span class="n">0</span><span class="k2">)</span>,<span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 212</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_circle"><span class="a">al_draw_filled_circle</span></a><span class="k2">(</span>root-&gt;getFrameX<span class="k2">(</span><span class="k2">)</span>,root-&gt;getFrameY<span class="k2">(</span><span class="k2">)</span>,<span class="n">4</span>.<span class="n">0f</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">50</span>,<span class="n">200</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 213</span>
<span class="number"> 214</span>  <span class="k2">}</span>
<span class="number"> 215</span>  <span class="k1">else</span>
<span class="number"> 216</span>  <span class="k2">{</span>
<span class="number"> 217</span>      <a href="http://www.allegro.cc/manual/al_draw_filled_circle"><span class="a">al_draw_filled_circle</span></a><span class="k2">(</span>root-&gt;getFrameX<span class="k2">(</span><span class="k2">)</span>,root-&gt;getFrameY<span class="k2">(</span><span class="k2">)</span>,<span class="n">4</span>.<span class="n">0f</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">50</span>,<span class="n">200</span>,<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 218</span>  <span class="k2">}</span>
<span class="number"> 219</span>
<span class="number"> 220</span>  <span class="k1">for</span><span class="k2">(</span>std::list<span class="k3">&lt;</span>skl::Bone&gt;::iterator it <span class="k3">=</span> root-&gt;begin<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> it <span class="k3">!</span><span class="k3">=</span> root-&gt;end<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span> <span class="k3">+</span><span class="k3">+</span>it<span class="k2">)</span>
<span class="number"> 221</span>  <span class="k2">{</span>
<span class="number"> 222</span>    renderSkeleton<span class="k2">(</span><span class="k3">&amp;</span><span class="k2">(</span><span class="k3">*</span>it<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 223</span>  <span class="k2">}</span>
<span class="number"> 224</span><span class="k2">}</span>
<span class="number"> 225</span>
<span class="number"> 226</span>skl::Bone<span class="k3">*</span> boneUnderMouse <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 227</span><span class="k1">int</span> mouseX <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 228</span><span class="k1">int</span> mouseY <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 229</span><span class="k1">int</span> startX <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 230</span><span class="k1">int</span> startY <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 231</span><span class="k1">float</span> startAngle<span class="k2">;</span>
<span class="number"> 232</span><span class="k1">float</span> realStartAngle<span class="k2">;</span>
<span class="number"> 233</span>
<span class="number"> 234</span><span class="k1">float</span> mouseXF<span class="k2">;</span>
<span class="number"> 235</span><span class="k1">float</span> mouseYF<span class="k2">;</span>
<span class="number"> 236</span>
<span class="number"> 237</span><span class="k1">float</span> dot<span class="k2">(</span><span class="k1">float</span> aX, <span class="k1">float</span> aY, <span class="k1">float</span> bX, <span class="k1">float</span> bY<span class="k2">)</span>
<span class="number"> 238</span><span class="k2">{</span>
<span class="number"> 239</span>  <span class="k1">return</span> <span class="k2">(</span><span class="k2">(</span>aX <span class="k3">*</span> bX<span class="k2">)</span> <span class="k3">+</span> <span class="k2">(</span>aY <span class="k3">*</span> bY<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 240</span><span class="k2">}</span>
<span class="number"> 241</span><span class="k1">float</span> dots<span class="k2">(</span><span class="k1">float</span> aX, <span class="k1">float</span> aY, <span class="k1">float</span> bX, <span class="k1">float</span> bY<span class="k2">)</span>
<span class="number"> 242</span><span class="k2">{</span>
<span class="number"> 243</span>  <span class="k1">return</span> <span class="k2">(</span><span class="k2">(</span>aX <span class="k3">*</span> bX<span class="k2">)</span> <span class="k3">-</span> <span class="k2">(</span>aY <span class="k3">*</span> bY<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 244</span><span class="k2">}</span>
<span class="number"> 245</span>
<span class="number"> 246</span>
<span class="number"> 247</span> <span class="k1">float</span> SimplifyAngle<span class="k2">(</span><span class="k1">float</span> angle<span class="k2">)</span>
<span class="number"> 248</span><span class="k2">{</span>
<span class="number"> 249</span>  angle <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_332.html" target="_blank">fmod</a><span class="k2">(</span>angle,<span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> <span class="n">3</span>.<span class="n">141592f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 250</span>
<span class="number"> 251</span>  <span class="k1">if</span><span class="k2">(</span> angle <span class="k3">&lt;</span> <span class="k3">-</span><span class="n">3</span>.<span class="n">141592f</span> <span class="k2">)</span>
<span class="number"> 252</span>    angle <span class="k3">+</span><span class="k3">=</span> <span class="k2">(</span><span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> <span class="n">3</span>.<span class="n">141592</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 253</span>  <span class="k1">else</span> <span class="k1">if</span><span class="k2">(</span> angle <span class="k3">&gt;</span> <span class="n">3</span>.<span class="n">141592f</span> <span class="k2">)</span>
<span class="number"> 254</span>    angle <span class="k3">-</span><span class="k3">=</span> <span class="k2">(</span><span class="n">2</span>.<span class="n">0f</span> <span class="k3">*</span> <span class="n">3</span>.<span class="n">141592f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 255</span>  <span class="k1">return</span> angle<span class="k2">;</span>
<span class="number"> 256</span><span class="k2">}</span>
<span class="number"> 257</span> <span class="k1">void</span> render<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 258</span> <span class="k1">void</span> inverseKinematics<span class="k2">(</span><span class="k1">float</span> targetX, <span class="k1">float</span> targetY, skl::Bone<span class="k3">*</span> targetBone<span class="k2">)</span>
<span class="number"> 259</span> <span class="k2">{</span>
<span class="number"> 260</span>
<span class="number"> 261</span>   std::string stopBone <span class="k3">=</span> <span class="s">"ROOT"</span><span class="k2">;</span>
<span class="number"> 262</span>   <span class="c">//===</span>
<span class="number"> 263</span>   <span class="c">// Track the end effector position (the final bone)</span>
<span class="number"> 264</span>   <span class="k1">double</span> endX <span class="k3">=</span> targetBone-&gt;getFrameX<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 265</span>   <span class="k1">double</span> endY <span class="k3">=</span> targetBone-&gt;getFrameY<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 266</span>
<span class="number"> 267</span>   <span class="c">//===</span>
<span class="number"> 268</span>   <span class="c">// Perform CCD on the bones by optimizing each bone in a loop </span>
<span class="number"> 269</span>   <span class="c">// from the final bone to the root bone</span>
<span class="number"> 270</span>   <span class="k1">bool</span> modifiedBones <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 271</span>
<span class="number"> 272</span>   <span class="k1">while</span><span class="k2">(</span>targetBone-&gt;getName<span class="k2">(</span><span class="k2">)</span> <span class="k3">!</span><span class="k3">=</span> stopBone<span class="k2">)</span>
<span class="number"> 273</span>   <span class="k2">{</span>
<span class="number"> 274</span>     <span class="c">// Get the vector from the current bone to the end effector position.</span>
<span class="number"> 275</span>     <span class="k1">double</span> curToEndX <span class="k3">=</span> endX <span class="k3">-</span> targetBone-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getFrameX<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 276</span>     <span class="k1">double</span> curToEndY <span class="k3">=</span> endY <span class="k3">-</span> targetBone-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getFrameY<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 277</span>     <span class="k1">double</span> curToEndMag <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span> curToEndX<span class="k3">*</span>curToEndX <span class="k3">+</span> curToEndY<span class="k3">*</span>curToEndY <span class="k2">)</span><span class="k2">;</span>
<span class="number"> 278</span>
<span class="number"> 279</span>     <span class="c">// Get the vector from the current bone to the target position.</span>
<span class="number"> 280</span>     <span class="k1">double</span> curToTargetX <span class="k3">=</span> targetX <span class="k3">-</span> targetBone-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getFrameX<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 281</span>     <span class="k1">double</span> curToTargetY <span class="k3">=</span> targetY <span class="k3">-</span> targetBone-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getFrameY<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 282</span>     <span class="k1">double</span> curToTargetMag <span class="k3">=</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_738.html" target="_blank">sqrt</a><span class="k2">(</span>   curToTargetX<span class="k3">*</span>curToTargetX
<span class="number"> 283</span>       <span class="k3">+</span> curToTargetY<span class="k3">*</span>curToTargetY <span class="k2">)</span><span class="k2">;</span>
<span class="number"> 284</span>
<span class="number"> 285</span>     <span class="c">// Get rotation to place the end effector on the line from the current</span>
<span class="number"> 286</span>     <span class="c">// joint position to the target position.</span>
<span class="number"> 287</span>     <span class="k1">double</span> cosRotAng<span class="k2">;</span>
<span class="number"> 288</span>     <span class="k1">double</span> sinRotAng<span class="k2">;</span>
<span class="number"> 289</span>     <span class="k1">double</span> endTargetMag <span class="k3">=</span> <span class="k2">(</span>curToEndMag<span class="k3">*</span>curToTargetMag<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 290</span>     <span class="k1">if</span><span class="k2">(</span> endTargetMag <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">0</span>.<span class="n">00001f</span> <span class="k2">)</span>
<span class="number"> 291</span>     <span class="k2">{</span>
<span class="number"> 292</span>       cosRotAng <span class="k3">=</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 293</span>       sinRotAng <span class="k3">=</span> <span class="n">0</span>.<span class="n">0f</span><span class="k2">;</span>
<span class="number"> 294</span>     <span class="k2">}</span>
<span class="number"> 295</span>     <span class="k1">else</span>
<span class="number"> 296</span>     <span class="k2">{</span>
<span class="number"> 297</span>       cosRotAng <span class="k3">=</span> <span class="k2">(</span>curToEndX<span class="k3">*</span>curToTargetX <span class="k3">+</span> curToEndY<span class="k3">*</span>curToTargetY<span class="k2">)</span> <span class="k3">/</span> endTargetMag<span class="k2">;</span>
<span class="number"> 298</span>       sinRotAng <span class="k3">=</span> <span class="k2">(</span>curToEndX<span class="k3">*</span>curToTargetY <span class="k3">-</span> curToEndY<span class="k3">*</span>curToTargetX<span class="k2">)</span> <span class="k3">/</span> endTargetMag<span class="k2">;</span>
<span class="number"> 299</span>     <span class="k2">}</span>
<span class="number"> 300</span>
<span class="number"> 301</span>     <span class="c">// Clamp the cosine into range when computing the angle (might be out of range</span>
<span class="number"> 302</span>     <span class="c">// due to floating point error).</span>
<span class="number"> 303</span>     <span class="k1">double</span> rotAng <span class="k3">=</span> acosf<span class="k2">(</span> max<span class="k2">(</span><span class="k3">-</span><span class="n">1</span>.<span class="n">0f</span>, min<span class="k2">(</span><span class="n">1</span>.<span class="n">0f</span>,cosRotAng<span class="k2">)</span> <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> sinRotAng <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0f</span> <span class="k2">)</span>
<span class="number"> 305</span>       rotAng <span class="k3">=</span> <span class="k3">-</span>rotAng<span class="k2">;</span>
<span class="number"> 306</span>
<span class="number"> 307</span>     <span class="k1">if</span><span class="k2">(</span>targetBone-&gt;getName<span class="k2">(</span><span class="k2">)</span> <span class="k3">=</span><span class="k3">=</span> <span class="s">"RFoot"</span><span class="k2">)</span>
<span class="number"> 308</span>     <span class="k2">{</span>
<span class="number"> 309</span>       <span class="k1">float</span> a <span class="k3">=</span> SimplifyAngle<span class="k2">(</span>targetBone-&gt;getAngle<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">+</span> SimplifyAngle<span class="k2">(</span>rotAng<span class="k2">)</span> <span class="k3">&gt;</span> <span class="n">3</span>.<span class="n">14f</span><span class="k2">;</span>
<span class="number"> 310</span>         <span class="k1">if</span> <span class="k2">(</span>a <span class="k3">&gt;</span> <span class="n">3</span>.<span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> a <span class="k3">&lt;</span><span class="k3">=</span> <span class="n">3</span>.<span class="n">14159</span><span class="k2">)</span>
<span class="number"> 311</span>           a <span class="k3">=</span> <span class="n">3</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 312</span>         <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>a <span class="k3">&gt;</span> <span class="n">3</span>.<span class="n">14159</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> a <span class="k3">&lt;</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span>
<span class="number"> 313</span>           a <span class="k3">=</span> <span class="n">0</span>.<span class="n">0</span><span class="k2">;</span>
<span class="number"> 314</span>
<span class="number"> 315</span>         rotAng <span class="k3">=</span> a <span class="k3">-</span> SimplifyAngle<span class="k2">(</span>targetBone-&gt;getAngle<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 316</span>
<span class="number"> 317</span>     <span class="k2">}</span>
<span class="number"> 318</span>     <span class="c">// Rotate the end effector position.</span>
<span class="number"> 319</span>     endX <span class="k3">=</span> targetBone-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getFrameX<span class="k2">(</span><span class="k2">)</span> <span class="k3">+</span> cosRotAng<span class="k3">*</span>curToEndX <span class="k3">-</span> sinRotAng<span class="k3">*</span>curToEndY<span class="k2">;</span>
<span class="number"> 320</span>     endY <span class="k3">=</span> targetBone-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getFrameY<span class="k2">(</span><span class="k2">)</span> <span class="k3">+</span> sinRotAng<span class="k3">*</span>curToEndX <span class="k3">+</span> cosRotAng<span class="k3">*</span>curToEndY<span class="k2">;</span>
<span class="number"> 321</span>
<span class="number"> 322</span>     <span class="c">// Rotate the current bone in local space (this value is output to the user)</span>
<span class="number"> 323</span>     targetBone-&gt;setAngle<span class="k2">(</span>SimplifyAngle<span class="k2">(</span>targetBone-&gt;getAngle<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">+</span> SimplifyAngle<span class="k2">(</span>rotAng<span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 324</span>
<span class="number"> 325</span>     <span class="c">// Check for termination</span>
<span class="number"> 326</span>     <span class="k1">double</span> endToTargetX <span class="k3">=</span> <span class="k2">(</span>targetX-endX<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 327</span>     <span class="k1">double</span> endToTargetY <span class="k3">=</span> <span class="k2">(</span>targetY-endY<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 328</span>  
<span class="number"> 329</span>
<span class="number"> 330</span>     <span class="c">// Track if the arc length that we moved the end effector was</span>
<span class="number"> 331</span>     <span class="c">// a nontrivial distance.</span>
<span class="number"> 332</span>     <span class="k1">if</span><span class="k2">(</span> <span class="k3">!</span>modifiedBones <span class="k3">&amp;</span><span class="k3">&amp;</span> <a href="http://www.delorie.com/djgpp/doc/libc/libc_303.html" target="_blank">fabs</a><span class="k2">(</span>rotAng<span class="k2">)</span><span class="k3">*</span>curToEndMag <span class="k3">&gt;</span> <span class="n">0</span>.<span class="n">0001f</span> <span class="k2">)</span>
<span class="number"> 333</span>     <span class="k2">{</span>
<span class="number"> 334</span>       modifiedBones <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 335</span>     <span class="k2">}</span>
<span class="number"> 336</span>
<span class="number"> 337</span>     targetBone <span class="k3">=</span> targetBone-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 338</span>   <span class="k2">}</span>
<span class="number"> 339</span>
<span class="number"> 340</span>   
<span class="number"> 341</span> <span class="k2">}</span>
<span class="number"> 342</span>
<span class="number"> 343</span><span class="k1">void</span> render<span class="k2">(</span><span class="k2">)</span>
<span class="number"> 344</span><span class="k2">{</span>
<span class="number"> 345</span>
<span class="number"> 346</span>
<span class="number"> 347</span>  <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>backbuffer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 348</span>
<span class="number"> 349</span>     <span class="k1">double</span> now, diff<span class="k2">;</span>
<span class="number"> 350</span> 
<span class="number"> 351</span>      now <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 352</span>      diff <span class="k3">=</span> now <span class="k3">-</span> start<span class="k2">;</span>
<span class="number"> 353</span>      start <span class="k3">=</span> now<span class="k2">;</span>
<span class="number"> 354</span>      ratio <span class="k3">+</span><span class="k3">=</span> diff <span class="k3">*</span> <span class="n">0</span>.<span class="n">5</span> <span class="k3">*</span> dir<span class="k2">;</span>
<span class="number"> 355</span>      <span class="k1">if</span> <span class="k2">(</span>dir <span class="k3">&lt;</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ratio <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 356</span>         ratio <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 357</span>         dir <span class="k3">=</span> <span class="k3">-</span>dir<span class="k2">;</span>
<span class="number"> 358</span>      <span class="k2">}</span>
<span class="number"> 359</span>      <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>dir <span class="k3">&gt;</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ratio <span class="k3">&gt;</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 360</span>         ratio <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 361</span>         dir <span class="k3">=</span> <span class="k3">-</span>dir<span class="k2">;</span>
<span class="number"> 362</span>      <span class="k2">}</span>
<span class="number"> 363</span>
<span class="number"> 364</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">240</span>,<span class="n">240</span>,<span class="n">240</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 365</span>
<span class="number"> 366</span>    skeleton.processAnimation<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 367</span>    skeleton.updateBones<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 368</span>
<span class="number"> 369</span>    renderSkeleton<span class="k2">(</span>skeleton.getRoot<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 370</span>
<span class="number"> 371</span>     glUseProgramObjectARB<span class="k2">(</span>tinter<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 372</span>
<span class="number"> 373</span>    <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_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><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 374</span>  <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>backbuffer,<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="number"> 375</span>   glUseProgramObjectARB<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 376</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"> 377</span>
<span class="number"> 378</span>    
<span class="number"> 379</span>
<span class="number"> 380</span>
<span class="number"> 381</span><span class="k2">}</span>
<span class="number"> 382</span>
<span class="number"> 383</span>
<span class="number"> 384</span><span class="k1">int</span> main<span class="k2">(</span><span class="k1">int</span> argc, <span class="k1">char</span> <span class="k3">*</span>argv<span class="k2">[</span><span class="k2">]</span><span class="k2">)</span>
<span class="number"> 385</span>
<span class="number"> 386</span><span class="k2">{</span>
<span class="number"> 387</span>  initializeAllegro<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 388</span>  buildSkeleton<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 389</span>
<span class="number"> 390</span>  glUseProgramObjectARB<span class="k2">(</span>tinter<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 391</span>  loc <span class="k3">=</span> glGetUniformLocationARB<span class="k2">(</span>tinter, <span class="s">"resolution"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 392</span>  glUniform2fARB<span class="k2">(</span>loc, <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>,
<span class="number"> 393</span>    <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/al_get_display_height"><span class="a">al_get_display_height</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 394</span>
<span class="number"> 395</span>  start <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 396</span>
<span class="number"> 397</span>  <span class="k1">bool</span> needRedraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 398</span>  <span class="c">// Start the event queue to handle keyboard input, mouse and our timer</span>
<span class="number"> 399</span>  
<span class="number"> 400</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>queue, <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_SOURCE"><span class="a">ALLEGRO_EVENT_SOURCE</span></a><span class="k3">*</span><span class="k2">)</span><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"> 401</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>queue, <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_SOURCE"><span class="a">ALLEGRO_EVENT_SOURCE</span></a><span class="k3">*</span><span class="k2">)</span><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"> 402</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>queue, <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_SOURCE"><span class="a">ALLEGRO_EVENT_SOURCE</span></a><span class="k3">*</span><span class="k2">)</span>timer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 403</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>queue, <span class="k2">(</span><a href="http://www.allegro.cc/manual/ALLEGRO_EVENT_SOURCE"><span class="a">ALLEGRO_EVENT_SOURCE</span></a><span class="k3">*</span><span class="k2">)</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 404</span>
<span class="number"> 405</span>  <span class="k1">while</span><span class="k2">(</span><span class="k3">!</span>done<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 406</span>  
<span class="number"> 407</span>    <span class="c">// Block until an event enters the queue</span>
<span class="number"> 408</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>queue, <span class="k3">&amp;</span>event<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 409</span>
<span class="number"> 410</span>    <span class="c">//Handle rendering and logic</span>
<span class="number"> 411</span>    <span class="k1">if</span> <span class="k2">(</span>needRedraw <span class="k3">&amp;</span><span class="k3">&amp;</span> al_event_queue_is_empty<span class="k2">(</span>queue<span class="k2">)</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 412</span>      render<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 413</span>      
<span class="number"> 414</span>
<span class="number"> 415</span>      needRedraw <span class="k3">=</span> <span class="k1">false</span><span class="k2">;</span>
<span class="number"> 416</span>    <span class="k2">}</span>
<span class="number"> 417</span>
<span class="number"> 418</span>    
<span class="number"> 419</span>    <span class="k1">switch</span><span class="k2">(</span>event.type<span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 420</span>    
<span class="number"> 421</span>  <span class="k1">case</span> ALLEGRO_EVENT_TIMER:
<span class="number"> 422</span>    <span class="k1">if</span><span class="k2">(</span>event.timer.source <span class="k3">=</span><span class="k3">=</span> timer<span class="k2">)</span>
<span class="number"> 423</span>    <span class="k2">{</span>
<span class="number"> 424</span>
<span class="number"> 425</span>      needRedraw <span class="k3">=</span> <span class="k1">true</span><span class="k2">;</span>
<span class="number"> 426</span>    <span class="k2">}</span>
<span class="number"> 427</span>    
<span class="number"> 428</span>    <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 429</span>  <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_RESIZE:
<span class="number"> 430</span>
<span class="number"> 431</span>    <a href="http://www.allegro.cc/manual/al_acknowledge_resize"><span class="a">al_acknowledge_resize</span></a><span class="k2">(</span>event.display.source<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 432</span>    resizeBackBufferToDisplay<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 433</span>    <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_bitmap</span></a><span class="k2">(</span>backbuffer<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 434</span>
<span class="number"> 435</span>    <span class="k1">double</span> now, diff<span class="k2">;</span>
<span class="number"> 436</span>
<span class="number"> 437</span>    now <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_time"><span class="a">al_get_time</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 438</span>    diff <span class="k3">=</span> now <span class="k3">-</span> start<span class="k2">;</span>
<span class="number"> 439</span>    start <span class="k3">=</span> now<span class="k2">;</span>
<span class="number"> 440</span>    ratio <span class="k3">+</span><span class="k3">=</span> diff <span class="k3">*</span> <span class="n">0</span>.<span class="n">5</span> <span class="k3">*</span> dir<span class="k2">;</span>
<span class="number"> 441</span>    <span class="k1">if</span> <span class="k2">(</span>dir <span class="k3">&lt;</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ratio <span class="k3">&lt;</span> <span class="n">0</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 442</span>      ratio <span class="k3">=</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 443</span>      dir <span class="k3">=</span> <span class="k3">-</span>dir<span class="k2">;</span>
<span class="number"> 444</span>    <span class="k2">}</span>
<span class="number"> 445</span>    <span class="k1">else</span> <span class="k1">if</span> <span class="k2">(</span>dir <span class="k3">&gt;</span> <span class="n">0</span> <span class="k3">&amp;</span><span class="k3">&amp;</span> ratio <span class="k3">&gt;</span> <span class="n">1</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 446</span>      ratio <span class="k3">=</span> <span class="n">1</span><span class="k2">;</span>
<span class="number"> 447</span>      dir <span class="k3">=</span> <span class="k3">-</span>dir<span class="k2">;</span>
<span class="number"> 448</span>    <span class="k2">}</span>
<span class="number"> 449</span>
<span class="number"> 450</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">240</span>,<span class="n">240</span>,<span class="n">240</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 451</span>
<span class="number"> 452</span>    skeleton.processAnimation<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 453</span>    skeleton.updateBones<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 454</span>
<span class="number"> 455</span>    renderSkeleton<span class="k2">(</span>skeleton.getRoot<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 456</span>
<span class="number"> 457</span>
<span class="number"> 458</span>
<span class="number"> 459</span>    <a href="http://www.allegro.cc/manual/al_set_target_bitmap"><span class="a">al_set_target_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><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 460</span>
<span class="number"> 461</span>    glUseProgramObjectARB<span class="k2">(</span>tinter<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 462</span>    loc <span class="k3">=</span> glGetUniformLocationARB<span class="k2">(</span>tinter, <span class="s">"resolution"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 463</span>    glUniform2fARB<span class="k2">(</span>loc, <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>,
<span class="number"> 464</span>      <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/al_get_display_height"><span class="a">al_get_display_height</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 465</span>
<span class="number"> 466</span>    <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>backbuffer,<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="number"> 467</span>    glUseProgramObjectARB<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 468</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"> 469</span>
<span class="number"> 470</span>    
<span class="number"> 471</span>    <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 472</span>  <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_SWITCH_IN:
<span class="number"> 473</span>    resizeBackBufferToDisplay<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 474</span>    <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 475</span>  <span class="k1">case</span> ALLEGRO_EVENT_MOUSE_BUTTON_DOWN:
<span class="number"> 476</span>    mouseX <span class="k3">=</span> event.mouse.x<span class="k2">;</span>
<span class="number"> 477</span>    mouseY <span class="k3">=</span> event.mouse.y<span class="k2">;</span>
<span class="number"> 478</span>    startX <span class="k3">=</span> mouseX<span class="k2">;</span>
<span class="number"> 479</span>    startY <span class="k3">=</span> mouseY<span class="k2">;</span>
<span class="number"> 480</span>    boneUnderMouse <span class="k3">=</span> findBone<span class="k2">(</span><span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>mouseX,<span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>mouseY,skeleton.getRoot<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 481</span>    <span class="k1">if</span><span class="k2">(</span>boneUnderMouse<span class="k2">)</span>
<span class="number"> 482</span>    <span class="k2">{</span>
<span class="number"> 483</span>      <span class="k1">if</span><span class="k2">(</span>boneUnderMouse-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k2">)</span>
<span class="number"> 484</span>      <span class="k2">{</span>
<span class="number"> 485</span>        startX <span class="k3">=</span> boneUnderMouse-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getFrameX<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 486</span>        startY <span class="k3">=</span> boneUnderMouse-&gt;getParent<span class="k2">(</span><span class="k2">)</span><span class="k3">-</span><span class="k3">&gt;</span>getFrameY<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 487</span>      <span class="k2">}</span>
<span class="number"> 488</span>      startAngle <span class="k3">=</span> boneUnderMouse-&gt;getAngle<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 489</span>      realStartAngle <span class="k3">=</span> boneUnderMouse-&gt;getFrameAngle<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 490</span>    <span class="k2">}</span>
<span class="number"> 491</span>
<span class="number"> 492</span>  
<span class="number"> 493</span>    <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 494</span>  <span class="k1">case</span> ALLEGRO_EVENT_MOUSE_AXES:
<span class="number"> 495</span>    
<span class="number"> 496</span>    
<span class="number"> 497</span>
<span class="number"> 498</span>    <span class="k1">if</span><span class="k2">(</span>boneUnderMouse<span class="k2">)</span>
<span class="number"> 499</span>    <span class="k2">{</span>
<span class="number"> 500</span>      <span class="c">/*boneUnderMouse-&gt;setAngle(boneUnderMouse-&gt;getAngle() - boneUnderMouse-&gt;getFrameAngle() + (atan2((float)startY - </span>
<span class="number"> 501</span><span class="c">        event.mouse.y,startX - event.mouse.x)) + 3.1415f );*/</span>
<span class="number"> 502</span>      solver.solve<span class="k2">(</span>
<span class="number"> 503</span>        <span class="k3">&amp;</span>skeleton,boneUnderMouse,<span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>event.mouse.x,<span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>event.mouse.y<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 504</span>      skeleton.updateBones<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 505</span>      <span class="c">//skeleton.save("Skeleton.txt");</span>
<span class="number"> 506</span>    <span class="k2">}</span>
<span class="number"> 507</span>    mouseXF <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>event.mouse.x <span class="k3">/</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_display_width"><span class="a">al_get_display_width</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">+</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 508</span>    mouseYF <span class="k3">=</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>event.mouse.y <span class="k3">/</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_display_height"><span class="a">al_get_display_height</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span> <span class="k3">+</span> <span class="n">1</span>.<span class="n">0f</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 509</span>    glUseProgramObjectARB<span class="k2">(</span>tinter<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 510</span>    loc <span class="k3">=</span> glGetUniformLocationARB<span class="k2">(</span>tinter,<span class="s">"mouse"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 511</span>    glUniform2fARB<span class="k2">(</span>loc,<span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>event.mouse.x,<span class="k2">(</span><span class="k1">float</span><span class="k2">)</span>event.mouse.y <span class="k3">/</span> <span class="k2">(</span><span class="k1">float</span><span class="k2">)</span><a href="http://www.allegro.cc/manual/al_get_display_height"><span class="a">al_get_display_height</span></a><span class="k2">(</span><a href="http://www.allegro.cc/manual/al_get_current_display"><span class="a">al_get_current_display</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 512</span>
<span class="number"> 513</span>  glUseProgramObjectARB<span class="k2">(</span><span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 514</span>    <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 515</span>  <span class="k1">case</span> ALLEGRO_EVENT_MOUSE_BUTTON_UP:
<span class="number"> 516</span>  boneUnderMouse <span class="k3">=</span> NULL<span class="k2">;</span>
<span class="number"> 517</span>    <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 518</span>  <span class="k1">case</span> ALLEGRO_EVENT_DISPLAY_CLOSE:
<span class="number"> 519</span>    <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 520</span>    <span class="k1">break</span><span class="k2">;</span>
<span class="number"> 521</span>    <span class="k2">}</span>
<span class="number"> 522</span>  <span class="k2">}</span>
<span class="number"> 523</span>
<span class="number"> 524</span>  <span class="k1">return</span> <span class="n">0</span><span class="k2">;</span>
<span class="number"> 525</span><span class="k2">}</span>
</div></div><p>

Thanks for testing.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Thu, 09 Jun 2011 22:22:35 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Can you include all the source that&#39;s needed to compile it? Have you tried profiling it to see where most time is spent? It seems to take around 100% cpu most of the time here.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Thu, 09 Jun 2011 23:00:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here is the source code for my SKALE API thus far, it is meant to be compiled with MSVC. Thanks
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Thu, 09 Jun 2011 23:16:00 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Sorry, don&#39;t have an Allegro+MSVC environment set up. Will it compile with MinGW?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Thu, 09 Jun 2011 23:41:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It uses std::exception with a constructor which is non standard, (for now) and you need to add an include directory of the solution dir since I use &quot;SKALE/blah...&quot; Other than that it should build in g++ / mingw
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Thu, 09 Jun 2011 23:45:58 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I get a whole bunch of errors:</p><pre>

In file included from Animation.hpp:4,
                 from Animation.cpp:1:
../SKALE/KeyFrame.hpp:7: error: ‘size_t’ does not name a type
../SKALE/KeyFrame.hpp:9: error: ‘size_t’ has not been declared
../SKALE/KeyFrame.hpp:12: error: ISO C++ forbids declaration of ‘size_t’ with no type
../SKALE/KeyFrame.hpp:12: error: expected ‘;’ before ‘&amp;’ token
In file included from Bone.cpp:1:
../SKALE/Bone.hpp:19: error: field ‘mName’ has incomplete type
../SKALE/Bone.hpp:42: error: default argument for parameter of type ‘const std::string&amp;’ has type ‘const char [1]’
Bone.cpp: In constructor ‘skl::Bone::Bone(float, float, float, float, float, float, bool, const std::string&amp;, skl::Bone*)’:
Bone.cpp:15: error: class ‘skl::Bone’ does not have any field named ‘mName’
Bone.cpp: In member function ‘const std::string&amp; skl::Bone::getName() const’:
Bone.cpp:149: error: ‘mName’ was not declared in this scope
Bone.cpp: In member function ‘void skl::Bone::setName(const std::string&amp;)’:
Bone.cpp:186: error: ‘mName’ was not declared in this scope
/usr/include/c++/4.2.1/bits/stl_algo.h: In function ‘const _Tp&amp; std::__median(const _Tp&amp;, const _Tp&amp;, const _Tp&amp;) [with _Tp = KeyFrame]’:
/usr/include/c++/4.2.1/bits/stl_algo.h:2758:   instantiated from ‘void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator&lt;KeyFrame*, std::vector&lt;KeyFrame, std::allocator&lt;KeyFrame&gt; &gt; &gt;, _Size = long int]’
/usr/include/c++/4.2.1/bits/stl_algo.h:2829:   instantiated from ‘void std::sort(_RandomAccessIterator, _RandomAccessIterator) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator&lt;KeyFrame*, std::vector&lt;KeyFrame, std::allocator&lt;KeyFrame&gt; &gt; &gt;]’
Bone.cpp:200:   instantiated from here
/usr/include/c++/4.2.1/bits/stl_algo.h:91: error: passing ‘const KeyFrame’ as ‘this’ argument of ‘bool KeyFrame::operator&lt;(const KeyFrame&amp;)’ discards qualifiers
/usr/include/c++/4.2.1/bits/stl_algo.h:92: error: passing ‘const KeyFrame’ as ‘this’ argument of ‘bool KeyFrame::operator&lt;(const KeyFrame&amp;)’ discards qualifiers
/usr/include/c++/4.2.1/bits/stl_algo.h:94: error: passing ‘const KeyFrame’ as ‘this’ argument of ‘bool KeyFrame::operator&lt;(const KeyFrame&amp;)’ discards qualifiers
/usr/include/c++/4.2.1/bits/stl_algo.h:98: error: passing ‘const KeyFrame’ as ‘this’ argument of ‘bool KeyFrame::operator&lt;(const KeyFrame&amp;)’ discards qualifiers
/usr/include/c++/4.2.1/bits/stl_algo.h:100: error: passing ‘const KeyFrame’ as ‘this’ argument of ‘bool KeyFrame::operator&lt;(const KeyFrame&amp;)’ discards qualifiers
In file included from ../SKALE/IKSolver.hpp:4,
                 from IKSolver.cpp:1:
../SKALE/Bone.hpp:19: error: field ‘mName’ has incomplete type
../SKALE/Bone.hpp:42: error: default argument for parameter of type ‘const std::string&amp;’ has type ‘const char [1]’
In file included from KeyFrame.cpp:1:
KeyFrame.hpp:7: error: ‘size_t’ does not name a type
KeyFrame.hpp:9: error: ‘size_t’ has not been declared
KeyFrame.hpp:12: error: ISO C++ forbids declaration of ‘size_t’ with no type
KeyFrame.hpp:12: error: expected ‘;’ before ‘&amp;’ token
KeyFrame.cpp:4: error: ‘size_t’ has not been declared
KeyFrame.cpp: In constructor ‘KeyFrame::KeyFrame(float, int)’:
KeyFrame.cpp:5: error: class ‘KeyFrame’ does not have any field named ‘mFrame’
KeyFrame.cpp: At global scope:
KeyFrame.cpp:20: error: expected initializer before ‘&amp;’ token
KeyFrame.cpp: In member function ‘bool KeyFrame::operator&lt;(const KeyFrame&amp;)’:
KeyFrame.cpp:27: error: ‘getFrame’ was not declared in this scope
KeyFrame.cpp:27: error: ‘const class KeyFrame’ has no member named ‘getFrame’
In file included from Skeleton.hpp:4,
                 from Skeleton.cpp:1:
../SKALE/Bone.hpp:19: error: field ‘mName’ has incomplete type
../SKALE/Bone.hpp:42: error: default argument for parameter of type ‘const std::string&amp;’ has type ‘const char [1]’
/usr/include/c++/4.2.1/bits/ios_base.h: In copy constructor ‘std::basic_ios&lt;char, std::char_traits&lt;char&gt; &gt;::basic_ios(const std::basic_ios&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’:
/usr/include/c++/4.2.1/bits/ios_base.h:779: error: ‘std::ios_base::ios_base(const std::ios_base&amp;)’ is private
/usr/include/c++/4.2.1/iosfwd:55: error: within this context
/usr/include/c++/4.2.1/iosfwd: In copy constructor ‘std::basic_ofstream&lt;char, std::char_traits&lt;char&gt; &gt;::basic_ofstream(const std::basic_ofstream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’:
/usr/include/c++/4.2.1/iosfwd:92: note: synthesized method ‘std::basic_ios&lt;char, std::char_traits&lt;char&gt; &gt;::basic_ios(const std::basic_ios&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’ first required here 
/usr/include/c++/4.2.1/streambuf: In copy constructor ‘std::basic_filebuf&lt;char, std::char_traits&lt;char&gt; &gt;::basic_filebuf(const std::basic_filebuf&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’:
/usr/include/c++/4.2.1/streambuf:794: error: ‘std::basic_streambuf&lt;_CharT, _Traits&gt;::basic_streambuf(const std::basic_streambuf&lt;_CharT, _Traits&gt;&amp;) [with _CharT = char, _Traits = std::char_traits&lt;char&gt;]’ is private
/usr/include/c++/4.2.1/iosfwd:86: error: within this context
/usr/include/c++/4.2.1/iosfwd: In copy constructor ‘std::basic_ofstream&lt;char, std::char_traits&lt;char&gt; &gt;::basic_ofstream(const std::basic_ofstream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’:
/usr/include/c++/4.2.1/iosfwd:92: note: synthesized method ‘std::basic_filebuf&lt;char, std::char_traits&lt;char&gt; &gt;::basic_filebuf(const std::basic_filebuf&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’ first required here 
Skeleton.cpp: In member function ‘bool skl::Skeleton::save(const std::string&amp;) const’:
Skeleton.cpp:138: note: synthesized method ‘std::basic_ofstream&lt;char, std::char_traits&lt;char&gt; &gt;::basic_ofstream(const std::basic_ofstream&lt;char, std::char_traits&lt;char&gt; &gt;&amp;)’ first required here 
Skeleton.cpp: In member function ‘bool skl::Skeleton::_sortLinesByLevel(std::vector&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt;, std::allocator&lt;std::basic_string&lt;char, std::char_traits&lt;char&gt;, std::allocator&lt;char&gt; &gt; &gt; &gt;&amp;, std::vector&lt;std::pair&lt;int, std::string*&gt;, std::allocator&lt;std::pair&lt;int, std::string*&gt; &gt; &gt;&amp;)’:
Skeleton.cpp:345: warning: NULL used in arithmetic
</pre><p>

No time to dig into it right now. Can you at least build me a d3d version of the exe so I can see if it&#39;s any better?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 10 Jun 2011 00:02:55 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Here is the D3D version (no shader)<br />Thanks
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 10 Jun 2011 00:10:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well that&#39;s a VERY apples and oranges test. The GL version has a bunch of shaders and the d3d version is just drawing a man shaped rope. I can&#39;t come to any conclusion with just that. I&#39;d say port your shaders to HLSL and try it, it&#39;s not much different from GLSL. Or use Cg.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 10 Jun 2011 01:12:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well right now, I just compiled ex_bitmap with D3D, and one with OpenGL and the OpenGL version clearly takes much more cpu and fluctuates in cpu usage. I checked in Process Explorer and there is a clear fluctuation in the GL version. In a game like M.A.R.S (<a href="http://mars-game.sourceforge.net/">http://mars-game.sourceforge.net/</a>) (Which uses pure OpenGL and shaders) on my laptop, there is no fluctuation.</p><p>Also profiling all my executables reveals that 95% of the time is spent in al_wait_for_event()
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 10 Jun 2011 01:29:17 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I can&#39;t reproduce it here with ex_bitmap. It&#39;s the same, 0-2% with both OpenGL and Direct3D. I tried with Aero on and off and it&#39;s the same. What type of percentages are you seeing for ex_bitmap?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 10 Jun 2011 02:08:32 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>With D3D:<br />1, 2, 1, 1, 1, 2, 1, 2, 1, 1, 1</p><p>With al_set_new_display_flags(ALLEGRO_OPENGL):</p><p>5, 6, 5, 6, 51, 39, 23, 16, 5, 6, 27, 39, 17, 6, 5
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 10 Jun 2011 02:21:51 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Have you checked for a driver update for your card recently?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 10 Jun 2011 02:23:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Those are pretty crazy numbers. Do you have some strange OpenGL settings in your gfx card settings panel?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 10 Jun 2011 02:25:34 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I updated to the latest ones this morning. I should note though, that on ex_bitmap I did bring the frame rate from 30 to 60, this seems to make a difference.</p><p>Actually, on my game, lowering the frame rate to 30 frames per second fixes the problem. I&#39;m confused now.</p><p>So at 60 frames per second, GL fluctuates like mad, but at 30 it is totally stable.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 10 Jun 2011 02:25:43 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Any background crap running? Including windows updates and crap?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Thomas Fjellstrom)</author>
		<pubDate>Fri, 10 Jun 2011 02:49:54 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Nope, I tried rebooting, killing several processes, this behavior is consistent. Changing the timer from 1.0f / 60.0f to 1.0f / 30.0f makes it stable. All of them are like this.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 10 Jun 2011 02:53:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What happens if you, say, bump it to 100fps, keep record of fps. After 10 seconds is it running @ full 100fps?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 10 Jun 2011 03:10:31 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/607562/920744#target">jmasterx</a> said:</div><div class="quote"><p>  it causes the cpu usage to fluctuate quite a bit compared to Direct3D.</p></div></div><p>It occurs to me that you might be seeing some type of aliasing (google Nyquist frequency and moire patterns).  If you can tweak either the loop speed of your program or the update period of Process Explorer.</p><p>[EDIT]</p><p>I was going to post this an hour ago but canceled, the reply box offered to put it back.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Arthur Kalliokoski)</author>
		<pubDate>Fri, 10 Jun 2011 03:13:45 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>When I set it to 100 fps, I get around 62fps and 100% (both cores!) cpu usage. When I lower to &lt; 60, I get that desired frame rate.</p><p>In D3D I get my 100fps no problem.</p><p>On my PC with a GTA 275 it still uses 100% and only 60 fps. (supposed to be getting 100 fps)</p><p>I attached it if you want to try.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 10 Jun 2011 03:23:23 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Can you see if vsync is force enabled in your opengl settings and try to turn it off?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 10 Jun 2011 03:34:33 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>It was not force enabled, it said it was going based on the 3D application settings, but setting it to force off solved the problem. Still though, why didn&#39;t other GL games give me this problem?</p><p>Oh and thanks again to everyone who helped me get to the bottom of this!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 10 Jun 2011 03:37:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m not sure. Did you mention what version of Windows you&#39;re using? I&#39;m on Windows 7 64 bit. I have the same gpu and even forcing vsync on I don&#39;t see any fluctuation.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 10 Jun 2011 03:42:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Windows 7 32 bit on Laptop</p><p>Driver Version is 275.33</p><p>on PC it is 64 bit with a GTX 275 ad has an i7 @ 3.0 GHz.</p><p>Both machines have the latest drivers. </p><p>If I force on for either of them, the problem comes right back.</p><p>Edit: Now the M.A.R.S game has the complete opposite behavior. When I force off, it shoots to 50%, when I force on, it is normal around 15%.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 10 Jun 2011 03:44:48 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The latter behaviour (of M.A.R.S) makes sense. The Allegro behaviour doesn&#39;t. I have this fuzzy memory of someone talking about vsync using up mad CPU but I don&#39;t remember who it was or all the details. But it&#39;s not happening with M.A.R.S so that makes it a little strange... It&#39;s possible the Windows code does something strange with Vsync, I can have a look at it but I&#39;ve never messed around with WGL.</p><p>EDIT: The WGL display driver has no mention of &quot;vsync&quot; or even &quot;sync&quot; anywhere. I&#39;ll look into it tonight if I can. But maybe someone else has a better idea already how vsync works on WGL?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 10 Jun 2011 04:01:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>This could be useful:</p><p><a href="http://stackoverflow.com/questions/589064/how-to-enable-vertical-sync-in-opengl">http://stackoverflow.com/questions/589064/how-to-enable-vertical-sync-in-opengl</a></p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p>If you are working on Windows you have to use extensions to use wglSwapIntervalExt function. It is defined in wglext.h. You will also want to download glext.h file. In wglext file all entry points for Windows specific extensions are declared. All such functions start with prefix wgl. To get more info about all published extensions you can look into OpenGL Extension Registry.</p><p>wglSwapIntervalEXT is from WGL_EXT_swap_control extension. It lets you specify minimum number of frames before each buffer swap. Usually it is used for vertical synchronization (if you set swap interval to 1). More info about whole extension can be found here. Before using this function you need query whether you card has support for WGL_EXT_swap_control and then obtain pointer to the function using wglGetProcAddress function.</p></div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 10 Jun 2011 04:30:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thanks. Should be very easy to enable/disable vsync with this function. Allegro&#39;s extension handling already loads wglSwapIntervalEXT if it&#39;s supported, so it&#39;s just a matter of calling it if it&#39;s available (Allegro can check if extensions are available very easily too) with 1 or 0 depending on if the user requests it to be off or on (I think on should be the default). Don&#39;t know if it would make a difference in your case but it&#39;s worth a try.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 10 Jun 2011 04:58:30 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Nice!!!</p><p>Calling wglSwapIntervalEXT(0); after creating the display totally solves the problem, so I think Allegro is missing this and I&#39;m sure committing this change will solve this issue!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 10 Jun 2011 07:15:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Well it&#39;s more complicated than that, but I just committed a patch to 5.1 that makes WGL honor the ALLEGRO_VSYNC display option. So it should work for you to force it off or on.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 10 Jun 2011 07:21:19 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Great thanks!</p><p>I was also wondering if it was normal that I can render a lot more bitmaps with D3D. I made a test and rendering 20x20 bitmaps in OpenGL consumed around 60% while it was only about 12% in D3D.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 10 Jun 2011 07:35:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>On some hardware that is normal. Can you give me another simple compilable example, or does ex_draw_bitmap do the same thing, and I can test that?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Trent Gamblin)</author>
		<pubDate>Fri, 10 Jun 2011 07:41:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>If you add a for loop of 400 it should do it.</p><p>D3D: 5%<br />GL: 30%</p><p>But once again, the big differences come when this example runs at 60 fps, I also added the swapinternal function.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (jmasterx)</author>
		<pubDate>Fri, 10 Jun 2011 07:47:00 +0000</pubDate>
	</item>
</rss>
