void TestWorld1::process() { killHalf(); expireFood(); autoinsertFood(); expireCritters(); autosaveCritters(); autoinsertCritters(); // m_dynamicsWorld->stepSimulation(0.016667f); m_dynamicsWorld->stepSimulation(0.016667f, 0, 0.016667f); // m_dynamicsWorld->stepSimulation(Timer::Instance()->bullet_ms / 1000.f); renderVision(); grabVision(); unsigned int lmax = critters.size(); for( unsigned int i=0; i < lmax; i++) { CritterB *c = critters[i]; checkCollisions( c ); c->process(); freeEnergy += c->energyUsed; eat(c); procreate(c); } }
void SamsMode::insMutatedCritter(CritterB& other, int nr, unsigned int id, bool mutateBrain, bool mutateBody) { btTransform t; t.setIdentity(); t.setOrigin(btVector3( (critterspacing/2)+(critterspacing*nr), 3.0f * ( settings->getCVar("body_maxbodypartsize") / 50), *worldsizeZ-8.0f )); CritterB *nc = new CritterB(other, id, t, mutateBrain, mutateBody); nc->energyLevel = *critter_maxenergy / 2; critters.push_back( nc ); nc->calcFramePos(critters.size()-1); }
void SamsMode::insRandomCritter(int nr) { btTransform t; t.setIdentity(); t.setOrigin(btVector3( (critterspacing/2)+(critterspacing*nr), 3.0f * ( settings->getCVar("body_maxbodypartsize") / 50 ), *worldsizeZ-8.0f )); CritterB *c = new CritterB(m_dynamicsWorld, currentCritterID++, t, retina); c->energyLevel = *critter_maxenergy / 2; critters.push_back( c ); c->calcFramePos(critters.size()-1); }
void SamsMode::loadAllCritters() { if ( critters.size() > 0 ) { stringstream buf; buf << "use --autoload 1 at commandline to autoload critters into a race"; // Logbuffer::Instance()->add(buf); cerr << "use --autoload 1 at commandline to autoload critters into a race" << endl; } else { vector<string> files; dirH.listContentsFull(dirlayout->loaddir, files); unsigned int inserted = 0; for ( unsigned int i = 0; i < files.size() && inserted < *mincritters; ++i ) { auto& f( files[i] ); if ( parseH.endMatches( ".cr", f ) || parseH.endMatches(".cr.bz2", f) ) { BeFile befileCritter; if ( m_fileSystem.load( befileCritter, f ) ) { std::string content( befileCritter.getContent().str() ); critterspacing = (float)*worldsizeX / *mincritters; btTransform t; t.setIdentity(); t.setOrigin(btVector3( (critterspacing/2)+(critterspacing*critters.size()), 1.0f, *worldsizeZ-(*worldsizeZ/4) )); CritterB *c = new CritterB(content, m_dynamicsWorld, t, retina); unsigned int error = 0; if ( c->genotype->bodyArch->retinasize != (unsigned int)*critter_retinasize ) error = 1; if ( !error) { critters.push_back( c ); c->critterID = currentCritterID++; c->calcFramePos(critters.size()-1); c->energyLevel = *critter_maxenergy / 2; inserted++; } else { if ( error == 1 ) { cerr << "ERROR: critter retinasize (" << c->genotype->bodyArch->retinasize << ") doesn't fit world retinasize (" << *critter_retinasize << ")" << endl; } delete c; } } } } cerr << endl << "Loaded critters from " << dirlayout->loaddir << endl << endl; } }
void Roundworld::process() { if ( !pause ) { killHalf(); expireFood(); autoinsertFood(); expireCritters(); autoexchangeCritters(); autosaveCritters(); autoinsertCritters(); // adjust gravity vectors of all entities' rigid bodies unsigned int j, b; Food* f; CritterB* bod; btRigidBody* bo; for( j=0; j < entities.size(); j++) { if ( entities[j]->type == FOOD ) { // f = food[j]; Food* f = static_cast<Food*>( entities[j] ); for( b=0; b < f->body.bodyparts.size(); b++) { bo = f->body.bodyparts[b]->body; bo->setGravity( -(bo->getCenterOfMassPosition().normalized()*10) ); } } } for( j=0; j < critters.size(); j++) { bod = critters[j]; for( b=0; b < bod->body.bodyparts.size(); b++) { bo = bod->body.bodyparts[b]->body; bo->setGravity( -(bo->getCenterOfMassPosition().normalized()*10) ); } } if ( *critter_raycastvision == 0 ) { renderVision(); grabVision(); } // do a bullet step m_dynamicsWorld->stepSimulation(0.016667f, 0, 0.016667f); // m_dynamicsWorld->stepSimulation(Timer::Instance()->bullet_ms / 1000.f); int lmax = (int)critters.size(); CritterB *c; float freeEnergyc = 0.0f; // FIXME USE FROM WORLDB omp_set_num_threads( *threads ); #pragma omp parallel for ordered shared(freeEnergyc, lmax) private(c) // ordered for( int i=0; i < lmax; i++) { c = critters[i]; omp_set_lock(&my_lock1); checkCollisions( c ); omp_unset_lock(&my_lock1); // process c->process(); // record critter used energy freeEnergyc += c->energyUsed; // process Output Neurons eat(c); // procreation if procreation energy trigger is hit omp_set_lock(&my_lock1); procreate(c); omp_unset_lock(&my_lock1); } freeEnergy += freeEnergyc; getGeneralStats(); } }