Edukacja - Studia
Praca magisterska - silnik do gier ( 2006 / 2007 )

Technicznie mocno niedoskonały (w dzisiejszych kategoriach) i bez dużej części funkcjonaności, która zbliżyłaby go do sensownego wykorzystania (eksportery, edytor, optymalizacja), ale mimo to nadawał się do zrobienia kilku ciekawych demek. W chwili pisania był to mój największy projekt i jestem z niego bardzo zadowolony, bo wiele się przy nim nauczyłem (i jak się po latach okazało - sam wymyśliłem sposób na realizację oświetlenia, który później - oczywiście dużo lepiej technicznie - został zaimplementowany np. w CryEngine3 (light pre-pass renderer) )

  • Zmodyfikowany forward renderer. Każda kombinacja obiekt-światło oblicza oświetlenie i dodaje wyniki do bufora oświetlenia. Na samym końcu jeszcze raz rysują się wszystkie obiekty, z tym że oświetlenie biorą z wcześniejszego przebiegu (coś jak niedoskonały light prepass renderer z CryEngine3).
  • Dowolna ilość dowolnych świateł z cieniami (kierunkowe, punktowe). Prosty PCF dla uzyskania gładkich cieni.
  • System materiałów mający spore możliwości. Automatyczne renderowanie luster. Efekt wody (załamanie i odbicie światła). Animowana roślinność. Parallax mapping. Próby stworzenia efektu przechodzenia światła przez np liście (średnio udane). Glow od jasnych powierzchni i speculara.
  • Wielowarstwowy teren. Dowolna ilość warstw, z których każda może mieć inny materiał.
  • Symulacja wody całkowicie na karcie graficznej.
  • Automatyczny podsystem serializujący dowolny stan silnika (przynajmniej tych komponentów, które tę funkcję obsługiwały) z uwzględnieniem referencji do innych obiektów.
Ponieważ użyłem wiele nie swoich assetów, do pobrania jest tylko dokumentacja i kod źródłowy: Dokumentacja (PDF), Prezentacja, Kod źródłowy

Screenshoty. WIĘCEJ...

Studia - programy na zajęcia

Większość tych programów jest napisana w C++. Czasami są domieszki innych języków - np Prolog - na ćwiczenia z programowania w tym języku, lub assembler - gdy pisałem własny prosty system operacyjny, lub również na zajęcia z tego języka. Jeśli program ma GUI to używałem biblioteki Borland C++ OWL (wczesne lata studiów) lub MFC (późniejsze).
Poniżej zamieszczam listę wszystkich projektów (latami wstecz). Niektóre są ambitne, ale są również projekty typu "na zaliczenie". Kilka projektów pisałem z kolegami, wtedy wyraźnie zaznaczam, która część jest moja.
Do pobrania udostępniłem tylko to co może się wg mnie komuś przydać (ale ogólnie mam źródła wszystkich projektów).

Rok V
Demo graficzne (rok V - Modelowanie dla potrzeb grafiki)

Program generuje krajobraz na podstawie pliku z jego opisem. Po wygenerowanym krajobrazie można się poruszać. Przyznam, że niezbyt ciekawe.

Sieci wyst. w świecie rzeczywistym (rok V - Modelowanie rzeczywistości)

Referat na temat sieci występujących w rzeczywistym świecie (scale-free, small-world). Dość krótki ale solidnie napisany, więc może się przydać jako wprowadzenie do tematu. Zajął mi dużo więcej czasu niż nie jeden program napisany na inne zajęcia (masa literatury do przeczytania i zrozumienia).

Debugger i przykładowa implementacja algorytmu RIPPER (rok V - Uczenie maszynowe)

Implementacja oraz wizualizacja działania algorytmu RIPPER. Algorytm tworzy zbiór reguł separujących zadaną klasę ze zbioru danych. Algorytm można uruchamiać krokowo i podglądać wartości zmiennych - działa wtedy dokładnie tak jak debugger (tylko nie można zmieniać wartości zmiennych). Algorytm wykonuje się w osobnym wątku. Mechanizm jest uniwersalny więc "łatwo" np. zrobić wizualizację innego algorytmu.

Integracja modelu w TAU (UML) z C++ (rok V - Systemy czasu rzeczywistego)

Integracja zewnętrznego środowiska z modelem TAU (narzędzie do projektowania systemów czasu rzeczywistego). Może się komuś przyda :) Projekt podniósł bardzo umiejętności projektowania w UML. Na sucho nie jest to trudne, ale jesli na podstwie projektu UML generuje się automatycznie kod, który ma działać to już nie jest takie proste, i nawet najdrobniejsze niuanse mają duże znaczenie.

Demo graficzne
Debugger i przykładowa implementacja algorytmu RIPPER

Do pobrania:
Integracja modelu w TAU (UML) z C++
Sieci występujące w świecie rzeczywistym - referat

Rok IV
Rozpoznawanie obrazów (rok IV - Metody rozpoznawania obrazów)

Prosty program wykorzystujący sieć neuronową do rozpoznawania obrazów. Użyłem darmowej biblioteki do obsługi sieci neuronowych FANN. Program nie posiada żadnej funkcji selekcji wartościowych fragmentów obrazu i ich odpwoiedniej transformacji (np bardzo istotne przy rozpoznawaniu twarzy z różnych ujęć/pozycji), jedynie prosto używa sieci neuronowej na całym obrazie.

Framework do obliczeń genetycznych (rok IV - Technologie komponentowe)

Środowisko do symulowania algorytmów genetycznych. Algorytm kompletuje się z komponentów, z których każdy może być osobną biblioteką DLL (pluginem). Komponenty mogą działać na dowolnych typach osobników, również definiowanych w pluginach. Istnieją też komponenty odpowiedzialne za wizualizację populacji i środowiska. Algorytm można uruchamiać krokowo, oraz ciągle z wizualizacją w czasie rzeczywistym (obliczenia odbywają się na innym wątku). Całość bardzo ciekawa, mimo że program zdecydowanie nie jest dokończony.

Demo graficzne (rok IV - Animacja komputerowa)

Krajobraz podwodny, po którym można się poruszać.


Rozpoznawanie obrazówr
Framework do obliczeń genetycznych
Framework do obliczeń genetycznych
Demo graficzne
Rok III
Przepływ w sieciach (rok III - Badania operacyjne)

Program do obliczania maksymalnego przepływu w sieciach. W programie można tworzyć sieci (edytować, zapisywać i odczytywać). Zaimplementowane są tylko 2 algorytmy liczenia.
Ja jestem autorem tylko programu pozwalającego na edycję sieci. Algorytmy zaimplementowali koledzy.

Funkcje graficzne w asemblerze (rok III - Asemblery)

Kilka funkcji graficznych napisanych w asemblerze wraz z demonstracją ich działania. Między innymi: linie, trójkąty wypełnione, okręgi i obrazki wczytane z plików. Funkcje obsługują też przeźroczystość.

Chromatron (rok III - Teoria obliczeń i złożoności obliczeniowej

Program rozwiązjący plansze z gry chromatron (w google łatwo znaleźć).
Program zajął pierwsze miejsce (razem z innym programem) w 180 osobowej grupie studentów (rozwiązując 10 z 11 zadań w wyznaczonym czasie).

GaduGadu (rok III - Systemy rozproszone)

Proste gadu-gadu. Na całość składa się program klienta, serwer oraz prosty serwer proxy dla HTTP. Ten ostatni został napisany, ponieważ wymagana była komunikacja z włączoną zaporą (choć nigdy nie sprawdzałem działania w rzeczywistych warunkach, ale komunikacja po HTTP przez proxy działała dobrze).
Po stronie klienta można było dodawać znajomych, wysyłać do nich wiadomości, oraz dowolną ilość plików o dowolnych rozmiarach (dot. zarówno odbierania jak i wysyłania).
Komunikacja odbywa się przez: TCP, CORBA, CORBA-SSL, Chilkat-SSL i HTTP. Transmisja plików przez: TCP, TCP-SSL
Serwer nasłuchuje na wszystkich (CORBA-SSL i TCP-SSL nie chciały mi działać razem) a klient wybiera protoków przy starcie. Wszystkie protokoły działąją w swoich osobnych wątkach. Wszędzie w TCP i TCP-SSL użyte zostały sokety nieblokujące (z wyjątkiem implementacji HTTP, gdzie dla prostoty użyłem blokujących).

Wizualizacja obliczeń (rok III - Obliczenia równoległe)

Program wizualizuje w czasie rzeczywistym obliczenia prowadzone na maszynie równoległej. Komunikacja odbywa się przez TCP.
Ja jestem autorem tylko tej wizualizacji. Program do obliczeń równoległych (czyli tą trudniejszą część) napisał kolega.

Interaktywna encyklopedia (rok III - Technika mikroprocesorowa)

Encyklopedia techniki cyfrowej. Można dodawać swoje lekcje (napisane w prostym języku o składni podobnej do HTML). Program je interpretuje i wyświetla. W lekcjach można osadzać układy cyfrowe projektowane w "edytorze".
Kod liczący stany potrafi radzić sobie ze sprzężeniami zwrotnymi (potrzebne choćby do zasymulowania najprostszego przerzutnika asynchronicznego). Można zmieniać wejściowe stany, jak i dodawać na wejście specjalne kostki generujące przebiegi prostokątne i obserwować jak zmieniają się stany na wyjściu układu oraz w dowolnej jego części (białym kolorem są zaznaczone linie na których jest stan "1"). Całość działa w czasie rzeczywistym i jest w pełni interaktywna.
Dużą wadą projektu jest poziom jego ukończenia. Wprawdzie wszystko działa - ale używanie programu (zwłaszcza edytora) mogłoby być o wiele lepsze...

Demo graficzne (rok III - Grafika komputerowa)

Zbiór kilku demek graficznych. Trzy w OpenGL, reszta (ok 10) w DirectX 8.0. Demka w DirectX to ciąg jednego projektu w kolejnych fazach rozwoju. Ostatnie demko to krajobraz bazy kosmicznej. Użyte zostały proste shadery w asemblerze, symulacja wody na CPU, proste cienie od chmur oraz bardzo proste animacje.
Wszystkie modele są mojego autorstwa (robiłem je w Blenderze). Natomiast tekstury, w sporej większości są stworzone na bazie tych z gry quake3.

Tworzenie cząstek z podanych atomów (rok III - Prolog)

Projekt składa się z dwóch części: wizualizacji i programu w prologu liczącego cząsteczki jakie można poskładać z podanych atomów.

Modyfikacja planisty w jądrze linuxa (rok IV - Programowanie systemowe)

Modyfikacja jądra linuxa (Fedora Core 2.6). Projekt polegał na zmodyfikowaniu algorytmów odpowiedzialnych za planowanie przydziału czasu procesora dla wątków i procesów. Żadnego zaawansowanego algorytmu nie udało się zaimplementować. Jednak z powodzeniem udało się wprowadzić zmiany które były wyraźnie widoczne podczas pracy systemu (i sterowalne przez proste API). Komunikacja z własnym kodem odbywa się przez standardowe funkcje jądra z dodatkowym znaczeniem niektórych parametrów.

Przepływ w sieciach
Funkcje graficzne w asemblerze
Chromatron
Chromatron


Wizualizacja obliczeń
Interaktywna encyklopedia
Interaktywna encyklopedia
Demo graficzne

Tworzenie cząstek z podanych atomów

Do pobrania:
Modyfikacja planisty w jądrze linuxa

Rok II
Własny system operacyjny (rok II - Systemy operacyjne)

Wynik moich zainteresowań systemami operacyjnymi. System jest 16 bitowy. Startuje z dyskietki i obsługuje tylko 12 bitowy FAT dla dyskietek.
Sam system to jeden plik wynikowy *.com oraz krótki kod w sektorze startowym, który go wczytuje. Komunikacja z systemem odbywa się przez przerwania. W linii komend zaimplementowałem jedenie kilka podstawowych poleceń typu: zmiana katalogu, wylistowanie plików, uruchomienie programu. Napisałem tylko jeden przykładowy program - bardzo prostą grę (grafika 320x200), w której nawet nie ma liczenia punktów...

Ćwiczenia (rok II - Metody obliczeniowe)

Program na ćwiczenia. W programie zaimplementowane są różne algorytmy (np. interpolacja, aproksymacja, funkcje sklejane, rozw. układów równań, równania różniczkowe) wraz z wizualizacją ich działania, a także możliwością zmieniania różnych parametrów i podgląd wpływu tych zmian na działanie algorytmów.

Symulacja powierzchni wody (rok II - Metody obliczeniowe)

Program końcowy z labolatorium: Interaktywna symulacja powierzchni wody. Identyczną metodę zastosowałem późnieh do symulacji wody w mojej pracy magisterskiej, z tym że tam wszystkie obliczenia były wykonywane przez kartę graficzną

Ćwiczenia
Ćwiczenia
Symulacja powierzchni wody
Symulacja powierzchni wody

Do pobrania:
Własny system operacyjny

Rok I
Parser (rok I - Algorytmy i struktury danych)

Program parsuje wpisane wyrażenie, tworzy zapis w odwrotnej notacji polskiej, rysuje dla niego drzewko oraz oblicza jego wartość. W przypadku błędnego wyrażenia informuje o błędzie.
Obsługuje prawie wszystkie operatory języka C++ oraz zmienne.

Szkoła średnia i wcześniej
Praca dyplomowa - Nauka programowania ( 2001 )

Jest to mój pierwszy program pod Windows :)
Wspomaga on naukę programowania w językach Pascal i C++. Interpretuje i wyświetla lekcje napisane w specjalnym języku (podobnym do HTML). Język ten umożliwa m.in. formatowanie tekstu, wstawianie obrazków, tabel, oraz specjalnych elementów do kodu i ćwiczeń, które zawierają przyciski (odpowiednio uruchamiają skompilowany kod przykładowego programu, i wyświetlają przykładowe rozwiązanie ćwiczenia).

Screenshoty

Programy
Testy na przedmiot PO.

Program napisany dla kolegi. Wyświetla zadaną ilość pytań i na podstawie ilości prawidłowych odpowiedzi wystawia ocenę. Plik danych z pytaniami przygotował kolega. Napisany przy użyciu, którejś z kolei biblioteki graficznej - tutaj pozwalającej obsługiwać tryb SVGA.

Program wspomagający naukę elektrotechniki.

Program dla kolegi. Interaktywnie (proste aniamacje) pokazywał wykresy różnych układów co ułatwiało ich zrozumienie.

Edytor do gry Paranoid.

Program pisałem już na studiach. Moja przyszła żona lubiła grać w tą grę, stąd zająłem się edytorem poziomów do niej.
Jest to druga (i ostatnia na razie) gra, którą zhakowałem grzebiąc po jej zdeasemblowanym kodzie. Wgląd w kod oraz kilka prób pozwoliło mi odszyfrować format plików z zapisanymi planszami do gry (był zaszyfrowany prostym szyfrem) i dalej napisałem sobie prosty edytor plansz. Wcześniej udało mi się uzyskać nieśmiertelność w małej grze (wersja fanowska na PC) 'river raid' (zamiana rozkazu dec na nop). Obie gry to nieduże pliki *.com, więc analiza ich kodu nie była wyjątkowo trudna (a wtedy byłem bardzo na bieżąco z przerwaniami DOSa, asemblerem, i miałem za sobą pierwsze podejścia do swojego systemu operacyjnego).

Testy na przedmiot PO
Program wsp naukę elektrotechniki
Edytor do gry Paranoid
Moje gry :)
Moje wczesne programowanie - wszystkie programy powstały w czasach szkoły średniej i podstawówki, a więc już ponad 10 lat temu.
Proszę o wyrozumiałość. W porównaniu do moich ostatnich programów te gierki są w większości śmieszne - jednak mają dla mnie znaczenie sentymentalne, dlatego wszystkie je zamieszczam :)
W zasadze każda następna gra pisana była aby przetestować w praktyce kolejną generację biblioteki graficznej (ew w ramach przesiadki na c++). I tak zaczęło się od BGI w Pascalu, poprzez tryb 320x200 pisany w Pascalu, potem niemal wszystkie funkcje w asemblerze. Następnie tryb stronicowy, dzięki czemu możliwa była rozdzielczość np. 320x240. Potem tryby SVGA z bankami pamięci i tryby z większą ilością kolorów. Na końcu doszła obsługa pamięci EMS (napisanie funkcji w asemblerze do wyświetlania skompresowanego obrazka (prosty PCX) znajdującego się w stronach pamięci EMS w trybie SVGA z bankami to był prawdziwy koszmar - dziś główna część takiej funkcji byłaby już w c++ ;) ). Na końcu jedna gra pod Windows, ale i tak rysowanie było 'po staremu' do bufora, i dopiero potem kopiowane do okna.
Bitwa o Atlantydę

Prosta gra strategiczna wzorowana na Risk (a dokładniej starej grze Battle for Atlantis). Komputer całkiem dobrze myśli i potrafi ograć mniej wprawionych graczy :) Na 5 poziomie trudności komputer nie oszukuje (jedynie częściej atakuje gracza) i początkowe rozstawienie wszystkich graczy jest w miarę równe.
Cała grafika rysowana jest do bufora w pamięci i z tamtąd kopiowana potem na ekran. Grę napisałem pod koniec wakacji tuż przed studiami.

Do pobrania:Atlantis

Angielski

Bardzo prosta gra słowna wspomagająca naukę języka angielskiego.

Paski

Następna gra (po NFS) napisana w ramach przesiadki z Pascala na C++. Miałem w pamięci grę tego typu ze starych gier telewizyjnych, i stąd taki pomysł.

NFS 15

Bardzo prymitywna gra, która została napisana w ramach przesiadki z Pascala na C++ (wiadomo że najlepiej uczyć się praktycznie :). Sama gra jest wprawdzie prosta, ale przeniesienie wszystkich bibliotek pascalowych (włącznie z grafiką) było dobrą lekcją c++.

Bitwa o Atlantydę
Angielski
Paski
NFS 15

Korki 2

Druga część gry - powstała gdy wraz z sąsiadem z nudów zaczęliśmy 'coś tworzyć' w wakacje, a później w 3 dni ją skończyłem (brat narysował obrazek końcowy). Mimo prostoty dość grywalna.
Używa biblioteki graficznej obsługującej tryby SVGA i pamięć EMS do przechowywania dużych obrazków (od tego czasu również następne gry).

Korki

Gra powstała w jeden wieczór specjalnie na lekcje informatyki w szkole średniej (chyba obiecałem kolegom).

Piętnastka

Kolejna gra :) Wersja elektroniczna prostej gy logicznej - piętnastka.
Tryb 320x200. Niemal wszystkie funkcje graficzne w asemblerze.

Korki 2
Korki 2
Korki
Piętnastka

Tetris

Moja 2 gra - bardzo udana i grywalna.
Tryb 320x200. Własna biblioteka graficzna (wszystkie natępne gry używały kolejnych wersji własnych bibliotek).

Wieża w Hanoi

Moja pierwsza gra :) 1996 rok, chyba 7 klasa podstawówki (tak samo kolejna gra tetris). Pomysł zaczerpnięty z opowiadania matematycznego.

Tetris
Tetris
Wieża w Hanoi

.