Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[Manta] r1676 - trunk/Model/Instances


Chronological Thread 
  • From: boulos@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [Manta] r1676 - trunk/Model/Instances
  • Date: Tue, 21 Aug 2007 12:06:37 -0600 (MDT)

Author: boulos
Date: Tue Aug 21 12:06:36 2007
New Revision: 1676

Modified:
   trunk/Model/Instances/Instance.cc
   trunk/Model/Instances/MPT.h
Log:
Model/Instances/Instance.cc
Model/Instances/MPT.h

 Fixing instances by forcing computation of shading data.  Also adding
 a new struct to MPT called InstanceShadingData (how original)


Modified: trunk/Model/Instances/Instance.cc
==============================================================================
--- trunk/Model/Instances/Instance.cc   (original)
+++ trunk/Model/Instances/Instance.cc   Tue Aug 21 12:06:36 2007
@@ -31,6 +31,7 @@
 #include <Interface/Context.h>
 #include <Interface/RayPacket.h>
 #include <Core/Exceptions/BadPrimitive.h>
+#include <Core/Exceptions/InternalError.h>
 #include <Core/Geometry/BBox.h>
 #include <Core/Math/MiscMath.h>
 #include <Core/Util/Preprocessor.h>
@@ -90,17 +91,23 @@
   }
   RayPacketData raydata;
   RayPacket instance_rays(raydata, RayPacket::UnknownShape, rays.begin(), 
rays.end(),
-                          rays.getDepth(), rays.getAllFlags());
+                          rays.getDepth(), 0);
   // TODO(boulos): Make this a lot cleaner and try to easily maintain
   // ray packet properties (probably best to just do so in specialized
   // instance classes though)
 
-  // We don't know if we have a constant scale
-  instance_rays.resetFlag(RayPacket::NormalizedDirections |
-                          RayPacket::HaveInverseDirections |
-                          RayPacket::HaveSigns |
-                          RayPacket::ConstantSigns |
-                          RayPacket::HaveCornerRays);
+
+  // We setup the instance_rays to be normalized (makes it so we don't
+  // need to worry about someone calling normalize directions for us
+  // underneath us and then requiring a scaling on the end).
+  //
+  // Since we're an affine transform, the constant origin property
+  // should be transferred as well.
+  //
+  // Finally, if the parent is a debug packet, we should be too.
+  instance_rays.setFlag(
+    RayPacket::NormalizedDirections &
+    (rays.getAllFlags() & (RayPacket::ConstantOrigin | 
RayPacket::DebugPacket)));
 
   Real scales[RayPacket::MaxSize];
   Real inv_scales[RayPacket::MaxSize];
@@ -140,143 +147,71 @@
   }
 
   instance->intersect(context, instance_rays);
-  for(int i=rays.begin();i<rays.end();i++){
+  for(int i=instance_rays.begin();i<instance_rays.end();i++){
     if(instance_rays.wasHit(i)){
-      // Instance was hit
-      Real s = scales[i];
-      if(rays.hit(i, instance_rays.getMinT(i)*s, material, this, tex)){
-        // Instance is now the closest
-        rays.scratchpad<MPTscale>(i) = 
MPTscale(instance_rays.getHitMaterial(i),
-                                                
instance_rays.getHitPrimitive(i),
-                                                
instance_rays.getHitTexCoordMapper(i),
-                                                s, inv_scales[i]);
+      int end = i+1;
+      // NOTE(boulos): We are almost guaranteed to hit the underlying
+      // primitive if we hit the instance due to the way we setup the
+      // instance minT value. (numerical errors might get us, but
+      // that's a small chance)
+      while (end < instance_rays.end() && instance_rays.wasHit(end))
+        end++;
+      // Compute a group of normals and texcoords
+      RayPacket sub_packet(instance_rays, i, end);
+      sub_packet.computeNormals(context);
+      // NOTE(boulos): Once the texcoords are separated, there will be
+      // another call to texcoords 3 here
+      sub_packet.computeTextureCoordinates2(context);
+
+      for (int j = i; j < end; j++) {
+        Real s = scales[j];
+        if(rays.hit(j,
+                    instance_rays.getMinT(j)*s,
+                    instance_rays.getHitMaterial(j),
+                    this,
+                    this)) {
+          // NOTE(boulos): We're deferring the normal transform until
+          // requested
+          rays.scratchpad<InstanceShadingData>(j) =
+            InstanceShadingData(sub_packet.getNormal(j),
+                                sub_packet.getTexCoords2(j));
+        }
       }
+      i = end;
     }
   }
 }
 
 void Instance::computeNormal(const RenderContext& context, RayPacket& rays) 
const
 {
-  Real old_minT[RayPacket::MaxSize];
-  Ray old_rays[RayPacket::MaxSize];
-
-  // Save the original rays
-  for(int i=rays.begin();i<rays.end();i++){
-    old_rays[i] = rays.getRay(i);
-
-    Vector o = transform_inv.multiply_point(old_rays[i].origin());
-    Vector dir = transform_inv.multiply_vector(old_rays[i].direction());
-
-    Real scale = rays.scratchpad<MPTscale>(i).scale;
-    rays.setRay(i, o, dir*scale);
-    old_minT[i] = rays.getMinT(i);
-    Real inv_scale = rays.scratchpad<MPTscale>(i).inv_scale;
-    rays.scaleMinT(i, inv_scale);
-  }
-  rays.resetFlag(RayPacket::HaveHitPositions);
-
-  // Try to create a ray packet that all use the same child primitive
-  // to compute normals.
-  for(int i=rays.begin();i<rays.end();){
-    const Primitive* prim = rays.scratchpad<MPT>(i).primitive;
-    int end = i+1;
-    while(end < rays.end() && rays.scratchpad<MPT>(end).primitive == prim)
-      end++;
-    RayPacket subPacket(rays, i, end);
-    prim->computeNormal(context, subPacket);
-    i = end;
-  }
-
-  // Put the rays and minT back, scale normal
-  for(int i=rays.begin();i<rays.end();i++){
-    rays.setRay(i, old_rays[i]);
-    rays.overrideMinT(i, old_minT[i]);
-
-    rays.setNormal(i, 
transform_inv.transpose_mult_vector(rays.getNormal(i)));
+  for (int i = rays.begin(); i < rays.end(); i++) {
+    rays.setNormal(i, transform_inv.transpose_mult_vector(
+                     rays.scratchpad<InstanceShadingData>(i).normal));
   }
-  rays.resetFlag(RayPacket::HaveHitPositions);
+  rays.setFlag(RayPacket::HaveNormals);
 }
 
 void Instance::setTexCoordMapper(const TexCoordMapper* new_tex)
 {
-  tex = new_tex;
+  string me(MANTA_FUNC);
+  throw SCIRun::InternalError(me + " shouldn't be called", __FILE__, 
__LINE__);
 }
 
 void Instance::computeTexCoords2(const RenderContext& context,
                                RayPacket& rays) const
 {
-  Real old_minT[RayPacket::MaxSize];
-  Ray old_rays[RayPacket::MaxSize];
-
-  // Save the original rays
-  for(int i=rays.begin();i<rays.end();i++){
-    old_rays[i] = rays.getRay(i);
-
-    Vector o = transform_inv.multiply_point(old_rays[i].origin());
-    Vector dir = transform_inv.multiply_vector(old_rays[i].direction());
-
-    Real scale = rays.scratchpad<MPTscale>(i).scale;
-    rays.setRay(i, o, dir*scale);
-    old_minT[i] = rays.getMinT(i);
-    Real inv_scale = rays.scratchpad<MPTscale>(i).inv_scale;
-    rays.scaleMinT(i, inv_scale);
-  }
-  rays.resetFlag(RayPacket::HaveHitPositions);
-
-  for(int i=rays.begin();i<rays.end();){
-    const TexCoordMapper* tex = rays.scratchpad<MPT>(i).tex;
-    int end = i+1;
-    while(end < rays.end() && rays.scratchpad<MPT>(end).tex == tex)
-      end++;
-    RayPacket subPacket(rays, i, end);
-    tex->computeTexCoords2(context, subPacket);
-    i = end;
-  }
-
-  // Put the rays and minT back
-  for(int i=rays.begin();i<rays.end();i++){
-    rays.setRay(i, old_rays[i]);
-    rays.overrideMinT(i, old_minT[i]);
+  for (int i = rays.begin(); i < rays.end(); i++) {
+    rays.setTexCoords(i, rays.scratchpad<InstanceShadingData>(i).texcoord2);
   }
-  rays.resetFlag(RayPacket::HaveHitPositions);
+  rays.setFlag(RayPacket::HaveTexture2);
 }
 
 void Instance::computeTexCoords3(const RenderContext& context,
-                               RayPacket& rays) const
+                                 RayPacket& rays) const
 {
-  Real old_minT[RayPacket::MaxSize];
-  Ray old_rays[RayPacket::MaxSize];
-
-  // Save the original rays
-  for(int i=rays.begin();i<rays.end();i++){
-    old_rays[i] = rays.getRay(i);
-
-    Vector o = transform_inv.multiply_point(old_rays[i].origin());
-    Vector dir = transform_inv.multiply_vector(old_rays[i].direction());
-
-    Real scale = rays.scratchpad<MPTscale>(i).scale;
-    rays.setRay(i, o, dir*scale);
-    old_minT[i] = rays.getMinT(i);
-    Real inv_scale = rays.scratchpad<MPTscale>(i).inv_scale;
-    rays.scaleMinT(i, inv_scale);
-  }
-  rays.resetFlag(RayPacket::HaveHitPositions);
-
-  for(int i=rays.begin();i<rays.end();){
-    const TexCoordMapper* tex = rays.scratchpad<MPT>(i).tex;
-    int end = i+1;
-    while(end < rays.end() && rays.scratchpad<MPT>(end).tex == tex)
-      end++;
-    RayPacket subPacket(rays, i, end);
-    tex->computeTexCoords3(context, subPacket);
-    i = end;
-  }
-
-  // Put the rays and minT back, scale normal
-  for(int i=rays.begin();i<rays.end();i++){
-    rays.setRay(i, old_rays[i]);
-    rays.overrideMinT(i, old_minT[i]);
+  for (int i = rays.begin(); i < rays.end(); i++) {
+    rays.setTexCoords(i, Vector(0,0,0));
   }
-  rays.resetFlag(RayPacket::HaveHitPositions);
+  rays.setFlag(RayPacket::HaveTexture3);
 }
 

Modified: trunk/Model/Instances/MPT.h
==============================================================================
--- trunk/Model/Instances/MPT.h (original)
+++ trunk/Model/Instances/MPT.h Tue Aug 21 12:06:36 2007
@@ -7,24 +7,26 @@
  * more general spot
  */
 #include <MantaTypes.h>
+#include <Core/Geometry/Vector.h>
+#include <Core/Geometry/VectorT.h>
 
 namespace Manta {
   class Material;
   class Primitive;
   class TexCoordMapper;
-       
+
   // Convenience struct to hold a material, primitive and texcoordmapper
   struct MPT {
     const Material* material;
     const Primitive* primitive;
     const TexCoordMapper* tex;
     MPT(const Material* material, const Primitive* primitive,
-                               const TexCoordMapper* tex)
+                                const TexCoordMapper* tex)
       : material(material), primitive(primitive), tex(tex)
     {
     }
   };
-       
+
   // Convenience struct to hold a material, primitive and texcoordmapper
   // and a scale/inverse scale
   struct MPTscale {
@@ -34,12 +36,28 @@
     Real scale;
     Real inv_scale;
     MPTscale(const Material* material, const Primitive* primitive,
-                                                const TexCoordMapper* tex, 
Real scale, Real inv_scale)
+                                                 const TexCoordMapper* tex, 
Real scale, Real inv_scale)
       : material(material), primitive(primitive), tex(tex),
-                       scale(scale), inv_scale(inv_scale)
+                        scale(scale), inv_scale(inv_scale)
     {
     }
   };
+
+  // Convenience struct to hold normal, texcoord, etc to avoid
+  // stomping useful data in the scratchpad.
+  struct InstanceShadingData {
+    Vector normal;
+    VectorT<Real, 2> texcoord2;
+    // NOTE(boulos): When we update texture coordinates to be
+    // separated add this one too.
+    //
+    //Vector texcoord3;
+
+    InstanceShadingData(const Vector& normal,
+                        const VectorT<Real, 2>& tex2)
+      : normal(normal), texcoord2(tex2) {
+    }
+  };
 }
-       
+
 #endif




  • [Manta] r1676 - trunk/Model/Instances, boulos, 08/21/2007

Archive powered by MHonArc 2.6.16.

Top of page