The DLL exposes a few methods to manage the writing of cache files.
The methods looks like the following:
//initialization function to store simulation main data void init( char *particleSysName, char *fileName, CACHEFORMAT cacheFormat, int numberOfElements, unsigned int fps, double start, double end, char *extras, int nExtras); // set the number of elements for each frame void setElementsNumber(int nParticles); // enabling of nParticles channels (position, velocity, ...), once per simulation void enableChannel(CHANNELTYPE channelType, ENABLEDISABLED ea); // assign values to each channel, once per frame void assignChannelValues(CHANNELTYPE channelType, void *sourceValues); // launch the cache writing void mayaCache(); // close the file and free the resources void closeMayaNCacheFile(); // abort, delete file and free the resources void deleteFile(); // get the cache duration (in frames) unsigned int getDuration(); // get the cache starting frame int getStartFrame();
First of all, you need to initialize the library, by passing the main information needed to properly write the cache file.
void init( char *particleSysName, char *fileName, CACHEFORMAT cacheFormat, int numberOfElements, unsigned int fps, double start, double end, char *extras, int nExtras);
The variables that you need to pass are explained as follows:
- particleSysName is a string with the name for Maya’s nParticleShape node. Normally, it’s the name of the node from which the cache was generated; here you can use it to name the destination node too.
- fileName is a string with the destination file’s name and path (ie. C:/my_path/my_cache_file_name).
- cacheFormat must be either ONEFILE or ONEFILEPERFRAME, according to the type of cache you want. Within the library, those format types are defined as follows:
// type of cache file, definitions #define CACHEFORMAT int #define ONEFILE 0 #define ONEFILEPERFRAME 1
- Maya file name and path, for the scene the cache was originally created from
- Maya version
- Cache owner
- The string “NCloth Info for nParticleShape1:” which is Maya’s default note for every nCache; note that nParticleShape1 is normally replaced with the nParticleShape node which was cached. We replaced in the example with NCache Info for %s”,(particleSystemName).
In order to have a channel written to the cache file, first of all it has to be enabled:
void enableChannel(CHANNELTYPE channelType, ENABLEDISABLED ea);
- channelType must be one of the following: IDCHANNEL, COUNTCHANNEL, BIRTHTIMECHANNEL, POSITIONCHANNEL, ONEFILEPERFRAME, LIFESPANPPCHANNEL, FINALLIFESPANPPCHANNEL, VELOCITYCHANNEL, ACCELERATIONCHANNEL, WORLDPOSITIONCHANNEL, WORLDVELOCITYCHANNEL, WORLDVELOCITYINOBJECTSPACECHANNEL, MASSCHANNEL, AGECHANNEL, RGBPPCHANNEL, OPACITYPPCHANNEL, RADIUSPPCHANNEL . The channels’ names are pretty self-explanatory; for any further explanation you can refer to Maya’s Documentation. Within the library, those format types are defined as follows:
// type of channels, definitions #define CHANNELTYPE int #define IDCHANNEL 0 #define COUNTCHANNEL 1 #define BIRTHTIMECHANNEL 2 #define POSITIONCHANNEL 3 #define LIFESPANPPCHANNEL 4 #define FINALLIFESPANPPCHANNEL 5 #define VELOCITYCHANNEL 6 #define ACCELERATIONCHANNEL 7 #define WORLDPOSITIONCHANNEL 8 #define WORLDVELOCITYCHANNEL 9 #define WORLDVELOCITYINOBJECTSPACECHANNEL 10 #define MASSCHANNEL 11 #define AGECHANNEL 12 #define RGBPPCHANNEL 13 #define OPACITYPPCHANNEL 14 #define RADIUSPPCHANNEL 15
#define ENABLEDISABLED BOOL #define ENABLED TRUE #define DISABLED FALSE
Then, you must populate the channel with data. This is done with a method which is to be called as many times as the duration of the cache, in frames:
void assignChannelValues(CHANNELTYPE channelType, void *sourceValues);
Here you have an example of the channel values being written through this method:
assignChannelValues(COUNTCHANNEL, &count); assignChannelValues(IDCHANNEL,id); assignChannelValues(POSITIONCHANNEL,position); assignChannelValues(VELOCITYCHANNEL,velocity); assignChannelValues(BIRTHTIMECHANNEL,birthtime); assignChannelValues(LIFESPANPPCHANNEL,lifespanPP); assignChannelValues(FINALLIFESPANPPCHANNEL,finalLifespanPP); assignChannelValues(RGBPPCHANNEL,color);
After that the cache writing is ready to go. Just call, for every frame you need to cache:
Then close the file, free the memory:
… and you’re done.
Alternatively, if for any reason you come to a point where you want to abort your writing, you can call.