Пример #1
0
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);
	}
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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;
	}
}
Пример #5
0
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();
	}
}