2000-08-29 02:47:33 +08:00
|
|
|
/* Lighting Effects - A plug-in for GIMP
|
|
|
|
*
|
|
|
|
* Dialog creation and updaters, callbacks and event-handlers
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*/
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-12-30 08:23:34 +08:00
|
|
|
#include "config.h"
|
2004-07-20 05:33:55 +08:00
|
|
|
|
|
|
|
#include <stdio.h>
|
2004-07-20 03:49:19 +08:00
|
|
|
#include <string.h>
|
2004-07-20 05:33:55 +08:00
|
|
|
#include <errno.h>
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2000-02-18 21:59:18 +08:00
|
|
|
#include <libgimp/gimp.h>
|
2000-02-18 07:48:13 +08:00
|
|
|
#include <libgimp/gimpui.h>
|
|
|
|
|
1998-06-11 14:04:59 +08:00
|
|
|
#include "lighting_ui.h"
|
2000-02-18 07:48:13 +08:00
|
|
|
#include "lighting_main.h"
|
|
|
|
#include "lighting_image.h"
|
|
|
|
#include "lighting_apply.h"
|
|
|
|
#include "lighting_preview.h"
|
2004-07-13 23:59:52 +08:00
|
|
|
#include "lighting_stock.h"
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
#include "libgimp/stdplugins-intl.h"
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
extern LightingValues mapvals;
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static GtkWidget *appwin = NULL;
|
|
|
|
static GtkNotebook *options_note_book = NULL;
|
2000-08-29 22:27:40 +08:00
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
GdkGC *gc = NULL;
|
|
|
|
GtkWidget *previewarea = NULL;
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
static GtkWidget *colorbutton;
|
|
|
|
static GtkWidget *light_type_combo;
|
|
|
|
static GtkWidget *lightselect_combo;
|
|
|
|
static GtkWidget *spin_intensity;
|
|
|
|
static GtkWidget *isolate_button;
|
2004-07-20 03:49:19 +08:00
|
|
|
static gchar *lighting_effects_path = NULL;
|
2002-10-17 05:18:11 +08:00
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
static void create_main_notebook (GtkWidget *container);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
applied gimp-lecorfec-99041[02]-0, changes follow
* applied gimp-lecorfec-99041[02]-0, changes follow
* plug-ins/FractalExplorer/Dialogs.h (make_color_map):
replaced free with g_free to fix segfault.
* plug-ins/Lighting/lighting_preview.c (compute_preview):
allocate xpostab and ypostab only when needed (it could also be
allocated on stack with a compilation-fixed size like MapObject).
It avoids to lose some Kb on each preview :)
Also reindented (unfortunate C-c C-q) some other lines.
* plug-ins/Lighting/lighting_main.c (run):
release allocated postabs.
* plug-ins/Lighting/lighting_ui.c:
callbacks now have only one argument because gck widget use
gtk_signal_connect_object. Caused segfault for scale widget.
* plug-ins/autocrop/autocrop.c (doit):
return if image has only background (thus fixing a segfault).
* plug-ins/emboss/emboss.c (pluginCore, emboss_do_preview):
replaced malloc/free with g_malloc/g_free (unneeded, but
shouldn't everyone use glib calls ? :)
* plug-ins/flame/flame.c :
replaced a segfaulting free, and several harmless malloc/free pairs.
* plug-ins/flame/megawidget.c (mw_preview_build):
replaced harmless malloc/free pair.
Note : mwp->bits is malloc'ed but seems to be never freed.
* plug-ins/fractaltrace/fractaltrace.c (pixels_free):
replaced a bunch of segfaulting free.
(pixels_get, dialog_show): replaced gtk_signal_connect_object
with gtk_signal_connect to accomodate callbacks (caused STRANGE
dialog behaviour, coz you destroyed buttons one by one).
* plug-ins/illusion/illusion.c (dialog):
same gtk_signal_connect_object replacement for same reasons.
* plug-ins/libgck/gck/gckcolor.c :
changed all gck_rgb_to_color* functions to use a static GdkColor
instead of a malloc'ed area. Provided reentrant functions with
the old behaviour (gck_rgb_to_color*_r). Made some private functions
static, too.
gck_rgb_to_gdkcolor now use the new functions while
gck_rgb_to_gdkcolor_r is the reentrant version.
Also affected by this change: gck_gc_set_foreground and
gck_gc_set_background (no more free(color)).
* plug-ins/libgck/gck/gckcolor.h :
added the gck_rgb_to_gdkcolor_r proto.
* plug-ins/lic/lic.c (ok_button_clicked, cancel_button_clicked) :
segfault on gtk_widget_destroy, now calls gtk_main_quit.
(dialog_destroy) : segfault on window closure when called by
"destroy" event. Now called by "delete_event".
* plug-ins/megawidget/megawidget.c (mw_preview_build):
replaced harmless malloc/free pair.
Note : mwp->bits is malloc'ed but seems to be never freed.
* plug-ins/png/png.c (load_image):
replaced 2 segfaulting free.
* plug-ins/print/print-ps.c (ps_print):
replaced a segfaulting free (called many times :).
* plug-ins/sgi/sgi.c (load_image, save_image):
replaced a bunch of segfaulting free, and did some harmless
inits to avoid a few gcc warnings.
* plug-ins/wind/wind.c (render_wind):
replaced a segfaulting free.
(render_blast): replaced harmless malloc/free pair.
* plug-ins/bmp/bmpread.c (ReadImage):
yet another free()/g_free() problem fixed.
* plug-ins/exchange/exchange.c (real_exchange):
ditto.
* plug-ins/fp/fp.h: added Frames_Check_Button_In_A_Box proto.
* plug-ins/fp/fp_gtk.c: closing subdialogs via window manager
wasn't handled, thus leading to errors and crashes.
Now delete_event signals the dialog control button
to close a dialog with the good way.
* plug-ins/ifscompose/ifscompose.c (value_pair_create):
tried to set events mask on scale widget (a NO_WINDOW widget).
* plug-ins/png/png.c (save_image):
Replaced 2 free() with g_free() for g_malloc'ed memory.
Mysteriously I corrected the loading bug but not the saving one :)
-Yosh
1999-04-16 05:49:09 +08:00
|
|
|
#ifdef _LIGHTNING_UNUSED_CODE
|
2004-07-21 02:19:47 +08:00
|
|
|
static void xyzval_update (GtkEntry *entry);
|
applied gimp-lecorfec-99041[02]-0, changes follow
* applied gimp-lecorfec-99041[02]-0, changes follow
* plug-ins/FractalExplorer/Dialogs.h (make_color_map):
replaced free with g_free to fix segfault.
* plug-ins/Lighting/lighting_preview.c (compute_preview):
allocate xpostab and ypostab only when needed (it could also be
allocated on stack with a compilation-fixed size like MapObject).
It avoids to lose some Kb on each preview :)
Also reindented (unfortunate C-c C-q) some other lines.
* plug-ins/Lighting/lighting_main.c (run):
release allocated postabs.
* plug-ins/Lighting/lighting_ui.c:
callbacks now have only one argument because gck widget use
gtk_signal_connect_object. Caused segfault for scale widget.
* plug-ins/autocrop/autocrop.c (doit):
return if image has only background (thus fixing a segfault).
* plug-ins/emboss/emboss.c (pluginCore, emboss_do_preview):
replaced malloc/free with g_malloc/g_free (unneeded, but
shouldn't everyone use glib calls ? :)
* plug-ins/flame/flame.c :
replaced a segfaulting free, and several harmless malloc/free pairs.
* plug-ins/flame/megawidget.c (mw_preview_build):
replaced harmless malloc/free pair.
Note : mwp->bits is malloc'ed but seems to be never freed.
* plug-ins/fractaltrace/fractaltrace.c (pixels_free):
replaced a bunch of segfaulting free.
(pixels_get, dialog_show): replaced gtk_signal_connect_object
with gtk_signal_connect to accomodate callbacks (caused STRANGE
dialog behaviour, coz you destroyed buttons one by one).
* plug-ins/illusion/illusion.c (dialog):
same gtk_signal_connect_object replacement for same reasons.
* plug-ins/libgck/gck/gckcolor.c :
changed all gck_rgb_to_color* functions to use a static GdkColor
instead of a malloc'ed area. Provided reentrant functions with
the old behaviour (gck_rgb_to_color*_r). Made some private functions
static, too.
gck_rgb_to_gdkcolor now use the new functions while
gck_rgb_to_gdkcolor_r is the reentrant version.
Also affected by this change: gck_gc_set_foreground and
gck_gc_set_background (no more free(color)).
* plug-ins/libgck/gck/gckcolor.h :
added the gck_rgb_to_gdkcolor_r proto.
* plug-ins/lic/lic.c (ok_button_clicked, cancel_button_clicked) :
segfault on gtk_widget_destroy, now calls gtk_main_quit.
(dialog_destroy) : segfault on window closure when called by
"destroy" event. Now called by "delete_event".
* plug-ins/megawidget/megawidget.c (mw_preview_build):
replaced harmless malloc/free pair.
Note : mwp->bits is malloc'ed but seems to be never freed.
* plug-ins/png/png.c (load_image):
replaced 2 segfaulting free.
* plug-ins/print/print-ps.c (ps_print):
replaced a segfaulting free (called many times :).
* plug-ins/sgi/sgi.c (load_image, save_image):
replaced a bunch of segfaulting free, and did some harmless
inits to avoid a few gcc warnings.
* plug-ins/wind/wind.c (render_wind):
replaced a segfaulting free.
(render_blast): replaced harmless malloc/free pair.
* plug-ins/bmp/bmpread.c (ReadImage):
yet another free()/g_free() problem fixed.
* plug-ins/exchange/exchange.c (real_exchange):
ditto.
* plug-ins/fp/fp.h: added Frames_Check_Button_In_A_Box proto.
* plug-ins/fp/fp_gtk.c: closing subdialogs via window manager
wasn't handled, thus leading to errors and crashes.
Now delete_event signals the dialog control button
to close a dialog with the good way.
* plug-ins/ifscompose/ifscompose.c (value_pair_create):
tried to set events mask on scale widget (a NO_WINDOW widget).
* plug-ins/png/png.c (save_image):
Replaced 2 free() with g_free() for g_malloc'ed memory.
Mysteriously I corrected the loading bug but not the saving one :)
-Yosh
1999-04-16 05:49:09 +08:00
|
|
|
#endif
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
static void toggle_update (GtkWidget *widget,
|
|
|
|
gpointer data);
|
|
|
|
|
2005-01-02 08:01:20 +08:00
|
|
|
static void distance_update (GtkAdjustment *adj,
|
|
|
|
gpointer data);
|
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
static gboolean bumpmap_constrain (gint32 image_id,
|
|
|
|
gint32 drawable_id,
|
|
|
|
gpointer data);
|
|
|
|
static gboolean envmap_constrain (gint32 image_id,
|
|
|
|
gint32 drawable_id,
|
|
|
|
gpointer data);
|
|
|
|
static void envmap_combo_callback (GtkWidget *widget,
|
|
|
|
gpointer data);
|
|
|
|
static void save_lighting_preset (GtkWidget *widget,
|
|
|
|
gpointer data);
|
|
|
|
static void file_chooser_response (GtkFileChooser *chooser,
|
|
|
|
gint response_id,
|
|
|
|
gpointer data);
|
|
|
|
static void load_lighting_preset (GtkWidget *widget,
|
|
|
|
gpointer data);
|
2004-07-20 03:49:19 +08:00
|
|
|
static void load_file_chooser_response (GtkFileChooser *chooser,
|
2004-07-21 02:19:47 +08:00
|
|
|
gint response_id,
|
|
|
|
gpointer data);
|
|
|
|
static void lightselect_callback (GimpIntComboBox *combo,
|
|
|
|
gpointer data);
|
|
|
|
static void apply_settings (GtkWidget *widget,
|
|
|
|
gpointer data);
|
|
|
|
static void isolate_selected_light (GtkWidget *widget,
|
|
|
|
gpointer data);
|
2004-04-21 07:01:03 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
|
applied gimp-lecorfec-99041[02]-0, changes follow
* applied gimp-lecorfec-99041[02]-0, changes follow
* plug-ins/FractalExplorer/Dialogs.h (make_color_map):
replaced free with g_free to fix segfault.
* plug-ins/Lighting/lighting_preview.c (compute_preview):
allocate xpostab and ypostab only when needed (it could also be
allocated on stack with a compilation-fixed size like MapObject).
It avoids to lose some Kb on each preview :)
Also reindented (unfortunate C-c C-q) some other lines.
* plug-ins/Lighting/lighting_main.c (run):
release allocated postabs.
* plug-ins/Lighting/lighting_ui.c:
callbacks now have only one argument because gck widget use
gtk_signal_connect_object. Caused segfault for scale widget.
* plug-ins/autocrop/autocrop.c (doit):
return if image has only background (thus fixing a segfault).
* plug-ins/emboss/emboss.c (pluginCore, emboss_do_preview):
replaced malloc/free with g_malloc/g_free (unneeded, but
shouldn't everyone use glib calls ? :)
* plug-ins/flame/flame.c :
replaced a segfaulting free, and several harmless malloc/free pairs.
* plug-ins/flame/megawidget.c (mw_preview_build):
replaced harmless malloc/free pair.
Note : mwp->bits is malloc'ed but seems to be never freed.
* plug-ins/fractaltrace/fractaltrace.c (pixels_free):
replaced a bunch of segfaulting free.
(pixels_get, dialog_show): replaced gtk_signal_connect_object
with gtk_signal_connect to accomodate callbacks (caused STRANGE
dialog behaviour, coz you destroyed buttons one by one).
* plug-ins/illusion/illusion.c (dialog):
same gtk_signal_connect_object replacement for same reasons.
* plug-ins/libgck/gck/gckcolor.c :
changed all gck_rgb_to_color* functions to use a static GdkColor
instead of a malloc'ed area. Provided reentrant functions with
the old behaviour (gck_rgb_to_color*_r). Made some private functions
static, too.
gck_rgb_to_gdkcolor now use the new functions while
gck_rgb_to_gdkcolor_r is the reentrant version.
Also affected by this change: gck_gc_set_foreground and
gck_gc_set_background (no more free(color)).
* plug-ins/libgck/gck/gckcolor.h :
added the gck_rgb_to_gdkcolor_r proto.
* plug-ins/lic/lic.c (ok_button_clicked, cancel_button_clicked) :
segfault on gtk_widget_destroy, now calls gtk_main_quit.
(dialog_destroy) : segfault on window closure when called by
"destroy" event. Now called by "delete_event".
* plug-ins/megawidget/megawidget.c (mw_preview_build):
replaced harmless malloc/free pair.
Note : mwp->bits is malloc'ed but seems to be never freed.
* plug-ins/png/png.c (load_image):
replaced 2 segfaulting free.
* plug-ins/print/print-ps.c (ps_print):
replaced a segfaulting free (called many times :).
* plug-ins/sgi/sgi.c (load_image, save_image):
replaced a bunch of segfaulting free, and did some harmless
inits to avoid a few gcc warnings.
* plug-ins/wind/wind.c (render_wind):
replaced a segfaulting free.
(render_blast): replaced harmless malloc/free pair.
* plug-ins/bmp/bmpread.c (ReadImage):
yet another free()/g_free() problem fixed.
* plug-ins/exchange/exchange.c (real_exchange):
ditto.
* plug-ins/fp/fp.h: added Frames_Check_Button_In_A_Box proto.
* plug-ins/fp/fp_gtk.c: closing subdialogs via window manager
wasn't handled, thus leading to errors and crashes.
Now delete_event signals the dialog control button
to close a dialog with the good way.
* plug-ins/ifscompose/ifscompose.c (value_pair_create):
tried to set events mask on scale widget (a NO_WINDOW widget).
* plug-ins/png/png.c (save_image):
Replaced 2 free() with g_free() for g_malloc'ed memory.
Mysteriously I corrected the loading bug but not the saving one :)
-Yosh
1999-04-16 05:49:09 +08:00
|
|
|
#ifdef _LIGHTNING_UNUSED_CODE
|
1998-06-11 14:04:59 +08:00
|
|
|
/**********************************************************/
|
|
|
|
/* Update entry fields that affect the preview parameters */
|
|
|
|
/**********************************************************/
|
|
|
|
|
2000-12-30 08:23:34 +08:00
|
|
|
static void
|
|
|
|
xyzval_update (GtkEntry *entry)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
|
|
|
gdouble *valueptr;
|
2000-12-30 08:23:34 +08:00
|
|
|
gdouble value;
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2001-12-29 21:26:29 +08:00
|
|
|
valueptr = (gdouble *) g_object_get_data (G_OBJECT (entry), "ValuePtr");
|
2000-12-30 08:23:34 +08:00
|
|
|
value = atof (gtk_entry_get_text (entry));
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-12-30 08:23:34 +08:00
|
|
|
*valueptr = value;
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
applied gimp-lecorfec-99041[02]-0, changes follow
* applied gimp-lecorfec-99041[02]-0, changes follow
* plug-ins/FractalExplorer/Dialogs.h (make_color_map):
replaced free with g_free to fix segfault.
* plug-ins/Lighting/lighting_preview.c (compute_preview):
allocate xpostab and ypostab only when needed (it could also be
allocated on stack with a compilation-fixed size like MapObject).
It avoids to lose some Kb on each preview :)
Also reindented (unfortunate C-c C-q) some other lines.
* plug-ins/Lighting/lighting_main.c (run):
release allocated postabs.
* plug-ins/Lighting/lighting_ui.c:
callbacks now have only one argument because gck widget use
gtk_signal_connect_object. Caused segfault for scale widget.
* plug-ins/autocrop/autocrop.c (doit):
return if image has only background (thus fixing a segfault).
* plug-ins/emboss/emboss.c (pluginCore, emboss_do_preview):
replaced malloc/free with g_malloc/g_free (unneeded, but
shouldn't everyone use glib calls ? :)
* plug-ins/flame/flame.c :
replaced a segfaulting free, and several harmless malloc/free pairs.
* plug-ins/flame/megawidget.c (mw_preview_build):
replaced harmless malloc/free pair.
Note : mwp->bits is malloc'ed but seems to be never freed.
* plug-ins/fractaltrace/fractaltrace.c (pixels_free):
replaced a bunch of segfaulting free.
(pixels_get, dialog_show): replaced gtk_signal_connect_object
with gtk_signal_connect to accomodate callbacks (caused STRANGE
dialog behaviour, coz you destroyed buttons one by one).
* plug-ins/illusion/illusion.c (dialog):
same gtk_signal_connect_object replacement for same reasons.
* plug-ins/libgck/gck/gckcolor.c :
changed all gck_rgb_to_color* functions to use a static GdkColor
instead of a malloc'ed area. Provided reentrant functions with
the old behaviour (gck_rgb_to_color*_r). Made some private functions
static, too.
gck_rgb_to_gdkcolor now use the new functions while
gck_rgb_to_gdkcolor_r is the reentrant version.
Also affected by this change: gck_gc_set_foreground and
gck_gc_set_background (no more free(color)).
* plug-ins/libgck/gck/gckcolor.h :
added the gck_rgb_to_gdkcolor_r proto.
* plug-ins/lic/lic.c (ok_button_clicked, cancel_button_clicked) :
segfault on gtk_widget_destroy, now calls gtk_main_quit.
(dialog_destroy) : segfault on window closure when called by
"destroy" event. Now called by "delete_event".
* plug-ins/megawidget/megawidget.c (mw_preview_build):
replaced harmless malloc/free pair.
Note : mwp->bits is malloc'ed but seems to be never freed.
* plug-ins/png/png.c (load_image):
replaced 2 segfaulting free.
* plug-ins/print/print-ps.c (ps_print):
replaced a segfaulting free (called many times :).
* plug-ins/sgi/sgi.c (load_image, save_image):
replaced a bunch of segfaulting free, and did some harmless
inits to avoid a few gcc warnings.
* plug-ins/wind/wind.c (render_wind):
replaced a segfaulting free.
(render_blast): replaced harmless malloc/free pair.
* plug-ins/bmp/bmpread.c (ReadImage):
yet another free()/g_free() problem fixed.
* plug-ins/exchange/exchange.c (real_exchange):
ditto.
* plug-ins/fp/fp.h: added Frames_Check_Button_In_A_Box proto.
* plug-ins/fp/fp_gtk.c: closing subdialogs via window manager
wasn't handled, thus leading to errors and crashes.
Now delete_event signals the dialog control button
to close a dialog with the good way.
* plug-ins/ifscompose/ifscompose.c (value_pair_create):
tried to set events mask on scale widget (a NO_WINDOW widget).
* plug-ins/png/png.c (save_image):
Replaced 2 free() with g_free() for g_malloc'ed memory.
Mysteriously I corrected the loading bug but not the saving one :)
-Yosh
1999-04-16 05:49:09 +08:00
|
|
|
#endif
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2004-07-17 03:41:21 +08:00
|
|
|
|
1998-06-11 14:04:59 +08:00
|
|
|
/**********************/
|
|
|
|
/* Std. toggle update */
|
|
|
|
/**********************/
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static void
|
|
|
|
toggle_update (GtkWidget *widget,
|
2004-07-17 03:41:21 +08:00
|
|
|
gpointer data)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2000-02-18 07:48:13 +08:00
|
|
|
gimp_toggle_button_update (widget, data);
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
draw_preview_image (TRUE);
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
|
|
|
|
2002-10-17 05:18:11 +08:00
|
|
|
|
2005-01-02 08:01:20 +08:00
|
|
|
static void
|
|
|
|
distance_update (GtkAdjustment *adj,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
mapvals.viewpoint.z = gtk_adjustment_get_value (adj);
|
|
|
|
|
|
|
|
draw_preview_image (TRUE);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
1998-06-11 14:04:59 +08:00
|
|
|
/*****************************************/
|
|
|
|
/* Main window light type menu callback. */
|
|
|
|
/*****************************************/
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static void
|
2004-07-21 02:19:47 +08:00
|
|
|
apply_settings (GtkWidget *widget,
|
|
|
|
gpointer data)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2004-07-21 02:19:47 +08:00
|
|
|
gint valid;
|
|
|
|
gint type;
|
|
|
|
gint k = mapvals.light_selected;
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
if (mapvals.update_enabled)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2004-07-21 02:19:47 +08:00
|
|
|
valid = gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (light_type_combo),
|
|
|
|
&type);
|
|
|
|
if (valid)
|
|
|
|
mapvals.lightsource[k].type = type;
|
|
|
|
|
|
|
|
gimp_color_button_get_color (GIMP_COLOR_BUTTON (colorbutton),
|
|
|
|
&mapvals.lightsource[k].color);
|
|
|
|
|
|
|
|
mapvals.lightsource[k].position.x
|
|
|
|
= gtk_spin_button_get_value (GTK_SPIN_BUTTON(spin_pos_x));
|
|
|
|
mapvals.lightsource[k].position.y
|
|
|
|
= gtk_spin_button_get_value (GTK_SPIN_BUTTON(spin_pos_y));
|
|
|
|
mapvals.lightsource[k].position.z
|
|
|
|
= gtk_spin_button_get_value (GTK_SPIN_BUTTON(spin_pos_z));
|
|
|
|
|
|
|
|
mapvals.lightsource[k].direction.x
|
|
|
|
= gtk_spin_button_get_value (GTK_SPIN_BUTTON(spin_dir_x));
|
|
|
|
mapvals.lightsource[k].direction.y
|
|
|
|
= gtk_spin_button_get_value (GTK_SPIN_BUTTON(spin_dir_y));
|
|
|
|
mapvals.lightsource[k].direction.z
|
|
|
|
= gtk_spin_button_get_value (GTK_SPIN_BUTTON(spin_dir_z));
|
|
|
|
|
|
|
|
mapvals.lightsource[k].intensity
|
|
|
|
= gtk_spin_button_get_value (GTK_SPIN_BUTTON(spin_intensity));
|
|
|
|
|
|
|
|
interactive_preview_callback(NULL);
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static void
|
|
|
|
mapmenu2_callback (GtkWidget *widget,
|
2004-07-17 03:41:21 +08:00
|
|
|
gpointer data)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2004-04-20 16:35:36 +08:00
|
|
|
gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget), (gint *) data);
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
draw_preview_image (TRUE);
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/******************************************/
|
|
|
|
/* Main window "Preview!" button callback */
|
|
|
|
/******************************************/
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static void
|
|
|
|
preview_callback (GtkWidget *widget)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2000-02-18 07:48:13 +08:00
|
|
|
draw_preview_image (TRUE);
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
|
|
|
|
2002-10-17 05:18:11 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
1998-06-11 14:04:59 +08:00
|
|
|
/*********************************************/
|
|
|
|
/* Main window "-" (zoom in) button callback */
|
|
|
|
/*********************************************/
|
2000-08-29 02:47:33 +08:00
|
|
|
/*
|
2000-02-18 07:48:13 +08:00
|
|
|
static void
|
|
|
|
zoomout_callback (GtkWidget *widget)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2000-02-18 07:48:13 +08:00
|
|
|
mapvals.preview_zoom_factor *= 0.5;
|
|
|
|
draw_preview_image (TRUE);
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
2000-08-29 02:47:33 +08:00
|
|
|
*/
|
1998-06-11 14:04:59 +08:00
|
|
|
/*********************************************/
|
|
|
|
/* Main window "+" (zoom out) button callback */
|
|
|
|
/*********************************************/
|
2000-08-29 02:47:33 +08:00
|
|
|
/*
|
2000-02-18 07:48:13 +08:00
|
|
|
static void
|
|
|
|
zoomin_callback (GtkWidget *widget)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2000-02-18 07:48:13 +08:00
|
|
|
mapvals.preview_zoom_factor *= 2.0;
|
|
|
|
draw_preview_image (TRUE);
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
2000-08-29 02:47:33 +08:00
|
|
|
*/
|
1998-06-11 14:04:59 +08:00
|
|
|
/**********************************************/
|
2003-10-30 04:57:21 +08:00
|
|
|
/* Main window "Apply" button callback. */
|
1998-06-11 14:04:59 +08:00
|
|
|
/* Render to GIMP image, close down and exit. */
|
|
|
|
/**********************************************/
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static gint
|
|
|
|
bumpmap_constrain (gint32 image_id,
|
2004-04-21 07:01:03 +08:00
|
|
|
gint32 drawable_id,
|
2004-07-17 03:41:21 +08:00
|
|
|
gpointer data)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2002-10-17 05:18:11 +08:00
|
|
|
return ((gimp_drawable_width (drawable_id) ==
|
2004-07-17 03:41:21 +08:00
|
|
|
gimp_drawable_width (mapvals.drawable_id)) &&
|
|
|
|
(gimp_drawable_height (drawable_id) ==
|
|
|
|
gimp_drawable_height (mapvals.drawable_id)));
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static gint
|
|
|
|
envmap_constrain (gint32 image_id,
|
2004-04-21 07:01:03 +08:00
|
|
|
gint32 drawable_id,
|
2004-07-17 03:41:21 +08:00
|
|
|
gpointer data)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2000-02-18 07:48:13 +08:00
|
|
|
return (!gimp_drawable_is_gray (drawable_id) &&
|
2004-07-17 03:41:21 +08:00
|
|
|
!gimp_drawable_has_alpha (drawable_id));
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static void
|
2004-04-21 07:01:03 +08:00
|
|
|
envmap_combo_callback (GtkWidget *widget,
|
|
|
|
gpointer data)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2004-04-21 07:01:03 +08:00
|
|
|
gimp_int_combo_box_get_active (GIMP_INT_COMBO_BOX (widget),
|
|
|
|
&mapvals.envmap_id);
|
|
|
|
|
|
|
|
env_width = gimp_drawable_width (mapvals.envmap_id);
|
2000-02-18 07:48:13 +08:00
|
|
|
env_height = gimp_drawable_height (mapvals.envmap_id);
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/***********************/
|
|
|
|
/* Dialog constructors */
|
|
|
|
/***********************/
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static GtkWidget *
|
|
|
|
create_options_page (void)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2000-02-18 07:48:13 +08:00
|
|
|
GtkWidget *page;
|
|
|
|
GtkWidget *frame;
|
|
|
|
GtkWidget *vbox;
|
|
|
|
GtkWidget *toggle;
|
2005-01-02 08:01:20 +08:00
|
|
|
GtkWidget *table;
|
|
|
|
GtkObject *adj;
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2004-05-20 23:05:48 +08:00
|
|
|
page = gtk_vbox_new (FALSE, 12);
|
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (page), 12);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
|
|
|
/* General options */
|
|
|
|
|
2004-05-20 23:05:48 +08:00
|
|
|
frame = gimp_frame_new (_("General Options"));
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
|
|
|
|
gtk_widget_show (frame);
|
|
|
|
|
2004-05-20 23:05:48 +08:00
|
|
|
vbox = gtk_vbox_new (FALSE, 6);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_container_add (GTK_CONTAINER (frame), vbox);
|
|
|
|
gtk_widget_show (vbox);
|
2004-04-20 16:35:36 +08:00
|
|
|
|
2004-06-21 06:47:33 +08:00
|
|
|
toggle = gtk_check_button_new_with_mnemonic (_("T_ransparent background"));
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
|
2004-07-17 03:41:21 +08:00
|
|
|
mapvals.transparent_background);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (toggle, "toggled",
|
2001-12-29 21:26:29 +08:00
|
|
|
G_CALLBACK (toggle_update),
|
|
|
|
&mapvals.transparent_background);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (toggle);
|
|
|
|
|
|
|
|
gimp_help_set_help_data (toggle,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Make destination image transparent where bump "
|
|
|
|
"height is zero"),NULL);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2004-06-21 06:47:33 +08:00
|
|
|
toggle = gtk_check_button_new_with_mnemonic (_("Cre_ate new image"));
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
|
2004-07-17 03:41:21 +08:00
|
|
|
mapvals.create_new_image);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (toggle, "toggled",
|
2001-12-29 21:26:29 +08:00
|
|
|
G_CALLBACK (gimp_toggle_button_update),
|
|
|
|
&mapvals.create_new_image);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (toggle);
|
|
|
|
|
|
|
|
gimp_help_set_help_data (toggle,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Create a new image when applying filter"), NULL);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2004-06-21 06:47:33 +08:00
|
|
|
toggle = gtk_check_button_new_with_mnemonic (_("High _Quality preview"));
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
|
2004-07-17 03:41:21 +08:00
|
|
|
mapvals.previewquality);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (vbox), toggle, FALSE, FALSE, 0);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (toggle, "toggled",
|
2001-12-29 21:26:29 +08:00
|
|
|
G_CALLBACK (toggle_update),
|
|
|
|
&mapvals.previewquality);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (toggle);
|
|
|
|
|
|
|
|
gimp_help_set_help_data (toggle,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Enable/disable high quality preview"), NULL);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2005-01-02 08:01:20 +08:00
|
|
|
table = gtk_table_new (1, 3, FALSE);
|
|
|
|
gtk_box_pack_start (GTK_BOX (vbox), table, FALSE, FALSE, 12);
|
|
|
|
gtk_widget_show (table);
|
|
|
|
|
|
|
|
adj = gimp_scale_entry_new (GTK_TABLE (table), 0, 0,
|
|
|
|
_("Distance"), 100, 6,
|
|
|
|
mapvals.viewpoint.z,
|
|
|
|
0.0, 2.0, 0.01, 0.05,
|
|
|
|
3, TRUE, 0.0, 0.0,
|
|
|
|
"Distance of observer from surface",
|
|
|
|
"plug-in-lighting");
|
|
|
|
g_signal_connect (adj, "value_changed",
|
|
|
|
G_CALLBACK (distance_update),
|
|
|
|
NULL);
|
2004-04-05 08:35:46 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (page);
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
return page;
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/******************************/
|
|
|
|
/* Create light settings page */
|
|
|
|
/******************************/
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static GtkWidget *
|
|
|
|
create_light_page (void)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2000-02-18 07:48:13 +08:00
|
|
|
GtkWidget *page;
|
|
|
|
GtkWidget *frame;
|
|
|
|
GtkWidget *table;
|
2004-05-28 21:43:11 +08:00
|
|
|
GtkWidget *ebox;
|
2004-07-20 03:49:19 +08:00
|
|
|
GtkWidget *button;
|
2000-02-18 07:48:13 +08:00
|
|
|
GtkObject *adj;
|
2004-07-17 03:41:21 +08:00
|
|
|
GtkWidget *label;
|
2004-07-21 02:19:47 +08:00
|
|
|
gint k = mapvals.light_selected;
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2004-05-20 23:05:48 +08:00
|
|
|
page = gtk_vbox_new (FALSE, 12);
|
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (page), 12);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2004-05-20 23:05:48 +08:00
|
|
|
frame = gimp_frame_new (_("Light Settings"));
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
|
|
|
|
gtk_widget_show (frame);
|
|
|
|
|
2004-07-20 03:49:19 +08:00
|
|
|
table = gtk_table_new (8, 8, FALSE);
|
2004-05-20 23:05:48 +08:00
|
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 6);
|
|
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 6);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_container_add (GTK_CONTAINER (frame), table);
|
|
|
|
gtk_widget_show (table);
|
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
gtk_table_set_col_spacing (GTK_TABLE (table), 1, 12);
|
|
|
|
gtk_table_set_col_spacing (GTK_TABLE (table), 3, 12);
|
|
|
|
|
|
|
|
lightselect_combo = gimp_int_combo_box_new (_("Light 1"), 0,
|
|
|
|
_("Light 2"), 1,
|
|
|
|
_("Light 3"), 2,
|
|
|
|
_("Light 4"), 3,
|
|
|
|
_("Light 5"), 4,
|
|
|
|
_("Light 6"), 5,
|
|
|
|
NULL);
|
|
|
|
gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (lightselect_combo), k);
|
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table), lightselect_combo, 0, 2, 0, 1);
|
|
|
|
g_signal_connect (lightselect_combo, "changed",
|
|
|
|
G_CALLBACK (lightselect_callback), NULL);
|
|
|
|
gtk_widget_show (lightselect_combo);
|
|
|
|
|
2004-07-17 03:41:21 +08:00
|
|
|
/* row labels */
|
2004-07-20 06:06:09 +08:00
|
|
|
label = gtk_label_new (_("Type:"));
|
|
|
|
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
|
2004-07-17 03:41:21 +08:00
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 1, 2);
|
|
|
|
gtk_widget_show (label);
|
2003-11-15 02:05:39 +08:00
|
|
|
|
2004-07-20 06:06:09 +08:00
|
|
|
label = gtk_label_new (_("Color:"));
|
|
|
|
gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5);
|
2004-07-17 03:41:21 +08:00
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 1, 2, 3);
|
|
|
|
gtk_widget_show (label);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
light_type_combo =
|
|
|
|
gimp_int_combo_box_new (_("None"), NO_LIGHT,
|
|
|
|
_("Directional"), DIRECTIONAL_LIGHT,
|
|
|
|
_("Point"), POINT_LIGHT,
|
|
|
|
/* _("Spot"), SPOT_LIGHT, */
|
|
|
|
NULL);
|
|
|
|
gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (light_type_combo),
|
|
|
|
mapvals.lightsource[k].type);
|
|
|
|
g_signal_connect (light_type_combo, "changed",
|
|
|
|
G_CALLBACK (apply_settings),
|
|
|
|
NULL);
|
2002-10-17 05:18:11 +08:00
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
ebox = gtk_event_box_new ();
|
|
|
|
gtk_container_add (GTK_CONTAINER (ebox), light_type_combo);
|
|
|
|
gtk_widget_show (ebox);
|
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table),
|
|
|
|
ebox, 1, 2, 1, 2);
|
|
|
|
gtk_widget_show (light_type_combo);
|
|
|
|
gimp_help_set_help_data (ebox, _("Type of light source to apply"), NULL);
|
|
|
|
|
|
|
|
colorbutton = gimp_color_button_new (_("Select lightsource color"),
|
|
|
|
64, 16,
|
|
|
|
&mapvals.lightsource[k].color,
|
|
|
|
GIMP_COLOR_AREA_FLAT);
|
|
|
|
gimp_color_button_set_update (GIMP_COLOR_BUTTON (colorbutton), TRUE);
|
|
|
|
g_signal_connect (colorbutton, "color_changed",
|
|
|
|
G_CALLBACK (apply_settings),
|
|
|
|
NULL);
|
|
|
|
gtk_widget_show (colorbutton);
|
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table),
|
|
|
|
colorbutton, 1, 2, 2, 3);
|
|
|
|
gimp_help_set_help_data (colorbutton,
|
|
|
|
_("Set light source color"), NULL);
|
|
|
|
|
|
|
|
|
|
|
|
spin_intensity = gimp_spin_button_new (&adj,
|
|
|
|
mapvals.lightsource[k].intensity,
|
|
|
|
0.0, 100.0,
|
|
|
|
0.01, 0.1, 1.0, 0.0, 2);
|
|
|
|
gimp_table_attach_aligned (GTK_TABLE (table), 0, 3,
|
|
|
|
_("_Intensity:"), 0.0, 0.5,
|
|
|
|
spin_intensity, 1, TRUE);
|
|
|
|
g_signal_connect (adj, "value_changed",
|
|
|
|
G_CALLBACK (apply_settings),
|
|
|
|
NULL);
|
|
|
|
gimp_help_set_help_data (spin_intensity,
|
|
|
|
_("Light intensity"), NULL);
|
|
|
|
|
|
|
|
|
|
|
|
label = gtk_label_new (_("Position"));
|
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 3, 4, 0, 1);
|
|
|
|
gtk_widget_show (label);
|
|
|
|
|
|
|
|
spin_pos_x = gimp_spin_button_new (&adj,
|
|
|
|
mapvals.lightsource[k].position.x,
|
|
|
|
-100.0, 100.0,
|
|
|
|
0.1, 1.0, 1.0, 0.0, 2);
|
|
|
|
gimp_table_attach_aligned (GTK_TABLE (table), 2, 1,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("_X:"), 0.0, 0.5,
|
2004-07-21 02:19:47 +08:00
|
|
|
spin_pos_x, 1, TRUE);
|
|
|
|
g_signal_connect (adj, "value_changed",
|
|
|
|
G_CALLBACK (apply_settings),
|
|
|
|
NULL);
|
|
|
|
gimp_help_set_help_data (spin_pos_x,
|
|
|
|
_("Light source X position in XYZ space"), NULL);
|
|
|
|
|
|
|
|
spin_pos_y = gimp_spin_button_new (&adj,
|
|
|
|
mapvals.lightsource[k].position.y,
|
|
|
|
-100.0, 100.0,
|
|
|
|
0.1, 1.0, 1.0, 0.0, 2);
|
|
|
|
gimp_table_attach_aligned (GTK_TABLE (table), 2, 2,
|
|
|
|
_("_Y:"), 0.0, 0.5,
|
|
|
|
spin_pos_y, 1, TRUE);
|
|
|
|
g_signal_connect (adj, "value_changed",
|
|
|
|
G_CALLBACK (apply_settings),
|
|
|
|
NULL);
|
|
|
|
gimp_help_set_help_data (spin_pos_y,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Light source Y position in XYZ space"), NULL);
|
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
spin_pos_z = gimp_spin_button_new (&adj,
|
|
|
|
mapvals.lightsource[k].position.z,
|
|
|
|
-100.0, 100.0,
|
|
|
|
0.1, 1.0, 1.0, 0.0, 2);
|
|
|
|
gimp_table_attach_aligned (GTK_TABLE (table), 2, 3,
|
|
|
|
_("_Z:"), 0.0, 0.5,
|
|
|
|
spin_pos_z, 1, TRUE);
|
|
|
|
g_signal_connect (adj, "value_changed",
|
|
|
|
G_CALLBACK (apply_settings),
|
|
|
|
NULL);
|
|
|
|
gimp_help_set_help_data (spin_pos_z,
|
|
|
|
_("Light source Z position in XYZ space"), NULL);
|
2004-07-20 03:49:19 +08:00
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
|
|
|
|
label = gtk_label_new (_("Direction"));
|
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 5, 6, 0, 1);
|
|
|
|
gtk_widget_show (label);
|
|
|
|
|
|
|
|
spin_dir_x = gimp_spin_button_new (&adj,
|
|
|
|
mapvals.lightsource[k].direction.x,
|
|
|
|
-100.0, 100.0, 0.1, 1.0, 1.0, 0.0, 2);
|
|
|
|
gimp_table_attach_aligned (GTK_TABLE (table), 4, 1,
|
|
|
|
_("X:"), 0.0, 0.5,
|
|
|
|
spin_dir_x, 1, TRUE);
|
|
|
|
g_signal_connect (adj, "value_changed",
|
|
|
|
G_CALLBACK (apply_settings),
|
|
|
|
NULL);
|
|
|
|
gimp_help_set_help_data (spin_dir_x,
|
|
|
|
_("Light source X direction in XYZ space"), NULL);
|
|
|
|
|
|
|
|
spin_dir_y = gimp_spin_button_new (&adj,
|
|
|
|
mapvals.lightsource[k].direction.y,
|
|
|
|
-100.0, 100.0, 0.1, 1.0, 1.0, 0.0, 2);
|
|
|
|
gimp_table_attach_aligned (GTK_TABLE (table), 4, 2,
|
|
|
|
_("Y:"), 0.0, 0.5,
|
|
|
|
spin_dir_y, 1, TRUE);
|
|
|
|
g_signal_connect (adj, "value_changed",
|
|
|
|
G_CALLBACK (apply_settings),
|
|
|
|
NULL);
|
|
|
|
gimp_help_set_help_data (spin_dir_y,
|
|
|
|
_("Light source Y direction in XYZ space"), NULL);
|
|
|
|
|
|
|
|
spin_dir_z = gimp_spin_button_new (&adj,
|
|
|
|
mapvals.lightsource[k].direction.z,
|
|
|
|
-100.0, 100.0, 0.1, 1.0, 1.0, 0.0, 2);
|
|
|
|
gimp_table_attach_aligned (GTK_TABLE (table), 4, 3,
|
|
|
|
_("Z:"), 0.0, 0.5,
|
|
|
|
spin_dir_z, 1, TRUE);
|
|
|
|
g_signal_connect (adj, "value_changed",
|
|
|
|
G_CALLBACK (apply_settings),
|
|
|
|
NULL);
|
|
|
|
gimp_help_set_help_data (spin_dir_z,
|
|
|
|
_("Light source Z direction in XYZ space"),
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
isolate_button = gtk_toggle_button_new_with_mnemonic (_("I_solate"));
|
|
|
|
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (isolate_button), FALSE);
|
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (isolate_button),
|
|
|
|
mapvals.light_isolated);
|
|
|
|
g_signal_connect (isolate_button, "toggled",
|
|
|
|
G_CALLBACK (isolate_selected_light),
|
|
|
|
NULL);
|
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table), isolate_button, 0, 1, 5, 6);
|
|
|
|
gtk_widget_show (isolate_button);
|
|
|
|
|
|
|
|
label = gtk_label_new (_("Lighting preset:"));
|
|
|
|
gtk_misc_set_alignment (GTK_MISC (label), 1.0, 0.5);
|
|
|
|
gtk_table_set_row_spacing (GTK_TABLE (table), 5, 12);
|
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table), label, 0, 2, 6, 7);
|
|
|
|
gtk_widget_show (label);
|
|
|
|
|
|
|
|
button = gtk_button_new_from_stock (GTK_STOCK_SAVE);
|
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table), button, 2, 4, 6, 7);
|
|
|
|
g_signal_connect (button, "clicked",
|
|
|
|
G_CALLBACK (save_lighting_preset),
|
|
|
|
NULL);
|
|
|
|
gtk_widget_show (button);
|
|
|
|
|
|
|
|
button = gtk_button_new_from_stock (GTK_STOCK_OPEN);
|
|
|
|
gtk_table_attach_defaults (GTK_TABLE (table), button, 4, 6, 6, 7);
|
|
|
|
g_signal_connect (button, "clicked",
|
|
|
|
G_CALLBACK (load_lighting_preset),
|
|
|
|
NULL);
|
|
|
|
gtk_widget_show (button);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
|
|
|
gtk_widget_show (page);
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2003-10-30 04:57:21 +08:00
|
|
|
return page;
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
/*********************************/
|
|
|
|
/* Create material settings page */
|
|
|
|
/*********************************/
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static GtkWidget *
|
|
|
|
create_material_page (void)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2004-05-20 23:05:48 +08:00
|
|
|
GtkSizeGroup *group = gtk_size_group_new (GTK_SIZE_GROUP_HORIZONTAL);
|
|
|
|
GtkWidget *page;
|
|
|
|
GtkWidget *frame;
|
|
|
|
GtkWidget *table;
|
|
|
|
GtkWidget *label;
|
|
|
|
GtkWidget *hbox;
|
|
|
|
GtkWidget *spinbutton;
|
2004-07-13 23:59:52 +08:00
|
|
|
GtkWidget *image;
|
2004-07-17 03:41:21 +08:00
|
|
|
GtkWidget *button;
|
2004-05-20 23:05:48 +08:00
|
|
|
GtkObject *adj;
|
|
|
|
|
|
|
|
page = gtk_vbox_new (FALSE, 12);
|
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (page), 12);
|
|
|
|
|
2004-07-17 03:41:21 +08:00
|
|
|
frame = gimp_frame_new (_("Material properties"));
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
|
|
|
|
gtk_widget_show (frame);
|
|
|
|
|
2004-05-20 23:05:48 +08:00
|
|
|
hbox = gtk_hbox_new (FALSE, 6);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_container_add (GTK_CONTAINER (frame), hbox);
|
|
|
|
gtk_widget_show (hbox);
|
|
|
|
|
2004-07-17 03:41:21 +08:00
|
|
|
table = gtk_table_new (5, 4, FALSE);
|
2004-05-20 23:05:48 +08:00
|
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 6);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (hbox), table, FALSE, FALSE, 0);
|
|
|
|
gtk_widget_show (table);
|
|
|
|
|
|
|
|
/* Ambient intensity */
|
|
|
|
|
2004-07-13 23:59:52 +08:00
|
|
|
image = gtk_image_new_from_stock (STOCK_INTENSITY_AMBIENT_LOW,
|
|
|
|
GTK_ICON_SIZE_BUTTON);
|
2002-05-28 01:25:30 +08:00
|
|
|
label = gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("_Glowing:"), 0.0, 0.5,
|
|
|
|
image, 1, FALSE);
|
2004-05-20 23:05:48 +08:00
|
|
|
gtk_size_group_add_widget (group, label);
|
2000-02-18 07:48:13 +08:00
|
|
|
spinbutton = gimp_spin_button_new (&adj, mapvals.material.ambient_int,
|
2004-07-21 02:19:47 +08:00
|
|
|
0, G_MAXFLOAT, 0.01, 0.1, 1.0, 0.0, 2);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_table_attach (GTK_TABLE (table), spinbutton, 2, 3, 0, 1,
|
2004-07-17 03:41:21 +08:00
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (adj, "value_changed",
|
2001-12-29 21:26:29 +08:00
|
|
|
G_CALLBACK (gimp_double_adjustment_update),
|
|
|
|
&mapvals.material.ambient_int);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (adj, "value_changed",
|
2004-07-17 03:41:21 +08:00
|
|
|
G_CALLBACK (interactive_preview_callback),
|
|
|
|
NULL);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (spinbutton);
|
2002-05-28 01:25:30 +08:00
|
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), spinbutton);
|
2000-02-18 07:48:13 +08:00
|
|
|
gimp_help_set_help_data (spinbutton,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Amount of original color to show where no "
|
|
|
|
"direct light falls"), NULL);
|
2004-07-13 23:59:52 +08:00
|
|
|
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,
|
2004-07-17 03:41:21 +08:00
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
2004-07-13 23:59:52 +08:00
|
|
|
gtk_widget_show (image);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
|
|
|
/* Diffuse intensity */
|
|
|
|
|
2004-07-13 23:59:52 +08:00
|
|
|
image = gtk_image_new_from_stock (STOCK_INTENSITY_DIFFUSE_LOW,
|
|
|
|
GTK_ICON_SIZE_BUTTON);
|
2002-05-28 01:25:30 +08:00
|
|
|
label = gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("_Bright:"), 0.0, 0.5,
|
|
|
|
image, 1, FALSE);
|
2004-05-20 23:05:48 +08:00
|
|
|
gtk_size_group_add_widget (group, label);
|
2000-02-18 07:48:13 +08:00
|
|
|
spinbutton = gimp_spin_button_new (&adj, mapvals.material.diffuse_int,
|
2004-07-21 02:19:47 +08:00
|
|
|
0, G_MAXFLOAT, 0.01, 0.1, 1.0, 0.0, 2);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_table_attach (GTK_TABLE (table), spinbutton, 2, 3, 1, 2,
|
2004-07-17 03:41:21 +08:00
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (adj, "value_changed",
|
2001-12-29 21:26:29 +08:00
|
|
|
G_CALLBACK (gimp_double_adjustment_update),
|
|
|
|
&mapvals.material.diffuse_int);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (adj, "value_changed",
|
2004-07-17 03:41:21 +08:00
|
|
|
G_CALLBACK (interactive_preview_callback),
|
|
|
|
NULL);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (spinbutton);
|
2002-05-28 01:25:30 +08:00
|
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), spinbutton);
|
2000-02-18 07:48:13 +08:00
|
|
|
gimp_help_set_help_data (spinbutton,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Intensity of original color when lit by a light "
|
|
|
|
"source"), NULL);
|
2004-07-13 23:59:52 +08:00
|
|
|
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,
|
2004-07-17 03:41:21 +08:00
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
2004-07-13 23:59:52 +08:00
|
|
|
gtk_widget_show (image);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
|
|
|
/* Specular reflection */
|
|
|
|
|
2004-07-13 23:59:52 +08:00
|
|
|
image = gtk_image_new_from_stock (STOCK_REFLECTIVITY_SPECULAR_LOW,
|
|
|
|
GTK_ICON_SIZE_BUTTON);
|
2004-07-17 03:41:21 +08:00
|
|
|
label = gimp_table_attach_aligned (GTK_TABLE (table), 0, 2,
|
|
|
|
_("_Shiny:"), 0.0, 0.5,
|
|
|
|
image, 1, FALSE);
|
2004-05-20 23:05:48 +08:00
|
|
|
gtk_size_group_add_widget (group, label);
|
2000-02-18 07:48:13 +08:00
|
|
|
spinbutton = gimp_spin_button_new (&adj, mapvals.material.specular_ref,
|
2004-07-21 02:19:47 +08:00
|
|
|
0, G_MAXFLOAT, 0.01, 0.1, 1.0, 0.0, 2);
|
2004-07-17 03:41:21 +08:00
|
|
|
gtk_table_attach (GTK_TABLE (table), spinbutton, 2, 3, 2, 3,
|
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (adj, "value_changed",
|
2001-12-29 21:26:29 +08:00
|
|
|
G_CALLBACK (gimp_double_adjustment_update),
|
|
|
|
&mapvals.material.specular_ref);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (adj, "value_changed",
|
2004-07-17 03:41:21 +08:00
|
|
|
G_CALLBACK (interactive_preview_callback),
|
|
|
|
NULL);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (spinbutton);
|
2002-05-28 01:25:30 +08:00
|
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), spinbutton);
|
2000-02-18 07:48:13 +08:00
|
|
|
gimp_help_set_help_data (spinbutton,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Controls how intense the highlights will be"),
|
|
|
|
NULL);
|
2004-07-13 23:59:52 +08:00
|
|
|
image = gtk_image_new_from_stock (STOCK_REFLECTIVITY_SPECULAR_HIGH,
|
|
|
|
GTK_ICON_SIZE_BUTTON);
|
2004-07-17 03:41:21 +08:00
|
|
|
gtk_table_attach (GTK_TABLE (table), image, 3, 4, 2, 3,
|
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
2004-07-13 23:59:52 +08:00
|
|
|
gtk_widget_show (image);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
|
|
|
/* Highlight */
|
2004-07-13 23:59:52 +08:00
|
|
|
image = gtk_image_new_from_stock (STOCK_REFLECTIVITY_HIGHLIGHT_LOW,
|
|
|
|
GTK_ICON_SIZE_BUTTON);
|
2004-07-17 03:41:21 +08:00
|
|
|
label = gimp_table_attach_aligned (GTK_TABLE (table), 0, 3,
|
|
|
|
_("_Polished:"), 0.0, 0.5,
|
|
|
|
image, 1, FALSE);
|
2004-05-20 23:05:48 +08:00
|
|
|
gtk_size_group_add_widget (group, label);
|
2000-02-18 07:48:13 +08:00
|
|
|
spinbutton = gimp_spin_button_new (&adj, mapvals.material.highlight,
|
2004-07-21 02:19:47 +08:00
|
|
|
0, G_MAXFLOAT, 0.01, 0.1, 1.0, 0.0, 2);
|
2004-07-17 03:41:21 +08:00
|
|
|
gtk_table_attach (GTK_TABLE (table), spinbutton, 2, 3, 3, 4,
|
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (adj, "value_changed",
|
2001-12-29 21:26:29 +08:00
|
|
|
G_CALLBACK (gimp_double_adjustment_update),
|
|
|
|
&mapvals.material.highlight);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (adj, "value_changed",
|
2004-07-17 03:41:21 +08:00
|
|
|
G_CALLBACK (interactive_preview_callback),
|
|
|
|
NULL);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (spinbutton);
|
2002-05-28 01:25:30 +08:00
|
|
|
gtk_label_set_mnemonic_widget (GTK_LABEL (label), spinbutton);
|
2000-02-18 07:48:13 +08:00
|
|
|
gimp_help_set_help_data (spinbutton,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Higher values makes the highlights more focused"),
|
|
|
|
NULL);
|
2004-07-13 23:59:52 +08:00
|
|
|
image = gtk_image_new_from_stock (STOCK_REFLECTIVITY_HIGHLIGHT_HIGH,
|
|
|
|
GTK_ICON_SIZE_BUTTON);
|
2004-07-17 03:41:21 +08:00
|
|
|
gtk_table_attach (GTK_TABLE (table), image, 3, 4, 3, 4,
|
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
2004-07-13 23:59:52 +08:00
|
|
|
gtk_widget_show (image);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2004-07-17 03:41:21 +08:00
|
|
|
/* Metallic */
|
|
|
|
button = gtk_check_button_new_with_mnemonic (_("_Metallic"));
|
|
|
|
gtk_table_attach (GTK_TABLE (table), button, 0, 3, 4, 5,
|
|
|
|
GTK_SHRINK | GTK_FILL, GTK_SHRINK | GTK_FILL, 0, 0);
|
|
|
|
g_signal_connect (button, "toggled",
|
|
|
|
G_CALLBACK (gimp_toggle_button_update),
|
|
|
|
&mapvals.material.metallic);
|
|
|
|
g_signal_connect (button, "toggled",
|
|
|
|
G_CALLBACK (interactive_preview_callback),
|
|
|
|
NULL);
|
|
|
|
gtk_widget_show (button);
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (page);
|
2003-10-30 04:57:21 +08:00
|
|
|
|
1998-06-11 14:04:59 +08:00
|
|
|
return page;
|
|
|
|
}
|
|
|
|
|
2000-08-29 22:27:40 +08:00
|
|
|
/* Create Bump mapping page */
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static GtkWidget *
|
|
|
|
create_bump_page (void)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2000-02-18 07:48:13 +08:00
|
|
|
GtkWidget *page;
|
|
|
|
GtkWidget *toggle;
|
|
|
|
GtkWidget *frame;
|
|
|
|
GtkWidget *table;
|
2004-04-20 16:35:36 +08:00
|
|
|
GtkWidget *combo;
|
2000-02-18 07:48:13 +08:00
|
|
|
GtkWidget *spinbutton;
|
|
|
|
GtkObject *adj;
|
|
|
|
|
2004-05-20 23:05:48 +08:00
|
|
|
page = gtk_vbox_new (FALSE, 12);
|
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (page), 12);
|
2002-09-07 04:44:47 +08:00
|
|
|
|
2004-05-20 23:05:48 +08:00
|
|
|
frame = gimp_frame_new (NULL);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
|
|
|
|
gtk_widget_show (frame);
|
|
|
|
|
2004-06-21 06:47:33 +08:00
|
|
|
toggle = gtk_check_button_new_with_mnemonic (_("E_nable bump mapping"));
|
2000-08-29 22:27:40 +08:00
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
|
2004-07-17 03:41:21 +08:00
|
|
|
mapvals.bump_mapped);
|
2002-09-07 04:44:47 +08:00
|
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), toggle);
|
|
|
|
gtk_widget_show (toggle);
|
|
|
|
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (toggle, "toggled",
|
2001-12-29 21:26:29 +08:00
|
|
|
G_CALLBACK (gimp_toggle_button_update),
|
|
|
|
&mapvals.bump_mapped);
|
2004-04-05 08:35:46 +08:00
|
|
|
g_signal_connect (toggle, "toggled",
|
2004-07-17 03:41:21 +08:00
|
|
|
G_CALLBACK (interactive_preview_callback),
|
|
|
|
NULL);
|
2000-08-29 22:27:40 +08:00
|
|
|
|
|
|
|
gimp_help_set_help_data (toggle,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Enable/disable bump-mapping (image depth)"),
|
|
|
|
NULL);
|
2000-08-29 22:27:40 +08:00
|
|
|
|
2000-08-29 02:47:33 +08:00
|
|
|
table = gtk_table_new (6, 2, FALSE);
|
2004-05-20 23:05:48 +08:00
|
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 6);
|
|
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 6);
|
2002-09-07 04:44:47 +08:00
|
|
|
gtk_container_add (GTK_CONTAINER (frame), table);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (table);
|
|
|
|
|
2000-08-29 22:27:40 +08:00
|
|
|
gtk_widget_set_sensitive (table, mapvals.bump_mapped);
|
2001-12-29 21:26:29 +08:00
|
|
|
g_object_set_data (G_OBJECT (toggle), "set_sensitive", table);
|
2000-08-29 22:27:40 +08:00
|
|
|
|
2004-04-21 07:01:03 +08:00
|
|
|
combo = gimp_drawable_combo_box_new (bumpmap_constrain, NULL);
|
2004-04-22 00:50:13 +08:00
|
|
|
gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo), mapvals.bumpmap_id,
|
|
|
|
G_CALLBACK (gimp_int_combo_box_get_active),
|
|
|
|
&mapvals.bumpmap_id);
|
2004-04-21 07:01:03 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Bumpm_ap image:"), 0.0, 0.5,
|
|
|
|
combo, 1, FALSE);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2004-04-20 16:35:36 +08:00
|
|
|
combo = gimp_int_combo_box_new (_("Linear"), LINEAR_MAP,
|
|
|
|
_("Logarithmic"), LOGARITHMIC_MAP,
|
|
|
|
_("Sinusoidal"), SINUSOIDAL_MAP,
|
|
|
|
_("Spherical"), SPHERICAL_MAP,
|
|
|
|
NULL);
|
|
|
|
gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (combo),
|
|
|
|
mapvals.bumpmaptype);
|
|
|
|
|
|
|
|
g_signal_connect (combo, "changed",
|
|
|
|
G_CALLBACK (mapmenu2_callback),
|
|
|
|
&mapvals.bumpmaptype);
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
gimp_table_attach_aligned (GTK_TABLE (table), 0, 1,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Cu_rve:"), 0.0, 0.5, combo, 1, FALSE);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2000-08-29 22:27:40 +08:00
|
|
|
spinbutton = gimp_spin_button_new (&adj, mapvals.bumpmax,
|
2004-07-17 03:41:21 +08:00
|
|
|
0, G_MAXFLOAT, 0.01, 0.1, 1.0, 0.0, 2);
|
2000-02-18 07:48:13 +08:00
|
|
|
gimp_table_attach_aligned (GTK_TABLE (table), 0, 2,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Ma_ximum height:"), 0.0, 0.5,
|
|
|
|
spinbutton, 1, TRUE);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (adj, "value_changed",
|
2001-12-29 21:26:29 +08:00
|
|
|
G_CALLBACK (gimp_double_adjustment_update),
|
|
|
|
&mapvals.bumpmax);
|
2004-04-05 08:35:46 +08:00
|
|
|
g_signal_connect (adj, "value_changed",
|
2004-07-17 03:41:21 +08:00
|
|
|
G_CALLBACK (interactive_preview_callback),
|
|
|
|
NULL);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2000-08-29 22:27:40 +08:00
|
|
|
gimp_help_set_help_data (spinbutton,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Maximum height for bumps"),
|
|
|
|
NULL);
|
2000-08-29 22:27:40 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (page);
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
return page;
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static GtkWidget *
|
|
|
|
create_environment_page (void)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2000-02-18 07:48:13 +08:00
|
|
|
GtkWidget *page;
|
2000-08-29 22:27:40 +08:00
|
|
|
GtkWidget *toggle;
|
|
|
|
GtkWidget *table;
|
2000-02-18 07:48:13 +08:00
|
|
|
GtkWidget *frame;
|
2004-04-21 07:01:03 +08:00
|
|
|
GtkWidget *combo;
|
2004-05-28 21:43:11 +08:00
|
|
|
GtkWidget *ebox;
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2004-05-20 23:05:48 +08:00
|
|
|
page = gtk_vbox_new (FALSE, 12);
|
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (page), 12);
|
2002-09-07 04:44:47 +08:00
|
|
|
|
2004-05-20 23:05:48 +08:00
|
|
|
frame = gimp_frame_new (NULL);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (page), frame, FALSE, FALSE, 0);
|
|
|
|
gtk_widget_show (frame);
|
|
|
|
|
2004-06-21 06:47:33 +08:00
|
|
|
toggle = gtk_check_button_new_with_mnemonic (_("E_nable environment mapping"));
|
2000-08-29 22:27:40 +08:00
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
|
2004-07-17 03:41:21 +08:00
|
|
|
mapvals.env_mapped);
|
2002-09-07 04:44:47 +08:00
|
|
|
gtk_frame_set_label_widget (GTK_FRAME (frame), toggle);
|
|
|
|
gtk_widget_show (toggle);
|
|
|
|
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (toggle, "toggled",
|
2001-12-29 21:26:29 +08:00
|
|
|
G_CALLBACK (gimp_toggle_button_update),
|
|
|
|
&mapvals.env_mapped);
|
2004-04-05 08:35:46 +08:00
|
|
|
g_signal_connect (toggle, "toggled",
|
2004-07-17 03:41:21 +08:00
|
|
|
G_CALLBACK (interactive_preview_callback),
|
|
|
|
NULL);
|
2000-08-29 22:27:40 +08:00
|
|
|
|
|
|
|
gimp_help_set_help_data (toggle,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Enable/disable environment-mapping (reflection)"),
|
|
|
|
NULL);
|
2000-08-29 22:27:40 +08:00
|
|
|
|
|
|
|
table = gtk_table_new (3, 2, FALSE);
|
2004-05-20 23:05:48 +08:00
|
|
|
gtk_table_set_col_spacings (GTK_TABLE (table), 6);
|
|
|
|
gtk_table_set_row_spacings (GTK_TABLE (table), 6);
|
2002-09-07 04:44:47 +08:00
|
|
|
gtk_container_add (GTK_CONTAINER (frame), table);
|
2000-08-29 22:27:40 +08:00
|
|
|
gtk_widget_show (table);
|
|
|
|
|
|
|
|
gtk_widget_set_sensitive (table, mapvals.env_mapped);
|
2001-12-29 21:26:29 +08:00
|
|
|
g_object_set_data (G_OBJECT (toggle), "set_sensitive", table);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2004-04-21 07:01:03 +08:00
|
|
|
combo = gimp_drawable_combo_box_new (envmap_constrain, NULL);
|
2004-04-22 00:50:13 +08:00
|
|
|
gimp_int_combo_box_connect (GIMP_INT_COMBO_BOX (combo), mapvals.envmap_id,
|
|
|
|
G_CALLBACK (envmap_combo_callback),
|
|
|
|
NULL);
|
2004-04-21 07:01:03 +08:00
|
|
|
|
2004-05-28 21:43:11 +08:00
|
|
|
ebox = gtk_event_box_new ();
|
|
|
|
gtk_container_add (GTK_CONTAINER (ebox), combo);
|
|
|
|
gtk_widget_show (combo);
|
|
|
|
|
2000-08-29 22:27:40 +08:00
|
|
|
gimp_table_attach_aligned (GTK_TABLE (table), 0, 0,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("En_vironment image:"), 0.0, 0.5,
|
|
|
|
ebox, 1, FALSE);
|
2004-05-28 21:43:11 +08:00
|
|
|
gimp_help_set_help_data (ebox, _("Environment image to use"), NULL);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
|
|
|
gtk_widget_show (page);
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
return page;
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
|
|
|
|
2000-08-29 02:47:33 +08:00
|
|
|
/*****************************/
|
|
|
|
/* Create notebook and pages */
|
|
|
|
/*****************************/
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
static void
|
|
|
|
create_main_notebook (GtkWidget *container)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2000-02-18 07:48:13 +08:00
|
|
|
GtkWidget *page;
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
options_note_book = GTK_NOTEBOOK (gtk_notebook_new ());
|
|
|
|
gtk_container_add (GTK_CONTAINER (container),
|
2004-07-17 03:41:21 +08:00
|
|
|
GTK_WIDGET (options_note_book));
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
page = create_options_page ();
|
|
|
|
gtk_notebook_append_page (options_note_book, page,
|
2004-07-17 03:41:21 +08:00
|
|
|
gtk_label_new_with_mnemonic (_("Op_tions")));
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
page = create_light_page ();
|
|
|
|
gtk_notebook_append_page (options_note_book, page,
|
2004-07-17 03:41:21 +08:00
|
|
|
gtk_label_new_with_mnemonic (_("_Light")));
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
page = create_material_page ();
|
|
|
|
gtk_notebook_append_page (options_note_book, page,
|
2004-07-17 03:41:21 +08:00
|
|
|
gtk_label_new_with_mnemonic (_("_Material")));
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-08-29 22:27:40 +08:00
|
|
|
page = create_bump_page ();
|
|
|
|
gtk_notebook_append_page (options_note_book, page,
|
2004-07-17 03:41:21 +08:00
|
|
|
gtk_label_new_with_mnemonic (_("_Bump Map")));
|
2000-08-29 22:27:40 +08:00
|
|
|
|
|
|
|
page = create_environment_page ();
|
|
|
|
gtk_notebook_append_page (options_note_book, page,
|
2004-07-17 03:41:21 +08:00
|
|
|
gtk_label_new_with_mnemonic (_("_Environment Map")));
|
2000-08-29 22:27:40 +08:00
|
|
|
|
|
|
|
/*
|
2000-02-18 07:48:13 +08:00
|
|
|
if (mapvals.bump_mapped == TRUE)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2000-02-18 07:48:13 +08:00
|
|
|
bump_page = create_bump_page ();
|
|
|
|
bump_page_pos = g_list_length (options_note_book->children);
|
|
|
|
gtk_notebook_append_page (options_note_book, bump_page,
|
2004-07-17 03:41:21 +08:00
|
|
|
gtk_label_new (_("Bumpmap")));
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
2003-10-30 04:57:21 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
if (mapvals.env_mapped == TRUE)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2000-02-18 07:48:13 +08:00
|
|
|
env_page = create_environment_page ();
|
|
|
|
env_page_pos = g_list_length (options_note_book->children);
|
|
|
|
gtk_notebook_append_page (options_note_book, env_page,
|
2004-07-17 03:41:21 +08:00
|
|
|
gtk_label_new (_("Environment")));
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
2000-08-29 22:27:40 +08:00
|
|
|
*/
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (GTK_WIDGET (options_note_book));
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
/********************************/
|
|
|
|
/* Create and show main dialog. */
|
|
|
|
/********************************/
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
gboolean
|
2000-08-22 11:27:14 +08:00
|
|
|
main_dialog (GimpDrawable *drawable)
|
1998-06-11 14:04:59 +08:00
|
|
|
{
|
2000-02-18 07:48:13 +08:00
|
|
|
GtkWidget *main_hbox;
|
|
|
|
GtkWidget *vbox;
|
|
|
|
GtkWidget *hbox;
|
|
|
|
GtkWidget *frame;
|
|
|
|
GtkWidget *button;
|
2002-10-17 05:18:11 +08:00
|
|
|
GtkWidget *toggle;
|
2003-11-06 23:27:05 +08:00
|
|
|
gboolean run = FALSE;
|
2002-10-17 05:18:11 +08:00
|
|
|
|
2002-01-03 01:20:50 +08:00
|
|
|
/*
|
|
|
|
GtkWidget *image;
|
|
|
|
*/
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2001-06-22 20:58:57 +08:00
|
|
|
gimp_ui_init ("Lighting", FALSE);
|
2004-07-20 03:49:19 +08:00
|
|
|
lighting_effects_path = gimp_gimprc_query ("lighting-effects-path");
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2004-07-13 23:59:52 +08:00
|
|
|
lighting_stock_init ();
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
appwin = gimp_dialog_new (_("Lighting Effects"), "Lighting",
|
2003-11-06 23:27:05 +08:00
|
|
|
NULL, 0,
|
2004-07-17 03:41:21 +08:00
|
|
|
gimp_standard_help_func, "plug-in-lighting",
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2004-07-17 03:41:21 +08:00
|
|
|
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
|
|
|
GTK_STOCK_OK, GTK_RESPONSE_OK,
|
2002-02-05 21:29:46 +08:00
|
|
|
|
2004-07-17 03:41:21 +08:00
|
|
|
NULL);
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2004-05-20 23:05:48 +08:00
|
|
|
main_hbox = gtk_hbox_new (FALSE, 12);
|
|
|
|
gtk_container_set_border_width (GTK_CONTAINER (main_hbox), 12);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (GTK_DIALOG (appwin)->vbox), main_hbox,
|
2004-07-17 03:41:21 +08:00
|
|
|
FALSE, FALSE, 0);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (main_hbox);
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
/* Create the Preview */
|
|
|
|
/* ================== */
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2004-05-20 23:05:48 +08:00
|
|
|
vbox = gtk_vbox_new (FALSE, 6);
|
|
|
|
gtk_box_pack_start (GTK_BOX (main_hbox), vbox, FALSE, FALSE, 0);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (vbox);
|
1998-06-11 14:04:59 +08:00
|
|
|
|
|
|
|
/* Add preview widget and various buttons to the first part */
|
|
|
|
/* ======================================================== */
|
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
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 ();
|
2001-12-29 21:26:29 +08:00
|
|
|
gtk_widget_set_size_request (previewarea, PREVIEW_WIDTH, PREVIEW_HEIGHT);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_set_events (previewarea, (GDK_EXPOSURE_MASK |
|
2004-07-17 03:41:21 +08:00
|
|
|
GDK_BUTTON1_MOTION_MASK |
|
|
|
|
GDK_BUTTON_PRESS_MASK |
|
|
|
|
GDK_BUTTON_RELEASE_MASK));
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (previewarea, "event",
|
2001-12-29 21:26:29 +08:00
|
|
|
G_CALLBACK (preview_events),
|
|
|
|
previewarea);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_container_add (GTK_CONTAINER (frame), previewarea);
|
|
|
|
gtk_widget_show (previewarea);
|
|
|
|
|
2002-10-17 05:18:11 +08:00
|
|
|
/* create preview options, frame and vbox */
|
2004-05-20 23:05:48 +08:00
|
|
|
hbox = gtk_hbox_new (FALSE, 6);
|
|
|
|
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (hbox);
|
|
|
|
|
2002-10-17 05:18:11 +08:00
|
|
|
button = gtk_button_new_with_mnemonic (_("_Update"));
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (hbox), button, FALSE, FALSE, 0);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (button, "clicked",
|
2001-12-29 21:26:29 +08:00
|
|
|
G_CALLBACK (preview_callback),
|
|
|
|
NULL);
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_show (button);
|
|
|
|
|
|
|
|
gimp_help_set_help_data (button, _("Recompute preview image"), NULL);
|
|
|
|
|
2002-10-17 05:18:11 +08:00
|
|
|
toggle = gtk_check_button_new_with_mnemonic (_("I_nteractive"));
|
|
|
|
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (toggle),
|
2004-07-17 03:41:21 +08:00
|
|
|
mapvals.interactive_preview);
|
2004-05-20 23:05:48 +08:00
|
|
|
gtk_box_pack_start (GTK_BOX (hbox), toggle, TRUE, TRUE, 0);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (toggle, "toggled",
|
2002-10-17 05:18:11 +08:00
|
|
|
G_CALLBACK (gimp_toggle_button_update),
|
|
|
|
&mapvals.interactive_preview);
|
2003-01-07 14:16:02 +08:00
|
|
|
g_signal_connect (toggle, "toggled",
|
2004-07-17 03:41:21 +08:00
|
|
|
G_CALLBACK (interactive_preview_callback),
|
|
|
|
NULL);
|
2002-01-03 01:20:50 +08:00
|
|
|
|
2002-10-17 05:18:11 +08:00
|
|
|
gtk_widget_show (toggle);
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2002-10-17 05:18:11 +08:00
|
|
|
gimp_help_set_help_data (toggle,
|
2004-07-17 03:41:21 +08:00
|
|
|
_("Enable/disable real time preview of changes"),
|
|
|
|
NULL);
|
2002-01-03 01:20:50 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
create_main_notebook (main_hbox);
|
|
|
|
|
|
|
|
gtk_widget_show (appwin);
|
2004-05-20 23:05:48 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
{
|
2003-10-30 04:57:21 +08:00
|
|
|
GdkCursor *cursor;
|
2000-02-18 07:48:13 +08:00
|
|
|
|
2003-10-30 04:57:21 +08:00
|
|
|
cursor = gdk_cursor_new_for_display (gtk_widget_get_display (previewarea),
|
|
|
|
GDK_HAND2);
|
|
|
|
gdk_window_set_cursor (previewarea->window, cursor);
|
|
|
|
gdk_cursor_unref (cursor);
|
2000-02-18 07:48:13 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
image_setup (drawable, TRUE);
|
|
|
|
|
2003-11-12 02:11:56 +08:00
|
|
|
if (gimp_dialog_run (GIMP_DIALOG (appwin)) == GTK_RESPONSE_OK)
|
2003-11-06 23:27:05 +08:00
|
|
|
run = TRUE;
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
if (preview_rgb_data != NULL)
|
2000-02-18 21:59:18 +08:00
|
|
|
g_free (preview_rgb_data);
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
gtk_widget_destroy (appwin);
|
1998-06-11 14:04:59 +08:00
|
|
|
|
2000-02-18 07:48:13 +08:00
|
|
|
return run;
|
1998-06-11 14:04:59 +08:00
|
|
|
}
|
2004-07-20 03:49:19 +08:00
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
save_lighting_preset (GtkWidget *widget,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
static GtkWidget *window = NULL;
|
|
|
|
|
|
|
|
if (! window)
|
|
|
|
{
|
|
|
|
window =
|
|
|
|
gtk_file_chooser_dialog_new (_("Save Lighting Preset"),
|
|
|
|
GTK_WINDOW (appwin),
|
|
|
|
GTK_FILE_CHOOSER_ACTION_SAVE,
|
|
|
|
|
|
|
|
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
|
|
|
GTK_STOCK_SAVE, GTK_RESPONSE_OK,
|
|
|
|
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
g_signal_connect (window, "destroy",
|
|
|
|
G_CALLBACK (gtk_widget_destroyed),
|
|
|
|
&window);
|
|
|
|
g_signal_connect (window, "response",
|
|
|
|
G_CALLBACK (file_chooser_response),
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lighting_effects_path)
|
|
|
|
{
|
|
|
|
GList *list;
|
|
|
|
gchar *dir;
|
|
|
|
|
2004-11-14 10:50:33 +08:00
|
|
|
list = gimp_path_parse (lighting_effects_path, 16, FALSE, NULL);
|
2004-07-20 03:49:19 +08:00
|
|
|
dir = gimp_path_get_user_writable_dir (list);
|
|
|
|
gimp_path_free (list);
|
|
|
|
|
|
|
|
if (! dir)
|
|
|
|
dir = g_strdup (gimp_directory ());
|
|
|
|
|
|
|
|
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (window), dir);
|
|
|
|
|
|
|
|
g_free (dir);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-07-20 05:33:55 +08:00
|
|
|
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (window),
|
|
|
|
g_get_tmp_dir ());
|
2004-07-20 03:49:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
gtk_window_present (GTK_WINDOW (window));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
file_chooser_response (GtkFileChooser *chooser,
|
|
|
|
gint response_id,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
FILE *fp;
|
|
|
|
gint num_lights = 0;
|
|
|
|
gint k;
|
|
|
|
LightSettings *source;
|
|
|
|
gchar buffer1[G_ASCII_DTOSTR_BUF_SIZE];
|
|
|
|
gchar buffer2[G_ASCII_DTOSTR_BUF_SIZE];
|
|
|
|
gchar buffer3[G_ASCII_DTOSTR_BUF_SIZE];
|
|
|
|
gint blen = G_ASCII_DTOSTR_BUF_SIZE;
|
|
|
|
|
|
|
|
if (response_id == GTK_RESPONSE_OK)
|
|
|
|
{
|
2004-07-20 05:33:55 +08:00
|
|
|
gchar *filename = gtk_file_chooser_get_filename (chooser);
|
2004-07-20 03:49:19 +08:00
|
|
|
|
|
|
|
fp = fopen (filename, "w");
|
2004-07-20 05:33:55 +08:00
|
|
|
|
2004-07-20 03:49:19 +08:00
|
|
|
if (!fp)
|
2004-07-20 05:33:55 +08:00
|
|
|
{
|
|
|
|
g_message (_("Could not open '%s' for writing: %s"),
|
|
|
|
filename, g_strerror (errno));
|
|
|
|
}
|
2004-07-20 03:49:19 +08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
for (k = 0; k < NUM_LIGHTS; k++)
|
|
|
|
if (mapvals.lightsource[k].type != NO_LIGHT)
|
|
|
|
++num_lights;
|
|
|
|
|
|
|
|
fprintf (fp, "Number of lights: %d\n", num_lights);
|
|
|
|
|
|
|
|
for (k = 0; k < NUM_LIGHTS; k++)
|
|
|
|
if (mapvals.lightsource[k].type != NO_LIGHT)
|
|
|
|
{
|
|
|
|
source = &mapvals.lightsource[k];
|
|
|
|
|
|
|
|
switch (source->type)
|
|
|
|
{
|
|
|
|
case POINT_LIGHT:
|
|
|
|
fprintf (fp, "Type: Point\n");
|
|
|
|
break;
|
|
|
|
case DIRECTIONAL_LIGHT:
|
|
|
|
fprintf (fp, "Type: Directional\n");
|
|
|
|
break;
|
|
|
|
case SPOT_LIGHT:
|
|
|
|
fprintf (fp, "Type: Spot\n");
|
|
|
|
break;
|
|
|
|
default:
|
2004-07-20 05:33:55 +08:00
|
|
|
g_warning ("Unknown light type: %d",
|
|
|
|
mapvals.lightsource[k].type);
|
2004-07-20 03:49:19 +08:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
fprintf (fp, "Position: %s %s %s\n",
|
|
|
|
g_ascii_dtostr (buffer1, blen, source->position.x),
|
|
|
|
g_ascii_dtostr (buffer2, blen, source->position.y),
|
|
|
|
g_ascii_dtostr (buffer3, blen, source->position.z));
|
|
|
|
|
|
|
|
fprintf (fp, "Direction: %s %s %s\n",
|
|
|
|
g_ascii_dtostr (buffer1, blen, source->direction.x),
|
|
|
|
g_ascii_dtostr (buffer2, blen, source->direction.y),
|
|
|
|
g_ascii_dtostr (buffer3, blen, source->direction.z));
|
|
|
|
|
|
|
|
fprintf (fp, "Color: %s %s %s\n",
|
|
|
|
g_ascii_dtostr (buffer1, blen, source->color.r),
|
|
|
|
g_ascii_dtostr (buffer2, blen, source->color.g),
|
|
|
|
g_ascii_dtostr (buffer3, blen, source->color.b));
|
|
|
|
|
2004-07-20 05:33:55 +08:00
|
|
|
fprintf (fp, "Intensity: %s\n",
|
2004-07-20 03:49:19 +08:00
|
|
|
g_ascii_dtostr (buffer1, blen, source->intensity));
|
|
|
|
}
|
2004-07-20 05:33:55 +08:00
|
|
|
|
2004-07-20 03:49:19 +08:00
|
|
|
fclose (fp);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
gtk_widget_destroy (GTK_WIDGET (chooser));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
load_lighting_preset (GtkWidget *widget,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
static GtkWidget *window = NULL;
|
|
|
|
|
|
|
|
if (! window)
|
|
|
|
{
|
|
|
|
window =
|
|
|
|
gtk_file_chooser_dialog_new (_("Load Lighting Preset"),
|
|
|
|
GTK_WINDOW (appwin),
|
|
|
|
GTK_FILE_CHOOSER_ACTION_OPEN,
|
|
|
|
|
|
|
|
GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
|
|
|
|
GTK_STOCK_OPEN, GTK_RESPONSE_OK,
|
|
|
|
|
|
|
|
NULL);
|
|
|
|
|
|
|
|
gtk_dialog_set_default_response (GTK_DIALOG (window), GTK_RESPONSE_OK);
|
|
|
|
|
|
|
|
g_signal_connect (window, "destroy",
|
|
|
|
G_CALLBACK (gtk_widget_destroyed),
|
|
|
|
&window);
|
|
|
|
g_signal_connect (window, "response",
|
|
|
|
G_CALLBACK (load_file_chooser_response),
|
|
|
|
NULL);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (lighting_effects_path)
|
|
|
|
{
|
|
|
|
GList *list;
|
|
|
|
gchar *dir;
|
|
|
|
|
2004-11-14 10:50:33 +08:00
|
|
|
list = gimp_path_parse (lighting_effects_path, 16, FALSE, NULL);
|
2004-07-20 03:49:19 +08:00
|
|
|
dir = gimp_path_get_user_writable_dir (list);
|
|
|
|
gimp_path_free (list);
|
|
|
|
|
|
|
|
if (! dir)
|
|
|
|
dir = g_strdup (gimp_directory ());
|
|
|
|
|
|
|
|
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (window), dir);
|
|
|
|
|
|
|
|
g_free (dir);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2004-07-20 05:33:55 +08:00
|
|
|
gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (window),
|
|
|
|
g_get_tmp_dir ());
|
2004-07-20 03:49:19 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
gtk_window_present (GTK_WINDOW (window));
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
load_file_chooser_response (GtkFileChooser *chooser,
|
|
|
|
gint response_id,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
FILE *fp;
|
|
|
|
gint num_lights;
|
|
|
|
gint k;
|
|
|
|
LightSettings *source;
|
|
|
|
gchar buffer1[G_ASCII_DTOSTR_BUF_SIZE];
|
|
|
|
gchar buffer2[G_ASCII_DTOSTR_BUF_SIZE];
|
|
|
|
gchar buffer3[G_ASCII_DTOSTR_BUF_SIZE];
|
|
|
|
gchar type_label[20];
|
|
|
|
gchar *endptr;
|
|
|
|
|
|
|
|
|
|
|
|
if (response_id == GTK_RESPONSE_OK)
|
|
|
|
{
|
2004-07-20 05:33:55 +08:00
|
|
|
gchar *filename = gtk_file_chooser_get_filename (chooser);
|
2004-07-20 03:49:19 +08:00
|
|
|
|
|
|
|
fp = fopen (filename, "r");
|
2004-07-20 05:33:55 +08:00
|
|
|
|
2004-07-20 03:49:19 +08:00
|
|
|
if (!fp)
|
2004-07-20 05:33:55 +08:00
|
|
|
{
|
|
|
|
g_message (_("Could not open '%s' for reading: %s"),
|
|
|
|
filename, g_strerror (errno));
|
|
|
|
}
|
2004-07-20 03:49:19 +08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
fscanf (fp, "Number of lights: %d", &num_lights);
|
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
/* initialize lights to off */
|
|
|
|
for (k = 0; k < NUM_LIGHTS; k++)
|
|
|
|
mapvals.lightsource[k].type = NO_LIGHT;
|
|
|
|
|
2004-07-20 03:49:19 +08:00
|
|
|
for (k = 0; k < num_lights; k++)
|
|
|
|
{
|
|
|
|
source = &mapvals.lightsource[k];
|
|
|
|
|
|
|
|
fscanf (fp, " Type: %s", type_label);
|
|
|
|
|
|
|
|
if (!strcmp (type_label, "Point"))
|
|
|
|
source->type = POINT_LIGHT;
|
|
|
|
else if (!strcmp (type_label, "Directional"))
|
|
|
|
source->type = DIRECTIONAL_LIGHT;
|
|
|
|
else if (!strcmp (type_label, "Spot"))
|
|
|
|
source->type = SPOT_LIGHT;
|
|
|
|
else
|
|
|
|
{
|
2004-07-20 05:33:55 +08:00
|
|
|
g_warning ("Unknown light type: %s", type_label);
|
2004-07-20 03:49:19 +08:00
|
|
|
fclose (fp);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
fscanf (fp, " Position: %s %s %s", buffer1, buffer2, buffer3);
|
|
|
|
source->position.x = g_ascii_strtod (buffer1, &endptr);
|
|
|
|
source->position.y = g_ascii_strtod (buffer2, &endptr);
|
|
|
|
source->position.z = g_ascii_strtod (buffer3, &endptr);
|
|
|
|
|
|
|
|
fscanf (fp, " Direction: %s %s %s", buffer1, buffer2, buffer3);
|
|
|
|
source->direction.x = g_ascii_strtod (buffer1, &endptr);
|
|
|
|
source->direction.y = g_ascii_strtod (buffer2, &endptr);
|
|
|
|
source->direction.z = g_ascii_strtod (buffer3, &endptr);
|
|
|
|
|
|
|
|
fscanf (fp, " Color: %s %s %s", buffer1, buffer2, buffer3);
|
|
|
|
source->color.r = g_ascii_strtod (buffer1, &endptr);
|
|
|
|
source->color.g = g_ascii_strtod (buffer2, &endptr);
|
|
|
|
source->color.b = g_ascii_strtod (buffer3, &endptr);
|
|
|
|
source->color.a = 1.0;
|
|
|
|
|
|
|
|
fscanf (fp, " Intensity: %s", buffer1);
|
|
|
|
source->intensity = g_ascii_strtod (buffer1, &endptr);
|
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
}
|
2004-07-20 03:49:19 +08:00
|
|
|
|
|
|
|
fclose (fp);
|
|
|
|
}
|
2004-07-21 02:19:47 +08:00
|
|
|
|
|
|
|
lightselect_callback (GIMP_INT_COMBO_BOX (lightselect_combo), NULL);
|
|
|
|
}
|
2004-07-20 05:33:55 +08:00
|
|
|
|
2004-07-20 03:49:19 +08:00
|
|
|
gtk_widget_destroy (GTK_WIDGET (chooser));
|
|
|
|
interactive_preview_callback (GTK_WIDGET (chooser));
|
|
|
|
}
|
|
|
|
|
2004-07-21 02:19:47 +08:00
|
|
|
|
|
|
|
static void
|
|
|
|
lightselect_callback (GimpIntComboBox *combo,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
gint valid;
|
|
|
|
gint j, k;
|
|
|
|
|
|
|
|
valid = gimp_int_combo_box_get_active (combo, &k);
|
|
|
|
|
|
|
|
if (valid)
|
|
|
|
{
|
|
|
|
mapvals.update_enabled = FALSE; /* prevent apply_settings() */
|
|
|
|
|
|
|
|
mapvals.light_selected = k;
|
|
|
|
gimp_int_combo_box_set_active (GIMP_INT_COMBO_BOX (light_type_combo),
|
|
|
|
mapvals.lightsource[k].type);
|
|
|
|
gimp_color_button_set_color (GIMP_COLOR_BUTTON (colorbutton),
|
|
|
|
&mapvals.lightsource[k].color);
|
|
|
|
gtk_spin_button_set_value (GTK_SPIN_BUTTON(spin_pos_x),
|
|
|
|
mapvals.lightsource[k].position.x);
|
|
|
|
gtk_spin_button_set_value (GTK_SPIN_BUTTON(spin_pos_y),
|
|
|
|
mapvals.lightsource[k].position.y);
|
|
|
|
gtk_spin_button_set_value (GTK_SPIN_BUTTON(spin_pos_z),
|
|
|
|
mapvals.lightsource[k].position.z);
|
|
|
|
gtk_spin_button_set_value (GTK_SPIN_BUTTON(spin_dir_x),
|
|
|
|
mapvals.lightsource[k].direction.x);
|
|
|
|
gtk_spin_button_set_value (GTK_SPIN_BUTTON(spin_dir_y),
|
|
|
|
mapvals.lightsource[k].direction.y);
|
|
|
|
gtk_spin_button_set_value (GTK_SPIN_BUTTON(spin_dir_z),
|
|
|
|
mapvals.lightsource[k].direction.z);
|
|
|
|
gtk_spin_button_set_value (GTK_SPIN_BUTTON(spin_intensity),
|
|
|
|
mapvals.lightsource[k].intensity);
|
|
|
|
|
|
|
|
mapvals.update_enabled = TRUE;
|
|
|
|
|
|
|
|
switch (mapvals.lightsource[k].type)
|
|
|
|
{
|
|
|
|
case NO_LIGHT:
|
|
|
|
gtk_widget_set_sensitive (spin_pos_x, FALSE);
|
|
|
|
gtk_widget_set_sensitive (spin_pos_y, FALSE);
|
|
|
|
gtk_widget_set_sensitive (spin_pos_z, FALSE);
|
|
|
|
gtk_widget_set_sensitive (spin_dir_x, FALSE);
|
|
|
|
gtk_widget_set_sensitive (spin_dir_y, FALSE);
|
|
|
|
gtk_widget_set_sensitive (spin_dir_z, FALSE);
|
|
|
|
break;
|
|
|
|
case POINT_LIGHT:
|
|
|
|
gtk_widget_set_sensitive (spin_pos_x, TRUE);
|
|
|
|
gtk_widget_set_sensitive (spin_pos_y, TRUE);
|
|
|
|
gtk_widget_set_sensitive (spin_pos_z, TRUE);
|
|
|
|
gtk_widget_set_sensitive (spin_dir_x, FALSE);
|
|
|
|
gtk_widget_set_sensitive (spin_dir_y, FALSE);
|
|
|
|
gtk_widget_set_sensitive (spin_dir_z, FALSE);
|
|
|
|
break;
|
|
|
|
case DIRECTIONAL_LIGHT:
|
|
|
|
gtk_widget_set_sensitive (spin_pos_x, FALSE);
|
|
|
|
gtk_widget_set_sensitive (spin_pos_y, FALSE);
|
|
|
|
gtk_widget_set_sensitive (spin_pos_z, FALSE);
|
|
|
|
gtk_widget_set_sensitive (spin_dir_x, TRUE);
|
|
|
|
gtk_widget_set_sensitive (spin_dir_y, TRUE);
|
|
|
|
gtk_widget_set_sensitive (spin_dir_z, TRUE);
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* if we are isolating a light, need to switch */
|
|
|
|
if (mapvals.light_isolated)
|
|
|
|
{
|
|
|
|
for (j = 0; j < NUM_LIGHTS; j++)
|
|
|
|
if (j == mapvals.light_selected)
|
|
|
|
mapvals.lightsource[j].active = TRUE;
|
|
|
|
else
|
|
|
|
mapvals.lightsource[j].active = FALSE;
|
|
|
|
}
|
|
|
|
|
|
|
|
interactive_preview_callback (NULL);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
isolate_selected_light (GtkWidget *widget,
|
|
|
|
gpointer data)
|
|
|
|
{
|
|
|
|
gint k;
|
|
|
|
|
|
|
|
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (widget)))
|
|
|
|
{
|
|
|
|
mapvals.light_isolated = TRUE;
|
|
|
|
|
|
|
|
for (k = 0; k < NUM_LIGHTS; k++)
|
|
|
|
if (k == mapvals.light_selected)
|
|
|
|
mapvals.lightsource[k].active = TRUE;
|
|
|
|
else
|
|
|
|
mapvals.lightsource[k].active = FALSE;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
mapvals.light_isolated = FALSE;
|
|
|
|
|
|
|
|
for (k = 0; k < NUM_LIGHTS; k++)
|
|
|
|
mapvals.lightsource[k].active = TRUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
interactive_preview_callback (NULL);
|
|
|
|
}
|