From b4717b7cbc637306636a05acb3d3bb0727479e48 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Wed, 13 Oct 2010 21:48:23 +0000 Subject: [PATCH] added Scene::loadTexture(), filename->image map git-svn-id: svn://anubis/fart/trunk@384 7f9b0f55-74a9-4bce-be96-3c2cd072584d --- main/Scene-load.cc | 46 ++++++++++++++++++++++++++++++++++++++++++++++ main/Scene.h | 4 ++++ util/Material.h | 7 +++++++ 3 files changed, 57 insertions(+) diff --git a/main/Scene-load.cc b/main/Scene-load.cc index 4bd8c3d..442a955 100644 --- a/main/Scene-load.cc +++ b/main/Scene-load.cc @@ -325,6 +325,24 @@ refptr Scene::processMaterial(refptr 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) = 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; +} diff --git a/main/Scene.h b/main/Scene.h index 0d810fd..6953cac 100644 --- a/main/Scene.h +++ b/main/Scene.h @@ -8,6 +8,8 @@ #include #include +#include + #include "util/refptr.h" #include "util/Ray.h" #include "util/Color.h" @@ -80,6 +82,7 @@ class Scene std::vector processForNode(refptr node); void processMaterialDefinition(refptr node); void processShapeDefinition(refptr 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 > m_materials; + std::map< std::string, FIBITMAP * > m_textures; }; #endif diff --git a/util/Material.h b/util/Material.h index a0633ca..b153703 100644 --- a/util/Material.h +++ b/util/Material.h @@ -2,6 +2,8 @@ #ifndef MATERIAL_H #define MATERIAL_H MATERIAL_H +#include + #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