Content_mapblock.cpp: Refactor

master
number Zero 2017-02-13 19:31:43 +03:00 committed by paramat
parent e7246d3f0d
commit d4e0c0f9b8
5 changed files with 1358 additions and 2003 deletions

File diff suppressed because it is too large Load Diff

View File

@ -19,11 +19,129 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#ifndef CONTENT_MAPBLOCK_HEADER
#define CONTENT_MAPBLOCK_HEADER
#include "util/numeric.h"
#include "nodedef.h"
#include <IMeshManipulator.h>
struct MeshMakeData;
struct MeshCollector;
void mapblock_mesh_generate_special(MeshMakeData *data,
MeshCollector &collector);
struct LightFrame
{
f32 lightsA[8];
f32 lightsB[8];
};
class MapblockMeshGenerator
{
public:
MeshMakeData *data;
MeshCollector *collector;
INodeDefManager *nodedef;
scene::ISceneManager *smgr;
scene::IMeshManipulator *meshmanip;
// options
bool enable_mesh_cache;
// current node
v3s16 blockpos_nodes;
v3s16 p;
v3f origin;
MapNode n;
const ContentFeatures *f;
u16 light;
LightFrame frame;
video::SColor color;
TileSpec tile;
float scale;
// lighting
void getSmoothLightFrame();
u16 blendLight(const v3f &vertex_pos);
video::SColor blendLight(const v3f &vertex_pos, video::SColor tile_color);
video::SColor blendLight(const v3f &vertex_pos, const v3f &vertex_normal, video::SColor tile_color);
void useTile(int index, bool disable_backface_culling);
void useDefaultTile(bool set_color = true);
TileSpec getTile(const v3s16 &direction);
// face drawing
void drawQuad(v3f *vertices, const v3s16 &normal = v3s16(0, 0, 0));
// cuboid drawing!
void drawCuboid(const aabb3f &box, TileSpec *tiles, int tilecount,
const u16 *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;
TileSpec tile_liquid;
TileSpec tile_liquid_top;
content_t c_flowing;
content_t c_source;
video::SColor color_liquid_top;
struct NeighborData {
f32 level;
content_t content;
bool is_same_liquid;
bool top_is_same_liquid;
};
NeighborData liquid_neighbors[3][3];
f32 corner_levels[2][2];
void prepareLiquidNodeDrawing(bool flowing);
void getLiquidNeighborhood(bool flowing);
void resetCornerLevels();
void calculateCornerLevels();
f32 getCornerLevel(int i, int k);
void drawLiquidSides(bool flowing);
void drawLiquidTop(bool flowing);
// raillike-specific
// name of the group that enables connecting to raillike nodes of different kind
static const std::string raillike_groupname;
int raillike_group;
bool isSameRail(v3s16 dir);
// plantlike-specific
PlantlikeStyle draw_style;
v3f offset;
int rotate_degree;
bool random_offset_Y;
int face_num;
void drawPlantlikeQuad(float rotation, float quad_offset = 0,
bool offset_top_only = false);
// firelike-specific
void drawFirelikeQuad(float rotation, float opening_angle,
float offset_h, float offset_v = 0.0);
// drawtypes
void drawLiquidNode(bool flowing);
void drawGlasslikeNode();
void drawGlasslikeFramedNode();
void drawAllfacesNode();
void drawTorchlikeNode();
void drawSignlikeNode();
void drawPlantlikeNode();
void drawFirelikeNode();
void drawFencelikeNode();
void drawRaillikeNode();
void drawNodeboxNode();
void drawMeshNode();
// common
void errorUnknownDrawtype();
void drawNode();
public:
MapblockMeshGenerator(MeshMakeData *input, MeshCollector *output);
void generate();
};
#endif

View File

@ -1108,7 +1108,10 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
- whatever
*/
mapblock_mesh_generate_special(data, collector);
{
MapblockMeshGenerator generator(data, &collector);
generator.generate();
}
/*
Convert MeshCollector to SMesh

View File

@ -166,6 +166,19 @@ enum NodeDrawType
NDT_MESH, // Uses static meshes
};
// Mesh options for NDT_PLANTLIKE with CPT2_MESHOPTIONS
static const u8 MO_MASK_STYLE = 0x07;
static const u8 MO_BIT_RANDOM_OFFSET = 0x08;
static const u8 MO_BIT_SCALE_SQRT2 = 0x10;
static const u8 MO_BIT_RANDOM_OFFSET_Y = 0x20;
enum PlantlikeStyle {
PLANT_STYLE_CROSS,
PLANT_STYLE_CROSS2,
PLANT_STYLE_STAR,
PLANT_STYLE_HASH,
PLANT_STYLE_HASH2,
};
/*
Stand-alone definition of a TileSpec (basically a server-side TileSpec)
*/
@ -364,6 +377,11 @@ struct ContentFeatures
return (liquid_alternative_flowing == f.liquid_alternative_flowing);
}
int getGroup(const std::string &group) const
{
return itemgroup_get(groups, group);
}
#ifndef SERVER
void fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, TileDef *tiledef,
u32 shader_id, bool use_normal_texture, bool backface_culling,

View File

@ -30,5 +30,59 @@ extern const v3s16 g_26dirs[26];
// 26th is (0,0,0)
extern const v3s16 g_27dirs[27];
#endif
/// Direction in the 6D format. g_27dirs contains corresponding vectors.
/// Here P means Positive, N stands for Negative.
enum Direction6D {
// 0
D6D_ZP,
D6D_YP,
D6D_XP,
D6D_ZN,
D6D_YN,
D6D_XN,
// 6
D6D_XN_YP,
D6D_XP_YP,
D6D_YP_ZP,
D6D_YP_ZN,
D6D_XN_ZP,
D6D_XP_ZP,
D6D_XN_ZN,
D6D_XP_ZN,
D6D_XN_YN,
D6D_XP_YN,
D6D_YN_ZP,
D6D_YN_ZN,
// 18
D6D_XN_YP_ZP,
D6D_XP_YP_ZP,
D6D_XN_YP_ZN,
D6D_XP_YP_ZN,
D6D_XN_YN_ZP,
D6D_XP_YN_ZP,
D6D_XN_YN_ZN,
D6D_XP_YN_ZN,
// 26
D6D,
// aliases
D6D_BACK = D6D_ZP,
D6D_TOP = D6D_YP,
D6D_RIGHT = D6D_XP,
D6D_FRONT = D6D_ZN,
D6D_BOTTOM = D6D_YN,
D6D_LEFT = D6D_XN,
};
/// Direction in the wallmounted format.
/// P is Positive, N is Negative.
enum DirectionWallmounted {
DWM_YP,
DWM_YN,
DWM_XP,
DWM_XN,
DWM_ZP,
DWM_ZN,
};
#endif