Text archives Help
- 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.