Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r274 - branches/newPointVector/Model/Instances


Chronological Thread 
  • From: abe@sci.utah.edu
  • To: rtrt@sci.utah.edu
  • Subject: [MANTA] r274 - branches/newPointVector/Model/Instances
  • Date: Tue, 10 May 2005 13:38:31 -0600 (MDT)

Author: abe
Date: Tue May 10 13:38:30 2005
New Revision: 274

Modified:
   branches/newPointVector/Model/Instances/Instance.cc
   branches/newPointVector/Model/Instances/InstanceRST.cc
   branches/newPointVector/Model/Instances/InstanceRT.cc
   branches/newPointVector/Model/Instances/InstanceRT.h
   branches/newPointVector/Model/Instances/InstanceST.cc
   branches/newPointVector/Model/Instances/InstanceST.h
   branches/newPointVector/Model/Instances/InstanceT.cc
Log:
Changes so Instances/ code compiles with new AffineTransform

Modified: branches/newPointVector/Model/Instances/Instance.cc
==============================================================================
--- branches/newPointVector/Model/Instances/Instance.cc (original)
+++ branches/newPointVector/Model/Instances/Instance.cc Tue May 10 13:38:30 
2005
@@ -35,14 +35,14 @@
   instance->computeBounds(context, ibox);
 
   // Transform the eight corners of the child bounding box
-  bbox.extend(transform * Point(ibox[0][0], ibox[0][1], ibox[0][2]));
-  bbox.extend(transform * Point(ibox[0][0], ibox[0][1], ibox[1][2]));
-  bbox.extend(transform * Point(ibox[0][0], ibox[1][1], ibox[0][2]));
-  bbox.extend(transform * Point(ibox[0][0], ibox[1][1], ibox[1][2]));
-  bbox.extend(transform * Point(ibox[1][0], ibox[0][1], ibox[0][2]));
-  bbox.extend(transform * Point(ibox[1][0], ibox[0][1], ibox[1][2]));
-  bbox.extend(transform * Point(ibox[1][0], ibox[1][1], ibox[0][2]));
-  bbox.extend(transform * Point(ibox[1][0], ibox[1][1], ibox[1][2]));
+  bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMin()[1], 
ibox.getMin()[2]));
+  bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMin()[1], 
ibox.getMax()[2]));
+  bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMax()[1], 
ibox.getMin()[2]));
+  bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMax()[1], 
ibox.getMax()[2]));
+  bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMin()[1], 
ibox.getMin()[2]));
+  bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMin()[1], 
ibox.getMax()[2]));
+  bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMax()[1], 
ibox.getMin()[2]));
+  bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMax()[1], 
ibox.getMax()[2]));
 }
 
 void Instance::intersect(const RenderContext& context, RayPacket& rays) const
@@ -143,7 +143,7 @@
     e.ray = old_rays[i];
     e.hitInfo.overrideT(old_minT[i]);
 
-        e.normal = transform * e.normal;
+        e.normal = transpose_mult(transform_inv,e.normal);
         e.normal.normalize();
   }
   rays.resetFlag(RayPacket::HaveHitPositions);

Modified: branches/newPointVector/Model/Instances/InstanceRST.cc
==============================================================================
--- branches/newPointVector/Model/Instances/InstanceRST.cc      (original)
+++ branches/newPointVector/Model/Instances/InstanceRST.cc      Tue May 10 
13:38:30 2005
@@ -51,14 +51,14 @@
   instance->computeBounds(context, ibox);
 
   // Transform the eight corners of the child bounding box
-  bbox.extend(transform * Point(ibox[0][0], ibox[0][1], ibox[0][2]));
-  bbox.extend(transform * Point(ibox[0][0], ibox[0][1], ibox[1][2]));
-  bbox.extend(transform * Point(ibox[0][0], ibox[1][1], ibox[0][2]));
-  bbox.extend(transform * Point(ibox[0][0], ibox[1][1], ibox[1][2]));
-  bbox.extend(transform * Point(ibox[1][0], ibox[0][1], ibox[0][2]));
-  bbox.extend(transform * Point(ibox[1][0], ibox[0][1], ibox[1][2]));
-  bbox.extend(transform * Point(ibox[1][0], ibox[1][1], ibox[0][2]));
-  bbox.extend(transform * Point(ibox[1][0], ibox[1][1], ibox[1][2]));
+  bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMin()[1], 
ibox.getMin()[2]));
+  bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMin()[1], 
ibox.getMax()[2]));
+  bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMax()[1], 
ibox.getMin()[2]));
+  bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMax()[1], 
ibox.getMax()[2]));
+  bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMin()[1], 
ibox.getMin()[2]));
+  bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMin()[1], 
ibox.getMax()[2]));
+  bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMax()[1], 
ibox.getMin()[2]));
+  bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMax()[1], 
ibox.getMax()[2]));
 }
 
 void InstanceRST::intersect(const RenderContext& context, RayPacket& rays) 
const
@@ -145,7 +145,7 @@
     e.ray = old_rays[i];
     e.hitInfo.overrideT(old_minT[i]);
 
-        e.normal = transform_inv * e.normal;
+        e.normal = transpose_mult(transform_inv,e.normal);
     e.normal *= scale;
   }
   rays.resetFlag(RayPacket::HaveHitPositions);

Modified: branches/newPointVector/Model/Instances/InstanceRT.cc
==============================================================================
--- branches/newPointVector/Model/Instances/InstanceRT.cc       (original)
+++ branches/newPointVector/Model/Instances/InstanceRT.cc       Tue May 10 
13:38:30 2005
@@ -9,26 +9,27 @@
 
 using namespace Manta;
 
-InstanceRT::InstanceRT(Object* instance, const AffineTransform& transform)
-  : instance(instance), transform(transform)
+InstanceRT::InstanceRT(Object* instance, const AffineTransform& transform_ )
+  : instance(instance), transform( transform_ ), transform_inv( 
transform_.inverse() )
 {
   // By default, use the texture coordinates and material of the child object
   tex = this;
   material = this;
-  transform.compute_imat();
+
   // Determine the scale of the matrix.  We could use eigenvalue analysis,
   // but this seems easier:  pass in the three axes and make sure that the
   // transformed lengths are all the same
-  Vector v1 = transform.project(Vector(1,0,0));
+  Vector v1 = transform * Vector(1,0,0);
   double l1 = v1.normalize();
-  Vector v2 = transform.project(Vector(0,1,0));
+  Vector v2 = transform * Vector(0,1,0);
   double l2 = v2.normalize();
-  Vector v3 = transform.project(Vector(0,0,1));
+  Vector v3 = transform * Vector(0,0,1);
   double l3 = v3.normalize();
-  if(Abs(l1-1) > 1.e-10 || Abs(l2-1) > 1.e-10 || Abs(l3-1) > 1.e-10){
+
+  if(SCIRun::Abs(l1-1) > 1.e-10 || SCIRun::Abs(l2-1) > 1.e-10 || 
SCIRun::Abs(l3-1) > 1.e-10){
     ostringstream msg;
     msg << "Nonuniform scale for InstanceRT, scalefactor=[" << l1 << ' '
-       << l2 << ' ' << l3 << ']';
+                 << l2 << ' ' << l3 << ']';
     throw BadPrimitive(msg.str());
   }
   
@@ -49,14 +50,15 @@
   instance->computeBounds(context, ibox);
 
   // Transform the eight corners of the child bounding box
-  bbox.extend(transform.project(Point(ibox.min().x(), ibox.min().y(), 
ibox.min().z())));
-  bbox.extend(transform.project(Point(ibox.min().x(), ibox.min().y(), 
ibox.max().z())));
-  bbox.extend(transform.project(Point(ibox.min().x(), ibox.max().y(), 
ibox.min().z())));
-  bbox.extend(transform.project(Point(ibox.min().x(), ibox.max().y(), 
ibox.max().z())));
-  bbox.extend(transform.project(Point(ibox.max().x(), ibox.min().y(), 
ibox.min().z())));
-  bbox.extend(transform.project(Point(ibox.max().x(), ibox.min().y(), 
ibox.max().z())));
-  bbox.extend(transform.project(Point(ibox.max().x(), ibox.max().y(), 
ibox.min().z())));
-  bbox.extend(transform.project(Point(ibox.max().x(), ibox.max().y(), 
ibox.max().z())));
+  bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMin()[1], 
ibox.getMin()[2]));
+  bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMin()[1], 
ibox.getMax()[2]));
+  bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMax()[1], 
ibox.getMin()[2]));
+  bbox.extend(transform * Point(ibox.getMin()[0], ibox.getMax()[1], 
ibox.getMax()[2]));
+  bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMin()[1], 
ibox.getMin()[2]));
+  bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMin()[1], 
ibox.getMax()[2]));
+  bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMax()[1], 
ibox.getMin()[2]));
+  bbox.extend(transform * Point(ibox.getMax()[0], ibox.getMax()[1], 
ibox.getMax()[2]));
+  
 }
 
 void InstanceRT::intersect(const RenderContext& context, RayPacket& rays) 
const
@@ -67,25 +69,27 @@
 
   if(rays.getFlags() & RayPacket::ConstantOrigin){
     RayPacket::Element& e0 = rays.get(0);
-    Point O;
-    transform.unproject(e0.ray.origin(), O);
+
+    Point o = transform_inv * e0.ray.origin();
+
     for(int i = 0;i<rays.getSize();i++){
       RayPacket::Element& e = rays.get(i);
       RayPacket::Element& te = instance_rays.get(i);
-      Vector dir;
-      transform.unproject(e.ray.direction(), dir);
-      te.ray.set(O, dir);
+
+      Vector dir = transform_inv * e.ray.direction();
+
+      te.ray.set(o, dir);
       te.hitInfo.reset(e.hitInfo.minT());
     }
   } else {
     for(int i = 0;i<rays.getSize();i++){
       RayPacket::Element& e = rays.get(i);
       RayPacket::Element& te = instance_rays.get(i);
-      Point O;
-      transform.unproject(e.ray.origin(), O);
-      Vector dir;
-      transform.unproject(e.ray.direction(), dir);
-      te.ray.set(O, dir);
+
+      Point o = transform_inv * e.ray.origin();
+      Vector dir = transform_inv * e.ray.direction();
+
+      te.ray.set(o, dir);
       te.hitInfo.reset(e.hitInfo.minT());
     }
   }
@@ -113,11 +117,11 @@
   for(int i=0;i<rays.getSize();i++){
     RayPacket::Element& e = rays.get(i);
     old_rays[i] = e.ray;
-    Point O;
-    transform.unproject(e.ray.origin(), O);
-    Vector dir;
-    transform.unproject(e.ray.direction(), dir);
-    e.ray.set(O, dir);
+
+    Point o = transform_inv * e.ray.origin();
+    Vector dir = transform_inv * e.ray.direction();
+
+    e.ray.set(o, dir);
   }
   rays.resetFlag(RayPacket::HaveHitPositions);
   for(int i=0;i<rays.getSize();){
@@ -135,7 +139,7 @@
   for(int i=0;i<rays.getSize();i++){
     RayPacket::Element& e = rays.get(i);
     e.ray = old_rays[i];
-    transform.project_normal_inplace(e.normal);
+        e.normal = transpose_mult(transform_inv,e.normal);
   }
   rays.resetFlag(RayPacket::HaveHitPositions);
 }
@@ -169,11 +173,11 @@
   for(int i=0;i<rays.getSize();i++){
     RayPacket::Element& e = rays.get(i);
     old_rays[i] = e.ray;
-    Point O;
-    transform.unproject(e.ray.origin(), O);
-    Vector dir;
-    transform.unproject(e.ray.direction(), dir);
-    e.ray.set(O, dir);
+
+    Point o = transform_inv * e.ray.origin();
+    Vector dir = transform_inv * e.ray.direction();
+
+    e.ray.set(o, dir);
   }
   rays.resetFlag(RayPacket::HaveHitPositions);
   for(int i=0;i<rays.getSize();){
@@ -191,7 +195,7 @@
   for(int i=0;i<rays.getSize();i++){
     RayPacket::Element& e = rays.get(i);
     e.ray = old_rays[i];
-    transform.project_normal_inplace(e.normal);
+        e.normal = transform_inv * e.normal;
   }
   rays.resetFlag(RayPacket::HaveHitPositions);
 }
@@ -205,11 +209,11 @@
   for(int i=0;i<rays.getSize();i++){
     RayPacket::Element& e = rays.get(i);
     old_rays[i] = e.ray;
-    Point O;
-    transform.unproject(e.ray.origin(), O);
-    Vector dir;
-    transform.unproject(e.ray.direction(), dir);
-    e.ray.set(O, dir);
+
+    Point o = transform * e.ray.origin();
+    Vector dir = transform * e.ray.direction();
+
+    e.ray.set(o, dir);
   }
   rays.resetFlag(RayPacket::HaveHitPositions);
   for(int i=0;i<rays.getSize();){
@@ -227,7 +231,7 @@
   for(int i=0;i<rays.getSize();i++){
     RayPacket::Element& e = rays.get(i);
     e.ray = old_rays[i];
-    transform.project_normal_inplace(e.normal);
+        e.normal = transform_inv * e.normal;
   }
   rays.resetFlag(RayPacket::HaveHitPositions);
 }

Modified: branches/newPointVector/Model/Instances/InstanceRT.h
==============================================================================
--- branches/newPointVector/Model/Instances/InstanceRT.h        (original)
+++ branches/newPointVector/Model/Instances/InstanceRT.h        Tue May 10 
13:38:30 2005
@@ -11,7 +11,7 @@
 
   class InstanceRT : public Primitive, public Material, public 
TexCoordMapper {
   public:
-    InstanceRT(Object* instance, const Transform& transform);
+    InstanceRT(Object* instance, const AffineTransform& transform_);
     virtual ~InstanceRT();
 
     // Generic
@@ -34,11 +34,15 @@
                                   RayPacket& rays) const;
 
     void overrideMaterial(Material* material);
+
+
   private:
     Object* instance;
-    AffineTransform transform;
     Material* material;
     const TexCoordMapper* tex;
+        
+        AffineTransform transform;
+        AffineTransform transform_inv;
   };
 }
 

Modified: branches/newPointVector/Model/Instances/InstanceST.cc
==============================================================================
--- branches/newPointVector/Model/Instances/InstanceST.cc       (original)
+++ branches/newPointVector/Model/Instances/InstanceST.cc       Tue May 10 
13:38:30 2005
@@ -32,15 +32,14 @@
 {
   BBox ibox;
   instance->computeBounds(context, ibox);
-  bbox.extend((ibox.min().asVector()*scale).asPoint()+translation);
-  bbox.extend((ibox.max().asVector()*scale).asPoint()+translation);
+  bbox.extend(Point(Vector(ibox.getMin())*scale)+translation);
+  bbox.extend(Point(Vector(ibox.getMax())*scale)+translation);
 }
 
 void InstanceST::intersect(const RenderContext& context, RayPacket& rays) 
const
 {
   RayPacketData raydata;
-  RayPacket instance_rays(raydata, rays.getSize(), rays.getDepth(),
-                         rays.getFlags());
+  RayPacket instance_rays(raydata, rays.getSize(), rays.getDepth(), 
rays.getFlags());
 
   double scales[RayPacket::MaxSize];
   double inv_scales[RayPacket::MaxSize];
@@ -48,48 +47,48 @@
     double iscale = inv_scale.x();
     if(rays.getFlags() & RayPacket::ConstantOrigin){
       RayPacket::Element& e = rays.get(0);
-      Point O((e.ray.origin()-translation)*iscale);
+      Point o( Vector(e.ray.origin()-translation)*iscale );
       for(int i = 0;i<rays.getSize();i++){
-       RayPacket::Element& e = rays.get(i);
-       RayPacket::Element& te = instance_rays.get(i);
-       te.ray.set(O, e.ray.direction());
-       te.hitInfo.reset(e.hitInfo.minT()*iscale);
+                 RayPacket::Element& e = rays.get(i);
+                 RayPacket::Element& te = instance_rays.get(i);
+                 te.ray.set(o, e.ray.direction());
+                 te.hitInfo.reset(e.hitInfo.minT()*iscale);
       }
     } else {
       for(int i = 0;i<rays.getSize();i++){
-       RayPacket::Element& e = rays.get(i);
-       RayPacket::Element& te = instance_rays.get(i);
-       te.ray.set((e.ray.origin()-translation)*iscale, e.ray.direction());
-       te.hitInfo.reset(e.hitInfo.minT()*iscale);
+                 RayPacket::Element& e = rays.get(i);
+                 RayPacket::Element& te = instance_rays.get(i);
+                 
te.ray.set(Point(Vector(e.ray.origin()-translation)*iscale), 
e.ray.direction());
+                 te.hitInfo.reset(e.hitInfo.minT()*iscale);
       }
     }
   } else {
     if(rays.getFlags() & RayPacket::ConstantOrigin){
       RayPacket::Element& e = rays.get(0);
-      Point O((e.ray.origin().asVector()-translation)*inv_scale);
+      Point o(Vector(e.ray.origin()-translation)*inv_scale);
       for(int i = 0;i<rays.getSize();i++){
-       RayPacket::Element& e = rays.get(i);
-       RayPacket::Element& te = instance_rays.get(i);
-       Vector dir(e.ray.direction()*inv_scale);
-       double length = dir.length();
-       inv_scales[i] = length;
-       double ilength = 1./length;
-       scales[i] = ilength;
-       te.ray.set(O, dir*ilength);
-       te.hitInfo.reset(e.hitInfo.minT()*length);
+                 RayPacket::Element& e = rays.get(i);
+                 RayPacket::Element& te = instance_rays.get(i);
+                 Vector dir(e.ray.direction()*inv_scale);
+                 double length = dir.length();
+                 inv_scales[i] = length;
+                 double ilength = 1./length;
+                 scales[i] = ilength;
+                 te.ray.set(o, dir*ilength);
+                 te.hitInfo.reset(e.hitInfo.minT()*length);
       }
     } else {
       for(int i = 0;i<rays.getSize();i++){
-       RayPacket::Element& e = rays.get(i);
-       RayPacket::Element& te = instance_rays.get(i);
-       Vector dir(e.ray.direction()*inv_scale);
-       double length = dir.length();
-       scales[i] = length;
-       double ilength = 1./length;
-       inv_scales[i] = ilength;
-       te.ray.set(Point((e.ray.origin().asVector()-translation)*inv_scale),
-                  dir*ilength);
-       te.hitInfo.reset(e.hitInfo.minT()*length);
+                 RayPacket::Element& e = rays.get(i);
+                 RayPacket::Element& te = instance_rays.get(i);
+                 Vector dir(e.ray.direction()*inv_scale);
+                 double length = dir.length();
+                 scales[i] = length;
+                 double ilength = 1./length;
+                 inv_scales[i] = ilength;
+                 
te.ray.set(Point((Vector(e.ray.origin())-translation)*inv_scale),
+                                                dir*ilength);
+                 te.hitInfo.reset(e.hitInfo.minT()*length);
       }
     }
   }
@@ -140,7 +139,7 @@
     for(int i=0;i<rays.getSize();i++){
       RayPacket::Element& e = rays.get(i);
       old_origins[i] = e.ray.origin();
-      e.ray.setOrigin((old_origins[i]-translation)*is);
+      e.ray.setOrigin(Point(Vector(old_origins[i]-translation)*is));
       old_minT[i] = e.hitInfo.minT();
       e.hitInfo.scaleT(is);
     }
@@ -151,7 +150,7 @@
       old_rays[i] = e.ray;
       Vector dir(e.ray.direction()*inv_scale);
       double ilength = rays.get(i).hitInfo.scratchpad<MPTscale>().scale;
-      e.ray.set(Point((e.ray.origin().asVector()-translation)*inv_scale),
+      e.ray.set(Point((Vector(e.ray.origin())-translation)*inv_scale),
                dir*ilength);
       old_minT[i] = e.hitInfo.minT();
       double length = rays.get(i).hitInfo.scratchpad<MPTscale>().inv_scale;
@@ -221,7 +220,7 @@
     for(int i=0;i<rays.getSize();i++){
       RayPacket::Element& e = rays.get(i);
       old_origins[i] = e.ray.origin();
-      e.ray.setOrigin((old_origins[i]-translation)*is);
+      e.ray.setOrigin(Point(Vector(old_origins[i]-translation)*is));
       old_minT[i] = e.hitInfo.minT();
       e.hitInfo.scaleT(is);
     }
@@ -232,7 +231,7 @@
       old_rays[i] = e.ray;
       Vector dir(e.ray.direction()*inv_scale);
       double ilength = rays.get(i).hitInfo.scratchpad<MPTscale>().scale;
-      e.ray.set(Point((e.ray.origin().asVector()-translation)*inv_scale),
+      e.ray.set(Point((Vector(e.ray.origin())-translation)*inv_scale),
                dir*ilength);
       old_minT[i] = e.hitInfo.minT();
       double length = rays.get(i).hitInfo.scratchpad<MPTscale>().inv_scale;
@@ -280,7 +279,7 @@
     for(int i=0;i<rays.getSize();i++){
       RayPacket::Element& e = rays.get(i);
       old_origins[i] = e.ray.origin();
-      e.ray.setOrigin((old_origins[i]-translation)*is);
+      e.ray.setOrigin(Point(Vector(old_origins[i]-translation)*is));
       old_minT[i] = e.hitInfo.minT();
       e.hitInfo.scaleT(is);
     }
@@ -291,7 +290,7 @@
       old_rays[i] = e.ray;
       Vector dir(e.ray.direction()*inv_scale);
       double ilength = rays.get(i).hitInfo.scratchpad<MPTscale>().scale;
-      e.ray.set(Point((e.ray.origin().asVector()-translation)*inv_scale),
+      e.ray.set(Point((Vector(e.ray.origin())-translation)*inv_scale),
                dir*ilength);
       old_minT[i] = e.hitInfo.minT();
       double length = rays.get(i).hitInfo.scratchpad<MPTscale>().inv_scale;

Modified: branches/newPointVector/Model/Instances/InstanceST.h
==============================================================================
--- branches/newPointVector/Model/Instances/InstanceST.h        (original)
+++ branches/newPointVector/Model/Instances/InstanceST.h        Tue May 10 
13:38:30 2005
@@ -36,6 +36,7 @@
 
     void overrideMaterial(Material* material);
   private:
+
     Object* instance;
     Vector scale;
     Vector translation;

Modified: branches/newPointVector/Model/Instances/InstanceT.cc
==============================================================================
--- branches/newPointVector/Model/Instances/InstanceT.cc        (original)
+++ branches/newPointVector/Model/Instances/InstanceT.cc        Tue May 10 
13:38:30 2005
@@ -26,8 +26,8 @@
 {
   BBox ibox;
   instance->computeBounds(context, ibox);
-  bbox.extend(ibox.min()+translation);
-  bbox.extend(ibox.max()+translation);
+  bbox.extend(ibox.getMin()+translation);
+  bbox.extend(ibox.getMax()+translation);
 }
 
 void InstanceT::intersect(const RenderContext& context, RayPacket& rays) 
const




  • [MANTA] r274 - branches/newPointVector/Model/Instances, abe, 05/10/2005

Archive powered by MHonArc 2.6.16.

Top of page