Skip to content

Commit cf47328

Browse files
committed
Move skeleton building and blending to engine
1 parent 782d78f commit cf47328

File tree

6 files changed

+130
-7
lines changed

6 files changed

+130
-7
lines changed

src/engine/client/cg_msgdef.h

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,18 +96,36 @@ namespace Util {
9696
}
9797
};
9898

99+
template<> struct SerializeTraits<std::vector<BoneMod>> {
100+
static void Write( Writer& stream, const std::vector<BoneMod>& boneMods ) {
101+
stream.WriteSize( boneMods.size() );
102+
stream.WriteData( boneMods.data(), boneMods.size() * sizeof( BoneMod ) );
103+
}
104+
105+
static std::vector<BoneMod> Read( Reader& stream ) {
106+
std::vector<BoneMod> boneMods;
107+
const size_t size = stream.ReadSize<BoneMod>();
108+
boneMods.resize( size );
109+
stream.ReadData( boneMods.data(), size * sizeof( BoneMod ) );
110+
return boneMods;
111+
}
112+
};
113+
99114
// Use that bone optimization for refEntity_t
100115
template<> struct SerializeTraits<refEntity_t> {
101116
static void Write(Writer& stream, const refEntity_t& ent)
102117
{
103-
stream.WriteData(&ent, offsetof(refEntity_t, skeleton));
104-
stream.Write<refSkeleton_t>(ent.skeleton);
118+
stream.WriteData(&ent, offsetof(refEntity_t, boneMods));
119+
stream.Write<std::vector<BoneMod>>( ent.boneMods );
120+
// stream.Write<refSkeleton_t>(ent.skeleton);
105121
}
122+
106123
static refEntity_t Read(Reader& stream)
107124
{
108125
refEntity_t ent;
109-
stream.ReadData(&ent, offsetof(refEntity_t, skeleton));
110-
ent.skeleton = stream.Read<refSkeleton_t>();
126+
stream.ReadData(&ent, offsetof(refEntity_t, boneMods));
127+
ent.boneMods = stream.Read<std::vector<BoneMod>>();
128+
// ent.skeleton = stream.Read<refSkeleton_t>();
111129
return ent;
112130
}
113131
};

src/engine/renderer/tr_animation.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1313,6 +1313,32 @@ static int IQMBuildSkeleton( refSkeleton_t *skel, skelAnimation_t *skelAnim,
13131313
return true;
13141314
}
13151315

1316+
void R_TransformSkeleton( refSkeleton_t* skel, const float scale ) {
1317+
skel->scale = scale;
1318+
1319+
switch ( skel->type ) {
1320+
case refSkeletonType_t::SK_INVALID:
1321+
case refSkeletonType_t::SK_ABSOLUTE:
1322+
return;
1323+
1324+
default:
1325+
break;
1326+
}
1327+
1328+
// calculate absolute transforms
1329+
for ( refBone_t* bone = &skel->bones[0]; bone < &skel->bones[skel->numBones]; bone++ ) {
1330+
if ( bone->parentIndex >= 0 ) {
1331+
refBone_t* parent;
1332+
1333+
parent = &skel->bones[bone->parentIndex];
1334+
1335+
TransCombine( &bone->t, &parent->t, &bone->t );
1336+
}
1337+
}
1338+
1339+
skel->type = refSkeletonType_t::SK_ABSOLUTE;
1340+
}
1341+
13161342
/*
13171343
==============
13181344
RE_BuildSkeleton
@@ -1468,6 +1494,7 @@ int RE_BuildSkeleton( refSkeleton_t *skel, qhandle_t hAnim, int startFrame, int
14681494
}
14691495

14701496
// FIXME: clear existing bones and bounds?
1497+
skel->numBones = 0;
14711498
return false;
14721499
}
14731500

src/engine/renderer/tr_local.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3730,6 +3730,7 @@ inline bool checkGLErrors()
37303730
int RE_CheckSkeleton( refSkeleton_t *skel, qhandle_t hModel, qhandle_t hAnim );
37313731
int RE_BuildSkeleton( refSkeleton_t *skel, qhandle_t anim, int startFrame, int endFrame, float frac,
37323732
bool clearOrigin );
3733+
void R_TransformSkeleton( refSkeleton_t* skel, const float scale );
37333734
int RE_BlendSkeleton( refSkeleton_t *skel, const refSkeleton_t *blend, float frac );
37343735
int RE_AnimNumFrames( qhandle_t hAnim );
37353736
int RE_AnimFrameRate( qhandle_t hAnim );

src/engine/renderer/tr_main.cpp

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2095,19 +2095,74 @@ void R_AddEntitySurfaces()
20952095
}
20962096
else
20972097
{
2098-
switch ( tr.currentModel->type )
2099-
{
2098+
switch ( tr.currentModel->type ) {
21002099
case modtype_t::MOD_MESH:
21012100
R_AddMDVSurfaces( ent );
21022101
break;
21032102

21042103
case modtype_t::MOD_MD5:
2104+
/* Log::Warn("%i %s: old: %i-%i %f new: %i-%i %f | %f %f", ent->e.animationHandle,
2105+
R_GetAnimationByHandle( ent->e.animationHandle )->name, ent->e.startFrame,
2106+
ent->e.endFrame, ent->e.lerp, ent->e.startFrame2, ent->e.endFrame2, ent->e.lerp2,
2107+
ent->e.blendLerp, ent->e.scale ); */
2108+
if ( ent->e.scale == 0 ) {
2109+
ent->e.scale = 1;
2110+
}
2111+
if ( ent->e.animationHandle == 0 ) {
2112+
ent->e.animationHandle = ent->e.animationHandle2;
2113+
} else if ( ent->e.animationHandle2 == 0 ) {
2114+
ent->e.animationHandle2 = ent->e.animationHandle;
2115+
}
2116+
2117+
RE_BuildSkeleton( &ent->e.skeleton, ent->e.animationHandle, ent->e.startFrame, ent->e.endFrame,
2118+
ent->e.lerp, ent->e.clearOrigin );
2119+
ent->e.skeleton.scale = ent->e.scale;
2120+
if ( ent->e.blendLerp > 0.0 ) {
2121+
refSkeleton_t skel;
2122+
RE_BuildSkeleton( &skel, ent->e.animationHandle2, ent->e.startFrame2, ent->e.endFrame2,
2123+
ent->e.lerp2, ent->e.clearOrigin2 );
2124+
RE_BlendSkeleton( &ent->e.skeleton, &skel, ent->e.blendLerp );
2125+
}
2126+
2127+
for ( const BoneMod& boneMod : ent->e.boneMods ) {
2128+
QuatMultiply2( ent->e.skeleton.bones[boneMod.index].t.rot, boneMod.rotation );
2129+
}
21052130
R_AddMD5Surfaces( ent );
21062131
break;
21072132

21082133
case modtype_t::MOD_IQM:
2134+
{
2135+
/* Log::Warn("%i %s: old: %i-%i %f new: %i-%i %f | %f %f", ent->e.animationHandle,
2136+
R_GetAnimationByHandle( ent->e.animationHandle )->name, ent->e.startFrame,
2137+
ent->e.endFrame, ent->e.lerp, ent->e.startFrame2, ent->e.endFrame2, ent->e.lerp2,
2138+
ent->e.blendLerp, ent->e.scale ); */
2139+
bool transform = true;
2140+
if ( ent->e.scale == 0 ) {
2141+
ent->e.scale = 1;
2142+
}
2143+
if ( ent->e.animationHandle == 0 ) {
2144+
ent->e.animationHandle = ent->e.animationHandle2;
2145+
} else if ( ent->e.animationHandle2 == 0 ) {
2146+
ent->e.animationHandle2 = ent->e.animationHandle;
2147+
}
2148+
2149+
ent->e.skeleton.scale = ent->e.scale;
2150+
RE_BuildSkeleton( &ent->e.skeleton, ent->e.animationHandle, ent->e.startFrame, ent->e.endFrame,
2151+
ent->e.lerp, ent->e.clearOrigin );
2152+
if ( ent->e.blendLerp > 0.0 ) {
2153+
refSkeleton_t skel;
2154+
RE_BuildSkeleton( &skel, ent->e.animationHandle2, ent->e.startFrame2, ent->e.endFrame2,
2155+
ent->e.lerp2, ent->e.clearOrigin2 );
2156+
RE_BlendSkeleton( &ent->e.skeleton, &skel, ent->e.blendLerp );
2157+
}
2158+
2159+
for ( const BoneMod& boneMod : ent->e.boneMods ) {
2160+
QuatMultiply2( ent->e.skeleton.bones[boneMod.index].t.rot, boneMod.rotation );
2161+
}
2162+
R_TransformSkeleton( &ent->e.skeleton, ent->e.scale );
21092163
R_AddIQMSurfaces( ent );
21102164
break;
2165+
}
21112166

21122167
case modtype_t::MOD_BSP:
21132168
R_AddBSPModelSurfaces( ent );

src/engine/renderer/tr_types.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,12 @@ enum class refSkeletonType_t
156156
SK_ABSOLUTE
157157
};
158158

159+
struct BoneMod {
160+
int index;
161+
vec3_t translation;
162+
quat_t rotation;
163+
};
164+
159165
struct alignas(16) refSkeleton_t
160166
{
161167
refSkeletonType_t type; // skeleton has been reset
@@ -211,6 +217,21 @@ struct refEntity_t
211217

212218
int altShaderIndex;
213219

220+
qhandle_t animationHandle;
221+
int startFrame;
222+
int endFrame;
223+
float lerp;
224+
int clearOrigin;
225+
qhandle_t animationHandle2;
226+
int startFrame2;
227+
int endFrame2;
228+
float lerp2;
229+
int clearOrigin2;
230+
float blendLerp;
231+
float scale;
232+
233+
std::vector<BoneMod> boneMods;
234+
214235
// KEEP SKELETON AT THE END OF THE STRUCTURE
215236
// it is to make a serialization hack for refEntity_t easier
216237
// by memcpying up to skeleton and then serializing skeleton

src/shared/client/cg_api.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -448,6 +448,7 @@ qhandle_t trap_R_RegisterAnimation( const char *name )
448448
int trap_R_BuildSkeleton( refSkeleton_t *skel, qhandle_t anim, int startFrame, int endFrame, float frac, bool clearOrigin )
449449
{
450450
int result;
451+
skel->numBones = 0;
451452
VM::SendMsg<Render::BuildSkeletonMsg>(anim, startFrame, endFrame, frac, clearOrigin, *skel, result);
452453
return result;
453454
}
@@ -460,7 +461,7 @@ int trap_R_BlendSkeleton( refSkeleton_t *skel, const refSkeleton_t *blend, float
460461

461462
if ( skel->numBones != blend->numBones )
462463
{
463-
Log::Warn("trap_R_BlendSkeleton: different number of bones %d != %d", skel->numBones, blend->numBones);
464+
// Log::Warn("trap_R_BlendSkeleton: different number of bones %d != %d", skel->numBones, blend->numBones);
464465
return false;
465466
}
466467

0 commit comments

Comments
 (0)