TLDR: для начала компонент состоит из нескольких мешей.
Я согласен с Asakeron / Byte56 / Laurent в том, что необходим другой уровень косвенности между парами сетки / материала и самой сущностью. Вместо того, чтобы смотреть на 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 аналогичен традиционной модели и фактически для трехмерных активов. Контроллер GraphicsComponent (если вы используете шаблон Model-View-Controller) отвечает за определение типа графического актива и правильное его рисование (обратите внимание, что ModelComponent является подклассом GraphicsComponent).
У меня также было несколько компромиссов для простоты и обратной совместимости, например, каждый GraphicsComponent также является Entity, и Entity хранит данные Position напрямую, поэтому они рассчитываются только в одном месте, но идея та же: GraphicsComponent обрабатывает то, что необходимо нарисовать предмет - все, что нужно, а не только то, что исходит от моделиста.