Renderer refactor

This commit is contained in:
yvt 2013-09-14 13:36:05 +09:00
parent 13692657e1
commit e7d5b210c3
6 changed files with 67 additions and 44 deletions

View File

@ -49,6 +49,12 @@ namespace spades {
r->Init(); r->Init();
} }
}; };
class Shutdown: public Command {
public:
virtual void Execute(IRenderer *r) {
r->Shutdown();
}
};
class SetGameMap: public Command { class SetGameMap: public Command {
public: public:
GameMap *map; GameMap *map;
@ -324,6 +330,11 @@ namespace spades {
generator->AllocCommand<rcmds::Init>(); generator->AllocCommand<rcmds::Init>();
} }
void AsyncRenderer::Shutdown() {
SPADES_MARK_FUNCTION();
generator->AllocCommand<rcmds::Shutdown>();
}
IImage *AsyncRenderer::CreateImage(spades::Bitmap *bmp) { IImage *AsyncRenderer::CreateImage(spades::Bitmap *bmp) {
SPADES_MARK_FUNCTION(); SPADES_MARK_FUNCTION();

View File

@ -52,6 +52,7 @@ namespace spades {
virtual ~AsyncRenderer(); virtual ~AsyncRenderer();
virtual void Init(); virtual void Init();
virtual void Shutdown();
virtual IImage *RegisterImage(const char *filename); virtual IImage *RegisterImage(const char *filename);
virtual IModel *RegisterModel(const char *filename); virtual IModel *RegisterModel(const char *filename);

View File

@ -76,6 +76,7 @@ namespace spades {
IRenderer(){} IRenderer(){}
virtual void Init() = 0; virtual void Init() = 0;
virtual void Shutdown() = 0;
virtual IImage *RegisterImage(const char *filename) = 0; virtual IImage *RegisterImage(const char *filename) = 0;
virtual IModel *RegisterModel(const char *filename) = 0; virtual IModel *RegisterModel(const char *filename) = 0;

View File

@ -80,7 +80,7 @@ SPADES_SETTING(r_debugTiming, "0");
namespace spades { namespace spades {
namespace draw { namespace draw {
// TODO: raise error for any calls after Shutdown().
GLRenderer::GLRenderer(IGLDevice *_device): GLRenderer::GLRenderer(IGLDevice *_device):
device(_device){ device(_device){
@ -125,46 +125,8 @@ namespace spades {
GLRenderer::~GLRenderer() { GLRenderer::~GLRenderer() {
SPADES_MARK_FUNCTION(); SPADES_MARK_FUNCTION();
// FIXME: remove itself from map's listener Shutdown();
SPLog("GLRender finalizing");
if(radiosityRenderer)
delete radiosityRenderer;
if(ambientShadowRenderer)
delete ambientShadowRenderer;
if(flatMapRenderer)
delete flatMapRenderer;
if(mapShadowRenderer)
delete mapShadowRenderer;
if(mapRenderer)
delete mapRenderer;
if(waterRenderer)
delete waterRenderer;
if(ambientShadowRenderer)
delete ambientShadowRenderer;
if(shadowMapRenderer)
delete shadowMapRenderer;
if(cameraBlur)
delete cameraBlur;
if(longSpriteRenderer)
delete longSpriteRenderer;
if(waterRenderer)
delete waterRenderer;
if(modelRenderer)
delete modelRenderer;
if(spriteRenderer)
delete spriteRenderer;
if(imageRenderer)
delete imageRenderer;
if(modelRenderer)
delete modelManager;
if(programManager)
delete programManager;
if(imageManager)
delete imageManager;
if(fbManager)
delete fbManager;
SPLog("GLRenderer finalized");
} }
void GLRenderer::Init() { void GLRenderer::Init() {
@ -216,6 +178,49 @@ namespace spades {
SPLog("GLRenderer initialized"); SPLog("GLRenderer initialized");
} }
void GLRenderer::Shutdown() {
// FIXME: remove itself from map's listener
SPLog("GLRender finalizing");
if(radiosityRenderer)
delete radiosityRenderer;
if(ambientShadowRenderer)
delete ambientShadowRenderer;
if(flatMapRenderer)
delete flatMapRenderer;
if(mapShadowRenderer)
delete mapShadowRenderer;
if(mapRenderer)
delete mapRenderer;
if(waterRenderer)
delete waterRenderer;
if(ambientShadowRenderer)
delete ambientShadowRenderer;
if(shadowMapRenderer)
delete shadowMapRenderer;
if(cameraBlur)
delete cameraBlur;
if(longSpriteRenderer)
delete longSpriteRenderer;
if(waterRenderer)
delete waterRenderer;
if(modelRenderer)
delete modelRenderer;
if(spriteRenderer)
delete spriteRenderer;
if(imageRenderer)
delete imageRenderer;
if(modelRenderer)
delete modelManager;
if(programManager)
delete programManager;
if(imageManager)
delete imageManager;
if(fbManager)
delete fbManager;
SPLog("GLRenderer finalized");
}
client::IImage *GLRenderer::RegisterImage(const char *filename) { client::IImage *GLRenderer::RegisterImage(const char *filename) {
SPADES_MARK_FUNCTION(); SPADES_MARK_FUNCTION();
return imageManager->RegisterImage(filename); return imageManager->RegisterImage(filename);

View File

@ -114,11 +114,14 @@ namespace spades {
void RenderObjects(); void RenderObjects();
public: protected:
GLRenderer(IGLDevice *glDevice);
virtual ~GLRenderer(); virtual ~GLRenderer();
public:
GLRenderer(IGLDevice *glDevice);
virtual void Init(); virtual void Init();
virtual void Shutdown();
virtual client::IImage *RegisterImage(const char *filename); virtual client::IImage *RegisterImage(const char *filename);
virtual client::IModel *RegisterModel(const char *filename); virtual client::IModel *RegisterModel(const char *filename);

View File

@ -255,10 +255,12 @@ namespace spades {
{ {
SDLGLDevice glDevice(surface); SDLGLDevice glDevice(surface);
draw::GLRenderer renderer(&glDevice); Handle<draw::GLRenderer> renderer = new draw::GLRenderer(&glDevice);
audio::ALDevice audio; audio::ALDevice audio;
RunClientLoop(&renderer, &audio); RunClientLoop(renderer, &audio);
renderer->Shutdown();
} }
}catch(...){ }catch(...){
SDL_Quit(); SDL_Quit();