diff --git a/data/models/character.x b/data/models/character.x index bb5cec5..4f87608 100644 --- a/data/models/character.x +++ b/data/models/character.x @@ -562,7 +562,7 @@ Frame Root { 96.078431; 0.000000; 0.000000; 0.000000;; 0.000000; 0.000000; 0.000000;; - TextureFilename {"character.png";} + TextureFilename {"data/models/character.png";} } } //End of Cube_001 Material List MeshTextureCoords { //Cube_001 UV Coordinates diff --git a/data/textures/character.png b/data/textures/character.png index 6af7db6..43f6cdd 100644 Binary files a/data/textures/character.png and b/data/textures/character.png differ diff --git a/src/common_irrlicht.h b/src/common_irrlicht.h index f4c2f76..9339a99 100644 --- a/src/common_irrlicht.h +++ b/src/common_irrlicht.h @@ -36,6 +36,13 @@ video::SColor(255,30,30,30));d->endScene();} #include #include #include +// this is to stop unqualified-id compiler problems +#ifdef PI +# undef PI +#endif +#include +#include +#include #include #include #include diff --git a/src/player.cpp b/src/player.cpp index b82f36b..03c3160 100644 --- a/src/player.cpp +++ b/src/player.cpp @@ -23,7 +23,8 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "constants.h" #include "utility.h" #ifndef SERVER -#include +#include "common_irrlicht.h" +#include "mesh.h" #endif #include "settings.h" @@ -193,6 +194,7 @@ RemotePlayer::RemotePlayer( IrrlichtDevice *device, s32 id): scene::ISceneNode(parent, (device==NULL)?NULL:device->getSceneManager(), id), + m_node(NULL), m_text(NULL) { m_box = core::aabbox3d(-BS/2,0,-BS/2,BS/2,BS*2,BS/2); @@ -208,78 +210,63 @@ RemotePlayer::RemotePlayer( wchar_t wname[1] = {0}; m_text = mgr->addTextSceneNode(gui->getBuiltInFont(), wname, video::SColor(255,255,255,255), this); + if (!m_text) + return; m_text->setPosition(v3f(0, (f32)BS*2.1, 0)); - // Attach a simple mesh to the player for showing an image - scene::SMesh *mesh = new scene::SMesh(); - { // Front - scene::IMeshBuffer *buf = new scene::SMeshBuffer(); - video::SColor c(255,255,255,255); - video::S3DVertex vertices[4] = - { - video::S3DVertex(-BS/2,0,0, 0,0,0, c, 0,1), - video::S3DVertex(BS/2,0,0, 0,0,0, c, 1,1), - video::S3DVertex(BS/2,BS*2,0, 0,0,0, c, 1,0), - video::S3DVertex(-BS/2,BS*2,0, 0,0,0, c, 0,0), - }; - u16 indices[] = {0,1,2,2,3,0}; - buf->append(vertices, 4, indices, 6); - // Set material - buf->getMaterial().setFlag(video::EMF_LIGHTING, false); - //buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false); - buf->getMaterial().setTexture(0, driver->getTexture(getTexturePath("player.png").c_str())); - buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false); - buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true); - //buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL; - buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; - // Add to mesh - mesh->addMeshBuffer(buf); - buf->drop(); + scene::IAnimatedMesh* mesh = mgr->getMesh(getModelPath("character.x").c_str()); + if (!mesh) + return; + + m_node = mgr->addAnimatedMeshSceneNode(mesh,this); + + if (m_node) { + m_node->setFrameLoop(0,79); + m_node->setScale(v3f(1.0,1.0,1.0)); + setMeshColor(m_node->getMesh(), video::SColor(255,255,255,255)); + + // Set material flags and texture + m_node->setMaterialTexture( 0, driver->getTexture(getTexturePath("character.png").c_str())); + video::SMaterial& material = m_node->getMaterial(0); + material.setFlag(video::EMF_LIGHTING, false); + material.setFlag(video::EMF_BILINEAR_FILTER, false); + + m_node->setPosition(v3f(0,(f32)BS,0)); } - { // Back - scene::IMeshBuffer *buf = new scene::SMeshBuffer(); - video::SColor c(255,255,255,255); - video::S3DVertex vertices[4] = - { - video::S3DVertex(BS/2,0,0, 0,0,0, c, 1,1), - video::S3DVertex(-BS/2,0,0, 0,0,0, c, 0,1), - video::S3DVertex(-BS/2,BS*2,0, 0,0,0, c, 0,0), - video::S3DVertex(BS/2,BS*2,0, 0,0,0, c, 1,0), - }; - u16 indices[] = {0,1,2,2,3,0}; - buf->append(vertices, 4, indices, 6); - // Set material - buf->getMaterial().setFlag(video::EMF_LIGHTING, false); - //buf->getMaterial().setFlag(video::EMF_BACK_FACE_CULLING, false); - buf->getMaterial().setTexture(0, driver->getTexture(getTexturePath("player_back.png").c_str())); - buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, false); - buf->getMaterial().setFlag(video::EMF_FOG_ENABLE, true); - buf->getMaterial().MaterialType = video::EMT_TRANSPARENT_ALPHA_CHANNEL_REF; - // Add to mesh - mesh->addMeshBuffer(buf); - buf->drop(); - } - m_node = mgr->addMeshSceneNode(mesh, this); - mesh->drop(); - m_node->setPosition(v3f(0,0,0)); + // TODO: this is causing a segfault when a player quits and rejoins + //mesh->drop(); } } RemotePlayer::~RemotePlayer() { - if(SceneManager != NULL) + if(SceneManager != NULL) { ISceneNode::remove(); + } } void RemotePlayer::updateName(const char *name) { Player::updateName(name); - if(m_text != NULL) - { + if (m_text != NULL) { wchar_t wname[PLAYERNAME_SIZE]; mbstowcs(wname, m_name, strlen(m_name)+1); m_text->setText(wname); } + if (m_node != NULL) { + std::string tex = std::string("players/player_")+name+".png"; + std::string ptex = getTexturePath(tex); + printf("'%s' '%s'\n",tex.c_str(),ptex.c_str()); + if (ptex == "") + return; + // Set material flags and texture + scene::ISceneManager* mgr = SceneManager; + video::IVideoDriver* driver = mgr->getVideoDriver(); + m_node->setMaterialTexture( 0, driver->getTexture(ptex.c_str())); + video::SMaterial& material = m_node->getMaterial(0); + material.setFlag(video::EMF_LIGHTING, false); + material.setFlag(video::EMF_BILINEAR_FILTER, false); + } } void RemotePlayer::move(f32 dtime, Map &map, f32 pos_max_d) @@ -296,6 +283,22 @@ void RemotePlayer::move(f32 dtime, Map &map, f32 pos_max_d) moveratio = 1.5; m_showpos = m_oldpos + movevector * moveratio; + if ( + ( + movevector.X < 0.001 + && movevector.X > -0.001 + ) || ( + movevector.Z < 0.001 + && movevector.Z > -0.001 + ) + ) { + if (m_node->getEndFrame() != 79) + m_node->setFrameLoop(0,79); + }else{ + if (m_node->getEndFrame() != 187) + m_node->setFrameLoop(168,187); + } + ISceneNode::setPosition(m_showpos); } diff --git a/src/player.h b/src/player.h index 8897ae7..935cbc2 100644 --- a/src/player.h +++ b/src/player.h @@ -21,6 +21,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #define PLAYER_HEADER #include "common_irrlicht.h" +#include #include "inventory.h" #include "collision.h" @@ -28,7 +29,6 @@ with this program; if not, write to the Free Software Foundation, Inc., #define PLAYERNAME_ALLOWED_CHARS "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_" - class Map; class Player @@ -252,7 +252,6 @@ public: m_pos_animation_counter = 0; Player::setPosition(position); - //ISceneNode::setPosition(position); } virtual void setYaw(f32 yaw) @@ -283,7 +282,7 @@ public: void move(f32 dtime, Map &map, f32 pos_max_d); private: - scene::IMeshSceneNode *m_node; + scene::IAnimatedMeshSceneNode *m_node; scene::ITextSceneNode* m_text; core::aabbox3d m_box; diff --git a/src/tile.cpp b/src/tile.cpp index 628b6fa..0a2188d 100644 --- a/src/tile.cpp +++ b/src/tile.cpp @@ -152,6 +152,8 @@ std::string getTexturePath(const std::string &filename) Checks all supported extensions by replacing the original extension. If not found, returns "". + + Utilizes a thread-safe cache. */ std::string getModelPath(const std::string &filename) { @@ -172,7 +174,7 @@ std::string getModelPath(const std::string &filename) { std::string testpath = data_path + DIR_DELIM + rel_path; if(fs::PathExists(testpath)) - fullpath = testpath; + fullpath = std::string(testpath); } /* @@ -182,7 +184,7 @@ std::string getModelPath(const std::string &filename) { std::string testpath = porting::path_data + DIR_DELIM + rel_path; if(fs::PathExists(testpath)) - fullpath = testpath; + fullpath = std::string(testpath); } // Add to cache (also an empty result is cached) diff --git a/src/tile.h b/src/tile.h index c1793e2..628d586 100644 --- a/src/tile.h +++ b/src/tile.h @@ -30,7 +30,7 @@ with this program; if not, write to the Free Software Foundation, Inc., */ /* - Gets the path to a texture by first checking if the texture exists + Gets the path to a texture/model by first checking if it exists in data_path and if not, using the default data path. Checks all supported extensions by replacing the original extension.