Compare commits
No commits in common. "06edddcbdc7698e61e025dda2d0ad7406ddea9e8" and "99c3fab77b2839f872b4096a48f08a3f6f9dc298" have entirely different histories.
06edddcbdc
...
99c3fab77b
@ -104,7 +104,7 @@ public:
|
|||||||
glBindVertexArray(0);
|
glBindVertexArray(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void drawParticles(GLuint program, glm::mat4 view, glm::mat4 projection, glm::mat4 modelSrc, float time) {
|
void drawParticles(GLuint program, glm::mat4 view, glm::mat4 projection, float time) {
|
||||||
if (shouldGenerateNewParticle(time)) {
|
if (shouldGenerateNewParticle(time)) {
|
||||||
generateNewParticle(time);
|
generateNewParticle(time);
|
||||||
}
|
}
|
||||||
@ -124,8 +124,7 @@ public:
|
|||||||
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
|
glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view));
|
||||||
glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));
|
glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection));
|
||||||
|
|
||||||
glm::mat4 model = glm::translate(glm::mat4(1), sourcePosition + particle.randomPointOnCircle);
|
glm::mat4 model = glm::translate(glm::mat4(1.0f), sourcePosition + particle.randomPointOnCircle);
|
||||||
model = model * modelSrc;
|
|
||||||
model = glm::scale(model, glm::vec3(0.005f, 0.005f, 0.005f));
|
model = glm::scale(model, glm::vec3(0.005f, 0.005f, 0.005f));
|
||||||
model = glm::translate(model, particle.direction * speed * (time - particle.birthTime));
|
model = glm::translate(model, particle.direction * speed * (time - particle.birthTime));
|
||||||
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
|
glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model));
|
||||||
|
@ -41,6 +41,6 @@ public:
|
|||||||
float rotationAngle = glm::radians(time * rotationSpeed);
|
float rotationAngle = glm::radians(time * rotationSpeed);
|
||||||
positionMatrix = center->getPositionMatrix() * glm::eulerAngleY(time * rotationSpeed) * glm::translate(glm::vec3(distanceFromCenter, 0, 0));
|
positionMatrix = center->getPositionMatrix() * glm::eulerAngleY(time * rotationSpeed) * glm::translate(glm::vec3(distanceFromCenter, 0, 0));
|
||||||
glm::mat4 modelMatrix = positionMatrix * glm::scale(glm::vec3(scale));
|
glm::mat4 modelMatrix = positionMatrix * glm::scale(glm::vec3(scale));
|
||||||
Core::drawObjectPBRTexture(sphereContext, modelMatrix, textureID, normalMapID, 0.7, 0.0, program);
|
Core::drawObjectPBRTexture(sphereContext, modelMatrix, textureID, 0.7, 0.0, program);
|
||||||
}
|
}
|
||||||
};
|
};
|
@ -11,7 +11,6 @@
|
|||||||
class Spaceship : public GameEntity
|
class Spaceship : public GameEntity
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
|
|
||||||
std::list<Bullet*> bullets;
|
std::list<Bullet*> bullets;
|
||||||
float lastShootTime = 0.f;
|
float lastShootTime = 0.f;
|
||||||
float shootInterval = 0.3f;
|
float shootInterval = 0.3f;
|
||||||
@ -49,29 +48,18 @@ public:
|
|||||||
|
|
||||||
glm::vec3 cameraPos = glm::vec3(0.479490f, 1.250000f, -2.124680f);
|
glm::vec3 cameraPos = glm::vec3(0.479490f, 1.250000f, -2.124680f);
|
||||||
glm::vec3 cameraDir = glm::vec3(-0.354510f, 0.000000f, 0.935054f);
|
glm::vec3 cameraDir = glm::vec3(-0.354510f, 0.000000f, 0.935054f);
|
||||||
glm::mat4 additionalHorRotationMatrix;
|
|
||||||
glm::mat4 additionalVerRotationMatrix;
|
|
||||||
|
|
||||||
glm::mat4 calculateModelMatrix() {
|
glm::mat4 calculateModelMatrix() {
|
||||||
glm::vec3 spaceshipSide = glm::normalize(glm::cross(spaceshipDir, glm::vec3(0.f, 1.f, 0.f)));
|
glm::vec3 spaceshipSide = glm::normalize(glm::cross(spaceshipDir, glm::vec3(0.f, 1.f, 0.f)));
|
||||||
glm::vec3 spaceshipUp = glm::normalize(glm::cross(spaceshipSide, spaceshipDir));
|
glm::vec3 spaceshipUp = glm::normalize(glm::cross(spaceshipSide, spaceshipDir));
|
||||||
|
glm::mat4 specshipCameraRotrationMatrix = glm::mat4({
|
||||||
glm::mat4 spaceshipCameraRotationMatrix = glm::mat4({
|
spaceshipSide.x,spaceshipSide.y,spaceshipSide.z,0,
|
||||||
spaceshipSide.x, spaceshipSide.y, spaceshipSide.z, 0,
|
spaceshipUp.x,spaceshipUp.y,spaceshipUp.z ,0,
|
||||||
spaceshipUp.x, spaceshipUp.y, spaceshipUp.z, 0,
|
-spaceshipDir.x,-spaceshipDir.y,-spaceshipDir.z,0,
|
||||||
-spaceshipDir.x, -spaceshipDir.y, -spaceshipDir.z, 0,
|
0.,0.,0.,1.,
|
||||||
0., 0., 0., 1.
|
|
||||||
});
|
});
|
||||||
|
|
||||||
float additionalVerRotationAngle = glm::radians(currentShipVerAngle);
|
return glm::translate(spaceshipPos) * specshipCameraRotrationMatrix * glm::eulerAngleY(glm::pi<float>()) * glm::scale(glm::vec3(0.02f));
|
||||||
additionalVerRotationMatrix = glm::rotate(glm::mat4(1.0f), additionalVerRotationAngle, glm::vec3(1.f, 0.f, 0.f));
|
|
||||||
|
|
||||||
float additionalHorRotationAngle = glm::radians(currentShipHorAngle);
|
|
||||||
additionalHorRotationMatrix = glm::rotate(glm::mat4(1.0f), additionalHorRotationAngle, glm::vec3(0.f, 0.2f, 1.f));
|
|
||||||
|
|
||||||
glm::mat4 modelMatrix = glm::translate(spaceshipPos) * spaceshipCameraRotationMatrix * additionalVerRotationMatrix * additionalHorRotationMatrix * glm::eulerAngleY(glm::pi<float>()) * glm::scale(glm::vec3(0.02f));
|
|
||||||
|
|
||||||
return modelMatrix;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setPerticlesParameters(float speed, float generationInterval) {
|
void setPerticlesParameters(float speed, float generationInterval) {
|
||||||
@ -81,122 +69,6 @@ public:
|
|||||||
rightParticle->generationInterval = generationInterval;
|
rightParticle->generationInterval = generationInterval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const float fromCameraDirHorizontalStateToStateTime = 0.2f;
|
|
||||||
const float CAMERA_DISTANCE_STATIC_HOR = 0.7f;
|
|
||||||
const float CAMERA_DISTANCE_SLOW_HOR = 0.85f;
|
|
||||||
const float CAMERA_DISTANCE_FAST_HOR = 1.f;
|
|
||||||
|
|
||||||
float currentCameraDistanceHor = CAMERA_DISTANCE_STATIC_HOR;
|
|
||||||
float targetCameraDistanceHor = CAMERA_DISTANCE_STATIC_HOR;
|
|
||||||
int currentWState = 0;
|
|
||||||
int currentShiftState = 0;
|
|
||||||
|
|
||||||
float calculateCameraDistanceHor(int wState, int shiftState, float time) {
|
|
||||||
currentWState = wState;
|
|
||||||
currentShiftState = shiftState;
|
|
||||||
|
|
||||||
if (currentWState == 1 && currentShiftState == 0) {
|
|
||||||
targetCameraDistanceHor = CAMERA_DISTANCE_SLOW_HOR;
|
|
||||||
}
|
|
||||||
else if (currentWState == 1 && currentShiftState == 1) {
|
|
||||||
targetCameraDistanceHor = CAMERA_DISTANCE_FAST_HOR;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
targetCameraDistanceHor = CAMERA_DISTANCE_STATIC_HOR;
|
|
||||||
}
|
|
||||||
|
|
||||||
float diff = targetCameraDistanceHor - currentCameraDistanceHor;
|
|
||||||
float step = diff / fromCameraDirHorizontalStateToStateTime * time;
|
|
||||||
|
|
||||||
currentCameraDistanceHor += step;
|
|
||||||
|
|
||||||
return currentCameraDistanceHor;
|
|
||||||
}
|
|
||||||
|
|
||||||
const float fromCameraDirVerticalStateToStateTime = 0.2f;
|
|
||||||
const float CAMERA_DISTANCE_STATIC_VER = 0.2f;
|
|
||||||
const float CAMERA_DISTANCE_SLOW_VER = 0.25f;
|
|
||||||
const float CAMERA_DISTANCE_FAST_VER = 0.3f;
|
|
||||||
|
|
||||||
float currentCameraDistanceVer = CAMERA_DISTANCE_STATIC_VER;
|
|
||||||
float targetCameraDistanceVer = CAMERA_DISTANCE_STATIC_VER;
|
|
||||||
|
|
||||||
float calculateCameraDistanceVer(float time) {
|
|
||||||
if (currentWState == 1 && currentShiftState == 0) {
|
|
||||||
targetCameraDistanceVer = CAMERA_DISTANCE_SLOW_VER;
|
|
||||||
}
|
|
||||||
else if (currentWState == 1 && currentShiftState == 1) {
|
|
||||||
targetCameraDistanceVer = CAMERA_DISTANCE_FAST_VER;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
targetCameraDistanceVer = CAMERA_DISTANCE_STATIC_VER;
|
|
||||||
}
|
|
||||||
|
|
||||||
float diff = targetCameraDistanceVer - currentCameraDistanceVer;
|
|
||||||
float step = diff / fromCameraDirVerticalStateToStateTime * time;
|
|
||||||
|
|
||||||
currentCameraDistanceVer += step;
|
|
||||||
|
|
||||||
return currentCameraDistanceVer;
|
|
||||||
}
|
|
||||||
|
|
||||||
const float MAX_VERTICAL_ANGLE = 15.f;
|
|
||||||
float currentShipVerAngle = 0.f;
|
|
||||||
float targetShipVerAngle = 0.f;
|
|
||||||
int currentQState = 0;
|
|
||||||
int currentEState = 0;
|
|
||||||
|
|
||||||
float calculateShipAngleVer(int qState, int eState, float time) {
|
|
||||||
currentQState = qState;
|
|
||||||
currentEState = eState;
|
|
||||||
|
|
||||||
if (currentQState == 1) {
|
|
||||||
targetShipVerAngle = MAX_VERTICAL_ANGLE;
|
|
||||||
}
|
|
||||||
else if (currentEState == 1) {
|
|
||||||
targetShipVerAngle = -MAX_VERTICAL_ANGLE;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
targetShipVerAngle = 0.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
float diff = targetShipVerAngle - currentShipVerAngle;
|
|
||||||
float step = diff / 0.2f * time;
|
|
||||||
|
|
||||||
currentShipVerAngle += step;
|
|
||||||
|
|
||||||
return currentShipVerAngle;
|
|
||||||
}
|
|
||||||
|
|
||||||
const float MAX_HORIZONTALL_ANGLE = 15.f;
|
|
||||||
float currentShipHorAngle = 0.f;
|
|
||||||
float targetShipHorAngle = 0.f;
|
|
||||||
int currentAState = 0;
|
|
||||||
int currentDState = 0;
|
|
||||||
|
|
||||||
float calculateShipAngleHor(int aState, int dState, float time) {
|
|
||||||
currentAState = aState;
|
|
||||||
currentDState = dState;
|
|
||||||
|
|
||||||
if (currentAState == 1) {
|
|
||||||
targetShipHorAngle = MAX_HORIZONTALL_ANGLE;
|
|
||||||
}
|
|
||||||
else if (currentDState == 1) {
|
|
||||||
targetShipHorAngle = -MAX_HORIZONTALL_ANGLE;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
targetShipHorAngle = 0.f;
|
|
||||||
}
|
|
||||||
|
|
||||||
float diff = targetShipHorAngle - currentShipHorAngle;
|
|
||||||
float step = diff / 0.2f * time;
|
|
||||||
|
|
||||||
currentShipHorAngle += step;
|
|
||||||
|
|
||||||
return currentShipHorAngle;
|
|
||||||
}
|
|
||||||
|
|
||||||
void processInput(GLFWwindow* window, float deltaTime, float time) {
|
void processInput(GLFWwindow* window, float deltaTime, float time) {
|
||||||
static bool mouseButtonCallbackSet = false;
|
static bool mouseButtonCallbackSet = false;
|
||||||
if (!mouseButtonCallbackSet) {
|
if (!mouseButtonCallbackSet) {
|
||||||
@ -209,18 +81,9 @@ public:
|
|||||||
|
|
||||||
int w = glfwGetKey(window, GLFW_KEY_W);
|
int w = glfwGetKey(window, GLFW_KEY_W);
|
||||||
int s = glfwGetKey(window, GLFW_KEY_S);
|
int s = glfwGetKey(window, GLFW_KEY_S);
|
||||||
int shiftState = glfwGetKey(window, GLFW_KEY_LEFT_SHIFT);
|
|
||||||
int qState = glfwGetKey(window, GLFW_KEY_Q);
|
|
||||||
int eState = glfwGetKey(window, GLFW_KEY_E);
|
|
||||||
int aState = glfwGetKey(window, GLFW_KEY_A);
|
|
||||||
int dState = glfwGetKey(window, GLFW_KEY_D);
|
|
||||||
|
|
||||||
calculateShipAngleVer(qState, eState, deltaTime);
|
|
||||||
calculateShipAngleHor(aState, dState, deltaTime);
|
|
||||||
//spaceshipDir = glm::vec3(glm::eulerAngleX(verticalAngle) * glm::vec4(spaceshipDir, 0));
|
|
||||||
|
|
||||||
if (w == GLFW_PRESS) {
|
if (w == GLFW_PRESS) {
|
||||||
if (shiftState == GLFW_PRESS) {
|
if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) {
|
||||||
moveSpeed *= 2;
|
moveSpeed *= 2;
|
||||||
setPerticlesParameters(200.f, 0.00005f);
|
setPerticlesParameters(200.f, 0.00005f);
|
||||||
}
|
}
|
||||||
@ -232,6 +95,8 @@ public:
|
|||||||
setPerticlesParameters(50.f, 0.0002f);
|
setPerticlesParameters(50.f, 0.0002f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
|
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) {
|
||||||
glfwSetWindowShouldClose(window, true);
|
glfwSetWindowShouldClose(window, true);
|
||||||
}
|
}
|
||||||
@ -243,18 +108,18 @@ public:
|
|||||||
spaceshipPos += spaceshipSide * moveSpeed;
|
spaceshipPos += spaceshipSide * moveSpeed;
|
||||||
if (glfwGetKey(window, GLFW_KEY_Z) == GLFW_PRESS)
|
if (glfwGetKey(window, GLFW_KEY_Z) == GLFW_PRESS)
|
||||||
spaceshipPos -= spaceshipSide * moveSpeed;
|
spaceshipPos -= spaceshipSide * moveSpeed;
|
||||||
if (qState == GLFW_PRESS)
|
if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS)
|
||||||
spaceshipPos += spaceshipUp * moveSpeed;
|
spaceshipPos += spaceshipUp * moveSpeed;
|
||||||
if (eState == GLFW_PRESS)
|
if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS)
|
||||||
spaceshipPos -= spaceshipUp * moveSpeed;
|
spaceshipPos -= spaceshipUp * moveSpeed;
|
||||||
if (aState == GLFW_PRESS)
|
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
|
||||||
spaceshipDir = glm::vec3(glm::eulerAngleY(angleSpeed) * glm::vec4(spaceshipDir, 0));
|
spaceshipDir = glm::vec3(glm::eulerAngleY(angleSpeed) * glm::vec4(spaceshipDir, 0));
|
||||||
if (dState == GLFW_PRESS)
|
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
|
||||||
spaceshipDir = glm::vec3(glm::eulerAngleY(-angleSpeed) * glm::vec4(spaceshipDir, 0));
|
spaceshipDir = glm::vec3(glm::eulerAngleY(-angleSpeed) * glm::vec4(spaceshipDir, 0));
|
||||||
if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS)
|
if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_PRESS)
|
||||||
requestShoot(time);
|
requestShoot(time);
|
||||||
|
|
||||||
cameraPos = spaceshipPos - calculateCameraDistanceHor(w, shiftState, deltaTime) * spaceshipDir + glm::vec3(0, calculateCameraDistanceVer(deltaTime), 0);
|
cameraPos = spaceshipPos - 1.f * spaceshipDir + glm::vec3(0, 1, 0) * 0.2f;
|
||||||
cameraDir = spaceshipDir;
|
cameraDir = spaceshipDir;
|
||||||
glm::vec3 perpendicularVector = 0.04f * glm::normalize(glm::cross(spaceshipDir, glm::vec3(0.0f, 1.0f, 0.0f)));
|
glm::vec3 perpendicularVector = 0.04f * glm::normalize(glm::cross(spaceshipDir, glm::vec3(0.0f, 1.0f, 0.0f)));
|
||||||
if (leftParticle != nullptr && rightParticle != nullptr) {
|
if (leftParticle != nullptr && rightParticle != nullptr) {
|
||||||
@ -270,9 +135,8 @@ public:
|
|||||||
|
|
||||||
void renderParticles(GLuint program, glm::mat4 view, glm::mat4 projection, float time) {
|
void renderParticles(GLuint program, glm::mat4 view, glm::mat4 projection, float time) {
|
||||||
if (leftParticle != nullptr && rightParticle != nullptr) {
|
if (leftParticle != nullptr && rightParticle != nullptr) {
|
||||||
glm::mat4 modelSrc = additionalVerRotationMatrix * additionalHorRotationMatrix;
|
leftParticle->drawParticles(program, view, projection, time);
|
||||||
leftParticle->drawParticles(program, view, projection, modelSrc, time);
|
rightParticle->drawParticles(program, view, projection, time);
|
||||||
rightParticle->drawParticles(program, view, projection, modelSrc, time);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -328,9 +192,8 @@ public:
|
|||||||
|
|
||||||
void shoot(float time) {
|
void shoot(float time) {
|
||||||
glm::vec3 perpendicularVector = 0.25f * glm::normalize(glm::cross(cameraDir, glm::vec3(0.0f, 1.0f, 0.0f)));
|
glm::vec3 perpendicularVector = 0.25f * glm::normalize(glm::cross(cameraDir, glm::vec3(0.0f, 1.0f, 0.0f)));
|
||||||
glm::vec3 dir = glm::vec4(spaceshipDir.x, spaceshipDir.y, spaceshipDir.z, 1.f) * additionalVerRotationMatrix * additionalHorRotationMatrix;
|
bullets.push_back(Bullet::createSimpleBullet(cameraDir, spaceshipPos - perpendicularVector, time));
|
||||||
bullets.push_back(Bullet::createSimpleBullet(dir, spaceshipPos - perpendicularVector, time));
|
bullets.push_back(Bullet::createSimpleBullet(cameraDir, spaceshipPos + perpendicularVector, time));
|
||||||
bullets.push_back(Bullet::createSimpleBullet(dir, spaceshipPos + perpendicularVector, time));
|
|
||||||
lastShootTime = time;
|
lastShootTime = time;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user