# Zlib i jego interfejs
Tue
28
Aug 2007
Zlib to biblioteka do kompresji danych. Zdawało by się, że jest prosta - jej zasadniczą funkcjonaloność, czyli kompresję albo dekompresję kawałka pamięci wykonuje się używając jednej prostej funkcji. Okazuje się jednak, że poprawne używanie tej funkcji jest nie lada sztuką, a jej objaśnienie wypełnia całkiem niekrótki artykuł (ze względu na różne przypadki szczególne i tak nie do końca). Choć taki a nie inny wygląd tej funkcji ma swoje uzasadnienie w sposobie, w jaki działa, to wg mnie możnaby go podawać jako książkowy przykład jak *nie* należy projektować interfejsu biblioteki.
Jeśli ktoś, zamiast usiłować zrozumieć zasadę działania funkcji inflate i deflate, chce zobaczyć jak obudować te funkcje w wygodne klasy strumieni, może podpatrzeć kod modułu ZlibUtils z mojej biblioteki CommonLib 6.1. Szczegóły:
Comments | #c++ #libraries Share
# Równomierne losowanie punktów z okręgu
Sun
26
Aug 2007
Jak losować punkty należące do okręgu, rozłożone równomiernie? W programowaniu mamy najczęściej dostępny generator liczb o rozkładzie równomiernym. Losowanie punktów z kwadratu jest z jego użyciem napisać prosto. Jak losować punkty z okregu?
Pierwszy pomysł polega na normalnym losowaniu punktów we współrzędnych kartezjańskich z kwadratu opisanego na tym okręgu i odrzucaniu tych, które leżą poza okręgiem. To niefajny pomysł - za dużo niepotrzebnego liczenia.
Drugi pomysł polega na losowaniu punktów we współrzędnych biegunowych - odległości od środka i kąta. To lepsze, ale pojawia się tu jeden kruczek. Losowane w ten sposób punkty mają tendencję do skupiania się w środku, bo dla małych wartości promienia punkty leżą blisko siebie niezależnie, jaki wylosował się kąt - tym bliżej, im mniejszy promień. Jak temu zaradzić?
Prawdopodobieństwo wylosowania danego promienia powinno być nie równomierne, ale propocjonalne do pola koła, które on wyznacza. Ponieważ pole jest zależne od promienia kwadratowo, wystarczy wylosowany promień (w zakresie 0..1, jeszcze przed przeskalowaniem) SPIERWIASTKOWAĆ.
Dla punktów 3D należących do kuli powinno być analogicznie.
Comments | #math #algorithms #rendering Share
# Kupiłem Office 2007
Fri
24
Aug 2007
Kupiłem Office 2007 i was też do tego zachęcam. Dlaczego? Microsoft z okazji jubileuszu 15 lat działalności w Polsce zorganizował promocję. Do kupienia w sklepach komputerowych jest pakiet Office 2007 w wersji polskiej, przeznaczony do użytku niekomercyjnego, który można zainstalować jednocześnie nawet na 3 komputerach. W jego skład wchodzi Word, Excel, PowerPoint i OneNote.
Office 2007 ma - jeśli ktoś jeszcze o tym nie wie - zupełnie nowy, rewolucyjny interfejs użytkownika. Potwierdzam, że jest bardzo wygodny, intuicyjny i użyteczny. Co jeszcze podoba mi się w nowym Office, to rozbudowane motywy do całych dokumentów, nagłówków, tabel i wszelkich elementów. Dzięki nim nawet nie mając talentu graficznego można dobrać ładne kolory, czcionki i inne parametry formatowania.
Warto wydać 200 zł na taki nowy, porządny pakiet biurowy w wersji polskiej. To w końcu mniej, niż kosztuje gra na konsolę. Taką grę przechodzi się w kilkanaście godzin, a Office może służyć całej rodzinie przez długie lata.
Screen z Worda, który sam zrobiłem i w którym chciałem pokazać niektóre nowe możliwości:
Comments | #software #shopping Share
# Ratujmy cenne artykuły
Fri
24
Aug 2007
Nic w Sieci nie jest wieczne - przyznają to nawet ci, dla których cały komputer sprowadza się do okna przeglądarki WWW i najchętniej wszystko robiliby online. Tym bardziej, kiedy z Sieci znika cenny artykuł. Pośród internetowego śmietnika niektóre materiały są bardzo wartościowe. Dwa z nich zachowałem na swoim dysku i zrobiłem ich mirror.
Comments | #literature #teaching #web Share
# Processing
Thu
23
Aug 2007
Processing 1.0 (BETA) - pod tą dziwną nazwą kryje się ciekawa zabawka - prosty język programowania oraz proste IDE, w którym można eksperymentować z grafiką 2D i 3D pisząc efekty, animacje i proste gry. Jest napisane jest w Javie i do Javy kompiluje napisany kod. Sam język też jest podobny do Javy. Pozwala na eksport swojego dzieła do apletu lub aplikacji Java. W porównaniu z Evaldraw wypada moim zdaniem na plus, bo choć wydajność jest dużo gorsza, to całe środowisko jest wygodniejsze w obsłudze, prostsze w użyciu, lepiej dopracowane i lepiej udokumentowane. Oto co udało mi się stworzyć:
Comments | #tools #rendering #java Share
# Stopnie, radiany czy...
Thu
23
Aug 2007
W szkole uczą mierzyć kąt w stopniach. Początkujący programiści kiedy widzą, że funkcje sinus i cosinus przyjmują kąt w radianach, wszędzie piszą coś takiego jak DegToRad(90.0f)
. Potem orientują się, że wcale nie gorszy jest zapis PI/2.0f
i zaczynają używać radianów.
Radiany w przeciwieńswie do stopni mają uzasadnienie matematyczne, ale na dobrą sprawę chyba nie używamy go zbyt często. Dlatego, choć musimy używać radianów, bo na radianach operują funkcje sin, cos, tan czy atan2, to właściwie równie dobrze miara kąta mogłaby być taka, że kąt prosty, półpełny czy pełny wynosiłby 1. Byłoby wygodniej, a niczego by to w programowaniu nie zmieniło.
# BioShock
Tue
21
Aug 2007
Wczoraj ukazało się demo nowej, długo zapowiadanej gry FPP - BioShock. Można je pobrać na przykład stąd: BioShock_PC_Demo.zip. Plik zajmuje 1.85 GB. Po rozpakowaniu trzeba grę zainstalować. Potem jeszcze uaktualnić sterowniki do karty graficznej (u mnie przed aktualizacją gra się wysypywała, aktualizacja pomogła), sprawdzić wymagania sprzętowe (a te są wysokie - dlatego lepiej to zrobić przed ściąganiem pliku :) i już można odpalić demo, by przejść pierwszą mapę.
Naprawdę warto, bo gra jest zrobiona z ogromnym rozmachem, ma klimat (trochę postapokaliptyczny jak w Fallout, ale jednak bardzo oryginalny), ciekawą fabułę, bardzo interesującą mechanikę gry (już w demie można, oprócz strzelania z pistoletu czy karabinu razić prądem i wypuszczać kule ognia) oraz przede wszystkim bardzo, bardzo efektowną grafikę. Wbrew obawom działa całkiem płynnie nawet na jednoprocesorowej maszynie takiej jak moja. Nie gustuję w strzelankach i pełnej wersji zapewne nie kupię, ale demo naprawdę polecam.
# Shadery a sprawa preprocesora
Sun
19
Aug 2007
Fakt nr 1 - shadery warto pisać w HLSL albo innym tego typu języku. Kompilatory generują dobry kod, więc nie ma sensu babrać się w czystym asemblerze. Fakt nr 2 - shaderów potrzeba wiele. Najlepiej, żeby można było generować nowe shadery z różnych kombinacji jakiś swoich ustawień. Niektórzy radzą sobie bez tego, ale ja nie wyobrażam sobie jak. Shadery zastępują przecież niektóre ustawienia renderowania z dawnego nieprogramowalnego potoku i tak też na nie patrzę - jak na własny potok sterowany ustawieniami. Mają przy tym tą zaskakującą na początku nauki cechę, że nie można ich łączyć - na raz może być ustawiony jeden shader, który musi zawierać wszystko, co jest do zrobienia na wierzchołku albo pikselu.
Rozwiązaniem jest dołączenie do gry źródła shadera (np. pliku FX) i jego kompilacja w czasie ładowania albo w czasie samej gry, w razie potrzeby, z odpowiednimi ustawieniami. Jak odwzorować to w kodzie shadera? Opcje są dwie, a nawet trzy.
Ta, która dla mnie odpada natychmiast to skorzystanie z instrukcji warunkowych Static Branching. Po co marnować cenny czas na instrukcje sprawdzania warunku, który zawsze będzie niespełniony, jeśli można wygenerować osobny shader, który danego kodu po prostu nie zawiera?
Opcja pierwsza to wstawienie do kodu dyrektyw warunkowych preprocesora typu #ifdef (OPCJA == 1)
, gdzie OPCJA będzie makrem przekazywanym jako parametr podczas kompilacji shadera.
Opcja druga to wstawienie do kodu warunków typu if (OPCJA == 1)
, gdzie OPCJA również będzie makrem. Obydwa rozwiązania wygenerują równie dobry kod. To drugie wydaje się przy tym bardzie eleganckie.
Niestety ma jedną wadę. O ile fragmenty kodu można objąć w if (OPCJA == 1)
, o tyle czegoś takiego nie można napisać dla pól struktury definiującej dane przekazywane z VS do PS. Tam natomiast muszą występować różne pola, niektóre nieużywane, zależnie od parametrów kompilacji danego shadera. Każde takie pole natomiast, nawet jeśli nieużywane, musi być wypełniane przez VS, choćby samymi zerami (swoją drogą - cóż za bzdura! - to powinno generować ostrzeżenie a nie błąd kompilacji), a to kosztuje dodatkową, niepotrzebną instrukcję w VS.
Toteż pozostaje objąć te nie zawsze wykorzystywane pola struktury w dyrektywy #ifdef
. Skoro przy niektórych wartościach makr w ogóle ich nie będzie, to nie można też ich wtedy używać w kodzie. Tak więc warunki w kodzie też trzeba wtedy objąć w #ifdef
zamiast w if
. Co Należało Dowieść :) Tak też mam zrobione u siebie.
Comments | #rendering #directx Share
# Zdałem FCE :D
Fri
17
Aug 2007
Od dziś mogę się legitymować zdanym egzaminem FCE - First Certificate in English. Otrzymałem ocenę B. To potwierdzenie mojej znajomości języka angielskiego w stopniu wystarczającym nie tylko do "czytania dokumentacji technicznej".
# Sortowanie wg typu
Fri
17
Aug 2007
Mamy wektor wskaźników na obiekty różnych typów dziedziczących ze wspólnej klasy bazowej. Jak posortować go wg typu? Właśnie wymyśliłem, że do porównywania elementów wektora można wtedy użyć takiego uniwersalnego funktora:
template <typename T> struct TypeCompare { bool operator () (const T *o1, const T *o2) { return &typeid(*o1) < &typeid(*o2); } };
Przykładowy program: Sortowanie_wg_typu.cpp.
Comments | #c++ #algorithms Share
# Kultowe książki
Wed
15
Aug 2007
Książki można podzielić na grube i cienkie tudzież dobre i kiepskie. Pośród książek z interesującej nas dziedziny dodatkowo można wyróżnić takie kategorie jak książki na jeden konkretny temat (np. matematyka, fizyka) oraz takie, których autor próbuje kompleksowo i od podstaw nauczyć programowania gier (niektórym nawet się to udaje dzięki dostatecznie dużej objętości książki).
Jest jeszcze kategoria książek - tym ze słowem "Gems" w tytule, które stanowią tak naprawdę zbiór krótkich i niezależnych, ale bardzo wartościowych i na wysokim poziomie artykułów na dany temat. Większość z nich jest wprawdzie niedostępna w Polsce, ich kupowanie za granicą jest drogie, a ściąganie z eMule nielegalne, ale wypada przynajmniej znać kultowe serie takie jak:
Comments | #literature #rendering Share
# Gry a świat rzeczywisty
Tue
14
Aug 2007
To, czego ludzie najbardziej boją się w grach komputerowych, to pomieszanie świata rzeczywistego z grami. Ponieważ ze swoimi fobiami trzeba się oswajać, proponuję obejrzenie amatorskich filmików, które celowo mieszają realia rzeczywiste i wirtualne tworząc tzw. rzeczywistość wzbogaconą (ang. Augmented Reality) w oparciu o gry:
Osoby o nierozwiniętej albo spaczonej psychice nie powinny tego oglądać, a wszyscy oczywiście muszą pamiętać, żeby traktować je z dużym przymróżeniem oka :) Jeśli kogoś mimo wszystko bulwersują, to ma świetną okazję uświadomić sobie absurdalność takich fobii - w końcu to tylko filmiki, a prawdziwe filmy już nie takie rzeczy pokazywały i nikogo to nie dziwi.
Comments | #video #web #humor Share
# Wieści o StarCraft 2
Mon
13
Aug 2007
Dużo się dzieje w kwestii nowych wieści na temat mającego się ukazać w bliżej nieokreślonej przyszłości StarCraft 2. Pojawiają się nowe screeny, filmiki i różne informacje - Blizzard nie szczędzi szczegółów na temat przygotowywanej produkcji. Na szczęście nie muszę zebrać tutaj linków do wszystkich ciekawszych materiałów - systematycznie robi to gemGreg na swoim blogu poświęconym StarCraft 2.
# Obrysowanie modelu
Sun
12
Aug 2007
Drobiazg przydatny do zaznaczania - efekt obrysowania modelu. Do wykonania potrzebny jest model oraz dodatkowy przebieg renderowania przed tym właściwym. W dodatkowym przebiegu kolejno:
To drugie przesunięcie najlepiej chyba wpleść pomiędzy przekształcenie widoku a projekcji.
Ten efekt jest pewnie gdzieś opisany i jakoś mądrze się nazywa, ale ja wymyśliłem go wczoraj i napisałem w RenderMonkey tylko tak na szybko, przy okazji.
# Giertych a gry
Sat
11
Aug 2007
Gra wstępna - materiał TVN, w którym pada pod adresem gier stwierdzenie: "ludzie, którzy myślą, potrafią znaleźć znacznie ciekawsze rozrywki". Zawsze myślałem że TVN to stacja liberalna...
Giertych chce zakazać brutalnych gier komputerowych. Może najpierw niech zakaże brutalnych filmów, a kiedy już upadną wszystkie stancje telewizyjne z wyjątkiem TV Trwam, wtedy dopiero zabierze się za branżę gier? Potem niech jeszcze zabroni muzyki, tańca i będziemy mieli polski Taliban, jak w Afganistanie :)
Minister edukacji stwierdził, że "gry uczą sadyzmu i zachęcają do przemocy, również na tle seksualnym". Ciekawe o którą grę mu chodziło. Jedyna jaka przychodzi mi na myśl to szachy - w końcu tam nie tylko jest wiele przemocy, ale w dodatku bije się konia i posuwa królową :P
Comments | #games #web #politics Share
# Binarny format logowania
Fri
10
Aug 2007
Pisząc coś dużego i działającego nieustannie - np. jakiś serwer - potrzebny jest mechanizm logowania do formatu, który zajmowałby mało miejsca i nadawałby się do prostego, automatycznego przetwarzania. Zwykły format tekstowy moim zdaniem nie spełnia tych wymagań zbyt dobrze.
Dlatego pomyślałem sobie, że gdybym kiedyś coś takiego pisał, zaprojektowałbym format binarny. Plik w takim formacie składałby się z komunikatów, a każdy z nich miałby rodzaj, czas oraz szereg parametrów w postaci "Klucz=Wartość". Zbiór parametrów i typy ich wartości mogłyby być ściśle określone dla każdego rodzaju komunikatu, dzięki czemu możnaby nazw parametrów w ogóle nie zapisywać, a dane wartości zapisywać binarnie - czy to będą liczby, daty, łańcuchy czy dowolne inne dane.
To wszystko oczywiście ma sens tylko pod warunkiem, że zgodzilibyśmy się poświęcić czytelność pliku tekstowego i podglądać logi wyłącznie z poziomu specjalnego narzędzia. Wówczas przykładowy zaprezentowany użytkownikowi komunikat mógłby wyglądać tak:
[2007-08-10 10:03:15] Connection: IP=83.30.195.89, Login="Zbyszek", Result=SUCCESS
# Parsowanie parametrów wiersza poleceń
Thu
09
Aug 2007
Wiele programów, nie tylko konsolowych, akceptuje jakieś parametry wiersza poleceń. Wbrew pozorom zagadnienie nie jest banalnie proste. Zależnie od tego czy program jest konsolowy czy okienkowy, kod wyposażamy w funkcję main lub WinMain. Skutkiem ubocznym jest, że w pierwszym przypadku dostajemy wiersz polecenia już rozłożony na poszczególne parametry (argc, argv), a w drugim przypadku jeden łańcuch ze wszystkimi parametrami.
Ponadto przydatny jest swego rodzaju parser, rozkładający parametry na poszczególne przełączniki i ich ewentualne dane. W Linuksie załatwia to funkcja systemowa getopt, a jej możliwości są imponujące. Nikogo, kto używa tego systemu nie dziwią kombinacje takie jak łączenie opcji typu -cvz
zamiast -c -v -z
czy sklejanie opcji z danymi typu -lpthread
zamiast -l pthread
. W Windowsie polecenia systemowe używają opcji zapisywanych w formie /Opcja
, ale nie ma w systemie mechanizmu do ich parsowania.
Dlatego chciałbym tu pozachwalać moją klasę CmdLineParser, która załatwia wszystkie powyższe problemy. Jej napisanie poprzedziłem dokładnymi badaniami, jak w Windows i w Linux zachowują się parametry wiersza poleceń. Klasa działa zarówno z parametrami funkcji main, jak i WinMain. Akceptuje opcje zarówno w formie Windowsa, jak i Linuksa, zarówno długie jak i krótkie. Jest przy tym prosta w użyciu i przenośna. Wchodzi w skład modułu Base mojej biblioteki CommonLib 6.1. Szczegóły:
Comments | #productions #algorithms Share
# Swobodne drzewo ósemkowe
Tue
07
Aug 2007
Technik podziału przestrzeni jest wiele. Ostatecznie chyba zdecyduję się na drzewo ósemkowe (Octree) + Frustum Culling + Occlusion Query. To powinno wystarczyć do względnie szybkiego działania i być proste do napisania - dużo prostsze niż portale, które planowałem wcześniej.
W "Perełkach programowania gier", tom 1, znajduje się artykuł poświęcony swobodnym drzewom ósemkowym. To dobry sposób na pozbycie się problemu "lepkich płaszczyzn" i tym samym polepszenie działania całej techniki. Polega na rozszerzeniu obszarów obejmowanych przez poszczególne węzły drzewa tak, że nachodzą na siebie. To nachodzenie nie stanowi problemu, a dzięki niemu obiekty przecinające środek węzła mają szanse trafić w całości do jego podwęzłów.
Moją uwagę zwrócił w artykule jeden szczegół. Nie rozumiem otóż, po co zwiększać obszar w kierunku wystającym poza obszar węzła nadrzędnego? Przecież obiekty, które do niego trafiły i tak zawierają się w obszarze węzła nadrzędnego. Dlatego ja zrobiłem to trochę inaczej. Czyżbym się gdzieś pomylił w swoim myśleniu?
Comments | #rendering #algorithms Share
# Układanie map
Mon
06
Aug 2007
Każdy, kto planuje wyświetlać mapy Indoor (wnętrza budynków czy jaskiń) staje przed decyzją, jak układać te mapy. Przeszukując fora można dojść do wniosku, że problem jest powszechny. Z tego, co udało mi się ustalić, wyjścia są takie:
# Dwa przydatne programy
Sun
05
Aug 2007
Moi koledzy napisali ostatnio w C# dwa przydatne programy.
SendFile (autor: Krystian D.) to program do przesyłania plików - coś jak mój pomysł o nazwie JustSendIt. Wyróżnia go fakt, że zarówno nadawca, jak i odbiorca może być za NAT-em, ponieważ transmisja odbywa się za pośrednictwem... skryptu PHP umieszczonego na wybranym koncie WWW.
ScreenUp (autor: Spax) służy do łapania zrzutów ekranu. Wyróżnia go fakt, że program działa w tle, reaguje na wciśnięcie klawisza zbierając kolejne zrzuty, a potem pozwala łatwo wysłać je na serwer i otrzymać adres URL do screenów udostępnionych już w Sieci.
Comments | #tools #warsztat Share
# Rozwiązania dla relacji zawierania
Sat
04
Aug 2007
Innym problemem projektowym jest realizacja wszelkiego rodzaju kontenerów przechowujących jakieś elementy, np. Scena przechowuje Encje, Światła, Materiały, Manager Zasobów przechowuje Zasoby itp.
Autor diagramu: Xion
# BlizzCon
Sat
04
Aug 2007
Trwa właśnie BlizzCon - konferencja firmy Blizzard. Warto śledzić stronę, chociażby żeby zobaczyć galerię zdjęć, kiedy już się pojawi.
# Problem silnika
Fri
03
Aug 2007
Kiedy człowiek uczy się Direct3D, wszystko wydaje się takie proste. Kiedy chce przejść na wyższy poziom abstrakcji, wszystko się komplikuje. Chciałoby się zamknąć abstrakcyjne pojęcia w eleganckie klasy, ale w końcu ich dane muszą się spotkać w jednym miejscu, aby ustawić (w moim przypadku także skompilować) odpowiedni shader, jego stałe oraz inne ustawienia Direct3D. Te dane pochodzą z różnych miejsc:
Jak to zrealizować w kodzie? U siebie dotychczas miałem tak, że kompletowana była struktura RENDER_DESC. To do obiektu trafiały pozostałe dane, a obiekt dodawał swoje dane i wysyłał strukturę do obiektu klasy ShaderManager. W Sieci znalazłem z kolei taki pomysł, w którym to materiał dostaje dane, uzupełnia je swoimi i wysyła do ustawienia. No i co tu zrobić? :)
# Czy może być w pełni dynamiczne oświetlenie Indoor?
Fri
03
Aug 2007
Doszedłem ostatnio do wniosku, że implementacja oświetlenia nie jest taka prosta, jak się spodziewałem. Do przestrzeni otwartych (Outdoor) jedno światło kierunkowe wystarczy, ale nie bardzo wyobrażam sobie, jak można oświetlić wraz z cieniami mapę Indoor - w której jest przecież zawsze wiele świateł - dynamicznie i żeby to nadal działało ze znośną predkością. Nawet jeśli nie dynamicznie (wcale mi na tym nie zależy), to jak? Nie interesowałem się dotychczas dokładnie Lightmapami. Kto może pomóc i udzielić jakiejś odpowiedzi, zapraszam do mojego wątku na forum.
# Mam błąd, ale to nie moja wina!
Thu
02
Aug 2007
Błędy nękają wszystkich programujących. Mówi się, że "nie robi błędów tylko ten, kto nic nie kodzi". Pytaniem zadawanym wciąz przez wszystkich programistów jest "dlaczego to nie działa", a w wersji dla programistów gier często także "dlaczego nic nie widać". Błąd można znaleźć szybciej albo po długich poszukiwaniach i każdemu chyba zdarza się od czasu do czasu oskarżać o złe działanie nawet Bogu ducha winny kompilator.
Ale spotkałem w swoim życiu pewną nieliczną, niezwykłą grupę ludzi, którzy kiedy mają błąd, wcale nie starają się go znaleźć - co najwyżej tylko im się wydaje, że go szukają. W zamian cały swój wysiłek i czas wkładają w udowadnianie sobie i wszystkim naokoło, że jednak swój kod napisali dobrze, wszystko zrobili tak jak trzeba itd. Winę za błąd ponosi zwykle kompilator/środowisko/biblioteka albo w ogóle bliżej niezdefiniowana siła wyższa. Za to oni poszukując go wciąż od nowa analizują właśnie ten fragment kodu, w którym błędu na pewno nie ma, jeszcze bardziej utwierdzając się tym samym w swoim przekonaniu o niewinności. Tylko czy to im coś daje?
Jeśli zwykłe nieradzenie sobie z prostymi błędami i przychodzenie z nimi na forum celem pokazania kodu - aby inni go przeanalizowali - nazywa się lamerstwem, to jak nazwać to osobliwe zjawisko? :)