51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#ifndef CONTENT_MAPBLOCK_HEADER
-#define CONTENT_MAPBLOCK_HEADER
-#include "util/numeric.h"
+#pragma once
+
#include "nodedef.h"
#include <IMeshManipulator.h>
struct MeshMakeData;
struct MeshCollector;
-struct LightFrame
-{
+struct LightPair {
+ u8 lightA;
+ u8 lightB;
+
+ LightPair() = default;
+ explicit LightPair(u16 value) : lightA(value & 0xff), lightB(value >> 8) {}
+ LightPair(u8 valueA, u8 valueB) : lightA(valueA), lightB(valueB) {}
+ LightPair(float valueA, float valueB) :
+ lightA(core::clamp(core::round32(valueA), 0, 255)),
+ lightB(core::clamp(core::round32(valueB), 0, 255)) {}
+ operator u16() const { return lightA | lightB << 8; }
+};
+
+struct LightFrame {
f32 lightsA[8];
f32 lightsB[8];
};
MeshMakeData *data;
MeshCollector *collector;
- INodeDefManager *nodedef;
+ const NodeDefManager *nodedef;
scene::IMeshManipulator *meshmanip;
// options
v3f origin;
MapNode n;
const ContentFeatures *f;
- u16 light;
+ LightPair light;
LightFrame frame;
video::SColor color;
TileSpec tile;
// lighting
void getSmoothLightFrame();
- u16 blendLight(const v3f &vertex_pos);
+ LightPair blendLight(const v3f &vertex_pos);
video::SColor blendLightColor(const v3f &vertex_pos);
video::SColor blendLightColor(const v3f &vertex_pos, const v3f &vertex_normal);
void useTile(int index = 0, u8 set_flags = MATERIAL_FLAG_CRACK_OVERLAY,
u8 reset_flags = 0, bool special = false);
+ void getTile(int index, TileSpec *tile);
void getTile(v3s16 direction, TileSpec *tile);
void getSpecialTile(int index, TileSpec *tile, bool apply_crack = false);
// cuboid drawing!
void drawCuboid(const aabb3f &box, TileSpec *tiles, int tilecount,
- const u16 *lights , const f32 *txc);
+ const LightPair *lights , const f32 *txc);
void generateCuboidTextureCoords(aabb3f const &box, f32 *coords);
void drawAutoLightedCuboid(aabb3f box, const f32 *txc = NULL,
TileSpec *tiles = NULL, int tile_count = 0);
// liquid-specific
bool top_is_same_liquid;
+ bool draw_liquid_bottom;
TileSpec tile_liquid;
TileSpec tile_liquid_top;
content_t c_flowing;
f32 getCornerLevel(int i, int k);
void drawLiquidSides();
void drawLiquidTop();
+ void drawLiquidBottom();
// raillike-specific
// name of the group that enables connecting to raillike nodes of different kind
public:
MapblockMeshGenerator(MeshMakeData *input, MeshCollector *output);
void generate();
+ void renderSingle(content_t node);
};
-
-#endif