]> git.lizzy.rs Git - dragonblocks_alpha.git/commitdiff
Calculate grass color client side
authorElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 19 Aug 2021 01:12:15 +0000 (03:12 +0200)
committerElias Fleckenstein <eliasfleckenstein@web.de>
Thu, 19 Aug 2021 01:12:15 +0000 (03:12 +0200)
13 files changed:
src/CMakeLists.txt
src/biome.c [new file with mode: 0644]
src/biome.h [new file with mode: 0644]
src/client/blockmesh.c
src/client/client_node.c
src/client/client_node.h
src/map.c
src/map.h
src/node.c
src/node.h
src/server/mapgen.c
src/types.c
src/types.h

index 648ef3a2a450fc92bf63a0d96b7b23b5e22e3fbf..2c38e7408a58c2b2491bd0a07ec4f160308daa65 100644 (file)
@@ -29,6 +29,7 @@ add_compile_options(-Wall -Wextra -Wpedantic -Werror)
 
 set(SOURCES_COMMON
        array.c
+       biome.c
        bintree.c
        list.c
        map.c
diff --git a/src/biome.c b/src/biome.c
new file mode 100644 (file)
index 0000000..f17ad0e
--- /dev/null
@@ -0,0 +1,9 @@
+#include "biome.h"
+#include "perlin.h"
+
+int seed = 0;
+
+f64 get_wetness(v3s32 pos)
+{
+       return smooth2d((((u32) 1 << 31) + pos.x) / 128.0, (((u32) 1 << 31) + pos.z) / 128.0, 0, 3) * 0.5 + 0.5;
+}
diff --git a/src/biome.h b/src/biome.h
new file mode 100644 (file)
index 0000000..1529f59
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef _BIOME_H_
+#define _BIOME_H_
+
+#include "types.h"
+
+typedef enum
+{
+       SO_HEIGHT,
+       SO_MOUNTAIN_FACTOR,
+       SO_MOUNTAIN_HEIGHT,
+       SO_BOULDER_CENTER,
+       SO_BOULDER,
+       SO_WETNESS,
+} SeedOffset;
+
+f64 get_wetness(v3s32 pos);
+
+extern int seed;
+
+#endif
index 3ee7422a3a1d39514955b0a787ae164841dee36e..2bb0fa4e84e677871347f23ce72514666e7dd23a 100644 (file)
@@ -14,6 +14,8 @@ static v3s8 fdir[6] = {
 
 static void make_vertices(Object *object, MapBlock *block)
 {
+       v3s32 node_bp = {block->pos.x * MAPBLOCK_SIZE, block->pos.y * MAPBLOCK_SIZE, block->pos.z * MAPBLOCK_SIZE};
+
        ITERATE_MAPBLOCK {
                MapNode *node = &block->data[x][y][z];
 
@@ -35,7 +37,7 @@ static void make_vertices(Object *object, MapBlock *block)
                                if (npos.x >= 0 && npos.x < MAPBLOCK_SIZE && npos.y >= 0 && npos.y < MAPBLOCK_SIZE && npos.z >= 0 && npos.z < MAPBLOCK_SIZE)
                                        neighbor = block->data[npos.x][npos.y][npos.z].type;
                                else {
-                                       MapNode nn = map_get_node(client_map.map, (v3s32) {npos.x + block->pos.x * MAPBLOCK_SIZE, npos.y + block->pos.y * MAPBLOCK_SIZE, npos.z + block->pos.z * MAPBLOCK_SIZE});
+                                       MapNode nn = map_get_node(client_map.map, (v3s32) {npos.x + node_bp.x, npos.y + node_bp.y, npos.z + node_bp.z});
                                        neighbor = nn.type;
                                }
 
@@ -47,7 +49,7 @@ static void make_vertices(Object *object, MapBlock *block)
                                                vertex.position.z += offset.z;
 
                                                if (client_def->render)
-                                                       client_def->render(node, &vertex);
+                                                       client_def->render((v3s32) {x + node_bp.x, y + node_bp.y, z + node_bp.z}, node, &vertex);
 
                                                object_add_vertex(object, &vertex);
                                        }
index 739e7c61319e23e1040d0d6280e61895f13d598d..75b740cb52a0763c770c3e98be5b00302bc8d3d1 100644 (file)
@@ -1,12 +1,17 @@
+#include "biome.h"
 #include "client/client.h"
 #include "client/client_node.h"
 #include "node.h"
 
-static void render_state_biome(MapNode *node, Vertex3D *vertex)
+static void render_state_biome(v3s32 pos, __attribute__((unused)) MapNode *node, Vertex3D *vertex)
 {
-       vertex->color.h = node->state.biome.x;
-       vertex->color.s = node->state.biome.y;
-       vertex->color.v = node->state.biome.z;
+       double min, max;
+       min = 0.15;
+       max = 0.45;
+
+       vertex->color.h = get_wetness(pos) * (max - min) + min;
+       vertex->color.s = 1.0f;
+       vertex->color.v = 1.0f;
 }
 
 ClientNodeDefintion client_node_definitions[NODE_UNLOADED] = {
index 0ab64c91da960635fc8873bcdf7dcbdab8be9326..4044ef1e97d247848a95cdf326464a7091ddc443 100644 (file)
@@ -9,7 +9,7 @@ typedef struct
 {
        char *texture_path;
        Texture *texture;
-       void (*render)(MapNode *node, Vertex3D *vertex);
+       void (*render)(v3s32 pos, MapNode *node, Vertex3D *vertex);
 } ClientNodeDefintion;
 
 extern ClientNodeDefintion client_node_definitions[];
index 8bd7268e3ed3c247600e60e8320e154fd2fa19f7..87a9b3fa7079b785767c13aed13505757fff15fc 100644 (file)
--- a/src/map.c
+++ b/src/map.c
@@ -229,7 +229,6 @@ MapNode map_node_create(Node type)
 {
        MapNode node;
        node.type = type;
-       memset(&node.state, 0, sizeof(NodeState));
 
        if (node.type != NODE_UNLOADED && node_definitions[node.type].create)
                node_definitions[node.type].create(&node);
index e7b4ad10d6da8751dbb60013f16ff53dbed621dd..c60293fd1a78320323ba42f00836966d9723218e 100644 (file)
--- a/src/map.h
+++ b/src/map.h
@@ -14,7 +14,6 @@
 typedef struct MapNode
 {
        Node type;
-       NodeState state;
 } MapNode;
 
 typedef MapNode MapBlockData[MAPBLOCK_SIZE][MAPBLOCK_SIZE][MAPBLOCK_SIZE];
index 7bdc8b4035d2d872a3f7ae44618e61f27862cc44..5ea8bb4a948b630dd9591d9c97c65e03aef5b5e1 100644 (file)
@@ -2,11 +2,6 @@
 #include "node.h"
 #include "util.h"
 
-static void create_state_biome(MapNode *node)
-{
-       node->state.biome = (v3f32) {1.0f, 0.0f, 1.0f};
-}
-
 NodeDefintion node_definitions[NODE_UNLOADED] = {
        // invalid
        {
@@ -28,8 +23,8 @@ NodeDefintion node_definitions[NODE_UNLOADED] = {
        {
                .visible = true,
                .solid = true,
-               .create = &create_state_biome,
-               .serialize = NULL, // currently v3f is not serialized
+               .create = NULL,
+               .serialize = NULL,
                .deserialize = NULL,
        },
        // dirt
index e9f67ed4cf75ef1f56bfc022e0b4b2d2f51f85e6..04176a394954cbac8bc81dddd0959a4d8b7815f0 100644 (file)
@@ -4,13 +4,6 @@
 #include <stdbool.h>
 #include "types.h"
 
-typedef v3f32 NodeStateBiome;
-
-typedef union
-{
-       NodeStateBiome biome;
-} NodeState;
-
 typedef enum
 {
        NODE_INVALID,           // Used for unknown nodes received from server (caused by outdated clients)
index 9cf384b9c54b8ec09f69e9f410abec90c7417d4a..9b14b9b17cebfeb2a75d64102cb8c73846646e0c 100644 (file)
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <math.h>
+#include "biome.h"
 #include "perlin.h"
 #include "server/mapgen.h"
 #include "server/server_map.h"
@@ -24,13 +25,13 @@ void mapgen_generate_block(MapBlock *block, List *changed_blocks)
                u32 ux = x + block->pos.x * MAPBLOCK_SIZE + ((u32) 1 << 31);
                for (u8 z = 0; z < MAPBLOCK_SIZE; z++) {
                        u32 uz = z + block->pos.z * MAPBLOCK_SIZE + ((u32) 1 << 31);
-                       s32 height = smooth2d(ux / 32.0, uz / 32.0, 0, 0) * 16.0 + 128.0;
+                       s32 height = smooth2d(ux / 32.0, uz / 32.0, 0, seed + SO_HEIGHT) * 16.0 + 128.0;
                        bool is_mountain = false;
 
-                       double mountain_factor = (smooth2d(ux / 1000.0, uz / 1000.0, 0, 1) - 0.3) * 5.0;
+                       double mountain_factor = (smooth2d(ux / 1000.0, uz / 1000.0, 0, seed + SO_MOUNTAIN_FACTOR) - 0.3) * 5.0;
 
                        if (mountain_factor > 0.0) {
-                               height = pow(height * pow(((smooth2d(ux / 50.0, uz / 50.0, 2, 2) + 1.0) * 256.0 + 128.0), mountain_factor), 1.0 / (mountain_factor + 1.0));
+                               height = pow(height * pow(((smooth2d(ux / 50.0, uz / 50.0, 2, seed + SO_MOUNTAIN_HEIGHT) + 1.0) * 256.0 + 128.0), mountain_factor), 1.0 / (mountain_factor + 1.0));
                                is_mountain = true;
                        }
 
@@ -49,12 +50,12 @@ void mapgen_generate_block(MapBlock *block, List *changed_blocks)
                                else if (diff < 1)
                                        node = (is_mountain && ay > 256) ? NODE_SNOW : NODE_AIR;
 
-                               if (! is_mountain && diff == 0 && (smooth2d(x + block->pos.x * 16, z + block->pos.z * 16, 0, 3) * 0.5 + 0.5) < 0.0001f) {
+                               if (! is_mountain && diff == 0 && (smooth2d(x + block->pos.x * 16, z + block->pos.z * 16, 0, seed + SO_BOULDER_CENTER) * 0.5 + 0.5) < 0.0001f) {
                                        for (s8 bx = -1; bx <= 1; bx++) {
                                                for (s8 by = -1; by <= 1; by++) {
                                                        for (s8 bz = -1; bz <= 1; bz++) {
                                                                v3s32 pos = {block->pos.x * MAPBLOCK_SIZE + x + bx, block->pos.y * MAPBLOCK_SIZE + y + by, block->pos.z * MAPBLOCK_SIZE + z + bz};
-                                                               if (smooth3d(pos.x, pos.y, pos.z, 0, 4) > 0.0)
+                                                               if (smooth3d(pos.x, pos.y, pos.z, 0, seed + SO_BOULDER) > 0.0)
                                                                        set_node(pos, map_node_create(NODE_STONE), MGS_BOULDERS, changed_blocks);
                                                        }
                                                }
@@ -65,14 +66,6 @@ void mapgen_generate_block(MapBlock *block, List *changed_blocks)
                                if (extra->mgs_buffer[x][y][z] <= MGS_TERRAIN) {
                                        block->data[x][y][z] = map_node_create(node);
                                        extra->mgs_buffer[x][y][z] = MGS_TERRAIN;
-
-                                       if (node == NODE_GRASS) {
-                                               double min, max;
-                                               min = 0.15;
-                                               max = 0.45;
-                                               block->data[x][y][z].state.biome.x = (smooth2d(ux / 128.0, uz / 128.0, 0, 3) * 0.5 + 0.5) * (max - min) + min;
-                                               block->data[x][y][z].state.biome.y = 1.0;
-                                       }
                                }
                                pthread_mutex_unlock(&block->mtx);
                        }
index 10685f0821a71b55226631c8d84f5c002587cd2a..4a79da417996d710b0abd2a871d7cd4abf1e90d9 100644 (file)
@@ -52,6 +52,10 @@ bool read_full(int fd, char *buffer, size_t size)
        { \
                return a.x == b.x && a.y == b.y; \
        } \
+       v2 ## type v2 ## type ## _add(v2 ## type a, v2 ## type b) \
+       { \
+               return (v2 ## type) {a.x + b.x, a.y + b.y}; \
+       } \
        bool read_v3 ## type(int fd, v3 ## type *ptr) \
        { \
                READVEC(type, 3) \
@@ -68,6 +72,10 @@ bool read_full(int fd, char *buffer, size_t size)
        bool v3 ## type ## _equals(v3 ## type a, v3 ## type b) \
        { \
                return a.x == b.x && a.y == b.y && a.z == b.z; \
+       } \
+       v3 ## type v3 ## type ## _add(v3 ## type a, v3 ## type b) \
+       { \
+               return (v3 ## type) {a.x + b.x, a.y + b.y, a.z + b.z}; \
        }
 
 #define DEFTYP(type, bits) \
index 52b8f348a293d5131ffec4518bb7889dacd530dd..025e661f72ff3d833d50cbdfe034d8c28b6afadc 100644 (file)
@@ -19,10 +19,12 @@ bool read_full(int fd, char *buffer, size_t size);
        DEFRW(v2 ## type) \
        DEFBOX(2 ## type) \
        bool v2 ## type ## _equals(v2 ## type a, v2 ## type b); \
+       v2 ## type v2 ## type ## _add(v2 ## type a, v2 ## type b); \
        typedef struct {type x, y, z;} v3 ## type; \
        DEFRW(v3 ## type) \
        DEFBOX(3 ## type) \
        bool v3 ## type ## _equals(v3 ## type a, v3 ## type b); \
+       v3 ## type v3 ## type ## _add(v3 ## type a, v3 ## type b);
 
 #define DEFTYP(from, to) \
        typedef from to; \