TLDR: Створення компонента складається з декількох сіток для початку.
Я погоджуюся з Асакероном / Байт56 / Лоран в тому, що потрібен ще один рівень непрямості між сітчастими / матеріальними парами та самою сутністю. Замість того, щоб дивитися на GraphicsComponent як вершини та матеріали, подумайте про це як на краплину пікселів на остаточному растрі - як це / вони там є - це детальна інформація про реалізацію і більше нічого.
Я багато думав про це для свого проекту, і я думаю, що оптимальним рішенням є зробити GraphicsComponent набагато вищим рівнем компонента, що охоплює більшу частину функціональності традиційного об'єкта "Модель" - адже ця функціональність не є обов'язковою! Щоб зробити ці багатокутники набагато більше, ніж просто дані буфера і шейдер, наприклад:
- Позиція, яку ви згадали
- Дані зняття / анімації
- Поточний прохід (наприклад, якщо використовується два альфа пропуску)
- Інформація про лиття тіней (якщо ви це робите)
- Інформація про те, як і коли оновлювати матеріал
- Функція вилучення
І це лише для 3D-ресурсів, не враховуючи систем частинок, білбордів тощо. Але все це стосується лише графіки / коду візуалізації - це не впливає на фізику, звук чи сценарій, тому має сенс йому сидіти компонент Графіка / Візуалізація
Я закінчив:
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
У цьому:
Модель - це будь-який ігровий актив, який має графічну складову.
ModelComponent є аналогом традиційної моделі і насправді є для 3D-активів. Контролер GraphicsComponent (якщо ви використовуєте шаблон Model-View-Controller) несе відповідальність за з'ясування типу графічного активу та його правильне малювання (зауважте, що ModelComponent є підкласом GraphicsComponent).
У моїй роботі було також кілька компромісів для простоти та зворотної сумісності, такі як кожен GraphicsComponent також є об'єктом, і Entity зберігає дані про позицію безпосередньо, тому його обчислюються лише в одному місці, але ідея та ж: GraphicsComponent обробляє те, що є потрібно було намалювати предмет - все те, що потрібно - не тільки те, що походить від модельєра.