Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r1753 - in trunk: Interface Model/Groups Model/Readers scenes


Chronological Thread 
  • From: thiago@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [Manta] r1753 - in trunk: Interface Model/Groups Model/Readers scenes
  • Date: Mon, 1 Oct 2007 21:42:10 -0600 (MDT)

Author: thiago
Date: Mon Oct  1 21:42:09 2007
New Revision: 1753

Modified:
   trunk/Interface/MeshTriangle.h
   trunk/Model/Groups/ObjGroup.cc
   trunk/Model/Groups/ObjGroup.h
   trunk/Model/Readers/PlyReader.cc
   trunk/Model/Readers/PlyReader.h
   trunk/scenes/triangleSceneViewer.cc
Log:
Added ability to choose which triangle implementation to use for a mesh.
If there's a nicer software engineering way to do this, let me know.

Modified: trunk/Interface/MeshTriangle.h
==============================================================================
--- trunk/Interface/MeshTriangle.h      (original)
+++ trunk/Interface/MeshTriangle.h      Mon Oct  1 21:42:09 2007
@@ -34,6 +34,8 @@
       bbox.extendByBox(mesh->getBBox(myID));
     }
 
+    //List of the triangle classes that implement MeshTriangle.
+    enum TriangleType {WALD_TRI, KENSLER_SHIRLEY_TRI};
 
   protected:
     MeshTriangle(): myID(0), mesh(NULL) { }

Modified: trunk/Model/Groups/ObjGroup.cc
==============================================================================
--- trunk/Model/Groups/ObjGroup.cc      (original)
+++ trunk/Model/Groups/ObjGroup.cc      Mon Oct  1 21:42:09 2007
@@ -164,7 +164,8 @@
 
 
 ObjGroup::ObjGroup( const char *filename,
-                    Material *defaultMaterial) throw (InputError)
+                    Material *defaultMaterial,
+                    MeshTriangle::TriangleType triangleType) throw 
(InputError)
 {
 
   // Load the model.
@@ -202,8 +203,17 @@
   for (unsigned int i=0; i < model->nummaterials; ++i)
     materials.push_back(material_array[i]);
 
-  //WaldTriangle *triangles = new WaldTriangle[model->numtriangles];
-  KenslerShirleyTriangle *triangles = new 
KenslerShirleyTriangle[model->numtriangles];
+  WaldTriangle *wald_triangles = NULL;
+  KenslerShirleyTriangle *KS_triangles = NULL;
+
+  switch (triangleType) {
+  case MeshTriangle::WALD_TRI:
+    wald_triangles = new WaldTriangle[model->numtriangles];
+    break;
+  case MeshTriangle::KENSLER_SHIRLEY_TRI:
+    KS_triangles = new KenslerShirleyTriangle[model->numtriangles];
+    break;
+  }
 
   // Read in the groups.
   GLMgroup *group = model->groups;
@@ -258,7 +268,15 @@
 //       }
 
       face_material.push_back(material_index);
-      addTriangle(&triangles[objs.size()]);
+
+      switch (triangleType) {
+      case MeshTriangle::WALD_TRI:
+        addTriangle(&wald_triangles[objs.size()]);
+        break;
+      case MeshTriangle::KENSLER_SHIRLEY_TRI:
+        addTriangle(&KS_triangles[objs.size()]);
+        break;
+      }
     }
 
     // Move to the next group.

Modified: trunk/Model/Groups/ObjGroup.h
==============================================================================
--- trunk/Model/Groups/ObjGroup.h       (original)
+++ trunk/Model/Groups/ObjGroup.h       Mon Oct  1 21:42:09 2007
@@ -2,6 +2,7 @@
 #ifndef MODEL_GROUPS_OBJGROUP__H
 #define MODEL_GROUPS_OBJGROUP__H
 
+#include <Interface/MeshTriangle.h>
 #include <Model/Groups/Mesh.h>
 #include <Core/Exceptions/InputError.h>
 #include <Model/Readers/glm/glm.h>
@@ -13,7 +14,9 @@
   class ObjGroup : public Mesh {
   public:
     ObjGroup( const char *filename,
-              Material *defaultMaterial=NULL ) throw (InputError);
+              Material *defaultMaterial=NULL,
+              MeshTriangle::TriangleType triangleType = 
MeshTriangle::KENSLER_SHIRLEY_TRI)
+      throw (InputError);
     virtual ~ObjGroup();
 
   protected:

Modified: trunk/Model/Readers/PlyReader.cc
==============================================================================
--- trunk/Model/Readers/PlyReader.cc    (original)
+++ trunk/Model/Readers/PlyReader.cc    Mon Oct  1 21:42:09 2007
@@ -70,13 +70,18 @@
      return 1;
 }
 
+struct face_cb_data {
+  Mesh *mesh;
+  MeshTriangle::TriangleType triangleType;
+};
+
 int firstVertexIndex, prevVertexIndex;
 static int face_cb(p_ply_argument argument) {
      long length;
      int currVertexIndex;
      
-     Mesh *mesh;
-     ply_get_argument_user_data(argument, (void**) &mesh, NULL);
+     face_cb_data *data;
+     ply_get_argument_user_data(argument, (void**) &data, NULL);
      
      long polyIndex, polyVertex;
      ply_get_argument_element(argument, NULL, &polyIndex);
@@ -85,7 +90,7 @@
 
      //do this once only to add last vertex.
      if (polyIndex == 0 && polyVertex == -1) {
-         addVertex(mesh);
+         addVertex(data->mesh);
      }
      
      currVertexIndex = static_cast<int>(ply_get_argument_value(argument));
@@ -99,14 +104,21 @@
      case 1: prevVertexIndex = currVertexIndex;
        break;
      default: 
-       mesh->vertex_indices.push_back(vertices_start+firstVertexIndex);
-       mesh->vertex_indices.push_back(vertices_start+prevVertexIndex);
-       mesh->vertex_indices.push_back(vertices_start+currVertexIndex);
+       data->mesh->vertex_indices.push_back(vertices_start+firstVertexIndex);
+       data->mesh->vertex_indices.push_back(vertices_start+prevVertexIndex);
+       data->mesh->vertex_indices.push_back(vertices_start+currVertexIndex);
        
-       mesh->face_material.push_back(mesh->materials.size()-1);
-//        mesh->addTriangle(new WaldTriangle);
-       mesh->addTriangle(new KenslerShirleyTriangle);
-
+       data->mesh->face_material.push_back(data->mesh->materials.size()-1);
+       switch (data->triangleType) {
+       case MeshTriangle::WALD_TRI:
+         data->mesh->addTriangle(new WaldTriangle);
+         break;
+       case MeshTriangle::KENSLER_SHIRLEY_TRI:
+         data->mesh->addTriangle(new KenslerShirleyTriangle);
+         break;
+       default: 
+         data->mesh->addTriangle(new KenslerShirleyTriangle);
+       }
          if (coloredTriangleMode) {
          //TODO: handle colored triangles.
 //            group->add(new VertexColoredTriangle(mat, 
@@ -127,7 +139,8 @@
 
 bool
 Manta::readPlyFile(const string fileName, AffineTransform &_t, 
-                   Mesh *mesh, Material *m) {
+                   Mesh *mesh, Material *m,
+                   MeshTriangle::TriangleType triangleType) {
      long nVertices;
      size_t objs_start = mesh->size();
      unsigned int vertex_indices_start = mesh->vertex_indices.size();
@@ -203,7 +216,11 @@
        */
      }
 
-     ply_set_read_cb(ply, "face", "vertex_indices", face_cb, mesh, 0);
+     face_cb_data face_data;
+     face_data.mesh = mesh;
+     face_data.triangleType = triangleType;
+
+     ply_set_read_cb(ply, "face", "vertex_indices", face_cb, &face_data, 0);
 
      if (defaultMaterial)
      { } //do nothing

Modified: trunk/Model/Readers/PlyReader.h
==============================================================================
--- trunk/Model/Readers/PlyReader.h     (original)
+++ trunk/Model/Readers/PlyReader.h     Mon Oct  1 21:42:09 2007
@@ -4,6 +4,7 @@
 
 #include <Core/Geometry/AffineTransform.h>
 #include <Model/Groups/Mesh.h>
+#include <Interface/MeshTriangle.h>
 
 #include <sgi_stl_warnings_off.h>
 #include <string>
@@ -17,7 +18,8 @@
   class Group;
   
   extern "C" bool readPlyFile(const string fileName, AffineTransform &t, 
-                              Mesh *mesh, Material *m=0);
+                              Mesh *mesh, Material *m=0,
+                              MeshTriangle::TriangleType triangleType = 
MeshTriangle::KENSLER_SHIRLEY_TRI);
 }
 
 #endif

Modified: trunk/scenes/triangleSceneViewer.cc
==============================================================================
--- trunk/scenes/triangleSceneViewer.cc (original)
+++ trunk/scenes/triangleSceneViewer.cc Mon Oct  1 21:42:09 2007
@@ -43,6 +43,8 @@
        << " not already contain vertex normals.\n";
   cerr << " -useFaceNormals     - force to use only face normals\n";
   cerr << " -smoothAnimation    - interpolates between keyframes.\n";
+  cerr << " -triangleType       - Triangle implementation to use.\n"
+       << "                       Wald_tri, KS_tri.\n";
   throw IllegalArgument("scene primtest", i, args);
 }
 
@@ -60,6 +62,8 @@
 
   bool setModel = false;
 
+  MeshTriangle::TriangleType triangleType = 
MeshTriangle::KENSLER_SHIRLEY_TRI;
+
   for(size_t i=0;i<args.size();i++){
     string arg = args[i];
     if(arg == "-model"){
@@ -86,8 +90,17 @@
       useFaceNormals = true;
     } else if (arg == "-smoothAnimation") {
       smoothAnimation = true;
-    }
-    else {
+    } else if (arg == "-triangleType") {
+      string triangleName;
+      if (!getStringArg(i, args, triangleName))
+        throw IllegalArgument("scene triangleSceneViewer -triangleType", i, 
args);
+      if (triangleName == "Wald_tri")
+        triangleType = MeshTriangle::WALD_TRI;
+      else if (triangleName == "KS_tri")
+        triangleType = MeshTriangle::KENSLER_SHIRLEY_TRI;
+      else
+        throw IllegalArgument("scene triangleSceneViewer -triangleType", i, 
args);
+    } else {
         argumentError(i, args);
     }
   }
@@ -124,11 +137,11 @@
       frame = new Mesh;
       AffineTransform t;
       t.initWithScale(Vector(1, 1, 1));
-      if (!readPlyFile(modelName, t, frame, NULL)) 
+      if (!readPlyFile(modelName, t, frame, NULL, triangleType)) 
         printf("error loading or reading ply file: %s\n", modelName.c_str());
     }
     else if  (!strncmp(modelName.c_str()+modelName.length()-4, ".obj", 4)) {
-      frame = new ObjGroup(modelName.c_str());
+      frame = new ObjGroup(modelName.c_str(), NULL, triangleType);
     }
     if (useFaceNormals) {
       frame->discardVertexNormals();




  • [Manta] r1753 - in trunk: Interface Model/Groups Model/Readers scenes, thiago, 10/01/2007

Archive powered by MHonArc 2.6.16.

Top of page