// 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); }
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(); }
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))); }
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)); }
auto V30MZ::opInDX(Size size) { wait(5); setAcc(size, in(size, r.dx)); }
auto V30MZ::opIn(Size size) { wait(5); setAcc(size, in(size, fetch())); }