mirror of
https://github.com/pmmp/PocketMine-MP.git
synced 2025-09-06 01:46:04 +00:00
First biome based generator iteration
This commit is contained in:
@ -20,10 +20,11 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* Generator classes used in Levels
|
||||
* Noise classes used in Levels
|
||||
*/
|
||||
namespace pocketmine\level\generator;
|
||||
|
||||
use pocketmine\level\generator\noise\Noise;
|
||||
use pocketmine\utils\Random;
|
||||
|
||||
abstract class Generator{
|
||||
@ -57,6 +58,159 @@ abstract class Generator{
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Noise $noise
|
||||
* @param int $xSize
|
||||
* @param int $samplingRate
|
||||
* @param int $x
|
||||
* @param int $y
|
||||
* @param int $z
|
||||
*
|
||||
* @return \SplFixedArray
|
||||
*/
|
||||
public static function getFastNoise1D(Noise $noise, $xSize, $samplingRate, $x, $y, $z){
|
||||
if($samplingRate === 0){
|
||||
throw new \InvalidArgumentException("samplingRate cannot be 0");
|
||||
}
|
||||
if ($xSize % $samplingRate !== 0) {
|
||||
throw new \InvalidArgumentCountException("xSize % samplingRate must return 0");
|
||||
}
|
||||
|
||||
$noiseArray = new \SplFixedArray($xSize + 1);
|
||||
|
||||
for($xx = 0; $xx <= $xSize; $xx += $samplingRate){
|
||||
$noiseArray[$xx] = $noise->noise3D($xx + $x, $y, $z);
|
||||
}
|
||||
|
||||
for($xx = 0; $xx < $xSize; ++$xx){
|
||||
if($xx % $samplingRate !== 0){
|
||||
$nx = (int) ($xx / $samplingRate) * $samplingRate;
|
||||
$noiseArray[$xx] = Noise::linearLerp($xx, $nx, $nx + $samplingRate, $noiseArray[$nx], $noiseArray[$nx + $samplingRate]);
|
||||
}
|
||||
}
|
||||
|
||||
return $noiseArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Noise $noise
|
||||
* @param int $xSize
|
||||
* @param int $zSize
|
||||
* @param int $samplingRate
|
||||
* @param int $x
|
||||
* @param int $y
|
||||
* @param int $z
|
||||
*
|
||||
* @return \SplFixedArray
|
||||
*/
|
||||
public static function getFastNoise2D(Noise $noise, $xSize, $zSize, $samplingRate, $x, $y, $z){
|
||||
if($samplingRate === 0){
|
||||
throw new \InvalidArgumentException("samplingRate cannot be 0");
|
||||
}
|
||||
if ($xSize % $samplingRate !== 0) {
|
||||
throw new \InvalidArgumentCountException("xSize % samplingRate must return 0");
|
||||
}
|
||||
if ($zSize % $samplingRate !== 0) {
|
||||
throw new \InvalidArgumentCountException("zSize % samplingRate must return 0");
|
||||
}
|
||||
|
||||
$noiseArray = new \SplFixedArray($xSize + 1);
|
||||
|
||||
for($xx = 0; $xx <= $xSize; $xx += $samplingRate){
|
||||
$noiseArray[$xx] = new \SplFixedArray($zSize + 1);
|
||||
for($zz = 0; $zz <= $zSize; $zz += $samplingRate){
|
||||
$noiseArray[$xx][$zz] = $noise->noise3D($x + $xx, $y, $z + $zz);
|
||||
}
|
||||
}
|
||||
|
||||
for($xx = 0; $xx < $xSize; ++$xx){
|
||||
if($xx % $samplingRate !== 0){
|
||||
$noiseArray[$xx] = new \SplFixedArray($zSize + 1);
|
||||
}
|
||||
|
||||
for($zz = 0; $zz < $zSize; ++$zz){
|
||||
if($xx % $samplingRate !== 0 or $zz % $samplingRate !== 0){
|
||||
$nx = (int) ($xx / $samplingRate) * $samplingRate;
|
||||
$nz = (int) ($zz / $samplingRate) * $samplingRate;
|
||||
$noiseArray[$xx][$zz] = Noise::bilinearLerp(
|
||||
$xx, $zz, $noiseArray[$nx][$nz], $noiseArray[$nx][$nz + $samplingRate],
|
||||
$noiseArray[$nx + $samplingRate][$nz], $noiseArray[$nx + $samplingRate][$nz + $samplingRate],
|
||||
$nx, $nx + $samplingRate, $nz, $nz + $samplingRate
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $noiseArray;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Noise $noise
|
||||
* @param int $xSize
|
||||
* @param int $ySize
|
||||
* @param int $zSize
|
||||
* @param int $xSamplingRate
|
||||
* @param int $ySamplingRate
|
||||
* @param int $zSamplingRate
|
||||
* @param int $x
|
||||
* @param int $y
|
||||
* @param int $z
|
||||
*
|
||||
* @return \SplFixedArray
|
||||
*/
|
||||
public static function getFastNoise3D(Noise $noise, $xSize, $ySize, $zSize, $xSamplingRate, $ySamplingRate, $zSamplingRate, $x, $y, $z){
|
||||
if($xSamplingRate === 0){
|
||||
throw new \InvalidArgumentException("xSamplingRate cannot be 0");
|
||||
}
|
||||
if($zSamplingRate === 0){
|
||||
throw new \InvalidArgumentException("zSamplingRate cannot be 0");
|
||||
}
|
||||
if($ySamplingRate === 0){
|
||||
throw new \InvalidArgumentException("ySamplingRate cannot be 0");
|
||||
}
|
||||
if ($xSize % $xSamplingRate !== 0) {
|
||||
throw new \InvalidArgumentCountException("xSize % xSamplingRate must return 0");
|
||||
}
|
||||
if ($zSize % $zSamplingRate !== 0) {
|
||||
throw new \InvalidArgumentCountException("zSize % zSamplingRate must return 0");
|
||||
}
|
||||
if ($ySize % $ySamplingRate !== 0) {
|
||||
throw new \InvalidArgumentCountException("ySize % ySamplingRate must return 0");
|
||||
}
|
||||
|
||||
$noiseArray = array_fill(0, $xSize + 1, array_fill(0, $zSize + 1, []));
|
||||
|
||||
for($xx = 0; $xx <= $xSize; $xx += $xSamplingRate){
|
||||
for($zz = 0; $zz <= $zSize; $zz += $zSamplingRate){
|
||||
for($yy = 0; $yy <= $ySize; $yy += $ySamplingRate){
|
||||
$noiseArray[$xx][$zz][$yy] = $noise->noise3D($x + $xx, $y + $yy, $z + $zz);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for($xx = 0; $xx < $xSize; ++$xx){
|
||||
for($zz = 0; $zz < $zSize; ++$zz){
|
||||
for($yy = 0; $yy < $ySize; ++$yy){
|
||||
if($xx % $xSamplingRate !== 0 or $zz % $zSamplingRate !== 0 or $yy % $ySamplingRate !== 0){
|
||||
$nx = (int) ($xx / $xSamplingRate) * $xSamplingRate;
|
||||
$nz = (int) ($zz / $zSamplingRate) * $zSamplingRate;
|
||||
$ny = (int) ($yy / $ySamplingRate) * $ySamplingRate;
|
||||
$noiseArray[$xx][$zz][$yy] = Noise::trilinearLerp(
|
||||
$xx, $yy, $zz, $noiseArray[$nx][$nz][$ny], $noiseArray[$nx][$nz][$ny + $ySamplingRate],
|
||||
$noiseArray[$nx][$nz + $zSamplingRate][$ny], $noiseArray[$nx][$nz + $zSamplingRate][$ny + $ySamplingRate],
|
||||
$noiseArray[$nx + $xSamplingRate][$nz][$ny], $noiseArray[$nx + $xSamplingRate][$nz][$ny + $ySamplingRate],
|
||||
$noiseArray[$nx + $xSamplingRate][$nz + $zSamplingRate][$ny],
|
||||
$noiseArray[$nx + $xSamplingRate][$nz + $zSamplingRate][$ny + $ySamplingRate],
|
||||
$nx, $nx + $zSamplingRate, $ny, $ny + $ySamplingRate, $nz, $nz + $zSamplingRate
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $noiseArray;
|
||||
}
|
||||
|
||||
public abstract function __construct(array $settings = []);
|
||||
|
||||
public abstract function init(GenerationChunkManager $level, Random $random);
|
||||
|
Reference in New Issue
Block a user