void CBoidObject::Physicalize( SBoidContext &bc ) { pe_params_particle ppart; //ppart.gravity = Vec3(0,0,0); ppart.flags = particle_traceable | particle_no_roll | pef_never_affect_triggers | pef_log_collisions; ppart.mass = 0; ppart.size = max(bc.fBoidRadius,0.01f); ppart.thickness = max(bc.fBoidThickness,0.01f); ppart.gravity = Vec3(0,0,0); ppart.kAirResistance = 0.0f; ppart.surface_idx = GetGeometrySurfaceType(); IEntity *pEntity = gEnv->pEntitySystem->GetEntity(m_entity); if (pEntity) { SEntityPhysicalizeParams params; params.pParticle = &ppart; params.type = PE_PARTICLE; pEntity->Physicalize(params); m_pPhysics = pEntity->GetPhysics(); } }
void CBoidObject::CreateRigidBox(SBoidContext &bc,const Vec3 &boxSize,float mass,float density) { if(m_pPhysics) { m_pPhysics = 0; } Vec3 orgVelocity = m_speed*m_heading; if(m_pPhysics && m_pPhysics->GetType() == PE_PARTICLE) { pe_params_particle pparams; m_pPhysics->GetParams(&pparams); orgVelocity = pparams.velocity*pparams.heading; } Quat q(IDENTITY); CalcOrientation(q); pe_params_pos bodypos; bodypos.pos = m_pos; bodypos.q = q; bodypos.scale = m_scale; IEntity *pEntity = gEnv->pEntitySystem->GetEntity(m_entity); if(!pEntity) return; SEntityPhysicalizeParams entityPhysParams; entityPhysParams.type = PE_RIGID; pEntity->Physicalize(entityPhysParams); m_pPhysics = pEntity->GetPhysics(); if(!m_pPhysics) return; m_pPhysics->SetParams(&bodypos); pe_params_flags pf; pf.flagsOR = pef_never_affect_triggers|pef_never_break; m_pPhysics->SetParams(&pf); primitives::box geomBox; geomBox.Basis.SetIdentity(); geomBox.center.Set(0,0,0); geomBox.size = boxSize; geomBox.bOriented = 0; IGeometry *pGeom = bc.physics->GetGeomManager()->CreatePrimitive(primitives::box::type,&geomBox); phys_geometry *physGeom = bc.physics->GetGeomManager()->RegisterGeometry(pGeom); pGeom->Release(); pe_geomparams partpos; partpos.pos.Set(0,0,0); if(mass > 0) partpos.mass = mass; // some fish mass. if(density > 0) partpos.density = density; partpos.surface_idx = GetGeometrySurfaceType(); m_pPhysics->AddGeometry(physGeom,&partpos,0); bc.physics->GetGeomManager()->UnregisterGeometry(physGeom); pe_simulation_params symparams; symparams.damping = 0.3f; symparams.dampingFreefall = 0.2f; m_pPhysics->SetParams(&symparams); pe_params_buoyancy pb; pb.waterDensity = 1000.0f; pb.waterDamping = 1; pb.waterResistance = 1000; pb.waterPlane.n.Set(0,0,1); //pb.waterPlane.origin.set(0,0,gEnv->p3DEngine->GetWaterLevel(&m_center)); pb.waterPlane.origin.Set(0,0,bc.waterLevel); m_pPhysics->SetParams(&pb); // Set original velocity on physics. pe_action_set_velocity psetvel; psetvel.v = orgVelocity; m_pPhysics->Action(&psetvel); }