diff --git a/binding-mri/sprite-binding.cpp b/binding-mri/sprite-binding.cpp index 2c84321..5216e95 100644 --- a/binding-mri/sprite-binding.cpp +++ b/binding-mri/sprite-binding.cpp @@ -78,6 +78,26 @@ DEF_PROP_B(Sprite, MirrorY) DEF_PROP_B(Sprite, Obscured) DEF_PROP_B(Sprite, PerspectiveMode) + +RB_METHOD(SpriteGetSmooth) +{ + RB_UNUSED_PARAM; + Sprite *k = getPrivateData(self); + bool value = false; + GUARD_EXC( value = k->smooth; ) + return rb_bool_new(value); +} + +RB_METHOD(SpriteSetSmooth) +{ + rb_check_argc(argc, 1); + Sprite *k = getPrivateData(self); + bool value; + rb_bool_arg(*argv, &value); + GUARD_EXC( k->smooth = value; ) + return *argv; +} + RB_METHOD(spriteWidth){ RB_UNUSED_PARAM; @@ -129,6 +149,7 @@ void spriteBindingInit(){ INIT_PROP_BIND( Sprite, Modulate, "modulate" ); INIT_PROP_BIND( Sprite, Obscured, "obscured" ); INIT_PROP_BIND( Sprite, Shader, "shader" ); + INIT_PROP_BIND( Sprite, Smooth, "smooth" ); INIT_PROP_BIND( Sprite, PerspectiveMode, "pm"); INIT_PROP_BIND( Sprite, PerspectiveZ, "pz"); INIT_PROP_BIND( Sprite, PerspectiveRotationX, "rx"); diff --git a/src/gl-fun.h b/src/gl-fun.h index d50aef1..ed4bfd8 100644 --- a/src/gl-fun.h +++ b/src/gl-fun.h @@ -54,6 +54,7 @@ typedef void (APIENTRYP _PFNGLTEXIMAGE2DPROC) (GLenum target, GLint level, GLint typedef void (APIENTRYP _PFNGLTEXSUBIMAGE2DPROC) (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels); typedef void (APIENTRYP _PFNGLTEXPARAMETERIPROC) (GLenum target, GLenum pname, GLint param); typedef void (APIENTRYP _PFNGLACTIVETEXTUREPROC) (GLenum texture); +typedef void (APIENTRYP _PFNGLGENERATEMIPMAPPROC) (GLenum texture); /* Debugging */ typedef void (APIENTRY * _GLDEBUGPROC) (GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void *userParam); @@ -148,6 +149,7 @@ typedef void (APIENTRYP _PFNGLRELEASESHADERCOMPILERPROC) (void); GL_FUN(TexSubImage2D, _PFNGLTEXSUBIMAGE2DPROC) \ GL_FUN(TexParameteri, _PFNGLTEXPARAMETERIPROC) \ GL_FUN(ActiveTexture, _PFNGLACTIVETEXTUREPROC) \ + GL_FUN(GenerateMipmap, _PFNGLGENERATEMIPMAPPROC) \ /* Buffer object */ \ GL_FUN(GenBuffers, _PFNGLGENBUFFERSPROC) \ GL_FUN(DeleteBuffers, _PFNGLDELETEBUFFERSPROC) \ diff --git a/src/gl-util.h b/src/gl-util.h index 4edbcdf..4b699a3 100644 --- a/src/gl-util.h +++ b/src/gl-util.h @@ -92,6 +92,15 @@ namespace TEX{ gl.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mode ? GL_LINEAR : GL_NEAREST); gl.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mode ? GL_LINEAR : GL_NEAREST); } + + static inline void setSmoothMipMaps(bool mode){ + gl.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, mode ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST); + gl.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, mode ? GL_LINEAR_MIPMAP_LINEAR : GL_NEAREST_MIPMAP_NEAREST); + } + + static inline void generateMipMaps(){ + gl.GenerateMipmap(GL_TEXTURE_2D); + } } /* Framebuffer Object */ diff --git a/src/sprite.cpp b/src/sprite.cpp index fb7c625..3fb53f4 100644 --- a/src/sprite.cpp +++ b/src/sprite.cpp @@ -650,6 +650,12 @@ void Sprite::draw(){ glState.blendMode.pushSet(p->blendType); p->bitmap->bindTex(*base); + + if (smooth) + { + //TEX::generateMipMaps(); + TEX::setSmooth(true); + } if (p->wave.active) p->wave.qArray.draw(); @@ -657,6 +663,8 @@ void Sprite::draw(){ p->quad.draw(); glState.blendMode.pop(); + if (smooth) + TEX::setSmooth(false); } void Sprite::onGeometryChange(const Scene::Geometry &geo){ diff --git a/src/sprite.h b/src/sprite.h index 6f24dc7..da5ae6e 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -46,6 +46,8 @@ public: int getWidth() const; int getHeight() const; + bool smooth = false; + void update(); DECL_ATTR( Bitmap, Bitmap* )