in before messing with face drawing orientation
This commit is contained in:
parent
3ac2abb0b5
commit
626ed6338a
2
Makefile
2
Makefile
|
@ -2,7 +2,7 @@
|
||||||
# It's usually sufficient to change just the target name and source file list
|
# It's usually sufficient to change just the target name and source file list
|
||||||
# and be sure that CXX is set to a valid compiler
|
# and be sure that CXX is set to a valid compiler
|
||||||
TARGET = test
|
TARGET = test
|
||||||
SOURCE_FILES = voxel.cpp mapblockobject.cpp inventory.cpp debug.cpp serialization.cpp light.cpp filesys.cpp connection.cpp environment.cpp client.cpp server.cpp socket.cpp mapblock.cpp mapsector.cpp heightmap.cpp map.cpp player.cpp utility.cpp main.cpp test.cpp
|
SOURCE_FILES = mapnode.cpp tile.cpp voxel.cpp mapblockobject.cpp inventory.cpp debug.cpp serialization.cpp light.cpp filesys.cpp connection.cpp environment.cpp client.cpp server.cpp socket.cpp mapblock.cpp mapsector.cpp heightmap.cpp map.cpp player.cpp utility.cpp main.cpp test.cpp
|
||||||
SOURCES = $(addprefix src/, $(SOURCE_FILES))
|
SOURCES = $(addprefix src/, $(SOURCE_FILES))
|
||||||
OBJECTS = $(SOURCES:.cpp=.o)
|
OBJECTS = $(SOURCES:.cpp=.o)
|
||||||
FASTTARGET = fasttest
|
FASTTARGET = fasttest
|
||||||
|
|
BIN
data/mud.png
BIN
data/mud.png
Binary file not shown.
Before Width: | Height: | Size: 831 B After Width: | Height: | Size: 1.5 KiB |
BIN
data/tree.png
BIN
data/tree.png
Binary file not shown.
Before Width: | Height: | Size: 873 B After Width: | Height: | Size: 1.4 KiB |
|
@ -68,11 +68,10 @@ void * ClientUpdateThread::Thread()
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
Client::Client(IrrlichtDevice *device, video::SMaterial *materials,
|
Client::Client(IrrlichtDevice *device,
|
||||||
float delete_unused_sectors_timeout,
|
|
||||||
const char *playername):
|
const char *playername):
|
||||||
m_thread(this),
|
m_thread(this),
|
||||||
m_env(new ClientMap(this, materials,
|
m_env(new ClientMap(this,
|
||||||
device->getSceneManager()->getRootSceneNode(),
|
device->getSceneManager()->getRootSceneNode(),
|
||||||
device->getSceneManager(), 666),
|
device->getSceneManager(), 666),
|
||||||
dout_client),
|
dout_client),
|
||||||
|
@ -82,7 +81,6 @@ Client::Client(IrrlichtDevice *device, video::SMaterial *materials,
|
||||||
camera_direction(0,0,1),
|
camera_direction(0,0,1),
|
||||||
m_server_ser_ver(SER_FMT_VER_INVALID),
|
m_server_ser_ver(SER_FMT_VER_INVALID),
|
||||||
m_step_dtime(0.0),
|
m_step_dtime(0.0),
|
||||||
m_delete_unused_sectors_timeout(delete_unused_sectors_timeout),
|
|
||||||
m_inventory_updated(false)
|
m_inventory_updated(false)
|
||||||
{
|
{
|
||||||
//m_fetchblock_mutex.Init();
|
//m_fetchblock_mutex.Init();
|
||||||
|
@ -194,14 +192,17 @@ void Client::step(float dtime)
|
||||||
|
|
||||||
core::list<v3s16> deleted_blocks;
|
core::list<v3s16> deleted_blocks;
|
||||||
|
|
||||||
|
float delete_unused_sectors_timeout =
|
||||||
|
g_settings.getFloat("client_delete_unused_sectors_timeout");
|
||||||
|
|
||||||
// Delete sector blocks
|
// Delete sector blocks
|
||||||
/*u32 num = m_env.getMap().deleteUnusedSectors
|
/*u32 num = m_env.getMap().deleteUnusedSectors
|
||||||
(m_delete_unused_sectors_timeout,
|
(delete_unused_sectors_timeout,
|
||||||
true, &deleted_blocks);*/
|
true, &deleted_blocks);*/
|
||||||
|
|
||||||
// Delete whole sectors
|
// Delete whole sectors
|
||||||
u32 num = m_env.getMap().deleteUnusedSectors
|
u32 num = m_env.getMap().deleteUnusedSectors
|
||||||
(m_delete_unused_sectors_timeout,
|
(delete_unused_sectors_timeout,
|
||||||
false, &deleted_blocks);
|
false, &deleted_blocks);
|
||||||
|
|
||||||
if(num > 0)
|
if(num > 0)
|
||||||
|
|
|
@ -152,9 +152,7 @@ public:
|
||||||
/*
|
/*
|
||||||
NOTE: Every public method should be thread-safe
|
NOTE: Every public method should be thread-safe
|
||||||
*/
|
*/
|
||||||
Client(IrrlichtDevice *device, video::SMaterial *materials,
|
Client(IrrlichtDevice *device, const char *playername);
|
||||||
float delete_unused_sectors_timeout,
|
|
||||||
const char *playername);
|
|
||||||
~Client();
|
~Client();
|
||||||
/*
|
/*
|
||||||
The name of the local player should already be set when
|
The name of the local player should already be set when
|
||||||
|
@ -280,8 +278,6 @@ private:
|
||||||
float m_step_dtime;
|
float m_step_dtime;
|
||||||
JMutex m_step_dtime_mutex;
|
JMutex m_step_dtime_mutex;
|
||||||
|
|
||||||
float m_delete_unused_sectors_timeout;
|
|
||||||
|
|
||||||
// This is behind m_env_mutex.
|
// This is behind m_env_mutex.
|
||||||
bool m_inventory_updated;
|
bool m_inventory_updated;
|
||||||
|
|
||||||
|
|
|
@ -86,7 +86,8 @@ public:
|
||||||
}
|
}
|
||||||
video::ITexture * getImage()
|
video::ITexture * getImage()
|
||||||
{
|
{
|
||||||
return g_materials[m_material].getTexture(0);
|
u16 tile = content_tile(m_material, v3s16(1,0,0));
|
||||||
|
return g_tile_materials[tile].getTexture(0);
|
||||||
}
|
}
|
||||||
std::string getText()
|
std::string getText()
|
||||||
{
|
{
|
||||||
|
|
38
src/main.cpp
38
src/main.cpp
|
@ -253,7 +253,7 @@ TODO: A mapper to map contents to tile names (for each side)
|
||||||
|
|
||||||
IrrlichtDevice *g_device = NULL;
|
IrrlichtDevice *g_device = NULL;
|
||||||
|
|
||||||
const char *g_content_filenames[MATERIALS_COUNT] =
|
/*const char *g_content_filenames[MATERIALS_COUNT] =
|
||||||
{
|
{
|
||||||
"../data/stone.png",
|
"../data/stone.png",
|
||||||
"../data/grass.png",
|
"../data/grass.png",
|
||||||
|
@ -268,7 +268,7 @@ const char *g_content_filenames[MATERIALS_COUNT] =
|
||||||
};
|
};
|
||||||
|
|
||||||
// Material cache
|
// Material cache
|
||||||
video::SMaterial g_materials[MATERIALS_COUNT];
|
video::SMaterial g_materials[MATERIALS_COUNT];*/
|
||||||
|
|
||||||
// Texture cache
|
// Texture cache
|
||||||
TextureCache g_texturecache;
|
TextureCache g_texturecache;
|
||||||
|
@ -1293,7 +1293,7 @@ int main(int argc, char *argv[])
|
||||||
Initialize material array
|
Initialize material array
|
||||||
*/
|
*/
|
||||||
|
|
||||||
//video::SMaterial g_materials[MATERIALS_COUNT];
|
/*//video::SMaterial g_materials[MATERIALS_COUNT];
|
||||||
for(u16 i=0; i<MATERIALS_COUNT; i++)
|
for(u16 i=0; i<MATERIALS_COUNT; i++)
|
||||||
{
|
{
|
||||||
g_materials[i].Lighting = false;
|
g_materials[i].Lighting = false;
|
||||||
|
@ -1318,6 +1318,7 @@ int main(int argc, char *argv[])
|
||||||
g_materials[CONTENT_WATER].MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
|
g_materials[CONTENT_WATER].MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
|
||||||
//g_materials[CONTENT_WATER].MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;
|
//g_materials[CONTENT_WATER].MaterialType = video::EMT_TRANSPARENT_ADD_COLOR;
|
||||||
g_materials[CONTENT_OCEAN].MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
|
g_materials[CONTENT_OCEAN].MaterialType = video::EMT_TRANSPARENT_VERTEX_ALPHA;
|
||||||
|
*/
|
||||||
|
|
||||||
/*g_mesh_materials[0].setTexture(0, driver->getTexture("../data/water.png"));
|
/*g_mesh_materials[0].setTexture(0, driver->getTexture("../data/water.png"));
|
||||||
g_mesh_materials[1].setTexture(0, driver->getTexture("../data/grass.png"));
|
g_mesh_materials[1].setTexture(0, driver->getTexture("../data/grass.png"));
|
||||||
|
@ -1338,6 +1339,23 @@ int main(int argc, char *argv[])
|
||||||
g_texturecache.set("torch_on_floor", driver->getTexture("../data/torch_on_floor.png"));
|
g_texturecache.set("torch_on_floor", driver->getTexture("../data/torch_on_floor.png"));
|
||||||
g_texturecache.set("torch_on_ceiling", driver->getTexture("../data/torch_on_ceiling.png"));
|
g_texturecache.set("torch_on_ceiling", driver->getTexture("../data/torch_on_ceiling.png"));
|
||||||
|
|
||||||
|
/*
|
||||||
|
Load tile textures
|
||||||
|
*/
|
||||||
|
for(s32 i=0; i<TILES_COUNT; i++)
|
||||||
|
{
|
||||||
|
if(g_tile_texture_names[i] == NULL)
|
||||||
|
continue;
|
||||||
|
std::string name = g_tile_texture_names[i];
|
||||||
|
std::string filename;
|
||||||
|
filename += "../data/";
|
||||||
|
filename += name;
|
||||||
|
filename += ".png";
|
||||||
|
g_texturecache.set(name, driver->getTexture(filename.c_str()));
|
||||||
|
}
|
||||||
|
|
||||||
|
tile_materials_preload(g_texturecache);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Make a scope here for the client so that it gets removed
|
Make a scope here for the client so that it gets removed
|
||||||
before the irrlicht device
|
before the irrlicht device
|
||||||
|
@ -1359,10 +1377,7 @@ int main(int argc, char *argv[])
|
||||||
Create client
|
Create client
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// TODO: Get rid of the g_materials parameter or it's globalness
|
Client client(device, playername);
|
||||||
Client client(device, g_materials,
|
|
||||||
g_settings.getFloat("client_delete_unused_sectors_timeout"),
|
|
||||||
playername);
|
|
||||||
|
|
||||||
Address connect_address(0,0,0,0, port);
|
Address connect_address(0,0,0,0, port);
|
||||||
try{
|
try{
|
||||||
|
@ -1396,19 +1411,14 @@ int main(int argc, char *argv[])
|
||||||
/*
|
/*
|
||||||
Create skybox
|
Create skybox
|
||||||
*/
|
*/
|
||||||
scene::ISceneNode* skybox = smgr->addSkyBoxSceneNode(
|
scene::ISceneNode* skybox;
|
||||||
|
skybox = smgr->addSkyBoxSceneNode(
|
||||||
driver->getTexture("../data/skybox2.png"),
|
driver->getTexture("../data/skybox2.png"),
|
||||||
driver->getTexture("../data/skybox3.png"),
|
driver->getTexture("../data/skybox3.png"),
|
||||||
driver->getTexture("../data/skybox1.png"),
|
driver->getTexture("../data/skybox1.png"),
|
||||||
driver->getTexture("../data/skybox1.png"),
|
driver->getTexture("../data/skybox1.png"),
|
||||||
driver->getTexture("../data/skybox1.png"),
|
driver->getTexture("../data/skybox1.png"),
|
||||||
driver->getTexture("../data/skybox1.png"));
|
driver->getTexture("../data/skybox1.png"));
|
||||||
/* driver->getTexture("../data/irrlicht2_up.jpg"),
|
|
||||||
driver->getTexture("../data/irrlicht2_dn.jpg"),
|
|
||||||
driver->getTexture("../data/irrlicht2_lf.jpg"),
|
|
||||||
driver->getTexture("../data/irrlicht2_rt.jpg"),
|
|
||||||
driver->getTexture("../data/irrlicht2_ft.jpg"),
|
|
||||||
driver->getTexture("../data/irrlicht2_bk.jpg"));*/
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Create the camera node
|
Create the camera node
|
||||||
|
|
|
@ -53,8 +53,8 @@ extern std::ostream *derr_server_ptr;
|
||||||
|
|
||||||
// TODO: Move somewhere else? materials.h?
|
// TODO: Move somewhere else? materials.h?
|
||||||
// This header is only for MATERIALS_COUNT
|
// This header is only for MATERIALS_COUNT
|
||||||
#include "mapnode.h"
|
//#include "mapnode.h"
|
||||||
extern video::SMaterial g_materials[MATERIALS_COUNT];
|
//extern video::SMaterial g_materials[MATERIALS_COUNT];
|
||||||
|
|
||||||
#include "utility.h"
|
#include "utility.h"
|
||||||
extern TextureCache g_texturecache;
|
extern TextureCache g_texturecache;
|
||||||
|
|
196
src/map.cpp
196
src/map.cpp
|
@ -1504,7 +1504,8 @@ MapSector * ServerMap::emergeSector(v2s16 p2d)
|
||||||
sector->setHeightmap(p_in_sector, hm);
|
sector->setHeightmap(p_in_sector, hm);
|
||||||
|
|
||||||
//TODO: Make these values configurable
|
//TODO: Make these values configurable
|
||||||
hm->generateContinued(0.0, 0.0, corners);
|
//hm->generateContinued(0.0, 0.0, corners);
|
||||||
|
hm->generateContinued(0.5, 0.2, corners);
|
||||||
//hm->generateContinued(1.0, 0.2, corners);
|
//hm->generateContinued(1.0, 0.2, corners);
|
||||||
//hm->generateContinued(2.0, 0.2, corners);
|
//hm->generateContinued(2.0, 0.2, corners);
|
||||||
|
|
||||||
|
@ -2755,7 +2756,6 @@ void ServerMap::PrintInfo(std::ostream &out)
|
||||||
|
|
||||||
ClientMap::ClientMap(
|
ClientMap::ClientMap(
|
||||||
Client *client,
|
Client *client,
|
||||||
video::SMaterial *materials,
|
|
||||||
scene::ISceneNode* parent,
|
scene::ISceneNode* parent,
|
||||||
scene::ISceneManager* mgr,
|
scene::ISceneManager* mgr,
|
||||||
s32 id
|
s32 id
|
||||||
|
@ -2763,7 +2763,6 @@ ClientMap::ClientMap(
|
||||||
Map(dout_client),
|
Map(dout_client),
|
||||||
scene::ISceneNode(parent, mgr, id),
|
scene::ISceneNode(parent, mgr, id),
|
||||||
m_client(client),
|
m_client(client),
|
||||||
m_materials(materials),
|
|
||||||
mesh(NULL)
|
mesh(NULL)
|
||||||
{
|
{
|
||||||
/*m_box = core::aabbox3d<f32>(0,0,0,
|
/*m_box = core::aabbox3d<f32>(0,0,0,
|
||||||
|
@ -2837,8 +2836,7 @@ void ClientMap::deSerializeSector(v2s16 p2d, std::istream &is)
|
||||||
sector->deSerialize(is);
|
sector->deSerialize(is);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientMap::renderMap(video::IVideoDriver* driver,
|
void ClientMap::renderMap(video::IVideoDriver* driver, s32 pass)
|
||||||
video::SMaterial *materials, s32 pass)
|
|
||||||
{
|
{
|
||||||
//m_dout<<DTIME<<"Rendering map..."<<std::endl;
|
//m_dout<<DTIME<<"Rendering map..."<<std::endl;
|
||||||
DSTACK(__FUNCTION_NAME);
|
DSTACK(__FUNCTION_NAME);
|
||||||
|
@ -3037,193 +3035,7 @@ void ClientMap::renderMap(video::IVideoDriver* driver,
|
||||||
|
|
||||||
void ClientMap::updateMesh()
|
void ClientMap::updateMesh()
|
||||||
{
|
{
|
||||||
#if 0
|
//TODO: Remove this
|
||||||
DSTACK(__FUNCTION_NAME);
|
|
||||||
//TODO
|
|
||||||
/*
|
|
||||||
Check what sectors don't draw anything useful at ground level
|
|
||||||
and create a mesh of the rough heightmap at those positions.
|
|
||||||
*/
|
|
||||||
|
|
||||||
m_camera_mutex.Lock();
|
|
||||||
v3f camera_position = m_camera_position;
|
|
||||||
v3f camera_direction = m_camera_direction;
|
|
||||||
m_camera_mutex.Unlock();
|
|
||||||
|
|
||||||
v3s16 cam_pos_nodes(
|
|
||||||
camera_position.X / BS,
|
|
||||||
camera_position.Y / BS,
|
|
||||||
camera_position.Z / BS);
|
|
||||||
|
|
||||||
v3s16 box_nodes_d = HEIGHTMAP_RANGE_NODES * v3s16(1,1,1);
|
|
||||||
|
|
||||||
v3s16 p_nodes_min = cam_pos_nodes - box_nodes_d;
|
|
||||||
v3s16 p_nodes_max = cam_pos_nodes + box_nodes_d;
|
|
||||||
|
|
||||||
// Take a fair amount as we will be dropping more out later
|
|
||||||
v3s16 p_blocks_min(
|
|
||||||
p_nodes_min.X / MAP_BLOCKSIZE - 1,
|
|
||||||
p_nodes_min.Y / MAP_BLOCKSIZE - 1,
|
|
||||||
p_nodes_min.Z / MAP_BLOCKSIZE - 1);
|
|
||||||
v3s16 p_blocks_max(
|
|
||||||
p_nodes_max.X / MAP_BLOCKSIZE + 1,
|
|
||||||
p_nodes_max.Y / MAP_BLOCKSIZE + 1,
|
|
||||||
p_nodes_max.Z / MAP_BLOCKSIZE + 1);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Initialize new mesh
|
|
||||||
*/
|
|
||||||
|
|
||||||
scene::SMesh *mesh_new = new scene::SMesh();
|
|
||||||
//scene::IMeshBuffer *buf = NULL;
|
|
||||||
scene::SMeshBuffer *buf = NULL;
|
|
||||||
|
|
||||||
u8 material_in_use = 0;
|
|
||||||
|
|
||||||
/*
|
|
||||||
Loop through sectors
|
|
||||||
*/
|
|
||||||
|
|
||||||
for(core::map<v2s16, MapSector*>::Iterator
|
|
||||||
si = m_sectors.getIterator();
|
|
||||||
si.atEnd() == false; si++)
|
|
||||||
{
|
|
||||||
MapSector *sector = si.getNode()->getValue();
|
|
||||||
|
|
||||||
if(sector->getId() != MAPSECTOR_CLIENT)
|
|
||||||
{
|
|
||||||
dstream<<"WARNING: Client has a non-client sector"
|
|
||||||
<<std::endl;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ClientMapSector *cs = (ClientMapSector*)sector;
|
|
||||||
|
|
||||||
v2s16 sp = sector->getPos();
|
|
||||||
|
|
||||||
if(sp.X < p_blocks_min.X
|
|
||||||
|| sp.X > p_blocks_max.X
|
|
||||||
|| sp.Y < p_blocks_min.Z
|
|
||||||
|| sp.Y > p_blocks_max.Z)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
/*
|
|
||||||
Get some ground level info
|
|
||||||
*/
|
|
||||||
|
|
||||||
s16 a = -5;
|
|
||||||
|
|
||||||
s16 cn[4] =
|
|
||||||
{
|
|
||||||
cs->getCorner(0)+a,
|
|
||||||
cs->getCorner(1)+a,
|
|
||||||
cs->getCorner(2)+a,
|
|
||||||
cs->getCorner(3)+a,
|
|
||||||
};
|
|
||||||
s16 cn_avg = (cn[0]+cn[1]+cn[2]+cn[3])/4;
|
|
||||||
s16 cn_min = 32767;
|
|
||||||
s16 cn_max = -32768;
|
|
||||||
for(s16 i=0; i<4; i++)
|
|
||||||
{
|
|
||||||
if(cn[i] < cn_min)
|
|
||||||
cn_min = cn[i];
|
|
||||||
if(cn[i] > cn_max)
|
|
||||||
cn_max = cn[i];
|
|
||||||
}
|
|
||||||
s16 cn_slope = cn_max - cn_min;
|
|
||||||
|
|
||||||
/*
|
|
||||||
Generate this part of the heightmap mesh
|
|
||||||
*/
|
|
||||||
|
|
||||||
u8 material;
|
|
||||||
if(cn_avg + MAP_BLOCKSIZE/4 <= WATER_LEVEL)
|
|
||||||
material = 0;
|
|
||||||
else if(cn_slope <= MAP_BLOCKSIZE)
|
|
||||||
material = 1;
|
|
||||||
else
|
|
||||||
material = 2;
|
|
||||||
|
|
||||||
if(material != material_in_use || buf == NULL)
|
|
||||||
{
|
|
||||||
// Try to get a meshbuffer associated with the material
|
|
||||||
buf = (scene::SMeshBuffer*)mesh_new->getMeshBuffer
|
|
||||||
(g_mesh_materials[material]);
|
|
||||||
// If not found, create one
|
|
||||||
if(buf == NULL)
|
|
||||||
{
|
|
||||||
// This is a "Standard MeshBuffer",
|
|
||||||
// it's a typedeffed CMeshBuffer<video::S3DVertex>
|
|
||||||
buf = new scene::SMeshBuffer();
|
|
||||||
|
|
||||||
// Set material
|
|
||||||
buf->Material = g_mesh_materials[material];
|
|
||||||
// Use VBO
|
|
||||||
//buf->setHardwareMappingHint(scene::EHM_STATIC);
|
|
||||||
// Add to mesh
|
|
||||||
mesh_new->addMeshBuffer(buf);
|
|
||||||
// Mesh grabbed it
|
|
||||||
buf->drop();
|
|
||||||
}
|
|
||||||
material_in_use = material;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sector side width in floating-point units
|
|
||||||
f32 sd = BS * MAP_BLOCKSIZE;
|
|
||||||
// Sector position in global floating-point units
|
|
||||||
v3f spf = v3f((f32)sp.X, 0, (f32)sp.Y) * sd;
|
|
||||||
|
|
||||||
//video::SColor c(255,255,255,255);
|
|
||||||
u8 cc = 180;
|
|
||||||
video::SColor c(255,cc,cc,cc);
|
|
||||||
|
|
||||||
video::S3DVertex vertices[4] =
|
|
||||||
{
|
|
||||||
video::S3DVertex(spf.X, (f32)BS*cn[0],spf.Z, 0,0,0, c, 0,1),
|
|
||||||
video::S3DVertex(spf.X+sd,(f32)BS*cn[1],spf.Z, 0,0,0, c, 1,1),
|
|
||||||
video::S3DVertex(spf.X+sd,(f32)BS*cn[2],spf.Z+sd,0,0,0, c, 1,0),
|
|
||||||
video::S3DVertex(spf.X, (f32)BS*cn[3],spf.Z+sd,0,0,0, c, 0,0),
|
|
||||||
};
|
|
||||||
u16 indices[] = {0,1,2,2,3,0};
|
|
||||||
|
|
||||||
buf->append(vertices, 4, indices, 6);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Set VBO on
|
|
||||||
//mesh_new->setHardwareMappingHint(scene::EHM_STATIC);
|
|
||||||
|
|
||||||
/*
|
|
||||||
Replace the mesh
|
|
||||||
*/
|
|
||||||
|
|
||||||
mesh_mutex.Lock();
|
|
||||||
|
|
||||||
scene::SMesh *mesh_old = mesh;
|
|
||||||
|
|
||||||
//DEBUG
|
|
||||||
/*mesh = NULL;
|
|
||||||
mesh_new->drop();*/
|
|
||||||
mesh = mesh_new;
|
|
||||||
|
|
||||||
mesh_mutex.Unlock();
|
|
||||||
|
|
||||||
if(mesh_old != NULL)
|
|
||||||
{
|
|
||||||
/*dstream<<"mesh_old refcount="<<mesh_old->getReferenceCount()
|
|
||||||
<<std::endl;
|
|
||||||
scene::IMeshBuffer *buf = mesh_new->getMeshBuffer
|
|
||||||
(g_materials[CONTENT_GRASS]);
|
|
||||||
if(buf != NULL)
|
|
||||||
dstream<<"grass buf refcount="<<buf->getReferenceCount()
|
|
||||||
<<std::endl;*/
|
|
||||||
|
|
||||||
mesh_old->drop();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dstream<<"WARNING: There was no old master heightmap mesh"<<std::endl;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void ClientMap::PrintInfo(std::ostream &out)
|
void ClientMap::PrintInfo(std::ostream &out)
|
||||||
|
|
|
@ -522,7 +522,6 @@ class ClientMap : public Map, public scene::ISceneNode
|
||||||
public:
|
public:
|
||||||
ClientMap(
|
ClientMap(
|
||||||
Client *client,
|
Client *client,
|
||||||
video::SMaterial *materials,
|
|
||||||
scene::ISceneNode* parent,
|
scene::ISceneNode* parent,
|
||||||
scene::ISceneManager* mgr,
|
scene::ISceneManager* mgr,
|
||||||
s32 id
|
s32 id
|
||||||
|
@ -562,7 +561,7 @@ public:
|
||||||
{
|
{
|
||||||
video::IVideoDriver* driver = SceneManager->getVideoDriver();
|
video::IVideoDriver* driver = SceneManager->getVideoDriver();
|
||||||
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
|
driver->setTransform(video::ETS_WORLD, AbsoluteTransformation);
|
||||||
renderMap(driver, m_materials, SceneManager->getSceneNodeRenderPass());
|
renderMap(driver, SceneManager->getSceneNodeRenderPass());
|
||||||
}
|
}
|
||||||
|
|
||||||
virtual const core::aabbox3d<f32>& getBoundingBox() const
|
virtual const core::aabbox3d<f32>& getBoundingBox() const
|
||||||
|
@ -570,8 +569,7 @@ public:
|
||||||
return m_box;
|
return m_box;
|
||||||
}
|
}
|
||||||
|
|
||||||
void renderMap(video::IVideoDriver* driver,
|
void renderMap(video::IVideoDriver* driver, s32 pass);
|
||||||
video::SMaterial *materials, s32 pass);
|
|
||||||
|
|
||||||
// Update master heightmap mesh
|
// Update master heightmap mesh
|
||||||
void updateMesh();
|
void updateMesh();
|
||||||
|
@ -582,8 +580,6 @@ public:
|
||||||
private:
|
private:
|
||||||
Client *m_client;
|
Client *m_client;
|
||||||
|
|
||||||
video::SMaterial *m_materials;
|
|
||||||
|
|
||||||
core::aabbox3d<f32> m_box;
|
core::aabbox3d<f32> m_box;
|
||||||
|
|
||||||
// This is the master heightmap mesh
|
// This is the master heightmap mesh
|
||||||
|
|
|
@ -138,6 +138,8 @@ FastFace * MapBlock::makeFastFace(u16 tile, u8 light, v3f p,
|
||||||
core::vector2d<f32>(0,0));
|
core::vector2d<f32>(0,0));
|
||||||
|
|
||||||
f->tile = tile;
|
f->tile = tile;
|
||||||
|
//DEBUG
|
||||||
|
//f->tile = TILE_GRASS;
|
||||||
|
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
@ -184,15 +186,30 @@ u8 MapBlock::getFaceLight(v3s16 p, v3s16 face_dir)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Gets node material from any place relative to block.
|
Gets node tile from any place relative to block.
|
||||||
Returns CONTENT_IGNORE if doesn't exist or should not be drawn.
|
Returns CONTENT_IGNORE if doesn't exist or should not be drawn.
|
||||||
*/
|
*/
|
||||||
u8 MapBlock::getNodeTile(v3s16 p)
|
u16 MapBlock::getNodeTile(v3s16 p, v3s16 face_dir)
|
||||||
{
|
{
|
||||||
try{
|
try{
|
||||||
MapNode n = getNodeParent(p);
|
MapNode n = getNodeParent(p);
|
||||||
|
|
||||||
return content_tile(n.d);
|
//return content_tile(n.d);
|
||||||
|
return n.getTile(face_dir);
|
||||||
|
}
|
||||||
|
catch(InvalidPositionException &e)
|
||||||
|
{
|
||||||
|
//return CONTENT_IGNORE;
|
||||||
|
return TILE_NONE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
u8 MapBlock::getNodeContent(v3s16 p)
|
||||||
|
{
|
||||||
|
try{
|
||||||
|
MapNode n = getNodeParent(p);
|
||||||
|
|
||||||
|
return n.d;
|
||||||
}
|
}
|
||||||
catch(InvalidPositionException &e)
|
catch(InvalidPositionException &e)
|
||||||
{
|
{
|
||||||
|
@ -223,15 +240,14 @@ void MapBlock::updateFastFaceRow(v3s16 startpos,
|
||||||
|
|
||||||
v3s16 p = startpos;
|
v3s16 p = startpos;
|
||||||
/*
|
/*
|
||||||
The light in the air lights the surface is taken from
|
Get face light at starting position
|
||||||
the node that is air.
|
|
||||||
*/
|
*/
|
||||||
u8 light = getFaceLight(p, face_dir);
|
u8 light = getFaceLight(p, face_dir);
|
||||||
|
|
||||||
u16 continuous_tiles_count = 0;
|
u16 continuous_tiles_count = 0;
|
||||||
|
|
||||||
u8 tile0 = getNodeTile(p);
|
u8 tile0 = getNodeTile(p, face_dir);
|
||||||
u8 tile1 = getNodeTile(p + face_dir);
|
u8 tile1 = getNodeTile(p + face_dir, -face_dir);
|
||||||
|
|
||||||
for(u16 j=0; j<length; j++)
|
for(u16 j=0; j<length; j++)
|
||||||
{
|
{
|
||||||
|
@ -244,8 +260,8 @@ void MapBlock::updateFastFaceRow(v3s16 startpos,
|
||||||
|
|
||||||
if(j != length - 1){
|
if(j != length - 1){
|
||||||
p_next = p + translate_dir;
|
p_next = p + translate_dir;
|
||||||
tile0_next = getNodeTile(p_next);
|
tile0_next = getNodeTile(p_next, face_dir);
|
||||||
tile1_next = getNodeTile(p_next + face_dir);
|
tile1_next = getNodeTile(p_next + face_dir, -face_dir);
|
||||||
light_next = getFaceLight(p_next, face_dir);
|
light_next = getFaceLight(p_next, face_dir);
|
||||||
|
|
||||||
if(tile0_next == tile0
|
if(tile0_next == tile0
|
||||||
|
@ -263,7 +279,11 @@ void MapBlock::updateFastFaceRow(v3s16 startpos,
|
||||||
/*
|
/*
|
||||||
Create a face if there should be one
|
Create a face if there should be one
|
||||||
*/
|
*/
|
||||||
u8 mf = face_contents(tile0, tile1);
|
//u8 mf = face_contents(tile0, tile1);
|
||||||
|
// This is hackish
|
||||||
|
u8 content0 = getNodeContent(p);
|
||||||
|
u8 content1 = getNodeContent(p + face_dir);
|
||||||
|
u8 mf = face_contents(content0, content1);
|
||||||
|
|
||||||
if(mf != 0)
|
if(mf != 0)
|
||||||
{
|
{
|
||||||
|
@ -479,7 +499,9 @@ void MapBlock::updateMesh()
|
||||||
|
|
||||||
/*collector.append(g_materials[f->material], f->vertices, 4,
|
/*collector.append(g_materials[f->material], f->vertices, 4,
|
||||||
indices, 6);*/
|
indices, 6);*/
|
||||||
collector.append(g_materials[f->tile], f->vertices, 4,
|
/*collector.append(g_materials[f->tile], f->vertices, 4,
|
||||||
|
indices, 6);*/
|
||||||
|
collector.append(g_tile_materials[f->tile], f->vertices, 4,
|
||||||
indices, 6);
|
indices, 6);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -288,7 +288,8 @@ public:
|
||||||
|
|
||||||
u8 getFaceLight(v3s16 p, v3s16 face_dir);
|
u8 getFaceLight(v3s16 p, v3s16 face_dir);
|
||||||
|
|
||||||
u8 getNodeTile(v3s16 p);
|
u16 getNodeTile(v3s16 p, v3s16 face_dir);
|
||||||
|
u8 getNodeContent(v3s16 p);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
startpos:
|
startpos:
|
||||||
|
|
|
@ -26,6 +26,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include "utility.h"
|
#include "utility.h"
|
||||||
#include "exceptions.h"
|
#include "exceptions.h"
|
||||||
#include "serialization.h"
|
#include "serialization.h"
|
||||||
|
#include "tile.h"
|
||||||
|
|
||||||
// Size of node in rendering units
|
// Size of node in rendering units
|
||||||
#define BS 10
|
#define BS 10
|
||||||
|
@ -64,30 +65,23 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
|
|
||||||
enum Content
|
enum Content
|
||||||
{
|
{
|
||||||
CONTENT_STONE=0,
|
CONTENT_STONE,
|
||||||
|
CONTENT_GRASS,
|
||||||
CONTENT_GRASS=1,
|
CONTENT_WATER,
|
||||||
|
CONTENT_LIGHT,
|
||||||
CONTENT_WATER=2,
|
CONTENT_TREE,
|
||||||
|
CONTENT_LEAVES,
|
||||||
CONTENT_LIGHT=3,
|
CONTENT_GRASS_FOOTSTEPS,
|
||||||
|
CONTENT_MESE,
|
||||||
CONTENT_TREE=4,
|
CONTENT_MUD,
|
||||||
|
CONTENT_OCEAN,
|
||||||
CONTENT_LEAVES=5,
|
|
||||||
|
|
||||||
CONTENT_GRASS_FOOTSTEPS=6,
|
|
||||||
|
|
||||||
CONTENT_MESE=7,
|
|
||||||
|
|
||||||
CONTENT_MUD=8,
|
|
||||||
|
|
||||||
CONTENT_OCEAN=9,
|
|
||||||
|
|
||||||
// This is set to the number of the actual values in this enum
|
// This is set to the number of the actual values in this enum
|
||||||
USEFUL_CONTENT_COUNT
|
USEFUL_CONTENT_COUNT
|
||||||
};
|
};
|
||||||
|
|
||||||
|
extern u16 g_content_tiles[USEFUL_CONTENT_COUNT][6];
|
||||||
|
|
||||||
/*
|
/*
|
||||||
If true, the material allows light propagation and brightness is stored
|
If true, the material allows light propagation and brightness is stored
|
||||||
in param.
|
in param.
|
||||||
|
@ -149,18 +143,6 @@ inline bool content_buildable_to(u8 m)
|
||||||
return (m == CONTENT_AIR || m == CONTENT_WATER || m == CONTENT_OCEAN);
|
return (m == CONTENT_AIR || m == CONTENT_WATER || m == CONTENT_OCEAN);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
TODO: Make a mapper class for mapping every side of a content
|
|
||||||
to some tile.
|
|
||||||
This dumbily maps all sides of content to the tile of the same id.
|
|
||||||
*/
|
|
||||||
inline u8 content_tile(u8 c)
|
|
||||||
{
|
|
||||||
if(c == CONTENT_IGNORE || c == CONTENT_LIGHT)
|
|
||||||
return CONTENT_AIR;
|
|
||||||
return c;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Returns true for contents that form the base ground that
|
Returns true for contents that form the base ground that
|
||||||
follows the main heightmap
|
follows the main heightmap
|
||||||
|
@ -260,6 +242,34 @@ inline v3s16 unpackDir(u8 b)
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
inline u16 content_tile(u8 c, v3s16 dir)
|
||||||
|
{
|
||||||
|
if(c == CONTENT_IGNORE || c == CONTENT_AIR
|
||||||
|
|| c >= USEFUL_CONTENT_COUNT)
|
||||||
|
return TILE_NONE;
|
||||||
|
|
||||||
|
s32 dir_i = -1;
|
||||||
|
|
||||||
|
if(dir == v3s16(0,1,0))
|
||||||
|
dir_i = 0;
|
||||||
|
else if(dir == v3s16(0,-1,0))
|
||||||
|
dir_i = 1;
|
||||||
|
else if(dir == v3s16(1,0,0))
|
||||||
|
dir_i = 2;
|
||||||
|
else if(dir == v3s16(-1,0,0))
|
||||||
|
dir_i = 3;
|
||||||
|
else if(dir == v3s16(0,0,1))
|
||||||
|
dir_i = 4;
|
||||||
|
else if(dir == v3s16(0,0,-1))
|
||||||
|
dir_i = 5;
|
||||||
|
|
||||||
|
/*if(dir_i == -1)
|
||||||
|
return TILE_NONE;*/
|
||||||
|
assert(dir_i != -1);
|
||||||
|
|
||||||
|
return g_content_tiles[c][dir_i];
|
||||||
|
}
|
||||||
|
|
||||||
struct MapNode
|
struct MapNode
|
||||||
{
|
{
|
||||||
// Content
|
// Content
|
||||||
|
@ -351,6 +361,11 @@ struct MapNode
|
||||||
param = a_light;
|
param = a_light;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
u16 getTile(v3s16 dir)
|
||||||
|
{
|
||||||
|
return content_tile(d, dir);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
These serialization functions are used when informing client
|
These serialization functions are used when informing client
|
||||||
of a single node add
|
of a single node add
|
||||||
|
|
|
@ -321,7 +321,7 @@ struct TestVoxelManipulator
|
||||||
|
|
||||||
v.print(dstream, VOXELPRINT_WATERPRESSURE);
|
v.print(dstream, VOXELPRINT_WATERPRESSURE);
|
||||||
|
|
||||||
s16 highest_y = -32768;
|
//s16 highest_y = -32768;
|
||||||
/*
|
/*
|
||||||
NOTE: These are commented out because this behaviour is changed
|
NOTE: These are commented out because this behaviour is changed
|
||||||
all the time
|
all the time
|
||||||
|
@ -484,8 +484,9 @@ struct TestMapBlock
|
||||||
n.d = 4;
|
n.d = 4;
|
||||||
b.setNode(p, n);
|
b.setNode(p, n);
|
||||||
assert(b.getNode(p).d == 4);
|
assert(b.getNode(p).d == 4);
|
||||||
assert(b.getNodeTile(p) == 4);
|
//TODO: Update to new system
|
||||||
assert(b.getNodeTile(v3s16(-1,-1,0)) == 5);
|
/*assert(b.getNodeTile(p) == 4);
|
||||||
|
assert(b.getNodeTile(v3s16(-1,-1,0)) == 5);*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
propagateSunlight()
|
propagateSunlight()
|
||||||
|
|
|
@ -24,10 +24,6 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#ifndef UTILITY_HEADER
|
#ifndef UTILITY_HEADER
|
||||||
#define UTILITY_HEADER
|
#define UTILITY_HEADER
|
||||||
|
|
||||||
#include "common_irrlicht.h"
|
|
||||||
#include "debug.h"
|
|
||||||
#include "strfnd.h"
|
|
||||||
#include "exceptions.h"
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
@ -35,6 +31,11 @@ with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
#include <jmutex.h>
|
#include <jmutex.h>
|
||||||
#include <jmutexautolock.h>
|
#include <jmutexautolock.h>
|
||||||
|
|
||||||
|
#include "common_irrlicht.h"
|
||||||
|
#include "debug.h"
|
||||||
|
#include "strfnd.h"
|
||||||
|
#include "exceptions.h"
|
||||||
|
|
||||||
extern const v3s16 g_26dirs[26];
|
extern const v3s16 g_26dirs[26];
|
||||||
|
|
||||||
inline void writeU32(u8 *data, u32 i)
|
inline void writeU32(u8 *data, u32 i)
|
||||||
|
|
Loading…
Reference in New Issue