1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
#include "skybox.h"
#include <assert.h>
#include "glad/glad.h"
#include "ral_common.h"
#include "ral_impl.h"
#include "ral_types.h"
#include "render.h"
#include "render_types.h"
Skybox Skybox_Create(const char** face_paths, int n) {
assert(n == 6); // ! we're only supporting a full cubemap for now
// -- cubemap texture
TextureHandle handle;
GPU_Texture* tex = GPU_TextureAlloc(&handle);
glBindTexture(GL_TEXTURE_CUBE_MAP, tex->id);
int width, height, nrChannels;
// unsigned char *data;
for (unsigned int i = 0; i < n; i++) {
TextureData data = TextureDataLoad(
face_paths[i],
false); // stbi_load(textures_faces[i].c_str(), &width, &height, &nrChannels, 0);
assert(data.description.format == TEXTURE_FORMAT_8_8_8_RGB_UNORM);
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, data.description.extents.x,
data.description.extents.y, 0, GL_RGB, GL_UNSIGNED_BYTE, data.image_data);
}
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
// shader pipeline
VertexDescription pos_only = { .debug_label = "Position only verts" };
VertexDesc_AddAttr(&pos_only, "inPos", ATTR_F32x3);
pos_only.use_full_vertex_size = true;
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,
.vs = {
},
.fs = {
},
.wireframe = false,
.depth_test = true,
};
return (Skybox){
.texture = handle,
};
}
|