void CBirdsFlock::CreateBoids(SBoidsCreateContext &ctx) { CFlock::CreateBoids(ctx); m_boidDefaultAnimName = m_bc.GetAnimationName(Bird::ANIM_FLY); m_bc.bAutoTakeOff = false; for(uint32 i = 0; i < m_RequestedBoidsCount; i++) { CBoidObject *boid = new CBoidBird(m_bc); if(m_bc.bSpawnFromPoint) { CBoidBird *pBoid = (CBoidBird *)boid; float radius = 0.5; // Spawn not far from origin float z = /*gEnv->p3DEngine->GetTerrainElevation(m_origin.x,m_origin.y)*/ + 7.f + Boid::Frand()*2.f; // z = terrain height + [5-9] pBoid->m_pos = m_origin + Vec3(radius*Boid::Frand(),radius*Boid::Frand(), radius*Boid::Frand()); z = .25f*Boid::Frand() + .25f; // z-heading = 0.0 - 0.5 pBoid->m_heading = (Vec3(Boid::Frand(),Boid::Frand(),z)).GetNormalized(); pBoid->m_scale = m_bc.boidScale + Boid::Frand()*m_bc.boidRandomScale; boid->m_speed = m_bc.MinSpeed + (Boid::Frand()+1)/2.0f*(m_bc.MaxSpeed - m_bc.MinSpeed); pBoid->m_dead = 0; pBoid->m_currentAccel(0,0,0); pBoid->SetSpawnFromPt(true); pBoid->m_fNoCenterAttract = m_bc.factorAttractToOrigin; pBoid->m_fNoKeepHeight = m_bc.factorKeepHeight; pBoid->SetAttracted(false); } else { float radius = m_bc.fSpawnRadius; boid->m_pos = m_origin + Vec3(radius*Boid::Frand(),radius*Boid::Frand(),Boid::Frand()*radius); boid->m_heading = (Vec3(Boid::Frand(),Boid::Frand(),0)).GetNormalized(); boid->m_scale = m_bc.boidScale + Boid::Frand()*m_bc.boidRandomScale; boid->m_speed = m_bc.MinSpeed + (Boid::Frand()+1)/2.0f*(m_bc.MaxSpeed - m_bc.MinSpeed); } AddBoid(boid); } m_lastUpdatePosTimePassed = 1; m_avgBoidPos = GetPos(); // m_hasLanded = false; TakeOff(); m_terrainPoints = 0; }
void CFrogFlock::CreateBoids( SBoidsCreateContext &ctx ) { m_bc.noLanding = true; m_bc.vEntitySlotOffset = Vec3(0,0,-0.5f); // Offset down by half boid radius. if (FROG_IDLE_ANIM < m_bc.animations.size()) m_boidDefaultAnimName = m_bc.animations[FROG_IDLE_ANIM]; CFlock::CreateBoids(ctx); for (uint32 i = 0; i < m_RequestedBoidsCount; i++) { CBoidObject *boid = new CFrogBoid( m_bc ); float radius = m_bc.fSpawnRadius; boid->m_pos = m_origin + Vec3(radius*Boid::Frand(),radius*Boid::Frand(),Boid::Frand()*radius); boid->m_pos.z = m_bc.engine->GetTerrainElevation(boid->m_pos.x,boid->m_pos.y) + m_bc.fBoidRadius*0.5f; boid->m_heading = ( Vec3(Boid::Frand(),Boid::Frand(),0) ).GetNormalized(); boid->m_scale = m_bc.boidScale + Boid::Frand()*m_bc.boidRandomScale; AddBoid(boid); } }
void CChickenFlock::CreateBoids( SBoidsCreateContext &ctx ) { m_bc.noLanding = true; m_bc.vEntitySlotOffset = Vec3(0,0,-0.5f); // Offset down by half boid radius. if (CHICKEN_WALK_ANIM < m_bc.animations.size()) m_boidDefaultAnimName = m_bc.animations[CHICKEN_WALK_ANIM]; CFlock::CreateBoids(ctx); for (uint32 i = 0; i < m_RequestedBoidsCount; i++) { CBoidObject *boid = CreateBoid(); float radius = m_bc.fSpawnRadius; boid->m_pos = m_origin + Vec3(radius*frand(),radius*frand(),frand()*radius); boid->m_pos.z = m_bc.engine->GetTerrainElevation(boid->m_pos.x,boid->m_pos.y) + m_bc.fBoidRadius*0.5f; boid->m_heading = ( Vec3(frand(),frand(),0) ).GetNormalized(); boid->m_scale = m_bc.boidScale + frand()*m_bc.boidRandomScale; boid->m_speed = m_bc.MinSpeed; AddBoid(boid); } }
void CBugsFlock::CreateBoids( SBoidsCreateContext &ctx ) { CFlock::CreateBoids(ctx); int i; if (!m_e_flocks) return; if (m_pEntity) { IEntityRenderProxy *pRenderProxy = (IEntityRenderProxy*)m_pEntity->GetProxy(ENTITY_PROXY_RENDER); if (pRenderProxy) pRenderProxy->ClearSlots(); } // Different boids. for (i = 0; i < ctx.boidsCount; i++) { CBoidBug *boid = new CBoidBug( m_bc ); float radius = m_bc.fSpawnRadius; boid->m_pos = m_origin + Vec3(radius*Boid::Frand(),radius*Boid::Frand(), m_bc.MinHeight+(m_bc.MaxHeight-m_bc.MinHeight)*Boid::Frand() ); boid->m_heading = Vec3(Boid::Frand(),Boid::Frand(),0).GetNormalized(); boid->m_speed = m_bc.MinSpeed + (m_bc.MaxSpeed-m_bc.MinSpeed)*Boid::Frand(); boid->m_scale = m_bc.boidScale + Boid::Frand()*m_bc.boidRandomScale; /* //boid->CalcRandomTarget( GetPos(),m_bc ); if (!ctx.characterModel.empty()) { if (numObj == 0 || (i % (numObj+1) == 0)) { m_pEntity->LoadCharacter( i,ctx.characterModel ); boid->m_object = m_pEntity->GetCharacter(i); if (boid->m_object) { AABB aabb=boid->m_object->GetAABB(); bbox.Add( aabb.min ); bbox.Add( aabb.max ); if (!ctx.animation.empty()) { CryCharAnimationParams animParams; animParams.m_nFlags |= CA_REMOVE_FROM_FIFO; // Play animation in loop. boid->m_object->GetISkeleton()->StartAnimation( ctx.animation.c_str(),0, 0,0, animParams ); IAnimationSet* animSet = boid->m_object->GetIAnimationSet(); if (animSet) { //Ivo: this is an animation flag in the new system //boid->m_object->SetLoop( ctx.animation.c_str(), true, 0 ); } } } } } if (numObj > 0) boid->m_objectId = (i % numObj); else boid->m_objectId = 0; if (!boid->m_object) { m_pEntity->LoadGeometry( i,ctx.models[boid->m_objectId] ); } */ //boid->m_p = gEnv->p3DEngine->MakeCharacter( model.c_str() ); /* if (boid->m_object) { boid->Physicalize(m_bc); } */ AddBoid(boid); } }