Expand Up
@@ -30,6 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include " shader.h"
#include " settings.h"
#include " util/directiontables.h"
#include < IMeshManipulator.h>
static void applyFacesShading (video::SColor& color, float factor)
{
Expand Down
Expand Up
@@ -1028,6 +1029,8 @@ static void updateAllFastFaceRows(MeshMakeData *data,
MapBlockMesh::MapBlockMesh (MeshMakeData *data, v3s16 camera_offset):
m_mesh(new scene::SMesh()),
m_gamedef(data->m_gamedef),
m_tsrc(m_gamedef->getTextureSource ()),
m_shdrsrc(m_gamedef->getShaderSource ()),
m_animation_force_timer(0 ), // force initial animation
m_last_crack(-1 ),
m_crack_materials(),
Expand Down
Expand Up
@@ -1063,7 +1066,7 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
Convert FastFaces to MeshCollector
*/
MeshCollector collector;
MeshCollector collector (m_enable_shaders) ;
{
// avg 0ms (100ms spikes when loading textures the first time)
Expand Down
Expand Up
@@ -1110,8 +1113,6 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
/*
Convert MeshCollector to SMesh
*/
ITextureSource *tsrc = m_gamedef->tsrc ();
IShaderSource *shdrsrc = m_gamedef->getShaderSource ();
for (u32 i = 0 ; i < collector.prebuffers .size (); i++)
{
Expand All
@@ -1123,13 +1124,13 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
{
// Find the texture name plus ^[crack:N:
std::ostringstream os (std::ios::binary);
os<<tsrc ->getTextureName (p.tile .texture_id )<<" ^[crack" ;
os<<m_tsrc ->getTextureName (p.tile .texture_id )<<" ^[crack" ;
if (p.tile .material_flags & MATERIAL_FLAG_CRACK_OVERLAY)
os<<" o" ; // use ^[cracko
os<<" :" <<(u32)p.tile .animation_frame_count <<" :" ;
m_crack_materials.insert (std::make_pair (i, os.str ()));
// Replace tile texture with the cracked one
p.tile .texture = tsrc ->getTextureForMesh (
p.tile .texture = m_tsrc ->getTextureForMesh (
os.str ()+" 0" ,
&p.tile .texture_id );
}
Expand All
@@ -1155,23 +1156,28 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
if (m_enable_highlighting && p.tile .material_flags & MATERIAL_FLAG_HIGHLIGHTED)
m_highlighted_materials.push_back (i);
for (u32 j = 0 ; j < p.vertices .size (); j++)
u32 pitch = p.getVertexPitch ();
u32 vertex_count = p.getVertexCount ();
u8 *vertices = p.getVertices ();
for (u32 j = 0 ; j < vertex_count; j++)
{
video::S3DVertex *vertex = ((video::S3DVertex *)(vertices + j * pitch));
// Note applyFacesShading second parameter is precalculated sqrt
// value for speed improvement
// Skip it for lightsources and top faces.
video::SColor &vc = p. vertices [j]. Color ;
video::SColor &vc = vertex-> Color ;
if (!vc.getBlue ()) {
if (p. vertices [j]. Normal .Y < -0.5 ) {
if (vertex-> Normal .Y < -0.5 ) {
applyFacesShading (vc, 0.447213 );
} else if (p. vertices [j]. Normal .X > 0.5 ) {
} else if (vertex-> Normal .X > 0.5 ) {
applyFacesShading (vc, 0.670820 );
} else if (p. vertices [j]. Normal .X < -0.5 ) {
} else if (vertex-> Normal .X < -0.5 ) {
applyFacesShading (vc, 0.670820 );
} else if (p. vertices [j]. Normal .Z > 0.5 ) {
} else if (vertex-> Normal .Z > 0.5 ) {
applyFacesShading (vc, 0.836660 );
} else if (p. vertices [j]. Normal .Z < -0.5 ) {
} else if (vertex-> Normal .Z < -0.5 ) {
applyFacesShading (vc, 0.836660 );
}
}
Expand Down
Expand Up
@@ -1199,31 +1205,41 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
material.MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;
} else {
if (m_enable_shaders) {
material.MaterialType = shdrsrc ->getShaderInfo (p.tile .shader_id ).material ;
material.MaterialType = m_shdrsrc ->getShaderInfo (p.tile .shader_id ).material ;
p.tile .applyMaterialOptionsWithShaders (material);
if (p.tile .normal_texture ) {
material.setTexture (1 , p.tile .normal_texture );
material.setTexture (2 , tsrc ->getTextureForMesh (" enable_img.png" ));
material.setTexture (2 , m_tsrc ->getTextureForMesh (" enable_img.png" ));
} else {
material.setTexture (2 , tsrc ->getTextureForMesh (" disable_img.png" ));
material.setTexture (2 , m_tsrc ->getTextureForMesh (" disable_img.png" ));
}
} else {
p.tile .applyMaterialOptions (material);
}
}
// Create meshbuffer
// This is a "Standard MeshBuffer",
// it's a typedeffed CMeshBuffer<video::S3DVertex>
scene::SMeshBuffer *buf = new scene::SMeshBuffer ();
// Set material
buf->Material = material;
// Add to mesh
m_mesh->addMeshBuffer (buf);
// Mesh grabbed it
buf->drop ();
buf->append (&p.vertices [0 ], p.vertices .size (),
if (m_enable_shaders) {
scene::SMeshBufferTangents *buf = new scene::SMeshBufferTangents ();
// Set material
buf->Material = material;
// Add to mesh
m_mesh->addMeshBuffer (buf);
// Mesh grabbed it
buf->drop ();
buf->append (&p.tangent_vertices [0 ], p.tangent_vertices .size (),
&p.indices [0 ], p.indices .size ());
} else {
scene::SMeshBuffer *buf = new scene::SMeshBuffer ();
// Set material
buf->Material = material;
// Add to mesh
m_mesh->addMeshBuffer (buf);
// Mesh grabbed it
buf->drop ();
buf->append (&p.vertices [0 ], p.vertices .size (),
&p.indices [0 ], p.indices .size ());
}
}
m_camera_offset = camera_offset;
Expand All
@@ -1234,6 +1250,11 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data, v3s16 camera_offset):
translateMesh (m_mesh, intToFloat (data->m_blockpos * MAP_BLOCKSIZE - camera_offset, BS));
if (m_enable_shaders) {
scene::IMeshManipulator* meshmanip = m_gamedef->getSceneManager ()->getMeshManipulator ();
meshmanip->recalculateTangents (m_mesh, true , false , false );
}
if (m_mesh)
{
#if 0
Expand Down
Expand Up
@@ -1272,7 +1293,6 @@ MapBlockMesh::~MapBlockMesh()
bool MapBlockMesh::animate (bool faraway, float time, int crack, u32 daynight_ratio)
{
if (!m_has_animation)
{
m_animation_force_timer = 100000 ;
Expand All
@@ -1292,12 +1312,11 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
std::string basename = i->second ;
// Create new texture name from original
ITextureSource *tsrc = m_gamedef->getTextureSource ();
std::ostringstream os;
os<<basename<<crack;
u32 new_texture_id = 0 ;
video::ITexture *new_texture =
tsrc ->getTextureForMesh (os.str (), &new_texture_id);
m_tsrc ->getTextureForMesh (os.str (), &new_texture_id);
buf->getMaterial ().setTexture (0 , new_texture);
// If the current material is also animated,
Expand Down
Expand Up
@@ -1333,16 +1352,15 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
m_animation_frames[i->first ] = frame;
scene::IMeshBuffer *buf = m_mesh->getMeshBuffer (i->first );
ITextureSource *tsrc = m_gamedef->getTextureSource ();
FrameSpec animation_frame = tile.frames [frame];
buf->getMaterial ().setTexture (0 , animation_frame.texture );
if (m_enable_shaders) {
if (animation_frame.normal_texture ) {
buf->getMaterial ().setTexture (1 , animation_frame.normal_texture );
buf->getMaterial ().setTexture (2 , tsrc ->getTextureForMesh (" enable_img.png" ));
buf->getMaterial ().setTexture (2 , m_tsrc ->getTextureForMesh (" enable_img.png" ));
} else {
buf->getMaterial ().setTexture (2 , tsrc ->getTextureForMesh (" disable_img.png" ));
buf->getMaterial ().setTexture (2 , m_tsrc ->getTextureForMesh (" disable_img.png" ));
}
}
}
Expand All
@@ -1355,15 +1373,16 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
i != m_daynight_diffs.end (); i++)
{
scene::IMeshBuffer *buf = m_mesh->getMeshBuffer (i->first );
video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices ();
const u32 stride = getVertexPitchFromType (buf->getVertexType ());
u8 *vertices = (u8 *)buf->getVertices ();
for (std::map<u32, std::pair<u8, u8 > >::iterator
j = i->second .begin ();
j != i->second .end (); j++)
{
u32 vertexIndex = j->first ;
u8 day = j->second .first ;
u8 night = j->second .second ;
finalColorBlend (vertices[ vertexIndex]. Color ,
finalColorBlend (((video::S3DVertex *)( vertices + vertexIndex * stride))-> Color ,
day, night, daynight_ratio);
}
}
Expand All
@@ -1388,9 +1407,10 @@ bool MapBlockMesh::animate(bool faraway, float time, int crack, u32 daynight_rat
i != m_highlighted_materials.end (); i++)
{
scene::IMeshBuffer *buf = m_mesh->getMeshBuffer (*i);
video::S3DVertex *vertices = (video::S3DVertex*)buf->getVertices ();
const u32 stride = getVertexPitchFromType (buf->getVertexType ());
u8 *vertices = (u8 *)buf->getVertices ();
for (u32 j = 0 ; j < buf->getVertexCount () ;j++)
vertices[j]. Color = hc;
((video::S3DVertex *)( vertices + j * stride))-> Color = hc;
}
}
Expand All
@@ -1409,47 +1429,62 @@ void MapBlockMesh::updateCameraOffset(v3s16 camera_offset)
MeshCollector
*/
MeshCollector::MeshCollector (bool enable_shaders):
m_enable_shaders(enable_shaders)
{
}
MeshCollector::~MeshCollector ()
{
}
void MeshCollector::append (const TileSpec &tile,
const video::S3DVertex *vertices, u32 numVertices,
const u16 *indices, u32 numIndices)
{
if (numIndices > 65535 )
{
if (numIndices > 65535 ) {
dstream<<" FIXME: MeshCollector::append() called with numIndices=" <<numIndices<<" (limit 65535)" <<std::endl;
return ;
}
PreMeshBuffer *p = NULL ;
for (u32 i=0 ; i<prebuffers.size (); i++)
{
for (u32 i = 0 ; i < prebuffers.size (); i++) {
PreMeshBuffer &pp = prebuffers[i];
if (pp.tile != tile)
if (pp.tile != tile)
continue ;
if (pp.indices .size () + numIndices > 65535 )
if (pp.indices .size () + numIndices > 65535 )
continue ;
p = &pp;
break ;
}
if (p == NULL )
{
PreMeshBuffer pp;
if (p == NULL ) {
PreMeshBuffer pp (m_enable_shaders);
pp.tile = tile;
prebuffers.push_back (pp);
p = &prebuffers[prebuffers.size ()- 1 ];
p = &prebuffers[prebuffers.size () - 1 ];
}
u32 vertex_count = p->vertices .size ();
for (u32 i=0 ; i<numIndices; i++)
{
u32 vertex_count;
if (m_enable_shaders) {
vertex_count = p->tangent_vertices .size ();
for (u32 i = 0 ; i < numVertices; i++) {
video::S3DVertexTangents vert (vertices[i].Pos , vertices[i].Normal ,
vertices[i].Color , vertices[i].TCoords );
p->tangent_vertices .push_back (vert);
}
} else {
vertex_count = p->vertices .size ();
for (u32 i = 0 ; i < numVertices; i++) {
video::S3DVertex vert (vertices[i].Pos , vertices[i].Normal ,
vertices[i].Color , vertices[i].TCoords );
p->vertices .push_back (vert);
}
}
for (u32 i = 0 ; i < numIndices; i++) {
u32 j = indices[i] + vertex_count;
p->indices .push_back (j);
}
for (u32 i=0 ; i<numVertices; i++)
{
p->vertices .push_back (vertices[i]);
}
}
/*
Expand All
@@ -1461,15 +1496,13 @@ void MeshCollector::append(const TileSpec &tile,
const u16 *indices, u32 numIndices,
v3f pos, video::SColor c)
{
if (numIndices > 65535 )
{
if (numIndices > 65535 ) {
dstream<<" FIXME: MeshCollector::append() called with numIndices=" <<numIndices<<" (limit 65535)" <<std::endl;
return ;
}
PreMeshBuffer *p = NULL ;
for (u32 i=0 ; i<prebuffers.size (); i++)
{
for (u32 i = 0 ; i < prebuffers.size (); i++) {
PreMeshBuffer &pp = prebuffers[i];
if (pp.tile != tile)
continue ;
Expand All
@@ -1480,25 +1513,31 @@ void MeshCollector::append(const TileSpec &tile,
break ;
}
if (p == NULL )
{
PreMeshBuffer pp;
if (p == NULL ) {
PreMeshBuffer pp (m_enable_shaders);
pp.tile = tile;
prebuffers.push_back (pp);
p = &prebuffers[prebuffers.size ()- 1 ];
p = &prebuffers[prebuffers.size () - 1 ];
}
u32 vertex_count = p->vertices .size ();
for (u32 i=0 ; i<numIndices; i++)
{
u32 vertex_count;
if (m_enable_shaders) {
vertex_count = p->tangent_vertices .size ();
for (u32 i = 0 ; i < numVertices; i++) {
video::S3DVertexTangents vert (vertices[i].Pos + pos, vertices[i].Normal ,
c, vertices[i].TCoords );
p->tangent_vertices .push_back (vert);
}
} else {
vertex_count = p->vertices .size ();
for (u32 i = 0 ; i < numVertices; i++) {
video::S3DVertex vert (vertices[i].Pos + pos, vertices[i].Normal ,
c, vertices[i].TCoords );
p->vertices .push_back (vert);
}
}
for (u32 i = 0 ; i < numIndices; i++) {
u32 j = indices[i] + vertex_count;
p->indices .push_back (j);
}
for (u32 i=0 ; i<numVertices; i++)
{
video::S3DVertex vert = vertices[i];
vert.Pos += pos;
vert.Color = c;
p->vertices .push_back (vert);
}
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is it necessary to always do this if shaders are enabled? I was under the impression that tangents only needed to be calculated when parallax occlusion is enabled.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Wrong impression, see comment above.