TLDR: Na początek komponent składa się z wielu siatek.
Zgadzam się z Asakeron / Byte56 / Laurent, że potrzebny jest inny poziom pośrednictwa między parami siatka / materiał a samą istotą. Zamiast patrzeć na GraphicsComponent jako wierzchołki i materiały, pomyśl o nim jak o kropli pikseli na końcowym rastrze - to, jak się tam dostanie, jest szczegółem implementacji i niczym więcej.
Dużo o tym myślałem w moim projekcie i myślę, że optymalnym rozwiązaniem jest uczynienie GraphicsComponent składnikiem o wiele wyższym, obejmującym większość funkcjonalności tradycyjnego obiektu „Model” - ponieważ ta funkcja nie jest opcjonalna! Aby renderować te wielokąty o wiele więcej niż tylko dane buforowe, potrzebny jest moduł cieniujący, taki jak:
- Pozycja, o której wspomniałeś
- Dane skórowania / animacji
- Aktualny przebieg (np. Jeśli używasz dwuprzebiegowego alfa)
- Informacje o rzucaniu cienia (jeśli to robisz)
- Informacje o tym, jak i kiedy aktualizować materiał
- Funkcja wyrównywania
Dotyczy to tylko zasobów 3D, bez uwzględnienia układów cząsteczkowych, billboardów itp. Ale wszystko to dotyczy tylko grafiki / kodu renderującego - nie wpływa na fizykę, dźwięk ani skrypty, więc ma sens komponent Grafika / Rendering.
Skończyło się na:
Model : Entity, IHasGraphicsComponent, IHasSkeleton, IHasAnimationStore //This is the 'game object' - it is passed to the GraphicsController
ModelComponent : GraphicsComponent //This is the actual graphics component, used by the GraphicsController in the context of the game object.
ModelComponentPart : GraphicsComponent //This is also a graphics component
Mesh //These are implementation details
Material
ModelComponentPart : GraphicsComponent
Mesh
Material
Skeleton
Animations
W tym:
Model to dowolny zasób gry, który ma komponent graficzny.
ModelComponent jest analogiczny do tradycyjnego modelu i tak naprawdę jest w przypadku zasobów 3D. Kontroler GraphicsComponent (jeśli używasz wzorca Model-Widok-Kontroler) jest odpowiedzialny za ustalenie rodzaju zasobu graficznego i prawidłowe rysowanie (zwróć uwagę, że ModelComponent jest podklasą GraphicsComponent).
W moim przypadku było też kilka kompromisów dotyczących prostoty i wstecznej kompatybilności, ponieważ każdy GraphicsComponent jest również Entity, a Entity przechowuje dane pozycji bezpośrednio, więc są obliczane tylko w jednym miejscu, ale idea jest taka sama: GraphicsComponent obsługuje to, co jest potrzebne do narysowania przedmiotu - wszystkiego, co jest potrzebne - nie tylko tego, co pochodzi od modelarza.