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; if(m_object) { IMaterial* pMat = m_object->GetIMaterial(); if(pMat->GetSubMtlCount() > 0) { ppart.surface_idx = pMat->GetSubMtl(0)->GetSurfaceTypeId(); } else { ppart.surface_idx = pMat->GetSurfaceTypeId(); } } else { // just like in GetGeometrySurfaceType() ppart.surface_idx = 0; IEntity *pEntity = gEnv->pEntitySystem->GetEntity(m_entity); if (pEntity) { IStatObj *pStatObj = pEntity->GetStatObj(0|ENTITY_SLOT_ACTUAL); if (pStatObj) { ISurfaceType *pSurfaceType = gEnv->pEntitySystem->GetBreakableManager()->GetFirstSurfaceType(pStatObj); if (pSurfaceType) ppart.surface_idx = pSurfaceType->GetId(); } } } 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(); } }