Hi
I have looked at your changes and I'm wondering whether does the keyframe animation still work. You created many structures for separate groups of fractal parameters but you didn't take into consideration how to morph values in keyframe animation mode. When all floating point values was in sParamRenderD there was very easy to interpolate all values using not so complicated code. I was made in three parts:
if (Interface_data.keyframeMode)
{
for (int keyNumber = 0; keyNumber < maxKeyNumber; keyNumber++)
{
IndexFilename(filename2, fractParam.file_keyframes, (char*) "fract", keyNumber);
sParamRender fractParamLoaded;
ParamsAllocMem(&fractParamLoaded);
LoadSettings(filename2, fractParamLoaded, NULL, true);
WriteLogDouble("Keyframe loaded", keyNumber);
morph.AddData(keyNumber, (double*) &fractParamLoaded);
IFSToMorph(IFSdouble, &fractParamLoaded);
morphIFS.AddData(keyNumber, IFSdouble);
WriteLogDouble("Keyframe data added to data structures", keyNumber);
ParamsReleaseMem(&fractParamLoaded);
}
printf("Keyframes loaded\n");
}
//Catmull-Rom interpolation in keyframe animation mode
if (fractParam.animMode && Interface_data.keyframeMode)
{
morph.CatmullRom(index, (double*) &fractParam);
morphIFS.CatmullRom(index, IFSdouble);
WriteLog("Splines calculated");
MorphToIFS(IFSdouble, &fractParam);
if (fractParam.doubles.zoom < 1e-15) fractParam.doubles.zoom = 1e-15;
fractParam.doubles.max_y = 20.0 / fractParam.doubles.zoom;
fractParam.doubles.resolution = 1.0 / fractParam.image_width;
sImageAdjustments imageAdjustments = fractParam.doubles.imageAdjustments;
mainImage->SetImageAdjustments(imageAdjustments);
sprintf(label_text, "Frame: %d, Keyframe %f", index, (double) index / fractParam.framesPerKeyframe);
if (!noGUI) gtk_label_set_text(GTK_LABEL(Interface.label_keyframeInfo), label_text);
WriteLog("Calculated additional data for splines");
}
void CMorph::CatmullRom(int frame, double *destData)
{
double v1, v2, v3, v4;
int key = frame / framesPerKey;
double factor = (frame % framesPerKey) / (double) framesPerKey;
double factor2 = factor*factor;
double factor3 = factor2*factor;
for (int i = 0; i < dataSize; i++)
{
if (key >= 1) v1 = dataSets[key - 1][i];
else v1 = dataSets[key][i];
if (key < count) v2 = dataSets[key][i];
else v2 = dataSets[count - 1][i];
if (key < count - 1) v3 = dataSets[key + 1][i];
else v3 = dataSets[count - 1][i];
if (key < count - 2) v4 = dataSets[key + 2][i];
else v4 = dataSets[count - 1][i];
//printf("v1=%f, v2=%f, v3=%f, v4=%f\n",v1,v2,v3,v4);
double value = 0.5 * ((2 * v2) + (-v1 + v3) * factor + (2 * v1 - 5 * v2 + 4 * v3 - v4) * factor2 + (-v1 + 3 * v2 - 3 * v3 + v4) * factor3);
output[i]=value;
destData[i] = output[i];
}
}
I think that now it will be much more difficult. First you have to collect all floating point values from all structures into CMorph class, next interpolate them and finally spread again into structures.