Granny 3D

Granny Development History

This change log includes the entire Granny development history.

If you'd like to be notified when there's a new version of Granny, you can follow us at twitter.com/granny3d.

Changes for 2.11

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! Too much to fit into this space. So there will be a blog post about it instead. Check out radgranny.blogspot.com. (You *are* subscribed to radgranny.blogspot.com, right? In your RSS feeds? And @granny3d? Yes?)

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.

  • Distribution change: The PC target now contains both the Win32 and Win64 versions of Granny. These will no longer be treated as separate platforms.
  • Distribution change: Exporter source now structured to unzip on top of the Windows source distribution. This adds projects for

    building Max/Maya, as well as unifying the runtime/exporter source

    trees.

  • Distribution change: To make the downloads more efficient in the average case, only the english language docs will be included in the platform-specific Granny distributions. Korean and Japanese documents can always be found in the dedicated "docs" directory of the FTP site.
  • Added an option to reverse triangle windings for the model display in the Blend Editor.
  • Compatibility Note: GrannyCopyTrackMask renamed to GrannyCloneTrackMask for consistency with other Copy/Clone functions. GrannyCopyTrackMask is now a straightforward copy from a source mask to a dest mask.
  • Fixed a problem in the 64-bit Bink texture decompression.
  • Added support for morph targets to the "BonesPerMesh" preprocessor command.
  • Changed the GrannyCloseFileReader macro to avoid "conditional is constant" warning.
  • Fixed a bug in the granny_spu_controlled_animation motion extraction.
  • Added missing GrannyGetSPUAnimationBindingFromControlBinding function.
  • Fixed an infinite loop in GrannyFindMaskIndexForName
  • Small fixes for C++0x STL compliance.
  • (internal) Added a #define to the exporter source distribution that allows the the UI to be turned off for building mod tools.
  • (internal) Added some new mod export support structure.
  • (internal) New function GrannyFreeUnboundTrackMask.
  • (internal) Switched the Mac OS X target to gcc from the Intel C compiler.
  • (internal) Changed the way the C runtime library functions are compiled into the Granny DLL. This altered some of the #defines required to compile Granny from source, see: Building Granny from Source: Windows.
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 GrannyUseTelemetry and GrannyUseTmLite 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

We're trying an experiment with Granny update notifications. Granny now has a Twitter feed! You can follow Granny at twitter.com/granny3d. If you're not a Twitter user, you can subscribe to Granny's updates with an RSS feed reader. Granny isn't likely to respond to @ messages, but you never know, the old girl can be unpredictable.

  • 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 Export Scripting: XSI (along with Using GrannySetValue and GrannyGetValue: 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
  • New tutorial: Morph target animations: morph_targets
  • New tutorial: Blending Controls: blending
  • New doc section: Creating Morph Targets. Note that the morphing documentation from Granny Data Loading Overview has been split up and relocated to Vertex Curve Animation, and Creating Morph Targets: Frame-By-Frame Morphs.
  • New doc section: Vertex Curve Animation
  • DirectX 9 Rendering: rendering/dx9 switched to runtime-compiled effects, rather than precompiled shaders. This is a more flexible and "DX9-ish" way to go about selecting the appropriate shaders. Since we have a proper DX8 tutorial now, there's no longer a need to maintain easy back-portability in the DX9 specific sample.
  • Compatibility Note: To better support morph targets, the

    "Extract Frame-by-frame" option had to be changed from a boolean value to a possible value for the morph enumerant. This means that stored settings in your Max or Maya files will need refreshing in order to function as before.

  • Max exporter now directly supports the Morpher modifier for extracting MorphTarget meshes. Likewise, the exporter now supports the Blend Shape modifier in Maya. Morph channel animations will show up in the exported file as a separate granny_animation with the morph channels encoded as granny_vector_tracks.
  • For morph targets created from either the Max "Morpher" or Maya "Blend Shape" modifiers, Granny allows you to encode the morph shapes as deltas from the base mesh. This lines up closely with the algorithm used to generate final morphed meshes in both tools. You can, of course turn off this behavior if you want to use a custom lerping scheme for your mesh data.
  • Fixed a "Principle of Least Surprise" violation in the Oodle1 decompressor. On byte-reversed platforms, decompression would modify the data buffer, which is passed in as a const void*.
  • Fixed a bug in the XSI exporter that was preventing exports initiated from the File|Export menu from opening the export interface.
  • Viewer now supports .gr2 files that contain more than one animation.
  • XSI GrannyExport command explicitly looks for default arguments passed when the command is invoked from the plugin manager window.
  • Granny now supports the new Maya 8.5 release.
  • Added GrannyOrientationToleranceFromDegrees to the API to assist in determining reasonable error thresholds for orientation tracks compressed with GrannyCompressCurve.
  • Removed "Swap R and B channels" option from the exporter. This can easily be handled with a preprocessor command, and as the colors are exported as granny_real32 values from the exporter rather than D3DCOLORs, there's no particular reason to do this.
  • Fixed a threading problem with the vertex API, some of the functions in the GrannySetVertexNormal class were marked as GS_PARAM, but were accessing global state. They now access only local state, so they're properly GS_PARAM safe. See Granny in a multithreaded environment for details on wha that entails.
  • (internal) Fix a dll loading error in the Max 9 plugin.
  • (internal) Tweaked the Maya 8.5 build to play nicely with Visual Studio 8 and Microsoft's marvelous manifest technology. No, really. It's marvelous.
  • (internal) Fixed a doc linking error
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 colours 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 Granny 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 Granny 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