void spSkeleton_updateWorldTransform (const spSkeleton* self) { int i, ii, nn, last; _spSkeleton* internal = SUB_CAST(_spSkeleton, self); for (i = 0; i < self->bonesCount; ++i) self->bones[i]->rotationIK = self->bones[i]->rotation; i = 0; last = internal->boneCacheCount - 1; while (1) { for (ii = 0, nn = internal->boneCacheCounts[i]; ii < nn; ++ii) spBone_updateWorldTransform(internal->boneCache[i][ii]); if (i == last) break; spIkConstraint_apply(self->ikConstraints[i]); i++; } }
void spSkeleton_updateWorldTransform (const spSkeleton* self) { int i; _spSkeleton* internal = SUB_CAST(_spSkeleton, self); for (i = 0; i < internal->updateCacheCount; ++i) { _spUpdate* update = internal->updateCache + i; switch (update->type) { case SP_UPDATE_BONE: spBone_updateWorldTransform((spBone*)update->object); break; case SP_UPDATE_IK_CONSTRAINT: spIkConstraint_apply((spIkConstraint*)update->object); break; case SP_UPDATE_TRANSFORM_CONSTRAINT: spTransformConstraint_apply((spTransformConstraint*)update->object); break; } } }