mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
fix
moar fix optimize cool guy texture
This commit is contained in:
parent
307ab111d0
commit
63b9979ff7
6 changed files with 16 additions and 20 deletions
BIN
games/devtest/mods/testentities/models/testentities_cool_guy.png
Executable file → Normal file
BIN
games/devtest/mods/testentities/models/testentities_cool_guy.png
Executable file → Normal file
Binary file not shown.
Before Width: | Height: | Size: 4.7 KiB After Width: | Height: | Size: 3.6 KiB |
|
@ -10,6 +10,7 @@
|
||||||
#include "SSkinMeshBuffer.h"
|
#include "SSkinMeshBuffer.h"
|
||||||
#include "aabbox3d.h"
|
#include "aabbox3d.h"
|
||||||
#include "irrMath.h"
|
#include "irrMath.h"
|
||||||
|
#include "irrTypes.h"
|
||||||
#include "matrix4.h"
|
#include "matrix4.h"
|
||||||
#include "quaternion.h"
|
#include "quaternion.h"
|
||||||
#include "vector3d.h"
|
#include "vector3d.h"
|
||||||
|
@ -70,8 +71,11 @@ public:
|
||||||
void setAnimationSpeed(f32 fps) override;
|
void setAnimationSpeed(f32 fps) override;
|
||||||
|
|
||||||
//! **Must not be called**.
|
//! **Must not be called**.
|
||||||
//! TODO refactor Irrlicht so that we need not implement this.
|
IMesh *getMesh(f32) override {
|
||||||
IMesh *getMesh(f32) override { assert(false); };
|
// TODO refactor Irrlicht so that we need not implement this.
|
||||||
|
_IRR_DEBUG_BREAK_IF(true);
|
||||||
|
return nullptr;
|
||||||
|
};
|
||||||
|
|
||||||
//! Turns the given array of local matrices into an array of global matrices
|
//! Turns the given array of local matrices into an array of global matrices
|
||||||
//! by multiplying with respective parent matrices.
|
//! by multiplying with respective parent matrices.
|
||||||
|
|
|
@ -9,6 +9,7 @@
|
||||||
#include "ISceneManager.h"
|
#include "ISceneManager.h"
|
||||||
#include "S3DVertex.h"
|
#include "S3DVertex.h"
|
||||||
#include "Transform.h"
|
#include "Transform.h"
|
||||||
|
#include "irrTypes.h"
|
||||||
#include "matrix4.h"
|
#include "matrix4.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "SkinnedMesh.h"
|
#include "SkinnedMesh.h"
|
||||||
|
@ -549,7 +550,7 @@ void CAnimatedMeshSceneNode::addJoints()
|
||||||
ISceneNode *parent = this;
|
ISceneNode *parent = this;
|
||||||
if (joint->ParentJointID)
|
if (joint->ParentJointID)
|
||||||
parent = PerJoint.SceneNodes.at(*joint->ParentJointID); // exists because of topo. order
|
parent = PerJoint.SceneNodes.at(*joint->ParentJointID); // exists because of topo. order
|
||||||
assert(parent);
|
_IRR_DEBUG_BREAK_IF(!parent);
|
||||||
const auto *matrix = std::get_if<core::matrix4>(&joint->transform);
|
const auto *matrix = std::get_if<core::matrix4>(&joint->transform);
|
||||||
PerJoint.SceneNodes.push_back(new CBoneSceneNode(
|
PerJoint.SceneNodes.push_back(new CBoneSceneNode(
|
||||||
parent, SceneManager, 0, i, joint->Name,
|
parent, SceneManager, 0, i, joint->Name,
|
||||||
|
|
|
@ -555,13 +555,7 @@ bool CXMeshFileLoader::parseDataObjectFrame(SkinnedMesh::SJoint *Parent)
|
||||||
core::matrix4 matrix;
|
core::matrix4 matrix;
|
||||||
if (!parseDataObjectTransformationMatrix(matrix))
|
if (!parseDataObjectTransformationMatrix(matrix))
|
||||||
return false;
|
return false;
|
||||||
auto transform = core::Transform::decompose(matrix);
|
joint->transform = matrix;
|
||||||
// Try to decompose. If the recomposed matrix equals the old one with a liberal tolerance, use that.
|
|
||||||
if (transform.buildMatrix().equals(matrix, 1e-5)) {
|
|
||||||
joint->transform = transform;
|
|
||||||
} else {
|
|
||||||
joint->transform = matrix;
|
|
||||||
}
|
|
||||||
} else if (objectName == "Mesh") {
|
} else if (objectName == "Mesh") {
|
||||||
/*
|
/*
|
||||||
frame.Meshes.push_back(SXMesh());
|
frame.Meshes.push_back(SXMesh());
|
||||||
|
|
|
@ -412,7 +412,7 @@ void SkinnedMesh::topoSortJoints()
|
||||||
{
|
{
|
||||||
size_t n = AllJoints.size();
|
size_t n = AllJoints.size();
|
||||||
|
|
||||||
std::vector<u16> new_to_old_id; // new id -> old id
|
std::vector<u16> new_to_old_id;
|
||||||
|
|
||||||
std::vector<std::vector<u16>> children(n);
|
std::vector<std::vector<u16>> children(n);
|
||||||
for (u16 i = 0; i < n; ++i) {
|
for (u16 i = 0; i < n; ++i) {
|
||||||
|
@ -429,7 +429,6 @@ void SkinnedMesh::topoSortJoints()
|
||||||
children[new_to_old_id[i]].end());
|
children[new_to_old_id[i]].end());
|
||||||
}
|
}
|
||||||
|
|
||||||
// old id -> new id
|
|
||||||
std::vector<u16> old_to_new_id(n);
|
std::vector<u16> old_to_new_id(n);
|
||||||
for (u16 i = 0; i < n; ++i)
|
for (u16 i = 0; i < n; ++i)
|
||||||
old_to_new_id[new_to_old_id[i]] = i;
|
old_to_new_id[new_to_old_id[i]] = i;
|
||||||
|
|
|
@ -394,22 +394,20 @@ SECTION("simple skin")
|
||||||
const auto joints = csm->getAllJoints();
|
const auto joints = csm->getAllJoints();
|
||||||
REQUIRE(joints.size() == 3);
|
REQUIRE(joints.size() == 3);
|
||||||
|
|
||||||
const auto findJoint = [&](const std::function<bool(SkinnedMesh::SJoint*)> &predicate) {
|
const auto findJoint = [&](const std::function<bool(const SkinnedMesh::SJoint*)> &predicate) {
|
||||||
for (std::size_t i = 0; i < joints.size(); ++i) {
|
for (const auto *joint : joints) {
|
||||||
if (predicate(joints[i])) {
|
if (predicate(joint)) {
|
||||||
return joints[i];
|
return joint;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw std::runtime_error("joint not found");
|
throw std::runtime_error("joint not found");
|
||||||
};
|
};
|
||||||
|
|
||||||
// Check the node hierarchy
|
// Check the node hierarchy
|
||||||
const auto *parent = findJoint([](auto *joint) {
|
|
||||||
return !joint->ParentJointID;
|
|
||||||
});
|
|
||||||
const auto child = findJoint([&](auto *joint) {
|
const auto child = findJoint([&](auto *joint) {
|
||||||
return joint->ParentJointID && *joint->ParentJointID == parent->JointID;
|
return !!joint->ParentJointID;
|
||||||
});
|
});
|
||||||
|
const auto *parent = joints.at(*child->ParentJointID);
|
||||||
|
|
||||||
SECTION("transformations are correct")
|
SECTION("transformations are correct")
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue