nfrechette / acl-ue4-plugin Goto Github PK
View Code? Open in Web Editor NEWThe official Animation Compression Library Unreal Engine 4 and 5 plugin
License: MIT License
The official Animation Compression Library Unreal Engine 4 and 5 plugin
License: MIT License
I am using 4.26 and have added many paragon character animation into my demo project.
And I have set all anim sequences compressed with acl database(including additive animations) in one single database asset:
When I change database visual fidelity from lowest to high in our development pack, it crashes like this:
This mostly happens if lowest tiers are not stripped and load from medium to high.
But it doesn't crash in editor.
UE 4.23 introduced massive changes to the animation compression code and requires a lot of adjustments for ACL.
Note that UE 4.23.0 has a bug where automatic compression ignores the max end effector error threshold which messes up all stat reporting that I do. Once the bug is fixed, a release of the plugin will be made, hopefully with UE 4.23.1.
This is caused by two issues in ACL: nfrechette/acl#178 and nfrechette/acl#177
This is extremely rare.
Since high importance tier is stored inside the animation clip. if the database visual fidelity is lowest, the database should not be loaded into memory in the beginning. But it still shows up in the memreport:
But actually it is loaded into memory because the Database asset is a hard pointer:
As a result, this would cause database being loaded into the memory.
I've use obj ref for the database, and get this result:
Would a TAssetPtr
be better for this?
Once ACL supports streamable cosmetic joints, we must integrate it into the UE4 plugin.
In order to determine if a joint is cosmetic or not, we can use the LOD information from the skeleton. In the database codec, the settings should be split into two sections: one for the base joints, and one for the cosmetic joints. We must also specify the value to use for cosmetic joints, something like anything above LOD 2 is cosmetic. We should also expose a list of joints that are forced to be base joints. This is required if we need to decompress them individually (as opposed to part of the whole pose). We need to warn, similarly to bind pose stripping which this feature will depend on.
See FSkeletalMeshLODModel::RequiredBones
for LOD information.
The visual fidelity level currently has 3 levels: lowest, medium, highest
. This must be expanded by 3 new levels.
Lowest
will contain only the base joint clips which are always loaded in memory (tier 0).Low
will contain base tier 0 and 1Medium
will contain base tier 0, 1, and 2MediumHigh
will contain all 3 base tiers and cosmetic tier 0High
will contain all 3 base tiers and cosmetic tier 0 and 1Highest
will contain all 3 base tiers and cosmetic tier 0, 1, and 2It should be possible to strip cosmetic joints entirely similarly to how we can strip tier 2.
Hello Nic,
Its been a while. I hope you are well :)
One of our build machine suddenly fail to compile the ACL plugin.
...ACLPlugin\Source\ACLPlugin\Private\EditorDatabaseMonitor.cpp(3): error C4668: 'WITH_EDITORONLY_DATA' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif'
We're trying to figure out why this is happening exactly (could be how files are grouped together to build). Meanwhile, I'm posting a patch here to see if you think this could help avoid the issue.
acl-ue4-plugin-bae22f8-Build fix for some compile target.patch
I am trying v2.00 in a 4.26-based demo project.
This project is simply a third-person project which all animation sequences are compressed with ACL Database.
When I try to type memreport -full
command in the packed project, an error showed up:
It seems that something is wrong with serialization:
How can I handle this problem please?
And btw, I simply commented this line of code, and it seems that we the bulk data size is counted twice:
For a bitwise compression, the memory report is like:
How should I handle it please?
I am using 4.26 and have added many paragon character animation into my demo project.
And I have set all anim sequences compressed with acl database(including additive animations):
When I change database visual fidelity from lowest to high in our development pack, it crashes like this:
But it doesn't crash in editor.
Oops, it seems that it would still crash if you insert many animation sequences into one database like this:
In the spirit of bind pose stripping, we can leverage the fact that the output pose buffer contains the bind pose to store our compressed data relative to it. See here for the general idea.
Storing the compressed pose to be a full additive on top of the bind pose is expensive to reconstruct at runtime as it requires quaternion multiplication. Instead, we could store relative to the bind translation only by removing it from our raw data and adding it back after decompression. This is much faster and can be accomplished with 2 uOps: a vector addition and a memory load.
This would reduce the range of translation values to be centered around 0.0 which should help improve precision and reduce the memory footprint.
However, much like bind pose stripping, this cannot be supported for bones that are individually decompressed. In fact, if any bone is individually decompressed, we cannot support this. We could exclude the root but not arbitrary bones as easily.
sjson-cpp isn't used at runtime and is only used for debugging purposes. The headers should only be present when compiling the editor.
ACL has many warnings and errors added to the output log. To help searching for what they mean, a consistent naming scheme should be introduced.
E.g: [ACL_ERROR_02] - Track index %u is queried explicitly at runtime but can been stripped if equal to the bind pose. Make sure this bone is excluded or results will be incorrect!
This would allow someone to quickly google for the error code or to search the documentation for it. It would also allow us to document all error codes explicitly.
The commandlet allows us to run the UE4 automatic and ACL compression on clips within a folder that are stored in ACL SJSON format. We need a way to generate such clips from within UE4. The commandlet should iterate over all animations in the current project and export them into ACL SJSON format.
Can we add an editor UI option to export individual clips as well?
The XB1 and PS4 processors are slower and benefit from the single instruction for popcount.
See this sjson issue for details.
I appears that the C++ clang compiler tool-chain used by UE4 with UE 4.20 and earlier is not fully C++11 compliant. The C++11 standard mandates that when the <cinttypes>
header is included, all the formatting and other macros are defined automatically unlike the C99 which suggest that specific macros need to be defined first to control the behavior.
UE4 uses fast math which can change code generation. ACL has hand tuned code and carefully considers accuracy implications which means not only does it not benefit from fast math but it can hurt it. Some clips can have an error slightly different and some extreme clips can have an unacceptable error in UE4 as a result of fast math.
Disabling fast math per module or plugin is not possible in UE4 and so ACL needs to handle fast math, see this issue: nfrechette/acl#176
Hi Nic,
I hope you're doing well :)
I just started using unreal 5.2 and I have a feeling (I did not do an actual diff to confirm) that the compression after a reimport in slower in 5.2 vs 5.1.
Is it just me? If you dont see that, we'll make sure to compare our import times to verify what could be the reason.
Thanks
PM
Additive animation sequences need to use the proper baked additive base pose that is cached in the UAnimSequence otherwise a mismatch can arise. This leads to potential issues with accuracy.
The commandlet allows us to run the UE4 automatic and ACL compression on clips within a folder that are stored in ACL SJSON format. It would be nice if we could do this with clips contained within the current project. Similar to the recompression commandlet.
Asserts inside AnimBoneCompressionCodec_ACL.cpp crash the editor, we don't get much control to avoid this from trigger either. Once the default bone compression setting has been set via DefaultEngine.ini the system may compress an animation as soon as its shown in the content browser, causing this crash.
Exact error/line:
Assertion Failed: MaxTrackIndex < ACLBoneCount in AnimBoneCompressionCodec_ACL line 137 (using version 2.0.6)
Perhaps we can disable these checks more easily or use "ensure" instead of "check" if the failure is non critical and the editor should be allowed to continue execution.
I downloaded the 0.62 version of this plugin and setup it in the UE4 4.24.3.
When I compiling, It tips me "Error C1083 Cannot open include file: 'Animation/AnimEncodingRegistry.h': No such file or directory"
I don't know why or I missed something to do. Please help me out, thank you.
UE now supports custom curve compression codecs in plugins.
Use ACL to compress them as scalar tracks.
Processor AMD EPYC 7K83 64-Core Processor 2.54 GHz
Installed RAM 192 GB (189 GB usable)
Device ID 506B4908-0654-41AF-BC30-357C92B31A8E
Product ID 00454-60000-00001-AA819
System type 64-bit operating system, x64-based processor
Pen and touch No pen or touch input is available for this display
Platform Windows
Error:
In file included from D:/machine/appbuildgroup/Intermediate/Build/Linux/B4D820EA/Server/Development/ACLPlugin/Module.ACLPlugin.gen.cpp:2: In file included from D:/machine/appbuildgroup/Intermediate/Build/Linux/B4D820EA/Server/Inc/ACLPlugin/ACLImpl.gen.cpp:8: In file included from ../Plugins/ACLPlugin/Source\ACLPlugin/Public/ACLImpl.h:85: In file included from ../Plugins/ACLPlugin/Source/ThirdParty/acl/includes\acl/decompression/decompress.h:41: In file included from ../Plugins/ACLPlugin/Source/ThirdParty/acl/includes\acl/decompression/impl/decompression_context_selector.h:30: In file included from ../Plugins/ACLPlugin/Source/ThirdParty/acl/includes\acl/decompression/impl/decompression.transform.h:40: D:\machine\appbuildgroup\EngineSource\Engine\Plugins\ACLPlugin\Source\ThirdParty\acl\includes\acl\decompression\impl\animated_track_cache.transform.h(1153,53): error: use of undeclared identifier '_mm_hadd_epi32'; did you mean '_mm_add_epi32'? group_bit_size_per_component0_v = _mm_hadd_epi32(_mm_hadd_epi32(group_bit_size_per_component0_v, group_bit_size_per_component0_v), group_bit_size_per_component0_v); ^~~~~~~~~~~~~~ _mm_add_epi32 C:\dev\UnrealToolchains\v17_clang-10.0.1-centos7\x86_64-unknown-linux-gnu\lib\clang\10.0.1\include\emmintrin.h(2161,1): note: '_mm_add_epi32' declared here _mm_add_epi32(__m128i __a, __m128i __b) ^
For example:
#if ENGINE_MAJOR_VERSION >= 5 && ENGINE_MINOR_VERSION >= 1
will be false on 6.0, 7.0, etc.
ACL 1.2 should require everything we will need for the v1.0 release of the plugin. Due to delays in getting the UE4 refactor to support plugins natively being pushed back, a v0,3 release will be made with the latest ACL release. Specifically, it will add support for floating point sample rates (nfrechette/acl#123) which is problematic at the moment (#7). Many other issues are fixed and a few optimizations are included as well.
It can lead to a crash or incorrect output.
This will be fixed in ACL 2.0 and in the next version of the UE4 plugin.
Hi, I am currently working on our avatar mask feature for our engine.
For those bones that need to be ignored, I want to apply a default transform to the BoneAtom
instead of calling decompress_bone
function, which more or less, cost some performance.
I've tried like this, but it cannot work:
How can I handle this problem please?
Right now, the virtual vertex distance is an exposed setting and will be the same for every bone except high accuracy bones which end up with a separate distance. This is fine but it would be interesting to see if things would improve by using the preview mesh.
Having access to the mesh would avoid the need to ever tweak the distance since we know what value to use from the mesh. Only bones which have no skinning information would need a distance setting and we could use the high accuracy bone distance for that.
The number of constant/default tracks isn't calculated properly for clips that contain scale and more than one segment.
The bit mask isn't rotated correctly.
This isn't commonly used and as such it shouldn't impact many people. The bug has been present ever since the original ACL 0.1 release.
See nfrechette/acl#315 for details.
To be fixed in 0.6.2 and 1.0.3.
First of all, great work in ACL.
Hope it gets integrated in main codebase someday :o)
Now a suggestion, as I just stumbled upon this:
https://coderwall.com/p/6aw72a/creating-patch-from-github-pull-request
Ie, if you flatten all your commits in the 4.19 branch, then users could download & apply the patch from your single commit without cloning the whole repo itself (which is large enough).
Debug console commands require logging and the code isn't stripped at the moment.
Attempting to compress 0 tracks, compression will crash here:
const uint32_t num_bits_per_frame = animated_num_bits / context.num_samples;
Inside acl::compress_track_list(..)
Hello,
I merged acl v0.4 plugin (with acl library v1.2.1) into UE 4.22 and everything so far works fine except Android ARM64.
On ARM64 it crashes at below callstack. It seems like reading at wrong address if it encounters any acl-compressed animation.
Any idea would be greatly appreciated!
01-30 10:25:52.892 6578 6578 F DEBUG : backtrace:
01-30 10:25:52.893 6578 6578 F DEBUG : #00 pc 000000000463d4ac /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (__Float32x4_t acl::decompress_and_interpolate_vector<acl::uniformly_sampled::impl::TranslationDecompressionSettingsAdapter<acl::uniformly_sampled::DefaultDecompressionSettings>,
acl::uniformly_sampled::impl::DecompressionContext, acl::uniformly_sampled::impl::SamplingContext>(acl::uniformly_sampled::impl::TranslationDecompressionSettingsAdapter<acl::uniformly_sampled::DefaultDecompressionSettings> const&, acl::
01-30 10:25:52.893 6578 6578 F DEBUG : #01 pc 000000000463decc /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (void acl::uniformly_sampled::DecompressionContext<acl::uniformly_sampled::DefaultDecompressionSettings>::decompress_pose<UE4OutputWriter<true, false, true>>(UE4OutputWriter<true, false, true>&)+336)
01-30 10:25:52.893 6578 6578 F DEBUG : #02 pc 0000000004639d70 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (_ZN30AEFACLCompressionCodec_Default19GetPoseTranslationsER6TArrayI10FTransform18TMemStackAllocatorILj0EEERKS0_I13BoneTrackPair17FDefaultAllocatorER33FAnimSequenceDecompressionContext+948)
01-30 10:25:52.893 6578 6578 F DEBUG : #03 pc 00000000068ead10 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (_Z32AnimationFormat_GetAnimationPoseR6TArrayI10FTransform18TMemStackAllocatorILj0EEERKS_I13BoneTrackPair17FDefaultAllocatorES9_S9_R33FAnimSequenceDecompressionContext+68)
01-30 10:25:52.893 6578 6578 F DEBUG : #04 pc 0000000006954f44 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (UAnimSequence::GetBonePose(FCompactPose&, FBlendedCurve&, FAnimExtractContext const&, bool) const+5168)
01-30 10:25:52.893 6578 6578 F DEBUG : #05 pc 0000000006953558 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (UAnimSequence::GetAnimationPose(FCompactPose&, FBlendedCurve&, FAnimExtractContext const&) const+780)
01-30 10:25:52.893 6578 6578 F DEBUG : #06 pc 00000000069380f8 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_SequencePlayer::Evaluate_AnyThread(FPoseContext&)+1960)
01-30 10:25:52.893 6578 6578 F DEBUG : #07 pc 0000000006935e80 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FPoseLink::Evaluate(FPoseContext&)+108)
01-30 10:25:52.893 6578 6578 F DEBUG : #08 pc 00000000063501e0 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_BlendListBase::Evaluate_AnyThread(FPoseContext&)+1312)
01-30 10:25:52.893 6578 6578 F DEBUG : #09 pc 0000000006935e80 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FPoseLink::Evaluate(FPoseContext&)+108)
01-30 10:25:52.893 6578 6578 F DEBUG : #10 pc 00000000063501e0 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_BlendListBase::Evaluate_AnyThread(FPoseContext&)+1312)
01-30 10:25:52.893 6578 6578 F DEBUG : #11 pc 0000000006935e80 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FPoseLink::Evaluate(FPoseContext&)+108)
01-30 10:25:52.893 6578 6578 F DEBUG : #12 pc 0000000006935e80 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FPoseLink::Evaluate(FPoseContext&)+108)
01-30 10:25:52.893 6578 6578 F DEBUG : #13 pc 000000000693cf70 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_StateMachine::Evaluate_AnyThread(FPoseContext&)+1652)
01-30 10:25:52.893 6578 6578 F DEBUG : #14 pc 0000000006935e80 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FPoseLink::Evaluate(FPoseContext&)+108)
01-30 10:25:52.893 6578 6578 F DEBUG : #15 pc 0000000006936eb0 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_SaveCachedPose::Evaluate_AnyThread(FPoseContext&)+168)
01-30 10:25:52.893 6578 6578 F DEBUG : #16 pc 0000000006935e80 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FPoseLink::Evaluate(FPoseContext&)+108)
01-30 10:25:52.893 6578 6578 F DEBUG : #17 pc 0000000006935e80 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FPoseLink::Evaluate(FPoseContext&)+108)
01-30 10:25:52.893 6578 6578 F DEBUG : #18 pc 00000000063549d0 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_LayeredBoneBlend::Evaluate_AnyThread(FPoseContext&)+812)
01-30 10:25:52.893 6578 6578 F DEBUG : #19 pc 0000000006935e80 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FPoseLink::Evaluate(FPoseContext&)+108)
01-30 10:25:52.893 6578 6578 F DEBUG : #20 pc 0000000006935e80 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FPoseLink::Evaluate(FPoseContext&)+108)
01-30 10:25:52.893 6578 6578 F DEBUG : #21 pc 0000000006942534 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_ConvertLocalToComponentSpace::EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext&)+92)
01-30 10:25:52.893 6578 6578 F DEBUG : #22 pc 00000000069412c4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FComponentSpacePoseLink::EvaluateComponentSpace(FComponentSpacePoseContext&)+104)
01-30 10:25:52.893 6578 6578 F DEBUG : #23 pc 000000000638fd18 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_SkeletalControlBase::EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext&)+36)
01-30 10:25:52.893 6578 6578 F DEBUG : #24 pc 00000000069412c4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FComponentSpacePoseLink::EvaluateComponentSpace(FComponentSpacePoseContext&)+104)
01-30 10:25:52.893 6578 6578 F DEBUG : #25 pc 000000000638fd18 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_SkeletalControlBase::EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext&)+36)
01-30 10:25:52.893 6578 6578 F DEBUG : #26 pc 00000000069412c4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FComponentSpacePoseLink::EvaluateComponentSpace(FComponentSpacePoseContext&)+104)
01-30 10:25:52.893 6578 6578 F DEBUG : #27 pc 000000000638fd18 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_SkeletalControlBase::EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext&)+36)
01-30 10:25:52.893 6578 6578 F DEBUG : #28 pc 00000000069412c4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FComponentSpacePoseLink::EvaluateComponentSpace(FComponentSpacePoseContext&)+104)
01-30 10:25:52.893 6578 6578 F DEBUG : #29 pc 000000000638fd18 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_SkeletalControlBase::EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext&)+36)
01-30 10:25:52.893 6578 6578 F DEBUG : #30 pc 00000000069412c4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FComponentSpacePoseLink::EvaluateComponentSpace(FComponentSpacePoseContext&)+104)
01-30 10:25:52.893 6578 6578 F DEBUG : #31 pc 000000000638fd18 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_SkeletalControlBase::EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext&)+36)
01-30 10:25:52.893 6578 6578 F DEBUG : #32 pc 00000000069412c4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FComponentSpacePoseLink::EvaluateComponentSpace(FComponentSpacePoseContext&)+104)
01-30 10:25:52.893 6578 6578 F DEBUG : #33 pc 000000000638fd18 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_SkeletalControlBase::EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext&)+36)
01-30 10:25:52.893 6578 6578 F DEBUG : #34 pc 00000000069412c4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FComponentSpacePoseLink::EvaluateComponentSpace(FComponentSpacePoseContext&)+104)
01-30 10:25:52.893 6578 6578 F DEBUG : #35 pc 000000000638fd18 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_SkeletalControlBase::EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext&)+36)
01-30 10:25:52.893 6578 6578 F DEBUG : #36 pc 00000000069412c4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FComponentSpacePoseLink::EvaluateComponentSpace(FComponentSpacePoseContext&)+104)
01-30 10:25:52.893 6578 6578 F DEBUG : #37 pc 000000000638fd18 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_SkeletalControlBase::EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext&)+36)
01-30 10:25:52.893 6578 6578 F DEBUG : #38 pc 00000000069412c4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FComponentSpacePoseLink::EvaluateComponentSpace(FComponentSpacePoseContext&)+104)
01-30 10:25:52.893 6578 6578 F DEBUG : #39 pc 000000000638fd18 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_SkeletalControlBase::EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext&)+36)
01-30 10:25:52.893 6578 6578 F DEBUG : #40 pc 00000000069412c4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FComponentSpacePoseLink::EvaluateComponentSpace(FComponentSpacePoseContext&)+104)
01-30 10:25:52.894 6578 6578 F DEBUG : #41 pc 0000000006942040 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_ConvertComponentToLocalSpace::Evaluate_AnyThread(FPoseContext&)+76)
01-30 10:25:52.894 6578 6578 F DEBUG : #42 pc 0000000006935e80 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FPoseLink::Evaluate(FPoseContext&)+108)
01-30 10:25:52.894 6578 6578 F DEBUG : #43 pc 0000000006942534 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_ConvertLocalToComponentSpace::EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext&)+92)
01-30 10:25:52.894 6578 6578 F DEBUG : #44 pc 00000000069412c4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FComponentSpacePoseLink::EvaluateComponentSpace(FComponentSpacePoseContext&)+104)
01-30 10:25:52.894 6578 6578 F DEBUG : #45 pc 0000000004ae0404 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FCustomBodyNode::EvaluateComponentSpace_AnyThread(FComponentSpacePoseContext&)+60)
01-30 10:25:52.894 6578 6578 F DEBUG : #46 pc 00000000069412c4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FComponentSpacePoseLink::EvaluateComponentSpace(FComponentSpacePoseContext&)+104)
01-30 10:25:52.894 6578 6578 F DEBUG : #47 pc 0000000006942040 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimNode_ConvertComponentToLocalSpace::Evaluate_AnyThread(FPoseContext&)+76)
01-30 10:25:52.894 6578 6578 F DEBUG : #48 pc 0000000006935e80 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FPoseLink::Evaluate(FPoseContext&)+108)
01-30 10:25:52.894 6578 6578 F DEBUG : #49 pc 0000000004ae1f10 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FCustomFace::Evaluate_AnyThread(FPoseContext&)+176)
01-30 10:25:52.894 6578 6578 F DEBUG : #50 pc 0000000006935e80 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FPoseLink::Evaluate(FPoseContext&)+108)
01-30 10:25:52.894 6578 6578 F DEBUG : #51 pc 000000000690e20c /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimInstanceProxy::EvaluateAnimationNode(FPoseContext&)+920)
01-30 10:25:52.894 6578 6578 F DEBUG : #52 pc 00000000068f6b7c /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FAnimInstanceProxy::EvaluateAnimation(FPoseContext&)+764)
01-30 10:25:52.894 6578 6578 F DEBUG : #53 pc 00000000068f6794 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (UAnimInstance::ParallelEvaluateAnimation(bool, USkeletalMesh const*, FBlendedHeapCurve&, FCompactPose&)+640)
01-30 10:25:52.894 6578 6578 F DEBUG : #54 pc 0000000006afc338 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (USkeletalMeshComponent::EvaluateAnimation(USkeletalMesh const*, UAnimInstance*, FVector&, FBlendedHeapCurve&, FCompactPose&) const+804)
01-30 10:25:52.894 6578 6578 F DEBUG : #55 pc 0000000006afca1c /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (_ZN22USkeletalMeshComponent26PerformAnimationProcessingEPK13USkeletalMeshP13UAnimInstancebR6TArrayI10FTransform17FDefaultAllocatorES9_R7FVectorR17FBlendedHeapCurve+988)
01-30 10:25:52.894 6578 6578 F DEBUG : #56 pc 0000000006b018e4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (USkeletalMeshComponent::ParallelAnimationEvaluation()+92)
01-30 10:25:52.894 6578 6578 F DEBUG : #57 pc 0000000006b00114 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (USkeletalMeshComponent::DoParallelEvaluationTasks_OnGameThread()+388)
01-30 10:25:52.894 6578 6578 F DEBUG : #58 pc 0000000006aff090 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (USkeletalMeshComponent::RefreshBoneTransforms(FActorComponentTickFunction*)+7296)
01-30 10:25:52.894 6578 6578 F DEBUG : #59 pc 0000000006af626c /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (USkeletalMeshComponent::InitAnim(bool, bool)+648)
01-30 10:25:52.894 6578 6578 F DEBUG : #60 pc 0000000006af5ab4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (USkeletalMeshComponent::OnRegister()+76)
01-30 10:25:52.894 6578 6578 F DEBUG : #61 pc 0000000006a7c044 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (UActorComponent::ExecuteRegisterEvents()+648)
01-30 10:25:52.894 6578 6578 F DEBUG : #62 pc 0000000006a7b5c4 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (UActorComponent::RegisterComponentWithWorld(UWorld*)+2240)
01-30 10:25:52.894 6578 6578 F DEBUG : #63 pc 0000000006891c74 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (AActor::IncrementalRegisterComponents(int)+1016)
01-30 10:25:52.894 6578 6578 F DEBUG : #64 pc 0000000006da1234 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (ULevel::IncrementalUpdateComponents(int, bool)+1668)
01-30 10:25:52.894 6578 6578 F DEBUG : #65 pc 00000000074caa48 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (UWorld::UpdateWorldComponents(bool, bool)+376)
01-30 10:25:52.894 6578 6578 F DEBUG : #66 pc 00000000074d8714 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (UWorld::InitializeActorsForPlay(FURL const&, bool)+532)
01-30 10:25:52.894 6578 6578 F DEBUG : #67 pc 00000000073fa880 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (UEngine::LoadMap(FWorldContext&, FURL, UPendingNetGame*, FString&)+9092)
01-30 10:25:52.894 6578 6578 F DEBUG : #68 pc 00000000073f655c /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (UEngine::Browse(FWorldContext&, FURL, FString&)+2748)
01-30 10:25:52.894 6578 6578 F DEBUG : #69 pc 00000000073f7dac /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (UEngine::TickWorldTravel(FWorldContext&, float)+768)
01-30 10:25:52.894 6578 6578 F DEBUG : #70 pc 0000000006c5e254 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (UGameEngine::Tick(float, bool)+3368)
01-30 10:25:52.894 6578 6578 F DEBUG : #71 pc 000000000446f080 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (FEngineLoop::Tick()+22236)
01-30 10:25:52.894 6578 6578 F DEBUG : #72 pc 0000000004467e78 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (AndroidMain(android_app*)+3552)
01-30 10:25:52.894 6578 6578 F DEBUG : #73 pc 00000000044740fc /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so (android_main+148)
01-30 10:25:52.894 6578 6578 F DEBUG : #74 pc 000000000448eea8 /data/app/com.XXX-k3tO3kZiJvYBUgd1kTiuCw==/lib/arm64/libUE4.so
01-30 10:25:52.894 6578 6578 F DEBUG : #75 pc 0000000000084df8 /system/lib64/libc.so (__pthread_start(void*)+208)
01-30 10:25:52.894 6578 6578 F DEBUG : #76 pc 0000000000023ac4 /system/lib64/libc.so (__start_thread+68)
https://github.com/adamrehn/ue4-ci-helpers
https://github.com/adamrehn/ue4-docker
Can we use docker images for this?
Some UE4 animation sequences can have a sample/frame rate that isn't a whole number. e.g. 5 frames in 4 seconds. This does not usually happen but old sequences might have been impacted by an import bug sometime in the past.
ACL rounds the frame rate to a whole number and uses it to optimize the error but as a result, it does not measure the error like UE4 does. Even though the ACL reported error will still be very low, UE4 might report a high error. This happens because they disagree on where to measure the error in the animation sequence. As such, even though UE4 might report a high error, the sequence itself should be very accurate regardless and any error is unlikely to be visible to the naked eye.
A workaround is to re-import those impacted sequences to make sure their frame rate is a whole number (e.g. 30 FPS).
ACL will implement floating point sample rate support at some point in the future, this is tracked by this issue: nfrechette/acl#123
The animation codec refactor has finally been merged into the Dev-Anim branch. The plugin needs to be updated to work with it. This will bring it into its final form in order to be published on the Unreal Marketplace.
Custom engine changes should no longer be required with that branch.
The guidelines can be found here: https://www.unrealengine.com/en-US/marketplace-guidelines
PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;
![UE4](https://img.shields.io/badge/UE4-4.25%2B-orange)
Package ...
action, see hereIsBeta
flag from upluginSee here for an example.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.