Простое, но в то же время прекрасное решение для этого заключается в создании интерфейсов / базовых классов abstact для всех различных вещей, которые может представлять узел сцены.
class Texture
{
...
};
class Geometry
{
...
};
// etc
class SceneNode
{
public:
// The following return null by default but
// can be overriden by SceneNode subclasses
// to return interface pointers.
virtual Geometry* geometry()
{
return 0;
}
virtual Texture* texture()
{
return 0;
}
};
class Model: public SceneNode, public Texture, public Geometry
{
public:
// Override the functions of inherited interfaces
virtual Geometry* geometry()
{
return this;
}
virtual Texture* texture()
{
return this;
}
};
На самом деле это тот подход, который высококлассные 3D-пакеты принимают в той или иной форме. С ним, для любого узла сцены, вы можете запросить его, поддерживает ли он определенный интерфейс (например, текстурный), а затем выполнить анимацию через него, например,
Maya и XSI делают это, но с помощью метода интерфейса, способного вернуть все интерфейсы, которые возвращают void *, которые клиент должен преобразовать соответствующим образом. Затем они создают ссылочные типы, которые скрывают требуемое приведение.
Вам не нужно всегда прибегать к классическим шаблонам проектирования для всех ваших программных решений. Рассматривайте их как инструменты и предложения, но всегда спрашивайте, какой шаблон проектирования подойдет для данной проблемы, не всегда приводит к самому простому решению. Вы должны думать сами, но шаблоны проектирования могут вам помочь.