Skip to content

Commit

Permalink
Replace object visual by enum
Browse files Browse the repository at this point in the history
  • Loading branch information
cx384 committed Jan 15, 2025
1 parent cf074dd commit 0e30370
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 26 deletions.
48 changes: 29 additions & 19 deletions src/client/content_cao.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -597,7 +597,7 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
if (!m_prop.is_visible)
return;

infostream << "GenericCAO::addToScene(): " << m_prop.visual << std::endl;
infostream << "GenericCAO::addToScene(): " << es_ObjectVisual[m_prop.visual].str << std::endl;

m_material_type_param = 0.5f; // May cut off alpha < 128 depending on m_material_type

Expand Down Expand Up @@ -634,7 +634,8 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
node->forEachMaterial(setMaterial);
};

if (m_prop.visual == "sprite") {
switch(m_prop.visual) {
case OBJECTVISUAL_SPRITE: {
grabMatrixNode();
m_spritenode = m_smgr->addBillboardSceneNode(
m_matrixnode, v2f(1, 1), v3f(0,0,0), -1);
Expand All @@ -654,7 +655,8 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
setBillboardTextureMatrix(m_spritenode,
txs, tys, 0, 0);
}
} else if (m_prop.visual == "upright_sprite") {
break;
} case OBJECTVISUAL_UPRIGHT_SPRITE: {
grabMatrixNode();
auto mesh = make_irr<scene::SMesh>();
f32 dx = BS * m_prop.visual_size.X / 2;
Expand Down Expand Up @@ -696,7 +698,8 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
mesh->recalculateBoundingBox();
m_meshnode = m_smgr->addMeshSceneNode(mesh.get(), m_matrixnode);
m_meshnode->grab();
} else if (m_prop.visual == "cube") {
break;
} case OBJECTVISUAL_CUBE: {
grabMatrixNode();
scene::IMesh *mesh = createCubeMesh(v3f(BS,BS,BS));
m_meshnode = m_smgr->addMeshSceneNode(mesh, m_matrixnode);
Expand All @@ -710,7 +713,8 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
m_meshnode->forEachMaterial([this] (auto &mat) {
mat.BackfaceCulling = m_prop.backface_culling;
});
} else if (m_prop.visual == "mesh") {
break;
} case OBJECTVISUAL_MESH: {
grabMatrixNode();
scene::IAnimatedMesh *mesh = m_client->getMesh(m_prop.mesh, true);
if (mesh) {
Expand All @@ -737,7 +741,10 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
});
} else
errorstream<<"GenericCAO::addToScene(): Could not load mesh "<<m_prop.mesh<<std::endl;
} else if (m_prop.visual == "wielditem" || m_prop.visual == "item") {
break;
}
case OBJECTVISUAL_WIELDITEM_ITEM:
case OBJECTVISUAL_ITEM: {
grabMatrixNode();
ItemStack item;
if (m_prop.wield_item.empty()) {
Expand All @@ -755,19 +762,22 @@ void GenericCAO::addToScene(ITextureSource *tsrc, scene::ISceneManager *smgr)
}
m_wield_meshnode = new WieldMeshSceneNode(m_smgr, -1);
m_wield_meshnode->setItem(item, m_client,
(m_prop.visual == "wielditem"));
(m_prop.visual == OBJECTVISUAL_WIELDITEM_ITEM));

m_wield_meshnode->setScale(m_prop.visual_size / 2.0f);
} else {
infostream<<"GenericCAO::addToScene(): \""<<m_prop.visual
<<"\" not supported"<<std::endl;
break;
} default:
infostream << "GenericCAO::addToScene(): \""
<< es_ObjectVisual[m_prop.visual].str
<< "\" not supported"<<std::endl;
break;
}

/* Set VBO hint */
// wieldmesh sets its own hint, no need to handle it
if (m_meshnode || m_animated_meshnode) {
// sprite uses vertex animation
if (m_meshnode && m_prop.visual != "upright_sprite")
if (m_meshnode && m_prop.visual != OBJECTVISUAL_UPRIGHT_SPRITE)
m_meshnode->getMesh()->setHardwareMappingHint(scene::EHM_STATIC);

if (m_animated_meshnode) {
Expand Down Expand Up @@ -873,7 +883,7 @@ void GenericCAO::updateLight(u32 day_night_ratio)

void GenericCAO::setNodeLight(const video::SColor &light_color)
{
if (m_prop.visual == "wielditem" || m_prop.visual == "item") {
if (m_prop.visual == OBJECTVISUAL_WIELDITEM_ITEM || m_prop.visual == OBJECTVISUAL_ITEM) {
if (m_wield_meshnode)
m_wield_meshnode->setNodeLightColor(light_color);
return;
Expand Down Expand Up @@ -1259,7 +1269,7 @@ void GenericCAO::updateTexturePos()
}

else if (m_meshnode) {
if (m_prop.visual == "upright_sprite") {
if (m_prop.visual == OBJECTVISUAL_UPRIGHT_SPRITE) {
int row = m_tx_basepos.Y;
int col = m_tx_basepos.X;

Expand Down Expand Up @@ -1293,7 +1303,7 @@ void GenericCAO::updateTextures(std::string mod)
m_current_texture_modifier = mod;

if (m_spritenode) {
if (m_prop.visual == "sprite") {
if (m_prop.visual == OBJECTVISUAL_SPRITE) {
std::string texturestring = "no_texture.png";
if (!m_prop.textures.empty())
texturestring = m_prop.textures[0];
Expand All @@ -1312,7 +1322,7 @@ void GenericCAO::updateTextures(std::string mod)
}

else if (m_animated_meshnode) {
if (m_prop.visual == "mesh") {
if (m_prop.visual == OBJECTVISUAL_MESH) {
for (u32 i = 0; i < m_animated_meshnode->getMaterialCount(); ++i) {
const auto texture_idx = m_animated_meshnode->getMesh()->getTextureSlot(i);
if (texture_idx >= m_prop.textures.size())
Expand Down Expand Up @@ -1350,7 +1360,7 @@ void GenericCAO::updateTextures(std::string mod)
}

else if (m_meshnode) {
if(m_prop.visual == "cube")
if(m_prop.visual == OBJECTVISUAL_CUBE)
{
for (u32 i = 0; i < 6; ++i)
{
Expand All @@ -1371,7 +1381,7 @@ void GenericCAO::updateTextures(std::string mod)
use_anisotropic_filter);
});
}
} else if (m_prop.visual == "upright_sprite") {
} else if (m_prop.visual == OBJECTVISUAL_UPRIGHT_SPRITE) {
scene::IMesh *mesh = m_meshnode->getMesh();
{
std::string tname = "no_texture.png";
Expand Down Expand Up @@ -1563,7 +1573,7 @@ bool GenericCAO::visualExpiryRequired(const ObjectProperties &new_) const
*/

bool uses_legacy_texture = new_.wield_item.empty() &&
(new_.visual == "wielditem" || new_.visual == "item");
(new_.visual == OBJECTVISUAL_WIELDITEM_ITEM || new_.visual == OBJECTVISUAL_ITEM);
// Ordered to compare primitive types before std::vectors
return old.backface_culling != new_.backface_culling ||
old.is_visible != new_.is_visible ||
Expand Down Expand Up @@ -1954,7 +1964,7 @@ void GenericCAO::updateMeshCulling()
if (!node)
return;

if (m_prop.visual == "upright_sprite") {
if (m_prop.visual == OBJECTVISUAL_UPRIGHT_SPRITE) {
// upright sprite has no backface culling
node->forEachMaterial([=] (auto &mat) {
mat.FrontfaceCulling = hidden;
Expand Down
26 changes: 23 additions & 3 deletions src/object_properties.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,24 @@
#include "exceptions.h"
#include "log.h"
#include "util/serialize.h"
#include "common/c_content.h"
#include <sstream>
#include <tuple>

static const video::SColor NULL_BGCOLOR{0, 1, 1, 1};

const struct EnumString es_ObjectVisual[] =
{
{OBJECTVISUAL_UNKNOWN, "unknown"},
{OBJECTVISUAL_SPRITE, "sprite"},
{OBJECTVISUAL_UPRIGHT_SPRITE, "upright_sprite"},
{OBJECTVISUAL_CUBE, "cube"},
{OBJECTVISUAL_MESH, "mesh"},
{OBJECTVISUAL_ITEM, "item"},
{OBJECTVISUAL_WIELDITEM_ITEM, "wielditem_item"},
{0, nullptr},
};

ObjectProperties::ObjectProperties()
{
textures.emplace_back("no_texture.png");
Expand All @@ -27,7 +40,7 @@ std::string ObjectProperties::dump() const
os << ", physical=" << physical;
os << ", collideWithObjects=" << collideWithObjects;
os << ", collisionbox=" << collisionbox.MinEdge << "," << collisionbox.MaxEdge;
os << ", visual=" << visual;
os << ", visual=" << es_ObjectVisual[visual].str;
os << ", mesh=" << mesh;
os << ", visual_size=" << visual_size;
os << ", textures=[";
Expand Down Expand Up @@ -136,7 +149,7 @@ void ObjectProperties::serialize(std::ostream &os) const
writeV3F32(os, selectionbox.MinEdge);
writeV3F32(os, selectionbox.MaxEdge);
Pointabilities::serializePointabilityType(os, pointable);
os << serializeString16(visual);
os << serializeString16(es_ObjectVisual[visual].str);
writeV3F32(os, visual_size);
writeU16(os, textures.size());
for (const std::string &texture : textures) {
Expand Down Expand Up @@ -197,7 +210,14 @@ void ObjectProperties::deSerialize(std::istream &is)
selectionbox.MinEdge = readV3F32(is);
selectionbox.MaxEdge = readV3F32(is);
pointable = Pointabilities::deSerializePointabilityType(is);
visual = deSerializeString16(is);

// Don't convert to a string when introducing a new version (>4)
int result;
if (string_to_enum(es_ObjectVisual, result, deSerializeString16(is)))
visual = static_cast<ObjectVisual>(result);
else
visual = OBJECTVISUAL_UNKNOWN;

visual_size = readV3F32(is);
textures.clear();
u32 texture_count = readU16(is);
Expand Down
17 changes: 16 additions & 1 deletion src/object_properties.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,21 @@
#include <vector>
#include "util/pointabilities.h"

struct EnumString;

enum ObjectVisual : u8 {
OBJECTVISUAL_UNKNOWN,
OBJECTVISUAL_SPRITE,
OBJECTVISUAL_UPRIGHT_SPRITE,
OBJECTVISUAL_CUBE,
OBJECTVISUAL_MESH,
OBJECTVISUAL_ITEM,
OBJECTVISUAL_WIELDITEM_ITEM,
};

extern const EnumString es_ObjectVisual[];


struct ObjectProperties
{
/* member variables ordered roughly by size */
Expand All @@ -21,7 +36,7 @@ struct ObjectProperties
aabb3f collisionbox = aabb3f(-0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f);
// Values are BS=1
aabb3f selectionbox = aabb3f(-0.5f, -0.5f, -0.5f, 0.5f, 0.5f, 0.5f);
std::string visual = "sprite";
ObjectVisual visual = OBJECTVISUAL_SPRITE;
std::string mesh;
std::string damage_texture_modifier = "^[brighten";
std::string nametag;
Expand Down
5 changes: 3 additions & 2 deletions src/script/common/c_content.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,8 @@ void read_object_properties(lua_State *L, int index,
}
lua_pop(L, 1);

getstringfield(L, -1, "visual", prop->visual);
prop->visual = static_cast<ObjectVisual>(getenumfield(L, -1, "visual", es_ObjectVisual,
OBJECTVISUAL_UNKNOWN));

getstringfield(L, -1, "mesh", prop->mesh);

Expand Down Expand Up @@ -473,7 +474,7 @@ void push_object_properties(lua_State *L, const ObjectProperties *prop)
lua_setfield(L, -2, "selectionbox");
push_pointability_type(L, prop->pointable);
lua_setfield(L, -2, "pointable");
lua_pushlstring(L, prop->visual.c_str(), prop->visual.size());
lua_pushstring(L, es_ObjectVisual[prop->visual].str);
lua_setfield(L, -2, "visual");
lua_pushlstring(L, prop->mesh.c_str(), prop->mesh.size());
lua_setfield(L, -2, "mesh");
Expand Down
2 changes: 1 addition & 1 deletion src/server/player_sao.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ PlayerSAO::PlayerSAO(ServerEnvironment *env_, RemotePlayer *player_, session_t p
m_prop.selectionbox = aabb3f(-0.3f, 0.0f, -0.3f, 0.3f, 1.77f, 0.3f);
m_prop.pointable = PointabilityType::POINTABLE;
// Start of default appearance, this should be overwritten by Lua
m_prop.visual = "upright_sprite";
m_prop.visual = OBJECTVISUAL_UPRIGHT_SPRITE;
m_prop.visual_size = v3f(1, 2, 1);
m_prop.textures.clear();
m_prop.textures.emplace_back("player.png");
Expand Down

0 comments on commit 0e30370

Please sign in to comment.