<?xml version="1.0"?>
<rss version="2.0">
	<channel>
		<title>[A5] Trying to understand transformations</title>
		<link>http://www.allegro.cc/forums/view/617194</link>
		<description>Allegro.cc Forum Thread</description>
		<webMaster>matthew@allegro.cc (Matthew Leverton)</webMaster>
		<lastBuildDate>Sat, 30 Dec 2017 06:03:36 +0000</lastBuildDate>
	</channel>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m trying to work with Allegro 5 transformations but I&#39;m struggling to understand how they work. Maybe I&#39;m just getting it all wrong so I wrote a couple code samples. </p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">  3</span>
<span class="number">  4</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">  5</span><a href="http://www.allegro.cc/manual/ALLEGRO_TRANSFORM"><span class="a">ALLEGRO_TRANSFORM</span></a> t<span class="k2">;</span>
<span class="number">  6</span>
<span class="number">  7</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number">  8</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</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="k2">;</span>
<span class="number">  9</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</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="k2">;</span>
<span class="number"> 10</span>
<span class="number"> 11</span>    <span class="k1">uint32_t</span> version <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_allegro_version"><span class="a">al_get_allegro_version</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Allegro version: %d.%d.%d\n"</span>, version <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">24</span>, <span class="k2">(</span>version <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">16</span><span class="k2">)</span> <span class="k3">&amp;</span> <span class="n">255</span>, <span class="k2">(</span>version <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">8</span><span class="k2">)</span> <span class="k3">&amp;</span> <span class="n">255</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</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">800</span>, <span class="n">600</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</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="k2">;</span>
<span class="number"> 16</span>
<span class="number"> 17</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">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>    <a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>    <a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, <span class="n">400</span>, <span class="n">400</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>    <a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, .<span class="n">5</span>, .<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 21</span>    <a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 22</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">400</span>, <span class="n">400</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="k2">)</span><span class="k2">;</span>
<span class="number"> 23</span>    <a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, .<span class="n">5</span>, .<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>    <a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 25</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">400</span>, <span class="n">400</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">255</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 26</span>    <a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, .<span class="n">5</span>, .<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 27</span>    <a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 28</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">400</span>, <span class="n">400</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 29</span>    <a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, <span class="n">400</span>, <span class="n">400</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 30</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"> 31</span>    <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 32</span><span class="k2">}</span>
</div></div><p>

For the previous code this is what I get vs. what I&#39;d expect:<br /><span class="remote-thumbnail"><span class="json">{"name":"611169","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/e\/d\/ede6f44fc3e93134343ee41009defbe9.png","w":1524,"h":378,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/e\/d\/ede6f44fc3e93134343ee41009defbe9"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/e/d/ede6f44fc3e93134343ee41009defbe9-240.jpg" alt="611169" width="240" height="59" /></span></p><p>If instead I use the following code:</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>    <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">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  2</span>    <a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number">  3</span>    <a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, <span class="n">400</span>, <span class="n">400</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  4</span>    <a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, .<span class="n">5</span>, .<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  5</span>    <a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">400</span>, <span class="n">400</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="k2">)</span><span class="k2">;</span>
<span class="number">  7</span>    <a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, <span class="n">200</span>, <span class="n">200</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>    <a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, .<span class="n">5</span>, .<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  9</span>    <a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 10</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">400</span>, <span class="n">400</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">255</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span>    <a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, <span class="n">200</span>, <span class="n">200</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span>    <a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, .<span class="n">5</span>, .<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>    <a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 14</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">400</span>, <span class="n">400</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 15</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"> 16</span>    <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
</div></div><p>

<span class="remote-thumbnail"><span class="json">{"name":"611170","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/9\/3\/934e0a438a9a35741a7fbb6c2e9c494a.png","w":1524,"h":378,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/9\/3\/934e0a438a9a35741a7fbb6c2e9c494a"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/9/3/934e0a438a9a35741a7fbb6c2e9c494a-240.jpg" alt="611170" width="240" height="59" /></span></p><p>So, what am I doing wrong here?.</p><p>Thanks.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Thu, 28 Dec 2017 09:37:22 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Allegro&#39;s transformations work backwards compared to OpenGL, so:</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, <span class="n">400</span>, <span class="n">400</span><span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, .<span class="n">5</span>, .<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Line 1 means take the passed transformation and move the result by 400/400. (The rectangle is drawn at 400/400, at full size.)</p><p>Line 2 means take the passed transformation and scale it by 0.5/0.5. (The rectangle is drawn at 200/200, at half size.)</p><div class="source-code snippet"><div class="inner"><pre><a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, .<span class="n">5</span>, .<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, <span class="n">400</span>, <span class="n">400</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Line 1 means take the passed transformation and scale it by 0.5/0.5. (The rectangle is drawn at 0/0, at half size.)</p><p>Line 2 means take the passed transformation and move the result by 400/400. (The rectangle is drawn at 400/400, at half size.)</p><p>Personally what I do is (from memory):</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><a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
<span class="number">  2</span>
<span class="number">  3</span>...
<span class="number">  4</span>
<span class="number">  5</span><a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>temp<span class="k2">)</span><span class="k2">;</span>
<span class="number">  6</span><a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>temp, <span class="n">400</span>, <span class="n">400</span><span class="k2">)</span><span class="k2">;</span>
<span class="number">  7</span><a href="http://www.allegro.cc/manual/al_compose_transform"><span class="a">al_compose_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>temp, t<span class="k2">)</span><span class="k2">;</span>
<span class="number">  8</span>t <span class="k3">=</span> temp<span class="k2">;</span>
<span class="number">  9</span>
<span class="number"> 10</span><a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>temp<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 11</span><a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>temp, .<span class="n">5</span>, .<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 12</span><a href="http://www.allegro.cc/manual/al_compose_transform"><span class="a">al_compose_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>temp, t<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 13</span>t <span class="k3">=</span> temp<span class="k2">;</span>
<span class="number"> 14</span>
<span class="number"> 15</span>...
</div></div><p>

That now should work as expected. Alternatively, when reading the transformations, just read them in the wrong order, starting at the last one instead of first one - and it should have the expected result!
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Thu, 28 Dec 2017 19:01:12 +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/617194/1034119#target">Elias</a> said:</div><div class="quote"><p> Alternatively, when reading the transformations, just read them in the wrong order, starting at the last one instead of first one 
</p></div></div><p>But that&#39;s incredibly counter-intuitive, at least for me; even more so considering that the Allegro documentation says that transformations are applied in the order you write them. In your sample code, the way you have to use that <span class="source-code"><a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k2">)</span></span> + <span class="source-code"><a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k2">)</span></span> + <span class="source-code"><a href="http://www.allegro.cc/manual/al_compose_transform"><span class="a">al_compose_transform</span></a><span class="k2">(</span><span class="k2">)</span></span> combo every time just proves how counter-intuitive it is.</p><p>Consider the following shape:<br /><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/2/b/2bd680065040bf63826e991d2e629450.png" alt="611173" width="209" height="207" /></p><p>What should be a really simple shape to draw, requires the following code which, no matter how much I try to understand, I can&#39;t quite get what the transformations are doing:</p><div class="source-code snippet"><div class="inner"><pre>    <a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, .<span class="n">5</span>, .<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">400</span>, <span class="n">400</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="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, .<span class="n">5</span>, .<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, <span class="n">100</span>, <span class="n">100</span><span class="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">200</span>, <span class="k3">-</span><span class="n">200</span>, <span class="n">200</span>, <span class="n">200</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">255</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, .<span class="n">5</span>, .<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<div class="highlight">    <a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t, <span class="n">50</span>, <span class="n">50</span><span class="k2">)</span><span class="k2">;</span> </div>
    <a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">200</span>, <span class="k3">-</span><span class="n">200</span>, <span class="n">200</span>, <span class="n">200</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

The marked line, for example, what is it supposed to do? It&#39;s translating the transform by 50 units relative to what? I really don&#39;t understand how this works, I played with the values just to get the expected output which, by the way, makes this code only work at the corner of the screen, if I try to draw to the center of the screen, for example, then the values become totally different. Add translations, scale and rotations and the code becomes a real mess!. Can someone care to explain how the code above produces the result? How can you draw that same result at, say, the center of the screen?.</p><p>Maybe it&#39;s just me but I find the way transformations work to be incredibly counter-intuitive. Might as well prefer to instead use OpenGL matrices at this point.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Thu, 28 Dec 2017 23:39:02 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I completely agree. The line you marked makes it so things will be drawn 50 pixel to the right and 50 pixel down compared to if you would not have that line (ignoring any transformations that came earlier). As I said, if you assume it is the first transformation instead of last things should make sense.</p><p>The only difference to OpenGL is that Allegro flips the order for the matrix multiplication (my version fixes that... I made my own translate/scale/rotate versions so my actual code is very short and intuitive).
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Thu, 28 Dec 2017 23:56:30 +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/617194/1034119#target">Elias</a> said:</div><div class="quote"><p> Allegro&#39;s transformations work backwards compared to OpenGL</p></div></div><p>Just curious, what was the reasoning or train of thought that resulted in this?
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Eric Johnson)</author>
		<pubDate>Fri, 29 Dec 2017 00:05:14 +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/617194/1034124#target">Elias</a> said:</div><div class="quote"><p> The line you marked makes it so things will be drawn 50 pixel to the right and 50 pixel down compared to if you would not have that line
</p></div></div><p>Yeah, but I&#39;m drawing the rectangles using <i>(-200, -200, 200, 200)</i> which makes the value of 50 for that transformation to seem odd to me. I mean, whatever that set of transformations is doing to make the rectangles appear one within the other is still not clear to me.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p> I made my own translate/scale/rotate versions so my actual code is very short and intuitive
</p></div></div><p>Yeah, I guess you can enclose inside a function the combo of function calls you use but that means you&#39;re making a bunch of function calls behind the scenes. Still worth it to make your code easier to understand, though.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Fri, 29 Dec 2017 00:13:12 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Allegro&#39;s transforms are pretty straight forward. That code you posted is misleading because it keeps applying progressive transforms instead of rebuild it anew for each shape.</p><p>The transformations are applied in the order that you apply them. Whether allegro is performing a left or right hand multiply behind the scenes doesn&#39;t matter. And yes it&#39;s backwards to OpenGL, but thank God for that, because IMO OpenGL is backwards.</p><p>EDIT<br /><a href="https://github.com/EdgarReynaldo/EagleGUI/blob/master/include/Eagle/Transforms.hpp">https://github.com/EdgarReynaldo/EagleGUI/blob/master/include/Eagle/Transforms.hpp</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 29 Dec 2017 01:07:08 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>What would be the right way to draw that shape at the center of the screen, then? What if the blue and green rectangles&#39; scale an position is relative to the rectangle that contains them? That&#39;s what the consecutive scale transforms are meant to represent and the kind of situation I have in my project and which lead to opening this thread in the first place. Rebuilding the transform from the start sounds like a waste since you&#39;ll have to apply the red and green scale anyway.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Fri, 29 Dec 2017 02:14:48 +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/617194/1034126#target">Eric Johnson</a> said:</div><div class="quote"><p> Just curious, what was the reasoning or train of thought that resulted in this? </p></div></div><p>Because the way OpenGL does it is backwards. There&#39;s nothing complicated, or counter intuitive about the way Allegro does it as long as your mind hasn&#39;t been poisoned by OpenGL&#39;s matrix stack order.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/617194/1034139#target">kenmasters1976</a> said:</div><div class="quote"><p> What would be the right way to draw that shape at the center of the screen, then?</p></div></div><p>Your example is (unintentionally) contrived to favor OpenGL&#39;s order of multiplication, but in a realistic setting there is less difference between the two orders.</p><p>Here&#39;s a slightly more realistic use example (you can try to uncomment some lines to see how things compose):</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;stdio.h&gt;</span>
<span class="number">  4</span><span class="p">#include &lt;vector&gt;</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="k1">struct</span> Rectangle
<span class="number">  7</span><span class="k2">{</span>
<span class="number">  8</span>  std::vector<span class="k3">&lt;</span>Rectangle<span class="k3">*</span><span class="k3">&gt;</span> children<span class="k2">;</span>
<span class="number">  9</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_TRANSFORM"><span class="a">ALLEGRO_TRANSFORM</span></a> transform<span class="k2">;</span>
<span class="number"> 10</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> color<span class="k2">;</span>
<span class="number"> 11</span>  
<span class="number"> 12</span>  <span class="k1">void</span> draw<span class="k2">(</span><span class="k1">const</span> <a href="http://www.allegro.cc/manual/ALLEGRO_TRANSFORM"><span class="a">ALLEGRO_TRANSFORM</span></a><span class="k3">&amp;</span> parent_transform<span class="k2">)</span> <span class="k1">const</span>
<span class="number"> 13</span>  <span class="k2">{</span>
<span class="number"> 14</span>    <a href="http://www.allegro.cc/manual/ALLEGRO_TRANSFORM"><span class="a">ALLEGRO_TRANSFORM</span></a> final_transform<span class="k2">;</span>
<span class="number"> 15</span>    <a href="http://www.allegro.cc/manual/al_copy_transform"><span class="a">al_copy_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>final_transform, <span class="k3">&amp;</span>transform<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 16</span>    <a href="http://www.allegro.cc/manual/al_compose_transform"><span class="a">al_compose_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>final_transform, <span class="k3">&amp;</span>parent_transform<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>    <a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>final_transform<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</span>    
<span class="number"> 19</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">200</span>, <span class="k3">-</span><span class="n">200</span>, <span class="n">200</span>, <span class="n">200</span>, color<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>    
<span class="number"> 21</span>    <span class="k1">for</span><span class="k2">(</span><span class="k1">const</span> Rectangle<span class="k3">*</span> child <span class="k2">:</span> children<span class="k2">)</span>
<span class="number"> 22</span>    <span class="k2">{</span>
<span class="number"> 23</span>      child-&gt;draw<span class="k2">(</span>final_transform<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</span>    <span class="k2">}</span>
<span class="number"> 25</span>  <span class="k2">}</span>
<span class="number"> 26</span><span class="k2">}</span><span class="k2">;</span>
<span class="number"> 27</span>
<span class="number"> 28</span>
<span class="number"> 29</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><span class="k3">*</span>argv<span class="k2">)</span>
<span class="number"> 30</span><span class="k2">{</span>
<span class="number"> 31</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"> 32</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"> 33</span>  
<span class="number"> 34</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_DISPLAY"><span class="a">ALLEGRO_DISPLAY</span></a><span class="k3">*</span> d <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">800</span>, <span class="n">600</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 35</span>  
<span class="number"> 36</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_f"><span class="a">al_map_rgb_f</span></a><span class="k2">(</span><span class="n">0</span>.<span class="n">0</span>, <span class="n">0</span>.<span class="n">0</span>, <span class="n">0</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 37</span>  
<span class="number"> 38</span>  <span class="k1">float</span> offx <span class="k3">=</span> <span class="n">500</span><span class="k2">;</span>
<span class="number"> 39</span>  <span class="k1">float</span> offy <span class="k3">=</span> <span class="n">256</span><span class="k2">;</span>
<span class="number"> 40</span>
<span class="number"> 41</span>
<span class="number"> 42</span>  Rectangle red<span class="k2">;</span>
<span class="number"> 43</span>  Rectangle green<span class="k2">;</span>
<span class="number"> 44</span>  Rectangle blue<span class="k2">;</span>
<span class="number"> 45</span>  Rectangle pink<span class="k2">;</span>
<span class="number"> 46</span>  
<span class="number"> 47</span>  red.color <span class="k3">=</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="k2">;</span>
<span class="number"> 48</span>  red.children.push_back<span class="k2">(</span><span class="k3">&amp;</span>green<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 49</span>  <a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>red.transform<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 50</span>  <a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>red.transform, offx, offy<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 51</span>  
<span class="number"> 52</span>  green.color <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">255</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 53</span>  green.children.push_back<span class="k2">(</span><span class="k3">&amp;</span>blue<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 54</span>  <span class="c">//green.children.push_back(&amp;pink);</span>
<span class="number"> 55</span>  <a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>green.transform<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 56</span>  <a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>green.transform, <span class="n">0</span>.<span class="n">5</span>, <span class="n">0</span>.<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 57</span>  <span class="c">//al_rotate_transform(&amp;green.transform, 3.1415/3);</span>
<span class="number"> 58</span>  <span class="c">//al_translate_transform(&amp;green.transform, 100, 0);</span>
<span class="number"> 59</span>  
<span class="number"> 60</span>  blue.color <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 61</span>  <a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>blue.transform<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 62</span>  <a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>blue.transform, <span class="n">0</span>.<span class="n">5</span>, <span class="n">0</span>.<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 63</span>  
<span class="number"> 64</span>  pink.color <span class="k3">=</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">255</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 65</span>  <a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>pink.transform<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 66</span>  <span class="c">// Since the rectangle is 400 pixels across, this will shift it to the left so it is next to the blue one.</span>
<span class="number"> 67</span>  <a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>pink.transform, <span class="k3">-</span><span class="n">400</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 68</span>  <a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>pink.transform, <span class="n">0</span>.<span class="n">5</span>, <span class="n">0</span>.<span class="n">5</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 69</span>
<span class="number"> 70</span>  <a href="http://www.allegro.cc/manual/ALLEGRO_TRANSFORM"><span class="a">ALLEGRO_TRANSFORM</span></a> identity<span class="k2">;</span>
<span class="number"> 71</span>  <a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>identity<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 72</span>  red.draw<span class="k2">(</span>identity<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 73</span>  
<span class="number"> 74</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"> 75</span>  
<span class="number"> 76</span>  <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">3</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 77</span><span class="k2">}</span>
</div></div><p>

The OpenGL order version of the above code would not be that much different.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (SiegeLord)</author>
		<pubDate>Fri, 29 Dec 2017 03:46:54 +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/617194/1034141#target">SiegeLord</a> said:</div><div class="quote"><p> There&#39;s nothing complicated, or counter intuitive about the way Allegro does it as long as your mind hasn&#39;t been poisoned by OpenGL&#39;s matrix stack order.
</p></div></div><p>Guilty as charged, I guess.</p><p>This is how I&#39;d draw the shape above using OpenGL and Allegro 5:
</p><div class="source-code snippet"><div class="inner"><pre>    <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">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
    glTranslatef<span class="k2">(</span>SCR_WIDTH <span class="k3">/</span> <span class="n">2</span>, SCR_HEIGHT <span class="k3">/</span> <span class="n">2</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
    glScalef<span class="k2">(</span><span class="n">0</span>.<span class="n">5</span>, <span class="n">0</span>.<span class="n">5</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">200</span>, <span class="k3">-</span><span class="n">200</span>, <span class="n">200</span>, <span class="n">200</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="k2">)</span><span class="k2">;</span>
    glScalef<span class="k2">(</span><span class="n">0</span>.<span class="n">5</span>, <span class="n">0</span>.<span class="n">5</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">200</span>, <span class="k3">-</span><span class="n">200</span>, <span class="n">200</span>, <span class="n">200</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">255</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
    glScalef<span class="k2">(</span><span class="n">0</span>.<span class="n">5</span>, <span class="n">0</span>.<span class="n">5</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span>
    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">200</span>, <span class="k3">-</span><span class="n">200</span>, <span class="n">200</span>, <span class="n">200</span>, <a href="http://www.allegro.cc/manual/al_map_rgb"><span class="a">al_map_rgb</span></a><span class="k2">(</span><span class="n">0</span>, <span class="n">0</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

Which, in my opinion, is both easier to write and to understand but yes, I&#39;m used to the way it works in OpenGL. Thankfully, Allegro 5 allows to mix these OpenGL calls with the Allegro code so I might stick to using this form for now.</p><p>Your code does indeed produce the correct output but I&#39;m gonna have to study it a bit more before understanding it. Thanks for posting it, I will use it as a reference to try an understand the way Allegro transformations work so maybe, hopefully, I&#39;ll be comfortable using them.</p><div class="quote_container"><div class="title">Quote:</div><div class="quote"><p> The OpenGL order version of the above code would not be that much different. 
</p></div></div><p>You may be right. Maybe once I understand Allegro transformations I might see they&#39;re not too different but right now I guess I&#39;m in the OpenGL mindset. Your code will surely help me understand better. Thanks.</p><p>[EDIT:] Wait! Calling <span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span><span class="k2">)</span></span> resets OpenGL transformations?. Well, I guess I&#39;m back at square one.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Fri, 29 Dec 2017 06:17:49 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>The correct transformation for each rectangle would be &#39;translate&#39; (center on origin), &#39;scale&#39; (and/or) &#39;rotate&#39; , &#39;translate&#39; (move to proper destination).</p><p>Or you could simply draw a rectangle centered on 0.0 yourself, that is 1.0 units wide, and 1.0 units high, scaled appropriately, and then centered on your destination.</p><p>The performance hit for rebuilding a matrix is pretty slim. Don&#39;t worry about it. And if you&#39;re worried about function calls, please don&#39;t. </p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> DrawMyRectangle<span class="k2">(</span><span class="k1">float</span> width , <span class="k1">float</span> height , <span class="k1">float</span> cx , <span class="k1">float</span> cy , <a href="http://www.allegro.cc/manual/ALLEGRO_COLOR"><span class="a">ALLEGRO_COLOR</span></a> col<span class="k2">)</span> <span class="k2">{</span>
   <a href="http://www.allegro.cc/manual/ALLEGRO_TRANSFORM"><span class="a">ALLEGRO_TRANSFORM</span></a> t<span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/al_identity_transform"><span class="a">al_identity_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/al_scale_transform"><span class="a">al_scale_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t , width , height<span class="k2">)</span><span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/al_translate_transform"><span class="a">al_translate_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t , cx , cy<span class="k2">)</span><span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/al_use_transform"><span class="a">al_use_transform</span></a><span class="k2">(</span><span class="k3">&amp;</span>t<span class="k2">)</span><span class="k2">;</span>
   <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">0</span>.<span class="n">5f</span> , <span class="k3">-</span><span class="n">0</span>.<span class="n">5f</span> , <span class="n">0</span>.<span class="n">5f</span> , <span class="n">0</span>.<span class="n">5f</span> , col<span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>

<span class="c">/// later in main</span>
DrawMyRectangle<span class="k2">(</span><span class="n">400</span> , <span class="n">400</span> , <span class="n">200</span> , <span class="n">200</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">255</span>,<span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
DrawMyRectangle<span class="k2">(</span><span class="n">200</span> , <span class="n">200</span> , <span class="n">200</span> , <span class="n">200</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">192</span>,<span class="n">192</span>,<span class="n">192</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
DrawMyRectangle<span class="k2">(</span><span class="n">100</span> , <span class="n">100</span> , <span class="n">200</span> , <span class="n">200</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">128</span>,<span class="n">128</span>,<span class="n">128</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
DrawMyRectangle<span class="k2">(</span><span class="n">50</span> , <span class="n">50</span> , <span class="n">200</span> , <span class="n">200</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">64</span>,<span class="n">64</span>,<span class="n">64</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
</pre></div></div><p>

<span class="remote-thumbnail"><span class="json">{"name":"611175","src":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/d\/9\/d990e56a38578790702d0b238a8b9150.png","w":428,"h":452,"tn":"\/\/djungxnpq2nug.cloudfront.net\/image\/cache\/d\/9\/d990e56a38578790702d0b238a8b9150"}</span><img src="http://www.allegro.cc//djungxnpq2nug.cloudfront.net/image/cache/d/9/d990e56a38578790702d0b238a8b9150-240.jpg" alt="611175" width="240" height="253" /></span></p><p>Calling al_draw_bitmap does not reset the transformations, but al_set_target_bitmap will and does.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 29 Dec 2017 06:56:13 +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/617194/1034146#target">Edgar Reynaldo</a> said:</div><div class="quote"><p> Calling al_draw_bitmap does not reset the transformations, but al_set_target_bitmap will and does. 
</p></div></div><p>The following code draws two rectangles centered on the Allegro window, as expected, but the bitmap is drawn at the top-left corner of the window.</p><div class="source-code"><div class="toolbar"><span class="button numbers"><b>#</b></span><span class="button select">Select</span><span class="button expand">Expand</span></div><div class="inner"><span class="number">  1</span><span class="p">#include &lt;allegro5/allegro.h&gt;</span>
<span class="number">  2</span><span class="p">#include &lt;allegro5/allegro_image.h&gt;</span>
<span class="number">  3</span><span class="p">#include &lt;allegro5/allegro_opengl.h&gt;</span>
<span class="number">  4</span><span class="p">#include &lt;allegro5/allegro_primitives.h&gt;</span>
<span class="number">  5</span>
<span class="number">  6</span><span class="p">#define SCR_WIDTH  800 </span>
<span class="number">  7</span><span class="p">#define SCR_HEIGHT 600</span>
<span class="number">  8</span>
<span class="number">  9</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"> 10</span><a href="http://www.allegro.cc/manual/ALLEGRO_BITMAP"><span class="a">ALLEGRO_BITMAP</span></a> <span class="k3">*</span>bmp<span class="k2">;</span>
<span class="number"> 11</span>
<span class="number"> 12</span><span class="k1">int</span> main<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
<span class="number"> 13</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</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="k2">;</span>
<span class="number"> 14</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</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="k2">;</span>
<span class="number"> 15</span>
<span class="number"> 16</span>    <span class="k1">uint32_t</span> version <span class="k3">=</span> <a href="http://www.allegro.cc/manual/al_get_allegro_version"><span class="a">al_get_allegro_version</span></a><span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 17</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_624.html" target="_blank">printf</a><span class="k2">(</span><span class="s">"Allegro version: %d.%d.%d\n"</span>, version <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">24</span>, <span class="k2">(</span>version <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">16</span><span class="k2">)</span> <span class="k3">&amp;</span> <span class="n">255</span>, <span class="k2">(</span>version <span class="k3">&gt;</span><span class="k3">&gt;</span> <span class="n">8</span><span class="k2">)</span> <span class="k3">&amp;</span> <span class="n">255</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 18</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>SCR_WIDTH, SCR_HEIGHT<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 19</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</span>display<span class="k2">)</span><span class="k2">;</span>
<span class="number"> 20</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</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="k2">;</span>
<span class="number"> 21</span>    <a href="http://www.delorie.com/djgpp/doc/libc/libc_48.html" target="_blank">assert</a><span class="k2">(</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="k2">;</span>
<span class="number"> 22</span>
<span class="number"> 23</span>    bmp <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">"mysha.pcx"</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 24</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">255</span>, <span class="n">255</span>, <span class="n">255</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span>
<div class="highlight"><span class="number"> 25</span>    glTranslatef<span class="k2">(</span>SCR_WIDTH <span class="k3">/</span> <span class="n">2</span>, SCR_HEIGHT <span class="k3">/</span> <span class="n">2</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> </div><div class="highlight"><span class="number"> 26</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">100</span>, <span class="k3">-</span><span class="n">100</span>, <span class="n">100</span>, <span class="n">100</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="k2">)</span><span class="k2">;</span> </div><div class="highlight"><span class="number"> 27</span>    <a href="http://www.allegro.cc/manual/al_draw_filled_rectangle"><span class="a">al_draw_filled_rectangle</span></a><span class="k2">(</span><span class="k3">-</span><span class="n">10</span>, <span class="k3">-</span><span class="n">10</span>, <span class="n">10</span>, <span class="n">10</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">255</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">)</span><span class="k2">;</span> </div><div class="highlight"><span class="number"> 28</span>    <a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span>bmp, <span class="n">0</span>, <span class="n">0</span>, <span class="n">0</span><span class="k2">)</span><span class="k2">;</span> </div><span class="number"> 29</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"> 30</span>    <a href="http://www.allegro.cc/manual/al_rest"><span class="a">al_rest</span></a><span class="k2">(</span><span class="n">2</span><span class="k2">)</span><span class="k2">;</span>
<span class="number"> 31</span><span class="k2">}</span>
</div></div><p>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Fri, 29 Dec 2017 10:24:03 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><div class="quote_container"><div class="title"><a href="http://liballeg.org/a5docs/trunk/graphics.html#al_draw_bitmap">The manual</a> said:</div><div class="quote"><p>
Draws an unscaled, unrotated bitmap at the given position to the current target bitmap (see al_set_target_bitmap).
</p></div></div><p>

I don&#39;t know if al_draw_bitmap_region respects the current transformations or not.</p><p>EDIT<br />I know the primitives addon respects the transformations. You could render your bitmap as a primitive triangle fan.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 29 Dec 2017 10:39:44 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I&#39;m pretty sure the manual description for <span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span><span class="k2">)</span></span> means <i>unscaled, unrotated</i> just as in opposed to the <span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_scaled_bitmap"><span class="a">al_draw_scaled_bitmap</span></a><span class="k2">(</span><span class="k2">)</span></span> and <span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_rotated_bitmap"><span class="a">al_draw_rotated_bitmap</span></a><span class="k2">(</span><span class="k2">)</span></span> versions but it&#39;s still meant to respect the current transformations and it does, at least it does if you use the Allegro transformation functions but apparently not if you use the OpenGL transformations so, in this case, using the primitives addon seems indeed like an alternative.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Fri, 29 Dec 2017 12:37:41 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Thing is, every time you change the target bitmap, the view and projection matrices get reset.</p><p>If you want to do it with OpenGL alone, you have to do it this way :</p><div class="source-code snippet"><div class="inner"><pre><span class="k1">void</span> ResetTransforms<span class="k2">(</span><span class="k2">)</span> <span class="k2">{</span>
    glMatrixMode<span class="k2">(</span>GL_PROJECTION<span class="k2">)</span><span class="k2">;</span>
    glLoadIdentity<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
    glOrtho<span class="k2">(</span><span class="n">0</span> , SCREEN_WIDTH , <span class="n">0</span> , SCREEN_HEIGHT , <span class="k3">-</span><span class="n">1</span>.<span class="n">0</span> , <span class="n">1</span>.<span class="n">0</span><span class="k2">)</span><span class="k2">;</span>

    glMatrixMode<span class="k2">(</span>GL_MODELVIEW<span class="k2">)</span><span class="k2">;</span>
    glLoadIdentity<span class="k2">(</span><span class="k2">)</span><span class="k2">;</span>
<span class="k2">}</span>
</pre></div></div><p>

This sets you up with a plain orthographic 2D projection matrix and an identity view matrix.</p><p>Call this <b>after</b> setting the target bitmap. If you&#39;re using a buffer, use its width and height for SCREEN_WIDTH and SCREEN_HEIGHT.</p><p>Then make your OpenGL calls and you can draw directly on the allegro screen.</p><p>Anytime you want to restore your projections, reset the target bitmap (hope they don&#39;t cache the previous target and NOP if its the same).</p><p>Personally I think allegro&#39;s transforms are easier.</p><p>EDIT<br />I checked the allegro source, and al_draw_bitmap uses its own transformations, along with every other bitmap drawing routine, because they all use the same underlying function but it doesn&#39;t respect OpenGL state, only the current allegro transform for the current target bitmap
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Fri, 29 Dec 2017 12:55:59 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>But when the bitmap is drawn the glTranslate() would still be active (al_draw_bitmap doesn&#39;t have to know about it), so it should work.</p><p>My guess is that al_draw_bitmap does something like temporarily changing the global transformation, which would reset any OpenGL transformation you have set.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Elias)</author>
		<pubDate>Fri, 29 Dec 2017 23:27:39 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Edgar, I don&#39;t want to reset the transformations, on the contrary, I&#39;d expect for <span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span><span class="k2">)</span></span> not to.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/617194/1034165#target">Elias</a> said:</div><div class="quote"><p> But when the bitmap is drawn the glTranslate() would still be active (al_draw_bitmap doesn&#39;t have to know about it), so it should work.
</p></div></div><p>Yeah, exactly my thought but apparently it&#39;s not so in practice.<br />Can&#39;t check the Allegro source right now but if, as Edgar points out in his edit, <span class="source-code"><a href="http://www.allegro.cc/manual/al_draw_bitmap"><span class="a">al_draw_bitmap</span></a><span class="k2">(</span><span class="k2">)</span></span> (and all other bitmap drawing routines) work based on Allegro transformations then if the first thing these functions do is, for example, call <span class="source-code"><a href="http://www.allegro.cc/manual/al_get_current_transform"><span class="a">al_get_current_transform</span></a><span class="k2">(</span><span class="k2">)</span></span> then the result might not reflect any changes you manually made using OpenGL function calls.</p><p>So, I guess I have to understand Allegro transformations or attempt to draw the bitmaps using primitives, as suggested earlier.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Sat, 30 Dec 2017 01:11:24 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Nobuddy listens to me. <img src="http://www.allegro.cc/forums/smileys/cry.gif" alt=":&#39;(" /></p><p><a href="https://github.com/liballeg/allegro5/blob/master/src/bitmap_draw.c#L111-L119">https://github.com/liballeg/allegro5/blob/master/src/bitmap_draw.c#L111-L119</a></p><p>It doesn&#39;t matter what you set with OpenGL, because allegro backs up and changes and then restores the current transformation in order to perform its duty as a function which is able to h or v flip as well as scale rotate and move an image.</p><p>Just use allegro&#39;s transforms or else get the gl texture id from allegro and draw it yourself with GL_QUAD or GL_TRIANGLE_FAN. You can&#39;t have it both ways here my friend.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 30 Dec 2017 02:00:26 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>I did listen to you, I was just poiting out what I originally expected.</p><div class="quote_container"><div class="title"><a href="http://www.allegro.cc/forums/thread/617194/1034169#target">Edgar Reynaldo</a> said:</div><div class="quote"><p> Just use allegro&#39;s transforms or else get the gl texture id from allegro and draw it yourself with GL_QUAD or GL_TRIANGLE_FAN. You can&#39;t have it both ways here my friend. 
</p></div></div><p>As mentioned in the last line of my previous post, that&#39;s what I will do.</p><p>Thanks everyone for your help in this thread. It was really useful.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Sat, 30 Dec 2017 02:36:11 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Okay, good. <img src="http://www.allegro.cc/forums/smileys/wink.gif" alt=";)" /> I&#39;m glad we could be of help.</p><p>If you really wanna blow your mind, check out these tutorials from dhpoware :</p><p><a href="http://www.dhpoware.com/demos/index.html">http://www.dhpoware.com/demos/index.html</a></p><p>Specifically, this one on layered windows with OpenGL :</p><p><a href="http://www.dhpoware.com/demos/glLayeredWindows.html">http://www.dhpoware.com/demos/glLayeredWindows.html</a>
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (Edgar Reynaldo)</author>
		<pubDate>Sat, 30 Dec 2017 02:52:37 +0000</pubDate>
	</item>
	<item>
		<description><![CDATA[<div class="mockup v2"><p>Yeah, after all the explanations in this thread and studying the contributed code I was able to make the Allegro transforms work as expected in my project. I still don&#39;t find them quite as intuitive but I guess I&#39;m starting to get the hold of it.</p><p>Thanks again and I will take a look at those links.
</p></div>]]>
		</description>
		<author>no-reply@allegro.cc (kenmasters1976)</author>
		<pubDate>Sat, 30 Dec 2017 06:03:36 +0000</pubDate>
	</item>
</rss>
