summaryrefslogtreecommitdiff
path: root/src/chunk.h
blob: d49ba80372aed6a08fbcac8ba3a62362665ac6d8 (plain) (blame)
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
#pragma once
#include "block.h"
#include "texture.h"
#include "world.h"
#include <stdint.h>
#define CHUNK_WIDTH 16
#define CHUNK_LENGTH 16
#define CHUNK_HEIGHT 128

enum biome {
    JUNK_BIOME_PLAINS,
};


//NOTE: Forward declare world here. There is a circular dependency between 
// chunk and world, and the order in which compiler sees them causes issues.
// World.c compiles -> includes world.h -> first line is include chunk.h -> struct world
// is used here, which messes it up. Forward declare to avoid errors
struct world;
struct chunk {
    struct block* blocks[CHUNK_WIDTH][CHUNK_LENGTH][CHUNK_HEIGHT];
    enum biome biome;
    vec2 coord;
    int loaded;
};

/**
 * Generate a chunk at coords for the given world. Memory allocation for chunk is
 * handled by the function.
 *
 */
int chunk_gen(struct world* wld, vec2 coord, struct chunk** chunk);
/**
 * Load a chunk to the given coordinates. Essentially, a chunk only knows of
 * it's local coordinate system. We want to load this particular chunk to a
 * location in WORLD coordinates, which is what coord is. This vec2 will be
 * used to translate the blocks that constitute the chunk
 * @param chunk Chunk to load
 * @param coord coordinates in world space
 */
void chunk_load(struct chunk* chunk, int coord[2]);
/**
 * Unload a chunk. Delete block GPU and memory data, not the chunk data itself
 *
 * @param chunk Chunk to load
 */
void chunk_unload(struct chunk* chunk);
/*
 * Similar to block_draw, this dispatches calls to OpenGL to draw the chunk.
 * Technically this wraps block_draw, so block_draw is the one doing all the work
 * @param chunk Chunk to draw
 * @param shader Shader to pass to block_draw
 * @param texture Textures that block_draw will use
 */
void chunk_draw(struct chunk* chunk, struct shader* shader, struct texture* texture);