IGameControl provides direct access to standard key frame controllers in 3ds Max. This is particularly useful to game developers, because they know what type of controller they are exporting as defined by their game engine.
To export key frame controllers using the 3ds Max SDK requires asking for the position controller, checking if it has the required Key interface, and then extracting the key based on the control type. 3DXI handles this automatically, allowing the developer to simply request a list of bezier position keys for export.
Along with the basic Key frame controllers, IGameControl can sample a controller. This is important for certain controllers that do not support the Key interfaces, such as biped. Each IGameControl interface maintains a control type which allows the developer to determine the control type used by IGameControl, based on the transform style. For example: if the Control is an Unsupported controller or biped, then the developer can sample it at the required rate. 3DXI provides two types of sampling: Full and Quick. Full samples the animation over the entire animation range at the specified sampling rate set by the developer. Quick samples only the controller where a key exists. Quick has limitations: it will not work for IGAME_TM sampling or controllers that do not support key setting.
IGameControl::Get...Keys() methods return a success flag as a boolean, allowing simple iteration through the key methods. Thus, if all return FALSE, no keys are found. Sampling can then be requested.
The following table lists IGameControl types and their associated meanings:
Constraints are also supported directly by IGameControl. Like the skin access, all constraints are supported through a unified interface. The constraint is identified as a controller type. If found, the developer simply needs to obtain the constraint interface for that particular controller type. The following code is an example of this:
if(exportControllers) { IGameKeyTab posKeys,rotKeys, IGameControl * pGC = node->GetIGameControl(); DWORD T = pGC->GetControlType( IGAME_POS); //position if(T==IGAME_MAXSTD && pGC->GetBezierKeys(poskeys, IGAME_POS)) DumpBezierKeys( IGAME_POS,poskeys,prsNode); else if(T==IGAME_POS_CONSTRAINT && !forceSample) { IGameConstraint * cnst = pGC->GetConstraint( IGAME_POS); DumpConstraints(prsNode,cnst); } //rotation else if(T==IGAME_MAXSTD && pGC->GetTCBKeys(rotkeys, IGAME_ROT) { DumpTCBKeys( IGAME_ROT,rotkeys,prsNode); } else if(T==IGAME_ROT_CONSTRAINT && !forceSample) { IGameConstraint * cnst = pGC->GetConstraint( IGAME_ROT); DumpConstraints(prsNode,cnst); } else DumpSampleKeys(child,prsNode); // usually Biped }