Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r1813 - in trunk: Interface Model/Groups Model/MiscObjects Model/Primitives Model/Textures


Chronological Thread 
  • From: boulos@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [Manta] r1813 - in trunk: Interface Model/Groups Model/MiscObjects Model/Primitives Model/Textures
  • Date: Sun, 4 Nov 2007 22:26:34 -0700 (MST)

Author: boulos
Date: Sun Nov  4 22:26:30 2007
New Revision: 1813

Added:
   trunk/Model/Groups/MovingMesh.cc
   trunk/Model/Groups/MovingMesh.h
      - copied, changed from r1808, trunk/Model/Groups/Mesh.h
   trunk/Model/Primitives/MovingKSTriangle.cc
      - copied, changed from r1808, 
trunk/Model/Primitives/KenslerShirleyTriangle.cc
   trunk/Model/Primitives/MovingKSTriangle.h
      - copied, changed from r1808, 
trunk/Model/Primitives/KenslerShirleyTriangle.h
Modified:
   trunk/Interface/MeshTriangle.h
   trunk/Model/Groups/CMakeLists.txt
   trunk/Model/Groups/Mesh.cc
   trunk/Model/Groups/Mesh.h
   trunk/Model/Groups/ObjGroup.cc
   trunk/Model/MiscObjects/KeyFrameAnimation.cc
   trunk/Model/Primitives/CMakeLists.txt
   trunk/Model/Primitives/KenslerShirleyTriangle.cc
   trunk/Model/Textures/ImageTexture.cc
Log:
Interface/MeshTriangle.h

 Making getVertex const and adding MOVING_KS_TRI to the TriangleType
 list.

Model/Groups/Mesh.cc
Model/Groups/Mesh.h

 Making a few functions virtual so that we can subclass from
 Mesh. This results in a slight performance penalty for Mesh users,
 but results in a lot more flexibility in how to arrange a Mesh.


Model/Groups/CMakeLists.txt
Model/Groups/MovingMesh.cc
Model/Groups/MovingMesh.h

 Adding a new "MovingMesh" which represents a pair of timesteps for an
 animation at once. This allows for motion blurred rendering of a
 Mesh.


Model/Groups/ObjGroup.cc

 Adding support for the MOVING_KS_TRIANGLE.

Model/MiscObjects/KeyFrameAnimation.cc

 Making sure that the changed bit is set when the animation updates
 (so that the pipeline knows it needs a reset)

Model/Primitives/CMakeLists.txt
Model/Primitives/MovingKSTriangle.cc
Model/Primitives/MovingKSTriangle.h

 Adding a new moving triangle type based on the KS test.

Model/Primitives/KenslerShirleyTriangle.cc

 Using mesh->getVertex instead of hard coding this.

Model/Textures/ImageTexture.cc

 Letting the user know that OpenEXR is being used.


Modified: trunk/Interface/MeshTriangle.h
==============================================================================
--- trunk/Interface/MeshTriangle.h      (original)
+++ trunk/Interface/MeshTriangle.h      Sun Nov  4 22:26:30 2007
@@ -21,11 +21,10 @@
     }
 
     //which should be 0, 1, or 2.
-    virtual Vector getVertex(unsigned int which)
+    virtual Vector getVertex(unsigned int which) const
     {
       ASSERT(which < 3);
-      const unsigned int index = myID*3;
-      return mesh->vertices[mesh->vertex_indices[index+which]];
+      return mesh->getVertex(myID, which);
     }
 
     virtual void computeBounds(const PreprocessContext& context,
@@ -35,7 +34,11 @@
     }
 
     //List of the triangle classes that implement MeshTriangle.
-    enum TriangleType {WALD_TRI, KENSLER_SHIRLEY_TRI};
+    enum TriangleType {
+      WALD_TRI,
+      KENSLER_SHIRLEY_TRI,
+      MOVING_KS_TRI,
+    };
 
   protected:
     MeshTriangle(): myID(0), mesh(NULL) { }

Modified: trunk/Model/Groups/CMakeLists.txt
==============================================================================
--- trunk/Model/Groups/CMakeLists.txt   (original)
+++ trunk/Model/Groups/CMakeLists.txt   Sun Nov  4 22:26:30 2007
@@ -7,6 +7,8 @@
      Groups/Group.h
      Groups/Mesh.cc
      Groups/Mesh.h
+     Groups/MovingMesh.cc
+     Groups/MovingMesh.h
      Groups/ObjGroup.h
      Groups/ObjGroup.cc
 )

Modified: trunk/Model/Groups/Mesh.cc
==============================================================================
--- trunk/Model/Groups/Mesh.cc  (original)
+++ trunk/Model/Groups/Mesh.cc  Sun Nov  4 22:26:30 2007
@@ -193,10 +193,9 @@
 
 BBox Mesh::getBBox(unsigned int which)
 {
-  const unsigned int index = which*3;
-  const Vector &p1 = vertices[vertex_indices[index+0]];
-  const Vector &p2 = vertices[vertex_indices[index+1]];
-  const Vector &p3 = vertices[vertex_indices[index+2]];
+  const Vector &p1 = getVertex(which, 0);
+  const Vector &p2 = getVertex(which, 1);
+  const Vector &p3 = getVertex(which, 2);
   BBox bbox(p1, p1);
   bbox.extendByPoint(p2);
   bbox.extendByPoint(p3);

Modified: trunk/Model/Groups/Mesh.h
==============================================================================
--- trunk/Model/Groups/Mesh.h   (original)
+++ trunk/Model/Groups/Mesh.h   Sun Nov  4 22:26:30 2007
@@ -47,6 +47,7 @@
     // Should we support having both face_normals and vertex_normals?
 
     Mesh();
+    virtual ~Mesh(){}
 
     virtual Mesh* clone(CloneDepth depth, Clonable* incoming=NULL);
 
@@ -69,15 +70,19 @@
     MeshTriangle* get( size_t i );
     const MeshTriangle* get( size_t i ) const;
 
+    virtual inline Vector getVertex( size_t tri_id, size_t which_vert, Real 
t = 0 ) const {
+      return vertices[vertex_indices[3*tri_id + which_vert]];
+    }
+
     //this only adds the triangle to the group. You still need to add
     //the vertices, materials, etc. to the mesh.
     void addTriangle(MeshTriangle *tri);
 
-    void computeBounds(const PreprocessContext& context, int proc, int 
numProcs) const;
+    virtual void computeBounds(const PreprocessContext& context, int proc, 
int numProcs) const;
 
     // You can't get access to the actual primitive, because it may not
     // actually exist.  You can get the bounds of it, though.
-    BBox getBBox(unsigned int which);
+    virtual BBox getBBox(unsigned int which);
 
     virtual void preprocess(const PreprocessContext& context);
 

Added: trunk/Model/Groups/MovingMesh.cc
==============================================================================
--- (empty file)
+++ trunk/Model/Groups/MovingMesh.cc    Sun Nov  4 22:26:30 2007
@@ -0,0 +1,46 @@
+#include <Model/Groups/MovingMesh.h>
+#include <Core/Util/Preprocessor.h>
+#include <Core/Util/UpdateGraph.h>
+#include <SCIRun/Core/Exceptions/InternalError.h>
+#include <Interface/MeshTriangle.h>
+
+using namespace Manta;
+
+MovingMesh::MovingMesh(Mesh* frame0, Mesh* frame1) :
+  Mesh(),
+  frame0(frame0),
+  frame1(frame1) {
+  vertices = frame0->vertices;
+  vertexNormals = frame0->vertexNormals;
+  texCoords = frame0->texCoords;
+  materials = frame0->materials;
+  vertex_indices = frame0->vertex_indices;
+  normal_indices = frame0->normal_indices;
+  texture_indices = frame0->texture_indices;
+  face_material = frame0->face_material;
+
+  objs = frame0->getVectorOfObjects();
+  for (size_t i = 0; i < objs.size(); i++) {
+    ((MeshTriangle*)objs[i])->attachMesh(this);
+  }
+}
+
+void MovingMesh::computeBounds(const PreprocessContext& context,
+                               int proc, int numProcs) const
+{
+  if (proc == 0) {
+    this->bbox.reset();
+  }
+
+  frame0->computeBounds(context, proc, numProcs);
+  frame1->computeBounds(context, proc, numProcs);
+
+  if (proc == 0) {
+    dirtybbox = false;
+    ((Group*)frame0)->computeBounds(context, bbox);
+    ((Group*)frame1)->computeBounds(context, bbox);
+  }
+
+  //Need to wait for other threads to finish computing bbox
+  barrier.wait(numProcs);
+}

Copied: trunk/Model/Groups/MovingMesh.h (from r1808, 
trunk/Model/Groups/Mesh.h)
==============================================================================
--- trunk/Model/Groups/Mesh.h   (original)
+++ trunk/Model/Groups/MovingMesh.h     Sun Nov  4 22:26:30 2007
@@ -1,5 +1,5 @@
-#ifndef Manta_Model_Groups_Mesh_h
-#define Manta_Model_Groups_Mesh_h
+#ifndef Manta_Model_Groups_MovingMesh_h
+#define Manta_Model_Groups_MovingMesh_h
 
 #include <Core/Geometry/Vector.h>
 #include <Core/Thread/Barrier.h>
@@ -9,83 +9,34 @@
 #include <Interface/RayPacket.h>
 #include <Interface/TexCoordMapper.h>
 #include <Model/Groups/Group.h>
-
+#include <Model/Groups/Mesh.h>
 #include <vector>
 
 namespace Manta
 {
   class MeshTriangle;
   using namespace std;
-  class Mesh : public Group {
+  class MovingMesh : public Mesh {
   public:
+    MovingMesh(Mesh* frame0, Mesh* frame1);
+    virtual ~MovingMesh(){}
 
-    // If a triangle has a vertex without texture coordinates, this
-    // will be its index into the texture_indices array.
-    static const unsigned int kNoTextureIndex;
-
-    vector<Vector> vertices;
-    vector<Vector> vertexNormals;
-    vector<Vector> texCoords;
-//     vector<Vector> faceNormals; //not handled for now
-    vector<Material*> materials;
-
-    //Note: We might want to templatize the indices in case we end up
-    //having lots of meshes with small (less than a short) numbers of
-    //vertices. Most likely though is that we have just one or two
-    //meshes total, so the space savings is minimal and we can just
-    //avoid template ugliness.
-
-    // Per vertex data.  size() == 3*numTriangles;
-    vector<unsigned int> vertex_indices;
-    vector<unsigned int> normal_indices;
-    vector<unsigned int> texture_indices;
-
-    // Per face data.  size() == numTriangles;
-    //vector<unsigned int> face_normals; //not handled for now.
-    vector<unsigned int> face_material;
-
-    // Should we support having both face_normals and vertex_normals?
-
-    Mesh();
-
-    virtual Mesh* clone(CloneDepth depth, Clonable* incoming=NULL);
-
-    virtual InterpErr serialInterpolate(const std::vector<keyframe_t> 
&keyframes);
-    virtual InterpErr parallelInterpolate(const std::vector<keyframe_t> 
&keyframes,
-                                           int proc, int numProc);
-    virtual bool isParallel() const { return true; }
-
-    bool hasVertexNormals() const { return !normal_indices.empty(); }
-    void discardVertexNormals() {
-      normal_indices.clear();
-      vertexNormals.clear();
+    virtual inline Vector getVertex( size_t tri_id, size_t which_vert, Real 
t ) const {
+      return ((1-t)*frame0->getVertex(tri_id, which_vert) +
+                 t *frame1->getVertex(tri_id, which_vert));
     }
-    void interpolateNormals();
-
-    //should not be allowed to use Group's add and set.
-    virtual void add(Object* obj);
-    virtual void set( int i, Object *obj );
-
-    MeshTriangle* get( size_t i );
-    const MeshTriangle* get( size_t i ) const;
-
-    //this only adds the triangle to the group. You still need to add
-    //the vertices, materials, etc. to the mesh.
-    void addTriangle(MeshTriangle *tri);
 
-    void computeBounds(const PreprocessContext& context, int proc, int 
numProcs) const;
+    virtual void computeBounds(const PreprocessContext& context, int proc, 
int numProcs) const;
 
-    // You can't get access to the actual primitive, because it may not
-    // actually exist.  You can get the bounds of it, though.
-    BBox getBBox(unsigned int which);
-
-    virtual void preprocess(const PreprocessContext& context);
-
-    virtual void addToUpdateGraph(ObjectUpdateGraph* graph,
-                                  ObjectUpdateGraphNode* parent);
+    virtual BBox getBBox(unsigned int which) {
+      BBox bbox;
+      bbox.extendByBox(frame0->getBBox(which));
+      bbox.extendByBox(frame1->getBBox(which));
+      return bbox;
+    }
 
-    //removes degenerate triangles from mesh.
-    void removeDegenerateTriangles();
+    Mesh* frame0;
+    Mesh* frame1;
   };
 }
 

Modified: trunk/Model/Groups/ObjGroup.cc
==============================================================================
--- trunk/Model/Groups/ObjGroup.cc      (original)
+++ trunk/Model/Groups/ObjGroup.cc      Sun Nov  4 22:26:30 2007
@@ -3,6 +3,7 @@
 #include <Interface/Texture.h>
 #include <Core/Color/Color.h>
 #include <Core/Color/ColorSpace.h>
+#include <SCIRun/Core/Exceptions/InternalError.h>
 #include <Model/Groups/ObjGroup.h>
 #include <Model/Textures/Constant.h>
 #include <Model/Textures/ImageTexture.h>
@@ -13,6 +14,7 @@
 #include <Model/Materials/Flat.h>
 #include <Model/Primitives/WaldTriangle.h>
 #include <Model/Primitives/KenslerShirleyTriangle.h>
+#include <Model/Primitives/MovingKSTriangle.h>
 
 #include <iostream>
 #include <map>
@@ -205,7 +207,7 @@
 
   WaldTriangle *wald_triangles = NULL;
   KenslerShirleyTriangle *KS_triangles = NULL;
-
+  MovingKSTriangle* MovingKS_triangles = NULL;
   switch (triangleType) {
   case MeshTriangle::WALD_TRI:
     wald_triangles = new WaldTriangle[model->numtriangles];
@@ -213,6 +215,12 @@
   case MeshTriangle::KENSLER_SHIRLEY_TRI:
     KS_triangles = new KenslerShirleyTriangle[model->numtriangles];
     break;
+  case MeshTriangle::MOVING_KS_TRI:
+    MovingKS_triangles = new MovingKSTriangle[model->numtriangles];
+    break;
+  default:
+    throw SCIRun::InternalError("Invalid triangle type", __FILE__, __LINE__);
+    break;
   }
 
   // Read in the groups.
@@ -281,6 +289,9 @@
         break;
       case MeshTriangle::KENSLER_SHIRLEY_TRI:
         addTriangle(&KS_triangles[objs.size()]);
+        break;
+      case MeshTriangle::MOVING_KS_TRI:
+        addTriangle(&MovingKS_triangles[objs.size()]);
         break;
       }
     }

Modified: trunk/Model/MiscObjects/KeyFrameAnimation.cc
==============================================================================
--- trunk/Model/MiscObjects/KeyFrameAnimation.cc        (original)
+++ trunk/Model/MiscObjects/KeyFrameAnimation.cc        Sun Nov  4 22:26:30 
2007
@@ -195,13 +195,14 @@
     return true;
 }
 
-void KeyFrameAnimation::temporaryUpdate(int proc, int numProcs, bool &)
+void KeyFrameAnimation::temporaryUpdate(int proc, int numProcs, bool 
&changed)
 {
   Temp_Callback context;
   context.proc = proc;
   context.numProcs = numProcs;
   context.time = SCIRun::Time::currentSeconds();
   update(context);
+  changed = differentFrame;
 }
 
 void KeyFrameAnimation::intersect(const RenderContext& context, RayPacket& 
rays) const

Modified: trunk/Model/Primitives/CMakeLists.txt
==============================================================================
--- trunk/Model/Primitives/CMakeLists.txt       (original)
+++ trunk/Model/Primitives/CMakeLists.txt       Sun Nov  4 22:26:30 2007
@@ -22,6 +22,8 @@
      Primitives/IsosurfaceOctreeVolume.h
      Primitives/KenslerShirleyTriangle.h
      Primitives/KenslerShirleyTriangle.cc
+     Primitives/MovingKSTriangle.h
+     Primitives/MovingKSTriangle.cc
      Primitives/Parallelogram.cc
      Primitives/Parallelogram.h
      Primitives/Plane.cc

Modified: trunk/Model/Primitives/KenslerShirleyTriangle.cc
==============================================================================
--- trunk/Model/Primitives/KenslerShirleyTriangle.cc    (original)
+++ trunk/Model/Primitives/KenslerShirleyTriangle.cc    Sun Nov  4 22:26:30 
2007
@@ -107,10 +107,9 @@
 
   const sse_t eps4 = set4( T_EPSILON );
 
-  const unsigned int index = myID*3;
-  const Vector p0 = mesh->vertices[mesh->vertex_indices[index+0]];
-  const Vector p1 = mesh->vertices[mesh->vertex_indices[index+1]];
-  const Vector p2 = mesh->vertices[mesh->vertex_indices[index+2]];
+  const Vector p0 = mesh->getVertex(myID, 0);
+  const Vector p1 = mesh->getVertex(myID, 1);
+  const Vector p2 = mesh->getVertex(myID, 2);
 
   const sse_t p1x = set4( p1[ 0 ] );
   const sse_t p1y = set4( p1[ 1 ] );

Copied: trunk/Model/Primitives/MovingKSTriangle.cc (from r1808, 
trunk/Model/Primitives/KenslerShirleyTriangle.cc)
==============================================================================
--- trunk/Model/Primitives/KenslerShirleyTriangle.cc    (original)
+++ trunk/Model/Primitives/MovingKSTriangle.cc  Sun Nov  4 22:26:30 2007
@@ -1,4 +1,4 @@
-#include <Model/Primitives/KenslerShirleyTriangle.h>
+#include <Model/Primitives/MovingKSTriangle.h>
 #include <Interface/Context.h>
 #include <Interface/RayPacket.h>
 #include <Core/Geometry/BBox.h>
@@ -11,18 +11,18 @@
 using namespace Manta;
 using namespace std;
 
-KenslerShirleyTriangle::KenslerShirleyTriangle(Mesh *mesh, unsigned int id):
+MovingKSTriangle::MovingKSTriangle(Mesh *mesh, unsigned int id):
   MeshTriangle(mesh, id)
 {
 }
 
-KenslerShirleyTriangle* KenslerShirleyTriangle::clone(CloneDepth depth, 
Clonable* incoming)
+MovingKSTriangle* MovingKSTriangle::clone(CloneDepth depth, Clonable* 
incoming)
 {
-  KenslerShirleyTriangle *copy;
+  MovingKSTriangle *copy;
   if (incoming)
-    copy = dynamic_cast<KenslerShirleyTriangle*>(incoming);
+    copy = dynamic_cast<MovingKSTriangle*>(incoming);
   else
-    return new KenslerShirleyTriangle(mesh, myID);
+    return new MovingKSTriangle(mesh, myID);
 
   copy->myID = myID;
   copy->mesh = mesh;
@@ -30,13 +30,13 @@
   return copy;
 }
 
-Interpolable::InterpErr KenslerShirleyTriangle::serialInterpolate(const 
std::vector<keyframe_t> &keyframes)
+Interpolable::InterpErr MovingKSTriangle::serialInterpolate(const 
std::vector<keyframe_t> &keyframes)
 {
   //We assume that the mesh has already been interpolated.
   return success;
 }
 
-void KenslerShirleyTriangle::preprocess(const PreprocessContext& context)
+void MovingKSTriangle::preprocess(const PreprocessContext& context)
 {
   if (context.proc != 0) { context.done(); return; }
   //TODO: this materials->preprocess might end up getting called lots
@@ -48,7 +48,7 @@
   context.done();
 }
 
-void KenslerShirleyTriangle::computeTexCoords2(const RenderContext&, 
RayPacket& rays) const
+void MovingKSTriangle::computeTexCoords2(const RenderContext&, RayPacket& 
rays) const
 {
   const int which = myID*3;
 
@@ -97,7 +97,7 @@
     zout = sub4(mul4(x1, y2), mul4(y1, x2));             \
   }
 
-void KenslerShirleyTriangle::intersect( const RenderContext& context, 
RayPacket& rays ) const {
+void MovingKSTriangle::intersect( const RenderContext& context, RayPacket& 
rays ) const {
 
   RayPacketData *data = rays.data;
   const int ray_begin = rays.begin();
@@ -107,35 +107,43 @@
 
   const sse_t eps4 = set4( T_EPSILON );
 
-  const unsigned int index = myID*3;
-  const Vector p0 = mesh->vertices[mesh->vertex_indices[index+0]];
-  const Vector p1 = mesh->vertices[mesh->vertex_indices[index+1]];
-  const Vector p2 = mesh->vertices[mesh->vertex_indices[index+2]];
-
-  const sse_t p1x = set4( p1[ 0 ] );
-  const sse_t p1y = set4( p1[ 1 ] );
-  const sse_t p1z = set4( p1[ 2 ] );
-
-  const sse_t p0x = set4( p0[ 0 ] );
-  const sse_t p0y = set4( p0[ 1 ] );
-  const sse_t p0z = set4( p0[ 2 ] );
-
-  const sse_t edge0x = sub4( p1x, p0x );
-  const sse_t edge0y = sub4( p1y, p0y );
-  const sse_t edge0z = sub4( p1z, p0z );
-
-  const sse_t p2x = set4( p2[ 0 ] );
-  const sse_t p2y = set4( p2[ 1 ] );
-  const sse_t p2z = set4( p2[ 2 ] );
-
-  const sse_t edge1x = sub4( p0x, p2x );
-  const sse_t edge1y = sub4( p0y, p2y );
-  const sse_t edge1z = sub4( p0z, p2z );
+  for ( int ray = sse_begin; ray < sse_end; ray += 4 ) {
 
-  sse_t normalx, normaly, normalz;
-  cross4( normalx, normaly, normalz, edge0x, edge0y, edge0z, edge1x, edge1y, 
edge1z );
+    Vector p0_vec[4];
+    Vector p1_vec[4];
+    Vector p2_vec[4];
+    for (int i = 0; i < 4; i++) {
+      const Vector p0 = mesh->getVertex(myID, 0, rays.getTime(ray + i));
+      const Vector p1 = mesh->getVertex(myID, 1, rays.getTime(ray + i));
+      const Vector p2 = mesh->getVertex(myID, 2, rays.getTime(ray + i));
+      p0_vec[i] = p0;
+      p1_vec[i] = p1;
+      p2_vec[i] = p2;
+    }
 
-  for ( int ray = sse_begin; ray < sse_end; ray += 4 ) {
+    const sse_t p1x = set44( p1_vec[0][0], p1_vec[1][0], p1_vec[2][0], 
p1_vec[3][0] );
+    const sse_t p1y = set44( p1_vec[0][1], p1_vec[1][1], p1_vec[2][1], 
p1_vec[3][1] );
+    const sse_t p1z = set44( p1_vec[0][2], p1_vec[0][2], p1_vec[0][2], 
p1_vec[3][2] );
+
+    const sse_t p0x = set44( p0_vec[0][0], p0_vec[1][0], p0_vec[2][0], 
p0_vec[3][0] );
+    const sse_t p0y = set44( p0_vec[0][1], p0_vec[1][1], p0_vec[2][1], 
p0_vec[3][1] );
+    const sse_t p0z = set44( p0_vec[0][2], p0_vec[0][2], p0_vec[0][2], 
p0_vec[3][2] );
+
+    const sse_t edge0x = sub4( p1x, p0x );
+    const sse_t edge0y = sub4( p1y, p0y );
+    const sse_t edge0z = sub4( p1z, p0z );
+
+    const sse_t p2x = set44( p2_vec[0][0], p2_vec[1][0], p2_vec[2][0], 
p2_vec[3][0] );
+    const sse_t p2y = set44( p2_vec[0][1], p2_vec[1][1], p2_vec[2][1], 
p2_vec[3][1] );
+    const sse_t p2z = set44( p2_vec[0][2], p2_vec[0][2], p2_vec[0][2], 
p2_vec[3][2] );
+
+
+    const sse_t edge1x = sub4( p0x, p2x );
+    const sse_t edge1y = sub4( p0y, p2y );
+    const sse_t edge1z = sub4( p0z, p2z );
+
+    sse_t normalx, normaly, normalz;
+    cross4( normalx, normaly, normalz, edge0x, edge0y, edge0z, edge1x, 
edge1y, edge1z );
 
     const sse_t ox = load44( &data->origin[ 0 ][ ray ] );
     const sse_t oy = load44( &data->origin[ 1 ][ ray ] );
@@ -195,10 +203,15 @@
 
   if ( ray_begin < sse_begin || ray_end > sse_end )
   {
-    const Vector edge0 = p1 - p0;
-    const Vector edge1 = p0 - p2;
-    const Vector normal = Cross( edge0, edge1 );
     for ( int ray = ray_begin; ray < sse_begin; ++ray ) {
+      const Vector p0 = mesh->getVertex(myID, 0, rays.getTime(ray));
+      const Vector p1 = mesh->getVertex(myID, 1, rays.getTime(ray));
+      const Vector p2 = mesh->getVertex(myID, 2, rays.getTime(ray));
+
+      const Vector edge0 = p1 - p0;
+      const Vector edge1 = p0 - p2;
+      const Vector normal = Cross( edge0, edge1 );
+
       const Vector o = Vector( data->origin[ 0 ][ ray ],
                                data->origin[ 1 ][ ray ],
                                data->origin[ 2 ][ ray ] );
@@ -227,6 +240,14 @@
       }
     }
     for ( int ray = sse_end; ray < ray_end; ++ray ) {
+      const Vector p0 = mesh->getVertex(myID, 0, rays.getTime(ray));
+      const Vector p1 = mesh->getVertex(myID, 1, rays.getTime(ray));
+      const Vector p2 = mesh->getVertex(myID, 2, rays.getTime(ray));
+
+      const Vector edge0 = p1 - p0;
+      const Vector edge1 = p0 - p2;
+      const Vector normal = Cross( edge0, edge1 );
+
       const Vector o = Vector( data->origin[ 0 ][ ray ],
                                data->origin[ 1 ][ ray ],
                                data->origin[ 2 ][ ray ] );
@@ -260,20 +281,20 @@
 
 #else // MANTA_SSE
 
-void KenslerShirleyTriangle::intersect( const RenderContext& context, 
RayPacket& rays ) const {
+void MovingKSTriangle::intersect( const RenderContext& context, RayPacket& 
rays ) const {
   RayPacketData *data = rays.data;
   const int ray_begin = rays.begin();
   const int ray_end   = rays.end();
 
-  const unsigned int index = myID*3;
-  const Vector p0 = mesh->vertices[mesh->vertex_indices[index+0]];
-  const Vector p1 = mesh->vertices[mesh->vertex_indices[index+1]];
-  const Vector p2 = mesh->vertices[mesh->vertex_indices[index+2]];
-
-  const Vector edge0 = p1 - p0;
-  const Vector edge1 = p0 - p2;
-  const Vector normal = Cross( edge0, edge1 );
   for ( int ray = ray_begin; ray < ray_end; ++ray ) {
+    const Vector p0 = mesh->getVertex(myID, 0, rays.getTime(ray));
+    const Vector p1 = mesh->getVertex(myID, 1, rays.getTime(ray));
+    const Vector p2 = mesh->getVertex(myID, 2, rays.getTime(ray));
+
+    const Vector edge0 = p1 - p0;
+    const Vector edge1 = p0 - p2;
+    const Vector normal = Cross( edge0, edge1 );
+
     const Vector o = Vector( data->origin[ 0 ][ ray ],
                              data->origin[ 1 ][ ray ],
                              data->origin[ 2 ][ ray ] );
@@ -305,7 +326,7 @@
 
 #endif // MANTA_SSE
 
-void KenslerShirleyTriangle::computeNormal(const RenderContext& context, 
RayPacket &rays) const
+void MovingKSTriangle::computeNormal(const RenderContext& context, RayPacket 
&rays) const
 {
   if (mesh->hasVertexNormals()) {
     for(int ray=rays.begin(); ray<rays.end(); ray++) {
@@ -319,15 +340,15 @@
       rays.setNormal(ray, normal);
     }
   } else {
-    const unsigned int index = myID*3;
-    const Vector p0 = mesh->vertices[mesh->vertex_indices[index+0]];
-    const Vector p1 = mesh->vertices[mesh->vertex_indices[index+1]];
-    const Vector p2 = mesh->vertices[mesh->vertex_indices[index+2]];
-
-    const Vector edge0 = p1 - p0;
-    const Vector edge1 = p2 - p0;
-    const Vector normal = Cross(edge0, edge1);
-    for(int ray=rays.begin(); ray<rays.end(); ray++)
+    for(int ray=rays.begin(); ray<rays.end(); ray++) {
+      const Vector p0 = mesh->getVertex(myID, 0, rays.getTime(ray));
+      const Vector p1 = mesh->getVertex(myID, 1, rays.getTime(ray));
+      const Vector p2 = mesh->getVertex(myID, 2, rays.getTime(ray));
+
+      const Vector edge0 = p1 - p0;
+      const Vector edge1 = p2 - p0;
+      const Vector normal = Cross(edge0, edge1);
       rays.setNormal(ray, normal);
+    }
   }
 }

Copied: trunk/Model/Primitives/MovingKSTriangle.h (from r1808, 
trunk/Model/Primitives/KenslerShirleyTriangle.h)
==============================================================================
--- trunk/Model/Primitives/KenslerShirleyTriangle.h     (original)
+++ trunk/Model/Primitives/MovingKSTriangle.h   Sun Nov  4 22:26:30 2007
@@ -1,5 +1,5 @@
-#ifndef Manta_Model_KenslerShirleyTriangle_h
-#define Manta_Model_KenslerShirleyTriangle_h
+#ifndef Manta_Model_MovingKSTriangle_h
+#define Manta_Model_MovingKSTriangle_h
 
 #include <Interface/MeshTriangle.h>
 #include <Interface/RayPacket.h>
@@ -10,7 +10,7 @@
 
 namespace Manta
 {
-  class KenslerShirleyTriangle : public MeshTriangle, public TexCoordMapper
+  class MovingKSTriangle : public MeshTriangle, public TexCoordMapper
   {
   public:
 
@@ -22,10 +22,10 @@
                    // avoid conflicts.
     };
 
-    KenslerShirleyTriangle() { }
-    KenslerShirleyTriangle(Mesh *mesh, unsigned int id);
+    MovingKSTriangle() { }
+    MovingKSTriangle(Mesh *mesh, unsigned int id);
 
-    virtual KenslerShirleyTriangle* clone(CloneDepth depth, Clonable* 
incoming=NULL);
+    virtual MovingKSTriangle* clone(CloneDepth depth, Clonable* 
incoming=NULL);
     virtual InterpErr serialInterpolate(const std::vector<keyframe_t> 
&keyframes);
 
     virtual void preprocess(const PreprocessContext& context);

Modified: trunk/Model/Textures/ImageTexture.cc
==============================================================================
--- trunk/Model/Textures/ImageTexture.cc        (original)
+++ trunk/Model/Textures/ImageTexture.cc        Sun Nov  4 22:26:30 2007
@@ -62,7 +62,7 @@
     bool isRGBE = ( (file_name.rfind(".hdr") == (file_name.size() - 4) ||
                      file_name.rfind(".pic") == (file_name.size() - 4) ||
                      file_name.rfind(".rgbe") == (file_name.size() - 5)));
-   
+
 
     if (isNrrd) {
       // Check to see if it is a nrrd before trying to read with
@@ -74,7 +74,8 @@
       image = readRGBE(file_name);
       if (stream) (*stream) << "Read by readRGBE\n";
     } else if ( isEXRImage( file_name ) && EXRSupported() ) {
-          image = readEXR( file_name );
+      image = readEXR(file_name);
+      if (stream) (*stream) << "Read by readEXR\n";
     } else if (ImageMagickSupported()) {
       image = readImageMagick( file_name );
       if (stream) (*stream) << "Read by readImageMagick\n";




  • [Manta] r1813 - in trunk: Interface Model/Groups Model/MiscObjects Model/Primitives Model/Textures, boulos, 11/05/2007

Archive powered by MHonArc 2.6.16.

Top of page