Video shows 1000 particles, emit rate 100 every 5 seconds and at death it sets each particles gravity to 0. Not sure what this feature could be used for but I just thought it would be cool to have :-)
[media='640x360']
[/media]
// ################################
// Test Particle system
asset_bs = new lsAsset_BulletShape( vortxge->getAsset_manager() );
asset_bs->Make_Box( 0.5, 0.5, 0.5 );
vortxge->getAsset_manager()->Add_Asset( "bullet/particlebox", asset_bs );
lsParticleEmitter *pe;
pe = new lsParticleEmitter( 1000, vortxge->getOpenGL(), demo_scene );
if( pe )
{
pe->position = lsVector3( 0.0, 25.0, 0.0 );
pe->setDeath_type( LSDT_PARTICLE_GRAVITY );
pe->Set_EmitRate( 100, 5*1000, 10*1000 );
pe->Set_Volume( 20.0, 5.0, 20.0 );
// Add light
demo_scene->setFoundNode(0);
demo_scene->Find_Node( demo_scene, "Spot" );
if( demo_scene->getFoundNode() )
{
lsLight *light = (lsLight*)demo_scene->getFoundNode();
pe->Add_Light( light );
}
// Set mesh
lsAsset_Mesh *amesh;
amesh = (lsAsset_Mesh*)vortxge->getAsset_manager()->Find_Asset( LSAT_MESH, "data/vbm/Cube.vbm" );
if( amesh )
{
pe->mesh = amesh->getMesh();
}
pe->Init( 1.5, asset_bs, demo_scene );
demo_scene->Add_Node( pe );
}
[Code]
bool lsFilterCallback::needBroadphaseCollision( btBroadphaseProxy* proxy0, btBroadphaseProxy* proxy1 ) const
{
bool collides = (proxy0->m_collisionFilterGroup & proxy1->m_collisionFilterMask) != 0;
collides = collides && (proxy1->m_collisionFilterGroup & proxy0->m_collisionFilterMask);
//add some additional logic here that modifies 'collides'
btCollisionObject* obA = static_cast<btCollisionObject*>(proxy0->m_clientObject);
btCollisionObject* obB = static_cast<btCollisionObject*>(proxy1->m_clientObject);
// Get Scene nodes
lsNode *obj_A = (lsNode*)obA->getUserPointer();
lsNode *obj_B = (lsNode*)obB->getUserPointer();
if(( obj_A )&&( obj_B ))
{
switch( obj_A->getNode_type() )
{
case LSNT_PARTICLE:
// check physics disabled
if( obj_A->getHide() ) collides = false;
break;
}
switch( obj_B->getNode_type() )
{
case LSNT_PARTICLE:
// check physics disabled
if( obj_B->getHide() ) collides = false;
break;
}
/* Debug
cout << "Object A : ";
cout << obj_A->getName();
cout << " - hit Object B : ";
cout << obj_B->getName();
cout << endl;
*/
}
return collides;
}
[/Code]
I basically check both Nodes to see if one has Hide set to true, if so return false to ignore collision.
I also do other things to make sure the particle doesn't render etc..