Changes for 2.12
2.12.0.14 release 2021/4/13
- Added Maya 2022 and 3ds Max 2022 exporters
- Cleaned up Telemetry hooks for Granny and GState. See the documentation for more details.
- API Changes: Removed UseTmLite UseTelemetry GStateUseTelemetry added GrannySetTelemetryCaptureMask and GStateSetTelemetryCaptureMask
- Added new GState node utility methods anim_source::IsAnimationBound and parameters::GetParamValue
- Slightly more verbose GState warnings when doing file conversions.
- Changed GState Character instances to count number of times AdvanceTime is called so that pose storage nodes can be updated even when delta time is 0
- Changed Pose Storage nodes to resample the storage if AdvanceTime has been called since the last sample, even with a delta time of 0
- Changed state_machine::GetScalarOutputRange to provide a warning when querying an external input of a state machine
2.12.0.13 release 2021/2/12
- Fixed Anim Studio to compile with newer versions of Visual Studio
- Fixed missing Anim Studio Visual studio project/solutions
- Changed Granny logo in the Granny Viewer to something slightly more modern
- If you are trying to build Anim Studio and would like a pre-built LuaJIT ask Granny support (you still can just get the archive and built it yourself as always)
- Improved Visual Studio project files for building Exporter and the Granny Viewer (for Export licensees)
2.12.0.12 release 2021/1/21
- Added Mac OSX ARM M1
- Added Character Root Coordinates to Anim Studio debug text
- Added keyboard shortcut 'r' for Reset Character Position command in Anim Studio
- Improved cancel and progress handling on Granny export dialog
- Changed export result log dialog continue updating after more than 32k of logging
- Changed Granny Viewer installer to install 64 bit version of Granny Viewer
- Fixed Linux and Mac OSX makefiles
- Added pre-build Android x86 version of Granny and GState
- Changed the Android, Mac, and Linux pre-built library names to better match. This may require changing your build scripts. See Using Granny in a Project in the help documentation for details.
- Changed major copyright text to Epic Games Tools LLC
2.12.0.11 release 2020/08/25
- Added NEON matrix operations
- Added model and modelname option to preprocessor dumpanim command to dump animations where the model is stored separately
- Include last frame when dumping animation in preprocessor dumpanim command
- Fixed crash in Granny viewer help menu
- Fixed Maya exporter crash involving invalid numericdata attributes
- Fixed Granny iPhone library broken MIPLevels TextureImageType handling
- Updated Granny iPhone demo/tutorial to build and run on newer XCode/iOS match Android version
- Added support for keyframed curves to GrannyEvaluateCurveAtT
- Runtime: Compatibility Note Changed default compile option so that Granny will LERP non-compressed curve keyframes. In order to get classic Granny behavior on this you will need to add GRANNY_LERP_KEYFRAMES=0 and re-build the Granny library/DLL.
- Changed PS4/PS5 system clock to use kernel functions directly
- Changed Android NDK Android.mk build scripts to better handling building on Android ARM 32 and 64 and Android x86
- Added new camera option, Lock Ground Height to Anim Studio's Camera Controls option panel. This will keep the height of the ground at the characters initial height rather than track it.
- Fixed Android system clock routines to work correctly with newer Android SDKs
- Updated Android tutorial/demo app to build inside Android Studio 4.0
2.12.0.10 release 2020/05/10
- Fixed Orient Match to handle models with scale, handle offset options
- Fixed blend nodes to allow phase syncing with other blend nodes/nested blend nodes
- Fixed blend node phase syncing with anim_source nodes with non-1.0 speed values
- Fixed UI issues with editing transitions in Anim Studio
- Added ability to assign up to 8 actions to each Gamepad Controller button/axes in Anim Studio. .gsf files loaded created with this version of Anim Studio will not have correct controller mappings when loaded into earlier versions of Anim Studio and may need to have the controller scheme deleted and recreated.
2.12.0.9 release 2020/4/20
- Added polygon winding view option to Anim Studio
- Modified GState/Anim Studio Blend and Blend Select nodes to forward events for conditionals
- Fix pose storage node memory leaks and memory issues with Sample Once Per Frame
- Fix Position IK node to support Pose Name Bone option to get target location from current frames bone location
2.12.0.8 release 2020/4/1
- Added 3DS Max 2021 support
- Fixed Maya exporter crash when using Keyed Enums on Materials
- Added NamesList and NamesReplace commands to Preprocessor. These new commands let you list and search&replace strings in the Granny File Info
- Fixed crash in Anim Studio when setting Orient Match node to User Specified.
- Fixed issue in GState with Orient Match node and Pose Bone Name mode
2.12.0.7 release 2020/3/2
- Added Subtree Sample node to Anim Studio/GState as part of official build
- Added two new GState access functions GStateSetInstanceTime and GStateSetInstanceLastDeltaT to let you directly alter the instance time settings. Note this does nothing extra to allow you to successfully time travel, those details are still on you.
- Added new version of anim_source::ReplaceAnimation that only requires a granny_file_info rather than a full granny_file
- Position Ik nodes in Anim Studio now correctly adjusts for character root location so you can preview IK effect
- Fixed crashes and errors with GState/Anim Studio blending scalar values
- Added new next generation platform - contact Mitch for details.
2.12.0.6 release 2020/1/31
- Added Maya 2020 export plugins
- Changed Maya and Max exporters to use the project file's name without the full path and extension for the animation name
- Added ExtendedData to FBX conversion for bones and materials, including user custom properties
- Removed Granny WinHelp documentation. The all Granny help is now in HTML files.
- Removed Win32 Granny applications (Granny Viewer, preprocessor, anim_studio, fbxtogranny). If you still need the 32-bit versions of these artist/production tools please contact Granny support.
- Remove SoftImage XSI exporters. If you find yourself needing these exporter plugins please contact Granny support.
2.12.0.5 release 2019/11/1
- Fixed FBX converter vertex normal error
- Added new secret platform - contact Mitch for details.
2.12.0.4 release 2019/10/16
- Added support for Stadia platform
- Improved FBX to Granny converter to handle converting multiple takes to multiple animations
- Improved FBX to Granny converter to correctly convert the FBX default skeleton
- Added handling of large display/font scaling values in Windows in Granny exporter UI. No more chopped off checkboxes.
- Fixed a few issues with included Visual Studio project files
- More documentation improvements
2.12.0.3 release 2019/09/09
- Converted Granny help files to HTML for easier reading on other platforms. CHM files are still included.
- Merged Anim Studio documentation into one self-contained AnimStudioGuide.html
- Fixed extra copy of GState in source code distribution for non-Windows platforms
- Removed dependencies on C++ stdlib from XBox One Granny library
2.12.0.2 release 2019/07/22
- Removed dead web links from Granny Viewer
- Fixed packaging to include Android 64 bit binaries and GState binaries for non-Windows platforms
- Added Granny version info to fbxtogranny converter title bar
2.12.0.1 release 2019/07/08
- Added Max 2020 export plugins
- Added BETA fbxtogranny converter exporter. Will convert FBX files to Granny format.
- Added show/hide filtered meshes mesh visibility functions in Granny Viewer mesh menu
- Fixed some Granny Viewer crashes
- XBox360 controller in Anim Studio now works in Windows 7
- GState: Added two new functions to GState to allow access to the referenced files GStateGetNumSourceFileReferencesFromSetIndex and GStateGetSourceFileReferenceFromIndex
- Preprocessor: Added new command ListGSFSources to test/use new GState functions
- Preprocessor: Added new command DumpAnim to dump text versions of Granny animations curves for analysis
- Removed crash server submit option from crash handler. Crashes will need to be sent to RAD directly.
- Fixed problem in Maya exporting direct connected morphs
- iOS builds now include x86 simulator builds
- New Anim Studio node list documentation
- Fixed problem with GetWorldMatrixFromLocalPose on Linux
- Fixed memory leak with GState Pose Storage
- Fixed crash in Anim Studio when modifying a parameter when inside a blend node
- Fixed memory leak in Orient Match
- Removed ancient PhysX example, doesn't work with current PhysX. Customers that would like it for reference can get it by sending email.
2.12.0.0 release 2019/01/18
- Added Max 2019, Maya 2019 export plugins
- Granny Viewer has new options for showing art tool scale.
- Anim Studio new option "Retarget bone lengths" which uses new bone-length-preserving re-targeting option.
- New API functions: GrannyIKPositionMatch, GrannyIKTransformMatch, GrannyRescalePose
- API Changes: GrannyIKOrientMatch removed unused Offset4x4 parameter
Changes for 2.11
2.11.10.0
- Add a retargeting mode (GrannyRescalePose()) that only preserves bone length. Granny's existing retargeting attempted to preserve the full transform between bones, which isn't well defined on animations where bones don't rotate with their children.
- Animation Studio: Add a new option on the root State Machine, "Retarget bone lengths", which uses the new bone-length-preserving retargeting option. You should pretty much always use this except to preseve legacy behavior.
- Animation Studio: Debug option to render history trails behind joints in the skeleton (under Camera Options).
- Animation Studio: Add position match option to orient match node. This lets you match the position of one joint to another (or a point in space). It ignores bone length constraints and just does it.
- GState: Remove incorrect blend code that attempts to activate parent conditionals.
- GState: Position match and full-transform match options to go along with rotation matching.
- GState: New target bone option orient match "Pose Bone". This samples the world space bone position of the target joint immediately prior to usage, rather than relying on user-supplied cached values.
2.11.9.1 release 2018/01/02
- Support a custom knee plane for Two Bone IK.
- Make Two Bone IK UI not clear out knee and hip bone settings unless really needed.
- Fix Two Bone IK so it works if there are joints between the hip, knee and end effectors.
2.11.9.0 release 2017/12/04
- Add Nintendo Switch support.
- GState: Improve efficiency of Masked Combine evaluation when an incoming pose is empty.
- GState: Option to mark parameter and event nodes as Global, so their parameters and events
can be used from conditionals anywhere in the entire graph. A global parameter or event can
exist at any level of the graph.
- GState: Add target bone name option to Two Bone IK node.
- GState: Added a ReplaceAnimation function on the Animation Source node. This allows you to
replace the animation on an animation node at runtime (say, for re-using a node for code-driven
cinematics).
- Animation Studio: Use the Granny Viewer arrow style for skeleton rendering.
- Animation Studio: Allow mesh rendering to use wireframe or points as well as solid fill.
- Animation Studio: Allow the skeleton and mesh to render at the same time (skeleton over mesh).
- Animation Studio: Joint name and axis rendering.
- Add Exporter Best Practices documentation to granny2.chm.
- Add Exporter Reference documentation to granny2.chm. All exporter options are documented here!
2.11.8.0 release 2017/09/28
- Android 64 bit support.
- Fix GrannyHelp() MaxScript command so it properly lists the commands when no argument is given.
- Animation Studio: Global "Auto-forward transition requests" option (click root state machine options to see it). This
is the way to set up an animated transition from A to C (via animation B). If you have nodes A, B and C with transitions
like this: A -> B -> C, and B -> C is an OnLoop or OnSubloop transition, this will allow a request of state C from state
A to transition to B (and since B -> C is an onloop transition, it will automatically transition to C after B finishes playing).
- Animation Studio: Fix assert when removing all animation slots.
- Animation Studio: Add the ability for the camera to use left handed coordinates (and to optionally pull that info out of the
model gr2, like is done with the up vector).
- Animation Studio: Save and restore the camera up vector and handedness setting.
- Animation Studio: Remove the up vector setting from the undo stack.
- GState: Fix asserts and potential crashes caused by dynamic transition node being created in the middle of the gsf load when upgrading old gsfs.
- GState: Support morph tracks without mesh data embedded into GR2s.
- GState: Fix bug that was testing transition early exit condition on the wrong transition.
- GState: Allow OnLoop and OnSubLoop transitions to have the option to exit early.
- GState: Add an input to the Masked Combine and Additive Blend node types to control the amount of the combined anim to contribute
to the mask. Useful for tweaking strength, and for blending them out and turning them off at runtime.
- Preprocessor: RenameElement can now rename skeletons and textures.
- Make Granny's bool define to just assert that the size is what it expects if it has already been defined.
2.11.7.0 release 2017/07/27
- Upgrade Granny tutorial Visual Studio projects to Visual Studio 2012 (retaining the Visual Studio 2008 versions also)
- Maya 2018 Exporter Plugin added.
- GState and Animation Studio hooks for Telemetry 3 added.
- Animation Studio: Fix controller input bug with negative values.
- Animation Studio: Fix not being able to change controller profiles.
2.11.6.0 release 2017/06/27
- Animation Studio: NOTE! There are MAJOR UI CHANGES in the Animation Studio in this release! Some common things have been streamlined. Some less commonly used things have been moved to menus. The look has been modernized. Granny knows that UI changes can be hard, but this one is very much worth it. Granny also welcomes your feedback!
- Animation Studio: UI Change: Activating a state machine node is now done by left-clicking on its icon. The active state will have a red border arounds its icon.
- Animation Studio: UI Change: Double-clicking anywhere in a state machine or blend graph node will descend into it now.
- Animation Studio: UI Change: Right-clicking anywhere on a node will bring up its properties dialog. These dialogs can now be dismissed by clicking off of them also.
- Animation Studio: UI Change: Renaming a node is now done either by selecting the node and hitting F2, or by right-clicking the node and editing it in the dialog.
- Animation Studio: UI Change: Setting a node to be the start node in a state machine is now done by right-clicking the node and selecting the 'Make start' icon on the upper-right.
- Animation Studio: UI Change: There is no more 'x' to delete a node at the top level. Right click it and press the 'delete' button, or use the delete key on the keyboard.
- Animation Studio: UI Change: Transition 'hot zone' around nodes only appears when you mouse over them.
- Animation Studio: UI Change: ctrl-dragging from anywhere in a node will create a transition without needing to drag from the border.
- Animation Studio: UI Change: Make breadcrumb UI more logical (an arrow divider instead of ::)
- Animation Studio: UI Change: Make the character pane top tabs pop out from under the tab names instead of above them.
- Animation Studio: UI Change: Make node context menus appear under the cursor instead of to the side of the node icon.
- Animation Studio: UI Change: Make node names not directly editable. Node names are edited in the context menu now.
- Animation Studio: UI Change: Make state machine node transition hot region only appear while mousing over the node.
- Animation Studio: UI Change: Switch the font to Segoe UI.
- Animation Studio: UI Change: Reduce the size of buttons, dropdowns and nodes and lots of text.
- Animation Studio: UI Change: Switch to a darker color scheme.
- Animation Studio: UI Change: Sort all the IK bone name dropdowns by name.
- Animation Studio: UI Change: Remove most section headers in dropdowns.
- Animation Studio: UI Change: Add close and delete buttons to node and transition dialog windows.
- Animation Studio: UI Change: Allow inputs to be edited and viewed from state machines in the upper-left, like they can be from blend graphs.
- Animation Studio: UI Change: Display parameter names next to the node sliders in state machines, like they do in blend graphs.
- Animation Studio: Do not make event source keep its output name in sync with the node name.
- Animation Studio: Make context menus able to auto-detect whether to appear to the right or left.
- Animation Studio: Fix mask node vertical drawing offset.
- Animation Studio: Fix scrubber box width.
- Animation Studio: Fix button release not being detected when clicking a button to bring up a modal window.
- Animation Studio: Improve comment box color, reduce name box size and square it up.
- Animation Studio: Make non-clickable edit-boxes. These can be f2-edited, but clicking them does nothing. Nodes use this.
- Animation Studio: Fix double and triple click so that if you move the mouse too far between clicks, it does not register.
- Animation Studio: Fix issues with double-clicking to enter a node, then having that second click propogate into the node.
- Animation Studio: Ensure there is a mouse move event every frame, for hovering to work properly.
- Animation Studio: Store the window position properly at app exit so it can be restored.
- Animation Studio: Fix DrawRectOutline to draw it better.
- Animation Studio: Make DrawLine() specify its width every time, so it doesn't just get what is left over from previous state.
- Animation Studio: Better looking transition arrows.
- Animation Studio: More representative icons
- Animation Studio: Added visual debug draw timeline of animation evaluation and events (turn on in Options->Debug Draw).
- Animation Studio: Fixed crash when adding blend nodes to containers in certain cases.
- Animation Studio: Drag and drop animations directly from Windows onto Animation Studio to make Animation Nodes.
- Animation Studio: Textured rendering in the character pane.
- Animation Studio: Unattended mode. If enabled, Animation Studio will exit instead of popping up dialog boxes when there is an error. Errors are still sent to logs. Enabled with --unattended command line argument.
- Animation Studio: Option, in blend graphs, to highlight any edge that feeds into any currently-selected node. Makes tracking where inputs come from easier (turn on in Options->Draw Highlights).
- Animation Studio: Fix copy-paste issue when shift-pasting a node with more than one transition to it from another node. Automatic transition hookup was skipping a transition in that case.
- Animation Studio: Fix random crash when creating new position IK nodes.
- Animation Studio: Fix crash when deleting external conditions in some cases.
- Animation Studio: Make recent file dropdowns show full paths.
- Animation Studio: Fix crash if you attempt to copy a selected transition.
- Animation Studio: Save/restore the window position properly.
- Animation Studio: Fix infinite loop triggered by certain parameter types being passed in as external inputs to selection nodes with 'choose on activate' set.
- Animation Studio: Make blend nodes properly activate input parameters when they start, so timer parameters will work properly.
- Animation Studio: Fix small bug with phase blends that could give the wrong duration.
- Make Scale/Shear work in retargeter.
- Fix animation blending when using animation retargeting (was broken in 2.9.32.0).
- Remove Nintendo WiiU.
- GState: Make blend node check for loops on its inputs.
- GState: Handle missing bones in orient match node.
- GState: Prevent pose storage node from attempting to deallocate memory it did not allocate.
- GState: Prevent position ik node from indexing off the end of an array when bone names are missing.
- GState: Circular blend option for blend nodes.
- GState: Cyclic parameter option for parameters with acceleration, so it will properly handle accelerating around a ring.
- GState: Make timer parameter work with clamp to ints.
- GState: Make timer parameter work with cyclic option, so it restarts the timer when the timer hits zero.
- Preprocessor: Make RenameElement work on top level file path of a gr2.
- 3ds Max 2018 Exporter Plugin added.
2.11.5.0 release 2016/11/30
- Animation Studio: Full, generic copy/paste support, including copy/paste between different running instances of
the Animation Studio executable.
- Animation Studio: Duplicate (Ctrl-D) now can duplicate everything in the selection, not just a single node.
- Animation Studio: Text file logging, enabled by default.
- Animation Studio: Lua script errors from all sources now print a full back-trace and halt the animation studio
with a dialog box.
- Animation Studio: Unify and lengthen the amount of time time on-screen messages are shown.
- Animation Studio: Clear the cached model and filenames between gsf loads.
- Animation Studio: Don't clear out animation bindings if those animations are missing on disk. This allows
Animation Studio users who do not have the animation content to load and save the the gsf without breaking the
bindings.
- Animation Studio: Remove some unnecessary registry-related output messages.
- Animation Studio: Make animation load failures log to the console and the screen.
- Animation Studio: Fix file references on network paths.
- Animation Studio: Protect pose sampling case so it works when inspecting a node with no pose output.
- Animation Studio: Fix animation set editor not showing all the animation slots if the animation set index could
not be resolved.
- Animation Studio: Make auto-adding of blend graph child outputs (and corresponding inputs) to match the blend
graph optional. These options are under Options->Editor Settings.
- Animation Studio: Delay almost all registry writes until application exit.
- Animation Studio: Fix issues with multiple simultaneous animation studio app instances (like moving splitter bars)
by reading persisted values from a cached list rather than constantly reading and writing the registry.
- Animation Studio: Increase required build environment to Windows XP or greater (previously was Windows 2000 or greater).
- GState: New "Sample Once Per Frame" option on Pose Storage node. This allows the node to sample it's upstream pose just
once, and hold that for the duration of the frame rather than resampling. It can provide a huge performance win
for complicated graphs with duplicate work.
- GState: Do not try to sync output deletion for children when deleting output from a blend graph.
- GState: Make the GState runtime tolerant of CRC/Anim-Count mismatches during binding like the Animation Studio
tool is. GState will now print a warning and fall back on a slow re-indexing search rather than completely
failing.
- GState: Make the time select node work for more inputs than just a directly-connected Animation node. Blend,
Additive Blend, Masked Combine and State Machine nodes are unsupported as inputs to the Time
Select node, but all others with a pose output will work.
- Tutorials: Make the XBox One tutorial build with newer versions of the Xbox One XDK.
- Runtime: New position IK function: GrannyIKUpdateChainDetailed. GrannyIKUpdateChainDetailed is 2x faster than
GrannyIKUpdateDetailed, for the exact same functionality, except that it does not return a filled out world pose
at the end (though you can build it yourself with GrannyUpdateWorldPoseChildren. It achieves that speed by only
computing world poses during iteration for the joints that are relevant to the IK computation.
- Runtime: Compatibility Note: GrannyIKOrientMatch no longer computes the world pose. If you need
it, you can build it yourself by calling with GrannyUpdateWorldPoseChildren.
- Runtime: Fix retargeting math error.
- Exporter: Fix morph channel exporting in 3DS Max 2014 through 2016 by compiling them with VS2010 again. 3DS Max 2017
continues to compile with 2012 as required.
2.11.4.0 release 2016/09/06
- Animation Studio: Fix interaction between Save As... and Load Last File On Startup option.
- Animation Studio: Fix External Condition dropdown list creation. Items could be indexed incorrectly,
leading to a crash in some cases.
- Animation Studio: Put the current GSF name in the window title.
- Animation Studio: Fix crash caused by removing an internal input.
2.11.3.2 release 2016/08/22
- AnimationStudio: Load Last File On Startup option added to Options tab.
- Fix the default name of the first parameter in a parameter node (it got changed to "Value" somewhere along the line).
- Fix children added to state machines not inheriting the state machine's inputs automatically in some cases.
2.11.3.1 release 2016/08/12
- Fix a rare case where compressing a spline using aggressive quantization could trigger an
error during evaluation of its last frame.
- Maya 2016 Extension 2 Support.
- Maya 2017 Support.
- GrannyIKUpdateDetailed() can now take an optional EndEffectorOffset3 parameter,
for offsetting the actual position used for the end effector from the position of the joint
passed in.
- GrannyIKOrientMatch() added, which matches the orientation of one joint to a character-space
orientation. This is useful for making the angle of a character's foot match the plane of
the ground, for example.
- GState: Acceleration, speed, and integer clamping options for parameters.
- GState: Position IK Node, for moving an end effector to a specific position in space.
- GState: Orient Match Node, for matching the orientation of a joint with a target orientation.
- GState: Transform cache so a character instance can hold named cached transforms (used for
driving IK toward in-game transforms).
- GState: Unify 3D position and orientation slider drawing between the various IK node types.
- AnimationStudio: Slider widgets get a secondary display that indicates their current value
(since with the new parameter options, the current value can differ from the desired value).
- AnimationStudio: Fix unused variable build warnings.
2.11.2.0 release 2016/05/06
- 3ds Max 2017 Exporter Plugin added.
- AnimationStudio: Performance: Remove huge per-frame memory allocations from Animation Studio
render loop.
- AnimationStudio: Performance: Poll for controller connection once per second when
disconnected (XInput connection detection is very slow).
- AnimationStudio: Zero out previous input when controller is disconnected.
- AnimationStudio: Performance: Remove slow per-frame writes to the Windows registry.
- Make GState and AnimationStudio handle it when animations in a gr2 are renamed
or removed, or if animations are added to the gr2. Remove the animation CRC check. GState
still writes the CRC to the same field so you can continue to use it directly if you want, but
GState itself doesn't check it anymore.
- AnimationStudio: Reduce CPU consumption by half or more, particularly with OpenGL drivers
that produce high CPU utilization while waiting for rendering to finish before swapping
buffer.
- AnimationStudio: Make quick slots and animation nodes list animations in the order they are
defined in the Animation Set Editor for consistency. Previously they were sorted. Click the
sort button in the Animation Set Editor to keep them sorted.
2.11.1.1 release 2016/04/29
- AnimationStudio: Fix crash when drawing parameters with no character loaded.
2.11.1.0 release 2016/04/22
- Initialize CRC field in file builder in-memory path.
- Remove Nintendo 3ds support.
- Get tutorial shader-building batch files into the build.
- GState: Make morph sampling use SampleIndexForNode so it gets the right indices.
- GState: Handle it if user passes an uninitialized event count field into SampleEventOutput.
- GState: Remove errant TakeTokenOwnership() call.
- GState: Only trigger the 'always use anim events' events on the first event output edge, so
they are not duplicated.
- GState: Fix a case in AnimSource_GetEventTrackEntries that wasn't pushing an array onto the stack.
- GState: GStateNote() function for printing messages that are just informational (not
warnings or errors).
- GState: Fix pose input caching initialization.
- GState: Make RequestChangeToState respect GetAllowTransitionExit.
- GState: Make StateMachine activation activate all parameter children.
- GState: Make transition SampleBoth blends compute the weight factor on returned events.
- GState: Make new transitions use a smooth curve rather than a linear curve by default.
- AnimationStudio: All relevant blend nodes support events, scalars and morphs, either passing
them through or modifying them as appropriate.
- AnimationStudio: Make a checkbox widget that can be disabled.
- AnimationStudio: Clean and shorten text for output buttons on state machines.
- AnimationStudio: Add a button to auto-link all blend nodes in the whole state machine.
- AnimationStudio: Fix potential crash with null anim_source track name.
- AnimationStudio: Initialize track weights to zero in anim_source::SampleScalarOutput.
- AnimationStudio: Add button to add all animations to animation slots.
- AnimationStudio: Add button to remove all animation slots.
- AnimationStudio: Add [SCREENMESSAGE] for printing messages to the screen that aren't errors.
- AnimationStudio: (Internal) Reorganize application settings.
- AnimationStudio: Activate the current container when it's navigated into.
- AnimationStudio: Make anim set editor generate animation slot names without filename extensions.
- AnimationStudio: Edit_SetSetting/Edit_GetSetting for saving and restoring registry settings.
- AnimationStudio: Zero out uninitialized controller stick input.
- AnimationStudio: Debug draw showing the current values of inputs, outputs, parameters and scalars
on-screen.
- AnimationStudio: Add option for transitions to have either smooth or linear blends. The old
existing behavior was linear. New transitions default to smooth blending.
- AnimationStudio: Prevent selection of external conditions that create infinite recursion.
- AnimationStudio: Make state node activation requests possible using the actual state node rather than
by name. Fixes issue where clicking on one of two states with the same name in the Animation Studio
wasn't necessarily activating the one clicked on.
- Add Timer and Random types for parameters (the existing type is now called Value). A Timer
parameter starts at its max value when its container is activated, and counts down to 0. Note there are
two fields for the max. Set them to the same value for a consistent maximum, or different values for a
random maximum between them). A Random parameter returns a random value every time it is sampled. Random
parameters are most useful when fed a blend or selection node with 'Choose on activation' set.
2.11.0.1 release 2015/11/16
- AnimationStudio: Add readable output name for morph channels. Makes everything easier
to look at, and lets you name the outputs independently of the morph tracks and meshes.
- AnimationStudio: Automatic hookup of most morph outputs on creation.
- AnimationStudio: Triple-clicking a text-field selects all the text.
- AnimationStudio: Fix text click when clicking slightly off the text setting caret to
the end of the text field. Sometimes it's the little things.
- GState: Fix Crash in GState when loading a character instance, unloading it, then
loading it again from the same gsf.
2.11.0.0 release 2015/11/03
This is a minor version update since there is another new compression mode! Read the
compatibility notes carefully below.
- Added BitKnit 2 compression. This is the same compresssor as BitKnit, but now also
runs on the Granny fixup metadata, which was always stored uncompressed with the
previous Granny compressors. This can make a large difference on files that contain
a lot of pointers or animation data. We have observed file size reductions up to 2x
on actual game data. Unlike all previous Granny compressors, BitKnit 2 also does
not use any temporary memory allocations at load time.
- Compatibility Note: BitKnit 2 is now the default compression mode in the exporter.
- Compatibility Note: Tools and runtimes built with 2.10 or earlier will not be able
to load BitKnit 2 compressed files. Use regular BitKnit if you need files to load on older
versions.
- Compatibility Note: The internal function GrannyAdjustFileFixup has been removed
as part of changes in the fixup handling.
- The old Granny file writing path that uses temporary files on disk was removed. The function
GrannyBeginFile still exists but now simply forwards to GrannyBeginFileInMemory with
default settings, and the temporary file name parameters are ignored. The old path was
important in the era of 32-bit art tools and the resulting scarcity of address space,
but at this point seems hardly necessary!
- Added optimizations to Granny file writing and platform conversion.
- AnimationStudio: Expand AnyTransition options to include nearly all of what regular
transitions can do.
In addition to Duration, you can now set whether the transition supports early exit via
TransExit, the Event Handling options, the Preferred Exit transition, and the End Start
State. You can also add Conditionals. If one of the conditions becomes true, the
transition will fire automatically! That lets you conditionally drive deaths, for example,
without wiring every node to the death state.
- AnimationStudio: Allow interrupted transitions to keep their properties during the
interrupt transition (TransExit, Event Handling, Preferred Exit and End Start State).
- AnimationStudio: NodeState conditionals. Now you can check the state of a descendent node
from a conditional. Currently supports checking whether a descendent state node is active,
or whether it is being transitioned to or from.
- AnimationStudio: Put slot and file name in anim set editor tooltips.
- AnimationStudio: Make state nodes resize when their names get long and make edit and
state nodes resize as you are typing (rather than just once you press enter).
- AnimationStudio: Fix quick slots window sometimes not showing the bottom row.
- AnimationStudio: Fix 2-Bone IK not remembering default IK position.
- AnimationStudio: Fix text edit copy paste when selection is dragged right-to-left.
- AnimationStudio: Clear the windows clipboard on text copy so items with other copy formats
aren't left around.
- AnimationStudio: Make the breadcrumb display say -NO NAME- if someone gives it a blank
name, so it has width and is selectable.
- AnimationStudio: Make ctrl-a work in a text field (select all).
- AnimationStudio: Make ctrl-s save the file during text field entry.
- AnimationStudio: Make double-clicking a string work in a more standard way. Double-clicking
a word or number selects it. Double-clicking a non alphanumeric character selects just that
character.
- AnimationStudio: Make clicking into a text field for the first time highlight the whole text
field.
- AnimationStudio: Lighten the text highlight color for readability.
- AnimationStudio: Make it so text-dragging projects the input position onto the text field
when the mouse cursor is dragged above or below it, instead of sticking at the ends.
- AnimationStudio: Automatically add an output edge if there aren't any when turning on the
global Always Use Animation Events, so the anim events will get sampled without manually
having to remember to add a dummy output to the root state machine.
- AnimationStudio: Allow parent conditionals to draw their condition from any state machine in
the gsf rather than just the parent. In the tool these are now referred to as 'external
conditionals'.
- AnimationStudio: Fix bug where switching transition types dismissed the transition edit dialog.
- Tutorials: Fix shader-building post-build setup in granny tutorial projects so it works when
Visual Studio updates the project to newer versions.
- Documentation: Fix array types in the docs so they appear as arrays and not pointers to their
base type.
- tvOS support.
Changes for 2.10
2.10.1.0 release 2015/08/11
- Windows 10 Universal App library support
- Fix bounding box calculation in exporter for verts weighted to only one joint.
2.10.0.0 release 2015/07/30
This Granny release is more important than usual! The minor version number has changed to 10. That
means that this version of Granny can possibly (but only if you tell it to) create files that will
not load in 2.9 or earlier. Why? Because we have something awesome for you: significantly
better LZ file compression for Granny files. How much better? Up to 10x faster compression. 2x faster
decompression. And files that can be less than 1/3 the size of the previous compression method on
large scenes. The new compression mode is called BitKnit.
There is some more big news, too. The Animation Studio mouse-button assignments for bringing
up the dialog to edit nodes, transitions, and breadcrumbs (and for navigating breadcrumbs and
activating transitions) are now much more consistent. Right-click will open an edit window, and left click
will select, activate, or drag the object. I apologize in advance for asking you re-learn some
of the UI if you are upgrading, but it should be worth it to have more consistent behavior. Also,
the default behavior of edit windows is now for them to open one at a time. Opening a new one will
close the old one. If you want to open a new window while keeping the existing ones open, control-click
instead! Also, control-clicking the activation spot of an open edit window will close it.
We always try to minimize sweeping UI changes like this, but in this case it needed to be done.
Note that this release is not as big of a change as the jump to 2.9.0.0 was. The minor version number
had to change because this release can produce BitKnit-compressed files that can't be loaded in old
tools and runtimes. That said, the Oodle1 compressor is still there if you need it, and if you export
from 2.10 uncompressed or with Oodle1, those files will load just fine in 2.9.
Let's get on with the changes!
- Added a new Granny file compression mode, called BitKnit! BitKnit is a state of the art LZ
compressor. Compared to the existing Granny compressor Oodle1, BitKnit is up to 10x faster
at compression, faster at decompression, and produces smaller files as well. While most files
are 5-15% smaller than with Oodle1, BitKnit often can reduce a larger file by a lot more than
Oodle1 because the BitKnit search window is much larger. You should pretty much always prefer
BitKnit over Oodle1.
- Compatibility Note: BitKnit is now set as the default compression mode in the exporter.
- Compatibility Note: Tools and runtimes built with 2.9 will not be able to load a file
compressed with BitKnit, since they don't know how to decompress it. However, you can always
convert Granny files between the different compression methods with the preprocessor by using
CompressBitKnit, CompressOodle1, Decompress and RunBatch.
- UI Change Note: Animation Studio edit menus for breadcrumbs, transitions and nodes are
now all opened by right-clicking.
- UI Change Note: Animation Studio transitions now trigger by clicking the left mouse
button on the transition arrow instead of the right (since right-click now opens the edit menu).
- UI Change Note: Animation Studio breadcrumbs now navigate by clicking the left mouse
button, and reset by control-clicking the left mouse button, since right-clicking opens their
edit menu.
- UI Change Note): Animation Studio context menus now only show one at a time unless you
ctrl-click to open them. Ctrl-clicking will give you the old behavior and hold the previous
windows open. You can also ctrl-click the activation button of an open window to close just that
window.
- You can now edit state machine and blend graph node properties in the Animation Studio via
right-click from within a state machine.
- Made the Animation Studio character pane not reset to the default width window when minimized and
then restored.
- SampleScalarOutput now returns the track name, track key and bone index of the animation
that generated it so you can tell where the values come from.
- Compatibility Note: SampleScalarOutput interface changed. If you have custom
nodes that implement SampleScalarOutput, you need to update their signature.
- Remove unnecessary virtual keyword from the SamplePoseOutput wrapper function. This fixes warnings at
high warning levels.
- MergeRigidMeshes now removes bones that are no longer meaningful (bones associated with
meshes that have been merged away), and also removes the top level reference to old meshes,
which was causing MergeRigidMeshes to increase file size, rather than decrease it.
- Made the Viewer able to load external DDS textures in 64 bit builds. It was using the wrong
structure size in 64 bit.
- Fixed the RemoveNamespace and RemoveAllNamespaces preprocessor command so that it properly
sorts the transform tracks after removing namespaces. This fixed cases where animation binding
would fail because the tracks were not in sorted order when it expected them to be.
- Fixed Win32 version of anim_studio.exe asking for lua51.dll
- Builds no longer contain the legacy blend_editor (if find you need it, please contact us).
- Fixed incorrect function name in Animation Studio reference doc.
- Fixed truncated variable names in Mel export scripting docs.
- Added a new section in the exporter documentation describing how to export just a piece of the
animation timeline in Granny Exporting Overview: Exporting Animation Regions.
- Added gstate_x64.lib to the distribution.
- Fixed runtime library conflict warnings in preprocessor build.
- Distribute the x64 version of the preprocessor.
- Put Win32/x64 build info in the Animation Studio preview window.
- Made the Animation Studio camera controls tab not clip off the up-vector dropdown.
- Fixed the starting width of the tools tab area in the Animation Studio so the right-most tab
is visible.
- Print an error to the screen in the Animation Studio if a model file load fails.
- Hush Animation Studio console output that was being triggered by the ctrl key.
Changes for 2.9
Since it's customary on each minor version increase to summarize the changes since the last one,
that follows here. 2.9 was largely the version of Animation Studio and GState feature buildout, while
of course there were a bunch of runtime and export improvements as well. Many node types and options
were added as planned and in response to user feedback. Full morph target support was added, as well
as IK support. The Animation Studio was made to be controllable with a 360 controller. The ability to
attach user-defined data to nodes was added. Support was added for Windows Phone 8 and WinRT, Android,
64bit iOS, and Linux X64.
2.9.34.0 release 2015/05/26
- Granny Animation Studio Reference Guide. This describes the Granny Animation Studio in detail,
covering every part of the interface, including all the node types and how to use them.
- Turn on O3 optimizations in PS4 builds.
- 'Fallback' mode for custom remap node.
2.9.33.3 release 2015/05/04
- 3ds Max 2016 and Maya 2016 projects for building from source.
2.9.33.2 release 2015/04/29
- 3ds Max 2016 and Maya 2016 support.
- 64 bit build of Animation Studio.
2.9.33.1 release 2015/04/21
- ChooseOnActivate option for blend nodes. Blending parameter is sampled only when the node is
activated, not continuously. Good for making decisions about which animation to play and
then holding that decision.
- Fix bad range issue for text event sampling
2.9.33.0 release 2015/04/20
- Added global UseAnimEvents option on the top level state machine. Enabling this will make all
animations report the built-in events in addition to their text events.
- Make UseAnimationEvents no longer disable text track events.
- AddTextTrack function for the preprocessor. Note that re-exporting over the gr2 will overwrite
those added tracks.
- SampleEventOutput returns the name of the node that generated each event.
- Compatibility Note: node::SampleEventOutput interface changed.
If you have custom nodes that implement SamplePoseOutput, you need to update their signature.
- Compatibility Note: The previous release (2.9.32.0) changed the node::SamplePoseOutput
interface, but the changelog did not originally note that.
If you have custom nodes that implement SamplePoseOutput, and you didn't already do it for
2.9.32.0, you need to update their signature.
- Add a new Custom Remap Node to GState, for more control when remapping floating point values.
- Fix assert when removing last point from a linear remap node.
- Added basic icons for all the anim studio math operations and time clamp.
2.9.32.0 release 2015/03/24
- Null state blending. If sampling a null animation source, it will contribute nothing to
an additive blend or a masked combine. The weight will be ramped smoothly if there is a
transition to or from a null animation source.
- Compatibility Note: Changed the node::SamplePoseOutput interface.
If you have custom nodes that implement SamplePoseOutput, you need to update their signature.
- GetStateByName() call on state_machine
- Allow setting an animation source node to null animation
2.9.31.3 release 2015/03/12
- Add note in docs that you need to keep the LoopIndex on a control in range if you
manually set the LoopCount with GrannySetControlLoopCount.
- Make Windows Phone build reference msvcrt instead of msvcrtd.
2.9.31.2 release 2014/12/19
- 2.9.31.0 and 2.9.31.1 accidentally included debug libraries for Mac and iOS. Fixed that.
2.9.31.1 release 2014/12/16
- Make morph target code use the right output indices during transitions.
- Make onsubloop transition respect the trigger intent properly
- Fix crash when removing animations from an animset that was originally cloned from another animset
- Fix memory leak when loading a gsf with cloned animset
- Rename strangely named Android lib from liblibgranny2_android.lib to libgranny2_android.lib
- Fix uninitialized morph channels during transition
2.9.31.0 release 2014/12/05
- Make sure animation studio icons and resource file get into the Animation Studio
distribution in all cases
- Fix potential crash in orient node in the editor
- Make GrannyDumpSettings print an error if it's called on something other than
a .ges file
- Fix backward morph target assert that was triggering when a mesh had more morph
targets than the animation driving it.
- Disable overly-aggressive error when an animation doesn't drive every morph
target in a mesh.
- 64 bit iOS (arm64) support
- Allow clearing animation node scalar and morph tracks by setting them back to
empty like you can with event tracks.
- Fix memory leak when clearing an animation node event name.
- Fix performance drop when drawing sliders with a large range that are using
integer clamping. Don't draw ticks when it's going to be more than 50 ticks.
2.9.30.4 release 2014/11/19
- Fix bug in where animation sets weren't getting sorted right when animation sets got
sorted introduced in 2.9.30.3
2.9.30.3 release 2014/11/18
- Fix bug in animation slot sorting introduced in 2.9.30.2
- If a transition has a start pose but no end pose, ramp off the local pose weight
transparently so that we can transition smoothly from a pose to a 'empty' animation
node without popping.
2.9.30.2 release 2014/11/13
- Add button to sort animation slots
- Animation 'Started' event for <Anim. events>
- Don't allow transition exit on the frame that DT rolls over the end. Hang onto it
so that evaluation has time to process it once. This prevents animation nodes from
skipping events on the last frame!
- Clamp start times for animations. Prevents animations from triggering loops right
at the start in some cases due to floating point error.
- Make adding node outputs preserve the order of the outputs in their parent container
- Allow OnSubloop transitions to monitor any descendant node
- Allow state machines and blend graphs to be targets of an OnSubloop transition
2.9.30.1 release 2014/11/03
- Granny optional BSpline solver option to do aggressive knot reduction if the fitter
runs out of knots.
- Zero-initialize the OPENFILENAME structure used with GetOpenFileName().
- Put the UI handling back onto the main thread. UI is way fast now, and it fixes
lots of issues with the dialog boxes, including main screen not drawing if you tab away
and back, able to drag-drop items onto the window while a dialog was up,
windows interaction messages getting queued during the dialog then dispatched
after it was closed.
- Clamp negative delta-t's during gstate motion extraction instead of asserting.
With undos negative delta-t's are common.
- Install Granny icon in animation studio so it shows up on the window and during
alt-tab.
- Fix anim_studio.exe built with visual studio exiting immediately when not run
in the same directory as its resource files (main.lua, etc).
Make animation studio build with STATEMENT_BAKED_FILES=1 like the distributed
version of anim_studio.exe does, so the .lua and image files get compiled in.
- Fix animation studio debug build warning about LIBCMT
- Fix animation studio bug where if you were in a sub-statemachine, that
statemachine's transitions might not get ticked. Fixed by *only* ever ticking
the active state machine in the studio (we never explicitly tick the
character state machine unless it happens to be the active one)
- [SCREENERROR] tag. If you start GStateError or GStateWarning text with "[SCREENERROR]"
it'll get printed to the screen as well as the console
- Start fading animation studio text after 3/4 of it's elapsed time has passed.
Makes it easier to read.
- Fix issue where animation studio text would stay on screen for a long time
when the clock resets during undo.
- Fix animation studio console printing (it was only working when the debugger
was attached).
- Set the animation studio console buffer to maximum size.
- Print error message if animations can't find mesh morph targets to bind to.
- Do not clamp morph weights. Animators like to animate them with arbitrary
(including negative) values.
- Make SampleMorphOutput respect the mesh bindings. Fixes mismatch issues with meshes
that have their morph targets in a different order from the vector tracks driving
them from animation.
- Remove the SortMorphTargets preprocessor command, since the SampleMorphOutput fix
above renders it obsolete (sorting wouldn't have any runtime effect, since we bind
mesh morph targets to vector tracks by name at load time now).
- Make model filenames project-relative like the animations are.
2.9.30.0 release 2014/10/02
- Uppercase distribution zips and folder names
- Use new stb_image.h
- GState: make instantaneous transitions set to Switch At Midpoint sample both
source and dest nodes for the one frame they're active. Fixes cases where
source events get missed.
- ExampleSetVertFormat preprocessor command that works with morph targets
- Make it possible to unset <Anim. events> once it's been set (via empty entry
at top of event dropdown)
- Add preprocessor command ResetAnimEvents to reset all animation events in a
gsf.
- Add preprocessor command SortMorphTargets to sort the morph targets in each
granny_mesh alphabetically so they match up with the vector tracks in the
animations that drive them.
- Compatibility Note: Changed the common shared header from rrCore.h to
radtypes.h. radtypes.h is the new, cleaner user-facing RAD header.
- Preprocessor now links with gstate.lib instead of building from gstate source
- Update Granny Viewer to compile with new stb_image usage
- Remove float32 vertex format restriction for morph targets in animation studio.
- Fix Animation Studio crash when trying to load morph data exported
with 'extract mesh frame by frame'
- Fix Animation Studio crash when trying to add morph outputs to a node
that was created before the morph outputs were added to the state
machine
- Feature: EarlyExit: Mark an animation, state machine, or
transition as early exiting from the destination of the currently
running transition if the target state's exit conditions are met
- Feature: AnyTrans: Mark an animation or state machine as allowing
a transition to it from any other state
- Add ws2_32.lib to granny viewer project generator source
- Fix compile error calling CompileAssert when using mod support
- Generate Max 2015 and Maya 2015 visual studio projects
- Make AddSlotsForSource accessible from code.
- Add GetParameterOutputProperties function.
- Make write_raw_sidecar preprocessor command more flexible
- Edit_LoadLastFile function. Optionally add to user_macros.lua to make
the editor auto-load the last-loaded gsf
- Add more of the anim_studio source and the lua files to the anim_studio
vcproj for easier searching.
- Allow mesh deformers to have longer destination specs than source specs
(data passes through).
- Fix a problem in the rebind function of the animation set
editor. Animations were using "FullName" rather than "ShortName" to
find the matching animation in a new file.
- Clear the undo history in Animation Studio when dragging a gsf onto it
- Minor: remove too-restrictive texture size assert when printing the
last-loaded file with a long path
2.9.29.0 release 2014/05/12
- Feature: New button in Animation Studio to re-bind all unbound animation
slots in an animation set
- Fixed a nasty memory leak that could crash the Studio if left on a
modal dialog for a few minutes.
- Granny now supports Softimage XSI 2015.
- Feature: Right-click on animation file to unbind it from animation slot.
- Fix assert/leak when adding a copied animset then undoing that add.
- Fix memory corruption when SetMask is called with the return
value of GetMask()
- Change exporter default texture size from 256x256 to 1024x1024
- Added a proper UI to the TwoBone IK node.
- Corrected a character offset error in the Aim At IK node display.
- Fixed an uninitialized variable in the new event edge path.
- Fixed crash when deleting key/value pairs from blend node
- Added lua interface to node key/value pairs
- Added some error logging to the event track API for anim_source to
guard against confusion.
- Minor: remove OutputDebugStrings from maya_granny_tool_interface
- Minor: add some hints about preprocessor conversion steps in file
versioning and 64-bit conversion steps.
2.9.28.0 release 2014/04/24
- Fix a problem tracking local pose traversal IDs in masked combine
operations.
- Make recompress_anims_sample preprocessor command ensure quat
continuity and fix a bug with orientation channel not being
processed as quaternions.
- Granny supports the 2015 versions of the Autodesk toolset. Turning
off default inclusion of the 2009 toolset, if you still need
Maya/Max 2009, please let us know.
- Turned unavoidable warning in xtree so preprocessor would compile
/W4 clean.
- (minor) Fixed some code that should not have been in basic_loading
tutorial.
- Fixed a crash in the animation studio where source references could
be double-freed.
2.9.27.0 release 2014/04/17
- Preprocessor distributes as a binary as well as project
now. (bin/win32)
- Fixed a morph target normal export issue.
- Fixed an overlapping checkbox problem in the transition conditional
editing.
- Delta scaling issue for normals, tangents, etc. corrected.
- Added the ability to add user tagged data to studio nodes.
- Fixed an incorrect dependency on an unused .asm file in the Win64
build.
- Corrected some warnings and build problems on 2012/2013 in the
preprocessor.
2.9.26.0 release 2014/04/01
Quick turnaround to disable some buttons in the Studio that could
cause (reversable) graph corruption. If you think this has affected
you, please contact us.
- GState FileTag updated in this version: conditional
negation.
- Allow transitions to use the negative of a condition as a trigger.
- Fixed a crash when hitting the delete key after manipulating an
internal output of a blend graph.
- Add animation slot button lofted out of the slot list for easier
manipulation of large animation sets.
- Fixed a bug that allowed you to delete an event track for a child
state machine in such a way as to invalidate an important
consitency constraint.
- (minor) Correctly exposed C-side save API in anim_studio.
2.9.25.0 release 2014/03/25
- GState FileTag updated in this version: parent_condition node
added.
- Fixed a display bug when editing a non-root state machine. If the
parent of the state_machine being edited didn't consider that to be
the active state, the clock would not be properly propagated down
to the lower level, causing transitions to not update correctly.
- Added the option to reference a conditional in a higher-up level of
the state machine. This prevents some needless duplication of
effort.
- Added support for the Maya 2015 beta.
- Added a snippets directory in gstate for useful, (but not
universally useful) code for manipulating GState objects.
- Snippet for binding character animation sources by slotname rather
than animation set file reference.
- Add the option to display conditions in the preview window.
- Tweaked the blend node UI so you can mark it as phase locked before
connecting animation sources.
- CrowdScene tutorial demo updated so it doesn't call CreateThread
multiple times per frame. Because, you know. Duh.
- Fixed a crash in the undo stack of the Studio.
2.9.24.1 release 2014/03/05
Hotfix for a crash in the Animation Studio.
- Fix a failure to allocate in the editor creation pathway of the
Blend node.
- Probability 0 or 1 subloop transitions had inverted logic.
2.9.24.0 release 2014/02/24
- GState FileTag updated in this version. (Note that future
versions of Granny which change either GrannyCurrentGRNStandardTag or
the GState equivalent will note this prominently in the changelog.)
- Compatibility Note: Improved debugging visibility of opaque
Granny structures. (granny_model_instance will show you internal values
in the watch window for instance.) This change is unlikely to
break code unless you forward-declare Granny structures. If you
do, mimic the GRANNY_FORWARD_DECL_OPAQUE_STRUCT macro in granny.h
to get the correct behavior in your code. You need to forward
declare the version in the granny:: namespace, and then typedef the
granny_ version to that for Visual Studio to recognize the
equivalence.
- Compatibility Note: "N-Way Blend" removed from the
Studio. This has been replaced by allowing the Blend node to have
more than 2 nodes. N-way nodes in your current graphs will still
work of course!
- WinRT is now a supported Granny platform.
- Gtate project for WinRT added.
- Granny support for WP8 added.
- Added GrannyRebasePointersTrackNulls to allow for some cool tricks
upcoming with RAW files.
- Fixed a bug in the exporter that popped up when Maya leaves a
vertex unused in the mesh. This can happen in rare circumstances.
The vertex is default-initialized in these cases.
- Fixed matrix ordering problem in exports from Maya 2014.
- Corrected a bug in the Look At IK solver for very small
rotations. Quaternion math could leave the W coordinate very
slightly greater than 1.0, which caused NaNs to pop up in an
unwelcome location.
- Added a new node type to the Studio, "Orient Towards". This is for
one bone positional IK targets. (Think eyeballs.) You can lock
multiple bones to the same position target in one node, to make it
easy to lock both eyes on a target, or antennae, or whatever your
character might have.
- Added MOD header entries for File Magic Values. Not important to you
unless you have a MOD license for Granny.
- Fixed a crash in the Maya exporter relating to flipping textures
vertically when the image memory is owned by Maya.
- Fixed an assert using a non-public symbol from Granny in GState.
- Forbid certain Maya attributes on materials that can cause large
textures to be read unnecessarily when GrannyLoadSettings or
GrannyExport is called. For large textures stored on network
drives, this can be really bad. Forbidden user attribute names are
"outSizeX/Y" and "fileHasAlpha".
- Added a RenderAsSkeleton option to the Studio camera controls.
- Fixed the exporter build to not inappropriately lock the CRT version.
2.9.23.0 release 2013/11/05
- Corrected an error in GrannyModulationCompositeLocalPoseSparse that
could leave the granny_local_pose TraversalID members in an inconsistent
state.
- Added an option to play morph animations in sync with the main
animation playing in the viewer. (It's in the "Mesh Inspection"
menu.)
- (minor) Removed some long dead processor checks.
2.9.22.0 release
- Exporter for 21.0 shipped with some inappropriate diagnostics
enabled.
- Corrected a crash in the exporter when a mapping channel that didn't
contain a UV map was selected as tangent source in Max.
- Fixed the map default for tool tangents in Max. Map 1 is the default
texture, rather than 0.
- Added a 64-bit compile mode to the preprocessor project for dealing
with very large files.
- New preprocessor sample command "FilterMeshOnColor". Allows
masking off parts of a set of granny_meshes and their associated morph
targets with a vertex color channel.
2.9.21.0 release 2013/10/08
- Compatibility Note: Libraries for gcc-ish platforms have
been renamed to libgranny2*.a to play nicely with linker
conventions. This is a great time to make sure you're calling
GrannyVersionsMatch somewhere in your application!
- Compatibility Note: Frame-by-frame morph extraction may now
use delta storage. This is a compatibility note because the delta
option has moved out of it's dependant position in the target
extraction group, so you may need to clear it if you need the
absolute storage option.
- Added -ws/-withSettings option to Maya exporter to support quick
loading settings for export from script.
- Added -ca/-clearAfter option to Maya exporter to keep Granny
settings objects from persisting in read-only files, or those where
you don't want a dependency on the Granny Export MLL.
- OS X target built with Clang.
- Clang support added to compiler detection.
- DEC3N Normal deltas computed correctly.
- Real16 normals and colors now supported.
- Added an option to filter zero-delta components from morph targets.
- Fixed a bug in GrannyMaskedAdditiveBlend that computed incorrect poses when
the blend parameter was 0.
- Mesh topology will now include the original polygonal indexing which
can be handy for tool support. Check "Include Topology Information"
in the exporter Meshes options to add this to the GR2.
- Newly created additive blend nodes will have a mask input that
controls where the addtive blend has effect. Older nodes will
function as before.
- Added a compile option to support lerped keyframe animations. Set
GRANNY_LERP_KEYFRAMES to 1 before recompiling to enable. (But write
us first!)
- On large files, memory_file_writer linear growth breaks
down. Added BlockSize = -1 for "grow by doubling".
- Corrected an error in Edit_ConnectNodes that could violate the
constraint that inputs must be connected to either internal outputs
of the container, or external outputs of a sibling.
- One prefetch
- Telemetry changes to controlled animation.
- Added an option for disabling vertex merging on export. This
generates...large...files. But it can be handy in certain
scenarios.
- Distribute 64-bit viewer with the main common bundle.
- Distribute the "grn" tree walker sample for text debugging gr2/gsf.
2.9.20.0 release 2013/08/30
- Compatibility Note: GrannyFreeFile and GrannyFreeFileSection are now
marked as GS_MODIFY, that is, they must be executed from a single
thread with no other threaded samples running. This is necessary
to correct a long-standing error in the animation binding cache.
Please write if you need more info, or this causes undue disruption
in your codebase.
- Compatibility Note: GrannyConvertTree takes an optional
granny_uintaddrx argument to return the size of the conversion buffer
used. This is a rarely used function in user code, not expected to
cause trouble.
- Morph meshes will now be extracted in a single pass in 64-bit
versions of the export plugin. This can be a substantial speedup
for complicated scenes with many modified meshes. 32-bit plugins
will still run the timeline separately in order to try to avoid
cramping the memory space during extraction.
- Fixed the "Use Tool Tangent" option in 3ds Max. Existing extraction
was ignoring smoothing groups.
- Added an option to allow the last active state for a state machine
to be started on re-Activate(). Start node still controls initial
state.
- Corrected packing directives in granny.h for Orbis.
- Allow preferred exits to be unnamed transitions.
- Added the ability to specified a "preferred exit" transition for
transitions edges. This lets you execute function call style
one-shot animations, or route complicated sequences of animations
through common nodes where appropriate. The currently preferred
transition renders in a slightly different color for tracking
during editing.
- Check alignment on return from the allocator, scream into the log
if it's wrong.
- Node_SampleScalarOutput exposed to lua.
- Fixed an error in the crowd scene when Animation LOD is disabled.
- Compiling against the July Xbox One XDK
- (minor) Namespace error in type casting macros for GState.
- Fixed internal input/output rendering for blend graphs with a large
paramater/production set. (Edge connections could drift with high
parameter counts.)
- Labeling problem in the blend graph parameter editor
- Altered the GState tutorial program to pass time parameters in the
recommended way.
- Altered the BoundsCalc sample to encode the animation bounds back
into the specified animations.
- New preprocessor command "BoundStateMachine" that will union the
"BoundsCalc" results for a character_info and store that in the
character_info::ExtendedData member.
- Added Node_GetParent function to the Studio Lua interface.
- Added GrannySuppressCrashReport to the Max export script interface
to prevent error dialogs on headless clients. (Analogous to -nc
option in the Maya exporter.)
- Default diffuse color for vertices changed to white.
- New preprocessor sample: "RemoveMayaLongpaths". It's not likely
that you need this.
- New sample preprocessor command "RestoreTypeTree". Does what it
says on the tin, very unlikely you need this function. But when
you do...
- (minor) Added expansion feature to GSF format.
- (doc) Correct writer flags sample in documents.
2.9.19.0 release 2013/06/25
- Fixed a output mapping bug in the node duplication code for state
machine children. In certain cases, this could cause runtime
errors in addition to corrupted GSFs, so a hotfix release is
necessary.
- AddChild split into AddCopiedChild/AddNewChild
- Extra precision for most numeric fields in the editor.
- Add lua access for Linear Equation node.
- Added GrannyAnimationDefaultToLoopClamping, and a setting in the
Animation export settings to allow you to mark an animation as
defaulting to clamped loops. (I.e., discontinuous from t=1 to t=0.)
You may still override the default behavior with
GrannySetControlForceClampedLooping
2.9.18.0 release 2013/05/30
- Rudimentary Copy/Paste and node duplication system added to the
studio. (Ctrl-C/Ctrl-V and Ctrl-D, respectively.) Only works on
single node selections for the moment. State Machine states may be
copied or duplicated, but there are technical constraints on pasting
into a state machine level.
- Autodesk tool plugins updated for 2014 release versions.
- Linux and OSX Makefiles renamed to Makefile.linux and Makefile.osx
to prevent collisions in the source/ tree.
- Infinite loop in the output deletion handlers for timeshift and
timeclamp nodes.
- Fixed a crash in the Viewer mesh filtering, added some extra checks
in related calls.
- Fixed the armv7s problem in the iPhone fat binary.
- (minor) Some creative spellings in the Utility overview have been
addressed.
- Plugin installer runs as root.
- Exporter cutoff at 2009 versions. As always, older versions are
available on request, but this cuts down the distribution size and
exporter installer to reasonable-ish levels.
- Add Node_GetInputConnection lua function.
- Corrected some small oversights in the linear remap node.
- Disable automatic skeleton LOD for skeletons with no bone offsets.
- (internal) Necessary internal api for DuplicateNode.
- (internal) Corrected an error relating to curve control point
aliasing.
- (documentation) Added documentation to the Studio Quickstart covering
sync pairs and published parameters.
- (documentation) Removed obsolete beta upgrade section in the
documentation.
2.9.17.0 release 2013/04/30
- You can now right click on blend graph inputs to edit the connected
node.
- Changed the way that Animation Studio script and image files are
loaded from disk to better support customization.
- Note that the STATEMENT_OFFICIAL macro that controlled crash logging
and disk/header file loads has been forked. Mail granny3@rad for more
information if this sounds like something you'd be interested in.
- Transitions that check looping state may now "look ahead". This is
most useful if you want to set the transition to trigger such that
it will stop sampling the start state just as it completes. Changes
OnLoop, OnSubLoop, and LastResort.
- Corrected an error that was calling AdvanceT on too many nodes in
the course of a character update.
- Edit_RenameNodeInput
- Fixed the registry scan for newer versions of Maya.
- Erecting some infrastructure to make custom node editing interact a
little better with version updates.
- Fix a clipboard error in the Studio.
- Subloop now has a "probablity to take" modifier.
- Transitions will now visually indicate when they are active, and
the value of the fade parameter.
2.9.16.1 release 2013/04/18
Quick release to update LuaJIT and correct an output indexing problem
in the new linear remap node.
- LuaJIT library brought up to 2.0.1 version for the Studio.
- Fixed a bug that would let MouseWheel events through to controls
behind the active control.
- Add a version watermark to the Studio character display.
2.9.16.0 release 2013/04/17
- Transitions now give you the option to sample events from both the
start and end nodes, either, neither, or switch at midpoint, the
previous default behavior.
- New node, linear_remap, which does a piecewise linear mapping of an input
scalar to the [0,1] range. (Think Photoshop curves.)
- Fixed a bad bug in the state_machine output management that could cause
child output maps to be incorrect.
- Fixed timeshift node scale changing so the animation remains stable.
- Fixed passthrough interface for timeclamp.
- Added some tooltips for the node create bar to give info about each
node type.
- Regularized the AddInput/Output interface for nodes to reduce
surprises on the scripting side.
- granny_pose_cache will now yield cached granny_track_masks as well. Help keep
allocations down to 0 in GState sampling involving mask combines.
- Fixed timeselect node to support selected queries of scalar
parameters.
- Handle common cases in GrannyModulationCompositeLocalPoseSparse for a
decent speedup.
- Fixed a crash relating to deleting single nodes mapped to the
XInput controller.
- Anim Source nodes will respond to a GetDuration call on any edge now,
previously this was restricted to the Pose edge and any Morph edges.
- Added extra edge support to timeshift so you can sync events, morphs,
scalars, to a scaled animation.
- Added Edit_ActivateContainerLevel and wired it into the bread-crumb
display at the top of the node editor so you can re-zero clocks for
testing purposes.
- Added a little UI help to read off connections for blend graph inputs,
as well as scalar ranges.
- Animation slots are sorted by name in the quick slot drawer and in
the animation source drop down.
- Added auto-range setting abilities for the linear equation node.
- Corrected a bad advance bug in the RESET_READ_BOOL macro.
- Added rect-able small button.
- Moved nearly all of the boilerplate function decls in gstate headers
to macros for easier alteration of the interface.
- Expose undoc function GrannyGetCacheRestLocalPose
- Compatibility Note: granny_pose_cache API name changes for
consistency. GrannyGetCacheLocalPose, GrannyGetCacheRestLocalPose, etc.
2.9.15.0 release 2013/03/19
- Fixed a crash in the mask source node rendering
- Fixed DumpMeshTexture command to eliminate zero-area tris that
confuse Maya on OBJ import.
- Refactored some boilerplate in gstate to make custom nodes easier.
- Added macros for creating passthrough Pose sampling functions. This
allows low-probability-of-error coding for simple modification
nodes like "Constant Velocity", etc, where you need to pass through
most of the pose interface to the attached node, and modify only a
single function.
- Increased the precision of the linear equation node parameters.
Previously these would be clamped to 2 decimal places, which is
fine for animation parameters, but not for math scales/offsets of
input game parameters.
- GetDuration now takes an "AtT" parameter for future use.
- Added Edit_RemoveOutputIfPossible and RemoveInputIfPossible to go
with AddOutputIfPossible, etc.
- Fixed the range query call for parameters passed as inputs to state
machines.
- Added range query to Clamp and Linear Equation nodes.
- Both container and node had eInvalidChild constants, only container
should have this.
- Sooper Sekrit thing is on Sekrit January Thing.
2.9.14.2 release 2013/03/08
Putting out a quick release to correct a significant math error in
one of the new platforms.
- Two new nodes for the Studio, Linear Equation, which does what it
says on the tin, allows "Ax + B" math manipulations for scalar
edges. Also, Clamp Value, which also is fairly self-explanatory.
They can be found in the new "Math" tab of the node creation bar.
- Corrected a DidLoopOccur inconsistency in anim_source nodes with
negative speeds.
- New time control node: TimeClamp, which clamps sample parameters
to a range specified by input parameter edges.
- Significant change to the activation semantics of Blend Graph
nodes. Previously, when a blend graph was "activated" as the
current state, a signal would propagate backwards from the output
pose edge to recenter animation clocks (before sync pairs are
applied). This causes inconsistency when two nodes are connected
to the output of a single animation node, which is a reasonable
construction. In short, all unsynced nodes are now centered to the
current time and nodes like timeselect and blend (phased locked)
that depend on the activation offset query it explicitly. This
should be a null change w.r.t. existing graphs, (except where
ambiguity would have occurred), please let us know if you notice
unexpected changes in output.
- Fix a missing function that prevented the quick slots from
functioning correctly on user machines.
- Altered the timeshift node to allow the Offset parameter to
represent a duration-relative shift.
- Corrected the activation timing for nodes that play at negative
speeds.
- Threading and atomic primitives that Granny uses are now fully
contained inside Granny to prevent link collisions with other
RAD products.
- Compatibility Note: I'm going to regret this. Sekrit
platform distributes debug and release mode libraries. This means
you need to update your library linkages, granny2.lib is no longer
distributed in lib\_platform_. Instead you want granny2_debug.lib.
It's a good time to check that you're calling GrannyVersionsMatch!
- Corrected an uninitialized variable in the GrannyBuildInverse function
on the sekrit platform.
- Optimized the GrannyMultiply function for the case in which one or both
of the input matrices has no scale/shear component. This has become
much more important with layered blend trees in the Studio.
2.9.13.1 release 2013/02/21
- Tiny fix to correct an off-by one error in an event track function.
2.9.13.0 release 2013/02/19
- Compatibility Note: 3Ds Max Shading/Illumination channel will
now export as the second color channel if present. This is marked as
a compatibility issue, since secondary diffuse color channels will
slide down in new exports.
- You know the other thing no one is allowed to talk about? No, not
that one, the other one. Now Granny supports that one too.
- Brought Granny's Telemetry integration up to the latest 1.1o
release.
- Allow multiple inputs for an event mixer node, and added the UI to
manipulate them.
- Edit_GetChildByName script function
- Edit_AddInputIfPossible script function
- Edit_ConnectNodes now returns a status indicator for success.
- Fixed a bug in the Edit_IsInputExternal scripting wire-up.
- Added scripting hooks for setting event tracks on anim_source nodes.
- Correct Mask preview for rigid meshes.
- Plugins available for new versions of Max and Maya.
- Fixed the plugin installer for Maya 2013.5
- TimeSelect node can handle morph edges
- Fixed a GetDuration() consistency issue with BlendGraph nodes.
- Optimized the (common) case of GrannyMaskedAdditiveBlend and
GrannyAdditiveBlend when the weight is 0 or 1.
- Animation studio camera can now be controlled from the XInput
device.
- Compensated for a math error in the XSI support libraries for
scenes with non-uniform scale.
- Corrected a clock issue for files loaded when the time scrubber
is active.
- Slight naming error in the animation source node for parameter
outputs of a state machine.
- For some reason the edge name editing interface for Blend Graph
nodes was missing when they were children of a blend graph
themselves. Fixed. (Note that Blend Graphs that are children of a
State Machine may not change edge names.)
- Corrected a pretty big oversight in the last version's new
Studio morph support. Unless your morphs were in lexical order,
it was not possible to recover the morphtarget/channel mapping
from the API. That has been corrected with the new character
instancing method GStateInstantiateCharacterDetailed, which allows
you to specify the meshes to bind to morph channels. In addition,
node::GetMorphChannelBindings will recover the mapping for debug
purposes.
- New command "ChangeGSFSources" that lets you quickly modify
sourcenames globally for a character using the preprocessor.
- "RemoveNamespace" command will now correctly handle bones with
internal namespaces appended for enforcing the "unique bone name"
condition. For example NS:root|NS:pelvis will be turned into
root|pelvis rather than root|NS:pelvis, as expected.
- Corrected a token conversion bug in the animation source node
when there were non-zero scalar or event edge outputs.
- Added an option to turn off character motion sampling to the camera
controls.
- Brought some thing up to the October version of that thing.
- Corrected a possible bug in the event_source poke by index fn.
- Added "Edit_Quit" and "Edit_SaveToFilename" commands to facilitate creating
character graphs automatically from the startup script.
- (minor) Use "--console" to bring up a console window for the Animation
Studio that catches "prints", etc. from Lua.
- No more PLATFORM_SUPPORTS_MULTITHREADING flag anymore, they all
do.
- Speed up the transform inverse function on some random platform.
- (minor) Added Edit_SetSourceOneShot to allow setting of loop clamping
from Lua.
- (minor) Animation Studio fading strings were hanging around too
long in newly loaded scenes.
- (internal) Building the x64 target with VS 2012 now.
2.9.12.0 release 2012/11/02
Small release to preview and test the new morph target functionality
in the Animation Studio. If you are going to use this feature, please
get in contact with us at granny3@rad. As noted in the previous
release message, this release will disrupt your export pipeline if you
are currently using morph modifier extraction to sample morph curves
from Max or Maya. Please do read the two large Compatibility Notes at
the top of the changelog below. If you are only using the morph
extraction to access the vertex deltas, this will not affect you.
Anyone not currently interacting with morph targets or their animation
can treat this as a normal release.
- Compatibility Note: Max morph targets will now report their
values on the [0,1] scale, which allows morph code to be DCC
independent.
- Compatibility Note: Major change to the way morph track are
exported to a GR2 by the exporter. Previously, each mesh with a
morph modifier would be placed in its own granny_animation. This causes
real problems with combined files. From now on, morph tracks will
be treated as granny_track_group level items. Please mail us if you need
some help making the transition, there are things we can do with
the preprocessor to make this less of a problem for games currently
in progress.
- Added missing ability to delete event renaming edges for the
event_renamer node
- Fixed a bad default in the track group level options of the export
dialog relating to root motion extraction.
- Added a platform sample for Vita.
- Fixed an error in RemoveElements command when preprocessor is compiled
for 64-bit platforms.
- Added "morph_track" to the list of addressable settings in the
exporter. I.e, you may now use "GrannySetValue [setting] [value]
'morph_track' [object]"
- Animation Studio will now try to display morph curves on the set
model if the published morph parameter matches a mesh name.
- Morph curves were always being exported with poor fidelity. (!)
- Corrected an alignment error in the file routines for writing
platform-specific files.
- Added GrannyFindMorphTrackGroupForMesh for searching the granny_animation
granny_track_group array. GrannyFindTrackGroupForModel has been updated to
only search non-morph granny_track_groups in a granny_animation.
- New granny_track_group flag: GrannyTrackGroupIsMorphs, which helps distinguish
between skeletal and morph animation for Max, in which these are
likely to share a name.
2.9.11.0 release 2012/10/16
Small release because there is a large morph-related change coming in
the next version. This release gives people a chance to get the
current version without taking up the morph changes in the middle of a
project in 2.9.12.0.
- Added support for Maya 2013.5 extension.
- Added a "quick slot" tool drawer to the node editing region. This
allows you to very quickly drag out preinitialized animation
sources, state machines, or blend graphs. Expect more refinement
in this UI soon.
- Compatibility Note: Finally excising the Carbon file APIs
from the OS X target. Let us know if this hits you.
- Added stored filters for the quick slot.
- Corrected a file opening bug on a Nintendo platform.
- granny_variant type arrays could contain uninitialized data in their
EndMember entry, which could cause identical files to have
different on-disk representations. Fixed.
- Brought back GrannyLoadMarshallingArray for correct partial file reading
support. Fixed Granny Data Loading Overview: Advanced File Reading Methods.
- Fixed a bug in the XInput hander of the studio when nodes were
deleted.
- Small combobox drawing error fixed
- New function GrannyFreeFixupArray to make it clear how to dispose of
results from GrannyLoadFixupArray and GrannyLoadMarshallingArray.
- Corrected an amazingly long-standing bug in the Max granny_skeleton
extraction code, which would look at the transforms at (t = 0),
rather than (t = timeline_start).
- Corrected an interaction bug that prevented hotkeys from being
recognized after a model dialog closed in the Animation Studio.
- (internal) Unified the searchable and non-searchable combobox
implementations. These should not have been allowed to drift.
- Animation Studio properly supports scrollbars for comboboxes that
contain too many entries to fit on screen.
- Corrected gstate and Studio sources to be warnings clean on
VS 2010. (Ambiguity on conditional, plus alterations to rules
for unused variables in asserts.)
- (internal) Brought PS3 SDK version up to latest 4+ version.
- (internal) Zero padding bytes for Oodle1 compressor out of an
excess of caution.
2.9.10.0 release 2012/09/10
- Fixed the XSI morph animation export.
- Added "Rest Pose" node that yields the rest pose for the model
without dancing around with the pose storage node.
- Corrected an alignment macro that fails for certain versions of
GCC, which can cause early out errors in the sampling paths.
- Added undocumented GrannyGetFileInfoType and GrannyClearOldStructures for
forward compatibility.
- Fixed conditional checking for loop transitions.
- Don't yield an invalid pose from the Pose Storage node if the
model changes incompatibly.
- Header was checking for sizeof(enum) == sizeof(int32), but not
enforcing that in certain cases. Rude!
- Slight compile change for Xenon.
- Fixed an option error in TouchVersion preprocessor command.
2.9.9.0 release 2012/07/27
Another quick one. This addresses a harmless, but confusing display
error in the animation set editor when passed source files containing
invalid animations.
- Fixed an instability in the IKAimAt routine.
- Corrected a rendering problem in the Studio animation set editor when
an invalid (i.e, TrackGroupCount == 0) animation was present in the
Animations array of a source.
- ModelIndex hint was not being properly respected in the Studio
file load, which left the 0-index model always selected at load
time.
- Corrected an error in the mod support for preprocessor batchable
commands.
- Replaced animation set source replacement with a name-based rebinding
function. This simplifies error handling when another invalid source
is specified as the animation replacement.
- Propogate errors out of container::BindToCharacter correctly.
- Corrected a infinite loop in the sibling data capture
portion of character binding.
- Corrected a scale-related rendering error in the Aim At IK
interface for the Studio.
- Fixed the input/output renaming for State Machine nodes that are
the child of a Blend Graph.
2.9.8.0 release 2012/07/17
Point release to correct a work-loss error in the Studio.
- Fixed a bug in the "New Machine" command that could leave the
current filename set to the last file opened.
- New preprocessor command "StripImages", which removes all bulk
pixel data from granny_textures encoded in the file.
- Added projects for Max/Maya 2013, fixed missing winsock lib.
2.9.7.0 release 2012/07/06
- Fixed a bug in the way mod stack custom parameters were extracted
from Max.
- Added a flag in the camera settings to override the auto-detected
"Up" vector for the Animation Studio.
- Corrected a problem in the XSI exporter relating to granny_material map
linkage.
- Fixed a problem with GrannyInlineMember data types with non-1 array
lengths.
- Remove an STL dependency from GState.
- Simplified the granny_skeleton_builder by taking the name in the GrannyAddBone
API.
- Fixed a problem in the "BonesPerMesh" command for mesh vertex
formats without weights.
- Added the x64 version of gstate to the distribution.
- Switch to ARM7 for Android build.
- Fixed node replacement editing position.
- Corrected a bad default in the non-ranged case for n-way blends.
- Fixed a link problem in an undisclosed platform.
- (minor) Node move undo collapsing restored.
2.9.6.0 release 2012/05/17
- Added XInput controller support to the studio. This lets you setup
one or more controller mappings to control parameters, request
state changes, etc.
- Added range queries to the scalar sampling API. This moved the
GetMinMax function on the parameters node to the new node level
function, change calls to GetMinMax to GetScalarOutputRange.
- Fixed an alignment problem on x64 builds in GState.
- Parameters can clamp their slider to integer values.
- Selection node queries the input range to determine switchover points.
- Event source nodes now have external buttons to trigger events, analogous
to the sliders on the parameter nodes.
- Event tracks on animation sources may now be set to
<Anim. events> which will send text events for important
animation markers. Right now, it supports only the "looped" event,
which triggers whenever the animation hits the end of its timeline.
- Fixed timeshift wobble when changing the input scale.
- Fixed a bug in the edit box event routing that broke the search
function.
- Corrected draw order for node edit dialogs
- Transitions now have a color according to their type. (These are
in ui_preferences.lua for people who object to the color scheme.)
- Fixed a crash when deleting a parameter node referred to by a
conditional.
- event_source nodes were not selectable as inputs for event
triggered conditionals at the same state_machien level.
- Fixed a problem with conditional activation timing.
- Standardized the Studio on Verdana/Consolas/Trebuchet for all
fonts for consistency and readability. This gets rid of some
font abiguities that were pointed out with the "1ilI" set of
characters.
- Recent file buttons will disable properly when no recent files exist.
- Prevent invisible non-print characters from appearing in node names
and parameter descriptions, where they confuse the art/code dialog.
- Pushing or popping an undo position marks the file as modified, which
prevents a fairly common class of "I forgot this bit" bugs when
modifying the graph.
- Fixed a small bug in the argument-parsing of the Tree Walker
tutorial.
- Added "Use neighborhooded" option to Blend node for increased
fidelity in odd cases.
- Added RequestChangeTo to the state_machine interface for direct
node references.
- (minor) When GetProductForToken is called with NULL, return NULL
product. This simplifies control flow in spots where a node
reference is optional.
- Added GrannyLinearBlendTransformNeighborhooded,
GrannyLinearBlendNeighborhood, to allow correct rest-pose based
orientation alignment.
- Corrected a bad assert in the TimeShift node.
- New [REDACTED] and [OMITTED] for [CENSORED]
2.9.5.0 release 2012/04/30
Point release to address a 64-bit Max export error, and a reported
access violation in the Animation Studio.
- Added support for Softimage 2013.
- Fixed a crash when replacing conditionals that are referred to
by certain embedded transitions.
- Fixed a bug in the 64-bit version of the Physique extraction code.
- Fixed name propagation when switching transition and conditional
types.
- Fixed N3DS enum size
- Added wchar_t to the list of basic types for auto-doc.
- Removed a patch no longer necessary for 3ds Max normal material.
- Exposed GrannyEnsureCameraSeesPoint
- Added OS X Version of Maya 2013 plugin.
- [REDACTED]
2.9.4.0 release 2012/04/19
- Added support for Max 2013 and Maya 2013.
- Fixed a crash in the studio on exit after adding an animation file
with no animations that are valid for the character.
- You can now drag a node creation icon on top of an existing state,
and it will be replaced with the new type. This transfers all of
the transitions to assist in quickly iterating to more complicated
versions of your character.
- Added comments for the node display window.
- Added undo collapsing to allow grouping complex actions like user
macros.
- Can undo across model changes now. We'll see how that works out.
- Fixed state interaction indicators showing up on event sources
and parameter nodes.
- Fixed a clock problem on character load in the studio.
- Nodes that act as simple passthoughs in a blend graph will draw
their internal connections for clarity.
- (minor) Corrected a registry problem in the Max 2013 installation
directory check.
- Max 2103 eliminated one of the "tell-tale files" we used to
determine if it was the 64-bit version. Replaced this with a more
dependable scan of the PE header of the executable.
- (minor) Nodes were drawing in front-to-back order, rather than
correct back-to-front order.
- (minor) Timeselect supports extra sampling edges.
- (minor) GrannyChangeSettings was returning false on successful
dialog exit.
2.9.3.0 release 2012/04/05
Point release to fix a problem with complex graphs.
- New node: "Pose Storage", which can store and reproduce either the
rest pose of the character, or an output of another node.
- Quick release to correct a stack overflow for graphs with
complicated connectivity.
- Experimental OS X Maya 2012 plugin added. This is a "script-only"
exporter for the moment, the options dialog has yet to be ported.
You can find the plugin bundle in the "bin" directory of the OS X
distribution.
- Added a check to the startup of the Studio to ensure that the saved
position isn't fully off-screen in the case of a monitor
reconfiguration.
2.9.2.0 release 2012/03/30
When using the Animation Studio, you'll notice a large change in the
way you access node properties. The new pop-up properties give you
much more space in the preview pane; making it much easier to spot
animation errors. Check the Studio Quickstart document in your "doc"
folder for information on how to work in the new system. Note that
the slightly clunky black boxes on the states indicate interactive
regions. Hang with us for a release, and those will be much prettier.
- Altered the way the different node controls are triggered. Most
edit and state changes are now right-click triggered, which frees
up the left-click to handle moves and node descents across the
entire node box. This prevents some confusion that was occurring
with the editable name, parameter edit dialog, transition drags,
etc.
- New node: "Event Source", which allows text events to be "poked" into
the character's state machine from code as well as animation. Note that
like the "Parameters" node, this is a valid entry for state machines,
which allows event parameters to trigger conditionals without sourcing
them from animation or blend graph sources.
- Corrected a bug that caused parameters to not be fully pushed to
state machines contained in other state machines.
- Fixed a bug in the morph target delta computations for skinned
meshes.
- Added Activate and DidLoopOccur functions missing from several node
classes.
- Corrected a bug in GrannyIKUpdate with far away targets. Improved CCD
iteration refinement at the same time.
- Corrected a bug with sparse bone array sampling.
- New node: Time Select, allows you to specifiy the position of an
animation input in absolute terms.
- Updated to the 2.0 release of the CAFE sdk.
- Parameter nodes now have a slider attached for direct manipulation
of each output.
- Fixed a crash when removing a parameter node tied to a state
machine conditional.
- Fixed a crash in the Max exporter when a texture is missing from
the disk.
- Escape dismisses time-scrubbing interface.
- Fixed scrolling parameter dialogs.
- Prevent changing the transition type from dismissing the edit
dialog.
- Fixed a bug that caused multiple animation set slot edits to be
lost.
- Added UserStartupCallback for automated macro running.
- Move to front operation could mark a parameter node as the start
state.
- Incorporated fix for GrannyBuildSkeletonRelativeTransform.
- (minor) Corrected a floating point rounding error in a common
assert in granny_curve.cpp
- Distribution the OS X build file for gstate.
- Added strict connection error checking to the graph for validating
Studio node edits.
- Added script interface for manipulating node outputs and inputs.
- Added script interface for setting Parameter node outputs and Event
Source text keys.
- Added rendering visualization of the track mask when a mask source
or other mask calculation node is selected.
- (minor) Incorrect assert when fetching vertex data in the exporter
morph processing pathways.
- (minor) Internal output/input retrieval to match external
retrieval.
- (minor) Non-recursive bone set in the mask_edit lua interface.
- (minor) Corrected range check in the granny_mesh_builder interface.
- (minor) Extra assertions for data integrity in granny_mesh_builder.
- (minor) Corrected includes for [removed] build.
2.9.1.0 release 2012/01/12
- New Animation Studio node: Event Mixer. Takes multiple event
streams, and merges them into a single output.
- New Doc: "Studio Quickstart", which is intended to introduce
artists to the Animation Studio interface. It can be found in the
"Doc" directory of your Granny distribution as
"studio_quickstart.html".
- New preprocessor command: "WarnCRCMismatch" which will detect
animation files that have changed in a possibly incompatible way
in state machine files.
- Buildable Visual Studio project for the Studio.
- GState project for OS X
- Corrected a memory leak in the Animation Studio.
- Multi-selection in the "Set Model..." dialog allows the mesh and
model to be stored in separate files for the Animation Studio.
- Fixed a bug in the mask source UI that caused changes to be
discarded.
- New preprocessor command: "BindMeshes". Takes all of the granny_mesh
objects in a granny_file_info, and attempts to bind them correctly to
one of the granny_models in the file. Useful for fixing up combined
files where the MeshBindings array needs to be recreated.
- Fixed a string lifetime problem that generated invalid TrackKeys
for granny_vector_track objects in Max.
- Corrected a crash in the scalar compare editing in the Studio.
- Added Makefiles for linux to the tutorials, preprocessor, gstate.
- Fixed an stb_image problem with zero length files that could crash
the viewer. (First bug fixed by the new in-the-wild crash
reporting!)
- (AnimStudio) Fixed font size computation to account for changes to
the reported screen DPI.
- (AnimStudio) Implement the viewer's heursistic for meshes that
aren't explicitly referred to by the model's MeshBindings array.
- (AnimStudio) Corrected an error in the undo hander that caused the
current active state to be reset unnecessarily.
- Delay starting up the crash handler until after OpenGL is
successfully initialized in the viewer. This will allow nVidia and
Intel to receive those crash dumps.
- (GState) Missing source references could crash
GStateBindFileReferences.
- Fixed a bug in the linux version of GrannyGetSecondsElapsed.
- (doc) Invalid parameters in GState "Getting Started" fixed.
2.9.0.0 prerelease 2011/11/07
Major release this time, as you can see by the shiny new zeros at the
end of our version number! It's been the tradition around here to
take a few paragraphs to discuss what happened over the course of the
2.8.* release series when the version number bumps, but we have a lot
of ground to cover in new features here, and 2.8 lasted over 3 years!
The big news for 2.9 is that the Granny Animation Studio has finally
reached 1.0! If you're not playing around with it yet, you should be.
In the coming weeks, we'll still be streaming features into the tool
and the runtime, stay tuned! Please also check out the new GState
documentation, which you will find in the "doc" directory of your
distribution alongside granny2.chm. You might notice some differences
between granny2.chm and gstate.chm, let us know what you think! All
of Granny's documents will be moving to this style soon, so I'd love
feedback from you on ways to make it more useful.
Also note that there are a lot a compatibility notes in this release.
Most of these should not affect normal customer code significantly,
but if you're digging deep into the inner workings of Granny, I may
have clipped you once or twice. The one search-and-replace that you
are likely to have to do is the rename of the granny_dag_pose_cache to
just granny_pose_cache, along with it's associated APIs.
While I believe this build is stable, it is the first in the 2.9
version series, and so out of an excess of caution, I'm marking it as
"pre-release" to emphasize that if you have a deadline approaching, we
do not recommend that you take up this version without thinking long
and hard about it, and talking to us. Don't be a hero!
- New blog post: Make Like Voltron!
- Granny now supports Android through the NDK!
- Compatibility Note: MacOS X builds now built with XCode 4.2,
and distributed as static, rather than shared libraries by default.
- Compatibility Note: (AnimStudio Runtime) RandomAnim and
Sequence nodes have been removed. They will be replaced with
Randomize and Sequencer, which will accept animation/event edge
inputs, rather than internally generating those outputs. This was
done to make it possible to more tightly control event changes
during blends, as well as regularize the class of nodes that are
valid as states and kill some code duplication. Sorry for any
inconvenience on this one! Deleting node types will be a
very rare occurrance in the future.
- Compatibility Note: The release version of the Animation
Studio will not load files created by the beta version. Sorry
about that. The new animation set interface required that
underlying source references get a new level of indirection. Write
to us at granny3@rad if this puts you in a tough spot. The good
news is that GSF files now carry same the full backwards
compatibility guarantee that GR2 files do.
- Compatibility Note: (AnimStudio UI/Runtime) Top level state
machine switching has been removed. This feature has been killed
for reasons of incoherence. The correct way to support this is to
make state_machine nodes at the top level, which contain broad
character behaviors. This allows transitions between the top-level
states to be managed in the tool, rather than with the
GStateActivateStateMachine API. Apologies for any inconvenience!
- Compatibility Note: The tutorial projects now are Visual
Studio 2008 projects. At the same time, they have been converted
to statically link against Granny, to remove the need to copy
around granny2.dll.
- Compatibility Note: Preprocessor also distributed with 2008
projects and statically links.
- Compatibility Note: The exporter now defaults to "Variable
Delta Accumulation" for root motion extraction. Existing files
will keep their root motion setting, of course, but newly created
files will default to the (almost always) correct motion extraction
setting.
- Compatibility Note: granny_text_tracks created from Max Note
Tracks have been slightly altered. The first track is named after
the granny_bone, as before, subsequent note tracks will be named with a
":Notes_1", ":Notes_2" postfix.
- Compatibility Note: granny_dag_pose_cache renamed to
granny_pose_cache. To make the API more finger friendly, the associated
APIs are also shorted by removing "Dag" and "BlendDag" from the
middle. I.e, GrannyGetNewBlendDagLocalPose is now simply
GrannyGetNewLocalPose. Note that the creation method is now
GrannyNewPoseCache for conformance to Granny API standards.
- Compatibility Note: There is no longer a global granny_pose_cache.
This was always a threading menace.
- Compatibility Note: Removed the GrannySampleBSpline*x*
functions from the public API. These may still be accessed from
the source interface. Note that GrannySampleBSpline is still public,
of course.
- Compatibility Note: (AnimationStudio Runtime) The
GStateInstantiateCharacter functions now take an argument that
selects the active animation set.
- Compatibility Note: (AnimStudio Runtime) Major change to the
sampling and updating API. GStateSampleAnimation and friends no
longer accept a CurrentTime parameter. This is now stored in the
instance itself, and you step time forward with GStateAdvanceTime.
This allows us to propagate updates through the current machine
only once, as well as preventing confusion over whether CurrentTime
is allowed to run backwards.
- Compatibility Note: The Stat HUD interface has been replaced
with Telemetry-based capture. Made a note in the Notes on CPU and Memory Performance Optimization
section to that effect, please also see: Telemetry Support.
- Compatibility Note: Because all of the distributed tools
(viewer, animation studio, etc.) are now linked statically to the
Granny library, the copy of the Granny DLLs have been removed.
These have been bouncing around in the last few releases, but they
should now be settled in their final locations of lib/[platform].
- Compatibility Note: I've removed the older Blend DAG APIs
from the Granny public interface. These are still fully supported
for clients that are using them, and we still include them in the
distributions, of course, but they are in a slightly different
place. Find them in the "legacy" section of the source
distribution. You'll need to building from source to use them.
This is phase one of a larger API sweep that will be occuring in
the not-too-distant future.
- Compatibility Note: Changed GrannyFindVectorTrackByName to
GrannyFindVectorTrack to emphasize that you need to pass in a correct
TrackKey as well now. Removed GrannyFindVectorTrackByRule for now.
- Compatibility Note: (AnimStudio Runtime)
GStateInstantiateCharacter now takes a CurrentTime parameter, just
like GrannyPlayControlledAnimation. This allows the character to
correctly initialize its nodes to the current global clock.
- Compatibility Note: (AnimStudio Runtime) All of the
gstate::node functions rearranged to take the "OutputIndex" and "AtT"
parameters in a consistent order.
- Compatibility Note: GrannyConvertTree, GrannyGetConvertedTreeSize, and
GrannyConvertTreeInPlace all take a callback (granny_variant_replace_fn) that
allows variants with known types to be replaced on conversion.
This is useful for GState, but these are very infrequently used
functions for normal code. If you are one of the few people
calling this function, just pass NULL for the old behavior.
- Compatibility Note: iOS build is now built with XCode 4.2
for iOS 5.0.
- Compatibility Note: GrannyReadEntireFileFromMemory takes a "const
void*", as it should.
- Improved crash reporting. The exporter, viewer, and Animation
Studio now allow you to send crash reports to RAD with a single
click.
- iPhone distribution now contains only the fat binary of the
library, which reduces the distribution size. Kind of pointless to
have both, right?
- (AnimStudio Runtime) Fixed an activation timing error in the new
transition sync pathways.
- (AnimStudio Runtime) Corrected an error in upgraded state_machine nodes.
- (AnimStudio UI/Runtime) Push state machine published parameters
down to sub-statemachines correctly. Similarly for parameter
nodes.
- (AnimStudio UI) You can drag GSF files onto the studio to open them.
- (AnimStudio UI) Added several obvious shortcut keys, "Ctrl-O" for
open file, "Ctrl-N" for new file. One non-obvious one is "Ctrl-A"
to open the animation set editor.
- (AnimStudio UI) The Studio now tries to handle cases in which the
animations change underneath the references stored in the GSF. For
instance, if you refer to an animation "Foo" in foo.gr2, if the
Studio later finds that foo.gr2 contains an animation "Bar", it
will refuse to load the file, and let you fix the problem in the
animation set manager.
- (AnimStudio UI) Reorganized and hid the operations only used to
load or setup a character graph. File loading, character
specification, and animation set management are now on a slide-out
tab in the preview pane where they take up less room. Previously,
they stole vertical pixels from the editing region.
- (AnimStudio UI) For working with very large graphs, it is possible
now to zoom the node edit window in and out. This is bound to the
scroll wheel, as you'd expect.
- (AnimStudio UI) Cleanup of the layout code, prepping to make it
possible for end-users to create node guis.
- (AnimStudio UI) The Studio now monitors the animation files on
disk, and will reload them if they change. This allows you to
iterate on the underlying animation without interrupting your work
on the character.
- (AnimStudio UI) Made the shortcut keys self-documenting, available
hotkeys may be examined in the editor by hitting the "?" key, which
will pop a dialog explaining exactly which keys are valid at that
point
- (AnimStudio Runtime) Use the library version of the token type in
the node creation function, which prevents GSTATE_SLOW_TYPE_CHECK
from crashing when the type section is freed with GrannyFreeFileSection.
- (AnimStudio Runtime) Vast reductions in the amount of boilerplate
required for custom node generation. Many disjoint initialization
pathways have been unified for better robustness.
- (AnimStudio Runtime) Fixed a critical bug in the versioning schema
for gstate_character_info.
- Allocations are reported to Telemetry, even when there is a
user-defined granny_allocate_callback installed.
- Added a self-documentation facility to the preprocessor.
"preprocessor Help " will now print some help text
for the built-in commands." The facility can be used to document
custom commands as well.
- (AnimStudio UI) Forward and back buttons on the mouse back you up
and move you forward in the hierarchy.
- (AnimStudio UI) Fixed a scrolling bug in the scroll area control
- (AnimStudio UI) Huge rewriting of the way that animation sources
are specified in the Animation Studio. See the documentation for
more details, but in brief: animations now come in "sets" and
"slots". Animation sources refer to "slots", which are a named
placeholder for an actual animation in a set. This allows you to
specify and test character variations in the editor. It also
cleans up the interface (Set management is a separate page of the
tool now), and you can remove sources, which has been a missing
feature for some time.
- New preprocessor command "GenerateMipmaps". Does what it says on
the box.
- (AnimStudio Runtime) Proper event sampling API on gstate::node.
- (AnimStudio Runtime) Conditionals on the state_machine.
- (AnimStudio Runtime) Conditionals controlling transitions.
- (AnimStudio UI) Make the tool respect the granny_model InitialPlacement
field.
- (AnimStudio UI) Clamp the ground plane to the "feet" of the initial
placement. Assumes that a character starts with feet on the ground
plane in its base pose.
- (AnimStudio UI) Better handling of the recent file list. Also lets
you see the full path of those files by printing it as a fading
string.
- (AnimStudio UI) You will notice that the UI has become much more
spartan in its default configuration. The Animation Studio now
tries to maximize the space you have for editing the graph and
previewing the character by hiding the character and machine
controls in sliding tabs in the preview pane.
- (AnimStudio UI) Deleting the current animation set is now possible.
- (AnimStudio UI) Shift-"+" in the animation set manager will copy
the current animation set for easy variants that are substantially
the same as the current set.
- (AnimationStudio Runtime) Added
GStateBindCharacterFileReferencesForSetIndex, which is a really
long-winded way of saying: "Please load only the resources for a
specific animation set." The previous function,
GStateBindCharacterFileReferences, is still present, and will load
all of the animation sets at once. The ForSetIndex variant is
intended to support scenarios in which only a limited number of
variants are present at any given moment at runtime.
- Fixed a bug in the exporter relating to the "Always used skinned
mesh" option. There was an edge case that could cause a hang in
the tool.
- Fixed a bug in the Max exporter in which global:"Track Group"
SetValue commands wouldn't respect the value locks.
- (AnimStudio UI) Removed confusing (and slightly dangerous)
"Reset..." button in the center of the interface. This is replaced
with a "New..." entry in the Load button drop down.
- (AnimStudio UI) Setting a state with the right mouse button now
doesn't alter the selection. This allows tracking conditionals on
the larger state machine. If this causes confusion, it will be
reverted.
- (AnimStudio Runtime) Fixed a bug in the Mirror node axis changing
and motion extraction.
- (AnimStudio Runtime) Corrected a missed call in
node::CaptureSiblingData that prevented locked blends from working
with certain graph topologies.
- (AnimStudio UI) Copy/Cut/Paste now work in edit fields.
- Fixed a bug with non-power-of-2 textures on certain graphics cards,
including Remote Desktop software OpenGL sessions.
- New artist track document: Creating Text/Event Tracks in the Exporter
- Fixed a nasty bug in GrannyGetTrackSamplerIIU that left Position and
Orientation fields uninitialized with a non-trivial scale/shear
track.
- Older blog posts brought in: Pushing Files Around and Memory.
- Added the ability to generate granny_text_tracks for events from Maya.
Since Maya still lacks something akin to Max's Note Track, we're
using enum attributes. Each keyframe is emitted as a text event
for the granny_bone to which the attribute is attached.
- GStateInstantiateCharacter will now correctly size the internal
pointer hashes to prevent excess memory wastage at runtime.
- Added "-atomicWrite" to the Maya Exporter, and GrannyExportAtomic
to the Max exporter. This allows exporting directly from Max or
Maya to a named pipe. The normal Granny file IO operations contain
seeks, which confuse pipe-based IO.
- Fixed a bug in the root motion handling of the Additive Blend node.
- (AnimStudio UI) Corrected a bug that would flash an old value in
edit fields and editable comboboxes for one frame after changing
the value by keyboard.
- (AnimStudio UI) You can now disconnect a blend graph connection
with a right-mouse click on the input.
- New preprocessor command "Version" to dump information about the
library version and compile parameters of the tool.
- (AnimStudio Runtime) Added project for the N3DS.
- (AnimStudio Runtime) Added the ability to override the random
generator for GState.
- (AnimStudio UI) Improve the key handling, punctutation keys, etc.,
will now properly register in edit fields.
- (AnimStudio UI) Removed the "Delete transition" button in the edit
window. Use the backspace or delete key in the edit window with
the transition selected.
- (AnimStudio UI) By holding the control key when beginning a drag,
you can now create transitions from all currently selected nodes.
- (AnimStudio Runtime) Fixed an error in the selection delete when
multiple object types were present in the selection.
- (AnimStudio Runtime) Corrected a registry usage error.
- (AnimStudio UI) Added a debug console.
- (AnimStudio UI) Animation selection widget now functions a bit like
an iTunes search box, with progressive string matching if you click
in the edit box portion of the control. The combobox drop-down works
as before.
- New undocumented API: GrannySetOSSpecificFileParameters. This will be
documented once we can talk about the platform it is intended to
support.
- (AnimStudio UI) Added controls to the viewport to turn on and off
camera tracking, as well as reset the position of the character.
- (AnimStudio UI) When editing a sub-node like a blend_graph or
state_machine, the root motion displayed on the character would
always be the top-level graphs motion. Fixed.
- (AnimStudio UI) Character motion extraction in the tool will now
respect turns. Seemed like a good idea.
- (AnimStudio UI) Optimizations for some of the underlying draw
primitives to make higher node-count graphs perform more smoothly.
- "TouchVersion" command now works on both GR2 and GSF files.
- (AnimStudio UI) Fixed a bug in the character pane that manifested when
it was moved away from the top left corner.
- (AnimStudio UI) Made the coordinate grid a little easier to
visually read.
- (AnimStudio UI) Fixed a deadlock in the save/load prompting
- (AnimStudio UI) Turn off tooltips when they would get in the way of an
interaction in progress.
- (AnimStudio Runtime) Moved the type info to the
GrannyStandardDiscardableSection so it can be easily dismissed after you
have loaded the file.
- (AnimStudio Runtime) Corrected many edge cases in the root motion
extraction logic for Pose sources, sequence nodes, and random
animations.
- (AnimStudio Runtime) Fixed an array overrun the Sequence node.
- (AnimStudio Runtime) Bad default speed parameter in the Random Anim
node.
- Distribute the x64 dlls with console platforms for tool development.
- Handle GrannyEmptyReferenceMember in Traversing Granny's Object Metadata: tree_walker.
- Make it possible to create a granny_pointer_hash with a specific initial
allocation.
- Added support for Linux with x64 architecture.
- 3DS Target switched to ARMCC from RVCT.
- Update stb_image across all of the Granny tools.
- Header re-org! Lots of compile optimization and deleted #include
directives. Source users should note that granny_namespace.h is
gone now, please be careful when checking in the latest SDK.
- (internal) Corrected an allocation that was only necessary when a
granny_file_writer_string_callback was registered. To first order, this is
*never*, so writing files can be much faster now.
- (internal) Fix several variable shadowing warnings in contain.inl
- Corrected a spurious assert in the preprocessor.
- "TransformFile" preprocessor command will now alter, rather than
remove the ArtToolInfo in the changed file.
- New functions to change the granny_track_mask of a playing granny_control.
GrannySetControlModelMask, GrannySetControlTrackMask, and for the PS3,
GrannySetSPUControlTrackMask. Altered Using Track Masks: track_mask to reflect the
new API.
- Corrected a problem in the auto-generated header that could cause
mismatched calling conventions for GRANNY_CALLBACK functions.
- Added more interesting memory dump features to the Animation Studio
for debugging.
- Stabilized the ear vector in GrannyIKAimAt a bit better.
- Fix a placement bug with the recent model list.
- New function GrannyFindTextTrackByName to match GrannyFindVectorTrackByName
and GrannyFindTrackByName.
- (minor) Removed spurious assert in the exporter.
- (minor) Switch preprocessor from including the stb_image library to
.c from from .h. This allows drop in replacement from the
canonical location at
nothings.org/stb_image.c.
- (minor) Prevent granny_text_track objects with no entries from leaving
the exporter.
- The "PlatformConvert" preprocessor command will now work on generic
Granny files, rather than just GR2s. (This does mean that it will
not create a history entry in the ExtendedData of the granny_file_info.)
- Fixed a bug in the N3DS platform granny_file_reader. A non-null object
would be returned even on failure to open.
- New utility "CreateFileDB" in the preprocessor, which will create a
combined file containing a large number of GR2 and GSF files. This
makes for much faster loading at runtime, particularly on platforms
with a high-latency file system. This comes with a small
header/source pair "granny_file_database.h" that specifies a
simple, semi-official structure for these files. GState is also
linked into the preprocessor now.
- Handle out of memory conditions in GrannyConvertTree and
GrannyGetConvertedTreeSize.
- "GrannyHelp" with no arguments will list the available exporter
script commands in Maya and Max.
- Fixed a bug in the Oodle decompressor that manifests on memory
exhaustion.
- Fixed a memory exhaustion bug and a leak in LoadFileSection
relating to the temporary decompression buffer.
- (internal) Correctly clean up in CreateModelControlBinding on
allocation failure in the binding initialize call.
- Better handling for out of memory conditions in granny_pointer_hash.
(Are we detecting a theme here at the bottom?)
- GrannyEndAllocationCheck is documented to return false for memory leaks,
but was returning "true" unless there was an error in the allocation
guard itself. Fixed.
- PC distribution now has a static library for Win64 as well as Win32.
- (AnimStudio UI) Vastly improved the speed of the undo operation for
large files.
- (AnimStudio UI) Split handles for the UI regions weren't respecting their
minimum dimension argument.
- (AnimStudio Runtime) (internal) ConnectedInput was returning "true"
for a successful query against a disconnected input, which was
confusing. It now returns "true" when it is able to discover a
non-NULL node on the other side, and false when no such node is
present.
- (AnimStudio Runtime) Mirror node handles root motion extraction when
disconnected from an input.
- Seriously outdated information in Granny Data Loading Overview: Vector Tracks fixed.
- (internal) Internal log function builds the message buffer on the
stack, rather than at file scope to improve thread safety.
- (internal) Removed the memory guard page exhaustion assert, which wasn't
actually an assertion.
- (internal) Detect failure in container initialization.
- (internal) Corrected several invalid CheckPointerNotNULL statements.
- (internal) GStateDeallocate nulls for a bit more safety.
- (internal) Android threads up-to-date with the radrtl yield API.
- (internal) Force some template instantiation for compilers that
need it.
- (internal) Correct spurious errors in the documentation build tool.
- (internal) 2 SSE helper functions should have been marked with
__declspec(naked) rather than FORCEINLINE.
2.8.52.0 release 2011/08/05
Quick turnaround to make the LOD sampling available in the runtime, as
well as correct two high priority problems, the blend culling and the
loop in the loading code.
Note that a change has been made to the distribution for the source
SDK. Instead of being a full copy of the binary SDK plus the source,
the sdksrc*.zip files will now contain only the source. Just download
the binary sdk and combine for the same fileset as before.
- Compatibility Note: GrannyEndLocalPoseAccumulationLOD now takes a
valid bone range for LOD samples with less than a full set of valid
bones. This is in the undocumented portion of the API, so it's not
likely to cause compile problems.
- Corrected an infinite loop in CaptureNodeSiblingData.
- (AnimStudio Runtime) Fix a bug in the blending nodes that was
preventing inactive sides from being culled.
- (AnimStudio Runtime) LOD Sampling now supported.
- (AnimStudio) New node type: LOD Protect, which is a passthrough
node that prevents LOD parameters from affecting the sample
downstream.
- Routed log functions through Telemetry as well as user callback.
- New function: GrannyTelemetryFrameStats. I'm not saying what this is
for, but I bet you can guess.
2.8.51.0 release 2011/08/02
Lots and lots of changes to the Animation Studio and its runtime in
this version! I've sorted the changes below into two categories, UI
changes and runtime changes. Please do read the UI changes at least if
you work with the tool at all, many interactions have been changed
(for the better!) in this version. Note that there are many things
that I've discussed with beta clients that didn't make it into this
release. They are coming, promise! It's simply that too many
fixes have been made to hold this release back any longer. The next
one will be coming on a much faster schedule.
Also note that there are a gaggle of new node types available:
Selection, RandomAnimation, AimAt IK, and 2Bone IK. (Interfaces for
these are not yet complete in this release, see above.)
In platform news, the Linux and Mac OS X targets have received some
needed build attention. Both targets have new Makefiles for easily
building from source.
The OS X target now allows you to build both x86 and x64 static
libraries. As noted below, this did require reorganizing the source a
bit, so please be careful checking it into your source control
system. The default distribution now contains a shared library for x64
in lib/macosx64.
- Compatibility Note: (AnimStudio) Sorry for this one. Names
and public structures for GState have been brought into line with
the existing Granny convention. I.e, all public functions have a
GState* prefix, and structures have a gstate_* prefix. Functions
intended for advanced use are still in the gstate:: namespace with
no prefix. Should be a one time search and replace hit.
- Compatibility Note: (AnimStudio) Several files have been
renamed to make predicting header files from class names easy.
Please be careful when checking this build into your source control
database. For instance "gstate_statemachine.h" has been moved to
"gstate_state_machine.h".
- Compatibility Note: Removed GetActiveStateMachineName
API. This can be recovered with GetActiveStateMachine and the
GetName() member function on the state_machine.
- Compatibility Note: (AnimStudio Runtime) Removed dependence
on RTTI. Note that the default project now ships with RTTI turned
off. This can cause CRT asserts if linked to an application with
RTTI turned on. You can turn it on in GState, it will be safely
ignored.
- Fixed a bug in the S3TC compressor on x64 that caused .BMP files
loaded through Maya to crash the plugin.
- Compatibility Note: Reorganized the Mac OS X source to allow
building box 32- and 64-bit targets. There is a Makefile in the
source directory that will now build static versions of the Granny
library for both architectures.
- (AnimStudio Runtime) Added project for the PS3.
- (AnimStudio Runtime) Added project for the Xenon.
- (AnimStudio UI) You can now drag an icon from the creation toolbar
to the editing area to create it in a specific location.
- (AnimStudio UI) To descend into a BlendGraph or StateMachine, you
now double-click on it, rather than trying to hit the tiny little
"d" indicator.
- (AnimStudio UI) Right click on a transition to trigger it.
- (AnimStudio UI) Backspace and Delete will now delete the currently
selected nodes.
- (AnimStudio UI) Recent file list for the scene load and model.
- (AnimStudio UI) Window stores position and min/max state.
- (AnimStudio UI) Fixed control/shift clicking for select.
- (AnimStudio UI) Alt-left mouse or middle mouse will drag the
editing window around, as you'd expect
- (AnimStudio UI) Added tool tips for the buttons in the main
interface
- (AnimStudio UI) Ctrl-S shortcut for saving files
- (AnimStudio UI) Spacebar will act as a pause in the character
window.
- (AnimStudio UI) Scrub the timeline with the left and right arrow,
and toggle playback with space.
- (AnimStudio UI) Visually indicate that scrubbing disables the
interface.
- (AnimStudio UI) Fix a mouse-over bug in the node creation toolbar
when scrubbing is enabled.
- (AnimStudio UI) F2 to rename a node.
- (AnimStudio UI) Colored labels for tying into render controls
- (AnimStudio Runtime) Added FindChildIdxByName
- (AnimStudio Runtime) New search interface on the container type:
FindChildRecursively. This allows searching for nodes with fully
specified paths, or simple wildcarding. For instance:
"Container|Name", will find the node "Name" in the top-level
container "Container". "*|Name" will find the first node that
matches "Name" in any top-level container.
- Telemeterized the Animation Studio for performance analysis.
- (AnimStudio Runtime) Fixed a crash in the loader relating to
nodes connecting to blend_graphs without internal connections.
- (AnimStudio Runtime) Multithreaded the UI to put input handling in
the page flip gap.
- (AnimStudio Runtime) Set clipping planes for the tool based on
character scale, which prevents premature clipping for characters
expressed in cm/in/mm.
- (AnimStudio Runtime) Enabled exporter-style crash reporting.
- (AnimStudio Runtime) New node type: Random Animation. This
references several animations, and randomly selects one when the
node is activated. By default, "random" means "cycle through in
order". You can install an application appropriate cycling function
using the static node interface.
- (AnimStudio Runtime) Fixed a null-termination error in the
script-loader.
- (AnimStudio Runtime) ForceStartTransition as an analogy to
ForceChangeToState.
- (AnimStudio Runtime) Selection node.
- (AnimStudio Runtime) Fix a oneshot animation bug that incorrectly
interpreted the Speed paramater on anim_source nodes.
- (AnimStudio Runtime) Fix a memory leak when changing transition
types in the tool.
- (AnimStudio Runtime) Fixed a bug in the anim_source node that
caused it to not report a proper duration unless it was currently
bound to a character.
- (AnimStudio Runtime) Provide gstate.h by analogy to granny.h. This
will bring in only the needed headers for the public interface.
- (AnimStudio Runtime) Added a proper logging API for GState. This
will forward logging to the current Granny granny_log_callback. Disable
by defining GSTATE_LOGGING_DISABLED=1 in the GState project.
- (AnimStudio Runtime) Removed dependence on STL containers. (Detecting a
pattern here...)
- (AnimStudio Runtime) Removed dependence on exception handling.
- (AnimStudio Runtime) Fixed a problem with the file open dialog
parmeters that was randomly switching between W7 and Vista open
dialogs.
- (AnimStudio Runtime) Fixed a bug which caused parameter defaults
not to be updated when editing a file loaded from disk rather than
newly created.
- (AnimStudio Runtime) Added AimAt IK node.
- (AnimStudio Runtime) real32 arrays in snapshots
- (AnimStudio Runtime) Switch to strcpy_s/strcat_s for safety, and to
silence compiler.
- (AnimStudio Runtime) GStateGetCharacterInfo for loading
gstate_character_info from an already loaded granny_file
- (AnimStudio Runtime) Corrected double-free on undo.
- (AnimStudio Runtime) Fix up leaking source file references on
closing a scene in the tool.
- (AnimStudio Runtime) (minor) New interaction registration idiom
that is a little less error-prone.
- (AnimStudio Runtime) (minor) Fixed a bug in the ground plane drawing
- Fixed a settings error that appeared on certain graphics cards with
the viewer. (Current texture not preserved by Push/PopAttrib.)
This could cause non-diffuse textured normal mapped meshes to
appear corrupted when entering and exiting "Show Normal Maps" mode.
- Fixed a bug in the Mac OSX viewer that routed file open calls to
the wrong OSX system call.
- Fixed a problem that arises when running multiple preprocessor or
exporter instances together.
- Fixed a problem in the MacOS X build where newer versions of GCC
will move variables only referred to in asm-blocks into read-only
memory. This was crashing the SSEIsAvailable function.
- Corrected warnings in strict mode for VC 2010.
- Fixed a preprocessor problem in the bone bounding recomputation for
meshes with a single bone weight.
- Passing back garbage memory in "CombineRigidMeshes" preprocessor
command.
- Corrected some confusing text in Granny File Processing Overview and reordered and
rephrased Animation Level Of Detail for clarity.
- In the WinXX build, refer to functions like MessageBox explicitly
with MessageBoxA. This allows Granny to be correctly compiled in
projects that set /DUNICODE.
- New Makefile for the linux distribution. Note that this is now
simply called "Makefile" rather than "Makefile.linux"
- Corrected variable size problems in shared threading code.
- File open dialog fix for multithreaded Anim Studio.
- Simplified the Xenon detection macros in granny.h
- Original Xbox removed as a supported target.
2.8.50.0 release 2011/06/20
Support now in place for all three of the newest Autodesk tools, 3DS Max,
Maya, and XSI 2012.
A note on the GState beta: Thanks to everyone that has sent in
feedback, bug reports, and suggestions. It has been super helpful,
and we really appreciate it. The next release should be the 1.0
release of the tool and the runtime, at which point there will be
multiplatform support, and some cool new features in the tool. Stay
tuned!
- Compatibility Note: By default, the exporter will now write
32-bit little-endian files. 64-bit shipping platforms are still
very rare, it makes little sense to output 64-bit files from Max or
Maya unless explicitly requested.
- Compatibility Note: granny_allocate_callback now has an "Intent"
parameter that tells you a little bit more about what Granny
intends to do with the memory. This will be one of the values from
granny_allocation_intent.
- Compatibility Note: GrannyWrite macro renamed to GrannyWriteBytes
to prevent collisions with other headers. (Windows headers in
particular.)
- Corrected a manifest problem that caused the Maya plugins to refer to
a CRT version that was not necessarily present on all machines.
- Corrected a #define in the processor header to prep for the Android
build.
- Removed dependance on the STL for std::upper_bound.
- granny_allocation_information now contains an AllocationNumber member
that operates much like the CrtBreakAlloc mechanism in the MS CRT.
You can use the GrannySetBreakAllocation API to cause an debug break to
trigger on a specified allocation if you are using the debug
version of the Granny library, *and* you have not replaced the
default allocator.
- (gstate_beta) Distribute the gstate_test application.
- (gstate_beta) Memory leak fixes.
- (gstate_beta) Supports retargeting through
InstantiateRetargetedCharacter API.
- (gstate_beta) Routed GStateAlloc to the Granny granny_allocate_callback.
- (gstate_beta) Turned on versioning of state graphs. Still not
promising anything about your data here, but we're getting close!
- (gstate_beta) Fixed an endian related error in the token_context
snapshotting functions.
- (gstate_beta) Token ownership and release standardized.
- (gstate_beta) All allocations/frees routed through GStateAlloc and
friends. This allows the end-user application to override the
memory handling in all cases.
- Removed a test case that leaked into the DX9 tutorial.
- New exporter script function "GrannyDumpSettings", which will output
a text representation of a .GES file for debugging.
- New function GrannyClearPointerHash. Does pretty much what you would
think.
- (minor) Log message for leaked allocation clickable in VStudio.
- Exported undocumented granny_pointer_hash_iterator interface.
2.8.49.0 release 2011/05/16
Quick turnaround to catch the root motion extraction bug fixed below.
Please read the release notes for 2.8.48.0 as well!
- (gstate_beta) Fixed a bug in the motion extraction of the transition.
- (gstate_beta) Fixed an inconsistency in the blend node motion
extraction.
- (gstate_beta) (minor) Fix the gstate assert macro to prevent
warnings in release mode.
- (gstate_beta) Correct a memory error when transitions were modified.
2.8.48.0 release 2011/05/13
Big change to the way Granny source is distributed in this version to
make supporting multiple platforms much easier. Please see the
documentation in Building Granny from Source for more information. You will have
to take note of this if you have checked Granny into your source
control system to build from source.
In addition, now that the Animation Studio is more capable, the older
Blend Editor is no longer shipped with the default distribution. It's
functionality has been subsumed into the more advanced product. We
are still supporting clients shipping games with the Blend Editor, of
course, but to avoid confusion, it will be sent separately.
- Compatibility Note: Wholesale source layout changes. See
Building Granny from Source for more information. Everyone compiling from the
Granny source code will be affected by this change.
- Compatibility Note: GrannyConvertSingleObject and
GrannyMergeSingleObject now take a function parameter that allows the
caller to override any individual member copy.
- Compatibility Note: There was an error in the way the
BoneWeight format field was being stored in the file settings. Data
files that have a non-default value for this field may have this
value reset in this release. (Should be very rare that this isn't
the default.)
- Added support for Maxscript Plugin material classes.
- Fixed two off-by-one errors in the exporter for frame-by-frame
morph target extraction.
- Fixed a matrix ordering error in the export of frame-by-frame morph
curves for the normal component.
- Fixed a bug in the way the exporter computed TrackKey members for
granny_vector_tracks not sourced from a Max IParamBlock2 attribute.
- Exporter supports normals exported in DEC3N/R10G10B10A2_UNORM format.
- Exporter supports colors represented as granny_uint8 as well as granny_real32.
- Allow quoted arguments in specifications for "RunBatch" preprocessor
command.
- New preprocessor command "SetInternalAlignment" which will let you
change the alignment of individual sections in a Granny file.
- Added several animated material parameters to the Max exporter.
- Granny now supports the "Rampage" beta.
- Compatibility Note: Morph targets for skinned meshes will NO
LONGER contain the bone weights and bone indices from the base
mesh. This saves 8 bytes per vertex in the nominal case, but will
require adjustment to any copying/blending routines you have in
place.
- Corrected a bug in the maya plugin exposed when compiled with VS
2010. std::iostream operations must be sent back to Maya internally
to ensure that the stdio library used is the one that created the
stream.
- "BonesPerMesh" and "CombineRigidMeshes" command now correctly
update the BoneBinding OBBMin/OBBMax members.
- "CleanMaterials" will look at a granny_material's ExtendedData array
for references to granny_textures.
- Added an export mod UI ID range for custom exporters.
- Better project files for the exporter source distribution. Also,
moved to VS 2010 only for these projects.
- New exporter option: "Always skin", available in the "Meshes" pane.
This prevents rigid vertex formats from being selected for meshes
bound to only one bone.
- (gstate_beta) Added a way to select one of several models contained
in a character file in the animation studio tool.
- (gstate_beta) Corrected an oversight in the sequence root motion code.
- (gstate_beta) Added a "one-shot" option to the Sequence node.
- (gstate_beta) Corrected a drawing problem with comboboxes and long
strings.
- (gstate_beta) Timeshift nodes added to the library. These are
"stateless" shift nodes for the moment, changing the input
parameter will cause animations to come out of sync. Seeking
feedback here.
- (gstate_beta) Transition by name added. You can now request that
the "Attack" transition be started, which can mean different things
in different states.
- (gstate_beta) Added an intent parameter to ShouldActivate for
transitions, which distinguishes between requested and automatic
activations.
- (internal) GrannyCopyMeshVertices now uses the GrannyConvertSingleObject
override parameter to support custom compression fields.
- (internal) Fixed an inconsistency in the blending of keyframed animation
curves.
- (internal) altered Makefile structure for more clarity.
- (minor) Added the ability to override the Granny Assert macro by
defining GrannyAssertForward(exp)
- (gstate_beta) Fixed an allocation bug for character_instance.
- (gstate_beta) Return value of SampleScalarOutput for parameter node
will respect min and max values.
- (gstate_beta) Fixed a severe memory leak in FreeCharacterInstance.
- (gstate_beta) Altered some of the static objects in gstate to
prevent allocations before main().
- (gstate_beta) Make animation source paths relative to the state
machine file. Note that older files saved with absolute paths will
be automatically converted the next time the file is saved.
- (gstate_beta) The Granny Animation Studio is much more tolerent of missing
sources. This will no longer cause a crash, but the missing
sources will be highlighted in red in the source list.
- Compatibility Note: Verbose check logs (containing
expression info) turned off by default in the release build. This
saves about 20k in the DLL version of Granny. This can still be
turned on with macros, see Granny's Internal Debugging Checks. It is not
anticipated that most people will notice this change.
- (documentation-minor) Recategorized several functions/enums.
- (documentation) Marked the Blend Editor as deprecated in Blend Editor Start.
- (documentation) Note the Animation Studio in How Granny Fits In To Your Project.
- Added GrannyGetControlForceClampedLooping
- New documentation section Granny's Internal Debugging Checks.
- Compatibility Note: Removed GrannyCurveIsReducible. Altered
parameter list for GrannyKnotsAreReducible. Not anticipated to cause any
problems in user code.
2.8.47.0 release 2011/03/17
Two big announcements in this release. First, Granny now supports the
Nintendo 3DS! (Or rather, we have supported it for some time, and we
can now tell you about it!)
Second, this release marks the first public release of the Granny
Animation Studio. This is a limited functionality release to get
feedback on both the tool (which a few clients have been helping us
with), and the runtime API, which no one has seen yet. As with any
new piece of Granny, we're eager to hear your comments. This release
contains only a Win32 version of the runtime, the intention is to
gather comments, and then do the full source release and the rest of
the platforms. Speak now, or forever, etc, etc.
2.8.47.0 release
- Altered the batchable commands to take the original and output
filenames as parameters. This allows behavior changes based on the
inputs or output file type.
- Added support for YCoCg texture compression.
- (minor) Fixed preprocessor mod support compilation.
- (minor) Correct an atomic acquire function for x64 Mac OS X.
- (minor) Added Telemetry version check to Granny wireup API
- (minor) Exposed GrannyAccumulateControlledAnimationMotionVectors in the
undocumented API.
- (internal) Allow S3TC routines to force S3TC5 instead of
autoselecting 4 or 5.
2.8.46.0 release 2011/01/21
Quick turnaround to fix a critical bug in the x64 exporters.
- Corrected an error in the x64 version of the exporter. Floating
point values in the exporter options dialog were being incorrectly
reported as NaN due to -fp:fast compilation on SSE2 platforms.
- Removed the "meters" designator from the viewer measure axes. This
was not using the granny_art_tool_info scaling to correctly display units
(by design).
- Corrected an error in the TrackMask UI script for Max. Spaces in
object names were not being properly handled.
- (minor) Added GRANNY_LITTLE_ENDIAN/GRANNY_BIG_ENDIAN to granny.h
2.8.45.0 release 2011/01/11
Lots of changes in this one!
- New preprocessor feature: "RunBatch". This command will take in a
script that runs a set of preprocessor commands in sequence without
writing the file to disk in between runs. This can both save a
fair amount of CPU time when working with compressed files, as well
as keeping your disk free of extraneous temp files. Added
documentation for this feature. (The Granny Preprocessor: Command Batching)
- New preprocessor command: "MergedSkinnedMeshes", which will try to
combine all of the skinned meshes for a model into a single mesh
with multiple material groups. This is handy for generating
tangents spaces. (With "GenerateTangents", hint hint.)
- Added "Track Groups" to the list of "global" objects recognized by
GrannySetValue (or GrannySetGlobalValue in XSI.) This allows you
to affect all track groups without altering the animation defaults.
This is mostly useful when you want to shut off all material
granny_track_group objects, and turn on only a single granny_model
granny_track_group.
- Fixed a angle computation error in the Orientation jump/crease
tolerance computation.
- Made it easier for Granny Mod tools to strip the Granny branding
off of the exporter, viewer, and preprocessor.
- Added some support for mesh instance detection to the Maya
exporter. You can find instancing information in the ExtendedData
member of granny_mesh, in a sub-structure named "InstancingInfo".
- Fixed an error in GrannySampleModelAnimationsAccelerated that caused
granny_control ease-out curves to be ignored.
- Compatibility Note: bool members in exported structures
converted to granny_bool32 to make sure we don't have structure
size surprises. This is not strictly a compatability issue, but
you may have some new warnings about implicit conversions from int
to bool, sorry about that!
- Max primitive information only dumped when UserAttributesOnly was
enabled. Fixed.
- When BUILDING_GRANNY_FOR_MODS is set, the preprocessor will look at
the extension of the output file to decide if the file to be
written should be in base Granny format, or in MOD format. If
PREPROCESSOR_ONLY_WRITE_MOD is set, only MOD format will be used.
- Altered the preprocessor to take load mod files or gr2s when
BUILDING_GRANNY_FOR_MODS is set.
- Fixed a calling convention problem in the Win32 accelerated
deformers that affected the debug static build of the library.
- Added the ability to control the number of times an animation will
loop by default. This is controls by the "Default Loop Count"
slider in the Animations pane of the export settings. The default
is to replicate the existing Granny behavior, which is to loop once
and stop. This should not cause any incompatibility problems with
existing code and/or data.
- Added the ability to mark controls as "Complete at Local Clock" and
"Ease In/Out at Local Clock". See
Basic Model Setup and Animation: Local Clock Completion for details.
- Compatibility Note: bool arguments that passed back values
by reference or pointer changed to bool32. For instance,
GrannyGetControlLoopState. These are relatively out of the way APIs, so
this should have minimal impact.
- Fixed a bug in the preprocessor history storage.
- Compatibility Note: BUILDING_GRANNY macro test changed from
!= 0 to defined()
- Enumerants in Granny now have an explicit entry to force them to
take up 4 bytes.
- Added an "Export selection only" menu option for convenience to the
XSI exporter.
- GrannyEndVariant now returns a void* that is the location you should
free in order to release the allocated memory. Previously, it
ambiguous whether the Type or Object parameter pointers represented
the allocated block. The function will return NULL on failure.
- Unified the memory lock across platforms. This should provide a
little extra bug tolerance, since the atomic primitives used are
now shared across RAD's codebase.
- Added range checking for functions like GrannySampleModelAnimations that
specify a bone range to operate on. Previously, these would
silently accept out-of-band values.
- Improved the threaded free just a bit for the default allocator.
Previously it would call the OS level free while holding the
allocation list lock, which could adversely affect other threads.
- Corrected a problem in the viewer that caused it to try to free
memory that it hadn't allocated. Obviously not a good idea.
- (minor) Corrected a problem in the blending tutorial that caused
double-creation of the granny_control objects.
- (minor) granny_file_writer now takes a granny_int32x for the SeekType
parameter, to correct a problem with the generated granny.h header.
Not expected to impact user code.
- (minor) Added a new memory model for the granny_string_table, which supports
the preprocessor a little better.
- (minor) Corrected some overzealous assertions in the granny_mesh_builder,
as well as tightening a return value in an error case for the
granny_stack_allocator.
- (minor) granny_namespace.h now checks for either BUILDING_GRANNY or
BUILDING_GRANNY_STATIC to make sure that Granny specific settings
are enabled in RAD shared code when compiled by clients.
- Added a generic deformer to match an accelerated path on a handheld
platform.
- Added a flag (-p/--pointerLess) to the tree_walker (grn.exe)
example to allow omitting pointer values from the output. This
makes it easier to diff the dump of .gr2 files, since these are not
consistent across runs of the program.
- (internal) security cookie protocol for DLL stack protection.
- (internal) Re-routed RAD shared allocators for Granny to avoid
HAVE_RADMALLOC problem.
- (internal) Corrected a linker problem in the simulator target for a
new platform.
- (internal) Minor tweak to the file categorization methods in the
viewer.
- (internal) Structure packing irregularity in the XSI plugin.
- (internal) Unified the lock for multithreaded alloc tracking.
- (internal) Memory lock will progressively yield the CPU to other
threads on multi-core systems to prevent priority inversion
problems.
- (minor) Added an ExtendedData field to granny_animation for future use.
- (minor) Better file type description in the viewer for open dialog.
- (minor) Slightly more clear log messages for some file reading
errors.
- (minor) Compile fix in the preprocessor.
- (minor) Corrected a problem with line endings in the OBJImport
preprocessor command.
2.8.44.0 release 2010/10/29
A lot of distribution fixes and XSI changes in this release. Thanks
to everyone who made suggestions over the last few weeks.
The Mac OS X build is back, and is now hosted on GCC rather than the
Intel Compiler, for added ease of rebuilding.
- Fixed a bug in the "AddTextures" database command for an empty
database. WriteInfoPreserve modification in a recent version broke
the ability of this command to create a new file without a previous
exemplar.
- Preprocessor will now save execution history in
granny_file_info::ExtendedData if the -history flag is passed. So for
instance: "TouchVersion -history in.gr2 -output out.gr2" will save
the command line in a string array.
- Tutorial distribution has changed to run sample code out of a
common directory. This prevents some startup hassle with the
Granny SDK. You may need to delete your *.[host].[username].user
files for debugging to work correctly. Sorry, this is an artifact
of the way Visual Studio projects store the debugging settings.
- Altered the "CompressVertSample" preprocessor sample to also compress
diffuse and specular vertex components to 32-bit RGBA representation.
- Added support for extracting XSI ShapeKeys as granny_morph_targets.
- Fixed some old language in Granny Exporting Overview
- Fixed a distribution script error that prevented a crucial tutorial
file from being copied to the final zip files.
- Ported the minidump handler from the exporter to the viewer to capture
crash logs.
- Corrected a vertex normal exporting bug in XSI.
- Sub-parameter structure extraction added for XSI.
- Changed the way the exporter computes temporary file names to prevent
export failures when running multiple instances or after tool crashes.
- Added GrannyGetDag2NodeInputConnectionInfo to allow easier
implementation of Callback DAG nodes from the non-source API.
(Also to recapture the "longest function name" record.)
- Fixed some parameter extraction problems with XSI materials.
- New command for the SPUs. Not yet generally available.
- Disabled XSI builds prior to version 7.
- (internal) Changed the storage of callback pointers in the
dag2 callback node type.
- Added an option to disable texture alpha in the viewer.
- Fixed evaluations of degree 0, quantized curves.
2.8.43.0 release 2010/10/11
Quick turnaround on this build to formalize some distribution changes.
No significant functionality changed in this build.
- Added VS.2010 projects for exporters and runtime.
- Distribution change: Viewer source now includeded with the exporter
source distribution. VS.2010 projects included.
- Distribution change: winxx_granny_msvc_stubs.cpp removed from the
source distribution. Make sure to delete this file if you are
copying newer versions of Granny on top of your older versions.
This also means that if you are linking a DLL version of the
library, you will need to link against the MS CRT on Windows.
- Compatibility Note: Removed pointless granny_real32x type.
- Move the GrannyGetModFileInfo function out into the undocumented API
from the source interface for easier integration.
- GrannyGetFileInfo changed from GS_READ to GS_PARAM, which is what it
should have been all along.
- (internal) New ALIGN16_STACK macro to account for compiler
platforms that limit stack variable alignment to 8.
- (internal) Fix a problem with the Exporter projects on VS.2010
- (internal) Move the viewer onto the namespaced version of Granny.
2.8.42.0 release 2010/10/06
Note that we experienced the untimely death of Granny's Build Mac on
the 8th of September at 11:45 pm. It will be missed. So, the OS X
target is not available in this release, sorry about that! We'll have
that target back up in the next release.
2.8.41.0 pre-release 2010/09/08
- Compatibility Note: On Microsoft platforms, Granny now
officially supports only compilers from Visual Studio 2005
onward. With some effort, it will be possible to compile with
VS2003 or VC6, but this is not recommended.
- Fixed root motion extraction for granny_spu_controlled_animation.
- Fastmath switches on fsel platforms could cause -0 values to slip
through despite the fix in 2.8.33.0. Addressed in FindKnot.
- Added a port of the grannySkeletonTolerance.mel utility to
Maxscript.
- (internal) Exposed a couple of internal animation structures for
an upcoming tool.
- (internal) Slight alteration for granny_intaddrx types to fix warnings in
later MSVC compilers.
2.8.40.0 release 2010/07/23
- Fixed the way string blind data was indexed in Maya.
- Compatibility Note: Major restructuring of Granny's SPU
support in this version. We've create a SPURS task version of the
SPU sampler for easier integration. We've updated the SPU
documentation section, check out SPU Sampling Support.
- SPU code layout changed to reflect new structure. All SPU
specific code may be found in the "spu" subdirectory of the PS3
distribution. New project added for the SampleModel library to
allow game-specific customization.
- SPU Curve size limits changed such that an animation may be
arbitrarily sized. The limit on SPU curve size is now
GrannyMaxSPUTransformTrackSize, which applies only to the size of a
single granny_spu_transform_track's curve set.
- Animation mirroring now supported on the SPUs through
GrannySetSPUTrackGroupMirrorSpecification.
- Added UseTelemetry and UseTmLite to allow external
customers to access Granny's Telemetry profiling information. More
details coming soon!
- Small preprocessor tweaks: MakeSPUAnimation will now create a file
in PS3 native byte ordering, and ExtractStrings/RemapStrings will
emit a sensible error when passed a file that already has remapped
strings.
- New preprocessor sample: DecompressTextures, which will convert all
textures in a file to Raw RGB/RGBA format.
- (visual) Removed Bezier Granny head from the exporter, it was
causing problems over remote desktop in certain cases.
- (internal) Renamed the "Reserved" member of granny_spu_transform_track.
This now stores the number of bytes from the curve buffer required
to sample the track.
- (internal) Altered the way the auto-documentation macros work for
better Telemetry integration.
- (internal) Clean up environment detection by removing ancient
compilers.
2.8.39.0 release 2010/07/02
- Compatibility Note: GrannySetChannel has been changed to prevent
errors in which the tangent generator would read off the end of a
vertex array. You must now specify the width of the source channel
along with the data.
- Fixed a problem that could prevent the proper export of compound
array animated attributes in Maya.
- Compatibility Note: In order to support x64 as a Mac OS X
target, the default file handlers in Granny have been switched over
to the fopen/fread from the (deprecated) FSOpen/FSRead paths.
There is a new function: GrannyGetOSXCarbonFileReaderOpenCallback,
that will retrieve the previous file handlers on PPC/x86.
- Added missing DLL version check to the preprocessor.
- (internal) New function: MaskedMirrorPoseTransforms, which can be
much faster than MirrorPoseTransforms when a granny_track_mask is used.
These function are available through the source-only interface, but
you will automatically get this speed up through the
GrannySetTrackGroupMirrorSpecification API when a model mask is present.
- New functions: GrannyGetRetargeterSourceIndices,
GrannyGetRetargeterSourceModel, GrannyGetRetargeterTargetModel, which allow
access to some of the internal mapping information for a
granny_retargeter.
- Added axis mirroring functions to the viewer.
- Minor new function: GrannyGetSPUControlTrackGroupTrackMask for
retrieving granny_track_mask objects from granny_controls representing
granny_spu_animations.
- (internal) Added some experimental controls to the granny_camera to make
supporting oddball coordinate systems easier.
- (internal) SPU Controlled Animations were not properly responding to
type requests, which could cause crashes when some of the granny_track_mask
accessor functions were called.
- (internal) Altered the xenon accelerated deformers for new types in
latest XDK.
- (internal) Added support for MacOSX x64. This target is not yet
supported in the default release, but source licensees can now
create a library using the default sources.
- Compatibility Note: Removed GrannySleepForSeconds. This was
poorly supported on many platforms, and really makes no sense as
part of Granny.
2.8.38.0 release 2010/05/29
- Memory addressing bug corrected in GrannyBuildSkeletonRelativeTransforms
in the "in-place" pathway.
- Corrected a pointer math error. This could cause problems on file
write for the 64-bit exporters.
- Added some extra helper routines to the PhysX mapping layer to make
it easier to drive NxJoint members.
- Fixed an indexing error in the GenerateTangents preprocessor routine.
- (internal) Fixed some PS3 math intrinsic operations, notably acos.
- (internal) Changed to new RAD base library.
- New Preprocessor sample: "Create16BitTexCoords".
2.8.37.0 release 2010/05/12
- Corrected a UI problem with Max 2009/2008 x64.
- New functions GrannyLinearBlend/GrannyLinearBlendRanged.
- Compatibility Note: GrannyCopyLocalPoseBoneCount has a
"BoneStart" parameter now.
- Compatibility Note: Changed the way that compound array
attributes are exported from Maya. Maya allows each entry in these
arrays to have a different object layout. The exporter previously
required each array element to be of the same type. They
may now vary, but code that accessed this attributes will need to
be slightly changed, as this required an extra level of
indirection.
2.8.36.0 release 2010/04/28
- Corrected a startup crash in the exporter for Maya 2011.
- New function GrannyIKUpdate2BoneDetailed. This allows you to specify
the indices of the "Foot", "Knee" and "Hip" explicitly. This
allows the exact 2-bone system to function when there are
intervening bones in the hierarchy.
- Fixed some out of date documentation in Animated Mesh Deformation
relating to the granny_mesh_deformer.
- (internal) Dial down the zealousness of the Minidump writer in the
exporter.
- (internal) Corrected flags problem in GrannyIKOrientTowards.
2.8.35.0 release 2010/04/01
Small, quick release to address a problem with uncompressed animation.
Previously, these would work correctly through the
GrannySampleModelAnimations but fail in either
GrannySampleModelAnimationsAccelerated, or GrannyUpdateModelMatrix. They work
now, but you should still (almost) never use them!
- Improved support for uncompressed animation curves. These may now
be sampled through GrannySampleModelAnimationsAccelerated, set on blend
graph nodes, and used for VDA motion extraction in
GrannyUpdateModelMatrix. (You still shouldn't be using these in your
game!)
- Compatibility Note: The Granny exporter scripting interface
would accept a GrannySetValue command to change the oversampling of
"modelanim" components. These correspond to a granny_track_group, and
should not have been able to be changed independently. (The
exporter never actually looks at the value, it takes the
oversampling parameter from the granny_animation level instead.) This
option has been removed, and trying to set it will now result in a
warning from the GrannySetValue command.
- (internal) Handle NULL parameters passed to bulk memory operations
better.
- (internal) Correct ununitialized array in the exporter.
2.8.34.0 release 2010/03/30
- Compatibility Note: The exporters installed by the one-click
installer will now have the version of the tool encoded into them.
This follows the convention from the zipped exporter distribution,
and makes symbol recovery for debugging easier. The one-click
installer will attempt to remove any old-style plugins found
(granny_max.dlo, granny_maya.mll), and will warn you if it's unable
to do this safely.
- Blend editor selection options enhanced. From the DAG context
menu, you can now wrap a node selection in a subgraph. The editor
will rewire all of the inputs/outputs of the selection to preserve
the functionality of the graph, while hiding the details.
- The Mirroring API is now fully blessed and documented. Details may
be found at Advanced Animation: Mirrored Playback.
- Added extraction of Face Sets connected to meshes to the Maya
plugin. These will appear as granny_tri_annotation_sets attached to
the granny_mesh::PrimaryTopology member. Provisionally, this includes
shading group sets, though this is somewhat redundant with the
granny_tri_material_group array.
- Fixed a rare memory exhaustion problem in super-large Max scenes.
- Fixed a problem with the Max name extraction for meshes.
- Corrected a case in which two bones with the same name are the
child of the same parent in Max.
- "Reset Graph" for starting over in the blend editor.
- Operations that modify the graph state in the blend editor now
correctly mark it as changed so you will be prompted to save the
current state when opening a new file or reseting the editor.
- Make preprocessor output a little more automatic.
- Fix a bug that caused GrannySetFileDiskAlignment to create valid, but
unaligned files when targeting non-native platforms.
- (internal) Improved logging in the exporter for the inverse
precision warning. (GrannyAddBone return type changed.)
- (internal) Aligned version: GrannyPlatformConvertReaderToWriter.
- (internal) Fixed a SxS assembly problem that could cause crashes in
the Max exporter.
2.8.33.0 release 2010/03/22
- Compatibility Note: Max bones will now be named in such a
way as to prevent the same bone name from appearing twice in a
granny_skeleton. It is not expected that this will cause problems in
current games, since this condition typically shows up as a bug that
needs to be fixed.
- The Blend Editor docs have been updated (at long last!) and moved
into the Granny compiled help file. Start here: "Blend Editor Start"
In the help file, you can find the new document sections at the top
of the "Artist Track".
- New preprocessor command: "SetFileAlignment", which changes the
on-disk alignment of a Granny file without altering the platform or
compression setttings. Useful for aligning .gr2 files for
unbuffered IO.
- New preprocessor command: "ModelMeshBounds", which embeds an AABB
for each model into its ExtendedData member.
- New node for the Blend Editor: Locked Blend. This is a
long-requested feature that's finally making it back into the Blend
Editor. If you have phase matched animations (for instance, walk
or run cycles that have different durations, but similar
foot-up/foot-down structure), this node will allow you to blend
them without foot slipping.
- New blend graph node: NWay blend.
- New blend graph node: Additive Blend.
- Compatibility Note: Removed obsolete member
granny_track_group::RootMotion.
- New function: GrannyMaskedAdditiveBlend. Just like GrannyAdditiveBlend, but
takes a granny_track_mask parameter to control the location of the addition.
- Added documentation for GrannyAdditiveBlend to remove it from Undocumented Portions of the SDK.
- Made the detection of degenerate tangent spaces work a little more
transparently.
- (internal) Fixed the one-click plugin installer to handle the case
of both the 32- and 64-bit versions of 3DS Max being present.
- (internal) Catch some -0 values that were still slipping through in
the DAG2 samplers.
- (internal) Added full mesh pathname support to the Max exporter.
- (internal) Sekrit new aspect ratio.
- (internal) const-consistency fix for GrannyIKAimAt.
- (internal) More polite platform detection to avoid warnings for
checking undefined preprocessor variables.
2.8.32.0 release 2010/02/23
- New undocumented granny_file_builder API: GrannySetFileDiskAlignment. This
allows controlling the alignment of file sections on disk, rather
than in memory, on platforms that require non-trivial alignment to
do unbuffered reads.
- Fixed a material connection error in XSI.
- The Maya exporter would duplicate animated granny_vector_track attributes
for scalars in custom compound attributes. Fixed.
- The Max exporter will now correctly find and export texture maps in
custom attribute containers.
- Switched GrannyConvertPixelFormat to work by bytes, rather than
DWORDs. This prevents misaligned writes and reads for platforms on
which that's considered rude.
- Added accelerated deformers on the Xenon target for
granny_pwngbt343332_vertex.
- Fixed a crash in the Max exporter relating to collapsing the
modifier stack.
- The Granny exporter will now create a minidump to assist in
debugging if it crashes. If you see a dialog relating to this,
please send the resulting file to granny3@rad, and you'll have our
undivided attention.
- Fixed a "Morpher" modifier extraction problem with Max 2010.
- Compatibility Note: Removed GrannyAlignWriter macro from
granny.h. This depended on an internal (unexplained) constant for
the alignment. Replace with GrannyAlignWriterTo.
GrannyPredictWriterAlignment also takes an explicit alignment now.
- 360 project shifted to VS.NET 2008 from 2005.
- 360 default distribution compiles with approved MS compiler in this
release.
- (internal) Take up an Autodesk-suggested fix for a Softimage crash
on reference objects that are unloaded.
- (internal) Symstore hooks.
2.8.31.0 release 2010/01/15
Well this is unusual! Two hotfix releases in 3 days. This release
addresses a single issue. In the Xbox 360 build, the knot-finding
routines could potentially be confused by -0.0 values slipping through
in time computations. This could yield single-frame errors in both
the pose and motion extraction paths.
2.8.30.0 release 2010/01/13
- Hotfix release for a Wii link problem. Certain files in the latest
distribution were compiled with C++ name-mangling, which could cause
link errors.
- New preprocessor sample command: "OverrideSkeletonLOD".
2.8.29.0 release 2009/12/18
- Compatibility Note: The VertexComponentNames field of
granny_vertex_data was incorrectly treating BoneIndices and BoneWeights
as if they were a unit, and listing only the weights. This makes
it harder to find fields farther on, so they now *both* show up in
the array. Note that this required changing the undocumented
function GrannyGetVertexComponentCount to reflect this new semantic.
- New preprocessor sample command: "MergeTrackGroups". Replaces the
tracks in a base animation with tracks from a second. Useful for
merging sections of a character that need to be exported with
radically different settings.
- Edge renaming now affect the internal/external edge for subgraph
nodes.
- The Blend editor will remember the last model that was associated
with a graph, which cuts down on useless mouse clicking to reassign
a test character.
- Blend editor will now properly open double-clicked .DGE source
files if it is registered as the associated application.
- Added a feature to the export to allow the user to override what
the default tool coordinate frame is. This is subtly different
than the coordinate frame option that was already present, and this
should be treated as an advanced option. Write to us at
granny3@rad for more info.
- Scroll bar in the Blend Editor wasn't responding to mouse input.
Fixed.
- UI Work in the Blend Editor to make things a bit clearer. Black
background to avoid complicating color previews on the models,
which will now attempt to render their diffuse texture.
Connections now are colored by their input/output type, so the flow
of poses and scalars around the graph are more clear.
- Exposed GrannyControlHasEffect, which is necessary for creating
replacement GrannySampleModelAnimations functions.
- Fixed a bit of uninitialized data in the blend editor.
- Made the documentation of the granny_transform::Flags
member a little clearer in Granny Utility Function Overview: Decomposed Transforms.
- (internal) Altered the GrannyAlignWriter function a bit for some ongoing
work.
- (internal) Killed an inappropriate log.
- (internal) Removed inaccurate assertions.
2.8.28.0 release 2009/10/30
- PS3 Library now built with the S/N Systems compiler rather than
GCC.
- Improved the GrannyFindKnot class of functions. This is a small
improvement on the PC, but a pretty big win on PS3 and other
in-order platforms.
- Zelda support added.
- Added support for the 64-bit versions of XSI 7.5 and 2010.
- Fixed a severe error in the material exporter that would cause
every 2nd plug on a hypershade node to potentially be omitted
from the final exported graph.
- Maya: Add a list of linked lights to granny_mesh::ExtendedData on export.
- Maya: Add a string to specify the original transform node for a
mesh to granny_mesh::ExtendedData.
- The exporter will now pop a custom dialog on memory exhaustion in
the DCC packages. Have I mentioned that we have 64-bit support for
all three major content packages?
- New preprocessor sample: "RemoveUnboundTransformTracks". This will
remove granny_transform_tracks from an animation that cannot affect a
model's meshes after skinning.
- Fixed a page-flipping problem that manifested on Windows 7.
- (internal) Use specialized granny_transform dispatch in SampleTrackUUU
and related functions.
- (internal) GrannyGetBoneCountForLOD should return granny_int32x, not "int".
- (internal) Better Wii compile settings.
- (doc) Corrected a parameter in documentation for GrannyPlayControlledAnimationBinding.
2.8.27.0 release 2009/10/20
- Fixed an alignment problem in GrannyGetWorldMatrixFromLocalPose that could
cause the function to use slow math routines.
- Fix a bug in GrannyGetAttachmentOffset that could invert the Offset4x4
parameter inappropriately.
- Expose GrannyConstructQuaternion4 to assist in making orientation
entries in granny_transforms.
- Fixed an error in the Win64 debug memory allocator.
- DLL dependency problem in the Granny Viewer addressed.
- Allow certain orientation curve formats to be excluded from
exported animations if necessary.
- New API: GrannyFileCRCIsValidFromMemory to match GrannyReadEntireFileFromMemory.
- New API: GrannyRemoveMember.
- Fix the assertion message box on Win64, CreateThread was
interacting poorly with MessageBoxIndirect.
- (internal) Units for exporter loading in release build, should
prevent manifest errors from cropping up.
- (internal) Platform tutorial building units.
- (internal) granny_mesh_builder will better handle empty meshes in
exports.
- (internal) Handle a size-check case for enums in the SPU header
generation.
2.8.26.0 release 2009/10/12
- Support for XSI 2010 added.
- Fixed a skinning bug in the XSI exporter which would incorrectly
bind granny_meshes that were outside the hierarchy of the granny_model they
were skinned to.
- Compatibility Note: XSI Mesh export options are now stored
directly on the mesh primitive, rather than on the bone to which
that mesh is putatively bound. This addresses a problem raised by
the previously mentioned fix, but will invalidate any existing mesh
settings in your scene files. (The exporter will be looking the
wrong place for the GED_MeshData blob.)
- Compatibility Note: The XSI exporter will now add
disambiguating parent names to granny_bones that share a name. This is
the equivalent of the Maya partialPath() API. This prevents
granny_bones from binding to the wrong animation track.
- New utility function, GrannySetCameraFOVX, which allows you to specify
the granny_camera's field of view using the x-plane angle.
- (doc) Reorganize the intro material to be more easily found.
- (internal) corrected a few bad pointer specifications in the SSE
accel deformers.
- (internal) Added an iteration API for the granny_pointer_hash.
- (internal) New log message type: GrannyCameraLogMessage.
- (internal) Fixed a problem with the plugin installer that prevented
the Maya 2010 exporter from being properly installed.
2.8.25.0 release 2009/09/22
There's a big help file reorganization in this release, and more on
the way! The basic idea is to break up many of the longer (!)
documents, and lay things out more concisely and logically. The coder
track has been rearranged to be in a more natural order. New sections
are called out specificially in the changelog below.
- Compatibility Note: granny_allocate_callback arguments changed to
granny_uintaddrx. This is part of the larger granny_intaddrx change mentioned
below.
- The Max exporter will now put a representation of the selection
sets and layers into the granny_file_info::ArtToolInfo::ExtendedData
member.
- Corrected a fixed size allocation in GrannyBeginFileDataTreeWriting that
limited the total number of objects that were possible in a .gr2
format file. The number of objects is now limited by available
memory, as it should be. There were also a number of "dead code"
allocations in this section that have been cleaned up.
- The material attribute walker in the Maya exporter was bringing in
objects that weren't materials as granny_materials in the exported file
for some custom material types. Fixed.
- Fixed a problem in the granny_world_pose building routines that would use
SSE-enabled math routines on processors that don't support SSE.
- Brought back GrannyBuildWorldPoseNoComposite and
GrannyBuildWorldPoseNoCompositeLOD for convenience.
- The right-click menu of the texture listing in the viewer can open
the folder containing the original texture or open the texture for
editing in the registered application for that file type.
- Added subshape attribute extraction to the Maya exporter.
- Simplified the Animation LOD calculation routines by removing some
of the super low-level (undocumented) functions from the public
API. Client code should be using the granny_animation_lod_builder API or
(better yet) the "LODCalc" preprocessor command.
- Check for texture alpha manually in the Max exporter. Never trust
Max.
- Still catching up to the times. The "Tutorials" project now ships
as a Visual Studio 2005 solution.
- Updated the PS3 sample solutions.
- The Granny source will now compile correctly under the S/N PS3
compiler.
- "BonesPerMesh" will now respond to a "-modname 1" parameter on the
command line by appending a unique index to the new meshes.
- Compatibility Note: For simplicity, changed the filenames of
the manually installed Max plugins to match the external, rather
than internal versions. For instance, Max 2009 (released in 2008)
is internally called Max 11. Previous Granny plugins would be
named granny_max11_0.dlo, they will now be called
granny_max_2009_0.dlo. You will not be affected by this unless
you've been manually installing plugins, in which case you should
simply remove the older plugin. The one-click plugin installer
will handle this automatically.
- Prevent granny_vector_tracks that exceed GrannyMaximumBSplineDimension from
crashing the exporter.
- Fixed a parameter list error in the ANSI version of granny_file_reader.
- New convenience functions: GrannyAllocateCompositeBuffer,
GrannyAllocateCompositeBufferTransposed, GrannyFreeCompositeBuffer. These
correctly allocate and align a buffer for passing to
GrannyBuildCompositeBuffer and friends.
- New function: GrannyMemoryArenaPushConcat.
- (internal) Large numbers of granny_intaddrx variables have been switched
to granny_uintaddrx to prevent problems with addresses that have the high
bit set.
- PSP Platform now ships with a default malloc allocator.
- Removed (ancient) test art from the "media" directory of the
distribution to simplify the directory structure.
- (internal) Update Wii tutorial project.
- (internal) Error handling in GrannyCompressCurve changed to check
condition with an error return rather than assert.
- (internal) Correct Wii build command line.
- (internal) Function entrance markers.
- (internal) Exposed internally a bit more of the allocation
information.
2.8.24.0 release 2009/08/20
- New document section: Inverse Kinematics.
- By popular demand: GrannyAdditiveBlend. This function will blend the
difference between the Additive and Base parameters into the target
granny_local_pose. Blend amount currently must be between 0 and 1.
- Fixed a problem in the XSI exporter which could cause an improper
mesh bind pose to be used on export if the timeline was untouched.
- Fixed a problem under VC 2008 with the inline assembly in the
accelerated-matrix routines.
- Added a flag to exclude granny_vector_tracks from exported animations.
- GrannyGetControlCycleDuration added to allow you to determine the length
of one cycle of a looping animation. (GrannyGetControlDuration returns
an "infinite" value for granny_control objects with a LoopCount of 0.)
- Added a new preprocessor command: "RemoveAllNamespaces". This is
almost the same as "RemoveNamespace", but it will strip all
characters up to the last colon in the string. There is no
need to specify the prefix string in this case.
- New IK Controller: GrannyIKAimAt. Smoothly bends a bone chain to bend a
specified end-effector axis towards a world-space position, while
attempting to keep a secondary vector level to the ground. (Think
of one vector as the eye-line, and one as the ear-vector.) This
can be used to control the head of a character, or to aim a weapon.
- Fixed an oversight in the "RemoveNamespace" preprocessor command.
Older versions of the command would break the granny_bone/granny_vector_track
linking by not updating the TrackKey member to reflect the new names
in the granny_skeleton.
- New IK Controller: GrannyIKOrientTowards. This controller will modify a
pose so a specified local axis of the given bone will point at the
world space target. This is useful for gaze direction, or
enforcing inter-model contraints.
- Compatibility Note: Made the granny_track_group_sampler API a
little more straightforward. You pass a frame index to both
GrannySetTransformSample and the new GrannyGetTransformSample rather than
dancing around with the (removed) GrannyPushSampledFrame function.
- Compatibility Note: GrannyMaximumIKLinkCount reduced from 256 to
32. This saves a great deal of stack space in routines that store
temporaries (GrannyIKAimAt for instance). granny_skeletons with a depth of
even 32 are fairly rare, and IK computations on 256 bone chains are
fairly ludicrous. Mail us if you need this increased for your
anaconda simulator!
- LOD Group nodes in Maya will now output the child ordering in the
ShapeInfo attribute.
- Fixed a problem in the Maya exporter with array enum and float
attributes.
- Eliminated some attribute duplication in extended data members
from the Maya exporter.
- Added a new script to the maxscript tutorial to hide bone helper
meshes for files where that doesn't remove valid user data.
- Sample script added to the Max sample scripts to batch export all
Puppetshop clips
associated with a model.
- Back mouse button works in the viewer detail pane.
- Compatibility Note: The Granny viewer will no longer work
Windows with OS versions older than WinXP. Pretty sure everyone
will be OK with that.
- Added a gcc-based PS3 build project.
- The Max and Maya TrackMask UI scripts have been rewritten.
- Synthetic oversampling option added. To first-order, you should
never use this. Write us at granny3@rad for more information if
you're interested.
- (internal) Made sure that GrannyEndLocalPoseAccumulationLOD treats the
TraversalID member correctly when doing LOD blending.
- (internal) Made some changes for PS3 SDK 2.80.001.
- (internal) Added some code to the granny.h header to allow
(limited) use in Managed C++ code.
- (internal) Tweaked the assert macro a bit to halt at the line of
the assert on MS platforms.
- (internal) Some missing trig functions added.
- (internal) Clamped dot product, quaternion between two vectors.
- (internal) Rearranged constants in the headers.
- (internal) renamed model root transforms for IK controllers to be
consistent with GrannyBuildWorldPose argument list.
- 2.7.0.34 version files have been moved out of the main FTP
directories. If you need a 2.7 or 2.6 series release of the SDK,
please write to us for access to the older versions.
2.8.23.0 release 2009/07/02
Note: we have discovered a bug in 3ds Max that can cause meshes with
custom per-face data channels to crash on export. There is a
workaround for this problem, but it requires replacing a standard
plugin. Write us if you're experiencing random export crashes on
meshes with deep modifier stack and custom face data, we'll check
if you're encountering this problem.
- Extract IK info for 3ds Max bones that have either IIKControl or
IIKChainControl derived controllers. You can find these in the
IKControlInfo or IKChainControlInfo members of the corresponding
granny_bone's ExtendedData.
- Added a mesh flag "Use color map detection heuristic" to the Max
exporter. This works around a problem in Max in which parameter
maps are not correctly marked with MESHMAP_VERTCOLOR or
MESHMAP_TEXTURE. Without those flags, the exporter has a very hard
time telling which parameter maps represent color channels, and
which represent uv coordinates. The heuristic looks for data that
doesn't seem to be UV, and treats those channels as colors. Not
perfect, but it does (mostly) work. The issue has been raised with
Autodesk.
- Compatibility Note: The Max exporter was taking the identity
of the first color channel from the currently displayed vertex
color parameter on the object. This behavior has been altered so
the objects exported are consistent, regardless of display state.
- Compatibility Note: The Max exporter was default
initializing vertex alpha to 0 rather than 1, which is a bad idea,
and inconsistent with the Maya behavior. Changed to properly
default to 1.0.
- The exporter supports XSI 7.5.
- Store the vertex and normal transform for Max meshes in the
ExtendedData member. This makes detecting instanced meshes a bit
easier in some cases.
- Fixed a problem with the Max 2010 exporter compile process that
could cause the size of certain Max structures to be miscalculated.
This manifested as morph animations missing their channels.
- Altered the way the GrannyReadAtMost, GrannyWrite, and friends are handled to
allow better matching between user and sdk code.
- An flag omission in the write_raw_file.cpp sample preprocessor
command was causing the type tree to be included in the raw output.
Since excluding the type tree is almost the whole point of a raw
file, this is a problem. Fixed.
- Support extraction of the Knot and Control vert arrays from Maya
NurbsCurve objects.
- Prevented a crash in the viewer from unorthodox bone indices.
- MaskName parameter for GrannyExtractTrackMask now const.
2.8.22.0 release 2009/06/16
- SiblingInstances in Max exports now augmented with a
SiblingIsReference array that allows you to determine if the
objects were created as Instances or References in Max.
- Added 2 new experimental functions: GrannyPrepReadEntireFileNoAlloc and
GrannyReadEntireFileNoAlloc. This pair of functions will allow you to
read a file without Granny doing any allocations that you don't
explicitly control. That is, GrannyPrepReadEntireFileNoAlloc operates
entirely on the stack, and returns a description of all of the
memory required to load the specified file. GrannyReadEntireFileNoAlloc
will then load the file working entirely from the stack, and the
allocations you've passed in using the granny_noalloc_loading_mem
structure. These are going to be in the experimental category for
a release or two, please write us for more details if you want to
use them.
- Fixed another error (a different one, honest!) in the DXTC code
that could cause color channels to overflow.
- New track binding interface: GrannySetTrackMatchMapping. This allows
you to explicitly map granny_transform_tracks to granny_bones for
situations that GrannySetTrackMatchRule can't handle. This is also
considered experimental until we get feedback from the folks that
requested it.
- Fixed an edge case in which loading an old (< version 2.7) .gr2 and
then setting the StringDatabaseCRC member of the granny_grn_file_header
could corrupt memory. Basically no one would ever have run into
this, but we're paranoid around here.
- Added a sizeof(enum) == sizeof(int32) check to granny.h to prevent
alignment problems in our packed structures.
- Fixed a problem in the "CleanMaterials" preprocessor command for
deep material graphs.
- Compatibility Note: GrannyFixupFileSectionPhase2 arguments changed.
- Compatibility Note: GrannyMaximumSectionCount. This is currently
set to 32, and defines the maximum number of sections supported by
the Granny file format. The current default section layout uses 8
sections, so this is anticipated to provide a safe margin.
- Fixed a rounding problem that could leave the last frame of
keyframed curves unavailable for certain Duration/Timestep
combinations.
- Fixed a bug that caused S3TC textures to have invalid granny_pixel_layout
members on export.
- You know the beta? Yeah, from those guys. Yup, that one. The
exporter supports it.
- (internal) Changed the way GrannyLoadMarshallingArray and
GrannyLoadFixupArray work to allow them to be read in externally.
- (internal) Added some missing memory operations.
2.8.21.0 release 2009/06/05
Fast turnaround on this release to correct two serious exporter
problems, one crash in 3ds Max, and a bad tangent extraction path in
Maya.
- Fix an out-of-bounds access error in Max.
- Fixed an error in the DXTC code that could cause color channels to
overflow when matching a pre-existing DXTC block.
- Fix a problem with command-line or double-click loading of .gr2
files in the viewer.
- Transform ordering issue fixed in the retargeter.
- The object listing panes in the viewer will now tell you the source
.gr2 for the model, mesh, etc. for easier debugging.
- Move tool tangent extraction in Maya to MSpace::kWorld.
- You can now position the camera at the location of in-scene cameras
in the Granny viewer. Look for the collapsed "Scene Cameras" menu
item in the Animation and Mesh inspection menus.
- (internal) Matrix mul inline handling fix.
- (internal) viewer_model variables supported in Viewer scripting.
2.8.20.0 release 2009/06/01
- Worked around a problem with the cloth modifier in 3ds Max.
- New sample for the preprocessor: "CombineRigidMeshes", which turns
rigid meshes that share a material into a single skinned mesh.
- Added a Wii accelerated BuildPositionWorldPoseOnly path.
- Added a Wii accelerated deformer for GrannyPWN323VertexType.
- "Zoom to mesh" context command added to the viewer. (Thanks to
PaulV for the idea!)
- Fixed a command-line bug in the viewer that caused "-set/clear"
arguments to be overwritten for a subset of the variables.
- New sample preprocessor command "MergeRigidMeshes".
- Preprocessor commands will now try to preserve the platform setting
of the input file. If you set the exporter to create 32-bit
big-endian files, the preprocessor now tries to preserve that at
all times.
- Added a flag to the Maya exporter script command to suppress the
crash dialog. (-nc/-noCrashDialog) In long batch sessions, Maya
can wind up consuming too much memory to allow even small scenes to
export properly, this allows an unattended script to handle the
exception. (Will add this to Max/XSI exporter on request.)
- Fixed an oversight in the "RemoveNamespace" preprocessor command
that left granny_mesh bindings untouched.
2.8.19.0 release 2009/05/18
- Fixed an XSI problem with synthetic root bones.
- Fixed a Max plugin bug in the Skin modifier extraction.
- Added ExtendedData members to granny_model and granny_skeleton.
- You can now add and delete passthrough edges to Callback nodes in
the Blend Graph editor.
- Added GrannyPreserveEmptyMaterialGroups to the granny_mesh_builder API. Does
pretty much what it says, it allows you to keep empty material
groups intact.
- Added GrannyAddBoolArrayMember function for the granny_variant_builder
interface.
- Corrected unit tests and tree_walker tutorial for array inline
members.
- (internal) GrannyInlineMember types in granny_data_type_definition are now
allowed to have non-zero ArrayWidths.
- Fixed a potential string overread in the granny_track_group and granny_skeleton
rule-based matching.
- Bring back the Maya 8.0 build.
2.8.18.0 release 2009/05/04
- New blend graph node: Callback. This node type (hat tip to BartM
for the suggestion) acts as a passthrough when no callback is
installed. When a user callback is installed, it has the option to
modify or generate the result returned.
- Added a timeline reset button to the Blend Graph editor for
convenience.
- Change the way unconnected nodes return default results. This
simplifies error handling, since returning NULL from a node's
Sample routine will yield a valid pose at the call site.
- Fixed a crash bug that could be triggered by meshes in 3ds Max with
0 verts.
- Sequence and Animation nodes now respond to "Duration" as a
GetFloat query. Use as "Duration_[idx]" where "[idx]" is the index
of the output edge on the animation node. (Since Sequence has only
one output in all cases, it will respond to either "Duration" or
"Duration_0".)
- Bring back the output activation action. It's on "Alt-Left Button"
now that rename is on middle-button for consistency.
- Additional mouse handling in the Blend Graph editor.
- You can now rename edges in the blend graph. This allows for more
natural interpretations than endless "Output"/"Input" edges.
- Fix some needless complication in the morph target tutorial.
- (docs) Corrected a bug in the sample code for the blend graph.
- (internal) Added a new parameter check.
2.8.17.0 release 2009/04/28
- Added new internal API for determining the "most influential"
source node in a blend graph, GrannyFindMostInfluentialNode.
- Prevent a mask input from being double sampled in the Blend graph
node.
- Added support to the poseanimsource node for finite loopcounts as
well as loop clamped sampling.
- New Blend Graph node: TimeShift. It's one node that does the work
of 10! Plays child nodes backwards, forwards, single frames,
subsections, and more! How much would you pay for this node?
- Fixed a layout bug in the animation source parameters.
- Added a preprocessor command "GenerateTangents". This preprocessor
command correctly computes morph delta tangents while maintaining a
locked topology between base mesh and its morphs.
- Corrected a scene walking error for Maya materials. Depending on
the connectivity in the Hypershade graph, a HLSL nodes texture
inputs were ignored in certain cases.
- Added a demo script for exporting multiple animations from a single
file to Export Scripting: Max.
2.8.16.0 release 2009/04/13
- Blend graph editor can now select sub-animations for pose source
nodes. I.e, if you have a .gr2 that contains 4 walk cycles, you
can select an animation other than the first now.
- Viewer now can filter the contents of the listing pane based on a
query string. The viewer uses iTunes-style filtering (space
seperated terms, all terms must match) and can apply the results of
the search to the scene, if desired.
- granny_transform API GrannySimilarityTransform wasn't resetting the transform
flags, which is a potential bug. Fixed.
- Added GrannyGetDag2NodeFloat as a complement to GrannySetDag2NodeFloat.
- Hey Granny, get with the (still fairly old) times! Preprocessor
project now uses VS.NET 2005. Variadic macros finally did the
trick.
- Blend Graph Editor will correctly prune unused sources when they
become unreferenced in the DAG.
- Hey, what do the WASD keys do in the viewer? The right thing, now.
- Added a "Spin Camera" mode to the viewer to allow spinning around
the current, rather than target position. You can switch to this
mode with the "e" key. ("q" switches back to orbit scene.)
- Integrated new version of stb_image, fixed a small conditional bug
in one of the PNG write branches.
- Fix motion extraction for sequence blend nodes.
- Compatibility Note: If the "Reduce curves where possible" is
checked, and "Compress animation data" is unchecked, the exporter
will create identity and constant tracks in addition to keyframes.
The previous behavior would (erroneously) create keyframes for
perfectly unchanging tracks.
- Compatibility Note: GrannyBindDag2Sources now takes a UserData
pointer for easier mapping to lookup structures on the callback
side. granny_dag2_source_callback has been modified to reflect this
change.
- (internal) Improved key handling for viewer.
- (internal) Easy creation of multi-output scalar source nodes.
- (internal) Changed and reautomated the build process for the
viewer.
- (internal) Unify listing colors
- (internal) Colored string drawing in the viewer
- (internal) Make SetString in the viewer behave a bit more politely.
- (internal) Fix INIT_EXTERNAL_OUTPUT_EDGE macro for multiple output
case.
2.8.15.0 release 2009/03/16
- Added GrannyIsDeformerAccelerated function to allow easy checking if
you're hitting the vectorized paths for granny_mesh_deformer creation.
- Replace PS2 assertion function with SCE inspired version.
- Updated documentation section:
Granny Data Loading Overview: File Reading Callbacks to reflect new
GrannyInitializeFileReader arguments.
- Updated Granny Files, Raw Files, Compression, Sections, and All That Stuff: Converting Strings to Indices.
- Fixed linker warnings in the Xenon libraries.
- Preprocessor unit tests added for the basic commands. Note that
this necessitated the next item...
- Compatibility Note: Preprocessor granny_memory_arena macros
renamed to avoid collision with the "official" Granny versions. In
your preprocessor commands, if you are calling these macros as
"ArenaPush...", simple change the call to "Push...".
- Fixed a crash that could occur when CAT objects in Max were
miscategorized as triangle meshes, rather than bones.
- (internal) Many documentation updates and tweaks.
- (internal) Rectangle objects recognized in Max object classification.
- Compatibility Note: Moved undocumented
GrannyClipRootMotionVectors to the source API. This function
depended on deprecated GrannyClipPositionDOFs APIs (moved to source
API in 2.8.8.0).
- Note: Added plugin support for the RC3 version of Renoir. These
exporters are not yet officially supported.
2.8.14.0 release 2009/03/02
- PS3 Platform now ships with a default malloc allocator.
- Change PS3 atan2f function to use the library versions.
- (internal) Rename GetReal32AlmostInfinity() to
GetReal32VeryLarge(). Add GetReal32Max() to distinguish between
the two cases. VeryLarge is intended to return a value that won't
tip over into +Inf at the slightly provocation.
- (internal) GetReal32QuietNaN() was returning a slightly incorrect
bit pattern.
- (internal) Fix up PS2 target.
- (internal) Port new unit test suite to Xenon/PS3.
- (internal) PS3 logs from the file subsystem were returning ANSI
codes rather than PS3 codes.
- (internal) Strict aliasing fixes in the granny_curve2 and S3TC code.
2.8.13.0 release 2009/02/24
- In certain cases, HLSL texture inputs wouldn't be exported as
Granny textures. Fixed.
- Fixed several bugs in the "ExtractStrings" and "RemapStrings"
preprocessor command. Thanks to Bastian Clarenbach for catching
these.
- Corrected some half-pixel drawing errors.
- granny_pose_cache will now return granny_local_pose objects with exactly
the correct bone count. This prevents some spurious failure cases
in GrannyCopyLocalPose in the original blend dag.
- (internal) strict aliasing on PS3.
- (internal) New function GrannyCopyLocalPoseBoneCount.
2.8.12.0 release 2009/02/17
- Fixed a memory leak in the platform conversion code.
- Added a UserData parameter to granny_mirror_name_callback.
- Granny documentation has been translated into Korean!
- Better Blend editor node renaming. With cursors and everything!
2.8.11.0 release 2009/02/12
- New Blend Graph node: Selection.
- Factor out some duplicated code in the preprocessor.
- New preprocessor sample command to filter vector tracks. Very
handy for removing tracks that are redundant derivatives of other
tracks. (Quite common in Maya and Max materials.)
- Fixed a crash in the preprocessor on command failure.
- Prevent excessive (and unnecessary) warnings spamming the export of
non-native file types.
- Default handling of MoveToOrigin with new Maya/Max files was
incorrect.
- Fixed a nasty memory leak in the granny_pose_cache.
- Slight update to the list of #define requirements in Building Granny from Source.
- Compatibility Note: A distribution script error was placing
the libraries and DLLs for Granny in the wrong place. This has
been corrected, but be careful when upgrading to this version to
remove your old "bin" and "lib" directories, rather than
simply copying the new distribution on top of them. This will
prevent out of sync header/lib/dll errors.
- Unsupported beta version of the animation mirroring feature added.
This will be properly supported and documented in the next release.
- Fixed a spurious assert in the blend graph allocator.
- (internal) Factored out some granny_transform functionality.
- (internal) integer clamp function.
2.8.10.0 release 2009/01/27
- The granny_mesh_builder API will now correctly set the bone indices for 0
weight vertex slots to the index of the first non-zero weight.
This matches the behavior of GrannyOneNormalizeWeights, and is better
for both GPU and CPU deformation.
- Added the ability to use granny_real16 or granny_real32 data types for bone
weights.
- New preprocessor sample: very basic .OBJ format importer for mesh
data.
- Fixed an inconsistency in the handling of GrannyVariantReferenceMember
variables on write out. This caused problems only when doing a
platform conversion.
- Shuffle around the way preprocessor commands are registered for
simplicity. A new type of command "Empty", that starts from a
blank slate rather than an existing gr2 file is added.
- Correct a 3dsMax morph export problem.
2.8.9.0 release 2009/01/20
- Corrected an alignment problem in the fixed allocator that caused a
crash bug that only manifested in the release build of the library.
- Fixed a bug in GrannyUpdateWorldPoseChildren that was affecting the IK
solvers.
- Tweaked GrannyOneNormalizeWeights to correctly set [1, 0, ...] weights
for vertices with 0 weight arrays. This can happen if you convert
a rigid format to a skinned format. Previously, the array would be
set to [1/N, 1/N, ...] where N is the number of weights per vertex.
2.8.8.0 release 2009/01/15
- The Granny viewer can now step through the granny_morph_targets of a
granny_mesh. Right-click in the Mesh Listing Pane to access the new
commands.
- The Maya exporter will now try to export blend shape modifiers from
polygon source art. We still recommend that you triangulate your
mesh before applying morphs to avoid surprising edge turns, but
this may help with existing art, or where triangulation cuts
against artist practice.
- Make the connection between nodes and parameters a little clearer
in the Blend Graph editor.
- Move GrannyGetVertexComponentCount and GrannyGetVertexComponentIndex into the
undocumented API. Really, the only safe thing to do with these
function is already done by GrannyGetVertexComponentToolName.
- The Granny document generator wasn't linking the return value type
in the same way as parameter types. So for example, granny_curve_builder
wasn't linked to GrannyBeginCurve in the "Functions" header. Fixed.
- Compatibility Note: Removed useless Offset paramter from
GrannyCreateMemoryFileReader.
- Compatibility Note: GrannyClipPositionDOFs and related functions
removed from the public API. Root motion clipping has also been
removed as an externally settable option from the exporter
interface. The correct way to clip DOFs from root motion is to use
a Synthetic Root Bone. This is a transitional step to removing
these functions entirely.
- Compatibility Note: Removed the CRC functions from the
public API.
- Ported over the Granny unit testing from the speculative branch they
were stuck on. Several uncovered bugs fixed.
- Fixed a small bug with seeking a memory-based granny_file_writer.
- Prevent a div by zero error in the viewer.
2.8.7.0 release 2008/12/17
A couple of minor fixes and enhancements for the end of the year in
this release. Happy holidays!
- Attributes created in derived nodes from Maya plugins report
themselves as non-dynamic (i.e. not user-created), which prevented
the exporter from checking to see if a granny_vector_track was needed to
animate them. Fixed.
- Added accelerated deformers to the Wii for granny_pwnt3132_vertex.
- Prevent Max spline objects from appearing in the export as empty
granny_meshes.
- Fixed a reference leak in the "RemoveElements" preprocessor
command.
- Fixed a mesh export problem with world space modifiers in Max.
- Altered curve allocation to zero fill padding elements rather than
leaving them uninitialized.
2.8.6.0 release 2008/12/04
- This release is a hot fix for the Blend Graph blend node.
- A bug relating to Morpher modifiers without external targets has been fixed in the Max plugin.
- XSI 7 support added.
- New Blend Graph node: Sequence. This allows multiple animations to
be chained together simply. Future versions will support one-shot
playback, controlled cross-fade blends, etc.
- Viewer will now attempt to bind meshes that aren't explicitly
referenced by model. This can be helpful if you segregate your
model and mesh files into separate gr2s.
2.8.5.0 release 2008/11/24
- Factored out the special case fast paths for orientation curves in
the Xenon and Cell targets so that all platforms can use them.
This resulted in huge speed win on some of the other platforms,
most notably the Wii. In addition to the 8bit fast path, a 16bit
orientation fast path was added for the second most common curve
type.
- Started adding accelerated deformers for the Wii. For right now,
Granny has accelerated pathways for GrannyDeformPositionNormal for
vertex types granny_pwnt3432_vertex and granny_pwnt3232_vertex. Let us know if
we're not handling your game, and we'll add that path to the list!
- SSE, Altivec, and Pair single matrix routines now used to back
GrannyColumnMatrixMultiply4x3 and its relatives.
- Changed the time display on the Blend Editor so that the current
time is always centered in the display.
- Sped up the GrannyBuildWorldPose path in the Wii target by about 25%.
- Compatibility Note: Removed the Build.*NoComposite
granny_world_pose APIs. (GrannyBuildWorldPoseNoComposite[LOD|Sparse])
This is now controlled automatically, you should use
GrannyNewWorldPoseNoComposite API to create a granny_world_pose object that
doesn't have a composite buffer.
- New preprocessor command: RemoveNamespace, which will strip a Maya
namespace prefix from Models, Skeletons, and Animations. This
makes it much easier to deal with references in animation files.
- Added commands to the Max and Maya exporters to allow you to
specify which bone should be the Synthetic Root Bone.
- Fixed a bug in the max exporter in which a NULL bitmap could be
queried for its name, causing a crash.
- Updated Japanese documentation.
- Compatibility Note: Signature of the granny_track_sampler typedef
has changed. This is not anticipated to cause any problems in
client code.
- Added GrannyNewSkeleton.
- Projects added for Visual Studio 2008.
- Fixed an error that both prevented certain attributes from
animating correctly on Lights, Camera, etc., and also caused
duplicate values to show up in the "LightInfo"/"CameraInfo" section
of the granny_bone::ExtendedData attribute.
- Fixed a binding problem in the viewer that could cause "Animation
Only" files not to properly bind to available models in the scene.
- Fixed a bug in the Blend Editor that could occur when an invalid
animation file was set on a source node.
- Added a #define to control individual CheckParameter macros. This
can save 10-15k of string space in the final library build.
- Fixed the Max exporter to correctly extract triangle annotations
from non-triangulated objects.
- Better logging from GrannyPlayControlledAnimation on failure.
- (internal) Corrected an error in the exporter coordinate space
converter.
- (internal) Fixed a memalign() argument reveral in the PS3
tutorials.
- (internal) Fixed bad test in RenameElement.
- (internal) Greatly simplified the granny_world_pose building pathways in
all targets.
- (internal) Fixed an indexing bug in the internal accelerated path
for building granny_controlled_pose output.
- (internal) Expose undocumented matrix inversion.
- (internal) Up the number of allocs per block in granny_pointer_hash to
cut down on alloc storms during file versioning.
- (doc) Fixed a bug in the granny_log_callback section of Granny Utility Function Overview.
- (doc) Updated Notes on CPU and Memory Performance Optimization and Advanced Animation
2.8.4.0 release 2008/10/23
A lot of changes in this release, but two big items deserve special
attention. First, the Blend Graph Editor is now an official, fully
supported part of Granny! No more dag_beta releases. Thanks to
everyone who contributed suggestions and test-drove the tool for us.
Please keep the suggestions coming, we're not done working on it by a
long shot.
Next, we now have documentation in Japanese for all Granny releases,
and we have opened a local sales office in Tokyo. Please contacts us
at sales3@radgametools.com for
more information.
- Blend Graphs will now version properly across Granny release.
- Animation Nodes in the Blend Graph Editor can now source multiple
animations. This should help clean up the "source" side of the
graph. A similar change was made to the scalar source nodes to
allow collecting of related parameters into a common location.
- Animation Node output edges will be named with the root name of the
animation they source, for better UI hinting.
- When writing raw files, it was possible for the section alignment
to not be correctly reflected in the file. Fixed.
- If you drag a .gr2 onto the Blend Graph Editor, a new animation
source will be created in the current sub-graph level.
- Updated Blend Graph documentation.
- Added a facility to allow custom nodes to be incorporated into the
versioning system.
- GrannyRebasePointers has been optimized for both speed and memory usage.
- Added Maya 2009 (including x64) support.
- Adding/removing inputs and outputs from subgraph nodes supported.
- Added the ability to reload animation sources for quick turnaround
of changes in the Blend Graph Editor.
- Viewer mesh options now have an action that tries to hide all
placeholder meshes that Max generates for bones.
- New tutorial: Multithreaded loading and sampling: multithreading
- Added some extra debugging checks to the granny_track_group sampler
acceleration flags.
- Added an export option to protect constant vector tracks from being
removed from the resulting granny_track_group.
- Added functions GrannyAll16SwizzleWii, GrannyARGB8888SwizzleWii, and
GrannyS3TCSwizzleWii, for texture swizzling on the Nintendo Wii. The
first two are replacements for GrannyAll16SwizzleNGC and
GrannyARGB8888SwizzleNGC, which are now deprecated names, but still
supported. Hat tip to Loose Cannon Studios for pointing out the
missing S3TC swizzle.
- The Granny Preprocessor now contains thumbnail sketches of all the built-in
commands that ship with the preprocessor. This is far more useful
than the header file comments used previously.
- New export flag "Full mip series", which computes mips for
non-square textures all the way down to 1x1 pixels. Previously, a
256x128 texture would always stop mipping at 2x1.
- New sample preprocessor commands, recompress_anims_sample.cpp and
compress_vert_sample.cpp.
- Changed the way mip-levels are added to a granny_texture_builder to allow
sampling down to a 1x1 image for a non-square texture.
- Fix export of animated compound attributes in Maya.
- Maya export now supports filtering extended data attributes with the
"-filterAttr" flag for GrannyExport.
- Tree walker tutorial now a bit more robust for production usage.
It can accept arguments controlling large array printout as well as
files remapped to a granny_string_database.
- Handle 16-bit floats in tree-walker example and the viewer.
- Fixed a table entry that was preventing the SSE version of the
4-bone Normal/Tangent/Binormal deformer from engaging.
- New spline samplers for generalized
granny_vector_tracks. GrannySampleBSpline3xN, GrannySampleBSpline2xN, etc.
- Compatibility Note: The grn2gr2 utility to convert files
from Granny 1.x format to Granny 2.x format will no longer be
distributed with the default SDK. Please write us if you need a newer
version of this tool.
- Compatibility Note: Granny's binary distribution now ships
by default with multithreading enabled on all platforms which
support it. (WinXX, Xbox 360, PS3.) This means that the memory
allocator will be fractionally slower in the default build to
account for the acquisition of the memory lock. Note that to
enable the debugging checks with GrannySetAllowGlobalStateChanges, you
will still need to compile from source with GRANNY_THREAD_CHECKS
defined, since this adds non-trivial overhead to most calls to the
Granny API.
- Compatibility Note: Removed mip control options from the
exporter. These are much more sensible, and easier to control in
the pipeline as preprocessor commands.
- Compatibility Note: Removed underused texture formats from
the exporter to simplify the interface. These may still be created
using the preprocessor.
- Compatibility Note: GrannyBuildCompositeBuffer,
GrannyBuildIndexedCompositeBuffer, GrannyBuildCompositeBufferTransposed, and
GrannyBuildIndexedCompositeBufferTransposed now check their input array
arguments to ensure that the matrices are aligned to at least a
16-byte boundary.
- (internal) Project files are now built such that they automatically
update their reference lists for new versions of Granny.
- (internal) Handle an edge-case in the constant curve detection at
the limits of granny_real32 precision.
- (internal) Corrected a registry key creation failure in the plugin
installer.
- (internal) Removed DirectX 8 tutorial from the default build list
for Tutorial.sln, since d3d8 is apparently no longer part of the
default DirectX SDK distribution. The tutorial is still
distributed if you would like to add it into your DirectX 8
compatible build environment.
- (internal) Simplified the preprocessor project, cleaned up some
warnings in VC2005.
- (internal) Clean up warnings exposed when building the tutorials in
VC2005.
- (internal) Fixed a crash bug in the Maya exporter relating to
numeric array attributes with length greater than 4.
- (internal) Threading debugging checks were using the wrong
granny_log_function signature.
- (internal) Fixed a bug in GrannyRebasePointers with inline data members
that begin at offset 0 in the containing structure.
- (internal) GrannyResortTrackGroup will now correctly handle
granny_track_groups with LOD Error values.
- (internal) Parameterized alignment for granny_file_writers.
- (internal) Fixed S3TC mip-stride computation for small textures.
- (internal) Blend Graph Editor now a fully self-contained
executable, there's no need to store or keep around the source LUA
scripts or images.
- (internal) Fixed a problem with disconnecting internal inputs of a
subgraph.
- (internal) Accelerated node function dispatch.
- (internal) Memory leak fixed in Blend Graph model file loader.
- (internal) clean up globals in the menu system, improve appearance.
- (internal) DAG representation switched to indices, rather than
direct pointers. This complicates everything but the DAG
versioning.
- Generalize the font system for the Blend Graph Editor.
- Added documentation for GrannyReal16ToReal32 and GrannyReal32ToReal16.
- Added documentation for granny_retargeter API.
2.8.3.0 dag_beta 2008/08/13
This will be the last dag_beta release.
- Fixed a display bug in the Blend Graph editor that only manifested in Vista.
- Major improvements made to the memory requirements for the
retargeter.
- SPU sampler now supports retargeted animations through the
GrannySetSPUTrackGroupBasisTransform API.
- The Max exporter will now embed the name of the source channel into
the granny_vertex_data::VertexComponentNames member.
- granny_skeletons for which Granny can't estimate LOD parameters
are now marked as GrannyNoSkeletonLOD rather than GrannyEstimatedLOD
with granny_bone::LODError members set to 0.
- Fix a bug relating to LOD display in the viewer.
- (internal) Fix release flags in the Linux build.
- (internal) API for determining if a granny_control is rebased added.
- Correct some glaring errors in the Maya version of the track
masking script.
- Correct "WarnScaleShear" preprocessor command.
2.8.2.0 dag_beta 2008/07/03
- Fixed a crash relating to the custom control hook in XSI.
- Fixed a memory leak in the SPU animation paths.
- Fixed an ordering bug with triangle annotations in the exporter.
- Compatibility Note: XSI Exporter will now prefer the
"RealTime" material connection over the "Surface" connection to use as
a granny_mesh's material.
- Trackmasking is now supported by the Blend Graph Editor.
- (internal) Take up new stb_image.c
- (internal) Add some localized material usages strings to the the viewer.
- (internal) Name consistency change for granny_track_mask field.
2.8.1.0 dag_beta 2008/05/30
Hot fix for three serious bugs, one in the exporter, one in the Motion
Extraction on Sony platforms, and a looping artifact fix for SPU
sampling. Please also read the note for 2.8.0.0, everything there
still applies, we're still in open beta on the DAG tool, and looking
for feedback!
- Compatibility Note: Version numbering change. The
convention for Granny releases is now
Major.Minor.Build.Customization. Previously, the convention was
Customization.Build, which was slightly confusing. This alters the
parameter ordering in GrannyGetVersion.
- Fix a bug in the SPU sampling paths for orientation curves that
improperly blended quaternions from incompatible hypersphere
neigborhoods at the animation loop point.
- Serious bug fix for Sony platforms (PS3, PSP, PS2). A parameter
reversal in one of the RAD custom trigonometry routines meant that
motion extraction at the very least was compromised on these
targets. This bug has been fixed, and this is a highly recommended
upgrade if you're shipping a a game on a PlayStation platform.
- Fixed a Max texture handling error that could cause textures with
the same underlying bitmap to export improperly.
- Repair Maya exporter's animated camera/light/particle handling.
- Max meshes now contain a list of sibling instances in their
extended data.
- Max meshes now put the full mesh path, including parents in the
granny_mesh::ExtendedData field.
- You can now attach an arbitrary file to an exported gr2 from either
Max or Maya. The file is attached as a raw byte array to the
granny_file_info::ExtendedData member. Use with either 'GrannyExport -f
"attachFile" "fileName.gr2" in Maya, or 'GrannyExport
"fileName.gr2" attach:"attachFile"' in Max.
- Altered the SPU SpeedCheck demo to allow tweaking the number of
models, as well as turning on and off rendering.
- Fixed a crash bug in the tangent creation process in the exporter.
- Editor Documentation may now be found as "doc/EditorDoc.pdf".
2.8.0.0 dag_beta 2008/05/19
Welcome to Granny 2.8! This is the first public release of the new
Blend Graph Editor. Please let us know what you think of the beta
tool, and send us suggestions for improvements, either in the tool, or
in the runtime API!
- New tool and API: Granny Blend Graph.
- New preprocessor command "AddTexture". This will take a raw image
from disk and poke it into the specified granny_file_info using a given
set of compression parameters.
- Created a new subdirectory of the preprocessor project ("samples")
for storing small commands that aren't quite universally useful,
but can serve as good examples of the sorts of things the
preprocessor is suited to.
- The Max exporter will now record some information about the XRef
status of meshes.
- Fixed an exporter bug that caused meshes to be improperly exported
if they contained 64k+ verts, and "16-bit indices" was turned on.
These meshes are left in 32-bit mode and a warning log message is
emitted.
- (internal) Factored out some functionality from the
granny_controlled_animation motion extraction to make it available to the
DAG.
Changes for 2.7
It's been a busy 2 years since the last minor version bump. As is the
custom, we're going to use up a couple hundred bytes here to underline
some of the major changes that Granny has undergone since the 2.6
release series. As always, the best way to keep up with Granny is to
read the changelog as it is published, but let's hit the highlights.
The top line feature for our PS3 customers is that Granny now supports
asynchronous sampling on the SPUs using mulitple SPU threading models.
This is a fully general replacement for the PPU based
GrannySampleModelAnimations family of functions. Each SPU is able to
handle an animation workload in excess of the PPU in our tests, so
with just part of 1 SPU, you may be able to completely eliminate
animation from your profile on the host processor.
For both the Xbox 360 and the PS3, we've added Altivec math routines
for building final poses, and custom code to decompress the most
important curve types. Every significant LHS stall and fdiv/fsqrt has
been profiled, and where feasible, eliminated.
New platforms added in this release series include Intel-based Macs,
which use the same optimized routines as the mature Win32 target, and
the Nintendo Wii. Early in 2.7, Granny added x64 support, and the
file processing routines got an upgrade to make moving files between
32 and 64 bit platforms seamless.
The Granny Preprocessor is now a full-fledged, production ready tool.
Out of the box, it supports 26 of the most common runtime preparation
operations that most people need to get their content out of Max or
Maya, and into their game. The Preprocessor was rewritten to make it
absolutely trivial to drop in your own operations.
Continuing our goal of "Granny Everywhere", we've added support for 3
new versions of 3ds Max (9, 2008, and 2009) and 2 new versions of Maya
(8.5 and 2008). For the first time, XSI (versions above 5.11) are now
supported! Along with the x64 runtime upgrade, we now support the
64-bit versions of the DCC packages.
In all of these tools, data extraction has been improved. We now
support animation of Camera, Light, and Material parameters through
the same granny_vector_track mechanism used to support custom attribute
animation, Max particle systems are detected and exported, and
visibility tracks are made available to you in the runtime. Morph
modifiers (Morpher in Max, BlendShape in Maya) are now directly
supported, allowing you to extract and animate morph animations
directly from the DCC package. We've added support for the triangle
annotation features found in Max, making it possible to associate
arbitrary bits of data (strings, floats, bools, etc) with the
triangles of your mesh. To make the exporter easier to automate,
there are new scripting tutorials targeted at each DCC package. In
addition, all of the Granny script commands in each package are now
self-documenting.
The Granny Viewer has received a few tweaks as well, some of the more useful features for artist workflow:
- The viewer will now bind animations to multiple models for attachment previews.
- Vertex colors can be separately displayed
- The viewer tries to load external textures for files that reference their bitmaps by name only.
- Drag-and-drop file open support
All of Granny's tutorials underwent a complete rewrite to isolate and
explain one Granny concept. New documentation in addition includes
the Recommended Asset Pipeline, which can help you avoid some common
pitfalls in setting up your export and processing toolchain.
2.7.0.34 final 2008/04/21
- Support for 3ds Max 2009 added.
- New preprocessor command: "ThresholdVectorTrack" which can convert
one or more scalar granny_vector_tracks into a granny_text_track for animation
event handling. This is especially handy for Maya, which lacks the
concept of "Note Track". Boolean or Float animated attributes can
processed into discrete events easily using this method.
- Alleviated a memory exhaustion problem that could occur with large
compound array attributes in Maya.
- Preprocessor command "MakeSPUAnimation" now warns explicitly about
animations that exceed the maximum size limit for SPU dma
transfers.
- New option in the exporter relating to custom attributes attached
to ExtendedData members. If "Only User Attributes" is checked, the
exporter will try to include only attributes created by the user,
rather than attributes specified by the art tool. It's not always
possible to do this with 100% accuracy in all tools, but the
exporter will make a "best-effort" attempt to cull the static
attributes if you don't need them.
- Better guard against crashes in the exporter. Clean up any temp
files created if the exporter fails to be a better citizen.
- Fixed another "touch and die" parameter case in the Max exporter.
- Compatibility Note: granny_pose_cache API has been altered to
both better support new DAG structures, and improve efficiency in
the legacy DAG.
- "Compress" and "Decompress" preprocessor commands will now properly
preserve the section count.
- "RemapStrings" preprocessor command will now work properly with
custom formats. Previously the type of the file would be coerced
to granny_file_info, even when inappropriate.
- AggrAllocations for counted arrays with zero size would previously
return a pointer to memory that was technically owned by the next
component of the compound alloc. These pointers are now properly
zeroed.
- (internal) Allow AggrAllocs to end to an arena directly, without a
two stage placement pass.
- (internal) AggrAllocation functions were being a little paranoid
about zero filling memory that would never be touched. Altered the
behavior to be paranoid only in debug mode and more efficient, but
safe, in release.
- Compatibility Note: granny_log_callback API changed to pass the
source file and line explicitly to the log function, rather than in
the string. This allows for more succinct error reporting in many
cases. If log writing is enabled with GrannySetLogFileName, the on-disk
log file will still contain the file and line number explicitly.
- Compatibility Note: API for retrieving the most serious
message logged thus far removed. This was a very sparsely utilized
API, and the storage for the buffers was not an insignificant
addition to the total size of the Granny library. This
functionality can be duplicated with a custom granny_log_callback at the
application level.
- Exported granny_memory_arena APIs for pushing strings and binary data
chunks, GrannyMemoryArenaPushString and GrannyMemoryArenaPushBinary.
- Compatibility Note: Default memory arena alignment changed
to 4 bytes. Previously, if unspecified, arenas would allocate at
the granularity of the allocator. This is not anticipated to cause
any problems, nearly all allocators return at least DWORD aligned
memory.
- Compatibility Note: In previous versions of Granny, when a
GrannyStringMember field was written out, NULL strings would be
converted into "". NULLs are now properly propagated through the
type IO system for these fields.
- Compatibility Note: Removed obsolete and little used period
loop API from the public definitions.
- (internal) Change granny_string_database remapper to replicate new NULL
string behavior.
2.7.0.33 release 2008/03/24
- Handle kMatrix typed custom attributes in Maya.
- Prevent empty compound type objects from slipping through into
granny_bone::ExtendedData
- Added "texture_name" option to GrannySetValue. This allows poking
values into the Granny export settings by the filename of the
texture, which can be useful in certain situations.
2.7.0.32 release 2008/03/13
- GrannyWindowSpaceToWorldSpace function now recognizes the output Z range
of the granny_camera. Previously, it would assume the OpenGL default
range.
- The Max exporter for versions 9 and above will now allow you to
pull the Max computed tangents from an arbitrary map channel instead
of computing them separately in the same way as the Maya exporter.
- Altered the handling of the DirectX material in 3dsMax to allow
bitmap parameters for shaders to be extracted with custom settings.
Because of the way Max represents these parameters internally,
identical bitmaps will potentially be represented in the final .gr2
multiple times. The preprocessor can be used to clean up these
extra textures. Bitmap parameters in shader materials are exported
as full path filenames, which can be matched to texture objects in
the granny_file_info::Textures array.
- Compatibility Note: The exporter now only supports directly
indexed annotation sets. These are annotations in which the index
map of the annotation takes the triangle or vertex index to the
index of the annotation. This has been the recommended annotation
mode for quite some time, this change remove a confusing option.
The indicator variable remains in granny_vertex_annotation_set and
granny_tri_annotation_set in case you want to use the preprocessor to
switch an element-annotation set back to the annotation-element
representation.
- Max exporter will now extract vector animations correctly from
objects with a non-trivial modifier stack. As a bonus, it will
usually be able to extract animated attribute tracks from the
modifiers themselves as well.
- Fixed a plugin bug in which the face annotation extractor looked at
the wrong Max object to retrieve the channels.
- GrannyCopyLocalPose could conceivably silently write off the end of the
transforms array of the destination pose if
GrannyGetLocalPoseBoneCount(Dst) was less than
GrannyGetLocalPoseBoneCount(Src). This, and an inconsistency with
respect to the internal FillThreshold and TraversalID fields have
been cleaned up.
- Boolean blind data in Maya queried as BoolValue rather than IntValue.
- Corrected the transform flags on the SampleModelAnimsSPU pathway
- Fix a bug in extraction of color parameters in the triangle
annotation section of the Max exporter.
- Fix for an uninitialized pointer access in the Viewer menus.
- Try harder not to touch IParamBlock2 parameters if we're not going
to extract them. In Max, several of these have the undetectable
"touch and die" bit set.
- Change GrannyExtractTrackMask to search all sub-members of the bone.
This fixes an issue that arose after the reorginization of the
ExtendedData member for Max in 2.7.0.22.
- GrannyCopyTextureImage would incorrectly decompress S3TC texture on
big-endian platforms (Wii/360/PS3). Fixed.
- Fix a bug in the SPU animation sampler for granny_controls with
GrannySetControlForceClampedLooping enabled.
- Added a parameter to the Granny casting interface to match the
"Tangent Merge Tolerance" setting from the tangent space generator.
Previously, the caster would always assume the default merge
tolerance. Access with "tangentMergeTolerance" or "tmt" from the
casting script command.
- MakeSPUAnimation was placing type information in the wrong section,
which could cause trouble when the GrannyStandardDiscardableSection was
freed.
- GrannyLocalPoseAlignment macro exported.
- Internal: Retire some older targets from the "Actively Built" list.
- Internal: Allow chaining of granny_local_pose objects.
2.7.0.31 release 2008/02/12
- Compatibility Note: where possible, the exporter will now
pick up the defaults from the global settings for newly created
objects. Previously, any items created after global settings were
changed would get a fresh set of default values, which was a bad
"least surprise" violation.
- Compatibility Note: When morph targets are extracted from a
Morpher or BlendShape modifier, the morphs are now moved to the
base position of the root mesh. This allows artists to line up
head morphemes, etc. next to each other without worrying about
bringing them back in line at export time.
- Exposed the GrannyBeginControlledSPUAnimation API to allow setting
granny_track_masks for SPU sampled animation. New public functions
include: GrannyEndControlledSPUAnimation, GrannySetSPUTrackGroupTarget,
SetSPUTrackGroupTrackMask, GrannySetSPUTrackGroupModelMask. All SPU
functions are direct analogues of their non-SPU counterparts.
- String remapping speed greatly improved.
- Added an option to the exporter to pull the vertex tangents from
Maya rather than generating them in granny_mesh_builder.
- Allow setting viewer toggles from the command line. Toggle buttons
will show they name of their underlying variable in the status line
when they are highlighted, use "-set" or "-clear" to manipulate them
at application startup.
- Fixed the handling of ExtendedData attributes for Max objects with a
non-trivial modifier stack.
- Max attributes of type TYPE_INODE and TYPE_INODE_TAB now export the
referenced object's name when possible.
- Fixed the handling of Point4 attributes in Max.
- GrannyGetWorldMatrixFromLocalPose was incorrectly asserting when a
sparse bone array was present.
- New exporter command "GrannyVersionString" to return the exporter
version in an easily parsed format to allow programmatic version
checking. Hat tip to BobB for the suggestion.
- Added a project to build the Xenon target from source.
- Added GrannyRemovePointerFromHash API
- XSI Export Selected fix
- XSI 6.5 plugin
- Handle XSI texture nodes that are raw ImageClip2 objects without an
intervening Shader node.
- Add GrannyLockValue, GrannyUnlockValue, and GrannyClearAllLocks to the
XSI plugin.
- Fixed an edge case in the GrannyInlineMember case of GrannyRemapFileStrings.
If the inline member began at offset 0 of the containing structure,
it was possible for its strings, and those of any referenced
sub-objects to remain unremapped.
- During file versioning, objects could have their pointers examined
multiple times, which would slow down the version of highly
interconnected data graphs.
- Rare issue in GrannySampleTrackUUULocalAtTime0 with custom compressed
curves. This caused a valid, but non-unit length orientation
member to be set to the LODTransform member, which causes spurious
assertions in the debug consistency checks.
- Fixed a bug in the GrannyReferenceToVariantArrayMember case of the
GrannyRemapFileStrings. In certain cases, this could cause unremapped
strings in unrelated parts of the file.
- Plugin installer for Maya was using short path names in the module
initialization files for historical reasons. In newer versions of
Maya, this caused the "auto-load" flag to fail on the Granny
plugin.
- Added a section to Animation Level Of Detail on using the preprocessor to
compute LOD values.
- (internal) Changed the include structure of the runtime source.
2.7.0.30 release 2007/12/01
- Allow GrannyCompressCurve to handle sample vectors of length 0 or 1.
- New tutorial Model Attachment: attachment.
- "GrannyLoadSettings/GrannySaveSettings" script commands now respond
to a "-s" argument in Maya in the same way GrannySetValue command
does, settings are applied to the current selection only. In Max,
use "GrannyLoadSettingsSelected/GrannySaveSettingsSelected". A
similar change has been made to "GrannyChangeSettings".
- Fixed a problem with uninitialized memory in the Maya exporter
function GetTextureCoordinate. For certain UV mappings with holes,
random stack memory could be returned in the texture coordinate.
- Compatibility note GrannyCurveFormatIsInitializedCorrectly
function signature changed to allow safe calling of this function
when the type information (typically stored in the
GrannyStandardDiscardableSection) is freed. In this case, the
underlying type match will not be done, but the curve will be
examined for a valid format enumeration.
- Max exporter will now generate names for the vertex components in a
granny_mesh::PrimaryVertexData member.
- Preprocessor command "KillUncommonData" removes the extended data
from granny_file_info::ArtToolInfo.
- New preprocessor command "RemoveTextTracks".
- New preprocessor command "RebaseTextureFiles" which converts
absolute texture paths to relative paths, given an applicable base
path string.
- Altered the The Variant API to explicitly warn about accessing granny_variant
objects after calling GrannyFreeFileSection.
2.7.0.29 release 2007/11/21
- Add support for Max 2008
- Alter the "PlatformConvert" command to be able to handle
string-remapped files. You have to pass a parameter of
"-remapped true" to enable the new behavior.
- Fix an error in the string remapper that could leave types for
GrannyReferenceToVariantArrayMember members unmapped.
- Fix the handling of the Composite material in 3dsMax.
- (internal) Alter the type signature calculation for string remapped
granny_file_builder objects.
2.7.0.28 release 2007/11/12
- The GrannySetValue and GrannyGetValue commands now have versions
that tell the exporter to use the current selection set as the
basis for the settings. This ensures that an ExportSelected
command will match the desired value. This is mostly important
when setting global parameters for models or animations. In Maya,
you pass "-s" as the first argument to Set/GetValue, while in Max,
these are separate commands SetValueSelected and GetValueSelected.
- "LODCalc" preprocessor command now supports attachment standins.
See the header file for details on the command format.
- Better previewing of the DirectX material from Max when there is a
sensible software fallback material available.
- Fixed an error in the platform conversion routines that could
exhaust the store of fixup remap table entries by double-inserting
certain classes of pointer fixup.
- GrannyCalculateLODErrorValues is now much faster.
- Fixed an error in the ExportSelected operation of the Maya
exporter. In certain cases, meshes could appear more than once in
the final export, even though they were referenced by only one
bone.
- Maya's MImage class always returns "4" when queried for the number
of color channels, which means that the alpha texture format
specified will always be selected. Added a flag to the exporter
settings to specify that you want the texture scanned for non-1.0
alpha values.
- Fixed a bug in the S3TC encoder that occasionally
manifests when an input block is exactly representable in the S3TC
compressed format.
- (internal) Change the Granny implementation
of radmalloc to return at least 32 byte aligned blocks to be a more
friendly when linked in an application that also uses Bink.
2.7.0.27 release 2007/10/29
This release corrects two serious errors that were recently called to
our attention. It is strongly recommended that you upgrade to this
version if possible.
- Fixed a bug in the GrannyReadEntireFile family of functions that
manifested when the app runs out of memory. These functions could
cause a crash, depending on when the allocator runs out of space.
Several functions like GrannyReadFileSection have been altered to report
errors as part of this change, however compiles should not break as
a result of these changes. There is only one exception in the
undocumented API, reported below.
- Fixed pointer aliasing markup in the Xenon target. Bones with only
positional animation could use a composite matrix that lags one
frame behind the correct value.
- "VertexCacheOptimize" now correctly rearranges vertex annotation
entries to correspond to their new locations, rather than killing
the annotation set entirely.
- Allow the "VertexCacheOptimize" preprocessor command to elide
unused verts in the vertex buffer. Previously this was an assert,
but that's not strictly necessary.
- Bugfix in "RemoveElements" preprocessor command.
- (internal) ClearUnreferencedPointers now clears out unused variant
array types if the count or destination pointer of the array is 0.
This fixes an assertion that would fire on platform conversion.
- (internal) Make sure that all include directives use forward slashes.
- (internal) Loosen up an assert in the granny_stack_allocator.
- (internal) Move granny_mesh_deformer to the header to make it available
to applications building from source.
- Compatibility Note: GrannyLoadFixupArray has a new argument signature.
- None yet.
2.7.0.26 release 2007/09/26
Granny now supports SPU sampling on the PS3! Since this is the first
public release of the SPU code, we're asking (pretty please!) that you
send us feedback if you use the new sampling paths. The new
documentation section SPU Sampling Support details how to setup and sample
animations asynchronously on the SPU.
- New preprocessor function "MakeSPUAnimation", which will create an
granny_spu_animation_info that can be used to create asynchronously-sampling
SPU side animations.
- Significant new feature in the exporter: animated material
attributes. This will allow you to access granny_vector_track curves for
animated parameters like texture transforms, color cycles, etc.
Each material now exposes a granny_track_group option in the exporter
dialog, so don't be surprised by the increased number of objects in
the Animations subsection.
- Allow animated camera and light parameters in Max. If the variable
is contained in the [Camera|Light]Info member of the bone, you can
obtain the animated value from the granny_vector_tracks if necessary.
- Exporter settings dialog box was blowing away custom settings in edit
boxes when higher level settings pages were displayed.
- Fixed a potential stack overflow in the granny_material search functions for
granny_material graphs with cycles.
- New undocumented function GrannyFindBoneByRule to match GrannyFindTrackByRule.
- Exposed GrannySampleTrackUUULocalAtTime0 for use in the preprocessor.
- Allocation alignment in the Blend DAG
- (internal) Rearranged several files to make it easier to segregate
SPU code without bringing in large swaths of Granny.
- Aggregate allocations could return a size that was not a multiple of
the specified alignment. This caused problems for some in-place
allocations. Fixed.
- Added support for Maya 2008 (32- and 64-bit versions)
- Changed the "RemapStrings" preprocessor command to preserve file
section formats and the platform granny_grn_file_magic_value, which
allows it to be used as the last command in the preprocessor chain.
- Fixed a bug in the the 3DSMax Physique parser that only affected
the 64-bit plugin.
- Fixed a bug in the data type IO system which caused type coalescing
to conflict with string remapping.
- If a sub-object of a granny_data_type_definition described object was
NULL, it was possible for the ReferenceType pointer to be left
unremapped, leading to problems for tools that walk the entire
metadata hierarchy of a granny_file.
- The exporter in 3DSMax will now strip granny_bone_bindings from
granny_meshes when the referenced bone does not affect any vertices in
either the PrimaryVertex data or any Morph targets. An option has
been added to the "Meshes" section, "Preserve Bones affecting no
verts" to allow you to select the old behavior.
- Fixed a Bink texture compression crash in the x64 target.
- 64-bit exporter plugins now respect the Oodle1 compression flag.
- Fixed a problem with the image scalers in the 64-bit target when
passed an image with a negative pitch. (Maya images, or old-school
BMPs, for instance.)
- (internal) Aligned up granny_model_control_binding, and cache the binding
type in the alignment member.
- (internal) Add a cached pointer to the instantiated granny_skeleton to
granny_model_instance to improve flexibility and alignment.
- (internal) granny_controls will now be allocated on 16 byte boundaries.
- (internal) Moved some string buffers from global scope to local scope.
- (internal) Dead code elimination.
- (internal) Take up the new version of stb_image.c for bugfixes.
- (internal) shuffled the floating exceptional values.
- (internal) Fix a nasty bug in GrannyLinearBlendTransform
- Warn about sizeof(bool) problems in System Dependent Types.
- Guard against NULL granny_model::Skeleton member in GrannyInstantiateModel.
- granny_fixed_allocator blocks are aligned by default to 16 bytes.
This does not affect the alignment of chunks allocated from within
those blocks, they are aligned to the native structure size.
2.7.0.25 release 2007/08/08
- Optimized GrannyCopyMeshVertices and GrannyConvertVertexLayouts for common
cases. Previously, copying the verts involved a number of string
compares on a per-vertex basis, which is obviously bad. Now a copy
plan is created when the function is first called, and if the types
are amenable, no work other than memory shuffling is done
per-vertex. Tests show this to be 10-20x faster than the old
method on typical vertex buffers.
- Port the Xenon math improvements to the PS3.
- New tutorial TutorialScriptingXSI (along with SetValueDocs_XSI).
- New document section Recommended Asset Pipeline, which answers the
burning question: if Granny herself was writing your toolchain,
what would it look like?
- New PS3 example: ps3_speedcheck, which demonstrates how to
implement threaded animation sampling on the PS3 using the pthread
library. Found in the "tutorials/platform" directory of your
distribution.
- New exporter script function "GrannyClearAllLocks", which removes
any setting locks, regardless of location in the settings
hierarchy.
- Align granny_local_pose elements to 16 bytes. GrannyNewLocalPoseInPlace will
now fail if passed a Memory argument that is not aligned to 16
bytes.
- Fix the export of array numeric attributes in Maya.
- Certain ExtendedData members such as those for granny_meshes were
having their inclusion flag in the exporter overriden by the
"Include data in export" flag, which was incorrect, and confusing.
Fixed.
- For transform nodes with shapes that will not be exported as meshes
in the Granny file, attributes on the shapes are now dumped into a
"ShapeInfo" member in the ExtendedData block of the appropriate
granny_bone, so they're accessible to the toolchain. Geometry nodes
still export their attributes to the granny_mesh. Light, Camera, and
ParticleSystem nodes are unaffected by this change.
- Fix for the curve rebaser. In rebasing curves with scale/shear
transforms, incorrect commutation factors were being picked up by
mishandling of the rotation and scale channels.
- Make the preprocessor place types in the standard discardable
section in all cases. This makes it possible to always dump the
types at runtime, which is a significant memory savings.
- Improve the fast math ops for Xenon and Cell, particularly the
fast div.
- Added GrannyAddIntegerArrayMember function for the granny_variant_builder
interface.
- Add GrannySetArenaAlignment to allow for aligned granny_memory_arena
allocations.
- Fixed an error in the boolean handling of the XSI plugin.
- (internal) Small fix for a radbase interface layer.
- (internal) Add VBScript commenting conventions to the doc
extraction tool.
2.7.0.24 release 2007/07/09
- Fix up the Mac version of the OpenGL tutorial to prevent the
skinned shader from falling back to the software path.
- New preprocessor command: "RemoveUnchangingTracks". This command
replaces the (removed) exporter option "Store Unchanging Tracks".
- New preprocessor command: "RenameElement". This allows you to
rename an granny_animation, granny_model, granny_mesh, or granny_material from the
command-line, which makes multi-animation combo files much easier
to create. (As well as multi-model, etc., of course.)
- Add triangle annotation for 3DSMax9.
- Fix for the shader compilation in some of the tutorials.
- New exporter option for granny_vector_track exports: "Don't oversample
vector tracks", which turns off oversampling for just the custom
attribute and visibility track animations. This allows better
control over creases and jumps in those curves in certain cases.
- Maya will occasionally write an unrecoverable data attachment in
.ma files. This can lead to problems changing the settings in the
loaded file. (Settings will be correct for export, but won't
persist properly when the maya file is saved.) The exporter now
detects and removes these attributes when it can, which loses the
settings attached to that node (since they were never written to
the .ma file in the first place), but allows the file to be
correctly saved with new settings.
- Protect visibility tracks in Max from elision when they are
constant.
- Change the way meshes that are referenced by more than one
transform node are handled. Previously, these meshes would show up
under only one node, which is obviously incorrect. They now appear
under each referencing node, and (for the moment) are represented
as distinct geometry objects.
- New exporter option to use the full pathnames of meshes, rather
than the minimally unique string. This mostly affects Maya; the
XSI and Max exporters already use full pathnames.
- Fix some blank ExtendedData members in the Maya exporter.
- Clean up the XCode projects for the tutorials. Fix the working
directory behavior such that they run unmodified out of the box.
- Fix a small printing error for inline members in the tree walker
tutorial.
- Xenon sample converted to Visual Studio 2005, and updated to the
latest Granny and XDK version.
- Simple speed check sample included to demonstrate multithreaded
sampling on Xenon. (xenon_speedcheck in the "tutorials/platforms"
directory of your distribution.)
- Small fix in the texture loading and material mapping paths of the
DX9 Rendering example.
- Rearrange the way that normalized curves (read: Orientations) are
normalized in the sampling path. This prevents some duplicated
work that was occurring in older builds.
- Fix the "[De]Compress" preprocessor command so that it works
correctly on files of non-native platform type. GrannyRecompressFile
is now explicitly restricted to files of type of the executing
platform to prevent similar errors. The operation of this command
can be emulated using the granny_file_builder interface.
- Xenon-specific decompressor for the D4nK8u curve type.
- Add some math ops specific to Xenon to eliminate fdiv and fsqrt
instructions that can stall both hardware threads on a core.
- Fixed a bug with shared identity curves. Curve Dimension could be
misreported in certain cases.
- (internal) Fix a rare exception case in the exporter.
- (internal) New undocumented function: GrannyDegreesFromOrientationTolerance.
- (internal) Dead code elimination in the exporter
2.7.0.23 release 2007/06/06
- Hot fix for a material parsing problem in the Maya plugin.
2.7.0.22 release 2007/06/05
- New tutorial: Simple IK: ik_2bone.
- Compatibility Note: Max custom attribute blocks reorganized
for scalability reasons. A side benefit is that it's easier to
find and extract your custom attribute blocks, but existing
extraction routines will need modification. Attributes that
previously could be found inline in ExtendedData chunks will now be
in sub-object blocks.
- Optimized the platform conversion routines to eliminate a bad
linear search in huge files.
- Fix the DDS loader to prevent a crash when the dwLinearSize
parameter is invalid.
- Added some logging to GrannyNewMeshBinding to warn when bones are not
found in the target granny_skeletons.
- No longer build Max 6 or Maya 5 plugin by default. If you need a
fresh version of the Granny plugin for these tools, please contact
us.
- Fixed an error in the Wii platform sample, for the case that the
sample scene is replaced with a file containing textures without
alpha.
- Cleaned up several string comparisons with proper callback check.
- A granny_stack_allocator now returns the address of the new element from
GrannyNewStackUnit, rather than a bool indicating success. This
eliminates the need to follow the call with GrannyGetStackUnit, which
was silly.
- Exporter allocates settings items from a granny_stack_allocator, rather
than a granny_memory_arena, which cuts down on the number of allocations,
and helps prevent fragmentation in large files.
- Filter granny_mesh::MaterialBindings such that only bindings referenced
by a group in the granny_tri_topology are included. This saves a bunch
of space for files that use a few Max multi-sub materials as a
material library.
- Fixed a flag error in GrannySampleTrackUUULocal. Scale/shear was
checking the Orientation curve flag for constant.
- Exporter reverts to using on-disk temporary buffers, rather than in
memory. It was bumping up against VM fragmentation issues in large
exports.
- Eliminate granny_variant copies from written files if the types are
identical at write-time. This saves quite a bit of space in the
ExtendedData members of large files, since the created variants
tend to be largely the same in any given Max/Maya file.
- New convenience function GrannyBuildRestLocalPose to fit with
GrannyBuildRestWorldPose.
- (internal) Fix system include directive.
- (internal) Handle a memory exhaustion case in the RAD container.
2.7.0.21 release 2007/05/17
- Fix a normal map crash in the viewer for meshes with no bound
materials.
- Viewer will now attempt to load images for files with valid
FromFileName members, but no pixel data. Hat tip to David Whatley
at Simutronics for the idea. Thanks to Sean Barrett for his
awesome public domain JPEG and PNG loading code.
- Compatibility Note: GrannyTransformVertices takes an extra
parameter to indicate that the vertices represent deltas, rather
than absolute values. This changes the way they should be treated
when transforming to a different coordinate system.
- Corrected a data loading problem for very old versions of Granny.
2.7.0.20 release 2007/05/14
- Compatibility Note: granny_camera member EAR renamed to
ElevAzimRoll. The previous name, EAR, collided with a #define on
one of the supported platforms.
- Added the ability to change the encoding settings of the vector
tracks associated with custom user attributes, or visibility tracks
attached to tool bones.
- Fixed behavior of IgnoreMismatchedTail in GrannyNewMeshDeformer. In the
case of completely mismatched tails, those with no prefix in
common, the tail should be completely ignored. Before this fix, no
deformer would be returned.
- GrannyOneNormalizeWeights will look for 0 weights, and replace the
corresponding index with the index of the first bone weight. This
is more cache-efficient than the previous strategy of 0-filling,
which could cause unused matrices to be accessed by deformers or
shaders.
- Simple makefiles provided for the OS X targets.
- Added a "View Vertex Alpha" option to the viewer, to complement
"View Vertex Colors"
- Max current vertex channel can be set to MAP_ALPHA, which confused
the exporter. Fixed, as well as the face mapping for the alpha
channel.
- Fixed a few exporter installer issues with the one-click
executable. For certain versions of Maya, Maya would fail to look in
the directory it was indicating as the correct module installation
location. For Max 9, the 32-bit plugin could be installed when the
64-bit plugin was required, and vice versa.
- Fixed a number of DLL dependency-related problems in the plugins,
and the 64-bit Granny DLL.
- Maya visibility attributes will now represent as a vector track in
the same way Max vis tracks do.
- Wii platform tutorial rewritten to make it much more like the other
platform tutorials, and to exercise more of the rendering pipe.
- Fixed a name error with visibility tracks in the Max exporter.
2.7.0.19 release 2007/04/26
- New tutorial: OpenGL Rendering: rendering/opengl.
- granny_unbound_track_mask added to represent a granny_track_mask that has not
yet been mapped to a specific granny_model or granny_track_group. These are
safer when persisted to disk, since you can map them to bone
orderings that weren't necessarily known at the time the mask was
created. granny_track_mask itself is abysmal for this, since the weights
are stored as a flat array, without name bindings. You create a
granny_track_mask from an granny_unbound_track_mask by using either
GrannyBindTrackmaskToTrackGroup or GrannyBindTrackmaskToModel, depending on
whether you want a model mask, or a track mask.
- New member type for granny_data_type_definition, GrannyEmptyReferenceMember,
which is a placeholder element only, designed to represent a
pointer-sized member. These are always NULLed on output, so Granny
will not manage memory, free buffers, or check types for any
pointer values you store in these. This can be handy for reserving
space for run-time allocated structures that you will fill in
yourself, that aren't intended to be persisted to disk.
- New function to keep compression and alignment settings constant
across file modifications: GrannyPreserveFileSectionFormats.
GrannyPreserveFileSections renamed to GrannyPreserveObjectFileSections
to distinguish it from the new function.
- Compound custom attributes now handled correctly in Maya. These
represent as either a GrannyReferenceToArrayMember or a GrannyReferenceMember
in ExtendedData blocks, depending on whether or not the source
attribute was an array.
- Added a new switch to the Maya exporter, "-extNode". If this
optional switch is present, the given node will be scanned, and
it's attributes used as the ExtendedData field of the ArtToolInfo.
This allows the extraction of application custom data for plugin
nodes that may not be MFnDAGNodes, and therefore hidden from the
scene walker. Any class derived from MFnDependencyNode can be used
for this purpose. Hat tip to Arena.net for the suggestion.
- Unbound meshes are now rendered in the viewer at their origin,
unless "Hide Unbound Meshes" is enabled in the mesh preview menu.
- Fix a problem in the "Use Accumulator Neighborhood" setting.
Granny wasn't always respecting this override in the runtime.
- PS3 Unix-style IO enabled by default. It's still recommended that
you replace these routines with your own file handlers, but having
them not work "out of the box" is a bad idea.
- New preprocessor command "TouchVersion". Updates a file to the
latest format, to prevent the need for runtime conversions.
- Fix the PS3 sample for the new behavior of GrannyCopyMeshVertices (the
compat note in 2.7.0.17.) PS3 libraries updated to the 160.008
release.
- Support for Max particle systems derived from SimpleParticle added.
The parameters for the particle system appear in a "ParticleInfo"
member of the ExtendedData field of the granny_bone that represents the
transform of the particle system. (In the same manner that Camera
or Light information appears.) Because the SimpleParticle
parameters are based on the older IParamBlock interface, rather
than the newer IParamBlock2 interface, some of the names of the
parameters are unrecoverable. These parameters are given dummy
names "UnnamedParam_[Index]". At the same time, a filter was added
for some of the spurious objects generated by these particle
systems to prevent model clutter.
- Calling GrannySetFileSectionFormat with obsolete Oodle0 compression
results in Oodle1 compression being selected.
- (internal) Added an internal granny_track_group_builder option that makes
the final version of the granny_track_group in a granny_memory_arena, with
several small allocations rather than one large alloc to work
around virtual memory framentation in the DCC packages.
- New function GrannyBeginSampledAnimationNonBlocked, which creates a
granny_track_group_sampler with individually allocated buffers, rather
than one monolithic alloc. This helps work around the VM
fragmentation problem in Maya.
- (internal) Added an optional post-deformation transformation step
to the granny_mesh_deformer. This makes it straightforward to create
deformers that are simple permutations of existing accelerated
deformers.
- (internal) Switched the exporter back to on-disk temporary buffers,
also to work around VM fragmentation.
- For granny_file_builder objects where the temp buffers are created on
disk, the compression buffers are also now stored on disk. Another
VM fragmentation fix.
- (internal) Fixed a bug in the case that the Aggregate Allocator
fails to acquire the requested memory. Output pointers were not
being properly NULLed, and since some accounting data is stored in
the pointer location itself, this could cause the return of
invalid, non-zero pointers, which were incorrectly interpreted as
representing a successful allocation.
- (internal) Add some range guarding to the binormal and normal to
uint8 conversions.
2.7.0.18 release 2007/03/29
- Prevent 0-size objects from being written out in
GrannyWriteDataTreeToFileBuilder. These cause severe problems in the
file output and conversion routines, since you can wind up with
distinct objects sharing a pointer value, which corrupts the
internal hash table used to flatten the object tree.
- Fix a bug in the XSI exporter relating to vertex colors. In
certain cases, the vertex color property was being walked with an
incorrect stride.
- Prevent 0-sized objects from being generated by the file property
exporter in Max.
- Added GrannyAbortVariant to terminate a granny_variant_builder without
generating the result object;
2.7.0.17 release 2007/03/22
- New tutorial: Level of Detail: lod.
- Explicit support for collected string databases added with the new
type granny_string_database. Added new preprocessor commands
"ExtractStrings" and "RemapStrings" that help you build string
databases from your .gr2 files, and do the remapping of literal
strings to database entry indices.
- The tutorial String Replacement: string_table has been reworked to reflect the
new granny_string_database type and related APIs.
- Granny Files, Raw Files, Compression, Sections, and All That Stuff: Converting Strings to Indices has been rewritten to account for
the newly supported granny_string_database type and surrounding APIs.
Full CRC replacement of strings with no backing store has been
moved to the "email us and we'll explain" section of the API. In
almost all cases, using granny_string_databases is the correct thing to
do.
- New API GrannyRemapFileStrings to support replacing strings at the granny_file
level, so version conversion of remapped strings can proceed
smoothly during calls to GrannyGetFileInfo.
- Granny now supports float16 data types. You can use these in your
vertex formats by specifying GrannyReal16Member. Conversions to and
from these fields work exactly like GrannyReal32Member. Conversions to
and from GrannyReal32Member work as expected.
- Compatibility Note: GrannyCopyMeshVertices contained some
undocumented transformations for compressed vertex formats
generated by the older Granny preprocessor. To prevent unpleasant
surprises, these have been removed. These transformations are
better handled as (new) preprocessor commands.
- When old format files are loaded, the older magic value
(GrannyGRNFileMV_Old) is replaced with the appropriately matching new
magic value. (In all cases, this will be
GrannyGRNFileMV_32Bit_LittleEndian or GrannyGRNFileMV_32Bit_BigEndian.) This
allows easier error checking and edge case handling in some of the
loading paths.
- GrannyRecompressFile now supports input and output file names that are
the same.
- Added an export option to flip either the U or V coordinates of a
mesh at export time. This allows you to revert to Maya's default
interpretation of the V coordinate, if you choose.
- Fixed a bad assertion in the file loading relating to section
with no pointer fixups or mixed marshalling entries.
- Fixed a bug in GrannyRecompressFile relating to the references for the
Root object and type definition.
- granny_vector_track has been altered to allow easier hook up to the
source object in cases where multiple vector tracks share a name.
For instance, a "foot_down" track applied to multiple objects in
the scene. Each granny_vector_track now contains a "TrackKey" member
that can be matched to a bone by using the new
GrannyVectorTrackKeyForBone API. The initial value of the attribute is
still stored as "<AttributeName>" in the source object for
compatability reasons. Ideally, we would provide a direct pointer
reference from the ExtendedData variable to the granny_vector_track, but
in certain cases this simply won't work. (Imagine a case in which
the granny_bone "RightFoot" contains a "foot_down" track, but the granny_model
is stored in a separate GR2 from the granny_animation. Similiarly, this
mechanism supports multiple animations with identically named
tracks.)
- Tightened the OBB bounds for meshes in the granny_mesh::BoneBindings
structures. The exporter was including the bone transform in the
bounding volume, which is not necessary.
- Note: granny_grn_file_header version tag GrannyCurrentGRNFileVersion bumped to
7. This will cause log messages about file format mismatches until
your assets are rebuilt. There is no compatability problem here,
older files will continue to load in newer versions of the library,
and new files will (to the extent they did before) load in older
versions. Something to be aware of.
- In the "projects" directory of the Win32 and Win64 distributions,
we now provide ready-made projects to build Granny from source.
Building Granny from Source updated to reflect this.
- New undocumented API GrannySetFileStringDatabaseCRC for ensuring proper
matching to the granny_string_database that contains its remapped strings.
- Similarity transformation functions such as
GrannySimilarityTransformCurveQuaternion were not correctly handling
keyframed curves in certain cases.
- GrannyBasisConversionRequiresCurveDecompression was returning results of
opposite sense from the name. I.e, a "false" result indicated that
the curve did need decompression. Fixed.
- GrannyFindAllowedLODError parameter names corrected. Should have
referred to viewport height, and vertical FOV, since those are the
values most likely to accord with granny_camera settings. There's no
compatability problem here, both are equivalent.
- (internal) Fix a distribution problem with the exporter source.
- (internal) Check assumption that Linear3x3 and InverseLinear3x3 are,
well, inverses of each other in the GrannyTransformFile family of APIs.
If they aren't send the transformation through the slow,
non-swizzled path.
- Fixed allocation error in the LODCalc preprocessor command, and a
potential NULL access in CleanMaterials.
- (internal) Fix intrinsic memset and memcpy in the debug
distribution.
- (internal) Fix an alignment mismatch in an external declaration
(_gbitlevels)
- (internal) Max normals pulled from the MeshNormalSpec in all
applicable cases.
- (internal) Simplified the compression preprocessor commands by
using the already existing GrannyRecompressFile API. This ensures that
the file platform, sectioning, and any remapped strings are
correctly preserved.
- (internal) Doc grouping fix for granny_pointer_hash documentation.
2.7.0.16 release 2007/02/27
- New tutorial: Export Scripting: Max.
- New tutorial: Export Scripting: Maya.
- Some of the preprocessor commands that remove data or modify it in
place have been updated with the GrannyPreserveFileSections API to
keep exporter- or user-controlled sectioning in place.
Preprocessor commands that add data, or create new data still
output single section granny_files. You can fix those up with the
exporter's default sectioning by using the "ResectionFile" command
following a destructive operation.
- Preprocessor commands can now specify to the driver program whether
or not they accept multiple files, or only a single input file.
This removes the need to duplicate some of the error handling code
and parameter validation in each command module. Tip of the hat to
David Whatley at Simutronics for the suggestion.
- Improved the RemoveElements command of the preprocessor to
recursively clean references to objects removed at the top level of
the granny_file_info structure. Previously, if you ran the command with
"-remove Skeletons" for instance, the granny_skeleton objects would
actually be left in the file, since the granny_model references to them
would still be present. Now the entire data tree is walked to
clear references to the removed objects.
- Improved the CleanMaterials command to remove granny_texture objects no
longer referenced by any granny_material after the cleaning pass.
- Fixed a problem with the computation of granny_bound_transform_track
acceleration flags in the animation rebasing path.
- Added support for the Max "Normal Bump" material. If you have other
Max materials that aren't exporting properly, please do let us know.
Max's architecture makes it very easy for this to happen without our
knowledge.
- Fixed a instance detection error in the XSI plugin that caused
materials assigned to multiple meshes to be duplicated in the
exported .gr2 file.
- XSI Plugin Python code changed to JScript to remove requirement that
the Python runtime be installed before using the Granny exporter.
- Fixed a (non-error causing) case fallthrough bug in
GrannyConvertVertexLayouts.
- (internal) GrannyEndLocalPoseAccumulationLOD was using
GrannyBlendQuaternionNeighborhooded rather than
GrannyBlendQuaternionAccumNeighborhooded to choose the blending arity
for the reference pose fill. Since the comparision being made in
the first case is to the same granny_skeleton transform being blended in,
this was both wrong, and not very pointful.
- Plugged a documentation hole in Using GrannySetValue and GrannyGetValue: Max about referencing
materials in GrannySetValue calls.
- Fixed a distribution error for the online GrannySetValue
documentation, and a linking bug for those docs in the exporter.
- Physique bindings in Max can report the same bone multiple times.
This sometimes resulted in bone binding lists for a granny_mesh that
exceeded the number of bones in the underlying granny_skeleton. Certain
sampling paths will report an error in this case. Each bone should
now appear once and only once in the binding list.
2.7.0.15 release 2007/02/05
2.7.0.14 release 2007/1/16
- Important distribution change! Libraries and binary modules are
now all put in a platform specific directory under "lib" or "bin".
That means when you upgrade, don't just unzip the distribution on
top of the older directory. You need to make sure that the old lib
file is gone to prevent version mismatches. (You're using
GrannyVersionsMatch, right?)
- New tutorial: Using the Granny Camera: camera_utilies
- New tutorial: String Replacement: string_table
- New tutorial: Using Track Masks: track_mask
- New tutorial: Traversing Granny's Object Metadata: tree_walker
- New tutorial: TutorialDX8Rendering
- Altered granny_bound_transform_track to save some space. This
optimization mostly helps runtime memory constrained games that
have disabled the LODTransform optimization in that structure, but
should save a bit of memory for all users.
- XCode 2.4.1 projects now provided for the tutorials for use on
Intel Macs. For projects that depend on Win32 specific APIs like
Direct3D, there are no XCode projects, of course, but you can build
the majority of the tutorials natively on the Mac now. If you need
projects that correctly handle PowerPC Macs, please let us know!
- Xenon platform example
- PS3 platform example
- Modified granny_track_group_builder so that all identity curves in a
granny_transform_track share the same representation in the final file.
This can save quite a bit of space in the final in-memory
representation of an animation.
- GrannySampleModelAnimationsAccelerated was not correctly noting track or
model masks set on granny_controls.
- Exported granny_pointer_hash to the undocumented interface. This structure
is used by the file API and the exporter to detect and handle data
cross references. More info in Traversing Granny's Object Metadata: tree_walker.
- Fixed a bug in the ANSI file writer. granny_file_writers created with the
EraseExisting flag set to false were using "a" as the open mode. The
correct mode is "r+b".
- Simple breakpoint asserts for the Mac Intel target.
- (internal) PS3 libraries compiled and tested against the 1.32 SDK
revision.
- (internal) Checked conversion to 16-bit integer.
- (internal) Fixed an OS X distribution bug.
2.7.0.13 release 2006/12/19
- New tutorial: Downloading S3TC Encoded Textures in OpenGL: s3tc/opengl.
- New doc section: Bone ordering in granny_skeleton, explaining the way
granny_skeleton's granny_bone array is layed out by the exporter.
- Fixed a viewer bug for texture-only .gr2 files.
- Added some missing consistency checks to GrannyBuildRestWorldPose.
- Added a new texture format selection in the exporter "Determine from
Source". The intent of this option is to make it possible to have
textures already compressed with S3TC (or possibly other formats in
the future) autoselect the correct format in the exporter.
- Created 2 versions of the "GrannySetValue" documents, one for Max,
and one for Maya. Available as Using GrannySetValue and GrannyGetValue: Maya or
Using GrannySetValue and GrannyGetValue: Max.
- Some 3dsmax node properties that were missing before are now
exported.
- Fixed a linking bug in the PSP libraries.
- Fixed a bug in the exporter when exporting files with no type
information to a platform other than the native exporter platform.
This necessitated changing the signature of
GrannyPlatformConvertReaderToWriter to indicate if type information
should be omitted.
- Incorrect granny_grn_file_magic_value passed in the PlatformConvert command
of the preprocessor.
- Improved the reversability of the DXT1 encoder. Any RGB pixel
array that was converted using from_S3TC1 should now yield
exactly the same image after a call to to_S3TC1.
- Removed "Store Unchanging Tracks" option from the exporter settings
dialog. This option is not safe unless the base skeleton for the
model is present to compare with. You can accomplish the same thing
in the preprocessor if the functionality is necessary, there you can
ensure that the root pose of the model is correct before eliding
track data.
- GrannyExcludeVariantTypes option removed from GrannySetFileDataTreeFlags
options. This is a legacy setting that won't function properly in
newer versions of Granny. This setting was also removed from the
exporter.
- Fixed a compression bug when writing a file for a reversed platform.
This required changing the function signature for GrannyOodle1End and
GrannyBeginFileCompression.
- Fixed a pointer-size error in platform conversion caused by
overzealous file identity maintenance.
- Fixed a bug introduced when a granny_file_builder is using temporary disk
files (i.e., GrannyBeginFile rather than GrannyBeginFileInMemory.)
- Mac Intel build switched to the 9.1.029 version of the Intel C
Compiler for compatibility with Xcode 2.4.1.
- (internal) HTML generation for external documentation improved.
- (internal) Fixed incorrect handling of tiny S3TC miplevels.
2.7.0.12 release 2006/12/04
- The Granny Exporter now supports XSI 5.11! This release is
an open beta of the plugin for licensees and eval clients, We're
asking for feedback and sample data to help us cover all of the
features XSI exposes.
- The Granny exporter now attempts to maintain the property that
exporting a file twice from a DCC package will yield the same bits
in the resulting .gr2 file. This can help automated build scripts
determine which files need to be rescanned for dependencies or
checked into source control.
- New tutorial: Downloading S3TC Encoded Textures in DirectX 9: s3tc/dx9
- granny_file_data_tree_writer may modify the bits passed in through the
RootObject parameter to ensure that unused pointers and count
variables are zeroed on export. GrannyBeginFileDataTreeWriting's
signature changed to reflect this. Since GrannyConvertFileInfoToRaw is
little more than a wrapper around GrannyBeginFileDataTreeWriting, it's
signature changed as well.
- Extended the granny_variant_builder to accept boolean and unsigned
integer inputs. (New functions: GrannyAddBoolMember and
GrannyAddUnsignedIntegerMember.)
- Max file properties exposed in the granny_art_tool_info of the
created granny_file_info. Both granny_art_tool_info and granny_exporter_info now
contain ExtendedData fields for storing such information.
- GrannyGetMagicValueProperties and GrannyGetThisPlatformProperties will now
accept NULL for either or both of the property parameters.
- Ignore hidden attributes by default in Maya. These tend to be
material sampling parameters and node cache state variables that
are not deterministic, and have limited utility.
- Added an option to the exporter to flip textures vertically or
horizontally on export.
- Exposed the GrannyLoadFixupArray function as an undocumented function
for detailed control of file IO.
- Added undocumented functions for retrieving the granny_track_mask object
applied to a control when using a granny_controlled_animation_builder.
These are left undocumented because they have extremely limited
applicability, especially when you're dealing with complicated
controls affecting multiple models.
- (internal) Removed unused granny_bool32x type.
- (internal) Added some missing Vector*N functions.
- (internal) Fixed a crash in the viewer with models missing their
skeleton.
- (internal) Settings requester takes local copy of DCC string
2.7.0.11 release 2006/11/3
- This release is mostly a point release to update the 3dsmax 9
plugin to the retail version. Previous Granny releases contained
a plugin compiled against the M059 beta of Max 9, which the
retail Max9 cannot correctly load.
- New tutorials: Parsing ExtendedData Fields: extended_data and Customizing the Preprocessor.
- Preprocessor commands registered with a helper class, rather than
in a table in preprocessor.cpp. This makes it possible to add
commands without modifying the base preprocessor source, which
should facilitate upgrades.
- Preprocessor is now a root-level directory in the SDK zip files,
not the exporter zips. That was the wrong place to put it.
- Changed the preprocessor command arguments to take a granny_memory_arena
argument for allocations. Previously the default Granny commands
deliberately leaked memory. This allows them to be a bit more
hygenic, which may make it easier to chain them together in
compound command functions.
- Maya and Max exporters place the type name of object in the
ExtendedData entries for camera, lights and materials, which can
help distinguish, say, between a spotlight and a directional light.
- Fixed a bug in the preprocessor "[De]Compress" and
"PlatformConvert" commands that could cause problems on files with
fewer than the standard number of sections.
- (internal) Changed the way the exporter retrives stored settings
data to make things easier on the upcoming XSI plugin.
- (internal) The linker was kicking out the scripting functions for
the Max plugin. Fixed.
- (internal) Track the Max 9 registry key for installation.
2.7.0.10 release 2006/10/24
- New Tutorials: The Granny tutorials have been entirely
rewritten and reorganized to get you up and running in the absolute
minimum possible time. See Tutorial Overview for details. These
are still very much works in progress, so over the next few months
we'll be filling in a huge number of pieces.
- GrannyReadEntireFile now marked as "Reads Global Data" rather than
"Safe". This reflects the fact that it accesses the default file
reader callback. GrannyInitializeFileReader marked as "Safe", since all
accessed values are passed in as parameters.
- Preprocessor can now restore the default file sectioning scheme
created by the exporter with the command "ResectionFile". This
helps preserve the discardability of Granny data used only for
initialization, even after heavy preprocessing. In addition, the
"Compress", "Decompress", and "PlatformConvert" have been modified
to preserve sectioning, since they are typically executed at the
end of a preprocessor command chain.
- New function GrannyPreserveFileSections, which helps to maintain
file structures when reading in Granny files to modify them and
write them back to the filesystem. This allows you to specify that
the object section placement in the Granny file structure should be
the same as it was in the source file, for objects that are carried
over directly. You can still override the behavior with
GrannySetFileSectionForObject if necessary.
- Added GrannyGetLogMessageTypeString and GrannyGetLogMessageOriginString to make
formatting error output easier.
- A few enums in granny_log_message_origin have been renamed for
consistency with the rest of the supported values. These are
GrannyMeshBindingLogMessage, GrannyTrackGroupLogMessage,
GrannyThreadSafetyLogMessage, and GrannyQuantizeLogMessage.
- const-correctness of the Granny API improved. In particular, many
more functions now take const parameters when they don't modify
their inputs. GrannyGetMeshBindingFromBoneIndices and
GrannyGetMeshBindingToBoneIndices now return const pointers to the bone
index arrays, since these shouldn't be changed by the app, which
may require you to add const to the pointer if you are storing the
return value of these functions.
- Dead code and unexported functions in the main Granny source tree
removed where appropriate. If you were using any of the now
missing utility files, please let us know, they're available as
a secondary distribution.
- Fixed a memory leak in the exporter in the vertex morph curve
extractor.
- Added GrannyGetBlendDagNodeCrossfadeWeights to allow querying the
current state of a node before changing with
GrannySetBlendDagNodeCrossfadeWeights.
- (internal) Fixed a bug in the track sampler functions when using
GrannySampleModelAnimations rather than
GrannySampleModelAnimationsAccelerated. Constant value position and
orientation tracks were not being correctly handled.
- (internal) Fixed a doc typo in the LightInfo extraction example.
- (internal) Source code consistency pass.
- (internal) Restored a missing log message on GrannyReadEntireFile.
2.7.0.9 release 2006/10/10
- Viewer will now search for more than just the first matching model
for an animation. This allows partially exported files to be
viewed together. (E.g., character and sword.) This only applies
to "raw" animation files, i.e, files that contain no meshes.
(Models are still allowed.) Files that contain both animations and
meshes will bind internally without searching the larger scene.
- Viewer can now display vertex colors on Granny meshes. Only the
first diffuse color is supported for now, and alpha is ignored. In
the "Mesh Inspection" menu, select "Show Vertex Colors" to activate
them. For clarity, when vertex colors are active, lighting and
texturing are disabled.
- Viewer now accepts drag and drop from the explorer. You can drag
one at a time, or in sets for quick file loading. Props to
AndyG at Giant Bite for the suggestion!
- Exporter will now dump 3dsMax visibility tracks as vector tracks
with the name "<NodeName>_visibility". The full floating point
visibility range is exported, if you want to threshold this to
a binary text track, this is easily accomplished using the
preprocessor.
- Preprocessor now directly supports Animation LOD computations.
Use with the new command "LODCalc".
- Preprocessor can combine elements from multiple Granny files to
create composite files. For instance, a character.gr2 file might
contain the models, meshs, and all the animations required for
the game for that asset. You can now use the "CombineElements"
preprocessor command to do this.
- PS3 basic sample converted to use the more efficient NoComposite
granny_world_pose sampling path.
- Altivec optimized the NoComposites transpose path for the PS3.
- New Exporter script command "GrannyListValues" which has syntax
similar to GrannySetValue, but allows you to get a string array
representing the values Granny is storing at that node level. Also
new is the command "GrannyListComboboxValues", which will give you
a list of the valid settings for the multiple choice entries in the
settings.
- New Exporter script command "GrannyChangeSettings", which allows you
to interact with the settings dialog without actually exporting the
file. Props to Ken Grey at Firaxis for pointing out this missing
feature.
- Exporter will not cause the "Export Module Failure" dialog in Max
when the user selects "Cancel" at the settings dialog.
- Added the ability to drag the split in the "Detailed Data View"
of the Granny viewer. This should make it easier to examine long
strings or transform data.
- Switched to using the newer "Alias" registry key for the Granny
Exporter installer. The older "Alias|Wavefront" key may be
missing or incorrect in newer installs.
- (internal) Stopped building Max 5 plugin by default.
- (internal) Fixed some Gamecube linking problems.
- (internal) Worked around a problem with Granny's use of the Max
MeshNormalSpec interface. Non-explicit normals reported through
this interface were not correctly mirroring the results expected
from the smoothing groups.
2.7.0.8 release 2006/9/29
- Fixed a missing flag in GrannySampleTrackUUULocal for animations
with constant Scale/Shear.
- Optimized the granny_track_samplers for granny_transform_tracks with
constant elements. These all use the LODTransform member of
the granny_bound_transform_track they are sampling, which cuts down
on cache misses, since they don't need to touch the (possibly
non-contiguous) memory for the constant curve.
- Pushed back the practical limit on mesh size in the exporter
again.
- New script commands "GrannyLockValue" and "GrannyUnlockValue"
added to control value locks in the exporter settings.
2.7.0.7 release 2006/9/26
- Major speed win on X360 and PS3 by careful prefetching in the
sampling paths. You should definitely get this release
before shipping a game on either platform. Our stress test
sped up by over 25% as a result of these optimizations.
- The Granny Preprocessor has undergone a major rewrite. We've
redesigned it so that it's much easier to add your own data
processing functions to the tool, and easier to fit into
an existing tool chain. The previewing functions have been
entirely removed to encourage cross-platform use, and the
tool is structured to perform simpler and more general
operations. We'll be distributing the prebuilt version of the
preprocessor with the exporter now, rather than the SDK, since
it really is a part of the Granny toolkit. Over time,
operations that previously were accomplished with exporter
settings will be moved into the preprocessor. If you're not
using the preprocessor yet, check out the documentation in
The Granny Preprocessor, you may save yourself the trouble of writing a
custom tool.
- GrannyNewWorldPose now has a sister function GrannyNewWorldPoseNoComposite
that allows you to create a granny_world_pose without the Composite_4x4
array. This is intended to help you save memory by allowing you
to specify the location in which the composite array will be
computed. If you are working on a title for Xenon or a DX10 game,
you'll want to look into this. (The distinguishing feature that
sets these platforms apart is that constant buffers are preferred
over register constants. This change allows you to build the
constant buffers directly in place without memcpys or index
marshalling.) Several functions have been slightly altered to
indicate to Granny which pathway you want. (More details in
Compatibility with Older Versions of Granny: Full List of Compile-Breaking Changes.) Some of the major function changes of
which you should be aware: GrannyBuildCompositeFromWorldPose has
been renamed GrannyBuildWorldPoseComposites to contrast with the new
function GrannyBuildCompositeBuffer and
GrannyBuildIndexedCompositeBuffer. More details can be found in
Reducing the size of your data: Smaller World Poses and Notes on CPU and Memory Performance Optimization: Animation speed issues.
- Cell and Xenon paths for granny_world_poses without composite matrices
optimized.
- Granny/Aegia physics examples added to the distribution.
- Added options to the vertex morph curve extraction process to allow
exclusion of quantized formats, control of curve degree reduction,
and selecting aggressive curve compression. These are essentially
the same as the options for bones, but are separately controllable
at the mesh level.
- New type introduced: granny_matrix_3x4. This allows the easy construction
of skinning buffers for vertex shading that use only the necessary
components of the composite matrices. (The last row is implicitly
[0, 0, 0, 1].)
- Fixed a fencepost bug in the vertex animated curve extractor.
- Missing function GrannyBuildWorldPoseNoCompositeLOD added.
- New function: GrannyColumnMatrixMultiply4x3Transpose exposed.
- GrannyColumnMatrixMultiply4x3, GrannyColumnMatrixMultiply4x4, and
GrannyColumnMatrixMultiply4x3Transpose assume that their IntoMatrix
matrix argument does not overlap either of the source matrix
arguments. (The source matrices may alias each other without
error.) This allows the compiler to generate better code for the
multiplication routine on platforms that support restricted, or
noalias pointers. Incorrect results would have occurred had this
convention been violated, so the new restriction is unlikely to
affect older client code.
- granny_file now contains the granny_grn_file_magic_value it was determined to
have at load time. GrannyReadPartialFileFromReader now passes that
value back in the granny_file structure itself, so its second argument
was removed.
- Added a handler for StringArray attributes in Maya. Helps fully
support the HLSL plugins.
- GrannyBuildTangentSpace now operates on a granny_mesh_builder rather than a
ill-defined set of arrays.
- granny_mesh_builder API changed to allow the building of meshes that
previously could exhaust memory. This required renaming or
removing several functions that allowed random access to the
internals of the builder. For a full list, see the
Compatibility with Older Versions of Granny: Full List of Compile-Breaking Changes.
- Modified granny_stack_allocator for better random access. If you pass a
maximum number of units that the stack will hold, Granny builds a
block directory for quick lookup.
- GrannyExport script commands can now suppress the progress window
if you want. In Maya, this is done with "GrannyExport
-showProgress off", in Max, you'd execute "GrannyExportSilent".
- Linux source-only distribution added. Currently we support the
x86 platform. If you have an interest in PPC, or another
little-endian Linux architecture, let us know!
- Release name convention change: "pre-release" is changed to
"release", "release" changes to "final". This is to prevent
confusion when obtaining newer versions of the Granny library. All
versions of the SDK uploaded to the FTP site are stable enough for
shipping products, but the names were confusing enough to prevent
coders from picking up useful features or fixes in the latest
version. The version of the SDK that you should download is always
the highest numbered version on the website. If you are very close
to shipping, and are concerned about source changes required for an
upgrade, check the Compatibility with Older Versions of Granny: Full List of Compile-Breaking Changes, or write to us at
granny3@rad.
- Fixed a bug in GrannyBuildRestWorldPose that would crash if passed a
NULL offset.
- Fixed a Maxscript bug that prevented setting the exporter values
for textures and materials.
- Demo build procedures updated to track the location of your DirectX
SDK directory. We still can't be sure where you'll put the Granny
SDK, so you may have to alter the project files to point to the
installation directory. We've temporarily removed some of the
examples while they undergo updating.
- (internal) fixed a bug in the keyframed data generator
- (internal) Reorder the curves in granny_transform_track for better cache
performance.
- (internal) Remove spurious log message when calling
GrannyGetWorldPoseComposite4x4 or GrannyGetWorldPoseComposite4x4Array on a
"no-composites" granny_world_pose. This is a valid way to check if the
composites need to be built.
- (internal) Changed the way the bool type is handled when granny.h
is compiled as a C file, rather than C++. It was possible before
for the size of the bool type to be incorrect with respect to the
size used when the library itself was compiled, leading to
incorrect generated code in a client application. Props to David
Bradley from Heuristic Park for pointing this out.
2.7.0.6 release 2006/8/24
- Major exporter change: the settings have been partitioned into
"basic" and "detailed" sets. This doesn't affect scripted access
to the options, but presents artists with a view that focuses only
on the most commonly altered settings. For a few releases, we'll
leave the default setting as checked to ease the transition.
- Altered the granny_mesh_deformer API to allow applications to ignore
portions of the destination vertex type that don't match the source
format. GrannyNewMeshDeformer changed to accept a granny_deformer_tail_flags to
indicate which behavior is desired. For the old interface, pass
GrannyDontAllowUncopiedTail. This is recommended unless you specifically
want the tail of the formats to contain untouched entries.
- New setting available on the animation tracks: "Use Accumulator
Neighborhood". This changes the blending behavior of a track if
the runtime detects that the track needs to be neighborhooded to
the rest pose. In certain rare cases, you want to disable this
behavior, and neighborhood to the accumulation in progress. This
changed the function signature of GrannyBeginTransformTrack to include
a flags field. Altered the document section
Advanced Animation: Local Pose
Operations to help explain the
issue.
- Reworked the Basic Model Setup and Animation document by breaking it up into
smaller logical pieces. Refocused the Animated Mesh Deformation
section to focus on shader-based deformation rather than software
deformation through a granny_mesh_deformer.
- New documentation on creating a shader-based rendering pathway added:
Animated Mesh Deformation: Shader Mesh Deformation.
- Fixed a thread-safety issue in the granny_mesh_deformer API. Match
parameters are no longer stored in the static copies of the
deformer table entry.
- Added GrannyUpdateWorldPoseChildren, which recomputes only the
granny_world_pose matrices for bones that are children of the given
bone. This is an optimization targeted especially at GrannyIKUpdate
and GrannyIKUpdate2Bone, which require rebuilding only a small section
of the overall granny_world_pose.
- Fixed a problem in the exporter that caused Max to not understand
that changes to Granny settings require that the file be saved in
order to preserve them. For various reasons having to do with the
way Granny stores its settings in the .max file, the simplest way
to accomplish this was to require a save whenever the export
interface is interacted with. Scripted exports will not cause the
"file modified" dialog to appear. Interactions with the settings
through the GrannySetValue Maxscript command work as expected.
- granny_file_builder write out process altered to make loading a linear
sequence of disk reads in all cases. Previously, certain section
orderings could cause back-tracking in the files.
- Maya particle emitters were not properly registering as transform
nodes. Fixed that problem. As a bonus, we now dump the emitter
information into the extended data for the bone.
- Fixed a bug in the tangent space generator that could cause 0 length
tangents in certain degenerate cases.
- Replace the remote control demo with a more interesting Gryphon model.
- GrannyGetBoneCountForLOD early out
- Granny works with PS3 SDK 090, including the basic sample app.
- (internal) Spline samplers, knot extractors, Xenon accelerated bone
operations, etc. use the NOALIAS keyword to improve code
generation.
- (internal) Added NOALIAS as a compiler define to help optimizations by
picking out pointers that can't possibly alias each other.
- (internal) More warning cleanups.
- (internal) Added StringDifferenceOrCallback to forward difference
operations to the user granny_string_comparison_callback where appropriate.
2.7.0.5 release 2006/7/26
- So you say you want a Revolution? Wii do, too! Support for the
new Nintendo console added.
- Exporter multithreads the curve compression stage on machines with
more than one processor.
- Added a note to the GrannySetAllocator docs to specify expected behavior
when Granny passes NULL to the deallocation callback.
- Fixed an alignment error in the platform conversion code. Internal
array members and inline structure members were being improperly
aligned.
- Fixed a pointer size bug in the 64 bit 'Blade' plugin.
- New sample scripts to quickly preview an animation from Max or Maya
in the Granny Viewer. (Look for grannySimpleView.* in your
distribution.)
- Added support for 32 and 64 bit versions of 'Blade'.
- Added support for 32 and 64 bit versions of 'Makalu'.
- Many functions and structure members with char* parameters or members
changed to char const* for better const consistency. Some similar
changes have been made in the curve API.
- MacOSX build uses x86 hand-optimized BuildWorldPose and Deformers.
- Reorganized the Overview and In-depth sections of the documentation
to seperate out Coder and Artist documentation. Added
So, you're the lead to serve as a starting point.
- Documented the Variant Builder API. (The Variant API)
- Added documentation on reducing memory and disk usage, Reducing the size of your data.
- Added documentation section How to Loop Animations to codify the correct
way to loop animations with Granny, as a suppliment to
Animation FAQ: Animation Frames.
- Added a summary section (Understanding Model World-space Movement: The Bottom Line) to the Root motion
documentation to make it easier to pick up the most important
points about Move To Origin and VDA.
- Switch the "Crowd Scene" demo to the Granny timer (from QPF) to reduce
timing problems with XP SP2 on multiprocessor machines. Added a text
warning about timing irregularities when the task manager is active.
(Not observed on all machines.)
- Removed global sampling buffer in the spline solver. Replaced with a
stack copy for thread safety.
- Fixed a multithreading bug with the granny_data_type_definition functions.
The TraversalID member would be stomped if two threads tested the same
static data type simultaneously.
- Added GrannyCameraOutputZNegativeOneToZero to support the Wii's idea of a
projection transform.
- Very basic Wii example added. More complete example to follow.
- Distribute PDBs to help debug distributed libraries.
- (internal) Ensure section alignment to DWORDs on write. Note that this
is an external alignment only, the internal alignment may still be
whatever the user wants.
- (internal) GrannyGetWriterPosition shouldn't assert in the call to SeekWriter
when the writer is CRC'ing.
- (internal) Changed the assertion mechanism
- (internal) Nodes with a Maya API type of kPluginTransformNode were
being incorrectly ignored. They are now treated the same as any
kTransform node. (Similar treatment given to kLodGroup nodes.)
- (internal) Removed rarely used precomputed animation deltas to reduce
the size of the animation binding cache structures.
- (internal) Added SetPtrNULL convenience function to simplify setting
up arrays of pointers.
- (internal) Adjusted the way Granny deals with structure packing
settings. This was causing hiccups in various 64-bit applications
that needed to match the Windows packing conventions.
2.7.0.4 release 2006/6/16
- Added help to the plugin scripting commands. Documentation for
Granny's commands is available by following any of the script
commands with "-h" or "-help" in Maya, or "GrannyHelp [commandName]"
in Max. A list of the available MEL/MaxScript commands can be found
in Granny Exporting Overview: Using Scripts to Automate Exporting.
- Added script call GrannyGetValue that allows scripts to examine
settings created either with the exporter interface, or with
GrannySetValue.
- Help for GrannySetValue analogous to that available for GrannyCast
added to the external website for easy reference from the plugin.
(Also available as SetValueDocs in the Granny documentation.)
- Fixed an error in the Max exporter that could cause skinning
modifiers to be missed if another modifier modified the mesh
topology "above" the skinning modifier.
- Added support for the new Maya multiple color sets per mesh.
- Set the x87 control word to a known state before invoking the
exporter in Max and Maya. If another plugin or user process has
set the flag to a non-standard value, infinite loops can result
when calling Maya functions.
- Fixed an incorrect error message in DAG free routines that could
cause a memory leak when using auto-free node types.
- Restored standard options for model bones in the exporter.
- (internal) Fixed a distribution error in the Xenon target.
(xenon_granny_* files were being left out of the sdksrc
distribution.)
2.7.0.3 release 2006/6/05
- Granny now supports Intel-based Macs. Currently, we use the
Intel C++ Compiler for Mac OS to compile the target in order to make
the best use of the optimizations we've made to the Win32 x86 target.
- Xenon, PS3, and DirectX9 samples updated to include HLSL shaders for
skinning rather than a Granny deformer. If you are using a
granny_mesh_deformer for skinning, it is strongly suggested that you evaluate
these samples, using the hardware to do skinning math is better in
almost every case.
- Curve API Changes. Many parts of the Granny curve compression
API have been altered to support new compression types and to expose
some useful functionality from the exporter in the general API. See
the notes below for specfics. The documentation on curve fitting:
Granny Utility Function Overview: Curve Creation, has been substantially updated to
reflect these changes.
- VMX128 optimized paths added for GrannyBuildWorldPose in the Xenon target.
Our tests show that the new routines only take about 40% of the time
of the scalar routines.
- Altivec optimized paths added for GrannyBuildWorldPose in the PS3 target.
Like the Xbox 360, the vectorized paths test out at around 40% of
the time of the scalar paths.
- Added a new type of Synthetic Root Bone, "GrannyRootBoneLocal", which
captures only those bones that are part of the same hierarchy. If
you aren't familiar with SRB's, you should be! Check out
Understanding Model World-space Movement: Move to Origin and the Synthetic Root Bone for more information.
- GrannyCompressCurve is moved from the exporter to the public interface. This
allows people doing custom compression work to use the same interface
that the exporter uses to get maximum benefit from the curve fitter.
If you've previously been using GrannyFitBSplineToSamples to compress curves,
you should certainly look at switching to this interface.
- New exporter option added "Quantized on missed tolerance." In certain
extreme cases, the Granny spline fitter cannot maintain numerical
stability and hit the tolerance goal set in the exporter. Previously,
Granny would always use the largest, most precise curve format to
represent these curves, even if there was a quantized format that
could represent them almost as well at a substantial savings in
space. Now, if this option is on, Granny will allow quantization
in these cases, if the space savings is significant enough.
- New exporter option added "Aggressive animation compression". Allows
Granny to run a post-processing step that eliminates knots that were
made redundant during the fitting process. This option is disabled by
default to preserve the meaning of existing animation settings. If
you're using the curve fitting API, you can access this functionality
by passing the new solver flag GrannyBSplineSolverAllowReduceKeys.
- GrannyFitBSplineToSamples now returns a result curve, rather than
knot/control arrays. This allows much more flexibility in
curve formats, in particular, it allows us to properly support
dimension reduced orientation formats, which could not be cleanly
implemented with the old interface.
- GrannyFitBSplineToSamples size tracking metrics have been changed from
CurveDataSize to CurveSize. This allows Granny to take size of the
curve header into account when deciding which format compresses your
data best, which can be significant for short animations.
- GrannyPushVectorTrack, GrannySetTransformTrackPosition,
GrannySetTransformTrackOrientation, and
GrannySetTransformTrackScaleShear are removed. You should replace
these with GrannyPushVectorTrackCurve, GrannySetTransformTrackPositionCurve,
GrannySetTransformTrackOrientationCurve, and
GrannySetTransformTrackScaleShearCurve. The older APIs couldn't
properly support dimension reduced curves.
- Fixed a bug in GrannyModulationCompositeLocalPoseSparse that would prevent
using GrannyIdentityTrackMask and GrannyNullTrackMask as parameters.
- Put a workaround in place for a compiler bug for the Xenon target
relating to the proper sign extension of registers loaded from 16-bit
signed datatypes. This was causing incorrect decompression of some
Bink textures.
- Update the documentation to reflect the changed location of the Light
and Camera Info. Affected doc sections:
Granny Data Loading Overview: Parsing Extended Data and Granny Files, Raw Files, Compression, Sections, and All That Stuff: Using the ExtendedData field
- Const parameters introduced for GrannyModulationCompositeLocalPose,
GrannyModulationCompositeLocalPoseSparse, and GrannyCopyLocalPose to more clearly
indicate which are input and output parameters.
- Fixed an inconsistency in the exporter relating to exporting bones by
name only. This caused the InitialPlacement field of granny_models to
be incorrectly set to identity on export, and could crash the
viewer when attempting to render the animation pane. Bone settings
in the exporter have been reduced to the subset that makes sense.
For example the "Move to Origin" settings that previously could be
set bone-by-bone were completely ignored by the exporter.
- To help support extraction of Physics SDK parameters from gr2 files,
spheres, boxes, and capsules are auto-detected in 3dsMax, and tagged
with their analytic parameters.
- New utility computation function GrannyLocalPoseFromWorldPose, to help move
results from external world-space APIs back into local space for
further blending. Note that this function is fairly slow, since it
has to decompose the 4x4 matrices into granny_transforms. If you
have a restricted situation in which you know that there is no scale or
shear in the world pose matrices (including the Offset4x4), then you
should use GrannyLocalPoseFromWorldPoseNoScale instead, since the trip
through GrannyPolarDecompose is unnecessary in that case.
- Fixed a bug exposed by the latest MacOSX compiler relating to the
behavior of undefined pointer arithmetic.
- Added convenience function GrannyCurveGetSize.
- GrannyCurveIsReducible added, which is more practical than
GrannyKnotsAreReducible in most cases.
- (documentation) Fixed a bug in the document generator that caused Granny
constants to be referred to as objects, rather than pointers to the
constants, which is how they are implemented.
- (internal) Added IntrinsicSinCos to take advantage of accelerated trig
functions on platforms that have a fast fsincos instruction.
- (internal) NormalizeOrZero[34] functions return 0.0f when they are
unable to normalize the input vector, rather than a random epsilon.
- (internal) Fixed alignment macro for non-MSVC platforms.
2.7.0.2 release 2006/4/10
- This is the first "official" release in the 2.7 series. Note that if
you are upgrading from 2.6 or 2.5, there will be some source changes
required to compile with the new libraries. The required changes are
minor, but you may want to wait if you have deadlines approaching.
- Dimension reduction for translation curves added. Where
appropriate, Granny will reduce the translation curves to functions
of one variable. New curve types granny_curve_data_d3i1_k32f_c32f,
granny_curve_data_d3i1_k16u_c16u, and granny_curve_data_d3i1_k8u_c8u added to
support this feature.
- Added Welcome to Granny: Support Policy and Feature Requests section to the help TOC page.
- Added Granny in a multithreaded environment and Targeting Granny Files to a Specific Platform to the docs.
- Added GrannySetAllowGlobalStateChanges, GrannyGetAllowGlobalStateChanges,
GrannySetThreadIDCallback for thread safety checks.
- Added GrannySampleBlendDagTreeReentrant, GrannySampleBlendDagTreeLODReentrant,
GrannySampleBlendDagTreeLODSparseReentrant, GrannyCreatePoseCache,
GrannyFreePoseCache, to provide a thread safe sampling api for the
Blend DAG. New type: granny_pose_cache.
- Added GrannyGetInMemoryFileCRC as a debugging aid. Checksums the section
memory to help catch memory scribblers.
- Fixed a bug in the x64 version of GrannyRebasePointersStringCallback that
would have prevented raw files from working with an external string
table.
- Fixed a calculation error in GrannyKnotsAreReducible that was forcing
orientation tracks to be represented as full curves when a constant
value would have done just fine. This was exacerbated by a small
amount of noise in the reported transforms from the modeling
packages.
- granny_rebase_pointers_string_callback now takes a granny_uint32 as the second
parameter to match the return value of granny_file_writer_string_callback.
- Fixed a bug in the viewer that could cause a crash if a model was
exported from Max or Maya as "Name Only."
- GrannyComputeBasisConversion returns false if it can't compute a
conversion due to missing granny_art_tool_info.
- Size computation corrected in data type io.
- GrannyGetMagicValueForPlatform in the public API now.
- Added GrannyAcquireMemorySpinlock and GrannyReleaseMemorySpinlock for threaded
memory access. See Granny in a multithreaded environment: The Allocator Lock for the very
limited circumstances in which you need to use these functions.
- PS3 target fixes: endian consistency, and compile settings
changed to fix problems exposed in the wild. This change was back
propagated to 2.6.0.16.
- Improved Granny's handling of the DirectX material in Max. Texture
parameters were not being correctly encoded in the ExtendedData block
for the material.
- Granny for Win32 is now built with Visual Studio .NET 2003 by default,
rather than VC6. Granny source will still compile with VC6.
- Documentation fixes: cleaned up some bad references, added some
sorting to the "Related" links for functions, types, etc. to make
infrequently used APIs easier to find.
- Exporter will allow you to turn off the quantized curve types. This
is not really recommended unless you really know what you're
doing.
- GrannyKnotsAreReducible and GrannyGetVectorDifferences have changed signatures to
more clearly express that EvaluateAsQuaternions and
EvaluateAsVectors are mutually exclusive. granny_vector_diff_mode added to
chose between the different difference metrics.
- (internal) Fixed function signature error in ConvertToStringList.
(Affected PSP build)
- (internal) API generation tool accepts markup for indicating thread
safety, and adds checks to the thunking layer for user debugging.
- (internal) AggrAllocate made thread-safe.
- (internal) Removed tiBufferGlobal and piBufferGlobal, which makes
large swaths of the sampling API fully reentrant. Props to
RichG@Ensemble for calling attention to this.
- (internal) Changed some manual calls to the Comparison callback
to internal AreEqualOrCallback utilities. Fixed a namespacing bug
that prevented these functions from being visible to the rest of
Granny.
- (internal) Mac build ported to current shipping version of gcc.
(Xcode 2.2, gcc 4.0.1 as of this writing.) Required a modification
to a few internal macros, and some new warning cleanups.
2.7.0.1 beta 2006/3/28
- Note that this is a limited distribution beta for 2.7. We do
not recommend that you upgrade to this release unless the
x64 target is important to you. Non-trivial code modification may
be required when upgrading from 2.6 or 2.5 to 2.7 depending on
which parts of the API you are using. The primary thrust of the
rather large group of changes in this release is to make Granny
64-bit clean, and to add the x64 build target. As a bonus
consequence of these changes, it is now possible to output
appropriately converted Granny files for any platform from any
platform. I.e, you can write big-endian Granny files from x86,
which don't require endian marshalling on load for platforms like
Xbox360, PS3, or MacOSX.
- GrannyBeginFile, GrannyBeginFileInMemory, and GrannyWriteDataTreeToFile all take
a PlatformMagicValue parameter that indicates the target platform
to write to.
- Exporter file menu now has an option to write the file natively for
any platform.
- Added GrannyCompressContentsOfMemory to the file compression API.
- Added documentation on granny_skeleton_lod_type, which was missing from
Animation Level Of Detail: LOD Concepts: Skeletal.
- Added new System Dependent Types documentation section to hold info about the
exported basic types.
- Updated the Undocumented Portions of the SDK documentation with functions and types that
were been added since its last update.
- GrannyIsGrannyFile takes a new argument to indicate if the pointer size
for a file is different than the current platform.
- granny_grn_file_magic_values updated. GrannyGRNFileMV is now called
GrannyGRNFileMV_Old, GrannyReversedGRNFileMV is removed. The old magic
values are no longer written to new data files, but are supported
in the reader for backwards compatability. New magic values,
GrannyGRNFileMV_32Bit_LittleEndian, GrannyGRNFileMV_32Bit_BigEndian,
GrannyGRNFileMV_64Bit_LittleEndian, and GrannyGRNFileMV_64Bit_BigEndian
explicitly encode both pointer size and endianess. Previously
endianess was inferred as "opposite of this platform", now we can
explicitly write one byte ordering or the other from the file IO
routines. GrannyGRNFileMV_ThisPlatform added to indicate the native mode
of the platform. This granny_grn_file_magic_value will match the
appropriate magic numbers.
- Added GrannyBeginFileInMemory to complement GrannyBeginFile. This allows
creation of granny_file assets without creating temporary files, at the
cost of a greater memory footprint. Likewise, the Granny compression
routine GrannyCompressContentsOfFile picks up a version that allows you
to use memory file readers, or files that you open yourself,
GrannyCompressContentsOfReader.
- granny_file_writer has been substantially overhauled to virtualize it in
the style of granny_file_reader. This allows us to do things like add
the GrannyCreateMemoryFileWriter. Which we did. In addition, you can now
install your own platform-dependent file system writing routines if
you would like to replace ours.
- Removed GrannyUnlinkFileReader.
- Added GrannyPlatformConvertReaderToWriter to allow conversions between
platforms.
- GrannyReadPartialFileFromReader takes an optional pointer argument to
pass back the file's granny_grn_file_magic_value. This is necessary to
support platform conversions.
- Added granny_intaddrx and granny_uintaddrx types. These are integer types
guaranteed to be large enough to hold a pointer on the target
platform. These should never be written to disk.
- Added new granny_uint64x and granny_int64x types in the user type
section of granny.h. Note that we do NOT support writing 64-bit
values to .gr2 files, so there are no "non-x" versions of these
types.
- Some fields have been renamed to conform more closely to Granny
norms. For instance, the granny_texture_mip_level field Size was renamed
to PixelByteCount, to match a change in the
Pixels field to PixelBytes.
- Removed granny_real64 for consitency. This should be replaced with
granny_real64x. granny_real64 types should never be persisted, which
means that we should have only an "x" type.
- GrannyFixupFileSectionPhase1 and GrannyFixupFileSectionPhase2 now take a pointer
to the fixup array for the section. This prevents double reads on
byte reversed platforms.
- Oodle0 compression is no longer selectable in the exporter, or usable
in the API. Decompression of Oodle0 compressed files is supported for
backwards compatability, but you should switch to Oodle1, it's better
on all axes. Oodle1 compression is the new default in the exporter.
- Removed undocumented SwitchableTypeMember from the granny_member_type
enum. This was never used, and was a source of headaches in the
64-bit version of the library. If you were using this, and
need it back, please let us know.
- GrannyModulationCompositeLocalPose and GrannyModulationCompositeLocalPoseSparse
would return incorrect results if the weights passed in were greater
than GrannyBlendEffectivelyOne.
- (internal) Added extra checks in the string callback replacement
routines to make sure it works portably across 32/64 bit platforms.
- (internal) Added compile-time checking of the size of all exported
Granny types, except for those that are explictly never intended to
be written to disk. Provides error catching if the structure
packing ever does something unexpected.
- (internal) GrannyFixupFileSectionPhase2 was unnecessarily refixing up
pointers if no marshalling took place. This would issue an
unnecessary read to the granny_file_reader passed in.
- (internal) Added ConcatentateFileReader to support in-memory
granny_file_builder operation.
- (internal) GrannyPlayControlledAnimation wasn't properly copying the LOD
errors from the source tracks.
- Fixed a rebasing bug that could cause bone lengths to be incorrect
when retargeting animations.
- Fixed a bug in the viewer that prevented animation LOD from
displaying properly
- granny_granny_head_bezier renamed to granny_head_bezier.
- Spring cleaning! Increased the warning level on all targets, and
cleaned up large numbers of compiler/platform specific warnings.
- Removed code for old Borland compilers
Changes for 2.6, 2006/4/4 [Final build was 2.6.0.16]
Granny 2.6 saw dramatic improvements in the size of compressed curves,
improvements to the Level of Detail system, several new supported
platforms, the introduction of the preprocessor, and another changing
of the guard.
Compressed curves, introduced early in the 2.6 series have
dramatically improved Granny's runtime footprint. In many test cases,
we've seen over 50% reduction in curve memory for the same error
target, with no changes required by client code or in the exporter.
Late in the series, we added curve types that reduce the space
required to store curves that have only a uniform scale component or a
scale with no shear component, making squash/stretch type animation
much more practical.
The other big news is the introduction of the Granny Preprocessor
which will help you integrate Granny into your production pipeline,
and perform common transformations on your Granny data automatically,
quickly, and scriptably. We'll be focusing a lot of development
effort on the preprocessor in coming releases. We've all got more
content to deal with these days, we need tools to make it easier.
The Animation LOD system received stability tweaks, and tighter
integration with the sampling APIs. Towards the end of the release
series, a new LOD option, Skeletal LOD was introduced, which can be
used to good effect with very little effort in your pipeline. Both
systems dovetail nicely, and the preprocessor will begin to help you
handle LOD easily in coming releases.
Finally, on the "Granny Everywhere" front, we added support for the
Xbox 360, PSP, Playstation 3, Maya 6.5 and 7, and 3DSMax 8.
2.6.0.16 final 2006/4/4
- Fixed a problem with the PS3 target. Type aliasing optimizations
in the new GCC compiler can cause incorrect results in Granny.
2.6.0.15 pre-release 2006/3/9
- Maintenance release to fix a curve size bug and to workaround a
problem in Maya.
- Fixed a crash in the OpenFile dialog of the viewer.
2.6.0.14 pre-release 2006/2/17
- Added support for the Playstation 3
- Added PSP support
- Light and camera info no longer inlined in granny_bone. Art tool specific
camera and light info are still contained in ExtendedData
if the option is checked for a bone.
- Viewer toggles/displays skeleton/animation lod independantly
- New function GrannyEndLocalPoseAccumulationLOD, smoothly blends to LOD
skeleton if LOD enabled, and the granny_skeleton has error estimates.
- New function GrannyAddBoneWithInverse to support reprocessing of
skeletons. Prevents numerical errors due to decomposing the
InverseWorld4x4 member in granny_bone to pass into GrannyAddBone as a forward
transform.
- Reworked the documentation on Animation Level Of Detail, to reflect new skeletal
LOD code paths. Updated Granny File Processing Overview: Building Skeletons with LOD as well.
- Added GrannyBuildWorldPoseLOD, which allows you to specify the number of
valid granny_local_pose bones. When the world pose must go outside this
range, it uses the default transform for the granny_skeleton.
- GrannySampleModelAnimationsAcceleratedLOD will take skeletal LOD into
account if it's present.
- GrannyEndSkeletonInPlace now attempts to compute something reasonable
for the LOD parameters in the granny_skeleton. This is intended to be a
"quick and dirty" estimate, for proper lod, you must take into
account the actual animations played on the model, or artist
controlled parameters. You do this by using the new
GrannySetBoneLODError function on the granny_skeleton_builder.
- Added GrannyGetBoneCountForLOD, which computes the range of bones in the
skeleton that are active for a given LOD parameter.
- Added LOD parameters to granny_skeleton and granny_bone. Allows animation-independant
LOD selection to complement the animation specific LOD already in place.
- Bugfix for GrannyRayIntersectsBox and GrannyRayIntersectsBoxAt. The bug caused
rays which are parallel to one of the axes of the tested box to return
incorrect results.
- 64-bit rounding bugfix for the granny clock
- (internal) Added compile time checking of type sizes
- (internal) Small optimizations relating to extracting knots/controls
from compresses orientation curves
- PS2 Library target changed to granny2.a, to match the other
distributions.
- Fixed a distribution problem in which example code was being left out
of the zips with the exception of win32.
- Changed the signature of
GrannyGetSquaredErrorOverCurve, GrannyFindMatchingMember, GrannyGetDataTreeFromFile,
GrannyWriteFileChunk, GrannyOffsetFileLocation, GrannyGetLogCallback, and
GrannyGetSystemSeconds to return results in passed in memory locations, rather
than returning a structure by value. This alleviates a problem with
type aliasing on certain compilers in the thunking layer, and it's just
the Right Thing To Do.
2.6.0.13 pre-release 2006/1/23
- Created native exporter plugin for 3DSMax 8
- Default degree for scale/shear curves was set to 1. Changed to quadratic
for better default compression, and to match the other curve defaults.
- Fixed the GrannyGetSystemSeconds call on Win32 to account for bad behavior in
WinXP SP2 on multicore systems.
2.6.0.12 pre-release 2006/1/16
- Added CompileAssert macro for checking compile time assumptions such as
sizeof(void*) == sizeof(uint32).
- Fixed a bug in DaK32fC32f from the 2.6.0.11 refactor
- Fixed a bug exposed by the compressed scale/shear types that could cause
the solver to scribble past the end of the knot array.
2.6.0.11 pre-release 2006/1/11
- Changed the default orientation tolerance to 0.1 degrees instead of
1 degree. This will not change any existing settings, just the ones
used when you create a new object. 1 degree is actually a good value
for most bones and most objects, but there was a bit of foot-sliding
in some rigs which people objected to. Remember - for best results,
adjust tolerance on a per-bone basis. You don't need 0.1 degrees of
accuracy for finger bones, it's just wasting memory!
- The scale/shear curves for a granny_animation now support three
types of data specication. In order of smallest to largest format,
these are: Uniform Scale, Scale, and Scale/Shear. Previously, if
there was a uniform scale applied to a bone, Granny would export a
full 3x3 scale/shear matrix. Now, it looks at the data to see if
a scalar or a vector is a sufficient representation. New curvetypes
added to support this: granny_curve_data_d9i1_k16u_c16u,
granny_curve_data_d9i3_k16u_c16u, granny_curve_data_d9i1_k8u_c8u,
granny_curve_data_d9i3_k8u_c8u.
- Removed GrannyBSplineSolverInsertKnotsAtMaxError flag for the spline
solver. This method in general requires more knots than the default
heuristic to converge to any given tolerance, so it's just a Bad Idea.
- Granny Preprocessor can now export/supress skeletons separately
from meshes and models (sometimes you want just the skeleton).
- Added doc sections Granny Exporting Overview: Animation Tolerances and
Granny Exporting Overview: Motion Extraction.
- Removed LightWave documentation, as we no longer support Lightwave.
- Updated Animation FAQ: Move to Origin.
- Clarified some areas of Advanced Animation: Remapping and Rebasing Animations.
- Fixed a small formatting bug in the plugin installer stub.
- windows.h and math.h were getting accidentally included in some of
the platform builds.
2.6.0.10 pre-release 2005/11/17
- Fixed a bug in the curve compressor that could cause an infinite
loop with pathological data.
- GrannyFindAllowedLODError only worked for small values of CameraFOV.
Specifically, as the FOV approached 90 degrees, it would get very
wrong results. Fixed.
- Generating uncompressed curves (i.e. raw keyframe data) could cause
a crash sometimes. Fixed. This was a rather academic bug, since
uncompressed curves are gigantic, and should not be used by anyone.
- GrannySetTrackMatchRule now works even if one of the arguments is NULL.
It previously only worked if both were NULL or both were non-NULL.
- Fixed minor bug in wildcard matching.
- Misc. buglets in Viewer graphics fixed.
- GrannyCalculateLODErrorValues now copes with "null" animation
bindings that contain no tracks. It will also object in the error
log for these bindings, as they almost certainly mean a bug in the
app.
- Moved and updated material into its own section in
Advanced Animation: Remapping and Rebasing Animations.
2.6.0.9 pre-release 2005/09/21
- Better memory handling for exports with a lot of meshes
(>1024). Should fit in heavily-fragmented memory a bit
better. There is a limit of 262144 on the total number of
granny_file_info::VertexDatas, but this can now be used by either
different meshes or morph-targets of the same mesh. It's still
annoying to have an arbitrary limit like this, but until we have
Win64 versions of everything, fragmentation is a big problem. The
65536 limit on the number of morph targets per mesh remains.
- If a granny_text_track_entry is outside the selected time range, it is
not exported, just like all the other animation data.
2.6.0.8 pre-release 2005/09/14
- Fixed AnimationAccumulateLoopTransform (which is used by
GrannyGetRootMotionVectors and GrannyUpdateModelMatrix) so that CME now works
with animations that are clamped at one or both ends.
- Certain types of structures inside certain other structures (GrannyInlineMember
embedded in a mixed-marshalling structure) caused file system marshalling
(endian-swapping) to fail. Now fixed.
- GrannyFixupFileSection had to be split into two halves -
GrannyFixupFileSectionPhase1 and GrannyFixupFileSectionPhase2. See the
docs on them for more details.
- Tweaked the behaviour of Reverse16 - can now do odd-numbered and unaligned
reverses.
- Xbox360 sample app copes with rigid meshes.
- Xbox360 library and sample app updated to the latest XDK (1881).
2.6.0.7 pre-release 2005/09/08
- Maya 7.0 exporter.
- New - The Granny Preprocessor.
- Slightly improved speed of PS2 version - "DEBUG" was defined by mistake!
- ConvertTo32BitNormalized alpha-channel fixed for out-of-range weight values.
- Rationalised use of "#if DEBUG" versus "#ifdef DEBUG" throughout the
codebase (the first is more robust in most cases).
- Bumped the standard PC build to warning level 4 (was level 3), and
fixed/disabled the warnings that popped up.
- Added GrannyRecenterAllModelInstanceControlClocks and GrannyRecenterControlClocks
to allow finer control of clock recentering.
- Changed GrannyConvertVertexLayouts so it knows how to convert some of the
more common compressed vertex format variants (such as storing normals as
biased unsigned bytes) back to vanilla real32s. In practical terms, this
means the Granny Viewer can correctly show more types of mesh.
- Ported all the D3D sample apps to DX9.0c (August 2005 update). This was
basically just because the framework's "d3dfile.h" and "d3dfile.cpp"
didn't work with the new headers - but those files were never needed
anyway. There's no changes to any of the interesting code.
2.6.0.6 pre-release 2005/07/25
- Changes to granny_curve2 functions to improve debugging speed. No effect
on the release build.
2.6.0.5 pre-release 2005/07/12
- set_log_file_example.ms fixed to be GrannyStopLogging() rather
than GrannyStopLogging (you need the braces, or it doesn't actually
get called!).
2.6.0.4 pre-release 2005/07/06
- The Granny Viewer now displays the names of inlined structures
in the detailed view. For example, when viewing any of the
granny_curve_data_ structures, they all contain an inlined
granny_curve_data_header. Previously, it just printed out the Format and
Degree parts as if they were part of the granny_curve_data_ structure
itself, which while sort-of-true (they are part of the chunk of data),
was confusing. Now, it prefixes them with the declared name of
the structure itself. This is in fact doubly helpful for curves, because
the name of the curve type is embedded in the nameing of the header
(e.g. "CurveDataHeader_DaK32fC32f"), so you now know what sort of
curve it is very easily.
- Prevented the exporter from ever using the "Identity" curve type for
granny_vector_track curves, because Granny doesn't actually know what type
of data these hold (only the application does), and so has no way of
knowing what "identity" means.
- GrannyGetVectorDifferences can pass in NULL for the Identity argument,
meaning that it doesn't care about comparisons to itentity.
- Added some epsilons to CheckLocalClockAndLoopIndex (internal function)
to prevent annoying benign asserts when granny_control clocks get large.
- Animation LOD speedup by caching the LODed transform inside the
granny_bound_transform_track itself, rather than going out to the
granny_transform_track and sampling each of the component curves. This
avoids a lot of cache misses, and a lot of extra function calls.
- Also sped up non-LOD sampling slightly because at anim-bind time,
constant-value tracks have their LODError set to 0.0f (rather than
the usual +inf), so even if you pass in an AllowedError of 0.0f
(i.e. disable LOD), the two errors are equal, so it still does
the cheap "LOD" lookup. Again, saves cache misses and extra calls.
- Added some internal utility string-handling functions.
- Removed the scary-looking warning in Animation Level Of Detail. It's had a
decent amount of testing now, and the code is good for general public
use. Also various tweaks to the animation LOD section.
2.6.0.3 pre-release 2005/06/16
- Initialised the ease in/out curve data for each control. This
helps people track down bugs where they enable ease in/out
curves without having actualy set the shape up properly.
- Added GrannySparseBoneArrayCreateSingleBone, GrannySparseBoneArrayAddBone and
GrannySparseBoneArrayExpand. For more information,
see Advanced Animation: Sparse Bone Arrays.
- Added functions
GrannyBuildWorldPoseNoCompositeSparse,
GrannySampleBlendDagTreeLODSparse,
GrannyModulationCompositeLocalPoseSparse,
GrannyAccumulateModelAnimationsLODSparse,
GrannySampleModelAnimationsLODSparse and
GrannySampleSingleModelAnimationLODSparse.
These are the same as the previous similarly-named calls, except they
can take a sparse bone array. For more information,
see Advanced Animation: Sparse Bone Arrays.
- Changed functions
GrannyBeginLocalPoseAccumulation,
GrannyEndLocalPoseAccumulation,
GrannyGetWorldMatrixFromLocalPose,
GrannyGetAttachmentOffset and
granny_blend_dag_leaf_callback_sample_callback
to take a SparseBoneArray and/or a SparseBoneArrayReverse. Just pass in
NULL if not using sparse bone arrays. For more information,
see Advanced Animation: Sparse Bone Arrays.
- Renamed internal functions Build*WorldPoseResult* to
Build*WorldPoseComposite* to make stuff a bit clearer.
- For each Build*WorldPoseComposite_Generic function, broke it into
the corresponding new Build*WorldPoseOnly_Generic version and the new
BuildSingleCompositeFromWorldPose_Generic. The SSE versions
are unchanged.
- Added GrannyBuildWorldPoseNoComposite and GrannyBuildCompositeFromWorldPose.
Handy for doing post-animation processing on your world poses
(e.g. ragdoll, complex IK, etc). Note that there are currently no
SSE versions of these, so there may not be much of a speed gain on
PC or Xbox. If you are seeing these functions on your profiles,
email us at RAD and we'll add them.
- Added docs on the above at Notes on CPU and Memory Performance Optimization: Animation speed issues
- Documented GrannyUpdateBlendDagTreeMatrix.
- Added two extra callbacks to Callback DAG nodes. These are used when
GrannySetBlendDagTreeClock and GrannyGetBlendDagTreeMotionVectors are called.
Either or both may be set to NULL if you don't need those callbacks.
See GrannyBlendDAGOld_TypeCallback for more details.
- GrannyGetBlendDagNodeCallbackCallback renamed to
GrannyGetBlendDagNodeCallbackSampleCallback, as slightly more descriptive
now that there is more than one callback.
- GrannyGetBlendDagNodeCallbackSetClockCallback and
GrannyGetBlendDagNodeCallbackMotionVectorsCallback added.
- Added the AllowedError argument to the SampleCallback, which reflects
the LOD value passed to GrannySampleBlendDagTreeLOD. If
GrannySampleBlendDagTree was called, this will be 0.0f.
- Added TangentMergingMinCosine argument to GrannyBuildTangentSpace. This
says how far apart the tangent or binormal of two coincident vertices
need to be before they are NOT averaged together. This is typically
around 0.25f (75 degrees), especially for tangent-spaces that are
automatically generated. But for some meshes, it may need to be
dropped to lower angles such as 0.9f (25 degrees) or less to avoid
welding tangent spaces that are close, but not meant to be welded.
- Added the corresponding GrannySetTangentMergingTolerance and
also the "Tangent merging tolerance" slider to the exporter.
- Fixed a crash in the exporter when there are no materials in a
scene and "double 2-sided triangles" is turned on.
- Fixed a bug when copying DaConstant32f curve types.
This also fixed a bug when exporting constant (but non-identity)
scale/shear matrices from Max/Maya.
- Added finer steps to the exporter progress bar. Doesn't make the
export go any quicker, but at least you know something is actually
happening on the more complex animations.
2.6.0.2 pre-release 2005/05/30
- GrannyGetSquaredErrorOverCurve exposed in the API.
- GrannyFitBSplineToSamples added a *CurveDataSizeInBytes argument that can return
the size of the curve it found (if any). Additionally, both it and
AchievedTolerance may be NULL if you don't care about the answer.
- GrannyCurveInitialiseFormat, GrannyCurveFormatIsInitialisedCorrectly
and GetUnnormalisedRootMotionVectors renamed to have
the US-style "ize" instead of the UK-style "ise", i.e.
GrannyCurveInitializeFormat, GrannyCurveFormatIsInitializedCorrectly and
GetUnnormalizedRootMotionVectors (internal function).
- Tweaked CompressCurve and GetBestCurvesFor (both internal functions).
- GrannyCurveGetDimension now checks for the KnotCount==0 case and returns 0
rather than cause a divide-by-zero crash. Existing function renamed
to CurveGetDimensionUnchecked (internal function only).
- GrannyCurveIdentityNormal added.
- GrannyUInt16Type added.
- granny_curve_builder routines clean up after themselves slightly better
in catastrophic out-of-memory situations.
- GrannyGetBlendDagTreeMotionVectors fixed so that it sets the returned
vectors to zero for the LocalPose and Callback node types. Also,
a typo fixed that caused a crash when doing motion extraction from
Crossfade node types.
- GrannyRemoveTrackInitialTransform will only work for the uncompressed
curve type GrannyCurveDataDaK32fC32fType. If there is demand for it to
work for the new types, it can be fixed, but it's a big job and
it seems that nobody uses this function any more (it used to be part
of a roll-your-own version of motion extraction, now better done
using CME or VDA).
- GrannyBasisConversionRequiresCurveDecompression added.
- GrannyTransformCurveVec3 added.
- Fixed potential stack corruption in
GrannyBuildCompositeTransform4x4 and GrannyBuildCompositeTransform4x3. This may
have also caused strange results (e.g. NANs, etc) when transformations
had scale/shear in them.
- Added a lot of documentation on the new granny_curve2 functionality and
centralized most of the scattered info about curves into just a few
sections: Granny Data Loading Overview: Curves, Granny Utility Function Overview: Curve Internals,
Granny Utility Function Overview: Manual Curve Sampling and Granny Utility Function Overview: Curve Creation.
- Granny File Processing Overview: Changing a File's Coordinate System updated to document tolerance values.
- Granny File Processing Overview: Transforming Curves added.
- Granny File Processing Overview: Building Track Groups updated, and moved the section on
solving b-splines out into its own section in
Granny Utility Function Overview: Curve Creation.
- Removed a bunch of "work in progress" labels in the docs.
2.6.0.1 limited pre-release 2005/5/12
- Note that this was a limited-distribution release with
incomplete documentation and features.
- The entire granny_curve system was almost completely rebuilt with
data compression and quantisation in mind. See the sections
Granny Utility Function Overview: Curve Internals and Compatibility with Older Versions of Granny: Updating to granny_curve2 for more details.
- The exporter will now output compressed curves as well. No extra controls,
since it uses the already-existing tolerance sliders, and picks the format
that reaches the required tolerance for the fewest number of bytes.
- Increased the value of GrannyCurrentGRNStandardTag.
- GrannyDataTypesAreEqualWithNames and GrannyDataTypesAreEqualWithNameCallback added.
- Added DataTypesAreEqualAndBDoesntInclude (internal function).
- Tweaked the behaviour of GrannyFindKnot so that it should be more consistent
when the time passed in exactly matches a knot value. This was very rare
when knot values were floats, and didn't matter even when it happened,
but with the new quantised curves, it's far more common, and important.
- GrannyFindCloseKnot just calls GrannyFindKnot. It may be resurrected if anyone
actually uses it and really really needs the extra speed, but right
now it's just a maintenance liability.
- FindKnotUint16 and FindKnotUint8 added (internal functions).
- GrannyConstructBSplineBuffers completely rewritten to handle the new granny_curve2
types. Results may not be exactly the same even when using the
old uncompressed curve format, but should be more consistent on the whole.
- GrannyEvaluateCurveAtT and GrannyEvaluateCurveAtKnotIndex updated for the new
granny_curve2 types, and can also sample curves in wrapping or clamping modes.
- GrannyGetSquaredErrorOverCurve never actually worked,
because it passed arguments to a child function in the wrong order!
But that was OK, because nothing ever called it, and it wasn't
previously exposed.
- GrannyFitBSplineToSamples changed to handle the new granny_curve2 data type, and
to allow you to check various different compression formats. See
Granny Utility Function Overview: Curve Creation for details.
- Rationalised the spline-curve fitting tolerances. There was a mismatch
between the code that said "add more knots" and the one that said "this
is effectively constant", so when moving the tolerances to relatively
large values (i.e. large approximations, lots of compression), you
could pop abruptly from a curve with quite a few knots to one that
was considered constant. Now, it should first smoothly drop to only a
few knots before dropping to constant.
- Also fixed the orientation tolerances so 1.0 actually does mean
a tolerance of 1 degree of rotation. May need to fiddle with
your tolerance settings somewhat, but hopefully in a more logical way.
- GrannyModulationCompositeLocalPose fixed for corner cases where one of the
inputs had identity transforms and the other didn't.
- GrannyStringDifference tweaked for consistency when one or both of the
strings is NULL.
- Maya 6.5 exporter added.
- Merged the two doc sections on raw files into one (Granny Files, Raw Files, Compression, Sections, and All That Stuff: Converting Granny data to raw data).
- Gave string remapping its own section Granny Files, Raw Files, Compression, Sections, and All That Stuff: Converting Strings to Indices,
since you can use it with both raw files and GR2s.
- Added document section Compatibility with Older Versions of Granny.
Changes for 2.5, 2005/5/12 [Final build was 2.5.0.11]
Granny 2.5 was a gentle evolution of speed enhancements and feature
tweaking, focussed on making Granny far more useable.
The BlendDAG system was tweaked through user feedback to take off the
rough edges. A new explicit IK solver was added, which solves the most
common 2-bone IK cases far faster and with more control than the
existing general-purpose CCD solver.
The exporter was also heavily modified. Most obviously, a 3DStudio Max 7
version of the exporter was added. The exporting of tangent-space
information was made far more robust and memory-efficient.
Annimated vertex attributes switched to a new indexing system that
can save quite a lot of memory in most cases.
The largest change to the exporter was the addition of a
powerful new version of vertex morph targets where the movement
of vertices is stored as a spline curve in pre-deformed (or default
pose) space rather than post-deformed space. This allows
intermingling of bone and vertex animation methods on the same
limbs of the same mesh (for example, a vertex-animated shirt worn
over a conventionally bone-animated body) without interpenetration
and foreshortening problems. It also allows dynamic bone-based
animation methods such as IK to be used while preserving the
fine detail of vertex-based animation. As an additional bonus,
the space required to store the vertex animation is reduced
significantly.
Finally, the Granny Viewer now has an animation LOD preview
mode so that the effectiveness and accuracy of the animation
LOD can be checked before being imported into the game.
2.5.0.11 pre-release 2005/03/14
- Tweaked lots of places to use FloorReal32ToInt32 instead of a tweaked
RoundReal32ToInt32 so that they are more resistant to DirectX playing
with the floating-point precision. Also caused different machines to
export different files using 3dsmax (I think because one used DX as a
renderer and the other used OGL).
- The GrannyCast output now fills the alpha channel of the normal map
with 255 where texels were written (i.e. hit) and 0 where texels were
not written. Edge texels have fractional values. This makes it much
easier to do multiple casts and then Photoshop the results together.
- Added lots of comments about BSplineSolverExtraDOFKnotZero in the
source. It's... um... complicated. In general you want it set, but
there are cases where it's not so good.
- The exporter installer now handles Max7 correctly. Previously the
exporter plug-in worked, but it had to be installed by hand.
- Added "UsingThisHelpFile". Recommended to all users,
both new and experienced.
- Tweaked the structure of Granny Utility Function Overview: Curve Internals to make it easier to read.
- Add a link to "InstallOverview" at the bottom of How Granny Fits In To Your Project: Granny as All of the Above
to help new users.
2.5.0.10 pre-release 2005/01/31
- Added full animation LOD preview and generation mode to the Granny
Viewer. Added a mode for the skeleton view mode that colors the bones
according to whether they are done properly, LOD'd to be cheap,
or are already as cheap as possible (i.e. constant and/or or not
enough data). See doc section Animation Level Of Detail: Granny Viewer Features.
- The code that copes with round-off errors in the vertex bone weight
values had a buglet in it that only happened on some machines with
some versions of Max. Now fixed.
- Doc clarifications in Advanced Animation: Model and Control Iteration,
Advanced Animation: In-place Allocation of Animation Objects and Animation Level Of Detail: More About LOD Values.
- Formatting fixed in Granny Data Loading Overview: Mesh Annotation.
- Dead code removed in granny_downcast.cpp
2.5.0.9 pre-release (internal only)
- There was an invisible (and fatal) limit of 256 morph target frames.
The limit has been raised to 65536, and if you somehow manage to go
beyond that, you get a warning and it is clamped to 65536. Ideally
there would be no hard limits, but this is one place the code gets
really nasty trying to do it dynamically. 65536 frames at 60fps is
18 minutes of animation.
- Stopped raw morph-target data being exported when vertex morph curves
are created. There doesn't seem to be a reason you would ever need both.
- Added missing Pow() function to the math library.
- GrannyBuildTangentSpace was not looking at all the channels of a vertex when
checking to see if two vertices were the same.
- Potential bug in GrannyGenerateTangentSpaceFromUVs fixed.
- Fixed bug in GrannyTriAnnotationSetType.
- Added a preliminary animation LOD preview mode to the Granny Viewer.
2.5.0.8 pre-release 2004/12/14
- Greatly improved the problem of "orphan" vertices that were generated by
GrannyBuildTangentSpace but not actually used by any triangles. In some cases this
could double the vertex count! If you have any meshes you are still
suspicious of, send then along. Generating good tangent spaces
is annoyingly fiddly.
- GrannySetBlendDagNodeChild, GrannyAddBlendDagNodeChild and GrannyIsBlendDagNodeValid got broken in 2.5.0.3. Now fixed.
- The morph_targets sample now copes better with meshes with complex
vertex types (such as tangent spaces) and also meshes that are not skinned.
- Fixed an interesting O(n^2) feature in the exporter.
- OpenGL ARB cruftiness sorted out in the Granny Viewer.
2.5.0.7 pre-release 2004/11/23
- Added bone-relative vertex animation (aka morph-targets) to the exporter,
documented in (obsolete ref) DataOverview_VertexAnimationData.
- Slightly changed BeginTriangleIteration and GetBoneWorldMatrix (exporter internal functions).
- Fixed a bug where morph-target animation interacted incorrectly with vertices that
were duplicated when calculating tangent and binormal data.
- GrannyBuildTangentSpace now also updates the VertexToTriangleMap.
- Added GrannyBuildCompositeTransform4x3.
- Improved internal math libraries for consistency of naming and functionality.
2.5.0.6 pre-release 2004/11/18
- Added GrannyIKUpdate2Bone.
- Preparatory work for bone-relative morph targets.
- Added GetVertexTypeDefinition and GetVertexData (internal mesh-builder functions).
2.5.0.5 pre-release 2004/11/11
- Added the granny_vertex_data::VertexComponentNames array.
- Increased the value of GrannyCurrentGRNStandardTag.
- Added GrannyGetVertexComponentCount, GrannyGetVertexComponentIndex and GrannyGetVertexComponentToolName.
- Added GrannySetVertexChannelComponentNames and associated mesh-builder data and code internals.
- Added GetToolName* functions (exporter internal functions).
- Added support for attributes that are arrays of strings to the Maya exporter.
- Cleaned up the build for various permutations of VC6 and VC.NET.
- Cleaned up the Mac build.
- Added more complete info on building Granny from source in Building Granny from Source: Windows.
- Added more info on the results returned by GrannyRayIntersectsTriangleAt.
- Added section Granny Exporting Overview: More About Maya's Data with details of how the Maya
shader node graph is exposed in a GR2 file.
2.5.0.4 pre-release 2004/10/29
- Added 3ds max 7 exporter.
- Fixed the annotation indexing for vertices.
- Triangle annotations have new-style indexing as well (see (obsolete ref:)
DataOverview_VertexAnimationData for more).
2.5.0.3 pre-release 2004/10/27
- granny_animation now has an Oversampling member that holds how much oversampling
was specified when exporting. For more info, see Granny Data Loading Overview: Animation Data.
- Changed GrannyGetRootMotionVectors and GrannyUpdateModelMatrix to take an extra flag
that indicates you want the inverse of the result instead. This is trivial
for the motion-extraction to compute, but annoying to find once it's all been
converted to a 4x4 matrix (need to find the inverse of the matrix). To get
the old behaviour, simply add "false" as the last argument.
- Changed GrannySampleBlendDagTree so that it does not take a time or set the clocks.
Call GrannySetBlendDagTreeClock to do this explicitly. This now matches the similar
orthogonality of GrannySampleModelAnimations and GrannySetModelClock.
- Changed granny_blend_dag_leaf_callback_sample_callback to match - it no longer takes a time parameter.
- Added GrannySetBlendDagTreeClock.
- Added GrannyUpdateBlendDagTreeMatrix and GrannyGetBlendDagTreeMotionVectors.
- GrannySetBlendDagNodeAnimationBlend can now take a FillThreshold that means the same thing as
the value you pass to GrannySetLocalPoseFillThreshold.
- Vertex and triangle annotations can now be indexed in two ways - from
vertex number to annotation number (new way) or from annotation number to
vertex number (old way). This adds two new tick-boxes to the exporter and a new
flag: IndicesMapFromVertexToAnnotation, which will
be zero for the old behaviour and one for the new behaviour.
See (obsolete ref:) DataOverview_VertexAnimationData for more info.
- Added more combinations of SampleBSplineAxB, such as the dimension 2 and 3(normalised)
ones, allowing you to sample texture coordinates and normals from a granny_curve2.
- Added a lot more parameter checking to the Blend DAG functions.
- Changed a bunch of hard-coded values to be GrannyDefaultLocalPoseFillThreshold instead.
- Added GrannyGetChannelComponentCount and GrannyGetOriginalVertex.
- Vertex morph curve options added to the exporter.
- Clarification of docs in Granny Data Loading Overview: Parsing Extended Data.
- (obsolete ref:) DataOverview_VertexAnimationData documents
morph-targets slightly better, and also documents the cool new
vertex morph curves feature.
2.5.0.2 pre-release 2004/10/8
- Crash fixed in GrannyBuildRestWorldPose when using SSE, if Offset4x4 is not 16-byte aligned
(for optimal speed, you should still align Offset4x4 yourself).
- Added GrannyGetFileSectionOfLoadedObject.
- The exporter should now set the Knot and Control pointers in granny_old_curve to NULL
if the KnotCount or ControlCount values are zero. However, note that
common behaviour for Granny arrays is that this is NOT required. When
seeing if an array is zero, you should not check the pointer, always check
the count. Even if the count is zero, the pointer may not be NULL!
- Added a cautionary tale to the docs about using GrannySetFileSectionForObject.
- Added Building Granny from Source.
- Tweaks to Granny Exporting Overview: Using Scripts to Automate Exporting.
2.5.0.1 pre-release 2004/9/15
- Fixed memory overrun bug in RebaseMemorySizeForCurve (used by GrannyAcquireAnimationBindingFromID).
- Maya exporter fix - now ignores any plugs with "[-1]" in their name (reading them causes file corruption).
- Fixed potential bug when using fptan (though that routine is currently never called by Granny).
Changes for 2.4, 2004/8/27 [Final build was 2.4.0.29]
Granny 2.4 saw a long gestation period while the project changed hands. But the long time meant a
lot of changes. In general things because more robust, more general-purpose and faster.
Max6 and Maya 6.0 exporters were added, along with support for morph
target exporting, and Max's double-sided materials and the EditNormals
modifier. Animated custom attributes of various types are exported as
spline curves and can be sampled with the standard Granny
curve-handling functions. Support for the PlayStation2 and Xbox360
were added, bringing the total numberof platforms up to six along with
PC, Macintosh, GameCube and Xbox.
Two Max and Maya artist tools were added. The first is a GUI wrapper for the many functions of the
normal-map caster, allowing much faster turnaround for previews. The second is the Track Mask
authoring tool that allows easy addition and editing of different track masks on a skeleton.
Combined with better runtime support for track masks, mixing multiple location-specific animations
is now far easier for the artist to control and tweak directly.
A new type of motion-extraction - Variable Delta Accumulation - was added which requires no
preprocessing and captures more general movements than the existing Constant Motion Extraction.
However, CME is still useful to apps because of its simplicity in implementation. On the whole,
applications may mix and match between the two types as they see fit. To complement this,
motion extraction can be performed on any bone in the scene by explicitly specifying a Synthetic
Root Bone - which need not be the actual root bone. This makes life much easier when trying to keep
apart the two concepts of how the game's internal representation moves, and what the visual
animations look like.
Rebasing animations is now free at playback time, with only a small cost when the animation is
first started, and a memory cost of the rebased animation (all managed in a cache). This makes
it far easier to have a huge range of characters in a game, with a huge range of animations,
without having to author every combination separately or take a runtime speed hit.
Animation Level of Detail was introduced, allowing complex animation sets and skeletons to be
used for both close-up work and models in the distance, without wasting processing time on the
details that cannot be seen when far away.
The raw file format is now better supported and more flexible, and the use of CRC'd strings to
reduce memory usage is easier to use. Together they make using Granny on memory-constrained
systems such as consoles far more pleasant.
And finally, the animation blending directed acyclic graph (BlendDAG) was added, which simplifies
the process of specifying exactly how and when animations are composited together to make up
the total motion of a particular object. The DAG can be constructed when the object is created,
and then at runtime parts of it turned on or off as needed, with animations added into the
appropriate nodes as they play or stop. Sampling and blending the animations is now a single call,
however complex the structure of the DAG, simplifying the rendering process and allowing a single
codepath to be used for all animated objects, however complex their animation generation.
2.4.0.29 pre-release 2004/8/24
- Added documentation about the Blend DAG.
- Fixed Maya bug where removing blind data from referenced files
causes hangs later on. This was caused by doing
GrannyClearAllSettings and then doing "select -all". The select
would hang. So now we just clear the data, we don't remove it -
and that seems to work.
- Bug in the Xbox360 decompression routines fixed, as well as DXTn
loading in the sample app.
- granny_blend_dag_node allocation now a fixed-pool thing, just like for
granny_model_instance, so it's much faster and doesn't fragment memory
significantly.
- Added GrannyFindBlendDagTreeDepth, GrannyDuplicateBlendDagTree,
GrannyPrimeBlendDagLocalPoseCache and GrannyFreeBlendDagLocalPoseCache.
- Added the FillThreshold argument to
GrannyCreateBlendDagNodeWeightedBlend,
GrannyCreateBlendDagNodeWeightedBlendChildren and
GrannySetBlendDagNodeWeightedBlend.
- Slightly changed the way AutoFree things in DAG nodes work - if you
set the same object again, it doesn't try to free it, causing a
crash.
- You can pass NULLs into GrannyIsBlendDagNodeValid and
GrannyIsBlendDagTreeValid if you don't need details, just valid/invalid.
- Comments added to the collision detection sample.
2.4.0.28 pre-release 2004/8/19
- Various oodle1 compression utility functions exposed. No docs yet - send us an email if interested.
- Fixed memory leak in GrannyResortTrackGroup.
- Fixed the "Unrecognized degree/dimension combination (2/0)" warning (which was benign, just annoying).
- Support for Xbox360.
- GrannyViewer doesn't chew CPU time when not the focus.
2.4.0.27 pre-release 2004/8/10
- GrannySampleModelAnimationsAccelerated now works with VDA when there is scale/shear in the root bone.
- Added a warning to the exporter when mesh topology changes for each morph target (because Granny can't handle this case).
- Fixed an off-by-one bug in the number of morph target frames exported.
- Fixed a nasty subtle bug when using .asChar() in the Maya exporter.
- Turned off the "GetTypedString failed" error message, as it seems to just be an internal Maya oddity, not a real error.
- When writing a granny_track_group out with GrannySetFileWriterStringCallback set up, the track groups are
now marked as "unsorted". Ideally the app should re-sort them with GrannyResortTrackGroup on load
for full speed, but at least now animations will work without a re-sort, they're just a bit slower.
- GrannyResortTrackGroup will spew a warning to the log if it finds two strings that have been remapped to the same value.
- Exposed GrannyBuildRestWorldPose, because it can be quite useful.
- Exposed GrannyStringDifference.
- Some places in the code were not using the StringComparisonCallback if set - fixed.
- Fixed a bug with VDA motion-extraction when playing multiple VDA tracks or ones with strange weights.
- Fixed a bug where various tolerances (CME, Position, Rotation, Scale/Shear) could not be set or saved in the Max/Maya file.
- Added the "ANSI" standard mesh deformers (i.e. they don't use platform-specific SIMD extension) to the source distribution,
for people who want to build on strange platforms.
- Added some documentation (including a solution to the above topology problem) about morph targets: see granny_morph_target.
- Clarification on how the callback set by GrannySetStringComparisonCallback must behave, and some common problems people have.
- Added documentation on resorting a granny_track_group using GrannyResortTrackGroup and similar after loading a file with remapped strings.
- Added documentation section: Granny Files, Raw Files, Compression, Sections, and All That Stuff: Comparing raw files with GR2 files.
- Removed a misleading comment in Granny Utility Function Overview: Memory Allocator - you must always align memory allocations.
2.4.0.26 pre-release 2004/8/03
- Added animation LOD functionality - see Animation Level Of Detail for all the details.
- GrannyWorldSpaceToWindowSpace now handles OpenGL and D3D cases.
- Slightly too much memory allocated by NewAnimationBinding - fixed.
- Fixed minor epsilon issue in GrannyGetControlRawLocalClock.
- Added internal model_control_callbacks GetControlledAnimation and GetControlledPose.
- Added GrannyGetAnimationBindingFromControlBinding and GrannyGetLocalPoseFromControlBinding
(note that they will return NULL if the binding is not of the sort you asked for).
- Incremented GrannyCurrentGRNStandardTag because of the addition of LOD data.
- Added GrannyGetMeshBindingFromSkeleton, GrannyGetMeshBindingToSkeleton and GrannyGetMeshBindingSourceMesh.
- More rigorous checking in GrannySampleModelAnimationsAcceleratedLOD/GrannySampleModelAnimationsAccelerated.
- Added some more guidance on using motion extraction and move to origin: Animation FAQ: Move to Origin and Understanding Model World-space Movement: Move to Origin and the Synthetic Root Bone.
- Typos in Blending, Layering, and Masking Animations: Layering.
- Added info on exporting Maya's "blind data": Granny Data Loading Overview: Mesh Annotation.
2.4.0.25 pre-release 2004/7/26
- Fixed a bug with rotational motion when doing CME (linear motion is unaffected).
- Added the beginnings of animation LOD - more later.
- Moved the Oodle0 legacy warning to a friendlier place.
- Clarifications about GrannySetTrackGroupTarget in Basic Model Setup and Animation: Playing Animations.
2.4.0.24 pre-release 2004/7/22
- Added GrannyRebasePointersStringCallback.
- Oodle0 compression is now legacy.
If you try to export with oodle0 compression, you will get a dialog box warning you
that it is legacy. It still works for the moment, but it will be completely disabled
in future. Please switch to oodle1 - it's better in every way.
Note that Granny will always be able to read oodle0 files for backwards compatibility.
- GrannySampleModelAnimationsAccelerated has a proper quaternion normalise instead of
a fast-but-not-very-good one. So it is now more accurate, but may be very slightly slower.
- Fixed an off-by-two bug in the LinkCount parameter in GrannyIKUpdate.
- Fixed the advanced_animation tutorial to use GrannyIKUpdate correctly.
- Documented the "material" flag for GrannyCast: Using the GrannyCast command: Specifying The Target.
- Set8 (internal function) renamed to SetUInt8 for consistency.
2.4.0.23 pre-release 2004/7/14
- Fixed a lot of places float and int had been used instead of real32 and int32x.
It's unlikely any of them caused problems, but it's nice to be consistent.
- Split Basic Model Setup and Animation up a bit, putting half into new section - Advanced Animation.
- Slight terminology fixup in Animation FAQ: Animation Floating.
- Typo in Material FAQ: Two-sided materials.
- Clarification on the use of GrannySetTrackGroupBasisTransform.
- Documented a subtle bug in GrannySampleModelAnimationsAccelerated - so now it's a feature!
(I will fix it - just wanted to make sure people didn't fall in the pit of whirling blades in the meantime).
- Interesting usage case for allowFallback:false noted in Using the GrannyCast command: Controlling hit-selection.
- Added GrannyReadFileSectionInPlace, plus docs.
- Typo in Granny Files, Raw Files, Compression, Sections, and All That Stuff: Converting Granny data to raw data.
- Clarifications in Granny Files, Raw Files, Compression, Sections, and All That Stuff: Converting Granny data to raw data.
- Typos in Granny Files, Raw Files, Compression, Sections, and All That Stuff: Converting Granny data to raw data.
- Undocumented Portions of the SDK: Undocumented Functions and Types listed some things that are actually documented!
- ModulusLocalClock (used by various granny_control local clock functions) had an off-by-one bug
when playing backwards.
- Using a string callback when writing files now undoes its corruption after writing.
Previously, the values returned by the callback actually stomped on the string pointers
in memory. Worse still, they stomped on some global string pointers. This made it
impossible to write more than one file out per run. So that's fixed.
2.4.0.22 pre-release 2004/7/7
- Typo in Advanced Animation: Advanced Control Operations.
- Clarification on naming at the end of Granny Data Loading Overview: Vector Tracks.
- Fixed the distribution so that the GrannyCastUI and GrannyTrackMaskUI are actually included. Sorry about that...
- In GrannyCast, in Maya, fixed the suffix flag so that -suffix "" correctly sets
the suffix to nothing, rather than the default.
- GrannyGetControlDuration and GrannyGetControlDurationLeft should now do the correct things
even when the speed is set to a negative number.
- GrannySetControlTargetState added to let you synchronise up animations so that at a
particular time in the future, they are at a particular state.
- ModulusLocalClock (internal function) changed to be more resistant to precision
losses and catch more out-of-range cases.
- Fixed linker problems on some platforms with the various infinities and
NANs in granny_floats.h (Real32AlmostInfinity and suchlike).
2.4.0.21 pre-release 2004/6/29
- Added the tutorial "FirstGranny" along with source. A good hands-on introduction
for new Granny users, though also some interesting stuff for old hands as well
(such as a brief intro to the BlendDAG system).
- The Max and Maya exporters now allocate more, smaller chunks of memory instead
of one big chunk of memory. It's the same total size, but on a heavily
fragmented virtual memory space (e.g. Max's and Maya's) it can be hard to
find enough contiguous space for one big block. This should help a bit when
exporting really big models. Let us know if it doesn't help all that much,
and we'll think of something else to try.
- To make motion extraction easier, and to allow motion extraction with complex
skeletons, you can create an explicit Synthetic Root Bone
when exporting animations. See Understanding Model World-space Movement: Move to Origin and the Synthetic Root Bone for details.
- Addition of the GrannyTrackMaskUI. This allows easy creation and editing of
attributes in Max or Maya that can be turned into a granny_track_mask using
GrannyExtractTrackMask. See the sections Granny Exporting Overview: Authoring Track Masks
and Blending, Layering, and Masking Animations: Creating Track Masks for more details.
- Documentation priorities. Hopefully this should lead to clearer docs over time.
- The GrannyCast GUI is now included in the distribution. See Using the GrannyCast command: The GUI.
2.4.0.20 pre-release 2004/6/17
- granny_scalar_track is replaced by granny_vector_track, which also lives in granny_track_group.
They're exactly the same, but they have a "Dimension" value that tells you what the dimension is.
Not strictly necessary, since Dimension=NumControls/NumKnots, but it
avoids doing a divide to find the dimension. Doesn't need any special conversion
because the exporter has never previously generated any animated scalars!
- The Max and Maya exporters will generate animated vector values for any animated custom attributes.
See the new documentation in Granny Data Loading Overview: Vector Tracks and Granny File Processing Overview: Building Track Groups.
Note that all custom attributes are still placed in Extended Data,
whether animated or not, so people relying on that data
are still fine. But if animated, they may additionally be made into a granny_vector_track.
- Changed a huge number of "Scalar" to "Vector" in the code.
- Added GrannyFindVectorTrackByName and GrannyFindVectorTrackByRule.
- Tweaked GrannyFindTrackByName and GrannyFindTrackByRule so they will always set
the *TrackIndex value to something. If they fail, it will be set to -1.
- Typo minor fixes in Understanding Model World-space Movement: Move to Origin and the Synthetic Root Bone, Granny Data Loading Overview: Parsing Extended Data and Granny Data Loading Overview: Animation Data.
- Added BSpline samplers for Vec4s for curve degrees 2-4 (quadratic to quartic).
2.4.0.19 pre-release 2004/6/14
- Preparation work for animated scalars (sorry, not exposed just yet).
- Understanding Model World-space Movement: Move to Origin and the Synthetic Root Bone documents InitialPlacement.
- Trivial typos in Granny Utility Function Overview: Curve Internals.
- VectorIdentityQuaternion added.
- Minor clarification and typo fix in Basic Model Setup and Animation: Playing Animations.
- Even more discussion of track masks in Blending, Layering, and Masking Animations: Blending.
- Cleaned up some docs in Understanding Model World-space Movement: Constant Motion Extraction and Understanding Model World-space Movement: Variable Delta Accumulation.
- Added a note about track masks being ignored in Understanding Model World-space Movement: Model Matrix Updating.
- Added the new TYPE_FRGBA to the Max6 exporter.
- Source distribution gremlins fixed (PS2 and other platforms).
- Tidied up GrannyWorldSpaceToWindowSpace.
- AnimationAccumulateLoopTransform() (used by GrannyUpdateModelMatrix) so it should now handle all possible
cases of VDA when animations are looping, not looping, looping at only one end, etc.
- Crash bug fixed in AnimationAccumulateLoopTransform() (used by GrannyUpdateModelMatrix)
when using VDA and the root bone has no orientation keys (does not rotate at all).
- Added CheckBoundedFloat32.
- Updated the advanced_animation.cpp sample app to Granny 2.4!
- Fixed the Granny Viewer so that motion extraction and setting the clocks is done in the right order
(reminder - set clocks, call GrannyUpdateModelMatrix, then use the matrix with GrannyBuildWorldPose). Makes
very little difference at high framerates, but at low framerates (<10Hz) with VDA, you can
easily see the difference if you do it wrong - feet slipping etc.
2.4.0.18 pre-release
- Maya 6.0 support.
- VC7 support in the exporters (required for Maya 6).
Note that anyone building the exporters themselves (or any other plugins) MUST use VC7 for Maya6
and MUST use VC6 for Maya5 and previous. It's all to do with the versions of iostream.h matching up.
- Minor doc typos.
- More info on using GrannyFindMatchingMember.
- Added GrannyExtractTrackMask to make constructing a granny_track_mask slightly easier.
- More discussion in the docs on creating a granny_track_mask. Feedback is appreciated.
2.4.0.17 pre-release
- New letters from various people in Material FAQ: Two-sided materials now that Granny supports the two-sided material flag.
- GrannyGetRootMotionVectors uses an epsilon instead of testing against 0.0f.
- Use of GrannyTrackWeightEpsilon documented in the Blending, Layering, and Masking Animations: Blending section.
- More granny_limit.h constants added, and documented in Granny Utility Function Overview: Granny Internal Limits.
- Index buffer usage clarified in Granny Data Loading Overview: Mesh Data.
- GrannyUpdateModelMatrix docs improved, specifically its interactions with GrannySetModelClock and GrannySetControlClock.
- Early-outs to GrannyModulationCompositeLocalPose for degenerate cases (blend weights at 0.0 or 1.0).
- Fixed case where GrannyGetControlDurationLeft could return uninitialised data (when the control speed is set to 0).
- Fixed bug in GrannyBuildMeshBinding4x4Array - if FirstBoneIndex was not zero, not enough bones would be processed.
- Correctness tweaks to GrannyPlayControlledAnimation for zero-length animations.
- GrannySampleBlendDagTree does less copying of data, and uses less temporary memory
But you must remember that the result of the call is read-only and will not be valid
once you do another BlendDag call. More docs on this whole family of calls in a bit.
Do yell if you want some early info though.
2.4.0.16 pre-release
- Added the GrannyCopyLocalPose function. Does exactly what it says on the tin.
The source and dest bone counts must be identical.
- Fixed an invalid address access in GrannyModulationCompositeLocalPose when not using a granny_track_mask. Sorry about that.
- Bodged around a crashing bug in the Bink0 compressor while we investigate further.
Please note that Bink0 is LEGACY. Bink1 is faster to compress and decompress, and
gives better compression. There is no reason to use Bink0 unless you have some
legacy apps that still only know about Bink0. Remember to update your GES files and suchlike.
- Clarified the rules on which file sections objects will go in if not explicitly labelled
- Added support for 2-sided materials in Max. Set the flag in the material,
then also set the "Double 2-sided Triangles" flag in the exporter settings.
This will create each triangle twice, once normally, and once with opposite
winding (clockwise/counterclockwise) and flipped normals. The default for the
"Double 2-sided Triangles" flag is OFF, so the default behaviour is preserved.
If anybody wants this in Maya, tell me how your artists want to drive it and it
can be added - the problem is that Maya does not seem to have per-material
or per-triangle control of this, only per-mesh, which is usually overkill
- The Max "Edit Normals" modifier is now supported. Only works for Max6,
not Max5 (it was partly broken in Max5 anyway). No UI changes
- if the modifier is there, it just works
- GrannyGetPickingRay now actually works, in addition to being more numerically stable
2.4.0.15 pre-release
- GrannyGetControlDuration and GrannyGetControlDurationLeft now return "almost infinity" (0x7f0fffff) instead
of actual infinity when the animation is a looping one. This avoids possible problems on platforms
that don't support INF such as PS2 or SSE
- GrannyLoadSettings command in Max/Maya now affects all instances of a texture in a scene, not just the first one it finds
- Minor typo fixes in docs
- GrannySetValue will now find combo-box-dependent items (such as "X Position Tolerance" in the CME group)
- Many misc fixes to the granny_blend_dag_node system
- Grew some arrays in the exporter that should fix some crashes when exporting objects with many non-smoothed areas
- PS2 sample tweaks
2.4.0.14 pre-release
- SampleTrackUUULocal clamps to the end of the control array
- GrannyGetPickingRay is now more numerically stable
- Fixed Max exporter bug where some bones' meshes were not being exported
- Added the granny_blend_dag_node suite of functions (no documentation yet)
- Fixed large imprecision when doing rebasing of animations. Results are now much closer to what you'd expect
- PS2 sample app copes better with large models
- PS2 sample app has a better-looking model
- GrannyModulationCompositeLocalPose now takes two weights instead of a single one. Set WeightNone to 0.0 for the same functionality as before
2.4.0.13 pre-release
- Improved PS2 support
- VC6 .dsp files added back into distribution
2.4.0.12 pre-release
- Added ability to play back uncompressed curves in viewer and in
run-time whenever non-accelerated features are used (ie., when
not using GrannySampleModelAnimationsAccelerated or VDA)
- Fixed typo in GrannyLinearBlendTransform
- Fixed typos in the DX8 and OGL basic loading samples
- Added OGL function pointers to gl_extensions.h/cpp
- Added PS2 support
2.4.0.11 pre-release
- Fixed bug with Maya "help GrannyCast"
- Allowed setting of combo-boxes from scripts
- Added docs for the new casting flags
- Fixed some build paths from absolute to relative
- Added John Miles' Maya "export everything" script to the contrib directory
- Changed Material FAQ: Two-sided materials to updated info for one-sided material rendering in D3D
- Clarified Basic Model Setup and Animation: Playing Animations
- Fixed typos in Animated Mesh Deformation: Software Mesh Deformation
- Fixed typos in Advanced Animation: Advanced Control Operations
- Clarification in Advanced Animation: The Animation Binding Cache
- Fixed typos in Using the GrannyCast command: Casting Basics, Using the GrannyCast command: Using Mirroring with Object-space Maps, Using the GrannyCast command: Handedness and Tangent-space Maps, Using the GrannyCast command: Switch Summary, Granny File Processing Overview: Working with Meshes, Granny File Processing Overview: Transforming Curves, Understanding Model World-space Movement: Introduction
- Added note on DXTn format conversion in Granny File Processing Overview: S3TC-format Textures
- Clarifications in Granny File Processing Overview: Building Track Groups
- Reorganisation of docs in Granny File Processing Overview: Writing Data Trees
- Clarifications in Granny File Processing Overview: Working with Meshes
- Clarification in Granny Files, Raw Files, Compression, Sections, and All That Stuff: Converting Granny data to raw data
- Clarification in Granny Utility Function Overview: Camera Utilities, and associated bugfix in granny_camera
- Doc bug fixed in Granny Utility Function Overview: Curve Internals
- Improved speed of Maya exporter in pathological cases by 100x!
- Linux compiles made less hassleous
- Added a few asserts
- Fixed bug with GrannyRayIntersectsSphereAt (never returned -1)
- Bugfix in ConvertToStringList
- Probably improved GrannyInvertTriTopologyWinding
- Fixed Max 5 & 6 auto-detection for the plugin installer
- Added the ability to specify U, V, and N multipliers to the
normal casting utility
- Added "cast furthest", floor, ceiling, front-facing/back-facing
control, and absolute value control
- Fixed a bug in GrannyRemapAllAnimationBindingPointers that was
causing it to miss some bindings for an animation
- Fixed a bug in QuaternionDifferenceToAngularVelocity that
was causing VDA to operate incorrectly
- Added warning suppression to granny_namespace.h for people who
don't like to see MSVC's meaningless warning messages
- Fixed a #if bug in granny_bink0_compression.cpp that was picking
the wrong move macros for XBox
- Add compatibility #ifdef for xbox_granny_xtl.h in case people need
to build some XBox components on Win32
2.4.0.10 pre-release:
- Added GrannyGetRootMotionVectors
- Added GrannyClipRootMotionVectors
- Added GrannyApplyRootMotionVectorsToMatrix
- Added GrannyApplyRootMotionVectorsToLocalPose
- Changed the default behavior in the run-time library to be
consistent with the old auto-selecting extraction system, such
that GrannyNoAccumulation is chosen if a file was not exported
explicitly with some type of root motion
- Added root motion type specification control to all exporters
- Added Notes on CPU and Memory Performance Optimization
- Added GrannyCreateControl
- Added GrannyUseExistingControlForAnimation
- Added GrannyFlushAnimationBinding
- Added GrannyGetFirstBindingForAnimation, GrannyGetNextBindingForAnimation
- Added GrannyGetFirstUnusedAnimationBinding, GrannyGetNextUnusedAnimationBinding
- Added GrannyIsAnimationUsed
- Added GrannyRemapAnimationBindingPointers, GrannyRemapAllAnimationBindingPointers
- Changed granny_animation_binding_identifier to store a track group index
instead of a pointer to a track group
- Fixed a bug in the morph target sample app that was causing a
divide-by-zero
- Fixed a bug in the exporters that was causing the omission of
vertex weighting data from morph target vertex streams
- Changed GrannyEndFileRaw to be GrannyEndFileRawToWriter, and made a new GrannyEndFileRaw
that takes a file name to be consistent with GrannyEndFile
- Added Granny Files, Raw Files, Compression, Sections, and All That Stuff
- Added Understanding Model World-space Movement
- Worked around a bug in the MAX header files that was causing the
wrong memory allocator to be used in certain instances involving
scripting, which would cause MAX to crash at some indeterminate
point in time
- Fixed a bug in the animation binding cache that was causing
some memory to be leaked in GrannyFlushAllBindingsForAnimation
- Added a work-around for a bug in all known versions of Maya that
was causing file errors to occur on a phantom "uvst" attribute,
which apparently occurs whenever you ask Maya about a uvSet[-1]
attribute (simply asking about it creates the irreparable file
corruption)
- Fixed a bug in GrannyInvertTriTopologyWinding that was ignoring 16-bit
indices
- Fixed a bug in the Maya plug-in that was causing GrannyCast to
malfunction when parsing parameters
- Fixed a bug in the Macintosh version of GrannyConvertIndices that was
causing erroneous results in 32-bit to 16-bit index conversion
- Changed the animation binding cache to default to being off for any
non-active animation (to prevent crashes in the case where people
don't know about it and don't call one of the flush commands)
2.4.0.9 pre-release:
- Added support for settings floating point export parameters from
MEL and MAXScript
- Added support for Maya's "Z is up" switch, so coordinate transformations
still work properly even when the switch is set
2.4.0.8 pre-release:
- Added GrannySetControlForceClampedLooping
- Changed Move to Origin default back to true, since multi-axis
rotational motions pretty much require it, even with the new
system
- Fixed the exporter mesh processing so that meshes would not be
split for tangent space creation if no tangent spaces were requested
- Made the UV overlay feature of the viewer display all UV channels
that appear in the mesh (each one in a different color)
- Changed exporter to pass GrannyBSplineSolverExtraDOFKnotZero and
GrannyBSplineSolverForceEndpointAlignment flags to the solver by default
- Changed the behavior of GrannyBSplineSolverExtraDOFKnotZero to insert
knots slightly off of zero, instead of directly on, so that no
special care is needed to select the knot range at playback time
- Added GrannyBSplineSolverForceEndpointAlignment
2.4.0.7 pre-release:
- Changed the exporter user interface to default to using the
new accumulation mode
- Changed GrannySetTrackGroupAccumulation to take a granny_accumulation_mode
parameter instead of a boolean, to support choosing between the
three different types of accumulation now supported
- Added support for a new motion accumulation type which requires
no pre-processing
- Changed the tangent space generator to use winding instead of
space proximity to decide when to split vertices (which is what
it was supposed to be doing in the first place, but wasn't)
- Changed GrannyMatrixBufferAlignment to be 16 instead of 32
2.4.0.6 pre-release:
- Fixed a bug in the new optimized animation rebaser that was
causing rebased animations not to work properly
- Fixed a bug in the MAX 6 bindings that was causing heap corruption
- Fixed a bug in the initial transform computation in the exporters
- Added GrannyResortAllAnimationTrackGroups and GrannyResortAllFileTrackGroups
utility functions
- Added GrannyResortTrackGroup
- Changed the granny_track_group_builder to use a string callback for sorting
if one exists
- Added a bone-count parameter to GrannySampleModelAnimationsAccelerated
2.4.0.5 pre-release:
- Fixed a bug in GrannyFindTrackGroupForModel which was causing it to
ignore a user-set string comparison callback if there was one
- Fixed a bug in the set_value_example.ms example script that was
missing a pair of parentheses after GrannyClearAllSettings
- Fixed a bug in the MAX exporters that would cause them to crash if
no base texture coordinate channel was present
- Added a MAX 6 exporter to the distribution
2.4.0.4 pre-release:
- Changed granny_track_group_builder API names to have begin/end semantics
- Removed the granny_string_table_builder - granny_string_table's can build
themselves now
- Removed the GrannyMaximumPointersPerFile limitation
- Changed GrannyFindTrackByName to use sorted tracks where available to speed
up animation binding and searching
- Changed the granny_track_group_builder to always build tracks in alphabetical
order, so that they can be looked up in O(log n) time instead of O(n)
- Optimized the animation binding tests for quaternion mode
- Removed string table from files, changed to using a more flexible
string system for exporting - this allows for much larger scene
files as well
- Improved speed and flexibility of the exporter and GrannyRebasePointers by
switching from hash tables to AVL trees
- Added an option to the exporters that allows meshes to be bound to their
nearest included parent bone, so that the bones of unmoving meshes can
be collapsed to their parents
- Optimized the granny_bspline_solver code so it can handle extremely large
sample sets
- Added ExtendedData field to the file format
- Added a slider to the exporters that controls the amount of
animation oversampling
- Fixed a bug in the viewer that was causing the near clip plane to
be set incorrectly
2.4.0.3 pre-release:
- Fixed a bug in the viewer that would cause it to crash on Unicode
filenames
- Changed GrannyRebasePointers to take a boolean which says whether or
not strings should be rebased, so you can replace strings with
hash values and the rebaser won't mess it up
- Changed to using a faster implementation of fmod on X86 processors
- Fixed a documentation bug in Advanced Animation: Advanced Control Operations
that was erroneously referencing GrannyGetControlRawLocalClock when it
should have been GrannyGetControlLocalDuration
- Added support to the viewer for seeing models without their initial
transform, so the effects of "move to origin" could be more easily
inspected
- Added options to all exporters to control what axes of translation
and rotation would be involved from "move to origin"
- Fixed a bug in the file writing code that was causing user-supplied
string pointer replacements to be erroneously ignored
- Fixed a bug in the math inlines that wasn't properly using the fmod
intrinsic
- Placed guards around genre_demo DX8 harness calls to prevent DX8
from complaining about zero-sized index buffers
- Changed the viewer to use an infinite far clip plane, so animations
that span large areas won't be difficult to see
- Fixed a bug in the documentation for GrannySetFileWriterStringCallback that
had the last two parameters transposed
- Fixed a bug in the granny_variant_builder that, in extreme circumstances where
there actually was no data in the variant for some reason, would cause
the automated file writing and conversion code to misinterpret the
variant and cause later objects in the system to be processed incorrectly
2.4.0.2 pre-release:
- Fixed a bug in the motion extraction code that was causing multi-axis
rotational extraction to work improperly
- Changed GrannySimilarityTransformTrackGroup to properly handle animations
which were exported raw (ie., without knots but WITH samples)
- Changed the docs for GrannyGetWorldPose4x4 to explicitly state the layout
of the matrix to avoid confusion
- Worked around a bug in Maya where it would occasionally return -1
as the material index for a triangle
- Fixed a bug in the automated quaternion mode detection code that
was causing the mode to be selected incorrectly for some animations
- Changed the animation internals to do pre-transforming of rebased
animations, so it is essentially free performance-wise to use
rebased animations, however they do still use more memory than regular
animations
- Changed GrannyDumpStatHUD to print out the performance statistics
in order of decreasing time percentage
- Added granny_stat_hud_animation_types
- Fixed a bug in the animation binding code that would cause a crash
if the user overrode the granny_string_comparison_callback but returned
inconsistent results
- Fixed a bug in the granny_string_comparison_callback usage that was
preventing it from being called during GrannyFindBoneByName and
GrannyFindBoneByNameLowercase
- Patched around a bug in the Oodle-1 decompressor that would cause
it to overwrite the end of the decompression buffer if certain
overflow bytes at the end of the compression buffer were not set to 0
2.4.0.1 pre-release:
- Added frame-capture morph target exporting to all exporters.
Changes for 2.3, 09-03-2003 [Final build was 2.3.0.7]
The primary change to Granny 2.3 was the addition of updated Oodle
and Bink compressors. The exporters now support the old compressors
and the new updated compressors, and you can select which ones you
want on a case by case basis. The primary benefit to the new compressors
is speed, but they also often result in smaller files as well.
Although it was designed to be primarily a compressor update, Granny 2.3
actually has quite a few other new features worth noting. First is
the addition of GrannyModulationCompositeLocalPose, which greatly simplifies
the process of layering multiple sets of blended animations on top
of eachother.
Second is "raw data" support, which allows you to convert any amount
of Granny data into a single, flat-packed raw chunk. This raw data
can then be read directly by you, and used in-place with only a
simple, fast call to GrannyRebasePointers. This makes it much easier to
get optimal streaming working on consoles, and makes it much easier to
manage and page the memory taken up by Granny resources at run-time.
Third is a massively memory-optimized animation core. The animation
internals now aggressively cache run-time status data, which means
you can have, literally, ten to twenty times more animations playing
at once while using the same memory footprint as previous versions of
Granny. Furthermore, you can have direct control over the cache
where necessary by using the new granny_animation_binding set of APIs.
Finally, new utility functions have been added to make it easier to
control the weights in a granny_track_mask. The
GrannySetSkeletonTrackMaskFromTrackGroup,
GrannySetSkeletonTrackMaskChainDownwards, and
GrannySetSkeletonTrackMaskChainUpwards functions can often make it a
one-call operation to do complex mask setup.
2.3.0.7 release:
- Added documentation for GrannyModulationCompositeLocalPose
- Fixed the documentation in
Inverse Kinematics to correctly explain the
parameters to GrannyIKUpdate
- Added documentation for granny_track_sampler and its associated functions.
- Added documentation for granny_animation_binding and its many associated
functions and structures.
- Added documentation for GrannyConvertFileInfoToRaw, GrannyConvertFileToRaw,
granny_file_writer_string_callback, granny_string_comparison_callback,
GrannySetStringComparisonCallback, GrannySetFileWriterStringCallback,
and GrannyRebasePointers
- Added documentation for GrannySetSkeletonTrackMaskChainDownwards,
GrannySetSkeletonTrackMaskChainUpwards
- Added documentation for GrannySetSkeletonTrackMaskFromTrackGroup
- Documented the b-spline solver core source code
2.3.0.6 pre-release:
- Integrated changes to the Bink-1 texture compressor so that it
works properly on big-endian machines
- Added granny_quaternion_mode, and changed GrannyAccumulateLocalTransform and
GrannyEndLocalPoseAccumulation to support its use
2.3.0.5 pre-release:
- Changed the way animation blending works to be more self-consistent,
so even animations which are not instantaneously decidable still
blend properly.
- Added GrannyDecompressDataChunk
2.3.0.4 pre-release:
- Added GrannySetSkeletonTrackMaskChainUpwards and
GrannySetSkeletonTrackMaskChainDownwards
- Added GrannyRecompressFile, GrannyConvertFileInfoToRaw, and GrannyConvertFileToRaw
file utility functions
- Fixed a bug in GrannyRebasePointers that was causing it to incompletely
fix up granny_variant types
- Made caster print out a completion of one-hundred percent upon
finding that there is nothing to cast (previously it would stay at 0)
- Added missing switches to Using the GrannyCast command: Switch Summary
- Added GrannyModulationCompositeLocalPose
- Added the Granny version to the title bar of the exporter so it
was clear what version was being used without having to call
the GrannyVersion script function
- Added the granny_stat_hud structure and its related functions, which
provides quick and easy access to all of Granny's internal statistics
with a convenient auto-dumping scheme that allows you to show the
entire set of statistics in your applications own HUD display
2.3.0.3 pre-release:
- Added the granny_animation_binding structure, which supports both
automatic acceleration of reused animation bindings, and user-controlled
management of animation bindings and low-level sampling
- Fixed a bug in the motion extraction that would cause failures for
rotations that were exactly 180 degrees
- Added the ability to specify per-axis positional and rotational
motion extraction tolerance values
- Added support for arrayed attribute exporting to the MAX exporter
- Added a switchable path separator to the build such that file writing
calls that use directories will still work on platforms that don't
recognize forward-slash (ie., the XBox)
- Added an example MAXScript that shows how to easily add parameters to
a MAX material that will then be exported by Granny
- Added floating-point input controls the exporter settings dialogs
so that tolerance values can be specified in direct tool units instead
of with ambiguous sliders
- Drastically reduced the memory footprint for applications that create
large numbers (many thousands) of control handles
- Fixed a bug in the control internals that could cause an FPU exception
in GrannyRecenterAllControlClocks under certain circumstances
- Fixed a bug in the exporter harness that was causing the Bink texture
compressor to be configured improperly
- Fixed a documentation bug in the example files that was erroneously
referring to a function called GrannyRecenterControlClock, which was
replaced in favor of the direct access to the local clock of the
control
- Fixed a bug in IterateOverSubMembers that was causing raw file writing
not to work properly for inlined data types
- Fixed a bug in the MAX exporter that was causing long animations
(greater than approximately 2500 frames) to be truncated
- Fixed a bug in the MAX vertex alpha exporter that was assigning colors
to the wrong indices.
2.3.0.2 pre-release:
- Added GrannySetStringComparisonCallback and GrannySetFileWriterStringCallback
to allow for using application-specific string hashing so that no
strings need to be stored in a raw-written file
- Added GrannyEndFileRaw and GrannyRebasePointers, which together allow you
to raw-write a chunk of Granny data that is an exact memory image,
so it can be loaded in one shot and run directly after a simple
pointer-fixup pass that changes pointers in place and requires
no additional fixup table (so there's nothing to throw out
afterwards)
- Added support for vertex alpha channels to the MAX exporter
- Fixed a bug in the exporter core that was causing text tracks to
be ignored
- Fixed a bug in GrannyMeshIsRigid that was causing it to return false for
meshes that had no bone bindings whatsoever
- Fixed a bug in the viewer that would cause it to crash for certain
meshes that did not have tangent spaces
- Fixed a bug in the exporter core that was causing a crash for meshes
that were skinned, but weren't actually skinned to anything
- Fixed a bug in the plug-in auto-installer that was causing it to fail
to install MAX 5.0 exporters where appropriate.
2.3.0.1 pre-release:
- Added a DX8 version of the basic_profiling.cpp sample app
- Fixed a bug in the "BasicProfiling_OSStartUp" sample code that was
improperly setting the model matrices
- Added a checkbox to the exporter that selects whether triangles will
be wound clockwise or counter-clockwise.
- Added a combo-box to the exporter that selects the axis system to
use when exporting
- Added flags field to GrannyTransformFile that controls whether or
not various operations are performed on the mesh during transformation
- Fixed an incorrect statement in the documentation about the
bone count passed to GrannyBuildMeshBinding4x4Array in
Animated Mesh Deformation: Software Mesh Deformation
- Added a bump map channel name specification flag to the normal caster,
so custom materials can be properly casted
- Fixed a bug in the MAX normal caster bindings that was causing it
to miss meshes
- Moved a misplaced re-alignment check, that was in the rest pose
direct builder, but should've been outside in the
GrannySampleModelAnimationsAccelerated
- Added COUNT_BLOCK statements to all SSE deformers, so you can see
when they're be using via the inspector_tray
- Added Bink-1 compression
- Added Oodle-1 compression
- Added GrannySetSkeletonTrackMaskFromTrackGroup
- Added GrannyTransformTrackIsIdentity
- Added GrannyTransformTrackIsAnimated
Changes for 2.2, 06-10-2003 [Final build was 2.2.0.6]
Version 2.2 of Granny features a long list of additions, starting with
the much anticipated suite of normal mapping tools. 2.2 features a
fully art-tool-integrated normal caster, which can project arbitrary
mappings from high-res geometry to low-res geometry, for generating
seamless texture maps or normal maps from high-res geometry. The Bink
texture compressor now has a special path that forgoes YUV conversion
and uses higher precision to make sure normal maps get highly
compressed but do not lose accuracy. The mesh processing routines in
all exporters have been updated to optionally generate and include
tangent spaces for vertices. Finally, the run-time library has fast
SSE-optimized CPU-side vertex deformers for tangent vectors and
binormal vectors, which you can use for non-vertex-shader-capable
hardware.
Also new to this version of Granny is a rewritten curve fitting
algorithm for exporting animations faster and more accurately than
all previous versions. This new curve fitter also allows you to
use discontinuous motion curves, both zero-th order (for "teleportation"
in an animation) and first order (for "hard bounces"). All of these
new features are usable-controllable from the exporter interface.
This is also the first version of Granny to have a full per-pixel,
multi-light, multi-texture, real-time shadowing sample app that
demonstrates how to do high-quality rendering with Granny as the
backbone. This demo includes a host of media files you can use
for testing as well.
On the platform front, Granny 2.2 now officially supports the Nintendo
GameCube, and pre-compiled SN-systems compatible libraries are now
available for all of the Granny run-time library. Mac Carbon support
has also been added, for those not targeting Mach-O.
In addition to those major items, Granny 2.2. also adds selection-only
exports, pattern-based animation track binding, support for different
z ranges and infinite far clip planes in the camera utilities, global
tracking of control handles and model instances, MAX 5 and Maya 5
support, easier API access to low-level b-spline sampling, new
high-throughput model updating calls, explicit file section layout
from within all exporters, and a whole host of other fixes and feature
additions.
2.2.0.6 release:
- Fixed a bug in the new bspline solver that was causing it to
produce incorrect results when run multiple times with the
same solver allocation
- Fixed a bug in the deformer selection routines that would prevent
SSE deformers from being selected in certain circumstances
- Fixed a bug in the granny_deformation_type enum that had GrannyDeformPositionNormal
and GrannyDeformPositionNormalTangent assigned to the same value
- Added 0-bone, tangent-space aware SSE-optimized vertex deformers
2.2.0.5 pre-release;
- Added extensive exporter settings for controlling what data goes
into which file section at export time
- GrannyBeginFileDataTreeWriting now allows separate control for default
sections for objects vs. types
- Added GrannyGetStandardSectionName
- Added new standard file sections, GrannyStandardDiscardableSection
and GrannyStandardUnloadedSection
- Added Maya 5.0 exporters to the build
- Added full support for C0 and C1 discontinuous curves to the Granny
curve fitting routines, and added new checkboxes and sliders to the
export interface to allow you to enable discontinuity analysis and
handling
- Added GrannyEvaluateCurveAtT and GrannyEvaluateCurveAtKnotIndex
- Added alignment guards to the Offset4x4 matrix in BuildRestWorldPose,
which is used by GrannySampleModelAnimationsAccelerated, so that it will
no longer execute an illegal instruction if you pass it an unaligned
matrix
- Added an option to the exporter settings that instructs the exporter
not to even store any tracks that have no temporal changes in them
- Added GrannyGetVectorDifferences
- Changed curve reduction to use the maximum error, instead of the
cummulative error (which was stupid)
- Added new optimized SSE vertex deformers for tangent space vertices
- Changed MAX exporter to gather materials on-demand to work around
a bug in MAX's used material reporting, which fails if you attempt
to export a file immediately after importing the file from a
non .max file format
- Added Export Selected support to the MAX exporter, and added the
corresponding GrannyExportSelected MAXScript command to complement it
- Added code to the exporters to automatically detect the usage of
a texture as a normal map, and the user now has additional texure
settings choices in the exporter settings dialog for how to deal
with those maps (separate from the color maps)
- Changed the e-mail addresses in the documentation to be granny1 and
sales1 instead of the old granny and sales versions.
- Fixed a bug in the orientation error measurement that was causing
orientation curves to be exported with several times more knots
than necessary
- Added discontinuous position and velocity detection and fitting to
the curve fitter
- Added the ability to play a looping animation as clamped in the viewer
- Fixed a bug in the exporting harness that was causing uncompressed
raw curves to be exporter incorrectly
- Added GrannyGetGlobalModelInstancesBegin, GrannyGetGlobalModelInstancesEnd(void),
and GrannyGetGlobalNextModelInstance
- Added GrannyGetGlobalControlsBegin, GrannyGetGlobalControlsEnd,
and GrannyGetGlobalNextControl
- Added GrannyGetControlCompletionClock
- Added GrannyDataTypesAreEqual and GrannyDataTypeBeginsWith
- Made GrannySetControlClock cache the dT it generates so that the local
clock generation would only happen on demand (ie., the local clock
value is now lazily evaluated)
- Changed GrannyFindTrackByRule and GrannyFindTrackByName to be case-sensitive,
to be consistent with the new case-sensitivity
- Added GrannyDataTypesAreEqual
- Added GrannyDataTypeBeginsWith
- Added code to GrannySampleModelAnimationsAccelerated to allow it to
accept null Offset4x4 parameters, just like its GrannyBuildWorldPose
counterpart.
- Added code to all tutorials to ask for a file if one was not
supplied on the command line
- Removed the advanced animation tutorial, since we will be
replacing it with genre_demo code and we can't ship the source
art for it
- Added middle-mouse-button and right-mouse-button handling to
the DX8 shared tutorial window handler
- Changed the granny_camera default near clip plane value to 4.0f, to
allow for better z-buffer resolution for 16-bit z-buffers
- Updated DX8 sample apps to use the new granny_camera_output_z_range
camera feature
- Updated all sample apps to have more intuitive camera controls
(ie., right-mouse-button now rotates, like in the viewer, and
middle-mouse-button now zooms and pans)
- Updated "CollisionDetection_DrawBoundingBox" to show how to properly
triangle-cast vs. rigid objects
- Added GrannyGetMeshTriangleCount
- Integrated two more rocking animations for the genre_demo from Theo
- Fixed a bug in the genre_demo app where the local poses for
loaded models were not having their local pose fill threshold set
properly
- Fixed a bug in the exporter harness code that was causing Maya
material graphs with shared textures to not always link the
texture properly to all materials that used it
- Added vertex deformers for GrannyDeformPositionNormalTangent, and
vertex deformers to support it for the 2 and 4 bone case
- Changed vertex deformers to use summed-matrix format, which
is much faster, especially for tangent space deformers
- Fixed a bug in the granny_periodic_loop basis transformer that wasn't
properly accounting for effects that change-in-scale could have
on the dZ parameter
- Fixed a documentation bug in Using the GrannyCast command: Casting Basics where the old
low/high mesh nomenclature was being using instead of the new to/from
nomenclature
- Fixed a bug in the genre_demo's special controllers where it
was still looking for hard-coded bone names
- Found a heinous file mishap that happened with PerForce, that
caused granny_camera.cpp from 2.2.0.4 to have been destroyed
somehow, so I had to rewrite the granny_camera_output_z_range stuff
- Changed GrannyFindBoneByName to be case-sensitive, to faciliate Maya
workflows, and added a GrannyFindBoneByNameLowercase which people can
use if they want to find bones without case sensitivity
- Fixed a bug in SampleBSpline1x1, SampleBSpline2x1, and
SampleBSpline3x1 where they were sampling at triple-strides,
whereas they should've been using single-float strides
- Fixed a bug in the motion extraction routines that was causing them
to improperly track twist, causing problems for 180+ degree
rotational motions
- Added more attribute processing to Maya, so now custom attributes
that are integers or booleans will come out as granny_int32 values,
whereas before they were all exported as granny_real32 values.
- Fixed a documentation bug in Using the GrannyCast command: Casting Basics, where the
MAXScript examples were not using the dollar sign appropriately
- Fixed a documentation bug in Granny Data Loading Overview: Parsing Extended Data
that had an omitted GrannyEndMember at the end of a data type definition
2.2.0.4 pre-release:
- Added the Granny Genres Demo to the distribution
- Added granny_camera_output_z_range to granny_camera, so you can specify which
z-range you want for the camera (ie., 0 -> 1 or -1 -> 1)
- Sped up animation b-spline fitting routines
- Added GrannySetFileExtraTag
- Added granny_stack_allocator
- Fixed a bug in ComputeEaseCurve that was causing invalid values
to be computed for zero length ease curves
- Added support for infinite far planes to granny_camera
- Fixed a bug in the model binding list sorting routines that could
cause an infinite loop for controls that were targetted to
multiple models at once
- Fixed a bug in the SSE detectors that was causing the first
attempt to use them result in an invalid result
- Fixed a scripting bug in a pre-Maya-4.5 workaround that would
cause files which referenced other files with longer frame ranges
to have their ranges improperly re-set during batch exporting
- Fixed a bug in GrannySampleSingleModelAnimation that would cause it
to function improperly for controls that were targetted to
multiple models at once
- Granny viewer now displays granny_transform values in the detail view
- Fixed a bug in the granny_mesh_builder that was causing invalid
vertex-to-vertex maps to be generated when building meshes that
contained no triangles
- Fixed a bug Advanced Animation: Advanced Control Operations that was
referring to GrannyGetControlLocalDuration instead of GrannyGetControlRawLocalClock
- Added GrannyGetTexturedMaterialByChannelName
- Fixed a bug in the ConvertReal64ToString function that was
causing it to prevent zeros improperly
- Added code to the Maya exporter to automatically include parental
transforms for shape nodes when they were used with selection-only
exporting
- Fixed a bug in the big-endian version of the mesh index converter
that had a shift going the wrong way
- Added pragmas to turn off optimizations of GrannyFitPeriodicLoop on
MSVC builds because the optimizer was messing up the function such
that it would not always compute the correct result in all cases
- Added the SimpleCastAndPack MEL script example to demonstrate
how to do a complex cast-and-pack scenario entirely automatically
using the Granny MEL commands
- Added the ability to pack textures directly from a file in
GrannyTexPack
- Added the ability to force all listed channels to be output in
GrannyCast
- Added the ability to control whether or not the GrannyCast progress
window stays open until manually closed
- Added the ability to force writing to a specific file to GrannyCast
- Added the ability to directly specify a material filter to GrannyCast
- Fixed a bug in the Granny 1.x to Granny 2.x converter that
was causing it to fail when converting single-frame animations
- Changed GrannyGetAttachmentOffset prototype to take a granny_int32x as the
second parameter, instead of a pointer (it was mistakenly
declared as taking a pointer)
- Fixed a bug in the normal caster that was cause it not to recover
properly if it couldn't allocate large result buffers for big
texture casts
- Made the caster cast tangent-space textures by default (instead
of object-space)
- Made right-handed tangent spaces the default for the caster
- Wrote an optimized uncast pixel flood filler for the normal caster,
which is vastly (VASTLY) faster than the old one and produces far
superior results
- Fixed a bug in the documentation generator that was causing
the javascript table of contents to fail when used from
inside the Microsoft compiled help viewer
- Fixed a bug in the least squares solver that was causing
invalid floats to be generated for animation curve fits with
very few samples
- Fixed a bug in the tangent space generator that was causing it
to fail whenever there were vertices that weren't used by any
triangles
- Added support for automatic loading of a settings file to the
GRN2GR2 converter
- Fixed a bug in the viewer that was causing tangent spaces to
not be deformed properly
- Fixed a bug in the run-time layer that was causing the deformer
selection to not pick tangent space deformers when it should have
2.2.0.3 pre-release:
- Added the GrannyDeformPositionNormalTangentBinormal deformation type,
and a set of tangent space deformers
- Added tangent space display to the viewer (now when normals are
displayed, tangent spaces are displayed if available)
- Added tangent space exporting to the exporters
- Added GrannyGenerateTangentSpaceFromUVs function to the granny_mesh_builder
- Improved tangent space generation code for normal caster
- Changed the document generator not to use alternate windows
in the table of contents, since the Microsoft help compiler was
messing them up
- Fixed a bug in the Granny viewer that was causing objects
with no textures to only be drawn when texturing was turned off
- Added GrannyExportSelected command to the Maya exporter
- Added enum attribute exporting to the Maya exporter
- Changed the caster to default to writing TGAs
- Added default extension switch to caster (allows switching
between BMP, TGA, and DDS defaults)
- Added GrannyGetControlCompletionCheckFlag and
GrannySetControlCompletionCheckFlag for managing the effects of
GrannyCompleteControlAt more directly
- Added GrannySampleSingleModelAnimation
- Added ability to wrap low-res texture coordinates to the normal
caster
- Added mirroring detection to the tangent-space normal map generator
in the normal caster
- Added left-handed tangent-space normal map generation to the caster
- Added DDS writing to the Granny exporter texture utilities
- Fixed a bug in the animation basis transform that was causing
incorrect results
- Fixed a bug in the caster that would produce incorrect normal
map perturbation directions from bump maps applied to the high-res
surfaces
- Fixed a bug in the BMP/TGA writing routines and in
GrannyConvertPixelFormat that was causing a yellow stripe to appear
down the side of exported images
- Added texture filling to GrannyCast to avoid MIP-map generation
problems due to blackness or grayness in the map
- Added the ability to write TGA files (as well as BMP files) to
the GrannyCast and GrannyTexPack functions
- Added GrannyTexPack function to the Maya exporter
- Added "incandescence" to the recognized map channel type so
GrannyGetMaterialTextureByType would support Maya self-illumination
channels
- Added GrannyProxMap function to the Maya exporter
- Fixed bug in plug-in installer that wasn't accounting for the
possibility that Maya could install on a machine without actually
creating the base directory for module installation.
2.2.0.2 pre-release:
- Made sure all sample apps properly call glDeleteLists() on shutdown
(which they previously weren't)
- Fixed bogus include of granny_platform.h in grn2gr2.h
- Added GrannyFindTrackByRule and GrannySetTrackMatchRule to help deal with
name changes between animations and models
- Fixed a bug in the LightWave exporter that was causing a crash
if an object had no UV coordinates assigned and the exporter
was set to force UV coordinate sets
- Fixed a bug in GrannyGetMeshBytesPerIndex so that it will now return 0
when a granny_mesh has no indices at all (instead of 2, which it was
previously returning)
- Fixed a bug in the Maya exporter that would export improper rotations
if animated rotation pivots were used in the scene
- Worked around a Maya bug in the Maya exporter whereby Maya would
crash internally if asked to iterate over the triangles of an object that
had none
- Added GrannyCast support to the MAX and Maya exporters
- Added statistics gathering support to the XBox build
- Added GrannyFindTrackByName API for retrieving track groups from an
animation by their names
- Added granny_counter_results::TotalCycles and
granny_counter_results::TotalCyclesWithoutChildren fields to
allow more accurate profiling inspection
- Added GrannySampleModelAnimationsAccelerated API for using specially
optimized versions of the blender subsystem for maximum app
performance where some flexibility can be sacrificed
- Modified control core to keep controls sorted by effect per model,
so that applications that use large numbers of dormant controls
do not suffer an iteration penalty
- Fixed a bug in the Maya bone extraction routine that was forgetting
to compensate for parent bone rotational pivot offsetting, which
in rare cases could cause bones to have incorrect positions after
export
- Added support for Maya 4.5's direct image querying API, so that
Maya exporters for 4.5 and up will no longer have to load textures
off disk (which is much slower than the direct access message)
- Added basic alpha-test support to the Granny viewer - this is not
full translucent material support, in the sense that the Granny viewer
does not sort polygons so it cannot render proper transluceny
- Added support for arbitrary sub-materials to the MAX exporter (for
exporting things like the Top/Bottom material type)
2.2.0.1 pre-release:
- Added Maya 4.5-specific exporter to the distribution and auto-installer
- Added MAX 5.0-specific exporter to the distribution and auto-installer
- Fixed a bug in the exporter harness that could cause a crash under
very specific instances where the bones-per-vertex was set to more
than the bone count of the model
- Changed the core Maya exporter routines to use the rotational pivot
of objects as their center instead of the center that Maya reports,
since it produces far superior animation playback quality in many
instances and does not degrade playback in cases where the centers
are coincident
- Fixed a bug in the Granny viewer that was preventing bone names from
showing unless joint rendering was enabled
- Made Granny viewer mesh listing pane automatically set clip planes
so that large meshes can be scene in their entirety
- Changed Granny viewer error messages to correctly report files that
aren't found as such, instead of complaining that they have failed
their CRC check
- Added "-autoplay" switch to Granny viewer command line, such that
all files that appear after the switch will have their animations
started automatically on startup
- Fixed a bug in the exporter "Move to Origin" options that would
produce incorrect results for certain situations
- Fixed an erroneous assert in the GRN to GR2 converter that was
suggesting that triangle counts were coming out wrong even though
they were actually correct
- Changed the material texture search functions to more properly
use "specularColor" for Maya specular textures, rather than
"specularFallOff", which is not technically the correct channel
- Added code to the Maya exporter to handle texture locations specified
by a project workspace
- Made the skeleton builder handle multiple no-parent bones properly
- Improved an edge hashing function in the granny_mesh_builder that drastically
improved the speed of (very) large mesh exporting
- Fixed a bug in the Maya exporter that was causing object normals
to export at a different orientation from the model in certain
circumstances
- Fixed a bug in GrannyEndLocalPoseAccumulation that could create
non-normalized quaternions whenever there was only one animation
playing on a particular model instance
- Added the ability to set granny_camera orientations as a matrix as
well as a quaternion (without having to do conversion in either case)
- Added a work-around to the Maya exporter to handle a descrepency in
Maya's "depth first" iterators, which apparently do not actually
return parents before children in a walk of certain Maya DAGs, thus
causing split-up skeleton exports
- Fixed a bug in the Bink texture compression handler that was causing
it to erroneously endian-reverse textures in certain situations
- Fixed a bug in GrannyRayIntersectsBox and GrannyRayIntersectsBoxAt that would
cause false intersections in the case where the ray was perfectly
perpendicular to one of the planes of the box
- Fixed a bug in the Granny GRN to GR2 converter that was causing
textures to be assigned incorrectly
- Fixed a bug in GrannyTransformFile that wasn't properly applying the
operations of GrannyTransformModel
2.2.0.0 pre-release:
- Fixed a bug in the Granny viewer that was causing bone names to
appear upside-down
- Added Nintendo GameCube libraries to the distribution
- Fixed a bug in the GrannyConvertPixelFormat that was causing 16-bit
textures to be handled improperly on big-endian machines
- Carbonized the Granny shared library and the Granny viewer so that
a single binary can now run on both Mac OS 9 and Mac OS X (previous
Mac builds only ran under X with Mach-O)
- Added initial forced object selection to LightWave exporter so that
displacement helper would always be able to be added in any scene
that needed it (even if something like a light or camera is selected
by the user)
- Fixed documentation bug in Advanced Animation: Advanced Control Operations
where GrannySetControlEaseInCurve and GrannySetControlEaseOutCurve were
missing first parameters in the sample code
- Added displacement helper plug-in to LightWave to work around problems
in LightWave's evaluation order so that animations using IK and
Match Goal Orientation will export correctly
- Fixed identical bugs in GrannySimilarityTransformTrackGroup and
GrannyTransformModel that were causing granny_model::InitialPlacement and
granny_track_group::InitialPlacement to be incorrect ever transforming
a file via GrannyTransformFile
Changes for 2.1, 06-25-2002 [Final build was 2.1.0.5]
The most significant new addition to Granny in 2.1 is the arrival
of the new Granny Viewer. This viewer sports a huge number of options
for viewing your files. You can preview everything from motion
transitions, to UV coordinate layouts, to actual file structure layout.
It's sure to be a big help to all artists and programmers who work
with Granny files, and we will keep expanding on its feature set
over time to allow it to access even more of the Granny SDK's feature
set.
Granny 2.1 also adds a new DLL to the mix: grn2gr2.dll, the
Granny 1.x to 2.x converter. This DLL allows you to convert a
Granny 1.x file into a 2.x file with all the same features available
in the Granny 2.x exporters. Anyone working with old files will
find this makes life a lot easier. Conversion support is also
natively built in to the new Granny Viewer, so it can convert
old files on the fly so you can view them alongside your newly
exported assets.
In addition to the viewer and the converter, there are a host of new
exporter and SDK features. These include a brand new vertex attribute
handling system (which allows much finer control over mesh vertex
layout in the exporter), support for NewTek's LightWave, SSE
optimized vertex deformers for high-performance PC and XBox titles,
support for MAX and Maya mesh annotation (such as Maya's "blind
data"), note track exporting, improved texture and material gathering
code (to avoid duplicated and unused materials and textures),
new automation for centering models and animations,
optional bone-centric triangle lists for faster collision detection,
some great new camera queries, and a whole bunch more.
As of 2.1, the Granny documentation now automatically checks for
updates on its front page (done without sending any information to
RAD), so every time you launch the help, it will tell you whether or
not you have the latest version of the SDK. If we release a new
pre-release or release, it will let you know, and provide a link to
e-mail Mitch for the update, as well as a link to the changelog so you
can see all the changes and decide whether or not it's a good time to
update.
2.1.0.5 release:
- Added Granny help page link to the viewer, and equivalent F1 hotkey
- Fixed bug in viewer that was causing old multi-file selections
to be repeated when a single file was loaded later
- Added documentation for GrannyGetTrackGroupInitialPlacement4x4,
GrannyGetModelInitialPlacement4x4, GrannyGetCameraRelativePlanarBases,
GrannyWorldSpaceToWindowSpace, GrannyWidescreenMonitorPhysicalAspectRatio,
GrannyPALTelevisionPhysicalAspectRatio, GrannyGetMostLikelyPhysicalAspectRatio
- Made the viewer use the skeleton as a bounding box if there are
no meshes in the scene
- Added automatic clip plane fitting to the viewer, so large and
small scenes can both be viewed properly
- Added control-click shortcuts to material and detailed data view
tabs
- Added Granny logo to viewer, along with web page links
- Added documentation for the Granny viewer (Using the Granny Viewer)
- Added GrannyWorldSpaceToWindowSpace to the granny_camera utilities
- Fixed a bug in GrannyFileCRCIsValid that was causing false CRC failure
reports
- Added the GRN2GR2 backwards compatiblity DLL to the distribution,
along with a simple sample app (grn2gr2.cpp) that shows
how to use it (this DLL allows you to convert old Granny 1.x files
into full Granny 2 files)
- Added name reporting to the MAX script bindings so that node names
are properly printed out in change reports
- Fixed a bug in the exporter script bindings that was preventing
slider values from being changed from scripts
- Added a work-around to the Maya exporter that fixes a bug in Maya
versions earlier than 4.0.1 whereby scenes loaded and exported
in batch would not have their time ranges updated properly in Maya
- Fixed a bug in the MAX texture parser that was preventing different
textures with the same target file from being merged
- Added a safeguard in the granny_skeleton_builder to prevent infinite
loops in the case of a skeleton that has parenting loops
- Fixed an over-allocation in the sample code where a size was
being used instead of a count (MaxMutableVertexBufferSize)
2.1.0.4 pre-release:
- Added the full Granny viewer to the distribution
- Changed GrannyBuildCompositeTransform to return transposed matrices
such that its results are identical to GrannyBuildCompositeTransform4x4
without the scale/shear and zero filling
- Fixed documentation bug for GrannyBuildCompositeTransform where the
stride parameter was being passed incorrectly
- Added GrannyGetCameraRelativePlanarBases, which given a Granny camera will
return two types of camera relative basis vectors for doing
console-game style movement (either screen-perspective or
screen-orthogonal)
- Made controls return float infinity when looping
- Changed the MAX exporter to ignore animations with a frame count of 0,
since these would cause a divide-by-zero when the frame timestep
was about to be computed
- Added Backfacing, since it is known in
the triangle intersection calculation, and will allow people to
ignore entry or exit intersections for models and so on
- Added EdgeU and
EdgeV to the granny_triangle_intersection structure
that is returned by GrannyRayIntersectsTriangleAt, since it was computing
these values in the course of the intersection test, and they may
be useful
- Fixed a bug in basic_processed_file_format.h that was causing the
sample code that uses it to fail to get texture coordinates properly
- Fixed a bug in the Maya exporter that was causing GrannySetValue
to fail if "quiet" wasn't set to true
2.1.0.3 pre-release:
- Fixed incorrect endianness define in Bink texture compressor which
could cause bad errors in images (it is mandatory that anyone
using the Bink texture compressor re-export their art assets)
- Fixed a bug in the LightWave exporter that was causing bone names
to be stored incorrectly
- Integrated Bink texture compressor patch from Jeff that fixes
a rare memory leak condition
- Updated "CollisionDetection" to demonstrate how to use the bone
triangle arrays if they exist
- Updated "BasicLoading" to demonstrate how to do model
matrix updating and placement
- Added new checkbox to the exporter settings to control
whether or not the bone-based triangle arrays are included
- Added new fields to the granny_tri_topology structure so that people
doing triangle-accurate intersections could figure out exactly
which bones could be considered "hit" when a particular triangle
is hit, without having to go through all the bones
- Added support to exporters for generation of bone-based triangle
arrays for collision detection (the TriangleIndices
array)
- Changed exporters so that they never output multiple copies of
the same texture, even if the artist instantiated multiple versions
of that texture
- Moved texture-specific parameters in MAX exporter to the material
that corresponds with the texture, so that the information would
be per texture instance, so that when I stop exporting duplicate
textures, the per-texture settings will not be lost
- Fixed a bug in GrannyEndFile that would not free all resources if
it was unable to write the file properly
- Changed the way the granny.h file is generated to support forward
declarations properly in both C and C++
- Added GrannyGetTrackGroupInitialPlacement4x4 and GrannyGetModelInitialPlacement4x4
- Add "Move to Origin" check-box in exporters that allows animations
and models to be moved to the origin and their displacements stored
into the new added InitialPlacement and
InitialPlacement fields
- Added missing basic_file_processing header to distribution
- Fixed a bug in the GrannyClearAllSettings() MEL command that was
missing the root settings node during the clear, so top-level settings
weren't getting properly reset
- Fixed a bug in internal DataTypesAreEqual that was causing
incorrect results, which could adversely affect the file converter
and the deformer picking routines
- Added an exporter checkbox for swapping the R and B channels
of exported vertex colors
- Fixed bug in animation processing that was telling the periodic
loop decomposer to decompose with one to many steps, which caused
slight rotation acceleration anomalies
- Made Maya exporter only export materials if they're actually used
in the scene
- Added support for "Export Selection Only" in Maya exporter
- Fixed hyperlinks in Inverse Kinematics to
properly link to the WorldPose and
LocalPose parameters
- Changed SourceVertices to be const
- Removed -Ow from the compiler switches for MSVC, since there
is intra-function aliasing in some places
2.1.0.2 pre-release:
- Fixed bug in documentation generator that was causing changelog
entries to be referenced as tutorial sections in the linking menus
- Added documentation for granny_exporter_info
- Added documentation for granny_tri_annotation_set and granny_vertex_annotation_set
- Added documentation for GrannyReadAtMost and GrannyReadExactly
- Modified the cplugin installer to properly change "plugins were" to
"plugin was" in the case where only one plugin is installed
- Added the LightWave exporter to the distribution process and the
self-installing exporter executable
- Put up warning for uncompressed animations in the run-time library,
so people will know if they're accidentally using them
- Fixed bug in the exporters that would cause non-compressed animations
to be stored incorrectly, which would cause the run-time library to
fault when playing them
- Changed vertex deformer matching routine to allow deformers with
matching tail copies to be used even if the names of the elements
do not necessarily match (this allows named UV sets and such to
still work), and it will not issue a warning to notify you when
this behavior occurs
- Fixed a bug in the API generator that was causing macros with
parameters to be ignored (this fixes the granny.h errors regarding
the GrannyCloseFileReader, GrannyReadAtMost, and GrannyReadExactly macros)
- Changed GrannySimilarityTransformTrackGroup to properly handle the case
where the basis vectors are 0
- Changed order of operations in exporter control flow to ensure
that regardless of inclusion settings, all skeleton and mesh data
is always exported from frame 0
- Fixed a bug in GrannyIKUpdate that was calling the wrong transform routine
- Fixed doc error regarding ANSIReadAtMost in
Granny Data Loading Overview: File Reading Callbacks
- Fixed doc typo ("dead") in Mesh FAQ: No Vertex Deformer Found
- Fixed a bug in the polar decomposer that was causing mirrored
matrices to be decomposed improperly (this fixes export problems
related to mirrored bones)
- Fixed a bug in GrannyRecenterAllControlClocks that would make ease curves
and kill times invalid if set
- Fixed a bug in the periodic loop decomposer that was causing
invalid results for net rotations that had no net positional
displacement
- Changed constness of GrannyGetWorldPoseBoneCount
- Fixed a bug in the model control binding accessors that was causing
them to always skip one control during iteration
2.1.0.1 pre-release:
- Added note track support to the MAX exporter
- Added .inl files to the source distribution
- Included Win32 tool binaries (such as grn.exe) in XBox SDK package
- Added build type (ie., "prerelease" or "release") to version info
for DLLs, exporters, etc.
- Added auto-updating to the web page's version of the changelog
so it will always be up-to-date
- Made the front page of the SDK automatically check for updates to the
SDK and let you know when there was a new version available for
download (note that this is done without sending any information
to RAD, it's all done client-side)
- Fixed a bug in the granny_control internal clock modulus routine that was
preventing animations from playing backwards
- Added alpha texture support to the Maya exporter
- Fixed a bug in the granny_texture_builder that was preventing best-match S3TC
textures from being built properly
- Fixed a bug in exporter progress display that caused initial percent
complete to read a large bogus number instead of 0
- Implemented granny_file_data_tree_flags support in GrannyWriteDataTreeToFileBuilder
- Added exporter name and version to all exported files (granny_exporter_info)
- Added art tool extensions check box to file settings and made it
so I don't include ArtToolInfo if it's not checked
- Added options to exporter to prevent types from being written to the
file in case there are space concerns
- Fixed a bug in the internal fixed allocator (in FindBlockFor) that
would, in certain circumstances, incorrectly identify the block for
a particular piece of memory
- Rewrote the data type conversion code to be more efficient, and to
handle a number of cases that previously were handled incorrectly
during conversion.
- Changed constness on FindBoneByName, IKUpdate, InstantiateModel
- Changed constness of ReferenceType
- Moved DEBUG_MEMORY define to granny_memory.h, and added debug memory
initialization code to standard allocators
- Fixed win32_os_services.cpp so that tutorials wouldn't get OSRender()
calls if they hadn't had OSStartUp() called yet
- Fixed bug in GrannyCopyTextureImage that was shifting mipmap sizes
the wrong way
- Fixed a bug in GrannyConvertIndices that was reading off the end
of the input array when converting from 16-bit indices
- Removed incorrect assertions from
"DX8Basic_CreateS3TCTexture" and "DX8Basic_CreateRGBATexture"
- Incorporated user-submitted defines for MIPs processors and
ProDG linking so that customers who compile on PS2 will not
have to maintain separate versions of a few internal headers
- Changed all sample code to use granny_system_clock for timing
- Added GrannyDebugCommand() support to Maya exporter
- Added support for node-attached string attributes to Maya exporter
- Added blind data support to Maya exporter
- Added granny_tri_annotation_set and granny_vertex_annotation_set to the SDK
to support tool-specific triangle and vertex markup
- Added code in GrannyGetControlEaseCurveMultiplier to handle cases
where the ease-out curve is actually before the ease-in curve
- Changed DX8 sample code to use HARDWARE_VERTEX_PROCESSING at startup
- Fixed name mistake in Animation FAQ: Animation Frames
- Fixed doc typo ("analsysis") in How Granny Fits In To Your Project: Granny as Exporter.
2.1.0.0 pre-release:
- Added padding options to the exporter that will insert color
or texture channels up to the number requested
- Made file reading code use section alignment when allocating memory
to support vertex buffer alignment
- Made files automatically align vertex buffers on 32-byte boundaries
with slider for adjustment in exporter settings
- Made internal AggrAlloc() calls support alignment controls
so Granny will give back 32-byte aligned pointers for SSE
- Added alignment parameter to granny_allocate_callback
- Made grn print out internal alignment field of file sections
- Added normal/binormal type printing to grn
- Added SSE optimized vertex deformers for X86 builds
- Rewrote all internals to use straight granny_data_type_definition arrays
for vertex processing (internal vertex_layout structure has now
been removed completely)
- Added texture coordinate format and count controls to the exporters
- Added color format and count controls to the exporters
- Rewrote exporter vertex polling to properly handle texture coordinate
and color separation in vertex formats
- Fixed a compiler-induced bug in GrannyConvertPixelFormat that was causing
the last pixel to always be written as 0 when compiling with full
optimizations under VC6
- Implemented LightWave animation exporting
- Added a workaround for broken vertex weight reporting in Maya 3,
and also in some MAX exports (The tool was reporting all-zero skin
values for certain vertices, which it does not do in Maya 4. This
was causing the mesh builder to get confused, and the exact
one-normalizer would no longer work. I resolved the issue by
patching both the EnsureExactOneNorm routine and the granny_mesh_builder
to guard against this situation and synthetically bind vertices to
bone 0 when in doubt.)
- Removed old makefiles for MAX and Maya exporters
- Added Mesh FAQ: No Vertex Deformer Found
- Added missing &'s in Granny Utility Function Overview: System Clock
Changes for 2.0, 02-01-2002 [Final build was 2.0.0.36]
- All of Granny was rewritten for the 2.0 release.
Changes for 1.2c, unreleased
- Added save/load/default settings to MAX exporter
- Added MAXScript-callable functions to the MAX
exporter GrannyExport, GrannyLoadSettings, GrannySaveSettings
- Removed handle translation for faster API calls
- Fixed bug in attaching that was causing incorrect
alignment of attached objects
- Removed all math templates to ease porting of Granny to
non-compliant compilers
Changes for 1.2b, 10-09-2000
- Rewrote installation to build more flexible distributions,
including source code and other options
- Moved manual generation over to new source tree
Fixed bug in MAX Skin modifier exporting that was causing
some vertices to have no weights after weight processing
- Made playgrn use the tool coordinate system for playback
so Maya and MAX models always orient correctly
- Added axis system exporting to Maya exporter
- Added GrannyGetToolCoordinateSystemFromModel and
GrannyGetToolCoordinateSystemFromAnimation
- Added GrannyRecommendTransform
- Added GrannyTransformModel and GrannyTransformAnimation
- Got the MAX exporter working with pre-release MAX 4.0
- Moved Granny source tree over to an easily publishable CDep/CVS form
Changes for 1.2a, 08-21-2000
- Wrote documentation for looping switch
- Added looping switch to exporters
- Fixed bug in maya that was preventing the default texture and
motion compressors from being disabled
- Added S3 texture submission to dxsimple.cpp
- Added SizeInBytes field to the texture information passed
back to the user to facilitate processing of S3 textures
- Updated Granny texture pipeline to handle compressed-format
pass-through textures
- Wrote run-time S3 texture handler
- Wrote S3 texture compressor .gem
- Improved the speed of the b-spline compressor
- Added Maya 3.0 exporter to Granny installation
- Wrote GrannyFile documentation for plug-in motion compressors
- Wrote exporter documentation for plug-in motion compressors
- Put plug-in configurable interfaces for motion compressors
into the MAX and Maya exporters
- Added arbitrary-degree b-spline motion playback in the Granny run-time
- Added an arbitrary-degree b-spline motion compressor
- Made motion exporting plug-in based, like texture exporting
- Fixed parenting bug in Maya bone converter
- Rewrote MAX motion sampler to avoid all reported bugs
- Fixed a bogus infinite loop condition in the model loader
- OpenGL font code now correctly uses string length argument
- Wrote a manual chapter explaining the Maya exporter
- Fixed a bug that was preventing non-textured Granny
files from loading properly
- Added exception handling code to the cold exit condition
of GrannyFile such that apps like Maya that don't properly
free their plug-ins will not crash on exit
- Got texture compression parameters working in Maya exporter
- Got multiple texture formats working in Maya exporter
- Made first line of clippable command text indicate what the
function does in Maya exporter
- Made Maya exporter print out frame numbers on animation export
- Got modelroot and animationroot working
- Got selection-only exporting working
- Granny export progress window now reliably centers itself
in the Maya window
- Made Maya exporter try the directory of the current scene
when encountering textures not specified as absolute paths
- Consolidated Maya exporter "Auto" flags to the single,
more concise "ExportPath" flag
- Removed bogus component index member of granny_version structure
- Added preview button to Maya exporter
- Added GUI to Maya exporter
- Put texture image handling in Maya exporter
- Added progress window to Maya exporter
- Changed Maya animation conversion to work linearly instead
of out-of-order
- Added MEL-scriptable filtering to Maya exporter
- Made Maya GrannyExport command provide all the non-texture
options currently available in the 3D Studio MAX exporter
- Added GrannyFileAddDataExtensionToModel API
- Added GrannyFileAddDataExtensionToAnimation API
- Added support for rigid bindings to Maya exporter
- Added support for indirected bindings to Maya exporter
Changes for 1.1b, 05-31-2000
- File callbacks now get Granny handle passed in
- Changed granny_vector_3 parameters to granny_real32_array
parameters for GrannyLockSequenceForRayIntersection()
- Fixed an OBB bug in the bone tree state builder
- Fixed a radial extent bug in the bone tree state builder
- Added GrannySplitSequence to the run-time API
- Updated the FAQ to mention the new features in 1.1b
- Added reference counting for poses
- Added a "lock filename" checkbox to the export location panel
- Fixed a bug in the MAX exporter that wasn't keeping track
of whether or not the user had modified the .grn filename
- Fixed a bug in the OBB bounding volume builder
- Added regression tests for static meshes
- Made GrannyCopyPoseBone* work with the pose relativity flag
- Added transform handling for GrannyTransformBefore mode
- Removed GrannyGetTransform flag so that people would be
forced to obey the LoadTransform flag, and modified all
sample apps accordingly
- Wrote reference manual for static mesh processing
- Added missing documentation about texture compressors
- Add documentation about tear-offs to the 3D Studio MAX appendix
- Fixed disappearing font bug in MAX exporter
- Wrote pose control reference documentation
- Added bounds exporting for static objects
- Fixed a bug in the run-time library that was causing
matrices to be interpreted incorrectly during
SetSequenceOrientationM calls.
- Added static mesh handling API to run-time library
- Provided access to local transforms through GrannyGetTransformsLocally
- Fixed stupid crashing bug on MAX exit if tear-offs were deleted.
- MAX exporter tear-offs now removed on deletion of Granny head
- Fixed MAX exporter tear-off sizing for cases where the initial
window size is smaller than the titlebar
- Added control priority system
- Added pose control APIs to run-time library
Changes for 1.1a, 05-15-2000
- Fixed bug in GrannyFileSetTextureImage that was preventing
null textures from being accepted
- Fixed bug in legacy loader that would fail if no models
were present in a file
- Rewrote applicable parts of 3D Studio MAX appendix for new exporter UI
- MAX exporter now includes all texture formats selected by
the user (instead of just one)
- MAX exporter now correctly identifies hidden bone hiearchies
- Added UIs for texture compressor gems
- Converted MAX exporter to new UI library
- Wrote new UI library for exporters
- Wrote raw texture compressor gem
- Wrote gem loader for exporters
- Removed GrannyFileSetPassBlending from the GrannyFile API (it
was decided that we didn't have enough information about how
materials would be handled by future hardware to put this API
in yet)
- Wrote the user's manual for the GrannyFile API
- Wrote the reference manual for the GrannyFile API
- Added support for bone reporting on ray collisions with
new weight blending method.
- Made new vertex blending routines work properly with
multi-normal vertices
- Added support in MAX exporter for MAX 3.x version of BonesPro
- Fixed a bug in the MAX exporter that was causing all
parent bones to be exported, regardless of whether
or not they were frozen or hidden
- Added automated transform splitting to the file library,
both for bones and for transform tracks
- Added automated bone reordering to the file library
- Fixed a bug in MAX exporter normal computations that was
causing some models to have exported normals that differed
from what they were inside MAX
- Fixed some inefficient reallocation scenarios in array.h
- Fixed bug where radial extents were not being properly
scaled based on the bone state
- Made space in the exporter for extensions that are not
necessarily bound to anything in particular
- MAX exporter now exports materials regardless of whether
or not they are the active material
- Fixed bug in Granny player which caused crashes on machines
without sound cards
- Fixed bug in dxsimple where 0 texture cookies were not
being handled properly
- Fixed file callback handlers that were interpreting
return values incorrectly
- Fixed a bug in the file library that wasn't properly setting
reserved file format values to 0
- Modified the Granny run-time library to handle the new file
format written by the Granny File Library
- Implemented the preliminary version of the Granny File Library
- Made extensive file format modifications in order to
accomodate future planned features
Changes for 1.0f, 02-08-2000
- Included char *'s for texture information in InputFormat
so developer extensions can use the info there
- Further simplified texture handling/converting
extensions by introducing utility routines for dealing
with texture specifications
- Fixed a bug in the texture converter that was causing
erroneous texture conversions in cases where the byte
order was reversed
- Integrated new version of Bink texture compression for
better decompression performance
Changes for 1.0e, 02-02-2000
- Added console output to exporter progress window
- Made the exporter automatically coallesce identical strings to save
space in .grn files
- Made the exporter progress window more responsive during texture map
compression
- Added FAQ generation to the documentation system
- Added support for recording tool's native axis system into the file
format
- Added support for saving Granny's full version data into the file format
- Added support for saving exporter-specific version data into the
file format
- Added support for application and VAR pass-through data on models,
animations, and bones into the file format
- Added support for temporal text tags into the file format
- Made Granny Player automatically cycle through multiple files if more
than one is present on the command line
- Upgraded Granny's run-time texture handling internals to provide
user-extensible texture decompression and conversion
- Backing-store textures are now just-in-time decompressed so that
compressed textures will not use up more memory than necessary
when not being accessed
- Fixed file format entry subsection counter bug
- Started writing null-terminator entry into frame directories
- Forced string tables to be written as first entry in frame for frames
where they exist
- Built SFILE natively so I don't have to link with radutil.dll in
exporter
- Fixed .reg settings in installed that was messing up previewing of
long filenames
- Upgraded to new version of texture compressor that fixes alpha
texture compression problems
- Added alpha texture support to Granny Player
- Fixed a bug in the blending weight computation that was causing time
to be interpreted in the wrong frame of reference
Changes for 1.0d, 01-17-2000
- Updated user's guide to mention new ray-intersection features
- Added a progress bar to the exporter
- Added a "Cancel" button to the exporter for cancelling long exports
Changes for 1.0c, 01-14-2000
- Made changelog output chronologically for presentation on the Granny
web page
- Separated Granny API into sections so that common portions could be
reused in the Granny File API
- Fixed a bug in the GL texture submission code that was causing textures
to be stored on the card in 4444 format instead of 565 or similar format
- Made speed parameter modifications automatically adjust the origin of
the animation to leave the current frame of the animation the same
- Changed ease-in and ease-out durations so that they are no longer
dependent on the loop count Ensured bit depth settings propagated
correctly through to OpenGL setup code
- Made all sample apps automatically set GL bit depths to match desktop
settings
- Fixed lighting on Swinger demo application
- Made Swinger's armor reflective to demonstrate that Granny provides
normals suitable for environment mapping and other such effects
- Fixed a bug in the code to add remapped animations that was setting
the animation as purgable when it should not have been
- Added ray intersection routines
- Added new sample app called "glray.c" to demonstrate raycasting
- Fixed a bug in GrannyGetBoneIndexFromName that was causing
GrannyInvalidString to be returned even when the bone was properly found
- Added "Export Now" button to exporter
- Added "Preview Now" button to exporter
- Fixed bug in Granny player that caused a crash if a file was played
that had no texture maps
- Changed bitmap/v-coordinate convention so that people who load their
own texture maps won't have to invert anything
- Added option to restrict exported animations to the active time segment
- Updated plug-in documentation to reflect new options and features
- Made the ray intersector use vertex and normal data computed for
rendering locks if they're issued concurrently
- Made ray intersections come back in sorted order
Changes for 1.0b, 12-20-1999
- Made Swinger demo application to show how blending works to change
a character's mood
- Fixed a bug in the win32 harness code that was preventing the samples
from running on 32-bit displays
- Fixed a bug in the exporter that was preventing some frozen and hidden
bones from being ignored when they were supposed to be
- Changed the way weights are exported from Physique to deal with some
strange behavior in their exporter (they allow the same bone to show
up multiple times on the same vertex with different weights)
- Fixed the run-time engine to allow meshes with no vertices or faces
- Fixed the exporter to correctly deal with power-of-two 64-bit textures
Changes for 1.0a, 12-09-1999
- Added playgrn.exe to the distribution
- Integrated latest compression code
- Added more hotkeys to the Granny player
- Made the Granny player ask for a file if none were specified on
the command line
- Added icons and titles to the Win32 sample apps
- Fixed a bug in GrannyHasControlExpired that was causing it to
return opposite results
- Made Granny player automatically scale near and far clip planes to the
size of the scene
- Made exporters use dynamic linking for texture compression
- Made Granny player sense when things were models with no animation or
animations with no model and display them accordingly
- Made animations report durations even after they've expired
Changes for 0.9a, 12-07-1999
- Fixed a bug in configuration loading routines which was causing
sequence root transforms to be inadvertently doubled
- Fixed a bug in GrannyGetSequenceAccumulating that was causing the
wrong settings to be queried
- Integrated alpha-plane enabled texture compression
- Changed to using statically linked texture compression routines
- Fixed an orientation normalization problem that was causing objects to
deform over a period of accumulation
- Fixed a bug in configuration orientation and position control that was
causing the base transform to accrete unwanted changes
- Fixed a bug in the configuration key writer that was causing string
mismatches
- Added exporter options to ignore hidden models and bones
- Changed exporter marking criteria so that unused bones can be exported,
as can non-deformable meshes
- Rewrote MAX export motion sampler to use subdivision
- Wrote basic .grn player application
- Made help files and Granny player link to specific web addresses
- Rewrote the MAX plug-in documentation
- Made a note in the documentation that MAX allows you to name things
with non-unique names
- Made a note in the documentation about MAX's axis system
- Made stance control obey blending percentage
Changes for 0.8d, 11-23-1999
- Abstracted interface to skin exporter so that the same code path exports
both the COMSkin and the regular Skin modifiers
- Fixed a bug in the file reading code that was ignoring the file
callbacks when they reported that a file wasn't found
- Did preliminary optimization of the vertex blending pass
- Started handling 3D Studio MAX exports where there were no materials
applied
- Fixed a bug in GrannyGetPreference that was causing requests for
GrannyNormalizeNormals to be ignored
- Added profiling API to Granny
- Changed profiling code to use RDTSC on Win32 instead of
QueryPerformanceCounter
- Optimized common decomposed and composed transform operations
- Made final modifications to the file format, including new header types
that enclose sections for transforms, meshes, and textures so that the
parsing code will be cleaner in the future
- Fixed a bug in the exporters that was causing extra, redundant triangles
to be written
- Made some basic optimizations to the rendering path, specifically in
how vertex indices are stored and provided to the application
Changes for 0.8c, 11-18-1999
- Added model and bone names and descriptions to the file format
- Added support for MAX 3.0's "Skin" modifier
- Fixed bug in quaternion interpolation that was causing faulty
Character Studio playback
- Fixed bug in MAX exporting that was causing bad object alignment
Changes for 0.8b, 11-17-1999
- Added simple vertex weight compression
- Fixed the copyright notice in the 3D Studio MAX exporter
- Fixed the auto-naming code in the exporter so that it always gets the
right filename on export
- Added the infamous Granny head icon to the exporter
- Added "Temporarily Disable Export" check box for exporter
- Added "Motion Extraction" settings to exporter (extraction grid)
- Added license notice to exporter
- Added texture compression slider and check box to exporter
- Added "Ignore Frozen Bones" check box to exporter
- Added pass-through of texture names and material names
- Fixed hit-testing and clipping of Granny head in exporter
- Added 3D Studio MAX 3.0 support
- Fixed a bug in configuration deletion notification that was causing
clean-up to fail in certain circumstances
- Allowed exporter to omit texture data in Granny files for developers
who wanted to handle textures themselves
Changes for 0.8a, 11-14-1999
- Added a DLL location check on Win32 so that the Granny DLL won't be
installed in the windows or system directories
- Added a real64 constant for "forever"
- Integrated Bink still frame compression into Granny for smaller texture
sizes
- Fixed bug in OBB center copying code
- Fixed the pointer loading problem with transforms so there's no longer
an arbitrary limit on the number of transform nodes
- Changed to a dependency based animation updating system so that
attachments and other configuration relationships would always be
processed in the correct order
- Fixed an OBB offset copying bug
- Revised the file format to be more efficient and flexible
- Stop using multiple write/read functions in the exporters
- Put transform extents underneath transforms in the file format to save
on indexing
- Added CRC computation and writing to the exporters
- Added material index remapping to exporter so that materials are
always written properly
- Removed extraneous texture compression checks from both reader and writer
- Updated the manual with the latest batch of corrections
Changes for 0.7b, 11-09-1999
- Fixed table layouts in printed manual (overruns and vertical alignment)
- Unified version numbering so that everything has the same version marks
- Made copyright notices link to www.radgametools.com
- Distribution builder (distribution tags in the .gen file)
- Made sample code listings in the tutorial section of the manual
reference numbered sections in sample code
- Changed UnlockRenderingStateTexture to leave the rendering state
structure untouched (previously it was modifying the texture cookie) -
we decided it was bad form to change something without the application
explicitly asking for it
- Fixed hyphenation problems in the manual by forcing TeX to use my
hyphenation rules for all type and function names
- Got rid of linefeed problems in the output of autodocumenter by making
sure everything was being read and written from ASCII streams with
CR/LF translation
- Updated the manual to explain the string returning process in
GrannyExplainError that might be unusual for some people (since
Granny retains ownership of the buffer)
- Changed "granny_error" to "granny_result"
- Added callback-based file APIs
- Changed enumerations to be entirely Granny-specific, and moved
translation of enumerations into the sample app (blending modes, etc.)
- Decided that "expired" is the best word choice
- Decided that "left" is the best word choice
- GrannyGetRenderingStatesLeft() will not be changed to be a static call
that tells you how many states there are for a given sequence
- "GrannyRebindAllTextures" was changed to "GrannyRenewAllTextures"
- Reversed the order of in & out parameters
- "sequence" is the best word choice we could come up with for its usage -
unfortunately, there does not appear to be a more accurate word for
the particular situation
- granny_rendering_lock locking handles have been added to the
rendering process
- Implemented GrannyRenewAllTextures() call
- Implemented API for getting when an animation will end as an animation
parameter (GrannyAnimationEnd)
- Changed everything to work with bone indices
- Provide a GetBoneIndexByName() type call
- The usage of the word "callback" will not be replaced by the word "pointer"
- The GrannyAnimationEnd parameter, during a Set call, now means
"translate the animation such that it ends at this time"
- Removed OpenGL constant alignment (768) from the blending enumerations
so that they are contiguous
- Started using __stdcall, etc., correctly in the headers
- Added basic IK handling
- Changed GetSequenceState() to GetBoneTreeState() and reimplemented all
the bone code to work with arbitrary tree queries
- Implemented playing of looping animations with movement (motion
extraction and accumulation)
- Added changelog tracking to the manual
- Got rid of palette header chunk in file format
- Added return value documentation capabilities to the API generator
- Added tech support hotlinks to the source code and the documentation
- Wrote 3D Studio MAX R2.5 exporting documentation for manual
- Added tutorial references with section numbers to the API reference
pages in the manual
- Documented all return values for every function
- Wrote new sample apps glanim.c, glseq.c, and glquery.c
- Fixed a bug in granny_unique_identifier that would sometimes result
in premature GrannyOutOfHandles errors
- Fixed Discussion paragraphs in manual to indent properly
- Changed sample apps to demonstrate better clean-up
- Made sample apps lock textures beforehand as a demonstration
- Pulled granny_dofs for this version (will re-introduce it later)
- Special-cased 0 parameter functions in the help & manual so they won't
have a blank line in between the open and close parentheses
- Put the Granny head logo on cover of manual
- Added explanation in the manual about the ordering of letters for
textures and such (RGB vs. BGR)
- Fixed vertical spacing issues on first line of table entries in manual
- Added CreateInvisibleSequence()
- Added discussion of accumulation commands
- Changed LockSequence() to LockSequenceForRendering()
- Fixed incorrect interaction between looping and animation weights
- Fixed reference count issues on exit if the app doesn't clean itself up
- Re-enabled clamping of animation parameters
- Re-enabled clamping of inputs on GrannyAdvanceTime()
- Changed prefixes of Last in the file format to OnePastLast
- Started unloading cache slots as soon as they're approved to save
on memory overhead
- Added checking code to prevent users from creating trivial cycles in
their attachment hierarchies
- Fixed the OBB concatenator so that BoneTree queries return correctly
conservative OBBs
- Added rotation and scaling alignment in attach and detach calls
- Got run-time .max file reading times to within a second of .grn file reading
- Added alignment flags for GrannyAttachSequence
- Added a duration to the creation of IK controls
- Added documentation about trivial cycle errors to GrannyAttachSequence
- Added documentation about expiration behavior and animation weighting in
granny_animation_parameters
- Changed matrix format names to GrannyRowMajor and GrannyColumnMajor to
be more precise about the layout
- Added non-managed cache purging during GrannyAdvanceTime
- Fixed a bug in animation weighting calculations that was preventing
animations from looping the correct number of times
- Changed GrannyAdvanceTime to take a granny_real64
- Added support for separate OBB centers in the transform state structure
E-mail granny3@radgametools.com for technical support.
© Copyright 1999-2021 by Epic Games Tools, LLC. All Rights Reserved.