@@ -59,7 +59,8 @@ MapgenV7::MapgenV7(int mapgenid, MapgenParams *params, EmergeManager *emerge)
59
59
// // amount of elements to skip for the next index
60
60
// // for noise/height/biome maps (not vmanip)
61
61
this ->ystride = csize.X ;
62
- this ->zstride = csize.X * (csize.Y + 2 );
62
+ // 1-down overgeneration
63
+ this ->zstride_1d = csize.X * (csize.Y + 1 );
63
64
64
65
this ->biomemap = new u8[csize.X * csize.Z ];
65
66
this ->heightmap = new s16[csize.X * csize.Z ];
@@ -80,10 +81,12 @@ MapgenV7::MapgenV7(int mapgenid, MapgenParams *params, EmergeManager *emerge)
80
81
noise_ridge_uwater = new Noise (&sp->np_ridge_uwater , seed, csize.X , csize.Z );
81
82
82
83
// // 3d terrain noise
84
+ // 1-up 1-down overgeneration
83
85
noise_mountain = new Noise (&sp->np_mountain , seed, csize.X , csize.Y + 2 , csize.Z );
84
86
noise_ridge = new Noise (&sp->np_ridge , seed, csize.X , csize.Y + 2 , csize.Z );
85
- noise_cave1 = new Noise (&sp->np_cave1 , seed, csize.X , csize.Y + 2 , csize.Z );
86
- noise_cave2 = new Noise (&sp->np_cave2 , seed, csize.X , csize.Y + 2 , csize.Z );
87
+ // 1-down overgeneraion
88
+ noise_cave1 = new Noise (&sp->np_cave1 , seed, csize.X , csize.Y + 1 , csize.Z );
89
+ noise_cave2 = new Noise (&sp->np_cave2 , seed, csize.X , csize.Y + 1 , csize.Z );
87
90
88
91
// // Biome noise
89
92
noise_heat = new Noise (¶ms->np_biome_heat , seed, csize.X , csize.Z );
@@ -199,7 +202,7 @@ void MapgenV7Params::writeParams(Settings *settings) const
199
202
}
200
203
201
204
202
- // /////////////////////////////////////
205
+ // /////////////////////////////////////////////////////////////////////////////
203
206
204
207
205
208
int MapgenV7::getSpawnLevelAtPoint (v2s16 p)
@@ -451,41 +454,6 @@ bool MapgenV7::getMountainTerrainFromMap(int idx_xyz, int idx_xz, s16 y)
451
454
}
452
455
453
456
454
- #if 0
455
- void MapgenV7::carveRivers() {
456
- MapNode n_air(CONTENT_AIR), n_water_source(c_water_source);
457
- MapNode n_stone(c_stone);
458
- u32 index = 0;
459
-
460
- int river_depth = 4;
461
-
462
- for (s16 z = node_min.Z; z <= node_max.Z; z++)
463
- for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
464
- float terrain_mod = noise_terrain_mod->result[index];
465
- NoiseParams *np = noise_terrain_river->np;
466
- np.persist = noise_terrain_persist->result[index];
467
- float terrain_river = NoisePerlin2DNoTxfm(np, x, z, seed);
468
- float height = terrain_river * (1 - abs(terrain_mod)) *
469
- noise_terrain_river->np.scale;
470
- height = log(height * height); //log(h^3) is pretty interesting for terrain
471
-
472
- s16 y = heightmap[index];
473
- if (height < 1.0 && y > river_depth &&
474
- y - river_depth >= node_min.Y && y <= node_max.Y) {
475
-
476
- for (s16 ry = y; ry != y - river_depth; ry--) {
477
- u32 vi = vm->m_area.index(x, ry, z);
478
- vm->m_data[vi] = n_air;
479
- }
480
-
481
- u32 vi = vm->m_area.index(x, y - river_depth, z);
482
- vm->m_data[vi] = n_water_source;
483
- }
484
- }
485
- }
486
- #endif
487
-
488
-
489
457
int MapgenV7::generateTerrain ()
490
458
{
491
459
s16 stone_surface_min_y;
@@ -765,6 +733,112 @@ void MapgenV7::dustTopNodes()
765
733
}
766
734
767
735
736
+ void MapgenV7::generateCaves (s16 max_stone_y)
737
+ {
738
+ if (max_stone_y < node_min.Y )
739
+ return ;
740
+
741
+ noise_cave1->perlinMap3D (node_min.X , node_min.Y - 1 , node_min.Z );
742
+ noise_cave2->perlinMap3D (node_min.X , node_min.Y - 1 , node_min.Z );
743
+
744
+ v3s16 em = vm->m_area .getExtent ();
745
+ u32 index2d = 0 ;
746
+
747
+ for (s16 z = node_min.Z ; z <= node_max.Z ; z++)
748
+ for (s16 x = node_min.X ; x <= node_max.X ; x++, index2d++) {
749
+ bool column_is_open = false ; // Is column open to overground
750
+ bool is_tunnel = false ; // Is tunnel or tunnel floor
751
+ // Indexes at column top (node_max.Y)
752
+ u32 vi = vm->m_area .index (x, node_max.Y , z);
753
+ u32 index3d = (z - node_min.Z ) * zstride_1d + csize.Y * ystride +
754
+ (x - node_min.X );
755
+ // Biome of column
756
+ Biome *biome = (Biome *)bmgr->getRaw (biomemap[index2d]);
757
+
758
+ // Don't excavate the overgenerated stone at node_max.Y + 1,
759
+ // this creates a 'roof' over the tunnel, preventing light in
760
+ // tunnels at mapchunk borders when generating mapchunks upwards.
761
+ // This 'roof' is removed when the mapchunk above is generated.
762
+ for (s16 y = node_max.Y ; y >= node_min.Y - 1 ; y--,
763
+ index3d -= ystride,
764
+ vm->m_area .add_y (em, vi, -1 )) {
765
+
766
+ content_t c = vm->m_data [vi].getContent ();
767
+ if (c == CONTENT_AIR || c == biome->c_water_top ||
768
+ c == biome->c_water ) {
769
+ column_is_open = true ;
770
+ continue ;
771
+ }
772
+ // Ground
773
+ float d1 = contour (noise_cave1->result [index3d]);
774
+ float d2 = contour (noise_cave2->result [index3d]);
775
+ if (d1 * d2 > 0 .3f && ndef->get (c).is_ground_content ) {
776
+ // In tunnel and ground content, excavate
777
+ vm->m_data [vi] = MapNode (CONTENT_AIR);
778
+ is_tunnel = true ;
779
+ } else if (is_tunnel && column_is_open &&
780
+ (c == biome->c_filler || c == biome->c_stone )) {
781
+ // Tunnel entrance floor
782
+ vm->m_data [vi] = MapNode (biome->c_top );
783
+ column_is_open = false ;
784
+ is_tunnel = false ;
785
+ } else {
786
+ column_is_open = false ;
787
+ is_tunnel = false ;
788
+ }
789
+ }
790
+ }
791
+
792
+ if (node_min.Y >= water_level)
793
+ return ;
794
+
795
+ PseudoRandom ps (blockseed + 21343 );
796
+ u32 bruises_count = ps.range (0 , 2 );
797
+ for (u32 i = 0 ; i < bruises_count; i++) {
798
+ CaveV7 cave (this , &ps);
799
+ cave.makeCave (node_min, node_max, max_stone_y);
800
+ }
801
+ }
802
+
803
+
804
+ // /////////////////////////////////////////////////////////////
805
+
806
+
807
+ #if 0
808
+ void MapgenV7::carveRivers() {
809
+ MapNode n_air(CONTENT_AIR), n_water_source(c_water_source);
810
+ MapNode n_stone(c_stone);
811
+ u32 index = 0;
812
+
813
+ int river_depth = 4;
814
+
815
+ for (s16 z = node_min.Z; z <= node_max.Z; z++)
816
+ for (s16 x = node_min.X; x <= node_max.X; x++, index++) {
817
+ float terrain_mod = noise_terrain_mod->result[index];
818
+ NoiseParams *np = noise_terrain_river->np;
819
+ np.persist = noise_terrain_persist->result[index];
820
+ float terrain_river = NoisePerlin2DNoTxfm(np, x, z, seed);
821
+ float height = terrain_river * (1 - abs(terrain_mod)) *
822
+ noise_terrain_river->np.scale;
823
+ height = log(height * height); //log(h^3) is pretty interesting for terrain
824
+
825
+ s16 y = heightmap[index];
826
+ if (height < 1.0 && y > river_depth &&
827
+ y - river_depth >= node_min.Y && y <= node_max.Y) {
828
+
829
+ for (s16 ry = y; ry != y - river_depth; ry--) {
830
+ u32 vi = vm->m_area.index(x, ry, z);
831
+ vm->m_data[vi] = n_air;
832
+ }
833
+
834
+ u32 vi = vm->m_area.index(x, y - river_depth, z);
835
+ vm->m_data[vi] = n_water_source;
836
+ }
837
+ }
838
+ }
839
+ #endif
840
+
841
+
768
842
#if 0
769
843
void MapgenV7::addTopNodes()
770
844
{
@@ -859,70 +933,3 @@ void MapgenV7::addTopNodes()
859
933
}
860
934
}
861
935
#endif
862
-
863
-
864
- void MapgenV7::generateCaves (s16 max_stone_y)
865
- {
866
- if (max_stone_y < node_min.Y )
867
- return ;
868
-
869
- noise_cave1->perlinMap3D (node_min.X , node_min.Y - 1 , node_min.Z );
870
- noise_cave2->perlinMap3D (node_min.X , node_min.Y - 1 , node_min.Z );
871
-
872
- v3s16 em = vm->m_area .getExtent ();
873
- u32 index2d = 0 ;
874
-
875
- for (s16 z = node_min.Z ; z <= node_max.Z ; z++)
876
- for (s16 x = node_min.X ; x <= node_max.X ; x++, index2d++) {
877
- bool column_is_open = false ; // Is column open to overground
878
- bool is_tunnel = false ; // Is tunnel or tunnel floor
879
- u32 vi = vm->m_area .index (x, node_max.Y + 1 , z);
880
- u32 index3d = (z - node_min.Z ) * zstride + (csize.Y + 1 ) * ystride +
881
- (x - node_min.X );
882
- // Biome of column
883
- Biome *biome = (Biome *)bmgr->getRaw (biomemap[index2d]);
884
-
885
- for (s16 y = node_max.Y + 1 ; y >= node_min.Y - 1 ;
886
- y--, index3d -= ystride, vm->m_area .add_y (em, vi, -1 )) {
887
- // Don't excavate the overgenerated stone at node_max.Y + 1,
888
- // this creates a 'roof' over the tunnel, preventing light in
889
- // tunnels at mapchunk borders when generating mapchunks upwards.
890
- if (y > node_max.Y )
891
- continue ;
892
-
893
- content_t c = vm->m_data [vi].getContent ();
894
- if (c == CONTENT_AIR || c == biome->c_water_top ||
895
- c == biome->c_water ) {
896
- column_is_open = true ;
897
- continue ;
898
- }
899
- // Ground
900
- float d1 = contour (noise_cave1->result [index3d]);
901
- float d2 = contour (noise_cave2->result [index3d]);
902
- if (d1 * d2 > 0 .3f && ndef->get (c).is_ground_content ) {
903
- // In tunnel and ground content, excavate
904
- vm->m_data [vi] = MapNode (CONTENT_AIR);
905
- is_tunnel = true ;
906
- } else if (is_tunnel && column_is_open &&
907
- (c == biome->c_filler || c == biome->c_stone )) {
908
- // Tunnel entrance floor
909
- vm->m_data [vi] = MapNode (biome->c_top );
910
- column_is_open = false ;
911
- is_tunnel = false ;
912
- } else {
913
- column_is_open = false ;
914
- is_tunnel = false ;
915
- }
916
- }
917
- }
918
-
919
- if (node_min.Y >= water_level)
920
- return ;
921
-
922
- PseudoRandom ps (blockseed + 21343 );
923
- u32 bruises_count = ps.range (0 , 2 );
924
- for (u32 i = 0 ; i < bruises_count; i++) {
925
- CaveV7 cave (this , &ps);
926
- cave.makeCave (node_min, node_max, max_stone_y);
927
- }
928
- }
0 commit comments