mirror of
https://github.com/ClassiCube/ClassiCube.git
synced 2025-01-23 17:43:08 -05:00
Declare notchygen as C exported funcs
This commit is contained in:
parent
e4bbe8876f
commit
d6e80fcf37
5 changed files with 34 additions and 31 deletions
|
@ -1,7 +1,7 @@
|
|||
#ifndef CS_BLOCK_H
|
||||
#define CS_BLOCK_H
|
||||
|
||||
// Classic blocks
|
||||
/* Classic blocks */
|
||||
#define Block_Air 0
|
||||
#define Block_Stone 1
|
||||
#define Block_Grass 2
|
||||
|
@ -53,7 +53,7 @@
|
|||
#define Block_MossyRocks 48
|
||||
#define Block_Obsidian 49
|
||||
|
||||
// CPE blocks
|
||||
/* CPE blocks */
|
||||
#define Block_CobblestoneSlab 50
|
||||
#define Block_Rope 51
|
||||
#define Block_Sandstone 52
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#include "Noise.h"
|
||||
|
||||
void ImprovedNoise_Init(UInt8* p, Random* rnd) {
|
||||
// shuffle randomly using fisher-yates
|
||||
/* shuffle randomly using fisher-yates */
|
||||
for (Int32 i = 0; i < 256; i++) {
|
||||
p[i] = (UInt8)i;
|
||||
}
|
||||
|
@ -22,26 +22,26 @@ Real64 ImprovedNoise_Compute(UInt8* p, Real64 x, Real64 y) {
|
|||
Int32 X = xFloor & 0xFF, Y = yFloor & 0xFF;
|
||||
x -= xFloor; y -= yFloor;
|
||||
|
||||
Real64 u = x * x * x * (x * (x * 6 - 15) + 10); // Fade(x)
|
||||
Real64 v = y * y * y * (y * (y * 6 - 15) + 10); // Fade(y)
|
||||
Real64 u = x * x * x * (x * (x * 6 - 15) + 10); /* Fade(x) */
|
||||
Real64 v = y * y * y * (y * (y * 6 - 15) + 10); /* Fade(y) */
|
||||
Int32 A = p[X] + Y, B = p[X + 1] + Y;
|
||||
|
||||
// Normally, calculating Grad involves a function call. However, we can directly pack this table
|
||||
// (since each value indicates either -1, 0 1) into a set of bit flags. This way we avoid needing
|
||||
// to call another function that performs branching
|
||||
/* Normally, calculating Grad involves a function call. However, we can directly pack this table
|
||||
(since each value indicates either -1, 0 1) into a set of bit flags. This way we avoid needing
|
||||
to call another function that performs branching */
|
||||
#define xFlags 0x46552222
|
||||
#define yFlags 0x2222550A
|
||||
|
||||
Int32 hash = (p[p[A]] & 0xF) << 1;
|
||||
Real64 g22 = (((xFlags >> hash) & 3) - 1) * x + (((yFlags >> hash) & 3) - 1) * y; // Grad(p[p[A], x, y)
|
||||
Real64 g22 = (((xFlags >> hash) & 3) - 1) * x + (((yFlags >> hash) & 3) - 1) * y; /* Grad(p[p[A], x, y) */
|
||||
hash = (p[p[B]] & 0xF) << 1;
|
||||
Real64 g12 = (((xFlags >> hash) & 3) - 1) * (x - 1) + (((yFlags >> hash) & 3) - 1) * y; // Grad(p[p[B], x - 1, y)
|
||||
Real64 g12 = (((xFlags >> hash) & 3) - 1) * (x - 1) + (((yFlags >> hash) & 3) - 1) * y; /* Grad(p[p[B], x - 1, y) */
|
||||
Real64 c1 = g22 + u * (g12 - g22);
|
||||
|
||||
hash = (p[p[A + 1]] & 0xF) << 1;
|
||||
Real64 g21 = (((xFlags >> hash) & 3) - 1) * x + (((yFlags >> hash) & 3) - 1) * (y - 1); // Grad(p[p[A + 1], x, y - 1)
|
||||
Real64 g21 = (((xFlags >> hash) & 3) - 1) * x + (((yFlags >> hash) & 3) - 1) * (y - 1); /* Grad(p[p[A + 1], x, y - 1) */
|
||||
hash = (p[p[B + 1]] & 0xF) << 1;
|
||||
Real64 g11 = (((xFlags >> hash) & 3) - 1) * (x - 1) + (((yFlags >> hash) & 3) - 1) * (y - 1); // Grad(p[p[B + 1], x - 1, y - 1)
|
||||
Real64 g11 = (((xFlags >> hash) & 3) - 1) * (x - 1) + (((yFlags >> hash) & 3) - 1) * (y - 1); /* Grad(p[p[B + 1], x - 1, y - 1) */
|
||||
Real64 c2 = g21 + u * (g11 - g21);
|
||||
|
||||
return c1 + v * (c2 - c1);
|
||||
|
|
|
@ -8,6 +8,7 @@ void ImprovedNoise_Init(UInt8* p, Random* rnd);
|
|||
Real64 ImprovedNoise_Compute(UInt8* p, Real64 x, Real64 y);
|
||||
|
||||
|
||||
/* since we need structure to be a fixed size */
|
||||
#define MAX_OCTAVES 8
|
||||
typedef struct {
|
||||
UInt8 p[MAX_OCTAVES][NOISE_TABLE_SIZE];
|
||||
|
|
|
@ -1,15 +1,19 @@
|
|||
// Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3
|
||||
// Based on:
|
||||
// https://github.com/UnknownShadow200/ClassicalSharp/wiki/Minecraft-Classic-map-generation-algorithm
|
||||
// Thanks to Jerralish for originally reverse engineering classic's algorithm, then preparing a high level overview of the algorithm.
|
||||
// I believe this process adheres to clean room reverse engineering.
|
||||
/* Copyright 2014-2017 ClassicalSharp | Licensed under BSD-3 */
|
||||
/* Based on:
|
||||
https://github.com/UnknownShadow200/ClassicalSharp/wiki/Minecraft-Classic-map-generation-algorithm
|
||||
Thanks to Jerralish for originally reverse engineering classic's algorithm, then preparing a high level overview of the algorithm.
|
||||
I believe this process adheres to clean room reverse engineering.*/
|
||||
#include "NotchyGenerator.h"
|
||||
#include "Block.h"
|
||||
#include "Funcs.h"
|
||||
#include "Noise.h"
|
||||
#include "Random.h"
|
||||
|
||||
// External variables
|
||||
/* External variables */
|
||||
/* TODO: how do they even work? */
|
||||
Real32 CurrentProgress;
|
||||
|
||||
// Internal variables
|
||||
/* Internal variables */
|
||||
Int32 Width, Height, Length;
|
||||
Int32 waterLevel, oneY, minHeight;
|
||||
BlockID* Blocks;
|
||||
|
@ -65,7 +69,7 @@ void NotchyGen_CreateStrata() {
|
|||
OctaveNoise_Init(&n, &rnd, 8);
|
||||
//CurrentState = "Creating strata";
|
||||
Int32 hMapIndex = 0, maxY = Height - 1, mapIndex = 0;
|
||||
// Try to bulk fill bottom of the map if possible
|
||||
/* Try to bulk fill bottom of the map if possible */
|
||||
Int32 minStoneY = NotchyGen_CreateStrataFast();
|
||||
|
||||
for (Int32 z = 0; z < Length; z++) {
|
||||
|
@ -93,7 +97,7 @@ void NotchyGen_CreateStrata() {
|
|||
}
|
||||
|
||||
Int32 NotchyGen_CreateStrataFast() {
|
||||
// Make lava layer at bottom
|
||||
/* Make lava layer at bottom */
|
||||
Int32 mapIndex = 0;
|
||||
for (Int32 z = 0; z < Length; z++)
|
||||
for (int x = 0; x < Width; x++)
|
||||
|
@ -101,11 +105,11 @@ Int32 NotchyGen_CreateStrataFast() {
|
|||
Blocks[mapIndex++] = Block_Lava;
|
||||
}
|
||||
|
||||
// Invariant: the lowest value dirtThickness can possible be is -14
|
||||
/* Invariant: the lowest value dirtThickness can possible be is -14 */
|
||||
Int32 stoneHeight = minHeight - 14;
|
||||
if (stoneHeight <= 0) return 1; // no layer is fully stone
|
||||
if (stoneHeight <= 0) return 1; /* no layer is fully stone */
|
||||
|
||||
// We can quickly fill in bottom solid layers
|
||||
/* We can quickly fill in bottom solid layers */
|
||||
for (Int32 y = 1; y <= stoneHeight; y++)
|
||||
for (Int32 z = 0; z < Length; z++)
|
||||
for (Int32 x = 0; x < Width; x++)
|
||||
|
|
|
@ -1,14 +1,12 @@
|
|||
#ifndef CS_NOTCHY_GEN_H
|
||||
#define CS_NOTCHY_GEN_H
|
||||
#include "Compiler.h"
|
||||
#include "Typedefs.h"
|
||||
#include "Noise.h"
|
||||
#include "Funcs.h"
|
||||
#include "Block.h"
|
||||
|
||||
void NotchyGen_Init(Int32 width, Int32 height, Int32 length,
|
||||
Int32 seed, BlockID* blocks, Int16* heightmap);
|
||||
CLIENT_API void NotchyGen_Init(Int32 width, Int32 height, Int32 length,
|
||||
Int32 seed, BlockID* blocks, Int16* heightmap);
|
||||
|
||||
void NotchyGen_CreateHeightmap();
|
||||
void NotchyGen_CreateStrata();
|
||||
CLIENT_API void NotchyGen_CreateHeightmap();
|
||||
CLIENT_API void NotchyGen_CreateStrata();
|
||||
Int32 NotchyGen_CreateStrataFast();
|
||||
#endif
|
Loading…
Add table
Reference in a new issue