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);
    }
}
Ejemplo n.º 2
0
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;
    }
}
Ejemplo n.º 3
0
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);
}
Ejemplo n.º 4
0
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;
}
Ejemplo n.º 5
0
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();
	}
}