Make ground mesh, improve particles

This commit is contained in:
karl 2021-05-08 17:52:33 +02:00
parent 82fae245a1
commit 5016ee49d1
4 changed files with 49 additions and 50 deletions

View File

@ -62,11 +62,12 @@ void main() {
vec3 view_direction = normalize(fs_in.TangentViewPos - fs_in.TangentFragPos);
vec2 uv = fs_in.TexCoords;
uv = get_parallax_offset_uv(fs_in.TexCoords, view_direction);
uv = get_parallax_offset_uv(uv, view_direction);
// Discard if the parallax offset moved us outside of the texture
if (uv.x > 1.0 || uv.y > 1.0 || uv.x < 0.0 || uv.y < 0.0)
discard;
// TODO: Do this only if the mode is not REPEAT
//if (uv.x > 1.0 || uv.y > 1.0 || uv.x < 0.0 || uv.y < 0.0)
// discard;
// Get normal from normal map and scale it to -1..1
vec3 normal = texture(normalMap, uv).rgb;

View File

@ -1,6 +1,8 @@
#include "Gedeng/ParticleSystem.h"
#include "Gedeng/Logger.h"
#include <glm/gtc/random.hpp>
namespace Gedeng {
ParticleSystem::ParticleSystem() {
@ -69,9 +71,8 @@ void ParticleSystem::update(float delta) {
update_shader.setInt("number_to_generate", target_particle_count);
elapsed_time -= next_generation_time;
glm::vec3 random_seed = glm::vec3(
10.0, 10.0,
10.0); // FIXME: Random glm::vec3(grandf(-10.0f, 20.0f), grandf(-10.0f, 20.0f), grandf(-10.0f, 20.0f));
glm::vec3 random_seed =
glm::vec3(glm::linearRand(-10.0f, 20.0f), glm::linearRand(-10.0f, 20.0f), glm::linearRand(-10.0f, 20.0f));
update_shader.setVec3("random_seed", random_seed);
}

View File

@ -13,21 +13,21 @@ namespace Gedeng {
// A simple 2x2 quad mesh consisting of two triangles. Oriented upwards by default.
class QuadMesh : public Spatial {
public:
QuadMesh() {
QuadMesh(float scale = 1.0f) {
// Positions
glm::vec3 pos1(-1.0f, 1.0f, 0.0f);
glm::vec3 pos2(-1.0f, -1.0f, 0.0f);
glm::vec3 pos3(1.0f, -1.0f, 0.0f);
glm::vec3 pos4(1.0f, 1.0f, 0.0f);
glm::vec3 pos1 = glm::vec3(-1.0f, 0.0f, 1.0f) * scale;
glm::vec3 pos2 = glm::vec3(-1.0f, 0.0f, -1.0f) * scale;
glm::vec3 pos3 = glm::vec3(1.0f, 0.0f, -1.0f) * scale;
glm::vec3 pos4 = glm::vec3(1.0f, 0.0f, 1.0f) * scale;
// Texture coordinates
glm::vec2 uv1(0.0f, 1.0f);
glm::vec2 uv2(0.0f, 0.0f);
glm::vec2 uv3(1.0f, 0.0f);
glm::vec2 uv4(1.0f, 1.0f);
glm::vec2 uv1 = glm::vec2(0.0f, 1.0f) * scale;
glm::vec2 uv2 = glm::vec2(0.0f, 0.0f) * scale;
glm::vec2 uv3 = glm::vec2(1.0f, 0.0f) * scale;
glm::vec2 uv4 = glm::vec2(1.0f, 1.0f) * scale;
// Normal vector
glm::vec3 nm(0.0f, 0.0f, 1.0f);
glm::vec3 nm(0.0f, 1.0f, 0.0f);
// Calculate tangent/bitangent vectors of both triangles
glm::vec3 tangent1, bitangent1;
@ -69,8 +69,7 @@ class QuadMesh : public Spatial {
bitangent2.z = f * (-deltaUV2.x * edge1.z + deltaUV1.x * edge2.z);
bitangent2 = glm::normalize(bitangent2);
float quadVertices[] = {
// positions // normal // texcoords // tangent // bitangent
float quadVertices[] = {// positions // normal // texcoords // tangent // bitangent
pos1.x, pos1.y, pos1.z, nm.x, nm.y, nm.z, uv1.x,
uv1.y, tangent1.x, tangent1.y, tangent1.z, bitangent1.x, bitangent1.y, bitangent1.z,
pos2.x, pos2.y, pos2.z, nm.x, nm.y, nm.z, uv2.x,
@ -94,17 +93,13 @@ class QuadMesh : public Spatial {
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 14 * sizeof(float), (void *)0);
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 14 * sizeof(float),
(void *)(3 * sizeof(float)));
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 14 * sizeof(float), (void *)(3 * sizeof(float)));
glEnableVertexAttribArray(2);
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 14 * sizeof(float),
(void *)(6 * sizeof(float)));
glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 14 * sizeof(float), (void *)(6 * sizeof(float)));
glEnableVertexAttribArray(3);
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 14 * sizeof(float),
(void *)(8 * sizeof(float)));
glVertexAttribPointer(3, 3, GL_FLOAT, GL_FALSE, 14 * sizeof(float), (void *)(8 * sizeof(float)));
glEnableVertexAttribArray(4);
glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, 14 * sizeof(float),
(void *)(11 * sizeof(float)));
glVertexAttribPointer(4, 3, GL_FLOAT, GL_FALSE, 14 * sizeof(float), (void *)(11 * sizeof(float)));
}
void render(Shader &shader) {
@ -120,4 +115,4 @@ class QuadMesh : public Spatial {
unsigned int quadVBO;
};
}
} // namespace Gedeng

View File

@ -1,5 +1,6 @@
#include "Gedeng/Logger.h"
#include "Gedeng/ParticleSystem.h"
#include "Gedeng/QuadMesh.h"
#include "Gedeng/TextLabel.h"
#include "Gedeng/Vector3.h"
#define GEDENG_MAIN
@ -15,18 +16,19 @@ class ParticleApp : public Gedeng::Application {
camera(Gedeng::FPSCamera(90, 1920, 1080, 0.1, 1000.0)),
albedo("Resources/Textures/PavingStones/PavingStones070_2K_Color.jpg", Gedeng::Texture::Settings()),
bump("Resources/Textures/PavingStones/PavingStones070_2K_Displacement.jpg", Gedeng::Texture::Settings()),
normal("Resources/Textures/PavingStones/PavingStones070_2K_Normal.jpg", Gedeng::Texture::Settings()) {
particles.set_position(glm::vec3(0.0f, 0.0f, -10.0f));
particles.set_velocity(glm::vec3(-5, 0, -5), glm::vec3(5, 20, 5));
particles.set_gravity(glm::vec3(0, -5, 0));
normal("Resources/Textures/PavingStones/PavingStones070_2K_Normal.jpg", Gedeng::Texture::Settings()),
quad_mesh(Gedeng::QuadMesh(10.0)) {
particles.set_position(glm::vec3(0.0f, 0.0f, -5.0f));
particles.set_velocity(glm::vec3(-1, 0, -1), glm::vec3(1, 5, 1));
particles.set_gravity(glm::vec3(0, -1, 0));
particles.set_color(glm::vec3(0.0f, 0.5f, 1.0f));
particles.set_lifetime(1.5f, 3.0f);
particles.set_size(0.75f);
particles.set_interval(0.5f);
particles.set_number_of_particles(30);
particles.set_lifetime(5.0f, 10.0f);
particles.set_size(0.1);
particles.set_interval(0.05f);
particles.set_number_of_particles(50);
particles.set_texture(&albedo);
camera.translate(glm::vec3(0.0, 0.0, 1.0));
camera.translate(glm::vec3(0.0, 2.0, 1.0));
// camera.rotate(30, glm::vec3(1.0, 0.0, 0.0));
}
@ -38,7 +40,7 @@ class ParticleApp : public Gedeng::Application {
}
void dynamic_update(double delta) override {
glClearColor(0.85f, 0.9f, 0.94f, 1.0f);
glClearColor(0.1, 0.1f, 0.1, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
render_shader.use();