mirror of
https://gitea.sffempire.ru/Kolyah35/minecraft-pe-0.6.1.git
synced 2026-04-05 15:03:31 +00:00
Compare commits
4 Commits
109bbcfdb1
...
eac71a93d1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
eac71a93d1 | ||
|
|
fa249728e5 | ||
|
|
84e8744387 | ||
|
|
27f0287986 |
@@ -225,29 +225,16 @@ bool TileRenderer::tesselateTorchInWorld( Tile* tt, int x, int y, int z )
|
|||||||
|
|
||||||
bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
|
bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
|
||||||
{
|
{
|
||||||
|
// @todo: fire alpha transparency seems to be scuffed, also it seems i might have messed up the second layer while porting from lce/java , need to look into it - shredder
|
||||||
|
|
||||||
Tesselator& t = Tesselator::instance;
|
Tesselator& t = Tesselator::instance;
|
||||||
|
|
||||||
//Icon *firstTex = tt->getTextureLayer(0);
|
|
||||||
//Icon *secondTex = tt->getTextureLayer(1);
|
|
||||||
//Icon *tex = firstTex;
|
|
||||||
int tex = tt->getTexture(0);
|
int tex = tt->getTexture(0);
|
||||||
|
|
||||||
// if (hasFixedTexture()) tex = fixedTexture;
|
|
||||||
if (fixedTexture >= 0) tex = fixedTexture;
|
if (fixedTexture >= 0) tex = fixedTexture;
|
||||||
|
|
||||||
|
float br = tt->getBrightness( level, x, y, z );
|
||||||
// t.color( 1.0f, 1.0f, 1.0f );
|
t.color( br, br, br );
|
||||||
// t.tex( getLightColor(tt, level, x, y, z ) );
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
float br = tt->getBrightness( level, x, y, z );
|
|
||||||
t.color( br, br, br );
|
|
||||||
|
|
||||||
int xt = ((tex & 0xf) << 4);
|
int xt = ((tex & 0xf) << 4);
|
||||||
int yt = tex & 0xf0;
|
int yt = tex & 0xf0;
|
||||||
@@ -256,7 +243,7 @@ bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
|
|||||||
float u1 = (xt + 15.99f) / 256.0f;
|
float u1 = (xt + 15.99f) / 256.0f;
|
||||||
float v0 = (yt) / 256.0f;
|
float v0 = (yt) / 256.0f;
|
||||||
float v1 = (yt + 15.99f) / 256.0f;
|
float v1 = (yt + 15.99f) / 256.0f;
|
||||||
float h = 1.4f;
|
float h = 1.4f;
|
||||||
|
|
||||||
if ( level->isSolidBlockingTile( x, y - 1, z ) || Tile::fire->canBurn( level, x, y - 1, z ) )
|
if ( level->isSolidBlockingTile( x, y - 1, z ) || Tile::fire->canBurn( level, x, y - 1, z ) )
|
||||||
{
|
{
|
||||||
@@ -280,11 +267,7 @@ bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
|
|||||||
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v1 ) );
|
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v1 ) );
|
||||||
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v0 ) );
|
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 1 ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
|
||||||
// tex = secondTex;
|
|
||||||
// u0 = tex->getU0(true);
|
|
||||||
// v0 = tex->getV0(true);
|
|
||||||
// u1 = tex->getU1(true);
|
|
||||||
// v1 = tex->getV1(true);
|
|
||||||
|
|
||||||
u0 = (xt) / 256.0f;
|
u0 = (xt) / 256.0f;
|
||||||
u1 = (xt + 15.99f) / 256.0f;
|
u1 = (xt + 15.99f) / 256.0f;
|
||||||
@@ -321,7 +304,7 @@ bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
|
|||||||
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v1 ) );
|
t.vertexUV( ( float )( x1 ), ( float )( y + 0 ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v1 ) );
|
||||||
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v0 ) );
|
t.vertexUV( ( float )( x1_ ), ( float )( y + h ), ( float )( z + 0 ), ( float )( u1 ), ( float )( v0 ) );
|
||||||
|
|
||||||
// tex = firstTex;
|
|
||||||
u0 = (xt) / 256.0f;
|
u0 = (xt) / 256.0f;
|
||||||
u1 = (xt + 15.99f) / 256.0f;
|
u1 = (xt + 15.99f) / 256.0f;
|
||||||
v0 = (yt) / 256.0f;
|
v0 = (yt) / 256.0f;
|
||||||
@@ -343,7 +326,6 @@ bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
|
|||||||
float yo = 1 / 16.0f;
|
float yo = 1 / 16.0f;
|
||||||
if ( ( ( x + y + z ) & 1 ) == 1 )
|
if ( ( ( x + y + z ) & 1 ) == 1 )
|
||||||
{
|
{
|
||||||
// tex = secondTex;
|
|
||||||
u0 = (xt) / 256.0f;
|
u0 = (xt) / 256.0f;
|
||||||
u1 = (xt + 15.99f) / 256.0f;
|
u1 = (xt + 15.99f) / 256.0f;
|
||||||
v0 = (yt) / 256.0f;
|
v0 = (yt) / 256.0f;
|
||||||
@@ -447,7 +429,6 @@ bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
|
|||||||
double z0_ = z + 0.5f - 0.5f;
|
double z0_ = z + 0.5f - 0.5f;
|
||||||
double z1_ = z + 0.5f + 0.5f;
|
double z1_ = z + 0.5f + 0.5f;
|
||||||
|
|
||||||
// tex = firstTex;
|
|
||||||
u0 = (xt) / 256.0f;
|
u0 = (xt) / 256.0f;
|
||||||
u1 = (xt + 15.99f) / 256.0f;
|
u1 = (xt + 15.99f) / 256.0f;
|
||||||
v0 = (yt) / 256.0f;
|
v0 = (yt) / 256.0f;
|
||||||
@@ -467,7 +448,6 @@ bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
|
|||||||
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z +
|
t.vertexUV( ( float )( x0_ ), ( float )( y + h ), ( float )( z +
|
||||||
1 ), ( float )( u0 ), ( float )( v0 ) );
|
1 ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
|
||||||
// tex = secondTex;
|
|
||||||
u0 = (xt) / 256.0f;
|
u0 = (xt) / 256.0f;
|
||||||
u1 = (xt + 15.99f) / 256.0f;
|
u1 = (xt + 15.99f) / 256.0f;
|
||||||
v0 = (yt) / 256.0f;
|
v0 = (yt) / 256.0f;
|
||||||
@@ -493,7 +473,6 @@ bool TileRenderer::tesselateFireInWorld( Tile* tt, int x, int y, int z )
|
|||||||
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
|
t.vertexUV( ( float )( x + 1.0f ), ( float )( y +
|
||||||
h ), ( float )( z1_ ), ( float )( u0 ), ( float )( v0 ) );
|
h ), ( float )( z1_ ), ( float )( u0 ), ( float )( v0 ) );
|
||||||
|
|
||||||
// tex = secondTex;
|
|
||||||
u0 = (xt) / 256.0f;
|
u0 = (xt) / 256.0f;
|
||||||
u1 = (xt + 15.99f) / 256.0f;
|
u1 = (xt + 15.99f) / 256.0f;
|
||||||
v0 = (yt) / 256.0f;
|
v0 = (yt) / 256.0f;
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public:
|
|||||||
setMaxDamage(64);
|
setMaxDamage(64);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
bool useOn(ItemInstance* instance, Player* player, Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ) {
|
bool useOn(ItemInstance* instance, Player* player, Level* level, int x, int y, int z, int face, float clickX, float clickY, float clickZ) {
|
||||||
if (face == 0) y--;
|
if (face == 0) y--;
|
||||||
if (face == 1) y++;
|
if (face == 1) y++;
|
||||||
@@ -30,14 +30,14 @@ public:
|
|||||||
|
|
||||||
int targetType = level->getTile(x, y, z);
|
int targetType = level->getTile(x, y, z);
|
||||||
if (targetType == 0) {
|
if (targetType == 0) {
|
||||||
level->playSound(x + 0.5, y + 0.5, z + 0.5, "fire.ignite", 1, sharedRandom.nextFloat() * 0.4f + 0.8f);
|
level->playSound(x + 0.5, y + 0.5, z + 0.5, "fire.ignite", 1, random.nextFloat() * 0.4f + 0.8f);
|
||||||
level->setTile(x, y, z, Tile::fire->id);
|
level->setTile(x, y, z, ((Tile*)Tile::fire)->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
instance->hurt(1);
|
instance->hurt(1);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /*NET_MINECRAFT_WORLD_ITEM__FlintAndSteelItem_H__*/
|
#endif /*NET_MINECRAFT_WORLD_ITEM__FlintAndSteelItem_H__*/
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
#include "../levelgen/feature/TreeFeature.h"
|
#include "../levelgen/feature/TreeFeature.h"
|
||||||
#include "../levelgen/feature/TallgrassFeature.h"
|
#include "../levelgen/feature/TallgrassFeature.h"
|
||||||
|
#include "../levelgen/feature/BasicTree.h"
|
||||||
|
|
||||||
#include "../../entity/EntityTypes.h"
|
#include "../../entity/EntityTypes.h"
|
||||||
#include "../../entity/MobCategory.h"
|
#include "../../entity/MobCategory.h"
|
||||||
@@ -140,7 +141,7 @@ void Biome::teardownBiomes() {
|
|||||||
Feature* Biome::getTreeFeature( Random* random )
|
Feature* Biome::getTreeFeature( Random* random )
|
||||||
{
|
{
|
||||||
if (random->nextInt(10) == 0) {
|
if (random->nextInt(10) == 0) {
|
||||||
//return /*new*/ BasicTree();
|
return new BasicTree(false);
|
||||||
}
|
}
|
||||||
return new TreeFeature(false);
|
return new TreeFeature(false);
|
||||||
}
|
}
|
||||||
@@ -148,6 +149,15 @@ Feature* Biome::getGrassFeature( Random* random ) {
|
|||||||
return new TallgrassFeature(Tile::tallgrass->id, TallGrass::TALL_GRASS);
|
return new TallgrassFeature(Tile::tallgrass->id, TallGrass::TALL_GRASS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Feature* Biome::getBasicTreeFeature( Random* random )
|
||||||
|
{
|
||||||
|
if (random->nextInt(10) == 0) {
|
||||||
|
return new BasicTree(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
Biome* Biome::getBiome( float temperature, float downfall )
|
Biome* Biome::getBiome( float temperature, float downfall )
|
||||||
{
|
{
|
||||||
int a = (int) (temperature * 63);
|
int a = (int) (temperature * 63);
|
||||||
|
|||||||
@@ -71,6 +71,7 @@ public:
|
|||||||
|
|
||||||
virtual Feature* getTreeFeature(Random* random);
|
virtual Feature* getTreeFeature(Random* random);
|
||||||
virtual Feature* getGrassFeature(Random* random);
|
virtual Feature* getGrassFeature(Random* random);
|
||||||
|
virtual Feature* getBasicTreeFeature(Random* random);
|
||||||
|
|
||||||
static Biome* getBiome(float temperature, float downfall);
|
static Biome* getBiome(float temperature, float downfall);
|
||||||
static Biome* _getBiome(float temperature, float downfall);
|
static Biome* _getBiome(float temperature, float downfall);
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
#include "Biome.h"
|
#include "Biome.h"
|
||||||
#include "../levelgen/feature/TreeFeature.h"
|
#include "../levelgen/feature/TreeFeature.h"
|
||||||
#include "../levelgen/feature/BirchFeature.h"
|
#include "../levelgen/feature/BirchFeature.h"
|
||||||
|
#include "../levelgen/feature/BasicTree.h"
|
||||||
|
|
||||||
class ForestBiome: public Biome
|
class ForestBiome: public Biome
|
||||||
{
|
{
|
||||||
@@ -15,7 +16,7 @@ public:
|
|||||||
return new BirchFeature();
|
return new BirchFeature();
|
||||||
}
|
}
|
||||||
if (random->nextInt(3) == 0) {
|
if (random->nextInt(3) == 0) {
|
||||||
//return new BasicTree();
|
return new BasicTree(false);
|
||||||
}
|
}
|
||||||
return new TreeFeature(false);
|
return new TreeFeature(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,13 +6,14 @@
|
|||||||
#include "Biome.h"
|
#include "Biome.h"
|
||||||
#include "../../../util/Random.h"
|
#include "../../../util/Random.h"
|
||||||
#include "../levelgen/feature/TreeFeature.h"
|
#include "../levelgen/feature/TreeFeature.h"
|
||||||
|
#include "../levelgen/feature/BasicTree.h"
|
||||||
|
|
||||||
class RainforestBiome: public Biome
|
class RainforestBiome: public Biome
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
Feature* getTreeFeature(Random* random) {
|
Feature* getTreeFeature(Random* random) {
|
||||||
if (random->nextInt(3) == 0) {
|
if (random->nextInt(3) == 0) {
|
||||||
//return new BasicTree();
|
return new BasicTree(false);
|
||||||
}
|
}
|
||||||
return new TreeFeature(false);
|
return new TreeFeature(false);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -370,6 +370,18 @@ void RandomLevelSource::postProcess(ChunkSource* parent, int xt, int zt) {
|
|||||||
}
|
}
|
||||||
//printf("placing tree at %d, %d, %d\n", x, y, z);
|
//printf("placing tree at %d, %d, %d\n", x, y, z);
|
||||||
}
|
}
|
||||||
|
// for (int i = 0; i < forests; i++) {
|
||||||
|
// int x = xo + random.nextInt(16) + 8;
|
||||||
|
// int z = zo + random.nextInt(16) + 8;
|
||||||
|
//int y = level->getHeightmap(x, z);
|
||||||
|
// Feature* tree = biome->getBasicTreeFeature(&random);
|
||||||
|
//if (tree) {
|
||||||
|
// tree->init(1, 1, 1);
|
||||||
|
// tree->place(level, &random, x, y, z);
|
||||||
|
// delete tree;
|
||||||
|
//}
|
||||||
|
////printf("placing tree at %d, %d, %d\n", x, y, z);
|
||||||
|
// }
|
||||||
|
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
int x = xo + random.nextInt(16) + 8;
|
int x = xo + random.nextInt(16) + 8;
|
||||||
|
|||||||
446
src/world/level/levelgen/feature/BasicTree.h
Normal file
446
src/world/level/levelgen/feature/BasicTree.h
Normal file
@@ -0,0 +1,446 @@
|
|||||||
|
#ifndef NET_MINECRAFT_WORLD_LEVEL_LEVELGEN_FEATURE__BasicTree_H__
|
||||||
|
#define NET_MINECRAFT_WORLD_LEVEL_LEVELGEN_FEATURE__BasicTree_H__
|
||||||
|
|
||||||
|
//package net.minecraft.world.level.levelgen.feature;
|
||||||
|
|
||||||
|
#include "Feature.h"
|
||||||
|
|
||||||
|
#include "../../../../util/Random.h"
|
||||||
|
#include "../../Level.h"
|
||||||
|
|
||||||
|
#include "../../tile/TreeTile.h"
|
||||||
|
|
||||||
|
class Level;
|
||||||
|
|
||||||
|
class BasicTree : public Feature
|
||||||
|
{
|
||||||
|
typedef Feature super;
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
unsigned char axisConversionArray[6];
|
||||||
|
Random *rnd;
|
||||||
|
Level *thisLevel;
|
||||||
|
int origin[3];
|
||||||
|
int height;
|
||||||
|
int trunkHeight;
|
||||||
|
double trunkHeightScale;
|
||||||
|
double branchDensity;
|
||||||
|
double branchSlope;
|
||||||
|
double widthScale;
|
||||||
|
double foliageDensity;
|
||||||
|
int trunkWidth;
|
||||||
|
int heightVariance;
|
||||||
|
int foliageHeight;
|
||||||
|
int **foliageCoords;
|
||||||
|
int foliageCoordsLength;
|
||||||
|
void prepare(){
|
||||||
|
trunkHeight = (int) (height * trunkHeightScale);
|
||||||
|
if (trunkHeight >= height) trunkHeight = height - 1;
|
||||||
|
int clustersPerY = (int) (1.382 + pow(foliageDensity * height / 13.0, 2));
|
||||||
|
if (clustersPerY < 1) clustersPerY = 1;
|
||||||
|
int **tempFoliageCoords = new int *[clustersPerY * height];
|
||||||
|
for( int i = 0; i < clustersPerY * height; i++ )
|
||||||
|
{
|
||||||
|
tempFoliageCoords[i] = new int[4];
|
||||||
|
}
|
||||||
|
int y = origin[1] + height - foliageHeight;
|
||||||
|
int clusterCount = 1;
|
||||||
|
int trunkTop = origin[1] + trunkHeight;
|
||||||
|
int relativeY = y - origin[1];
|
||||||
|
|
||||||
|
tempFoliageCoords[0][0] = origin[0];
|
||||||
|
tempFoliageCoords[0][1] = y;
|
||||||
|
tempFoliageCoords[0][2] = origin[2];
|
||||||
|
tempFoliageCoords[0][3] = trunkTop;
|
||||||
|
y--;
|
||||||
|
|
||||||
|
while (relativeY >= 0)
|
||||||
|
{
|
||||||
|
int num = 0;
|
||||||
|
|
||||||
|
float shapefac = treeShape(relativeY);
|
||||||
|
if (shapefac < 0)
|
||||||
|
{
|
||||||
|
y--;
|
||||||
|
relativeY--;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
double originOffset = 0.5;
|
||||||
|
while (num < clustersPerY)
|
||||||
|
{
|
||||||
|
double radius = widthScale * (shapefac * (rnd->nextFloat() + 0.328));
|
||||||
|
double angle = rnd->nextFloat() * 2.0 * 3.14159;
|
||||||
|
int x = Mth::floor(radius * sin(angle) + origin[0] + originOffset);
|
||||||
|
int z = Mth::floor(radius * cos(angle) + origin[2] + originOffset);
|
||||||
|
int checkStart[] = { x, y, z };
|
||||||
|
int checkEnd[] = { x, y + foliageHeight, z };
|
||||||
|
if (checkLine(checkStart, checkEnd) == -1) {
|
||||||
|
int checkBranchBase[] = { origin[0], origin[1], origin[2] };
|
||||||
|
double distance = sqrt(pow(abs(origin[0] - checkStart[0]), 2.0) + pow(abs(origin[2] - checkStart[2]), 2.0));
|
||||||
|
double branchHeight = distance * branchSlope;
|
||||||
|
if ((checkStart[1] - branchHeight) > trunkTop)
|
||||||
|
{
|
||||||
|
checkBranchBase[1] = trunkTop;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
checkBranchBase[1] = (int) (checkStart[1] - branchHeight);
|
||||||
|
}
|
||||||
|
if (checkLine(checkBranchBase, checkStart) == -1)
|
||||||
|
{
|
||||||
|
tempFoliageCoords[clusterCount][0] = x;
|
||||||
|
tempFoliageCoords[clusterCount][1] = y;
|
||||||
|
tempFoliageCoords[clusterCount][2] = z;
|
||||||
|
tempFoliageCoords[clusterCount][3] = checkBranchBase[1];
|
||||||
|
clusterCount++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
y--;
|
||||||
|
relativeY--;
|
||||||
|
}
|
||||||
|
|
||||||
|
foliageCoordsLength = clusterCount;
|
||||||
|
foliageCoords = tempFoliageCoords;
|
||||||
|
|
||||||
|
for( int i = clusterCount; i < clustersPerY * height; i++ )
|
||||||
|
{
|
||||||
|
delete [] tempFoliageCoords[i];
|
||||||
|
tempFoliageCoords[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void crossection(int x, int y, int z, float radius, unsigned char direction, int material)
|
||||||
|
{
|
||||||
|
|
||||||
|
int rad = (int) (radius + 0.618);
|
||||||
|
unsigned char secidx1 = axisConversionArray[direction];
|
||||||
|
unsigned char secidx2 = axisConversionArray[direction + 3];
|
||||||
|
int center[] = { x, y, z };
|
||||||
|
int position[] = { 0, 0, 0 };
|
||||||
|
int offset1 = -rad;
|
||||||
|
int offset2 = -rad;
|
||||||
|
int thismat;
|
||||||
|
position[direction] = center[direction];
|
||||||
|
while (offset1 <= rad)
|
||||||
|
{
|
||||||
|
position[secidx1] = center[secidx1] + offset1;
|
||||||
|
offset2 = -rad;
|
||||||
|
while (offset2 <= rad)
|
||||||
|
{
|
||||||
|
double thisdistance = pow(abs(offset1) + 0.5, 2) + pow(abs(offset2) + 0.5, 2);
|
||||||
|
if (thisdistance > radius * radius)
|
||||||
|
{
|
||||||
|
offset2++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
position[secidx2] = center[secidx2] + offset2;
|
||||||
|
|
||||||
|
thismat = thisLevel->getTile(position[0], position[1], position[2]);
|
||||||
|
|
||||||
|
if (!((thismat == 0) || (thismat == Tile::leaves->id)))
|
||||||
|
{
|
||||||
|
offset2++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
placeBlock(thisLevel, position[0], position[1], position[2], material, 0);
|
||||||
|
|
||||||
|
offset2++;
|
||||||
|
}
|
||||||
|
offset1++;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
float treeShape(int y){
|
||||||
|
if (y < (((float) height) * 0.3)) return (float) -1.618;
|
||||||
|
float radius = ((float) height) / ((float) 2.0);
|
||||||
|
float adjacent = (((float) height) / ((float) 2.0)) - y;
|
||||||
|
float distance;
|
||||||
|
if (adjacent == 0) distance = radius;
|
||||||
|
else if (abs(adjacent) >= radius) distance = (float) 0.0;
|
||||||
|
else distance = (float) sqrt(pow(abs(radius), 2) - pow(abs(adjacent), 2));
|
||||||
|
distance *= (float) 0.5;
|
||||||
|
return distance;
|
||||||
|
}
|
||||||
|
float foliageShape(int y){
|
||||||
|
if ((y < 0) || (y >= foliageHeight)) return (float) -1;
|
||||||
|
else if ((y == 0) || (y == (foliageHeight - 1))) return (float) 2;
|
||||||
|
else return (float) 3;
|
||||||
|
}
|
||||||
|
void foliageCluster(int x, int y, int z){
|
||||||
|
|
||||||
|
int topy = y + foliageHeight;
|
||||||
|
int cury = topy - 1;
|
||||||
|
float radius;
|
||||||
|
while (cury >= y)
|
||||||
|
{
|
||||||
|
radius = foliageShape(cury - y);
|
||||||
|
crossection(x, cury, z, radius, (unsigned char) 1, Tile::leaves->id);
|
||||||
|
cury--;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
void limb(int *start, int *end, int material)
|
||||||
|
{
|
||||||
|
int delta[] = { 0, 0, 0 };
|
||||||
|
unsigned char idx = 0;
|
||||||
|
unsigned char primidx = 0;
|
||||||
|
while (idx < 3)
|
||||||
|
{
|
||||||
|
delta[idx] = end[idx] - start[idx];
|
||||||
|
if (abs(delta[idx]) > abs(delta[primidx]))
|
||||||
|
{
|
||||||
|
primidx = idx;
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
if (delta[primidx] == 0) return;
|
||||||
|
unsigned char secidx1 = axisConversionArray[primidx];
|
||||||
|
unsigned char secidx2 = axisConversionArray[primidx + 3];
|
||||||
|
char primsign;
|
||||||
|
if (delta[primidx] > 0) primsign = 1;
|
||||||
|
else primsign = -1;
|
||||||
|
double secfac1 = ((double) delta[secidx1]) / ((double) delta[primidx]);
|
||||||
|
double secfac2 = ((double) delta[secidx2]) / ((double) delta[primidx]);
|
||||||
|
int coordinate[] = { 0, 0, 0 };
|
||||||
|
int primoffset = 0;
|
||||||
|
int endoffset = delta[primidx] + primsign;
|
||||||
|
while (primoffset != endoffset)
|
||||||
|
{
|
||||||
|
coordinate[primidx] = Mth::floor(start[primidx] + primoffset + 0.5);
|
||||||
|
coordinate[secidx1] = Mth::floor(start[secidx1] + (primoffset * secfac1) + 0.5);
|
||||||
|
coordinate[secidx2] = Mth::floor(start[secidx2] + (primoffset * secfac2) + 0.5);
|
||||||
|
|
||||||
|
int dir = 0;
|
||||||
|
int xdiff = abs(coordinate[0] - start[0]);
|
||||||
|
int zdiff = abs(coordinate[2] - start[2]);
|
||||||
|
int maxdiff = (std::max)(xdiff, zdiff);
|
||||||
|
|
||||||
|
if (maxdiff > 0)
|
||||||
|
{
|
||||||
|
if (xdiff == maxdiff)
|
||||||
|
{
|
||||||
|
dir = 0;
|
||||||
|
}
|
||||||
|
else if (zdiff == maxdiff)
|
||||||
|
{
|
||||||
|
dir = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
placeBlock(thisLevel, coordinate[0], coordinate[1], coordinate[2], material, dir);
|
||||||
|
primoffset += primsign;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void makeFoliage(){
|
||||||
|
int idx = 0;
|
||||||
|
int finish = foliageCoordsLength;
|
||||||
|
while (idx < finish)
|
||||||
|
{
|
||||||
|
int x = foliageCoords[idx][0];
|
||||||
|
int y = foliageCoords[idx][1];
|
||||||
|
int z = foliageCoords[idx][2];
|
||||||
|
foliageCluster(x, y, z);
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool trimBranches(int localY){
|
||||||
|
if (localY < (height * 0.2)) return false;
|
||||||
|
else return true;
|
||||||
|
}
|
||||||
|
void makeTrunk(){
|
||||||
|
int x = origin[0];
|
||||||
|
int startY = origin[1];
|
||||||
|
int topY = origin[1] + trunkHeight;
|
||||||
|
int z = origin[2];
|
||||||
|
int startCoord[] = { x, startY, z };
|
||||||
|
int endCoord[] = { x, topY, z };
|
||||||
|
limb(startCoord, endCoord, Tile::treeTrunk->id);
|
||||||
|
if (trunkWidth == 2)
|
||||||
|
{
|
||||||
|
startCoord[0] += 1;
|
||||||
|
endCoord[0] += 1;
|
||||||
|
limb(startCoord, endCoord, Tile::treeTrunk->id);
|
||||||
|
startCoord[2] += 1;
|
||||||
|
endCoord[2] += 1;
|
||||||
|
limb(startCoord, endCoord, Tile::treeTrunk->id);
|
||||||
|
startCoord[0] += -1;
|
||||||
|
endCoord[0] += -1;
|
||||||
|
limb(startCoord, endCoord, Tile::treeTrunk->id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void makeBranches(){
|
||||||
|
int idx = 0;
|
||||||
|
int finish = foliageCoordsLength;
|
||||||
|
int baseCoord[] = { origin[0], origin[1], origin[2] };
|
||||||
|
while (idx < finish)
|
||||||
|
{
|
||||||
|
int *coordValues = foliageCoords[idx];
|
||||||
|
int endCoord[] = { coordValues[0], coordValues[1], coordValues[2] };
|
||||||
|
baseCoord[1] = coordValues[3];
|
||||||
|
int localY = baseCoord[1] - origin[1];
|
||||||
|
if (trimBranches(localY))
|
||||||
|
{
|
||||||
|
limb(baseCoord, endCoord, Tile::treeTrunk->id);
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
int checkLine(int *start, int *end){
|
||||||
|
|
||||||
|
int delta[] = { 0, 0, 0 };
|
||||||
|
unsigned char idx = 0;
|
||||||
|
unsigned char primidx = 0;
|
||||||
|
while (idx < 3)
|
||||||
|
{
|
||||||
|
delta[idx] = end[idx] - start[idx];
|
||||||
|
if (abs(delta[idx]) > abs(delta[primidx]))
|
||||||
|
{
|
||||||
|
primidx = idx;
|
||||||
|
}
|
||||||
|
idx++;
|
||||||
|
}
|
||||||
|
if (delta[primidx] == 0) return -1;
|
||||||
|
unsigned char secidx1 = axisConversionArray[primidx];
|
||||||
|
unsigned char secidx2 = axisConversionArray[primidx + 3];
|
||||||
|
char primsign;
|
||||||
|
if (delta[primidx] > 0) primsign = 1;
|
||||||
|
else primsign = -1;
|
||||||
|
double secfac1 = ((double) delta[secidx1]) / ((double) delta[primidx]);
|
||||||
|
double secfac2 = ((double) delta[secidx2]) / ((double) delta[primidx]);
|
||||||
|
int coordinate[] = { 0, 0, 0 };
|
||||||
|
int primoffset = 0;
|
||||||
|
int endoffset = delta[primidx] + primsign;
|
||||||
|
int thismat;
|
||||||
|
while (primoffset != endoffset)
|
||||||
|
{
|
||||||
|
coordinate[primidx] = start[primidx] + primoffset;
|
||||||
|
coordinate[secidx1] = Mth::floor(start[secidx1] + (primoffset * secfac1));
|
||||||
|
coordinate[secidx2] = Mth::floor(start[secidx2] + (primoffset * secfac2));
|
||||||
|
thismat = thisLevel->getTile(coordinate[0], coordinate[1], coordinate[2]);
|
||||||
|
if (!((thismat == 0) || (thismat == Tile::leaves->id)))
|
||||||
|
{
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
primoffset += primsign;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (primoffset == endoffset)
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return abs(primoffset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
bool checkLocation(){
|
||||||
|
|
||||||
|
int startPosition[] = { origin[0], origin[1], origin[2] };
|
||||||
|
int endPosition[] = { origin[0], origin[1] + height - 1, origin[2] };
|
||||||
|
|
||||||
|
|
||||||
|
int baseMaterial = thisLevel->getTile(origin[0], origin[1] - 1, origin[2]);
|
||||||
|
if (!((baseMaterial == 2) || (baseMaterial == 3)))
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int allowedHeight = checkLine(startPosition, endPosition);
|
||||||
|
if (allowedHeight == -1)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
else if (allowedHeight < 6)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
height = allowedHeight;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public:
|
||||||
|
BasicTree(bool doUpdate){
|
||||||
|
axisConversionArray[0] = 2;
|
||||||
|
axisConversionArray[1] = 0;
|
||||||
|
axisConversionArray[2] = 0;
|
||||||
|
axisConversionArray[3] = 1;
|
||||||
|
axisConversionArray[4] = 2;
|
||||||
|
axisConversionArray[5] = 1;
|
||||||
|
rnd = new Random();
|
||||||
|
origin[0] = 0;
|
||||||
|
origin[1] = 0;
|
||||||
|
origin[2] = 0;
|
||||||
|
height = 0;
|
||||||
|
trunkHeight = 0;
|
||||||
|
trunkHeightScale = 0.618;
|
||||||
|
branchDensity = 1.0;
|
||||||
|
branchSlope = 0.381;
|
||||||
|
widthScale = 1.0;
|
||||||
|
foliageDensity = 1.0;
|
||||||
|
trunkWidth = 1;
|
||||||
|
heightVariance = 12;
|
||||||
|
foliageHeight = 4;
|
||||||
|
foliageCoords = NULL;
|
||||||
|
foliageCoordsLength = 0;
|
||||||
|
}
|
||||||
|
virtual ~BasicTree(){
|
||||||
|
delete rnd;
|
||||||
|
|
||||||
|
for( int i = 0; i < foliageCoordsLength; i++ )
|
||||||
|
{
|
||||||
|
delete [] foliageCoords[i];
|
||||||
|
}
|
||||||
|
delete [] foliageCoords;
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void init(double heightInit, double widthInit, double foliageDensityInit){
|
||||||
|
|
||||||
|
heightVariance = (int) (heightInit * 12);
|
||||||
|
if (heightInit > 0.5) foliageHeight = 5;
|
||||||
|
widthScale = widthInit;
|
||||||
|
foliageDensity = foliageDensityInit;
|
||||||
|
}
|
||||||
|
virtual bool place(Level *level, Random *random, int x, int y, int z){
|
||||||
|
|
||||||
|
thisLevel = level;
|
||||||
|
int seed = random->nextLong();
|
||||||
|
rnd->setSeed(seed);
|
||||||
|
origin[0] = x;
|
||||||
|
origin[1] = y;
|
||||||
|
origin[2] = z;
|
||||||
|
if (height == 0)
|
||||||
|
{
|
||||||
|
height = 5 + rnd->nextInt(heightVariance);
|
||||||
|
}
|
||||||
|
if (!(checkLocation()))
|
||||||
|
{
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
prepare();
|
||||||
|
|
||||||
|
makeFoliage();
|
||||||
|
|
||||||
|
makeTrunk();
|
||||||
|
|
||||||
|
makeBranches();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
#endif /*NET_MINECRAFT_WORLD_LEVEL_LEVELGEN_FEATURE__BasicTree_H__*/
|
||||||
Reference in New Issue
Block a user