X-Git-Url: https://git.dogcows.com/gitweb?p=chaz%2Fyoink;a=blobdiff_plain;f=src%2FMoof%2FTexture.cc;h=a701424d5dd7588537dce06511cfb9e1f0fa6c1e;hp=e8f5d86d1f2e65fd85d413c5b93b26bfcedc6ac3;hb=71bd9dbaf1c1e3c55a9f63392a73865d8aeee7d4;hpb=bfa6212d09d8735d8fd5e2638188e4a99f21ada4 diff --git a/src/Moof/Texture.cc b/src/Moof/Texture.cc index e8f5d86..a701424 100644 --- a/src/Moof/Texture.cc +++ b/src/Moof/Texture.cc @@ -33,8 +33,11 @@ #include #include -#include "Dispatcher.hh" -#include "Mippleton.hh" +#include "Dispatch.hh" +#include "Engine.hh" +#include "Exception.hh" +#include "Library.hh" +#include "Log.hh" #include "OpenGL.hh" #include "Texture.hh" @@ -51,7 +54,7 @@ namespace Mf { * objects and avoid having duplicate textures loaded to GL. */ -class Texture::Impl : public Mippleton +class Texture::Impl : public Library { /** @@ -60,15 +63,15 @@ class Texture::Impl : public Mippleton void unloadFromGL() { - if (object_) + if (mObject) { - if (object_ == globalObject_) + if (mObject == gObject) { - globalObject_ = 0; + gObject = 0; } - glDeleteTextures(1, &object_); - object_ = 0; + glDeleteTextures(1, &mObject); + mObject = 0; } } @@ -78,9 +81,9 @@ class Texture::Impl : public Mippleton * to cache it if the client has plenty of RAM. */ - void contextRecreated(const Notification& note) + void contextRecreated() { - object_ = globalObject_ = 0; + mObject = gObject = 0; uploadToGL(); } @@ -130,34 +133,37 @@ public: */ explicit Impl(const std::string& name) : - Mippleton(name), - surface_(0), - width_(0), - height_(0), - mode_(0), - minFilter_(GL_NEAREST), - magFilter_(GL_NEAREST), - wrapS_(GL_CLAMP), - wrapT_(GL_CLAMP), - object_(0) + Library(name), + mContext(0), + mWidth(0), + mHeight(0), + mMode(0), + mMinFilter(GL_NEAREST), + mMagFilter(GL_NEAREST), + mWrapS(GL_CLAMP), + mWrapT(GL_CLAMP), + mObject(0) { - loadFromFile(); + // make sure the engine is initialized + Engine& engine = Engine::getInstance(); + VideoP video = engine.getVideo(); + ASSERT(video && "cannot load textures without a current video context"); // we want to know when the GL context is recreated - Dispatcher::instance().addHandler("video.context_recreated", - boost::bind(&Impl::contextRecreated, this, _1), this); + mDispatchHandler = engine.addHandler("video.newcontext", + boost::bind(&Impl::contextRecreated, this)); + + loadFromFile(); } ~Impl() { - if (surface_) + if (mContext) { - SDL_FreeSurface(surface_); + SDL_FreeSurface(mContext); } unloadFromGL(); - - Dispatcher::instance().removeHandler(this); } @@ -243,7 +249,8 @@ public: if (!surface) { - throw Texture::Exception("loading from file failed"); + logWarning("texture not found: %s", getName().c_str()); + throw Exception(ErrorCode::FILE_NOT_FOUND, getName()); } SDL_Surface* temp = prepareImageForGL(surface); @@ -251,27 +258,27 @@ public: if (!temp) { - throw Texture::Exception("uploading to opengl failed"); + throw Exception(ErrorCode::UNKNOWN_IMAGE_FORMAT, getName()); } if (temp->format->BytesPerPixel == 3) { - mode_ = GL_RGB; + mMode = GL_RGB; } else if (temp->format->BytesPerPixel == 4) { - mode_ = GL_RGBA; + mMode = GL_RGBA; } else { SDL_FreeSurface(temp); - throw Texture::Exception("incompatible color mode"); + throw Exception(ErrorCode::UNKNOWN_IMAGE_FORMAT, getName()); } - width_ = temp->w; - height_ = temp->h; + mWidth = temp->w; + mHeight = temp->h; - surface_ = temp; + mContext = temp; } @@ -282,34 +289,36 @@ public: void uploadToGL() { - if (object_) + if (mObject) { // already loaded return; } - if (!surface_) loadFromFile(); + if (!mContext) loadFromFile(); - glGenTextures(1, &object_); - glBindTexture(GL_TEXTURE_2D, object_); + glGenTextures(1, &mObject); + glBindTexture(GL_TEXTURE_2D, mObject); glTexImage2D + //gluBuild2DMipmaps ( GL_TEXTURE_2D, 0, - mode_, - surface_->w, - surface_->h, + mMode, + //3, + mContext->w, + mContext->h, 0, - mode_, + mMode, GL_UNSIGNED_BYTE, - surface_->pixels + mContext->pixels ); setProperties(); - SDL_FreeSurface(surface_); - surface_ = 0; + SDL_FreeSurface(mContext); + mContext = 0; } @@ -320,75 +329,77 @@ public: void setProperties() { - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter_); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter_); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapS_); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapT_); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mMinFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mMagFilter); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, mWrapS); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, mWrapT); } inline void setMinFilter(GLuint filter) { bind(); - minFilter_ = filter; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, minFilter_); + mMinFilter = filter; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mMinFilter); } inline void setMagFilter(GLuint filter) { bind(); - magFilter_ = filter; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, magFilter_); + mMagFilter = filter; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mMagFilter); } inline void setWrapS(GLuint wrap) { bind(); - wrapS_ = wrap; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrapS_); + mWrapS = wrap; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, mWrapS); } inline void setWrapT(GLuint wrap) { bind(); - wrapT_ = wrap; - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrapT_); + mWrapT = wrap; + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, mWrapT); } inline void bind() { - if (object_ == 0) + if (mObject == 0) { uploadToGL(); } - if (object_ != globalObject_) + if (mObject != gObject) { - glBindTexture(GL_TEXTURE_2D, object_); - globalObject_ = object_; + glBindTexture(GL_TEXTURE_2D, mObject); + gObject = mObject; } } - SDL_Surface* surface_; - unsigned width_; ///< Horizontal dimension of the image. - unsigned height_; ///< Vertical dimension. + SDL_Surface* mContext; + unsigned mWidth; ///< Horizontal dimension of the image. + unsigned mHeight; ///< Vertical dimension. + + GLuint mMode; ///< GL_RGB or GL_RGBA. + GLuint mMinFilter; ///< Minifcation filter. + GLuint mMagFilter; ///< Magnification filter. + GLuint mWrapS; ///< Wrapping behavior horizontally. + GLuint mWrapT; ///< Wrapping behavior vertically. - GLuint mode_; ///< Depth of the image, GL_RGB or GL_RGBA. - GLuint minFilter_; ///< Minifcation filter. - GLuint magFilter_; ///< Magnification filter. - GLuint wrapS_; ///< Wrapping behavior horizontally. - GLuint wrapT_; ///< Wrapping behavior vertically. + GLuint mObject; ///< GL texture handle. + static GLuint gObject; ///< Global GL texture handle. - GLuint object_; ///< GL texture handle. - static GLuint globalObject_; ///< Global GL texture handle. + Dispatch::Handler mDispatchHandler; }; -GLuint Texture::Impl::globalObject_ = 0; +GLuint Texture::Impl::gObject = 0; Texture::Texture(const std::string& name) : // pass through - impl_(Texture::Impl::retain(name), &Texture::Impl::release) {} + mImpl(Texture::Impl::getInstance(name)) {} /** @@ -398,7 +409,7 @@ Texture::Texture(const std::string& name) : void Texture::bind() const { // pass through - impl_->bind(); + mImpl->bind(); } @@ -409,52 +420,52 @@ void Texture::bind() const GLuint Texture::getObject() const { // pass through - return impl_->object_; + return mImpl->mObject; } void Texture::resetBind() { glBindTexture(GL_TEXTURE_2D, 0); - Impl::globalObject_ = 0; + Impl::gObject = 0; } unsigned Texture::getWidth() const { // pass through - return impl_->width_; + return mImpl->mWidth; } unsigned Texture::getHeight() const { // pass through - return impl_->height_; + return mImpl->mHeight; } void Texture::setMinFilter(GLuint filter) { // pass through - impl_->setMinFilter(filter); + mImpl->setMinFilter(filter); } void Texture::setMagFilter(GLuint filter) { // pass through - impl_->setMagFilter(filter); + mImpl->setMagFilter(filter); } void Texture::setWrapS(GLuint wrap) { // pass through - impl_->setWrapS(wrap); + mImpl->setWrapS(wrap); } void Texture::setWrapT(GLuint wrap) { // pass through - impl_->setWrapT(wrap); + mImpl->setWrapT(wrap); }