<?xml version="1.0" encoding="UTF-8"?>
<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>Krzysztof Wesołowski &#187; Ada</title>
	<atom:link href="http://kwesoly.net/kategoria/programowanie/ada/feed/" rel="self" type="application/rss+xml" />
	<link>http://kwesoly.net</link>
	<description>Programowanie, elektronika, automatyka - doświadczenia i projekty</description>
	<lastBuildDate>Wed, 07 Sep 2011 14:03:29 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=</generator>
		<item>
		<title>Multiplayer Arkanoid &#8211; źródła</title>
		<link>http://kwesoly.net/programowanie/ada/multiplayer-arkanoid-zrodla/</link>
		<comments>http://kwesoly.net/programowanie/ada/multiplayer-arkanoid-zrodla/#comments</comments>
		<pubDate>Thu, 12 Feb 2009 01:50:30 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[Ada]]></category>
		<category><![CDATA[arkanoid]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[gra]]></category>

		<guid isPermaLink="false">http://kwesoly.net/?p=307</guid>
		<description><![CDATA[W związku z wpisem i zakończeniem zbierania projektów od naszego roku prowadzący zezwolił na publikację źródeł programu zaliczeniowego. Są to źródła opublikowanego wcześniej programu, wraz z naniesionymi minimalnymi poprawkami i ulepszeniami.  Mam nadzieję, że przysłużą się jako przykład, pokazujący kilka przydatnych w pisaniu projektów z języka Ada możliwości: Użycia przystosowanych do współbieżności struktur danych wysokiego [...]]]></description>
			<content:encoded><![CDATA[<p>W związku z wpisem i zakończeniem zbierania projektów od naszego roku prowadzący zezwolił na publikację źródeł programu zaliczeniowego. Są to źródła <a href="http://kwesoly.net/programowanie/ada/arkanoid-gra-w-jezyku-ada/">opublikowanego wcześniej</a> programu, wraz z naniesionymi minimalnymi poprawkami i ulepszeniami.  Mam nadzieję, że przysłużą się jako przykład, pokazujący kilka przydatnych w pisaniu projektów z języka Ada możliwości:</p>
<ul>
<li>Użycia przystosowanych do współbieżności struktur danych wysokiego poziomu (obiekty chronione).</li>
<li>Dziennik działania programu w oparciu o plik, wykorzystujący obiekt chroniony.</li>
<li>Zastosowanie grafiki trójwymiarowej za pomocą GLUT i Open GL, zarówno do obsługi wyświetlania jak i wejścia.</li>
<li>Wielowątkowa struktura programu o stosunkowo jasnym podziale odpowiedzialności pomiędzy zadania.</li>
</ul>
<p><span id="more-307"></span>Poza powyższymi program potrafi symulować bardzo prostego gracza komputerowego i wykorzystuje oświetlenie w celu urozmaicenia grafiki pozbawionej tekstur. Pełniejszy opis jego działania można znaleźć w <a href="http://download.kwesoly.net/2008/12/sprawozdanie_arkanoid.pdf">Multiplayer Arkanoid - sprawozdanie</a></p>
<p>Program korzysta z oświetlenia, dzięki czemu wygląda w miarę ciekawie bez zastosowania tekstur:</p>
<div id="attachment_310" class="wp-caption alignnone" style="width: 160px"><a href="http://download.kwesoly.net/2009/02/arkanoid1.png"><img class="size-thumbnail wp-image-310" title="Screen z gry - numer 1" src="http://download.kwesoly.net/2009/02/arkanoid1-150x150.png" alt="Screen z gry - numer 1" width="150" height="150" /></a><p class="wp-caption-text">Screen z gry - numer 1</p></div>
<div id="attachment_311" class="wp-caption alignnone" style="width: 160px"><a href="http://download.kwesoly.net/2009/02/arkanoid2.png"><img class="size-thumbnail wp-image-311" title="Screen z gry - numer 2" src="http://download.kwesoly.net/2009/02/arkanoid2-150x150.png" alt="Screen z gry - numer 2" width="150" height="150" /></a><p class="wp-caption-text">Screen z gry - numer 2</p></div>
<p>Poniżej link do dwóch wersji programu:</p>
<ul>
<li>Wersja pełna, zawiera cały katalog projektu, wraz z obiektami pośrednimi kompilacji, jak i wynikowymi plikami exe.<a href="http://download.kwesoly.net/2009/02/arkanoid_full_package.zip"><br />
Arkanoid - wersja z źródłami, oraz 2 wersjami binarki *.exe</a></li>
<li>Oraz wersja dla chcących skompilować ją samemu - tylko źródła i ustawienia projektu.<br />
<a href="http://download.kwesoly.net/2009/02/arkanoid_sources.zip">Arkanoid - tylko źródła</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/ada/multiplayer-arkanoid-zrodla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integracja i używanie biblioteki GLUT dla OpenGL z kompilatorem GNAT</title>
		<link>http://kwesoly.net/programowanie/ada/integracja-glut-opengl-gnat/</link>
		<comments>http://kwesoly.net/programowanie/ada/integracja-glut-opengl-gnat/#comments</comments>
		<pubDate>Fri, 12 Dec 2008 11:22:09 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[Ada]]></category>
		<category><![CDATA[binding]]></category>
		<category><![CDATA[glut]]></category>
		<category><![CDATA[openGL]]></category>

		<guid isPermaLink="false">http://kwesoly.net/?p=203</guid>
		<description><![CDATA[Dziś wpis gościnny, na temat używania bibliotek GLUT i OpenGL'a w języku Ada. Autorem wpisu jest Jakub Tutro, student II roku Automatyki i Robotyki. Opisuje on pokrótce podstawy używania ww. bibliotek do celów wizualizacji wszelkich symulacji i obiektów trójwymiarowych, co ma duże znaczenie dla walorów estetycznych i użyteczności wszelkich programów. Zapraszam serdecznie do przeczytania, oraz [...]]]></description>
			<content:encoded><![CDATA[<p>Dziś wpis gościnny, na temat używania bibliotek GLUT i OpenGL'a w języku Ada. Autorem wpisu jest Jakub Tutro, student II roku Automatyki i Robotyki. Opisuje on pokrótce podstawy używania ww. bibliotek do celów wizualizacji wszelkich symulacji i obiektów trójwymiarowych, co ma duże znaczenie dla walorów estetycznych i użyteczności wszelkich programów.</p>
<p>Zapraszam serdecznie do przeczytania, oraz zgłaszania wszelkich uwag w komentarzach do tego wpisu lub bezpośrednio do autora na adres jtutro@gmail.com.</p>
<p><span id="more-203"></span></p>
<h2>Instalacja GLUT'a i win32ada</h2>
<ol>
<li>Instalujemy Eclipse zgodnie z <a href="http://kwesoly.net/programowanie/ada/gnatbench-eclipse-ide/">tym tutorialem</a>.</li>
<li>Ściągamy OpenGL and <a href="http://www.eecs.usma.edu/download/Glut3.7.6.zip">GLUT Bindings</a> for Windows</li>
<li>Ściągamy win32ada (np ze stronki http://libre.adacore.com =&gt; klikamy Download GNAT GPL Edition =&gt; wybieramy x86-windows i potem w "katalogu" win32ada mamy plik win32ada-gpl-2008-nt.exe</li>
<li>instalujemy win32ada do katalogu z GNAT'em z domyślnymi ustawieniami.</li>
<li>Kopiujemy plik glut32.dll z ..\Glut3.7.6\Bindings do ..\Windows\system, dzięki temu nie będziemy musieli mieć go w katalogu z każdym plikiem exe.</li>
<li>Kopiujemy plik libglut32.a z katalogu ..\Glut3.7.6\Bindings do ..\GNAT\2008\lib\win32ada</li>
<li>Kopiujemy pliki win32-glut.ads i win32-glut.adb z katalogu ..\Glut3.7.6\Bindings do katalogu ..\GNAT\2008\include\win32ada</li>
<li>Wchodzimy wierszem poleceń do katalogu ..\GNAT\2008\include\win32ada i odpalamy "gnatmake win32-glut"</li>
<li>Pliki które utworzyły sie podczas kompilacji, czyli: win32.ali , win32-gl.ali i win32-glut.ali i takie same tylko z rozszerzeniem *.o przenosimy do ..\GNAT\2008\lib\win32ada  ..i to wszystko <img src='http://kwesoly.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   Teraz by móc korzystać z biblioteki GLUT w naszym projekcie dodajemy do pliku *.gpr naszego projekt na początku linijkę:  with "win32ada";  oraz gdzieś kawałek dalej, już wewnątrz projektu:  package Linker is for Default_Switches ("Ada") use ("-lwin32ada", "-lglu32", "-lopengl32", "-lglut32"); end Linker;  i w razie potrzeby dołączamy w naszych plikach pakiety win32.glut, win32.glu i win32.gl . Wszystko można zobaczyć w <a href="#zrodla">przykładowych plikach ze źródłami.</a></li>
</ol>
<h2>1. Wstęp.</h2>
<p style="justify">OpenGL jest biblioteką graficzną przeznaczoną do tworzenia grafiki dwu- i trój- wymiarowej. Dzięki tej bibliotece możemy tworzyć aplikacje o jakości nie ustępującej dzisiejszym grom, które notabene też w pewnej części są tworzone na bazie tej biblioteki. OpenGL nie jest odrębnym językiem programowania, ale interfejsem API, czyli Application Programming Interface. Podstawową cechą OpenGL?a jest to, że jest on maszyną stanów. Na stan składa wiele trybów działania i parametrów aktualnych, które można ustawiać i zmieniać, a także odkładać na stosie a później je odtwarzać. Wszystkie ustawienia mają wpływ na otrzymany rezultat. Ustawiony parametr ma stałą wartość aż do jego następnej zmiany. Przykładami takich parametrów mogą być: kolor, tekstura, ustawienia oświetlenia, macierz projekcji, macierz modelowania. OpenGL ma bardzo duże możliwości, ale jest jednocześnie interfejsem niskopoziomowym. Zawiera on funkcje pozwalające rysować pojedyncze linie, wielokąty, zmieniające macierze widoku, ale brak w nim np. funkcji pozwalających ustawić obserwatora w danym punkcie w przestrzeni i skierować jego wzrok na inny punkt, czy też funkcji pozwalających rysować nam całe bryły, takie jak sfery, stożki, prostopadłościany, ostrosłupy. Funkcje te udostępnia dodatek do OpenGL?a w postaci biblioteki pomocniczej GLU (GL Utility Library). Poza bibliotekami GL (czysty OpenGL) i GLU możemy wykorzystywać jeszcze inne biblioteki dodatkowe. Związane jest to z tym, że GL zajmuje się w gruncie rzeczy tylko renderingiem grafiki i nie udostępnia żadnych funkcji związanych z tworzeniem interfejsu, obsługą urządzeń peryferyjnych takich jak myszka, czy klawiatura, a także obsługą środowiska okienkowego. Dodatkową biblioteką posiadającą takie funkcje jest np. GLUT, czyli GL Utility Toolkit.</p>
<h2>2. Składnia.</h2>
<p style="justify">OpenGL ma bardzo specyficzną składnię. Niemalże wszystkie polecenia zaimplementowane są jako globalne funkcje i procedury. Wiele funkcji wykonuje te same operacje i różnią się tylko zbiorem argumentów. Nazwy wszystkich funkcji poprzedzone są przedrostkiem gl-, glu- lub glut- w zależności od biblioteki z której pochodzą. Nie można też nie wspomnieć, że biblioteka ta definiuje własne typy danych. Co prawda odpowiadają one typom danych ze znanych języków programowania, jednak dzięki temu, że są one zdefiniowane wewnątrz biblioteki uzyskujemy dużą przenośność kodu stworzonego z jej uzyciem. Dodatkowo na przenośność wpływa także składnia o której wspominałem wcześniej. Dzięki temu, że wszystkie funkcje i procedury są globalne, a nie są np. obiektami typowymi dla języka C++, to nie ma większego problemu z przystosowaniem i używaniem OpenGL?a w np. Adzie.</p>
<p style="justify">Podstawowe typy danych w OpenGL:</p>
<table border="0">
<tbody>
<tr>
<td>Typ OpenGL</td>
<td>Ilość bitów</td>
<td>Opis</td>
</tr>
<tr>
<td>GLboolean</td>
<td>1</td>
<td>Typ logiczny</td>
</tr>
<tr>
<td>GLbyte</td>
<td>8</td>
<td>Liczba całkowita ze znakiem</td>
</tr>
<tr>
<td>GLubyte</td>
<td>8</td>
<td>Liczba całkowita bez znaku</td>
</tr>
<tr>
<td>GLchar</td>
<td>8</td>
<td>Znak tekstowy</td>
</tr>
<tr>
<td>GLshort</td>
<td>16</td>
<td>Liczba całkowita ze znakiem</td>
</tr>
<tr>
<td>GLushort</td>
<td>16</td>
<td>Liczba całkowita bez znaku</td>
</tr>
<tr>
<td>GLint</td>
<td>32</td>
<td>Liczba całkowita ze znakiem</td>
</tr>
<tr>
<td>GLuint</td>
<td>32</td>
<td>Liczba całkowita bez znaku</td>
</tr>
<tr>
<td>GLsizei</td>
<td>32</td>
<td>Liczba całkowita nieujemna</td>
</tr>
<tr>
<td>GLenum</td>
<td>32</td>
<td>Typ wyliczeniowy całkowity</td>
</tr>
<tr>
<td>GLfloat</td>
<td>32</td>
<td>Liczba zmiennoprzecinkowa</td>
</tr>
<tr>
<td>GLdouble</td>
<td>32</td>
<td>Liczba zmiennoprzecinkowa(większa dokładność)</td>
</tr>
</tbody>
</table>
<h2>3.	Układ współrzędnych.</h2>
<p style="justify">Biblioteka OpenGL stosuje prawoskrętny układ współrzędnych kartezjańskich, w którym oś OZ skierowana jest prostopadle do płaszczyzny monitora. Warto także pamiętać, że literatura informatyczna preferuje lewoskrętne układy współrzędnych z osią OZ skierowaną w głąb monitora.</p>
<h2>4.	Barwy.</h2>
<p style="justify">Biblioteka OpenGL wykorzystuje barwy z palety RGB, opierającej się na trzech podstawowych kolorach: czerwonym, zielonym i niebieskim. W razie potrzeby można uzupełnić palety barw o kanał alfa (RGBA). Wybór trybu w jakim będzie generowany obraz jest dokonywany podczas tworzenia okna renderingu.</p>
<h2>6.	Inicjalizacja ? czyli od czego zacząć.</h2>
<p style="justify">Zacznę od tego, że wszystkie funkcje do obsługi OpenGL w naszym programie umieścimy w osobnym pakiecie, aby zwiększyć przejrzystość naszego programu. Dlatego też tworzymy pakiet my_OpenGL (my_OpenGL.ads, my_OpenGL.ads), który włączamy do naszego programu. Omówię najpierw pokrótce budowę tego pakietu i funkcje w nim użyte, a potem przejdziemy do przykładów i rozbudowy pakietu. (pliki pakietu do pobrania tutaj). Pierwsza i najważniejszą, jeżeli w ogóle chcemy korzystać z OpenGL i GLUT?a, procedurą jest Init_OpenGL. Procedura ta odpowiedzialna jest za inicjalizację OpenGL i tworzenie okna renderingu (czyli po prostu okna w którym możemy sobie porysować). Jako parametry przyjmuje Stringa z nazwą jaka ma się wyświetlać na pasku tytułowym okna, oraz zmienna typu Integer w której zapisuje numer utworzonego okna (nie będziemy tego używać, gdyż będziemy tworzyć tylko jedno okno). W części deklaracyjnej tej procedury mamy trochę ?pragma czarów?, które są niezbędne żeby zainicjalizować GLUT?a, nie pytajcie po co, bo tak po prostu jest, że gdy chcemy zrobić coś fajnego w Adzie to w 99% kończy się to na imporcie z C? kopiujemy to grzecznie tam gdzie nam potrzebne i sobie jest i działa ? taki dogmat ideologii ?GLUT in ADA?. Analizujemy po kolei wszystkie funkcje i procedury zawarte w procedurze Init_OpenGL:</p>
<p>Inicjalizacja biblioteki GLUT:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">GlutInit <span class="br0">&#40;</span>Argc&#39;<span class="kw3">Access</span>, Argv<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Inicjalizacja bufora ramki (parametry podajemy jako logiczną sumę, odpowiednio: podwójne buforowanie, bufor barw RGB):</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">GlutInitDisplayMode <span class="br0">&#40;</span>GLUT_DOUBLE <span class="kw2">or</span> GLUT_RGB<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Ustawianie rozmiarów okna które chcemy stworzyć (w pikselach ? szerokość i wysokość):</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">GlutInitWindowSize<span class="br0">&#40;</span><span class="nu0">640</span>, <span class="nu0">480</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Ustawianie pozycji okna (odległość lewego górnego rogu okna od lewego górnego rogu ekranu w pikselach):</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">GlutInitWindowPosition<span class="br0">&#40;</span><span class="nu0">100</span>,<span class="nu0">100</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Tworzenie okna rendering o tytule Title:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">Window := GlutCreateWindow<span class="br0">&#40;</span>Title<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p style="justify">Przypisanie procedury Display jako głównej procedury generującej scenę. W GLUT?cie jest taka idea, że podczas pracy program wchodzi w nieskończoną pętlę (GlutMainLoop) i kręci się w niej uruchamiając różne funkcje i procedury, do generowania sceny, obsługi peryferiów itd. Aby wszystko działało musimy przypisać odpowiednie funkcje, bądź procedury funkcjom GLUT?a. Podajemy więc wskaźniki do naszych funkcji GLUT?owi.</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">GlutDisplayFunc <span class="br0">&#40;</span>Display&#39;Unrestricted_Access<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Przypisanie procedury Reshape jako procedury uruchamianej w czasie zmiany wymiarów okna:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">GlutReshapeFunc <span class="br0">&#40;</span>Reshape2&#39;Unrestricted_Access<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Czyszczenie okna kolorem (1.0, 1.0, 1.0 ? czyli po prostu białym ? to będzie nasze tło):</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">GlClearColor<span class="br0">&#40;</span><span class="nu0">1.0</span>, <span class="nu0">1.0</span>, <span class="nu0">1.0</span>, <span class="nu0">1.0</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Włączanie opcji która pozwala nam używać barw podczas rysowania:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glEnable<span class="br0">&#40;</span>GL_COLOR_MATERIAL<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<h2>7.	Skąd w OpenGL?u jakieś macierze i do czego mogą się przydać?!</h2>
<p style="justify">Wszystkie operacje jakie wykonujemy na naszej scenie i jej obiektach są tak naprawdę operacjami na macierzach. Jest to o tyle dobre rozwiązanie, że po pierwsze za pomocą macierzy można łatwo opisywać przekształcenia, a po drugie składanie przekształceń sprowadza się wtedy do mnożenia macierzy, co sprawia, że wszystko jest łatwe i intuicyjne. Mamy do dyspozycji 3 rodzaje macierzy oraz stosy na które możemy je odkładać i z których możemy je podnosić. Wyboru macierzy dokonujemy za pomocą procedury: glMatrixMode (GLenum)</p>
<p style="justify">gdzie parametrem może być: GL_MODELVIEW ? macierz widoku ? służy do wykonywania przekształceń geometrycznych takich jak translacje o wektor, obroty itp. GL_PROJECTION ? macierz rzutowania ? jak sama nazwa wskazuje definiuje rzutowanie przestrzeni 3D na płaszczyznę ekranu GL_TEXTURE ? macierz tekstury (nie będzie tutaj omawiana)</p>
<p style="justify">Gdy wybierzemy jakąś macierz, wszystkie operacje wykonywane później będą dotyczyły tej właśnie macierzy, aż do momentu, gdy nie wybierzemy innej. Każda macierz na początku zawiera śmieci, więc musimy ją wyczyścić ładując do niej macierze jednostkową za pomocą procedury: glLoadIdentity</p>
<p style="justify">W procedurze Reshape użyliśmy macierzy rzutowania i zdefiniowaliśmy rzutowanie perspektywiczne przy pomocy procedury:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">gluPerspective <span class="br0">&#40;</span>GLdouble fovy,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GLdouble aspect,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GLdouble zNear,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GLdouble zFar<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p style="justify">gdzie parametr fovy określa w stopniach kąt widzenia obserwatora zawarty w płaszczyźnie YZ, a aspect jest stosunkiem szerokości do wysokości przedniej płaszczyzny odcinania, czyli górnej podstawy ostrosłupa ograniczającego scenę 3D. Parametry zNear i zFar skolei ograniczają bryłę obcinania od przodu i od tyłu.</p>
<p style="justify">Bryła obcinania to taki ścięty ostrosłup, który ogranicza przestrzeń która będzie widoczna dla obserwatora (tzn elementy sceny które leżą w tej przestrzeni będą widoczne) umożliwia to ukrywanie elementów które znajdują się daleko, na horyzoncie, albo tych które znajdują się bardzo blisko, a także ustalenie kąta pod jakim widzimy obiekty. Proponuję poeksperymentować z różnymi wartościami parametrów tej funkcji. Zajmiemy się teraz obszarem renderingu. Normalnie obszar renderingu zajmuje początkowo całe okno, i nie jest modyfikowany podczas zmiany rozmiarów tego okna. W efekcie elementy sceny 3D zawsze znajdują się w tym samym miejscu względem lewego dolnego narożnika okna. W aplikacjach pracujących w systemach okienkowych problem zmiany rozmiaru okna jest jednak tak powszechny, że wymaga specjalnego potraktowania. Jednym z możliwych sposobów jego rozwiązania jest dynamiczna modyfikacja obszaru renderingu. Służy to tego procedura (operująca na macierzy rzutowania):</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glViewport <span class="br0">&#40;</span>GLint x, GLint y,GLsizei width, GLsizei height<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p style="justify">której parametry oznaczają:<em>x, y</em> - współrzędne lewego dolnego narożnika obszaru renderingu względem lewego dolnego narożnika okna, <em>width</em> - szerokość okna renderingu, <em>height</em> - wysokość okna renderingu. Domyślnie obszar renderingu zajmuje całe okno udostępnione dla aplikacji OpenGL. Możemy jednak modyfikować obszar renderingu na dwa sposoby. Pierwszy polega na objęciu obszarem renderingu całego dostępnego okna, drugi na takim wyborze okna renderingu aby okno zachowało pierwotny aspekt obrazu, czyli stosunek szerokości do wysokości. Oczywiście przy zastosowaniu pierwszej metody elementy sceny będą zazwyczaj zdeformowane (procedura Reshape1). W drugim przypadku ustawiamy okno renderingu, by zawsze wypadało na środku naszego okna aplikacji. Dzięki temu zachowujemy aspekt i elementy sceny nie deformują się (procedura Reshape2). Aby zobaczyć efekt wystarczy podmienić procedurę w funkcji GlutReshapeFunc na Reshape1 lub Reshape2.</p>
<p style="justify"><strong>Generowanie sceny 3D - podstawy.</strong></p>
<p style="justify">Teraz omówię działanie najważniejszej procedury w naszym programie, odpowiedzialnej za generowanie sceny 3D ? procedury Display. Procedura przekazywana do GlutDisplayFunc odpowiedzialna jest za rysowanie całej sceny 3D, czyli w gruncie rzeczy tego co widzimy w naszym oknie aplikacji. Najpier zaczniemy od prostego przykładu - rysowanie wersorów układu współrzędnych -każdy w innym kolorze. Żeby wogóle możliwe było posługiwanie sie kolorami musimy mieć włączoną opcje:</p>
<p>Włączanie używania kolorów dla materiałów</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">gluLookAt<span class="br0">&#40;</span>GLdouble eyex,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GLdouble eyey,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GLdouble eyez,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GLdouble centerx,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GLdouble centery,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GLdouble centerz,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GLdouble upx,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GLdouble upy,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; GLdouble upz<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p style="justify">(Nawiasem wspomnę, że zanim zaczniemy rysować coś w 2D musimy wyłączyć oświetlenie, jeżeli go używamy, gdyż może się okazać, że światło o pewnej barwie, po odbiciu od jakiegoś obiektu padnie na rysowaną przez nas linię i często całkowicie zmieni jej kolor! To dla ciekawskich, którzy sobie poszukają w internecie o oświetleniu <img src='http://kwesoly.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
<p style="justify">Pierwsza procedura w Display służy do ustawiania pozycji obserwatora, oraz punktu na który ma patrzeć:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glClearColor <span class="br0">&#40;</span><span class="nu0">1.0</span>,<span class="nu0">1.0</span>,<span class="nu0">1.0</span>,<span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glClear <span class="br0">&#40;</span>GL_COLOR_BUFFER_BIT<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p style="justify">pierwsze trzy argumenty to pozycja oka obserwatora w układzie współrzędnych, następne trzy to pozycja punktu na który patrzy obserwator, a kolejne trzy to (i tutaj własna interpretacja) wektor którego zwrot wskazuje grzywkę obserwatora  (górę) <img src='http://kwesoly.net/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> :D:D generalnie chodzi o to, że jeżeli oko obserwatora zaczepimy w punkcie [eyex,eyey,eyez] to jeszcze możemy kręcić całym obserwatorem wokół i w zależności o tego jak go obrócimy będzie widział obraz normalnie, bokiem, albo do góry nogami.  Nie jest ważna długość tego wektora gdyż i tak zawsze przekształcany jest on na wektor jednostkowy.</p>
<p style="justify">Następnie mamy dwie funkcje dotyczące kolorów:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glBegin <span class="br0">&#40;</span>GL_LINES<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glColor3d <span class="br0">&#40;</span><span class="nu0">1.0</span>,<span class="nu0">0.0</span>,<span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glVertex3f <span class="br0">&#40;</span><span class="nu0">0.0</span>, <span class="nu0">0.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glVertex3f <span class="br0">&#40;</span><span class="nu0">1.0</span>, <span class="nu0">0.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">glColor3d <span class="br0">&#40;</span><span class="nu0">0.0</span>,<span class="nu0">1.0</span>,<span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glVertex3f <span class="br0">&#40;</span><span class="nu0">0.0</span>, <span class="nu0">0.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glVertex3f <span class="br0">&#40;</span><span class="nu0">0.0</span>, <span class="nu0">1.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">glColor3d <span class="br0">&#40;</span><span class="nu0">0.0</span>,<span class="nu0">0.0</span>,<span class="nu0">1.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glVertex3f <span class="br0">&#40;</span><span class="nu0">0.0</span>, <span class="nu0">0.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glVertex3f <span class="br0">&#40;</span><span class="nu0">0.0</span>, <span class="nu0">0.0</span>, <span class="nu0">1.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glEnd;</div>
</li>
</ol>
</div>
<p style="justify">pierwszą już znamy - odpowiada za wyczyszczenie całej sceny kolorem zdefiniowanym w nawiasie (w formacie RGB, gdzie skala każdego koloru rozciąga się od 0.0 do 1.0), w naszym przypadku białym, natomiast druga funkcja służy do czyszczenia bufora koloru.</p>
<p style="justify">Teraz zaczyna się prawdziwe rysowanie. Cały blok:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glMatrixMode<span class="br0">&#40;</span>GL_MODELVIEW<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glLoadIdentity;</div>
</li>
</ol>
</div>
<p style="justify">służy do rysowania lini. Tak więc po kolei. Pierwsza procedura (glBegin) mówi bibliotece że zaczynamy rysowanie jakiegoś prymitywu (prosty element rysowany za pomocą czystego OpenGL'a). Funkcja ta przyjmuje typ wyliczeniowy i jej argument może przyjmować następujące wartości:</p>
<p style="justify">GL_POINTS - rysowanie punktów (Vertex {n} definiuje n-ty punkt, rysowanych jest n punktów) GL_LINES - rysowanie niezależnych lini (dwa koleje Vertex {2n-1 i 2n} definiują linię, rysowanych jest n/2 niezależnych linii) GL_LINE_STRIP - rysowanie grupy połączonych lini (Vertex  {n i n+1} definiują jeden segment, rysowanych jest n-1 lini) GL_LINE_LOOP - rysowanie zamkniętej grupy lini (działa tak jak poprzednia procedura tylko dodatkowo łączy pierwszy i odstatni Vertex) GL_TRIANGLES - rysowanie trójkąta (każda kolejna trójka Vertex'ów {3n-2, 3n-1 i 3n} definiuje jeden trójkąt, rysowanych jest n/3 trójkątów) GL_TRIANGLE_STRIP  - rysuje  grupę połączonych trójkątów (trzy pierwsze Vertex'y tworzą jeden trójką, następny tworzą Vertexy o numerach 2,3,4 itd, ogólnie każdy kolejny trójkąt tworzą Vertex'y {n, n+1, n+2}, rysowanych jest n-2 trójkątów) GL_TRIANGLE_FAN - rysuje wiatraczek z trójkątów (pierwszy Vertex jest środkiem wiatraczka i wspólnym wierzchołkiem wszystkich trójkątów, a każda kolejna para definiuje nowy trójkąt, ogólnie każdy trójką budują Vertex'y {1, n+1 i n+2}, rysowanych jest n-2 trójkątów) GL_QUADS - rysuje kwadrat (cztery kolejne Vertex'y {4n-3, 4n-2, 4n-1 i 4n} definiują osobny kwadrat, rysowanych jest n/4 kwadratów) GL_QUAD_STRIP - rysuje grupę kwadratów (cztery pierwsze Vertex'y definiują pierwszy kwadrat, a potem każdy następny kwadrat budowany jest z ostatnich dwóch Vertex'ów poprzedniego kwadratu i dwóch nowych, ogólnie budowanych jest n/2-1 kwadratów) GL_POLYGON - rysuje pojedynczy wielobok (każdy Vertex jest wierzchołkiem wieloboku)</p>
<p style="justify">następnie mamy kolejne Vertex'y, czy tak naprawdę poprostu współrzędne punktów w przestrzeni. W między czasie używam także procedury do zmiany koloru. Procedura glColor3d przyjmuje kolor w formacie RGB (jako GLdouble) i ustawia aktualny kolor, jaki będzie wykorzystywany do rysowania, aż do momentu gdy go zmienimy. Rysowanie prymitywu kończymy procedurą glEnd. Całą procedurę rysowania Display kończymy natomiast wywołaniem procedury glutSwapBuffers, która to procedura odpowiada za wypisanie całego bufora na ekran. Generalnie chodzi o to, że rysując tak naprawdę rysujemy w buforze a nie na ekranie i dopiero na końcu całą narysowaną scenę zrzucamy z bufora na ekran. Zapobiega to mruganiu ekranu w trakcie rysowania co można czasem zaobserwowac przy niebugorowanych pakietach rysujących). Teraz możemy odpalić nasz pierwszy programik i zobaczyć jak pięknie narysuje nam wersory w trzech kolorkach <img src='http://kwesoly.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="justify"><strong>Przekształcenia geometryczne.</strong></p>
<p style="justify">Stworzymy sobie nową procedurę Display1 która będzie kopią Display i w tej kopii będziemy dodawać nowe rzeczy. Następnie podmienimy procedury w glutDisplayFunc (z Display na Display1). Najpierw jednak chciałbym wytłumaczyć pewną własność przekształceń geometrycznych które są podstawą ideologii biblioteki GL. Jeżeli chcemy otrzymać jakiś obiekt w danym punkcie przestrzeni i odpowiednio zorientowany, możemy go narysować w dowolnym miejscu przestrzeni i w dowolnej orientacji (czyli np w środku układu współrzędnych tak by krawędzie pokrywały się z osiami - inaczej mówiąc tak by było nam łatwo go narysować), a potem za pomocą przekształceń takich jak translacja o wekor i obrót, umieścić go w zadanym miejscu i pozycji. Ideologia biblioteki GL polega na czymś trochę odwrotnym, czyli przekształceniach macierzy widoku (czyli tak jakby operacje na względnym układzie współrzędnych, który sobie gdzieś przenosimy i obracamy) i dopiero następnie narysowania obiektu (w naszym przekształconym układzie współrzędnych). Wszystko stanie się jasne gdy zobaczymy przykład. Chcę tylko jeszcze wspomnieć, że składanie przekształceń jako macierzy jest banalnie proste i sprowadza się do mnożenia macierzy.</p>
<p style="justify">W nowej funkcji Display1 dopisujemy na początku następujący blok:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glTranslatef<span class="br0">&#40;</span><span class="nu0">1.0</span>,<span class="nu0">1.0</span>,<span class="nu0">1.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glBegin<span class="br0">&#40;</span>GL_QUADS<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glColor3d <span class="br0">&#40;</span><span class="nu0">0.6</span>,<span class="nu0">0.8</span>,<span class="nu0">0.8</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glVertex3f <span class="br0">&#40;</span><span class="nu0">0.0</span>, <span class="nu0">0.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glVertex3f <span class="br0">&#40;</span><span class="nu0">1.0</span>, <span class="nu0">0.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glVertex3f <span class="br0">&#40;</span><span class="nu0">1.0</span>, <span class="nu0">1.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glVertex3f <span class="br0">&#40;</span><span class="nu0">0.0</span>, <span class="nu0">1.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glEnd;</div>
</li>
</ol>
</div>
<p style="justify">pierwsza procedura wybiera macierz modelu jako aktywną a druga ładuje do niej macierz jednostkową, czyli taka która odpowiada nie przekształconemu układowi. Jest to konieczne z uwagi na to, że macierze te nie są kasowane ani tracone podczas pracy programu, są one tak jakby zmiennymi globalnymi całej aplikacji, tak więc przy kolejnym uruchomieniu funkcji Display1 na wejsciu mamy już przekształconą macierz, tak więc kolejne przekształcenia jakie wykonujemy są składane z wykonanymi poprzednio i w efekcie wszystko się psuje. jeżeli dalej nie rozumiesz o co chodzi zaraz wyjaśnię to na przykładzie. Na końcu procedury Display1 dodajemy drugi blok odpowiedzialny za rysowanie kwadratu:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">...</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="me1">glPushMatrix</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glTranslatef<span class="br0">&#40;</span><span class="nu0">1.0</span>,<span class="nu0">2.0</span>,<span class="nu0">3.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glBegin<span class="br0">&#40;</span>GL_QUADS<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glColor3d <span class="br0">&#40;</span><span class="nu0">0.6</span>,<span class="nu0">0.8</span>,<span class="nu0">0.8</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glVertex3f <span class="br0">&#40;</span><span class="nu0">0.0</span>, <span class="nu0">0.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glVertex3f <span class="br0">&#40;</span><span class="nu0">1.0</span>, <span class="nu0">0.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glVertex3f <span class="br0">&#40;</span><span class="nu0">1.0</span>, <span class="nu0">1.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glVertex3f <span class="br0">&#40;</span><span class="nu0">0.0</span>, <span class="nu0">1.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glEnd;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glPopMatrix;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glTranslatef<span class="br0">&#40;</span><span class="nu0">-1.0</span>,<span class="nu0">-2.0</span>,<span class="nu0">-3.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glBegin<span class="br0">&#40;</span>GL_QUADS<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glColor3d <span class="br0">&#40;</span><span class="nu0">0.6</span>,<span class="nu0">0.8</span>,<span class="nu0">0.8</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glVertex3f <span class="br0">&#40;</span><span class="nu0">0.0</span>, <span class="nu0">0.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glVertex3f <span class="br0">&#40;</span><span class="nu0">1.0</span>, <span class="nu0">0.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glVertex3f <span class="br0">&#40;</span><span class="nu0">1.0</span>, <span class="nu0">1.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glVertex3f <span class="br0">&#40;</span><span class="nu0">0.0</span>, <span class="nu0">1.0</span>, <span class="nu0">0.0</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glEnd;</div>
</li>
</ol>
</div>
<p>procedura glTranslatef odpowiada za translacje o wektor, natomiast reszta jest nam znana. Teraz dołóżmy jeszcze jeden taki sam blok i zobaczymy co się stanie... Drugi narysowany kwadrat jest powyżej pierwszego, co oznacza, że drugie przekształcenie zostało dodane do pierwszego. ... a co jeśli chcielibyśmy narysować pierwszy kwadrat w punkcie (-1,-1,-1) ? Oczywiście możemy najpierw wykonać przekształcenie przeciwne do pierwszego, a potem przekształcenie glTranslatef(-1.0,-2.0,-3.0)... to jest dobrze gdy jest mało operacji i wiemy jakie transformacje wykonano wcześniej... a co jeżeli wewnątrz procedury Display wywołujemy jakąś funkcje która zajmuje się rysowaniem i czyta dane z pliku... za każdym razem trzeba by zapamiętywać wszystkie przekształcenia! Ale jest lepszy sposób. Po prostu kopię danej macierzy nad która pracujemy możemy sobie po prostu odłożyć na stosie, potem wykonywać przekształcenia jakie chcemy, a po narysowaniu tego co trzeba porzucić obecna macierz i podnieść kopię ze stosu... Zrobimy to w bardzo prosty sposób. Zmienioną procedurę zapisałem jako Display2. teraz kod wygląda tak:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glutKeyboardFunc<span class="br0">&#40;</span>&amp;keyPressed<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glutKeyboardUpFunc<span class="br0">&#40;</span>&amp;keyUp<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glutSpecialFunc<span class="br0">&#40;</span>&amp;specialKeyPressed<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">glutSpecialUpFunc<span class="br0">&#40;</span>&amp;specialKeyUp<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Warto przed każdą operacją rysowania odkładać na stos macierz modelu. Od razu mówię, że nie można przyjać że macierz modelu jest zawsze jednostkowa na początku wiec nie trzeba jej pamiętać, ponieważ jeżeli chcemy ustawić odpowiednio całą scenę (wszystkie jej elementy) to wykonujemy przekształcenia na macierzy zanim jeszcze cokolwiek zaczniemy rysować i to tak przekształcona macierz dopiero powinna być odkładaną na stos przed każdym rysowaniem.</p>
<p><strong>Obsługa klawiatury.</strong> Czas dodać trochę życia do naszego programu i nauczyć się wpływać na co co jest wyświetlane w czasie rzeczywistym. GLUT dostarcza funkcji do obsługi podstawowych peryferiów takich jak klawiatura, myszka, joystick, i tablet. Do obsługi klawiatury mamy trzy procedury:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw3">procedure</span> keyPressed<span class="br0">&#40;</span> Key: GLubyte; X, Y: Integer <span class="br0">&#41;</span> <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">begin</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">case</span> Key <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">-- gdy wcisnelismy ESC</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">when</span> <span class="nu0">27</span> =&gt; OpenGL.<span class="me1">GLUT</span>.<span class="me1">glutDestroyWindow</span><span class="br0">&#40;</span>Win<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">when</span> <span class="kw3">others</span> =&gt; <span class="kw3">null</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; <span class="kw1">end</span> <span class="kw1">case</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">end</span> keyPressed;</div>
</li>
</ol>
</div>
<p>Pierwsza procedura ustala jaka funkcję zostanie wywołana po wciśnięciu klawisza (tutaj keyPressed). Jej parametry to jedna zmienna typu character, która zawiera klawisz jaki został wciśnięty oraz dwa parametry typu integer które zawierają współrzędne myszki po wciśnięciu klawisza. Przykładowa funkcja:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glutSpecialFunc <span class="br0">&#40;</span>specialKeyPressed&#39;Unrestricted_Access<span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>Analogiczną do pierwszej jest funkcja druga. Różni się ona od tamtej tylko tym, że wywołuje funkcję daną w parametrze dopiero po puszczeniu klawisza. Kolejną podobną funkcją jest trzecia której parametr zostanie wywołany po wciśnięciu klawisza specjalnego. Parametry identyczne jak wyżej za wyjątkiem pierwszego, który jest typu integer i dalej ostatnia - analogicznie jak w glutKeyboardUpFunc, z poprawką na pierwszy parametr.  Istnieją pre definiowane klawisze, których znaczenia nie trudno się domyślić:</p>
<table border="0">
<tbody>
<tr>
<td>Nazwa Stałej</td>
<td>Wartośc liczbowa</td>
</tr>
<tr>
<td>GLUT_KEY_F1</td>
<td>1</td>
</tr>
<tr>
<td>GLUT_KEY_F2</td>
<td>2</td>
</tr>
<tr>
<td>GLUT_KEY_F3</td>
<td>3</td>
</tr>
<tr>
<td>GLUT_KEY_F4</td>
<td>4</td>
</tr>
<tr>
<td>GLUT_KEY_F5</td>
<td>5</td>
</tr>
<tr>
<td>GLUT_KEY_F6</td>
<td>6</td>
</tr>
<tr>
<td>GLUT_KEY_F7</td>
<td>7</td>
</tr>
<tr>
<td>GLUT_KEY_F8</td>
<td>8</td>
</tr>
<tr>
<td>GLUT_KEY_F9</td>
<td>9</td>
</tr>
<tr>
<td>GLUT_KEY_F10</td>
<td>10</td>
</tr>
<tr>
<td>GLUT_KEY_F11</td>
<td>11</td>
</tr>
<tr>
<td>GLUT_KEY_F12</td>
<td>12</td>
</tr>
<tr>
<td>GLUT_KEY_LEFT</td>
<td>100</td>
</tr>
<tr>
<td>GLUT_KEY_UP</td>
<td>101</td>
</tr>
<tr>
<td>GLUT_KEY_RIGHT</td>
<td>102</td>
</tr>
<tr>
<td>GLUT_KEY_DOWN</td>
<td>103</td>
</tr>
<tr>
<td>GLUT_KEY_PAGE_UP</td>
<td>104</td>
</tr>
<tr>
<td>GLUT_KEY_PAGE_DOWN</td>
<td>105</td>
</tr>
<tr>
<td>GLUT_KEY_HOME</td>
<td>106</td>
</tr>
<tr>
<td>GLUT_KEY_END</td>
<td>107</td>
</tr>
<tr>
<td>GLUT_KEY_INSERT</td>
<td>108</td>
</tr>
</tbody>
</table>
<p>numery te odpowiadają odpowiednim klawiszom podczas wywoływania funkcji glutSpecialFunc i glutSpecialUpFunc. Zrobimy, więc tak by dało się obracać całą scenę wokół osi Z za pomocą strzałek lewo/prawo. Musimy więc dodać linijkę do procedury Init_OpenGL:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw3">procedure</span> specialKeyPressed<span class="br0">&#40;</span>i: <span class="kw3">in</span> integer; x: <span class="kw3">in</span> integer; y: <span class="kw3">in</span> integer<span class="br0">&#41;</span> <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">begin</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">case</span> i <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">when</span> GLUT_KEY_LEFT =&gt; rotateZ := rotateZ + <span class="nu0">3.0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">when</span> GLUT_KEY_RIGHT =&gt; rotateZ := rotateZ - <span class="nu0">3.0</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">when</span> <span class="kw3">others</span> =&gt; <span class="kw3">NULL</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">end</span> <span class="kw1">case</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glutPostRedisplay;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">end</span> specialKeyPressed;</div>
</li>
</ol>
</div>
<p>oraz napisać procedurę specialKeyPressed. Ja to zrobiłem tak:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; glRotated<span class="br0">&#40;</span>angle =&gt; rotateZ,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x &nbsp; &nbsp; =&gt; <span class="nu0">0.0</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y &nbsp; &nbsp; =&gt; <span class="nu0">0.0</span>,</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; z &nbsp; &nbsp; =&gt; <span class="nu0">1.0</span><span class="br0">&#41;</span>;</div>
</li>
</ol>
</div>
<p>rotateZ jest typu GLdouble i zadeklarowałem ją w pliku "my_OpenGL.ads". Na końcu mamy procedure glutPostRedisplay. Wymusza ona przerysowanie sceny, co jest konieczne by zobaczyć jakikolwiek efekt. Teraz wystarczy dodać w funkcji Display2 zaraz na początku wywołanie:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">MouseButton <span class="br0">&#40;</span>button: Integer; state: Integer; x:Integer; y:Integer<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>która przyjmuje kąt obrotu w stopniach, jako GLdouble, oraz wektor wokół którego ma zostać wykonany obrót (długość nie jest ważna i tak zostanie sprowadzony do wektora jednostkowego). <strong>Obsługa myszki.</strong> Obsługa myszki składa się z dwóch etapów i jest wykonywana przez dwie funkcje. Pierwsza z nich to:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">MouseMotion <span class="br0">&#40;</span>x: Integer; y: Integer<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>która wykrywa naciśnięcie i zwolnienie lewego przycisku myszki. W zależności od stanu lewego przycisku myszki ustawiana jest wartość zmiennej globalnej button state na przekazaną przez parametr state. Druga funkcja:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glutMouseFunc <span class="br0">&#40;</span>MouseButton&#39;Unrestricted_Access<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">glutMotionFunc <span class="br0">&#40;</span>MouseMotion&#39;Unrestricted_Access<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>wywoływana jest podczas ruchu kursora myszki. Parametry x i y obu funkcji oznaczają współrzędne kursora myszki w odniesieniu do układu współrzędnych okna, które oczywiście nie mają nic wspólnego ze współrzędnymi określonymi w scenie 3D. Parametr button funkcji MouseButton określa który przycisk myszki został naciśnięty lub zwolniony. Parametr ten przyjmuje jedną z wartości: ? GLUT_LEFT_BUTTON - lewy przycisk myszki,1. Przekształcenia geometryczne 8 ? GLUT_MIDDLE_BUTTON - środkowy przycisk myszki, ? GLUT_RIGHT_BUTTON - prawy przycisk myszki. Jeżeli w danym systemie myszka ma tylko dwa przyciski, wartość GLUT MIDDLE BUTTON nie będzie generowana. Natomiast w przypadku myszki z jednym przyciskiem funkcja generuje jedynie wartość GLUT_LEFT_BUTTON. Ostatni nieopisany parametr funkcji MouseButton to state, który określa czy przycisk myszki został naciśnięty (stała GLUT_UP) czy zwolniony (stała GLUT_DOWN). Aby opisane funkcje obsługi myszki działały należy je dołączyć do listy funkcji zwrotnych dopisując w procedurze Init_OpenGL:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glutWireSphere <span class="br0">&#40;</span>GLdouble radius, GLint slices, GLint stacks<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p><strong>Rysowanie brył.</strong><br />
<span style="underline;">Kula</span><br />
Powierzchnia kuli rysowana jest jako szkielet składający się z południków i równoleżników (rysunek 1). Powierzchnię kuli, której środek znajduje się w początku układu współrzędnych rysuje funkcja:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glutWireCube <span class="br0">&#40;</span>GLdouble size<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>której parametry oznaczają: ? radius - promień kuli, ? slices - ilość południków, ? stacks - ilość równoleżników. <span style="underline;"><span style="underline;">Sześcian</span></span> Sześcian o boku długości size i środku położonym w początku układu współrzędnych rysuje funkcja:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glutWireCone <span class="br0">&#40;</span>GLdouble base, GLdouble height, GLint slices, GLint stacks<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p><span style="underline;">Stożek</span><br />
Stożek rysowany jest podobnie jak kula - jako szkielet oparty na równoległe do podstawy ?południki? i tworzące biegnące od wierzchołka stożka do krawędzi jego podstawy (rysunek 2). Stożek ze środkiem podstawy umieszczonym w początku układu współrzędnych i wierzchołkiem umieszczonym na dodatniej półosi OZ rysuje funkcja:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glutWireTorus <span class="br0">&#40;</span>GLdouble innerRadius, GLdouble outerRadius, GLint sides, GLint rings<span class="br0">&#41;</span></div>
</li>
</ol>
</div>
<p>której parametry oznaczają: ? base - promień podstawy stożka, ? height - wysokość stożka, ? slices - ilość tworzących, ? stacks - ilość ?południków?.<br />
<span style="underline;">Torus</span><br />
Kolejna bryłą obrotową dostępną w bibliotece GLUT jest torus rysowany jako seria walców o nierównoległych podstawach (rysunek 3) i osi obrotu pokrywającej się z osią OZ. Torus rysuje funkcja:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glutWireOctahedron</div>
</li>
</ol>
</div>
<p>której parametry oznaczają odpowiednio: ? innerRadius - promień koła tworzącego torus, ? outerRadius - promień torusa,1. Przekształcenia geometryczne 5 ? sides - ilość ścian bocznych, z których składa się pojedynczy walec, ? rings - ilość walców, z których składa się torus.<br />
<span style="underline;">Ośmiościan</span><br />
Ośmiościan o środku położonym w początku układu współrzędnych rysuje procedura:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1">glutWireTetrahedron</div>
</li>
</ol>
</div>
<p><span style="underline;">Czworościan</span> Czworościan o środku położonym w początku układu współrzędnych rysuje procedura:</p>
<div class="geshi no ">
<ol>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
</ol>
</div>
<p>Większość brył ma też odpowiedniki w których "wire" w nazwie procedury zastąpiono słowem "solid". Funkcje te służą do rysowania modeli z ścianami wypełnionymi polygonami zamiast samych krawędzi.</p>
<p>Dodałem na końcu procedury Display2 rysowanie ośmiościanu i sześcianu i to by było na tyle, efekt można zobaczyć tutaj:</p>
<p><a name="zrodla"><strong>Źródła: </strong></a><a href="http://download.kwesoly.net/2008/12/pierwszy.zip">Kod źródłowy przykładu</a></p>
<p><strong>Bibliografia:</strong><br />
<a href="http://januszg.hg.pl/index.html">http://januszg.hg.pl/index.html</a><br />
<a href="http://pyopengl.sourceforge.net/">http://pyopengl.sourceforge.net/</a><br />
<a href="http://pl.wikipedia.org/">http://pl.wikipedia.org/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/ada/integracja-glut-opengl-gnat/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Pakiet NT_Console 3.1</title>
		<link>http://kwesoly.net/programowanie/ada/pakiet-nt_console-31/</link>
		<comments>http://kwesoly.net/programowanie/ada/pakiet-nt_console-31/#comments</comments>
		<pubDate>Sat, 06 Dec 2008 01:19:08 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[Ada]]></category>
		<category><![CDATA[biblioteka]]></category>
		<category><![CDATA[konsola]]></category>

		<guid isPermaLink="false">http://kwesoly.net/?p=192</guid>
		<description><![CDATA[W trakcie korzystania z pakietu NT_Console denerwowały mnie występujące w dużych ilościach, w trakcie kompilacji ostrzeżenia, związane z rozwojem kompilatora języka ADA, oraz brak możliwości łatwego zatrzymania działania programu i oczekiwania na akcje użytkownika, choćby po to aby nie zamykać konsoli czy tez wyświetlać częściowe wyniki. Poniżej link do poprawionej przeze mnie wersji, wraz z [...]]]></description>
			<content:encoded><![CDATA[<p>W trakcie korzystania z pakietu NT_Console denerwowały mnie występujące w dużych ilościach, w trakcie kompilacji ostrzeżenia, związane z rozwojem kompilatora języka ADA, oraz brak możliwości łatwego zatrzymania działania programu i oczekiwania na akcje użytkownika, choćby po to aby nie zamykać konsoli czy tez wyświetlać częściowe wyniki.</p>
<p>Poniżej link do poprawionej przeze mnie wersji, wraz z plikami oryginalnymi oraz wyszczególnionymi różnicami w formacie HTML.</p>
<p><a title="Pobierz poprawiony pakiet NT_Console" href="http://kwesoly.net/download/ada/nt_console_031.zip"><a href="http://download.kwesoly.net/2008/12/nt_console_031.zip">Pobierz pakiet NT_Console 3.1</a><br />
</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/ada/pakiet-nt_console-31/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Arkanoid &#8211; gra w języku Ada 2005.</title>
		<link>http://kwesoly.net/programowanie/ada/arkanoid-gra-w-jezyku-ada/</link>
		<comments>http://kwesoly.net/programowanie/ada/arkanoid-gra-w-jezyku-ada/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 23:34:55 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[Ada]]></category>
		<category><![CDATA[arkanoid]]></category>
		<category><![CDATA[gra]]></category>

		<guid isPermaLink="false">http://kwesoly.net/?p=184</guid>
		<description><![CDATA[Dziś zamieszczam binarki gry która powstała jako projekt z języka Ada. Gdy tylko zostanie on przyjęty oraz prowadzący nie będzie  nie będzie miał nic przeciwko opublikuję też źródła. Multiplyer Arkanoid Gra Poza tym poniżej sprawozdanie z ww projektu. Multiplayer Arkanoid - sprawozdanie]]></description>
			<content:encoded><![CDATA[<p>Dziś zamieszczam binarki gry która powstała jako projekt z języka Ada. Gdy tylko zostanie on przyjęty oraz prowadzący nie będzie  nie będzie miał nic przeciwko opublikuję też źródła.<br />
<a title="Pobierz program Multiplayer Arkanoid" href="http://kwesoly.net/download/ada/arkanoid.zip"></a><a href="http://download.kwesoly.net/2008/12/arkanoid.zip">Multiplyer Arkanoid Gra</a></p>
<p>Poza tym poniżej sprawozdanie z ww projektu.</p>
<p><a title="Pobierz sprawozdanie z projektu Multiplayer Arkanoid" href="http://kwesoly.net/download/2008/12/sprawozdanie_arkanoid.pdf">Multiplayer Arkanoid - sprawozdanie</a></p>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/ada/arkanoid-gra-w-jezyku-ada/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Automatyczna Generacja Plików ads/adb</title>
		<link>http://kwesoly.net/programowanie/ada/automatyczna-generacja-plikow-ads-adb/</link>
		<comments>http://kwesoly.net/programowanie/ada/automatyczna-generacja-plikow-ads-adb/#comments</comments>
		<pubDate>Mon, 01 Dec 2008 17:10:53 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[Ada]]></category>
		<category><![CDATA[automatyczna]]></category>
		<category><![CDATA[generacja]]></category>

		<guid isPermaLink="false">http://kwesoly.net/?p=176</guid>
		<description><![CDATA[W trakcie tworzenia dowolnego projektu w języku Ada będziemy potrzebować minimum 1 pliku, zawierającego główną procedurę. Aby ułatwić sobie kompilację często korzysta się z plików opisujących Projekt((Posiadają rozszerzenie *.gpr, zawierają informacje o opcjach kompilacji, katalogach, nazwach plików wynikowych etc.)).  Każdy kolejny pakiet to jeszcze jeden plik *.ads, i jeden *.adb. Ręczne tworzenie tych plików jest [...]]]></description>
			<content:encoded><![CDATA[<p>W trakcie tworzenia dowolnego projektu w języku Ada będziemy potrzebować minimum 1 pliku, zawierającego główną procedurę. Aby ułatwić sobie kompilację często korzysta się z plików opisujących Projekt((Posiadają rozszerzenie *.gpr, zawierają informacje o opcjach kompilacji, katalogach, nazwach plików wynikowych etc.)).  Każdy kolejny pakiet to jeszcze jeden plik *.ads, i jeden *.adb. Ręczne tworzenie tych plików jest jak najbardziej możliwe, ale znacznie przyjemniejsze jest generowanie ich podstawowej struktury za pomocą GNATbench.</p>
<p><span id="more-176"></span></p>
<h2>Tworzenie nowego projektu</h2>
<p>Już raz stworzyliśmy nowy projekt, postaram się przejść teraz przez niego z paroma slowami komentarza na temat wybieranych opcji. Po wybraniu File -&gt; New -&gt; Ada Project poproszeni zostaniemy o podanie nazwy projektu. W katalogu o takiej nazwie, wewnatrz naszego Workspace, będą przechowywane pliki projektu (jeśli nie wybierzemy innego katalogu ręcznie w tym oknie).</p>
<p>W kolejnym oknie kreatora poproszeni zostaniemy o podanie nazwy procedury głównej((Main Subprogram Unit)). Oznacza to że kompilator będzie poszukiwał pliku o nazwie <strong>nazwa_procedury_glownej.adb</strong>, aby jako główną uruchamianą procedurę ustawić zawartą w nim <strong>nazwa_procedury_glownej</strong>. Poniżej możemy również zaznaczyć że chcemy wygenerować ten plik.</p>
<p>Następny krok to wybranie katalogów w których będziemy trzymać pliki pośrednie tworzone w trakcie kompilacji. Warto pamiętać, że w trakcie kompilacji tworzy się tam "niezły bałagan", dlatego warto mieć ten folder jako osobny (co jest domyślnie ustawione), oraz gotowe pliki wykonywalne również umieszczać w osobnym katalogu.</p>
<p>W kolejnym etapie powinniśmy jeszcze wybrać narzędzie gnatmake. Zaznaczanie opcji używania Ady 2005 ma sens tylko dla starszych kompilatorów, gdyż GNAT2008 domyślnie używa tej wersji.</p>
<h2>Tworzenie plików *.adb z *.ads.</h2>
<p>W trakcie pracy nad projektem, zwłaszcza gdy mamy już jasną koncepcję co i tak chcemy stworzyć, wygodnie jest napisać tylko plik z specyfikacją. Zacznijmy od utworzenia takiego pliku: File-&gt;New-&gt;Ada Source, pamiętajmy aby wpisać nazwę z rozszerzeniem ads. Po wypełnieniu go specyfikacja potrzebnych nam funkcji, obiektów typów etc. Sprawdźmy czy plik nie zawiera żadnych bledow. Najprościej w tym celu użyć kombinacji klawiszy Ctrl+Alt+A czy też klikjąc Project-&gt;Analyze Sources. Jeśli nie ma żadnych błędów składniowych, plik z zawartoscią pakietu możemy wygenerować klikając Source -&gt; Generate Package Body.</p>
<p>Z stworzonego przeze mnie przykładowego pliku przyklad.ads:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw3">package</span> przyklad <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">subtype</span> Wynik <span class="kw1">is</span> Boolean;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">procedure</span> Numer1<span class="br0">&#40;</span>x,y : <span class="kw3">in</span> Integer<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">procedure</span> Numer2<span class="br0">&#40;</span>A,B : <span class="kw3">out</span> Wynik<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">function</span> dodaj<span class="br0">&#40;</span>x,y : <span class="kw3">in</span> Float<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> Float;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">task</span> Zadanie <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">entry</span> Wejscie1<span class="br0">&#40;</span>zmienn : <span class="kw3">in</span> <span class="kw3">out</span> Wynik<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">end</span> Zadanie;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">protected</span> <span class="kw3">type</span> urzadzenie <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">entry</span> Wejscie1<span class="br0">&#40;</span>zmienn : <span class="kw3">in</span> <span class="kw3">out</span> Wynik<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">function</span> Get_Stan</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> Integer;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">procedure</span> Set_Sten<span class="br0">&#40;</span>nowy : <span class="kw3">in</span> Integer<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">private</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; Stan : Integer;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">end</span> urzadzenie;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">end</span> przyklad;</div>
</li>
</ol>
</div>
<p>GnatBench Automatycznie wygenerował plik przyklad.adb:</p>
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw3">package</span> <span class="kw3">body</span> przyklad <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">procedure</span> Numer1 <span class="br0">&#40;</span>x,y : <span class="kw3">in</span> Integer<span class="br0">&#41;</span> <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">begin</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">-- &nbsp;Generated stub: replace with real body!</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">raise</span> Program_Error;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">end</span> Numer1;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">procedure</span> Numer2 <span class="br0">&#40;</span>A,B : <span class="kw3">out</span> Wynik<span class="br0">&#41;</span> <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">begin</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">-- &nbsp;Generated stub: replace with real body!</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">raise</span> Program_Error;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">end</span> Numer2;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">function</span> dodaj</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>x,y : <span class="kw3">in</span> Float<span class="br0">&#41;</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> Float</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">begin</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">-- &nbsp;Generated stub: replace with real body!</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">raise</span> Program_Error;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">return</span> dodaj <span class="br0">&#40;</span>x, y<span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">end</span> dodaj;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">task</span> <span class="kw3">body</span> Zadanie <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">begin</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="co1">-- &nbsp;Generated stub: replace with real body!</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">raise</span> Program_Error;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">end</span> Zadanie;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw3">protected</span> <span class="kw3">body</span> urzadzenie <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">entry</span> Wejscie1 <span class="br0">&#40;</span>zmienn : <span class="kw3">in</span> <span class="kw3">out</span> Wynik<span class="br0">&#41;</span> <span class="kw3">when</span> True <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">begin</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">-- &nbsp;Generated stub: replace with real body!</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">raise</span> Program_Error;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">end</span> Wejscie1;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">function</span> Get_Stan</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> Integer</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">begin</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">-- &nbsp;Generated stub: replace with real body!</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">raise</span> Program_Error;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw1">return</span> Get_Stan;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">end</span> Get_Stan;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw3">procedure</span> Set_Sten <span class="br0">&#40;</span>nowy : <span class="kw3">in</span> Integer<span class="br0">&#41;</span> <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">begin</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="co1">-- &nbsp;Generated stub: replace with real body!</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="kw3">raise</span> Program_Error;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp; &nbsp; <span class="kw1">end</span> Set_Sten;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;<span class="kw1">end</span> urzadzenie;</div>
</li>
<li class="li1">
<div class="de1">&nbsp;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">end</span> przyklad;</div>
</li>
</ol>
</div>
<p>Od razu lojalnie ostrzegam że nie da się zmian w pakiecie ads uzupełnić w adb inaczej niż ręcznie, dlatego warto napisać przemyślaną wcześniej specyfikacje jak najpełniej.</p>
<p>Podsumowując, GNATbench bez problemu zastępuje nas w tworzeniu przynajmniej części szkieletu kodu, sprawiając że pisanie kodu jest mniej nużącą pracą.</p>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/ada/automatyczna-generacja-plikow-ads-adb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GNATbench &#8211; używanie Code Assist w Eclipse.</title>
		<link>http://kwesoly.net/programowanie/ada/gnatbench-code-assist-w-eclipse/</link>
		<comments>http://kwesoly.net/programowanie/ada/gnatbench-code-assist-w-eclipse/#comments</comments>
		<pubDate>Sat, 22 Nov 2008 01:29:15 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[Ada]]></category>
		<category><![CDATA[assist]]></category>
		<category><![CDATA[code]]></category>
		<category><![CDATA[gnatbench]]></category>

		<guid isPermaLink="false">http://kwesoly.net/?p=157</guid>
		<description><![CDATA[W kolejnej części postaram się przybliżyć kilka ciekawych możliwości ułatwiających programowanie, dzięki którym pisanie kodu stanie się prostsze, szybsze i bardziej niezawodne. Podstawowym zadaniem Code Assist jest zmniejszanie nakładu pracy, poprzez pisanie szybciej,  z mniejsza szansą zrobienia literówko, nie wymagające pamiętanie perfekcyjnie wszystkich nazw bibliotek/funkcji. Dzięki tej funkcji łatwo uzupełnić zarówno dyrektywy with/use, nazwy już [...]]]></description>
			<content:encoded><![CDATA[<p>W kolejnej części postaram się przybliżyć kilka ciekawych możliwości ułatwiających programowanie, dzięki którym pisanie kodu stanie się prostsze, szybsze i bardziej niezawodne. Podstawowym zadaniem Code Assist jest zmniejszanie nakładu pracy, poprzez pisanie szybciej,  z mniejsza szansą zrobienia literówko, nie wymagające pamiętanie perfekcyjnie wszystkich nazw bibliotek/funkcji. Dzięki tej funkcji łatwo uzupełnić zarówno dyrektywy with/use, nazwy już istniejących obiektów, funkcji czy zwykłych zmiennych. Ponizej kilka przykładów.</p>
<ul style="padding-left: 30px;">
<li>
<h4>Nazwy pakietów w dyrektywach with/use.</h4>
</li>
</ul>
<p style="padding-left: 60px;">Możemy w nagłówku wpisać tylko <em>with Ada.Te </em>oraz wywołać niniejszą funkcję kombinacją klawiszy <strong>Ctrl+Spacja </strong>aby Eclipse wyświetlił nam listę dostępnych zakończeń takiej dyrektywy. Jako że tylko jeden pakiet zawarty w Ada.* zaczyna się na "Te" możemy wybrać pierwszą opcję z wyświetlonej listy naciskając Enter.</p>
<p style="padding-left: 90px;"><a href="http://download.kwesoly.net/2008/11/img1.png"><img class="alignnone size-full wp-image-263" title="Code Assist Screen" src="http://download.kwesoly.net/2008/11/img1.png" alt="Code Assist Screen" width="304" height="120" /></a></p>
<p style="padding-left: 60px;"><span id="more-157"></span></p>
<ul style="padding-left: 30px;">
<li>
<h4>Nazwy Pakietów/Obiektów/Procedur/Funkcji</h4>
</li>
</ul>
<p style="padding-left: 60px;">Code Assist wspiera nas także w trakcie pisania treści programu, analogicznie po naciśnięciu <strong>Ctrl+Spacja</strong> uzupełniając pozostały fragment bieżacej nazwy. Jest to szczególnie przydatne gdy z jakichś przyczyn rezygnujemy z dyrektyw use. Poniżej kilka przykładów:</p>
<p style="padding-left: 60px;">Po wpisaniu pierwszych dwóch liter nazwy pakietu, zarówno w dyrektywie with jak i w treści programu:</p>
<p style="padding-left: 90px;"><a href="http://download.kwesoly.net/2008/11/img2.png"><img class="alignnone size-full wp-image-264" title="Code Assist Screen" src="http://download.kwesoly.net/2008/11/img2.png" alt="Code Assist Screen" width="259" height="120" /></a></p>
<p style="padding-left: 60px;">Możemy nacisnąć Enter, postawić kropkę i idąc w ten sam sposób dotrzeć do:</p>
<p style="padding-left: 90px;"><a href="http://download.kwesoly.net/2008/11/img3.png"><img class="alignnone size-full wp-image-265" title="Code Assist Screen" src="http://download.kwesoly.net/2008/11/img3.png" alt="Code Assist Screen" width="495" height="118" /></a></p>
<p style="padding-left: 60px;">Równie prosto jak dla procedur możemy uzyskać informacje o funkcjach:</p>
<p style="padding-left: 90px;"><a href="http://download.kwesoly.net/2008/11/img4.png"><img class="alignnone size-full wp-image-266" title="Code Assist Screen" src="http://download.kwesoly.net/2008/11/img4.png" alt="Code Assist Screen" width="799" height="189" /></a></p>
<ul style="padding-left: 30px;">
<li>
<h4>Argumenty funkcji/procedur</h4>
</li>
</ul>
<p style="padding-left: 60px;">Czasem, zwłaszcza przy korzystaniu z rzadziej używanych funkcji nie pamiętamy argumentów z którymi ja wywołać, nie zawsze też pamiętamy które argumenty funkcja zmienia a które modyfikuje. Zamiast jednak szukać opisu funkcji w dokumentacji, łatwiej wykorzystać do naszych poprzez Code Assist. Wystarczy wywołać go po wpisaniu lewego nawiasu, aby otrzymać listę możliwych zestawów parametrów wraz z sposobem ich przekazywania i opisem funkcji. Dla przykładu zobaczmy ile wersji ma zwykła funkcja Put:</p>
<p style="padding-left: 90px;"><a href="http://download.kwesoly.net/2008/11/img5.png"><img class="alignnone size-full wp-image-267" title="Code Assist Screen" src="http://download.kwesoly.net/2008/11/img5.png" alt="Code Assist Screen" width="522" height="196" /></a></p>
<p style="padding-left: 60px;">Po wybraniu właściwej funkcji poprzez zatwierdzenie wyboru Enterem lub też kliknięcie myszką, możemy wpisywać argumenty, które przekazywane są wtedy w bardzo czytelny sposób.</p>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/ada/gnatbench-code-assist-w-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GNATbench &#8211; instalacja Eclipse jako Ada IDE</title>
		<link>http://kwesoly.net/programowanie/ada/gnatbench-eclipse-ide/</link>
		<comments>http://kwesoly.net/programowanie/ada/gnatbench-eclipse-ide/#comments</comments>
		<pubDate>Mon, 17 Nov 2008 22:34:53 +0000</pubDate>
		<dc:creator>Krzysiek Wesołowski</dc:creator>
				<category><![CDATA[Ada]]></category>
		<category><![CDATA[ada ide programowanie]]></category>

		<guid isPermaLink="false">http://kwesoly.net/?p=141</guid>
		<description><![CDATA[Postaram się przybliżyć wszystkim czytelnikom korzystanie z środowiska Eclipse i dodatku GNATbench, tworzących razem świetne IDE, przy programowaniu w języku Ada 95/2005. Instalacja i konfiguracja Jedną z największych zalet środowiska Eclipse jest jego uniwersalność: pozwala ono korzystać z tego samego zestawu narzędzi niezależnie od wybranej platformy sprzętowej. Jedynym warunkiem jest w tym przypadku wsparcie danej [...]]]></description>
			<content:encoded><![CDATA[<p>Postaram się przybliżyć wszystkim czytelnikom korzystanie z środowiska Eclipse i dodatku GNATbench, tworzących razem świetne IDE,  przy programowaniu w języku Ada 95/2005.</p>
<h2>Instalacja i konfiguracja</h2>
<p>Jedną z największych zalet środowiska Eclipse jest jego uniwersalność: pozwala ono korzystać z tego samego zestawu narzędzi niezależnie od wybranej platformy sprzętowej. Jedynym warunkiem jest w tym przypadku wsparcie danej platformy przez GNAT-a i GNATbencha. Opiszę swoje doświadczenia z konfigurowaniem niniejszego zestawu w rożnych systemach operacyjnych.</p>
<p><span id="more-141"></span></p>
<h3 style="padding-left: 30px;">Środowisko Windows</h3>
<p style="padding-left: 30px;">Aby uruchomić środowisko Eclipse na platformie MS Windows nalezy wykonać następujące kroki:</p>
<ol>
<li>Zainstalować GNAT (tak jak do użytku z GPS czy AdaGIDE, pobierając go z <a title="GNAT GPL Edition Windows 2008" href="https://libre.adacore.com/dynamic/download_page?config=x86-windows&amp;version=2008#" target="_self">Gnat Gpl Edition 2008</a>, warto od razu pobrać gnumake z katalogu Tools, rozpakowując za pomocą <a title="Program do rozpakowania archiwum tar.gz" href="http://www.7-zip.org/">7-Zip</a> oraz uruchamiając.  W trakcie instalacji można zmienić ścieżkę, należy jednak pamiętać o unikaniu w niej spacji.</li>
<li>Zmienić nazwę pobranego gnumake-3.79.1-pentium-mingw32msv.exe na make.exe i wkleić do katalogu "C:\GNAT\2008\bin" lub odpowiedniego.</li>
<li>Pobrać Eclipse Ganymede w wersji CDT (jest to wersja do obsługi języków C/C++): <a title="Pobieranie Eclipse w wersji Ganymede" href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR1/eclipse-cpp-ganymede-SR1-win32.zip">Eclipse CDT</a>, oraz rozpakować do wybranego katalog. Warto później zmienić jego nazwę (chocby na eclipseADA) gdy chcemy mieć inne wersje Eclipse gdzieś obok, i na wypadek gdybyśmy musieli/chcieli skasować cały katalog.</li>
<li>Pobrać zestaw pluginów do Eclipse o nazwie GNATbench. Z nieznanych mi przyczyn na stronie adacore.com dostępna jest nieaktualna wersja, po najnowszą wersję 2.2.0 musimy sięgnąć na <a title="Strona projektu GNATbench - wtyczek do Eclipse" href="http://gforge.enseeiht.fr/projects/gnatbench/">stronę projektu GNATbench</a>, oraz zainstalować te dodatki podając w trakcie instalacji ścieżki do GNAT-a i Eclipse'a.</li>
<li>Dodatkowo eclipse do działania może wymagać Java JRE (którą prawdopodobnie już dawno masz ją na swoim komputerze), jeśli nie to pobierzesz ją tutaj: <a title="http://java.com/pl/download/manual.jsp" href="http://java.com/pl/download/manual.jsp">http://java.com/pl/download/manual.jsp</a>.</li>
<li>Na koniec warto utworzyć skrót do właśnie skonfigurowanego Eclipse w jakimś podręcznym miejscu oraz zresetować komputer.</li>
<li>Przy instalacji w środowisku z ograniczeniami należy pamiętać o wykonaniu pierwszego uruchomienia (należy wybrać jakieś workspace, dowolne) z uprawnieniami administratora.</li>
</ol>
<h3 style="padding-left: 30px;">Środowisko Linux (Testowane na Ubuntu 8.04 LTS)</h3>
<p style="padding-left: 30px;">Aby uruchomić środowisko Eclipse na platformie Linux (x86) nalezy wykonać następujące kroki:</p>
<ol>
<li>Zainstalować GNAT, pobierając go z <a title="GNAT GPL Edition Linux x86 2008" href="https://libre.adacore.com/dynamic/download_page?config=x86-linux&amp;version=2008#" target="_self">Gnat Gpl Edition 2008</a>, rozpakowując, oraz uruchamiając za pomocą pliku wykonywalnego "doinstall" zawartego w katalogu który niedawno pobrałeś. W trakcie instalacji należy wybrać ścieżkę, domyślna "/usr/gnat/" wymaga uruchomienia skryptu instalacyjnego z prawami roota. Po wszystkim zgodnie z sugestią dodajemy do zmiennej systemowej PATH folder z binarkami GNATa</li>
<li>Pobrać Eclipse Ganymede w wersji CDT (jest to wersja do obsługi języków C/C++): <a title="Pobieranie Eclipse w wersji Ganymede" href="http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/ganymede/SR1/eclipse-cpp-ganymede-SR1-linux-gtk.tar.gz">Eclipse CDT</a>, oraz rozpakować do wybranego katalogu</li>
<li>Pobrać najnowszą wersję zestawu pluginów do Eclipse o nazwie GNATbench z <a title="Strona projektu GNATbench - wtyczek do Eclipse" href="http://gforge.enseeiht.fr/projects/gnatbench/">strony projektu GNATbench</a>, oraz zainstalować te dodatki (komendą "doinstall", uruchomioną z odpowiednimi uprawnieniami) podając w trakcie instalacji ścieżki do GNAT-a i Eclipse'a.</li>
<li>Dodatkowo eclipse do działania może wymagać Java JRE (którą prawdopodobnie już dawno masz ją na swoim komputerze), jeśli nie to w cześci restricted repozytoriów można znaleźć Java JRE. Radzę zapomnieć o ideologii i skorzystać z wersji Sun, gdyż otwarte kiepsko dogadują się z Eclipse <img src='http://kwesoly.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </li>
<li>Na koniec warto utworzyć skrót do właśnie skonfigurowanego Eclipse w jakimś podręcznym miejscu.</li>
</ol>
<h2>Pierwsze uruchomienie</h2>
<h3 style="padding-left: 30px;">Wybór właściwej perspektywy</h3>
<p style="padding-left: 30px;">Przy pierwszym uruchomieniu Eclipse poprosi o wybranie ścieżki naszego Workspace((Postaram się nie tłumaczyć na język polski takich wyrazów gdyż jedynym efektem byłyby nowe potworki)). Warto wybrać ścieżkę która nie będzie nam przeszkadzać swoją obecnością i umożliwi wygodny dostęp. Nowo otwarty Eclipse jako domyślną będzie miał włączoną perspektywę "C/C++", ułatwiającą pracę z projektami w tych językach, aby to zmienić należy użyć opcji Window-&gt;Open Perspective-&gt;Other, i z wyświetlonej listy wybrać perspektywę "Ada". Spowoduje to przystosowanie Eclipse do potrzeb programowania w Adzie.</p>
<h3 style="padding-left: 30px;">Pierwszy projekt</h3>
<p style="padding-left: 30px;">Kolejną wspaniałą cechą edytora Eclipse jest możliwość korzystania z gotowych "kreatorów". Użyjmy teraz jednego aby stworzyć prosty program. Wybieramy więc: File-&gt;New-&gt;Ada Project. W nowo otwartym oknie uzupełniamy nazwę projektu (może być Hello_World), i przechodzimy dalej. W kolejnym oknie wpisujemy "Name of the Ada main subprogram unit". Jest to nazwa plików zawierającego główną procedurę, bez rozszerzenia. Jeśli w kolejnym kroku nie zdecydujemy się na wygenerowanie szablonu tego pliku będziemy musieli go stworzyc ręcznie aby program się skompilował. Wpiszmy więc śmiało hello_world i poprośmy Eclipse((Zaznacz oba "ptaszki" pod nazwa modułu)) o wygenerowanie pliku i wpisaniu mu instrukcji wypisujących jakże oryginalne powitanie. W kolejnym oknie wybierzemy folder na pliki pośrednie czyli skompilowane i wymagające linkowania, oraz folder na gotowy plik wykonywalny. Na sam koniec należy zdecydować czy chcemy korzystać z mozliwości Ady2005 oraz wybrać program wykonujący kolejne polecenia w trakcie generowania aplikacji (osobiście używam gnatmake).</p>
<p style="padding-left: 30px;">GNATbench wygeneruje plik:</p>
<p style="padding-left: 30px;">
<div class="geshi no ada">
<div class="head">Listing:</div>
<ol>
<li class="li1">
<div class="de1"><span class="kw3">with</span> GNAT.<span class="me1">IO</span>; &nbsp;<span class="kw3">use</span> GNAT.<span class="me1">IO</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw3">procedure</span> hello_world <span class="kw1">is</span></div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">begin</span></div>
</li>
<li class="li1">
<div class="de1">&nbsp; &nbsp;Put_Line <span class="br0">&#40;</span><span class="st0">&quot;Hello World!&quot;</span><span class="br0">&#41;</span>;</div>
</li>
<li class="li1">
<div class="de1"><span class="kw1">end</span> hello_world;</div>
</li>
</ol>
</div>
<p>Jeśli zaznaczymy (klikając) nasz projekt w GNAT Project Explorer (domyślnie otwarty po lewej stronie) możemy go skompilować klikając Project-&gt;Rebuild Current Project.</p>
<p style="padding-left: 30px;">Gotowe! Nasz Eclipse jest gotowy aby zacząć go używać i poznawać jego oszałamiające możliwości.</p>
]]></content:encoded>
			<wfw:commentRss>http://kwesoly.net/programowanie/ada/gnatbench-eclipse-ide/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

