<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Geek Vault &#187; C/C++</title>
	<atom:link href="http://www.geekvault.org/category/programacao/c_cpp/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.geekvault.org</link>
	<description>Because geeks, like to talk.</description>
	<lastBuildDate>Fri, 16 Jul 2010 12:47:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Autotools e CUDA</title>
		<link>http://www.geekvault.org/2010/06/autotools-e-cuda/</link>
		<comments>http://www.geekvault.org/2010/06/autotools-e-cuda/#comments</comments>
		<pubDate>Wed, 30 Jun 2010 01:32:44 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[ANSI C]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Stuffs]]></category>
		<category><![CDATA[autoconf]]></category>
		<category><![CDATA[autoheader]]></category>
		<category><![CDATA[automake]]></category>
		<category><![CDATA[autotools]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[CUDA]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[trac]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=533</guid>
		<description><![CDATA[Quem gosta de CUDA e Linux, sabe que não existe (a não ser que você procure na internet) suporte para CUDA nas autotools. Bom, eu procurei a um bom tempo atrás e criei um template para iniciar todos os meus projetos de CUDA e agora, não apenas estou liberando ele como um template, mas também [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F06%2Fautotools-e-cuda%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F06%2Fautotools-e-cuda%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Quem gosta de CUDA e Linux, sabe que não existe (a não ser que você procure na internet) suporte para CUDA nas autotools. Bom, eu procurei a um bom tempo atrás e criei um template para iniciar todos os meus projetos de CUDA e agora, não apenas estou liberando ele como um template, mas também estou criando um <a href="http://trac.geekvault.org/cuda/" target="_blank">repositório</a> completo sobre CUDA no meu SVN onde obviamente esse é o primeiro projeto.<br />
Sem demoras, é possível efetuar o download e entender um pouco mais do projeto na <a href="http://trac.geekvault.org/cuda/wiki/autotools" target="_blank">página do projeto</a>.<br />
PS: Saiu a versão 3.1 com suporte a printf() em interfaces Fermin <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2010/06/autotools-e-cuda/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Números aleatórios em C</title>
		<link>http://www.geekvault.org/2010/02/numeros-aleatorios-em-c/</link>
		<comments>http://www.geekvault.org/2010/02/numeros-aleatorios-em-c/#comments</comments>
		<pubDate>Thu, 04 Feb 2010 22:09:55 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[ANSI C]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[stuff]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=486</guid>
		<description><![CDATA[Bom, todos nós sabemos que rand() nos retorna uma distribuição uniforme de números aleatórios, na realidade praticamente todos os geradores de números aleatórios nos retorna uma distribuição uniforme, o problema é como utilizamos. Procurando sobre isso, encontrei esse artigo que explica o motivo do &#8220;erro&#8221; de utilização e como corrigir o mesmo. Enquanto ele não [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F02%2Fnumeros-aleatorios-em-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2010%2F02%2Fnumeros-aleatorios-em-c%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Bom, todos nós sabemos que rand() nos retorna uma distribuição uniforme de números aleatórios, na realidade praticamente todos os geradores de números aleatórios nos retorna uma distribuição uniforme, o problema é como utilizamos. Procurando sobre isso, encontrei <a href="http://eternallyconfuzzled.com/arts/jsw_art_rand.aspx" target="_blank">esse</a> artigo que explica o motivo do &#8220;erro&#8221; de utilização e como corrigir o mesmo.<br />
Enquanto ele não resolve o problema para geração de números aleatórios em paralelo (minha mais nova paixão), ele dá boas dicas de como solucionar isso, e provavelmente como solucionar também em paralelismo (já que o problema está na utilização e não no algorítmo).<br />
Vale a pena dar uma lida, esse é um assunto muito importante para todos, principalmente para quem ainda gera os números dessa forma:</p>
<blockquote><p>
srand(time(NULL));<br />
int num = rand()%max;
</p></blockquote>
<p> <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2010/02/numeros-aleatorios-em-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Nova especificação do C++ adiada para 2010</title>
		<link>http://www.geekvault.org/2009/07/nova-especificacao-do-c-adiada-para-2010/</link>
		<comments>http://www.geekvault.org/2009/07/nova-especificacao-do-c-adiada-para-2010/#comments</comments>
		<pubDate>Fri, 24 Jul 2009 01:22:53 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Noticias]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=391</guid>
		<description><![CDATA[De acordo com essa notícia do Slashdot, a nova especificação do C++ (C++0X) será adiada para 2010 ou depois. O motivo é a sua mudança principal chamada &#8220;concepts&#8221;, que visam deixar os templates mais robustos. Honestamente eu não vi muito de C++ ainda para discutir a fundo templates, herança, polimorfismo, ou qualquer outra coisa, mas [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F07%2Fnova-especificacao-do-c-adiada-para-2010%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F07%2Fnova-especificacao-do-c-adiada-para-2010%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>De acordo com <a href="http://tech.slashdot.org/story/09/07/23/1817225/Stroustrup-Says-New-C-Standard-Delayed-Until-2010-Or-Later" target="_blank">essa</a> notícia do <a href="http://slashdot.org" target="_self">Slashdot</a>, a nova especificação do C++ (C++0X) será adiada para 2010 ou depois. O motivo é a sua mudança principal chamada &#8220;concepts&#8221;, que visam deixar os templates mais robustos. Honestamente eu não vi muito de C++ ainda para discutir a fundo templates, herança, polimorfismo, ou qualquer outra coisa, mas uma nova especificação sempre é bem vinda (quando bem feita, que aparentemente é o caso), e pelo que li sobre &#8220;concepts&#8221; realmente é uma coisa bem complexa, que esta sendo desenvolvida a mais de 7 anos e ainda não está pronta. Como ela será o motivo principal do atraso, ela será retirada e a nova especificação irá se focar em outras coisas (como paralelismo por exemplo).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2009/07/nova-especificacao-do-c-adiada-para-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Observers em C++</title>
		<link>http://www.geekvault.org/2009/06/observers-em-c/</link>
		<comments>http://www.geekvault.org/2009/06/observers-em-c/#comments</comments>
		<pubDate>Wed, 10 Jun 2009 14:47:49 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[Stuffs]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Dicas]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[padrões]]></category>
		<category><![CDATA[tutoriais]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=349</guid>
		<description><![CDATA[Observers são um patrão de design muito utilizado, principalmente quando você quer que camadas superiores do seu software saibam o que aconteceu nas camadas inferiores. O Ogre usa isso para renderizar Frames por exemplo, utilizando FrameListener. Pois bem, curioso como sou resolvi ir um pouco mais a fundo e ver como se faz isso na [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F06%2Fobservers-em-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F06%2Fobservers-em-c%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Observers são um patrão de design muito utilizado, principalmente quando você quer que camadas superiores do seu software saibam o que aconteceu nas camadas inferiores. O Ogre usa isso para renderizar Frames por exemplo, utilizando FrameListener. Pois bem, curioso como sou resolvi ir um pouco mais a fundo e ver como se faz isso na unha em C++, descobrindo o quão simples isso é, os passos são esses:</p>
<ol>
<li>Criar uma simples interface com um método que será chamado a toda atualização</li>
<li>Criar um objeto singleton que pode ser observado, adicionando as interfaces em uma lista (ou pilha, whatever), que irá chamar o método de atualização de todos as interface quando obtiver uma mudança</li>
<li>Criar um objeto que implementa sua interface.</li>
<li>A cada atualização, notificar todas as interfaces.</li>
</ol>
<p><span id="more-349"></span></p>
<p>O código mostrado aqui (apenas trechos) está disponível via svn em:</p>
<blockquote><p>http://svn.geekvault.org/cpp/ObserverExample</p></blockquote>
<p>Parece mais complexo do que realmente é, a mágica toda está em básicamente dois métodos (e obviamente na organização de listener mostrada):</p>
<ul>
<li>InputListener::notify()</li>
<li>Listener::notify()</li>
</ul>
<p>O nome dos métodos pode variar, mas a idéia básica é que cada objeto que implementar a interface Listener, será obrigado a implementar o método notify(), que será chamado pelo Singleton InputListener.<br />
Vamos ao código:</p>
<p><strong>InputListener::notify(void)</strong></p>
<p><code> std::set&lt;Listener*&gt;::iterator itr;<br />
for( itr = listeners.begin(); itr != listeners.end(); ++itr)<br />
(*itr)-&gt;notify();</code></p>
<p><strong>InputFilter::notify()</strong><br />
<code><br />
unsigned int qtdChars = 0;<br />
if(&amp;m_sInput!=NULL)<br />
{<br />
std::cout &lt;&lt; "We have the string: " &lt;&lt; m_sInput-&gt;c_str() &lt;&lt; std::endl;<br />
std::cout &lt;&lt; "That is " &lt;&lt; m_sInput-&gt;size() &lt;&lt; " chars wide\n";<br />
for(unsigned int i = 0; i &lt; m_sInput-&gt;size(); i++)<br />
{<br />
if((*m_sInput)[i]=='a') qtdChars++;<br />
}<br />
std::cout &lt;&lt; "And we found " &lt;&lt; qtdChars &lt;&lt; " of the 'a' character\n";<br />
}</code></p>
<p>InputFilter é uma classe que implementa a &#8220;complexa&#8221; interface Listener:</p>
<p><code>class Listener<br />
{<br />
public:<br />
virtual void notify() = 0;<br />
};</code></p>
<p>Onde InputFilter será definida como (no nosso caso):<br />
<code>class InputFilter : public Listener<br />
{<br />
public:<br />
InputFilter();<br />
~InputFilter();<br />
void addString(std::string&amp; str);<br />
private:<br />
void notify();<br />
InputListener* input;<br />
std::string *m_sInput;<br />
};</code></p>
<p>E sua utilização (também chamada como main())</p>
<p><code>int main(void)<br />
{<br />
string str;<br />
InputFilter* filter = new InputFilter();<br />
do<br />
{<br />
cout &lt;&lt; "Please type something:";<br />
getline(cin,str);filter-&gt;addString(str);<br />
InputListener::getInstance()-&gt;notify();<br />
}while(str.compare("quit")!=0);<br />
return 0;<br />
}</code></p>
<p>Acreditem, não fica mais complexo do que isso. A grande sacada de Listener (ou Observers, é a mesma coisa) é que você pode criar um Singleton e não se preocupar em avisar várias classes sobre sua atualização, faça-as implementares a interface Listener, e apenas as adicione no Listener criado, quando você quiser atualizar todos, chame o método de atualização do Listener, simples assim.</p>
<p>Have fun.</p>
<p>Zarnick</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2009/06/observers-em-c/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ogre, aos poucos&#8230;Menu 3D!</title>
		<link>http://www.geekvault.org/2009/06/ogre-aos-poucosmenu-3d/</link>
		<comments>http://www.geekvault.org/2009/06/ogre-aos-poucosmenu-3d/#comments</comments>
		<pubDate>Tue, 09 Jun 2009 12:12:14 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Menu]]></category>
		<category><![CDATA[Ogre]]></category>
		<category><![CDATA[Programação]]></category>
		<category><![CDATA[projetos]]></category>
		<category><![CDATA[Trechos]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=339</guid>
		<description><![CDATA[Bom, eu sei que faz tempo que não aparecem trechos de códigos por aqui, culpe a falta de tempo. Mas nada são más notícias, eu tenho um trecho aqui de um Menu 3D, com alfabeto e tudo mais Ainda estou trabalhando na documentação, mas se você possui Linux e OGRE, pode brincar um pouco já, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F06%2Fogre-aos-poucosmenu-3d%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F06%2Fogre-aos-poucosmenu-3d%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Bom, eu sei que faz tempo que não aparecem trechos de códigos por aqui, culpe a falta de tempo.<br />
Mas nada são más notícias, eu tenho um trecho aqui de um Menu 3D, com alfabeto e tudo mais <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Ainda estou trabalhando na documentação, mas se você possui Linux e OGRE, pode brincar um pouco já, a idéia é bem básica, existem um Zip com os .mesh representando o alfabeto (por falta de vocação em 3D e vontade, temos apenas de A-Z e 0-9), criei (estou aperfeiçoando) uma classe para cuidar de mostrar o alfabeto em um ambiente 3D e, uma classe de Menu, que utiliza esse alfabeto e umas animações bem básicas mesmo.<br />
Esse projeto eu vou fazer um pouco diferente, vou trabalhar no mesmo até conseguir entregar um binário de exemplo para Linux e Windows e, fazer com que esse binário rode em qualquer um desses SOs, com ou sem Ogre instalado.<br />
Para ver como está indo, o link do SVN é:</p>
<blockquote><p>http://svn.geekvault.org/ogre/MenuFramework</p></blockquote>
<p>Abraços, e até a próxima.<br />
Zarnick</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2009/06/ogre-aos-poucosmenu-3d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ogre, parte 1</title>
		<link>http://www.geekvault.org/2009/02/ogre-parte-1/</link>
		<comments>http://www.geekvault.org/2009/02/ogre-parte-1/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 11:32:40 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Stuffs]]></category>
		<category><![CDATA[Tutorials]]></category>
		<category><![CDATA[Ogre]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=258</guid>
		<description><![CDATA[Bom, como prometido, temos algo do Ogre aqui Repito que não vou fazer um tutorial sobre isso, para isso vejam a Wiki do Ogre. Antes de mais nada, como já foi dito anteriormente, o Ogre por sí só é uma engine gráfica 3D, o que quer dizer que sim, você pode fazer seu jogo nela, [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F02%2Fogre-parte-1%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F02%2Fogre-parte-1%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Bom, como prometido, temos algo do <a href="http://www.ogre3d.org" target="_blank">Ogre</a> aqui <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p style="text-align: justify;">Repito que não vou fazer um tutorial sobre isso, para isso vejam a <a href="http://www.ogre3d.org/wiki/" target="_blank">Wiki</a> do Ogre.<br />
Antes de mais nada, como já foi dito anteriormente, o Ogre por sí só é uma engine gráfica 3D, o que quer dizer que sim, você pode fazer seu jogo nela, mas irá faltar no mínimo iteração com o usuário, som e física (verdade, alguns jogos não precisam de física, mas ficam muito melhores com;). Quando você instala o Ogre ele vem com a parte de iteração, utilizando agora o <a href="http://sourceforge.net/projects/wgois" target="_blank">OIS</a> (antigamente era a SDL) e para ter uma GUI, ele utiliza a <a href="http://www.cegui.org.uk/" target="_blank">CEGUI</a>. Com isso você já consegue fazer um jogo quase completo (isso e muita paciência), ou um aplicativo, que é o que vou mostrar aqui.<span id="more-258"></span></p>
<p style="text-align: justify;">Antes de mais nada,  vamos falar um pouco sobre onde estou desenvolvendo e exatamente o que estou desenvolvendo.</p>
<p style="text-align: justify;">Estou fazendo um programa para aprender direito como o Ogre funciona, o programa se chama OgreViewer, sua documentação pode ser encontrada <a href="http://manuals.geekvault.org/ogreViewer/html/index.html" target="_blank">aqui</a>, ele serve basicamente para carregar uma Mesh no Ogre, iluminar, animar, testar vários materiais nela, checar performance, posicionamento, e outras coisas que é possível fazer com o Ogre. Até agora temos uma aplicação Ogre que carrega uma Mesh, ilumina, possibilita a utilização de materiais customizáveis e deixa a Mesh rotacionando para ver o efeito da luz no material. Já é um começo.<br />
O ambiente de desenvolvimento utilizado (apesar do SVN conter um projeto do tipo Autotools para Linux), é o <a href="http://www.codeblocks.org/" target="_blank">Code::Blocks</a>, pois é um ambiente OpenSource que roda em Windows, Mac e Linux assim como o Ogre (a única grande alteração para rodar um aplicativo é sua inicialização na função main(), que eu não vou tratar aqui, nossos aplicativos são desenvolvidos em Linux).</p>
<p style="text-align: justify;">Bom, antes de mais nada, você pode baixar o código fonte do programa via Subversion, em http://svn.geekvault.org/ogre/greViewer. Caso você não esteja conseguindo compilar o código, provavelmente está faltando alguma biblioteca, a única biblioteca extra que utilizo é a <a href="http://sourceforge.net/projects/ogreal/" target="_blank">OgreAL</a>, um wrapper da <a href="http://connect.creativelabs.com/openal" target="_blank">OpenAL</a> para o Ogre, baixe-a, instale-a e tudo deve funcionar.</p>
<p style="text-align: justify;">Uma vez com o código em mãos, vamos falar um pouco sobre como o Ogre funciona. O Ogre possui uma arquitetura baseada em plugins, e essa é a grande sacada deles, a grande maioria das engines gráficas utilizam apenas uma arquitetura de herança, complicando o código e tirando sua portabilidade. No Ogre, se você precisa de uma cena que utiliza BSP, basta carregar o plugin que permite isso, configurar sua cena para aceitar informações do tipo BSP e você está pronto, detalhe, isso pode ser feito em run-time.<br />
Outra característica importante do Ogre são os Listeners, sendo que o mais importante deles é sem dúvida o FrameListener. Apesar de eu não falar sobre Padrões de Projetos, um Listener é basicamente uma classe que &#8220;ouve&#8221; por mudanças e ações nela e toma suas devidas ações. No caso do FrameListener ele possui duas funções básicas, frameStarted() e frameEnded() executam antes e após cada frame ter sido renderizado, útil para animações e tratamento de inputs <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<br />
Isso tendo falado, já podemos explicar o processo de inicialização, vamos ver a função OgreStartup::go(void)</p>
<blockquote>
<p style="text-align: justify;">
void OgreStartup::go(void){<br />
startLog();<br />
createRoot();<br />
defineResources();<br />
setupRenderSystem();<br />
createRenderWindow();<br />
setupScene();<br />
createCamera();<br />
setupViewport();<br />
initializeResourceGroups();<br />
setupAudioSystem();<br />
setupCEGUI();<br />
setupInputSystem();<br />
createScene();<br />
createFrameListener();<br />
startRenderLoop();<br />
}</p></blockquote>
<p style="text-align: justify;">Ela é intuitiva não? Vamos passo a passo:</p>
<ol>
<li style="text-align: justify;">startLog(). Essa função inicia o log do Ogre</li>
<li>createRoot(). A classe Root do Ogre é a classe que controla o Ogre, precisamos iniciá-la antes de mais nada</li>
<li>defineResources(). Como o Ogre utiliza plugins e recursos externos (Meshs, texturas, particulas, etc), precisamos saber onde eles estão, essa função faz isso e os pré-carrega na memória</li>
<li>setupRenderSystem(). Aqui escolhemos se utilizamos DirectX ou OpenGL.</li>
<li>createRenderWindow(). Uma vez escolhido o sistema de renderização, criamos a nossa janela principal.</li>
<li>setupScene(). Escolhemos o plugin para construir a nossa cena, BSP, genérico, Outdoor, etc.</li>
<li>createCamera(). Criamos uma camera principal para podermos ver a cena.</li>
<li>setupViewport(). A camera precisa de um Viewport para renderizar o que ela vê, aqui criamos esse Viewport default.</li>
<li>initializeResourceGroups(). Lembra dos recursos externos no passo 3? Aqui inicializamos os mesmos na memória da GPU ou do PC.</li>
<li>setupAudioSystem(). Um jogo sem audio é bem chato não? Inicializamos o OgreAL.</li>
<li>setupCEGUI(). Inicializamos a GUI default que o Ogre utiliza.</li>
<li>setupInputSystem(). Inicializamos o OIS para termos ações do teclado, mouse e joystick.</li>
<li>createScene(). Criamos a cena para mostrar, essa função é puramente virtual, já que cada cena é diferente da outra, não temos uma cena única.</li>
<li>createFrameListener(). Cria os Listeners, também é puramente virtual, pois normalmente você terá <em>n</em> Listeners.</li>
<li>startRenderLoop(). Inicia o processo de renderização de cada frame.</li>
</ol>
<p>Por hoje é só, na próxima parte eu vou explicar função por função como ela faz, e na parte 3 irei explicar como criar uma cena básica e um FrameListener básico para podermos movimentar a camera e sair do programa.</p>
<p>Até lá.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2009/02/ogre-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bullet physics</title>
		<link>http://www.geekvault.org/2009/01/bullet-physics/</link>
		<comments>http://www.geekvault.org/2009/01/bullet-physics/#comments</comments>
		<pubDate>Mon, 12 Jan 2009 10:39:28 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[C++]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Stuffs]]></category>
		<category><![CDATA[Tips]]></category>
		<category><![CDATA[Engines]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[Programação]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=217</guid>
		<description><![CDATA[Bom, falar que fiquei pasmo com essa engine OpenSource de física é o mínimo. Ao procurar uma boa engine de física que rode com o Ogre de uma forma fácil e seu desenvolvimento seja voltado para o Linux, descobri Bullet. Apenas para ter uma ideia do quão ela é importante, o Blender a utiliza na [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F01%2Fbullet-physics%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2009%2F01%2Fbullet-physics%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Bom, falar que fiquei pasmo com essa engine <em>OpenSource</em> de física é o mínimo. Ao procurar uma boa engine de física que rode com o Ogre de uma forma fácil e seu desenvolvimento seja voltado para o Linux, descobri <a href="http://www.bulletphysics.com/Bullet/wordpress/" target="_blank">Bullet</a>. Apenas para ter uma ideia do quão ela é importante, o <a href="http://www.blender3d.org" target="_blank">Blender</a> a utiliza na sua última versão (2.48), como a engine física <em>default</em> para sua <em>game-engine</em>. Entre outras coisas que você pode ver em sua página de <a href="http://code.google.com/p/bullet/" target="_blank">download</a> (<a href="http://code.google.com/p/bullet/" target="_blank">Google code</a>) ela suporta soft-bodies, como por exemplo roupas e cordas.</p>
<p>Definitivamente vale a pena dar uma olhada <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2009/01/bullet-physics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>liblogger 0.1</title>
		<link>http://www.geekvault.org/2008/11/liblogger-01/</link>
		<comments>http://www.geekvault.org/2008/11/liblogger-01/#comments</comments>
		<pubDate>Wed, 19 Nov 2008 16:01:01 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[apis]]></category>
		<category><![CDATA[autotools]]></category>
		<category><![CDATA[liblogger]]></category>
		<category><![CDATA[libs]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OpenSource]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=207</guid>
		<description><![CDATA[Ola pessoal, calma que minha faculdade está quase no fim, reta final! Enquanto isso, gostaria de apresentar um novo projeto meu, a liblogger. Em quase todas as aplicações que eu faço eu preciso de um log, a maioria das pessoas precisa, e depois de copiar tantas vezes o mesmo código, resolvi inaugurar uma seção no [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2008%2F11%2Fliblogger-01%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2008%2F11%2Fliblogger-01%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Ola pessoal, calma que minha faculdade está quase no fim, reta final!</p>
<p>Enquanto isso, gostaria de apresentar um novo projeto meu, a <a href="http://packages.geekvault.org/liblogger/" target="_blank">liblogger</a>. Em quase todas as aplicações que eu faço eu preciso de um log, a maioria das pessoas precisa, e depois de copiar tantas vezes o mesmo código, resolvi inaugurar uma seção no meu domínio com algumas apps e APIs e, essa será a primeira a ser disponibilizada!</p>
<p>Todas as APIs terão uma documentação feita via <a href="http://www.stack.nl/~dimitri/doxygen/" target="_blank">Doxygen</a>, um site via <a href="http://www.joomla.org/" target="_blank">Joomla</a>, tutoriais, e um espaço em <a href="http://packages.geekvault.org/" target="_blank">packages.geekvault.org</a>. Caso contrário ela estará no <a href="http://sourceforge.net" target="_blank">Sourceforge</a> e provavelmente com sites mais personalizados, alias, esperem novidades nesse aspecto <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> .<span id="more-207"></span>Bom, vamos falar um pouco sobre a <a href="http://packages.geekvault.org/liblogger/" target="_blank">liblogger</a> então.</p>
<p>Resumindo o óbvio, é uma API em C que estou desenvolvendo de acordo com as minhas necessidades para poder efetuar um log de qualquer aplicação ou API. O principal motivo que estou fazendo isso no lugar de utilizar alguma já existente é o aprendizado, estou usando esse projeto para aprender direito como funcionam as <a href="http://en.wikipedia.org/wiki/GNU_build_system" target="_blank">autotools</a> e, assim, criar projetos portáveis para quaisquer ambientes UNIX.</p>
<p>As features da liblogger até a presente data são:</p>
<ul>
<li>Logar a data</li>
<li>Logar os milisegundos</li>
<li>Logar em um arquivo</li>
<li>Logar em stderr</li>
<li>Configuração da API via flags</li>
<li>Interceptação do que iria para <em>stderr</em></li>
</ul>
<p>As próximas features que pretendo desenvolver serão:</p>
<ul>
<li>Logar em banco de dados MySQL</li>
<li>Enviar a mensagem de log via HTTP GET, ou HTTP POST para um web-service</li>
<li>Criar um conjunto de funções para ler os logs antigos</li>
</ul>
<p>Como a ideia do projeto é estudar portabilidade, sua compilação não deverá ser mais complexa que o clássico: <em>./configure ; make ; make install</em>. Sua utilização também é simples, e possui um código exemplo no site <a href="http://packages.geekvault.org/liblogger/" target="_blank">oficial</a> e a ideia é manter a simplicidade.</p>
<p>A idéia toda é poder criar tanto um wraper para <em>perror()</em> quanto logs utilizando a mesma sintaxe de um simples <em>printf()</em>.</p>
<p>Como sempre, eu não posso garantir que a ferramenta está perfeita (por exemplo, parece que ela possui um memory leak de 568 bytes, criado ao abrir o arquivo de log, talvez ela não esteja fechando o arquivo, mesmo chamando <em>fclose()</em> no final. Certamente outros bugs irão aparecer, para isso conto com a compreensão de enviar um email para zarnick@geekvault.org, com o subject [libtool - bug].</p>
<p>Bom, é isso, espero que essa ferramenta seja útil para vocês assim como está sendo para mim <img src='http://www.geekvault.org/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2008/11/liblogger-01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Árvores!</title>
		<link>http://www.geekvault.org/2008/07/arvores/</link>
		<comments>http://www.geekvault.org/2008/07/arvores/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 14:53:25 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[ANSI C]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Stuffs]]></category>
		<category><![CDATA[Estrutura de dados]]></category>
		<category><![CDATA[OpenSource]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[Trees]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=172</guid>
		<description><![CDATA[Demorou, vou assumir, mas finalmente eu programei mais uma estrutura de dados simples, a árvore. Vou preparar uma explicação sobre o que é uma árvore em computação (essa pode ser um pouco complexa) e assim que eu tiver eu posto aqui, mas por enquanto vocês podem ver o código no svn (http://svn.geekvault.org/c/trees) Have fun.]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2008%2F07%2Farvores%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2008%2F07%2Farvores%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Demorou, vou assumir, mas finalmente eu programei mais uma estrutura de dados simples, a <a href="http://svn.geekvault.org/viewvc/bin/cgi/viewvc.cgi/C/trees/" target="_blank">árvore</a>. Vou preparar uma explicação sobre o que é uma árvore em computação (essa pode ser um pouco complexa) e assim que eu tiver eu posto aqui, mas por enquanto vocês podem ver o código no svn (http://svn.geekvault.org/c/trees)</p>
<p>Have fun.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2008/07/arvores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Incluindo cabeçalhos de forma segura em C</title>
		<link>http://www.geekvault.org/2008/06/incluindo-cabecalhos-de-forma-segura-em-c/</link>
		<comments>http://www.geekvault.org/2008/06/incluindo-cabecalhos-de-forma-segura-em-c/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 12:45:44 +0000</pubDate>
		<dc:creator>Zarnick</dc:creator>
				<category><![CDATA[ANSI C]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Tips]]></category>

		<guid isPermaLink="false">http://www.geekvault.org/?p=126</guid>
		<description><![CDATA[Certo dia eu estava conversando com um amigo meu sobre C e ele me falou que a coisa que ele mais odiava era ter que tomar cuidado com a ordem dos include que ele fazia quando iniciava um projeto em C. Ora, vamos pensar um pouco, se você incluir duas vezes o cabeçalho stdio.h por [...]]]></description>
			<content:encoded><![CDATA[<div class="tweetmeme_button" style="float: right; margin-left: 10px;">
			<a href="http://api.tweetmeme.com/share?url=http%3A%2F%2Fwww.geekvault.org%2F2008%2F06%2Fincluindo-cabecalhos-de-forma-segura-em-c%2F"><br />
				<img src="http://api.tweetmeme.com/imagebutton.gif?url=http%3A%2F%2Fwww.geekvault.org%2F2008%2F06%2Fincluindo-cabecalhos-de-forma-segura-em-c%2F&amp;source=zarnick&amp;style=compact&amp;service=bit.ly" height="61" width="50" /><br />
			</a>
		</div>
<p>Certo dia eu estava conversando com um amigo meu sobre C e ele me falou que a coisa que ele mais odiava era ter que tomar cuidado com a ordem dos <em>include</em> que ele fazia quando iniciava um projeto em C. Ora, vamos pensar um pouco, se você incluir duas vezes o cabeçalho stdio.h por exemplo, em dois arquivos diferentes, e incluir os dois, não da erro certo?<br />
<span id="more-126"></span><br />
O que eu quero mostrar é isso:<br />
[arquivo1.h]<br />
#include &lt;stdio.h&gt;<br />
.<br />
.<br />
[arquivo2.h]<br />
#include &lt;stdio.h&gt;<br />
.<br />
.<br />
[main.c]<br />
#include &#8220;arquivo1.h&#8221;<br />
#include &#8220;arquivo2.h&#8221;<br />
#include &lt;stdio.h&gt;<br />
.<br />
.<br />
Claramente estamos incluindo 3 vezes o mesmo cabeçalho, como C não aceita re-declaração, isso deveria acusar um erro, porém não acusa. Cosa você esteja pensando que deve ser algo extremamente complicado, pense novamente, tudo que difere na stdio.h para os seus cabeçalhos .h é o inicio e o final. É um simples &#8220;<em>hack</em>&#8221; utilizando diretivas de compilação #ifndef, #define, e #endif. Siga esse modelo de cabeçalho:<br />
[arquivo.h]<br />
#ifndef __ARQUIVO_H<br />
#define __ARQUIVO_H<br />
.<br />
.<br />
#endif<br />
A diretiva #ifndef checa se __ARQUIVO_H já foi definido ou não, caso não tenha sido, inclui o código até encontrar #endif, caso já tenha sido, não inclui nada até #endif. Dessa forma, contanto que __ARQUIVO_H sejá único, os problemas de redeclaração de cabeçalhos estão resolvidos.<br />
Fica a dica.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.geekvault.org/2008/06/incluindo-cabecalhos-de-forma-segura-em-c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
