Allow Vanessa's texture filtering / mipmap patch to work on models, as well as all other node types

Initialize m_bone_posrot too

Update pos_translator for attached players, which should fix a bug noticed with carts where a detached player would travel from the detachment spot to where it was detached

Don't make attachments possible to right-click either

Properly apply object and text visibility for local attachments, and fix them showing when they shouldn't
master
MirceaKitsune 2012-11-09 21:51:45 +02:00 committed by Perttu Ahola
parent 4d656963e4
commit fa67b46c04
2 changed files with 63 additions and 20 deletions

View File

@ -40,6 +40,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/serialize.h" #include "util/serialize.h"
#include "util/mathconstants.h" #include "util/mathconstants.h"
#include "map.h" #include "map.h"
#include "main.h" // g_settings
#include <IMeshManipulator.h> #include <IMeshManipulator.h>
#include <IAnimatedMeshSceneNode.h> #include <IAnimatedMeshSceneNode.h>
#include <IBoneSceneNode.h> #include <IBoneSceneNode.h>
@ -586,6 +587,7 @@ private:
std::string m_attachment_bone; std::string m_attachment_bone;
v3f m_attachment_position; v3f m_attachment_position;
v3f m_attachment_rotation; v3f m_attachment_rotation;
bool m_attached_to_local;
int m_anim_frame; int m_anim_frame;
int m_anim_num_frames; int m_anim_num_frames;
float m_anim_framelength; float m_anim_framelength;
@ -624,10 +626,11 @@ public:
m_frames(v2f(0,0)), m_frames(v2f(0,0)),
m_frame_speed(15), m_frame_speed(15),
m_frame_blend(0), m_frame_blend(0),
// Nothing to do for m_bone_posrot m_bone_posrot(std::map<std::string, core::vector2d<v3f> >()),
m_attachment_bone(""), m_attachment_bone(""),
m_attachment_position(v3f(0,0,0)), m_attachment_position(v3f(0,0,0)),
m_attachment_rotation(v3f(0,0,0)), m_attachment_rotation(v3f(0,0,0)),
m_attached_to_local(false),
m_anim_frame(0), m_anim_frame(0),
m_anim_num_frames(1), m_anim_num_frames(1),
m_anim_framelength(0.2), m_anim_framelength(0.2),
@ -891,7 +894,7 @@ public:
mesh->addMeshBuffer(buf); mesh->addMeshBuffer(buf);
buf->drop(); buf->drop();
} }
m_meshnode = smgr->addMeshSceneNode(mesh, m_smgr->getRootSceneNode()); m_meshnode = smgr->addMeshSceneNode(mesh, NULL);
mesh->drop(); mesh->drop();
// Set it to use the materials of the meshbuffers directly. // Set it to use the materials of the meshbuffers directly.
// This is needed for changing the texture in the future // This is needed for changing the texture in the future
@ -900,7 +903,7 @@ public:
else if(m_prop.visual == "cube"){ else if(m_prop.visual == "cube"){
infostream<<"GenericCAO::addToScene(): cube"<<std::endl; infostream<<"GenericCAO::addToScene(): cube"<<std::endl;
scene::IMesh *mesh = createCubeMesh(v3f(BS,BS,BS)); scene::IMesh *mesh = createCubeMesh(v3f(BS,BS,BS));
m_meshnode = smgr->addMeshSceneNode(mesh, m_smgr->getRootSceneNode()); m_meshnode = smgr->addMeshSceneNode(mesh, NULL);
mesh->drop(); mesh->drop();
m_meshnode->setScale(v3f(m_prop.visual_size.X, m_meshnode->setScale(v3f(m_prop.visual_size.X,
@ -914,7 +917,7 @@ public:
scene::IAnimatedMesh *mesh = smgr->getMesh(m_prop.mesh.c_str()); scene::IAnimatedMesh *mesh = smgr->getMesh(m_prop.mesh.c_str());
if(mesh) if(mesh)
{ {
m_animated_meshnode = smgr->addAnimatedMeshSceneNode(mesh, m_smgr->getRootSceneNode()); m_animated_meshnode = smgr->addAnimatedMeshSceneNode(mesh, NULL);
m_animated_meshnode->animateJoints(); // Needed for some animations m_animated_meshnode->animateJoints(); // Needed for some animations
m_animated_meshnode->setScale(v3f(m_prop.visual_size.X, m_animated_meshnode->setScale(v3f(m_prop.visual_size.X,
m_prop.visual_size.Y, m_prop.visual_size.Y,
@ -939,7 +942,7 @@ public:
irr->getVideoDriver()->getMeshManipulator(); irr->getVideoDriver()->getMeshManipulator();
scene::IMesh *mesh = manip->createMeshUniquePrimitives(item_mesh); scene::IMesh *mesh = manip->createMeshUniquePrimitives(item_mesh);
m_meshnode = smgr->addMeshSceneNode(mesh, m_smgr->getRootSceneNode()); m_meshnode = smgr->addMeshSceneNode(mesh, NULL);
mesh->drop(); mesh->drop();
m_meshnode->setScale(v3f(m_prop.visual_size.X/2, m_meshnode->setScale(v3f(m_prop.visual_size.X/2,
@ -981,7 +984,7 @@ public:
void updateLight(u8 light_at_pos) void updateLight(u8 light_at_pos)
{ {
// Objects attached to the local player should always be hidden // Objects attached to the local player should always be hidden
if(getParent() != NULL && getParent()->isLocalPlayer()) if(m_attached_to_local)
m_is_visible = false; m_is_visible = false;
else else
m_is_visible = (m_hp != 0); m_is_visible = (m_hp != 0);
@ -1002,6 +1005,9 @@ public:
m_spritenode->setColor(color); m_spritenode->setColor(color);
m_spritenode->setVisible(m_is_visible); m_spritenode->setVisible(m_is_visible);
} }
if(m_textnode){
m_textnode->setVisible(m_is_visible);
}
} }
} }
@ -1034,8 +1040,6 @@ public:
void step(float dtime, ClientEnvironment *env) void step(float dtime, ClientEnvironment *env)
{ {
v3f lastpos = pos_translator.vect_show;
if(m_visuals_expired && m_smgr && m_irr){ if(m_visuals_expired && m_smgr && m_irr){
m_visuals_expired = false; m_visuals_expired = false;
@ -1077,6 +1081,17 @@ public:
} }
} }
} }
// Make sure m_is_visible is always applied
if(m_meshnode)
m_meshnode->setVisible(m_is_visible);
if(m_animated_meshnode)
m_animated_meshnode->setVisible(m_is_visible);
if(m_spritenode)
m_spritenode->setVisible(m_is_visible);
if(m_textnode)
m_textnode->setVisible(m_is_visible);
if(getParent() != NULL) // Attachments should be glued to their parent by Irrlicht if(getParent() != NULL) // Attachments should be glued to their parent by Irrlicht
{ {
// Set these for later // Set these for later
@ -1088,6 +1103,7 @@ public:
m_position = m_spritenode->getAbsolutePosition(); m_position = m_spritenode->getAbsolutePosition();
m_velocity = v3f(0,0,0); m_velocity = v3f(0,0,0);
m_acceleration = v3f(0,0,0); m_acceleration = v3f(0,0,0);
pos_translator.vect_show = m_position;
if(m_is_local_player) // Update local player attachment position if(m_is_local_player) // Update local player attachment position
{ {
@ -1097,6 +1113,8 @@ public:
} }
else else
{ {
v3f lastpos = pos_translator.vect_show;
if(m_prop.physical){ if(m_prop.physical){
core::aabbox3d<f32> box = m_prop.collisionbox; core::aabbox3d<f32> box = m_prop.collisionbox;
box.MinEdge *= BS; box.MinEdge *= BS;
@ -1218,6 +1236,10 @@ public:
{ {
ITextureSource *tsrc = m_gamedef->tsrc(); ITextureSource *tsrc = m_gamedef->tsrc();
bool use_trilinear_filter = g_settings->getBool("trilinear_filter");
bool use_bilinear_filter = g_settings->getBool("bilinear_filter");
bool use_anisotropic_filter = g_settings->getBool("anisotropic_filter");
if(m_spritenode) if(m_spritenode)
{ {
if(m_prop.visual == "sprite") if(m_prop.visual == "sprite")
@ -1234,10 +1256,14 @@ public:
// has directional lighting, it should work automatically. // has directional lighting, it should work automatically.
if(m_prop.colors.size() >= 1) if(m_prop.colors.size() >= 1)
{ {
m_meshnode->getMaterial(0).AmbientColor = m_prop.colors[0]; m_spritenode->getMaterial(0).AmbientColor = m_prop.colors[0];
m_meshnode->getMaterial(0).DiffuseColor = m_prop.colors[0]; m_spritenode->getMaterial(0).DiffuseColor = m_prop.colors[0];
m_meshnode->getMaterial(0).SpecularColor = m_prop.colors[0]; m_spritenode->getMaterial(0).SpecularColor = m_prop.colors[0];
} }
m_spritenode->getMaterial(0).setFlag(video::EMF_TRILINEAR_FILTER, use_trilinear_filter);
m_spritenode->getMaterial(0).setFlag(video::EMF_BILINEAR_FILTER, use_bilinear_filter);
m_spritenode->getMaterial(0).setFlag(video::EMF_ANISOTROPIC_FILTER, use_anisotropic_filter);
} }
} }
if(m_animated_meshnode) if(m_animated_meshnode)
@ -1262,6 +1288,10 @@ public:
video::SMaterial& material = m_animated_meshnode->getMaterial(i); video::SMaterial& material = m_animated_meshnode->getMaterial(i);
material.setFlag(video::EMF_LIGHTING, false); material.setFlag(video::EMF_LIGHTING, false);
material.setFlag(video::EMF_BILINEAR_FILTER, false); material.setFlag(video::EMF_BILINEAR_FILTER, false);
m_animated_meshnode->getMaterial(i).setFlag(video::EMF_TRILINEAR_FILTER, use_trilinear_filter);
m_animated_meshnode->getMaterial(i).setFlag(video::EMF_BILINEAR_FILTER, use_bilinear_filter);
m_animated_meshnode->getMaterial(i).setFlag(video::EMF_ANISOTROPIC_FILTER, use_anisotropic_filter);
} }
for (u32 i = 0; i < m_prop.colors.size(); ++i) for (u32 i = 0; i < m_prop.colors.size(); ++i)
{ {
@ -1308,6 +1338,10 @@ public:
m_meshnode->getMaterial(i).DiffuseColor = m_prop.colors[i]; m_meshnode->getMaterial(i).DiffuseColor = m_prop.colors[i];
m_meshnode->getMaterial(i).SpecularColor = m_prop.colors[i]; m_meshnode->getMaterial(i).SpecularColor = m_prop.colors[i];
} }
m_meshnode->getMaterial(i).setFlag(video::EMF_TRILINEAR_FILTER, use_trilinear_filter);
m_meshnode->getMaterial(i).setFlag(video::EMF_BILINEAR_FILTER, use_bilinear_filter);
m_meshnode->getMaterial(i).setFlag(video::EMF_ANISOTROPIC_FILTER, use_anisotropic_filter);
} }
} }
else if(m_prop.visual == "upright_sprite") else if(m_prop.visual == "upright_sprite")
@ -1331,6 +1365,10 @@ public:
buf->getMaterial().DiffuseColor = m_prop.colors[0]; buf->getMaterial().DiffuseColor = m_prop.colors[0];
buf->getMaterial().SpecularColor = m_prop.colors[0]; buf->getMaterial().SpecularColor = m_prop.colors[0];
} }
buf->getMaterial().setFlag(video::EMF_TRILINEAR_FILTER, use_trilinear_filter);
buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, use_bilinear_filter);
buf->getMaterial().setFlag(video::EMF_ANISOTROPIC_FILTER, use_anisotropic_filter);
} }
{ {
std::string tname = "unknown_object.png"; std::string tname = "unknown_object.png";
@ -1358,6 +1396,10 @@ public:
buf->getMaterial().DiffuseColor = m_prop.colors[0]; buf->getMaterial().DiffuseColor = m_prop.colors[0];
buf->getMaterial().SpecularColor = m_prop.colors[0]; buf->getMaterial().SpecularColor = m_prop.colors[0];
} }
buf->getMaterial().setFlag(video::EMF_TRILINEAR_FILTER, use_trilinear_filter);
buf->getMaterial().setFlag(video::EMF_BILINEAR_FILTER, use_bilinear_filter);
buf->getMaterial().setFlag(video::EMF_ANISOTROPIC_FILTER, use_anisotropic_filter);
} }
} }
} }
@ -1394,7 +1436,9 @@ public:
void updateAttachments() void updateAttachments()
{ {
if(getParent() == NULL || getParent()->isLocalPlayer()) // Detach m_attached_to_local = getParent() != NULL && getParent()->isLocalPlayer();
if(getParent() == NULL || m_attached_to_local) // Detach or don't attach
{ {
if(m_meshnode) if(m_meshnode)
{ {

View File

@ -579,10 +579,8 @@ std::string LuaEntitySAO::getClientInitializationData()
os<<serializeLongString(getPropertyPacket()); // message 1 os<<serializeLongString(getPropertyPacket()); // message 1
os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2 os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
os<<serializeLongString(gob_cmd_update_animations(m_animation_frames, m_animation_speed, m_animation_blend)); // 3 os<<serializeLongString(gob_cmd_update_animations(m_animation_frames, m_animation_speed, m_animation_blend)); // 3
if(m_animation_bone.size()){ for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_animation_bone.begin(); ii != m_animation_bone.end(); ++ii){
for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_animation_bone.begin(); ii != m_animation_bone.end(); ++ii){ os<<serializeLongString(gob_cmd_update_bone_posrot((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_animation_bone.size
os<<serializeLongString(gob_cmd_update_bone_posrot((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_animation_bone.size
}
} }
os<<serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4 os<<serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4
@ -673,6 +671,9 @@ void LuaEntitySAO::rightClick(ServerActiveObject *clicker)
{ {
if(!m_registered) if(!m_registered)
return; return;
// It's best that attachments cannot be clicked
if(isAttached())
return;
lua_State *L = m_env->getLua(); lua_State *L = m_env->getLua();
scriptapi_luaentity_rightclick(L, m_id, clicker); scriptapi_luaentity_rightclick(L, m_id, clicker);
} }
@ -976,10 +977,8 @@ std::string PlayerSAO::getClientInitializationData()
os<<serializeLongString(getPropertyPacket()); // message 1 os<<serializeLongString(getPropertyPacket()); // message 1
os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2 os<<serializeLongString(gob_cmd_update_armor_groups(m_armor_groups)); // 2
os<<serializeLongString(gob_cmd_update_animations(m_animation_frames, m_animation_speed, m_animation_blend)); // 3 os<<serializeLongString(gob_cmd_update_animations(m_animation_frames, m_animation_speed, m_animation_blend)); // 3
if(m_animation_bone.size()){ for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_animation_bone.begin(); ii != m_animation_bone.end(); ++ii){
for(std::map<std::string, core::vector2d<v3f> >::const_iterator ii = m_animation_bone.begin(); ii != m_animation_bone.end(); ++ii){ os<<serializeLongString(gob_cmd_update_bone_posrot((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_animation_bone.size
os<<serializeLongString(gob_cmd_update_bone_posrot((*ii).first, (*ii).second.X, (*ii).second.Y)); // m_animation_bone.size
}
} }
os<<serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4 os<<serializeLongString(gob_cmd_update_attachment(m_attachment_parent_id, m_attachment_bone, m_attachment_position, m_attachment_rotation)); // 4