added Scene::loadTexture(), filename->image map

git-svn-id: svn://anubis/fart/trunk@384 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
Josh Holtrop 2010-10-13 21:48:23 +00:00
parent 7472d6c53c
commit b4717b7cbc
3 changed files with 57 additions and 0 deletions

View File

@ -325,6 +325,24 @@ refptr<Material> Scene::processMaterial(refptr<Node> node)
{
material->setTransparency((*it)->getNumber());
}
else if ( typeid(**it) == typeid(TextureNode) )
{
string filename = (*it)->getString();
FIBITMAP * fib = NULL;
if (m_textures.find(filename) != m_textures.end())
{
/* texture already loaded */
fib = m_textures[filename];
}
else
{
fib = loadTexture((*it)->getString());
}
if (fib != NULL)
{
material->setTexture(fib);
}
}
}
return material;
@ -773,3 +791,31 @@ void Scene::processShapeDefinition(refptr<Node> node)
= processShape(node->getChildren()[0]);
m_transforms.pop();
}
FIBITMAP * Scene::loadTexture(const std::string & filename)
{
FREE_IMAGE_FORMAT fif = FreeImage_GetFileType(filename.c_str(), 0);
if (fif == FIF_UNKNOWN)
{
fif = FreeImage_GetFIFFromFilename(filename.c_str());
if (fif == FIF_UNKNOWN)
{
cerr << "Error: couldn't determine image format for \""
<< filename << "\"" << endl;
return NULL;
}
}
if (!FreeImage_FIFSupportsReading(fif))
{
cerr << "Error: image format of \"" << filename
<< "\" does not support reading" << endl;
return NULL;
}
FIBITMAP * fib = FreeImage_Load(fif, filename.c_str(), 0);
if (fib == NULL)
{
cerr << "Error: image \"" << filename << "\" could not be loaded"
<< endl;
}
return fib;
}

View File

@ -8,6 +8,8 @@
#include <utility>
#include <stack>
#include <FreeImage.h>
#include "util/refptr.h"
#include "util/Ray.h"
#include "util/Color.h"
@ -80,6 +82,7 @@ class Scene
std::vector<ShapeRef> processForNode(refptr<Node> node);
void processMaterialDefinition(refptr<Node> node);
void processShapeDefinition(refptr<Node> node);
FIBITMAP * loadTexture(const std::string & filename);
/* rendering parameters */
int m_width;
@ -101,6 +104,7 @@ class Scene
double m_sample_span;
double m_half_sample_span;
std::map< std::string, refptr<Material> > m_materials;
std::map< std::string, FIBITMAP * > m_textures;
};
#endif

View File

@ -2,6 +2,8 @@
#ifndef MATERIAL_H
#define MATERIAL_H MATERIAL_H
#include <FreeImage.h>
#include "Color.h"
class Material
@ -16,6 +18,7 @@ class Material
m_reflectance = 0.0;
m_transparency = 0.0;
m_refraction = 1.0;
m_texture = NULL;
}
void setAmbientColor(const Color & ambient)
@ -52,6 +55,9 @@ class Material
void setTransparency(double t) { m_transparency = t; }
double getTransparency() const { return m_transparency; }
void setTexture(FIBITMAP * fib) { m_texture = fib; }
FIBITMAP * getTexture() const { return m_texture; }
protected:
Color m_ambient_color;
Color m_diffuse_color;
@ -60,6 +66,7 @@ class Material
double m_reflectance;
double m_refraction;
double m_transparency;
FIBITMAP * m_texture;
};
#endif