mapgen work-in-progress

This commit is contained in:
Perttu Ahola 2011-03-02 02:00:11 +02:00
parent 9a22d02903
commit 2e7b15fed3
8 changed files with 993 additions and 122 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 556 B

View File

@ -510,10 +510,13 @@ void Client::ProcessData(u8 *data, u32 datasize, u16 sender_peer_id)
assert(player != NULL);
player->setPosition(playerpos_f);
}
// Get map seed
m_map_seed = readU64(&data[2+1+6]);
dstream<<"Client: received map seed: "<<m_map_seed<<std::endl;
if(datasize >= 2+1+6+8)
{
// Get map seed
m_map_seed = readU64(&data[2+1+6]);
dstream<<"Client: received map seed: "<<m_map_seed<<std::endl;
}
// Reply to server
u32 replysize = 2;

View File

@ -33,6 +33,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#define DEBUGFILE "debug.txt"
#define WATER_ALPHA 160
//#define WATER_ALPHA 190
// Define for simulating the quirks of sending through internet.
// Causes the socket class to deliberately drop random packets.

View File

@ -28,6 +28,9 @@ NOTE: VBO cannot be turned on for fast-changing stuff because there
NOTE: iostream.imbue(std::locale("C")) is very slow
NOTE: Global locale is now set at initialization
Random suggeestions:
--------------------
SUGG: Fix address to be ipv6 compatible
NOTE: When a new sector is generated, it may change the ground level
@ -116,11 +119,6 @@ Documentation:
Build system / running:
-----------------------
FIXME: Some network errors on Windows that cause local game to not work
- See siggjen's emails.
- Is this the famous "windows 7 problem"?
- Apparently there might be other errors too
Networking and serialization:
-----------------------------
@ -160,6 +158,8 @@ TODO: Make fetching sector's blocks more efficient when rendering
TODO: Flowing water animation
* Combine meshes to bigger ones in ClientMap and set them EHM_STATIC
Configuration:
--------------
@ -182,7 +182,7 @@ Server:
TODO: When player dies, throw items on map
TODO: Make an option to the server to disable building and digging near
SUGG: Make an option to the server to disable building and digging near
the starting position
TODO: Copy the text of the last picked sign to inventory in creative
@ -191,11 +191,14 @@ TODO: Copy the text of the last picked sign to inventory in creative
TODO: Check what goes wrong with caching map to disk (Kray)
- Nothing?
TODO: When server sees that client is removing an inexistent block in
an existent position, resend the MapBlock.
FIXME: Server went into some infinite PeerNotFoundException loop
* Fix the problem with the server constantly saving one or a few
blocks? List the first saved block, maybe it explains.
- It is probably caused by oscillating water
* Make a small history check to transformLiquids to detect and log
continuous oscillations, in such detail that they can be fixed.
Objects:
--------
@ -221,6 +224,15 @@ Block object server side:
- When a statically stored active object comes near a player,
recreate the active object
* Continue making the scripting system:
* Make updateNodeMesh for a less verbose mesh update on add/removenode
* Switch to using a safe way for the self and env pointers
* Make some global environment hooks, like node placed and general
on_step()
* Add a global Lua spawn handler and such
* Get rid of MapBlockObjects
* Other players could be sent to clients as LuaCAOs
Map:
----
@ -247,42 +259,10 @@ FEATURE: Erosion simulation at map generation time
- Simulate rock falling from cliffs when water has removed
enough solid rock from the bottom
Doing now (most important at the top):
--------------------------------------
# maybe done
* not done
=== Next
* Generate trees better
- Add a "trees_added" flag to sector, or something
=== Fixmes
* Check the fixmes in the list above
* Make server find the spawning place from the real map data, not from
the heightmap
- But the changing borders of chunk have to be avoided, because
there is time to generate only one chunk.
Mapgen v2:
* only_from_disk might not work anymore - check and fix it.
* Make the generator to run in background and not blocking block
placement and transfer
* only_from_disk might not work anymore - check and fix it.
=== Making it more portable
* Some MSVC: std::sto* are defined without a namespace and collide
with the ones in utility.h
=== Features
* Continue making the scripting system:
* Make updateNodeMesh for a less verbose mesh update on add/removenode
* Switch to using a safe way for the self and env pointers
* Make some global environment hooks, like node placed and general
on_step()
* Add a global Lua spawn handler and such
* Get rid of MapBlockObjects
* Other players could be sent to clients as LuaCAOs
* Add mud underground
* Make an "environment metafile" to store at least time of day
* Move digging property stuff from material.{h,cpp} to mapnode.cpp...
- Or maybe move content_features to material.{h,cpp}?
* Add some kind of erosion and other stuff that now is possible
* Make client to fetch stuff asynchronously
- Needs method SyncProcessData
@ -292,16 +272,36 @@ Doing now (most important at the top):
and stuff yet and the ground is fairly flat, the mud will flow to
the other chunk making nasty straight walls when the other chunk
is generated. Fix it.
* Fix the problem with the server constantly saving one or a few
blocks? List the first saved block, maybe it explains.
- It is probably caused by oscillating water
* Make a small history check to transformLiquids to detect and log
continuous oscillations, in such detail that they can be fixed.
* Combine meshes to bigger ones in ClientMap and set them EHM_STATIC
Mapgen v3:
* Generate trees better
- Add a "trees_added" flag to sector, or something
* How 'bout making turbulence controlled so that for a given 2d position
it can be completely turned off, and is usually so. This way generation
can be sped up a lot.
Mapgen v4:
* only_from_disk might not work anymore - check and fix it.
* Make the generator to run in background and not blocking block
placement and transfer
* Make chunks to be tiled vertically too
Misc. stuff:
------------
* Make an "environment metafile" to store at least time of day
* Move digging property stuff from material.{h,cpp} to mapnode.cpp...
- Or maybe move content_features to material.{h,cpp}?
* Maybe:
Make a system for pregenerating quick information for mapblocks, so
that the client can show them as cubes before they are actually sent
or even generated.
* Optimize VoxelManipulator lighting implementation by using indices
in place of coordinates?
Making it more portable:
------------------------
* Some MSVC: std::sto* are defined without a namespace and collide
with the ones in utility.h
======================================================================
@ -1306,8 +1306,49 @@ void updateMapPlotTexture(v2f centerpos, video::IVideoDriver* driver,
c.set(255, 160, 160, 160);
else if(h < WATER_LEVEL - 0.5) // Water
c.set(255, 50, 50, 255);
else if(h < WATER_LEVEL + 2 // Sand
&& get_have_sand(client->getMapSeed(), pf))
#if 0
else if(get_have_sand_ground(client->getMapSeed(), pf)
|| (h < WATER_LEVEL + 2
&& get_have_sand_coast(client->getMapSeed(), pf)))
{
h -= WATER_LEVEL;
h /= 50.0;
h = 1.0 - exp(-h);
video::SColor c1(255,237,201,175);
//video::SColor c2(255,20,20,20);
video::SColor c2(255,150,0,0);
c = c2.getInterpolated(c1, h);
}
else
{
h -= WATER_LEVEL;
h /= 50.0;
h = 1.0 - exp(-h);
video::SColor c1(255,110,185,90);
//video::SColor c2(255,20,20,20);
video::SColor c2(255,150,0,0);
c = c2.getInterpolated(c1, h);
}
#endif
#if 1
#if 0
else if(get_have_sand_ground(client->getMapSeed(), pf))
{
h -= WATER_LEVEL;
h /= 20.0;
h = 1.0 - exp(-h);
video::SColor c1(255,237,201,175);
//video::SColor c2(255,20,20,20);
video::SColor c2(255,150,0,0);
c = c2.getInterpolated(c1, h);
}
#endif
// Sand
else if(h < WATER_LEVEL + 2
&& get_have_sand_coast(client->getMapSeed(), pf))
c.set(255, 237, 201, 175);
#if 1
else if(h < WATER_LEVEL + 10)
@ -1325,14 +1366,7 @@ void updateMapPlotTexture(v2f centerpos, video::IVideoDriver* driver,
else
c.set(255, 255, 255, 255); // White
#endif
/*else if(h < WATER_LEVEL + d1)
{
h -= WATER_LEVEL;
u32 a = (u32)(h / d1 * 255);
if(a > 255)
a = 255;
c.set(255, 0, a, 0);
}*/
#endif
#if 0
else
{
@ -1350,6 +1384,22 @@ void updateMapPlotTexture(v2f centerpos, video::IVideoDriver* driver,
a = 255-a;
c.set(255, a, a, a);*/
}
#endif
#if 1
if(h >= WATER_LEVEL - 0.5
&& get_have_sand_ground(client->getMapSeed(), pf))
{
video::SColor c1(255,237,201,175);
c = c.getInterpolated(c1, 0.5);
}
#endif
#if 1
double tf = get_turbulence_factor_2d(client->getMapSeed(), pf);
if(tf > 0.001)
{
video::SColor c1(255,255,0,0);
c = c.getInterpolated(c1, 1.0-(0.5*tf));
}
#endif
img->setPixel(x, y, c);
}
@ -2911,7 +2961,7 @@ int main(int argc, char *argv[])
driver->setFog(
bgcolor,
video::EFT_FOG_LINEAR,
range*0.6,
range*0.4,
range*1.0,
0.01,
false, // pixel fog

File diff suppressed because it is too large Load Diff

View File

@ -45,7 +45,9 @@ with this program; if not, write to the Free Software Foundation, Inc.,
*/
double base_rock_level_2d(u64 seed, v2f p);
bool get_have_sand(u64 seed, v2f p);
bool get_have_sand_coast(u64 seed, v2f p);
bool get_have_sand_ground(u64 seed, v2f p);
double get_turbulence_factor_2d(u64 seed, v2f p);
/*
*/

View File

@ -44,10 +44,10 @@ double linearInterpolation(double x0, double x1, double t){
}
double biLinearInterpolation(double x0y0, double x1y0, double x0y1, double x1y1, double x, double y){
/*double tx = easeCurve(x);
double ty = easeCurve(y);*/
double tx = x;
double ty = y;
double tx = easeCurve(x);
double ty = easeCurve(y);
/*double tx = x;
double ty = y;*/
double u = linearInterpolation(x0y0,x1y0,tx);
double v = linearInterpolation(x0y1,x1y1,tx);
return linearInterpolation(u,v,ty);

View File

@ -3430,9 +3430,9 @@ Player *Server::emergePlayer(const char *name, const char *password,
!= m_env.getServerMap().sector_to_chunk(sectorpos+v2s16(-1,-1)))
continue;
}
// Get sector
m_env.getMap().emergeSector(sectorpos);
// Get ground height at point
// Get sector (NOTE: Don't get because it's slow)
//m_env.getMap().emergeSector(sectorpos);
// Get ground height at point (fallbacks to heightmap function)
groundheight = m_env.getServerMap().findGroundLevel(nodepos);
// Don't go underwater
if(groundheight < WATER_LEVEL)
@ -3440,7 +3440,15 @@ Player *Server::emergePlayer(const char *name, const char *password,
//dstream<<"-> Underwater"<<std::endl;
continue;
}
#if 0 // Doesn't work, generating blocks is a bit too complicated for doing here
// Don't go to high places
if(groundheight > WATER_LEVEL + 4)
{
//dstream<<"-> Underwater"<<std::endl;
continue;
}
#if 0
// Doesn't work, generating blocks is a bit too complicated for doing here
// Get block at point
v3s16 nodepos3d;
nodepos3d = v3s16(nodepos.X, groundheight+1, nodepos.Y);
@ -3466,6 +3474,7 @@ Player *Server::emergePlayer(const char *name, const char *password,
continue;
}
#endif
// Found a good place
dstream<<"Searched through "<<i<<" places."<<std::endl;
break;