Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r1847 - in trunk: Core/Geometry Model/Instances Model/Primitives


Chronological Thread 
  • From: thiago@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [Manta] r1847 - in trunk: Core/Geometry Model/Instances Model/Primitives
  • Date: Mon, 12 Nov 2007 12:20:18 -0700 (MST)

Author: thiago
Date: Mon Nov 12 12:20:17 2007
New Revision: 1847

Modified:
   trunk/Core/Geometry/AffineTransform.h
   trunk/Model/Instances/Instance.cc
   trunk/Model/Instances/Instance.h
   trunk/Model/Primitives/Cone.cc
   trunk/Model/Primitives/Cone.h
   trunk/Model/Primitives/Torus.cc
   trunk/Model/Primitives/Torus.h
Log:
Core/Geometry/AffineTransform.h:
 -temporarily made mat public so I could varify it.  Once some linking
  issues are resolved, this can be private again.

Model/Instances/Instance.cc
Model/Instances/Instance.h
Model/Primitives/Torus.cc
Model/Primitives/Cone.cc
Model/Primitives/Torus.h
Model/Primitives/Cone.h :
 -Added cloning and interpolation.


Modified: trunk/Core/Geometry/AffineTransform.h
==============================================================================
--- trunk/Core/Geometry/AffineTransform.h       (original)
+++ trunk/Core/Geometry/AffineTransform.h       Mon Nov 12 12:20:17 2007
@@ -114,8 +114,10 @@
     // computations involving an inverse transpose.
     Vector transpose_mult_point(const Vector& point) const;
     Vector transpose_mult_vector(const Vector& vec) const;
+
+    Real mat[3][4]; //TODO: Once AffineTransformation is Interpolable,
+                    //make this private again!.
   private:
-    Real mat[3][4];
 
     // Pre-multiplication.
     void pre_multiply(Real m[3][3]);

Modified: trunk/Model/Instances/Instance.cc
==============================================================================
--- trunk/Model/Instances/Instance.cc   (original)
+++ trunk/Model/Instances/Instance.cc   Mon Nov 12 12:20:17 2007
@@ -58,9 +58,60 @@
   transform_inv = transform.inverse();
 }
 
+Instance::Instance() : instance(NULL)
+{
+  // By default, use the texture coordinates of the child object
+  tex = this;
+}
+
 Instance::~Instance()
 {
 }
+
+
+Primitive* Instance::clone(CloneDepth depth, Clonable* incoming)
+{
+  Instance *copy;
+  if (incoming)
+    copy = dynamic_cast<Instance*>(incoming);
+  else
+    copy = new Instance();
+
+  copy->tex = tex;   //TODO: is this what we want to do with tex when 
cloning?
+
+  copy->instance = reinterpret_cast<Object*>(instance->clone(depth, 
copy->instance));
+  copy->setTransform(transform);
+  return copy;
+}
+
+Interpolable::InterpErr Instance::serialInterpolate(const 
std::vector<keyframe_t> &keyframes)
+{
+  instance->serialInterpolate(keyframes);
+  
+  for (int r=0; r<3; ++r)
+    for (int c=0; c<4; ++c)
+      transform.mat[r][c] = 0;
+
+  for (size_t i=0; i < keyframes.size(); ++i) {
+    Interpolable::keyframe_t kt = keyframes[i];
+    Instance *instance = dynamic_cast<Instance*>(keyframes[i].keyframe);
+    if (instance == NULL)
+      return notInterpolable;
+
+    //TODO: This is most likely not the right way to interpolate
+    //between two affine transform matrices.  Furthermore, this should
+    //be implemented in the AffineTransform class.
+    for (int r=0; r<3; ++r)
+      for (int c=0; c<4; ++c)
+        transform.mat[r][c] += instance->transform.mat[r][c]*keyframes[i].t;
+  }
+
+  transform_inv = transform.inverse();
+
+  return success;
+}
+
+
 
 void Instance::setTransform(AffineTransform new_transform) {
   transform = new_transform;

Modified: trunk/Model/Instances/Instance.h
==============================================================================
--- trunk/Model/Instances/Instance.h    (original)
+++ trunk/Model/Instances/Instance.h    Mon Nov 12 12:20:17 2007
@@ -44,6 +44,9 @@
     Instance(Object* instance, const AffineTransform& transform);
     virtual ~Instance();
 
+    virtual Primitive* clone(CloneDepth depth, Clonable* incoming);
+    virtual InterpErr serialInterpolate(const std::vector<keyframe_t> 
&keyframes);
+
     // Functions for callbacks (must be pass by value)
     void setTransform(AffineTransform new_transform);
 
@@ -75,6 +78,8 @@
     // Transformation and its inverse.
     AffineTransform transform;
     AffineTransform transform_inv;
+
+    Instance();
   };
 }
 

Modified: trunk/Model/Primitives/Cone.cc
==============================================================================
--- trunk/Model/Primitives/Cone.cc      (original)
+++ trunk/Model/Primitives/Cone.cc      Mon Nov 12 12:20:17 2007
@@ -17,6 +17,38 @@
 {
 }
 
+Cone* Cone::clone(CloneDepth depth, Clonable* incoming)
+{
+  Cone *copy;
+  if (incoming)
+    copy = dynamic_cast<Cone*>(incoming);
+  else
+    copy = new Cone();
+
+  PrimitiveCommon::clone(depth, copy);
+  copy->r = r;
+  copy->h = h;
+  return copy;
+}
+
+Interpolable::InterpErr Cone::serialInterpolate(const 
std::vector<keyframe_t> &keyframes)
+{
+  PrimitiveCommon::interpolate(keyframes);
+  h = 0.0f;
+  r = 0.0f;
+
+  for (size_t i=0; i < keyframes.size(); ++i) {
+    Interpolable::keyframe_t kt = keyframes[i];
+    Cone *cone = dynamic_cast<Cone*>(keyframes[i].keyframe);
+    if (cone == NULL)
+      return notInterpolable;
+    r += cone->r * keyframes[i].t;
+    h += cone->h * keyframes[i].t;
+  }
+  return success;
+}
+
+
 void Cone::computeBounds(const PreprocessContext&, BBox& bbox) const
 {
   bbox.extendByBox(BBox(Vector(-r,-r,0), Vector(r,r,h)));
@@ -95,7 +127,7 @@
 }
 
 void Cone::computeTexCoords2(const RenderContext&,
-                            RayPacket& rays) const
+                 RayPacket& rays) const
 {
   for(int i=rays.begin();i<rays.end();i++)
     rays.setTexCoords(i, rays.scratchpad<Vector>(i));
@@ -103,7 +135,7 @@
 }
 
 void Cone::computeTexCoords3(const RenderContext& context,
-                                     RayPacket& rays) const
+                      RayPacket& rays) const
 {
   computeTexCoords2(context, rays);
 }

Modified: trunk/Model/Primitives/Cone.h
==============================================================================
--- trunk/Model/Primitives/Cone.h       (original)
+++ trunk/Model/Primitives/Cone.h       Mon Nov 12 12:20:17 2007
@@ -13,17 +13,21 @@
     Cone(Material* mat, Real radius, Real height);
     virtual ~Cone();
     
+    virtual Cone* clone(CloneDepth depth, Clonable* incoming);
+    virtual InterpErr serialInterpolate(const std::vector<keyframe_t> 
&keyframes);
+
     virtual void computeBounds(const PreprocessContext& context,
                                BBox& bbox) const;
     virtual void intersect(const RenderContext& context, RayPacket& rays) 
const;
     virtual void computeNormal(const RenderContext& context, RayPacket 
&rays) const;    
     virtual void computeTexCoords2(const RenderContext& context,
-                                  RayPacket& rays) const;
+                   RayPacket& rays) const;
     virtual void computeTexCoords3(const RenderContext& context,
-                                  RayPacket& rays) const;
+                   RayPacket& rays) const;
     
   private:
     Real r, h;
+    Cone(){ } 
   };
 }
 

Modified: trunk/Model/Primitives/Torus.cc
==============================================================================
--- trunk/Model/Primitives/Torus.cc     (original)
+++ trunk/Model/Primitives/Torus.cc     Mon Nov 12 12:20:17 2007
@@ -137,6 +137,37 @@
 {
 }
 
+Torus* Torus::clone(CloneDepth depth, Clonable* incoming)
+{
+  Torus *copy;
+  if (incoming)
+    copy = dynamic_cast<Torus*>(incoming);
+  else
+    copy = new Torus();
+
+  PrimitiveCommon::clone(depth, copy);
+  copy->minor_radius = minor_radius;
+  copy->major_radius = major_radius;
+  return copy;
+}
+
+Interpolable::InterpErr Torus::serialInterpolate(const 
std::vector<keyframe_t> &keyframes)
+{
+  PrimitiveCommon::interpolate(keyframes);
+  minor_radius = 0.0f;
+  major_radius = 0.0f;
+
+  for (size_t i=0; i < keyframes.size(); ++i) {
+    Interpolable::keyframe_t kt = keyframes[i];
+    Torus *torus = dynamic_cast<Torus*>(keyframes[i].keyframe);
+    if (torus == NULL)
+      return notInterpolable;
+    minor_radius += torus->minor_radius * keyframes[i].t;
+    major_radius += torus->major_radius * keyframes[i].t;
+  }
+  return success;
+}
+
 void Torus::computeBounds(const PreprocessContext&, BBox& bbox) const
 {
   bbox.extendByBox(BBox( Vector( -major_radius - minor_radius, -major_radius 
- minor_radius, -minor_radius ),

Modified: trunk/Model/Primitives/Torus.h
==============================================================================
--- trunk/Model/Primitives/Torus.h      (original)
+++ trunk/Model/Primitives/Torus.h      Mon Nov 12 12:20:17 2007
@@ -11,6 +11,9 @@
   public:
     Torus(Material* mat, double minor_radius, double major_radius);
     
+    virtual Torus* clone(CloneDepth depth, Clonable* incoming);
+    virtual InterpErr serialInterpolate(const std::vector<keyframe_t> 
&keyframes);
+
     virtual void computeBounds(const PreprocessContext& context,
                                BBox& bbox) const;
     virtual void intersect(const RenderContext& context, RayPacket& rays) 
const;
@@ -22,6 +25,7 @@
     
   private:
     double minor_radius, major_radius;
+    Torus(){ }
   };
 }
 




  • [Manta] r1847 - in trunk: Core/Geometry Model/Instances Model/Primitives, thiago, 11/12/2007

Archive powered by MHonArc 2.6.16.

Top of page