summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoromnisci3nce <omniscient.oce@gmail.com>2024-07-18 16:17:23 +1000
committeromnisci3nce <omniscient.oce@gmail.com>2024-07-18 16:17:23 +1000
commit7ec62c58e9560fc961ec3522490e40ad1d259c72 (patch)
treee7d6c9bb9efc9871fe2a4bc7e5f51a02f7d901ef /src
parentc43bee3ec89e0863b4195ca9298a007d3526a6d9 (diff)
wip skybox. make geometry owned and copied onto Mesh
Diffstat (limited to 'src')
-rw-r--r--src/new_render/pbr.c2
-rw-r--r--src/new_render/render.c2
-rw-r--r--src/new_render/render_types.h2
-rw-r--r--src/new_render/shadows.c2
-rw-r--r--src/new_render/skybox.c61
-rw-r--r--src/new_render/skybox.h19
-rw-r--r--src/ral/backends/opengl/backend_opengl.c2
-rw-r--r--src/systems/terrain.c7
-rw-r--r--src/systems/terrain.h4
9 files changed, 60 insertions, 41 deletions
diff --git a/src/new_render/pbr.c b/src/new_render/pbr.c
index f793002..46c621f 100644
--- a/src/new_render/pbr.c
+++ b/src/new_render/pbr.c
@@ -111,7 +111,7 @@ void PBR_Execute(PBR_Storage* storage, Camera camera, TextureHandle shadowmap_te
GPU_EncodeSetVertexBuffer(enc, renderable.mesh->vertex_buffer);
GPU_EncodeSetIndexBuffer(enc, renderable.mesh->index_buffer);
// draw
- GPU_EncodeDrawIndexed(enc, renderable.mesh->geometry->indices->len);
+ GPU_EncodeDrawIndexed(enc, renderable.mesh->geometry.indices->len);
}
GPU_CmdEncoder_EndRender(enc);
diff --git a/src/new_render/render.c b/src/new_render/render.c
index d98db4f..2a0ea9d 100644
--- a/src/new_render/render.c
+++ b/src/new_render/render.c
@@ -188,7 +188,7 @@ Mesh Mesh_Create(Geometry* geometry, bool free_on_upload) {
GPU_BufferCreate(index_bytes, BUFFER_INDEX, BUFFER_FLAG_GPU, geometry->indices->data);
m.is_uploaded = true;
- m.geometry = geometry;
+ m.geometry = *geometry; // clone geometry data and store on Mesh struct
if (free_on_upload) {
Geometry_Destroy(geometry);
}
diff --git a/src/new_render/render_types.h b/src/new_render/render_types.h
index 376e512..4807559 100644
--- a/src/new_render/render_types.h
+++ b/src/new_render/render_types.h
@@ -29,7 +29,7 @@ typedef struct u32_opt {
typedef struct Mesh {
BufferHandle vertex_buffer;
BufferHandle index_buffer;
- Geometry* geometry; // NULL means it has been freed CPU-side
+ Geometry geometry; // NULL means it has been freed CPU-side
i32 material_index; // -1 => no material
bool is_uploaded; // has the data been uploaded to the GPU
} Mesh;
diff --git a/src/new_render/shadows.c b/src/new_render/shadows.c
index 24bfb57..9a44e55 100644
--- a/src/new_render/shadows.c
+++ b/src/new_render/shadows.c
@@ -105,7 +105,7 @@ void Shadow_ShadowmapExecute(Shadow_Storage* storage, Mat4 light_space_transform
GPU_EncodeBindShaderData(&shadow_encoder, 0, shader_data);
GPU_EncodeSetVertexBuffer(&shadow_encoder, mesh->vertex_buffer);
GPU_EncodeSetIndexBuffer(&shadow_encoder, mesh->index_buffer);
- GPU_EncodeDrawIndexed(&shadow_encoder, mesh->geometry->indices->len);
+ GPU_EncodeDrawIndexed(&shadow_encoder, mesh->geometry.indices->len);
}
}
diff --git a/src/new_render/skybox.c b/src/new_render/skybox.c
index a0e151a..b8aa361 100644
--- a/src/new_render/skybox.c
+++ b/src/new_render/skybox.c
@@ -3,12 +3,14 @@
#include "file.h"
#include "glad/glad.h"
#include "log.h"
+#include "maths.h"
#include "primitives.h"
#include "ral_common.h"
#include "ral_impl.h"
#include "ral_types.h"
#include "render.h"
#include "render_types.h"
+#include "shader_layouts.h"
Skybox Skybox_Create(const char** face_paths, int n) {
INFO("Creating a skybox");
@@ -16,7 +18,7 @@ Skybox Skybox_Create(const char** face_paths, int n) {
// -- cube verts
Geometry geom = Geo_CreateCuboid(f32x3(1.0, 1.0, 1.0));
- Mesh cube = Mesh_Create(&geom, true);
+ Mesh cube = Mesh_Create(&geom, false);
// -- cubemap texture
TextureHandle handle;
@@ -40,11 +42,6 @@ Skybox Skybox_Create(const char** face_paths, int n) {
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
// shader pipeline
-
-
-
- ShaderData shader_data = { .data = NULL, .get_layout = &Skybox_GetLayout };
-
GPU_RenderpassDesc rpass_desc = {
.default_framebuffer = true,
};
@@ -53,22 +50,25 @@ Skybox Skybox_Create(const char** face_paths, int n) {
arena scratch = arena_create(malloc(1024 * 1024), 1024 * 1024);
Str8 vert_path = str8("assets/shaders/skybox.vert");
- Str8 frag_path = str8("assets/shaders/pbr_textured.frag");
+ Str8 frag_path = str8("assets/shaders/skybox.frag");
str8_opt vertex_shader = str8_from_file(&scratch, vert_path);
str8_opt fragment_shader = str8_from_file(&scratch, frag_path);
if (!vertex_shader.has_value || !fragment_shader.has_value) {
ERROR_EXIT("Failed to load shaders from disk")
}
- VertexDescription pos_only = { .debug_label = "Position only verts" };
- VertexDesc_AddAttr(&pos_only, "inPos", ATTR_F32x3);
- pos_only.use_full_vertex_size = true;
+ // VertexDescription pos_only = { .debug_label = "Position only verts" };
+ // VertexDesc_AddAttr(&pos_only, "inPos", ATTR_F32x3);
+ // pos_only.use_full_vertex_size = true;
+
+ ShaderData camera_data = { .data = NULL, .get_layout = &Binding_Camera_GetLayout};
+ ShaderData shader_data = { .data = NULL, .get_layout = &Skybox_GetLayout };
GraphicsPipelineDesc pipeline_desc = {
.debug_name = "Skybox pipeline",
- .vertex_desc = pos_only,
- .data_layouts = { shader_data },
- .data_layouts_count = 1,
+ .vertex_desc = static_3d_vertex_description(),
+ .data_layouts = { camera_data, shader_data },
+ .data_layouts_count = 2,
.vs = {
.debug_name = "Skybox Vertex Shader",
.filepath = vert_path,
@@ -95,12 +95,37 @@ void Skybox_Draw(Skybox* skybox, Camera camera) {
GPU_EncodeSetDefaults(enc);
// Shader data
- SkyboxUniforms uniforms = { .in_position = camera.position, .cubemap = skybox->texture };
- ShaderData skybox_data = { .data = &uniforms, .get_layout = Skybox_GetLayout };
+
+ Mat4 view, proj;
+ Camera_ViewProj(&camera, 1000, 1000, &view, &proj);
+ Mat4 new = mat4_ident();
+ new.data[0] = view.data[0];
+ new.data[1] = view.data[1];
+ new.data[2] = view.data[2];
+ new.data[4] = view.data[4];
+ new.data[5] = view.data[5];
+ new.data[6] = view.data[6];
+ new.data[8] = view.data[8];
+ new.data[9] = view.data[9];
+ new.data[10] = view.data[10];
+
+ Binding_Camera camera_data = { .view = new,
+ .projection = proj,
+ .viewPos = vec4(camera.position.x, camera.position.y,
+ camera.position.z, 1.0) };
+ GPU_EncodeBindShaderData(
+ enc, 0, (ShaderData){ .data = &camera_data, .get_layout = &Binding_Camera_GetLayout });
+
+
+ SkyboxUniforms uniforms = { .cubemap = skybox->texture };
+ ShaderData skybox_data = { .data = &uniforms, .get_layout = &Skybox_GetLayout };
+ GPU_EncodeBindShaderData(enc, 0, skybox_data);
GPU_EncodeSetVertexBuffer(enc, skybox->cube.vertex_buffer);
- GPU_EncodeSetVertexBuffer(enc, skybox->cube.index_buffer);
- GPU_EncodeDrawIndexed(enc, skybox->cube.geometry->indices->len);
+ GPU_EncodeSetIndexBuffer(enc, skybox->cube.index_buffer);
+ glDepthFunc(GL_LEQUAL);
+ GPU_EncodeDrawIndexed(enc, skybox->cube.geometry.indices->len);
+ glDepthFunc(GL_LESS);
GPU_CmdEncoder_EndRender(enc);
-} \ No newline at end of file
+}
diff --git a/src/new_render/skybox.h b/src/new_render/skybox.h
index 5540381..bf70976 100644
--- a/src/new_render/skybox.h
+++ b/src/new_render/skybox.h
@@ -19,7 +19,6 @@ PUB Skybox Skybox_Create(const char** face_paths, int n); // should always pass
PUB void Skybox_Draw(Skybox* skybox, Camera camera);
typedef struct SkyboxUniforms {
- Vec3 in_position;
TextureHandle cubemap;
} SkyboxUniforms;
@@ -28,24 +27,16 @@ static ShaderDataLayout Skybox_GetLayout(void* data) {
bool has_data = data != NULL;
ShaderBinding b1 = {
- .label = "In",
- .vis = VISIBILITY_VERTEX,
- .kind = BINDING_BYTES,
- .data = {.bytes = {.size = sizeof(Vec3)}}
- };
-
- ShaderBinding b2 = {
.label = "cubemap",
.vis = VISIBILITY_FRAGMENT,
- .kind = BINDING_SAMPLER,
+ .kind = BINDING_TEXTURE,
};
if (has_data) {
- b1.data.bytes.data = &d->in_position;
- b2.data.texture.handle = d->cubemap;
+ b1.data.texture.handle = d->cubemap;
}
return (ShaderDataLayout) {
- .bindings = { b1, b2},
- .binding_count = 2
+ .bindings = { b1},
+ .binding_count = 1
};
-} \ No newline at end of file
+}
diff --git a/src/ral/backends/opengl/backend_opengl.c b/src/ral/backends/opengl/backend_opengl.c
index f4786b9..cf3a4e5 100644
--- a/src/ral/backends/opengl/backend_opengl.c
+++ b/src/ral/backends/opengl/backend_opengl.c
@@ -340,7 +340,7 @@ PUB void GPU_EncodeBindShaderData(GPU_CmdEncoder* encoder, u32 group, ShaderData
}
glUniform1i(tex_slot, i);
glActiveTexture(GL_TEXTURE0 + i);
- glBindTexture(GL_TEXTURE_2D, tex->id);
+ glBindTexture(GL_TEXTURE_CUBE_MAP, tex->id);
}
}
}
diff --git a/src/systems/terrain.c b/src/systems/terrain.c
index 1d23cc3..8a6b06a 100644
--- a/src/systems/terrain.c
+++ b/src/systems/terrain.c
@@ -11,8 +11,11 @@ struct Terrain_Storage {
GPU_Pipeline* hmap_pipeline;
};
-PUB bool Terrain_Init(Terrain_Storage* storage) { return true; }
-PUB void Terrain_Shutdown(Terrain_Storage* storage);
+bool Terrain_Init(Terrain_Storage* storage) {
+ return true;
+}
+
+void Terrain_Shutdown(Terrain_Storage* storage);
/* bool terrain_system_init(terrain_state* state) { */
/* gpu_renderpass_desc rpass_desc = { */
diff --git a/src/systems/terrain.h b/src/systems/terrain.h
index 890cb90..4e709ed 100644
--- a/src/systems/terrain.h
+++ b/src/systems/terrain.h
@@ -30,10 +30,10 @@ typedef struct Terrain_Storage Terrain_Storage;
// --- Public API
PUB bool Terrain_Init(Terrain_Storage* storage);
PUB void Terrain_Shutdown(Terrain_Storage* storage);
-PUB void Terrain_Run(Terrain_Storage* storage); // NOTE: For now it renders directly to main framebuffer
+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 Heightmap Terrain_LoadHeightmap(Heightmap hmap, bool free_on_upload);
+PUB void Terrain_LoadHeightmap(Heightmap hmap, bool free_on_upload);
PUB Heightmap Heightmap_FromImage(Str8 filepath);
PUB Heightmap Heightmap_FromPerlin(/* TODO: perlin noise generation parameters */);