Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r2221 - trunk/Model/Readers


Chronological Thread 
  • 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.

Top of page