star and hearts positions update, and object Color shader update
This commit is contained in:
parent
f110bd68f0
commit
9afb118663
@ -60,14 +60,14 @@
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>true</UseDebugLibraries>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||
<ConfigurationType>Application</ConfigurationType>
|
||||
<UseDebugLibraries>false</UseDebugLibraries>
|
||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||
<CharacterSet>Unicode</CharacterSet>
|
||||
<PlatformToolset>v142</PlatformToolset>
|
||||
<PlatformToolset>v143</PlatformToolset>
|
||||
</PropertyGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||
<ImportGroup Label="ExtensionSettings">
|
||||
|
@ -1,18 +1,38 @@
|
||||
#version 430 core
|
||||
|
||||
float AMBIENT = 0.1;
|
||||
float AMBIENT = 0.2;
|
||||
|
||||
uniform vec3 color;
|
||||
uniform float metalness;
|
||||
uniform float roughness;
|
||||
uniform vec3 lightPos;
|
||||
|
||||
in vec3 vecNormal;
|
||||
uniform vec3 lightColor;
|
||||
in vec3 viewDirTS;
|
||||
in vec3 lightDirTS;
|
||||
in vec3 worldPos;
|
||||
|
||||
out vec4 outColor;
|
||||
in mat3 TBN;
|
||||
void main()
|
||||
{
|
||||
vec3 lightDir = normalize(lightPos-worldPos);
|
||||
vec3 normal = normalize(vecNormal);
|
||||
float diffuse=max(0,dot(normal,lightDir));
|
||||
outColor = vec4(color*min(1,AMBIENT+diffuse), 1.0);
|
||||
}
|
||||
vec3 normal = normalize(TBN * vec3(0, 0, 1)); // Normal z TBN
|
||||
vec3 L = normalize(lightPos - worldPos);
|
||||
vec3 V = normalize(viewDirTS);
|
||||
vec3 H = normalize(L + V);
|
||||
|
||||
float k = pow((roughness + 1), 2.0) / 8.0;
|
||||
|
||||
float D = (roughness * roughness) / (3.14159 * pow(pow(dot(normal, H), 2.0) * (roughness * roughness - 1.0) + 1.0, 2.0));
|
||||
float G = dot(normal, L) / (dot(normal, L) * (1.0 - k) + k);
|
||||
vec3 F0 = mix(vec3(0.04), color, metalness);
|
||||
vec3 F = F0 + (1.0 - F0) * pow(1 - dot(V, H), 5.0);
|
||||
|
||||
vec3 specular = lightColor * (D * G * F) / (4 * dot(normal, L) * dot(normal, V) + 0.00001);
|
||||
vec3 kD = vec3(1.0) - F;
|
||||
|
||||
vec3 diffuse = lightColor * kD * (color / 3.1458493);
|
||||
|
||||
vec3 finalColor = (diffuse + specular) * min(1.0, AMBIENT + max(dot(normal, L), 0.0));
|
||||
|
||||
outColor = vec4(finalColor, 1.0);
|
||||
}
|
@ -2,17 +2,40 @@
|
||||
|
||||
layout(location = 0) in vec3 vertexPosition;
|
||||
layout(location = 1) in vec3 vertexNormal;
|
||||
layout(location = 2) in vec2 vertexTexCoord;
|
||||
layout(location = 3) in vec3 vertexTangent;
|
||||
layout(location = 4) in vec3 vertexBitangent;
|
||||
|
||||
uniform mat4 transformation;
|
||||
uniform mat4 modelMatrix;
|
||||
|
||||
out vec3 vecNormal;
|
||||
out vec3 worldPos;
|
||||
out vec2 vecTex;
|
||||
|
||||
uniform vec3 lightPos;
|
||||
uniform vec3 cameraPos;
|
||||
|
||||
out vec3 viewDirTS;
|
||||
out vec3 lightDirTS;
|
||||
out mat3 TBN;
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
worldPos = (modelMatrix* vec4(vertexPosition,1)).xyz;
|
||||
vecNormal = (modelMatrix* vec4(vertexNormal,0)).xyz;
|
||||
vec3 tangent = normalize(mat3(modelMatrix) * vertexTangent);
|
||||
vec3 bitangent = normalize(mat3(modelMatrix) * vertexBitangent);
|
||||
vec3 normal = normalize(mat3(modelMatrix) * vertexNormal);
|
||||
|
||||
mat3 TBN = transpose(mat3(tangent, bitangent, normal));
|
||||
|
||||
vec3 worldPos = (modelMatrix * vec4(vertexPosition, 1)).xyz;
|
||||
|
||||
vec3 viewDir = normalize(cameraPos - worldPos);
|
||||
vec3 lightDir = normalize(lightPos - worldPos);
|
||||
|
||||
viewDirTS = vec3(TBN * viewDir);
|
||||
lightDirTS = vec3(TBN * lightDir);
|
||||
|
||||
vecTex = vec2((worldPos.x + 10.0) / 20.0, 1.0 - (worldPos.y + 10.0) / 20.0);
|
||||
|
||||
gl_Position = transformation * vec4(vertexPosition, 1.0);
|
||||
}
|
||||
}
|
@ -72,8 +72,7 @@ glm::vec3 spaceshipPos = glm::vec3(-3.f, 0, 0);
|
||||
glm::vec3 spaceshipDir = glm::vec3(1.f, 0.f, 0.f);
|
||||
|
||||
bool fire = false;
|
||||
float a = 3 ;
|
||||
|
||||
float a = 3;
|
||||
std::random_device rd;
|
||||
std::mt19937 gen(rd());
|
||||
//std::uniform_real_distribution<float> distribution(-0.5f, 0.5f);
|
||||
@ -89,7 +88,10 @@ glm::vec3 distance = asteroid_Pos - spaceshipPos;
|
||||
double step = 0.0000001;
|
||||
|
||||
GLuint VAO,VBO;
|
||||
float lastAsteroidTime = 0;
|
||||
float lastFiretime = 0;
|
||||
float ammoReloadTime = 3.0f; // Czas ładowania amunicji w sekundach
|
||||
float ammoReloadProgress = 0.0f;
|
||||
|
||||
float aspectRatio = 1.f;
|
||||
glm::vec3 ammoPos;
|
||||
unsigned int textureID;
|
||||
@ -99,13 +101,20 @@ float tiltAngleUpDown;
|
||||
|
||||
int colission = 3;
|
||||
int star = 0;
|
||||
int star_counter = 0;
|
||||
int star_counter = 1;
|
||||
float starMetalness = 0.8;
|
||||
float starRoughness = 0.1;
|
||||
glm::vec3 lightPos = glm::vec3(-8, 4, 2);
|
||||
glm::vec3 lightColor = glm::vec3(0.9, 0.7, 0.8) * 100;
|
||||
glm::vec3 lightDir = glm::vec3(0, 0, 0);
|
||||
|
||||
float spotlightPhi = 3.14 / 3;
|
||||
|
||||
double easeInExpo(double x) {
|
||||
return pow(2, 10 * x - 10);
|
||||
}
|
||||
|
||||
|
||||
glm::mat4 createCameraMatrix()
|
||||
{
|
||||
glm::vec3 cameraSide = glm::normalize(glm::cross(cameraDir,glm::vec3(0.f,1.f,0.f)));
|
||||
@ -143,17 +152,25 @@ glm::mat4 createPerspectiveMatrix()
|
||||
return perspectiveMatrix;
|
||||
}
|
||||
|
||||
void drawObjectColor(Core::RenderContext& context, glm::mat4 modelMatrix, glm::vec3 color) {
|
||||
|
||||
void drawObjectColor(Core::RenderContext& context, glm::mat4 modelMatrix, glm::vec3 color, float metalness, float roughness, glm::vec3 lightstarPos) {
|
||||
glUseProgram(program);
|
||||
glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix();
|
||||
glm::mat4 transformation = viewProjectionMatrix * modelMatrix;
|
||||
|
||||
glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&transformation);
|
||||
glUniformMatrix4fv(glGetUniformLocation(program, "modelMatrix"), 1, GL_FALSE, (float*)&modelMatrix);
|
||||
glUniform3f(glGetUniformLocation(program, "color"), color.x, color.y, color.z);
|
||||
glUniform3f(glGetUniformLocation(program, "lightPos"), 0, 0, 0);
|
||||
Core::DrawContext(context);
|
||||
glUniform3f(glGetUniformLocation(program, "lightPos"), lightstarPos.x, lightstarPos.y, lightstarPos.z);
|
||||
|
||||
glUniform3f(glGetUniformLocation(program, "color"), color.x, color.y, color.z);
|
||||
glUniform3f(glGetUniformLocation(program, "lightColor"), lightColor.r, lightColor.g, lightColor.b);
|
||||
glUniform3f(glGetUniformLocation(program, "cameraPos"), cameraPos.x, cameraPos.y, cameraPos.z);
|
||||
glUniform1f(glGetUniformLocation(program, "metalness"), metalness);
|
||||
glUniform1f(glGetUniformLocation(program, "roughness"), roughness);
|
||||
|
||||
|
||||
// Przesyłanie informacji o widoku (view) do shadera
|
||||
|
||||
Core::DrawContext(context);
|
||||
}
|
||||
|
||||
void drawObjectTexture(Core::RenderContext& context, glm::mat4 modelMatrix, GLuint textureID, GLuint normalMapId, GLuint metalnessTexture, GLuint roughnessTexture) {
|
||||
@ -196,6 +213,44 @@ void drawObjectSkyBox(Core::RenderContext& context, glm::mat4 modelMatrix) {
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
|
||||
}
|
||||
void updateAmmoReload() {
|
||||
float deltaTime = static_cast<float>(glfwGetTime() - lastFiretime);
|
||||
|
||||
if (fire) {
|
||||
ammoReloadProgress += 1.0f / ammoReloadTime * deltaTime;
|
||||
if (ammoReloadProgress >= 1.0f) {
|
||||
ammoReloadProgress = 1.0f;
|
||||
fire = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
ammoReloadProgress = fmaxf(0.0f, ammoReloadProgress - 1.0f / ammoReloadTime * deltaTime);
|
||||
}
|
||||
}
|
||||
|
||||
void drawAmmoReloadBar() {
|
||||
glUseProgram(program);
|
||||
|
||||
float barWidth = 0.01f;
|
||||
float barHeight = 0.02f;
|
||||
float barOffsetX = spaceshipPos.x-0.1f;
|
||||
float barOffsetY = spaceshipPos.y -0.1f;
|
||||
float barOffsetZ = spaceshipPos.z;
|
||||
|
||||
glm::mat4 viewProjectionMatrix = createPerspectiveMatrix() * createCameraMatrix();
|
||||
glm::mat4 barModelMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(barOffsetX, barOffsetY, barOffsetZ));
|
||||
|
||||
barModelMatrix = glm::scale(barModelMatrix, glm::vec3(barWidth, barHeight, ammoReloadProgress/5));
|
||||
|
||||
glm::mat4 transformation = viewProjectionMatrix * barModelMatrix;
|
||||
glUniformMatrix4fv(glGetUniformLocation(program, "transformation"), 1, GL_FALSE, (float*)&transformation);
|
||||
glUniformMatrix4fv(glGetUniformLocation(program, "modelMatrix"), 1, GL_FALSE, (float*)&barModelMatrix);
|
||||
glUniform3f(glGetUniformLocation(program, "color"), 0.0f, 1.0f, 0.0f);
|
||||
glUniform3f(glGetUniformLocation(program, "lightPos"), 0, 0, 0);
|
||||
|
||||
Core::DrawContext(cubeContext);
|
||||
glUseProgram(0);
|
||||
}
|
||||
|
||||
void generateAsteroids(glm::vec3 asteroid_Pos, glm::vec3 distance, double step) {
|
||||
glm::vec3 normalizedDir = glm::normalize(distance);
|
||||
@ -225,16 +280,21 @@ void generatePlanetoidBelt() {
|
||||
float pScale = planetoidsArray[i][2];
|
||||
bool collision = false;
|
||||
planetoidsArray[i][3] -= speed;
|
||||
float x = planetoidsArray[i][3];
|
||||
if (planetoidsArray[i][3] < -3.f) {
|
||||
planetoidsArray[i][0] += spaceshipPos.z; // Płynne przesunięcie na nową pozycję
|
||||
planetoidsArray[i][1] += spaceshipPos.y;
|
||||
planetoidsArray[i][3] = 10.f;
|
||||
planetoidsArray[i][4] == 0;
|
||||
|
||||
}
|
||||
|
||||
if (planetoidsArray[i][4] == 1) {
|
||||
// Planeta ju¿ uczestniczy³a w kolizji, przejdŸ do kolejnej iteracji
|
||||
// Planeta ju<EFBFBD> uczestniczy<7A>a w kolizji, przejd<6A> do kolejnej iteracji
|
||||
continue;
|
||||
}
|
||||
|
||||
if (planetoidsArray[i][3] < -3.f) {
|
||||
planetoidsArray[i][3] = 10.f;
|
||||
}
|
||||
float x = planetoidsArray[i][3];
|
||||
|
||||
|
||||
for (int j = 0; j < i; ++j) {
|
||||
float prevZ = planetoidsArray[j][0];
|
||||
@ -256,8 +316,8 @@ void generatePlanetoidBelt() {
|
||||
if (!collision) {
|
||||
if( fmod(i, starind) == 0) {
|
||||
if (checkCollision(glm::vec3(x, y, z), 0.1f, spaceshipPos, 0.025f,true)) {
|
||||
// Kolizja z gwiazd¹
|
||||
std::cout << "Collision with star " << i << std::endl;
|
||||
// Kolizja z gwiazd<EFBFBD>
|
||||
//std::cout << "Collision with star " << i << std::endl;
|
||||
planetoidsArray[i][4] = 1;
|
||||
star_counter++;
|
||||
if (star_counter == 3){
|
||||
@ -290,7 +350,7 @@ void generatePlanetoidBelt() {
|
||||
if (fmod(i, starind) == 0) {
|
||||
float time = glfwGetTime();
|
||||
glm::mat4 modelMatrix = glm::translate(glm::vec3(x, y, z)) * glm::rotate(glm::mat4(1.0f), glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 1.0f));
|
||||
drawObjectColor(starContext, modelMatrix * glm::eulerAngleX(time) * glm::scale(glm::vec3(0.03f)), glm::vec3(1, 1, 0.7));
|
||||
drawObjectColor(starContext, modelMatrix * glm::eulerAngleX(time) * glm::scale(glm::vec3(0.03f)), glm::vec3(1, 1, 0.7), starMetalness, starRoughness, spaceshipPos);
|
||||
if (star == 0)
|
||||
{
|
||||
star++;
|
||||
@ -327,27 +387,27 @@ glm::mat4 specshipCameraRotrationMatrix = glm::mat4({
|
||||
});
|
||||
|
||||
void drawStars(int star_number) {
|
||||
float yOffset = 2.0f;
|
||||
float zOffset = 12.0f;
|
||||
float yOffset = 0.55f + spaceshipPos.y;
|
||||
float zOffset =5.10f + spaceshipPos.z;
|
||||
float scaleFactor = 0.03f;
|
||||
|
||||
for (int i = 0; i < star_number; ++i) {
|
||||
drawObjectColor(starContext, glm::translate(glm::vec3(10.0f, yOffset, zOffset - i * 0.5f))
|
||||
drawObjectColor(starContext, glm::translate(glm::vec3(2.3f, yOffset, (zOffset) - i * 0.5f ))
|
||||
* glm::rotate(glm::mat4(), glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 0.0f))
|
||||
* glm::scale(glm::vec3(scaleFactor)), glm::vec3(0, 1, 0));
|
||||
* glm::scale(glm::vec3(scaleFactor)), glm::vec3(1, 1, 0.7), starMetalness, starRoughness,glm::vec3(1.0f, yOffset, zOffset));
|
||||
}
|
||||
}
|
||||
|
||||
void drawHearts(int collision_number) {
|
||||
float yOffset = 1.0f;
|
||||
float zOffset = 12.0f;
|
||||
float yOffset = -0.5f + spaceshipPos.y;
|
||||
float zOffset = 6.15 + spaceshipPos.z;
|
||||
|
||||
|
||||
for (int i = 0; i < 5; ++i) {
|
||||
if (collision_number > i) {
|
||||
drawObjectColor(heartContext, glm::translate(glm::vec3(10.0f, yOffset, zOffset - i * 0.5f))
|
||||
drawObjectColor(heartContext, glm::translate(glm::vec3(3.5f, yOffset, (zOffset) - i * 0.5f))
|
||||
* glm::rotate(glm::mat4(), glm::radians(-90.0f), glm::vec3(1.0f, 0.0f, 0.0f))
|
||||
* glm::scale(glm::vec3(0.025f)), glm::vec3(1, 0, 0));
|
||||
* glm::scale(glm::vec3(0.025f)), glm::vec3(1, 0, 0), starMetalness, starRoughness, glm::vec3(1.0f, yOffset, zOffset));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -404,18 +464,17 @@ void renderScene(GLFWwindow* window)
|
||||
//);
|
||||
|
||||
generatePlanetoidBelt();
|
||||
lastAsteroidTime = glfwGetTime();
|
||||
if (fire == true){
|
||||
ammoPos = ammoPos + glm::vec3(0.025f, 0.f, 0.f);
|
||||
std::cout << ammoPos.x;
|
||||
glm::mat4 modelMatrix = glm::translate(ammoPos) * glm::rotate(glm::mat4(1.0f), glm::radians(90.0f), glm::vec3(0.0f, 0.0f, 0.0f));
|
||||
drawObjectColor(saberContext, glm::translate(ammoPos) * glm::scale(glm::vec3(0.005f)), glm::vec3(1, 0.2, 0.6));
|
||||
glm::mat4 modelMatrix = glm::translate(ammoPos) * glm::rotate(glm::mat4(1.0f), glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 1.0f));
|
||||
drawObjectColor(saberContext, modelMatrix * glm::scale(glm::vec3(0.003f)), glm::vec3(0.1, 0.1, 0.7), starMetalness, starRoughness, spaceshipPos);
|
||||
}
|
||||
|
||||
|
||||
drawStars(star_counter);
|
||||
drawHearts(colission);
|
||||
|
||||
drawHearts(colission);
|
||||
//updateAmmoReload();
|
||||
//drawAmmoReloadBar();
|
||||
glUseProgram(0);
|
||||
glfwSwapBuffers(window);
|
||||
}
|
||||
@ -540,6 +599,8 @@ void mouse_button_callback(GLFWwindow* window, int button, int action, int mods)
|
||||
if (button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS) {
|
||||
fire = true;
|
||||
ammoPos = spaceshipPos;
|
||||
lastFiretime = glfwGetTime();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -560,15 +621,6 @@ void processInput(GLFWwindow* window)
|
||||
}
|
||||
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) {
|
||||
spaceshipPos += glm::vec3(0.f,moveSpeed,0.f);
|
||||
tiltAngleUpDown += easeInExpo(x);
|
||||
}
|
||||
else {
|
||||
if (tiltAngleUpDown > 0) {
|
||||
tiltAngleUpDown -= 0.003;
|
||||
}
|
||||
}
|
||||
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS){
|
||||
spaceshipPos -= glm::vec3(0.f, moveSpeed, 0.f);
|
||||
tiltAngleUpDown -= easeInExpo(x);
|
||||
}
|
||||
else {
|
||||
@ -576,6 +628,15 @@ void processInput(GLFWwindow* window)
|
||||
tiltAngleUpDown += 0.003;
|
||||
}
|
||||
}
|
||||
if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS){
|
||||
spaceshipPos -= glm::vec3(0.f, moveSpeed, 0.f);
|
||||
tiltAngleUpDown += easeInExpo(x);
|
||||
}
|
||||
else {
|
||||
if (tiltAngleUpDown > 0) {
|
||||
tiltAngleUpDown -= 0.003;
|
||||
}
|
||||
}
|
||||
if (glfwGetKey(window, GLFW_KEY_X) == GLFW_PRESS)
|
||||
spaceshipPos += spaceshipSide * moveSpeed;
|
||||
if (glfwGetKey(window, GLFW_KEY_Z) == GLFW_PRESS)
|
||||
|
Loading…
Reference in New Issue
Block a user