Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r841 - in trunk/fox/disco_demo/Engine: ImageTraversers Renderers


Chronological Thread 
  • From: abe@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r841 - in trunk/fox/disco_demo/Engine: ImageTraversers Renderers
  • Date: Fri, 13 Jan 2006 00:51:18 -0700 (MST)

Author: abe
Date: Fri Jan 13 00:51:16 2006
New Revision: 841

Modified:
   trunk/fox/disco_demo/Engine/ImageTraversers/DiscoImageTraverser.cc
   trunk/fox/disco_demo/Engine/Renderers/DiscoRayTracer.cc
Log:

Added loops to create sub-packets containing only rays that actually hit 
something.
Previously functions like RayPacket::computeNormals would do really terrible 
things to the thread's stack.

M    disco_demo/Engine/ImageTraversers/DiscoImageTraverser.cc
M    disco_demo/Engine/Renderers/DiscoRayTracer.cc


Modified: trunk/fox/disco_demo/Engine/ImageTraversers/DiscoImageTraverser.cc
==============================================================================
--- trunk/fox/disco_demo/Engine/ImageTraversers/DiscoImageTraverser.cc  
(original)
+++ trunk/fox/disco_demo/Engine/ImageTraversers/DiscoImageTraverser.cc  Fri 
Jan 13 00:51:16 2006
@@ -215,27 +215,51 @@
         // Since we don't where the overlap is in the packets, the shader is
         // called on all of the samples, including overlap.
         // Create a tile packet.
-        TilePacket packet( disco_tile->getRayPacketData( i ),
-                           disco_tile->getTilePacketData( i ),
-                           disco_tile->getPacketSize( i ),
-                           0,
-                           flags );
-
+        TilePacket tile_packet( disco_tile->getRayPacketData( i ),
+                                disco_tile->getTilePacketData( i ),
+                                disco_tile->getPacketSize( i ),
+                                0,
+                                flags );
+        
         
///////////////////////////////////////////////////////////////////////
         // Shade the packet
-        neighborhood_shader->shade( context, disco_tile, packet );
+
+        // Find the first hit.
+        int start = 0;
+        
+        // This is necessary since calling raypacket.computeNormals assumes
+        // that all of the rays in the packet hit something and have a valid
+        // primitive pointer.
+        for (;start<tile_packet.getSize();++start) {
+
+          while ((start<tile_packet.getSize()) &&
+                 !tile_packet.hitInfo(start).wasHit())
+            ++start;
+          
+          // Find a run of elements that generated hits.
+          int end = start;
+          while (end < tile_packet.getSize() && 
tile_packet.hitInfo(end).wasHit())
+            ++end;
+          
+          // Create a sub packet of elements which generated hits.
+          TilePacket sub_packet( tile_packet, start, end );
+
+          neighborhood_shader->shade( context, disco_tile, sub_packet );
+          
+          start = end;
+        };
 
         
///////////////////////////////////////////////////////////////////////
         // Copy results to a fragment.
         int fragment_size = 0;
-        for (int j=0;j<packet.getSize();++j) {
+        for (int j=0;j<tile_packet.getSize();++j) {
 
           // Make sure the element isn't part of the overlap.
-          TilePacket::Element &t = packet.getTilePacketElement( j );
+          TilePacket::Element &t = tile_packet.getTilePacketElement( j );
           if (!t.overlap) {
           
             Fragment::Element   &f = fragment.get( fragment_size++ );
-            RayPacket::Element  &r = packet.getRayPacketElement( j );
+            RayPacket::Element  &r = tile_packet.getRayPacketElement( j );
 
             // Pixel coordinates.
             f.which_eye = 0;

Modified: trunk/fox/disco_demo/Engine/Renderers/DiscoRayTracer.cc
==============================================================================
--- trunk/fox/disco_demo/Engine/Renderers/DiscoRayTracer.cc     (original)
+++ trunk/fox/disco_demo/Engine/Renderers/DiscoRayTracer.cc     Fri Jan 13 
00:51:16 2006
@@ -117,7 +117,9 @@
   // Find the first hit.
   int start = 0;
 
-  
+  // This is necessary since calling raypacket.computeNormals assumes
+  // that all of the rays in the packet hit something and have a valid
+  // primitive pointer.
   for (;start<tile_packet.getSize();++start) {
 
     while ((start<tile_packet.getSize()) &&




  • [MANTA] r841 - in trunk/fox/disco_demo/Engine: ImageTraversers Renderers, abe, 01/13/2006

Archive powered by MHonArc 2.6.16.

Top of page