void VoxelExplosionGenerator::spawn() { // spawn explosionSpawnCount voxels with color and scale at position within a sphere with radius with a speed of ~force in all directions modified by ~impactVector Transform transform; for (int i = 0; i < m_count; i++) { glm::vec3 directionalSpeed = createDirectionalSpeed(); transform.setScale(createScale()); transform.setPosition(m_position + (m_radius * safeNormalize(directionalSpeed, glm::vec3(0.0f)))); Visuals visuals(m_color, m_emissiveness); Speed speed(directionalSpeed, createAngularSpeed()); VoxelParticleSetup particleSetup( transform, visuals, speed, createLifetime() ); World::instance()->particleEngine().addParticle(particleSetup, m_creator); } }
void CameraController::update(double seconds) { glm::vec3 velocity(0.0f); if(m_forward) { velocity.z = -1.0f; } else if(m_back) { velocity.z = 1.0f; } if(m_left) { velocity.x = -1.0f; } else if(m_right) { velocity.x = 1.0f; } if(m_up) { velocity.y = 1.0f; } else if(m_down) { velocity.y = -1.0f; } float speedMultiplier = m_sprint ? 5.0f : 1.0f; velocity = safeNormalize(velocity); velocity *= seconds * m_speed * speedMultiplier; if(m_lookMode) { //quaternion mode if(m_rollLeft) { m_transform = glm::rotate(m_transform, (float) seconds * m_rollSpeed * speedMultiplier, glm::vec3(0.0f, 0.0f, 1.0f)); } else if(m_rollRight) { m_transform = glm::rotate(m_transform, (float) seconds * -m_rollSpeed * speedMultiplier, glm::vec3(0.0f, 0.0f, 1.0f)); } m_transform = glm::translate(m_transform, velocity); } else { //eueler mode if(m_rollLeft) { m_eulerAngles.z += (float) seconds * m_rollSpeed * speedMultiplier; } else if(m_rollRight) { m_eulerAngles.z -= (float) seconds * m_rollSpeed * speedMultiplier; } //Who the hell decided to make this function take them in this order! glm::vec3 position = getTransformPosition(m_transform); glm::mat4 rotation = glm::yawPitchRoll(glm::radians(m_eulerAngles.y), glm::radians(m_eulerAngles.x), glm::radians(m_eulerAngles.z)); //TODO: make this not suck //vertical position.y += velocity.y; //forward glm::mediump_float rad = glm::radians(m_eulerAngles.y - 90); position.x += velocity.z * glm::cos(rad); position.z -= velocity.z * glm::sin(rad); //strafe rad = glm::radians(m_eulerAngles.y); position.x += velocity.x * glm::cos(rad); position.z -= velocity.x * glm::sin(rad); m_transform = glm::translate(position); m_transform = m_transform * rotation; } }
float FighterFightTask::angleToTarget() { WorldObject* worldObject = boardComputer()->worldObject(); glm::vec3 shipDirection = glm::vec3(0, 0, -1); glm::vec3 targetDirection = glm::inverse(worldObject->transform().orientation()) * safeNormalize(m_primaryTarget->transform().position() - worldObject->transform().position(), glm::vec3(0, 0, 1)); float angle = GeometryHelper::angleBetween(shipDirection, targetDirection); return glm::degrees(angle); }
BeamEffect::BeamEffect(glm::vec3 start, glm::vec3 end, glm::vec3 colour, long duration) : RenderObjectEffect("Beam.obj", "error.tga", "Beam.glsl", start, safeNormalize(end - start), glm::vec3(0, 1, 0)) { float beamLength = glm::length(end - start); renderObject->setScale(0.1f, 0.1f, beamLength); startTime = GetCurrentTime(); this->colour = colour; this->duration = duration; }
void Shotgun::primaryClick() { int pelletDamage = 10; float pelletSpread = 5.0f / 180.0f * M_PI; //radians if (owner == NULL) return; list<PelletHitData*> hitData = list<PelletHitData*>(); list<PlayerDamage> playerDamageList = list<PlayerDamage>(); int networkState = getNetworkState(); btVector3 pelletDirection = Utilities::glmToBT3(direction); btVector3 start = Utilities::glmToBT3(position); btVector3 end = start + pelletDirection * MAX_DISTANCE; hitData.push_back(getHitData(start, end)); pelletDirection = pelletDirection.rotate(Utilities::glmToBT3(up), pelletSpread); for (int i = 0; i < 8; i++) { end = start + pelletDirection * MAX_DISTANCE; hitData.push_back(getHitData(start, end)); pelletDirection = pelletDirection.rotate(Utilities::glmToBT3(direction), M_PI / 4.0f); } while (hitData.size() > 0) { if (hitData.back()->playerID >= 0) { bool inList = false; for (list<PlayerDamage>::iterator iter = playerDamageList.begin(); iter != playerDamageList.end(); iter++) { if (iter->playerID == hitData.back()->playerID) { iter->damage += pelletDamage; inList = true; break; } } if (!inList) { PlayerDamage p; p.playerID = hitData.back()->playerID; p.damage = pelletDamage; p.hitPlayer = hitData.back()->hitObject; playerDamageList.push_back(p); } } if (hitData.back()->hitObject != NULL) { end = hitData.back()->end; btVector3 force = PELLET_FORCE*safeNormalize(end - start); if (networkState == NETWORK_STATE_CLIENT) { addTCPEvent(createForceBuffer(hitData.back()->hitObject, end.x(), end.y(), end.z(), force.x(), force.y(), force.z(), SPELLID_SHOTGUN)); } else if (networkState == NETWORK_STATE_SERVER) { hitData.back()->hitObject->applyImpulse(end.x(), end.y(), end.z(), force.x(), force.y(), force.z()); addTCPEvent(createForceBuffer(hitData.back()->hitObject, end.x(), end.y(), end.z(), force.x(), force.y(), force.z(), SPELLID_SHOTGUN)); } else if (networkState == NETWORK_STATE_OFFLINE) { hitData.back()->hitObject->applyImpulse(end.x(), end.y(), end.z(), force.x(), force.y(), force.z()); } else { //Error with networkState variable } } if (networkState != NETWORK_STATE_SERVER) { if (networkState == NETWORK_STATE_CLIENT) addTCPEvent(createCreateFadingBeamEffectBuffer(Utilities::btToGLM3(&start) + glm::vec3(0, -0.5, 0), Utilities::btToGLM3(&hitData.back()->end), glm::vec3(0.5f, 0.5f, 0.5f), BEAM_DURATION)); else if (networkState == NETWORK_STATE_OFFLINE) new FadingBeamEffect(Utilities::btToGLM3(&start) + glm::vec3(0, -0.5, 0), Utilities::btToGLM3(&hitData.back()->end), glm::vec3(0.5f, 0.5f, 0.5f), BEAM_DURATION); } delete hitData.back(); hitData.pop_back(); } while (playerDamageList.size() > 0) { int charID = playerDamageList.back().playerID; if (networkState == NETWORK_STATE_CLIENT) { if (charID > -1) addTCPEvent(createDamageBuffer(ownerID, charID, playerDamageList.back().damage, SPELLID_SHOTGUN)); } else if (networkState == NETWORK_STATE_SERVER) { if (charID > -1) { playerDamageList.back().hitPlayer->damage(playerDamageList.back().damage, SPELLID_SHOTGUN, ownerID); addTCPEvent(createDamageBuffer(ownerID, charID, playerDamageList.back().damage, SPELLID_SHOTGUN)); } } else if (networkState == NETWORK_STATE_OFFLINE) { if (charID > -1) playerDamageList.back().hitPlayer->damage(playerDamageList.back().damage, SPELLID_SHOTGUN, ownerID); } else { //Error with networkState variable } playerDamageList.pop_back(); } }