// default constructor: creates a particle represented by a default (square).
// Notes:
// - particle rotated so that it is orthogonal to the z axis.
// - scaled 
// - no shader allocated by default to avoid creating a Shader object for each particle.
Particle::Particle()
{
	setMesh(Mesh::Mesh());
	scale(glm::vec3(.1f, .1f, .1f));
	rotate((GLfloat)M_PI_2, glm::vec3(1.0f, 0.0f, 0.0f));
	
	// set dynamic values
	setAcc(glm::vec3(0.0f, 0.0f, 0.0f));
	setVel(glm::vec3(0.0f, 0.0f, 0.0f));

	// physical properties
	setMass(1.0f);
	setCor(1.0f);
}
Beispiel #2
0
void FizSphere::init_object(std::string new_name, vec3 color, const std::vector<triangle*>& tinit, double new_mass, double rad)
{

	name = new_name;
	vertices = tinit;
	setProperty("SYSTEM_color", fizdatum(0.0, color, VECTOR));
	setRadius(rad);
	setMass(new_mass);
	vertex v = vertex();
	triangle com = triangle(&v,&v,&v,0); //hopefully this line works correctly
	com.massp = 1;
	setCOMTriangle(com);
	comapprox = 1;
	setVel(vec3());
	setAcc(vec3());
	setOme(vec3());
	setAlp(vec3());
}
	void drawSpline(){

		setVel();
		setAcc();


		glColor3f(1.0f, 0.0f, 0.0f);
		glBegin(GL_LINES);
		
		glVertex2f(points[0].pos.x, points[0].pos.y);
		glVertex2f(points[0].velocity.x + points[0].pos.x, points[0].velocity.y + points[0].pos.y);

		glEnd();

		glColor3f(0.0f, 1.0f, 0.0f);
		glBegin(GL_LINES);

		glVertex2f(points[0].pos.x, points[0].pos.y);
		glVertex2f(points[0].acceleration.x + points[0].pos.x, points[0].acceleration.y + points[0].pos.y);

		glEnd();

		glColor3f(1.0f, 1.0f, 1.0f);
		glBegin(GL_LINE_STRIP);

		for (int i = 0; i < numberOfPoints - 1; i++){

			for (float time = points[i].time; time < points[i + 1].time; time += (points[i + 1].time - points[i].time) / 100.0){
				Vector foo = calculate(i, time);
				glVertex2f(foo.x, foo.y);
			}
			

		}
		glEnd();
	}
Beispiel #4
0
void SpaceShip::processKeys(bool keystate[255], bool keystate_special[255], float dtime)
{
	float yacc = 0;
	float pacc = 0;
	float racc = 0;

	// Special Keys:
	if (keystate_special[GLUT_KEY_DOWN])
		pacc += SPACESHIP_ROTACC;

	if (keystate_special[GLUT_KEY_UP])
		pacc -= SPACESHIP_ROTACC;

	if (keystate_special[GLUT_KEY_LEFT])
		yacc -= SPACESHIP_ROTACC;

	if (keystate_special[GLUT_KEY_RIGHT])
		yacc += SPACESHIP_ROTACC;

	if (keystate[(uint8_t)'x'])
		racc += SPACESHIP_ROTACC;

	if (keystate[(uint8_t)'y'])
		racc -= SPACESHIP_ROTACC;

	if (keystate_special[GLUT_KEY_PAGE_UP])
	{
		// Forward
		m_engine_acc = quatToVector(m_quat)
			* config->getDouble("spaceship_acceleration", 100.0) * USC; // 100km/s^2
		if (!m_engine_running) // powering on
		{
			m_audio.stop();
			m_audio.addFile("spaceship_start.ogg");
			m_audio.setLoop(AL_FALSE);
			m_audio.play();
		}
		m_time_since_acc = 0;
		m_engine_running = true;
	}
	else
	{
		if (m_engine_running) // powering down
		{
			m_audio.stop();
			m_audio.addFile("spaceship_stop.ogg");
			m_audio.setLoop(AL_FALSE);
			m_audio.play();
		}
		m_engine_acc = SimpleVec3d();
		m_engine_running = false;
	}

	if (keystate_special[GLUT_KEY_PAGE_DOWN])
	{
		// Make the spaceship rotate into the opposite direction of the velocity
		glm::quat targetquat = RotationBetweenVectors(SimpleVec3d(0, 0, 1), m_velocity);
		m_quat = glm::normalize(m_quat);
		targetquat = glm::normalize(targetquat);

		if (game->getGameSpeed() > 15.0)
		{
			m_quat = targetquat;
			m_velquat = glm::quat();
		}
		else
		{
			m_quat = glm::slerp(m_quat, targetquat,
				(float)(dtime / SPACESHIP_ALIGN_TIME));
			m_velquat = glm::slerp(glm::quat(), m_velquat,
				(float)(1.0 / SPACESHIP_ROTBREAK_TIME));
		}
	}

	setAcc(yacc, pacc, racc);

	if (keystate[(uint8_t)'c']) // break rotation, stop if gamespeed > 15
	{
		if (game->getGameSpeed() > 15.0)
			m_velquat = glm::quat();
		else
			m_accquat = glm::slerp(glm::quat(), conjugateQuat(m_velquat),
				(float)(1.0 / SPACESHIP_ROTBREAK_TIME));
	}

	if (keystate[(uint8_t)'b'])
	{
		if (m_navigator->getActive())
		{
			// Align to Navigation target
			glm::quat targetquat = m_navigator->getTargetQuat();
			if (game->getGameSpeed() > 15.0)
			{
				m_quat = targetquat;
				m_velquat = glm::quat();
			}
			else
			{
				m_quat = glm::slerp(m_quat, targetquat,
					(float)(dtime / SPACESHIP_ALIGN_TIME));
				m_velquat = glm::slerp(glm::quat(), m_velquat,
					(float)(1.0 / SPACESHIP_ROTBREAK_TIME));
			}
		}
	}
}
auto V30MZ::opMoveAccMem(Size size) {
  setAcc(size, read(size, segment(r.ds), fetch(Word)));
}
Beispiel #6
0
void Projectile::Move()
{
	// Reset the acceleration each time in case we don't need to move.
	setAcc(Vector2(0, 0));

	if (attacking)
	{
		if (timerSet == false)
		{
			currentAttackTimer = attackTimer + sfw::getTime();
			timerSet = true;
		}

		// Check what direction brings us towards the destination.
		if		(dest.x > getPos().x - 20)
		{
			if(getVel().x < -0.5f)
				setAcc(Vector2(attackSpeed * 4, getAcc().y));
			else
				setAcc(Vector2(attackSpeed, getAcc().y));
		}

		else if (dest.x < getPos().x + 20)
		{
			if(getVel().x > 0.5f)
				setAcc(Vector2(-attackSpeed * 4, getAcc().y));
			else
				setAcc(Vector2(-attackSpeed, getAcc().y));
		}


		if		(dest.y > getPos().y - 20)
		{
			if(getVel().y < -0.5f)
				setAcc(Vector2(getAcc().x, attackSpeed * 4));
			else
				setAcc(Vector2(getAcc().x, attackSpeed));
		}

		else if (dest.y < getPos().y + 20)
		{
			if(getVel().y > 0.5f)
				setAcc(Vector2(getAcc().x, -attackSpeed * 4));
			else
				setAcc(Vector2(getAcc().x, -attackSpeed));
		}


		if (attackTimer < sfw::getTime())
		{
			attacking = false;
			timerSet = false;
		}

		else if(getPos().x > dest.x - 5 && getPos().x < dest.x + 5 &&
				getPos().y > dest.y - 5 && getPos().y < dest.y + 5)
		{
			attacking = false;
			timerSet = false;
		}

	}
	else
	{
		// Check what direction brings us towards the player.
		if		(game()->getPlayer().getPos().x >= getPos().x)
		{
			if (getVel().x < -0.5f)
				setAcc(Vector2(accRate * 1.5f, getAcc().y));
			else
				setAcc(Vector2(accRate, getAcc().y));
		}

		else if (game()->getPlayer().getPos().x < getPos().x)
		{
			if (getVel().x > 0.5f)
				setAcc(Vector2(-accRate * 1.5f, getAcc().y));
			else
				setAcc(Vector2(-accRate, getAcc().y));
		}


		if		(game()->getPlayer().getPos().y >= getPos().y)
		{
			if (getVel().y < -0.5f)
				setAcc(Vector2(getAcc().x, accRate * 1.5f));
			else
				setAcc(Vector2(getAcc().x, accRate));
		}

		else if (game()->getPlayer().getPos().y < getPos().y)
		{
			if (getVel().y > 0.5f)
				setAcc(Vector2(getAcc().x, -accRate * 1.5f));
			else
				setAcc(Vector2(getAcc().x, -accRate));
		}
	}

	// Apply the acceleration to the velocity
	if (getAcc().x == 0 && getAcc().y == 0)
		setVel(Vector2(getVel().x / 4, getVel().y / 4));
	else if (getAcc().x == 0)
		setVel(Vector2(getVel().x / 4, getVel().y + (getAcc().y * sfw::getDeltaTime())));
	else if (getAcc().y == 0)
		setVel(Vector2(getVel().x + (getAcc().x * sfw::getDeltaTime()), getVel().y / 4));
	else
		setVel(Vector2(getVel().x + (getAcc().x * sfw::getDeltaTime()), getVel().y + (getAcc().y * sfw::getDeltaTime())));
	
	applyMaxSpeed();

	// Use all the information we just calculated to move accordingly
	setPos(Vector2(getPos().x + getVel().x, getPos().y + getVel().y));
}
Beispiel #7
0
auto V30MZ::opInDX(Size size) {
  wait(5);
  setAcc(size, in(size, r.dx));
}
Beispiel #8
0
auto V30MZ::opIn(Size size) {
  wait(5);
  setAcc(size, in(size, fetch()));
}