<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-658772830218627266</id><updated>2012-01-30T18:49:53.674+01:00</updated><category term='IMGUI'/><category term='Warsztat'/><category term='VMap'/><category term='Przemyślenia'/><category term='Social'/><category term='Pabianice'/><category term='IGK'/><category term='RS232'/><category term='Biblioteki'/><category term='Windows API'/><category term='pipe'/><category term='Java'/><category term='Latex'/><category term='Deferred shading'/><category term='Kamery'/><category term='GUI'/><category term='C++'/><category term='Visual Studio 2008'/><category term='Praca'/><category term='Blender'/><category term='Fuse'/><category term='Nikon'/><category term='Linux'/><category term='DRM'/><category term='Directx9'/><category term='Łódź'/><category term='Fotografia'/><category term='Silnik graficzny'/><category term='Android'/><category term='Analiza stosu'/><category term='Cg'/><category term='Programowanie'/><category term='OpenGL'/><category term='Windows 7'/><title type='text'>Adam Śmigielski Dev Blog</title><subtitle type='html'>Co tu dużo pisać, po prostu moje wrażenia z projektów.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>58</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-3907164008364101895</id><published>2011-07-07T22:42:00.000+02:00</published><updated>2011-07-07T22:42:13.546+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Praca'/><title type='text'>Zaległości</title><content type='html'>Już jakiś czas temu wypowiedziałem się publicznie, na forum warsztatu, że podjęcie pracy na Politechnice uważam za jeden z największych błędów w życiu. Na szczęście jest to błąd w pełni odwracalny. No i stało się, zmieniłem pracę. Od maja pracuję dla łódzkiego oddziału Mobica Ltd.&lt;br /&gt;&lt;br /&gt;Ze zmiany jestem bardzo zadowolony. Niestety firma musi chronić swoich klientów i jestem zobowiązany do tajemnicy. Także źródło ciekawostek do notatek mi się skończyło.&lt;br /&gt;&lt;br /&gt;Końcówka pracy dla uczelni to był prawdziwy sajgon. Robot musiał zostać przygotowany do "prób poligonowych". Próby te odbyły się na przełomie kwietnia i maja na poligonie wojskowym z kompletnie świeżym robotem. W zasadzie wszystko nam się udało przygotować, na miejscu robot został jedynie złożony do kupy.&lt;br /&gt;Robot dostał świeżutkie akumulatory i jeździł jak nigdy wcześniej. Wytrzymał jakąś godzinę, a potem spaliła mu się część silników napędowych!&lt;br /&gt;Generalnie cała "operacja poligon" została uznana za sukces. Osobiście jestem szczególnie zadowolony ze sterowania robotem za pomocą systemu GPS. Całe oprogramowanie zostało przygotowane na ostatnią chwilę. Nie było nawet okazji przetestować czy działa. Zadziałało i to jak. System GPS jest bardzo precyzyjny. Robot bez problemów był w stanie gonić człowieka z nadajnikiem. Nawet przez moment się nie zgubił.&lt;br /&gt;&lt;br /&gt;Koniec pracy dla uczelni oznaczał również konieczność przygotowania "raportu końcowego". Co to znaczy? Przygotowanie dokumentacji i raportów do wszystkich zadań z całego półtorarocznego okresu pracy dla Politechniki. Nagle im się k...a przypomniało, że będą potrzebować dokumentacji! Przez półtora roku nawet się nie zająknęli. Przygotowanie tego raportu zajęło mi mniej więcej półtora miesiąca. Jakimś cudem udało mi się odtworzyć historię zadań, także raport w sumie wyszedł mi całkiem rzetelny.&lt;br /&gt;&lt;br /&gt;Kilka słów na temat pobytu na terenie poligonu. Super! Prześliczny teren. Sporo zwierzaków. Sprzęt wojskowy :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Wciąż pracuję nad własnym silnikiem. Jak tylko mam wolną chwilę staram się coś napisać. Niestety z czasem kiepsko ... żona.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-3907164008364101895?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/3907164008364101895/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=3907164008364101895' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/3907164008364101895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/3907164008364101895'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2011/07/zalegosci.html' title='Zaległości'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-7345572239502522903</id><published>2011-02-16T10:25:00.006+01:00</published><updated>2011-02-16T11:24:04.013+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Kamery'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><category scheme='http://www.blogger.com/atom/ns#' term='Praca'/><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>EasyCap 4 Channel Usb DVR</title><content type='html'>Aktualnie pracuję nad tym jak zrobić PIP z kilku kamer. EasyCap 4 Channel Usb DVR to frame grabber, którego używamy do przechwytywania obrazu z kamer analogowych. Ma tą ważną cechę, że dzięki sterownikowi EasyCAP DC60 Driver działa z systemem Linux, co chyba nie jest takie oczywiste w tej kategorii sprzętu. Testowaliśmy jedno konkurencyjne urządzenie i nie udało się go uruchomić.&lt;br /&gt;Frame grabber ma 4 kanały &lt;span style="font-style:italic;"&gt;video in&lt;/span&gt;. Możliwe jest jednak zbieranie tylko z jednego kanału równocześnie. Zmianę aktualnego kanału można dokonać za pomocą biblioteki Video for Linux 2 - v4l2. Przełączenie kanału jest operacją dość czasochłonną i powoduje, że obraz pobrany tuż po niej zawiera śmieci.&lt;br /&gt;&lt;br /&gt;Jak zrobić Pip z takim sprzętem? Użyć kilka frame grabber'ów ;)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Obrazy pobieramy biblioteką OpenCV, funkcje:&lt;br /&gt;cvCaptureFromCAM,&lt;br /&gt;cvQueryFrame.&lt;br /&gt;&lt;br /&gt;Zmiana kanału jest możliwa poprzez v4l2, funkcja:&lt;br /&gt;ioctl(file, VIDIOC_S_INPUT, &amp;index),&lt;br /&gt;gdzie file to plik urządzenia otwarty funkcją open i flagą O_RDONLY | O_NONBLOCK,&lt;br /&gt;a indeks to wartość typu int z numerem kanału. 0 i 1 to kanał pierwszy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-7345572239502522903?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/7345572239502522903/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=7345572239502522903' title='Komentarze (3)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/7345572239502522903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/7345572239502522903'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2011/02/easycap-4-channel-usb-dvr.html' title='EasyCap 4 Channel Usb DVR'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-7737654678580026008</id><published>2011-02-01T11:08:00.006+01:00</published><updated>2011-02-01T13:02:08.301+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Praca'/><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>3 miesiące przerwy, podsumowanie</title><content type='html'>Od poprzedniego posta upłynęło już bardzo dużo czasu. W pracy projekt się kończy w trybie przyśpieszonym (czytać: nie ma kasy, więc robimy na szybko ile się da). Przedłużająca się niezbyt przyjemna sytuacja w pracy daje mi się we znaki (uczucie senności, zmęczenie itp). Krótko, nie bardzo mi się chciało pisać.&lt;br /&gt;&lt;br /&gt;Z pracy:&lt;br /&gt; - &lt;a href=http://en.wikipedia.org/wiki/Linux_framebuffer&gt;linux frame buffer&lt;/a&gt; - bardzo ciekawa bestia,&lt;br /&gt; - obsługa &lt;a href=http://www.google.pl/search?hl=pl&amp;client=opera&amp;hs=Z8D&amp;rls=pl&amp;channel=suggest&amp;q=easycap&amp;btnG=Szukaj&amp;aq=f&amp;aqi=&amp;aql=&amp;oq=&gt;wielokanałowego frame grabbera&lt;/a&gt; sterownikiem &lt;a href=http://sourceforge.net/projects/easycapdc60/&gt;EasyCAP DC60 Driver&lt;/a&gt;,&lt;br /&gt; - fuse - o tym już pisałem,&lt;br /&gt; - wizyta w warszawie,&lt;br /&gt; - przechwytywanie obrazu z &lt;a href=http://www.baslerweb.com/downloads/16417/pilot_9_1101_web.pdf&gt;kamer ip&lt;/a&gt; dedykowaną biblioteką pylon.&lt;br /&gt;&lt;br /&gt;Z domu:&lt;br /&gt; - przeprowadzka - w listopadzie zamieszkaliśmy we "własnym" mieszkaniu (nasze nie jest, ale w końcu sami),&lt;br /&gt; - silnik się rozwija. Przemyślałem sobie parę rzeczy i sporo pracy poświęciłem przygotowaniu "framework'a" leżącego u podstaw silnika.&lt;br /&gt;&lt;br /&gt;W silniku skończony mam jak na razie system obsługi okien. Prosty w obsłudze i bardzo elastyczny ;) Na poważnie, skupiłem się na elastyczności:&lt;br /&gt; - użytkownik sam może utworzyć okno (np. CreateWindowEx) i przekazać je do systemu,&lt;br /&gt; - użytkownik może wybierać pomiędzy domyślną i własną funkcją obsługi komunikatów,&lt;br /&gt; - nie ma ograniczeń co do ilości okien,&lt;br /&gt; - można dynamicznie tworzyć i zamykać okna,&lt;br /&gt; - system zapewnia dostęp do uchwytu okna (na razie tworzę z myślą o Windows),&lt;br /&gt; - renderować do okna można dowolną metodą: GDI, OGL, DX,&lt;br /&gt; - można renderować do kilku okien naraz,&lt;br /&gt; - można nawet dodać menu ;).&lt;br /&gt;&lt;br /&gt;Ograniczenia:&lt;br /&gt; - domyślna funkcja okna korzysta z danych zapisanych za pomocą funkcji SetWindowLong w polu GWL_USERDATA.&lt;br /&gt;&lt;br /&gt;Wygoda:&lt;br /&gt; - utworzenie typowych okien wymaga jedynie obiektu menadżera i wywołania odpowiedniej funkcji tworzącej okno.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Koniec.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-7737654678580026008?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/7737654678580026008/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=7737654678580026008' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/7737654678580026008'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/7737654678580026008'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2011/02/3-miesiace-przerwy-podsumowanie.html' title='3 miesiące przerwy, podsumowanie'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-6566153219336047370</id><published>2010-11-24T21:02:00.002+01:00</published><updated>2010-11-24T21:06:15.251+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>Danny MacAskill - "Way Back Home"</title><content type='html'>Dziś nieco inaczej niż zwykle, link: &lt;a href=http://www.youtube.com/watch?v=Cj6ho1-G6tw&amp;feature=player_embedded&gt;Danny MacAskill - "Way Back Home"&lt;/a&gt;. Jestem pod ogromnym wrażeniem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-6566153219336047370?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/6566153219336047370/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=6566153219336047370' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6566153219336047370'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6566153219336047370'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/11/danny-macaskill-way-back-home.html' title='Danny MacAskill - &quot;Way Back Home&quot;'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-177838089883054102</id><published>2010-11-03T12:25:00.003+01:00</published><updated>2010-11-03T12:54:58.413+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Przemyślenia'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Remont silnika odpowiedź</title><content type='html'>Anonimowy użytkownik zapytał czemu w poście Remont silnika wyraziłem nie chęć do stosowania rozwiązań typu singleton "Czemu zero rozwiązań typu singleton? Globalny, jednolity stan w jakiejkolwiek formie (monostate, singleton, zwykła klasa statyczna), jest bardzo naturalny i nie ma sensu unikać go na siłę w imię jakichś pustycznych idei."&lt;br /&gt;&lt;br /&gt;Odpowiedź jest dość obszerna, także umieszczę to w nowym wpisie.&lt;br /&gt;&lt;br /&gt;Moim zdaniem największym problemem z wszelkiej maści obiektami o dostępie globalnym są zależności jakie powstają pomiędzy różnymi modułami oprogramowania.&lt;br /&gt;Pisząc swój silnik graficzny byłem bardzo pozytywnie nastawiony do tego typu rozwiązań, bo "ułatwiały" mi życie. Dzięki nim mogłem zmniejszyć ilość parametrów przekazywanych do metod. Unikałem również przekazywania obiektów w głąb hierarchii wywołań. (chcemy zasób, więc przekazujemy managerowi obiekt api, ten przekazuje go fabryce, ta przekazuje go konkretnej metodzie). Kto potrzebuje singletona ten sam może go sobie wziąć. I tak właśnie powstają zależności pomiędzy jednym modułem, a drugim. Przykładowo klasa tekstury potrzebowała rozmiar okna dla którego będzie render targetem. Bach, okno jest singletonem, wszyscy maja do niego dostęp. To był chyba największy błąd projektowy jaki popełniłem.&lt;br /&gt;&lt;br /&gt;Zależności się nie skalują. Zmiana w jednym module często pociąga ogromne zmiany w całym systemie.&lt;br /&gt;Zależności się bardzo szybko rozrastają. Ja w końcu się pogubiłem w kolejności otwierania i zamykania modułów. We własnym kodzie straciłem orientację.&lt;br /&gt;Zależności się nie skalują. Jak zapewnić rozsądny dostęp do globalnych obiektów w środowisku wielowątkowym?&lt;br /&gt;Obiekty globalne gryzą się z raii. Obiekt globalny jakim jest std::clog jest bardzo wygodny kiedy potrzebujemy coś logować. Osobiście bardzo często z niego korzystam, w taki sposób, że podpinam pod niego plik.&lt;br /&gt;W main robie sobie taki trick:&lt;br /&gt;fstream log("log.log" fstream::out);&lt;br /&gt;clog.rdbuf(log.rdbuf());&lt;br /&gt;Potem w dowolnym miejscu kodu wystarczy zapisać do std::clog i wszystko trafi do pliku.&lt;br /&gt;Informacją, którą szczególnie warto logować jest moment otwierania i zamykania poszczególnych modułów. Obiekt zarządzający modułem powstanie już po otwarciu pliku, więc log powstanie poprawnie. Jeżeli jednak pozwolimy istnieć takiemu obiektowi poza czas trwania maina to mamy problem. Ja nie raz popełniłem taki błąd, nie tylko przy projekcie tego silnika. Niby wiem, że tak jest, a i tak wciąż popełniam ten błąd.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-177838089883054102?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/177838089883054102/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=177838089883054102' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/177838089883054102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/177838089883054102'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/11/remont-silnika-odpowiedz.html' title='Remont silnika odpowiedź'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-8940883701285253970</id><published>2010-10-06T09:29:00.003+02:00</published><updated>2010-10-06T10:11:29.197+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Remont silnika</title><content type='html'>Dawno nic nie napisałem, nie mam czasu. Chcemy się przeprowadzić i aktualnie robimy dość poważny remont mieszkania. Oczywiście oboje z żoną jesteśmy zatrudnieni i wszystkie prace remontowe odbywają się po zakończeniu obowiązków zawodowych (długo myślałem jak usunąć 3 razy praca z tego zdania). Generalnie jest masakra :)&lt;br /&gt;&lt;br /&gt;Pochwalę się tylko, że wznowiłem prace nad swoim silnikiem. Podczas pierwszego podejścia sporo się nauczyłem. Postanowiłem wykorzystać to doświadczenie i rozpocząć wszystko od nowa.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;zmienię strukturę projektu. Poprzednio zrobiłem sobie straszną krzywdę i wszystko zamknąłem w jednym projekcie. Tym razem rozbije całość na sporą ilość małych projektów. Ułatwi to zarządzanie i testowanie kodu.&lt;br /&gt;&lt;li&gt;ograniczę idioto odporność na korzyść możliwości. Poprzednie rozwiązanie zakładało, że użytkownik jest głupi i broniłem dostępu do rzeczy takich jak zasoby czy directx.&lt;br /&gt;&lt;li&gt;zero automagiczności. Uważałem, że jeżeli silnik potrzebuje okna to powinien je umieć sobie otworzyć sam. Dzięki temu użytkowanie było banalne, o ile użytkownik chciał mieć dokładnie jedno okna o takich i takich właściwościach. Teraz uważam, że jeżeli użytkownik chce mieć okno to je sobie zrobi, jeżeli chce aby silnik coś w nim wyrenderował to powie o tym silnikowi.&lt;br /&gt;&lt;li&gt;mam zamiar zastosować model warstwowy. Poprzednio podzieliłem system na moduły i wyszedł mi z tego straszny galimatias.&lt;br /&gt;&lt;li&gt;zero rozwiązań w stylu singleton. Wszystkie niezbędne dane są przekazywane przez parametry wywołania.&lt;br /&gt;&lt;li&gt;wciąż trzymam się rozwiązań obiektowych.&lt;br /&gt;&lt;li&gt;DirectX 10. Im dłużej patrzę na wersję 10 tym mniej podoba mi się 9. OpenGL nigdy nie był obiektem mojego uwielbienia.&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-8940883701285253970?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/8940883701285253970/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=8940883701285253970' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8940883701285253970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8940883701285253970'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/10/remont-silnika.html' title='Remont silnika'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-3813948925547526719</id><published>2010-08-03T09:43:00.003+02:00</published><updated>2010-08-03T11:04:43.466+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VMap'/><category scheme='http://www.blogger.com/atom/ns#' term='Praca'/><category scheme='http://www.blogger.com/atom/ns#' term='Łódź'/><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Rysowanie map</title><content type='html'>Ostatnio pracowałem nad aplikacją która pozwoli na wyznaczenie jakiegoś obszaru na mapie. Dane mapy pobieram za pomocą biblioteki &lt;a href=http://ogdi.sourceforge.net/&gt;OGDI&lt;/a&gt; z &lt;a href=http://en.wikipedia.org/wiki/Vector_Map&gt;VMAP'y&lt;/a&gt;, rysowanie odbywa się poprzez OpenGL, obsługa okien dzięki SDL.&lt;br /&gt;&lt;br /&gt;To był mój pierwszy kontakt z mapami w formie elektronicznej, tzn. wiem co to googlemaps, ale nigdy wcześniej nie próbowałem wydobyć i wykorzystać takich informacji „własnoręcznie”. Nigdy też nie zastanawiałem się jak to jest robione. Także:&lt;br /&gt; - VMAP to bardzo skomplikowana struktura, mapa Europy i Północnej Azji na poziomie 0, czyli największej skali i najmniejszej precyzji, to 509 megabajtów danych w blisko 4 tysiącach plików !!!&lt;br /&gt; - Nie wyobrażam sobie samemu zrobić obsługę takiego molocha w żadnym sensownym czasie,&lt;br /&gt; - OGDI pozwala na obsługę danych geograficznych podobnie do bazy danych, podajemy kryteria (obszar geograficzny) oraz tabelę (warstwę), w wyniku otrzymujemy zbiór rekordów spełniających zapytanie,&lt;br /&gt; - Dane mogą przyjąć formę punktów (miasta), linii (drogi), obszarów (lasy), bądź tekstu. OGDI dopuszcza jeszcze parę innych, ale ja się z nimi nie spotkałem,&lt;br /&gt; - Obszary to tak naprawdę zamknięte linie i żeby je narysować trzeba najpierw zamienić dane w coś co jest akceptowalne przez OpenGL. Tak, tak, na trójkąty,&lt;br /&gt; - Zamiana obszaru, który nie jest wypukły i ma w sobie otwory, z formy konturów na trójkąty nie jest zadaniem trywialnym,&lt;br /&gt; - Na szczęście istnieje OpenGL ze swoim zestawem funkcji do teselacji (gluBeginPolygon i spółka).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Przetworzenie danych z obszaru Polski na formę, którą można w miarę wydajnie renderować trwa dość długo (parędziesiąt sekund), a aplikacji rysujących mapy będzie jeszcze kilka i wszystkie będą używane naprzemiennie. Nie ma takiej możliwości aby pracowały równocześnie i nie ma takiej możliwości aby włączały się tak długo. Uznałem więc za sensowne opracowanie pomocniczego procesu, który przygotuje te dane raz i udostępni je w formie pamięci współdzielonej. W tym celu wykorzystałem boost::interprocess::shared_memory_object.&lt;br /&gt;&lt;br /&gt;Screeny (przedstawiają Łódź):&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/5lqoF6GaIbUAqiCaOMJP1w?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_QclPhZLbeWo/TFfaLphIgQI/AAAAAAAAB8w/DIz9bfKdVhs/s144/map01.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/IpwnYQz7CerVMJtxT4CDhQ?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_QclPhZLbeWo/TFfaL1aNqzI/AAAAAAAAB80/pCRx7EYEUVQ/s144/map02.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/QXNUXbUGBtbVfrdAnbDang?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_QclPhZLbeWo/TFfaL-Jr53I/AAAAAAAAB84/AQ7QMlHNLTw/s144/map03.png" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-3813948925547526719?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/3813948925547526719/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=3813948925547526719' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/3813948925547526719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/3813948925547526719'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/08/rysowanie-map.html' title='Rysowanie map'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_QclPhZLbeWo/TFfaLphIgQI/AAAAAAAAB8w/DIz9bfKdVhs/s72-c/map01.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-4744686005917976546</id><published>2010-07-22T10:00:00.001+02:00</published><updated>2010-08-03T11:12:41.564+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Praca'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows API'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Ciekawy błąd</title><content type='html'>Przy aktualnym projekcie korzystam z biblioteki ogdi. Ma ona formę plików .dll oraz .lib. Aplikacja skompilowała się oraz zbudowała bez problemu, jednak jej uruchomienie zakończyło się pojawieniem komunikatu o błędzie: "An application has made an attempt to load the C runtime library incorrectly." o kodzie R6034.&lt;br /&gt;&lt;br /&gt;Tutaj jest link do opisu problemu na stronie Microsoftu: &lt;a href=http://msdn.microsoft.com/en-us/library/ms235560(VS.80).aspx&gt; link&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Gdyby ktoś trafił na podobny problem i nie od razu załapał o co chodzi z tym manifestem, to służę wyjaśnieniem. Domyślnie VS zamieszcza manifest wewnątrz aplikacji, dzięki temu system potrafi załadować niezbędne biblioteki. W tym wypadku mechanizm zawiódł, ponieważ najwyraźniej plik ogdi.dll potrzebuje załadować dodatkowe zależności, ale sam nie zawiera manifestu. Trzeba, więc dodać manifest pliku ogdi.dll do naszej aplikacji.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-4744686005917976546?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/4744686005917976546/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=4744686005917976546' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4744686005917976546'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4744686005917976546'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/07/ciekawy-bad.html' title='Ciekawy błąd'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-4343431228721020658</id><published>2010-07-13T13:05:00.002+02:00</published><updated>2010-07-13T14:07:37.352+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fotografia'/><title type='text'>Urlop</title><content type='html'>Na przełomie czerwca i lipca pojechaliśmy z żoną do Krynicy Morskiej. Trafiła nam się cudowna pogoda. Przez te 8 dni padało raz i to wieczorem. Oczywiście taki wypad zaowocował masą zdjęć, szczególnie plaży i morza podczas zachodu słońca.&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/-1slKhdPyKgo1bb4i-G34g?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/TDN-bz3cEII/AAAAAAAAB5w/Jbg8SkXrMVc/s144/DSC_0107.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/PrszFYdr9NW5RjqQfBkqcA?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/TDN-cteBM_I/AAAAAAAAB54/garHmcgFKPk/s144/DSC_0036.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/F1Qc4CQTM0W4YliX1CBArg?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_QclPhZLbeWo/TDN-hWTZyVI/AAAAAAAAB6Y/jjJexA0s_yc/s144/DSC_0273.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/_-Txau2ewPMpFCiE2_79Dw?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_QclPhZLbeWo/TDN-cXv_fsI/AAAAAAAAB50/pyvwjWpSfuM/s144/DSC_0254.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/zohcSdykT8E25lgNUaw4xg?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/TDN-gf1c-cI/AAAAAAAAB6M/BDskQkv5RFQ/s144/DSC_0093.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/P4n8vDt7qJd4JL0J79czYg?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_QclPhZLbeWo/TDN-g-c3ptI/AAAAAAAAB6U/ADOi8QcjyJY/s144/DSC_0098.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/vIhcfM1LGJcX6byOi2qxMQ?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_QclPhZLbeWo/TDN-aT-XANI/AAAAAAAAB5s/P-eJzA2hswI/s144/DSC_0077.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/table&gt;Wspomniany deszcz także dał okazję do „cyknięcia” kilku ujęć:&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/LVUhSlNBgyecx0thdoq96Q?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/TDN-Z_Py3wI/AAAAAAAAB5o/5j6FZveXpyU/s144/DSC_0067.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/_KodmwT2XvWSd1FcOhmN9g?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/TDN-ZtBrffI/AAAAAAAAB5k/AXhZ4SeKDvE/s144/DSC_0066.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/b2rbZOiitknApU4MdFYaXQ?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_QclPhZLbeWo/TDN-ZVkpEeI/AAAAAAAAB5g/NLrCNYMDKAo/s144/DSC_0069.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;/table&gt;Niestety wyjazd ujawnił też parę ciemnych stron. Po pierwsze, niesamowita wręcz ilość wodorostów (czyżby efekt uboczny powodzi?). Przy brzegu było ich tyle, że tłumiły fale! Mało przyjemnie wchodzi się do takiej wody. Oczywiście fale wyrzucają te wodorosty na brzeg, gdzie zwyczajnie gniją. Smród i brud. Po drugie remont dróg. Akurat obok naszego noclegu i po drodze nad morze kładli asfalt. Smród i brud.&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/4QgKnf2br93oqaMGmHy5OQ?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_QclPhZLbeWo/TDN-dVHxPAI/AAAAAAAAB58/k-5hw5eZjqs/s144/DSC_0217.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/RNidzrSmXyB2csIQM6wFUw?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/TDN-ePA71iI/AAAAAAAAB6A/MLfF_NU85Uk/s144/DSC_0215.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/VI-vQAcJYskpcSS0UMIM_A?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_QclPhZLbeWo/TDN-fLZ6MAI/AAAAAAAAB6E/rkaU-dyVUKk/s144/DSC_0214.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/0P46a1OW8fqeGwGBIcNhuw?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/TDN-fyoMy-I/AAAAAAAAB6I/3Sg_vxk1fAE/s144/DSC_0213.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-4343431228721020658?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/4343431228721020658/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=4343431228721020658' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4343431228721020658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4343431228721020658'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/07/urlop.html' title='Urlop'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_QclPhZLbeWo/TDN-bz3cEII/AAAAAAAAB5w/Jbg8SkXrMVc/s72-c/DSC_0107.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-617967104154748430</id><published>2010-06-14T17:40:00.004+02:00</published><updated>2010-08-03T11:13:18.993+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Przemyślenia'/><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>"Tylko dwie rzeczy są nieskończone: Wszechświat ..."</title><content type='html'>Dzisiaj nie będzie ani o programowaniu, ani o fotografii. Dzisiaj chciałbym napisać o obserwacji jaką poczyniłem wczoraj, a do której wyjątkowo dobrze pasuje ten cytat:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;"Tylko dwie rzeczy są nieskończone: Wszechświat oraz ludzka głupota, choć nie jestem pewien co do tej pierwszej."&lt;/span&gt; - Albert Einstein.&lt;br /&gt;&lt;br /&gt;Wczoraj, to jest w niedzielę 13 czerwca 2010 roku, byłem w teatrze, gdzie byłem świadkiem dość szokującego dla mnie zachowania. Otóż obok nas siedziała dziewczyna w taki sposób, że podeszwa lewego buta znajdowała się na jej fotelu. Nie wiem jak to opisać, istotne jest to, że pobrudziła fotel na którym sama jeszcze siedziała. Dziewczyna moim zdaniem w wieku licealnym.&lt;br /&gt;&lt;br /&gt;To, że nie wiedziała, że do teatru nie wypada przyjść w tenisówkach mnie nie zaskoczyło. To, że pobrudziła fotel też nie zrobiłoby na mnie wrażenia, wandalizm jest niestety dość codziennym zjawiskiem. To co mnie poruszyło w tej sytuacji to kompletna, bezkresna wręcz, bezmyślność naszej bohaterki.&lt;br /&gt;&lt;br /&gt;Ludzie używajcie mózgu!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-617967104154748430?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/617967104154748430/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=617967104154748430' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/617967104154748430'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/617967104154748430'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/06/tylko-dwie-rzeczy-sa-nieskonczone_14.html' title='&quot;Tylko dwie rzeczy są nieskończone: Wszechświat ...&quot;'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-6837530216256378851</id><published>2010-06-11T20:46:00.004+02:00</published><updated>2010-08-03T11:06:03.426+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fotografia'/><category scheme='http://www.blogger.com/atom/ns#' term='Łódź'/><category scheme='http://www.blogger.com/atom/ns#' term='Pabianice'/><title type='text'>"Ciepło jest, chodźmy na spacer ..."</title><content type='html'>Tak to właśnie się zaczęło. Trzeciego czerwca rano było pochmurnie, ale ciepło. Postanowiliśmy z żoną pójść pod lotnisko i tam z aparatem polować na lądujące samoloty. Wychodząc trochę z obawą patrzyłem na pozostawiony na miejscu parasol. Na szczęście nie padało, w gruncie rzeczy słońce wyszło zza chmur jeszcze zanim doszliśmy na miejsce.&lt;br /&gt;&lt;br /&gt;Nad lotniskiem krążyły dwa samoloty. Piloci najwyraźniej trenowali lądowanie, bo zaraz po dotknięciu ziemi maszyny podrywały się do dalszego lotu.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/adam.smigielski/100603Lotnisko?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_QclPhZLbeWo/TBKCNPfLZvI/AAAAAAAAB2o/6zcQ9WiW2x8/s144/DSC_0070_3250.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Po powrocie do domu zaczęło mi się kręcić w głowie, przed oczami ciemno. Długi pobyt na mocnym słońcu bez czapki skończył się &lt;a href=http://pl.wikipedia.org/wiki/Udar_cieplny&gt;udarem&lt;/a&gt;. Bardzo nieprzyjemne przeżycie i bardzo niebezpieczne.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;W sobotę pojechaliśmy zjeść rybę w &lt;a href=http://www.sereczyn.pl/&gt;Sereczynie&lt;/a&gt;. Świetne miejsce i dają naprawdę smaczne ryby.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=http://picasaweb.google.com/adam.smigielski/100605Sereczyn?feat=directlink&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/TBKCuCZSRUI/AAAAAAAAB20/GPiyno7rJkU/s144/DSC_0094_3268.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;A na kolację gril w ogrodzie.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/adam.smigielski/100605Gril?feat=directlink"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/TBKEE1kBcjI/AAAAAAAAB38/SnNgPv6mR8I/s144/DSC_0144_3318.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-6837530216256378851?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/6837530216256378851/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=6837530216256378851' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6837530216256378851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6837530216256378851'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/06/ciepo-jest-chodzmy-na-spacer.html' title='&quot;Ciepło jest, chodźmy na spacer ...&quot;'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_QclPhZLbeWo/TBKCNPfLZvI/AAAAAAAAB2o/6zcQ9WiW2x8/s72-c/DSC_0070_3250.JPG' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-4175528948824653045</id><published>2010-06-07T12:39:00.003+02:00</published><updated>2010-06-08T11:16:08.998+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='IMGUI'/><title type='text'>OpenGL i koordynaty pikseli</title><content type='html'>Aktualnie pracuję nad prościutką biblioteką do robienia graficznego interfejsu użytkownika. Potrzebna mi będzie do tworzenia kilku współpracujących ze sobą aplikacji. Jest to rozwiązanie "Immediate Mode", rysowanie odbywa się za pomocą OpenGL, natomiast świadomość urządzeń wejściowych uzyskana dzięki SDL.&lt;br /&gt;&lt;br /&gt;No i jak to zwykle bywa natknąłem się na pewien problem. Otóż ramka rysowana wokół guzika była nie domknięta, brakowało lewego dolnego piksela.&lt;br /&gt;&lt;br /&gt;Kod rysujacy ramkę:&lt;br /&gt;glBegin(GL_LINE_LOOP);&lt;br /&gt;&amp;nbsp &amp;nbsp glVertex3f(vertexACoordX, vertexACoordY, 0.0f);&lt;br /&gt;&amp;nbsp &amp;nbsp glVertex3f(vertexBCoordX, vertexBCoordY, 0.0f);&lt;br /&gt;&amp;nbsp &amp;nbsp glVertex3f(vertexCCoordX, vertexCCoordY, 0.0f);&lt;br /&gt;&amp;nbsp &amp;nbsp glVertex3f(vertexDCoordX, vertexDCoordY, 0.0f);&lt;br /&gt;glEnd();&lt;br /&gt;&lt;br /&gt;Rozwiązanie znalazłem tutaj: &lt;a href=http://www.gamedev.net/community/forums/topic.asp?topic_id=525202&gt;link&lt;/a&gt;. Przy okazji wyszedł kolejny problem, faktycznie rozmiar ramki nie pokrywa się z tłem. Wychodzi na to, że trzeba sobie ręcznie poprzesuwać wierzchołki aby wszystko się ze sobą ładnie zgrało.&lt;br /&gt;&lt;br /&gt;Wracając jednak do problemu, co jest przyczyną ? Podanie całkowitych wartości dla współrzędnych punktów sprawia, że rysujemy dokładnie pomiędzy dwoma pikselami. W celu uniknięcia tego problemu należy przesunąć współrzędne o wartość 0.5, alternatywnie możemy włączyć wygładzanie linii:&lt;br /&gt;&lt;br /&gt;glEnable(GL_LINE_SMOOTH);&lt;br /&gt;&lt;br /&gt;To drugie podejście owocuje niestety pogrubieniem naszej ramki.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Odkryłem też pewien zaskakujący brak w SDL, nie daje możliwości zmian położenia i rozmiaru okna. Znaczy da się to zrobić, ale wymaga samodzielnego wykonania czynności specyficznych dla danego OSu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-4175528948824653045?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/4175528948824653045/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=4175528948824653045' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4175528948824653045'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4175528948824653045'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/06/opengl-i-koordynaty-pikseli.html' title='OpenGL i koordynaty pikseli'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-6499101861593398397</id><published>2010-05-31T18:33:00.003+02:00</published><updated>2010-08-03T11:06:31.637+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fotografia'/><category scheme='http://www.blogger.com/atom/ns#' term='Łódź'/><category scheme='http://www.blogger.com/atom/ns#' term='Pabianice'/><title type='text'>Majowe fotki</title><content type='html'>Trochę mi się uzbierało fotografii przez ostatni miesiąc. Wczoraj udało mi się te najfajniejsze zamieścić na Picasie. Niektórzy już nawet zdążyli je tam skomentować ;)&lt;br /&gt;&lt;br /&gt;Najstarsze są zdjęcia ruchu ulicznego zrobione nocą. Przy ich robieniu powstała również ogromna panorama, 180 stopni, 18 x 1 zdjęć, o wymiarach ~27 tysięcy na ~4 tysiące pikseli.&lt;br /&gt;Najfajniejsze wychodzą zdjęcia autobusów. Te wszystkie boczne/górne światła, wyświetlacze LED dają super efekty. Myślę o wybraniu się na jakiś punkt znajdujący się nad ruchliwą drogą (most, kładka etc.) tak aby uzyskać zdjęcia bardziej na wprost.&lt;br /&gt;&lt;a href=http://picasaweb.google.pl/adam.smigielski/Nocne?feat=directlink&gt;&lt;img src="http://lh6.ggpht.com/_QclPhZLbeWo/TALFaT6Kg0I/AAAAAAAABxo/Z4joKJAQqWc/s144/DSC_0056_1559.JPG" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Kolejny album to zdjęcia zrobione w ogrodzie. Małe kociaki są urocze, zabawne, wszechobecne i koszmarnie ruchliwe. Tego dnia zrobiliśmy im dobrze ponad 200 fotek, i prawie na wszystkich są rozmazane :) Ta roślina, której zdjęcie tu podlinkowałem to &lt;a href=http://pl.wikipedia.org/wiki/Różanecznik&gt;Rododendron&lt;/a&gt;.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=http://picasaweb.google.pl/adam.smigielski/100509Ogrod?feat=directlink&gt;&lt;img src="http://lh4.ggpht.com/_QclPhZLbeWo/TALIF-HuCgI/AAAAAAAAByI/2bvq97E_w_o/s144/DSC_0045_1740.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href=http://picasaweb.google.pl/adam.smigielski/100509Ogrod?feat=directlink&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/TALIHoJQCwI/AAAAAAAAByc/AAiuQerJDzE/s144/DSC_0388_2083.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Dwudziestego drugiego maja późnym wieczorem niedaleko Łodzi przeszła burza. Zdjęcia robione ze statywu z automatycznym wyzwalaniem przez &lt;a href=http://en.wikipedia.org/wiki/Intervalometer&gt;interwalometr&lt;/a&gt; (czuję się trochę mniej zdradzony :) ). Jak zauważył Wojciech Toman bardzo zaszumione. Winny jest, jak sądzę, przede wszystkim bardzo długi czas naświetlania. Drugim winowajcom jest Picasa, która nieco przesadziła z dodaniem ekspozycji, przy konwersji z raw do jpg.&lt;br /&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.pl/s/c/bin/slideshow.swf" width="288" height="192" flashvars="host=picasaweb.google.pl&amp;hl=pl&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.pl%2Fdata%2Ffeed%2Fapi%2Fuser%2Fadam.smigielski%2Falbumid%2F5477167674399726897%3Falt%3Drss%26kind%3Dphoto%26hl%3Dpl" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;Na koniec fotografie przyrody, które robiliśmy przez cały maj. Są to głównie ujęcia z Łodzi, okolice naszego mieszkania oraz park Poniatowskiego.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=http://picasaweb.google.pl/adam.smigielski/1005OdzPrzyroda?feat=directlink&gt;&lt;img src="http://lh4.ggpht.com/_QclPhZLbeWo/TALN7RYEZnI/AAAAAAAABzE/NKoUWg2SlcU/s144/DSC_0004_2185.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;td&gt;&lt;a href=http://picasaweb.google.pl/adam.smigielski/1005OdzPrzyroda?feat=directlink&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/TALN-vks8WI/AAAAAAAABzg/Z_cF639MVJk/s144/DSC_0177_2752.JPG" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-6499101861593398397?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/6499101861593398397/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=6499101861593398397' title='Komentarze (4)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6499101861593398397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6499101861593398397'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/05/majowe-fotki.html' title='Majowe fotki'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_QclPhZLbeWo/TALFaT6Kg0I/AAAAAAAABxo/Z4joKJAQqWc/s72-c/DSC_0056_1559.JPG' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-5526816356096621282</id><published>2010-05-31T07:49:00.005+02:00</published><updated>2010-05-31T08:32:40.312+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fuse'/><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><title type='text'>Fusów ciąg dalszy</title><content type='html'>Dotychczasowa wersja linuxowego demona montującego budowane przez nas urządzenie (pisałem o tym: &lt;a href=http://adamsmigielskidevblog.blogspot.com/2010/03/fusy-i-jni.html&gt;link&lt;/a&gt;) w formie systemu plików była napisana w Pythonie i miała bardziej charakteru "proof of concept", zbadania czy to ma sens. Nadszedł jednak dzień w którym zapadła decyzja o przepisaniu demona w Cpp.&lt;br /&gt;&lt;br /&gt;Oczywiście postanowiłem skorzystać z biblioteki &lt;a href=http://fuse.sourceforge.net/&gt;libfuse&lt;/a&gt;. Pomyślana jest ona bardzo podobnie do biblioteki &lt;a href=http://dokan-dev.net/en/&gt;dokan&lt;/a&gt;, czy może raczej dokan jest opracowany na podobieństwo libfuse.&lt;br /&gt;&lt;br /&gt;Wydawało mi się, że ze względu na to podobieństwo zadanie powinno być dość proste. Okazało się jednak, że biblioteka jest dość kiepsko udokumentowana. W zasadzie co by się nie chciało zrobić, to trzeba najpierw przekopać się przez kod biblioteki.&lt;br /&gt;&lt;br /&gt;Jednym z pierwszych problemów na jakie się natknąłem było to, że uruchomienie libfuse poprzez funkcję fuse_main startuje demona i zamyka proces. W efekcie o normalnym debugowaniu możemy zapomnieć. Pod Windowsem też się nie dało, ale tam chociaż można było robić logi w konsoli. Niestety zamknięcie procesu oznacza utratę dostępu do uchwytów konsol.&lt;br /&gt;Wujek google zapytany o "debug fuse" poradził mi aby użyć opcji -d. Przełącznik ten sprawia, że fuse_main nie zamyka procesu i zaczyna wypisywać logi. Daje to również dostęp do konsoli naszym funkcjom.&lt;br /&gt;&lt;br /&gt;Drugim dość poważnym problemem jest to, że Linux po jakimś czasie głupieje. Objawia się to tym, że nasz system plików nagle przestaje działać, a naszym oczom ukazuje się niewiele mówiący komunikat o błędzie. Zdezorientowani dodajemy logowanie w podejrzanych miejscach, cofamy ostanie zmiany, zaczynamy szukać na oślep co może być przyczyną. Pół dnia później resetujemy system i wszystko działa jak należy :(&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Przy okazji tego "projektu" musiałem przenieść, część kodu z Winodwsa na Linux. Jak na razie odkryłem, że obsługa socketów nie wiele różni się pod tymi systemami. Zobaczymy co będzie z portem szeregowym.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-5526816356096621282?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/5526816356096621282/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=5526816356096621282' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/5526816356096621282'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/5526816356096621282'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/05/fusow-ciag-dalszy.html' title='Fusów ciąg dalszy'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-9207747720629672584</id><published>2010-05-03T11:58:00.003+02:00</published><updated>2010-08-03T11:07:03.216+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Fotografia'/><category scheme='http://www.blogger.com/atom/ns#' term='Łódź'/><category scheme='http://www.blogger.com/atom/ns#' term='Pabianice'/><title type='text'>Fotografie</title><content type='html'>&lt;a href=http://www.blogger.com/profile/18016986012138243434&gt;Reg&lt;/a&gt; zasugerował abym podzielił się fotkami, za pomocą Picasa Web Albums. Tadam tadam, oto zdjęcia:&lt;br /&gt;&lt;br /&gt;Jedne z pierwszych zdjęć jakie zrobiliśmy, a także ujęcia z wizyty na lotnisku.&lt;br /&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.pl/s/c/bin/slideshow.swf" width="400" height="267" flashvars="host=picasaweb.google.pl&amp;hl=pl&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.pl%2Fdata%2Ffeed%2Fapi%2Fuser%2Fadam.smigielski%2Falbumid%2F5466972264847236001%3Falt%3Drss%26kind%3Dphoto%26authkey%3DGv1sRgCLqDrfP5kYjPkwE%26hl%3Dpl" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Nasze próby z makro w ogrodzie i nad stawem.&lt;br /&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.pl/s/c/bin/slideshow.swf" width="400" height="267" flashvars="host=picasaweb.google.pl&amp;hl=pl&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.pl%2Fdata%2Ffeed%2Fapi%2Fuser%2Fadam.smigielski%2Falbumid%2F5466974785920039425%3Falt%3Drss%26kind%3Dphoto%26hl%3Dpl" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Pojechaliśmy do zoo.&lt;br /&gt;&lt;embed type="application/x-shockwave-flash" src="http://picasaweb.google.pl/s/c/bin/slideshow.swf" width="400" height="267" flashvars="host=picasaweb.google.pl&amp;hl=pl&amp;feat=flashalbum&amp;RGB=0x000000&amp;feed=http%3A%2F%2Fpicasaweb.google.pl%2Fdata%2Ffeed%2Fapi%2Fuser%2Fadam.smigielski%2Falbumid%2F5466978468208983537%3Falt%3Drss%26kind%3Dphoto%26hl%3Dpl" pluginspage="http://www.macromedia.com/go/getflashplayer"&gt;&lt;/embed&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-9207747720629672584?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/9207747720629672584/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=9207747720629672584' title='Komentarze (4)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/9207747720629672584'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/9207747720629672584'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/05/fotografie.html' title='Fotografie'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-4220959875945198289</id><published>2010-04-21T15:21:00.006+02:00</published><updated>2010-04-25T18:45:17.338+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Nikon'/><category scheme='http://www.blogger.com/atom/ns#' term='Fotografia'/><title type='text'>Nikon d5000</title><content type='html'>Jakiś czas temu postanowiliśmy z żoną kupić sobie cyfrową lustrzankę. Żadne z nas nie miało w tej kwestii żadnych doświadczeń, więc sprawa wcale nie była prosta. Po zapoznaniu się z opinią znajomego profesjonalnego fotografa, przewertowaniu dziesiątek recenzji oraz cenników, zdecydowaliśmy się na tytułowego Nikona d5000.&lt;br /&gt;&lt;br /&gt;Pierwsze wrażenie: Skomplikowany. Miałem w swoim życiu parę aparatów fotograficznych, również lustrzankę ("analogową") i pierwszy raz nie wiedziałem jak wyostrzyć obiektyw. Tak wiem do czego służą te pierścienie, ale kiedy zdjęcie jest ostre?&lt;br /&gt;Rozgryzienie tych wszystkich symboli i guzików trochę trwa, ale kiedy już je opanujemy ... o radości!&lt;br /&gt;Drugie wrażenie: W życiu nie miałem tak szybkiego aparatu w rękach. Włącza się szybko, wyostrza się szybko, ustawia się go szybko, zdjęcia też robi szybko. Chwila nie uwagi i ma się parędziesiąt zdjęć na karcie. Jestem zachwycony.&lt;br /&gt;Trzecie wrażenie: Z obiektywem Nikkor 18-105 mm, waży 1060 gram. Noszenie go na szyi nie wchodzi w grę. Wybór torby jest zadaniem trudnym i wymaga użycia linijki, miarki bądź innego sprzętu o zbliżonych właściwościach. Skończyło się na torbie na ramię marki OptiCam. Aparat z założonym obiektywem wchodzi na styk, ale dostęp do niego jest bardzo wygodny.&lt;br /&gt;Podsumowanie: Aparatem cieszymy się już od półtora tygodnia i wciąż nacieszyć się nie możemy. To niesamowite ile radości sprawia mi robienie kolejnych zdjęć. To był bardzo dobry zakup.&lt;br /&gt;&lt;br /&gt;Przykładowe fotki, oryginały mają wymiary 4288 x 2848:&lt;br /&gt;&lt;a href=http://a06-b06.mypicturetown.com/P2PwebCmdController/cache/0DwfvNvYYvOZ8pJMb3BuNZgQn-r6tFX0OOc24ZuWPJo7iI5cEPwbtH*d9-qtBX3j/item.JPG?rot=1&gt;&lt;img src=http://a06-b06.mypicturetown.com/P2PwebCmdController/cache/2eSpB-TVI%26gso2vp7jvHe%25VMkUAoejHLDs0O8H2FQocxrS*16OdWYeYbM9egflO/item.JPG?rot=1&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=http://a06-b06.mypicturetown.com:80/P2PwebCmdController/cache/i5Pnycx%26R9X.didDYh8LSQM4tdIxFo%3D4N8HJ.u4idPChQ_YHUs9Qu%25x_3cV3%2558%3D/item.JPG?rot=1&gt;&lt;img src="http://a06-b06.mypicturetown.com:80/P2PwebCmdController/cache/jDQBC8Wqft%3D.axcSRTER-_hH4k4-e5WeJEHX7IOX08q%26%3DQqgR5zB*4amJv9AejN/item.JPG?rot=1" title="" alt="" width="320"height="212"&gt;&lt;/a&gt;&lt;br /&gt;&lt;a href=http://a06-b06.mypicturetown.com:80/P2PwebCmdController/cache/%25mV%26YFffph4R2ixVJ0Ct8BD%2536VcwfecIxtHNMbU3iK%25EI*FvWGB21jCUQbxDVIG/item.JPG?rot=1&gt;&lt;img src="http://a06-b06.mypicturetown.com:80/P2PwebCmdController/cache/xbseRE5O.6UAUzHCLdUzTnY9cJzRTe3SaggYvIkHMMouqcKT1Jr5mo_2zimO5m*/item.JPG?rot=1" title="" alt="" width="320"height="212"&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;EDIT&lt;br /&gt;Dodałem dwa zdjęcia.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-4220959875945198289?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/4220959875945198289/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=4220959875945198289' title='Komentarze (9)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4220959875945198289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4220959875945198289'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/04/nikon-d5000.html' title='Nikon d5000'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-8531607329749657421</id><published>2010-04-12T10:00:00.001+02:00</published><updated>2010-04-14T09:31:47.816+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IGK'/><title type='text'>IGK 2010</title><content type='html'>Miałem okazję wziąć udział w VII Ogólnopolskiej Konferencji Inżynierii Gier Komputerowych, czyli tzw. IGK 2010. Pojechaliśmy tam w cztery osoby jako delegacja katedry.&lt;br /&gt;&lt;br /&gt;Muszę stwierdzić, że mocno się zawiodłem. Niestety przedstawione prezentacje były znacznie poniżej moich oczekiwań.&lt;br /&gt;To czego mi zabrakło to "praktycznych prac". Fajnie jest się dowiedzieć, że istnieje jakaś technika/technologia/algorytm/..., ale znacznie fajniej jest od razu dowiedzieć się z jakimi problemami wiąże się implementacja, jakie są alternatywy i jak wypada wydajność oraz jakość wyników w konfrontacji z alternatywnymi rozwiązaniami.&lt;br /&gt;Bez tej "praktycznej" części dostajemy coś w stylu tutoriala bądź reklamy.&lt;br /&gt;&lt;br /&gt;Sama impreza została zorganizowana bardzo dobrze, był nawet transport z/do hotelu.&lt;br /&gt;&lt;br /&gt;Oto lista prezentacji w których wziąłem udział:&lt;br /&gt;1. "Środowisko Adobe AIR jako platforma do budowania gier"&lt;br /&gt;2. "Przegląd gier i przemyślenia związane z technologią Adobe Flash"&lt;br /&gt;3. "Modelowanie obiektów opartych na sile sprężystości"&lt;br /&gt;4. "Interfejs jako podstawowy element rozgrywki"&lt;br /&gt;5. "Implementacja sferycznej metody wizualizacji terenu przy użyciu algorytmu HRTMR"&lt;br /&gt;6. "Wykorzystanie explicit multisample do poprawy jakości deferred shadingu"&lt;br /&gt;7. "Tworzenie gier i aplikacji na platformie iPhone OS z wykorzystaniem UIKit, Core Animation i cocos2d"&lt;br /&gt;8. "Elementy logiki rozmytej w grach komputerowych"&lt;br /&gt;9. "Model zachowań obiektów w symulatorach pola walki i komputerowych grach wojennych"&lt;br /&gt;&lt;br /&gt;Na prezentacji "Projektowanie Interfejsów Użytkownika na potrzeby aplikacji interaktywnych" byłem tylko częściowo.&lt;br /&gt;&lt;br /&gt;Prezentacja "Postmortem AI w Call of Juarez" się nie odbyła. Szkoda, bardzo na nią liczyłem.&lt;br /&gt;&lt;br /&gt;Moim zdaniem najlepszą prezentacją była "Implementacja sferycznej metody wizualizacji terenu przy użyciu algorytmu HRTMR".&lt;br /&gt;&lt;br /&gt;Alternatywne opinie:&lt;br /&gt;&lt;a href=http://xion.org.pl/2010/04/11/igk-nr-7/&gt;Xion&lt;/a&gt;&lt;br /&gt;&lt;a href=http://regedit.gamedev.pl/news_1357_igk_2010_-_coverage_pl.html&gt;Adam Sawicki&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-8531607329749657421?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/8531607329749657421/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=8531607329749657421' title='Komentarze (6)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8531607329749657421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8531607329749657421'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/04/igk-2010.html' title='IGK 2010'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-6761286031994499918</id><published>2010-03-31T09:32:00.001+02:00</published><updated>2010-03-31T09:35:34.648+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Fuse'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='RS232'/><title type='text'>Fusy i JNI</title><content type='html'>W pracy dostałem bardzo ciekawe zadanie. Otóż jest sobie pewne urządzenie nad którym mój zespół pracuje. Urządzenie to składa się z wielu elementów. Elementy mogą mieć pod elementy i parametry. Urządzenie jest podłączane do komputera PC poprzez port szeregowy RS232. Trzeba zapewnić oprogramowaniu na PC prosty dostęp do wszystkich parametrów wszystkich elementów urządzenia.&lt;br /&gt;&lt;br /&gt;Ponieważ struktura urządzenia bardzo przypomina strukturę katalogów i plików na dysku twardym i jednocześnie trzeba zapewnić prosty i równoległy (jednego parametru może potrzebować więcej niż jedna aplikacja) dostęp, to pod linuxem wykorzystano tzw. &lt;a href=http://en.wikipedia.org/wiki/Filesystem_in_Userspace&gt;FUSE&lt;/a&gt;. Moim zadaniem było opracowanie rozwiązania działającego na Windowsie. Zdecydowałem się na identyczne podejście. Co prawda nigdy w życiu nie napisałem sterownika dla Windowsa, ale ...&lt;br /&gt;&lt;br /&gt;W ramach poszukiwań jak cały problem ugryźć trafiłem na bibliotekę &lt;a href=http://dokan-dev.net/en/&gt;Dokan&lt;/a&gt; na licencji LGPL i MIT, która robi dokładnie to czego potrzebowałem, tj. montuje urządzenie ze sterownikiem systemu plików, który przekierowuje wszystkie żądania do wskazanych callbacków. Jedynym zgryzem jest to, że próba debugowania kodu funkcji zwrotnych kończy się prawie zawsze BSODem. Nie można oczekiwać aby wielozadaniowy system działał stabilnie w momencie gdy ktoś zatrzymuje mu breakpointem kod jądra. A może można, tylko ja się już tak przyzwyczaiłem do fanaberii produktów Microsoftu?&lt;br /&gt;&lt;br /&gt;Kolejnym ciekawym zadaniem, które mi się trafiło była realizacja aplikacji rysującej przebiegi parametrów w formie kontrolki na stronę internetową. Ponieważ wszystko ma działać również pod linuxem wybór padł na applet javy, który w jakiś sposób korzysta z OpenGL.&lt;br /&gt;Wykorzystanie OGL z poziomu javy jest możliwe na przykład za pomocą biblioteki &lt;a href=https://jogl.dev.java.net/&gt;JOGL&lt;/a&gt;. Ja jednak miałem już gotowy kod w C++, który realizował całe rysowanie w OGL i nie miałem ochoty się narobić przy przenoszeniu tego do javy (zwłaszcza, że mi osobiście to jego działanie się nie podoba i chciałbym zostawić sobie możliwość poprawek). Akurat gdy zacząłem szukać alternatyw dla JOGLa pojawił się &lt;a href=http://wtomandev.blogspot.com/2010/03/how-to-make-3d-game-running-in-website.html&gt;wpis na blogu Wojciecha Tomana na temat JNI&lt;/a&gt;. Dłużej nie musiałem szukać :) Zamknięcie renderingu w dllce okazało się prostsze niż się tego początkowo spodziewałem. Najwięcej problemów miałem z samym appletem (jak ja nie lubię javy). Jedna rzecz, która mi się nie podobała w rozwiązaniu Pana Wojciecha to użycie SWT. Na szczęście udało mi się to obejść: &lt;a href=http://java.sun.com/j2se/1.4.2/docs/guide/awt/1.3/AWT_Native_Interface.html&gt;informacje o tym jak wydobyć uchwyt okna bez użycia swt&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-6761286031994499918?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/6761286031994499918/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=6761286031994499918' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6761286031994499918'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6761286031994499918'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/03/fusy-i-jni.html' title='Fusy i JNI'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-5329830894308854089</id><published>2010-02-25T08:21:00.002+01:00</published><updated>2010-02-25T09:17:13.090+01:00</updated><title type='text'>2 mini recenzje</title><content type='html'>Dzisiaj chciałbym podzielić się dwoma opiniami.&lt;br /&gt;&lt;br /&gt;Jakiś czas temu, dzięki udziałowi w konkursie organizowanym przez CDA, stałem się posiadaczem gry &lt;a href="http://www.youtube.com/watch?v=kxRsSkzxbj4"&gt;Burnout Paradise: Ultimate Edition&lt;/a&gt;.&lt;br /&gt;Gra na początku robi świetne wrażenie. W menu wita nas utwór &lt;a href="http://www.youtube.com/watch?v=Rbm6GXllBiw&amp;feature=fvst"&gt;Paradise City&lt;/a&gt; zespołu Gun'N'Roses. Zaraz na początku natrafiamy na "wyścig" w trybie "Pirat", który można zobaczyć na podlinkowanym filmiku. Co chwila do dyspozycji jest nowy wóz.&lt;br /&gt;I chciałoby się powiedzieć, że później jest tylko lepiej, ale niestety tak nie jest.&lt;br /&gt;Kolejne wozy różnią się dodaniem punktu tu, czy tam do statystyk (prędkość, dopalacz i wytrzymałość) oraz przyczepnością (częścią łatwo jest driftować, a w innych bez ręcznego ani rusz). Gracz nie ma też w tej kwestii żadnego pola do popisu.&lt;br /&gt;Po początkowym zachwycie, przychodzi szara rzeczywistość i część trybów rozgrywki okazuje się nie grywalna.&lt;br /&gt;Paradise City po którym się ścigamy wcale nie jest taką wielką metropolią na jaką początkowo wygląda. Tak naprawdę do dyspozycji dostajemy obszar, który można pokonać w jakieś dwie minuty. Po przekątnej będzie trzy i pół minuty. Zwyczajnie brakuje tras po których się ścigamy.&lt;br /&gt;Muzyka, tutaj chyba nudzimy się najwolniej. Wybór jest faktycznie spory i akurat trafia w mój gust.&lt;br /&gt;Grę "ukończyłem", to jest dotarłem do punktu, w którym pogratulowano mi jej ukończenia. W praktyce mogłem jeszcze całkiem sporo zrobić, ale mi się znudziło. Wolałem w końcu skończyć Supreme Commander: Forged Alliance.&lt;br /&gt;&lt;br /&gt;Druga "recenzja" będzie z nieco innej bajki. Otóż miałem wczoraj niezwykłą przyjemność obejrzeć w Teatrze Powszechnym w Łodzi komedii "Kolacja dla głupca". Nie jestem znawcą, więc nie odważę się ocenić przedstawienia pod kątem technicznym. Sama sztuka jest ciekawa, bardzo śmieszna i naprawdę warta obejrzenia. Spektakl trwa dwie i pół godziny w tym jedna przerwa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-5329830894308854089?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/5329830894308854089/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=5329830894308854089' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/5329830894308854089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/5329830894308854089'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/02/2-mini-recenzje.html' title='2 mini recenzje'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-2886325741466273612</id><published>2010-02-18T09:23:00.002+01:00</published><updated>2010-02-18T09:31:24.664+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>Procenty</title><content type='html'>Jakiś czas temu &lt;a href="http://xion.org.pl/"&gt;Xion&lt;/a&gt; na swoim blogu zamieścił &lt;a href="http://xion.org.pl/2010/02/04/pr0centy/"&gt;wpis Pr0centy&lt;/a&gt;, gdzie wyraził nadzieję: &lt;span style="font-style:italic"&gt;"Wszyscy oczywiście wiedzą, co to znaczy, że jedna wielkość stanowi określony procent drugiej - mam nadzieję, że w celu zdobycia tej wiedzy wciąż wystarczy skończyć jedynie podstawówkę."&lt;/span&gt;. Ponieważ moja żona aktualnie pracuje w gimnazjum, gdzie uczy języka niemieckiego, to mam informacje z dość wiarygodnego i aktualnego źródła. Procenty są teraz nauczane w drugim semestrze pierwszej klasy gimnazjum :(&lt;br /&gt;Choć do wpisu Xiona pojawiły się komentarze ukazujące znacznie bardziej ponury obraz: &lt;span style="font-style:italic"&gt;"W niektórych gimnazjach to było, w większości - dopiero szkoła średnia."&lt;/span&gt;. Osobiście trochę trudno mi uwierzyć, żeby polska oświata, stoczyła się aż tak bardzo, ale nic nie jest wykluczone.&lt;br /&gt;&lt;br /&gt;Odnośnie samych procentów nazwa, jak to zwykle bywa, mówi sama za siebie. Po angielsku jest percent, co jest zlepkiem łacińskich per i centum, czyli &lt;span style="font-style:italic"&gt;"na"&lt;/span&gt; &lt;span style="font-style:italic"&gt;"sto"&lt;/span&gt;. Nie wiem jak łacińskie per zamieniło się u nas w pro, ale i to słowo, oznaczające &lt;span style="font-style:italic"&gt;"dla"&lt;/span&gt; pasuje całkiem dobrze. Mówiąc &lt;span style="font-style:italic"&gt;"99 procent"&lt;/span&gt;, mówimy tak naprawdę &lt;span style="font-style:italic"&gt;"99 na/dla 100"&lt;/span&gt;. Co chyba wyjaśnia wszystko każdemu, kto wie co to jest ułamek.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-2886325741466273612?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/2886325741466273612/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=2886325741466273612' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2886325741466273612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2886325741466273612'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/02/procenty.html' title='Procenty'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-2137215709219631399</id><published>2010-02-15T09:17:00.002+01:00</published><updated>2010-02-15T09:28:32.043+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='pipe'/><category scheme='http://www.blogger.com/atom/ns#' term='Praca'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows API'/><category scheme='http://www.blogger.com/atom/ns#' term='RS232'/><title type='text'>Pozory mylą</title><content type='html'>&lt;p&gt;W pracy trafiło mi nieco zaskakujące zadanie. Otóż dostałem silnik elektryczny, kontroler do tego silnika, oraz polecenie:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Pan zrobi tak, żeby z PC'ta kontrolować ten silnik&lt;/li&gt;&lt;br /&gt;&lt;li&gt;A dokumentacja gdzie ?&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Na tej płycie, jest tam też jakiś soft.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Ok.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;4 godziny później.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Na tej płycie nie ma dokumentacji, to jakiś katalog handlowy.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Niemożliwe.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Na stronie internetowej też nie ma dokumentacji.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Niemożliwe.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Po dwóch tygodniach (plus okres świąteczny, w którym ja pracowałem) przysłali dokumentację i dedykowany program komunikacyjny.&lt;br /&gt;Zdobyłem wtyczki, przylutowałem kable, wszystko spiąłem zgodnie z dokumentacją i ostatecznie udało się cały zestaw uruchomić. Kontrolując napięcie na kilku pinach mogę regulować kierunek i prędkość.&lt;br /&gt;Przyszedł czas, aby podłączyć to cudo do PC. Komunikacja ma odbywać się poprzez port szeregowy RS232. I tu zaczęły się schody. Na początku stycznia nie można nigdzie dostać żeńskich wtyczek, panuje globalny brak towaru pod tytułem „Remanent”.&lt;br /&gt;Ostatecznie udało mi się połączyć kontroler z komputerem, dzięki zakupowi ostatniej sztuki dostępnej w okolicach uczelni. Uruchomiłem ten dedykowany program i lipa, nie działa. Po wielu kombinacjach odkryłem przyczynę. Domyślna wartość parametru &lt;span style="font-style:italic;"&gt;baud rate&lt;/span&gt; nie umożliwia komunikacji. Prawidłowa wartość to powalające 110 bodów na sekundę !?&lt;br /&gt;Potem okazało się, że program się wiesza przy próbie modyfikacji parametrów pracy. Pomyślałem, więc o nowszej wersji. Znalazłem 2.03, miałem 0.06 !? Ta nowsza jest jednak tylko po japońsku i również nie działa !?&lt;br /&gt;Po straceniu mnóstwa czasu, uznałem, że skoro ten soft nie potrafi nawet poprawnie rozpoznać kontrolera (wyświetla złą nazwę) to chyba to po prostu nie ma prawa zadziałać. Został wysłany e-mail do dostawcy z prośbą o pomoc. Po tygodniu odpowiedział mi  przedstawiciel niemieckiego oddział, że oczywiście udzielą nam wsparcia, ale on aktualnie jest w Istambule i żebym póki co sprawdził czy wtyczki są dobrze podłączone !?&lt;br /&gt;Minęły już trzy tygodnie od oryginalnego maila i wciąż nie dostałem żadnych informacji. Firma jest japońska, a oddział niemiecki, wydawało mi się, że nasza "współpraca" będzie nieco rzetelniejsza. Ehh.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Z zadań bliższych memu sercu, napisałem program do odbierania danych z portu szeregowego i przekazujący je do nazwanego pipe'a. Przy tej okazji odkryłem kilka ciekawostek:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;system Windows daje procesowi wyłączny dostęp do portu szeregowego. Ponieważ typowy desktop ma tylko jeden taki port, debugowanie aplikacji jest utrudnione. Wyjść jest kilka:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;podłączyć inne urządzenie,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;zdobyć drugi port szeregowy, na przykład taki pod usb,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;użyć loopback, proces może jednocześnie pisać i czytać z portu.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;Najbardziej polecam drugi port, choć powodował na „moim” komputerze dość regularne restarty :(&lt;/li&gt;&lt;br /&gt;&lt;li&gt;wszystkie testy jakie wykonałem pozwalają mi sądzić, że pipe'y (wykorzystywane lokalnie) są w zasadzie niezawodne i stosowanie do nich dodatkowych protokołów mija się z celem. Trzeba jedynie zapewnić, że dane będą pobierane w miarę równomiernie do ich zapisywania, aby nie dopuścić do przepełnienia bufora,&lt;/li&gt;&lt;br /&gt;&lt;li&gt;memcpy nie działa poprawnie, gdy bufor źródłowy i docelowy się pokrywają, lepiej użyć memmove.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;I to by było wszystko na dziś.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-2137215709219631399?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/2137215709219631399/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=2137215709219631399' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2137215709219631399'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2137215709219631399'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/02/pozory-myla.html' title='Pozory mylą'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-8951633837621077804</id><published>2010-01-11T13:56:00.014+01:00</published><updated>2010-01-11T15:34:15.565+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Praca'/><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><category scheme='http://www.blogger.com/atom/ns#' term='OpenGL'/><title type='text'>Praca, Ploter</title><content type='html'>Odnośnie pracy, zostałem oficjalnie zatrudniony na Politechnice. Umowa podpisana 8.1.2010, okres wykonania prac 9.12.2009 - 30.12.2009 ;)&lt;br /&gt;Umowę mam o dzieło. Co jest o tyle fajne, że nie muszę płacić składek ZUS :]&lt;br /&gt;Kolejną miłą rzeczą jest koszt uzyskania przychodu. Między innymi dla programistów wynosi on aż 50%. To sporo, bo z 19% podatku dochodowego zrobi się 9.5%.&lt;br /&gt;Szkoda tylko, że tak mało mi zapłacą :(&lt;br /&gt;&lt;br /&gt;Moduł rysujący wykresy wyszedł mi całkiem fajnie. Biblioteka jest oparta o OGL. Póki co nie działa to zbyt optymalnie, ale ... przyjdzie na to czas. Zwłaszcza, że tak od ręki to jedyne co mógłbym zrobić ze strony OGL, to użycie tablic wierzchołków. Niestety dane są przy każdym rysowaniu inne, więc użycie buforów na karcie graficznej odpada.&lt;br /&gt;Doktor podpowiedział, żeby użyć jakiejś formy scrola. Pomysł jest niezły, wymagać będzie jednak sporych zmian, więc na razie leży na półce i czeka.&lt;br /&gt;Także póki co, najwięcej zaoszczędziłem (w ekstremalnych sytuacjach 90% obciążenia CPU) dzięki zmianie momentu odrysowania. Zamiast w pętli, przesunąłem wywołanie do obsługi komunikatu WM_PAINT. Dzięki temu program pracuje jedynie przy poruszaniu oknami i kiedy pojawią się nowe dane.&lt;br /&gt;&lt;br /&gt;Oprócz modułu powstała również aplikacja pod Windowsa. Programik pobiera dane z nazwanego PIPE'a, rozpakowuje i wyświetla zgodnie z plikiem konfiguracyjnym.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/mLKNTEX8f73apXDFT6Hbtw?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/S0sfuyBAs2I/AAAAAAAABiE/wVxW7S1wJ1Y/s144/Plot01.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/OEa9w-UmAL_1ZauTPnbFOQ?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/S0sfvO7_YfI/AAAAAAAABiI/x9KGAfVhyp4/s144/Plot02.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/z63xdxaNOmy56gI0R42LfQ?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/S0sfvd_4sjI/AAAAAAAABiM/Xa78Y6DNwDY/s144/Plot03.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;br /&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;Z &lt;a href="http://picasaweb.google.com/adam.smigielski/Plot?feat=embedwebsite"&gt;Plot&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;PS. Zauważyłem, że &lt;a href=http://regedit.gamedev.pl/index.php5&gt;Adam Sawicki&lt;/a&gt; dodał mój Blog do swojej listy. Dla mnie to pewne wyróżnienie i bardzo mi z tego tytułu miło.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-8951633837621077804?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/8951633837621077804/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=8951633837621077804' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8951633837621077804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8951633837621077804'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2010/01/praca-ploter.html' title='Praca, Ploter'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_QclPhZLbeWo/S0sfuyBAs2I/AAAAAAAABiE/wVxW7S1wJ1Y/s72-c/Plot01.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-872135585509734278</id><published>2009-12-12T15:15:00.008+01:00</published><updated>2010-01-01T19:07:08.401+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analiza stosu'/><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><title type='text'>Analizator stosu</title><content type='html'>Dawno nic nie napisałem, ale przez ten miesiąc zwyczajnie nie było kiedy. Poszukiwanie pracy, użeranie się z urzędasami w PUPie, dalsze poszukiwanie pracy. Ostatecznie znalazłem "pracę". Pomagam przy projekcie prowadzonym przez Politechnikę. Napisałem "pracę", bo tak naprawdę to robię to póki co charytatywnie i jeśli doktor będzie zadowolony to będę miał pracę. Zadania dostaje zróżnicowane. Na początek dostałem płytkę drukowaną z dwoma mikrokontrolerami i polecenie opracowania procedury testowej dla elektronika, który je robi. Teraz piszę przenośny (windows linux) moduł do rysowania wykresów funkcji.&lt;br /&gt;&lt;br /&gt;Analizator stosu doczekał się czegoś co można określić betą. Czyli u mnie działa i robi to co ma robić, ale nie został jeszcze należycie przetestowany i nie doczekał się wdrożenia. Wrzuciłbym cały kod, ale jest go nieco za dużo, więc tylko najciekawsze fragmenty.&lt;br /&gt;&lt;br /&gt;Radzi sobie zarówno ze zwykłymi funkcjami jak i wywołaniami wirtualnymi.&lt;br /&gt;Wymogiem jest aby ramka stosu była skonstruowana zgodnie z tym co opisałem wcześniej.&lt;br /&gt;Wynikiem działania są kolejne adresy powrotne.&lt;br /&gt;&lt;br /&gt;Wydobycie aktualnego BP i adresu powrotnego:&lt;br /&gt;&lt;pre&gt;&lt;span class="type"&gt;void&lt;/span&gt; GetCurrentFrame&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="type"&gt;void&lt;/span&gt;&lt;span class="operator"&gt; *&lt;/span&gt; basepointer&lt;span class="operator"&gt;,&lt;/span&gt; &lt;span class="type"&gt;void&lt;/span&gt;&lt;span class="operator"&gt; *&lt;/span&gt; retaddr&lt;span class="operator"&gt;)&lt;br /&gt;{&lt;/span&gt;&lt;br /&gt; __asm&lt;br /&gt; &lt;span class="operator"&gt;{&lt;/span&gt;&lt;br /&gt;  mov eax&lt;span class="operator"&gt;,&lt;/span&gt; ebp&lt;br /&gt;  mov eax&lt;span class="operator"&gt;, [&lt;/span&gt;eax&lt;span class="operator"&gt;]&lt;/span&gt;&lt;br /&gt;  mov basepointer&lt;span class="operator"&gt;,&lt;/span&gt; eax&lt;br /&gt;  mov eax&lt;span class="operator"&gt;,&lt;/span&gt; ebp&lt;br /&gt;  add eax&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="int"&gt; 0x4&lt;/span&gt;&lt;br /&gt;  mov eax&lt;span class="operator"&gt;, [&lt;/span&gt;eax&lt;span class="operator"&gt;]&lt;/span&gt;&lt;br /&gt;  mov retaddr&lt;span class="operator"&gt;,&lt;/span&gt; eax&lt;span class="operator"&gt;&lt;br /&gt; }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Wydobycie kolejnej ramki:&lt;br /&gt;&lt;pre&gt;&lt;span class="type"&gt;bool&lt;/span&gt; GetNextFrame&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="type"&gt;void&lt;/span&gt;&lt;span class="operator"&gt; *&lt;/span&gt; basepointer&lt;span class="operator"&gt;,&lt;/span&gt; &lt;span class="type"&gt;void&lt;/span&gt;&lt;span class="operator"&gt; *&lt;/span&gt; retaddr&lt;span class="operator"&gt;)&lt;/span&gt;&lt;br /&gt; &lt;span class="flow"&gt;if&lt;/span&gt; &lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="int"&gt;0&lt;/span&gt;&lt;span class="operator"&gt; == *(&lt;/span&gt;&lt;span class="type"&gt;unsigned int&lt;/span&gt;&lt;span class="operator"&gt; *)&lt;/span&gt;basepointer&lt;span class="operator"&gt;)&lt;br /&gt; {&lt;/span&gt;&lt;br /&gt;  &lt;span class="flow"&gt;return&lt;/span&gt;&lt;span class="bool"&gt; false&lt;/span&gt;&lt;span class="operator"&gt;;&lt;br /&gt; }&lt;/span&gt;&lt;br /&gt; &lt;span class="flow"&gt;else&lt;/span&gt;&lt;br /&gt; &lt;span class="operator"&gt;{&lt;/span&gt;&lt;br /&gt;  __asm&lt;br /&gt;  &lt;span class="operator"&gt;{&lt;/span&gt;&lt;br /&gt;   mov eax&lt;span class="operator"&gt;,&lt;/span&gt; basepointer&lt;br /&gt;   add eax&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="int"&gt; 0x4&lt;/span&gt;&lt;br /&gt;   mov eax&lt;span class="operator"&gt;, [&lt;/span&gt;eax&lt;span class="operator"&gt;]&lt;/span&gt;&lt;br /&gt;   mov retaddr&lt;span class="operator"&gt;,&lt;/span&gt; eax&lt;br /&gt;   mov eax&lt;span class="operator"&gt;,&lt;/span&gt; basepointer&lt;br /&gt;   mov eax&lt;span class="operator"&gt;, [&lt;/span&gt;eax&lt;span class="operator"&gt;]&lt;/span&gt;&lt;br /&gt;   mov basepointer&lt;span class="operator"&gt;,&lt;/span&gt; eax&lt;span class="operator"&gt;&lt;br /&gt;  }&lt;/span&gt; &lt;br /&gt;  &lt;span class="flow"&gt;return&lt;/span&gt;&lt;span class="bool"&gt; true&lt;/span&gt;&lt;span class="operator"&gt;;&lt;br /&gt; }&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Wydobycie adresu bazowego (o tym już pisałem wcześniej):&lt;br /&gt;&lt;pre&gt;&lt;span class="type"&gt;void&lt;/span&gt; GetBaseAddress&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="type"&gt;unsigned int&lt;/span&gt;&lt;span class="operator"&gt; &amp;amp;&lt;/span&gt; baseAddr&lt;span class="operator"&gt;)&lt;br /&gt;{&lt;/span&gt;&lt;br /&gt; HMODULE proces&lt;span class="operator"&gt; =&lt;/span&gt; GetModuleHandleA&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="int"&gt;0&lt;/span&gt;&lt;span class="operator"&gt;);&lt;/span&gt;&lt;br /&gt; baseAddr&lt;span class="operator"&gt; = (&lt;/span&gt;&lt;span class="type"&gt;unsigned int&lt;/span&gt;&lt;span class="operator"&gt;)&lt;/span&gt;proces&lt;span class="operator"&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Na początku należy wywołać GetCurrentFrame, potem w pętli GetNextFrame. Adres bazowy można wyciągnąć w dowolnym momencie.&lt;br /&gt;Osobiście ubrałem to sobie w klasy, a ten kod (jak wspomniałem) jest tak na szybko uproszczony, żeby się go dało zaprezentować na tym blogu.&lt;br /&gt;&lt;br /&gt;Na koniec chciałbym życzyć wszystkim aby rok 2010 okazał się owocniejszy od wszystkich minionych.&lt;br /&gt;&lt;br /&gt;PS.&lt;br /&gt;Właśnie odkryłem, że blogger zapisuje sobie datę utworzenia posta, a nie publikacji. Data publikacji 01.01.2010.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-872135585509734278?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/872135585509734278/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=872135585509734278' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/872135585509734278'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/872135585509734278'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/12/analizator-stosu.html' title='Analizator stosu'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-2423163224085553984</id><published>2009-12-01T13:29:00.009+01:00</published><updated>2009-12-01T14:15:50.931+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analiza stosu'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Analiza stosu i funkcje wirtualne</title><content type='html'>Dziś garść informacji o tym jak działają funkcje wirtualne.&lt;br /&gt;&lt;br /&gt;Przede wszystkim dla tych co nie wiedzą czym jest funkcja wirtualna źródła: [1],[2] i [3].&lt;br /&gt;&lt;br /&gt;O tym jak działa wywołanie funkcji i jak istotną rolę w tym procederze pełni stos napisałem &lt;a href=http://adamsmigielskidevblog.blogspot.com/2009/10/analiza-stosu-i-mapa-pliku.html&gt;tutaj&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Przykładowy kawałek kodu w C++:&lt;pre&gt;&lt;span class="keyword"&gt;class&lt;/span&gt; A&lt;span class="operator"&gt; {&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;public&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt; virtual&lt;/span&gt;&lt;span class="type"&gt; void&lt;/span&gt; fun&lt;span class="operator"&gt;();&lt;/span&gt;&lt;br /&gt; __declspec&lt;span class="operator"&gt;(&lt;/span&gt;noinline&lt;span class="operator"&gt;)&lt;/span&gt;&lt;span class="type"&gt;  void&lt;/span&gt; fun2&lt;span class="operator"&gt;();&lt;br /&gt;};&lt;/span&gt;&lt;span class="keyword"&gt; &lt;br /&gt;class&lt;/span&gt; B&lt;span class="operator"&gt; :&lt;/span&gt;&lt;span class="keyword"&gt; public&lt;/span&gt; A&lt;span class="operator"&gt; {&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;public&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt; virtual&lt;/span&gt;&lt;span class="type"&gt; void&lt;/span&gt; fun&lt;span class="operator"&gt;();&lt;br /&gt;};&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt;int&lt;/span&gt;&lt;span class="keyword"&gt; main&lt;/span&gt;&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="type"&gt;int&lt;/span&gt; argc&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="type"&gt; char&lt;/span&gt;&lt;span class="operator"&gt; *&lt;/span&gt; argv&lt;span class="operator"&gt;[])&lt;br /&gt;{&lt;/span&gt;&lt;br /&gt; A&lt;span class="operator"&gt; *&lt;/span&gt; a&lt;span class="operator"&gt; =&lt;/span&gt;&lt;span class="keyword"&gt; new&lt;/span&gt; A&lt;span class="operator"&gt;();&lt;/span&gt;&lt;br /&gt; A&lt;span class="operator"&gt; *&lt;/span&gt; b&lt;span class="operator"&gt; =&lt;/span&gt;&lt;span class="keyword"&gt; new&lt;/span&gt; B&lt;span class="operator"&gt;();&lt;/span&gt;&lt;br /&gt; a&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;fun&lt;span class="operator"&gt;();&lt;/span&gt;&lt;br /&gt; b&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;fun&lt;span class="operator"&gt;();&lt;/span&gt;&lt;br /&gt; a&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;fun2&lt;span class="operator"&gt;();&lt;/span&gt;&lt;br /&gt; b&lt;span class="operator"&gt;-&amp;gt;&lt;/span&gt;fun2&lt;span class="operator"&gt;();&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Wywołania klasyczne:&lt;pre&gt;; 36   :  a-&gt;fun2();&lt;br /&gt; mov eax, edi&lt;br /&gt; call ?fun2@A@@QAEXXZ    ; A::fun2&lt;br /&gt;; 37   :  b-&gt;fun2();&lt;br /&gt; mov eax, esi&lt;br /&gt; call ?fun2@A@@QAEXXZ    ; A::fun2&lt;/pre&gt;&lt;br /&gt;Wywołania wirtualne:&lt;pre&gt;Po kompilacji:&lt;br /&gt;; 26   :  a-&gt;fun();&lt;br /&gt; mov eax, DWORD PTR [edi]&lt;br /&gt; mov edx, DWORD PTR [eax+4]&lt;br /&gt; mov ecx, edi&lt;br /&gt; call edx&lt;br /&gt;; 27   :  b-&gt;fun();&lt;br /&gt; mov eax, DWORD PTR [esi]&lt;br /&gt; mov edx, DWORD PTR [eax+4]&lt;br /&gt; mov ecx, esi&lt;br /&gt; call edx&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Przy rozwiązaniu statycznym:&lt;br /&gt;1. do rejestru eax ładowany jest adres obiektu, czyli wskaźnik this,&lt;br /&gt;2. wykonywana jest instrukcja call z adresem funkcji fun2.&lt;br /&gt;&lt;br /&gt;W przypadku wirtualnym:&lt;br /&gt;1. do rejestru eax ładowane są pierwsze 4 bajty obiektu,&lt;br /&gt;2. do rejestru edx ładowana jest pamięć spod adresu eax + 4,&lt;br /&gt;3. do rejestru ecx ładowany jest adres obiektu, czyli wskaźnik this,&lt;br /&gt;4. wykonywana jest instrukcja call z zawartością rejestru edx.&lt;br /&gt;&lt;br /&gt;Na co tu zwrócić uwagę?&lt;br /&gt;1. przy wywołaniu statycznym adres funkcji jest na stałe zapisany w kodzie,&lt;br /&gt;2. przy wywołaniu wirtualnym adres funkcji jest ładowany z pamięci,&lt;br /&gt;3. adres funkcji wirtualnej znajduje się w tablicy metod wirtualnych&lt;br /&gt;4. adres tej tabeli jest zapisany jako pierwsze pole w obiekcie.&lt;br /&gt;&lt;br /&gt;Tak to wygląda na stosie:&lt;br /&gt;&lt;table&gt;&lt;tr&gt;&lt;td&gt;EBP&lt;br /&gt;-0xXX&lt;br /&gt;-0x4&lt;br /&gt;0x0&lt;br /&gt;+0x4&lt;br /&gt;+0x8&lt;/td&gt;&lt;td&gt;Co&lt;br /&gt;lokalne&lt;br /&gt;lokalne&lt;br /&gt;oldBP&lt;br /&gt;retAddr&lt;br /&gt;Parametry funkcji&lt;br /&gt;&lt;/td&gt;&lt;td&gt;Rejestr&lt;br /&gt;&lt;-ESP&lt;br /&gt;&lt;br /&gt;&lt;-EBP&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt; &lt;br /&gt;&lt;br /&gt;Dokładnie tak samo jak w przypadku statycznym.&lt;br /&gt;&lt;br /&gt;Pod adresem powrotnym znajduje się opcode &lt;a href=http://ref.x86asm.net/coder32.html#xFF&gt;ff&lt;/a&gt; To jest dwubajtowa instrukcja. Jeden na ff i jeden na parametr. Dokładny opis wszystkich instrukcji i parametrów można znaleźć w [4] i [5].&lt;br /&gt;&lt;br /&gt;Jak te informacje zamienić na adres funkcji ?&lt;br /&gt;Jeszcze nie wiem, ale mam dwa pomysły:&lt;br /&gt;&lt;br /&gt;1. Wszystko wskazuje na to, że poszukiwana wartość zapisana jest jedynie w tablicy metod wirtualnych. Można pokusić się o analizę kodu wywołania pod kątem indeksu metody w tablicy. Mając ten indeks wystarczy odczytać [[this]+indeks].&lt;br /&gt;2. Można też olać dokładny adres funkcji i zapisać sobie jedynie zawartość retAddr. Jeżeli mamy adres 0x01234568 oraz wiemy, że funkcja a - 0x01234000 i b - 0x01235000, to jasne jest, ze była to funkcja a.&lt;br /&gt;&lt;br /&gt;Pierwsze rozwiązanie jest fajne, bo daje nam na talerzu to czego chcemy.&lt;br /&gt;Drugie rozwiązanie jest fajne, bo:&lt;br /&gt;a. działa nie zależnie od tego czy wywołanie jest statyczne czy dynamiczne,&lt;br /&gt;b. powinno działać nie zależnie od użytego kompilatora, czy wybranych ustawień budowania&lt;br /&gt;&lt;br /&gt;Wniosek ?&lt;br /&gt;Rozwiązanie drugie jest wyborem lepszym. Jest prostsze w implementacji i bardziej uniwersalne. Będzie wymagało jednak stworzenia dodatkowego narzędzia, które zamieni zapisane dane na adresy funkcji.&lt;br /&gt;&lt;br /&gt;Źródła:&lt;br /&gt;1) &lt;a href=http://pl.wikibooks.org/wiki/C%2B%2B/Funkcje_wirtualne&gt;Wikibooks - Funkcje wirtualne&lt;/a&gt;&lt;br /&gt;2) &lt;a href=http://pl.wikipedia.org/wiki/Metoda_wirtualna&gt;Wikipedia - Metoda wirtualna&lt;/a&gt;&lt;br /&gt;3) &lt;a href=http://yosefk.com/c++fqa/inheritance-virtual.html&gt;What is a "virtual member function"?&lt;/a&gt;&lt;br /&gt;4) &lt;a href=http://www.intel.com/Assets/PDF/manual/253666.pdf&gt;Intel Instruction Set A-M&lt;/a&gt;&lt;br /&gt;5) &lt;a href=http://www.intel.com/Assets/PDF/manual/253667.pdf&gt;Intel Instruction Set N-Z&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-2423163224085553984?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/2423163224085553984/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=2423163224085553984' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2423163224085553984'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2423163224085553984'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/12/dzis-napisze-co-nieco-o-tym-jak-dziaaja.html' title='Analiza stosu i funkcje wirtualne'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-791037583554256069</id><published>2009-11-27T12:34:00.002+01:00</published><updated>2009-11-27T12:45:58.629+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows 7'/><title type='text'>Reinstalacja Windowsa</title><content type='html'>Postanowiłem przeinstalować system na laptopie. Do tej pory był zainstalowany &lt;span style="font-weight:bold;"&gt;Windows 7 RC 1 x64 Ultimate PL&lt;/span&gt; i muszę powiedzieć, że byłem z niego bardzo zadowolony. Teraz zainstalowałem &lt;span style="font-weight:bold;"&gt;Windows 7 RTM x64 Profesional EN&lt;/span&gt;. Na początek update, sterowniki prawie do wszystkiego zainstalowały się same. Nie działa kilka drobnostek w stylu kamery i kilka klawiszy specjalnych. Obowiązkowy restart komputera i …&lt;br /&gt;&lt;br /&gt;Aero się nie włączyło. Co jest ?! &lt;br /&gt;&lt;br /&gt;Przeszukałem wszystkie opcje wydajności i wyglądu, lipa. W końcu spytałem się kryształowej kuli i o to co znalazłem: &lt;a href=http://www.mydigitallife.info/2009/01/13/how-to-turn-on-and-enable-aero-in-windows-7-enable-aero-peek/&gt;link&lt;/a&gt;&lt;br /&gt;Otóż należy:&lt;br /&gt;1) Otworzyć Menu Start&lt;br /&gt;2) Wpisać Aero&lt;br /&gt;3) Wybrać pozycję &lt;span style="font-weight:bold;"&gt;Find and fix problems with transparency and other visual effects&lt;/span&gt;&lt;br /&gt;4) Kliknąć Next&lt;br /&gt;5) Jeśli mamy szczęście to cieszymy się prześlicznym interfejsem Windowsa 7 (czytaj u mnie zadziałało).&lt;br /&gt;&lt;br /&gt;Dumny i pełen optymizmu zainstalowałem Visual Studio 2008 Pro, MSDN, Service Pack 1 do VS oraz DX SDK, a następnie postanowiłem poszukać materiałów na temat tablic metod wirtualnych (ostatecznie chcę zrobić tą analizę stosu i podzielić się wiedzą tutaj na blogu :) ). Na szybko stworzyłem projekcik do celów eksperymentalnych, build i …&lt;br /&gt;&lt;br /&gt;Linker oświadczył mi, że nie może znaleźć kernel.lib. Z ust wyrwało mi się "WTF ?!" tylko nieco bardziej swojsko i soczyście.&lt;br /&gt;&lt;br /&gt;Poszukiwania z google zaowocowały tym &lt;a href=http://blogs.msdn.com/saurabh_singh/archive/2009/01/30/getting-fatal-error-lnk1181-cannot-open-input-file-kernel32-lib.aspx&gt;linkiem&lt;/a&gt;. Zgodnie z poradą poszukałem klucza:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;HKEY_CURRENT_USER\SOFTWARE\Microsoft\MicrosoftSDKs\Windows\CurrentInstallFolder&lt;/span&gt;.&lt;br /&gt;Niestety nic z tego, nie było takiego wpisu.&lt;br /&gt;&lt;br /&gt;Odkryłem, że zainstalowane zostało SDK tylko w wersji x64. Postanowiłem zainstalować najnowsze &lt;a href=http://www.microsoft.com/downloads/details.aspx?FamilyID=71DEB800-C591-4F97-A900-BEA146E4FAE1&amp;displayLang=en&gt;SDK w wersji 7.0&lt;/a&gt;.&lt;br /&gt;Ściągnąłem te 1.4 GB, jednak przy próbie instalacji dowiedziałem się, że nic z tego, bo to nie jest SDK dla systemów x64 :(&lt;br /&gt;&lt;br /&gt;Wywaliłem Visual Studio, zainstalowałem ponownie. Tym razem zostawiłem domyślne opcje, wyleciały tylko opcje Crystal Report i …&lt;br /&gt;&lt;br /&gt;Działa :)&lt;br /&gt;&lt;br /&gt;Postanowiłem jednak ściągnąć to SDK 7.0 tym razem w wersji dla x64. Zainstalowałem i …&lt;br /&gt;&lt;br /&gt;Tak tak, i nie działa. Konkretniej to nie działa aplikacja &lt;span style="font-weight:bold;"&gt;Windows SDK Configuration Tool&lt;/span&gt; mająca za zadanie skonfigurowanie Visual Studio tak aby korzystało z wybranej wersji. Działanie kończy się objawieniem komunikatu:&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Your system does not have visual studio 2005 or visual studio 2008 installed&lt;/span&gt;.&lt;br /&gt;Rozwiązanie znów przyniósł google: &lt;a href=http://blogs.msdn.com/windowssdk/archive/2009/08/21/windows-sdk-configuration-tool-may-report-an-error-when-os-display-format-is-not-english.aspx&gt;link&lt;/a&gt;. Należy odpalić linie komend z &lt;span style="font-weight:bold;"&gt;Menu Start/Microsoft Windows SDK 7.0/CMD Shell&lt;/span&gt; i wykonać &lt;span style="font-weight:bold;"&gt;WindowsSdkVer.exe -version:v7.0&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I w ten o to sposób udało mi się przeinstalować Windowsa i skonfigurować go do podstawowego użytku.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-791037583554256069?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/791037583554256069/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=791037583554256069' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/791037583554256069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/791037583554256069'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/11/reinstalacja-windowsa.html' title='Reinstalacja Windowsa'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-8271755311500024280</id><published>2009-11-09T12:14:00.005+01:00</published><updated>2009-11-09T12:42:11.842+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>Zmiany</title><content type='html'>Życiowe zmiany.&lt;br /&gt;&lt;br /&gt;Po pierwsze, o tym już pisałem, dnia 28 października 2009 roku ukończyłem studia. Mam tytuł magistra inżyniera informatyki, specjalność inżynieria oprogramowania i systemy sieciowe.&lt;br /&gt;&lt;br /&gt;Po drugie, dnia 31 października 2009 roku mój największy dotychczasowy projekt (ponad 8 lat ciężkiej pracy) osiągnął status pełnej wersji. Tadam! Tadam! 1.0 !!! Teraz zostało mi tylko go pielęgnować i czerpać korzyści.&lt;br /&gt;Ponieważ to może nie być oczywiste to wyjaśnię, że chodzi o małżeństwo ;)&lt;br /&gt;&lt;br /&gt;Po trzecie, udało się w końcu otrząsnąć po obronie i ślubie, zabieram się za poszukiwanie pracy. Trochę mnie to przeraża, bo trudno mi ocenić moje kwalifikacje. Z jednej strony znam bardzo dobrze C++, wiem co nieco o inżynierii, potrafię korzystać z asemblera, niestraszny mi brak IDE, miałem też romans z Pythonem, Javą i SQL. Z drugiej strony brak mi doświadczenia. Poza C++ w zasadzie programowałem dość sporadycznie.&lt;br /&gt;&lt;br /&gt;Do następnego razu. Planuje sprawdzić jak to jest z tą kolejnością globalnych oraz napisać na temat analizy stosu przy wywołaniach metod wirtualnych, tylko jakoś czasu nie mam.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-8271755311500024280?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/8271755311500024280/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=8271755311500024280' title='Komentarze (3)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8271755311500024280'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8271755311500024280'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/11/zmiany.html' title='Zmiany'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-9000506826240409414</id><published>2009-10-23T16:09:00.005+02:00</published><updated>2009-12-01T13:57:30.390+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Analiza stosu'/><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Analiza stosu i mapa pliku</title><content type='html'>Ten post miał pójść w piątek (23 X), ale niestety w piątek rano zostałem poinformowany o terminie obrony, tj środa 28 X. W sumie to stety, bo od wczoraj jestem magister inżynier informatyki specjalizacja inżynieria oprogramowana i systemy sieciowe.&lt;br /&gt;&lt;br /&gt;Sama obrona to w sumie dość sympatyczne przeżycie, gdyby nie jeden drobny detal, OGROMNY STRES!&lt;br /&gt;&lt;br /&gt;A teraz do rzeczy. Jak ustalić adres aktualnie wykonywanej funkcji ? Należy przeanalizować zawartość stosu. Czym jest &lt;a href=http://pl.wikipedia.org/wiki/Stos_(informatyka)&gt;stos&lt;/a&gt;, mam nadzieję wszyscy wiedzą. Nie wszyscy natomiast muszą wiedzieć co w praktyce dzieje się ze stosem i rejestrami w momencie wywołania funkcji. Na początku wykonywany jest kawałek kodu nazywany prologiem funkcji, ma on na celu przygotowanie na stosie tzw ramki:&lt;br /&gt;&lt;br /&gt;push ebp&lt;br /&gt;mov ebp, esp&lt;br /&gt;sub esp, 0xXX&lt;br /&gt;&lt;br /&gt;W tym momencie stos wygląda tak:&lt;br /&gt;-0xXX  ...        &lt;- ESP&lt;br /&gt;-0x4   ...&lt;br /&gt;0x0     oldBP  &lt;- EBP&lt;br /&gt;&lt;br /&gt;Czyli EBP wskazuje na poprzednią zawartość rejestru EBP. ESP wskazuje gdzieś, przy czym gdzieś nie jest gdziekolwiek, ale zależy od rozmiaru zmiennych lokalnych funkcji, 0xXX to właśnie ten rozmiar w bajtach. Warto tu zwrócić szczególną uwagę, iż wszystkie zmienne lokalne funkcji mają adresy od EBP - 4, aż do EBP - 0xXX. Takie rozwiązanie pozwala m.in na prostą organizację rekurencji.&lt;br /&gt;Po wykonaniu prologu wykonywane jest ciało funkcji. Gdy funkcja się kończy rejestr ESP jest odpowiednio modyfikowany o wartość 0xXX, a EBP popowane. Pamięć użyta pod zmienne lokalne nie jest w żaden sposób czyszczona, ale jest traktowana jako wolna przestrzeń.&lt;br /&gt;&lt;br /&gt;To dzieje się po wywołaniu funkcji. Zanim jednak do tego dojdzie trzeba ją jakoś wywołać. &lt;br /&gt;&lt;br /&gt;mov eax, [ebp-4]&lt;br /&gt;push eax&lt;br /&gt;call test&lt;br /&gt;add esp, 4&lt;br /&gt;&lt;br /&gt;Stos:&lt;br /&gt;&lt;br /&gt;0x0    oldBP     &lt;- tutaj będzie wskazywać EBP po wykonaniu prologu&lt;br /&gt;0x4    retAddr&lt;br /&gt;0x8    [ebp-4]&lt;br /&gt;&lt;br /&gt;Na początek do EAX ładowana jest pamięć spod adresu EBP - 4, czyli wartość zmiennej lokalnej. Następnie wartość ta jest odkładana na stos, jest to parametr wywoływanej funkcji. Wywołanie wykonuje się instrukcją call. Instrukcja ta robi dwie rzeczy, odkłada na stos rejestr EIP oraz wykonuje skok pod podany adresy. Ponieważ rejestr EIP zawsze zawiera adres następnej instrukcji do wykonania, odłożona wartość jest adresem pod jaki należy powrócić gdy funkcja się zakończy, w tym wypadku jest to usunięcie ze stosu przekazanego parametru.&lt;br /&gt;&lt;br /&gt;Wyciągamy ze stosu adres powrotu, [EBP + 4] i odczytujemy co siedzi w pamięci:&lt;br /&gt;&lt;br /&gt;e8 zz yy xx ww 83 blah blah&lt;br /&gt;Dokładnie pod adresem powrotnym jest wartość 83, która nie jest szczególnie ciekawa, bo to opcode dodawania. Interesujące są natomiast cztery poprzednie bajty, czyli wartość wwyyxxzz, jest to offset skoku. Adres pod jaki wykonany został skok, czyli teoretyczny adres funkcji, uzyskuje się po dodaniu offsetu do wartości retAddr.&lt;br /&gt;&lt;br /&gt;Tak to właśnie wygląda w teorii, w praktyce kompilatory oszukują :) Otóż MSVC 2008 Debug umieszcza instrukcję JMP pod adresem dla CALL. Czyli mamy tak: CALL -&gt; JMP -&gt; Wywoływana funkcja.&lt;br /&gt;&lt;br /&gt;JMP w pamięci wygląda tak: e9 zz yy xx ww. Podobnie jak przy callu jest to offset, tym razem należy dodać adres jmp'a powiększony o 5 aby uzyskać oczekiwany adres funkcji.&lt;br /&gt;&lt;br /&gt;No na razie o stosie wystarczy, teraz parę słów o mapowaniu PE do pamięci wirtualnej.&lt;br /&gt;&lt;br /&gt;Ostatnio napisałem, że w pliku z mapą są wszystkie informacje potrzebne do identyfikacji funkcji na podstawie jej adresu. No więc nie jest to do końca prawda. Wraz z systemem Vista Beta 2 wprowadzono technologię &lt;a href=http://blogs.msdn.com/michael_howard/archive/2006/05/26/address-space-layout-randomization-in-windows-vista.aspx&gt;Address space layout randomization&lt;/a&gt;. Robi ona dokładnie to na co wskazuje nazwa, czyli miesza przestrzeń pamięci, aby utrudnić życie piszącym wszelkiej maści exploity.&lt;br /&gt;&lt;br /&gt;Przykładowy wpis z mapy:&lt;br /&gt;" 0002:00000540 ?test@@YAXAAVFrame@@@Z 00411540 f TestApp.obj".&lt;br /&gt;&lt;br /&gt;Listing disasemblera:&lt;br /&gt;"void test(Frame &amp; frame)&lt;br /&gt; {&lt;br /&gt;013C1540 push ebp&lt;br /&gt;013C1541 mov ebp,esp"&lt;br /&gt;&lt;br /&gt;Jest problem, adres 0x013C1540 ma się nijak do 0x00411540 (znaczy końcówkę mają wspólną). Rozwiązania znalazłem dwa:&lt;br /&gt; 1) przełączyć flagę /DYNAMICBASE. Wyłączy to ASLR i adresy będą się pokrywać. Sprawdzone, działa pod 7.&lt;br /&gt;2) znaleźć adres pod jaki windows załadował exeka i na tej podstawie ustalić jaka jest wartość w mapie. Również sprawdzone, działa pod 7.&lt;br /&gt;&lt;br /&gt;W celu ustalenia adresu bazowego procesu można posłużyć się funkcją GetModuleHandleA. Zwraca ona wartość typu HMODULE, a przyjmuje łańcuch znakowy z nazwą poszukiwanego modułu. Przekazanie jej wartości NULL sprawi, że poszuka ona adresu bazowego procesu wywołującego. Zwrócony HMODULE to poszukiwany przez nas adres. Nie wiem niestety jak to wygląda w przypadku aplikacji 64 bitowych. Zakładam, że HMODULE jest wtedy typem 64 bitowym, ale ...&lt;br /&gt;&lt;br /&gt;Uzyskany w ten sposób adres bazowy, w tym wypadku była to wartość 0x13B0000, odejmujemy od adresów pod jakie wykonywane są skoki. Wynikiem jest offset, czyli dla funkcji test 0x11540. Offset ten należy zwiększyć o adres bazowy podany w mapie, 0x400000, aby uzyskać dokładny adres funkcji. Ostatecznie otrzymamy 0x00411540.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-9000506826240409414?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/9000506826240409414/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=9000506826240409414' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/9000506826240409414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/9000506826240409414'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/10/analiza-stosu-i-mapa-pliku.html' title='Analiza stosu i mapa pliku'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-8818099851113344138</id><published>2009-10-20T12:59:00.005+02:00</published><updated>2009-10-20T18:26:50.868+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Logger</title><content type='html'>Miała miejsce długa przerwa, ale nie jest źle. Ostatecznie to będzie drugi wpis w tym miesiącu ;)&lt;br /&gt;&lt;br /&gt;Oddałem pracę i dostałem lenia. Kompletnie nic mi się nie chciało. Chyba musiałem trochę odreagować. Powoli jednak zbieram się do roboty, choć nieco straszy mnie obrona. Kochana uczelnia raczyła mnie postawić w bardzo nieprzyjemnej sytuacji. Termin egzaminu ma być za tydzień, czyli 26 - 27 X, ale na dzień dzisiejszy nikt nie wie kiedy dokładnie. Co za tym idzie nie jest znany skład komisji. Boję się, że termin wypadnie na poniedziałek, a poinformują mnie w piątek, oczywiście po południu. I jak ja niby mam się przygotować ?&lt;br /&gt;&lt;br /&gt;Od dawna zastanawiałem się nad poprawieniem loggera. To co stworzyłem na początku projektu było skuteczne, poza tym miało same wady. Rozwiązanie to jest oparte o wzorzec singletona, do tego bardzo zależało mi na łatwym formatowaniu a'la strumienie (operator &lt;&lt;) oraz na śledzeniu przebiegu wywołań funkcji. Wyszło rozwiązanie paskudne w użyciu i co znacznie gorsze, nie spełniające do końca moich oczekiwań.&lt;br /&gt;Problemem okazało się zbieranie informacji o stosie. Automatyczna zamiana adresu funkcji na jej nazwę nie jest zadaniem trywialnym. Coś takiego można znaleźć na blogu Gynvaela Coldwinda: &lt;a href=http://gynvael.coldwind.pl/?id=163&gt; w tym wpisie&lt;/a&gt;. Sam wymyśliłem nieco inne rozwiązanie, również oparte o makra. W skrócie mniej asemblera, więcej C++. Tylko czy ja mam ochotę przejrzeć 37 linii kodu i pozamieniać definicje wszystkich funkcji w makra ? Wymyśliłem więc, że trzeba ręcznie opatrzyć każdy zapis do logu informacją o tym skąd pochodzi. Sprawa jest dosyć prosta, posłużyłem się standardowym makrem __FUNCTION__. Nieco kłopotliwa jest nazwa klasy w przypadku metod. Rozwiązałem to tak:&lt;br /&gt;&lt;pre&gt;&lt;span class="pre"&gt;#define __CLASS__ "Nazwa klasy"&lt;br /&gt;#define HERE __CLASS__ &amp;lt;&amp;lt; "::" &amp;lt;&amp;lt; __FUNCTION__&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;No i działa. Brakuje jednak danych stosu, czyli informacji o stanie aplikacji gdy doszło do powstania wpisu. Fajnie by też było mieć zarejestrowane trochę danych o tym co działo się wcześniej.&lt;br /&gt;&lt;br /&gt;Zadałem sobie jednak fundamentalne pytanie, czy umieszczanie nazw funkcji i klas w kodzie ma sens ? No i wyszło mi, że nie. Wracamy do punktu wyjścia, jak zamienić adres funkcji na nazwę ? Linker z Visual Studio ma taki fajny przełącznik /MAP. W efekcie powstaje plik tekstowy chyba ze wszystkim co nam do szczęścia potrzebne, tj adres w pliku, adres w obrazie, nazwa funkcji, atrybuty, plik z którego dana funkcja pochodzi.&lt;br /&gt;&lt;br /&gt;Na koniec zabawny błąd:&lt;br /&gt;&lt;pre&gt;Logger LoggerInstance&lt;span class="operator"&gt;;&lt;/span&gt;&lt;br /&gt;std&lt;span class="operator"&gt;::&lt;/span&gt;fstream logFile&lt;span class="operator"&gt;;&lt;/span&gt;&lt;br /&gt;Logger&lt;span class="operator"&gt;::&lt;/span&gt;Logger&lt;span class="operator"&gt;()&lt;br /&gt;{&lt;/span&gt;&lt;br /&gt; logFile&lt;span class="operator"&gt;.&lt;/span&gt;open&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="string"&gt;"log.txt"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt; std&lt;span class="operator"&gt;::&lt;/span&gt;fstream&lt;span class="operator"&gt;::&lt;/span&gt;out&lt;span class="operator"&gt;);&lt;br /&gt;...&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;Otwarcie pliku kończy się wyjątkiem przy próbie odczytu spod adresu 0. Czemu? Bo w momencie wywołania tego konstruktora obiekt logFile jeszcze nie powstał ;) Trzeba zamienić kolejność.&lt;br /&gt;&lt;pre&gt;std&lt;span class="operator"&gt;::&lt;/span&gt;fstream logFile&lt;span class="operator"&gt;;&lt;/span&gt;&lt;br /&gt;Logger LoggerInstance&lt;span class="operator"&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-8818099851113344138?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/8818099851113344138/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=8818099851113344138' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8818099851113344138'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8818099851113344138'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/10/logger.html' title='Logger'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-2866152340202899148</id><published>2009-10-06T14:31:00.003+02:00</published><updated>2009-10-06T15:27:20.659+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Visual Studio 2008'/><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Precompiled headers, Visual oraz smart pointers</title><content type='html'>Po lekturze komentarzy pod &lt;a href=http://adamsmigielskidevblog.blogspot.com/2009/05/precompiled-header.html&gt;Postem Precompiled header&lt;/a&gt;. Postanowiłem wypróbować radę raffimoni. W skrócie warto. Raz, że upraszcza to kod. Dwa, że czas budowania spadł z 107250 ms na 91016, czyli 15%.&lt;br /&gt;&lt;br /&gt;Mój silniczek ma błędy z którymi nie mogę sobie poradzić przy użyciu Eclipse'a. Przeniosłem, więc projekt do Visual Studio 2008 ze względu na ichni debugger. No i wyszło parę ciekawostek:&lt;br /&gt;* Generalnie kod się kompilował, konieczne były drobne poprawki, np wstawki asm.&lt;br /&gt;* Visual wrzuca wszystkie pliki obiektowe do jednego katalogu. Jeżeli istnieją dwa pliki o tej samej nazwie to je radośnie nadpisuje. Trzeba ręcznie zmienić nazwę pliku obiektowego dla danego cpp.&lt;br /&gt;* Pomieszanie new i delete w wersji z i bez [] powoduje podniesienie wyjątku systemowego.&lt;br /&gt;&lt;br /&gt;Ten ostatni punkt jest dość ciekawy. Całkiem możliwe, że to właśnie to jest winne temu, że Eclipse wychwytywał błędy. Tak czy siak postanowiłem się zabezpieczyć i wprowadzić inteligentne wskaźniki, które zajmą się prawidłowym zwolnieniem pamięci. Powstały, więc dwa szablony:&lt;br /&gt;* SmartPtr&lt;T&gt;,&lt;br /&gt;* SmartArray&lt;T&gt;&lt;br /&gt;Kodu nie podam, bo nic odkrywczego nie opracowałem. Jeżeli ktoś poszukuje jakiegoś wzorca to polecam boost i "C++ Szablony: vademecum profesjonalisty" David Vandevoorde i Nicolai M. Josuttis.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-2866152340202899148?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/2866152340202899148/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=2866152340202899148' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2866152340202899148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2866152340202899148'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/10/precompiled-headers-visual-oraz-smart.html' title='Precompiled headers, Visual oraz smart pointers'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-2858870108872104559</id><published>2009-09-19T08:16:00.004+02:00</published><updated>2009-09-19T09:39:28.798+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Latex'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Praca magisterska - Mission accomplished !</title><content type='html'>Skończyłem pisać pracę magisterską. Leży sobie teraz obok mnie kilka wydrukowanych egzemplarzy i czeka na oddanie do katedry. Tytuł "System interaktywnej wizualizacji dynamicznych scen 3D dla potrzeb symulacji komputerowej" w skrócie "silnik graficzny". Praca ma 104 strony w wersji dla uczelni, 115 ma mój egzemplarz. Samo przygotowanie treści i obrazków zajęło mi około 2-3 tygodni, ale do tego jeszcze doszły poprawki zasugerowane przez promotora i narzeczoną (filolog, uwierzcie czepia się strasznie), co zaowocowało przedłużeniem prac do miesiąca. Praca pisana w &lt;span style="font-style:italic;"&gt;LaTeXu&lt;/span&gt;, jako edytora użyłem &lt;span style="font-style:italic;"&gt;eclipse galileo&lt;/span&gt; z pluginem &lt;span style="font-style:italic;"&gt;texclipse&lt;/span&gt;, "kompilator" to &lt;span style="font-style:italic;"&gt;miktex&lt;/span&gt; bodajże w wersji 2.7.&lt;br /&gt;&lt;br /&gt;Projekt silniczka wyszedł tak sobie. Nie jestem zadowolony. Nie udało mi się zrobić wszystkiego co chciałem. Przede wszystkim nawaliło ładowanie plików md5, w efekcie nawet nie wiem, czy rozwiązanie animacji szkieletowej jest ok. Nie zrobiłem normal mappingu. Nie ma przeźroczystości. Za to udało mi się zrobić:&lt;br /&gt;* deferred shading,&lt;br /&gt;* shadow mapping,&lt;br /&gt;* instancing,&lt;br /&gt;* vertex blending,&lt;br /&gt;* height mapping,&lt;br /&gt;* dość mocno odseparowałem klienta od API, więc teoretycznie silnik jest wieloplatformowy :),&lt;br /&gt;* GUI.&lt;br /&gt;&lt;br /&gt;To może wydawać się nie wiele, ale ogrom pracy poszedł w uzyskanie przenośności. Poza tym, to był mój pierwszy prawdziwy projekt z grafiki 3d. Startując miałem średnie pojęcie o tym jak funkcjonuje DirectX. W sumie 31 tysięcy niepustych linii kodu (ogólnie jest 37 tysięcy), 17 shaderów, 1200 godzin pracy. Generalnie uznaję ten projekt za sukces, ale światła dziennego to on nie ujrzy ;)&lt;br /&gt;&lt;br /&gt;Wnioski odnośnie &lt;span style="font-style:italic;"&gt;LaTeXa&lt;/span&gt; dla potomnych:&lt;br /&gt;* &lt;span style="font-style:italic;"&gt;Eclipse Galileo&lt;/span&gt; ma funkcję sprawdzania poprawności kodu. Trzeba tylko dostarczyć mu słownik. Instrukcja choćby tutaj: http://www.jakubiak.eu/2008/06/eclipse-i-sownik-jzyka-polskiego.html. UWAGA! Sam nie korzystałem z takiego rozwiązania. Plugin &lt;span style="font-style:italic;"&gt;Texclipse&lt;/span&gt; potrafi wykorzystać słownik &lt;span style="font-style:italic;"&gt;Aspell&lt;/span&gt; do sprawdzania poprawności pisowni. Niestety pomimo chęci nie udało mi się znaleźć wspólnego kodowania plików dla &lt;span style="font-style:italic;"&gt;eclipse&lt;/span&gt;'a i &lt;span style="font-style:italic;"&gt;aspella&lt;/span&gt;. Pewnie jakoś się da, ale ... &lt;span style="font-style:italic;"&gt;OpenOffcie&lt;/span&gt; całkiem nieźle poradził sobie z korekcją wszystkich literówek i to bezpośrednio na plikach tex (choć najpierw zawsze robiłem backup) ;)&lt;br /&gt;&lt;br /&gt;* Gdyby ktoś potrzebował zamienić &lt;span style="font-style:italic;"&gt;LaTeXa&lt;/span&gt; w coś innego niż &lt;span style="font-weight:bold;"&gt;PDF&lt;/span&gt;, to można skorzystać z polecenia oolatex, które &lt;span style="font-weight:bold;"&gt;stworzy&lt;/span&gt; plik &lt;span style="font-weight:bold;"&gt;ODT&lt;/span&gt;. Program znajduje się w paczce miktexa. Jeżeli nie działa to trzeba go poprawnie skonfigurować, np zainstalować &lt;span style="font-style:italic;"&gt;javę&lt;/span&gt; i podać poprawne ścieżki w pliku konfiguracyjnym &lt;span style="font-style:italic;"&gt;tex4ht&lt;/span&gt;. Ponadto będzie potrzebna paczka &lt;span style="font-style:italic;"&gt;miktex-zip&lt;/span&gt;. Mi się udało, jak pokombinujecie to też wam się uda. Ale od razu powiem, że nie ma się co napalać. Formatowanie wychodzi zmasakrowane. Nie działają linki. Nie ma obrazków, choć na to pewnie da się coś poradzić. Za to jest poprawna treść, błędy pojawiły się tylko dla polskich znaczków w tytułach rozdziałów.&lt;br /&gt;&lt;br /&gt;* Do zapisu matmy najlepiej korzystać z paczki &lt;span style="font-style:italic;"&gt;amsmath&lt;/span&gt;. Potrafi sporo. W zasadzie udało mi się zapisać wszystko co chciałem z numerowaniem takim jak chciałem. Środowiska: equation, gather i cases. Polecenia \nonumber \numberwithin{equation}{section}.&lt;br /&gt;&lt;br /&gt;* Przy 100 stronach już widać, że otwarcie dokumentu w &lt;span style="font-style:italic;"&gt;OpenOffice&lt;/span&gt; trochę trwa. Możliwość rozbicia pracy na kilka plików w &lt;span style="font-style:italic;"&gt;LaTeXu&lt;/span&gt; jest cudowna. Polecenie \input{}.&lt;br /&gt;&lt;br /&gt;* Do listignów użyłem paczki &lt;span style="font-style:italic;"&gt;listings&lt;/span&gt;. W zasadzie potrafi wszystko, ale nie udało mi się poradzić z jedną sprawą. Górna linia ramki wypadała dokładnie przez środek opisu. Gdyby ktoś chciał zmienić tytuł rozdziału z "Listings" na coś bardziej swojskiego dla polecenia \lstlistoflistings, to ja to zrobiłem tak:&lt;br /&gt;\newpage&lt;br /&gt;\section*{Spis listingów}&lt;br /&gt;\addcontentsline{toc}{section}{Spis listingów}&lt;br /&gt;\markboth{SPIS LISTINGÓW}{}&lt;br /&gt;\newcommand\stdsection{}&lt;br /&gt;\newcommand\stdaddtocontents{}&lt;br /&gt;\let\stdsection\section&lt;br /&gt;\let\stdaddtocontents\addtocontents&lt;br /&gt;\def\section*#1{}&lt;br /&gt;\renewcommand\addtocontents[3]{}&lt;br /&gt;\lstlistoflistings&lt;br /&gt;\let\section\stdsection&lt;br /&gt;\let\addtocontents\stdaddtocontents&lt;br /&gt;&lt;br /&gt;* Jest paczuszka &lt;span style="font-style:italic;"&gt;nomencl&lt;/span&gt; do robienia nomenklatury. Niestety u mnie polecenie mające na celu wypisanie listy symboli nie zadziałało. Ostatecznie posłużyłem się wygenerowanym plikiem &lt;span style="font-weight:bold;"&gt;NLO&lt;/span&gt; z zestawieniem wszystkich symboli. Do wypisania użyłem środowiska tabular z zafiksowanymi szerokościami kolumn. \begin{tabular}{p{3cm}p{12.5cm}}.&lt;br /&gt;&lt;br /&gt;* &lt;span style="font-style:italic;"&gt;LaTeX&lt;/span&gt; nie usuwa sierotek, to jest wyrazów jedno literowych na końcu linii. Może dlatego, że w angielskim nie ma takich wyrazów ? Tak czy siak pomaga polecenie \nolinebreak zaraz po sierotce.&lt;br /&gt;&lt;br /&gt;* Odradzam modyfikowanie przerw pomiędzy paragrafami \parskip. Mam wrażenie, że wartość ta jest używana nie tylko przy okazji nowego akapitu. Znacznie lepszy efekt wizualny da użycie wcięć \parindent. Nie warto też walczyć z brakiem wcięcia w pierwszym akapicie. W gruncie rzeczy tak jest lepiej.&lt;br /&gt;&lt;br /&gt;* Nic tak nie poprawia czytelności jak wyraźna przerwa między A i B. Żeby zrobić pustą stronę bądź linię należy posłużyć się takim zapisem:&lt;br /&gt;\newpage/line&lt;br /&gt;\mbox{}&lt;br /&gt;\newpage/line&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-2858870108872104559?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/2858870108872104559/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=2858870108872104559' title='Komentarze (1)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2858870108872104559'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2858870108872104559'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/09/praca-magisterska-mission-accomplished.html' title='Praca magisterska - Mission accomplished !'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-7829513919740779233</id><published>2009-08-28T15:53:00.004+02:00</published><updated>2009-08-28T16:43:47.091+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Praca magisterska, md5 i nokia 3120 clasic</title><content type='html'>Dawno nic nie napisałem, ale prawda jest taka, że nie było o czym. Założenie było takie, że piszę tutaj o tym co uda mi się stworzyć w świecie programowania, a od ostatniego posta nie powstało nic. Aż do dziś ;)&lt;br /&gt;&lt;br /&gt;Przez ostatnie niemal 2 tygodnie pisałem swoją pracę magisterską. Wciąż jestem w polu, ale w sumie wygląda to coraz lepiej. Już dawno postanowiłem, że napiszę ją w latex'u i jak na razie nie żałuje decyzji. Pisze się naprawdę sprawnie. Najfajniejsze jest to, że nie ma problemów z aktualizacją obrazków i bardzo łatwo jest rozbić cały dokument na osobne piliki. Boli tylko brak sprawdzania pisowni. Jakoś nie udało mi się tego skonfigurować. Teoretycznie Eclipse z dodatkiem Texclipse potrafi skorzystać ze słowników aspell. Niestety sprawa robiła się o kodowanie dokumentu. Nie jest to na szczęście zbyt bolesne, bo wciąż można skorzystać z innego softu, choćby open office'a.&lt;br /&gt;&lt;br /&gt;Zanim zacząłem pisać pracę walczyłem jeszcze trochę z tym ładowaniem plików md5. Lipa. Coś mi tu umyka. Nie wiem, czy to błąd w kodzie, czy nie zrozumienie jakiegoś aspektu, np jak posługiwać się kwaternionami. W każdym bądź razie lipa. Udało mi się doprowadzić do tego, że szkielet mojego modelu animował się poprawnie. Jednak gotowiec ma coś nie tak z orientacją. Pozycje są poprawne. Brakło mi czasu, żeby problem rozwiązać.&lt;br /&gt;&lt;br /&gt;Co do tego wszystkiego ma Nokia 3120 clasic ? Ano jest pretekstem do spłodzenia tego posta. Otóż mój szanowny rodziciel, wszedł w posiadanie tego modelu, drogą podpisania umowy z jednym z operatorów sieci gsm w Polsce. Telefon potęgą nie jest, czego się zresztą spodziewać po gratisie. Nie spodziewałem się jednak, że aż tak.&lt;br /&gt;Wydawałoby się prosta sprawa skopiować kontakty z jednego telefonu na drugi. Poprzednik to sony erricson. Oba telefony posiadają moduł bluetooth. No to kopiujemy całą listę przez BT i po bólu ;)&lt;br /&gt;Otóż nie. SE potrafi wysłać wszystkie kontakty na raz w formie pliku vcf. Nokia natomiast takiego pliku zrozumieć nie potrafi. Grrr.&lt;br /&gt;Szybko okazało się, że problemem jest to iż jest to lista. Pojedynczą wizytówkę można przesłać. Czyli co, na SE strzałka w dół &gt; opcje &gt; wiecej &gt; zaawansowane &gt; wyslij &gt; bt, Nokia &gt; akceptuj &gt; zapisz. I tak 380 razy. Masakra.&lt;br /&gt;Po długim kombinowaniu wyszło, że takie wizytówki można wysyłać także z komputera. Byleby nie była to lista, a pojedyncze wpisy. Na szybko napisałem kawałek kodu do konwersji listy na osobne pliki.&lt;br /&gt;&lt;br /&gt;Nie zagłębiałem się przy tej okazji nadmiernie w strukturę pliku .vcf. Także raczej nie należy się na to powoływać. Programik zadziałał zgodnie z oczekiwaniem, a cała operacja zakończyła się pełnym sukcesem, dając tym samym Nokii pierwszą szansę na dłuższe testy u mnie w domu. Wcześniej była tylko jedna i wytrzymała jeden dzień, zanim mnie szlag trafił ;)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="comment"&gt;/*&lt;br /&gt; * main.cpp&lt;br /&gt; *&lt;br /&gt; *  Created on: 2009-08-28&lt;br /&gt; *      Author: Adam Śmigielski&lt;br /&gt; *      E-mail: adam.smigielski@gmail.com&lt;br /&gt; *   Copyright: Adam Śmigielski&lt;br /&gt; */&lt;/span&gt;&lt;span class="pre"&gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;fstream&amp;gt;&lt;br /&gt;#include &amp;lt;iostream&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;using namespace&lt;/span&gt; std&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt;&lt;br /&gt;int&lt;/span&gt;&lt;span class="keyword"&gt; main&lt;/span&gt;&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="type"&gt;int&lt;/span&gt; argc&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="type"&gt; char&lt;/span&gt;&lt;span class="operator"&gt; *&lt;/span&gt; argv&lt;span class="operator"&gt;[])&lt;br /&gt;{&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt; const&lt;/span&gt;&lt;span class="type"&gt; char&lt;/span&gt;&lt;span class="operator"&gt; *&lt;/span&gt; filename&lt;span class="operator"&gt; =&lt;/span&gt;&lt;span class="int"&gt; 0&lt;/span&gt;&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt; if&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="int"&gt;2&lt;/span&gt;&lt;span class="operator"&gt; &amp;gt;=&lt;/span&gt; argc&lt;span class="operator"&gt;)&lt;br /&gt; {&lt;/span&gt;&lt;br /&gt;  filename&lt;span class="operator"&gt; =&lt;/span&gt; argv&lt;span class="operator"&gt;[&lt;/span&gt;&lt;span class="int"&gt;1&lt;/span&gt;&lt;span class="operator"&gt;];&lt;/span&gt;&lt;br /&gt;  cout&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="string"&gt; "Plik: "&lt;/span&gt;&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; filename&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;br /&gt; }&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt; else&lt;/span&gt;&lt;span class="operator"&gt;&lt;br /&gt; {&lt;/span&gt;&lt;br /&gt;  cout&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="string"&gt; "Podaj nazwe pliku"&lt;/span&gt;&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;  return&lt;/span&gt;&lt;span class="int"&gt; 1&lt;/span&gt;&lt;span class="operator"&gt;;&lt;br /&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; fstream in&lt;span class="operator"&gt;;&lt;/span&gt;&lt;br /&gt; fstream out&lt;span class="operator"&gt;;&lt;/span&gt;&lt;br /&gt; in&lt;span class="operator"&gt;.&lt;/span&gt;open&lt;span class="operator"&gt;(&lt;/span&gt;filename&lt;span class="operator"&gt;,&lt;/span&gt; fstream&lt;span class="operator"&gt;::&lt;/span&gt;in&lt;span class="operator"&gt;);&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt; if&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="bool"&gt;false&lt;/span&gt;&lt;span class="operator"&gt; ==&lt;/span&gt; in&lt;span class="operator"&gt;.&lt;/span&gt;is_open&lt;span class="operator"&gt;())&lt;br /&gt; {&lt;/span&gt;&lt;br /&gt;  cout&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="string"&gt; "Plik nie istnieje"&lt;/span&gt;&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;  return&lt;/span&gt;&lt;span class="int"&gt; 2&lt;/span&gt;&lt;span class="operator"&gt;;&lt;br /&gt; }&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt; else&lt;/span&gt;&lt;span class="operator"&gt;&lt;br /&gt; {&lt;/span&gt;&lt;br /&gt;  cout&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="string"&gt; "Otwarto plik"&lt;/span&gt;&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;br /&gt; }&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt;&lt;br /&gt; char&lt;/span&gt; buffer&lt;span class="operator"&gt;[&lt;/span&gt;&lt;span class="int"&gt;256&lt;/span&gt;&lt;span class="operator"&gt;];&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt; unsigned int&lt;/span&gt; count&lt;span class="operator"&gt; =&lt;/span&gt;&lt;span class="int"&gt; 0&lt;/span&gt;&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt; char&lt;/span&gt; name&lt;span class="operator"&gt;[] =&lt;/span&gt;&lt;span class="string"&gt; "result\\xxxx.vcf"&lt;/span&gt;&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt; char&lt;/span&gt; rev&lt;span class="operator"&gt;[] =&lt;/span&gt;&lt;span class="string"&gt; "REV:20090828T071515Z"&lt;/span&gt;&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt; int&lt;/span&gt; revsize&lt;span class="operator"&gt; =&lt;/span&gt; strlen&lt;span class="operator"&gt;(&lt;/span&gt;rev&lt;span class="operator"&gt;);&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;&lt;br /&gt; while&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="bool"&gt;true&lt;/span&gt;&lt;span class="operator"&gt;)&lt;br /&gt; {&lt;/span&gt;&lt;br /&gt;  in&lt;span class="operator"&gt;.&lt;/span&gt;getline&lt;span class="operator"&gt;(&lt;/span&gt;buffer&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="int"&gt; 256&lt;/span&gt;&lt;span class="operator"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  cout&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; buffer&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;&lt;br /&gt;  if&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="int"&gt;0&lt;/span&gt;&lt;span class="operator"&gt; ==&lt;/span&gt; strcmp&lt;span class="operator"&gt;(&lt;/span&gt;buffer&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="string"&gt; "BEGIN:VCARD"&lt;/span&gt;&lt;span class="operator"&gt;))&lt;br /&gt;  {&lt;/span&gt;&lt;br /&gt;   sprintf&lt;span class="operator"&gt;(&lt;/span&gt;name&lt;span class="operator"&gt; +&lt;/span&gt;&lt;span class="int"&gt; 7&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="string"&gt; "%04d.vcf"&lt;/span&gt;&lt;span class="operator"&gt;,&lt;/span&gt; count&lt;span class="operator"&gt;++);&lt;/span&gt;&lt;br /&gt;   cout&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="string"&gt; "Nazwa pliku: "&lt;/span&gt;&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; name&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   out&lt;span class="operator"&gt;.&lt;/span&gt;open&lt;span class="operator"&gt;(&lt;/span&gt;name&lt;span class="operator"&gt;,&lt;/span&gt; fstream&lt;span class="operator"&gt;::&lt;/span&gt;out&lt;span class="operator"&gt;);&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;   if&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="bool"&gt;false&lt;/span&gt;&lt;span class="operator"&gt; ==&lt;/span&gt; out&lt;span class="operator"&gt;.&lt;/span&gt;is_open&lt;span class="operator"&gt;())&lt;br /&gt;   {&lt;/span&gt;&lt;br /&gt;    cout&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="string"&gt; "Nie udalo sie otworzyc pliku"&lt;/span&gt;&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;    return&lt;/span&gt;&lt;span class="int"&gt; 2&lt;/span&gt;&lt;span class="operator"&gt;;&lt;br /&gt;   }&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;   else&lt;/span&gt;&lt;span class="operator"&gt;&lt;br /&gt;   {&lt;/span&gt;&lt;br /&gt;    cout&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="string"&gt; "Otwarto plik"&lt;/span&gt;&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;br /&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   out&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; buffer&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;   while&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="bool"&gt;true&lt;/span&gt;&lt;span class="operator"&gt;)&lt;br /&gt;   {&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    in&lt;span class="operator"&gt;.&lt;/span&gt;getline&lt;span class="operator"&gt;(&lt;/span&gt;buffer&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="int"&gt; 256&lt;/span&gt;&lt;span class="operator"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    cout&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; buffer&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;&lt;br /&gt;    if&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="int"&gt;0&lt;/span&gt;&lt;span class="operator"&gt; !=&lt;/span&gt; strstr&lt;span class="operator"&gt;(&lt;/span&gt;buffer&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="string"&gt; "X-IRMC-LUID:"&lt;/span&gt;&lt;span class="operator"&gt;))&lt;br /&gt;    {&lt;/span&gt;&lt;br /&gt;     out&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; rev&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;br /&gt;    }&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;    else if&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="int"&gt;0&lt;/span&gt;&lt;span class="operator"&gt; ==&lt;/span&gt; strcmp&lt;span class="operator"&gt;(&lt;/span&gt;buffer&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="string"&gt; "END:VCARD"&lt;/span&gt;&lt;span class="operator"&gt;))&lt;br /&gt;    {&lt;/span&gt;&lt;br /&gt;     out&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; buffer&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;     break&lt;/span&gt;&lt;span class="operator"&gt;;&lt;br /&gt;    }&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;    else if&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="int"&gt;0&lt;/span&gt;&lt;span class="operator"&gt; !=&lt;/span&gt; strstr&lt;span class="operator"&gt;(&lt;/span&gt;buffer&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="string"&gt; "TEL:"&lt;/span&gt;&lt;span class="operator"&gt;))&lt;br /&gt;    {&lt;/span&gt;&lt;br /&gt;     out&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="string"&gt; "TEL;CELL:"&lt;/span&gt;&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; buffer&lt;span class="operator"&gt; +&lt;/span&gt;&lt;span class="int"&gt; 4&lt;/span&gt;&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;br /&gt;    }&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;    else&lt;/span&gt;&lt;span class="operator"&gt;&lt;br /&gt;    {&lt;/span&gt;&lt;br /&gt;     out&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; buffer&lt;span class="operator"&gt; &amp;lt;&amp;lt;&lt;/span&gt; endl&lt;span class="operator"&gt;;&lt;br /&gt;    }&lt;br /&gt;   }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;   out&lt;span class="operator"&gt;.&lt;/span&gt;close&lt;span class="operator"&gt;();&lt;br /&gt;  }&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;  else if&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="int"&gt;0&lt;/span&gt;&lt;span class="operator"&gt; ==&lt;/span&gt; strcmp&lt;span class="operator"&gt;(&lt;/span&gt;buffer&lt;span class="operator"&gt;,&lt;/span&gt;&lt;span class="string"&gt; ""&lt;/span&gt;&lt;span class="operator"&gt;))&lt;br /&gt;  {&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;   break&lt;/span&gt;&lt;span class="operator"&gt;;&lt;br /&gt;  }&lt;br /&gt; }&lt;/span&gt;&lt;br /&gt;&lt;br /&gt; in&lt;span class="operator"&gt;.&lt;/span&gt;close&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;&lt;br /&gt; return&lt;/span&gt;&lt;span class="int"&gt; 0&lt;/span&gt;&lt;span class="operator"&gt;;&lt;br /&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;EDIT&lt;br /&gt;Właśnie odkryłem, że mój sprytny sposób na zamieszczanie kodu wyświetla bool'e na czarno. Ehh, już zmienione. Teraz będą zielono niebieskawe :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-7829513919740779233?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/7829513919740779233/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=7829513919740779233' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/7829513919740779233'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/7829513919740779233'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/08/praca-magisterska-md5-i-nokia-3120.html' title='Praca magisterska, md5 i nokia 3120 clasic'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-5161245309814722011</id><published>2009-08-06T21:49:00.004+02:00</published><updated>2009-08-06T22:27:49.325+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Animacja szkieletowa</title><content type='html'>No temat masakra. Od poprzedniego postu cały czas walczę ze skiningiem. Na dobry początek zawiodły mnie szadery. Z jakiegoś, kompletnie nie zrozumiałego dla mnie, powodu pętla:&lt;pre&gt;&lt;span class="flow"&gt;for&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="type"&gt;int&lt;/span&gt; i&lt;span class="operator"&gt; =&lt;/span&gt;&lt;span class="int"&gt; 0&lt;/span&gt;&lt;span class="operator"&gt;;&lt;/span&gt; i&lt;span class="operator"&gt; &amp;lt;&lt;/span&gt;&lt;span class="int"&gt; 4&lt;/span&gt;&lt;span class="operator"&gt;;&lt;/span&gt; i&lt;span class="operator"&gt;++)&lt;/span&gt;&lt;/pre&gt;wykonywała się tylko raz. Później, głównie dzięki przykładowi, zawartemu w Dx SDK, SkinMesh, udało mi się przekonać kompilator, że ta pętla to ma jednak 4 przebiegi. Co było przyczyną problemu wciąż nie wiem.&lt;br /&gt;Następnie odkryłem, że kod (tym razem c++)&lt;pre&gt;&lt;span class="flow"&gt;if&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="int"&gt;0&lt;/span&gt;&lt;span class="operator"&gt; !=&lt;/span&gt; flag&lt;span class="operator"&gt; &amp;amp;&lt;/span&gt;&lt;span class="int"&gt; 1&lt;/span&gt;&lt;span class="operator"&gt;)&lt;br /&gt;{&lt;br /&gt;}&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;if&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="int"&gt;0&lt;/span&gt;&lt;span class="operator"&gt; !=&lt;/span&gt; flag&lt;span class="operator"&gt; &amp;amp;&lt;/span&gt;&lt;span class="int"&gt; 2&lt;/span&gt;&lt;span class="operator"&gt;)&lt;br /&gt;{&lt;br /&gt;}&lt;br /&gt;...&lt;/span&gt;&lt;span class="flow"&gt;&lt;br /&gt;if&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;&lt;span class="int"&gt;0&lt;/span&gt;&lt;span class="operator"&gt; !=&lt;/span&gt; flag&lt;span class="operator"&gt; &amp;amp;&lt;/span&gt;&lt;span class="int"&gt; 32&lt;/span&gt;&lt;span class="operator"&gt;)&lt;br /&gt;{&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;kompiluje się tylko do jednego, pierwszego, if'a. Cała reszta jest pomijana. Dzieje się tak przy -o0 -g3, a także dla domyślnych ustawień (czyt. bez flagi). Innych ustawień nie sprawdziłem. Nie mam pojęcia o co gcc chodziło. Czyżby bug ;)&lt;br /&gt;Wyszło jeszcze kilka błędów. Wczoraj wieczorem udało mi się wyświetlić model w bind pose, ale ... . Ale wynik był zniekształcony. Geometria z całą pewnością jest poprawna, bo po ustawieniu macierzy jednostkowej wygląda jak należy. Czyli SUKCES, udało mi się w końcu zmusić wszystko do działania, a błędy muszą wynikać z nieprawidłowych macierzy.&lt;br /&gt;&lt;br /&gt;Od początku idea aby wysyłać do karty "globalne" macierze dla każdej kości wydał mi się dziwny. Przecież to się musi rozjechać. Pomyślałem jednak, że może te wagi odpowiednio modyfikują transformację. Dzisiaj rano postanowiłem to przeanalizować matematycznie. No i oczywiście okazało się, że jest źle.&lt;br /&gt;&lt;br /&gt;Weźmy taki przykład:&lt;br /&gt;Punkt p [1, 1, 1], zaczepiony do dwóch kości, do obu po równo, czyli wagi 0,5&lt;br /&gt;Kość A [0, 0, 0] zorientowana neutralnie (macierz jednostkowa)&lt;br /&gt;Kość B [0, 0, 2] zorientowana neutralnie&lt;br /&gt;&lt;br /&gt;p' = 0,5 * A * p + 0,5 * B * p&lt;br /&gt;p' = [0,5 0,5 0,5] + [0,5 0,5 (0,5 * (1 + 2))] = [1, 1, 1,5]&lt;br /&gt;&lt;br /&gt;A powinno wyjść [1, 1, 1]. Co z tym zrobić ? Bardzo &lt;span style="font-weight:bold;"&gt;UWAŻNIE&lt;/span&gt; przeczytać cokolwiek na ten temat. Na przykład &lt;a href=http://forum.gamedev.pl/index.php/topic,3957.0.html&gt;ten temat na warsztacie&lt;/a&gt;. Odkryjemy w ten sposób, że macierze mają być "globalne", ale muszą uwzględniać pewien myk.&lt;br /&gt;&lt;br /&gt;Na koniec screen, z bind pose:&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/owfCWwh_MKKbCIgt6wbHeg?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/Sns7lbXCtVI/AAAAAAAABdg/Qvvzs9qoEfE/s144/Skinning01.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;Z &lt;a href="http://picasaweb.google.pl/adam.smigielski/Engine?feat=embedwebsite"&gt;Engine&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Model pochodzi ze wspomnianej już strony: &lt;a href=http://www.katsbits.com/htm/models.htm&gt;link&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-5161245309814722011?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/5161245309814722011/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=5161245309814722011' title='Komentarze (2)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/5161245309814722011'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/5161245309814722011'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/08/animacja-szkieletowa.html' title='Animacja szkieletowa'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_QclPhZLbeWo/Sns7lbXCtVI/AAAAAAAABdg/Qvvzs9qoEfE/s72-c/Skinning01.jpg' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-4637401455142578789</id><published>2009-08-03T11:18:00.003+02:00</published><updated>2009-08-03T11:57:11.344+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blender'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>MD5 mesh loader</title><content type='html'>Przebrnąłem przez napisanie funkcji ładującej model z pliku md5.&lt;br /&gt;&lt;br /&gt;Na początek linki:&lt;br /&gt;&lt;a href=http://www.katsbits.com/htm/models.htm&gt;1 Eksporter do Blendera i modele&lt;/a&gt;&lt;br /&gt;&lt;a href=http://www.modwiki.net/wiki/MD5MESH_(file_format)&gt;2 Opis formatu&lt;/a&gt;&lt;br /&gt;&lt;a href=http://tfc.duke.free.fr/coding/md5-specs-en.html&gt;3 Opis jak ładować z tego formatu&lt;/a&gt;&lt;br /&gt;&lt;a href=http://forum.gamedev.pl/index.php/topic,11162.0.html&gt;4 Temat na Warsztacie&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;A teraz moje uwagi i wnioski:&lt;br /&gt;1. Dane joint'ów zapisane są względem początku układu, a nie rodzica. Aby wyznaczyć transformację względem rodzica należy skorzystać z tych równań:&lt;br /&gt;p * q = g =&gt; q = p^-1 * g&lt;br /&gt;p + v = g =&gt; v = g - p&lt;br /&gt;p - parent, czyli dane rodzica&lt;br /&gt;g - global, czyli dane zapisane w pliku&lt;br /&gt;q i v - to kwaternion i wektor&lt;br /&gt;p^-1 to oczywiście inwersja kwaternionu rodzica&lt;br /&gt;2. Kwaterniony są zapisane w formie samych osi, bez w. Ja dowiedziałem się o tym z [3]. Skorzystano tu z faktu, że długość kwaternionu musi być równa 1. 1 = w*w + x*x + y*y + z*z. Chyba łatwo wyznaczyć ile wynosi w. Pamiętać tylko trzeba, że nie należy wyciągać pierwiastka kwadratowego z liczb ujemnych.&lt;br /&gt;3. Pozycje wag są zapisane względem kości i to z uwzględnieniem orientacji. Aby wyznaczyć finalną pozycję, trzeba najpierw obrócić pozycję wagi o orientację kości. Dopiero tak obróconą translację możemy zsumować z pozycją kości. Wzór na rotację [3] punktu o kwaternion: a' = q * a * q^-1. Przy czym a i a' to kwaterniony z częścią rzeczywistą równą pozycji punktu i urojoną 0, trzeba o tym pamiętać.&lt;br /&gt;4. Format nie przechowuje informacji o normalnych. Wyznacza się je oczywiście przy użyciu mnożenia wektorowego (cross product). Trzeba tu jednak wziąć pod uwagę, że indeksy wierzchołków są w CCW. To mnie zaskoczyło, ale tak mi wyszło. Nie wiem jednak czy to przypadkiem nie jest "wina" eksportera.&lt;br /&gt;5. Plik ma 682 linijki. Czyli kupa roboty.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-4637401455142578789?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/4637401455142578789/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=4637401455142578789' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4637401455142578789'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4637401455142578789'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/08/md5-mesh-loader.html' title='MD5 mesh loader'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-8169886658257081160</id><published>2009-07-31T09:19:00.003+02:00</published><updated>2009-07-31T09:29:36.392+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Biblioteki'/><title type='text'>Optymalizcja gemetrii ciąg dalszy</title><content type='html'>Ze względu na pewne wątpliwości odnośnie licencji dla NvTriStrip, zdecydowałem się poszukać innego rozwiązania.&lt;br /&gt;&lt;br /&gt;Założyłem nawet temat na &lt;a href=http://forum.gamedev.pl/index.php?topic=12491.msg156231#msg156231&gt;Warsztacie&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Ostatecznie zdecydowałem się na &lt;a href=http://code.google.com/p/vcacne/&gt;Vertex cache optimization librar&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Efekty działania są jak najbardziej zadowalające.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-8169886658257081160?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/8169886658257081160/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=8169886658257081160' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8169886658257081160'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8169886658257081160'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/07/optymalizcja-gemetrii-ciag-dalszy.html' title='Optymalizcja gemetrii ciąg dalszy'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-3517346723357194866</id><published>2009-07-30T13:20:00.006+02:00</published><updated>2009-07-31T09:25:49.302+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Biblioteki'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Optymalizacja geometrii</title><content type='html'>Ponieważ wczytany model zmasakrował moją aplikację, postanowiłem zainteresować się tym jak go zoptymalizować.&lt;br /&gt;&lt;br /&gt;Jak na razie postanowiłem sprawić, aby stał się bardziej "cache friendly". Wyjaśnię co to znaczy, bo okazało się, że kolega programista nie zrozumiał.&lt;br /&gt;&lt;br /&gt;Otóż procesor graficzny GPU, ma wbudowaną pamięć tzw. vertex cache. Przechowuje w niej wyniki obliczeń dla ostatnich N wierzchołków. Kluczem do ponownego użycia już otrzymanych wyników jest użycie indeksowanej geometrii.&lt;br /&gt;&lt;br /&gt;Warunkiem jest tu jednak, aby już obliczone wierzchołki nie "wypadły" z cache'u. Odpowiednia organizacja bufora indeksów nie jest zadaniem trywialnym, postanowiłem więc skorzystać z gotowca: &lt;a href=http://developer.nvidia.com/object/nvtristrip_library.html&gt;biblioteka NvtriStrip&lt;/a&gt;. Do biblioteki jest przykład użycia: &lt;a href=http://developer.download.nvidia.com/SDK/9.5/Samples/DEMOS/Direct3D9/NVTriStripTest.zip&gt;NVTriStrip Test App&lt;/a&gt;.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;Co&lt;/td&gt;&lt;td&gt;przed&lt;/td&gt;&lt;td&gt;po&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Ilość narysowanych obiektów:&lt;/td&gt;&lt;td&gt;28673&lt;/td&gt;&lt;td&gt;28673&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Średni czas jednego draw call'a [ms]:&lt;/td&gt;&lt;td&gt;0.0688297&lt;/td&gt;&lt;td&gt;0.0721264&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Średni czas jednej klatki [ms]:&lt;/td&gt;&lt;td&gt;13.7571&lt;/td&gt;&lt;td&gt;11.497&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Ilość draw call'i na klatkę:&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;Średni fps:&lt;/td&gt;&lt;td&gt;68.3995&lt;/td&gt;&lt;td&gt;81.8658&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Co z tego wynika ?&lt;br /&gt;1) Relacja pomiędzy fps, a czasem renderowania klatki jest wyraźna. Czyli dobrze, bo to znaczy, że system nie spędza za dużo czasu poza samym renderingiem.&lt;br /&gt;2) Draw call, o ile wiem jest wykonywany asynchronicznie. CPU nie czeka na jego zakończenie. Pomiary nijak się mają do czasu rysowania całej klatki. To też dobrze wróży, bo oznacza, że CPU ma lepsze rzeczy do roboty niż zlecanie kolejnych zadań do narysowania. Mam tu też pewien, spory jak sądzę, zapas mocy.&lt;br /&gt;3) Zyskałem ~2.3 milisekundy. Co znaczy, że optymalizacja geometrii dała zysk rzędu 16 %. Jednak ta wartość jest zakłamana, ponieważ pixel shader do lekkich nie należy. Uruchomiłem aplikację w perfHud, ale za dużo nie udało mi się wyciągnąć sensownych informacji. Wiem tylko, że % VS z 40 spadł do 30. Niestety nie za bardzo wiem jak to dokładnie interpretować.&lt;br /&gt;4) 1 + 2 + 3 moja grafika ledwo zipie ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-3517346723357194866?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/3517346723357194866/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=3517346723357194866' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/3517346723357194866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/3517346723357194866'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/07/optymalizacja-geometrii.html' title='Optymalizacja geometrii'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-8047670519202228106</id><published>2009-07-29T16:50:00.003+02:00</published><updated>2009-07-30T14:25:51.236+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Blender'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Instancing ciąg dalszy</title><content type='html'>Tak jak sądziłem przesunięcie analizy kolejki obiektów do wyrenderowania o jeden stopień wyżej poprawiło nieco osiągnięty wynik:&lt;br /&gt;Ilość narysowanych obiektów: 28673 - 28673&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Średni czas jednego draw call'a: 0.0054 ms - 0.00342 ms&lt;/span&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Średni czas jednej klatki: 19.02 ms - 12.46 ms&lt;/span&gt;&lt;br /&gt;Ilość draw call'i na klatkę: 8 - 8&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Średni fps: 49.3 - 69.9&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;To dobrze. Chciałoby się podnieść ten etap jeszcze o jeden poziom wyżej, ale to chyba nie możliwe. Założenie jest takie, że dla każdego punktu obserwacji (kamery, światła) do kolejki trafią inne obiekty, więc ich wspólna analiza nie za bardzo wchodzi w grę.&lt;br /&gt;&lt;br /&gt;Mój początkowy zachwyt nad tymi wynikami spotkał się dziś z lodowatym prysznicem :) Skończyłem pisać ładowanie plików ASE i zamieniłem sześcian na sześcian z wyciętym środkiem. Źródło inspiracji: &lt;a href=http://www.gamedev.pl/projects.php?x=view&amp;id=818&gt;ten projekt&lt;/a&gt;. Spodobał mi się, bo ten w sumie prosty model ma tę cechę, że rzuca cień sam na siebie. Model i render wykonany w blenderze przeze mnie:&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/KaHThKMumfswcHqmxZHcxQ?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/SnBl5KlIdRI/AAAAAAAABcA/5swbDnUM_OY/s144/box.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:right"&gt;Z &lt;a href="http://picasaweb.google.pl/adam.smigielski/Engine?feat=embedwebsite"&gt;Engine&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Jak się jednak okazało, model wcale taki prosty nie jest. 97 trójkątów i 105 wierzchołków !!! Pewnie dałoby się to nieco poprawić, ale na drastyczne zmiany bym nie liczył. Tak czy siak, z 70 fps zrobiło się przerywane ~25 (trochę płynnie, trochę szarpie)&lt;br /&gt;&lt;br /&gt;Literatura:&lt;br /&gt;&lt;a href=http://wiki.beyondunreal.com/Legacy:ASE_File_Format#Mesh_Texture_Coordinate_Specification&gt;Opis formatu ASE&lt;/a&gt;&lt;br /&gt;&lt;a href=http://www.katsbits.com/&gt;Plugin do blendera&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-8047670519202228106?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/8047670519202228106/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=8047670519202228106' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8047670519202228106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8047670519202228106'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/07/instancing-ciag-dalszy.html' title='Instancing ciąg dalszy'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_QclPhZLbeWo/SnBl5KlIdRI/AAAAAAAABcA/5swbDnUM_OY/s72-c/box.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-878715598203269787</id><published>2009-07-22T18:31:00.005+02:00</published><updated>2009-07-30T14:25:20.397+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Instancing</title><content type='html'>Dziś udało mi się zakończyć kod odpowiedzialny za stosowanie instancing'u.&lt;br /&gt;Scena złożona z 4096 klocków, oświetlona światłem punktowym z wyliczaną dynamicznie mapą cienia (cube).&lt;br /&gt;&lt;br /&gt;Klasyczne podejście:&lt;br /&gt;Ilość narysowanych obiektów: 28673&lt;br /&gt;Średni czas jednego draw call'a: 0.0026 ms&lt;br /&gt;Średni czas jednej klatki: 84.91 ms&lt;br /&gt;Ilość draw call'i na klatkę: 28673&lt;br /&gt;Średni fps: 11.33&lt;br /&gt;&lt;br /&gt;Instancing:&lt;br /&gt;Ilość narysowanych obiektów: 28673&lt;br /&gt;Średni czas jednego draw call'a: 0.0054 ms&lt;br /&gt;Średni czas jednej klatki: 19.02 ms&lt;br /&gt;Ilość draw call'i na klatkę: 8 !!!&lt;br /&gt;Średni fps: 49.3&lt;br /&gt;&lt;br /&gt;No i tu pojawia się pytanie. 8 razy 0.005 to przecież 0.04 milisekundy, czemu więc klatka trwa 20 milisekund ? To jest bagatela 500 razy dłuższy czas ! Mam taką teorię: bufory z macierzami do transformacji świata są nie optymalnie tworzone i wysyłane do karty.&lt;br /&gt;&lt;br /&gt;Czemu tak sądzę ?&lt;br /&gt;1. Aktualizuje shadow mapę&lt;br /&gt;1a. Wyznaczenie macierzy PV&lt;br /&gt;1b. Analiza danych pod kątem batch'y&lt;br /&gt;1c. Przygotowanie bufora z macierzami (macierze są już wyliczone, trzeba tylko je skopiować do bufora)&lt;br /&gt;1d. Ustawienie wszystkiego związanego z shaderami&lt;br /&gt;1e. Draw call&lt;br /&gt;1f. Jeśli został jeszcze jakiś kierunek w cube mapie idź do 1a (czyli 6 razy)&lt;br /&gt;2. Aktualizacja kamery&lt;br /&gt;2a. To samo co dla światła, tylko, że mamy jeden kierunek i 4 mrt.&lt;br /&gt;2b. Rysowanie świateł&lt;br /&gt;&lt;br /&gt;Łącznie 7 razy analizuję i kopiuje te same dane do karty graficznej. Konieczne są jednak tylko 2 razy.&lt;br /&gt;&lt;br /&gt;Pożyjemy zobaczymy, muszę to sprawdzić, ale upał jest tak nieznośny, że wszystkiego się odechciewa.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-878715598203269787?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/878715598203269787/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=878715598203269787' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/878715598203269787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/878715598203269787'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/07/instancing.html' title='Instancing'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-8626695959062490644</id><published>2009-07-16T12:42:00.004+02:00</published><updated>2009-07-16T13:14:16.762+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Warsztat'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Depresja</title><content type='html'>Dawno nic nie napisałem tutaj na blogu, także witam wszystkich po przerwie.&lt;br /&gt;&lt;br /&gt;Co się działo przez ostatnie półtora miesiąca ? Mało. Mój projekt znajduje się w stanie "depresji", czyli nastąpiło ogólne zniechęcenie do jego kontynuacji. Poczucie niemocy jest wszechogarniające. Jedyne co mnie jako tako trzyma to fakt, że mi się śpieszy z jego ukończeniem (obrona mgr inż. , poszukiwanie pracy, ślub - wszystko to do Listopada)&lt;br /&gt;&lt;br /&gt;Oto co robiłem przez ten czas:&lt;br /&gt;&lt;br /&gt;Podstawy GUI napisane. Przyjąłem model a'la Java, czyli słuchacze - ang Listener, który otrzymuje wszystkie informacje o zmianach statusu powiązanego elementu. elementy mają swoje ID, dzięki temu jeden słuchacz może obsłużyć więcej niż jeden element danego typu. Jest i działa, ale dalsze prace nad tym modułem zostały zawieszone na bliżej nie określony czas.&lt;br /&gt;&lt;br /&gt;Sporo zmian związanych z modelem danych. Zmieniłem dziedziczenie na kompozycję w kilku istotnych miejscach. Powstała klasa zasobów bez nazwy. Wprowadziłem materiały, zastąpiły one pomyłkę pod tytułem efekty pixel i vertex. W planach są jeszcze efekty post process. Zmieniłem tez nieco koncepcję samego renderingu. Wszystko to razem wymusiło niemal całkowite przepisanie renderera. Przy okazji wprowadziłem nieco rozsądniejszy mechanizm rysowania: "Batch! Batch! Batch!" ;)&lt;br /&gt;&lt;br /&gt;Animacja szkieletowa i instancing. Aktualnie pracuje nad tym jak pożenić ze sobą te dwie technologie. Podstawy są już niemal na ukończeniu, potem poprawki do renderera, wykończenie loaderów dla plików md5 i ase.&lt;br /&gt;&lt;br /&gt;A co robiłem dzisiaj ? Heh, znowu skracałem czas kompilacji, źródło inspiracji: &lt;a href="http://forum.gamedev.pl/index.php/topic,12146.0.html"&gt;Czasy kompilacji gier&lt;/a&gt; Zaoszczędziłem 12 sekund.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-8626695959062490644?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/8626695959062490644/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=8626695959062490644' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8626695959062490644'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8626695959062490644'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/07/depresja.html' title='Depresja'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-821627327887201037</id><published>2009-05-26T17:22:00.002+02:00</published><updated>2009-05-26T17:28:31.341+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Precompiled header</title><content type='html'>Budowanie mojego projektu przekroczyło 150.000 ms. Postanowiłem, więc skorzystać z tej techniki, aby nieco skrócić czas oczekiwania.&lt;br /&gt;Zysk jest całkiem spory, różnica 36 sekund, czyli około 20 %.&lt;br /&gt;&lt;br /&gt;A teraz jak uzyskać pre kompilowane nagłówki pod Eclipsem ?&lt;br /&gt;Eclispe z CDT nie posiada narzędzi do obsługi tej techniki, więc zapomnijcie o magicznym przełączniku. Wszystko trzeba zrobić samemu.&lt;br /&gt;Na szczęście GCC automatycznie wykorzystuje pch, o ile one istnieją. Sami budujemy nagłówek i umieszczamy pch w odpowiednim miejscu, a kompilator go znajdzie i wykorzysta.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Jak zrobić nagłówek?&lt;/span&gt;&lt;br /&gt;Tworzymy zwykły plik .h i włączamy w nim wszystkie potrzebne pliki nagłówkowe.&lt;br /&gt;Przykład:&lt;br /&gt;&lt;pre&gt;&lt;span class="pre"&gt;#ifndef STD_H_&lt;br /&gt;#define STD_H_&lt;br /&gt;&lt;br /&gt;#include &amp;lt;string&amp;gt;&lt;br /&gt;#include &amp;lt;fstream&amp;gt;&lt;br /&gt;#include &amp;lt;sstream&amp;gt;&lt;br /&gt;#include &amp;lt;map&amp;gt;&lt;br /&gt;#include &amp;lt;deque&amp;gt;&lt;br /&gt;#include &amp;lt;vector&amp;gt;&lt;br /&gt;&lt;br /&gt;#endif /* STD_H_ */&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Jak zbudować nagłówek ?&lt;/span&gt;&lt;br /&gt;Do zbudowania nagłówka wywołujemy z linii komend "g++ -opcje -xc++-header -otest.h.gch test.h". W efekcie powinniśmy otrzymać plik test.h.gch.&lt;br /&gt; - test.h to rzecz jasna nazwa pliku&lt;br /&gt; - teoretycznie flaga -x nie jest potrzebna, bo gcc zna rozszerzenie .h, ale jakoś nie za bardzo bez niej chciało działać&lt;br /&gt; - opcje powinny być takie same jak projektu korzystającego z nagłówka&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Jak z nagłówka skorzystać ?&lt;/span&gt;&lt;br /&gt; - pch zostanie wykorzystany automatycznie&lt;br /&gt; - gcc wykorzysta ten plik, który znajdzie pierwszy, przy czym najpierw sprawdza czy w danym katalogu jest pch, dopiero potem czy jest zwykły plik. Najprościej oba pliki umieścić w tym samym katalogu&lt;br /&gt; - projekt powinien mieć te same opcje co pch&lt;br /&gt; - pch może być tylko jeden na raz&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style:italic;"&gt;Co zrobić z błędem "calling fdopen: Bad file descriptor" ?&lt;/span&gt;&lt;br /&gt;Pch może zostać użyte tylko raz podczas kompilacji. Jeżeli mamy sytuację w której plik pch zostanie włączony dwa razy, zobaczymy taki właśnie błąd. Przykładowo mamy:&lt;br /&gt;foo.h włącza "std.h"&lt;br /&gt;bar.h włącza "std.h"&lt;br /&gt;foobar.cpp włącza "foo.h" i "bar.h"&lt;br /&gt;Nie wiem jak to rozwiązują inni, ja po prostu opatrzyłem dyrektywę strażnikiem:&lt;br /&gt;&lt;pre&gt;&lt;span class="comment"&gt;//Precompiled header&lt;br /&gt;&lt;/span&gt;&lt;span class="pre"&gt;#ifndef STD_H_&lt;br /&gt;#include "std.h"&lt;br /&gt;#endif&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Warto przeczytać: &lt;a href="http://gcc.gnu.org/onlinedocs/gcc/Precompiled-Headers.html"&gt;gcc/Precompiled-Headers&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-821627327887201037?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/821627327887201037/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=821627327887201037' title='Komentarze (6)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/821627327887201037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/821627327887201037'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/05/precompiled-header.html' title='Precompiled header'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-6303114906849482164</id><published>2009-04-29T12:32:00.006+02:00</published><updated>2009-04-29T12:51:59.113+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>GUI</title><content type='html'>Nie dawno uznałem, że nadszedł moment od którego scena powinna być ładowana z pliku. Co oznacza konieczność utworzenia jakiegoś formatu sceny, importera i co najgorsze edytora. Jakoś nie mam ochoty ręcznie zapisywać liczb typu float.&lt;br /&gt;&lt;br /&gt;Jak tu napisać edytor ? Poza win API i javą nie znam, żadnego narzędzia do robienia GUI. Edytor potrzebuje jakoś ładować, zapisywać i wyświetlać taką scenę. Pisanie wszystkiego dwa razy to absurd, więc java odpada. Pisanie edytora w win API też mi się nie uśmiecha. Wpadłem na idiotyczny pomysł, napiszę sobie GUI w oparciu o mój silnik. Sam się zastanawiam, po co ja to robię ?! Istnieją już gotowe biblioteki, choćby Cegui. Na razie walczę, jak uznam swą porażkę z czasem, to pomyślę nad gotowcem:&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/3f0QJU2x-Kebj-maRiJz5w?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/SfgsXapxXuI/AAAAAAAABEU/W4Dlci3PDs8/s144/GUI010.jpg" /&gt;&lt;/a&gt;&lt;/td&gt; &lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/eJX-LcgbWGM4cJhPfVP0IA?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/SfgsaNmGbpI/AAAAAAAABEc/aPjwpt_Cu2Q/s144/GUI011.jpg" /&gt;&lt;/a&gt;&lt;/td&gt; &lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/S0Szu-ZR8Ii50yCm21enNg?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_QclPhZLbeWo/SfgsdH8PmEI/AAAAAAAABEk/wcPCmP47aAI/s144/GUI012.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/Sr2JrnQDO6af_Qbzz3SW9A?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/Sfgsf_01ILI/AAAAAAAABEw/55QIuT1Ssf8/s144/GUI013.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-6303114906849482164?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/6303114906849482164/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=6303114906849482164' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6303114906849482164'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6303114906849482164'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/04/gui.html' title='GUI'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_QclPhZLbeWo/SfgsXapxXuI/AAAAAAAABEU/W4Dlci3PDs8/s72-c/GUI010.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-3159927823627397760</id><published>2009-04-19T21:00:00.003+02:00</published><updated>2009-04-19T21:24:49.498+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Cg'/><category scheme='http://www.blogger.com/atom/ns#' term='Deferred shading'/><category scheme='http://www.blogger.com/atom/ns#' term='Directx9'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Odroczone oświetlenie 2</title><content type='html'>Drugi post od kiedy nad tym pracuję.&lt;br /&gt;&lt;br /&gt;Natknąłem się na dziwny problem z CG. Przyznam, że nie wiem czy to moja wina czy biblioteki. Nagle CG przestało lubić shader nad którym pracowałem. Cały problem jest opisany &lt;a href="http://forum.gamedev.pl/index.php/topic,10692.0.html"&gt;tutaj&lt;/a&gt;. Z jednej strony sam nie mogę uwierzyć, że trafiłem na bug'a. Ta biblioteka powinna być naprawdę dobrze przetestowana. Z drugiej strony mój kod działał poprawnie przez pół roku i nagle przestał ?! Nie, nie tak to nie ma :)&lt;br /&gt;&lt;br /&gt;Czemu uważam, że mój kod jest w porządku:&lt;br /&gt;1) Poprawnie ładowane są wszystkie pozostałe shadery, w tym kilka równie "skomplikowanych" co ten felerny.&lt;br /&gt;2) Kod działał poprawnie od dawna. Nie robiłem żadnych specjalnych testów, ale przeszedł chrzest bojowy.&lt;br /&gt;3) Każde wywołanie funkcji z cg ma walidowany wynik.&lt;br /&gt;4) Zwrócony błąd według CG to: Unkown error, dla DX to Invalid data.&lt;br /&gt;&lt;br /&gt;Jak będę miał trochę wolnego czasu, to może wrócę do cg i poszukam rozwiązania. Póki co przeniosłem kod odpowiedzialny za shadery całkowicie na directx:&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/tjtKoualbDzEWV25rLKZJw?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/SetzG0MW7SI/AAAAAAAABBk/q1Em14pY_oY/s144/Light004.jpg" /&gt;&lt;/a&gt;&lt;/td&gt; &lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/iRQvvGzoPWOnC6bnscBAMA?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_QclPhZLbeWo/SetzHrN8aoI/AAAAAAAABBs/qy4Bib4xMmw/s144/Light005.jpg" /&gt;&lt;/a&gt;&lt;/td&gt; &lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/n-L-sdPAnWXOOtXpzInmZg?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/SetzIaeyVyI/AAAAAAAABB0/yRZbDhSrfbc/s144/Light006.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/n-VjGPhtbjLv9Mhqz6d9kQ?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/SetzJMlFNiI/AAAAAAAABB8/nsTaiciX4kw/s144/Light007.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/nAvAF0CkV5cR_wLJc4Xg_Q?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_QclPhZLbeWo/SetzJ74Xo3I/AAAAAAAABCE/B7OSX4XHOTQ/s144/Light008.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-3159927823627397760?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/3159927823627397760/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=3159927823627397760' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/3159927823627397760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/3159927823627397760'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/04/odroczone-oswietlenie-2.html' title='Odroczone oświetlenie 2'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_QclPhZLbeWo/SetzG0MW7SI/AAAAAAAABBk/q1Em14pY_oY/s72-c/Light004.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-2294429629985711295</id><published>2009-04-13T18:47:00.002+02:00</published><updated>2009-04-13T19:56:45.183+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Deferred shading'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Odroczone oświetlenie</title><content type='html'>Jakoś dawno nic nie napisałem. Nie było o czym i kiedy. Święta skończą się dla mnie jutro. Jak dobrze pójdzie to w środę wrócę do mojej pracy mgr inż.&lt;br /&gt;&lt;br /&gt;Ponieważ oświetlenie zaczęło działać postanowiłem je popsuć :) Konkretniej to nadszedł czas aby zamienić klasyczne podejście na cieniowanie odroczone. Przez te dwa tygodnie przemyślałem sprawę, poczytałem co nieco, odkryłem kilka problemów, generalnie poważnie zbliżyłem się do zaimplementowania tej metody.&lt;br /&gt;&lt;br /&gt;Jednym z problemów jest to jakiej geometrii użyć przy renderowaniu świateł. Pomysłów miałem kilka.&lt;br /&gt;1) Pełno ekranowy quad. Za długo się nad tym nie zastanawiałem. Uruchomienie 200 razy shadera dla każdego piksela jest pomysłem złym.&lt;br /&gt;2) Modyfikacja punktu 1, polegająca na przycięciu quad'a do rozmiarów ekranowych światła. Pytanie tylko jak to zrobić.&lt;br /&gt;a) Wojciech Toman w &lt;a href="http://www.gamedev.pl/articles.php?x=view&amp;id=297"&gt;swoim artykule&lt;/a&gt; proponuje zastosowanie metody opisanej &lt;a href="http://www.gamasutra.com/features/20021011/lengyel_06.htm"&gt;tutaj&lt;/a&gt;. Mi się ona jednak nie podoba.&lt;br /&gt;b) Wykorzystujemy macierz świata z odpowiednio zmodyfikowanymi współczynnikami skali i translacji. Wykonujemy normalną transformację i quad pokrywa cała niezbędną powierzchnię. Tylko, że w ten sposób renderujemy więcej pikseli niż jest to konieczne. Światło jest kuliste, a quad jest prostokątny, czyli na oko (4 - Pi) * r^2 pikseli za dużo. Poza tym musimy renderować taki quad z wyłączonym testem Z (przynajmniej ja do takiego wniosku doszedłem).&lt;br /&gt;3) Kula. Z całą pewnością da dużo lepsze przybliżenie kształtu światła na ekranie. Można też wykorzystać Z test. Tylko, że geometria robi się skomplikowana. Może się okazać, że więcej stracimy na transformacji niż zyskamy na precyzji.&lt;br /&gt;4) Sześcian. Pewien kompromis pomiędzy 2b i 3.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt; &lt;/td&gt;&lt;td&gt;Kula&lt;/td&gt;&lt;td&gt;Quad&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align:center"&gt;Przybliżenie&lt;/td&gt;&lt;td style="text-align:center"&gt;-&lt;/td&gt;&lt;td style="text-align:center"&gt;+&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align:center"&gt;Geometria&lt;/td&gt;&lt;td style="text-align:center"&gt;+&lt;/td&gt;&lt;td style="text-align:center"&gt;-&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align:center"&gt;Z test&lt;/td&gt;&lt;td style="text-align:center"&gt;=&lt;/td&gt;&lt;td style="text-align:center"&gt;+&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;Mamy więc 3 +, 2 - i 1 remis. Dlatego wybrałem właśnie sześcian jako geometrię dla światła.&lt;br /&gt;&lt;br /&gt;O co chodzi z tym Z test'em. Wymyśliłem (pewnie nie ja pierwszy), że można wykorzystać go do eliminacji pikseli tła podczas rysowania pierwszoplanowych świateł. Cała sztuczka polega na rysowaniu światła za geometrią z ustawionym testem Z na funkcję "greater". Potrzebujemy do tego bryły, która obejmuje całą niezbędną przestrzeń.&lt;br /&gt;1) Macierz świata musi dokonać skalowania i translacji. Rotacja nie jest konieczna.&lt;br /&gt;2) Zmieniamy funkcję Z.&lt;br /&gt;3) Wyłączamy zapis Z.&lt;br /&gt;4) Zmieniamy culling na rysowanie backface'ów.&lt;br /&gt;5) Renderujemy sześcian.&lt;br /&gt;&lt;br /&gt;Podczas kodowania wymyśliłem, że odwrócenie funkcji Z i cullingu pozwoli na eliminację w odwrotnej sytuacji, czyli pikseli pierwszoplanowych dla świateł w oddali.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-2294429629985711295?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/2294429629985711295/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=2294429629985711295' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2294429629985711295'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2294429629985711295'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/04/odroczone-oswietlenie.html' title='Odroczone oświetlenie'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-6511395485282042060</id><published>2009-03-31T18:15:00.005+02:00</published><updated>2009-04-02T12:01:45.630+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>error: variable `Math::Quaternion x; has initializer but incomplete type</title><content type='html'>Bardzo ciekawy błąd. Klasa ma inicjalizator, ale typ nie kompletny. Cóż to może znaczyć ?&lt;br /&gt;Sprawa jest dosyć prosta. Klasa kwaternionu jest klasą zaprzyjaźnioną z klasą macierzy. Czyli mamy mniej więcej taki zapis w pliku Matrix.hpp:&lt;br /&gt;&lt;pre&gt;&lt;span class="keyword"&gt;class&lt;/span&gt; Quaternion&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;&lt;br /&gt;class&lt;/span&gt; Matrix&lt;span class="operator"&gt;&lt;br /&gt;{&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt; friend class&lt;/span&gt; Quaternion&lt;span class="operator"&gt;;&lt;br /&gt; ...&lt;br /&gt;};&lt;/span&gt;&lt;/pre&gt;Jest to przydatne przy tworzeniu macierzy rotacji z kwaternionu.&lt;br /&gt;No ale gdzie błąd ? Otóż w miejscu w którym korzystałem z kwaternionów był włączony plik Matrix.hpp, ale plik Quaternion.hpp już nie. Nie było potrzeby umieszczać tego nagłówka w macierzy, więc tego nie zrobiłem.&lt;br /&gt;&lt;br /&gt;No ale skoro już mowa o kwaternionach, to znaczy, że robiłem coś z rotacjami. Tak, zrobiłem prosty kontroler kamery. Można sobie teraz polatać po scenie. Koniec z re kompilacją po byle zmianie położenia kamery :)&lt;br /&gt;&lt;br /&gt;Zrobiłem też trochę cienie. Działają poprawnie światła spot i omni. Kierunkowych nawet nie sprawdzałem.&lt;br /&gt;&lt;br /&gt;Dodałem też proste oświetlenie per pixel.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/lDjAn22pch3k8DY9qw5S3w?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_QclPhZLbeWo/SdSA8ZgGcRI/AAAAAAAAA_c/bMMsXVVJIaY/s144/Przechwytywanie%20w%20trybie%20pe%C5%82noekranowym%202009-04-02%20110649.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/czbPAnE1xiqpsFPmXh_nGg?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/SdSA6P1egDI/AAAAAAAAA_U/issGzPms5fI/s144/Przechwytywanie%20w%20trybie%20pe%C5%82noekranowym%202009-04-02%20110639.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/gbdxQA6eOga0NM49XeDzAQ?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/SdSA3nCCW1I/AAAAAAAAA_M/jlwoR7J5wjM/s144/Przechwytywanie%20w%20trybie%20pe%C5%82noekranowym%202009-04-02%20110630.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:center"&gt;1&lt;/td&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:center"&gt;2&lt;/td&gt;&lt;td style="font-family:arial,sans-serif; font-size:11px; text-align:center"&gt;3&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Cube shadow mapa średnio poprawnie wyświetla się na moim GF 7600. Jednak na kartach z serii 8xxx widać poprawnie jedną ze ścianek.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-6511395485282042060?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/6511395485282042060/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=6511395485282042060' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6511395485282042060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6511395485282042060'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/03/error-variable-mathquaternion-x-has.html' title='error: variable `Math::Quaternion x; has initializer but incomplete type'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/_QclPhZLbeWo/SdSA8ZgGcRI/AAAAAAAAA_c/bMMsXVVJIaY/s72-c/Przechwytywanie%20w%20trybie%20pe%C5%82noekranowym%202009-04-02%20110649.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-5396948883382695327</id><published>2009-03-26T12:01:00.004+01:00</published><updated>2009-03-27T10:42:50.637+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Oświetlenie punktowe i "coding standard"</title><content type='html'>Po pierwsze chwalenie się. Zrobiłem oświetlenie punktowe :) Wyszło przy okazji parę ciekawostek. Przede wszystkim samodzielnie wymyśliłem jak poprawnie znaleźć koordynaty dla takiej tekstury :), nie jest specjalnie skomplikowane, ale zawsze miło samemu coś odkryć, a nie tylko ctrl-c ctrl-v. Początkowo myślałem, że współrzędne powinny być normalizowane. Nie ma jednak takiej potrzeby.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/FRuym7jXufO-98YGwp_Vxw?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/ScyZO6KRCaI/AAAAAAAAA98/daU8XtDRwWk/s144/Shadow020.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align:center"&gt;Znormalizowane wspólrzędne&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Zapomniałem, że w klasie tekstury nie było kodu tworzącego mapy sześcienne. Dalej okazało się, że macierz widoku jest robiona nie tak jak powinna. W efekcie cień poruszał się w innym kierunku niż obiekt. Ostatecznym problemem były "poszarpane" cienie.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/EtFFluTBZ-41j7Reh62eLA?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/ScyZQTWj2oI/AAAAAAAAA-A/tVt98REQur8/s144/Shadow021.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align:center"&gt;Niedobra macierz projekcji&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Przyczyną było nie schodzenie się obrazków na krawędziach, czyli źle zrobiona macierz projekcji.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/zEOLlIwp8JspD4sgnbkR8Q?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_QclPhZLbeWo/ScyZRWW6KEI/AAAAAAAAA-E/ZVq_6EiuXzc/s144/Shadow022.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align:center"&gt;Poprawny efekt&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Po drugie, dziękuję Ci Motorolo za Twój coding standard. Dzięki niemu nie musiałem szukać tego błędu: &lt;br /&gt;&lt;pre&gt;&lt;span class="flow"&gt;if&lt;/span&gt;&lt;span class="operator"&gt; (&lt;/span&gt;LightType_Directional&lt;span class="operator"&gt; =&lt;/span&gt; type&lt;span class="operator"&gt;)&lt;/span&gt;&lt;/pre&gt;Wskazał mi go kompilator, takim oto komunikatem: "non-lvalue in assignment"&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-5396948883382695327?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/5396948883382695327/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=5396948883382695327' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/5396948883382695327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/5396948883382695327'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/03/oswietlenie-punktowe-i-coding-standard.html' title='Oświetlenie punktowe i &quot;coding standard&quot;'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_QclPhZLbeWo/ScyZO6KRCaI/AAAAAAAAA98/daU8XtDRwWk/s72-c/Shadow020.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-8198829278007814299</id><published>2009-03-26T08:18:00.003+01:00</published><updated>2009-03-27T10:48:46.064+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Premature optimization is root of all evil 2</title><content type='html'>Jak się okazało efekt cieniowania nie był prawidłowy, ponieważ pokusiłem o pewną optymalizację. Przemnorzyłem macierz światła przez macierz Range. Miało to na celu przycięcie wynikowych współrzędnych do zakresu &lt;0; 1&gt;. Problem w tym, że wspołrzędną z też przycinałem, natomiast do shadow mapy trafiały "pełne" wartości. W efekcie porównywanie obu wartości nie bardzo dawało oczekiwane rezultaty.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/S096UJ2L0kmri3uLTW-GTQ?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_QclPhZLbeWo/ScpgIHnL4jI/AAAAAAAAA50/dLfvz9-NwdY/s144/Shadow013.jpg" /&gt;&lt;/a&gt; &lt;a href="http://picasaweb.google.pl/lh/photo/U-xNG3ggkS9VN8oRirgYEw?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/ScpgJUFVuDI/AAAAAAAAA58/ZsqSMviw9Zo/s144/Shadow014.jpg" /&gt;&lt;/a&gt;&lt;br /&gt;Piksele oświetlone mają różne kolorki, w zależności od tego z jakim biasem zostały zaklasyfikowane.&lt;br /&gt;1 - bias = 0&lt;br /&gt;0.8 - bias = 0.001&lt;br /&gt;0.6 - bias = 0.01&lt;br /&gt;0.4 - bias = 0.1&lt;br /&gt;0.2 - bias = 0.2&lt;br /&gt;0 - cień&lt;br /&gt;Masakra :)&lt;br /&gt;Poprawiłem macierz range:&lt;br /&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/p8tvM-P4PVSKf-FfwCmjrw?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_QclPhZLbeWo/ScqRIDeJWkI/AAAAAAAAA8E/N3gALVWeP10/s144/Shadow016.jpg" /&gt;&lt;/a&gt; &lt;a href="http://picasaweb.google.pl/lh/photo/6xJ4XDmpMwkEH7fXauUa-w?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/ScqRJ_LNQmI/AAAAAAAAA8I/U5DZ1CJJTjI/s144/Shadow017.jpg" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-8198829278007814299?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/8198829278007814299/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=8198829278007814299' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8198829278007814299'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8198829278007814299'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/03/premature-optimization-is-root-of-all_26.html' title='Premature optimization is root of all evil 2'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_QclPhZLbeWo/ScpgIHnL4jI/AAAAAAAAA50/dLfvz9-NwdY/s72-c/Shadow013.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-4804803225112768893</id><published>2009-03-25T09:38:00.005+01:00</published><updated>2009-03-25T10:43:36.588+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Premature optimization is root of all evil</title><content type='html'>Niby wiem wiem, że tak jest. Nawet nie dawno na forum warsztatu sugerowałem Lukaz'owi, żeby najpierw nauczył się programować i dopiero potem pomyślał o wydajności. I co, i sam się wpakowałem w optymalizowanie czegoś, co wciąż jest dla mnie nowością.&lt;br /&gt;&lt;br /&gt;Chcę wykorzystać shadow mapping jako technikę oświetlenia w swoim silniku. Kod od strony silnika jest już gotowy. Zostało tylko napisać (raczej dostosować niż napisać) shadery.&lt;br /&gt;1) Renderowanie shadow mapy. Trzeba zapisać wartość głębokości, czyli z / w. Sprytnie wymyśliłem, że można tu ładnie zaoszczędzić wykonując to dzielenie w vertex shaderze. Wartość powinna się ładnie interpolować.&lt;br /&gt;W vertex shaderze dodałem parametr: &lt;br /&gt;&lt;pre&gt;&lt;span class="keyword"&gt;out&lt;/span&gt;&lt;span class="type"&gt; float&lt;/span&gt; oDepth&lt;span class="operator"&gt; :&lt;/span&gt; TEXCOORD2&lt;/pre&gt;, oraz kod obliczający ten parametr:&lt;br /&gt;&lt;pre&gt;oDepth&lt;span class="operator"&gt; =&lt;/span&gt; oPosition&lt;span class="operator"&gt;.&lt;/span&gt;z&lt;span class="operator"&gt; /&lt;/span&gt; oPosition&lt;span class="operator"&gt;.&lt;/span&gt;w&lt;span class="operator"&gt;;&lt;/span&gt;&lt;/pre&gt;Pixel shader był nowy:&lt;br /&gt;&lt;pre&gt;&lt;span class="type"&gt;void&lt;/span&gt; ps&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;in&lt;/span&gt;&lt;span class="type"&gt; float&lt;/span&gt; depth&lt;span class="operator"&gt; :&lt;/span&gt; TEXCOORD2&lt;span class="operator"&gt;,&lt;/span&gt; &lt;span class="keyword"&gt;out&lt;/span&gt; &lt;span class="type"&gt;float3&lt;/span&gt; oColor&lt;span class="operator"&gt; :&lt;/span&gt; COLOR&lt;span class="operator"&gt;)&lt;br /&gt;{&lt;/span&gt;&lt;br /&gt; oColor&lt;span class="operator"&gt; =&lt;/span&gt; &lt;span class="type"&gt;float3&lt;/span&gt;&lt;span class="operator"&gt;(&lt;/span&gt;depth&lt;span class="operator"&gt; ,&lt;/span&gt; depth&lt;span class="operator"&gt; ,&lt;/span&gt; depth&lt;span class="operator"&gt;);&lt;br /&gt;}&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;2) Renderowanie wynikowego obrazka. Tutaj vertex shader wzbogacił się o wyliczanie pozycji względem światła, a pixel shader zajął się wyznaczeniem koordynatów dla shadow mapy, dystansu od światła i stwierdzeniem czy cień jest czy go nie ma.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/rujRiTPM1x1UASv7XVi9oA?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/Scnmsf4koaI/AAAAAAAAA3Q/-GwN4g35hWg/s144/Shadow006.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/-nTf-cJ5l-NE-9dgvlmfCw?feat=embedwebsite"&gt;&lt;img src="http://lh6.ggpht.com/_QclPhZLbeWo/ScnmtGHMBNI/AAAAAAAAA3Y/PXDjMJ855jY/s144/Shadow007.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/Mbpj9J31uIOM7UiRPvgvdg?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/ScnqHXSKdLI/AAAAAAAAA4U/hiAf1tZFyMs/s144/Shadow008.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align:center"&gt;Geometria&lt;/td&gt;&lt;td style="text-align:center"&gt;Projekcja shadow mapy&lt;/td&gt;&lt;td style="text-align:center"&gt;Dystans do światła&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;&lt;br /&gt;Jak widać zawartość shadow mapy nie pokrywa się z dystansem. Dokładniej to mamy źle wyznaczoną shadow mapę. Czemu ?? Błąd pojawia się gdy któryś wierzchołek znajduję się za światłem, czyli ma ujemną współrzędną z. Nie wiem dokładnie czemu tak się dzieje, jednak wydaje się, że taki trójkąt ma niewłaściwie interpolowany parametr depth. Przeniosłem dzielenie z / w do pixel shadera, rozwiązało to problem.&lt;br /&gt;&lt;table style="width:auto;"&gt;&lt;tr&gt;&lt;td&gt;&lt;a href="http://picasaweb.google.com/lh/photo/i3MeBWvnVgFdH0M_7JEWsw?feat=embedwebsite"&gt;&lt;img src="http://lh4.ggpht.com/_QclPhZLbeWo/Scn359C_00I/AAAAAAAAA40/xPZcZ7QXaNo/s144/Shadow009.jpg" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="text-align:center"&gt;Wynikowe światło&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;br /&gt;Efekt wciąż nie jest poprawny, ale jest progress :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-4804803225112768893?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/4804803225112768893/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=4804803225112768893' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4804803225112768893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4804803225112768893'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/03/premature-optimization-is-root-of-all.html' title='Premature optimization is root of all evil'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_QclPhZLbeWo/Scnmsf4koaI/AAAAAAAAA3Q/-GwN4g35hWg/s72-c/Shadow006.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-2460748417665856069</id><published>2009-03-18T22:15:00.005+01:00</published><updated>2009-06-08T16:39:10.261+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Programowanie'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>base class `class __gnu_cxx::new_allocator&lt; Graphics::Actor*&gt; has a non-virtual destructor - czyli co robić gdy release nie działa</title><content type='html'>Co robić gdy program nie działa poprawnie w wersji Release, w przeciwieństwie do wersji zbudowanej z ustawieniami Debug ? Jak zawsze trzeba pomyśleć. Opracowanie planu działania wymaga zastanowienia się nad tym czym różnią się te dwie wersje:&lt;br&gt;1) Kod. Czy możliwe jest aby do kompilacji trafił różny kod ?&lt;br&gt;2) Ustawienia kompilatora. Jakie są różnice w budowaniu tych wersji ?&lt;br&gt;3) Inne :) Czy coś innego mogło wpłynąć na wynikowy kod ?&lt;br /&gt;&lt;br /&gt;Jak się już ma plana to można przystąpić do działania.&lt;br /&gt;&lt;br /&gt;Ad 1. Tak to jest możliwe. Myślę tu o pre procesorze. Zaczynamy więc nasze działania od przeszukania kodu pod tym kątem. Warto też zajrzeć od ustawień projektu i sprawdzić czy któraś z wersji nie ma definiowanych symboli, bo tak przecież się z tego korzysta.&lt;br /&gt;&lt;br /&gt;Ad 2. Jeśli mamy pewność, że nie ma różnicy w kodzie, zaczynamy podejrzewać, że kompilator ma buga. No bo ten sam kod a on go zbudować nie umie :)&lt;br /&gt;Oczywiście w obu wypadkach stosuje się różne ustawienia kompilatora. Szczególnie istotne są dwie flagi -o i -g &lt;a href="http://linux.die.net/man/1/gcc"&gt;w przypadku gcc&lt;/a&gt;, albo zestaw flag /O i /G, /Z /Y, /RTC ... &lt;a href="http://msdn.microsoft.com/en-us/library/19z1t1wy.aspx"&gt;dla kompilatora Microsoftu.&lt;/a&gt;&lt;br /&gt;Co robią flagi -g ? Robią kilka rzeczy. Przede wszystkim włączają informacje niezbędne debuggerowi do pracy, ale nie tylko. Kompilator będzie również dodawał inicjację zmiennych. W małym projekcie coś takiego dosyć łatwo znaleźć. Przy większych z pomocą przyjdzie nam kompilator ze swoimi flagami kontrolującymi ostrzeżenia: -Wall, &lt;br&gt;-Weffc++, -Wuninitialized, -W-missing-field-initializers. Ich zastosowanie może sprawić, że kod przestanie się kompilować, za to zostaną nam wytknięte wszystkie braki w kodzie.&lt;br /&gt;Jeśli to nie pomaga, to zostały jeszcze flagi -o, odpowiadające za optymalizację. Z reguły release ma dosyć wysoki poziom -o3+, a debug ma -o0, czyli optymalizacje wyłączone. Kompilator podczas optymalizacji będzie stosował przeróżne sztuczki, również takie które są potencjalnie niebezpieczne. Zaczynamy, więc podnosić poziom optymalizacji dla wersji debug. W ten sposób powinno udać się wyśledzić błąd.&lt;br /&gt;&lt;br /&gt;Ad 3. Co innego może wpłynąć na wynikowy program ? Do głowy przychodzą mi tylko biblioteki. Może zdarzyć się tak, że włączane są różne ich wersje.&lt;br /&gt;&lt;br /&gt;Co dalej ? Nie wiem, może porzucenie projektu, może zmiana zawodu ;)&lt;br /&gt;&lt;br /&gt;EDIT: Drobna edycja tytułu.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-2460748417665856069?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/2460748417665856069/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=2460748417665856069' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2460748417665856069'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/2460748417665856069'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/03/base-class-class-gnucxxnewallocator-has.html' title='base class `class __gnu_cxx::new_allocator&lt; Graphics::Actor*&gt; has a non-virtual destructor - czyli co robić gdy release nie działa'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-8619178828889875739</id><published>2009-03-17T19:31:00.000+01:00</published><updated>2009-03-17T19:49:14.743+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Zliczanie referencji</title><content type='html'>Ehh, nadszedł ten dzień kiedy ostatecznie uznałem, że zliczanie referencji trzeba zrobić. Bufor tu, bufor tam. Potem ktoś ten bufor skasuje i pół aplikacji zostaje z wskaźnikiem na skasowany obiekt.&lt;br /&gt;Zastosowane rozwiązanie jest oparte na wcześniejszym modelu zarządzania zasobami. Wzbogaciłem go jedynie o dodatkową klasę Handle i parę metod zliczających referencje.&lt;br /&gt;Wszystkie elementy posługują się już uchwytami, a same zasoby póki co nie wychodzą poza menadżerów.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="keyword"&gt;class&lt;/span&gt; Handle&lt;span class="operator"&gt;&lt;br /&gt;{&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;    friend class&lt;/span&gt; Resources&lt;span class="operator"&gt;::&lt;/span&gt;Resource&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;public&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&lt;br /&gt;    Handle&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt; Handle&lt;span class="operator"&gt; &amp;amp;&lt;/span&gt; arg&lt;span class="operator"&gt;);&lt;/span&gt;&lt;br /&gt;    Handle&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;    virtual&lt;/span&gt;&lt;span class="operator"&gt; ~&lt;/span&gt;Handle&lt;span class="operator"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    Handle&lt;span class="operator"&gt; &amp;amp;&lt;/span&gt;&lt;span class="keyword"&gt; operator&lt;/span&gt;&lt;span class="operator"&gt; = (&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt; Handle&lt;span class="operator"&gt; &amp;amp;&lt;/span&gt; arg&lt;span class="operator"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    std&lt;span class="operator"&gt;::&lt;/span&gt;string&lt;span class="operator"&gt; &amp;amp;&lt;/span&gt; GetName&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt;    bool&lt;/span&gt; IsCreated&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;&lt;br /&gt;protected&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&lt;br /&gt;    Resource&lt;span class="operator"&gt; *&lt;/span&gt; getResource&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;private&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&lt;br /&gt;    Handle&lt;span class="operator"&gt;(&lt;/span&gt;Resource&lt;span class="operator"&gt; *&lt;/span&gt; resource&lt;span class="operator"&gt;);&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    Resource&lt;span class="operator"&gt; *&lt;/span&gt; resource&lt;span class="operator"&gt;;&lt;br /&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="keyword"&gt;class&lt;/span&gt; Resource&lt;span class="operator"&gt;&lt;br /&gt;{&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;    friend class&lt;/span&gt; Resources&lt;span class="operator"&gt;::&lt;/span&gt;ResourceFactory&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;    friend class&lt;/span&gt; Resources&lt;span class="operator"&gt;::&lt;/span&gt;Handle&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;public&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&lt;br /&gt;    std&lt;span class="operator"&gt;::&lt;/span&gt;string&lt;span class="operator"&gt; &amp;amp;&lt;/span&gt; GetName&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt;    bool&lt;/span&gt; IsCreated&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt;    bool&lt;/span&gt; Remove&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;protected&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&lt;br /&gt;    Resource&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;const&lt;/span&gt; std&lt;span class="operator"&gt;::&lt;/span&gt;string&lt;span class="operator"&gt; &amp;amp;&lt;/span&gt; name&lt;span class="operator"&gt;,&lt;/span&gt; ResourceFactory&lt;span class="operator"&gt; &amp;amp;&lt;/span&gt; resourceFactory&lt;span class="operator"&gt;);&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;    virtual&lt;/span&gt;&lt;span class="operator"&gt; ~&lt;/span&gt;Resource&lt;span class="operator"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    Handle getHandle&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt;&lt;br /&gt;    void&lt;/span&gt; setCreated&lt;span class="operator"&gt;(&lt;/span&gt;&lt;span class="type"&gt;bool&lt;/span&gt; isCreated&lt;span class="operator"&gt;);&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;private&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&lt;br /&gt;    Resource&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt;&lt;br /&gt;    void&lt;/span&gt; add&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt;    void&lt;/span&gt; remove&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt;&lt;br /&gt;    void&lt;/span&gt; addRef&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt;    void&lt;/span&gt; removeRef&lt;span class="operator"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    std&lt;span class="operator"&gt;::&lt;/span&gt;string name&lt;span class="operator"&gt;;&lt;/span&gt;&lt;br /&gt;    ResourceFactory&lt;span class="operator"&gt; &amp;amp;&lt;/span&gt; resourceFactory&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt;&lt;br /&gt;    bool&lt;/span&gt; isCreated&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="type"&gt;&lt;br /&gt;    unsigned int&lt;/span&gt; references&lt;span class="operator"&gt;;&lt;br /&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="keyword"&gt;typedef&lt;/span&gt; std&lt;span class="operator"&gt;::&lt;/span&gt;map&lt;span class="operator"&gt;&amp;lt;&lt;/span&gt;std&lt;span class="operator"&gt;::&lt;/span&gt;string&lt;span class="operator"&gt;,&lt;/span&gt; Resource&lt;span class="operator"&gt; *&amp;gt;&lt;/span&gt; ResourceMap&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;&lt;br /&gt;class&lt;/span&gt; ResourceFactory&lt;span class="operator"&gt;&lt;br /&gt;{&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;    friend class&lt;/span&gt; Resource&lt;span class="operator"&gt;;&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;public&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&lt;span class="comment"&gt;&lt;br /&gt;    //No public interface.&lt;br /&gt;&lt;/span&gt;&lt;span class="keyword"&gt;protected&lt;/span&gt;&lt;span class="operator"&gt;:&lt;/span&gt;&lt;br /&gt;    ResourceFactory&lt;span class="operator"&gt;();&lt;/span&gt;&lt;span class="keyword"&gt;&lt;br /&gt;    virtual&lt;/span&gt;&lt;span class="operator"&gt; ~&lt;/span&gt;ResourceFactory&lt;span class="operator"&gt;();&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;    ResourceMap resources&lt;span class="operator"&gt;;&lt;br /&gt;};&lt;/span&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-8619178828889875739?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/8619178828889875739/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=8619178828889875739' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8619178828889875739'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/8619178828889875739'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/03/zliczanie-referencji.html' title='Zliczanie referencji'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-4668497453274110387</id><published>2009-03-15T20:58:00.001+01:00</published><updated>2009-03-15T21:07:38.564+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>GUI</title><content type='html'>Jest progress, więc się chwalę. Zmieniłem metodę rysowania elementów z StrechtRect, na renderowanie geometrii. Wymagało to pewnych zmian w koncepcji, i ogromnej ilości poprawek przeróżnych błędów czających się w kodzie ;) Jednak opłaciło się:&lt;br /&gt;    * działa bez zauważalnego spadku fps.&lt;br /&gt;    * element może mieć dowolny kształt, np kulę.&lt;br /&gt;    * element może wysunąć się poza obszar ekranu bez żadnych zabiegów z mojej strony. StrechtRect strasznie marudziło w takiej sytuacji. &lt;p&gt;Gorzej tylko, że to znacznie skomplikowało budowę elementów i napisanie nowego będzie wymagać znajomości macierzy.&lt;br /&gt;&lt;br /&gt;Oto 2 screeny. Na obu widać dwa okienka jedno pełnoekranowe z podpiętą kamerą, a drugie w rogu z podpiętym światłem. Niestety rysowanie bufora głębokości jeszcze nie działa, więc jest biała plama. Shader użyty przy liczeniu oświetlenia też nie robi do końca tego co powinien, więc mamy tylko przekopiowany kanał czerwony :)&lt;br /&gt;&lt;div align="center"&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/MnqQC4pIGY7PED3MpNiprg?feat=embedwebsite"&gt;&lt;img src="http://lh5.ggpht.com/_QclPhZLbeWo/Sb1YxwU0_SI/AAAAAAAAA0g/c5-VFPgqSdw/s144/GUI003.jpg" /&gt;&lt;/a&gt; &lt;a href="http://picasaweb.google.pl/lh/photo/WXn3LTOtR0fKxHHCFmjntA?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/Sb1YzF45bgI/AAAAAAAAA0o/DTdahsgjhyk/s144/GUI002.jpg" /&gt;&lt;/a&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-4668497453274110387?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/4668497453274110387/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=4668497453274110387' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4668497453274110387'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4668497453274110387'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/03/gui_15.html' title='GUI'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_QclPhZLbeWo/Sb1YxwU0_SI/AAAAAAAAA0g/c5-VFPgqSdw/s72-c/GUI003.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-1482605653742347346</id><published>2009-03-12T20:11:00.001+01:00</published><updated>2009-03-15T21:07:54.767+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Directx9'/><category scheme='http://www.blogger.com/atom/ns#' term='GUI'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>GUI</title><content type='html'>Dawno nic nie napisałem. Jakoś nie było kiedy. Mogę tylko powiedzieć, że sporo napisałem. Zacząłem robić GUI. Idea jest prosta. GUI składa się z prostokątnych elementów, które reagują na polecenia typu kliknięcie myszką. Początkowo postanowiłem, wykorzystać do ich rysowania IDirect3DDevice9::StretchRect. Efekt wyszedł nawet całkiem przyjemny. Szybko się jednak okazało, że o ile użycie 32 bitowego render targetu rgba jako źródła obrazu nie stanowi problemu, to już r32f okazał nie akceptowalny dla tej metody. Konieczne jest wykonanie konwersji, a ta z kolej wymaga ściągnięcia danych do pamięci ram, przerobienia danych i odesłania ich do karty graficznej. Z 60 fps'ów zrobiło się 5.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;a href="http://picasaweb.google.pl/lh/photo/FWfDgDL4eQBKh-tKjl04kg?feat=embedwebsite"&gt;&lt;img src="http://lh3.ggpht.com/_QclPhZLbeWo/SblXjgo_fFI/AAAAAAAAAyw/wKjVdTZdIp0/s144/GUI.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Na obrazku widać dwa okienka (elementy). Pełnoekranowe używa kamery jako źródła obrazu, a to małe w rogu światła. Tylko, że shadow mapa nie była renderowana i wyszły śmieci :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-1482605653742347346?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/1482605653742347346/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=1482605653742347346' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/1482605653742347346'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/1482605653742347346'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/03/gui.html' title='GUI'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.ggpht.com/_QclPhZLbeWo/SblXjgo_fFI/AAAAAAAAAyw/wKjVdTZdIp0/s72-c/GUI.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-5092933393763065463</id><published>2009-02-11T09:41:00.001+01:00</published><updated>2009-02-11T09:48:34.233+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><category scheme='http://www.blogger.com/atom/ns#' term='Android'/><title type='text'>Android</title><content type='html'>Nie dawno spotkałem się z platformą &lt;a href="http://code.google.com/intl/pl-PL/android/"&gt;Android&lt;/a&gt;. Posłuchałem o niej w ramach wykładu z przedmiotu "&lt;i&gt;&lt;b&gt;Programowanie urządzeń mobilnych&lt;/b&gt;&lt;/i&gt;" i postanowiłem zobaczyć co tam google wysmażyło. Wszystko działa aż miło. Pisze się też bardzo przyjemnie. Ogólnie jestem bardzo pozytywnie zaskoczony. Postanowiłem nawet napisać projekt zaliczeniowy z przedmiotu właśnie na tę platformę. Jakoś J2ME mnie odstrasza.&lt;br /&gt;Tytuł projektu "&lt;i&gt;Obsługa rozkładów jazdy miejskich środków komunikacji&lt;/i&gt;".&lt;br /&gt;&lt;br /&gt;Kilka detali o api androida:&lt;br /&gt;Język java, ale możecie zapomnieć o jej przenośności. VM Androida, &lt;i&gt;Dalvik,&lt;/i&gt; nie obsłuży ani J2SE ani J2ME.&lt;br /&gt;Do sdk dołączony jest emulator.&lt;br /&gt;W paczce znajduje się również plugin do Eclipse'a.&lt;br /&gt;Cała dokumentacja znajduje się na podanej wyżej stronie. Jest tam też instrukcja instalacji ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-5092933393763065463?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/5092933393763065463/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=5092933393763065463' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/5092933393763065463'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/5092933393763065463'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/02/android.html' title='Android'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-4726360346548335363</id><published>2009-01-30T17:53:00.000+01:00</published><updated>2009-02-01T22:31:16.926+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='DRM'/><category scheme='http://www.blogger.com/atom/ns#' term='Warsztat'/><title type='text'>To drm, or not to drm ?</title><content type='html'>&lt;p&gt;Ostatnio na &lt;a href="http://forum.gamedev.pl/index.php?PHPSESSID=afldi32cf5qhmrc064hup47vk2&amp;amp;topic=9617.0"&gt;Warsztacie pojawił się wątek o drm&lt;/a&gt;. Autor [revo] pyta o porady w kwestii zbudowania jakiegoś prostego mechanizmu zabezpieczenia programu dystrybuowanego przez internet. Oprócz kilku sugestii rozwiązania, rozpoczęła się również dyskusja nad zasadnością stosowania takich mechanizmów.&lt;/p&gt;&lt;p&gt;Generalnie moją opinię [bez sensu] można poznać na forum. Chodzi mi jednak po głowie kilka pytań.&lt;/p&gt;&lt;p&gt;Jak daleko można posunąć się w walce z piractwem ? Autor ma niezaprzeczalne prawo do otrzymania wynagrodzenia za swoją pracę, a piraci to prawo &lt;em&gt;teoretycznie&lt;/em&gt; łamią. Zwalczanie piractwa jest więc czymś naturalnym i moralnie uzasadnionym ;) Tylko czy śledzenie swoich klientów i traktowanie każdego z nich jak złodzieja jest etyczne ? Czy utrudnianie życia klientowi jest dopuszczalne ?&lt;/p&gt;&lt;p&gt;Zdarzyło mi się już zobaczyć komunikat informujący mnie, że odpalenie legalnie nabytej gry nie jest możliwe, bo jakieś zabezpieczenie uznało oryginalną płytę za nie oryginalną. Co ma zrobić użytkownik w takiej sytuacji, szukać crack'a, może czekać na rozwiązanie od wydawcy ? Ja usunąłem grę i nie zainstalowałem patch'a który ten błąd wywołał. Akurat się dało, ale nie zawsze musi.&lt;/p&gt;&lt;p&gt;Anonimowość w sieci nie istnieje. Zmuszanie klienta do zdradzenia nam swoich danych (ip, mac) poprzez różne formy rejestracji, aktywacji itp. również jest czymś z czym trudno mi się pogodzić. Jaką klient ma pewność, że serwer przechowujący te dane jest odpowiednio zabezpieczony i że nikt tych danych nie wykorzysta ? W stanach FBI ma władze absolutną, a ja nie chcę żeby mnie FBI śledziło, bo kupiłem sobie grę, którą jakiś gryzipiórek uzna za podejrzaną ! (nie mam manii prześladowczych, ot taki przesadzony przykład ;) )&lt;/p&gt;&lt;p&gt;Czemu piraci tylko teoretycznie naruszają prawo do wynagrodzenia ? Długo myślałem i nie wymyśliłem jak udowodnić, że pirat kupiłby dany program, gdyby nie mógł go ukraść. Z drugiej strony pojawia się również kwestia możliwego zakupu legalnej wersji po przetestowaniu pirackiej (może jakieś promile promila). Osobiście mam wrażenie, że ogromna większość piratów nie dokonałaby zakupu, zmniejszając tym samym popularność produktu.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-4726360346548335363?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/4726360346548335363/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=4726360346548335363' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4726360346548335363'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4726360346548335363'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/01/to-drm-or-not-to-drm.html' title='To drm, or not to drm ?'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-6619994066280559229</id><published>2009-01-25T16:33:00.001+01:00</published><updated>2009-01-25T16:37:56.066+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Biblioteki'/><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Kłopoty i problemy</title><content type='html'>Witam wszystkich w nowym roku.&lt;br /&gt;Wyjazd na narty sie udał. Niestety tydzień po powrocie dopadła mnie angina, która po czterech dniach zamieniła się zapalenie ślinianek. W efekcie przez prawie dwa tygodnie nie mogłem nic napisać :(&lt;br /&gt;Tak naprawdę usiadłem przed kompem dopiero wczoraj. No i muszę powiedzieć, że były to całkiem ciekawe dwa dni ;) Tuż przed świętami zacząłem robić obsługę urządzeń wejściowych. Wybrałem bibliotekę OIS, bo przyjazna w użyciu i raczej nie ma co narzekać na możliwości. Oczywiście przed wyjazdem nie skończyłem tego i takie rozgrzebane przeleżało aż do wczoraj. Udało mi zapanować nad wszystkimi problemami i skompilować kod. Jednak linker zaczął płakać, że ma nie zdefiniowane symbole z biblioteki OIS ?! No przecież ją "instalowałem". Zajrzałem do ustawień projektu no i jest OIS_static dodane. Google podpowiedziało rozwiązanie. W projekcie C::B nie są włączone wszystkie pliki. Heh. Odpaliłem C::B, dodałem brakujący plik, rebuild, kopiowanie lib'ki do mingw. Eclipse wciąż marudził na nie zdefiniowane symbole. Okazało się, że trzeba jeszcze dołączyć bibliotekę DirectX Input, w postaci dwóch plików dx input 8, oraz dx guid. I na tym się dzień wczorajszy skończył.&lt;br /&gt;Dziś postanowiłem dopisać kod, który będzie inicjalizował moduł wejścia. Zrobiłem sobie klasę Input::Manager, zbliżoną do Graphics::Manager. Oczywiście klasa wylądowała w plikach manager.hpp i cpp, podobnie jak jej siostra z modułu graficznego. No i rzecz jasna w obu plikach pojawił standardowy strażnik "#ifndef MANAGER_HPP ... " A ja przez pól dnia zastanawiałem się czemu do licha klasa Input::Manager jest undefined ;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-6619994066280559229?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/6619994066280559229/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=6619994066280559229' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6619994066280559229'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/6619994066280559229'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2009/01/kopoty-i-problemy.html' title='Kłopoty i problemy'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-4253798563151749906</id><published>2008-12-23T19:44:00.001+01:00</published><updated>2008-12-23T19:53:22.576+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>Wesołych Świąt</title><content type='html'>&lt;div align="left"&gt;Jutro wigilia. Miałem nadzieje, że będę siedział i rozkoszował się wolnym czasem. Dokończę zapis tekstur, podstawy obsługi kontrolerów, shadow mapping. Może nawet pogram sobie w nieskończonego jeszcze "Darkstar One". Niestety nic z tego. Mam do zrobienia sprawozdanie z Przetwarzania Obrazów :(&lt;br /&gt;&lt;br /&gt;Siedzę wiec od niedzieli od rana i piszę. Mam już dosyć. Jutro mam urwanie głowy, potem wigilia u narzeczonej. Dokończę pewnie dopiero 25 grudnia, co niestety oznacza, że moje kochanie będzie musiało posiedzieć trochę samo sobie.&lt;br /&gt;&lt;br /&gt;Po świętach jedziemy na narty. Słowacja, Liptowski Mikulasz. Mam nadzieję przez 6 dni na zmianę szaleć na nartach i lać wódę do nieprzytomności.&lt;br /&gt;&lt;br /&gt;Życzę wszystkim szczęśliwych świąt w gronie najbliższych.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-4253798563151749906?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/4253798563151749906/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=4253798563151749906' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4253798563151749906'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4253798563151749906'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2008/12/wesoych-wit.html' title='Wesołych Świąt'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-510647550910081456</id><published>2008-12-04T19:45:00.001+01:00</published><updated>2008-12-23T19:54:23.724+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>Library</title><content type='html'>&lt;p&gt;Wspominałem już jaki czas jest straszny. Jeżeli tak będzie mi szło pisanie postów, to nie najlepiej wróży temu blogowi. Czemu tydzień nie ma 14 dni, albo doba 48 godzin ?? Ehh&lt;/p&gt;&lt;p&gt;Mam zajęcia z przedmiotu o nazwie Rozpoznawanie Obrazów. W ramach zaliczenia mamy napisać 7/10 programów. Oczywiście nie wystarczy napisać, trzeba jeszcze z nich odpowiadać. Postanowiłem być złośliwy i napisać kod tak, żeby prowadzący nic nie zrozumiał :p On pisze w pascalu, więc uznałem, że szablony okażą się skuteczne :) Obiekty funkcyjne, algorytmy. Całe dobrodziejstwo inwentarza. Także powoli powstaje moja prywatna biblioteczka różnych dziwnych pojemników i algorytmów. Gorzej tylko, że nie pamiętam już kiedy ostatnio siedziałem nad swoim projektem.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-510647550910081456?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/510647550910081456/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=510647550910081456' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/510647550910081456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/510647550910081456'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2008/12/library.html' title='Library'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-1013159666574954513</id><published>2008-11-21T17:52:00.001+01:00</published><updated>2008-11-21T17:57:10.962+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>Czas</title><content type='html'>Czas jest straszny. W poniedziałek chciałem napisać jak poszła prezentacja i jak w ogóle coś takiego wygląda. Wróciłem jednak do domu zmęczony i postanowiłem to odłożyć na wtorek. Jest piątek. Nie wiem kiedy to minęło. Najgorsze jest to, że w tym czasie udało mi się napisać tylko konwersje pomiędzy różnymi formatami obrazków. Góra jeden dzień roboty, a minęło 5 :(&lt;br /&gt;&lt;br /&gt;Prezentacja poszła mi dobrze, dosłownie, została oceniona na 4. Generalnie bez większych zastrzeżeń. Wnioski na przyszłość:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;Nie popełniać błędów ortograficznych, kolegę spotkało to nieszczęście i zostały mu one wytknięte. Wbrew mojej ogólnej niechęci do poprawności pisowni jest ona ważna. Jej brak ma druzgocący wpływ na to jak odbiera się autora.&lt;br /&gt;  &lt;/li&gt;   &lt;li&gt;Prezentacji nie należy czytać. Mówimy na temat, ale nie czytamy tego co napisaliśmy. Inaczej zanudzimy słuchaczy.&lt;/li&gt;   &lt;li&gt;Prezentacja powinna się uleżeć. Nie należy jej pisać na raz. Lepiej napisać, odłożyć na dzień, czy dwa i znowu nad nią popracować. Po trzecim, czwartym podejściu efekty są dużo lepsze.&lt;br /&gt;  &lt;/li&gt; &lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-1013159666574954513?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/1013159666574954513/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=1013159666574954513' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/1013159666574954513'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/1013159666574954513'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2008/11/czas.html' title='Czas'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-7584315821735793415</id><published>2008-11-14T17:42:00.001+01:00</published><updated>2008-11-14T18:02:36.322+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Silnik graficzny'/><title type='text'>Image capture</title><content type='html'>Uznałem, że skoro mam napisać pracę magisterską o renderowaniu grafiki, to fajnie byłoby móc jakoś szybko i łatwo przechwytywać obrazy generowane przez silnik. Najlepiej na kilku etapach i wersjach. Postanowiłem dodać taką funkcjonalność.&lt;br /&gt;&lt;br /&gt;Założyłem sobie takie o to możliwości/cechy:&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;Renderer&lt;/span&gt; ma metodę &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;capture&lt;/span&gt;, która przyjmuje jako parametry bitmapy. Zostaną one wypełnione wynikowymi obrazami.&lt;/li&gt;   &lt;li&gt;Przechwytywanie dotyczy następnej wygenerowanej ramki, czyli wszystko co trafi do &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_2"&gt;renderera&lt;/span&gt; pomiędzy następną parą begin - end.&lt;/li&gt;   &lt;li&gt;Uchwycone mają zostać (na dziś) następujące obrazki&lt;br /&gt;&lt;/li&gt;   &lt;ul&gt;     &lt;li&gt;z &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;buffer&lt;/span&gt;&lt;/li&gt;     &lt;li&gt;finalny w wersji solid&lt;/li&gt;     &lt;li&gt;finalny w wersji &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_4"&gt;wireframe&lt;/span&gt;&lt;/li&gt;   &lt;/ul&gt; &lt;/ul&gt; Póki co przechwytywanie filmów mi nie w głowie, także zrezygnowałem na razie z sekwencji video.&lt;br /&gt;&lt;br /&gt;Wziąłem się do pracy od podstaw, czyli od napisania klasy zapisującej bitmapy do plików &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;tga&lt;/span&gt;. Sprawa jest dosyć banalna kiedy ma się pod ręką &lt;i&gt;własnoręcznie&lt;/i&gt; napisany &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;loader&lt;/span&gt; (żadne tam kopi pasty) tych plików. Także raz dwa się z tym uwinąłem i postanowiłem zrobić test.&lt;br /&gt;&lt;br /&gt;&lt;div align="center"&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://4.bp.blogspot.com/_QclPhZLbeWo/SR2rWEYsgnI/AAAAAAAAAus/wSZRFr7cUNI/s200/test.jpg" border="0" alt="Oryginał" id="BLOGGER_PHOTO_ID_5268555534716142194" /&gt;&lt;br /&gt;&lt;img style="display:block; margin:0px auto 10px; text-align:center;cursor:pointer; cursor:hand;width: 100px; height: 100px;" src="http://3.bp.blogspot.com/_QclPhZLbeWo/SR2rjWL-BgI/AAAAAAAAAu0/fWpEbENrmDk/s200/out.jpg" border="0" alt="Po teście" id="BLOGGER_PHOTO_ID_5268555762832901634" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Górny obrazek jest oryginalny, dolny po załadowaniu moim własnoręcznie wykonanym &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_7"&gt;loader&lt;/span&gt;'em i zapisie nowiusieńką klasą do zapisu. Przyjdzie mi jeszcze chyba nieco posiedzieć nad tym &lt;i&gt;banalnym&lt;/i&gt; problemem.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Uczy pokory, oj uczy :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-7584315821735793415?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/7584315821735793415/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=7584315821735793415' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/7584315821735793415'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/7584315821735793415'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2008/11/image-capture.html' title='Image capture'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_QclPhZLbeWo/SR2rWEYsgnI/AAAAAAAAAus/wSZRFr7cUNI/s72-c/test.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-658772830218627266.post-4890164659567113942</id><published>2008-11-13T21:52:00.000+01:00</published><updated>2008-11-14T16:09:34.364+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Social'/><title type='text'>Początki</title><content type='html'>Początki wcale nie są takie trudne. Na przykład początek listu powinien być prosty. Zwykłe "Dzień dobry" w zupełności wystarczy. Jeżeli nie znamy osoby którą właśnie powitaliśmy to wypada się przedstawić. Nic trudnego: &lt;br /&gt;&lt;br /&gt;"Witam !&lt;br /&gt;Nazywam się Adam i oto jest mój dev blog."&lt;br /&gt;&lt;br /&gt;Teraz robi się gorzej. Trzeba napisać coś z sensem. Tylko o czym ? Powinien być jakiś "abstract".&lt;br /&gt;&lt;br /&gt;"Dev blog, czyli blog developera. Znaczy się, że mam zamiar dzielić się przemyśleniami ze swojego codziennego zajęcia."&lt;br /&gt;&lt;br /&gt;Po streszczeniu przydałoby się coś konkretniejszego, rozwinięcie. Ale jest późno, a ja zamiast nad projektem muszę się ostatnio skupić nad jego ładnym zaprezentowaniu w najbliższy poniedziałek. Sam się wpakowałem w referowanie tematu pracy magisterskiej na następnym seminarium. Ehh, za to mam nadzieje następny referat za szybko mi się nie trafi.&lt;br /&gt;Także na razie musi wystarczyć sam temat "System interaktywnej wizualizacji dynamicznych scen 3d dla potrzeb symulacji komputerowej". Brzmi strasznie dziwacznie, ale coś mi mówi, że "silnik graficzny" nie byłby mile widziany przez profesora.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/658772830218627266-4890164659567113942?l=adamsmigielskidevblog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://adamsmigielskidevblog.blogspot.com/feeds/4890164659567113942/comments/default' title='Komentarze do posta'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=658772830218627266&amp;postID=4890164659567113942' title='Komentarze (0)'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4890164659567113942'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/658772830218627266/posts/default/4890164659567113942'/><link rel='alternate' type='text/html' href='http://adamsmigielskidevblog.blogspot.com/2008/11/pocztki.html' title='Początki'/><author><name>Adam Śmigielski</name><uri>http://www.blogger.com/profile/04112892648302006804</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
