Content_mapblock.cpp: Refactor
parent
e7246d3f0d
commit
d4e0c0f9b8
File diff suppressed because it is too large
Load Diff
|
@ -19,11 +19,129 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
|
||||||
#ifndef CONTENT_MAPBLOCK_HEADER
|
#ifndef CONTENT_MAPBLOCK_HEADER
|
||||||
#define CONTENT_MAPBLOCK_HEADER
|
#define CONTENT_MAPBLOCK_HEADER
|
||||||
|
#include "util/numeric.h"
|
||||||
|
#include "nodedef.h"
|
||||||
|
#include <IMeshManipulator.h>
|
||||||
|
|
||||||
struct MeshMakeData;
|
struct MeshMakeData;
|
||||||
struct MeshCollector;
|
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
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1108,7 +1108,10 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
|
||||||
- whatever
|
- whatever
|
||||||
*/
|
*/
|
||||||
|
|
||||||
mapblock_mesh_generate_special(data, collector);
|
{
|
||||||
|
MapblockMeshGenerator generator(data, &collector);
|
||||||
|
generator.generate();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Convert MeshCollector to SMesh
|
Convert MeshCollector to SMesh
|
||||||
|
|
|
@ -166,6 +166,19 @@ enum NodeDrawType
|
||||||
NDT_MESH, // Uses static meshes
|
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)
|
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);
|
return (liquid_alternative_flowing == f.liquid_alternative_flowing);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getGroup(const std::string &group) const
|
||||||
|
{
|
||||||
|
return itemgroup_get(groups, group);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef SERVER
|
#ifndef SERVER
|
||||||
void fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, TileDef *tiledef,
|
void fillTileAttribs(ITextureSource *tsrc, TileSpec *tile, TileDef *tiledef,
|
||||||
u32 shader_id, bool use_normal_texture, bool backface_culling,
|
u32 shader_id, bool use_normal_texture, bool backface_culling,
|
||||||
|
|
|
@ -30,5 +30,59 @@ extern const v3s16 g_26dirs[26];
|
||||||
// 26th is (0,0,0)
|
// 26th is (0,0,0)
|
||||||
extern const v3s16 g_27dirs[27];
|
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
|
||||||
|
|
Loading…
Reference in New Issue