1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-06-27 16:36:03 +00:00

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

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