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.8
2.8.40.0 release 2010/07/23
- Fixed the way string blind data was indexed in Maya.
- Compatability 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.
- Compatability 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.
- Compatability 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.
- Compatability Note: Removed GrannySleepForSeconds. This was poorly supported on many platforms, and really makes no sense as part of Granny.
- 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".
- Corrected a UI problem with Max 2009/2008 x64.
- New functions GrannyLinearBlend/GrannyLinearBlendRanged.
- Compatability Note: GrannyCopyLocalPoseBoneCount has a "BoneStart" parameter now.
- Compatability 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.
- 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.
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!)
- Compatability 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.
- Compatability 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.
- Compatability 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: Getting Started with the Blend Editor. 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.
- Compatability 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.
- 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.
- Compatability 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.
- (internal) Take up an Autodesk-suggested fix for a Softimage crash on reference objects that are unloaded.
- (internal) Symstore hooks.
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".
- Compatability 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.
- 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.
- 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.
- 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.
- Compatability 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.)
- Compatability 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.
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.
- Compatability 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.
- Compatability 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.
- 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.
- Compatability 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.
- Compatability 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.
- Compatability 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.
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.
- Compatability 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.
- Compatability 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.
- 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.
- Compatability Note: GrannyFixupFileSectionPhase2 arguments changed.
- Compatability 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.
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.
- 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.
- 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.
- 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.
- 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.
- 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.
- Compatability 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.
- Compatability 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.
- 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...
- Compatability 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.
- Compatability 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.
- 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.
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_dag_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.
- 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!
- 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_dag_pose_cache.
- Slight update to the list of #define requirements in Building Granny from Source.
- Compatability 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.
- 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.
- 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.
- 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.
- Compatability Note: Removed useless Offset paramter from GrannyCreateMemoryFileReader.
- Compatability 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.
- Compatability 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.
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.
- 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.
- 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%.
- Compatability 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.
- Compatability 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.
- (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
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 in The Animation Graph API and Editor.
- 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.
- Compatability 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.
- Compatability 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.
- Compatability Note: Removed mip control options from the exporter. These are much more sensible, and easier to control in the pipeline as preprocessor commands.
- Compatability Note: Removed underused texture formats from the exporter to simplify the interface. These may still be created using the preprocessor.
- Compatability 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.
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.
- 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.
- Compatability 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.
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!
- Compatability 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".
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: The Animation Graph API and Editor.
- 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
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.
- Compatability Note: granny_dag_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.
- Compatability 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.
- Compatability 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.
- Compatability 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.
- Compatability 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.
- Compatability 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.
- 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.
- 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.
- Compatability 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.
- Compatability 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.
- Compatability 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.
- 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.
- Compatability 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.
- 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.
- 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.
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.
- Compatability Note: GrannyLoadFixupArray has a new argument signature.
- None yet.
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.
- 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.
- 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
- Hot fix for a material parsing problem in the Maya plugin.
- New tutorial: Simple IK: ik_2bone.
- Compatability 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.
- 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.
- Compatability 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.
- Compatability 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.
- 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.
- 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;
- 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.
- Compatability 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.
- 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.
- 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.
- Compatability 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
- 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.
- 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.
- 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
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.)
- 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.
- 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 Table of Contents: 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, GrannyCreateDagPoseCache, GrannyFreeDagPoseCache, to provide a thread safe sampling api for the Blend DAG. New type: granny_dag_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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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).
- 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.
- Changes to granny_curve2 functions to improve debugging speed. No effect on the release build.
- set_log_file_example.ms fixed to be GrannyStopLogging() rather than GrannyStopLogging (you need the braces, or it doesn't actually get called!).
- 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.
- 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 The Animation Blending Directed Acyclic Graph [Deprecated]: The Callback Type 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.
- 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.
- 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.
- 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
- 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.
- 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.
- 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.
- Added GrannyIKUpdate2Bone.
- Preparatory work for bone-relative morph targets.
- Added GetVertexTypeDefinition and GetVertexData (internal mesh-builder functions).
- 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.
- 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).
- 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.
- 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.
- 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 The Animation Blending Directed Acyclic Graph [Deprecated].
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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).
- 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.
- 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).
- 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.
- 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.
- 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.
- 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
- 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
- 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
- Improved PS2 support
- VC6 .dsp files added back into distribution
- 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
- 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
- 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)
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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
- 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 GrannySampleBSpline1x1, GrannySampleBSpline2x1, and GrannySampleBSpline3x1 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