#include "itemdef.h"
#ifndef SERVER
-#include "client/tile.h"
#include "mesh.h"
#include "client.h"
+#include "client/renderingengine.h"
+#include "client/tile.h"
#include <IMeshManipulator.h>
#endif
#include "log.h"
tile->material_flags &= ~MATERIAL_FLAG_ANIMATION;
} else {
std::ostringstream os(std::ios::binary);
- tile->frames.resize(frame_count);
+ if (!tile->frames) {
+ tile->frames = std::make_shared<std::vector<FrameSpec>>();
+ }
+ tile->frames->resize(frame_count);
for (int i = 0; i < frame_count; i++) {
if (tile->normal_texture)
frame.normal_texture = tsrc->getNormalTexture(os.str());
frame.flags_texture = tile->flags_texture;
- tile->frames[i] = frame;
+ (*tile->frames)[i] = frame;
}
}
}
switch (drawtype) {
default:
case NDT_NORMAL:
+ material_type = (alpha == 255) ?
+ TILE_MATERIAL_OPAQUE : TILE_MATERIAL_ALPHA;
solidness = 2;
break;
case NDT_AIRLIKE:
case NDT_RAILLIKE:
solidness = 0;
break;
+ case NDT_PLANTLIKE_ROOTED:
+ solidness = 2;
+ break;
}
if (is_liquid) {
TILE_MATERIAL_LIQUID_OPAQUE : TILE_MATERIAL_LIQUID_TRANSPARENT;
}
- u32 tile_shader[6];
- for (u16 j = 0; j < 6; j++) {
- tile_shader[j] = shdsrc->getShader("nodes_shader",
- material_type, drawtype);
- }
+ u32 tile_shader = shdsrc->getShader("nodes_shader", material_type, drawtype);
+
+ u8 overlay_material = material_type;
+ if (overlay_material == TILE_MATERIAL_OPAQUE)
+ overlay_material = TILE_MATERIAL_BASIC;
+ else if (overlay_material == TILE_MATERIAL_LIQUID_OPAQUE)
+ overlay_material = TILE_MATERIAL_LIQUID_TRANSPARENT;
+
+ u32 overlay_shader = shdsrc->getShader("nodes_shader", overlay_material, drawtype);
// Tiles (fill in f->tiles[])
for (u16 j = 0; j < 6; j++) {
- fillTileAttribs(tsrc, &tiles[j].layers[0], &tdef[j], tile_shader[j],
+ fillTileAttribs(tsrc, &tiles[j].layers[0], &tdef[j], tile_shader,
tsettings.use_normal_texture,
tdef[j].backface_culling, material_type);
if (tdef_overlay[j].name != "")
fillTileAttribs(tsrc, &tiles[j].layers[1], &tdef_overlay[j],
- tile_shader[j], tsettings.use_normal_texture,
- tdef[j].backface_culling, material_type);
+ overlay_shader, tsettings.use_normal_texture,
+ tdef[j].backface_culling, overlay_material);
+ }
+
+ u8 special_material = material_type;
+ if (drawtype == NDT_PLANTLIKE_ROOTED) {
+ if (waving == 1)
+ special_material = TILE_MATERIAL_WAVING_PLANTS;
+ else if (waving == 2)
+ special_material = TILE_MATERIAL_WAVING_LEAVES;
}
+ u32 special_shader = shdsrc->getShader("nodes_shader", special_material, drawtype);
// Special tiles (fill in f->special_tiles[])
for (u16 j = 0; j < CF_SPECIAL_COUNT; j++) {
fillTileAttribs(tsrc, &special_tiles[j].layers[0], &tdef_spec[j],
- tile_shader[j], tsettings.use_normal_texture,
- tdef_spec[j].backface_culling, material_type);
+ special_shader, tsettings.use_normal_texture,
+ tdef_spec[j].backface_culling, special_material);
}
if (param_type_2 == CPT2_COLOR ||
Client *client = (Client *)gamedef;
ITextureSource *tsrc = client->tsrc();
IShaderSource *shdsrc = client->getShaderSource();
- scene::ISceneManager* smgr = client->getSceneManager();
- scene::IMeshManipulator* meshmanip = smgr->getMeshManipulator();
+ scene::IMeshManipulator *meshmanip =
+ RenderingEngine::get_scene_manager()->getMeshManipulator();
TextureSettings tsettings;
tsettings.readSettings();
NodeResolver::NodeResolver()
{
- m_ndef = NULL;
- m_nodenames_idx = 0;
- m_nnlistsizes_idx = 0;
- m_resolve_done = false;
-
m_nodenames.reserve(16);
m_nnlistsizes.reserve(4);
}