Commit 0e867cb5 authored by David Llewellyn-Jones's avatar David Llewellyn-Jones

Added option to export animation frames in STL format.

parent 0e7dce55
...@@ -216,6 +216,15 @@ ...@@ -216,6 +216,15 @@
<property name="use_underline">True</property> <property name="use_underline">True</property>
</object> </object>
</child> </child>
<child>
<object class="GtkMenuItem" id="MenuExportAnimSTL">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="use_action_appearance">False</property>
<property name="label" translatable="yes">STL</property>
<property name="use_underline">True</property>
</object>
</child>
</object> </object>
</child> </child>
</object> </object>
......
...@@ -170,8 +170,8 @@ bool ExportModelAnimatedSTL (char const * szFilename, bool boBinary, bool boScre ...@@ -170,8 +170,8 @@ bool ExportModelAnimatedSTL (char const * szFilename, bool boBinary, bool boScre
fTimeIncrement = (fTimeEnd - fTimeStart) / ((double)nFrames); fTimeIncrement = (fTimeEnd - fTimeStart) / ((double)nFrames);
// Create the format for the filename // Create the format for the filename
szFileNameFormat = g_string_new (""); szFileNameFormat = g_string_new ("");
// Format is a decimal integer with EXPORTANIM_FRAMES_EXP digits padded with zeros, followed by .ply // Format is a decimal integer with EXPORTANIM_FRAMES_EXP digits padded with zeros, followed by .stl
g_string_printf (szFileNameFormat, "%%0%dd.ply", EXPORTANIM_FRAMES_EXP); g_string_printf (szFileNameFormat, "%%0%dd.stl", EXPORTANIM_FRAMES_EXP);
szFileIncrement = g_string_new (""); szFileIncrement = g_string_new ("");
fTime = fTimeStart; fTime = fTimeStart;
......
...@@ -140,6 +140,7 @@ static gboolean SaveFilePress (GtkWidget * psWidget, gpointer psData); ...@@ -140,6 +140,7 @@ static gboolean SaveFilePress (GtkWidget * psWidget, gpointer psData);
static gboolean ExportFilePLYPress (GtkWidget * psWidget, gpointer psData); static gboolean ExportFilePLYPress (GtkWidget * psWidget, gpointer psData);
static gboolean ExportFileSTLPress (GtkWidget * psWidget, gpointer psData); static gboolean ExportFileSTLPress (GtkWidget * psWidget, gpointer psData);
static gboolean ExportAnimFilePLYPress (GtkWidget * psWidget, gpointer psData); static gboolean ExportAnimFilePLYPress (GtkWidget * psWidget, gpointer psData);
static gboolean ExportAnimFileSTLPress (GtkWidget * psWidget, gpointer psData);
void PauseAnimationModal (bool boPauseModal, FunctyPersist * psFunctyData); void PauseAnimationModal (bool boPauseModal, FunctyPersist * psFunctyData);
void NewCartesianFunction (FunctyPersist * psFunctyData); void NewCartesianFunction (FunctyPersist * psFunctyData);
void NewSphericalFunction (FunctyPersist * psFunctyData); void NewSphericalFunction (FunctyPersist * psFunctyData);
...@@ -2852,7 +2853,7 @@ static gboolean ExportFilePLYPress (GtkWidget * psWidget, gpointer psData) { ...@@ -2852,7 +2853,7 @@ static gboolean ExportFilePLYPress (GtkWidget * psWidget, gpointer psData) {
psParent = GTK_WINDOW (GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MainWindow"))); psParent = GTK_WINDOW (GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MainWindow")));
psDialogue = gtk_file_chooser_dialog_new ("Export Model", psParent, psDialogue = gtk_file_chooser_dialog_new ("Export Model in PLY", psParent,
GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
...@@ -2981,7 +2982,7 @@ static gboolean ExportFileSTLPress (GtkWidget * psWidget, gpointer psData) { ...@@ -2981,7 +2982,7 @@ static gboolean ExportFileSTLPress (GtkWidget * psWidget, gpointer psData) {
psParent = GTK_WINDOW (GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MainWindow"))); psParent = GTK_WINDOW (GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MainWindow")));
psDialogue = gtk_file_chooser_dialog_new ("Export Model", psParent, psDialogue = gtk_file_chooser_dialog_new ("Export Model in STL", psParent,
GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
...@@ -3110,7 +3111,7 @@ static gboolean ExportAnimFilePLYPress (GtkWidget * psWidget, gpointer psData) { ...@@ -3110,7 +3111,7 @@ static gboolean ExportAnimFilePLYPress (GtkWidget * psWidget, gpointer psData) {
psParent = GTK_WINDOW (GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MainWindow"))); psParent = GTK_WINDOW (GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MainWindow")));
psDialogue = gtk_file_chooser_dialog_new ("Export Animation Frames", psParent, psDialogue = gtk_file_chooser_dialog_new ("Export Animation Frames in PLY", psParent,
GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL); GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
...@@ -3228,7 +3229,7 @@ static gboolean ExportAnimFilePLYPress (GtkWidget * psWidget, gpointer psData) { ...@@ -3228,7 +3229,7 @@ static gboolean ExportAnimFilePLYPress (GtkWidget * psWidget, gpointer psData) {
szFilename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (psDialogue)); szFilename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (psDialogue));
// Actually perform the model export // Actually perform the model export
boExported = ExportModelFileAnimated (szFilename, psFunctyData->boBinary, psFunctyData->boExportScreen, psFunctyData->boExportAlpha, psFunctyData->fExportMultiplier, psFunctyData->fExportScale, psFunctyData->fExportTimeStart, psFunctyData->fExportTimeEnd, psFunctyData->nExportFrames, psFunctyData->psVisData); boExported = ExportModelFileAnimatedPLY (szFilename, psFunctyData->boBinary, psFunctyData->boExportScreen, psFunctyData->boExportAlpha, psFunctyData->fExportMultiplier, psFunctyData->fExportScale, psFunctyData->fExportTimeStart, psFunctyData->fExportTimeEnd, psFunctyData->nExportFrames, psFunctyData->psVisData);
if (boExported) { if (boExported) {
g_string_assign (psFunctyData->szExportAnimName, szFilename); g_string_assign (psFunctyData->szExportAnimName, szFilename);
...@@ -3241,7 +3242,179 @@ static gboolean ExportAnimFilePLYPress (GtkWidget * psWidget, gpointer psData) { ...@@ -3241,7 +3242,179 @@ static gboolean ExportAnimFilePLYPress (GtkWidget * psWidget, gpointer psData) {
szFolder = NULL; szFolder = NULL;
} }
} }
psFunctyData->boExportedModelPLY = boExported; psFunctyData->boExportedAnim = boExported;
g_free (szFilename);
szFilename = NULL;
}
gtk_widget_destroy (psDialogue);
PauseAnimationModal (FALSE, psFunctyData);
return TRUE;
}
static gboolean ExportAnimFileSTLPress (GtkWidget * psWidget, gpointer psData) {
FunctyPersist * psFunctyData = (FunctyPersist * )psData;
GtkWidget * psDialogue;
GtkWindow * psParent;
char * szFilename;
char * szFolder;
bool boExported;
GtkFileFilter * psFilterAnim;
GtkFileFilter * psFilterAll;
GtkWidget * psBinary;
GtkWidget * psMultiplier;
GtkWidget * psScale;
GtkWidget * psScreenCoords;
GtkWidget * psTimeStart;
GtkWidget * psTimeEnd;
GtkWidget * psFrames;
GtkWidget * psOptions;
GtkWidget * psOptionsFile;
GtkWidget * psOptionsAnim;
GtkWidget * psWidgetAdd;
GtkAdjustment * psAdjustment;
psFilterAnim = gtk_file_filter_new ();
gtk_file_filter_add_pattern (psFilterAnim, "*.zip");
gtk_file_filter_add_mime_type (psFilterAnim, "binary/zip");
gtk_file_filter_add_mime_type (psFilterAnim, "application/zip");
gtk_file_filter_set_name (psFilterAnim, "Zip archive");
psFilterAll = gtk_file_filter_new ();
gtk_file_filter_add_pattern (psFilterAll, "*");
gtk_file_filter_set_name (psFilterAll, "All Files");
psParent = GTK_WINDOW (GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MainWindow")));
psDialogue = gtk_file_chooser_dialog_new ("Export Animation Frames in STL", psParent,
GTK_FILE_CHOOSER_ACTION_SAVE, GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, NULL);
gtk_file_chooser_set_do_overwrite_confirmation (GTK_FILE_CHOOSER (psDialogue), TRUE);
g_object_set (G_OBJECT (psDialogue), "local-only", FALSE, NULL);
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (psDialogue), psFilterAnim);
gtk_file_chooser_add_filter (GTK_FILE_CHOOSER (psDialogue), psFilterAll);
PauseAnimationModal (TRUE, psFunctyData);
if (psFunctyData->boFolderSetAnim) {
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (psDialogue), psFunctyData->szFolderAnim->str);
}
else {
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (psDialogue), g_get_home_dir ());
}
if (!psFunctyData->boExportedAnim) {
gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (psDialogue), DEFAULT_EXPORTANIMNAME);
}
else {
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (psDialogue), psFunctyData->szExportAnimName->str);
}
psOptions = gtk_vbox_new (FALSE, 8);
gtk_widget_show (psOptions);
psOptionsFile = gtk_hbox_new (FALSE, 8);
gtk_widget_show (psOptionsFile);
gtk_box_pack_start (GTK_BOX (psOptions), psOptionsFile, FALSE, TRUE, 0);
psOptionsAnim = gtk_hbox_new (FALSE, 8);
gtk_widget_show (psOptionsAnim);
gtk_box_pack_start (GTK_BOX (psOptions), psOptionsAnim, FALSE, TRUE, 0);
// Add file attribute widgets
psWidgetAdd = gtk_label_new ("Scale");
gtk_label_set_justify (GTK_LABEL (psWidgetAdd), GTK_JUSTIFY_RIGHT);
gtk_widget_show (psWidgetAdd);
gtk_box_pack_start (GTK_BOX (psOptionsFile), psWidgetAdd, FALSE, TRUE, 0);
psAdjustment = GTK_ADJUSTMENT (gtk_adjustment_new (psFunctyData->fExportScale, 0.001, 10000.0, 0.1, 10.0, 0.0));
psScale = gtk_spin_button_new (psAdjustment, 0.1, 3);
gtk_widget_show (psScale);
gtk_box_pack_start (GTK_BOX (psOptionsFile), psScale, FALSE, TRUE, 0);
psWidgetAdd = gtk_label_new ("Accuracy");
gtk_label_set_justify (GTK_LABEL (psWidgetAdd), GTK_JUSTIFY_RIGHT);
gtk_widget_show (psWidgetAdd);
gtk_box_pack_start (GTK_BOX (psOptionsFile), psWidgetAdd, FALSE, TRUE, 0);
psAdjustment = GTK_ADJUSTMENT (gtk_adjustment_new (psFunctyData->fExportMultiplier, 0.00, 1000.0, 0.1, 1.0, 0.0));
psMultiplier = gtk_spin_button_new (psAdjustment, 1.0, 3);
gtk_widget_show (psMultiplier);
gtk_box_pack_start (GTK_BOX (psOptionsFile), psMultiplier, FALSE, TRUE, 0);
psBinary = gtk_check_button_new_with_label ("Binary");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (psBinary), psFunctyData->boBinary);
gtk_widget_show (psBinary);
gtk_box_pack_start (GTK_BOX (psOptionsFile), psBinary, FALSE, TRUE, 0);
psScreenCoords = gtk_check_button_new_with_label ("Screen coords");
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (psScreenCoords), psFunctyData->boExportScreen);
gtk_widget_show (psScreenCoords);
gtk_box_pack_start (GTK_BOX (psOptionsFile), psScreenCoords, FALSE, TRUE, 0);
// Add animation attribute widgets
psWidgetAdd = gtk_label_new ("Start time");
gtk_label_set_justify (GTK_LABEL (psWidgetAdd), GTK_JUSTIFY_RIGHT);
gtk_widget_show (psWidgetAdd);
gtk_box_pack_start (GTK_BOX (psOptionsAnim), psWidgetAdd, FALSE, TRUE, 0);
psAdjustment = GTK_ADJUSTMENT (gtk_adjustment_new (psFunctyData->fExportTimeStart, 0, EXPORTANIM_TIME_MAX, 1, 1000, 0));
psTimeStart = gtk_spin_button_new (psAdjustment, 1, 3);
gtk_widget_show (psTimeStart);
gtk_box_pack_start (GTK_BOX (psOptionsAnim), psTimeStart, FALSE, TRUE, 0);
psWidgetAdd = gtk_label_new ("End time");
gtk_label_set_justify (GTK_LABEL (psWidgetAdd), GTK_JUSTIFY_RIGHT);
gtk_widget_show (psWidgetAdd);
gtk_box_pack_start (GTK_BOX (psOptionsAnim), psWidgetAdd, FALSE, TRUE, 0);
psAdjustment = GTK_ADJUSTMENT (gtk_adjustment_new (psFunctyData->fExportTimeEnd, 0, EXPORTANIM_TIME_MAX, 1, 1000, 0));
psTimeEnd = gtk_spin_button_new (psAdjustment, 1, 3);
gtk_widget_show (psTimeEnd);
gtk_box_pack_start (GTK_BOX (psOptionsAnim), psTimeEnd, FALSE, TRUE, 0);
psWidgetAdd = gtk_label_new ("Frames");
gtk_label_set_justify (GTK_LABEL (psWidgetAdd), GTK_JUSTIFY_RIGHT);
gtk_widget_show (psWidgetAdd);
gtk_box_pack_start (GTK_BOX (psOptionsAnim), psWidgetAdd, FALSE, TRUE, 0);
psAdjustment = GTK_ADJUSTMENT (gtk_adjustment_new (psFunctyData->nExportFrames, 0, pow(10, EXPORTANIM_FRAMES_EXP), 1, 10, 0));
psFrames = gtk_spin_button_new (psAdjustment, 1, 0);
gtk_widget_show (psFrames);
gtk_box_pack_start (GTK_BOX (psOptionsAnim), psFrames, FALSE, TRUE, 0);
// Install the widgets into the filesave dialogue
gtk_file_chooser_set_extra_widget (GTK_FILE_CHOOSER (psDialogue), psOptions);
if (gtk_dialog_run (GTK_DIALOG (psDialogue)) == GTK_RESPONSE_ACCEPT) {
psFunctyData->boBinary = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (psBinary));
psFunctyData->fExportMultiplier = gtk_spin_button_get_value (GTK_SPIN_BUTTON (psMultiplier));
psFunctyData->fExportScale = gtk_spin_button_get_value (GTK_SPIN_BUTTON (psScale));
psFunctyData->boExportScreen = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (psScreenCoords));
psFunctyData->fExportTimeStart = gtk_spin_button_get_value (GTK_SPIN_BUTTON (psTimeStart));
psFunctyData->fExportTimeEnd = gtk_spin_button_get_value (GTK_SPIN_BUTTON (psTimeEnd));
psFunctyData->nExportFrames = gtk_spin_button_get_value (GTK_SPIN_BUTTON (psFrames));
szFilename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (psDialogue));
// Actually perform the model export
boExported = ExportModelFileAnimatedSTL (szFilename, psFunctyData->boBinary, psFunctyData->boExportScreen, psFunctyData->fExportMultiplier, psFunctyData->fExportScale, psFunctyData->fExportTimeStart, psFunctyData->fExportTimeEnd, psFunctyData->nExportFrames, psFunctyData->psVisData);
if (boExported) {
g_string_assign (psFunctyData->szExportAnimName, szFilename);
szFolder = gtk_file_chooser_get_current_folder (GTK_FILE_CHOOSER (psDialogue));
psFunctyData->boFolderSet = (szFolder != NULL);
if (szFolder) {
g_string_assign (psFunctyData->szFolder, szFolder);
g_free (szFolder);
szFolder = NULL;
}
}
psFunctyData->boExportedAnim = boExported;
g_free (szFilename); g_free (szFilename);
szFilename = NULL; szFilename = NULL;
} }
...@@ -3396,6 +3569,8 @@ int main (int argc, char *argv[]) { ...@@ -3396,6 +3569,8 @@ int main (int argc, char *argv[]) {
g_signal_connect (psWidget, "activate", G_CALLBACK (ExportFileSTLPress), (gpointer)psFunctyData); g_signal_connect (psWidget, "activate", G_CALLBACK (ExportFileSTLPress), (gpointer)psFunctyData);
psWidget = GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MenuExportAnimPLY")); psWidget = GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MenuExportAnimPLY"));
g_signal_connect (psWidget, "activate", G_CALLBACK (ExportAnimFilePLYPress), (gpointer)psFunctyData); g_signal_connect (psWidget, "activate", G_CALLBACK (ExportAnimFilePLYPress), (gpointer)psFunctyData);
psWidget = GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MenuExportAnimSTL"));
g_signal_connect (psWidget, "activate", G_CALLBACK (ExportAnimFileSTLPress), (gpointer)psFunctyData);
psWidget = GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MenuFullscreen")); psWidget = GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MenuFullscreen"));
g_signal_connect (psWidget, "activate", G_CALLBACK (FullscreenPress), (gpointer)psFunctyData); g_signal_connect (psWidget, "activate", G_CALLBACK (FullscreenPress), (gpointer)psFunctyData);
psWidget = GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MenuPanelLeft")); psWidget = GTK_WIDGET (gtk_builder_get_object(psFunctyData->psXML, "MenuPanelLeft"));
......
...@@ -2607,7 +2607,7 @@ bool ExportModelFileAnimated (char const * szFilename, bool boBinary, bool boScr ...@@ -2607,7 +2607,7 @@ bool ExportModelFileAnimated (char const * szFilename, bool boBinary, bool boScr
} }
*/ */
bool ExportModelFileAnimated (char const * szFilename, bool boBinary, bool boScreenCoords, bool boExportAlpha, double fMultiplier, double fScale, double fTimeStart, double fTimeEnd, int nFrames, VisPersist * psVisData) { bool ExportModelFileAnimatedPLY (char const * szFilename, bool boBinary, bool boScreenCoords, bool boExportAlpha, double fMultiplier, double fScale, double fTimeStart, double fTimeEnd, int nFrames, VisPersist * psVisData) {
bool boSuccess; bool boSuccess;
boSuccess = ExportModelAnimatedPLY (szFilename, boBinary, boScreenCoords, boExportAlpha, fMultiplier, fScale, fTimeStart, fTimeEnd, nFrames, psVisData->psFuncList); boSuccess = ExportModelAnimatedPLY (szFilename, boBinary, boScreenCoords, boExportAlpha, fMultiplier, fScale, fTimeStart, fTimeEnd, nFrames, psVisData->psFuncList);
...@@ -2615,6 +2615,14 @@ bool ExportModelFileAnimated (char const * szFilename, bool boBinary, bool boScr ...@@ -2615,6 +2615,14 @@ bool ExportModelFileAnimated (char const * szFilename, bool boBinary, bool boScr
return boSuccess; return boSuccess;
} }
bool ExportModelFileAnimatedSTL (char const * szFilename, bool boBinary, bool boScreenCoords, double fMultiplier, double fScale, double fTimeStart, double fTimeEnd, int nFrames, VisPersist * psVisData) {
bool boSuccess;
boSuccess = ExportModelAnimatedSTL (szFilename, boBinary, boScreenCoords, fMultiplier, fScale, fTimeStart, fTimeEnd, nFrames, psVisData->psFuncList);
return boSuccess;
}
ControlvarPersist * SetControlVar (char const * const szVarName, char const * const szVarValue, VisPersist * psVisData) { ControlvarPersist * SetControlVar (char const * const szVarName, char const * const szVarValue, VisPersist * psVisData) {
ControlvarPersist * psControlvarData; ControlvarPersist * psControlvarData;
GSList * psControlvarList; GSList * psControlvarList;
......
...@@ -116,7 +116,8 @@ void GetView (float * pfViewRadius, float * pfRotation, float * pfElevation, Vis ...@@ -116,7 +116,8 @@ void GetView (float * pfViewRadius, float * pfRotation, float * pfElevation, Vis
void ScaleFunctionRange (double fScale, VisPersist * psVisData); void ScaleFunctionRange (double fScale, VisPersist * psVisData);
bool ExportModelFilePLY (char const * szFilename, bool boBinary, bool boScreenCoords, bool boExportAlpha, double fMultiplier, double fScale, VisPersist * psVisData); bool ExportModelFilePLY (char const * szFilename, bool boBinary, bool boScreenCoords, bool boExportAlpha, double fMultiplier, double fScale, VisPersist * psVisData);
bool ExportModelFileSTL (char const * szFilename, bool boBinary, bool boScreenCoords, double fMultiplier, double fScale, VisPersist * psVisData); bool ExportModelFileSTL (char const * szFilename, bool boBinary, bool boScreenCoords, double fMultiplier, double fScale, VisPersist * psVisData);
bool ExportModelFileAnimated (char const * szFilename, bool boBinary, bool boScreenCoords, bool boExportAlpha, double fMultiplier, double fScale, double fTimeStart, double fTimeEnd, int nFrames, VisPersist * psVisData); bool ExportModelFileAnimatedPLY (char const * szFilename, bool boBinary, bool boScreenCoords, bool boExportAlpha, double fMultiplier, double fScale, double fTimeStart, double fTimeEnd, int nFrames, VisPersist * psVisData);
bool ExportModelFileAnimatedSTL (char const * szFilename, bool boBinary, bool boScreenCoords, double fMultiplier, double fScale, double fTimeStart, double fTimeEnd, int nFrames, VisPersist * psVisData);
void SetPauseAnimation (bool boPause, VisPersist * psVisData); void SetPauseAnimation (bool boPause, VisPersist * psVisData);
bool GetPauseAnimation (VisPersist * psVisData); bool GetPauseAnimation (VisPersist * psVisData);
ControlvarPersist * SetControlVar (char const * const szVarName, char const * const szVarValue, VisPersist * psVisData); ControlvarPersist * SetControlVar (char const * const szVarName, char const * const szVarValue, VisPersist * psVisData);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment