summaryrefslogtreecommitdiffstats
path: root/plug-ins/map-object/map-object-ui.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 03:13:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-19 03:13:10 +0000
commit3c57dd931145d43f2b0aef96c4d178135956bf91 (patch)
tree3de698981e9f0cc2c4f9569b19a5f3595e741f6b /plug-ins/map-object/map-object-ui.c
parentInitial commit. (diff)
downloadgimp-3c57dd931145d43f2b0aef96c4d178135956bf91.tar.xz
gimp-3c57dd931145d43f2b0aef96c4d178135956bf91.zip
Adding upstream version 2.10.36.upstream/2.10.36
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'plug-ins/map-object/map-object-ui.c')
-rw-r--r--plug-ins/map-object/map-object-ui.c1462
1 files changed, 1462 insertions, 0 deletions
diff --git a/plug-ins/map-object/map-object-ui.c b/plug-ins/map-object/map-object-ui.c
new file mode 100644
index 0000000..7f1d96d
--- /dev/null
+++ b/plug-ins/map-object/map-object-ui.c
@@ -0,0 +1,1462 @@
+/**************************************************************/
+/* Dialog creation and updaters, callbacks and event-handlers */
+/**************************************************************/
+
+#include "config.h"
+
+#include <libgimp/gimp.h>
+#include <libgimp/gimpui.h>
+
+#include "arcball.h"
+#include "map-object-ui.h"
+#include "map-object-image.h"
+#include "map-object-apply.h"
+#include "map-object-preview.h"
+#include "map-object-main.h"
+#include "map-object-stock.h"
+
+#include "libgimp/stdplugins-intl.h"
+
+
+GtkWidget *previewarea = NULL;
+
+static GtkWidget *appwin = NULL;
+static GtkNotebook *options_note_book = NULL;
+
+static GtkWidget *pointlightwid;
+static GtkWidget *dirlightwid;
+
+static GtkAdjustment *xadj, *yadj, *zadj;
+
+static GtkWidget *box_page = NULL;
+static GtkWidget *cylinder_page = NULL;
+
+static guint left_button_pressed = FALSE;
+static guint light_hit = FALSE;
+
+
+static void create_main_notebook (GtkWidget *container);
+
+static gint preview_events (GtkWidget *area,
+ GdkEvent *event);
+
+static void update_light_pos_entries (void);
+
+static void double_adjustment_update (GtkAdjustment *adjustment,
+ gpointer data);
+
+static void toggle_update (GtkWidget *widget,
+ gpointer data);
+
+static void lightmenu_callback (GtkWidget *widget,
+ gpointer data);
+
+static void preview_callback (GtkWidget *widget,
+ gpointer data);
+
+static gint box_constrain (gint32 image_id,
+ gint32 drawable_id,
+ gpointer data);
+static gint cylinder_constrain (gint32 image_id,
+ gint32 drawable_id,
+ gpointer data);
+
+static GtkWidget * create_options_page (void);
+static GtkWidget * create_light_page (void);
+static GtkWidget * create_material_page (void);
+static GtkWidget * create_orientation_page (void);
+static GtkWidget * create_box_page (void);
+static GtkWidget * create_cylinder_page (void);
+
+
+/******************************************************/
+/* Update angle & position (redraw grid if necessary) */
+/******************************************************/
+
+static void
+double_adjustment_update (GtkAdjustment *adjustment,
+ gpointer data)
+{
+ gimp_double_adjustment_update (adjustment, data);
+
+ if (mapvals.livepreview)
+ compute_preview_image ();
+
+ gtk_widget_queue_draw (previewarea);
+}
+
+static void
+update_light_pos_entries (void)
+{
+ g_signal_handlers_block_by_func (xadj,
+ double_adjustment_update,
+ &mapvals.lightsource.position.x);
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (xadj),
+ mapvals.lightsource.position.x);
+ g_signal_handlers_unblock_by_func (xadj,
+ double_adjustment_update,
+ &mapvals.lightsource.position.x);
+
+ g_signal_handlers_block_by_func (yadj,
+ double_adjustment_update,
+ &mapvals.lightsource.position.y);
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (yadj),
+ mapvals.lightsource.position.y);
+ g_signal_handlers_unblock_by_func (yadj,
+ double_adjustment_update,
+ &mapvals.lightsource.position.y);
+
+ g_signal_handlers_block_by_func (zadj,
+ double_adjustment_update,
+ &mapvals.lightsource.position.z);
+ gtk_adjustment_set_value (GTK_ADJUSTMENT (zadj),
+ mapvals.lightsource.position.z);
+ g_signal_handlers_unblock_by_func (zadj,
+ double_adjustment_update,
+ &mapvals.lightsource.position.z);
+}
+
+/**********************/
+/* Std. toggle update */
+/**********************/
+
+static void
+toggle_update (GtkWidget *widget,
+ gpointer data)
+{
+ gimp_toggle_button_update (widget, data);
+
+ compute_preview_image ();
+ gtk_widget_queue_draw (previewarea);
+}
+
+/*****************************************/
+/* Main window light type menu callback. */
+/*****************************************/
+
+static void
+lightmenu_callback (GtkWidget *widget,
+ gpointer data)
+{
+ int active;
+
+ gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget),
+ &active);
+
+ mapvals.lightsource.type = active;
+
+ if (mapvals.lightsource.type == POINT_LIGHT)
+ {
+ gtk_widget_hide (dirlightwid);
+ gtk_widget_show (pointlightwid);
+ }
+ else if (mapvals.lightsource.type == DIRECTIONAL_LIGHT)
+ {
+ gtk_widget_hide (pointlightwid);
+ gtk_widget_show (dirlightwid);
+ }
+ else
+ {
+ gtk_widget_hide (pointlightwid);
+ gtk_widget_hide (dirlightwid);
+ }
+
+ if (mapvals.livepreview)
+ {
+ compute_preview_image ();
+ gtk_widget_queue_draw (previewarea);
+ }
+}
+
+/***************************************/
+/* Main window map type menu callback. */
+/***************************************/
+
+static void
+mapmenu_callback (GtkWidget *widget,
+ gpointer data)
+{
+ int active;
+
+ gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget),
+ &active);
+
+ mapvals.maptype = active;
+
+ if (mapvals.livepreview)
+ {
+ compute_preview_image ();
+ gtk_widget_queue_draw (previewarea);
+ }
+
+ if (mapvals.maptype == MAP_BOX)
+ {
+ if (cylinder_page && gtk_widget_get_parent (GTK_WIDGET (cylinder_page)) ==
+ GTK_WIDGET (options_note_book))
+ {
+ gtk_container_remove (GTK_CONTAINER (options_note_book), cylinder_page);
+ }
+
+ if (!box_page)
+ {
+ box_page = create_box_page ();
+ g_object_ref (box_page);
+ }
+ gtk_notebook_append_page (options_note_book,
+ box_page,
+ gtk_label_new_with_mnemonic (_("_Box")));
+ }
+ else if (mapvals.maptype == MAP_CYLINDER)
+ {
+ if (box_page && gtk_widget_get_parent (GTK_WIDGET (box_page)) ==
+ GTK_WIDGET (options_note_book))
+ {
+ gtk_container_remove (GTK_CONTAINER (options_note_book), box_page);
+ }
+
+ if (!cylinder_page)
+ {
+ cylinder_page = create_cylinder_page ();
+ g_object_ref (cylinder_page);
+ }
+ gtk_notebook_append_page (options_note_book,
+ cylinder_page,
+ gtk_label_new_with_mnemonic (_("C_ylinder")));
+ }
+ else
+ {
+ if (box_page && gtk_widget_get_parent (GTK_WIDGET (box_page)) ==
+ GTK_WIDGET (options_note_book))
+ {
+ gtk_container_remove (GTK_CONTAINER (options_note_book), box_page);
+ }
+
+ if (cylinder_page && gtk_widget_get_parent (GTK_WIDGET (cylinder_page)) ==
+ GTK_WIDGET (options_note_book))
+ {
+ gtk_container_remove (GTK_CONTAINER (options_note_book), cylinder_page);
+ }
+ }
+}
+
+/******************************************/
+/* Main window "Preview!" button callback */
+/******************************************/
+
+static void
+preview_callback (GtkWidget *widget,
+ gpointer data)
+{
+ compute_preview_image ();
+
+ gtk_widget_queue_draw (previewarea);
+}
+
+static void
+zoomed_callback (GimpZoomModel *model)
+{
+ mapvals.zoom = gimp_zoom_model_get_factor (model);
+
+ compute_preview_image ();
+
+ gtk_widget_queue_draw (previewarea);
+}
+
+/**********************************************/
+/* Main window "Apply" button callback. */
+/* Render to GIMP image, close down and exit. */
+/**********************************************/
+
+static gint
+box_constrain (gint32 image_id,
+ gint32 drawable_id,
+ gpointer data)
+{
+ if (drawable_id == -1)
+ return TRUE;
+
+ return (gimp_drawable_is_rgb (drawable_id) &&
+ !gimp_drawable_is_indexed (drawable_id));
+}
+
+static gint
+cylinder_constrain (gint32 image_id,
+ gint32 drawable_id,
+ gpointer data)
+{
+ if (drawable_id == -1)
+ return TRUE;
+
+ return (gimp_drawable_is_rgb (drawable_id) &&
+ !gimp_drawable_is_indexed (drawable_id));
+}
+
+/******************************/
+/* Preview area event handler */
+/******************************/
+
+static gint
+preview_events (GtkWidget *area,
+ GdkEvent *event)
+{
+ HVect __attribute__((unused))pos;
+/* HMatrix RotMat;
+ gdouble a,b,c; */
+
+ switch (event->type)
+ {
+ case GDK_ENTER_NOTIFY:
+ break;
+
+ case GDK_LEAVE_NOTIFY:
+ break;
+
+ case GDK_BUTTON_PRESS:
+ light_hit = check_light_hit (event->button.x, event->button.y);
+ if (light_hit == FALSE)
+ {
+ pos.x = -(2.0 * (gdouble) event->button.x /
+ (gdouble) PREVIEW_WIDTH - 1.0);
+ pos.y = (2.0 * (gdouble) event->button.y /
+ (gdouble) PREVIEW_HEIGHT - 1.0);
+ /*ArcBall_Mouse(pos);
+ ArcBall_BeginDrag(); */
+ }
+ left_button_pressed = TRUE;
+ break;
+
+ case GDK_BUTTON_RELEASE:
+ if (light_hit == TRUE)
+ {
+ compute_preview_image ();
+
+ gtk_widget_queue_draw (previewarea);
+ }
+ else
+ {
+ pos.x = -(2.0 * (gdouble) event->button.x /
+ (gdouble) PREVIEW_WIDTH - 1.0);
+ pos.y = (2.0 * (gdouble) event->button.y /
+ (gdouble) PREVIEW_HEIGHT - 1.0);
+ /*ArcBall_Mouse(pos);
+ ArcBall_EndDrag(); */
+ }
+ left_button_pressed = FALSE;
+ break;
+
+ case GDK_MOTION_NOTIFY:
+ if (left_button_pressed == TRUE)
+ {
+ if (light_hit == TRUE)
+ {
+ gint live = mapvals.livepreview;
+
+ mapvals.livepreview = FALSE;
+ update_light (event->motion.x, event->motion.y);
+ update_light_pos_entries ();
+ mapvals.livepreview = live;
+ }
+ else
+ {
+ pos.x = -(2.0 * (gdouble) event->motion.x /
+ (gdouble) PREVIEW_WIDTH - 1.0);
+ pos.y = (2.0 * (gdouble) event->motion.y /
+ (gdouble) PREVIEW_HEIGHT - 1.0);
+/* ArcBall_Mouse(pos);
+ ArcBall_Update();
+ ArcBall_Values(&a,&b,&c);
+ Alpha+=RadToDeg(-a);
+ Beta+RadToDeg(-b);
+ Gamma+=RadToDeg(-c);
+ if (Alpha>180) Alpha-=360;
+ if (Alpha<-180) Alpha+=360;
+ if (Beta>180) Beta-=360;
+ if (Beta<-180) Beta+=360;
+ if (Gamma>180) Gamma-=360;
+ if (Gamma<-180) Gamma+=360;
+ UpdateAngleSliders(); */
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return FALSE;
+}
+
+
+static GtkWidget *
+spin_button_new (GtkAdjustment **adjustment, /* return value */
+ gdouble value,
+ gdouble lower,
+ gdouble upper,
+ gdouble step_increment,
+ gdouble page_increment,
+ gdouble page_size,
+ gdouble climb_rate,
+ guint digits)
+{
+ GtkWidget *spinbutton;
+
+ *adjustment = (GtkAdjustment *)
+ gtk_adjustment_new (value, lower, upper,
+ step_increment, page_increment, 0);
+
+ spinbutton = gimp_spin_button_new (GTK_ADJUSTMENT (*adjustment),
+ climb_rate, digits);
+
+ gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinbutton), TRUE);
+
+ return spinbutton;
+}
+
+/*******************************/
+/* Create general options page */
+/*******************************/
+
+static GtkWidget *
+create_options_page (void)
+{
+ GtkWidget *page;
+ GtkWidget *frame;
+ GtkWidget *vbox;
+ GtkWidget *hbox;
+ GtkWidget *label;
+ GtkWidget *combo;
+ GtkWidget *toggle;
+ GtkWidget *table;
+ GtkWidget *spinbutton;
+ GtkAdjustment *adj;
+
+ page = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (page), 12);
+
+ /* General options */
+
+ frame = gimp_frame_new (_("General Options"));
+ gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_container_add (GTK_CONTAINER (frame), vbox);
+ gtk_widget_show (vbox);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbox);
+
+ label = gtk_label_new (_("Map to:"));
+ gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
+ gtk_widget_show (label);
+
+ combo = gimp_int_combo_box_new (_("Plane"), MAP_PLANE,
+ _("Sphere"), MAP_SPHERE,
+ _("Box"), MAP_BOX,
+ _("Cylinder"), MAP_CYLINDER,
+ NULL);
+ gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (combo), mapvals.maptype);
+ gtk_box_pack_start (GTK_BOX (hbox), combo, TRUE, TRUE, 0);
+ gtk_widget_show (combo);
+
+ g_signal_connect (combo, "changed",
+ G_CALLBACK (mapmenu_callback),
+ &mapvals.maptype);
+
+ gimp_help_set_help_data (combo, _("Type of object to map to"), NULL);
+
+ toggle = gtk_check_button_new_with_label (_("Transparent background"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
+ mapvals.transparent_background);
+ gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
+ gtk_widget_show (toggle);
+
+ g_signal_connect (toggle, "toggled",
+ G_CALLBACK (toggle_update),
+ &mapvals.transparent_background);
+
+ gimp_help_set_help_data (toggle,
+ _("Make image transparent outside object"), NULL);
+
+ toggle = gtk_check_button_new_with_label (_("Tile source image"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
+ mapvals.tiled);
+ gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
+ gtk_widget_show (toggle);
+
+ g_signal_connect (toggle, "toggled",
+ G_CALLBACK (toggle_update),
+ &mapvals.tiled);
+
+ gimp_help_set_help_data (toggle,
+ _("Tile source image: useful for infinite planes"),
+ NULL);
+
+ toggle = gtk_check_button_new_with_label (_("Create new image"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
+ mapvals.create_new_image);
+ gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
+ gtk_widget_show (toggle);
+
+ g_signal_connect (toggle, "toggled",
+ G_CALLBACK (gimp_toggle_button_update),
+ &mapvals.create_new_image);
+
+ gimp_help_set_help_data (toggle,
+ _("Create a new image when applying filter"), NULL);
+
+ toggle = gtk_check_button_new_with_label (_("Create new layer"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
+ mapvals.create_new_layer);
+ gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
+ gtk_widget_show (toggle);
+
+ g_signal_connect (toggle, "toggled",
+ G_CALLBACK (gimp_toggle_button_update),
+ &mapvals.create_new_layer);
+
+ gimp_help_set_help_data (toggle,
+ _("Create a new layer when applying filter"), NULL);
+
+ /* Antialiasing options */
+
+ frame = gimp_frame_new (NULL);
+ gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ toggle = gtk_check_button_new_with_mnemonic (_("Enable _antialiasing"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
+ mapvals.antialiasing);
+ gtk_frame_set_label_widget (GTK_FRAME (frame), toggle);
+ gtk_widget_show (toggle);
+
+ g_signal_connect (toggle, "toggled",
+ G_CALLBACK (gimp_toggle_button_update),
+ &mapvals.antialiasing);
+
+ gimp_help_set_help_data (toggle,
+ _("Enable/disable jagged edges removal "
+ "(antialiasing)"), NULL);
+
+ table = gtk_table_new (2, 3, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_container_add (GTK_CONTAINER (frame), table);
+ gtk_widget_show (table);
+
+ g_object_bind_property (toggle, "active",
+ table, "sensitive",
+ G_BINDING_SYNC_CREATE);
+
+ adj = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
+ _("_Depth:"), 0, 0,
+ mapvals.maxdepth, 1.0, 5.0, 0.1, 1.0,
+ 1, TRUE, 0, 0,
+ _("Antialiasing quality. Higher is better, "
+ "but slower"), NULL);
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (gimp_double_adjustment_update),
+ &mapvals.maxdepth);
+
+ spinbutton = spin_button_new (&adj, mapvals.pixelthreshold,
+ 0.001, 1000, 0.1, 1, 0, 0, 3);
+ gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
+ _("_Threshold:"), 0.0, 0.5,
+ spinbutton, 1, TRUE);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.pixelthreshold);
+
+ gimp_help_set_help_data (spinbutton,
+ _("Stop when pixel differences are smaller than "
+ "this value"), NULL);
+
+ gtk_widget_show (page);
+
+ return page;
+}
+
+/******************************/
+/* Create light settings page */
+/******************************/
+
+static GtkWidget *
+create_light_page (void)
+{
+ GtkWidget *page;
+ GtkWidget *frame;
+ GtkWidget *table;
+ GtkWidget *combo;
+ GtkWidget *colorbutton;
+ GtkWidget *spinbutton;
+ GtkAdjustment *adj;
+
+ page = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (page), 12);
+
+ frame = gimp_frame_new (_("Light Settings"));
+ gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ table = gtk_table_new (2, 2, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_container_add (GTK_CONTAINER (frame), table); gtk_widget_show (table);
+
+ combo = gimp_int_combo_box_new (_("Point light"), POINT_LIGHT,
+ _("Directional light"), DIRECTIONAL_LIGHT,
+ _("No light"), NO_LIGHT,
+ NULL);
+ gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (combo),
+ mapvals.lightsource.type);
+ gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
+ _("Lightsource type:"), 0.0, 0.5,
+ combo, 1, FALSE);
+
+ g_signal_connect (combo, "changed",
+ G_CALLBACK (lightmenu_callback),
+ &mapvals.lightsource.type);
+
+ gimp_help_set_help_data (combo, _("Type of light source to apply"), NULL);
+
+ colorbutton = gimp_color_button_new (_("Select lightsource color"),
+ 64, 16,
+ &mapvals.lightsource.color,
+ GIMP_COLOR_AREA_FLAT);
+ gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
+ _("Lightsource color:"), 0.0, 0.5,
+ colorbutton, 1, FALSE);
+
+ g_signal_connect (colorbutton, "color-changed",
+ G_CALLBACK (gimp_color_button_get_color),
+ &mapvals.lightsource.color);
+
+ gimp_help_set_help_data (colorbutton,
+ _("Set light source color"), NULL);
+
+ pointlightwid = gimp_frame_new (_("Position"));
+ gtk_box_pack_start (GTK_BOX (page), pointlightwid, FALSE, FALSE, 0);
+
+ if (mapvals.lightsource.type == POINT_LIGHT)
+ gtk_widget_show (pointlightwid);
+
+ table = gtk_table_new (3, 2, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_container_add (GTK_CONTAINER (pointlightwid), table);
+ gtk_widget_show (table);
+
+ spinbutton = spin_button_new (&xadj, mapvals.lightsource.position.x,
+ -G_MAXFLOAT, G_MAXFLOAT,
+ 0.1, 1.0, 0.0, 0.0, 2);
+ gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
+ _("X:"), 0.0, 0.5,
+ spinbutton, 1, TRUE);
+
+ g_signal_connect (xadj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.lightsource.position.x);
+
+ gimp_help_set_help_data (spinbutton,
+ _("Light source X position in XYZ space"), NULL);
+
+ spinbutton = spin_button_new (&yadj, mapvals.lightsource.position.y,
+ -G_MAXFLOAT, G_MAXFLOAT,
+ 0.1, 1.0, 0.0, 0.0, 2);
+ gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
+ _("Y:"), 0.0, 0.5,
+ spinbutton, 1, TRUE);
+
+ g_signal_connect (yadj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.lightsource.position.y);
+
+ gimp_help_set_help_data (spinbutton,
+ _("Light source Y position in XYZ space"), NULL);
+
+ spinbutton = spin_button_new (&zadj, mapvals.lightsource.position.z,
+ -G_MAXFLOAT, G_MAXFLOAT,
+ 0.1, 1.0, 0.0, 0.0, 2);
+ gimp_table_attach_aligned (GTK_TABLE (table), 0, 2,
+ _("Z:"), 0.0, 0.5,
+ spinbutton, 1, TRUE);
+
+ g_signal_connect (zadj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.lightsource.position.z);
+
+ gimp_help_set_help_data (spinbutton,
+ _("Light source Z position in XYZ space"), NULL);
+
+
+ dirlightwid = gimp_frame_new (_("Direction Vector"));
+ gtk_box_pack_start (GTK_BOX (page), dirlightwid, FALSE, FALSE, 0);
+
+ if (mapvals.lightsource.type == DIRECTIONAL_LIGHT)
+ gtk_widget_show (dirlightwid);
+
+ table = gtk_table_new (3, 2, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_container_add (GTK_CONTAINER (dirlightwid), table);
+ gtk_widget_show (table);
+
+ spinbutton = spin_button_new (&adj, mapvals.lightsource.direction.x,
+ -1.0, 1.0, 0.01, 0.1, 0.0, 0.0, 2);
+ gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
+ _("X:"), 0.0, 0.5,
+ spinbutton, 1, TRUE);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.lightsource.direction.x);
+
+ gimp_help_set_help_data (spinbutton,
+ _("Light source X direction in XYZ space"), NULL);
+
+ spinbutton = spin_button_new (&adj, mapvals.lightsource.direction.y,
+ -1.0, 1.0, 0.01, 0.1, 0.0, 0.0, 2);
+ gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
+ _("Y:"), 0.0, 0.5,
+ spinbutton, 1, TRUE);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.lightsource.direction.y);
+
+ gimp_help_set_help_data (spinbutton,
+ _("Light source Y direction in XYZ space"), NULL);
+
+ spinbutton = spin_button_new (&adj, mapvals.lightsource.direction.z,
+ -1.0, 1.0, 0.01, 0.1, 0.0, 0.0, 2);
+ gimp_table_attach_aligned (GTK_TABLE (table), 0, 2,
+ _("Z:"), 0.0, 0.5,
+ spinbutton, 1, TRUE);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.lightsource.direction.z);
+
+ gimp_help_set_help_data (spinbutton,
+ _("Light source Z direction in XYZ space"), NULL);
+
+ gtk_widget_show (page);
+
+ return page;
+}
+
+/*********************************/
+/* Create material settings page */
+/*********************************/
+
+static GtkWidget *
+create_material_page (void)
+{
+ GtkSizeGroup *group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+ GtkWidget *page;
+ GtkWidget *frame;
+ GtkWidget *table;
+ GtkWidget *label;
+ GtkWidget *hbox;
+ GtkWidget *spinbutton;
+ GtkWidget *image;
+ GtkAdjustment *adj;
+
+ page = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (page), 12);
+
+ frame = gimp_frame_new (_("Intensity Levels"));
+ gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+ gtk_widget_show (hbox);
+
+ table = gtk_table_new (2, 4, FALSE);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0);
+ gtk_widget_show (table);
+
+ /* Ambient intensity */
+
+ image = gtk_image_new_from_stock (STOCK_INTENSITY_AMBIENT_LOW,
+ GTK_ICON_SIZE_BUTTON);
+ label = gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
+ _("Ambient:"), 0.0, 0.5,
+ image, 1, FALSE);
+ gtk_size_group_add_widget (group, label);
+
+ spinbutton = spin_button_new (&adj, mapvals.material.ambient_int,
+ 0, G_MAXFLOAT, 0.1, 1.0, 0.0, 0.0, 2);
+ gtk_table_attach (GTK_TABLE (table), spinbutton, 2, 3, 0, 1,
+ GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+ gtk_widget_show (spinbutton);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.material.ambient_int);
+
+ gimp_help_set_help_data (spinbutton,
+ _("Amount of original color to show where no "
+ "direct light falls"), NULL);
+
+ image = gtk_image_new_from_stock (STOCK_INTENSITY_AMBIENT_HIGH,
+ GTK_ICON_SIZE_BUTTON);
+ gtk_table_attach (GTK_TABLE (table), image, 3, 4, 0, 1,
+ GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+ gtk_widget_show (image);
+
+ /* Diffuse intensity */
+
+ image = gtk_image_new_from_stock (STOCK_INTENSITY_DIFFUSE_LOW,
+ GTK_ICON_SIZE_BUTTON);
+ label = gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
+ _("Diffuse:"), 0.0, 0.5,
+ image, 1, FALSE);
+ gtk_size_group_add_widget (group, label);
+
+ spinbutton = spin_button_new (&adj, mapvals.material.diffuse_int,
+ 0, G_MAXFLOAT, 0.1, 1.0, 0.0, 0.0, 2);
+ gtk_table_attach (GTK_TABLE (table), spinbutton, 2, 3, 1, 2,
+ GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+ gtk_widget_show (spinbutton);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.material.diffuse_int);
+
+ gimp_help_set_help_data (spinbutton,
+ _("Intensity of original color when lit by a light "
+ "source"), NULL);
+
+ image = gtk_image_new_from_stock (STOCK_INTENSITY_DIFFUSE_HIGH,
+ GTK_ICON_SIZE_BUTTON);
+ gtk_table_attach (GTK_TABLE (table), image, 3, 4, 1, 2,
+ GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+ gtk_widget_show (image);
+
+ frame = gimp_frame_new (_("Reflectivity"));
+ gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_container_add (GTK_CONTAINER (frame), hbox);
+ gtk_widget_show (hbox);
+
+ table = gtk_table_new (3, 4, FALSE);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0);
+ gtk_widget_show (table);
+
+ /* Diffuse reflection */
+
+ image = gtk_image_new_from_stock (STOCK_REFLECTIVITY_DIFFUSE_LOW,
+ GTK_ICON_SIZE_BUTTON);
+ label = gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
+ _("Diffuse:"), 0.0, 0.5,
+ image, 1, FALSE);
+ gtk_size_group_add_widget (group, label);
+
+ spinbutton = spin_button_new (&adj, mapvals.material.diffuse_ref,
+ 0, G_MAXFLOAT, 0.1, 1.0, 0.0, 0.0, 2);
+ gtk_table_attach (GTK_TABLE (table), spinbutton, 2, 3, 0, 1,
+ GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+ gtk_widget_show (spinbutton);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.material.diffuse_ref);
+
+ gimp_help_set_help_data (spinbutton,
+ _("Higher values makes the object reflect more "
+ "light (appear lighter)"), NULL);
+
+ image = gtk_image_new_from_stock (STOCK_REFLECTIVITY_DIFFUSE_HIGH,
+ GTK_ICON_SIZE_BUTTON);
+ gtk_table_attach (GTK_TABLE (table), image, 3, 4, 0, 1,
+ GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+ gtk_widget_show (image);
+
+ /* Specular reflection */
+
+ image = gtk_image_new_from_stock (STOCK_REFLECTIVITY_SPECULAR_LOW,
+ GTK_ICON_SIZE_BUTTON);
+ label = gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
+ _("Specular:"), 0.0, 0.5,
+ image, 1, FALSE);
+ gtk_size_group_add_widget (group, label);
+
+ spinbutton = spin_button_new (&adj, mapvals.material.specular_ref,
+ 0, G_MAXFLOAT, 0.1, 1.0, 0.0, 0.0, 2);
+ gtk_table_attach (GTK_TABLE (table), spinbutton, 2, 3, 1, 2,
+ GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+ gtk_widget_show (spinbutton);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.material.specular_ref);
+
+ gimp_help_set_help_data (spinbutton,
+ _("Controls how intense the highlights will be"),
+ NULL);
+
+ image = gtk_image_new_from_stock (STOCK_REFLECTIVITY_SPECULAR_HIGH,
+ GTK_ICON_SIZE_BUTTON);
+ gtk_table_attach (GTK_TABLE (table), image, 3, 4, 1, 2,
+ GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+ gtk_widget_show (image);
+
+ /* Highlight */
+
+ image = gtk_image_new_from_stock (STOCK_REFLECTIVITY_HIGHLIGHT_LOW,
+ GTK_ICON_SIZE_BUTTON);
+ label = gimp_table_attach_aligned (GTK_TABLE (table), 0, 2,
+ _("Highlight:"), 0.0, 0.5,
+ image, 1, FALSE);
+ gtk_size_group_add_widget (group, label);
+
+ spinbutton = spin_button_new (&adj, mapvals.material.highlight,
+ 0, G_MAXFLOAT, 0.1, 1.0, 0.0, 0.0, 2);
+ gtk_table_attach (GTK_TABLE (table), spinbutton, 2, 3, 2, 3,
+ GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+ gtk_widget_show (spinbutton);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.material.highlight);
+
+ gimp_help_set_help_data (spinbutton,
+ _("Higher values makes the highlights more focused"),
+ NULL);
+
+ image = gtk_image_new_from_stock (STOCK_REFLECTIVITY_HIGHLIGHT_HIGH,
+ GTK_ICON_SIZE_BUTTON);
+ gtk_table_attach (GTK_TABLE (table), image, 3, 4, 2, 3,
+ GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
+ gtk_widget_show (image);
+
+ gtk_widget_show (page);
+
+ g_object_unref (group);
+
+ return page;
+}
+
+/****************************************/
+/* Create orientation and position page */
+/****************************************/
+
+static GtkWidget *
+create_orientation_page (void)
+{
+ GtkSizeGroup *group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+ GtkWidget *page;
+ GtkWidget *frame;
+ GtkWidget *table;
+ GtkAdjustment *adj;
+
+ page = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (page), 12);
+
+ frame = gimp_frame_new (_("Position"));
+ gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ table = gtk_table_new (3, 3, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_container_add (GTK_CONTAINER (frame), table);
+ gtk_widget_show (table);
+
+ adj = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
+ _("X:"), 0, 0,
+ mapvals.position.x, -1.0, 2.0, 0.01, 0.1, 5,
+ TRUE, 0, 0,
+ _("Object X position in XYZ space"), NULL);
+ gtk_size_group_add_widget (group, GIMP_SCALE_ENTRY_SPINBUTTON (adj));
+ gtk_spin_button_configure (GIMP_SCALE_ENTRY_SPINBUTTON (adj),
+ GIMP_SCALE_ENTRY_SPINBUTTON_ADJ (adj), 0.01, 5);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.position.x);
+
+ adj = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
+ _("Y:"), 0, 0,
+ mapvals.position.y, -1.0, 2.0, 0.01, 0.1, 5,
+ TRUE, 0, 0,
+ _("Object Y position in XYZ space"), NULL);
+ gtk_size_group_add_widget (group, GIMP_SCALE_ENTRY_SPINBUTTON (adj));
+ gtk_spin_button_configure (GIMP_SCALE_ENTRY_SPINBUTTON (adj),
+ GIMP_SCALE_ENTRY_SPINBUTTON_ADJ (adj), 0.01, 5);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.position.y);
+
+ adj = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
+ _("Z:"), 0, 0,
+ mapvals.position.z, -1.0, 2.0, 0.01, 0.1, 5,
+ TRUE, 0, 0,
+ _("Object Z position in XYZ space"), NULL);
+ gtk_size_group_add_widget (group, GIMP_SCALE_ENTRY_SPINBUTTON (adj));
+ gtk_spin_button_configure (GIMP_SCALE_ENTRY_SPINBUTTON (adj),
+ GIMP_SCALE_ENTRY_SPINBUTTON_ADJ (adj), 0.01, 5);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.position.z);
+
+ frame = gimp_frame_new (_("Rotation"));
+ gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ table = gtk_table_new (3, 3, FALSE);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_container_add (GTK_CONTAINER (frame), table);
+ gtk_widget_show (table);
+
+ adj = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
+ _("X:"), 0, 0,
+ mapvals.alpha, -180.0, 180.0, 1.0, 15.0, 1,
+ TRUE, 0, 0,
+ _("Rotation angle about X axis"), NULL);
+ gtk_size_group_add_widget (group, GIMP_SCALE_ENTRY_SPINBUTTON (adj));
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.alpha);
+
+ adj = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
+ _("Y:"), 0, 0,
+ mapvals.beta, -180.0, 180.0, 1.0, 15.0, 1,
+ TRUE, 0, 0,
+ _("Rotation angle about Y axis"), NULL);
+ gtk_size_group_add_widget (group, GIMP_SCALE_ENTRY_SPINBUTTON (adj));
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.beta);
+
+ adj = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
+ _("Z:"), 0, 0,
+ mapvals.gamma, -180.0, 180.0, 1.0, 15.0, 1,
+ TRUE, 0, 0,
+ _("Rotation angle about Z axis"), NULL);
+ gtk_size_group_add_widget (group, GIMP_SCALE_ENTRY_SPINBUTTON (adj));
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.gamma);
+
+ gtk_widget_show (page);
+
+ g_object_unref (group);
+
+ return page;
+}
+
+static GtkWidget *
+create_box_page (void)
+{
+ GtkWidget *page;
+ GtkWidget *frame;
+ GtkWidget *vbox;
+ GtkWidget *table;
+ GtkAdjustment *adj;
+ gint i;
+
+ static gchar *labels[] =
+ {
+ N_("Front:"), N_("Back:"),
+ N_("Top:"), N_("Bottom:"),
+ N_("Left:"), N_("Right:")
+ };
+
+ page = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (page), 12);
+
+ frame = gimp_frame_new (_("Map Images to Box Faces"));
+ gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_add (GTK_CONTAINER (frame), vbox);
+ gtk_widget_show (vbox);
+
+ table = gtk_table_new (6, 2, FALSE);
+ gtk_table_set_row_spacings (GTK_TABLE(table), 6);
+ gtk_table_set_col_spacings (GTK_TABLE(table), 6);
+ gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 5);
+ gtk_widget_show (table);
+
+ for (i = 0; i < 6; i++)
+ {
+ GtkWidget *combo;
+
+ combo = gimp_drawable_combo_box_new (box_constrain, NULL);
+ gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo),
+ mapvals.boxmap_id[i],
+ G_CALLBACK (gimp_int_combo_box_get_active),
+ &mapvals.boxmap_id[i]);
+
+ gimp_table_attach_aligned (GTK_TABLE (table), 0, i,
+ gettext (labels[i]), 0.0, 0.5,
+ combo, 1, FALSE);
+ }
+
+ /* Scale scales */
+
+ table = gtk_table_new (3, 3, FALSE);
+ gtk_table_set_row_spacings (GTK_TABLE(table), 6);
+ gtk_table_set_col_spacings (GTK_TABLE(table), 6);
+ gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 0);
+ gtk_widget_show (table);
+
+ adj = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
+ _("Scale X:"), 0, 0,
+ mapvals.scale.x, 0.0, 5.0, 0.01, 0.1, 2,
+ TRUE, 0, 0,
+ _("X scale (size)"), NULL);
+ gtk_spin_button_configure (GIMP_SCALE_ENTRY_SPINBUTTON (adj),
+ GIMP_SCALE_ENTRY_SPINBUTTON_ADJ (adj), 0.1, 2);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.scale.x);
+
+ adj = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
+ _("Y:"), 0, 0,
+ mapvals.scale.y, 0.0, 5.0, 0.01, 0.1, 2,
+ TRUE, 0, 0,
+ _("Y scale (size)"), NULL);
+ gtk_spin_button_configure (GIMP_SCALE_ENTRY_SPINBUTTON (adj),
+ GIMP_SCALE_ENTRY_SPINBUTTON_ADJ (adj), 0.1, 2);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.scale.y);
+
+ adj = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 2,
+ _("Z:"), 0, 0,
+ mapvals.scale.z, 0.0, 5.0, 0.01, 0.1, 2,
+ TRUE, 0, 0,
+ _("Z scale (size)"), NULL);
+ gtk_spin_button_configure (GIMP_SCALE_ENTRY_SPINBUTTON (adj),
+ GIMP_SCALE_ENTRY_SPINBUTTON_ADJ (adj), 0.1, 2);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.scale.z);
+
+ gtk_widget_show (page);
+
+ return page;
+}
+
+static GtkWidget *
+create_cylinder_page (void)
+{
+ GtkSizeGroup *group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
+ GtkWidget *page;
+ GtkWidget *frame;
+ GtkWidget *table;
+ GtkAdjustment *adj;
+ gint i;
+
+ static const gchar *labels[] = { N_("_Top:"), N_("_Bottom:") };
+
+ page = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (page), 12);
+
+ frame = gimp_frame_new (_("Images for the Cap Faces"));
+ gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ table = gtk_table_new (2, 2, FALSE);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_container_add (GTK_CONTAINER (frame), table);
+ gtk_widget_show (table);
+
+ /* Option menus */
+
+ for (i = 0; i < 2; i++)
+ {
+ GtkWidget *combo;
+ GtkWidget *label;
+
+ combo = gimp_drawable_combo_box_new (cylinder_constrain, NULL);
+ gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo),
+ mapvals.cylindermap_id[i],
+ G_CALLBACK (gimp_int_combo_box_get_active),
+ &mapvals.cylindermap_id[i]);
+
+ label = gimp_table_attach_aligned (GTK_TABLE (table), 0, i,
+ gettext (labels[i]), 0.0, 0.5,
+ combo, 1, FALSE);
+ gtk_size_group_add_widget (group, label);
+ }
+
+ frame = gimp_frame_new (_("Size"));
+ gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ table = gtk_table_new (2, 3, FALSE);
+ gtk_table_set_row_spacings (GTK_TABLE (table), 6);
+ gtk_table_set_col_spacings (GTK_TABLE (table), 6);
+ gtk_container_add (GTK_CONTAINER (frame), table);
+ gtk_widget_show (table);
+
+ adj = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
+ _("R_adius:"), 0, 0,
+ mapvals.cylinder_radius,
+ 0.0, 2.0, 0.01, 0.1, 2,
+ TRUE, 0, 0,
+ _("Cylinder radius"), NULL);
+ gtk_size_group_add_widget (group, GIMP_SCALE_ENTRY_LABEL (adj));
+ gtk_spin_button_configure (GIMP_SCALE_ENTRY_SPINBUTTON (adj),
+ GIMP_SCALE_ENTRY_SPINBUTTON_ADJ (adj), 0.1, 2);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.cylinder_radius);
+
+ adj = (GtkAdjustment *)
+ gimp_scale_entry_new (GTK_TABLE (table), 0, 1,
+ _("L_ength:"), 0, 0,
+ mapvals.cylinder_length,
+ 0.0, 2.0, 0.01, 0.1, 2,
+ TRUE, 0, 0,
+ _("Cylinder length"), NULL);
+ gtk_size_group_add_widget (group, GIMP_SCALE_ENTRY_LABEL (adj));
+ gtk_spin_button_configure (GIMP_SCALE_ENTRY_SPINBUTTON (adj),
+ GIMP_SCALE_ENTRY_SPINBUTTON_ADJ (adj), 0.1, 2);
+
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (double_adjustment_update),
+ &mapvals.cylinder_length);
+
+ gtk_widget_show (page);
+
+ g_object_unref (group);
+
+ return page;
+}
+
+/****************************/
+/* Create notbook and pages */
+/****************************/
+
+static void
+create_main_notebook (GtkWidget *container)
+{
+ GtkWidget *page;
+
+ options_note_book = GTK_NOTEBOOK (gtk_notebook_new ());
+ gtk_container_add (GTK_CONTAINER (container),
+ GTK_WIDGET (options_note_book));
+
+ page = create_options_page ();
+ gtk_notebook_append_page (options_note_book, page,
+ gtk_label_new_with_mnemonic (_("O_ptions")));
+
+ page = create_light_page ();
+ gtk_notebook_append_page (options_note_book, page,
+ gtk_label_new_with_mnemonic (_("_Light")));
+
+ page = create_material_page ();
+ gtk_notebook_append_page (options_note_book, page,
+ gtk_label_new_with_mnemonic (_("_Material")));
+
+ page = create_orientation_page ();
+ gtk_notebook_append_page (options_note_book, page,
+ gtk_label_new_with_mnemonic (_("O_rientation")));
+
+ if (mapvals.maptype == MAP_BOX)
+ {
+ box_page = create_box_page ();
+ g_object_ref (box_page);
+ gtk_notebook_append_page (options_note_book, box_page,
+ gtk_label_new_with_mnemonic (_("_Box")));
+ }
+ else if (mapvals.maptype == MAP_CYLINDER)
+ {
+ cylinder_page = create_cylinder_page ();
+ g_object_ref (cylinder_page);
+ gtk_notebook_append_page (options_note_book, cylinder_page,
+ gtk_label_new_with_mnemonic (_("C_ylinder")));
+ }
+
+ gtk_widget_show (GTK_WIDGET (options_note_book));
+}
+
+/********************************/
+/* Create and show main dialog. */
+/********************************/
+
+gboolean
+main_dialog (gint32 drawable_id)
+{
+ GtkWidget *main_hbox;
+ GtkWidget *vbox;
+ GtkWidget *hbox;
+ GtkWidget *frame;
+ GtkWidget *button;
+ GtkWidget *toggle;
+ GimpZoomModel *model;
+ gboolean run = FALSE;
+
+ gimp_ui_init (PLUG_IN_BINARY, FALSE);
+
+ appwin = gimp_dialog_new (_("Map to Object"), PLUG_IN_ROLE,
+ NULL, 0,
+ gimp_standard_help_func, PLUG_IN_PROC,
+
+ _("_Cancel"), GTK_RESPONSE_CANCEL,
+ _("_OK"), GTK_RESPONSE_OK,
+
+ NULL);
+
+ gtk_dialog_set_alternative_button_order (GTK_DIALOG (appwin),
+ GTK_RESPONSE_OK,
+ GTK_RESPONSE_CANCEL,
+ -1);
+
+ gimp_window_set_transient (GTK_WINDOW (appwin));
+
+ main_hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
+ gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 12);
+ gtk_box_pack_start (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (appwin))),
+ main_hbox, FALSE, FALSE, 0);
+ gtk_widget_show (main_hbox);
+
+ /* Create the Preview */
+
+ vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
+ gtk_box_pack_start (GTK_BOX (main_hbox), vbox, FALSE, FALSE, 0);
+ gtk_widget_show (vbox);
+
+ /* Add preview widget and various buttons to the first part */
+
+ frame = gtk_frame_new (NULL);
+ gtk_frame_set_shadow_type (GTK_FRAME (frame), GTK_SHADOW_IN);
+ gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
+ gtk_widget_show (frame);
+
+ gtk_widget_realize (appwin);
+ previewarea = gtk_drawing_area_new ();
+ gtk_widget_set_size_request (previewarea, PREVIEW_WIDTH, PREVIEW_HEIGHT);
+ gtk_widget_set_events (previewarea, (GDK_EXPOSURE_MASK |
+ GDK_BUTTON1_MOTION_MASK |
+ GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK));
+ gtk_container_add (GTK_CONTAINER (frame), previewarea);
+ gtk_widget_show (previewarea);
+
+ g_signal_connect (previewarea, "event",
+ G_CALLBACK (preview_events),
+ previewarea);
+
+ g_signal_connect (previewarea, "expose-event",
+ G_CALLBACK (preview_expose),
+ previewarea);
+
+ hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+ gtk_widget_show (hbox);
+
+ button = gtk_button_new_with_mnemonic (_("_Preview!"));
+ gtk_misc_set_padding (GTK_MISC (gtk_bin_get_child (GTK_BIN (button))), 2, 0);
+ gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_widget_show (button);
+
+ g_signal_connect (button, "clicked",
+ G_CALLBACK (preview_callback),
+ NULL);
+
+ gimp_help_set_help_data (button, _("Recompute preview image"), NULL);
+
+ model = gimp_zoom_model_new ();
+ gimp_zoom_model_set_range (model, 0.25, 1.0);
+ gimp_zoom_model_zoom (model, GIMP_ZOOM_TO, mapvals.zoom);
+
+ button = gimp_zoom_button_new (model, GIMP_ZOOM_IN, GTK_ICON_SIZE_MENU);
+ gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_widget_show (button);
+
+ button = gimp_zoom_button_new (model, GIMP_ZOOM_OUT, GTK_ICON_SIZE_MENU);
+ gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_widget_show (button);
+
+ g_signal_connect (model, "zoomed",
+ G_CALLBACK (zoomed_callback),
+ NULL);
+
+ toggle = gtk_check_button_new_with_mnemonic (_("Show _wireframe"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), mapvals.showgrid);
+ gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
+ gtk_widget_show (toggle);
+
+ g_signal_connect (toggle, "toggled",
+ G_CALLBACK (toggle_update),
+ &mapvals.showgrid);
+
+ toggle = gtk_check_button_new_with_mnemonic (_("Update preview _live"));
+ gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle), mapvals.livepreview);
+ gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
+ gtk_widget_show (toggle);
+
+ g_signal_connect (toggle, "toggled",
+ G_CALLBACK (toggle_update),
+ &mapvals.livepreview);
+
+ create_main_notebook (main_hbox);
+
+ gtk_widget_show (appwin);
+
+ {
+ GdkCursor *cursor;
+
+ cursor = gdk_cursor_new_for_display (gtk_widget_get_display (previewarea),
+ GDK_HAND2);
+ gdk_window_set_cursor (gtk_widget_get_window (previewarea), cursor);
+ gdk_cursor_unref (cursor);
+ }
+
+ image_setup (drawable_id, TRUE);
+
+ compute_preview_image ();
+
+ if (gimp_dialog_run (GIMP_DIALOG (appwin)) == GTK_RESPONSE_OK)
+ run = TRUE;
+
+ gtk_widget_destroy (appwin);
+ if (preview_rgb_data)
+ g_free (preview_rgb_data);
+ if (preview_surface)
+ cairo_surface_destroy (preview_surface);
+ if (box_page)
+ g_object_unref (box_page);
+ if (cylinder_page)
+ g_object_unref (cylinder_page);
+
+ return run;
+}