Autor Wątek: Engine Quake 3 Arena  (Przeczytany 18673 razy)

Offline arcotexas

  • Użytkownik
    • Texas Homepage

# Sierpień 27, 2006, 12:41:02
Witam
Ok kilku miesięcy czytam kody Q3 i na ich temat wiem coraz więcej. Praktycznie większość kodów gry mam przerobionych. Został mi tylko Radiant i q3map. Niestety bardzo dużo tam jest różnych przeliczeń i trick'ów programistycznych, więc ich przerabianie jest trochę czaschłonne. Jeśli ktoś mógłby mi pomóc mogę przekazać efekt mojej pracy, a wieć wytłumaczone funkcje wraz z komentarzami przy większości linijek oraz z własnym opisem tricków lub bardziej złożonych algorytmów. Moim zamiarem jest napisanie szeregu artykułów opisujących różne aspekty tego engine'a. Na różnych forach czytałem wiele opinii na temat tych kodów źródłowych i przeważało zdanie, że są zbyt archaiczne i napisane w ciężkiej do zrozumienia formie. Osobiście uważam, że kod jest napisany w wspaniałym stylu, zawiera mnóstwo ciekawych rozwiązań i czyta się go jak prawdziwą biblię. Wiele kontrowersji budzą drzewa BSP, które uważane są za archaiczne rozwiązanie. Przecież nikt nie każe pisać Q3 a jedynie wzorować się na nim w niektórych aspektach. Pisanie engine'a z książek lub w oparciu o tutoriale to tak jakbyśmy odkrywali ponownie koło. Zachęcam osoby, które na prawdę chcą pojąć przynajmniej odrobinę wiedzy wspaniałych guru programowania gier. Napisanie dobrego engine'a bez takiej wiedzy jest możliwe aczkolwiek trudne. Wszelkie osoby zainteresowane przerabianiem reszty kodów Q3 proszę o kontakt email: arcotexas@o2.pl a pozostałe niech piszą na tym forum.
Pozdrawiam

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline orzech

  • Użytkownik
    • homepage

# Sierpień 27, 2006, 13:42:11
Podziwiam Twój zapał i dociekliwość. :) Osobiście nie jestem w stanie podjąć się kontynuacji Twojego dzieła, jednakże chętnie zobaczę dotychczasowe efekty. Jeżeli jest taka możliwość oczywiście. ;)

Trzymam kciuki

Offline nameczanin

  • Użytkownik
    • devlog

# Sierpień 27, 2006, 14:17:45
mam inne cele w zyciu, ale pomysl podoba mi sie w nadmiar. Sam kiedys zaczalem analizowac kod zrodlowy q1, q2, q3. To COS napisane w C robilo na mnie kapitalne wrazenie. Powodzenia!

maxest

  • Gość
# Sierpień 28, 2006, 02:01:46
swoja droga to nie rozumiem czemu ludzie sie tak podniecaja i nie moga uwierzyc ze "cos" jest napisane w C a nie w C++ :) przeciez jak sie dobrze strukturalnie i modularnie napisze projekt w C to kod rowniez bedzie ladny i przejrzysty, na dodatek nie tak skomplikowany jak w C++ ;) bo nie da sie ukryc ze C++ w porownaniu z C to znacznie trudniejszy jezyk

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Sierpień 28, 2006, 09:09:59
Trudniejszy? Nie ma czegoś takiego, jak trudniejszy język (no, może oprócz Malbolge ;) ), są tylko łatwiejsze i trudniejsze projekty. Na pewno trudniej byłoby napisać Quake'a w (podobno łatwym) C#, niż tetrisa w C++ :).

Offline kubagert

  • Użytkownik

# Sierpień 28, 2006, 12:23:37
Cytuj
Moim zamiarem jest napisanie szeregu artykułów opisujących różne aspekty tego engine'a.
A czy juz masz na tyle wiadomosci by takie artykuly napisac? Analizujesz tylko grafiek czy calosc (siec, dzwiek, boty).
Byc moze jakby sukcesywnie pisac artykuly i udostepniac je, przyspieszyloby to Twoje prace (trudniej jest sie wgryzc w projekt ktorego sie nie zna, niz przeczytac kilka artykulow jak jest np zbudowany, i samemu rozpracowac jedno zagadnienie), lub komus pomogly w dokonczeniu swoich produkcji nad ktorymi aktualnie pracuja (bo na pewno tacy na forum sa, i nie mowie o sobie :D )

Kilka miesiecy ktore spedziles przy czytaniu kodow to kawal czasu, szkoda zeby sie zmarnowal np przez brak dalszego zapalu (chyba ze jego poklady sa ogromne ;) )

Pozdrawiam i zycze dalszych sukcesow w analizowaniu
kubagert

maxest

  • Gość
# Sierpień 28, 2006, 13:36:06
znow lekki OT...

Cytuj
Trudniejszy? Nie ma czegoś takiego, jak trudniejszy język
dla mnie jest :) i do takiej ceny porownuje "wbudowane" mozliwosci danego jezyka. np. C juz na starcie wysiada przy C++ ktory ma juz w standardzie STLa, a ktory sam w sobie jest juz ogromny :)

Offline Riddlemaster

  • Użytkownik
    • Moja strona domowa

# Sierpień 28, 2006, 13:54:54
Ja też uważam, że jest coś takiego jak trudniejszy język. C++ do łatwych nie należy (wystarczy porównać liczbę słów kluczowych i składnię, która przez olbrzymie możliwości C++ w niektórych przypadkach jest naprawdę zawiła).

Offline Złośliwiec

  • Użytkownik
    • Dark Cult

# Sierpień 28, 2006, 14:34:59
Ja też uważam, że jest coś takiego jak trudniejszy język. C++ do łatwych nie należy (wystarczy porównać liczbę słów kluczowych i składnię, która przez olbrzymie możliwości C++ w niektórych przypadkach jest naprawdę zawiła).

C++ daje po prostu większe możliwości, nikogo nie zmuszając do używania zawiłości składni charakterystycznych dla tego języka (np. szablony, przestrzenie nazw) ani też dodatkowych słów kluczowych. Zaś wspomniana obecność STL daje mu ogromną przewagę nad C, jeśli chodzi o możliwości "gołego" języka. Ogólnie więc każdy język ma swoje mocne i słabe strony pod względem "łatwości i trudności", dlatego właśnie sądzę że nie ma języków trudnych "z definicji".

//EDIT:
Offtopu koniec :).

Offline arcotexas

  • Użytkownik
    • Texas Homepage

# Sierpień 29, 2006, 12:23:41
Witam
Podzieliłem odpowiedzi na punkty, bo jak zwykle dużo piszę i może ktoś się zniechęcić w czytaniu:

#1 c++ to trudny  język
Nie chodziło mi o to, czy język c czy c++ jest trudny, tylko o to że programiści z ID Software używają różnych tricków, które czasem ciężko jest zrozumieć np w poniższej linii:
if ( mask && (!(mask[cluster>>3] & (1<<(cluster&7)) ) ) )
return qfalse;
Ten kawałek kodu sprawdza czy drzwi są otwarte  ;D Nie jest to nic specjalnego w porównaniu z innymi kodami np Unreala, ale czasem sprawia trudność.

#2 w jakim zakresie przerobiłem grę?
Generalnie całą grę (plik exe wraz z cgame.dll, game.dll, q3_ui.dll) przerabiam jako całość tzn poszukuje związków pomiędzy modułami. Tylko w taki sposób można się w nich połapać. Z kodów usunąłem boty, bo akurat one nie są potrzebne do zrozumienia całej gry. Ponadto usunąłem wiele funkcji, które nie były wogóle używane lub były zbędne i zawiłe dla czytającego a nie były kluczowe. Przerabiam prawie wszystko od grafiki OpenGL'a, obsługi serwera, komunikacji sieciowej, efektów graficznych, drzew BSP. Na razie pomijam tylko dźwięk, gdyż jego analiza jest trudna i wogóle można go inaczej zaimplementować.

#3 w jaki sposób przerabiam?
1. dodałem komentarze do każdej funkcji oraz nad każdą ważną linijką kodu.
2. dodałem w bardziej rozbudowanych funkcjach kroki algorytmu oraz znaczenie przekazywanych argumentów do funkcji.
3. debugowałem niektóre elementy gry i dodałem opis tego co zaobserwowałem.
4. usuwam wszystko co niepotrzebne lub zbędne, żeby szybciej można było wszystko zrozumieć

#4 moje zamierzenia
Chcę zrobić pełną otwartą bazę kodu gry 3D z której każdy może coś wyjąć i wykorzystać w swoich projektach. Żeby móc pisać artykuły trzeba przerobić cały kod. Do tego zmierzam i już mam kilka rozpoczętych artykułów. Mam nadzieję, że znajdą się osoby, które mi w tym pomogą. Kody umieszczę jeszcze dzisiaj na swojej stronie www.arcotexas.host.sk (w razie problemów z transferem piszcie na arcotexas@o2.pl) Zachęcam do obejrzenia tego co zrobiłem, jeśli to za mało to trudno, starałem się  ;) I tak się nie zniechęce bo za daleko już zaszłem.

#5 kilka słów na temat BSP i archaiczności kodu
Uważam, że warto poznać BSP, gdyż jest to dalej dobre rozwiązanie w pomieszczeniach zamkniętych. A ponadto jest to już sprawdzona metoda przyspieszenia wyświetlania grafiki, która w większości niekomercyjnych projektach jest wystarczająca.
Wiele osób mówi, że te źródła są już przestarzałe. Tak nie jest, bo matematyka się nie starzeje, rozwiązania niektórych algorytmów także nie, OpenGL nie zmienił swojej składni (jedynie ulepszył niektóre rzeczy), nie zmienił się sposób w jaki działa cała gra. Jedyne co się zmieniło to efekty graficzne (które można ulepszyć) oraz efekty w grze (również możliwe a nawet wskazane do ulepszenia). Udostępnienie kodów przez ID dało możliwość zobaczenia jak bardzo rozbudowane są komercyjne projekty, jak daleko z tył jesteśmy. Ale można przynajmniej dojść do tego poziomu. Nie możemy tego robić na siłę. W końcu piszemy dla przyjemności i własnej satysfakcji  ;)
Pozdrawiam  :)

Offline nameczanin

  • Użytkownik
    • devlog

# Sierpień 29, 2006, 17:23:41
jak rozrozniasz "efekty graficzne" oraz "efekty w grze"?

Offline arcotexas

  • Użytkownik
    • Texas Homepage

# Sierpień 29, 2006, 19:25:15
jak rozrozniasz "efekty graficzne" oraz "efekty w grze"?
efekty graficzne: wybuchy, flary, odbicie lustrzane, błyski z lufy
efekty w grze: wyrzutnie graczy, windy, ukryte przejścia, teleporty

Offline Kamil Trzciński

  • Użytkownik

# Sierpień 29, 2006, 23:37:56
pomysl fajny, ale z tego co przejrzalem to mi bardziej wyglada na przetlumaczenie angielskich komentarzy na polskie :)

Offline snakeo

  • Użytkownik

# Sierpień 30, 2006, 00:15:11
Trudniejszy? Nie ma czegoś takiego, jak trudniejszy język (no, może oprócz Malbolge ;) ), są tylko łatwiejsze i trudniejsze projekty. Na pewno trudniej byłoby napisać Quake'a w (podobno łatwym) C#, niż tetrisa w C++ :).
Ale pisanie tetrisa w C++ i C to moim zdaniem niewielka roznica, mozna napisac go w C i pod C++ tez sie skompiluje :D :D :D  8) ;D

Offline arcotexas

  • Użytkownik
    • Texas Homepage

# Sierpień 30, 2006, 10:44:50
Hmm... a jest gdzies tam opisane jak ten engine wogole dziala, za co sa odpowiedzialne moduly, co, gdzie, dlaczego i w jakiej kolejnosci jest wywolywane? Bo komentarze typu to mozna wygenerowac z kodu, a ja chcialbym sie dowiedziec jak ten engine jest zorganizowany bez przekopywania sie przez milion linii kodu zrodlowego. Jest gdzies cos w stylu

Mam zamiar wyrysować cały schemat, może nawet w postaci algorytmu opisujący cały proces gry. Jak na razie to zrobiłem tylko dla siebie poglądowy schemat procesu renderowania. http://www.arcotexas.host.sk/q3render.jpg (gdyby się nie pojawił to trzeba odświeżać, bo ten serwer jest taki głupawy) Schemat był tworzony na własny użytek i nie ma żadnego opisu. Chyba, że ktoś z Was jest dobry w tworzeniu schematów np w Visio to byłbym wdzięczny.

PS. Nie traktuj tego jako zarzutow - ja naprawde chcialbym dostac odpowiedzi na te pytania
Ja się nie gniewam, wręcz przeciwnie jestem bardzo wdzięczny  ;) Widzę, że interesujesz się tym i na prawdę wiesz o co mi chodzi. Bardzo dobrze, że sięgasz do oryginalnych źródeł. Nie umieściłem pełnych źródeł tylko pewne moduły. Na pewno będzie udostępniony cały przerobiony kod, tylko to kwestia czasu  ;D
Wiem, że w moich tłumaczeniach jest sporo błędów, ja sam nieraz przetłumaczyłem coś w dany sposób a później się z tego śmiałem, że takie idiotyzmy wymyśliłem  ;) Człowiek jest tylko człowiekiem i nie wie wszystkiego. Co do oryginalnych komentarzy to wszystkie starałem się tłumaczyć, w tej funkcji widocznie usunąłem go przez pomyłkę  ??? (prawdopodobnie winę za to ponosi brak możliwości zagnieżdżania komentarzy /* */ w c++  ;D). Nie obawiajcie się, nie usuwam kodu źródłowego i gra cały czas działa  :D.  Jeszcze małe wytlumaczenie dotyczące mojego sposobu tłumaczenia.
/*+42
===================
Serwer przysla komende "disconnet"
Wywolanie funkcji CL_Disconnect(), która odlacza klienta z gry.
===================
*/
numer funkcji oznacza kolejny numer funkcji w pliku (chcę zrobić statystykę ilości funkcji  ;)) a znaczek + (plusa) oznacza, że funkcja jest w 99% dla mnie zrozumiała. Znaczek - (minus) oznacza jakieś wątpliwości, które trzeba rozwikłać.
Komentarze umieszczam nad linijką kodu. Jeśli nie jestem pewny tego co napisałem lub mam wątpliwości to stawiam pytajnikii ??
//  Zarejestruj lightmape shader'a ??
h = RE_RegisterShaderLightMap(shaderName, 0)