we are using the cineware SDK from developers maxon net , I can't say for sure what version it is ( it was updated in june 2020, is there a header file where the exact version is stated?). I downloaded the latest version and builded it to use the command line sample that parses a save file ( to check the difference between what I save and what is saved after loading in C4d ( R23).
I won't be able to give you the whole code ( at least my legal department is likely to fire me ), but I can give you a sample of what we do for the clouds.
//create cloud object
cineware::BaseObject* c4Cloud;
if (gridNames_.size()>0)
{
c4Cloud = cineware::BaseObject::Alloc(Ovolumeloader);
if (startFrame_ != endFrame_)
{
cineware::GeData udata;
udata.SetInt32(1);
c4Cloud->SetParameter(6001, udata); //animation
udata.SetInt32(startFrame_);
c4Cloud->SetParameter(6003, udata); //frame range start
udata.SetInt32(endFrame_);
c4Cloud->SetParameter(6004, udata); //frame range stop
cineware::ListViewData* lv = cineware::ListViewData::Alloc();
for (size_t i = 0; i < gridNames_.size(); ++i)
{
cineware::GeData vdata;
vdata.SetInt32(1);
lv->AddItem((int)i, ToCinewareString(gridNames_[i]), vdata);
}
udata.SetCustomDataType(CUSTOMDATA_LISTVIEW, *lv);
c4Cloud->SetParameter(6008, udata); //list of activated grids
}
else
{
cineware::GeData udata;
udata.SetInt32(0);
c4Cloud->SetParameter(6001, udata); //animation
udata.SetInt32(startFrame_);
c4Cloud->SetParameter(6002, udata); //frame
}
}
else
{
c4Cloud = cineware::BaseObject::Alloc(Ovolume);
}
c4dDoc_->InsertObject(c4Cloud, parentObj);
c4Cloud->SetName(ToC4dStr(name).c_str());
// set vdb file path
cineware::GeData udata;
auto newPath = EONPath(file_);
if (startFrame_ != endFrame_)
{
cineware::CTrack* xTrack(
cineware::CTrack::Alloc(c4Cloud,
cineware::DescLevel(cineware::ID_VOLUME_PATH, cineware::DTYPE_FILENAME, 0),
"path"));
c4Cloud->AppendCTrack(xTrack);
xTrack->t_pseudo = cineware::PSEUDO_DATA; //hack to be able to create pseudo data track
auto curve = xTrack->GetCurve();
for (auto time = startFrame_; time <= endFrame_; ++time)
{
auto path = newPath;
// build file name of frame XX
path.insert_suffix_before_ext_inplace(
StringFormat(EONString(L"_%0") + boost::lexical_cast<std::wstring>(floor(log(endFrame_ - startFrame_) / log(10) + 1)) + L"d", time));
auto mapPath = MakeRelPath(path, GetSettings().localTexturePath_, Filename()); // relative or absolute path
cineware::GeData data;
data.SetFilename(cineware::Filename(ToCinewareString(mapPath.local_string())));
curve->AddKey(cineware::BaseTime(time ,GetSettings().animationFramerate_ ))->SetGeData(curve, data);
}
// build file name of frame 0
newPath.insert_suffix_before_ext_inplace(
StringFormat(EONString(L"_%0") + boost::lexical_cast<std::wstring>(floor(log(endFrame_ - startFrame_) / log(10) + 1)) + L"d", 0));
}
EONPath mapPath = MakeRelPath(newPath, GetSettings().localTexturePath_, Filename());// relative or absolute path
udata.SetFilename(cineware::Filename(ToCinewareString(mapPath.local_string())));
c4Cloud->SetParameter(cineware::ID_VOLUME_PATH, udata);
// set transformation of object in absolute or relative to parent
if (transfo_.hasParent_)
{
InitNodeTransform(c4Cloud, transfo_.localPosition_, transfo_.localTransfo_, false);
}
else
{
InitNodeTransform(c4Cloud, transfo_.vPosition_, transfo_.transfo_, true);
}