Немного перековырял архитектуру.
Добавил потдержку OpenGL 3.2,теперь матереалы абстрактны,тоесть пишем свой тип матереала для конретных задач и в файле указываем в качестве имя класса матереала,свой:
<Material>
<Class name="StandartMaterial"/>
<DiffuseTexture file="color_map.dds"/>
<Color r="1.0" g="1.0" b="1.0" a="1.0"/>
<Material/>
Также добавлен единый конфигурационый файл:
<Video>
<Width value="1024"/>
<Height value="768"/>
<FullScreen value="0"/>
<MSAA value="None"/>
</Video>
<Texture>
<Filter mode="Linear"/>
<Anistropy level="0.0"/>
<MipStart level="0"/>
</Texture>
<Gui>
<Resource file="core.xml"/>
</Gui>
<Game>
<Title name="Squad Engine"/>
</Game>
Преписан ресурсный менеджер который с лёгкостью позволяет грузить ресурсы в отдельном потоке:
class BackgroundResourceLoader{
public:
SINGLETON(BackgroundResourceLoader);
void add( Resource* resource );
void flush();
};
Но можно и грузить ресурс в текущем потоке юзая макрос:
#define ResourceCache(ResourcePtr,ResourceFile) ResourcePtr->setFileName(ResourceFile); ResourcePtr->load();
Так же интии разделены на два типа просто интития Entity,и RenderableEntity тоесть та которую можно отрисовать.
Теперь и написание приложения немного изменилось,тоесть добавлен абстрактный класс EngineListener,в котором есь виртуальные методы init(),shutdown(),update(),и пару связаных с инпутом.
class EngineListener : public OIS::MouseListener,public OIS::KeyListener
{
public:
EngineListener();
virtual ~EngineListener();
virtual void init();
virtual void shutdown();
virtual void resize( uint width , uint height );
virtual void update( uint fps , float deltaTime );
virtual void minimize();
virtual void maximize();
virtual bool mouseMoved(const OIS::MouseEvent& _arg);
virtual bool mousePressed(const OIS::MouseEvent& _arg, OIS::MouseButtonID _id);
virtual bool mouseReleased(const OIS::MouseEvent& _arg, OIS::MouseButtonID _id);
virtual bool keyPressed(const OIS::KeyEvent& _arg);
virtual bool keyReleased(const OIS::KeyEvent& _arg);
};
Юзается так:
#include "..\Engine\squad.h"
class Game : public Squad::EngineListener{
public:
bool keyPressed(const OIS::KeyEvent& _arg){
if( _arg.key == OIS::KC_ESCAPE )
Squad::Engine::getInstance().exit();
return Squad::EngineListener::keyPressed(_arg);
}
};
void main(){
Squad::Engine* engine = Squad::Engine::getInstancePtr();
engine->init(new Game,"");
engine->main();
engine->shutdown();
}