]> git.tdb.fi Git - libs/gl.git/commitdiff
Support for loading materials from datafiles
authorMikko Rasa <tdb@tdb.fi>
Fri, 9 Nov 2007 17:13:31 +0000 (17:13 +0000)
committerMikko Rasa <tdb@tdb.fi>
Fri, 9 Nov 2007 17:13:31 +0000 (17:13 +0000)
source/material.cpp
source/material.h
source/object.cpp

index 58cd15cb8e122169803ce5015be54681df948173..f165c744fcdf06277c362977954b800c06e6e6df 100644 (file)
@@ -52,5 +52,36 @@ void Material::apply() const
        glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess);
 }
 
+
+Material::Loader::Loader(Material &m):
+       mat(m)
+{
+       add("ambient",   &Loader::ambient);
+       add("diffuse",   &Loader::diffuse);
+       add("specular",  &Loader::specular);
+       add("emission",  &Loader::emission);
+       add("shininess", &Material::shininess);
+}
+
+void Material::Loader::ambient(float r, float g, float b, float a)
+{
+       mat.ambient=GL::Color(r, g, b, a);
+}
+
+void Material::Loader::diffuse(float r, float g, float b, float a)
+{
+       mat.diffuse=GL::Color(r, g, b, a);
+}
+
+void Material::Loader::specular(float r, float g, float b, float a)
+{
+       mat.specular=GL::Color(r, g, b, a);
+}
+
+void Material::Loader::emission(float r, float g, float b, float a)
+{
+       mat.emission=GL::Color(r, g, b, a);
+}
+
 } // namespace GL
 } // namespace Msp
index babf26763b887980eb66bb8dbbb3191eb2e50d4a..0e0033b46e0f3544d477f76185b4f8956701c5ce 100644 (file)
@@ -8,13 +8,35 @@ Distributed under the LGPL
 #ifndef MSP_GL_MATERIAL_H_
 #define MSP_GL_MATERIAL_H_
 
+#include <msp/datafile/loader.h>
 #include "color.h"
 
 namespace Msp {
 namespace GL {
 
+/**
+Stores OpenGL material properties.  Since OpenGL does not support material
+objects, application of material is done with several calls to glMaterial.
+*/
 class Material
 {
+public:
+       class Loader: public DataFile::Loader
+       {
+       private:
+               Material &mat;
+
+       public:
+               Loader(Material &);
+               Material &get_object() const { return mat; }
+       
+       private:
+               void ambient(float, float, float, float);
+               void diffuse(float, float, float, float);
+               void specular(float, float, float, float);
+               void emission(float, float, float, float);
+       };
+
 private:
        Color ambient;
        Color diffuse;
index 3ba2d64c378862ea435f6d371cc4e5ec122a5579..19abe36b766c9f650644824c967060847f6a7b38 100644 (file)
@@ -164,11 +164,10 @@ void Object::Loader::lod_mesh(unsigned l, const string &n)
 
 void Object::Loader::material_inline()
 {
-       throw Exception("material_inline not supported yet");
-       /*RefPtr<Material> mat=new Material;
+       RefPtr<Material> mat=new Material;
        load_sub(*mat);
        coll.add(format("%p%p", &obj, mat.get()), mat.get());
-       obj.material=mat.release();*/
+       obj.material=mat.release();
 }
 
 void Object::Loader::mesh(const string &n)