materials rendering colors, still need texture support

git-svn-id: svn://anubis/misc/wfobj@23 bd8a9e45-a331-0410-811e-c64571078777
This commit is contained in:
josh 2008-01-28 01:30:29 +00:00
parent 8772342fdb
commit 0ba39b3669
3 changed files with 110 additions and 3 deletions

108
WFMtl.cc
View File

@ -20,6 +20,7 @@ void WFMtl::clear()
{ {
m_data = map< string, vector< vector<string> > >(); m_data = map< string, vector< vector<string> > >();
m_currentMaterialName = ""; m_currentMaterialName = "";
m_attributesPushed = false;
} }
int WFMtl::filesize(const char * filename) int WFMtl::filesize(const char * filename)
@ -77,6 +78,7 @@ bool WFMtl::load(const string & filename)
} }
cout << endl; cout << endl;
} }
it++;
} }
/* END DEBUG */ /* END DEBUG */
@ -134,7 +136,103 @@ void WFMtl::renderBegin(const string & mtlname)
map< string, vector< vector<string> > >::iterator it = m_data.find(mtlname); map< string, vector< vector<string> > >::iterator it = m_data.find(mtlname);
if (it == m_data.end()) if (it == m_data.end())
return; return;
/* TODO: draw the material at it->second */ vector< vector<string> > & stmts = it->second;
int num_stmts = stmts.size();
bool foundTexture = false;
bool didSomething = false;
for (int i = 0; i < num_stmts; i++)
{
string & type = stmts[i][0];
if (type == "Ka") /* set ambient color */
{
if ( (stmts[i].size() == 4) && (stmts[i][1] != "spectral") )
{
pushAttributes();
float mat[4] = {0.0f, 0.0f, 0.0f, 1.0f};
for (int j = 0; j < 3; j++)
sscanf(stmts[i][j+1].c_str(), "%f", &mat[j]);
#ifdef DEBUGGL
cout << " glMaterialfv(GL_FRONT, GL_AMBIENT, {";
for (int j = 0; j < 4; j++)
cout << mat[j] << (j < 3 ? ", " : "})");
cout << endl;
#endif
glMaterialfv(GL_FRONT, GL_AMBIENT, mat);
didSomething = true;
}
}
else if (type == "Kd") /* set diffuse color */
{
if ( (stmts[i].size() == 4) && (stmts[i][1] != "spectral") )
{
pushAttributes();
float mat[4] = {0.0f, 0.0f, 0.0f, 1.0f};
for (int j = 0; j < 3; j++)
sscanf(stmts[i][j+1].c_str(), "%f", &mat[j]);
#ifdef DEBUGGL
cout << " glMaterialfv(GL_FRONT, GL_DIFFUSE, {";
for (int j = 0; j < 4; j++)
cout << mat[j] << (j < 3 ? ", " : "})");
cout << endl;
#endif
glMaterialfv(GL_FRONT, GL_DIFFUSE, mat);
didSomething = true;
}
}
else if (type == "Ks") /* set specular color */
{
if ( (stmts[i].size() == 4) && (stmts[i][1] != "spectral") )
{
pushAttributes();
float mat[4] = {0.0f, 0.0f, 0.0f, 1.0f};
for (int j = 0; j < 3; j++)
sscanf(stmts[i][j+1].c_str(), "%f", &mat[j]);
#ifdef DEBUGGL
cout << " glMaterialfv(GL_FRONT, GL_SPECULAR, {";
for (int j = 0; j < 4; j++)
cout << mat[j] << (j < 3 ? ", " : "})");
cout << endl;
#endif
glMaterialfv(GL_FRONT, GL_SPECULAR, mat);
didSomething = true;
}
}
else if (type == "map_Kd") /* load a diffuse texture */
{
/* TODO: figure out how i want to load the texture */
foundTexture = true;
didSomething = true;
}
}
if (didSomething)
{
pushAttributes();
if (foundTexture)
{
#ifdef DEBUGGL
cout << " glEnable(GL_TEXTURE_2D)" << endl;
#endif
glEnable(GL_TEXTURE_2D);
}
else
{
#ifdef DEBUGGL
cout << " glDisable(GL_TEXTURE_2D)" << endl;
#endif
glDisable(GL_TEXTURE_2D);
}
}
}
void WFMtl::pushAttributes()
{
if (m_attributesPushed)
return;
m_attributesPushed = true;
#ifdef DEBUGGL
cout << " glPushAttrib(GL_LIGHTING_BIT | GL_TEXTURE_BIT)" << endl;
#endif
glPushAttrib(GL_LIGHTING_BIT | GL_TEXTURE_BIT);
} }
void WFMtl::renderEnd(const string & mtlname) void WFMtl::renderEnd(const string & mtlname)
@ -142,6 +240,12 @@ void WFMtl::renderEnd(const string & mtlname)
map< string, vector< vector<string> > >::iterator it = m_data.find(mtlname); map< string, vector< vector<string> > >::iterator it = m_data.find(mtlname);
if (it == m_data.end()) if (it == m_data.end())
return; return;
/* TODO: end the material at it->second */ if (m_attributesPushed)
{
#ifdef DEBUGGL
cout << " glPopAttrib()" << endl;
#endif
glPopAttrib();
}
} }

View File

@ -18,8 +18,10 @@ private:
int filesize(const char * filename); int filesize(const char * filename);
void processInputLine(const std::string & input); void processInputLine(const std::string & input);
std::string stripFirstToken(std::string & input); std::string stripFirstToken(std::string & input);
void pushAttributes();
/* variables */ /* variables */
std::map< std::string, std::vector< std::vector<std::string> > > m_data; std::map< std::string, std::vector< std::vector<std::string> > > m_data;
string m_currentMaterialName; std::string m_currentMaterialName;
bool m_attributesPushed;
}; };

View File

@ -10,6 +10,7 @@
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include "WFObj.hh" #include "WFObj.hh"
#include "WFMtl.hh"
using namespace std; using namespace std;
#define WHITESPACE " \n\r\t\v" #define WHITESPACE " \n\r\t\v"