From 63b9979ff7ad260fc0883e5ba2ae17d420162889 Mon Sep 17 00:00:00 2001 From: Lars Mueller Date: Mon, 27 Jan 2025 20:13:53 +0100 Subject: [PATCH] fix moar fix optimize cool guy texture --- .../models/testentities_cool_guy.png | Bin 4828 -> 3673 bytes irr/include/SkinnedMesh.h | 8 ++++++-- irr/src/CAnimatedMeshSceneNode.cpp | 3 ++- irr/src/CXMeshFileLoader.cpp | 8 +------- irr/src/SkinnedMesh.cpp | 3 +-- src/unittest/test_irr_gltf_mesh_loader.cpp | 14 ++++++-------- 6 files changed, 16 insertions(+), 20 deletions(-) mode change 100755 => 100644 games/devtest/mods/testentities/models/testentities_cool_guy.png diff --git a/games/devtest/mods/testentities/models/testentities_cool_guy.png b/games/devtest/mods/testentities/models/testentities_cool_guy.png old mode 100755 new mode 100644 index fcc219ac7ea95c2ad9b49ad0064835638cb51c69..84cc12e442b73df3583daed7fe9c5433b86c5749 GIT binary patch literal 3673 zcmd6qXHeA5md5`>90o~}Gl&StAUOz!nB14p%GeZ0aIHU>mG&^jGYd(mA{u>)a*y@H(8g*X6!e4Ffa#$1++=q z70I+EM+qUxQ3{wS2?1e&NHH-IKFw&pN$^{FK#oI>L#2q)x{wmwv!^h)<* z33zDJ8Oo7MbNFs^M`)HEx9d9MDz=?%DPf_*F}AYvf_FukRnd05z+!Sg_4umbrw6~E z7#}H`%+_<)7Qd^QXx@{t@0rS6?GLb-Mew#j%mQh;% z5tQprzF5k*^6rDjv$mOPYbKQZLNk~wCfE#&%mH2qG+ z(1xPlteMPUeF5BPrqXQMqcAMlU4p*v{;6kvF;DUf7Nr~o>!cn)MMb3e+G(f>epDj= z3bh!L%lTu)efVfhU#z7}?4$|vU^X)$q1>+LW2M7Dru@rLOtl*o6;%;q^W(P1#3lGj zN=j{QZJXnzm4>Dg?$ZI-!5l8NxRMwCZqJ^j^jLPUmz6xtp?KX)K`8V|@hJZKP8hpb zD7Hv-S$V-!w?vyHS`s691^+bJ6fImO_j7P~)*IJ6VX0##=`q_oFp$MrTocH4mcEs~ zWq{I=4L;E-YHNE#!Tunpu(XL5_E0QwZ5q{0$ zC^!lXb<%bDf8Dq~k)LY{*k8gD&$;-=2V$b;=&H*Ycikik2{7Cs8-M+l)d-q+! z>ir81leRT;^&EZR70+8?mwnxy=leTpn&Gm<6l}@N=IcS%SLgZKX};1K`VWU2Ifs*n zvR>!r278C$yicJRHDuN@rxu)C*6(4qnB=*h*!wXm>|v|X&B z_Zw!m%uPCH86M^0t$|(nK5KEvR`WVvJ|3Pfr}nU_d`b9fgNUVo3e5iC zIg@x8`=b$833eHHuhH@$b_j{PJmul$t|h?w*Y)8SaRy5^DzmF<{auahLH&fd}nF7sg-B3MV#MOWCO&T_m$|;mQoC zV>DXdOlo)?Z;ZiZDfzH!{SJGLtyVsJXFm}-Tm+k8i(x}qA45`8YS4FWdef2?qKGTo zmKh7zRg#=C>Aws)4eiV}y)YFK|Fya^Q(qH`3wk{?KdB_%K}3I5?z>@tpfLV~7OzSqbq{Uw!e74Vx|&R%YOTIXAx|CI#Wh4s)4(}PIS7%<MOA+02|$40m-c>mJPZ{(9EYLNBMh&PG?^@TVWX8UF17t?y*8sWd*p#5Z~ zoc*g|aPhI--S%ARTb%DSEjnjyWmN)M=+~auSdkhO3Req|c_@i4xmf1IWFZJojk}yQ z!2c~#gqx@@1VL~ofd5W%n#BCNJeP z{~@jd@)<81XsB*}!av?_CD?j0fx$iR9=(OOwsCMGc?6eAK0V3>coCnY8ouSo#f7(e zx2O9>C z*oxZh4RTtMsqX23Etm|FxSv(|?N3>+V+2~R8D%!7KY_k?@f+~2<}v1w7m!5T8Q*<+ zT`{~L`!y38VqVuuz12NWd+O(TvG;osRQ^stCpE!;ruE#cyyx?|Z;5*3kY=#HLg?g% zr?lMEfF;n|)8FwrvF7m6M^K{Eg<&tVsCNkYhA1KE=YZ4H1Sfq<<4E@a6=+gK2phBr zrmJP_gj_H_s@@;c<+^x4QfNO^QHmxWHc{6!vHJZ;fme$~&*rJ}ijod%OJ-*IaYXa8 zJ6Wue$i6|^OhWwUwCvE2O@_Zlm08)hlWaKaMY^q2B@752%F+JgO@cfzz4M21B*0Iv zWb-So8@Ny9smQ&2>vF{enpi7&-*lyDW2^kd{7asO$6_uR;SXc=rrkAT9F=dE@G6>; zC{Dx3RK2DO3HljRCQ>3Z`i?m-_Txuf4v93SQQN%MW4HXb%v5^eyT=tNUAjlZ6^&3L z`TXQO=v@>py>|4)%RG5!OgQCb{F1G@@;xW>&%@`f-P94=2|Dzh8Ul_z-#~TW(@@#p zFF??s`&@0?aez8S-MK@8Qv@D;5{qLi=EBl@=e zc>(k;iZs|OmtLAp{mSOucc*RdLHskl-hS){Yj8Nh1EQRR34!+Vv`m-wPEIX`Uu{3nn?k>i#km6bCvj*~I6?c-Kx8hcs1?$BCyO zaxpNxDZ*gLN3@(W;wizGMN5+!t`3`2$;yE#e&a=9iDa~z@bMf`y~`T-qf+;08fr_g z9_&+|FX2YSF1N`XUQMIyY;6uIQkp9iysZuU_gXIU9+WK|e(>;Tp-Txi;XvWrTBA-p z%L1-0*34%SiPk7ads*ifm6#Z!X(_~()^rR$FLSVD$6cst@ydi3I|6S$2%rd6kYJr2 z#eExcV$3sNoE=jyzqD?OBk188iSr02N*;q7Y2Auw-tl4*c>>V1K+~c{Bd!`NY;4wk z0hL$*&#t0rUgg3eUkBrtRdy z?fYX$m(eZkW z?W?8R9S(8#SD=wCH~9aw1v;bqS7!eS{co-K+u6Sj0{^q$|K={SoHBh|gr|C2!JjW9 OprN9p{PnR_*na>&K!GLz literal 4828 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 diff --git a/irr/include/SkinnedMesh.h b/irr/include/SkinnedMesh.h index b4283dbaf..41e726946 100644 --- a/irr/include/SkinnedMesh.h +++ b/irr/include/SkinnedMesh.h @@ -10,6 +10,7 @@ #include "SSkinMeshBuffer.h" #include "aabbox3d.h" #include "irrMath.h" +#include "irrTypes.h" #include "matrix4.h" #include "quaternion.h" #include "vector3d.h" @@ -70,8 +71,11 @@ public: void setAnimationSpeed(f32 fps) override; //! **Must not be called**. - //! TODO refactor Irrlicht so that we need not implement this. - IMesh *getMesh(f32) override { assert(false); }; + IMesh *getMesh(f32) override { + // 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 //! by multiplying with respective parent matrices. diff --git a/irr/src/CAnimatedMeshSceneNode.cpp b/irr/src/CAnimatedMeshSceneNode.cpp index 7073d04ef..422875aaa 100644 --- a/irr/src/CAnimatedMeshSceneNode.cpp +++ b/irr/src/CAnimatedMeshSceneNode.cpp @@ -9,6 +9,7 @@ #include "ISceneManager.h" #include "S3DVertex.h" #include "Transform.h" +#include "irrTypes.h" #include "matrix4.h" #include "os.h" #include "SkinnedMesh.h" @@ -549,7 +550,7 @@ void CAnimatedMeshSceneNode::addJoints() ISceneNode *parent = this; if (joint->ParentJointID) parent = PerJoint.SceneNodes.at(*joint->ParentJointID); // exists because of topo. order - assert(parent); + _IRR_DEBUG_BREAK_IF(!parent); const auto *matrix = std::get_if(&joint->transform); PerJoint.SceneNodes.push_back(new CBoneSceneNode( parent, SceneManager, 0, i, joint->Name, diff --git a/irr/src/CXMeshFileLoader.cpp b/irr/src/CXMeshFileLoader.cpp index 90a376134..f2c4e94e6 100644 --- a/irr/src/CXMeshFileLoader.cpp +++ b/irr/src/CXMeshFileLoader.cpp @@ -555,13 +555,7 @@ bool CXMeshFileLoader::parseDataObjectFrame(SkinnedMesh::SJoint *Parent) core::matrix4 matrix; if (!parseDataObjectTransformationMatrix(matrix)) return false; - auto transform = core::Transform::decompose(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; - } + joint->transform = matrix; } else if (objectName == "Mesh") { /* frame.Meshes.push_back(SXMesh()); diff --git a/irr/src/SkinnedMesh.cpp b/irr/src/SkinnedMesh.cpp index 83a2c0788..cf58121ba 100644 --- a/irr/src/SkinnedMesh.cpp +++ b/irr/src/SkinnedMesh.cpp @@ -412,7 +412,7 @@ void SkinnedMesh::topoSortJoints() { size_t n = AllJoints.size(); - std::vector new_to_old_id; // new id -> old id + std::vector new_to_old_id; std::vector> children(n); for (u16 i = 0; i < n; ++i) { @@ -429,7 +429,6 @@ void SkinnedMesh::topoSortJoints() children[new_to_old_id[i]].end()); } - // old id -> new id std::vector old_to_new_id(n); for (u16 i = 0; i < n; ++i) old_to_new_id[new_to_old_id[i]] = i; diff --git a/src/unittest/test_irr_gltf_mesh_loader.cpp b/src/unittest/test_irr_gltf_mesh_loader.cpp index 6884fe0fe..6cd6f0f1d 100644 --- a/src/unittest/test_irr_gltf_mesh_loader.cpp +++ b/src/unittest/test_irr_gltf_mesh_loader.cpp @@ -394,22 +394,20 @@ SECTION("simple skin") const auto joints = csm->getAllJoints(); REQUIRE(joints.size() == 3); - const auto findJoint = [&](const std::function &predicate) { - for (std::size_t i = 0; i < joints.size(); ++i) { - if (predicate(joints[i])) { - return joints[i]; + const auto findJoint = [&](const std::function &predicate) { + for (const auto *joint : joints) { + if (predicate(joint)) { + return joint; } } throw std::runtime_error("joint not found"); }; // Check the node hierarchy - const auto *parent = findJoint([](auto *joint) { - return !joint->ParentJointID; - }); 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") {