Manta Interactive Ray Tracer Development Mailing List

Text archives Help


[MANTA] r572 - in trunk: Model/Primitives scenes


Chronological Thread 
  • From: aek@sci.utah.edu
  • To: manta@sci.utah.edu
  • Subject: [MANTA] r572 - in trunk: Model/Primitives scenes
  • Date: Mon, 26 Sep 2005 19:29:18 -0600 (MDT)

Author: aek
Date: Mon Sep 26 19:29:17 2005
New Revision: 572

Modified:
   trunk/Model/Primitives/ParticleBVH.cc
   trunk/Model/Primitives/ParticleBVH.h
   trunk/scenes/ParticleBVHTest.cc
Log:
Added per-particle color texture.



Modified: trunk/Model/Primitives/ParticleBVH.cc
==============================================================================
--- trunk/Model/Primitives/ParticleBVH.cc       (original)
+++ trunk/Model/Primitives/ParticleBVH.cc       Mon Sep 26 19:29:17 2005
@@ -24,9 +24,11 @@
 
 void ParticleBVH::setParticle(
   int const which_one,
+  Color const &color,
   Point const &center,
   double const radius )
 {
+  particles[ which_one ].color = color;
   particles[ which_one ].center = center;
   particles[ which_one ].radius = radius;
   particles[ which_one ].inverse_radius = 1.0 / radius;
@@ -162,11 +164,11 @@
         double t0 = -r - B;
         if( t0 > 0.0 )
           if ( element.hitInfo.hit( t0, material, this, tex ) )
-            element.hitInfo.scratchpad< ParticleHit >().particle = current;
+            element.hitInfo.scratchpad< int >() = current;
         else {
           double t1 = r - B;
           if ( element.hitInfo.hit( t1, material, this, tex ) )
-            element.hitInfo.scratchpad< ParticleHit >().particle = current;
+            element.hitInfo.scratchpad< int >() = current;
         }
       }
     }
@@ -208,8 +210,27 @@
   rays.computeHitPositions();
   for ( int ray = 0; ray < rays.getSize(); ++ray ) {
     RayPacket::Element &element( rays.get( ray ) );
-    Particle &particle( particles[ element.hitInfo.scratchpad< ParticleHit 
>().particle ] );
+    Particle &particle( particles[ element.hitInfo.scratchpad< int >() ] );
     element.normal = ( element.hitPosition - particle.center ) * 
particle.inverse_radius;
   }
   rays.setFlag( RayPacket::HaveUnitNormals );
+}
+
+ParticleBVH::ParticleTexture::~ParticleTexture()
+{
+}
+
+void ParticleBVH::ParticleTexture::setParticleBVH(
+    ParticleBVH const *particlebvh )
+{
+    this->particlebvh = particlebvh;
+}
+
+void ParticleBVH::ParticleTexture::mapValues(
+    RenderContext const &context,
+    RayPacket &rays,
+    Color results[] ) const
+{
+    for ( int ray = 0; ray < rays.getSize(); ray++ )
+      results[ ray ] = particlebvh->particles[ rays.get( ray 
).hitInfo.scratchpad< int >() ].color;
 }

Modified: trunk/Model/Primitives/ParticleBVH.h
==============================================================================
--- trunk/Model/Primitives/ParticleBVH.h        (original)
+++ trunk/Model/Primitives/ParticleBVH.h        Mon Sep 26 19:29:17 2005
@@ -4,6 +4,8 @@
 #include <Model/Primitives/PrimitiveCommon.h>
 #include <Core/Geometry/PointVector.h>
 #include <Core/Geometry/BBox.h>
+#include <Core/Color/Color.h>
+#include <Interface/Texture.h>
 
 namespace Manta {
   class ParticleBVH : public PrimitiveCommon {
@@ -12,7 +14,7 @@
     ParticleBVH( Material *material, int const number_of_particles );
     virtual ~ParticleBVH();
 
-    virtual void setParticle( int const which_one, Point const &center, 
double const radius );
+    virtual void setParticle( int const which_one, Color const &color, Point 
const &center, double const radius );
     virtual void preprocess( PreprocessContext const &context );
     virtual void computeBounds( PreprocessContext const &context, BBox &box 
) const;
     virtual void intersect( RenderContext const &context, RayPacket &rays ) 
const;
@@ -24,6 +26,7 @@
 
     int number_of_particles;
     struct Particle {
+      Color color;
       Point center;
       double radius;
       double inverse_radius;
@@ -35,15 +38,20 @@
       unsigned int axis : 2;
       bool leaf : 1;
     } *nodes;
-    struct ParticleHit{
-      int particle;
-    };
 
     int partition( int first, int last, int const axis, double const 
position );
     int build( int const index, int const first, int const last, int const 
size );
     bool testBox( RayPacket &rays, BBox const &box ) const;
     bool intersectParticles( RayPacket &rays, int const first, int const 
last ) const;
 
+  public:
+    class ParticleTexture : public Texture< Color > {
+        ParticleBVH const *particlebvh;
+      public:
+        virtual ~ParticleTexture();
+        virtual void setParticleBVH( ParticleBVH const *particlebvh );
+        virtual void mapValues( RenderContext const &context, RayPacket 
&rays, Color results[] ) const;
+    };
   };
 }
 

Modified: trunk/scenes/ParticleBVHTest.cc
==============================================================================
--- trunk/scenes/ParticleBVHTest.cc     (original)
+++ trunk/scenes/ParticleBVHTest.cc     Mon Sep 26 19:29:17 2005
@@ -57,13 +57,19 @@
   in >> number_of_particles >> number_of_variables >> radius_index;
   if ( maximum_particles > 0 )
     number_of_particles = min( number_of_particles, maximum_particles );
-  Material *material = new Lambertian( Color( RGB( 0.2, 0.5, 0.7 ) ) );
+  ParticleBVH::ParticleTexture *texture = new ParticleBVH::ParticleTexture();
+  Material *material = new Lambertian( texture );
   ParticleBVH *bvh = new ParticleBVH( material, number_of_particles );
+  texture->setParticleBVH( bvh );
   float data[ number_of_variables ];
   for ( int particle = 0; particle < number_of_particles; ++particle ) {
     for ( int variable = 0; variable < number_of_variables; ++variable )
       in >> data[ variable ];
+    float angle = particle * 2 * M_PI / number_of_particles;
     bvh->setParticle( particle,
+                      Color( RGB( sin( angle ) * 0.4 + 0.5,
+                                  sin( angle + M_PI * 2 / 3 ) * 0.4 + 0.5,
+                                  sin( angle + M_PI * 4 / 3 ) * 0.4 + 0.5 ) 
),
                       Point( data[ 0 ], data[ 1 ], data[ 2 ] ),
                       radius_index > 0 ? data[ radius_index ] : 
default_radius );
   }




  • [MANTA] r572 - in trunk: Model/Primitives scenes, aek, 09/26/2005

Archive powered by MHonArc 2.6.16.

Top of page