Prezentacja mojego silnika MagicEngine


#15

To była książka pewnie z 2001 roku, więc może wtedy był to jakiś dobry pomysł :smiley:

Wczoraj sporo programowałem i pojawiło się mnóstwo problemów. Dodałem ładowanie z plików obj (dopóki nie będzie własnego formatu i edytora to będę pracował na nich). Póki co ładuje pozycje wierzchołka, współrzędne tekstury i normalną. Tangent wylicza na podstawie face’a (trzech wierzchołków) i na końcu uśrednia go. Binormal wylicza z cross produktu normalnej i tangent’a.

Niestety pojawiło się mnóstwo problemów. Po pierwsze OpenGL nie pozwala wyłączać parametrów przez co jeżeli obiekt nie posiada tangenta i binormalnej to i tak koniec konców musi je mieć puste. Moim zdaniem to marnowanie pamięci, ale nie wiem czy to da się ominąć :confused: (podobnie jest w silniku z Wiedźmina 2 - przeliczyłem renderowane KB i rzeczywiście kosta posiada tam również tangent i binormal chociaż z nich nie korzysta). Ten problem dalej przekłada się na bufor modelu ponieważ w takiej sytuacji jeżeli chcę nałożyć shadera na efekt cząsteczkowy i na przykład topór to muszę stworzyć dwa oddzielne VAO co dalej oznacza, że muszę stworzyć dwa oddzielne vertex shadery dla jednego materiału. Może to ma jakiś sens, ale chciałem jakoś to ominąć. No niestety póki co fragment shadera w momencie zapisu materialu się generuje do stringa, i zapisuje go na samej górze (tak, żeby nie musieć odtwarzać go z nodów w silniku), a vertex shader generowane jest w zależności od tego co renderuje. Mam nadzieję, że jakoś to wytłumaczyłem :stuck_out_tongue:. Jako, że w końcu mi działa już eksporter modelów z wiedźmina 2, więc w demkach do pokazania czegoś będę ich właśnie używał :slight_smile:


#16

Problem da sie ominac :slight_smile: Jezeli chodzi o VAO to Valve pisalo, ze w kazdym tescie VAO wychodzilo im wolniej niz zwykle VBO bindowane recznie, sam nie mialem czasu jeszcze tego przetestowac :slight_smile: Ale jak dobrze ulozysz pamiec w buforach to praktycznie nie musisz ustawiac buforow, bo masz powiedzmy jeden VBO 8MB (Nvidia kiedys polecala 4MB, ale to stare dzieje, wiec zalozmy te 8MB) to zmiesci Ci sie w nim duzo modeli, zazwyczaj wiec mkdele z indentycznym ukladem wiercholka nie musza byc bindowane bo wystarczy inny offset (BaseVertex) w funkcji rysujacej ( dla OGL bodajze od wersji 4.2 mozna dawac offset takze dla instancji).
Jezeli masz zamiar nie wykorzystywac tangentow to znaczy ze jest to inny material (nie zakladajacy istnienia tangentow) i wystarczy sprawdzac przy nakladaniu na model, czy dana siatma wspiera dany model wkercholka :slight_smile: Jezeli chodzi o wrzucanie jednego materialu na rozne typy obiektow, material jest niby jeden, ale w praktyce ma on duzo shaderow ktore dobiera w zaleznosci od typu obiektu. Zalozmy material polprzezroczystej kulki moze byc nalozony na obiekt statyczny, animowany, particle i teren. W praktyce pod tym materialem kryja sie wiec cztery shadery.
Tak wiec dla optymalizacji trzeba to odpowiednio posortowac, zalozmy tak: Material -> Shader -> VBO -> odleglosc :slight_smile: akurat w przypadku polprzezroczysfych musisz po odleglosci zeby uzyskac dobry wynik :slight_smile: Oczywiscie materialy uklada sie w zaleznosci od wymagan :slight_smile: Zaleta jest taka ze o ile shadery musisz zmienic to nie musisz rebindowac wszystkich ich danych (tym bardziej wykorzystujac UBO, czy nowsze OGL).
EDIT:
Odnosnie binormalnej, pamietaj ze cross normalnej i tangenta moze dac Ci binormalna w dwoch kierunkach, tzn. jak rovisz cross to zawsze wychodzi Ci identyczny relatywny do normalnej i tangenta zwrot binormalnej. trzeba sprawdzic czy binormalna po cross-ie nie powinna byc odwrocona (sam zwrot jest zalezny od kierunku wspolzednych tekstur, zle przygotowany model nie moze miec poprawnych tangentow, musi zostac podzielony, ale zazwyczaj robia to importery, badz eksportery).


#17

A sprawdzę sobie to w wolnej chwili bo ciekawe to bardzo :smiley:

Myślałem, że da się to jakoś oszukać na przykład poprzez wyłączenie w buforze jakoś atrybutu w takim sensie, że na przykład zmniejsza o te 6 floatów, ale teraz wiem, że błędnie to rozumiałem bo rzeczywiście no nie da się tego jak zrobić. Poza tym stwierdziłem, że można w sumie to “olać” bo w grze wszystkie modele mają korzystać z normal map poza tymi, które coś znaczą w edytorze -> na przykład model sugerujący, że w tym miejscu ma być światło albo kula symbolizująca zasięg efektu dźwiękowego. W samej grzej tak czy inaczej nie będzie się to i tak wyświetlać :slight_smile:. Póki co mam cztery przypadki: bufor modelu, bufor efektu cząsteczkowego, bufor animowanego modelu (postaci itd.) oraz bufor koloru (zawiera tylko atrybuty: kolor oraz pozycja).

W moim przypadku jeszcze jest dodatkowo tak: Material -> Shader -> Encja materiału (na przykład ktoś zmienił wartość jakiegoś uniformu odpowiedzialnego za to jak obiekt mocno się błyszczy) -> VBO -> odległość. Może jeszcze coś wejdzie, ale właśnie tak chciałem to zrobić :).

Co do UBO to czytałem o tym i widziałem mnóstwo przykładów więc pewnie jakoś w przyszłości zaimplementuje bo super sprawa jeżeli chodzi na przykład o kamere :smiley:.

Przy obliczeniach korzystam z tych gotowych wzorów (v0, v1, v2 są to wierzchołki face’a):

Vector3 delatPos1 = new Vector3(v1.getPosition()).sub(v0.getPosition());
Vector3 delatPos2 = new Vector3(v2.getPosition()).sub(v0.getPosition());
Vector2 uv0 = textures.get(v0.getTextureIndex());
Vector2 uv1 = textures.get(v1.getTextureIndex());
Vector2 uv2 = textures.get(v2.getTextureIndex());
Vector2 deltaUv1 = new Vector2(uv1).sub(uv0);
Vector2 deltaUv2 = new Vector2(uv2).sub(uv0);

float r = 1.0f / (deltaUv1.x * deltaUv2.y - deltaUv1.y * deltaUv2.x);
delatPos1.scl(deltaUv2.y);
delatPos2.scl(deltaUv1.y);
Vector3 tangent = delatPos1.sub(delatPos2);
tangent.scl®;
v0.addTangent(tangent);
v1.addTangent(tangent);
v2.addTangent(tangent);

A następnie wyliczam tangent:

for(Vector3 tangent : tangents)
{
averagedTangent = averagedTangent.add(tangent);
}
averagedTangent.nor();

Póki co mi wychodził wynik ok, ale racja warto się temu w razie czego przyjżeć :slight_smile:


#18

Akurat nie chodziło mi o samo liczenie tangentow :slight_smile: Jezeli dobrze liczysz tangent, to i tak cross normalnej z tangentem moze dac zła binormalna… bo zauwaz ze jak masz dwa wektody, normalna i tangent to istnieja dwa wektory prostopadle do nich… zalozmy tak: dla wektorow (1,0,0) i (0,1,0) istnieja wektory styczne (0,0,1) i (0,0,-1)… cross wektorow da (0,0,1), a binormalna moze byc (0,0,-1) :smiley: Standardowym podejsciem jest trzymanie tanget-u jako vec4, gdzie czwarta skladowa oznacza zwrot binormalnej, czyli 1, badz -1 :slight_smile:


#19

Racja miałeś racje jest błąd w binormalnej :smiley:. Wcześniej liczyłem sobie takie rzeczy w vertex shaderze (w sumie to się zastanawiam czemu by znowu binormalnej tam nie liczyć). Teraz rzeczywiście wrzuciłem to i czasami źle liczy. Więc pewnie dzisiaj jeszcze poprawie :smiley:

EDIT:
Tyle kombinowania, a wystarczyło do równania podstawić: binormal = (deltaPos2 * deltaUV1.x - deltaPos1 * deltaUV2.x)*r; :stuck_out_tongue:


#20

Graś screenów z tego co udało mi się zrobić w poprzednim tygodniu:


Skończony string edytor do edytowania wszystkich napisów w grze


Możliwość usuwania nodów oraz połączeń między nimi


Myślę, że już ostatnia prosta jeżeli chodzi o edytor materiałów. W przyszłości zamiast pozycję kamery wyliczać z view matrixa zastąpi to pewnie uniform lub nawet UBO. Pozostało mi w sumie tylko już aktualizować shadera i dodać deffered lightning, które póki co nie do końca wiem jak działa jeszcze, ale pewnie wyjaśni się to mi na dniach :slight_smile:


#21

W poprzednim tygodniu wiele zrobiłem w silniku i zaczyna to wyglądać naprawdę fajnie :smiley:.
Po pierwsze: w nod edytorze da się już tak naprawdę stworzyć dowolny materiał jaki tylko byście chcieli mieć (niestety nie działa jeszcze światło :confused:). Także jeżeli widzieliście zwiastun wiedźmin 2, gdzie Triss Merigold znikają fajnie ciuchy to tak w moim silniku da się też to napisać :stuck_out_tongue:. Jak będę miał więcej czasu to może jakieś takie demko sobie przygotuję, ale to dużo zabawy z tym by było. Póki co wrzucam screeny jakie zrobiłem przez poprzedni tydzień:


Na początku poszedł test kanału diffuse na wektorze, który repezentuje tutaj kolor.

https://www.instagram.com/p/BcV34OVBfdg/?taken-by=alan.dragomirus
Tutaj demko jak działa funkcja czasu w moim edytorze.


Dodany nod “texture sampler” dzięki czemu można nakładać na model tekstury. Z tym był największy problem niestety. Okazuje się, że nawet współdzieląc kontekst OpenGLa przez kilkanaście canvasów nie można współdzielić tekstury na GPU. Także, jeżeli potrzebuję dwóch tekstur to niestety muszę załadować je dwa razy. Zamiast jednego asset managera ma ich dokładnie tyle co canvasów :confused:.

https://www.instagram.com/p/BcdpAaLhZ8G/?taken-by=alan.dragomirus
Interpolacja dwóch kolorów oraz byskanie przypisane do uniformu? Nie ma sprawy już działa :smiley:.

14
No i ostatnia rzecz zrobiuona w zeszłym tygodniu czyli dodana obsługa FBO (bez multi sampli póki co). Powoli zabieram się już za implementacje Deffered lightning (i mam nadzieję skończyć w tym tygodniu), a raczej kończe bo już działa GBuffer, więc efekt ze światłem będzie mam nadzieję sto razy lepszy :smiley:.

2
Tak wygląda szkic tego aczkolwiek od razu mówię, że póki co skupiam się tylko na: world position, diffuse oraz normal. Reszta dojdzie w między czasie :slight_smile:.


#22

Zakładam, że Twoje posty rozumie dość nieliczne grono ludzi (niestety ja bez googlowania nie), ale jednak chętnie śledzę postepy i cały czas uczę się dzięki Tobie nowych rzeczy. Trzymaj tak dalej! :slight_smile:


#23

Ja tak z ciekawości zapytam: dlaczego flow edytora materiałów idzie z prawej do lewej :stuck_out_tongue: ?


#24

Dzięki wielkie za motywacje :slight_smile:. Ogólnie to mam nadzieje, że w niedługim czasie będę wstawiał zdjęcia już bezpośrednio z gry, a nie z edytora wtedy efekty można będzie od razu zobaczyć. bez wdawania się w szczegóły techniczne :slight_smile:.

@jonasz787
Bardzo inspiruje się silnikiem wiedźmina 2 (red engine2 - można powiedzieć, że rozkładam go na części pierwsze :stuck_out_tongue:), ale też wiele elementów biorę z nowszych produkcji i z wiedźmin 3 (redengine3, jeżeli opis działania czegoś był na jakiejś prezentacji). Jak weźmiesz edytor materiałów do wiedźmina 2 to w sumie większość wyglądu jest wzięta właśnie z tego edytora (w tym flow), ale mnie szczerze mówiąc mnie to już irytuję więc jak skończe wszystkoto zmienie kierunek obiecuje :stuck_out_tongue:


#25

Dziwne, że musisz ładować tekstury kilka razy, nigdy nie próbowałem współdzielić kontekstu w Javie, ale normalnie współdzieląc kontekst możesz uzywać tych samych tekstur (nie da się współdzielić VAO i FBO bo to obiekty abstrakcyjne, nie znajdują się wgl. na karcie) :slight_smile:

Co do GBuffor, ogólnie im mniej masz tam danych tym lepiej, tym szybciej, jeżeli czegoś nie potrzebujesz, nie uzywaj tego :wink: Normalną radzę albo zapisysawać kątami (crytek gdzieś ma opisane jak takie pakowanie zrobić) i trzymać dwie składowe, albo wykorzystać GL_RGB10_A2, inaczej oświeltenie bedzie niskiej jakości ze względu na małą precyzję zapisanych normalnych :slight_smile: Skoro masz Depth, wyrzuć World Position, można to spokojnie odczytać z głębi, będziesz miał taniej i szybciej :wink: Co prawda istnieje kilka metod na to, ale jak uda Ci się zaimplementować którąś z tych lepszych, to powinieneś być zadowolony :slight_smile:

Zazwyczaj nie trzyma się teraz “specularity” jako trzy składowe ze względu na rzadkość wykorzystania, a duży narzut na GBuffer. Ba! Niektóre silniki wcale nie mają specularity :smiley: Bo po co xD skoro masz Glossiness, albo Roughness, to zastępuje to specular. Bo parametr specular jest zazwyczja koło 0.5 (czyli załóżmy około 0.04 odbicia światła), a kolorowany specular posiada bardzo mało materiałów :slight_smile: Więc zakłada się, że przyjmujemy kolor światła jako kolor odbicia :slight_smile: Co prawda zdarza sie jeszcze, że ktoś wykorzystuje kolorowany specular, ale zazwyczaj robi z tego niezłe sztuczki :smiley:

Wgl. zastanawiałes sie czy nie lepiej zaimplementować deferred shading zamiast deferred lighting? Jeżeli nie celujesz w konsole starej generacji to Ci się nie opłaca implementować deferred lightingu. Deferred shading jest w zasadzie prostszy i wydajniejszy. Chociaż żeby dobrze to zintegrować z PBR to przydałby się już Tile-Based, albo clustered, ew. można envmapki dawać w pierwszym passie :slight_smile:

I nie rozumiem po co UV? :smiley: UV są tak naprawdę zbędne, bo kolor powierzchni zapisujesz w diffuse.

Poza tym… Widać progress :smiley:


#26

@up
No niestety, próbowałem w dwóch canvasach zbindować tą samą teksture i niestety nie da się (w ogóle to losowo jest wybierany canvas co jest mega dziwne). Na jednym widzę normalną teksturę, a na drugim dzieją się cuda jak na przykład tekstura znajdująca się w tym samym folderze, ale nie załadowana do pamięci (to chyba było najdziwniejsze) albo paski o różnych kolorach. Nie za bardzo chcę mi się przerabiać canvas AWT LWJGL (bo raczej tam jest pewnie gdzieś błąd) bo w sumie wiele canvasów używam tylko w edytorze, a w grze będzie tylko jeden :slight_smile:.

Z tymi kątami ciekawy znowu pomysł mi rzucasz bo naprawdę fajna sprawa :smiley:. Patrzyłem sobie ostatnio na to też VBO co mi radziłeś i rzeczywiście wychodzi dużo, dużo lepiej, ale póki co rozkminiam jak to zrobić i pewnie więcej pracy włożę przy okazji mesh editora. Co do depth to póki co world position jest tylko do testów ostatecznie pozycja do obliczania wektora światła będzie brana właśnie z depth :wink:

O Roughness mało czytałem więc ciężko mi się wypowiedzieć :stuck_out_tongue:. Co do specular to racja można w sumie wykorzystać tylko jeden kanał na przykład red, ale glossiness zostaje bo fajne efekty czasem można z tego zrobić :smiley:.

Z UV mam pewien pomysł, ale nie wiem czy jeszcze zadziała więc bardziej poczekam z tym, aż będzie działać i później się wypowiem :stuck_out_tongue:

Ogólnie to trochę chcę poeksperymentować ze światłem, a poźniej powywalać pewne parametry (te które będą mi nie potrzebne).

@EDIT:
Ok w internecie jest bardzo to zamieszane i okazuje się, że pomyliły mi się pojęcia deffered lightning z deffered shading (ale wtopa xd) i rzeczywiście implementuje deffered shading, ale pewnie przy okazji dodam odrazu wsparcie SSAO (no bo czemu nie, jak już to robię :stuck_out_tongue:).


#27

Roughness to akurat odwrotnosc Glossiness :smiley: Roughness = 1 - glossiness :smiley: Takze stawialem to na rowni (glossiness - gladkosc, roughness - szorstkosc) :slight_smile: Niewielka roznica, niektorzy kieruja sie tutaj intuicja, a inni jak crytek twierdza ze jedna z opcji jest lepsza/wydajniejsza :smiley:

SSAO to tylko efekt :slight_smile: Prosta sprawa,chociaz zalszy jak chcesz zrobic, bo opcji masa :smiley: Moze pomysl nad tym aby edytorem materialow mozna bylo robic efekty :slight_smile:

PS. tez kiedys nie moglem zalapac jak sie te techniki nazywaja :smiley: na forach masa bledow, a do tego nie rozumialem zasady dzialania tego wszystkiego :smiley:


#28

Z tego co pamiętam to właśnie chyba Unreal ma coś takiego do samych efektów w swoim metrial edytorze :slight_smile:

Co do SSAO to czytając o PBR zwróciłem szczególną uwagę na AO Mapping - dość fajna sprawa tylko, że pewnie problem będzie znaleźć jakieś gotowe modele z tymi wszystkimi teksturami. Pomyślę bo koncept bardzo mi się podoba, ale no może być ciężko z assetami :slight_smile:


#29

Ok mały update z tego co udało mi się zrobić w zeszłym tygodniu. Po pierwsze działa już deffered shading poprawnie co widać na poniższym screenie:

Mając podstawy mogłem usunąć już teksture world position i tak jak Mergul mówił zastąpić ją depth texture i wyliczać odeległość z niej.


Kolejnym etapem było zrobienie światła. Udało się zrobić wszystkie trzy rodzaje (chociaż przy stożkowym nie działają gładkie krawędzie, ale już nie miałem siły - za dużo matematyki jak na jeden raz :stuck_out_tongue:.Póki co glossiness i specular jest ustawio ne sztywno, ale nie trudno będzie to zmienić.

W tym tygodniu będę trochę siedział przy chyba to się nazywa potok renderowania? Chodzi oto jak obiekty (światła, przedmioty, budyki) będą sortowane przy wyświetlaniu. Na pewno obiekty pół-przezroczyste (których będzie bardzo bardzo mało w grze) będą wyświetlane osobno - forward rendering. Podobnie będzie z particlami na które nie trzeba nakładać światła (a jak już to w bardzo uproszczonej wersji). I tutaj przychodzi z pomocą trochę kanał mask w moim material edytorze, który odrzuca te piksele, które są zamalowane na czarno w masce (później pokaże na zasadzie trawy jak to będzie działało.
Drugą rzeczą na pewno będzie (a raczej jest bo już robię) jest przeglądarka katalogu assetów w której będzie można tworzyć nowe modele, nowe materiały, wyszukiwać oraz tworzyć i usuwać katalogi (może brzmi śmiesznie, ale bardzo przydatne narzędzie :stuck_out_tongue: ).


#30

W zeszłym tygodniu przez święta trochę mało czasu było ale trochę udało się zrobić. Zacząłem pracę nad Asset Browser’em.


Tak wygląda główny widok (czerwone ikonki oznaczają foldery)


Tutaj można sobie szybko zobaczyć jak wyglądają tekstury przed ich wyborem.


Zółta ikonka oznacz materiał, który potem można edytować a material edytorze.


Pop-up z możliwością tworzenia pików oraz wklejania czegoś ze schowka.


Możliwe operacje na plikach.


Operacje na katalogach i to jak to wygląda jak się zaznaczy pliki i foldery.

Jeszcze trochę mi tutaj zostało do zrobienia, a później w końcu może uda mi się skończyć edytor materiałów.


#31

Aktualizauje temat. W poprzednim tygodniu dużo siedziałem nad poprawą wydajności w całym edytorze tak żeby można było edytować tyle materiałów i obiektów w grze ile tylko dusza zapragnie. Jest już lepiej, ale niestety czasami następuje crash, gdy zamknie się i uruchomi ponownie ten sam plik -> nie mam pojęcia czemu :confused:. Do tego dodana opcja zapisu i odczytu materiałów oraz zmienione ikonki. Obecnie pracuję nad materiałami dla obiektów architektonicznych takich jak budynki, mosty itd.


Nowe ikonki folderów i materiałów robiłem sam :stuck_out_tongue:


Zdjęcia drewna z użyciem tzw. detail mapy. Niestety wygląda to tak skomplikowanie, ale dzisiaj mam nadzieje zastąpić to wszystko jednym nodem. Ponad to zainteresował mnie pewien artykuł (Artykuł) i podobny efekt architektury chciałbym zobaczyć w mojej grze :smiley:.


#32

Aktualizuje temat bo sporo się działo w poprzednim tygodniu. Przede wszystkim w końcu udało mi się (prawdopodobnie) usunąć błąd, który crashował całą aplikację edytora w bardzo rzadkich sytuacjach. Przeanalizowałem też pamięć Video RAM i po zamknięciu okna z edytorem materiału mam pewność, że wszystkie zasoby się zwalniają. Do tego poprawiłem usuwanie z pamięci okien bo był z tym nie mały problem. Koniec końców edytor teraz jest bardzo stabilny i na dobrych komputerach potrafi odpalić bardzo dużo canwasów w tym samym czasie dzięki czemu można edytować dużo plików jednocześnie :smiley:.

Kolejna rzecz to dodanie kilku nowych nodów. Pierwszy z nich to blend by distance, który zmienia kolor wraz z odległością od kamery. Mały teścik poniżej.

Detail material zrobiony w poprzednim tygodniu w ogóle nie działał tak jak powinien więc zabrałem się za niego porządnie i efekt jest super :smiley:. W zależności od tego jak blisko znajdujemy się przy obiekcie to albo są wyświetlane dodatkowe żłobienia albo nie. Nie wiem czy cokolwiek widać, ale wstawiam linka:
https://www.instagram.com/p/BdoMxOpBK0K/?taken-by=alan.dragomirus

Dalej ten sam nod, ale dla normal mapy przez co musiałem też dodać nod, który odczytuje “spakowaną” normalną:

No i finalnie dodałem glossiness i specularity do renderingu. Jednak tak jak @Mergul proponował będzie później PBR :stuck_out_tongue:.

Dzięki kilku osobom dowiedziałem się również jak działa proces wywalania zbędnych zmiennych, funkcji itd. z shaderów podczas kompilacji dzięki czemu mogłem ustawić domyślne koordynaty dla pobierania próbki z tekstury w przypadku kiedy użytkownik nie poda noda. W skrócie to mniej połączeń jest pomiędzy nodami przez co jest czytelniej :stuck_out_tongue:.

Obecnie pracuje nad wyświetlaniem klatki w grze. Szczerze to na początku jak zobaczyłem analiże wyświetlania klatki w Unreal Engine 4 to trochę mnie to przerosło, ale na szczęście już powoli zaczynam to kumać. Jeżeli chodzi o deferred shading to jest to bardzo zbliżone do unreal 4, a tekstury wyglądają tak:

  1. Scene color deferred, czyli albedo pomnożone przez ambient
  2. Normal
  3. Distortion - Metalness/Roughness (ale póki co jest to glossiness)/Specularity
  4. Albedo + AO

#33

W tym tygodniu będzie bardzo krótka aktualizacja. Niestety w pewnym momencie Java przestała być dla mnie wystarczalna. Okazuje się, że SWING sam w sobie ma parę problemów, poza tym gerbage collector strasznie mi zaczął przeszkadzać przez swą nie deterministyczność. Tak więc przenosze wszystko na język C++ - myślę, że nie bedzie to aż tak trudne jakby się mogło wydawać, a większość klas po prostu będę kopiował (nie wspominając o shaderach).
Dzięki językowi C++ porzucam też systemy Mac OSX oraz Linux na rzecz Playstation 4 i XBox One (w przyszłości jednak zamierzam do nich powrócić), a bibliotekę SWING zastępuje tutaj Qt (ma wiele gotowych elementów, które w swingu musiałem pisać w sumie od nowa).
Także wracam za jakieś pewnie 3-4 tygodnie :stuck_out_tongue:.

Na koniec zdjęcie z ostatniego tygodnia, gdzie robiłem test materiałów w silniku :slight_smile:


#34

Pochwalam decyzję :smiley: