From 7f47be173ea78a481f4d25bc04d338499c3a8807 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?No=C3=A9?= <noe.artru@polytechnique.org>
Date: Fri, 21 Apr 2023 16:06:10 +0200
Subject: [PATCH] Larger terrain and perlin tests

---
 projet-code/scenes_inf443/base/base.exe       | Bin 2062848 -> 2062848 bytes
 projet-code/scenes_inf443/base/src/ball.cpp   |  14 +++++------
 projet-code/scenes_inf443/base/src/ball.hpp   |   2 +-
 projet-code/scenes_inf443/base/src/scene.cpp  |  14 +++++++----
 projet-code/scenes_inf443/base/src/scene.hpp  |   1 +
 .../scenes_inf443/base/src/terrain.cpp        |  23 ++++++++++++------
 .../scenes_inf443/base/src/terrain.hpp        |   9 ++++++-
 7 files changed, 42 insertions(+), 21 deletions(-)

diff --git a/projet-code/scenes_inf443/base/base.exe b/projet-code/scenes_inf443/base/base.exe
index f74f65cd0f787e75efac0d42bc582eab637f05cf..24701fe16285e7387caa880fbddff8396332114f 100644
GIT binary patch
delta 4894
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
NH7q!*CFz~R{|Dz4$8rDw

delta 5006
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
Q5n+qh7WjEnYGcd)09e1^5&!@I

diff --git a/projet-code/scenes_inf443/base/src/ball.cpp b/projet-code/scenes_inf443/base/src/ball.cpp
index f84adfd..1064ece 100644
--- a/projet-code/scenes_inf443/base/src/ball.cpp
+++ b/projet-code/scenes_inf443/base/src/ball.cpp
@@ -21,7 +21,7 @@ void ball::initialize()
 void ball::simulate(float dt, float terrain_length) {
 	for (int i = 0; i < N; i++) {
 		if (pos[i][2] < -1 || cgp::abs(pos[i][0]) > terrain_length / 2 || cgp::abs(pos[i][1]) > terrain_length / 2) {
-			pos[i] = { 0,0, evaluate_terrain_height(0,0) };
+			pos[i] = { 0,0, evaluate_terrain_height(0,0, terrain_length) };
 			v[i] = { 3 * rand_interval(), 3 * rand_interval(), 4 + i };
 		}
 		else {
@@ -29,8 +29,8 @@ void ball::simulate(float dt, float terrain_length) {
 			v[i][2] -= 10 * dt;
 		}
 
-		if (pos[i][2] < evaluate_terrain_height(pos[i][0], pos[i][1])) {
-			vec3 normal = normalize(terrain_orientation(pos[i][0], pos[i][1]));
+		if (pos[i][2] < evaluate_terrain_height(pos[i][0], pos[i][1], terrain_length)) {
+			vec3 normal = normalize(terrain_orientation(pos[i][0], pos[i][1], terrain_length));
 			v[i][2] += 10 * dt;
 
 			vec3 temp = v[i] - dot(v[i], normal) * normal;
@@ -42,11 +42,11 @@ void ball::simulate(float dt, float terrain_length) {
 	}
 }
 
-vec3 terrain_orientation(float x, float y) {
-	float z = evaluate_terrain_height(x, y);
+vec3 terrain_orientation(float x, float y, float terrain_length) {
+	float z = evaluate_terrain_height(x, y, terrain_length);
 	float step = 0.1f;
-	vec3 u = { step, 0, evaluate_terrain_height(x + step,y) - z };
-	vec3 v = { 0, step, evaluate_terrain_height(x,y + step) - z };
+	vec3 u = { step, 0, evaluate_terrain_height(x + step,y, terrain_length) - z };
+	vec3 v = { 0, step, evaluate_terrain_height(x,y + step, terrain_length) - z };
 
 	return cross(v, u);
 }
diff --git a/projet-code/scenes_inf443/base/src/ball.hpp b/projet-code/scenes_inf443/base/src/ball.hpp
index a1c8db3..03af3f6 100644
--- a/projet-code/scenes_inf443/base/src/ball.hpp
+++ b/projet-code/scenes_inf443/base/src/ball.hpp
@@ -17,5 +17,5 @@ struct ball {
 	void simulate(float dt, float terrain_length);
 };
 
-vec3 terrain_orientation(float x, float y);
+vec3 terrain_orientation(float x, float y, float terrain_length);
 
diff --git a/projet-code/scenes_inf443/base/src/scene.cpp b/projet-code/scenes_inf443/base/src/scene.cpp
index 2a62466..1e02500 100644
--- a/projet-code/scenes_inf443/base/src/scene.cpp
+++ b/projet-code/scenes_inf443/base/src/scene.cpp
@@ -11,7 +11,7 @@ int num_trees = 50;
 int num_grass = 100;
 std::vector<vec3> tree_position;
 std::vector<vec3> grass_position;
-float terrain_length = 20;
+float terrain_length = 50;
 
 void scene_structure::initialize()
 {
@@ -55,7 +55,7 @@ void scene_structure::initialize()
 
 	float x = 1.0;
 	float y = 2.0;
-	tree.model.translation = { x, y, evaluate_terrain_height(x,y) };
+	tree.model.translation = { x, y, evaluate_terrain_height(x,y, terrain_length) };
 
 	tree_position = generate_positions_on_terrain(num_trees, terrain_length-1);
 	
@@ -119,9 +119,12 @@ void scene_structure::display_frame()
 	//custom function we added to ..first_person_eulor, changes whether the cursor is trapped or not
 	camera_control.trap_cursor(gui.trap_cursor);
 
-	vec3 eye_level = camera_control.camera_model.position_camera;
-	eye_level[2] = evaluate_terrain_height(eye_level[0], eye_level[1]) + 0.75;
-	camera_control.camera_model.position_camera = eye_level;
+	//Walking on ground
+	if (!gui.fly) {
+		vec3 eye_level = camera_control.camera_model.position_camera;
+		eye_level[2] = evaluate_terrain_height(eye_level[0], eye_level[1], terrain_length) + 0.75;
+		camera_control.camera_model.position_camera = eye_level;
+	}
 
 	// Set the light to the current position of the camera
 	environment.light = camera_control.camera_model.position();
@@ -284,6 +287,7 @@ void scene_structure::display_gui()
 	ImGui::Checkbox("Frame", &gui.display_frame);
 	ImGui::Checkbox("Wireframe", &gui.display_wireframe);
 	ImGui::Checkbox("Trapped Cursor", &gui.trap_cursor);
+	ImGui::Checkbox("Fly", &gui.fly);
 
 	ImGui::SliderFloat("Time", &timer_mvt.t, timer_mvt.t_min, timer_mvt.t_max);
 	ImGui::SliderFloat("Time scale", &timer_mvt.scale, 0.0f, 2.0f);
diff --git a/projet-code/scenes_inf443/base/src/scene.hpp b/projet-code/scenes_inf443/base/src/scene.hpp
index 25b5280..dd142fe 100644
--- a/projet-code/scenes_inf443/base/src/scene.hpp
+++ b/projet-code/scenes_inf443/base/src/scene.hpp
@@ -23,6 +23,7 @@ struct gui_parameters {
 	bool display_wireframe = false;
 	float k = 0.5f;
 	bool trap_cursor = true;
+	bool fly = false;
 };
 
 // The structure of the custom scene
diff --git a/projet-code/scenes_inf443/base/src/terrain.cpp b/projet-code/scenes_inf443/base/src/terrain.cpp
index 98ff20e..4b05afa 100644
--- a/projet-code/scenes_inf443/base/src/terrain.cpp
+++ b/projet-code/scenes_inf443/base/src/terrain.cpp
@@ -6,20 +6,29 @@ using namespace cgp;
 
 
 // Evaluate 3D position of the terrain for any (x,y)
-float evaluate_terrain_height(float x, float y)
+float evaluate_terrain_height(float x, float y, float terrain_length)
 {
+    //p, h, sigma -> positions, heights and wideness of bell curves
     vec2 p[] = { {-10, -10}, {5, 5}, {-3, 4}, {6, 4} };
     float h[] = { 3.0f, -1.5f, 1.0f, 2.0f };
     float sigma[] = { 10.0f, 3.0f, 4.0f, 4.0f };
-    float noise = 0.4*noise_perlin(vec2(x/50,y/50), 4.5f, 0.5, 5.0f);
-
     float z = 0;
     for (int i = 0; i < 4; i++) {
         float d = norm(vec2(x, y) - p[i]) / sigma[i];
         z += h[i] * std::exp(-d * d);
     }
-    z += noise;
-    return z;
+
+    perlin_noise_parameters parameters;
+    parameters.terrain_height = 6.03;
+    parameters.octave = 5;
+    parameters.frequency_gain = 2.89;
+    parameters.persistency = 0.39;
+    
+
+    float perlin_noise = parameters.terrain_height * noise_perlin(vec2(x / terrain_length, y / terrain_length), parameters.octave, parameters.persistency, parameters.frequency_gain);
+
+
+    return perlin_noise;
 }
 
 
@@ -44,7 +53,7 @@ mesh create_terrain_mesh(int N, float terrain_length)
             float y = (v - 0.5f) * terrain_length;
 
             // Compute the surface height function at the given sampled coordinate
-            float z = evaluate_terrain_height(x,y);
+            float z = evaluate_terrain_height(x,y, terrain_length);
 
             // Store vertex coordinates
             terrain.position[kv+N*ku] = {x,y,z};
@@ -81,7 +90,7 @@ std::vector<cgp::vec3> generate_positions_on_terrain(int N, float terrain_length
     for (int i = 0; i < N; i++) {
         x = rand_interval(-d, d);
         y = rand_interval(-d, d);
-        rand_pos.push_back({ x,y, evaluate_terrain_height(x, y) });
+        rand_pos.push_back({ x,y, evaluate_terrain_height(x, y, terrain_length) });
     }
 
     return rand_pos;
diff --git a/projet-code/scenes_inf443/base/src/terrain.hpp b/projet-code/scenes_inf443/base/src/terrain.hpp
index 757b2ae..96f8be2 100644
--- a/projet-code/scenes_inf443/base/src/terrain.hpp
+++ b/projet-code/scenes_inf443/base/src/terrain.hpp
@@ -2,8 +2,15 @@
 
 #include "cgp/cgp.hpp"
 
+struct perlin_noise_parameters
+{
+	float persistency = 0.35f;
+	float frequency_gain = 2.0f;
+	int octave = 6;
+	float terrain_height = 0.5f;
+};
 
-float evaluate_terrain_height(float x, float y);
+float evaluate_terrain_height(float x, float y, float terrain_length);
 
 /** Compute a terrain mesh 
 	The (x,y) coordinates of the terrain are set in [-length/2, length/2].
-- 
GitLab