summaryrefslogtreecommitdiff
path: root/archive/src/systems/terrain.h
diff options
context:
space:
mode:
Diffstat (limited to 'archive/src/systems/terrain.h')
-rw-r--r--archive/src/systems/terrain.h72
1 files changed, 72 insertions, 0 deletions
diff --git a/archive/src/systems/terrain.h b/archive/src/systems/terrain.h
new file mode 100644
index 0000000..5a96132
--- /dev/null
+++ b/archive/src/systems/terrain.h
@@ -0,0 +1,72 @@
+/**
+ * @file terrain.h
+ * @brief
+ */
+
+#pragma once
+
+/*
+Future:
+ - Chunked terrain
+ - Dynamic LOD
+*/
+
+#include "defines.h"
+#include "maths_types.h"
+#include "ral_types.h"
+#include "render.h"
+#include "str.h"
+
+typedef struct Heightmap {
+ Str8 filepath;
+ u32x2 pixel_dimensions;
+ void* image_data;
+ u32 num_channels;
+ bool is_uploaded;
+} Heightmap;
+
+typedef struct Terrain_Storage {
+ // arena terrain_allocator;
+ u32x2 grid_dimensions;
+ f32 grid_scale;
+ u32 num_vertices;
+ Heightmap heightmap; // NULL = no heightmap
+ GPU_Renderpass* hmap_renderpass;
+ GPU_Pipeline* hmap_pipeline;
+ TextureHandle texture;
+
+ bool hmap_loaded;
+ BufferHandle vertex_buffer;
+ BufferHandle index_buffer;
+ u32 indices_count;
+} Terrain_Storage;
+
+// --- Public API
+PUB bool Terrain_Init(Terrain_Storage* storage);
+PUB void Terrain_Shutdown(Terrain_Storage* storage);
+PUB void Terrain_Draw(
+ Terrain_Storage* storage); // NOTE: For now it renders directly to main framebuffer
+
+/** @brief Sets the active heightmap to be rendered and collided against. */
+PUB void Terrain_LoadHeightmap(Terrain_Storage* storage, Heightmap hmap, f32 grid_scale,
+ bool free_on_upload);
+PUB Heightmap Heightmap_FromImage(Str8 filepath);
+PUB Heightmap Heightmap_FromPerlin(/* TODO: perlin noise generation parameters */);
+
+PUB bool Terrain_IsActive(); // checks whether we have a loaded heightmap and it's being rendered
+
+/** @brief Get the height (the Y component) for a vertex at a particular coordinate in the heightmap
+ */
+PUB f32 Heightmap_HeightXZ(const Heightmap* hmap, u32 x, u32 z);
+
+/** @brief Calculate the normal vector of a vertex at a particular coordinate in the heightmap */
+PUB Vec3 Heightmap_NormalXZ(const Heightmap* hmap, f32 x, f32 z);
+
+// /** @brief Generate the `geometry_data` for a heightmap ready to be uploaded to the GPU */
+// Geometry geo_heightmap(arena* a, Heightmap heightmap);
+
+typedef struct TerrainUniforms {
+ TextureHandle tex_slot_1;
+} TerrainUniforms;
+
+ShaderDataLayout TerrainUniforms_GetLayout(void* data); \ No newline at end of file