added Scene::loadTexture(), filename->image map
git-svn-id: svn://anubis/fart/trunk@384 7f9b0f55-74a9-4bce-be96-3c2cd072584d
This commit is contained in:
parent
7472d6c53c
commit
b4717b7cbc
@ -325,6 +325,24 @@ refptr<Material> Scene::processMaterial(refptr<Node> node)
|
|||||||
{
|
{
|
||||||
material->setTransparency((*it)->getNumber());
|
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;
|
return material;
|
||||||
@ -773,3 +791,31 @@ void Scene::processShapeDefinition(refptr<Node> node)
|
|||||||
= processShape(node->getChildren()[0]);
|
= processShape(node->getChildren()[0]);
|
||||||
m_transforms.pop();
|
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;
|
||||||
|
}
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
#include <utility>
|
#include <utility>
|
||||||
#include <stack>
|
#include <stack>
|
||||||
|
|
||||||
|
#include <FreeImage.h>
|
||||||
|
|
||||||
#include "util/refptr.h"
|
#include "util/refptr.h"
|
||||||
#include "util/Ray.h"
|
#include "util/Ray.h"
|
||||||
#include "util/Color.h"
|
#include "util/Color.h"
|
||||||
@ -80,6 +82,7 @@ class Scene
|
|||||||
std::vector<ShapeRef> processForNode(refptr<Node> node);
|
std::vector<ShapeRef> processForNode(refptr<Node> node);
|
||||||
void processMaterialDefinition(refptr<Node> node);
|
void processMaterialDefinition(refptr<Node> node);
|
||||||
void processShapeDefinition(refptr<Node> node);
|
void processShapeDefinition(refptr<Node> node);
|
||||||
|
FIBITMAP * loadTexture(const std::string & filename);
|
||||||
|
|
||||||
/* rendering parameters */
|
/* rendering parameters */
|
||||||
int m_width;
|
int m_width;
|
||||||
@ -101,6 +104,7 @@ class Scene
|
|||||||
double m_sample_span;
|
double m_sample_span;
|
||||||
double m_half_sample_span;
|
double m_half_sample_span;
|
||||||
std::map< std::string, refptr<Material> > m_materials;
|
std::map< std::string, refptr<Material> > m_materials;
|
||||||
|
std::map< std::string, FIBITMAP * > m_textures;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
#ifndef MATERIAL_H
|
#ifndef MATERIAL_H
|
||||||
#define MATERIAL_H MATERIAL_H
|
#define MATERIAL_H MATERIAL_H
|
||||||
|
|
||||||
|
#include <FreeImage.h>
|
||||||
|
|
||||||
#include "Color.h"
|
#include "Color.h"
|
||||||
|
|
||||||
class Material
|
class Material
|
||||||
@ -16,6 +18,7 @@ class Material
|
|||||||
m_reflectance = 0.0;
|
m_reflectance = 0.0;
|
||||||
m_transparency = 0.0;
|
m_transparency = 0.0;
|
||||||
m_refraction = 1.0;
|
m_refraction = 1.0;
|
||||||
|
m_texture = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setAmbientColor(const Color & ambient)
|
void setAmbientColor(const Color & ambient)
|
||||||
@ -52,6 +55,9 @@ class Material
|
|||||||
void setTransparency(double t) { m_transparency = t; }
|
void setTransparency(double t) { m_transparency = t; }
|
||||||
double getTransparency() const { return m_transparency; }
|
double getTransparency() const { return m_transparency; }
|
||||||
|
|
||||||
|
void setTexture(FIBITMAP * fib) { m_texture = fib; }
|
||||||
|
FIBITMAP * getTexture() const { return m_texture; }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
Color m_ambient_color;
|
Color m_ambient_color;
|
||||||
Color m_diffuse_color;
|
Color m_diffuse_color;
|
||||||
@ -60,6 +66,7 @@ class Material
|
|||||||
double m_reflectance;
|
double m_reflectance;
|
||||||
double m_refraction;
|
double m_refraction;
|
||||||
double m_transparency;
|
double m_transparency;
|
||||||
|
FIBITMAP * m_texture;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
x
Reference in New Issue
Block a user