1 #include "client/client.h"
2 #include "client/client_node.h"
3 #include "environment.h"
7 #define TILES_SIMPLE(path) {.paths = {path, NULL, NULL, NULL, NULL, NULL}, .indices = {0, 0, 0, 0, 0, 0}, .textures = {NULL}}
8 #define TILES_NONE {.paths = {NULL}, .indices = {0}, .textures = {NULL}}
10 static f32 hue_to_rgb(f32 p, f32 q, f32 t)
19 return p + (q - p) * 6.0f * t;
25 return p + (q - p) * (2.0f / 3.0f - t) * 6.0f;
30 static Vertex3DColor hsl_to_rgb(v3f32 hsl)
35 rgb = (Vertex3DColor) {hsl.z, hsl.z, hsl.z};
37 f32 q = hsl.z < 0.5f ? hsl.z * (1.0f + hsl.y) : hsl.z + hsl.y - hsl.z * hsl.y;
38 f32 p = 2.0f * hsl.z - q;
40 rgb.r = hue_to_rgb(p, q, hsl.x + 1.0f / 3.0f);
41 rgb.g = hue_to_rgb(p, q, hsl.x);
42 rgb.b = hue_to_rgb(p, q, hsl.x - 1.0f / 3.0f);
48 static void render_grass(v3s32 pos, unused MapNode *node, Vertex3D *vertex, unused int f, unused int v)
50 f32 hum_min, hum_max, temp_max;
55 f32 temp_f = clamp(0.3f - get_temperature(pos), 0.0f, 0.3f) / 0.3f;
57 vertex->color = hsl_to_rgb((v3f32) {(get_humidity(pos) * (hum_max - hum_min) + hum_min) * (1.0f - temp_f) + temp_max * temp_f, 1.0f, 0.5f});
60 static void render_stone(v3s32 pos, unused MapNode *node, Vertex3D *vertex, unused int f, unused int v)
62 vertex->textureCoordinates.s += noise2d(pos.x, pos.z, 0, seed + SO_TEXTURE_OFFSET_S);
63 vertex->textureCoordinates.t += noise2d(pos.x, pos.z, 0, seed + SO_TEXTURE_OFFSET_T);
66 static void render_hsl(unused v3s32 pos, MapNode *node, Vertex3D *vertex, unused int f, unused int v)
68 vertex->color = hsl_to_rgb(((HSLData *) node->data)->color);
71 ClientNodeDefinition client_node_definitions[NODE_UNLOADED] = {
74 .tiles = TILES_SIMPLE(RESSOURCEPATH "textures/unknown.png"),
75 .visibility = NV_SOLID,
82 .visibility = NV_NONE,
88 .tiles = TILES_SIMPLE(RESSOURCEPATH "textures/grass.png"),
89 .visibility = NV_SOLID,
91 .render = &render_grass,
95 .tiles = TILES_SIMPLE(RESSOURCEPATH "textures/dirt.png"),
96 .visibility = NV_SOLID,
102 .tiles = TILES_SIMPLE(RESSOURCEPATH "textures/stone.png"),
103 .visibility = NV_SOLID,
105 .render = &render_stone,
109 .tiles = TILES_SIMPLE(RESSOURCEPATH "textures/snow.png"),
110 .visibility = NV_SOLID,
117 .paths = {RESSOURCEPATH "textures/oak_wood.png", RESSOURCEPATH "textures/oak_wood_top.png", NULL, NULL, NULL, NULL},
118 .indices = {0, 0, 0, 0, 1, 1},
121 .visibility = NV_SOLID,
123 .render = &render_hsl,
127 .tiles = TILES_SIMPLE(RESSOURCEPATH "textures/oak_leaves.png"),
128 .visibility = NV_SOLID,
130 .render = &render_hsl,
135 .paths = {RESSOURCEPATH "textures/pine_wood.png", RESSOURCEPATH "textures/pine_wood_top.png", NULL, NULL, NULL, NULL},
136 .indices = {0, 0, 0, 0, 1, 1},
139 .visibility = NV_SOLID,
141 .render = &render_hsl,
145 .tiles = TILES_SIMPLE(RESSOURCEPATH "textures/pine_leaves.png"),
146 .visibility = NV_CLIP,
148 .render = &render_hsl,
153 .paths = {RESSOURCEPATH "textures/palm_wood.png", RESSOURCEPATH "textures/palm_wood_top.png", NULL, NULL, NULL, NULL},
154 .indices = {0, 0, 0, 0, 1, 1},
157 .visibility = NV_SOLID,
159 .render = &render_hsl,
163 .tiles = TILES_SIMPLE(RESSOURCEPATH "textures/palm_leaves.png"),
164 .visibility = NV_SOLID,
166 .render = &render_hsl,
170 .tiles = TILES_SIMPLE(RESSOURCEPATH "textures/sand.png"),
171 .visibility = NV_SOLID,
177 .tiles = TILES_SIMPLE(RESSOURCEPATH "textures/water.png"),
178 .visibility = NV_BLEND,
184 .tiles = TILES_SIMPLE(RESSOURCEPATH "textures/lava.png"),
185 .visibility = NV_BLEND,
191 .tiles = TILES_SIMPLE(RESSOURCEPATH "textures/vulcano_stone.png"),
192 .visibility = NV_SOLID,
198 void client_node_init()
200 for (Node node = NODE_UNKNOWN; node < NODE_UNLOADED; node++) {
201 ClientNodeDefinition *def = &client_node_definitions[node];
203 if (def->visibility != NV_NONE) {
204 Texture *textures[6];
206 for (int i = 0; i < 6; i++) {
207 char *path = def->tiles.paths[i];
210 textures[i] = texture_load(path, def->mipmap);
215 for (int i = 0; i < 6; i++)
216 def->tiles.textures[i] = textures[def->tiles.indices[i]];