All notable changes to this project are recorded here, grouped as Added, Changed, Fixed, Removed and Security. The project uses Semantic Versioning. Before 1.0.0, any release may change the API, the ABI and every data format.
maniSkeleton_BlendPoses refuses a threshold below
FLT_MIN. The threshold must be at least FLT_MIN (2^-126) and at
most 1. A subnormal threshold, which 0.8.0 accepted and which could
blend translations and scales to infinity or NaN, now returns
mani_errorInvalid and leaves the output pose as it was. Graphs blend
at MANI_BLEND_THRESHOLD (1e-5) and are not affected
(#216).Results change only for the inputs above, which gave the identity or a
zero direction before. Every other pose, sample, skinned vertex, file
byte and format version is the same, and no pinned hash moves. As with
every release before 1.0.0, a graph instance, spring state or trainer
checkpoint saved by 0.8.0 is refused with mani_errorVersion: keep
assets, not saved states, across the upgrade.
int32_t, and flag sets have
uint32_t typedefs. All 33 kind, mode and choice typedefs, such as
maniLoopPolicy, are int32_t; a negative value is refused like one
past the last value. New flag-set typedefs are maniGraphSyncFlags,
maniGraphClipFlags, maniRootAxes and maniMatchEntryFlags, and the
fields that hold them take them, as does maniClipSource.loop, now a
maniLoopPolicy. Rename MANI_MATCH_LOOP, MANI_MATCH_NO_JUMP and
MANI_MATCH_MIRRORED to maniMatchEntryLoop, maniMatchEntryNoJump
and maniMatchEntryMirrored. maniMorphTargets_GetAttribute returns
-1 past the count, where it returned UINT32_MAX. Code that keeps a
kind in a uint32_t variable or compares it with an unsigned value
updates its types
(#199).maniLearnedTrainerReport.iteration is iterationCount, and
maniRootMoveIdentity is maniMakeRootMoveIdentity
(#198).bool, and maniHash64 takes an
int64_t count. maniIsCpuBackendSupported and maniCheckCpu
return bool instead of an int32_t 1 or 0, so a caller comparing
the result with 1 tests it as a bool. maniHash64 hashes any byte
count up to INT64_MAX; pass the count without narrowing it. Hash
values are unchanged
(#176).maniBuilder_CopyBuilt, maniBuilder_CopySkeletonOrder,
maniGltf_GetMorphWeights, maniFbx_GetMorphWeights and
maniLearnedTrainer_SaveCheckpoint also zero the caller's array up to
its capacity; a short skeleton order is no longer filled as far as it
goes. A too-small buffer still reports the size or count it needed.
maniBuildGltfClip and maniBuildFbxClip write boundOut only when
the clip builds. maniClip_GetRootMotionSource and
maniInfluences_GetCenter clear their output when they return false,
and the name getters of learned models and motion databases clear
lengthOut when they return NULL. The headers say what each output
holds after a failure
(#165,
#174).mani_errorBusy and writes none of its outputs, since they may be the
ones the call in progress is filling. maniOpenGltf and
maniOpenFbx still set their handle to NULL
(#173).maniGltf_SupplyBuffer, maniGltf_ReadSprings and
maniGltf_ReadRagdoll return mani_errorBusy when called from the
builder's allocator. maniLearnedTrainer_SaveCheckpoint and
maniBuildLearnedModelFromTrainer return it when called from the
trainer's allocator or task hooks. While a model is built from a
trainer, maniLearnedTrainer_Train,
maniLearnedTrainer_RestoreCheckpoint and
maniDestroyLearnedTrainer on that trainer return it too. Each
refusal counts one misuse
(#187,
#197).maniBlendRootMotion's moveOut may be one of moves,
maniLearnedModel_Project's stateOut may be query, and
maniMorphTargets_ComputeTargetWeights' targetWeightsOut may be
channelWeights
(#195).maniMorphTargets_ComputeTargetWeights gave wrong weights when its
output was its own channel weights. It now computes them in place with
the same bits as apart
(#193).maniRetargetMap_RetargetPose gave a wrong pose when the target pose
was the source pose, or shared memory with it. It now refuses any
overlap of the two poses with mani_errorInvalid and writes nothing
(#194).mani_errorBusy, and a closing document reads as empty
(#187).Poses, samples, file bytes and format versions do not change. As with
every release before 1.0.0, a graph instance, spring state or trainer
checkpoint saved by 0.7.0 is refused with mani_errorVersion: keep
assets, not saved states, across the upgrade.
maniObject_Verb: a getter
maniObject_GetThing, a predicate maniObject_IsThing. The object is
the library object the call takes first, such as a clip, a pose, a
skeleton, a graph instance, a builder or a glTF document, even where
the call only reads it: maniSampleClip is maniClip_Sample,
maniClipDuration is maniClip_GetDuration, maniPoseIsDifference
is maniPose_IsDifference and maniBlendPoses is
maniSkeleton_BlendPoses. Creation, destruction and calls with no
object keep a verb first: every maniOpen..., maniInit...,
maniCreate... and maniBuild... keeps its name, and the importers'
builds take that shape (maniGltfBuildClip is maniBuildGltfClip).
The misuse counts are maniBuilder_GetMisuse and
maniLearnedTrainer_GetMisuse, maniResultName is
maniGetResultName, the CPU check is maniIsCpuBackendSupported, and
the task hook types end in Function. Math on plain values keeps its
name (maniRootMoveIdentity, maniComposeRootMotion,
maniDecomposeAffine, maniHash64). Rename every call in the table
below; the parameters stay the same, except for maniPose_AddLayers
(#156).maniPose_AddLayers takes the pose first. A pose a call
changes in place is its object, so maniAddPoses(skeleton, pose,
layers, count) is maniPose_AddLayers(pose, skeleton, layers,
count). Swap the first two arguments; a compiler refuses or warns
about the old order, since the two pointers have different types. The
IK solvers already took the pose first and keep their order as
maniPose_SolveTwoBone and the others
(#156).Poses, samples and file bytes do not change; only the names do. As
with every release before 1.0.0, a graph instance, spring state or
trainer checkpoint saved by 0.6.0 is refused with mani_errorVersion:
keep assets, not saved states, across the upgrade.
| Before | After |
|---|---|
maniResultName |
maniGetResultName |
maniTaskFn |
maniTaskFunction |
maniEnqueueTaskFn |
maniEnqueueTaskFunction |
maniFinishTaskFn |
maniFinishTaskFunction |
maniPoseDifference |
maniSkeleton_ComputePoseDifference |
maniBlendPoses |
maniSkeleton_BlendPoses |
maniBuildMask |
maniSkeleton_BuildMask |
maniAddPoses |
maniPose_AddLayers |
maniBodyIkScratchSize |
maniSkeleton_GetBodyIkScratchSize |
maniSolveBodyXpbd |
maniPose_SolveBodyXpbd |
maniSolveBodySdls |
maniPose_SolveBodySdls |
maniBuilderMisuses |
maniBuilder_GetMisuse |
maniMeasureClip |
maniBuilder_MeasureClip |
maniCopyBuilt |
maniBuilder_CopyBuilt |
maniCopySkeletonOrder |
maniBuilder_CopySkeletonOrder |
maniClipCompressed |
maniClip_IsCompressed |
maniClipDuration |
maniClip_GetDuration |
maniClipSampleRate |
maniClip_GetSampleRate |
maniClipSampleCount |
maniClip_GetSampleCount |
maniClipLoopPolicy |
maniClip_GetLoopPolicy |
maniClipAdditiveBasis |
maniClip_GetAdditiveBasis |
maniClipIdentity |
maniClip_GetIdentity |
maniClipSkeletonIdentity |
maniClip_GetSkeletonIdentity |
maniSampleClip |
maniClip_Sample |
maniClipFloatTrackCount |
maniClip_GetFloatTrackCount |
maniClipFloatTrackName |
maniClip_GetFloatTrackName |
maniSampleClipBones |
maniClip_SampleBones |
maniClipCursorSize |
maniClip_GetCursorSize |
maniClipCursorCompactSize |
maniClip_GetCursorCompactSize |
maniSampleClipCursor |
maniClipCursor_Sample |
maniSampleClipFloatsCursor |
maniClipCursor_SampleFloats |
maniClipFindFloatTrack |
maniClip_FindFloatTrack |
maniSampleClipFloats |
maniClip_SampleFloats |
maniClipDiscreteTrackCount |
maniClip_GetDiscreteTrackCount |
maniClipDiscreteTrackName |
maniClip_GetDiscreteTrackName |
maniClipFindDiscreteTrack |
maniClip_FindDiscreteTrack |
maniClipDiscreteValue |
maniClip_GetDiscreteValue |
maniClipEventCount |
maniClip_GetEventCount |
maniClipEventAt |
maniClip_GetEvent |
maniClipEventRange |
maniClip_GetEventRange |
maniClipMarkerCount |
maniClip_GetMarkerCount |
maniClipMarkerAt |
maniClip_GetMarker |
maniGraphIdentity |
maniGraph_GetIdentity |
maniGraphSkeletonIdentity |
maniGraph_GetSkeletonIdentity |
maniGraphNodeCount |
maniGraph_GetNodeCount |
maniGraphParameterCount |
maniGraph_GetParameterCount |
maniGraphFindParameter |
maniGraph_FindParameter |
maniGraphParameterTypeOf |
maniGraph_GetParameterType |
maniGraphParameterName |
maniGraph_GetParameterName |
maniGraphClipCount |
maniGraph_GetClipCount |
maniGraphClipIdentity |
maniGraph_GetClipIdentity |
maniGraphClipName |
maniGraph_GetClipName |
maniGraphDatabaseCount |
maniGraph_GetDatabaseCount |
maniGraphDatabaseIdentity |
maniGraph_GetDatabaseIdentity |
maniGraphDatabaseName |
maniGraph_GetDatabaseName |
maniGraphModelCount |
maniGraph_GetModelCount |
maniGraphModelIdentity |
maniGraph_GetModelIdentity |
maniGraphModelName |
maniGraph_GetModelName |
maniGraphSpringSetCount |
maniGraph_GetSpringSetCount |
maniGraphSpringSetIdentity |
maniGraph_GetSpringSetIdentity |
maniGraphSpringSetName |
maniGraph_GetSpringSetName |
maniGraphRetargetMapCount |
maniGraph_GetRetargetMapCount |
maniGraphRetargetMapIdentity |
maniGraph_GetRetargetMapIdentity |
maniGraphMirrorMapIdentity |
maniGraph_GetMirrorMapIdentity |
maniGraphRetargetMapSourceIdentity |
maniGraph_GetRetargetMapSourceIdentity |
maniGraphClipRetargetMap |
maniGraph_GetClipRetargetMap |
maniGraphNodeKindOf |
maniGraph_GetNodeKind |
maniGraphNodeInputCount |
maniGraph_GetNodeInputCount |
maniGraphNodeInput |
maniGraph_GetNodeInput |
maniGraphOutputNode |
maniGraph_GetOutputNode |
maniGraphNodeSourcePlace |
maniGraph_GetNodeSourcePlace |
maniGraphBindingSize |
maniGraph_GetBindingSize |
maniGraphInstanceSize |
maniGraphBinding_GetInstanceSize |
maniSetGraphParameter |
maniGraphInstance_SetParameter |
maniSetGraphPose |
maniGraphInstance_SetPose |
maniGetGraphPose |
maniGraphInstance_GetPose |
maniGetGraphParameter |
maniGraphInstance_GetParameter |
maniInspectGraphNode |
maniGraphInstance_InspectNode |
maniSaveGraphInstance |
maniGraphInstance_Save |
maniRestoreGraphInstance |
maniGraphInstance_Restore |
maniUpdateGraph |
maniGraphInstance_Update |
maniGraphScratchSize |
maniGraphBinding_GetScratchSize |
maniEvaluateGraph |
maniGraphInstance_Evaluate |
maniGraphSubsetSize |
maniGraphBinding_GetSubsetSize |
maniGraphSubsetBones |
maniGraphSubset_GetBones |
maniEvaluateGraphSubset |
maniGraphInstance_EvaluateSubset |
maniSolveTwoBone |
maniPose_SolveTwoBone |
maniSolveAim |
maniPose_SolveAim |
maniSolveCcd |
maniPose_SolveCcd |
maniSolveFabrik |
maniPose_SolveFabrik |
maniGltfBufferCount |
maniGltf_GetBufferCount |
maniGltfBufferUri |
maniGltf_GetBufferUri |
maniGltfSupplyBuffer |
maniGltf_SupplyBuffer |
maniGltfSkeletonCount |
maniGltf_GetSkeletonCount |
maniGltfSkinCount |
maniGltf_GetSkinCount |
maniGltfSkinSkeleton |
maniGltf_GetSkinSkeleton |
maniGltfNodeCount |
maniGltf_GetNodeCount |
maniGltfBuildSkeleton |
maniBuildGltfSkeleton |
maniGltfBuildNodeSkeleton |
maniBuildGltfNodeSkeleton |
maniGltfSkeletonPlacement |
maniGltf_GetSkeletonPlacement |
maniGltfBuildSkin |
maniBuildGltfSkin |
maniGltfNodeBoneName |
maniGltf_GetNodeBoneName |
maniGltfRenamedCount |
maniGltf_GetRenamedCount |
maniGltfRenamedNode |
maniGltf_GetRenamedNode |
maniGltfAnimationCount |
maniGltf_GetAnimationCount |
maniGltfAnimationName |
maniGltf_GetAnimationName |
maniGltfBuildClip |
maniBuildGltfClip |
maniGltfReadSprings |
maniGltf_ReadSprings |
maniGltfReadRagdoll |
maniGltf_ReadRagdoll |
maniGltfMeshCount |
maniGltf_GetMeshCount |
maniGltfPrimitiveCount |
maniGltf_GetPrimitiveCount |
maniGltfPrimitiveTargetCount |
maniGltf_GetPrimitiveTargetCount |
maniGltfNodeMesh |
maniGltf_GetNodeMesh |
maniGltfNodeSkin |
maniGltf_GetNodeSkin |
maniGltfMorphWeights |
maniGltf_GetMorphWeights |
maniGltfBuildInfluences |
maniBuildGltfInfluences |
maniGltfBuildMorphTargets |
maniBuildGltfMorphTargets |
maniFbxVersion |
maniFbx_GetVersion |
maniFbxModelCount |
maniFbx_GetModelCount |
maniFbxModelBoneName |
maniFbx_GetModelBoneName |
maniFbxRenamedCount |
maniFbx_GetRenamedCount |
maniFbxRenamedModel |
maniFbx_GetRenamedModel |
maniFbxSkeletonCount |
maniFbx_GetSkeletonCount |
maniFbxSkinCount |
maniFbx_GetSkinCount |
maniFbxSkinSkeleton |
maniFbx_GetSkinSkeleton |
maniFbxSkinModel |
maniFbx_GetSkinModel |
maniFbxReadSettings |
maniFbx_ReadSettings |
maniFbxBuildSkeleton |
maniBuildFbxSkeleton |
maniFbxBuildModelSkeleton |
maniBuildFbxModelSkeleton |
maniFbxSkeletonPlacement |
maniFbx_GetSkeletonPlacement |
maniFbxBuildSkin |
maniBuildFbxSkin |
maniFbxSkinMethod |
maniFbx_GetSkinMethod |
maniFbxBuildInfluences |
maniBuildFbxInfluences |
maniFbxMorphCount |
maniFbx_GetMorphCount |
maniFbxMorphModel |
maniFbx_GetMorphModel |
maniFbxMorphTargetCount |
maniFbx_GetMorphTargetCount |
maniFbxBuildMorphTargets |
maniBuildFbxMorphTargets |
maniFbxMorphWeights |
maniFbx_GetMorphWeights |
maniFbxClipCount |
maniFbx_GetClipCount |
maniFbxClipName |
maniFbx_GetClipName |
maniFbxBuildClip |
maniBuildFbxClip |
maniFbxModelPlacement |
maniFbx_GetModelPlacement |
maniLearnedModelIdentity |
maniLearnedModel_GetIdentity |
maniLearnedModelSkeletonIdentity |
maniLearnedModel_GetSkeletonIdentity |
maniLearnedModelDatabaseIdentity |
maniLearnedModel_GetDatabaseIdentity |
maniLearnedModelChannel |
maniLearnedModel_GetChannel |
maniLearnedModelNormalization |
maniLearnedModel_GetNormalization |
maniLearnedModelProjector |
maniLearnedModel_GetProjector |
maniLearnedModelFloatTrackCount |
maniLearnedModel_GetFloatTrackCount |
maniLearnedModelEventCount |
maniLearnedModel_GetEventCount |
maniLearnedModelFloatTrackName |
maniLearnedModel_GetFloatTrackName |
maniLearnedModelEventName |
maniLearnedModel_GetEventName |
maniLearnedScratchSize |
maniLearnedModel_GetScratchSize |
maniLearnedProject |
maniLearnedModel_Project |
maniLearnedStep |
maniLearnedModel_Step |
maniLearnedDecompress |
maniLearnedModel_Decompress |
maniLearnedTrainerMisuses |
maniLearnedTrainer_GetMisuse |
maniTrainLearned |
maniLearnedTrainer_Train |
maniSaveLearnedCheckpoint |
maniLearnedTrainer_SaveCheckpoint |
maniRestoreLearnedCheckpoint |
maniLearnedTrainer_RestoreCheckpoint |
maniMotionDatabaseIdentity |
maniMotionDatabase_GetIdentity |
maniMotionDatabaseMirrorMapIdentity |
maniMotionDatabase_GetMirrorMapIdentity |
maniMotionDatabaseSkeletonIdentity |
maniMotionDatabase_GetSkeletonIdentity |
maniMotionDatabaseClipIdentity |
maniMotionDatabase_GetClipIdentity |
maniMotionDatabaseChannel |
maniMotionDatabase_GetChannel |
maniMotionDatabaseChannelName |
maniMotionDatabase_GetChannelName |
maniMotionDatabaseEntry |
maniMotionDatabase_GetEntry |
maniMotionDatabaseFrame |
maniMotionDatabase_GetFrame |
maniMotionDatabaseFeatures |
maniMotionDatabase_GetFeatures |
maniMotionDatabaseNormalization |
maniMotionDatabase_GetNormalization |
maniSearchMotionDatabase |
maniMotionDatabase_Search |
maniMirrorMapIdentity |
maniMirrorMap_GetIdentity |
maniMirrorMapSkeletonIdentity |
maniMirrorMap_GetSkeletonIdentity |
maniMirrorMapAxis |
maniMirrorMap_GetAxis |
maniMirrorPartner |
maniMirrorMap_GetPartner |
maniMirrorBoneFlags |
maniMirrorMap_GetBoneFlags |
maniMirrorMapUnmatchedBone |
maniMirrorMap_GetUnmatchedBone |
maniMirrorName |
maniMirrorMap_MirrorName |
maniMirrorNameHash |
maniMirrorMap_MirrorNameHash |
maniMirrorPose |
maniMirrorMap_MirrorPose |
maniMirrorRootMotion |
maniMirrorMap_MirrorRootMotion |
maniMorphVertexCount |
maniMorphTargets_GetVertexCount |
maniMorphChannelCount |
maniMorphTargets_GetChannelCount |
maniMorphTargetCount |
maniMorphTargets_GetTargetCount |
maniMorphAttributeCount |
maniMorphTargets_GetAttributeCount |
maniMorphAttribute |
maniMorphTargets_GetAttribute |
maniMorphChannelName |
maniMorphTargets_GetChannelName |
maniMorphFindChannel |
maniMorphTargets_FindChannel |
maniMorphTargetName |
maniMorphTargets_GetTargetName |
maniMorphFindTarget |
maniMorphTargets_FindTarget |
maniMorphChannelTargets |
maniMorphTargets_GetChannelTargets |
maniMorphTargetFullWeight |
maniMorphTargets_GetTargetFullWeight |
maniMorphTargetWeights |
maniMorphTargets_ComputeTargetWeights |
maniPoseSize |
maniSkeleton_GetPoseSize |
maniPoseBoneCount |
maniPose_GetBoneCount |
maniPoseLocal |
maniPose_GetLocal |
maniPoseSetLocal |
maniPose_SetLocal |
maniPoseReadLocals |
maniPose_ReadLocals |
maniPoseWriteLocals |
maniPose_WriteLocals |
maniPoseSetRest |
maniPose_SetRest |
maniComputeModel |
maniPose_ComputeModel |
maniPoseModelCurrent |
maniPose_IsModelCurrent |
maniPoseIsDifference |
maniPose_IsDifference |
maniPoseModel |
maniPose_GetModel |
maniPoseReadModels |
maniPose_ReadModels |
maniPoseModelTransform |
maniPose_GetModelTransform |
maniRagdollIdentity |
maniRagdoll_GetIdentity |
maniRagdollSkeletonIdentity |
maniRagdoll_GetSkeletonIdentity |
maniRagdollBodyCount |
maniRagdoll_GetBodyCount |
maniRagdollReadBody |
maniRagdoll_GetBody |
maniRagdollBodiesFromPose |
maniRagdoll_ComputeBodiesFromPose |
maniRagdollJointTargets |
maniRagdoll_ComputeJointTargets |
maniRagdollPoseFromBodies |
maniRagdoll_ComputePoseFromBodies |
maniRagdollGetUpPlacement |
maniRagdoll_ComputeGetUpPlacement |
maniRetargetMapIdentity |
maniRetargetMap_GetIdentity |
maniRetargetMapSourceIdentity |
maniRetargetMap_GetSourceIdentity |
maniRetargetMapTargetIdentity |
maniRetargetMap_GetTargetIdentity |
maniRetargetScratchSize |
maniRetargetMap_GetScratchSize |
maniRetargetPose |
maniRetargetMap_RetargetPose |
maniRetargetRootMotion |
maniRetargetMap_RetargetRootMotion |
maniClipRootMotion |
maniClip_GetRootMotion |
maniRestoreRootMotion |
maniClip_RestoreRootMotion |
maniClipRootMotionSource |
maniClip_GetRootMotionSource |
maniSkeletonBoneCount |
maniSkeleton_GetBoneCount |
maniSkeletonIdentity |
maniSkeleton_GetIdentity |
maniSkeletonParent |
maniSkeleton_GetParent |
maniSkeletonSubtreeEnd |
maniSkeleton_GetSubtreeEnd |
maniSkeletonRest |
maniSkeleton_GetRest |
maniSkeletonBoneName |
maniSkeleton_GetBoneName |
maniSkeletonFindBone |
maniSkeleton_FindBone |
maniSkinJointCount |
maniSkin_GetJointCount |
maniSkinSkeletonIdentity |
maniSkin_GetSkeletonIdentity |
maniSkinIdentity |
maniSkin_GetIdentity |
maniSkinJoint |
maniSkin_GetJoint |
maniSkinInverseBind |
maniSkin_GetInverseBind |
maniComputePalette |
maniPose_ComputePalette |
maniInfluencesVertexCount |
maniInfluences_GetVertexCount |
maniInfluencesPerVertex |
maniInfluences_GetPerVertex |
maniInfluencesFitSkin |
maniInfluences_IsSkinFit |
maniInfluence |
maniInfluences_GetInfluence |
maniInfluencesDualQuaternionWeight |
maniInfluences_GetDualQuaternionWeight |
maniInfluencesCenter |
maniInfluences_GetCenter |
maniPaletteDualQuaternions |
maniConvertPaletteToDualQuaternions |
maniPaletteRows |
maniConvertPaletteToRows |
maniSpringSetIdentity |
maniSpringSet_GetIdentity |
maniSpringSetSkeletonIdentity |
maniSpringSet_GetSkeletonIdentity |
maniSpringSetSpringCount |
maniSpringSet_GetSpringCount |
maniSpringSetSpringName |
maniSpringSet_GetSpringName |
maniSpringSetStepRate |
maniSpringSet_GetStepRate |
maniSpringStateSize |
maniSpringSet_GetStateSize |
maniStepSprings |
maniSpringState_Step |
maniApplySprings |
maniSpringState_Apply |
maniResetSprings |
maniSpringState_Reset |
maniSaveSpringState |
maniSpringState_Save |
maniRestoreSpringState |
maniSpringState_Restore |
maniTrajectoryFeatures |
maniMotionDatabase_ComputeTrajectoryFeatures |
maniCpuSupportsBackend |
maniIsCpuBackendSupported |
MANI_ABI_VERSION, format
version, header size), so their headers are 32 bytes and every saved
state's bytes change. maniRestoreGraphInstance,
maniRestoreSpringState and maniRestoreLearnedCheckpoint refuse a
state written by a release of another ABI version with
mani_errorVersion: before 1.0.0 that is any other release, from
1.0.0 another minor release. A state saved by 0.5.0 or earlier is
refused. Keep assets, not saved states, across an upgrade. Poses,
samples and file bytes do not change
(#134).maniSaveGraphInstance, maniSaveSpringState and
maniSaveLearnedCheckpoint take a sizeOut after the capacity, and a
NULL buffer with capacity 0 measures. maniGraphStateSize,
maniSpringSavedSize and maniLearnedCheckpointSize are removed:
call the save with a NULL buffer instead
(#129).maniMotionDatabaseFeatures,
maniMotionDatabaseNormalization, maniLearnedModelNormalization,
maniMorphTargetWeights and maniLearnedProject take a capacity and
a countOut after the array; maniGltfMorphWeights and
maniFbxMorphWeights take a capacity in place of the exact count, and
a countOut; maniRagdollBodiesFromPose, maniRagdollJointTargets
and maniBuildMask take a countOut after the capacity.
maniLearnedOutput gains floatTrackCapacity and eventCapacity
after its arrays. A NULL array with capacity 0 measures
(#133).size_t. Every name getter (the
skeleton's bones, a clip's tracks, the graph's slots and parameters, a
motion database's channels, a learned model's tracks and events, morph
channels and targets, a spring set's springs, and the glTF and FBX
importers' names) reports a length through size_t*, and every name
length a public struct carries is size_t, so a name read from one
call passes into a source unchanged. A builder refuses a name longer
than the new MANI_MAX_NAME_BYTES (2^31 - 1 bytes) with
mani_errorLimit, at the reason and item it gives that name
otherwise; before, a morph channel name past it was refused with
mani_errorInvalid, and a graph event name past it was hashed as if
empty
(#135,
#138).maniGraphMapCount, maniGraphMapIdentity,
maniGraphMapSourceIdentity and maniGraphClipMap are
maniGraphRetargetMapCount, maniGraphRetargetMapIdentity,
maniGraphRetargetMapSourceIdentity and maniGraphClipRetargetMap;
MANI_MAX_GRAPH_MAPS is MANI_MAX_GRAPH_RETARGET_MAPS;
maniGraphClipSource.map is retargetMap, and maniGraphAssets.maps
and mapCount are retargetMaps and retargetMapCount
(#136).MANI_MAX_NAME_BYTES refusal, and
the getting-started guide gives the bound as an example of a fixed one
(#155).mani_errorInvalid and maniBuildReasonCount,
before any name is read, and where size_t has 32 bits, sections past
what one allocation holds are refused with mani_errorCapacity
(#143).size_t has 32 bits (WebAssembly), listed names totalling 4 GiB wrapped
the room for their partners, which were then written past it; such a
source is refused with mani_errorCapacity
(#142).mani_errorInvalid and maniBuildReasonCount, and
the mirror map's sections past size_t with mani_errorCapacity
(#144,
#151).mani_errorLimit
(#153).mani_errorVersion, an earlier one included;
it used to accept an earlier version and read it with the current
layout. Build every stored file again from its source. Poses, samples
and other outputs do not change; only hashes of file bytes move
(#113).mani_errorVersion is -7 (was -4) and mani_errorFormat is -8 (was
-3). mani_errorState is removed: a call from an object's own host
code (its allocator or task hooks) is refused with the new
mani_errorBusy (-10) in its place, and still counts one misuse. Code
that compares results by name only renames mani_errorState to
mani_errorBusy
(#115).mani_errorLimit (-9). An
argument, or a builder's or the trainer's source, past a bound the
library publishes returns mani_errorLimit in place of
mani_errorInvalid, with the same reason and item. This covers the
aim, CCD, FABRIK and full-body IK solvers, the motion database search,
and the skeleton, skin, influences, clip, morph targets, spring set,
retargeting map, motion database, learned model, trainer and graph
builders. A bound checked while opening a file is still
mani_errorFormat, and a range of a parameter's meaning (a weight in
[0, 1], a cone up to pi) is still mani_errorInvalid. Full-body IK
scratch that is too small returns mani_errorCapacity, not
mani_errorInvalid
(#117).MANI_MAX_*.
MANI_AIM_MAX_BONES is MANI_MAX_AIM_BONES, MANI_IK_CHAIN_MAX_BONES
is MANI_MAX_IK_CHAIN_BONES, MANI_IK_MAX_ITERATIONS is
MANI_MAX_IK_ITERATIONS, MANI_SPRING_MAX_RATE is
MANI_MAX_SPRING_RATE, MANI_MORPH_MAX_ATTRIBUTES is
MANI_MAX_MORPH_ATTRIBUTES, and the MANI_BODY_IK_MAX_*,
MANI_MATCH_MAX_*, MANI_LEARNED_MAX_* and MANI_GRAPH_MAX_* names
are MANI_MAX_BODY_IK_*, MANI_MAX_MATCH_*, MANI_MAX_LEARNED_* and
MANI_MAX_GRAPH_*. A name that keeps the old form (MANI_AIM_MAX_CONE,
MANI_SPRING_MAX_STEPS, MANI_GRAPH_LEARNED_MAX_STEPS) is a range or
an internal cap, not a bound refused with mani_errorLimit
(#117).reserved field. The field is
removed from every public struct, and builders no longer refuse a
source for a nonzero one. Remove it from initializers.
maniFileResult is {result, tag, offset}: tag names the section
the first wrong byte lies in, 0 in the header and table, so positional
initializers take the tag second
(#109).maniBuildGraph refuses, with maniBuildReasonNode at the
node's place, a root node that names a clip, sync group, database,
model or spring set slot past the root's own list. In a graph with a
subgraph such a node used to build with the subgraph's slot of that
number: with 1 clip in the root and 1 in the subgraph, a root clip
node naming slot 1 played the subgraph's clip. Only a host's own
maniGraphSource structs reach this; the JSON form resolves each name
within its own graph. Every other graph builds to the same bytes. To
migrate, list in the root every asset and sync group its nodes name
(#93).MANI_MAX_INFLUENCES (64 weighted influences on a vertex) and
MANI_MAX_GRAPH_DEPTH (16 levels of subgraphs) are public
(#117).mani_errorLimit,
mani_errorBusy and the one format version a release reads, and its
examples drop the reserved field and use the new constant names.0xFFFFFFFF as its count is refused at that entry's count. It
was still refused, but at a later, wrong place. Valid databases open
and build as before
(#107).maniBuildGraph refuses with maniBuildReasonNode, at the
node's place, a node inside a subgraph that names a clip, sync group,
database, model or spring set slot past the subgraph's own list. Such
a graph used to build when the root had a slot of that number, which
the node then named: with 2 clips in the subgraph and 9 in the root,
a clip node naming slot 3 played the root's clip 3. It also refuses
with maniBuildReasonCount a subgraph with a list whose count is not
zero and whose pointer is NULL; its clip, sync group, database, model
and spring set lists used to be read through that pointer when a node
named one of their slots. Only a host's own maniGraphSource structs
reach either case; the JSON form resolves and checks its lists. Every
other graph builds to the same bytes. To migrate, list in each
subgraph every asset and sync group its nodes name
(#77).-msse2 -mfpmath=sse), so it needs a processor with SSE2, and every
build now leaves trapping math at the compiler's default, from the
family's compiler flags. 64-bit builds' tests and pinned hashes pass
unchanged
(#73).maniBuildGraph refuses a subgraph's sync group whose name is NULL
with maniBuildReasonCount at item 0, before anything is laid out, as
it refuses a subgraph's list that is not given. A root's own nameless
group is still refused by the check with the sync group list's Name
reason. Only a host's own maniGraphSource structs reach this; the
JSON form always gives a name. Every graph that built before builds to
the same bytes
(#81).MANI_GRAPH_MAX_TIME_FACTOR (1e6), which is far past any playback
rate a graph needs. A scale that reads a parameter counts at the
larger size of the parameter's bounds, and a time scale may read only
a parameter with bounds. Scales on parallel branches never multiply.
maniBuildGraph refuses a source past either rule with
maniBuildReasonScalar, and maniOpenGraph refuses such a file with
mani_errorFormat. Each node record now holds its time factor, so
the graph format goes from 5 to 6, and maniOpenGraph refuses an
earlier format with mani_errorVersion. To migrate, give bounds to
each parameter a time scale reads, and build every graph file again.
Results do not change for any graph still taken.
(#66)FLT_MAX: the fade time of a
machine and of a one-shot, and an inertialize node's step and elapsed
time. Every timer value below FLT_MAX gives the same bits as
before.
(#67)-O2 with GCC: 68,562 bytes,
against ozz-animation's 69,698. The skeleton's opener and the file
checks are compiled for size under GCC and Clang. With GCC, opening a
skeleton takes about 7% more instructions and opening a compressed
clip about 9% more. Opening a full clip or a motion database does not
change, and neither does any call made every frame. Results do not
change.
(#29)maniOpenMotionDatabase refuses any other format version with
mani_errorVersion. Build databases again from their sources, along
with the graphs that name them, since a database's identity changes.
A learned trainer's checkpoint does not resume against a rebuilt
database.
maniMotionDatabaseSource gains leafFrames (8, 16 or 32 frames a
leaf, 0 for 16) and a reserved word that must be 0, so positional
initializers must name them.
(#24)maniOpenClip refuses a clip of
any other format version, compressed or full precision, with
mani_errorVersion. Build stored clips again from their sources, or
compress them again from full-precision clips made with this release.maniUpdateGraph, maniEvaluateGraph and
maniEvaluateGraphSubset complete the call with valid, finite
outputs and return mani_errorFormat, and maniLearnedStep,
maniLearnedProject and maniLearnedDecompress return
mani_errorFormat instead of success. maniGraphNodeView's reserved
word is now failed.The first release: skeletal animation from import to the skinned vertex, with the same results on every platform, compiler and SIMD backend, and no allocation at run time.
VRMC_springBone 1.0 defines them, with its extended
colliders and limits, the same motion at any frame rate.EXT_meshopt_compression,
KHR_meshopt_compression, KHR_draco_mesh_compression,
KHR_animation_pointer, VRMC_springBone and the OMI_physics_*
extensions) and FBX import (binary and ASCII, versions 3000 to 7700):
skeletons, skins, influences, morph targets and clips.clang-cl, and WebAssembly.