Havok 2010.2 – Release Notes
Released 16 November, 2010
Common
New Features (1)
-
[COM-795] Implement XML Tagfile Reader and Writer.
Reading XML tagfiles is now supported. Previously, only writing of XML-like tagfiles was supported.
The hkXmlTagfileReader class performs the reading of an XML tag file. The utility class hkSerializeUtil has been updated so that it will automatically use the hkXmlTagfileReader for reading.
Xml tag files are approximately 5 times the size of the binary tag files - although the size difference can be much larger, up to around 10 times the size. Timings of the speed of Xml tagfile against binary tagfile for a binary tagfile of the size are listed below. 2x means the Xml tagfile is twice as slow as the binary tagfile:
* < 100Kb 2.5x writing 2x reading
* ~ 1Mb 4x writing 6x reading
* ~ 32Mb 32x writing 21x reading
AssetCc1 and AssetCc2 tools have also been updated to allow conversion from and to Xml tagfiles. The SimpleLoadDemo has a variant for Xml tagfile to show how to read an Xml tagfile.
-
Improvements (21)
-
[COM-177] Work around limitations in XML number/string conversions.
Previously, floating point numbers defaulted to be written out as decimal in XML files, which lead to easy readability but could cause problems because of precision loss, and also because a floating point number may not be stored in floating point field (for example the w component of hkVector4 sometimes is used to hold an integer rather than a float).
Floating point numbers are now stored in XML tagfiles as hexadecimal - which is just the direct IEEE floating point encoding as hex.
In order to aid readability, the actual floating point values are also displayed as comments. These options can be controlled via the hkTagfileWriter::Options structure: m_exact will control whether the serialized file will encode as hex (m_exact = true) or as the floating point value (m_exact = false); m_verbose will control if the floating point values are included as comments. -
[COM-672] Header references are out of date in manual.
Some obsolete paths were replaced with correct versions.
-
[COM-759] Speed up hkMatrix4::invert.
On implementations that are SIMD enabled, the matrix4 invert has been replaced with a SIMD optimized version. On the PC with SSE the implementation is >5 times faster than the previous floating point implementation.
-
[COM-1002] hkSpuUtil::attachHelperThreadToSpurs() should be called from within hkSpuUtil constructor.
We now automatically call attachHelperThreadToSpurs() when the hkSpuUtil is constructed with a valid spurs instance. Clients should remove their explicit call to attachHelperThreadToSpurs unless they pass in a NULL spurs instance to hkSpuUtil during construction. Failing to do so will cause a warning.
Not calling this function could cause the SPUs to hang when trying to request more memory on the PPU. This is now also checked for. -
[COM-1217] Use the same underlying block size in the small freelists.
The hkFreeListAllocator constructor now has a new parameter of type hkFreeListAllocator::Cinfo which controls how freelists are constructed. Inside the structure the types of freelists required can be directly specified. A hkFreeListAllocator can allocate some memory internally that is not used directly for freelists. The size of these blocks can be specified with the m_preferedBlockSize member.
hkFreeListAllocator::setDefaultCinfo sets up the Cinfo to produce freelists in a style very similar to previous releases of Havok. Using it there may be a few different block sizes that the underlying allocator must be able to allocate. With 'setFixedSizeCinfo', the Cinfo will be configured such that all block sizes from the underlying allocator will be the same size.
Previously the hkFreeListAllocator had a hkLargeBlockAllocator as a member, such that all allocations for the freelists would come from the large block allocator, and then the large block allocator would get its memory from the underlying allocator passed to the constuctor. The side effect of this arrangement is that the underlying allocator will not see allocations of the specified freelist block size as they are combined in the hkLargeBlockAllocator. This may not be desirable as there may be an implementation of an allocator designed for a specific block size that will achieve better results than the hkLargeBlockAllocator. To handle this case the hkFreeListAllocator no longer contains a hkLargeBlockAllocator - and the allocator passed in the constructor is used directly for allocations. To get the same behavior as previously a hkLargeBlockAllocator instance should be passed to the constructor. The new method hkMemoryInitUtil::initFreeListLargeBlock which sets up a hkFreeListAllocator and a hkLargeBlockAllocator to work as previously. The method hkMemoryInitUtil::initFreeList - just sets up a hkFreeListAllocator using the passed in allocator for all allocation. Note that initFreeList takes a new parameter - hkMemoryAllocator::ExtendedInterface - so previous code will not compile without choosing if a large block allocator is required or not. -
[COM-1252] Improve reporting format of memory leaks.
In order to better summarize the leak detection output of hkCheckingMemorySystem heuristics based on ownership and age of allocations have been added. With memory leaks the major difficulty is that often not freeing one object leads to lots of other memory allocations not being freed. This leads to a long list of allocations being reported, but no idea of what caused the leak.
The update tries to determine the root allocation/s via some simple heuristics. The main heuristic is to try to determine allocation ownership by searching for pointers to other allocations inside each allocation. If an allocation contains a pointer to another allocation, it may 'own' the allocation being pointed to. If we end up with a tree like structure, the root of the tree is very likely to be the root allocation that wasn't freed and which caused all of the other allocations not to be freed. Unfortunately it can be the case that we don't have tree like structures - you can have cyclic associations (due to back pointers and other reasons). How do we then locate a root? In this situation the algorithm tries to find the smallest connected graph from each allocation. If there is more than one of the same size, the one with the oldest (ie happened first) allocation is assumed to be the root.
When reporting the hkCheckingMemorySystem lists the root allocation along with its call stack, and then all of the allocations which were reached from it in summary. -
[COM-1285] Add the option to specify an output directory for generateReflections.py.
generateReflections.py can now take an additional option: "--output-dir=<dir>". All generated source files will be output into this directory
-
[COM-1370] hkDataObjectDict causes large codesize increase.
Some large functions were being inlined in some configurations. Hints have been added to avoid this happening.
-
[COM-172] Dont use seek in hkObjectCopier::copyObject.
hkObjectCopier::copyObject now keeps track of its position in the stream and fills any unused space with zeros, instead of seeking and leaving uninitialized data in unused space
-
[COM-1038] Check for missing default in patch.
Patches Version Verify checks that any default specified in a reflected class definition matches the most recent class patch default. Suggested patches will include this default, if needed.
-
[COM-1131] Ability for user to easily customize the free list system block sizes without rebuilding hkBase.
The hkFreeListAllocator constructor now has a new parameter of type hkFreeListAllocator::Cinfo which controls how freelists are constructed. Inside the structure the types of freelists required can be directly specified. A hkFreeListAllocator can allocate some memory internally that is not used directly for freelists. The size of these blocks can be specified with the m_preferedBlockSize member.
hkFreeListAllocator::setDefaultCinfo sets up the Cinfo to produce freelists in a style very similar to previous releases of Havok. Using it there may be a few different block sizes that the underlying allocator must be able to allocate. With 'setFixedSizeCinfo', the Cinfo will be configured such that all block sizes from the underlying allocator will be the same size.
In order to simplify configuration the hkMemoryInitUtil::initFreeList now takes an optional Cinfo pointer. If HK_NULL is passed, the default Cinfo (as created by setDefaultCinfo) will be used, otherwise the specified Cinfo will control the configuration. -
[COM-1170] hkSerializeDeprecated::saveXmlPackfile doesn't give helpful warning when hkSerializeDeprecated::initDeprecated hasn't been called.
The method now warns if deprecated support is not linked, but requested at runtime.
-
[COM-1242] Document why we use placement new throughout the memory system.
A note has been added that most memory classes can only be dynamically allocated with placement new.
-
[COM-1245] LLVM-based reflection parser.
A new header file parser based on LLVM has been implemented. This supersedes the GCCXML-based parser used in 2010.1. See the Migration Guide and Common Product documentation for more information.
The database and reflected file formats have not changed. -
[COM-1259] Iterator for hk1AxisSweep results.
Added hk1AxisSweep::IteratorAA (for colliding all elements of one array against each other) and hk1AxisSweep::IteratorAB (for colliding all elements of one array against all elements of another array). This is a much simpler interface for getting the results of hk1AxisSweep.
-
[COM-1266] Fix hkMath::min2/max2 integer warnings on Xbox 360.
Using hkMath::min2 and hkMath::max2 with integer arguments no longer triggers warnings on Xbox360.
-
[COM-1303] Improve warning messages when trying to load/save an unregistered class.
The warning messages for serializing unregistered classes have been improved.
-
[COM-1307] Fix GCC warnings.
Many GCC warnings have been fixed, particularly in header files.
-
[COM-1315] Document that #pragma once cannot be used in the HK_CLASSES_FILE.
You should not use "#pragma once" in your custom classes file as this file is included multiple times by hkBuiltinTypeRegistry.cxx.
-
[COM-1319] Tidy hkSerializeUtil::save options.
The options are now a structure with useful set methods.
-
[COM-365] Change math libs to use single-precision versions of __fsel.
hkMath::min2 and hkMath::max2 now use __fself on Xbox360 and __fsels on PlayStation(R)3.
-
Fixes (16)
-
[COM-763] hkSemaphoreBusyWait::acquire may never exit from spu_read_event_status because Lock Line Reservation Lost Event may not occur when using virtual memory.
hkBusyWaitSemaphores are now allocated from an aligned, statically allocated buffer on PlayStation(R)3. The new() operator is overridden to automatically allocate semaphores from this buffer.
-
[COM-965] False Assert inside hkBinaryPackfileReader when meta data isn't loaded (0x15a09059).
Fixed a bug where hkBindingClassNameRegistry::getClassByName wouldn't return the proper hkClass in for certain custom classes. This would cause a false assert inside hkBinaryPackfileReader when meta data wasn't present.
-
[COM-1261] Monitorstream analysis did not handle hkUint32 timers wrapping around.
The stats graph overlay in the VDB and the DemoFramework can visually spike due to hkUint32 values wrapping around through 0. This is now accounted for so all spikes should now be attributable to actual timer data under normal use.
-
[COM-1289] generateReflections.py crashes while trying to raise an exception when class members do not begin with required prefix.
A crash was fixed that could occur when attempting to output an error message for a class member with incorrect prefix
-
[COM-1313] hkBitField::countOnes() was incorrectly counting if numBits was a multiple of 32.
In cases where the number of used bits was a multiple of 32, hkBitField::countOnes() was incorrectly masking out the last word, not counting the set bits in that lowest word. This has been fixed.
-
[COM-1231] Mismatch between declaration and definition of hkOstream constructor.
A parameter was declared with a typedef and has been changed to match exactly.
-
[COM-1232] VDB Object Inspector crashes on non-Win32 platforms.
The VDB Object Inspector now works correctly when the client and server memory layouts are different, such as on consoles
-
[COM-1263] hkSerializeUtil::loadObject() should only read as much of the stream as it needs for the packfile, rather than the entire stream.
hkSerializeUtil::loadObject now only reads in as much of the stream as necessary for the packfile, rather than reading in the entire stream.
-
[COM-1265] VDB has error on disconnect from Havok demos or on PC shutdown.
Fixed intermittent VDB crash/hang on exit.
-
[COM-1267] Crash loading XML packfiles with unknown classes.
The XML packfile reader now gracefully returns NULL when encountering an unknown class.
-
[COM-1269] hkCheckingMemorySystem::isOk() returns true even if m_delayedFreeAllocator.isOk() returns false.
hkCheckingMemorySystem::isOk() now correctly returns false if some deleted memory has been overwritten.
-
[COM-1290] generateReflections.py does not generate any output if the string 'wii' is in the directory tree.
generateReflections.py now excludes files based on a special marker in the file, or from a list contained in the project settings. This eliminates the need for file and directory name-based rules to exclude files. Any file containing the the string "//HK_REFLECTION_PARSER_EXCLUDE_FILE" is not parsed
-
[COM-1297] hkPs3Socket::connect() should return HK_FAILURE if connect() returns a negative value.
The PlayStation(R)3 socket differs from BSD sockets in that it may return any negative value on error, not just -1. This is now accounted for.
-
[COM-1320] VDB crashes while adjusting settings during movie playback.
Fix for VDB crash while editing settings during movie playback.
-
[COM-1327] hkMemoryRouter temporary accidentally created in calls to hkString strDup and strNdup.
A typo was fixed which would create a temporary variable instead of simply calling a static method.
-
[COM-1359] hkgpConvexHull::build can give bad results if the striding is 16 but the vertex pointer isn't 16-byte aligned.
The convex hull generation code could give wrong results if the striding was 16 bytes but the pointer wasn't 16-byte aligned. It now reverts to the slightly slower code path in this case.
-
Content Tools
Improvements (3)
-
[EXP-2040] Maya Exporter should sample annotations at all keyframes, not just when the keyframe value changes.
The sampling of annotations in Maya has been improved whereby annotations are now sampled when the value is keyed as well as whenever it changes. Previously annotations were only sampled when the value changed which meant that annotations of the same string appearing at consecutive keyframes were not properly sampled.
-
[EXP-2062] Add "prune all animation data" option to Prune Types filter.
New checkboxes have been added to the Prune Types Filter to prune hkaAnimationContainer, hkaRagdollInstance and hkaSkeletonMapper objects so that these classes do not have to be explicitly added to the custom types in the Prune Types filter options.
-
[EXP-2075] Visualization of exported channel should be off if corresponding vertices are hidden.
Exported channel values for vertices are now hidden when triangle clusters containing those vertices are hidden.
-
Fixes (15)
-
[EXP-2055] XSI crashes when adding a new vertex channel.
Creating a new vertex channel using the Havok Mesh Channel Toolbox in SoftImage could sometimes cause the application to crash. This has been fixed.
-
[EXP-1945] View XML Filter fails to load and show custom class instances.
The View XML filter was not showing custom class instances. This has been fixed.
-
[EXP-1978] Empty color buffers lead to null pointer in asset converter mesh.
An access violation has been fixed in hkgAssetConverterMesh which was caused by trying to access a null pointer for the the vertex color data.
-
[EXP-2050] Batch export from Max and XSI only processes the first configuration in hko file.
A bug in 3ds Max and XSI that resulted in only the first configuration in an hko file to be processed when batch exporting has been fixed.
-
[EXP-2077] Rigid Body Filter : 'Automatic Shape Shrinking' option is always used even if 'Default Convex Radius' option is selected.
This has been fixed.
-
[EXP-1835] Crash during 3ds Max scene export when using custom material.
Fixed a problem in 3ds Max where exporting custom materials or shaders was sometimes causing the scene exporter to crash.
-
[EXP-1973] Empty scene flagged as dirty when opening 3ds Max with HCT in it.
A bug in the 3ds max scripts flagged the empty scene at startup as dirty. This bug has been fixed.
-
[EXP-2054] Custom Attributes causes crash in 3ds Max.
A crash in 3ds Max caused by Custom Attributes has now been fixed by checking in hctParamBlock2Interface::getUIClassName() if GetOwner for the param block returns NULL and if it does, then "Unnamed" is returned.
-
[EXP-2067] Negative start/end frame is evaluated incorrectly in XSI scene exporter.
A bug resulting in a negative start/end frame being evaluated incorrecly in XSI scene exporter has been fixed.
-
[EXP-2079] The Windows start menu shortcut for the Content Tools User Guide documentation is broken.
The shortcut to the Content Tools documentation in the Windows start menu has been updated to point to the correct location.
-
[EXP-2081] Reference to 'hct' attribute naming convention should be removed/cleaned-up/clarified.
A typo in the "Havok Scene Data Format" documentation chapter has been fixed where "hct" should have been "hk".
-
[EXP-2084] Maya Content tools scene export not handling 'look at constraint' camera animations.
Maya scene exporter now creates nodes for constrained point-aim cameras, making them available for selection as skeleton bones.
-
[EXP-2094] Cloth collidables are displayed incorrectly in Preview using DirectX9.
The cloth collidables were not rendered properly when the Display was configured to use the fixed pipeline (OpenGL/DirectX) due to a bug in the Graphics code. This bug has now been fixed.
-
[EXP-2095] Preview Tool crashes when dragging an animation .hkt file onto a skeleton.
A bug in the Preview Tool has been fixed which resulted in the Preview Tool crashing if an animation .hkt file is dragged onto a skeleton. This crash was a result of trying to load cloth assets in the file without checking whether there were any.
-
[EXP-2097] Preview tool plays animations at a faster speed upon loading and restarting playback.
A bug in the Preview Tool which resulted in animations playing at a faster speed for several seconds has been fixed. This bug was caused by the fact that the delta time step incorporated the loading of assets which happened when the Preview Tool initially loaded up or when the restart playback button was pressed.
-
Physics
New Features (3)
-
[HVK-5554] New constraint types added: rack-and-pinion, screw-and-nut, cog wheel.
New constraints have been added to simulate mechanisms with the following elements:
* rack-and-pinion
* screw-and-nut
* cog wheel
Please refer to the Physics/Api/Constraints/Cogs demo for examples of use. -
[HVK-4682] Create constraints filter should automatically scale inertia tensor / angular damping to make systems stable by default.
An interface was added to allow pre-stabilization of physics systems with ball-and-socket based constraints. Please refer to the release notes for HVK-5740 or the Physics manual (section explaining the stabilization of the hkpBallSocketConstraintAtom) for more details concerning this topic.
-
[HVK-5717] New 'hkpHybridBroadphase' improves the performance of broad phase queries and adds new query types.
hkpHybridBroadphase has been added as an optional layer between the physics world and the broadphase. This allows for faster collision queries (eg: world raycasts), and new types of queries (eg: frustrum), but incurs a slight cost for all regular broadphase operations. The hybrid broadphase replaces the functionality of the kdtree but does not require a complete rebuild every frame as the kdtree does. This feature can be enabled by setting hkpWorldCInfo::m_useHybridBroadphase to true.
Please refer to the user guide for more information.
This feature is currently in beta.
-
Improvements (17)
-
[HVK-5581] hkpTriggerVolume not obvious enough (in comparison to hkpAabbPhantom, hkpShapePhantom, hkpPhantomCallbackShape...).
The trigger volume now has more prominence in the refactored physics documentation.
-
[HVK-5177] Information lacking for hkpConstraintAtom.
Information on the stability issue for Angle Limit Constraint Atoms has been added to the class documentation and the User Docs. This includes hints on addressing constraint stability issues.
-
[HVK-5441] hkpHavokSnapshot should be able to write to a packfile.
hkpHavokSnapshot now takes an Options enum instead of a boolean value. This specifies whether the snapshot should be text or binary, and whether it should be a packfile or a tagfile. The default remains a binary tagfile. Boolean values are converted automatically.
-
[HVK-5646] New documentation on tuning vehicle chassis collision response.
Added a new section to Havok's Vehicle Programming Guide documentation with suggestions to mitigate collision response for rigid body-based vehicle chassis (for any vehicle, not just those using the Havok Vehicle Kit).
-
[HVK-5666] Add assert to check if hkpCylinderShape has zero length.
An assert was added in hkpCylinderShape constructor to verify that vertex endpoints are not equal.
-
[HVK-5689] Add reflection for hkpTriggerVolume.
hkpTriggerVolume is now reflected. This allows customer classes derived from hkpTriggerVolume to be reflected.
-
[HVK-5705] hkpGroupFilter incorrectly described.
The description of the hkpGroupFilter has been simplified and rewritten.
-
[HVK-5728] Optimize hkpConvexVerticesShape::castRayImpl planeEquations array memory allocation.
Compressed convex pieces, used in the compressed mesh shape, had unoptimal memory allocations when building the face normals. The code has been moved to hkpCompressedMeshShape::ConvexPiece::getFaceNormals(), and it no longer grows the array dynamically but sets it at the beginning.
-
[HVK-5740] Improve stability of ball-and-socket constraints.
The ball-in-socket part of the ball & socket, hinge, limited hinge and ragdoll constraints has been made more stable, in order to facilitate joining together bodies having large mass ratios or long arm lengths. The stabilization is disabled by default in all the above mentioned constraints, but can be easily enabled by calling hkpConstraintData' virtual function: setSolvingMethod(hkpConstraintAtom::METHOD_STABILIZED).
There are cases where the joined bodies (in their original form) cannot be simulated in a stable fashion. In this situation, it is strongly advised to pre-stabilize the joined bodies using the new functionality provided by the hkpConstraintStabilizationUtil class. The pre-stabilization works by altering the inertias of the bodies in order to allow the solver to reach a stable solution.
It is also possible to pre-stabilize the constrained system automatically, during asset export, via the "Create Constraints" filter UI.
For more info about the stabilized ball-in-socket constraint and its configuration parameters, please see the section "Stability of the hkpBallSocketConstraintAtom" in the manual. -
[HVK-1215] Slow motion on a per object basis.
Time scaling is now available on a per-motion basis through the following methods:
hkpMotion::setTimeFactor(hkReal factor) and hkpMotion::getTimeFactor(). -
[HVK-5424] Re-organization of the the Collision Detection Chapter.
The collision detection chapter has been completely re-organized in preparation of the larger physics docs re-organization. It now no longer exists under its former structure.
-
[HVK-5613] The maximum number of child shapes for hkpListShapes simulated on SPU has increased from 252 to 1024 for fixed or keyframed bodies.
Keyframed/Fixed hkpListShapes with more than 252 children can now be simulated on the SPU. The new upper bound for Keyframed/Fixed hkpListShapes is 1024 children (defined by HK_MAX_NUM_HITS_PER_AABB_QUERY). Dynamic hkpListShapes with more than 252 children and Keyframed/Fixed hkpListShapes with more than 1024 children will still be forced on to the PPU.
-
[HVK-5659] Add option to add 'convex hull' shape type attribute to decomposed pieces.
A checkbox option has been added in the "Advanced" section of the decomposition utility's UI. This option is enabled by default.
-
[HVK-5693] Non-SPU friendly collision filter warning 0xaf351ee1 is overaggressive.
Warning 0xaf351ee1: "This filter type is not supported on SPU by Havok on default, it will not be called. You still need to make sure that it is 16-byte aligned." was fired if no collision filter was used. The check has been changed to only warn if an unsupported filter is actually used.
-
[HVK-5702] Allow Gsk agents to ignore minPointCreationDistance values and add new points when a feature within pointKeepDistance is removed.
Gsk-base agents could cause jitter between bodies where they repeatedly penetrate & are pushed apart. Contact points would be created and dropped in a loop. To fix this the Gsk-based agents can be set to do extra collisions, however this might be significantly more expensive. You can enable the feature per agent with a collision listener.
-
[HVK-5738] hkpCdPoint.m_contact has changed to hkpCdPoint.getContact().
In order to access the contact point, use getContact() and the various setContact() methods.
-
[HVK-5417] Class reference documentation is wrong for hkpPointToPlaneConstraintData.
A copy & paste documentation error was fixed.
-
Fixes (27)
-
[HVK-5636] Infinite loop in hkpWorldMemoryUtil::checkMemoryForIntegration if hkpSimulationIsland cannot be split and solver buffer size not large enough.
A potential infinite loop was fixed in hkpWorldMemoryUtil::checkMemoryForIntegration. When insufficient solver memory is available, the memory checking utility will now always eventually give up trying to split simulation islands and report to the user using hkWorldMemoryAvailableWatchDog::reduceConstraintsInIsland, where previously it could fail to break out.
The interface to reduceConstraintsInIsland has changed to better indicate when hkpWorldMemoryUtil does not succeed in resolving a low memory condition. This is now passed a hkWorldMemoryAvailableWatchDog::MemUsageInfo, and a count of the number of attempts to resolve the current low memory condition. This count increases until the simulation has been simplified enough to allow the solver to run -- the larger the value, the more agressive action should be taken. The MemUsageInfo contains m_largestSimulationIsland, the simulation island that currently requires the largest solver buffer, and m_maxRuntimeBlockSize, the largest buffer allocation needed by this island in its current state. The island must be simplified until this block size is small enough to fit into the allocated solver buffer.
hkWorldMemoryAvailableWatchDog::reduceConstraintsInIsland is always called when the solver buffer is too large for the current island, and a very large iteration count indicates that the memory situation is not resolved and probably indicates an error. -
[HVK-5701] Asynchronous stepping does not always process entities needing PSI collisions.
PSI collision are now carried out at every hkpContinuousSimulation::advanceTime(). This fixes a bug when multiple asynchronous steps were carried out between PSI steps, where the system could attempt to recollide entities which do not exist or may not be active any more.
-
[HVK-2938] FPU overflow exception in all platforms for hkCollideCapsuleUtilCapsVsTri.
Eliminated floating point exception due to overflowing float max because a value set to HK_REAL_MAX was being squared. Now set to HK_REAL_HIGH.
-
[HVK-4801] calcSizeForSpu should be called for hkpCollidables used with spu collision queries.
The code to check if a hkpRigidBody's hkpShape is supported on the SPU has been moved from hkpEntity::calcSizeForSpu to hkpCollidable::calcSizeForSpu. In addition, this function is now called by hkpWorld::addPhantom, hkpWorld::addPhantomBatch, as well as a number of implementations of setRunsOnPpuOrSpu for multithreaded collision query jobs.
-
[HVK-4888] m_memSizeAndFlags not set on the motion state of cloned rigid bodies from packfiles.
Fixed a potential memory leak in hkpRigidBody::clone(). The memory size and flags of any allocated motion state are now correctly preserved. Previously these were overwritten by the source size and flags, which were zero if the body had been loaded from a packfile.
-
[HVK-5141] Custom UniversalJointData, which uses hkpAngConstraintAtom and hkpAngLimitConstraintAtoms, is unstable in certain edge cases.
Information on the stability issue for Angle Limit Constraint Atoms has been added to the class documentation and the User Docs. This includes hints on addressing constraint stability issues.
-
[HVK-5618] Missing include guards in hkpAddModifierUtil.h.
The guard has been added.
-
[HVK-5642] Setting m_weldClosestPoints to true with Linear Casting produces incorrect results.
hkpIterativeLinearCastAgent now correctly handles triangle welding. If m_weldClosestPoints is set in the input options, the returned contact normal is welded. Previously, this could have returned incorrect results
-
[HVK-5687] Simulation types other than hkpMultithreadedSimulation don't call 'hkpWorldCallbackUtil::fireConstraintViolated'.
hkpConstraintListener::constraintViolatedCallbacks are now called from all simulation types, and not only multithreaded as before
-
[HVK-5716] Incorrect distance comparison in convex-convex collision detection algorithm which can lead to overagressive contact point rejection.
A bug in GskManifoldUtil could cause points being incorrectly kept or rejected. This seemed to be not obviously harmful. This is fixed now.
-
[HVK-5727] Shape Shrinking seems to cause invalid data in certain cases.
Shape shrinker applied on a hkpConvexVerticesShape now guaranties that the number of vertices will not increase after shrinking.
-
[HVK-5762] A 2D or flat hkpConvexVerticesShape fails to register hits when raycasting.
This has been fixed.
-
[HVK-4605] Ball and socket constraint gains energy in a very simple situation.
This use case can now be simulated in a stable manner if the constrained body pair is pre-stabilized with one of the methods provided by the hkpConstraintStabilizationUtil class. Please refer to the release notes for HVK-5740 for more details.
-
[HVK-5126] hkpExtendedMeshShape uses hkDefaultTriangleDegeneracyTolerance instead of m_triangleDengeneracyTolerance to test for degenerate triangles.
All references to m_triangleDengeneracyTolerance (sic) have been removed, as it wasn't being used by the SDK. This affected hkpExtendedMeshShape and hkpMeshShape. It was confusing as setting this value had no effect internally. We use hkDefaultTriangleDegeneracyTolerance as a global triangle degeneracy tolerance for mesh shapes.
-
[HVK-5452] Convex radius is unexpectedly added in some cases, even though the tools say it isn't.
When creating a compound rigid body out of multiple mesh shapes using the create rigid bodies filter, any convex radius settings from the child mesh shapes were lost and replaced with a default value. Now the minimum value for convex radius settings of the child mesh shapes is used for resulting compound shape.
-
[HVK-5577] hkpPhysicsContext::setOwner can crash when multiple worlds are being tracked.
An index out of bounds exception could occur when cleaning up an hkpPhysicsContext which was tracking more than one hkpWorld. This would only occur if you deleted the worlds *after* the physics context. This has been fixed.
-
[HVK-5588] hkpShapeShrinker can leak memory.
In some cases the hkpShapeShrinker would leak memory when shrinking a shape collection, this is now fixed.
-
[HVK-5612] hkpGskBaseAgent::staticGetClosestPoint results in incorrect welding for linear casts.
A bug in hkpGskBaseAgent::staticGetClosestPoint which would cause incorrect results to be returned when m_weldClosestPoints was true, has been fixed.
-
[HVK-5619] Unwelding for Character Rigid Bodies is disabled when welded and unwelded contact normals are very close.
The unwelding of contact normals did not apply when the unwelded normal was sufficiently close to the original normal. This restriction isn't necessary and could cause artifacts when the character pushed against almost vertical walls. The restriction has been removed.
-
[HVK-5620] hkpTriSampledHeightFieldBvTreeShape::queryAabbImpl() does not take triangle extrusion into account.
Extrusion is now taken into account when gathering overlapping triangles from an hkpTriSampledHeightFieldBvTreeShape.
-
[HVK-5635] Assert 0x297c7244. Degenerate case found in point - triangle collision detection algorithm.
In some rare cases, the GSK algorithm creates a degenerate simplex consisting of either collinear or identical vertices. This triggered either assert 0x297c7244 or 0x7c64031e (the cases are symmetric). The algorithm now falls back to the vertex-vertex case instead of asserting.
-
[HVK-5668] hkpWorld::getCinfo does not set m_useKdTree or m_useMultipleTree correctly resulting in incorrect world snapshots.
hkpWorld::getCinfo() now sets the returned values of hkpWorldCinfo::m_useKdTree and hkpWorldCinfo::m_useMultipleTree correctly.
-
[HVK-5711] hkCheckDeterminismUtil breaks if solver allocator cannot allocate memory for an integrate job.
In some cases, a job could be registered to the hkCheckDeterminismUtil multiple times. This would prevent the utility from functioning correctly in playback mode.
-
[HVK-5712] hkpDynamicsJob::m_jobSid may not be reset correctly in some situations.
hkpDynamicsJob::m_jobSid may not have been correctly initialized on SPU, which could cause the hkCheckDeterminismUtil to break in playback mode.
-
[HVK-5713] SPUs can fill TOI event queue, causing non-deterministic behaviour.
While the non-deterministic behaviour can still occur when the TOI event queue is filled to capacity on SPU, a warning has now been added to alert the user when this has happened.
-
[HVK-5746] hkpShapeDisplayBuilder and hkpConvexRadiusBuilder crash because of reference to bad array data.
The buildPartialShapeDisplay_ShapeContainer methods of hkpShapeDisplayBuilder and hkpConvexRadiusBuilder no longer hold on to a bad array reference.
-
[HVK-5747] Trigger Volumes can cause assert 0x35f42741 to fire, as the solver does not account for schema blocks that begin with a SCHEMA_TYPE_GOTO.
Fixed an issue where the solver did not appropriately handle using ignore constraint modifiers to disable all the constraints in a schema block.
-
Animation
Fixes (12)
-
[HKA-1371] Floating point error causes array out-of-bounds crash on calculating extracted motion.
Frame calculations in hkaDefaultAnimatedReferenceFrame::getReferenceFrame() are now capped to prevent accessing out-of-bounds data.
-
[HKA-1337] Floating point errors causing issues with extracted motion.
Some cases where floating point errors could significantly alter behavior (or possibly produce erroneous data) have been resolved.
-
[HKA-1346] hkaDefaultAnimationControl copy constructor leaves m_mapper uninitialized.
The hkaDefaultAnimationControl copy constructor now initializes m_mapper. Additionally, hkaDefaultAnimationControl::getSkeletonMapper() will no longer crash if the mapper is null.
-
[HKA-1353] Exported annotation times are not relative to beginning of desired frame range in 3ds Max.
Exported annotation times are now relative the start of the desired frame range specified in the scene export option in 3ds Max
-
[HKA-1361] Memory Leaks in hkaSkinningUtils::limitMesh.
Memory leaks caused by hkaSkinningUtils::limitMesh have been removed by fixing hkxMeshSection copy constructor.
-
[HKA-1362] Inconsistency on how weights are handled in sampling and extracted motion.
If an animation control had a null binding, the behaviour when blending the animation differed from the behaviour when extracting motion. These operations are now consistent.
-
[HKA-1368] hkaAnimatedSkeleton::getDeltaReferenceFrame calculates bad extracted motion when animations are additive.
hkaAnimatedSkeleton no longer considers the weight of additive animations when calculating extracted motion
-
[HKA-1369] Extracted motion filter should not create extracted motion if no "allowed motion" options are enabled.
The extract motion filter no longer creates extracted motion if no "allowed motion" options are set in the filter manager
-
[HKA-1370] hkaAnimationControl::m_motionTrackWeight used incorrectly.
The motion track weight was not correctly used when calculating the extracted motion in a blend. This has been fixed.
-
[HKA-1372] The cropping feature in the hkaDefaultAnimationControl does not correctly crop the extracted motion when looping.
Cropping of extracted motion now works correctly. The argument lists for the virtual methods hkaAnimation::getExtractedMotionDeltaReferenceFrame() and hkaAnimatedReferenceFrame::getDeltaReferenceFrame() have changed. These are interfaces that are not commonly used directly. Please see the Migration Guide for details.
-
[HKA-1373] Create Skins Filter : Simplify Mesh Binding can set hkxSkinBindings node names to NULL, wich can lead to crashes later on.
Using the "Simplify Mesh Binding" option in the Create Skin filter was sometimes leaving the hkxMeshBinding object in an imcomplete state, with some node names being set to NULL. This has been fixed.
-
[HKA-1374] hkaRagdollInstance::clone makes invalid assumption about layout of ragdoll.
hkaRagdollInstance::clone() could create an incorrect ragdoll for some complex setups. This has been fixed.
-