]> git.tdb.fi Git - libs/gl.git/commitdiff
Object model for Material and TexEnv
authorMikko Rasa <tdb@tdb.fi>
Wed, 24 Sep 2008 16:10:43 +0000 (16:10 +0000)
committerMikko Rasa <tdb@tdb.fi>
Wed, 24 Sep 2008 16:10:43 +0000 (16:10 +0000)
source/material.cpp
source/material.h
source/object.cpp
source/texenv.cpp [new file with mode: 0644]
source/texenv.h
source/texunit.cpp
source/texunit.h

index 0b888ef519404e164ac32be278f3593fb85edc0e..310834f3554a50619dcc404f066a269ca952d666 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id$
 
 This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Copyright © 2007-2008  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
@@ -44,15 +44,26 @@ void Material::set_shininess(float s)
        shininess=s;
 }
 
-void Material::apply() const
+void Material::bind() const
 {
-       glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.r);
-       glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, &diffuse.r);
-       glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r);
-       glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, &emission.r);
-       glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+       if(current!=this)
+       {
+               glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, &ambient.r);
+               glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, &diffuse.r);
+               glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, &specular.r);
+               glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION, &emission.r);
+               glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
+               current=this;
+       }
 }
 
+void Material::unbind()
+{
+       current=0;
+}
+
+const Material *Material::current=0;
+
 
 Material::Loader::Loader(Material &m):
        mat(m)
index b0c9cd0d3510c2e2d76612bea410f8b13670423a..1da27199aa21ebea2704862527d920de982721c7 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id$
 
 This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Copyright © 2007-2008  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
@@ -56,7 +56,11 @@ public:
        const Color &get_specular() const { return specular; }
        const Color &get_emission() const { return emission; }
        float get_shininess() const { return shininess; }
-       void apply() const;
+       void bind() const;
+
+       static void unbind();
+private:
+       static const Material *current;
 };
 
 } // namespace GL
index 78f445577caa54209044e3db4dc40dd1e33b5cec..db2866115a05561500843a7c7b0c7540b3be328c 100644 (file)
@@ -78,7 +78,7 @@ void Object::setup_render(const ObjectPass &pass) const
                main_texture->bind();
 
        if(material)
-               material->apply();
+               material->bind();
 }
 
 void Object::finish_render(const ObjectPass &pass) const
@@ -94,6 +94,9 @@ void Object::finish_render(const ObjectPass &pass) const
        }
        else if(main_texture)
                Texture::unbind();
+
+       if(material)
+               Material::unbind();
 }
 
 void Object::render(const ObjectPass &pass, const ObjectInstance *inst) const
diff --git a/source/texenv.cpp b/source/texenv.cpp
new file mode 100644 (file)
index 0000000..6e5cca7
--- /dev/null
@@ -0,0 +1,43 @@
+/* $Id$
+
+This file is part of libmspgl
+Copyright © 2008  Mikko Rasa, Mikkosoft Productions
+Distributed under the LGPL
+*/
+
+#include "texenv.h"
+#include "texunit.h"
+
+namespace Msp {
+namespace GL {
+
+TexEnv::TexEnv():
+       mode(MODULATE)
+{ }
+
+void TexEnv::set_mode(TexEnvMode m)
+{
+       mode=m;
+}
+
+void TexEnv::set_color(const Color &c)
+{
+       color=c;
+}
+
+void TexEnv::bind()
+{
+       if(TexUnit::current().set_texenv(this))
+       {
+               glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, mode);
+               glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_COLOR, &color.r);
+       }
+}
+
+void TexEnv::unbind()
+{
+       TexUnit::current().set_texenv(0);
+}
+
+} // namespace GL
+} // namespace Msp
index 6d0eba9f2026f802408c342577f845a582d870a4..b5fee448d64e5cce152ca4eaa3566e3d4f0c9370 100644 (file)
@@ -1,13 +1,16 @@
 /* $Id$
 
 This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Copyright © 2007-2008  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
 #ifndef MSP_GL_TEXENV_H_
 #define MSP_GL_TEXENV_H_
 
+#include "color.h"
+#include "gl.h"
+
 namespace Msp {
 namespace GL {
 
@@ -23,9 +26,19 @@ enum TexEnvMode
 
 class TexEnv
 {
+private:
+       TexEnvMode mode;
+       Color color;
+
 public:
-       void mode(TexEnvMode);
-       void color(float, float, float, float);
+       TexEnv();
+       void set_mode(TexEnvMode);
+       void set_color(const Color &);
+       TexEnvMode get_mode() const { return mode; }
+       const Color &get_color() const { return color; }
+       void bind();
+
+       static void unbind();
 };
 
 } // namespace GL
index 7aced5cc3ba2ab182a4c5e37ce6b37f42e6e21a6..622599a213d2481acba6707e573286b0d4145f9d 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id$
 
 This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Copyright © 2007-2008  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
@@ -27,6 +27,13 @@ bool TexUnit::set_texture(const Texture *tex)
        return result;
 }
 
+bool TexUnit::set_texenv(const TexEnv *env)
+{
+       bool result=(texenv!=env);
+       texenv=env;
+       return result;
+}
+
 TexUnit &TexUnit::activate(unsigned n)
 {
        if(units.size()<=n)
index 0bdb2159ff409beb8383f04444caa1df80a9a117..1b616505ac5d2ea3d6f90cfc54ea5ee9cf6c4ded 100644 (file)
@@ -1,7 +1,7 @@
 /* $Id$
 
 This file is part of libmspgl
-Copyright © 2007  Mikko Rasa, Mikkosoft Productions
+Copyright © 2007-2008  Mikko Rasa, Mikkosoft Productions
 Distributed under the LGPL
 */
 
@@ -13,6 +13,7 @@ Distributed under the LGPL
 namespace Msp {
 namespace GL {
 
+class TexEnv;
 class Texture;
 
 class TexUnit
@@ -20,14 +21,15 @@ class TexUnit
 public:
        TexUnit();
        bool set_texture(const Texture *);
-       const Texture *get_texture() { return texture; }
-       //TexEnv &get_env() { return env; }
+       const Texture *get_texture() const { return texture; }
+       bool set_texenv(const TexEnv *);
+       const TexEnv *get_texenv() const { return texenv; }
 
        static TexUnit &activate(unsigned);
        static TexUnit &current();
 private:
        const Texture *texture;
-       //TexEnv env;
+       const TexEnv *texenv;
 
        static std::vector<TexUnit> units;
        static TexUnit *cur_unit;