From 5903b1235bcb27d82cbc75fd2d39d685093e8344 Mon Sep 17 00:00:00 2001 From: Rudolf Polzer Date: Thu, 22 Nov 2012 14:59:03 +0100 Subject: [PATCH] csqcmodel: provide helper functions for CSAD use --- qcsrc/csqcmodellib/cl_model.qc | 54 ++++++++++++++++++++++++++-------- qcsrc/csqcmodellib/cl_model.qh | 13 ++++++++ 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/qcsrc/csqcmodellib/cl_model.qc b/qcsrc/csqcmodellib/cl_model.qc index 163a5126d..065e5495c 100644 --- a/qcsrc/csqcmodellib/cl_model.qc +++ b/qcsrc/csqcmodellib/cl_model.qc @@ -28,9 +28,8 @@ var float autocvar_cl_nolerp = 0; .float csqcmodel_lerpfractime; .float csqcmodel_lerpfrac2time; -void CSQCModel_InterpolateAnimation_PreNote(float sf) +void CSQCModel_InterpolateAnimation_2To4_PreNote(float sf) { -#ifdef CSQCMODEL_HAVE_TWO_FRAMES if(sf & CSQCMODEL_PROPERTY_FRAME) { self.frame3 = self.frame; @@ -47,42 +46,62 @@ void CSQCModel_InterpolateAnimation_PreNote(float sf) self.csqcmodel_lerpfrac2time = self.csqcmodel_lerpfractime; self.lerpfrac = self.csqcmodel_lerpfrac; } -#else +} +void CSQCModel_InterpolateAnimation_1To2_PreNote(float sf) +{ if(sf & CSQCMODEL_PROPERTY_FRAME) { self.frame2 = self.frame; self.frame2time = self.frame1time; } +} +void CSQCModel_InterpolateAnimation_PreNote(float sf) +{ +#ifdef CSQCMODEL_HAVE_TWO_FRAMES + CSQCModel_InterpolateAnimation_2To4_PreNote(sf); +#else + CSQCModel_InterpolateAnimation_1To2_PreNote(sf); #endif } -void CSQCModel_InterpolateAnimation_Note(float sf) +void CSQCModel_InterpolateAnimation_2To4_Note(float sf, float set_times) { -#ifdef CSQCMODEL_HAVE_TWO_FRAMES if(sf & CSQCMODEL_PROPERTY_FRAME) { - self.frame1time = time; + if(set_times) + self.frame1time = time; } if(sf & CSQCMODEL_PROPERTY_FRAME2) { - self.frame2time = time; + if(set_times) + self.frame2time = time; } if(sf & CSQCMODEL_PROPERTY_LERPFRAC) { self.csqcmodel_lerpfrac = self.lerpfrac; - self.csqcmodel_lerpfractime = time; + if(set_times) + self.csqcmodel_lerpfractime = time; } -#else +} +void CSQCModel_InterpolateAnimation_1To2_Note(float sf, float set_times) +{ if(sf & CSQCMODEL_PROPERTY_FRAME) { - self.frame1time = time; + if(set_times) + self.frame1time = time; } +} +void CSQCModel_InterpolateAnimation_Note(float sf) +{ +#ifdef CSQCMODEL_HAVE_TWO_FRAMES + CSQCModel_InterpolateAnimation_2To4_Note(sf, FALSE); +#else + CSQCModel_InterpolateAnimation_1To2_Note(sf, FALSE); #endif } -void CSQCModel_InterpolateAnimation_Do() +void CSQCModel_InterpolateAnimation_2To4_Do() { -#ifdef CSQCMODEL_HAVE_TWO_FRAMES if(autocvar_cl_nolerp || (autocvar_cl_lerpanim_maxdelta_framegroups == 0)) { self.lerpfrac = self.csqcmodel_lerpfrac; @@ -127,7 +146,9 @@ void CSQCModel_InterpolateAnimation_Do() self.frame3time = 0; } } -#else +} +void CSQCModel_InterpolateAnimation_1To2_Do() +{ if(autocvar_cl_nolerp || (autocvar_cl_lerpanim_maxdelta_framegroups == 0)) { self.lerpfrac = 0; @@ -139,6 +160,13 @@ void CSQCModel_InterpolateAnimation_Do() else self.lerpfrac = 1 - bound(0, (time - self.frame1time) / autocvar_cl_lerpanim_maxdelta_framegroups, 1); } +} +void CSQCModel_InterpolateAnimation_Do() +{ +#ifdef CSQCMODEL_HAVE_TWO_FRAMES + CSQCModel_InterpolateAnimation_2To4_Do(); +#else + CSQCModel_InterpolateAnimation_1To2_Do(); #endif } diff --git a/qcsrc/csqcmodellib/cl_model.qh b/qcsrc/csqcmodellib/cl_model.qh index e8ea9012c..ded735741 100644 --- a/qcsrc/csqcmodellib/cl_model.qh +++ b/qcsrc/csqcmodellib/cl_model.qh @@ -35,3 +35,16 @@ void CSQCModel_Read(float isnew); entity CSQCModel_server2csqc(float pl); .float csqcmodel_teleported; + +// this is exported for custom frame animation code. Use with care. +// to update frames, first call this: +void CSQCModel_InterpolateAnimation_2To4_PreNote(float sf); +void CSQCModel_InterpolateAnimation_1To2_PreNote(float sf); +// then update frame, frame1time (and possibly frame2, frame2time, lerpfrac) +// if set_times is not set, caller is responsible for frame1time, frame2time, csqcmodel_lerpfractime! +void CSQCModel_InterpolateAnimation_2To4_Note(float sf, float set_times); +void CSQCModel_InterpolateAnimation_1To2_Note(float sf, float set_times); +// to retrieve animation state, call this +void CSQCModel_InterpolateAnimation_2To4_Do(); +void CSQCModel_InterpolateAnimation_1To2_Do(); +// will overwrite lerpfrac, lerpfrac3, lerpfrac4, and possibly clear frame*time if they are undisplayed according to lerpfracs -- 2.39.2