From 0333ce6990ec865b039c50fdfb63a889ec19c3eb Mon Sep 17 00:00:00 2001 From: MihailRis Date: Sun, 21 Jul 2024 18:27:11 +0300 Subject: [PATCH] add bone "offset" parameter & update player model --- res/content/base/models/player-body.obj | 47 +++++++++++++++++++++++++ res/content/base/models/player-hand.obj | 42 ++++++++++++++++++++++ res/content/base/models/player-head.obj | 38 ++++++++++---------- res/content/base/models/player.obj | 46 ------------------------ res/content/base/skeletons/player.json | 5 +-- src/objects/Player.cpp | 15 ++++---- src/objects/rigging.cpp | 31 ++++++++++++---- src/objects/rigging.hpp | 8 ++++- 8 files changed, 151 insertions(+), 81 deletions(-) create mode 100644 res/content/base/models/player-body.obj create mode 100644 res/content/base/models/player-hand.obj delete mode 100644 res/content/base/models/player.obj diff --git a/res/content/base/models/player-body.obj b/res/content/base/models/player-body.obj new file mode 100644 index 00000000..4cfbad54 --- /dev/null +++ b/res/content/base/models/player-body.obj @@ -0,0 +1,47 @@ +# Blender v2.79 (sub 0) OBJ File: 'player.blend' +# www.blender.org +mtllib player-body.mtl +o Cube.001 +v -0.125000 -0.900000 0.070903 +v -0.125000 -0.900000 -0.070903 +v 0.125000 -0.900000 -0.070903 +v 0.125000 -0.900000 0.070903 +v -0.125000 0.491919 0.070903 +v 0.125000 0.491919 0.070903 +v 0.125000 0.491919 -0.070903 +v -0.125000 0.491919 -0.070903 +vt 0.783122 0.009685 +vt 0.982503 0.009685 +vt 0.982503 0.209065 +vt 0.783122 0.209065 +vt 0.783122 0.009685 +vt 0.982503 0.009685 +vt 0.982503 0.209065 +vt 0.783122 0.209065 +vt 0.982503 0.009685 +vt 0.982503 0.209065 +vt 0.783122 0.209065 +vt 0.112175 0.434439 +vt 0.311556 0.434439 +vt 0.311556 0.633819 +vt 0.112175 0.633819 +vt 0.783122 0.009685 +vt 0.982503 0.009685 +vt 0.982503 0.209065 +vt 0.982503 0.009685 +vt 0.982503 0.209065 +vt 0.783122 0.209065 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 0.0000 +vn -1.0000 0.0000 0.0000 +vn -0.0000 -0.0000 -1.0000 +vn 1.0000 0.0000 0.0000 +vn 0.0000 0.0000 1.0000 +usemtl entities/player +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +f 1/1/3 5/9/3 8/10/3 2/11/3 +f 2/12/4 8/13/4 7/14/4 3/15/4 +f 3/16/5 7/17/5 6/18/5 4/4/5 +f 5/5/6 1/19/6 4/20/6 6/21/6 diff --git a/res/content/base/models/player-hand.obj b/res/content/base/models/player-hand.obj new file mode 100644 index 00000000..a7752299 --- /dev/null +++ b/res/content/base/models/player-hand.obj @@ -0,0 +1,42 @@ +# Blender v2.79 (sub 0) OBJ File: 'player.blend' +# www.blender.org +mtllib player-hand.mtl +o Cube.000_Cube.002 +v 0.062480 -0.613786 -0.062480 +v 0.062480 -0.613786 0.062480 +v -0.062480 -0.613786 0.062480 +v -0.062480 -0.613786 -0.062480 +v 0.062480 0.070352 -0.062480 +v -0.062480 0.070352 -0.062480 +v -0.062480 0.070352 0.062480 +v 0.062480 0.070352 0.062480 +vt 0.783122 0.009685 +vt 0.982503 0.009685 +vt 0.982503 0.209065 +vt 0.783122 0.209065 +vt 0.783122 0.009685 +vt 0.982503 0.009685 +vt 0.982503 0.209065 +vt 0.783122 0.209065 +vt 0.436482 0.280393 +vt 0.433740 0.937829 +vt 0.436146 0.914519 +vt 0.438665 0.292591 +vt 0.492515 0.918221 +vt 0.493194 0.293103 +vt 0.493371 0.941872 +vt 0.494058 0.280870 +vn 0.0000 -1.0000 0.0000 +vn 0.0000 1.0000 -0.0000 +vn 1.0000 -0.0000 0.0000 +vn -0.0000 -0.0000 1.0000 +vn -1.0000 0.0000 0.0000 +vn 0.0000 0.0000 -1.0000 +usemtl entities/player +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 5/5/2 6/6/2 7/7/2 8/8/2 +f 1/9/3 5/10/3 8/11/3 2/12/3 +f 2/12/4 8/11/4 7/13/4 3/14/4 +f 3/14/5 7/13/5 6/15/5 4/16/5 +f 5/10/6 1/9/6 4/16/6 6/15/6 diff --git a/res/content/base/models/player-head.obj b/res/content/base/models/player-head.obj index 6a6a9024..c8baf870 100644 --- a/res/content/base/models/player-head.obj +++ b/res/content/base/models/player-head.obj @@ -2,14 +2,14 @@ # www.blender.org mtllib player-head.mtl o Cube.002_Cube.003 -v -0.238204 0.476553 -0.238204 -v -0.238204 0.000145 -0.238204 -v -0.238204 0.476553 0.238204 -v -0.238204 0.000145 0.238204 -v 0.238204 0.000145 0.238204 -v 0.238204 0.476553 0.238204 -v 0.238204 0.000145 -0.238204 -v 0.238204 0.476553 -0.238204 +v -0.206512 0.031837 0.206512 +v -0.206512 0.444861 0.206512 +v -0.206512 0.444861 -0.206512 +v -0.206512 0.031837 -0.206512 +v 0.206512 0.444861 -0.206512 +v 0.206512 0.031837 -0.206512 +v 0.206512 0.444861 0.206512 +v 0.206512 0.031837 0.206512 vt 0.783122 0.009685 vt 0.982503 0.009685 vt 0.982503 0.209065 @@ -32,17 +32,17 @@ vt 0.982503 0.209065 vt 0.783122 0.009685 vt 0.982503 0.009685 vt 0.783122 0.209065 -vn -1.0000 0.0000 0.0000 +vn -1.0000 -0.0000 -0.0000 vn 0.0000 0.0000 -1.0000 vn 1.0000 0.0000 0.0000 -vn 0.0000 0.0000 1.0000 -vn 0.0000 -1.0000 0.0000 -vn 0.0000 1.0000 0.0000 +vn -0.0000 -0.0000 1.0000 +vn 0.0000 -1.0000 -0.0000 +vn -0.0000 1.0000 0.0000 usemtl entities/player -s off -f 4/1/1 3/2/1 1/3/1 2/4/1 -f 2/5/2 1/6/2 8/7/2 7/8/2 -f 7/9/3 8/10/3 6/11/3 5/12/3 -f 5/13/4 6/14/4 3/15/4 4/16/4 -f 2/17/5 7/18/5 5/19/5 4/16/5 -f 8/20/6 1/21/6 3/15/6 6/22/6 +s 1 +f 1/1/1 2/2/1 3/3/1 4/4/1 +f 4/5/2 3/6/2 5/7/2 6/8/2 +f 6/9/3 5/10/3 7/11/3 8/12/3 +f 8/13/4 7/14/4 2/15/4 1/16/4 +f 4/17/5 6/18/5 8/19/5 1/16/5 +f 5/20/6 3/21/6 2/15/6 7/22/6 diff --git a/res/content/base/models/player.obj b/res/content/base/models/player.obj deleted file mode 100644 index f9f65297..00000000 --- a/res/content/base/models/player.obj +++ /dev/null @@ -1,46 +0,0 @@ -# Blender v2.79 (sub 0) OBJ File: 'player.blend' -# www.blender.org -mtllib player.mtl -o Cube -v 0.125000 -0.900000 -0.125000 -v 0.125000 -0.900000 0.125000 -v -0.125000 -0.900000 0.125000 -v -0.125000 -0.900000 -0.125000 -v 0.125000 0.491919 -0.125000 -v 0.125000 0.491919 0.125000 -v -0.125000 0.491919 0.125000 -v -0.125000 0.491919 -0.125000 -vt 0.783122 0.009685 -vt 0.982503 0.009685 -vt 0.982503 0.209065 -vt 0.783122 0.209065 -vt 0.783122 0.009685 -vt 0.982503 0.009685 -vt 0.982503 0.209065 -vt 0.783122 0.209065 -vt 0.982503 0.009685 -vt 0.982503 0.209065 -vt 0.783122 0.209065 -vt 0.783122 0.009685 -vt 0.982503 0.009685 -vt 0.783122 0.209065 -vt 0.783122 0.009685 -vt 0.982503 0.009685 -vt 0.982503 0.209065 -vt 0.982503 0.009685 -vt 0.982503 0.209065 -vt 0.783122 0.209065 -vn 0.0000 -1.0000 -0.0000 -vn 0.0000 1.0000 0.0000 -vn 1.0000 0.0000 0.0000 -vn -0.0000 -0.0000 1.0000 -vn -1.0000 -0.0000 -0.0000 -vn 0.0000 0.0000 -1.0000 -usemtl entities/player -s off -f 1/1/1 2/2/1 3/3/1 4/4/1 -f 5/5/2 8/6/2 7/7/2 6/8/2 -f 1/1/3 5/9/3 6/10/3 2/11/3 -f 2/12/4 6/13/4 7/7/4 3/14/4 -f 3/15/5 7/16/5 8/17/5 4/4/5 -f 5/5/6 1/18/6 4/19/6 8/20/6 diff --git a/res/content/base/skeletons/player.json b/res/content/base/skeletons/player.json index ce2be7b6..8f5e7b5a 100644 --- a/res/content/base/skeletons/player.json +++ b/res/content/base/skeletons/player.json @@ -3,11 +3,12 @@ "nodes": [ { "name": "body", - "model": "player", + "model": "player-body", "nodes": [ { "name": "head", - "model": "player-head" + "model": "player-head", + "offset": [0, 0.4, 0] } ] } diff --git a/src/objects/Player.cpp b/src/objects/Player.cpp index 6ffcd37c..15744675 100644 --- a/src/objects/Player.cpp +++ b/src/objects/Player.cpp @@ -140,6 +140,7 @@ void Player::updateSelectedEntity() { selectedEid = selection.entity; } +#include "../window/Window.hpp" void Player::postUpdate() { auto entity = level->entities->get(eid); if (!entity.has_value()) { @@ -159,14 +160,15 @@ void Player::postUpdate() { skeleton.visible = currentCamera != camera; + auto velocityMod = glm::length(hitbox.velocity); + size_t bodyIndex = skeleton.config->find("body")->getIndex(); size_t headIndex = skeleton.config->find("head")->getIndex(); - + skeleton.pose.matrices[bodyIndex] = - glm::rotate(glm::mat4(1.0f), glm::radians(cam.x-90), glm::vec3(0, 1, 0)); - skeleton.pose.matrices[headIndex] = glm::rotate(glm::rotate( - glm::translate(glm::mat4(1.0f), glm::vec3(0.0f, 0.4f, 0.0f)), - glm::radians(-cam.y), glm::vec3(0, 0, 1)), glm::radians(90.0f), glm::vec3(0, 1, 0)); + glm::rotate(glm::mat4(1.0f), glm::radians(cam.x), glm::vec3(0, 1, 0)); + skeleton.pose.matrices[headIndex] = glm::rotate( + glm::mat4(1.0f), glm::radians(cam.y), glm::vec3(1, 0, 0)); } void Player::teleport(glm::vec3 position) { @@ -188,8 +190,9 @@ void Player::attemptToFindSpawnpoint() { voxel* headvox = level->chunks->get(newpos.x, newpos.y+1, newpos.z); if (level->chunks->isObstacleBlock(newpos.x, newpos.y, newpos.z) || - headvox == nullptr || headvox->id != 0) + headvox == nullptr || headvox->id != 0) { return; + } spawnpoint = newpos + glm::vec3(0.5f, 0.0f, 0.5f); teleport(spawnpoint); } diff --git a/src/objects/rigging.cpp b/src/objects/rigging.cpp index ee5299bb..67b14c18 100644 --- a/src/objects/rigging.cpp +++ b/src/objects/rigging.cpp @@ -4,6 +4,11 @@ #include "../graphics/render/ModelBatch.hpp" #include "../graphics/core/Model.hpp" #include "../coders/json.hpp" +#include "../data/dynamic_util.hpp" + +#define GLM_ENABLE_EXPERIMENTAL +#include +#include using namespace rigging; @@ -18,10 +23,12 @@ Bone::Bone( size_t index, std::string name, std::string model, - std::vector> bones) + std::vector> bones, + glm::vec3 offset) : index(index), name(std::move(name)), bones(std::move(bones)), + offset(offset), model({model, nullptr, true}) {} @@ -40,7 +47,8 @@ Skeleton::Skeleton(const SkeletonConfig* config) textures(), modelOverrides(config->getBones().size()), visible(true) { - for (size_t i = 0; i < config->getBones().size(); i++) { + const auto& bones = config->getBones(); + for (size_t i = 0; i < bones.size(); i++) { flags[i].visible = true; } } @@ -63,7 +71,13 @@ size_t SkeletonConfig::update( Bone* node, glm::mat4 matrix) const { - skeleton.calculated.matrices[index] = matrix * skeleton.pose.matrices[index]; + auto boneMatrix = skeleton.pose.matrices[index]; + auto boneOffset = node->getOffset(); + glm::mat4 baseMatrix(1.0f); + if (glm::length2(boneOffset) > 0.0f) { + baseMatrix = glm::translate(glm::mat4(1.0f), boneOffset); + } + skeleton.calculated.matrices[index] = matrix * baseMatrix * boneMatrix; size_t count = 1; for (auto& subnode : node->getSubnodes()) { count += update(index+count, skeleton, subnode.get(), skeleton.calculated.matrices[index]); @@ -116,25 +130,28 @@ Bone* SkeletonConfig::find(std::string_view str) const { } static std::tuple> read_node( - dynamic::Map* root, size_t index + const dynamic::Map_sptr& root, size_t index ) { std::string name; std::string model; root->str("name", name); root->str("model", model); + glm::vec3 offset(0.0f); + dynamic::get_vec(root, "offset", offset); + std::vector> bones; size_t count = 1; if (auto nodesList = root->list("nodes")) { for (size_t i = 0; i < nodesList->size(); i++) { if (const auto& map = nodesList->map(i)) { - auto [subcount, subNode] = read_node(map.get(), index+count); + auto [subcount, subNode] = read_node(map, index+count); count += subcount; bones.push_back(std::move(subNode)); } } } - return {count, std::make_unique(index, name, model, std::move(bones))}; + return {count, std::make_unique(index, name, model, std::move(bones), offset)}; } std::unique_ptr SkeletonConfig::parse( @@ -147,6 +164,6 @@ std::unique_ptr SkeletonConfig::parse( if (rootNodeMap == nullptr) { throw std::runtime_error("missing 'root' element"); } - auto [count, rootNode] = read_node(rootNodeMap.get(), 0); + auto [count, rootNode] = read_node(rootNodeMap, 0); return std::make_unique(std::string(name), std::move(rootNode), count); } diff --git a/src/objects/rigging.hpp b/src/objects/rigging.hpp index b816bdc9..6d4469ee 100644 --- a/src/objects/rigging.hpp +++ b/src/objects/rigging.hpp @@ -40,13 +40,15 @@ namespace rigging { size_t index; std::string name; std::vector> bones; + glm::vec3 offset; public: ModelReference model; Bone( size_t index, std::string name, std::string model, - std::vector> bones); + std::vector> bones, + glm::vec3 offset); void setModel(const std::string& name); @@ -58,6 +60,10 @@ namespace rigging { return index; } + glm::vec3 getOffset() const { + return offset; + } + const auto& getSubnodes() const { return bones; }