Cuberite Forum
Storing prefab pieces - Printable Version

+- Cuberite Forum (https://forum.cuberite.org)
+-- Forum: Cuberite (https://forum.cuberite.org/forum-4.html)
+--- Forum: Development (https://forum.cuberite.org/forum-13.html)
+--- Thread: Storing prefab pieces (/thread-1406.html)

Pages: 1 2


Storing prefab pieces - xoft - 03-12-2014

I'm considering the options for storing the prefab pieces (aka "Gallery areas for the generator"), so that MCS can use them in the world generators. There are several possibilities, each with a different twist.

1. Have them exported as .schematic files, load them at runtime.
2. Have them exported as C++ code, compiled into the server, converted to cBlockAreas in runtime.

Option 1 is a bit difficult on the setup side - the admin has to make sure the schematics are in the proper folder relative to the server, and if one schematic is missing, the entire generator can't really work. Also metadata for the prefabs, such as the connectors (how to connect them together) will have to be stored somewhere, probably yet another external file.
It could be possible for the admin to actually modify the set of pieces that the generator uses, but the generator would need more robust error-checking for this.

Option 2 is easy to set up, the admin doesn't need to do anything special for it to work. However, it makes the executable larger not only on disk, but in the runtime memory as well - each prefab would be stored in the RAM twice - once as the in-source image, and once as the cBlockArea used for the actual generating. The generator will not need any error-checking, because all of it would be done while developing / adding content.

So what are your thoughts?


RE: Storing prefab pieces - NiLSPACE - 03-12-2014

With the second option. How much would it affect the memory usage? If it's only about 5 mb it's fine, but if it's over 200 then I don't think it's such a great option. I suppose it depends on the size of the structure, so lets say one 10x20x10 structure?


RE: Storing prefab pieces - xoft - 03-12-2014

That really depends on how we want to store the structures in the C++ source. I was thinking about this way (inspired by the XPM3 format, http://en.wikipedia.org/wiki/X_PixMap#XPM3 ):
static const cPrefab::sDef g_TestPrefabs[] =
{
	{
		8, 4, 8,  // SizeX = 8, SizeY = 4, SizeZ = 8
		"A:1:0;"  /* E_BLOCK_STONE */ \
		"B:0:0;"  /* E_BLOCK_AIR */ ,
		
		// Level 0:
		"AAAAAAAA" \
		"ABBBBBBA" \
		"ABBBBBBA" \
		"ABBBBBBA" \
		"ABBBBBBA" \
		"ABBBBBBA" \
		"ABBBBBBA" \
		"AAAAAAAA" \

		// Level 1:
		"AAAAAAAA" \
		"AAAAAAAA" \
		"AABBBBAA" \
		"AABBBBAA" \
		"AABBBBAA" \
		"AABBBBAA" \
		"AAAAAAAA" \
		"AAAAAAAA" \

		// Level 2:
		"BBBBBBBB" \
		"BAAAAAAB" \
		"BAAAAAAB" \
		"BAABBAAB" \
		"BAABBAAB" \
		"BAAAAAAB" \
		"BAAAAAAB" \
		"BBBBBBBB" \

		// Level 3:
		"BBBBBBBB" \
		"BBBBBBBB" \
		"BBAAAABB" \
		"BBAAAABB" \
		"BBAAAABB" \
		"BBAAAABB" \
		"BBBBBBBB" \
		"BBBBBBBB" \
	},
	// Another prefab here
};
This could be fully automated by an export plugin accompanying the Gallery plugin, and it is also somewhat human-readable, so it could be tweaked in-source if needed.

This format would require an additional RAM of about 1 byte per block stored, so a 10x20x10 structure would need ~2 KB. To give some perspective to that, most our houses in the Gallery are about 10 x 6 x 10 on average, consider some 20 different houses, that amounts to (20 * 10 * 6 * 10 = ) 120 KB extra RAM consumed (and diskspace as well, by the MCS executable). Multiply by some generous 5 village types, it's 600 KB, still acceptable.

Come think of it, we could do both - have some structures built in and later add the possibility for the generator to load structures externally.


RE: Storing prefab pieces - NiLSPACE - 03-12-2014

Yea I think 600 kb is acceptable even though I expect about 7 or 8 different types, but that woudn't be too big either.

xoft Wrote:Come think of it, we could do both - have some structures built in and later add the possibility for the generator to load structures externally.
Yea I think that would be a great.


RE: Storing prefab pieces - tigerw - 03-13-2014

How about writing a generator to generate houses and other structures for us?


RE: Storing prefab pieces - SamJBarney - 03-13-2014

That shouldn't be too hard to do. All a house is is a collection of rooms. And rooms are just a floor, walls, perhaps a door, and a roof.


RE: Storing prefab pieces - tigerw - 03-13-2014

You're back!


RE: Storing prefab pieces - worktycho - 03-14-2014

If we do decide to go down the generated c++ code route can we just commit the generator and schematics and not the generated source so the source is always up to date with the schematics.


RE: Storing prefab pieces - SamJBarney - 03-14-2014

I've been around; just hanging around in the shadows of the forums.

I think that we should take both routes: build a generator for random buildings, but also be able to generate structures from schematics. That way we don't have to hardcode any buildings into the source, but can still have constant structures from the prefabs.


RE: Storing prefab pieces - xoft - 03-14-2014

worktycho, the C++ writer needs to be run inside MCServer (because it needs access to cBlockArea, which is rather difficult for the build process. Also we can have other prefabs that don't come from the Gallery server.