Text archives Help
- 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.