Trochę więcej o Mesh

Ostatnio wymyśliłem dość prosty TextureManager (Resource był w planie, ale nie wiem wszystkiego o zasobach DX, które trzeba zwalniać, a o teksturach wiem wystarczająco). Właściwie to nazwanie go jest lekką przesadą, ponieważ składa się on ze struktury, vector’a i 2 funkcji.  Vector zawiera obiekty struktury, która składa się ze adresu tekstury, licznika użyć oraz wskaźnika na interfejs tekstury. Vector’em zarządzają 2 funkcje:

LoadTexture
DeleteTexture

Pierwsza sprawdza czy nie ma już załadowanej takiej tekstury jeżeli jest to zwiększa jej licznik i zwraca interfejs. W przeciwnym przypadku tworzy i dodaje do vector’a

Druga sprawdza po wskaźniku czy jest, jeżeli tak to dekrementuje po czym sprawdza licznik, jeżeli spadł do 0 to zwalnia teksturę, kasuje z vector’a.

Składniki zawierają się w sekcji prywatnej klasy Mesh, przy czym vector jest statyczny, dzięki czemu dostępny dla wszystkich potomków klasy abstrakcyjnej Mesh.

Obsługa wierzchołków jako Mesh

Dziś na przedmiocie o nazwie “Język Polski” (tak, to idealna pora), projektowałem klasę obsługującą wierzchołki. Stwierdziłem, że do obsługi wierzchołków typu FVF oraz tych dla Vertex Declaration potrzebne będą różne klasy, a ponieważ lubię jak wszystko jest OO (lub dąży do tego), postanowiłem, że napiszę klasę abstrakcyjną Mesh, zawierającą (aktualnie) 4 funkcje:

  • virtual void Draw() = 0;
  • virtual void InvalidateResources() = 0;
  • virtual void RestoreResources() =0;
  • void AddDevicePtr(LPDIRECT3DDEVICE9);

Te funkcje pozostaną niezmienne, przy czym wirtualne będą używane przez klasę Render. Która je będzie w odpowiednich momentach wywoływała. Następnie pomyślałem o klasie dziedziczonej dla typu FVF (aktualnie mi taka potrzebna), ale szybko doszedłem do wniosku, że nie ma ona sensu, ponieważ nie będzie zbyt elastyczna, gdyż za każdym razem potrzeba jest ustawić inne stany, a przecież to samo można zyskać bez niej, dlatego porzuciłem ją. Klasa Mesh jako abstrakcyjna będzie dziedziczona przez różne klasy obiektów, które będę mógł dodać do vector’a w klasie Render, a ta będzie wywoływać odpowiednie funkcje, które będą odpowiednio zdefiniowane dla danego obiektu.

Jak to pomysły przychodzą

Postanowiłem dziś wymyślić sposób zapisywania questów i ich opisów do mojego silnika RPG. Myślałem nad tym dość znaczną ilość czasu bo kilka godzin, w końcu postanowiłem się poddać i zacząłem grę w Starcraft’a (UMS’y :)). Jak to się później okazało czas ten nie poszedł na marne bo pomysł, którego oczekiwałem przedtem pojawił się znikąd w czasie gry. Całego pomysłu wyszła kartka A4 (żeby nie zapomnieć, a o to u mnie nie trudno). Dlatego tak się zastanawiam i dochodzę do wniosku, że w życiu kodera najlepsze jest to, że (cytat Wacha z irca): najpierw walisz głową w mur przez kilka godzin, a potem ni stąd ni zowąd ten mur sam sie burzy.