Text archives Help
- 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 ¢er,
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 ¢er,
double const radius );
+ virtual void setParticle( int const which_one, Color const &color, Point
const ¢er, 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.