summaryrefslogblamecommitdiffstats
path: root/src/Generating/Prefab.h
blob: 6596b906bf3c80506e565d067d2c2b2e5b85d0d0 (plain) (tree)


















































































                                                                                                                                  

// Prefab.h

/*
Declares the cPrefab class, representing a cPiece descendant for the cPieceGenerator that
uses a prefabricate in a cBlockArea for drawing itself.
The class can be constructed from data that is stored directly in the executable, in a sPrefabDef structure
declared in this file as well; the Gallery server exports areas in this format.
*/





#pragma once

#include "PieceGenerator.h"
#include "../BlockArea.h"






class cPrefab :
	public cPiece
{
public:
	struct sDef
	{
		int m_SizeX;
		int m_SizeY;
		int m_SizeZ;
		const char * m_CharMap;
		const char * m_Image;
		// TODO: Connectors
	};
	
	cPrefab(const sDef & a_Def);
	
	/** Draws the prefab into the specified block area, according to the placement stored in the PlacedPiece. */
	void Draw(cBlockArea & a_Dest, const cPlacedPiece * a_Placement);

protected:
	/** Maps letters in the sDef::m_Image onto a number, BlockType * 16 | BlockMeta */
	typedef int CharMap[256];
	
	
	/** The cBlockArea that contains the block definitions for the prefab */
	cBlockArea m_BlockArea;
	
	/** The size of the prefab */
	Vector3i m_Size;
	
	/** The hitbox of the prefab. In first version is the same as the m_BlockArea dimensions */
	cCuboid m_HitBox;
	
	/** The connectors through which the piece connects to other pieces */
	cConnectors m_Connectors;
	
	/** Bitmask, bit N set -> N rotations CCW supported */
	int m_AllowedRotations;
	
	/** The merge strategy to use when drawing the prefab into a block area */
	cBlockArea::eMergeStrategy m_MergeStrategy;
	
	
	// cPiece overrides:	
	virtual cConnectors GetConnectors(void) const override;
	virtual Vector3i GetSize(void) const override;
	virtual cCuboid GetHitBox(void) const override;
	virtual bool CanRotateCCW(int a_NumRotations) const override;
	
	/** Parses the CharMap in the definition into a CharMap binary data used for translating the definition into BlockArea. */
	void ParseCharMap(CharMap & a_CharMapOut, const char * a_CharMapDef);
	
	/** Parses the Image in the definition into m_BlockArea's block types and metas, using the specified CharMap. */
	void ParseBlockImage(const CharMap & a_CharMap, const char * a_BlockImage);
};