Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r1432 - trunk/Model/Primitives


Chronological Thread 
  • From: thiago@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r1432 - trunk/Model/Primitives
  • Date: Wed, 27 Jun 2007 18:20:44 -0600 (MDT)

Author: thiago
Date: Wed Jun 27 18:20:43 2007
New Revision: 1432

Modified:
   trunk/Model/Primitives/HeavyTriangle.cc
   trunk/Model/Primitives/HeavyTriangle.h
   trunk/Model/Primitives/TexTriangle.cc
   trunk/Model/Primitives/TexTriangle.h
Log:
Primitives/HeavyTriangle.h
Primitives/TexTriangle.cc
Primitives/HeavyTriangle.cc
Primitives/TexTriangle.h:

Added clone and interpolate functions for these classes. Now it's possible to 
have dynamic scenes that use these primitives.


Modified: trunk/Model/Primitives/HeavyTriangle.cc
==============================================================================
--- trunk/Model/Primitives/HeavyTriangle.cc     (original)
+++ trunk/Model/Primitives/HeavyTriangle.cc     Wed Jun 27 18:20:43 2007
@@ -34,6 +34,7 @@
 #include <iostream>
 #include <sgi_stl_warnings_on.h>
 #include <Model/Intersections/TriangleEdge.h>
+#include <assert.h>
 
 using namespace Manta;
 using namespace std;
@@ -70,6 +71,33 @@
 {
 }
 
+HeavyTriangle* HeavyTriangle::clone(CloneDepth depth, Clonable* incoming)
+{
+  HeavyTriangle *copy;
+  if (incoming)
+    copy = static_cast<HeavyTriangle*>(incoming);
+  else
+    copy = new HeavyTriangle();
+
+  PrimitiveCommon::clone(depth, copy);
+
+  copy->point = point;
+  copy->edge[0] = edge[0];
+  copy->edge[1] = edge[1];
+  copy->n[0] = n[0];
+  copy->n[1] = n[1];
+  copy->n[2] = n[2];
+  return copy;
+}
+
+
+Vector HeavyTriangle::getPoint(int p)
+{
+  assert(p>=0 && p<3);
+  if (p == 0)
+    return point;
+  else return point + edge[p-1];
+}
 
 void HeavyTriangle::intersect(const RenderContext&, RayPacket& rays) const
 {
@@ -113,4 +141,26 @@
   bbox.extendByPoint( point );
   bbox.extendByPoint( point+edge[0] );
   bbox.extendByPoint( point+edge[1] );
+}
+
+Interpolable::InterpErr HeavyTriangle::serialInterpolate(const 
std::vector<keyframe_t> &keyframes)
+{
+  PrimitiveCommon::interpolate(keyframes);
+  point = Vector(0,0,0);
+  edge[0] = edge[1] = Vector(0,0,0);
+  n[0] = n[1] = n[2] = Vector(0,0,0);
+
+  for (int i=0; i < keyframes.size(); ++i) {
+    Interpolable::keyframe_t kt = keyframes[i];
+    HeavyTriangle *tri = dynamic_cast<HeavyTriangle*>(keyframes[i].keyframe);
+    if (tri == NULL)
+      return notInterpolable;
+    point += tri->point * keyframes[i].t;
+    edge[0] += tri->edge[0] * keyframes[i].t;
+    edge[1] += tri->edge[1] * keyframes[i].t;
+    n[0] += tri->n[0] * keyframes[i].t;
+    n[1] += tri->n[1] * keyframes[i].t;
+    n[2] += tri->n[2] * keyframes[i].t;
+  }
+  return success;
 }

Modified: trunk/Model/Primitives/HeavyTriangle.h
==============================================================================
--- trunk/Model/Primitives/HeavyTriangle.h      (original)
+++ trunk/Model/Primitives/HeavyTriangle.h      Wed Jun 27 18:20:43 2007
@@ -65,6 +65,11 @@
                   const Vector& n0_, const Vector& n1_, const Vector& n2_ );
     
     virtual ~HeavyTriangle();
+
+    virtual HeavyTriangle* clone(CloneDepth depth, Clonable* incoming=NULL);
+    virtual InterpErr serialInterpolate(const std::vector<keyframe_t> 
&keyframes);
+
+    Vector getPoint(int p);
     
     virtual void intersect    (const RenderContext& context, RayPacket& 
rays) const;
     virtual void computeNormal(const RenderContext& context, RayPacket 
&rays) const;

Modified: trunk/Model/Primitives/TexTriangle.cc
==============================================================================
--- trunk/Model/Primitives/TexTriangle.cc       (original)
+++ trunk/Model/Primitives/TexTriangle.cc       Wed Jun 27 18:20:43 2007
@@ -33,6 +33,23 @@
   setTexCoordMapper( this );
 }
 
+HeavyTriangle* TexTriangle::clone(CloneDepth depth, Clonable* incoming)
+{
+  TexTriangle *copy;
+  if (incoming)
+    copy = static_cast<TexTriangle*>(static_cast<HeavyTriangle*>(incoming));
+  else
+    copy = new TexTriangle();
+
+  HeavyTriangle::clone(depth, static_cast<HeavyTriangle*>(copy));
+
+  copy->tex[0] = tex[0];
+  copy->tex[1] = tex[1];
+  copy->tex[2] = tex[2];
+
+  return copy;
+}
+
 //Performs the exact same operation as computeTexCoords3
 void TexTriangle::computeTexCoords2(const RenderContext& /*context*/, 
RayPacket& rays) const {
 

Modified: trunk/Model/Primitives/TexTriangle.h
==============================================================================
--- trunk/Model/Primitives/TexTriangle.h        (original)
+++ trunk/Model/Primitives/TexTriangle.h        Wed Jun 27 18:20:43 2007
@@ -49,6 +49,8 @@
                  const Vector &n0_,    const Vector &n1_,    const Vector 
&n2_,
                  const Vector &tex0_,  const Vector &tex1_,  const Vector 
&tex2_ );
     virtual ~TexTriangle() { };
+
+    virtual HeavyTriangle* clone(CloneDepth depth, Clonable* incoming=NULL);
     
     virtual void computeTexCoords2(const RenderContext& context, RayPacket& 
rays) const;
     virtual void computeTexCoords3(const RenderContext& context, RayPacket& 
rays) const {




  • [MANTA] r1432 - trunk/Model/Primitives, thiago, 06/27/2007

Archive powered by MHonArc 2.6.16.

Top of page