Ejemplo n.º 1
0
void make_world(Map *map, int p, int q) {
    int pad = 1;
    for (int dx = -pad; dx < CHUNK_SIZE + pad; dx++) {
        for (int dz = -pad; dz < CHUNK_SIZE + pad; dz++) {
            int x = p * CHUNK_SIZE + dx;
            int z = q * CHUNK_SIZE + dz;
            float f = simplex2(x * 0.01, z * 0.01, 4, 0.5, 2);
            float g = simplex2(-x * 0.01, -z * 0.01, 2, 0.9, 2);
            int mh = g * 32 + 16;
            int h = f * mh;
            int w = 1;
            int t = 12;
            if (h <= t) {
                h = t;
                w = 2;
            }
            if (dx < 0 || dz < 0 || dx >= CHUNK_SIZE || dz >= CHUNK_SIZE) {
                w = -1;
            }
            for (int y = 0; y < h; y++) {
                map_set(map, x, y, z, w);
            }
        }
    }
    db_update_chunk(map, p, q);
}
Ejemplo n.º 2
0
/*
 * maximize c^T x subject to Ax <= b and x >= 0
 */
void (simplex)(unsigned int D, unsigned int N, float x[N], const float c[N], const float b[D], const float A[D][N])
{
	// 1. Step: slack variables
	// max c^T x      Ax + z = b    x,z >= 0

	float A2[D + 1][N + D + 1];

	for (unsigned int i = 0; i < N + D + 1; i++) {

		A2[0][i] = (i < N) ? -c[i] : 0.;

		for (unsigned int j = 0; j < D; j++) {

			if (i < N) 
				A2[1 + j][i] = A[j][i];
			else if (i == N + D)
				A2[1 + j][i] = b[j];
			else
				A2[1 + j][i] = (i - N == j) ? 1. : 0.;
		}
	}

	simplex2(D, N + D, A2);

	// extract results:
	float x2[D + N];
	solution(D, D + N, x2, A2);

	for (unsigned int i = 0; i < N; i++)
		x[i] = x2[i];
}
Ejemplo n.º 3
0
void make_world(Map *map, int p, int q) {
    int pad = 1;
    for (int dx = -pad; dx < CHUNK_SIZE + pad; dx++) {
        for (int dz = -pad; dz < CHUNK_SIZE + pad; dz++) {
            int x = p * CHUNK_SIZE + dx;
            int z = q * CHUNK_SIZE + dz;
            float f = simplex2(x * 0.01, z * 0.01, 4, 0.5, 2);
            float g = simplex2(-x * 0.01, -z * 0.01, 2, 0.9, 2);
            int mh = g * 32 + 16;
            int h = f * mh;
            int w = 1;
            int t = 12;
            if (h <= t) {
                h = t;
                w = 2;
            }
            if (dx < 0 || dz < 0 || dx >= CHUNK_SIZE || dz >= CHUNK_SIZE) {
                w = -1;
            }
            for (int y = 0; y < h; y++) {
                map_set(map, x, y, z, w);
            }
            if (w == 1) {
                if (simplex2(-x * 0.1, z * 0.1, 4, 0.8, 2) > 0.6) {
                    map_set(map, x, h, z, 17);
                }
                if (simplex2(x * 0.05, -z * 0.05, 4, 0.8, 2) > 0.7) {
                    int w = 18 + simplex2(x * 0.1, z * 0.1, 4, 0.8, 2) * 7;
                    map_set(map, x, h, z, w);
                }
            }
            for (int y = 64; y < 72; y++) {
                if (simplex3(x * 0.01, y * 0.1, z * 0.01, 8, 0.5, 2) > 0.75) {
                    map_set(map, x, y, z, 16);
                }
            }
        }
    }
}
Ejemplo n.º 4
0
void create_world1(int p, int q, world_func func, void *arg) {
    for (int dx = -CHUNK_PAD; dx < CHUNK_SIZE + CHUNK_PAD; dx++) {
        for (int dz = -CHUNK_PAD; dz < CHUNK_SIZE + CHUNK_PAD; dz++) {
            int flag = 1;
            if (dx < 0 || dz < 0 || dx >= CHUNK_SIZE || dz >= CHUNK_SIZE) {
                flag = -1;
            }
            int x = p * CHUNK_SIZE + dx;
            int z = q * CHUNK_SIZE + dz;
            float f = simplex2(x * 0.01, z * 0.01, 4, 0.5, 2);
            float g = simplex2(-x * 0.01, -z * 0.01, 2, 0.9, 2);
            int mh = g * 32 + 16;
            int h = f * mh;
            unsigned int material = M_GRASS;
            int t = 12;
            if (h <= t) {
                h = t;
                material = M_SAND;
            }
            int w = (W){.shape=flag*S_CUBE, .material=material, .color=0}.value;
            // sand and grass terrain
            for (int y = 0; y < h; y++) {
                func(x, y, z, w, arg);
            }
            if (material == M_GRASS) {
                if (SHOW_PLANTS) {
                    // grass
                    if (simplex2(-x * 0.1, z * 0.1, 4, 0.8, 2) > 0.6) {
                        func(x, h, z, (W){.shape=flag*S_PLANT, 
                                .material=M_PLANT_GRASS, .color=0, .action=0}.value,
                            arg);
                    }
                    // flowers
                    if (simplex2(x * 0.05, -z * 0.05, 4, 0.8, 2) > 0.7) {
                        func(x, h, z, (W){.shape=flag*S_PLANT, 
                            .material=(M_RED_FLOWER
                                + M_FLOWER_COUNT * simplex2(x * 0.1, z * 0.1, 4, 0.8, 2)), 
                            .color=0, .action=0}.value, arg);
                    }
Ejemplo n.º 5
0
void biome1(int x, int z, int flag, world_func func, void *arg) {
    int lo = simplex2(x * 0.01, z * 0.01, 4, 0.5, 2) * 8 + 8;
    int hi = simplex2(-x * 0.01, -z * 0.01, 4, 0.5, 2) * 32 + 32;
    int lookup[] = {3, 6, 11, 12, 13};
    for (int y = 0; y < lo; y++) {
        func(x, y, z, 6 * flag, arg);
    }
    for (int y = lo; y < hi; y++) {
        int i = simplex3(-x * 0.01, -y * 0.01, -z * 0.01, 4, 0.5, 2) * 10;
        int w = lookup[i % 5];
        if (simplex3(x * 0.01, y * 0.01, z * 0.01, 4, 0.5, 2) > 0.5) {
            func(x, y, z, w * flag, arg);
        }
    }
    if (SHOW_CLOUDS) {
        for (int y = 64; y < 72; y++) {
            if (simplex3(
                x * 0.01, y * 0.1, z * 0.01, 8, 0.5, 2) > 0.75)
            {
                func(x, y, z, 16 * flag, arg);
            }
        }
    }
}
Ejemplo n.º 6
0
void create_world2(int p, int q, world_func func, void *arg) {
    int pad = 1;
    for (int dx = -pad; dx < CHUNK_SIZE + pad; dx++) {
        for (int dz = -pad; dz < CHUNK_SIZE + pad; dz++) {
            int flag = 1;
            if (dx < 0 || dz < 0 || dx >= CHUNK_SIZE || dz >= CHUNK_SIZE) {
                flag = -1;
            }
            int x = p * CHUNK_SIZE + dx;
            int z = q * CHUNK_SIZE + dz;
            int i = simplex2(-x * 0.001, -z * 0.001, 8, 0.5, 2) * 2;
            if (i == 0) biome0(x, z, flag, func, arg);
            else biome1(x, z, flag, func, arg);
        }
    }
}
Ejemplo n.º 7
0
void make_world(Map *map, int p, int q) {
    int pad = 1;
    for (int dx = -pad; dx < CHUNK_SIZE + pad; dx++) {
        for (int dz = -pad; dz < CHUNK_SIZE + pad; dz++) {
            int x = p * CHUNK_SIZE + dx;
            int z = q * CHUNK_SIZE + dz;
            float f = simplex2(x * 0.01, z * 0.01, 4, 0.5, 2);
            float g = simplex2(-x * 0.01, -z * 0.01, 2, 0.9, 2);
            int mh = g * 32 + 16;
            int h = f * mh;
            int w = 1;
            int t = 12;
            if (h <= t) {
                h = t;
                w = 2;
            }
            if (dx < 0 || dz < 0 || dx >= CHUNK_SIZE || dz >= CHUNK_SIZE) {
                w = -1;
            }
            // sand and grass terrain
            for (int y = 0; y < h; y++) {
                map_set(map, x, y, z, w);
            }
            // TODO: w = -1 if outside of chunk
            if (w == 1) {
                // grass
                if (simplex2(-x * 0.1, z * 0.1, 4, 0.8, 2) > 0.6) {
                    map_set(map, x, h, z, 17);
                }
                // flowers
                if (simplex2(x * 0.05, -z * 0.05, 4, 0.8, 2) > 0.7) {
                    int w = 18 + simplex2(x * 0.1, z * 0.1, 4, 0.8, 2) * 7;
                    map_set(map, x, h, z, w);
                }
                // trees
                int ok = 1;
                if (dx - 4 < 0 || dz - 4 < 0 ||
                    dx + 4 >= CHUNK_SIZE || dz + 4 >= CHUNK_SIZE)
                {
                    ok = 0;
                }
                if (ok && simplex2(x, z, 6, 0.5, 2) > 0.84) {
                    for (int y = h + 3; y < h + 8; y++) {
                        for (int ox = -3; ox <= 3; ox++) {
                            for (int oz = -3; oz <= 3; oz++) {
                                int d = (ox * ox) + (oz * oz) +
                                    (y - (h + 4)) * (y - (h + 4));
                                if (d < 11) {
                                    map_set(map, x + ox, y, z + oz, 15);
                                }
                            }
                        }
                    }
                    for (int y = h; y < h + 7; y++) {
                        map_set(map, x, y, z, 5);
                    }
                }
            }
            // clouds
            for (int y = 64; y < 72; y++) {
                if (simplex3(x * 0.01, y * 0.1, z * 0.01, 8, 0.5, 2) > 0.75) {
                    map_set(map, x, y, z, 16);
                }
            }
        }
    }
}
Ejemplo n.º 8
0
void biome0(int x, int z, int flag, world_func func, void *arg) {
    float f = simplex2(x * 0.01, z * 0.01, 4, 0.5, 2);
    float g = simplex2(-x * 0.01, -z * 0.01, 2, 0.9, 2);
    int mh = g * 32 + 16;
    int h = f * mh;
    int w = 1;
    int t = 12;
    if (h <= t) {
        h = t;
        w = 2;
    }
    // sand and grass terrain
    for (int y = 0; y < h; y++) {
        func(x, y, z, w * flag, arg);
    }
    if (w == 1) {
        if (SHOW_PLANTS) {
            // grass
            if (simplex2(-x * 0.1, z * 0.1, 4, 0.8, 2) > 0.6) {
                func(x, h, z, 17 * flag, arg);
            }
            // flowers
            if (simplex2(x * 0.05, -z * 0.05, 4, 0.8, 2) > 0.7) {
                int w = 18 + simplex2(x * 0.1, z * 0.1, 4, 0.8, 2) * 7;
                func(x, h, z, w * flag, arg);
            }
        }
        // trees
        int ok = 0;//SHOW_TREES;
        // if (dx - 4 < 0 || dz - 4 < 0 ||
        //     dx + 4 >= CHUNK_SIZE || dz + 4 >= CHUNK_SIZE)
        // {
        //     ok = 0;
        // }
        if (ok && simplex2(x, z, 6, 0.5, 2) > 0.84) {
            for (int y = h + 3; y < h + 8; y++) {
                for (int ox = -3; ox <= 3; ox++) {
                    for (int oz = -3; oz <= 3; oz++) {
                        int d = (ox * ox) + (oz * oz) +
                            (y - (h + 4)) * (y - (h + 4));
                        if (d < 11) {
                            func(x + ox, y, z + oz, 15, arg);
                        }
                    }
                }
            }
            for (int y = h; y < h + 7; y++) {
                func(x, y, z, 5, arg);
            }
        }
    }
    // clouds
    if (SHOW_CLOUDS) {
        for (int y = 64; y < 72; y++) {
            if (simplex3(
                x * 0.01, y * 0.1, z * 0.01, 8, 0.5, 2) > 0.75)
            {
                func(x, y, z, 16 * flag, arg);
            }
        }
    }
}