Text archives Help
- From: "Thiago Ize" <thiago@sci.utah.edu>
- To: manta@sci.utah.edu
- Subject: [Manta] r2221 - trunk/Model/Readers
- Date: Tue, 22 Apr 2008 20:45:47 -0600 (MDT)
Author: thiago
Date: Tue Apr 22 20:45:46 2008
New Revision: 2221
Modified:
trunk/Model/Readers/IW.cc
trunk/Model/Readers/IW.h
Log:
Updated the iw reader so it can return a mesh. (now it's useful
again). To use it, simply call readIW to get the mesh. That's it :-)
Modified: trunk/Model/Readers/IW.cc
==============================================================================
--- trunk/Model/Readers/IW.cc (original)
+++ trunk/Model/Readers/IW.cc Tue Apr 22 20:45:46 2008
@@ -26,25 +26,101 @@
DEALINGS IN THE SOFTWARE.
*/
-#include <Model/Readers/IW.h>
#include <MantaTypes.h>
#include <Core/Color/ColorSpace.h>
+#include <Core/Color/ColorSpace_fancy.h>
+#include <Model/Materials/Lambertian.h>
+#include <Model/Primitives/WaldTriangle.h>
+#include <Model/Primitives/KenslerShirleyTriangle.h>
+#include <Model/Primitives/MovingKSTriangle.h>
+#include <Model/Readers/IW.h>
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
+#include <map>
using namespace Manta;
using namespace std;
+Mesh* Manta::readIW(const string &filename,
+ const MeshTriangle::TriangleType triangleType)
+{
+ IWObject *iwobject = IWObjectRead(filename.c_str());
+ if (iwobject == NULL) return NULL; //should we throw an error?
+
+ Mesh *mesh = new Mesh;
+
+ mesh->vertices = iwobject->vertices;
+ mesh->vertexNormals = iwobject->vtxnormals;
+
+ //It's possible the .iw file has a lot of redundant shaders, so this
+ //material_cache will remove the redundancies.
+ map<string, int> material_cache;
+ for (size_t i=0; i < iwobject->shaders.size(); ++i) {
+ const string colorName = iwobject->shaders[i].toString();
+ map<string, int>::iterator iter = material_cache.find(colorName);
+ if (iter == material_cache.end()) {
+ //haven't seen this before, so let's add it to the cache.
+ mesh->materials.push_back(new Lambertian(iwobject->shaders[i]));
+ material_cache[colorName] = mesh->materials.size()-1;
+ }
+ }
+
+ WaldTriangle *wald_triangles = NULL;
+ KenslerShirleyTriangle *KS_triangles = NULL;
+ MovingKSTriangle* MovingKS_triangles = NULL;
+ switch (triangleType) {
+ case MeshTriangle::WALD_TRI:
+ wald_triangles = new WaldTriangle[iwobject->triangles.size()];
+ break;
+ case MeshTriangle::KENSLER_SHIRLEY_TRI:
+ KS_triangles = new KenslerShirleyTriangle[iwobject->triangles.size()];
+ break;
+ case MeshTriangle::MOVING_KS_TRI:
+ MovingKS_triangles = new MovingKSTriangle[iwobject->triangles.size()];
+ break;
+ default:
+ throw InternalError("Invalid triangle type");
+ break;
+ }
+
+ for (size_t i=0; i < iwobject->triangles.size(); ++i) {
+ mesh->vertex_indices.push_back(iwobject->triangles[i][0]);
+ mesh->vertex_indices.push_back(iwobject->triangles[i][1]);
+ mesh->vertex_indices.push_back(iwobject->triangles[i][2]);
+ mesh->normal_indices.push_back(iwobject->triangles[i][0]);
+ mesh->normal_indices.push_back(iwobject->triangles[i][1]);
+ mesh->normal_indices.push_back(iwobject->triangles[i][2]);
+
+ const int shaderID = iwobject->triangles[i][3];
+ const string colorName = iwobject->shaders[shaderID].toString();
+ const int id = material_cache[colorName];
+ mesh->face_material.push_back(id);
+
+ switch (triangleType) {
+ case MeshTriangle::WALD_TRI:
+ mesh->addTriangle(&wald_triangles[i]);
+ break;
+ case MeshTriangle::KENSLER_SHIRLEY_TRI:
+ mesh->addTriangle(&KS_triangles[i]);
+ break;
+ case MeshTriangle::MOVING_KS_TRI:
+ mesh->addTriangle(&MovingKS_triangles[i]);
+ break;
+ }
+ }
+ return mesh;
+}
+
// Return null if there was a problem
IWObject* Manta::IWObjectRead(const char* filename) {
// Attempt to open the file
ifstream geomf(filename);
if (!geomf) {
- fprintf(stderr, "Error: cannot open %s for loading\n",
filename);
+ fprintf(stderr, "Error: cannot open %s for loading\n", filename);
return 0;
}
@@ -236,7 +312,7 @@
ifstream bspf(filename);
if (!bspf) {
- fprintf(stderr, "Error: cannot open %s for loading\n",
filename);
+ fprintf(stderr, "Error: cannot open %s for loading\n", filename);
return 0;
}
Modified: trunk/Model/Readers/IW.h
==============================================================================
--- trunk/Model/Readers/IW.h (original)
+++ trunk/Model/Readers/IW.h Tue Apr 22 20:45:46 2008
@@ -64,6 +64,7 @@
#include <Core/Geometry/Vector.h>
#include <Core/Geometry/VectorT.h>
#include <Core/Color/ColorSpace.h>
+#include <Model/Groups/Mesh.h>
#include <MantaTypes.h>
#include <vector>
@@ -73,6 +74,10 @@
class IWNode;
class IWTree;
+ Mesh* readIW(const std::string &filename,
+ const MeshTriangle::TriangleType triangleType=
+ MeshTriangle::KENSLER_SHIRLEY_TRI);
+
// Return null if there was a problem
IWObject* IWObjectRead(const char* filename);
IWTree* IWTreeRead(const char* filename);
- [Manta] r2221 - trunk/Model/Readers, Thiago Ize, 04/22/2008
Archive powered by MHonArc 2.6.16.