diff --git a/res/content/base/models/player.mtl b/res/content/base/models/player.mtl deleted file mode 100644 index 21707271..00000000 --- a/res/content/base/models/player.mtl +++ /dev/null @@ -1,13 +0,0 @@ -# Blender MTL File: 'player.blend' -# Material Count: 1 - -newmtl entities/player -Ns 96.078431 -Ka 1.000000 1.000000 1.000000 -Kd 0.640000 0.640000 0.640000 -Ks 0.000000 0.000000 0.000000 -Ke 0.000000 0.000000 0.000000 -Ni 1.000000 -d 1.000000 -illum 1 -map_Kd /home/ubuntu/Projects/Cpp/VoxelEngine-Cpp/res/content/base/textures/entities/player.png diff --git a/res/content/base/preload.json b/res/content/base/preload.json index 9a2905c7..005abdfd 100644 --- a/res/content/base/preload.json +++ b/res/content/base/preload.json @@ -5,10 +5,6 @@ "events/pickup" ], "models": [ - "block", - "drop-block", - "drop-item", - "player", - "player-head" + "drop-item" ] } diff --git a/src/assets/AssetsLoader.cpp b/src/assets/AssetsLoader.cpp index 5deb4b5a..ae39e4d8 100644 --- a/src/assets/AssetsLoader.cpp +++ b/src/assets/AssetsLoader.cpp @@ -12,6 +12,7 @@ #include "../content/Content.hpp" #include "../content/ContentPack.hpp" #include "../voxels/Block.hpp" +#include "../objects/rigging.hpp" #include "../graphics/core/Texture.hpp" #include "../logic/scripting/scripting.hpp" @@ -205,6 +206,16 @@ void AssetsLoader::addDefaults(AssetsLoader& loader, const Content* content) { fs::path folder = info.folder / fs::path("layouts"); addLayouts(pack->getEnvironment(), info.id, folder, loader); } + + for (auto& entry : content->getSkeletons()) { + auto& skeleton = *entry.second; + for (auto& bone : skeleton.getBones()) { + auto& model = bone->model.name; + if (!model.empty()) { + loader.add(AssetType::MODEL, MODELS_FOLDER+"/"+model, model); + } + } + } } loader.add(AssetType::ATLAS, TEXTURES_FOLDER+"/blocks", "blocks"); loader.add(AssetType::ATLAS, TEXTURES_FOLDER+"/items", "items"); diff --git a/src/content/Content.cpp b/src/content/Content.cpp index 07db6f5c..11e204d6 100644 --- a/src/content/Content.cpp +++ b/src/content/Content.cpp @@ -49,7 +49,7 @@ Content::Content( Content::~Content() { } -const rigging::SkeletonConfig* Content::getRig(const std::string& id) const { +const rigging::SkeletonConfig* Content::getSkeleton(const std::string& id) const { auto found = skeletons.find(id); if (found == skeletons.end()) { return nullptr; @@ -80,3 +80,7 @@ const UptrsMap& Content::getBlockMaterials() const { const UptrsMap& Content::getPacks() const { return packs; } + +const UptrsMap& Content::getSkeletons() const { + return skeletons; +} diff --git a/src/content/Content.hpp b/src/content/Content.hpp index 45ac8840..16e072b7 100644 --- a/src/content/Content.hpp +++ b/src/content/Content.hpp @@ -200,12 +200,13 @@ public: return resourceIndices[static_cast(type)]; } - const rigging::SkeletonConfig* getRig(const std::string& id) const; + const rigging::SkeletonConfig* getSkeleton(const std::string& id) const; const BlockMaterial* findBlockMaterial(const std::string& id) const; const ContentPackRuntime* getPackRuntime(const std::string& id) const; const UptrsMap& getBlockMaterials() const; const UptrsMap& getPacks() const; + const UptrsMap& getSkeletons() const; }; #endif // CONTENT_CONTENT_HPP_ diff --git a/src/logic/scripting/lua/lib__skeleton.cpp b/src/logic/scripting/lua/lib__skeleton.cpp index 227d895d..42c25dcd 100644 --- a/src/logic/scripting/lua/lib__skeleton.cpp +++ b/src/logic/scripting/lua/lib__skeleton.cpp @@ -20,7 +20,7 @@ static int l_get_model(lua::State* L) { if (!modelOverride.model) { return lua::pushstring(L, modelOverride.name); } - return lua::pushstring(L, rigConfig->getNodes()[index]->model.name); + return lua::pushstring(L, rigConfig->getBones()[index]->model.name); } return 0; } diff --git a/src/logic/scripting/lua/libentity.cpp b/src/logic/scripting/lua/libentity.cpp index 38dcbf0b..84e34d48 100644 --- a/src/logic/scripting/lua/libentity.cpp +++ b/src/logic/scripting/lua/libentity.cpp @@ -48,7 +48,7 @@ static int l_get_skeleton(lua::State* L) { static int l_set_skeleton(lua::State* L) { if (auto entity = get_entity(L, 1)) { std::string skeletonName = lua::require_string(L, 2); - auto rigConfig = content->getRig(skeletonName); + auto rigConfig = content->getSkeleton(skeletonName); if (rigConfig == nullptr) { throw std::runtime_error("skeleton not found '"+skeletonName+"'"); } diff --git a/src/objects/Entities.cpp b/src/objects/Entities.cpp index d47350bf..7a888293 100644 --- a/src/objects/Entities.cpp +++ b/src/objects/Entities.cpp @@ -49,10 +49,10 @@ void Entity::setRig(const rigging::SkeletonConfig* rigConfig) { auto& skeleton = registry.get(entity); skeleton.config = rigConfig; skeleton.pose.matrices.resize( - rigConfig->getNodes().size(), glm::mat4(1.0f) + rigConfig->getBones().size(), glm::mat4(1.0f) ); skeleton.calculated.matrices.resize( - rigConfig->getNodes().size(), glm::mat4(1.0f) + rigConfig->getBones().size(), glm::mat4(1.0f) ); } @@ -99,7 +99,7 @@ entityid_t Entities::spawn( dynamic::Map_sptr saved, entityid_t uid) { - auto skeleton = level->content->getRig(def.skeletonName); + auto skeleton = level->content->getSkeleton(def.skeletonName); if (skeleton == nullptr) { throw std::runtime_error("skeleton "+def.skeletonName+" not found"); } @@ -205,7 +205,7 @@ void Entities::loadEntity(const dynamic::Map_sptr& map, Entity entity) { std::string skeletonName = skeleton.config->getName(); map->str("skeleton", skeletonName); if (skeletonName != skeleton.config->getName()) { - skeleton.config = level->content->getRig(skeletonName); + skeleton.config = level->content->getSkeleton(skeletonName); } if (auto skeletonmap = map->map(COMP_SKELETON)) { if (auto texturesmap = skeletonmap->map("textures")) { diff --git a/src/objects/EntityDef.hpp b/src/objects/EntityDef.hpp index 3f731547..6ddee669 100644 --- a/src/objects/EntityDef.hpp +++ b/src/objects/EntityDef.hpp @@ -17,15 +17,27 @@ struct EntityDef { /// @brief Entity string id (with prefix included) std::string const name; + /// @brief Component IDs std::vector components; + /// @brief Physic body type BodyType bodyType = BodyType::DYNAMIC; + + /// @brief Hitbox size glm::vec3 hitbox {0.25f}; + + /// @brief 'aabb' sensors std::vector> boxSensors {}; + /// @brief 'radius' sensors std::vector> radialSensors {}; + + /// @brief Skeleton ID std::string skeletonName = name; + + /// @brief Does entity prevent blocks setup bool blocking = true; + /// @brief save-** flags struct { bool enabled = true; struct { diff --git a/src/objects/rigging.cpp b/src/objects/rigging.cpp index ecf8e2d5..c4fed1e1 100644 --- a/src/objects/rigging.cpp +++ b/src/objects/rigging.cpp @@ -34,13 +34,13 @@ void Bone::setModel(const std::string& name) { Skeleton::Skeleton(const SkeletonConfig* config) : config(config), - pose(config->getNodes().size()), - calculated(config->getNodes().size()), - flags(config->getNodes().size()), + pose(config->getBones().size()), + calculated(config->getBones().size()), + flags(config->getBones().size()), textures(), - modelOverrides(config->getNodes().size()), + modelOverrides(config->getBones().size()), visible(true) { - for (size_t i = 0; i < config->getNodes().size(); i++) { + for (size_t i = 0; i < config->getBones().size(); i++) { flags[i].visible = true; } } diff --git a/src/objects/rigging.hpp b/src/objects/rigging.hpp index 01920b92..8866dd88 100644 --- a/src/objects/rigging.hpp +++ b/src/objects/rigging.hpp @@ -120,7 +120,7 @@ namespace rigging { std::string_view name ); - const std::vector& getNodes() const { + const std::vector& getBones() const { return nodes; }