![]() |
Design Patterns And 3D Gaming by Edward Kmett (harmless@bloodshed.com) |
#ifndef INCLUDED_RENDERER
#define INCLUDED_RENDERER
class Texture {
public:
virtual ~Texture() {}
virtual void makeCurrent()=0;
};
class Renderer {
public:
virtual Texture * loadTexture(const char * name);
};
#endif
Figure 1. renderer.h
|
#ifndef INCLUDED_RENDERER_TEMPLATES
#define INCLUDED_RENDERER_TEMPLATES
#include "renderer.h"
template <class Baseclass, class Renderer> class TextureTemplate : public Baseclass {
private:
Renderer * m_renderer;
public:
TextureTemplate(Renderer & rend, const char * name) : m_renderer(&rend), Baseclass(name) { }
~TextureTemplate() {
m_renderer->unregisterTexture(this);
}
void makeCurrent() {
m_renderer->makeCurrent(this);
}
};
template <class Baseclass, class TextureBase> class RendererTemplate : public Baseclass {
public:
typedef TextureTemplate<TextureBase> MyTexture;
Texture * loadTexture(const char * name) {
return new MyTexture(this,name)
}
};
#endif
Figure 2. renderer_templates.h
|
#ifndef INCLUDED_GLRENDERER
#define INCLUDED_GLRENDERER
#include "renderer_templates.h"
class GLTextureImpl : public Texture {
public:
GLTextureImpl(const char * name, blah blah blah) {
load up texture using opengl...
}
virtual ~GLTextureImpl() {}
};
class GLRendererImpl : public Renderer {
public:
void makeCurrent(GLTextureImpl & texture) {
... do gl texture stuff here ...
}
void unregisterTexture(GLTextureImpl & texture) {
... do gl texture stuff here ...
}
};
typedef TextureTemplate<GLTextureImpl,GLRendererImpl> GLTexture;
typedef RendererTemplate<GLRendererImpl,GLTextureImpl> GLRenderer;
#endif
Figure 3. glrenderer.h
|
Interface Implementation : public Interface TemplateWrapper<Implementation> : public Implementation Figure 4. Hierarchy |