atomes 1.3.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
w_advance.c
Go to the documentation of this file.
1/* This file is part of the 'atomes' software
2
3'atomes' is free software: you can redistribute it and/or modify it under the terms
4of the GNU Affero General Public License as published by the Free Software Foundation,
5either version 3 of the License, or (at your option) any later version.
6
7'atomes' is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
9See the GNU General Public License for more details.
10
11You should have received a copy of the GNU Affero General Public License along with 'atomes'.
12If not, see <https://www.gnu.org/licenses/>
13
14Copyright (C) 2022-2026 by CNRS and University of Strasbourg */
15
21
22/*
23* This file: 'w_advance.c'
24*
25* Contains:
26*
27
28 - The functions to create the OpenGL parameters edition window
29
30*
31* List of functions:
32
33 int * light_source_to_be_removed (int val, Lightning * ogl_lightning, opengl_edition * ogl_edit);
34
35 G_MODULE_EXPORT gboolean scroll_scale_param (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data);
36 G_MODULE_EXPORT gboolean scroll_scale_quality (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data);
37 G_MODULE_EXPORT gboolean scroll_set_fog_param (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data);
38 G_MODULE_EXPORT gboolean close_advanced (GtkWidget * window, gpointer data);
39 G_MODULE_EXPORT gboolean close_advanced (GtkWidget * widg, GdkEvent * event, gpointer data);
40
41 void print_light_source (Light source, int i);
42 void show_active_light_data (opengl_edition * ogl_win, int lid, int tid);
43 void update_light_data (int li, opengl_edition * ogl_win);
44 void create_lights_combo (int num_lights, opengl_edition * ogl_win);
45 void add_remove_lights (int val, gpointer data);
46 void set_data_pos (vec3_t * vect, int pos, double v);
47 void param_has_changed (gpointer data, double val);
48 void fog_param_changed (gpointer data, GLfloat u, GtkRange * range);
49 void setup_fog_dialogs (opengl_edition * ogl_edit, int fid);
50 void close_advanced_opengl (gpointer data);
51
52 G_MODULE_EXPORT void toggled_delete_ligth (GtkCheckButton * but, gpointer data);
53 G_MODULE_EXPORT void toggled_delete_ligth (GtkToggleButton * but, gpointer data);
54 G_MODULE_EXPORT void run_light_source_to_be_removed (GtkDialog * win, gint response_id, gpointer data);
55 G_MODULE_EXPORT void show_light_param (GtkComboBox * box, gpointer data);
56 G_MODULE_EXPORT void set_nlights_spin (GtkSpinButton * res, gpointer data);
57 G_MODULE_EXPORT void update_light_param (GtkEntry * res, gpointer data);
58 G_MODULE_EXPORT void set_object_pos (GtkEntry * res, gpointer data);
59 G_MODULE_EXPORT void set_light_type (GtkComboBox * box, gpointer data);
60 G_MODULE_EXPORT void set_light_fix (GtkComboBox * box, gpointer data);
61 G_MODULE_EXPORT void show_this_light (GtkCheckButton * but, gpointer data);
62 G_MODULE_EXPORT void show_this_light (GtkToggleButton * but, gpointer data);
63 G_MODULE_EXPORT void set_use_template_toggle (GtkCheckButton * but, gpointer data);
64 G_MODULE_EXPORT void set_use_template_toggle (GtkToggleButton * but, gpointer data);
65 G_MODULE_EXPORT void set_template (GtkComboBox * box, gpointer data);
66 G_MODULE_EXPORT void set_r_model (GtkComboBox * box, gpointer data);
67 G_MODULE_EXPORT void set_f_model (GtkComboBox * box, gpointer data);
68 G_MODULE_EXPORT void set_l_model (GtkComboBox * box, gpointer data);
69 G_MODULE_EXPORT void update_mat_param (GtkEntry * res, gpointer data);
70 G_MODULE_EXPORT void scale_param (GtkRange * range, gpointer data);
71 G_MODULE_EXPORT void scale_quality (GtkRange * range, gpointer data);
72 G_MODULE_EXPORT void set_fog_param (GtkRange * range, gpointer data);
73 G_MODULE_EXPORT void set_fog_type (GtkWidget * widg, gpointer data);
74 G_MODULE_EXPORT void set_fog_mode (GtkWidget * widg, gpointer data);
75 G_MODULE_EXPORT void opengl_advanced (GtkWidget * widg, gpointer data);
76
77 GtkWidget * adv_box (GtkWidget * box, char * lab, int vspace, int size, float xalign);
78 GtkWidget * bdv_box (GtkWidget * box, char * lab, int size, float xalign);
79 GtkWidget * GtkWidget * create_setting_pos (gchar * lab, int size, float xalign, int pid, int lid, float * values, opengl_edition * ogl_win);
80 GtkWidget * lights_tab (glwin * view, opengl_edition * ogl_edit, Lightning * the_light);
81 GtkWidget * rendering_fix (glwin * view);
82 GtkWidget * lightning_fix (glwin * view);
83 GtkWidget * materials_tab (glwin * view, opengl_edition * ogl_edit, Material * the_mat);
84 GtkWidget * fog_tab (glwin * view, opengl_edition * ogl_edit, Fog * the_fog);
85
86 Light * init_light_source (int type, float size);
87 Light * copy_light_source (Light * old_sp);
88 Light ** copy_light_sources (int dima, int dimb, Light ** old_sp);
89
90*/
91
92#include "global.h"
93#include "interface.h"
94#include "preferences.h"
95#include "glview.h"
96#include "glwindow.h"
97
98extern void set_quality (int q, glwin * view);
99
100GLfloat template_parameters[TEMPLATES][5] ={{0.50, 0.50, 0.99, 1.00, 1.00}, // Ok
101 {0.90, 0.60, 0.99, 1.50, 1.00}, // Ok
102 {0.80, 0.40, 0.99, 1.00, 1.00}, // Ok
103 {0.35, 0.15, 0.99, 1.50, 1.00}, // Ok
104 {0.50, 0.50, 0.99, 1.00, 0.50}, //
105 {0.50, 0.50, 0.99, 1.00, 0.75}, //
106 {0.35, 0.80, 0.99, 1.50, 1.00}}; // Ok
107
108float mat_min_max[5][2] = {{0.0, 1.0},
109 {0.0, 1.0},
110 {0.0, 1.0},
111 {0.0, 10.0},
112 {0.0, 1.0}};
113
114gchar * ogl_settings[3][10] = {{i18n("Albedo"),
115 i18n("Metallic"),
116 i18n("Roughness"),
117 i18n("Ambient occlusion"),
118 i18n("Gamma correction"),
119 i18n("Opacity")},
120 {i18n("Position"),
121 i18n("Direction"),
122 i18n("Intensity"),
123 i18n("Constant attenuation"),
124 i18n("Linear attenuation"),
125 i18n("Quadratic attenuation"),
126 i18n("Cone angle"),
127 i18n("Inner cutoff"),
128 i18n("Outer cutoff"),
129 i18n("Type")},
130 {i18n("<b>Fog color</b>")}};
131
132gchar * lpos[3] = {"x", "y", "z"};
133gchar * cpos[3] = {"r", "g", "b"};
134
146GtkWidget * adv_box (GtkWidget * box, char * lab, int vspace, int size, float xalign)
147{
148 GtkWidget * hbox = create_hbox (BSEP);
149 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(lab, size, -1, xalign, 0.5), FALSE, FALSE, 25);
150 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, FALSE, FALSE, vspace);
151 return hbox;
152}
153
164GtkWidget * bdv_box (GtkWidget * box, char * lab, int size, float xalign)
165{
166 GtkWidget * hbox = create_hbox (BSEP);
167 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (lab, size, -1, xalign, 0.5), FALSE, FALSE, 15);
168 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, FALSE, FALSE, 5);
169 return hbox;
170}
171
172GtkWidget * d_close;
174
175#ifdef GTK4
184G_MODULE_EXPORT void toggled_delete_ligth (GtkCheckButton * but, gpointer data)
185#else
194G_MODULE_EXPORT void toggled_delete_ligth (GtkToggleButton * but, gpointer data)
195#endif
196{
197 if (button_get_status ((GtkWidget *)but))
198 {
199 status --;
200 }
201 else
202 {
203 status ++;
204 }
205 if (status == 0)
206 {
208 }
209 else
210 {
212 }
213}
214
216GtkWidget ** light_but;
217
227G_MODULE_EXPORT void run_light_source_to_be_removed (GtkDialog * win, gint response_id, gpointer data)
228{
229 if (! status)
230 {
231 Lightning * ogl_lightning = (Lightning *)data;
232 int i;
233 for (i=0; i<ogl_lightning -> lights; i++)
234 {
235 if (button_get_status ((GtkWidget *)light_but[i]))
236 {
237 light_list[i] = i+1;
238 }
239 }
241 }
242 else
243 {
244 gchar * str = g_strdup_printf (_("You must select %d light source(s) to be removed !"), status);
245 show_warning (str, GTK_WIDGET(win));
246 g_free (str);
247 }
248}
249
259int * light_source_to_be_removed (int val, Lightning * ogl_lightning, opengl_edition * ogl_edit)
260{
261 int i;
262 gchar * str;
263 status = val;
264 if (val > 1)
265 {
266 str = g_strdup_printf (_("Please select the %d light sources to be removed: "), val);
267 }
268 else
269 {
270 str = g_strdup_printf (_("Please select the light source to be removed: "));
271 }
272 GtkWidget * win = message_dialogmodal (str, _("Remove light source(s)"), GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, ogl_edit -> win);
273 GtkWidget * vbox = dialog_get_content_area (win);
274 d_close = gtk_dialog_get_widget_for_response (GTK_DIALOG (win), GTK_RESPONSE_CLOSE);
276 g_free (str);
277 light_but = g_malloc0(ogl_lightning -> lights * sizeof*light_but);
278 for (i=0; i<ogl_lightning -> lights; i++)
279 {
280 str = g_strdup_printf (_("Light N°%d"), i+1);
281 light_but[i] = check_button (str, -1, 25, FALSE, G_CALLBACK(toggled_delete_ligth), (gpointer)GINT_TO_POINTER(i));
282 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, light_but[i], TRUE, TRUE, 0);
283 g_free (str);
284 }
285 light_list = allocint (ogl_lightning -> lights);
286 run_this_gtk_dialog (win, G_CALLBACK(run_light_source_to_be_removed), ogl_lightning);
287 return light_list;
288}
289
298void print_light_source (Light source, int i)
299{
300 g_debug ("\n");
301 g_debug ("Light N°%d", i);
302 g_debug ("Type= %d", source.type);
303 g_debug ("Pos_x= %f, Pos_y= %f, Pos_z= %f", source.position.x, source.position.y, source.position.z);
304 g_debug ("Dir_x= %f, Dir_y= %f, Dir_z= %f", source.direction.x, source.direction.y, source.direction.z);
305 g_debug ("Int_r= %f, Int_g= %f, Int_b= %f", source.intensity.x, source.intensity.y, source.intensity.z);
306 g_debug ("Att_c= %f, Att_l= %f, Att_q= %f", source.attenuation.x, source.attenuation.y, source.attenuation.z);
307 g_debug ("Spo_a= %f, Spo_i= %f, Spo_o= %f", source.spot_data.x, source.spot_data.y, source.spot_data.z);
308 g_debug ("\n");
309}
310
311/*
312 Light attenuation table (from Ogre3D):
313 Distance(to object) Constant Linear Quadratic
314 7 1.0 0.7 1.8
315 13 1.0 0.35 0.44
316 20 1.0 0.22 0.20
317 32 1.0 0.14 0.07
318 50 1.0 0.09 0.032
319 65 1.0 0.07 0.017
320 100 1.0 0.045 0.0075
321 160 1.0 0.027 0.0028
322 200 1.0 0.022 0.0019
323 325 1.0 0.014 0.0007
324 600 1.0 0.007 0.0002
325 3250 1.0 0.0014 0.000007
326*/
327
336Light * init_light_source (int type, float size)
337{
338 Light * new_light = g_malloc0(sizeof*new_light);
339 new_light -> type = type;
340 new_light -> fix = (type != 1) ? 0 : 1;
341 new_light -> show = 0;
342 new_light -> intensity = vec3(0.0, 0.0, 0.0);
343 new_light -> direction = vec3(0.0, 0.0, 0.0);
344 new_light -> position = vec3(0.0, 0.0, 0.0);
345 new_light -> attenuation = vec3(0.0, 0.0, 0.0);
346 if (type == 0)
347 {
348 new_light -> intensity = vec3 (DEFAULT_INTENSITY, DEFAULT_INTENSITY, DEFAULT_INTENSITY);
349 new_light -> position = vec3 (0.0, 0.0, 0.0);
350 new_light -> direction = vec3 (0.5, 1.0, 0.7);
351 new_light -> attenuation = vec3 (1.0, 0.0, 0.0);
352 }
353 else if (type == 1)
354 {
355 new_light -> intensity = vec3 (1.2, 1.1, 1.0);
356 new_light -> position = vec3 (0.0, 0.0, size * 0.8);
357 new_light -> attenuation = vec3 (1.0, 0.01 / size, 0.001 / (size * size));
358 }
359 else
360 {
361 new_light -> intensity = vec3 (1.5, 1.4, 1.3);
362 new_light -> position = vec3 (0.0, 0.0, size * 0.5); // Au centre
363 new_light -> direction = vec3 (0.0, 0.0, -1.0); // Vers le bas
364 new_light -> attenuation = vec3 (1.0, 0.01 / size, 0.001 / (size * size));
365 new_light -> spot_data = vec3 (45.0, 5.0, 8.0);
366 }
367 return new_light;
368}
369
378{
379 Light * new_sp = g_malloc0(sizeof*new_sp);
380 new_sp -> type = old_sp -> type;
381 new_sp -> fix = old_sp -> fix;
382 new_sp -> show = old_sp -> show;
383 new_sp -> position = old_sp -> position;
384 new_sp -> direction = old_sp -> direction;
385 new_sp -> intensity = old_sp -> intensity;
386 new_sp -> attenuation = old_sp -> attenuation;
387 new_sp -> spot_data = old_sp -> spot_data;
388 return new_sp;
389}
390
400Light ** copy_light_sources (int dima, int dimb, Light ** old_sp)
401{
402 int j;
403 Light ** new_sp = g_malloc0(dima*sizeof * new_sp);
404 for (j=0; j<dimb; j++)
405 {
406 //print_light_source (old_sp[j], j);
407 new_sp[j] = copy_light_source (old_sp[j]);
408 //print_light_source (new_sp[j], j);
409 }
410 return new_sp;
411}
412
422void show_active_light_data (opengl_edition * ogl_win, int lid, int tid)
423{
424 Light * this_light = (preferences) ? tmp_lightning.spot[lid] : get_project_by_id(ogl_win -> proj) -> modelgl -> anim -> last -> img -> l_ghtning.spot[lid];
425 this_light -> type = tid;
426
427 hide_the_widgets (ogl_win -> advanced_light_box);
428 widget_set_sensitive (ogl_win -> light_type, lid);
429 if (this_light -> type) show_the_widgets (ogl_win -> advanced_light_box);
430 int i;
431 for (i=0; i<2; i++)
432 {
433 hide_the_widgets (ogl_win -> light_b_coord[i]);
434 hide_the_widgets (ogl_win -> light_b_entry[i]);
435 }
436 if (this_light -> type)
437 {
438 show_the_widgets (ogl_win -> light_b_coord[0]);
439 show_the_widgets (ogl_win -> light_b_entry[0]);
440 }
441 if (this_light -> type == 0 || this_light -> type == 2)
442 {
443 show_the_widgets (ogl_win -> light_b_coord[1]);
444 }
445 if (this_light -> type == 2)
446 {
447 show_the_widgets (ogl_win -> light_b_entry[1]);
448 }
449 if (! preferences)
450 {
451 hide_the_widgets (ogl_win -> light_show);
452 if (this_light -> type) show_the_widgets (ogl_win -> light_show);
453 }
454}
455
464void update_light_data (int li, opengl_edition * ogl_win)
465{
466 Light * this_light = (preferences) ? tmp_lightning.spot[li] : get_project_by_id(ogl_win -> proj) -> modelgl -> anim -> last -> img -> l_ghtning.spot[li];
467 combo_set_active (ogl_win -> light_type, this_light -> type);
468 combo_set_active (ogl_win -> light_fix, this_light -> fix);
469 show_active_light_data (ogl_win, li, this_light -> type);
470 update_entry_double (GTK_ENTRY(ogl_win -> light_entry[0]), this_light -> attenuation.x);
471 update_entry_double (GTK_ENTRY(ogl_win -> light_entry[1]), this_light -> attenuation.y);
472 update_entry_double (GTK_ENTRY(ogl_win -> light_entry[2]), this_light -> attenuation.z);
473 update_entry_double (GTK_ENTRY(ogl_win -> light_entry[3]), this_light -> spot_data.x);
474 update_entry_double (GTK_ENTRY(ogl_win -> light_entry[4]), this_light -> spot_data.y);
475 update_entry_double (GTK_ENTRY(ogl_win -> light_entry[5]), this_light -> spot_data.z);
476 update_entry_double (GTK_ENTRY(ogl_win -> entogl[1][0]), this_light -> position.x);
477 update_entry_double (GTK_ENTRY(ogl_win -> entogl[1][1]), this_light -> position.y);
478 update_entry_double (GTK_ENTRY(ogl_win -> entogl[1][2]), this_light -> position.z);
479 update_entry_double (GTK_ENTRY(ogl_win -> entogl[2][0]), this_light -> direction.x);
480 update_entry_double (GTK_ENTRY(ogl_win -> entogl[2][1]), this_light -> direction.y);
481 update_entry_double (GTK_ENTRY(ogl_win -> entogl[2][2]), this_light -> direction.z);
482 update_entry_double (GTK_ENTRY(ogl_win -> entogl[3][0]), this_light -> intensity.x);
483 update_entry_double (GTK_ENTRY(ogl_win -> entogl[3][1]), this_light -> intensity.y);
484 update_entry_double (GTK_ENTRY(ogl_win -> entogl[3][2]), this_light -> intensity.z);
485 if (! preferences)
486 {
487 button_set_status (ogl_win -> light_show, this_light -> show);
488 }
489}
490
499G_MODULE_EXPORT void show_light_param (GtkComboBox * box, gpointer data)
500{
501 int li = combo_get_active ((GtkWidget *)box);
502 update_light_data (li, (opengl_edition *)data);
503}
504
513void create_lights_combo (int num_lights, opengl_edition * ogl_win)
514{
515 ogl_win -> lights = create_combo ();
516 int i;
517 gchar * str;
518 for (i=0; i<num_lights; i++)
519 {
520 str = g_strdup_printf (_("Light N°%d"), i+1);
521 combo_text_append (ogl_win -> lights, str);
522 g_free (str);
523 }
524 gtk_widget_set_size_request (ogl_win -> lights, 100, -1);
525 g_signal_connect (G_OBJECT (ogl_win -> lights), "changed", G_CALLBACK(show_light_param), ogl_win);
526 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ogl_win -> lights_box, ogl_win -> lights, FALSE, FALSE, 10);
527}
528
537void add_remove_lights (int val, gpointer data)
538{
539 int i, j, k;
540 project * this_proj;
541 glwin * view;
542 Lightning * this_lightning;
543 opengl_edition * ogl_edit;
544 if (! preferences)
545 {
546 view = (glwin *)data;
547 this_proj = get_project_by_id (view -> proj);
548 this_lightning = & view -> anim -> last -> img -> l_ghtning;
549 ogl_edit = view -> opengl_win;
550 }
551 else
552 {
553 this_lightning = & tmp_lightning;
554 ogl_edit = pref_ogl_edit;
555 }
556
557 i = this_lightning -> lights;
558 Light ** old_spots;
559 if (val > i)
560 {
561#ifdef DEBUG
562 g_debug ("ADDING_LIGHT_SOURCE:: val= %d, i= %d", val, i);
563#endif
564 // Adding light source(s)
565 old_spots = copy_light_sources (i, i, this_lightning -> spot);
566 g_free (this_lightning -> spot);
567 this_lightning -> spot = copy_light_sources (val, i, old_spots);
568 this_lightning -> lights = val;
569 for (j=i; j<val; j++)
570 {
571 this_lightning -> spot[j] = init_light_source (0, (! preferences) ? this_proj -> modelgl -> p_moy : 1.0); // Init directional by default
572 }
573 g_free (old_spots);
574 }
575 else if (val < i)
576 {
577 // We need to remove a light
578#ifdef DEBUG
579 g_debug ("REMOVING_LIGHT_SOURCE:: val= %d, i= %d", val, i);
580#endif
581 int * ltr = light_source_to_be_removed (i-val, this_lightning, ogl_edit);
582 if (ltr != NULL)
583 {
584 old_spots = copy_light_sources (i, i, this_lightning -> spot);
585 g_free (this_lightning -> spot);
586 this_lightning -> spot = g_malloc0(val*sizeof*this_lightning -> spot);
587 k = -1;
588 for (j=0; j<i; j++)
589 {
590 if (! ltr[j])
591 {
592 // Keeping this light source
593 k ++;
594 this_lightning -> spot[k] = copy_light_source (old_spots[j]);
595 }
596#ifdef DEBUG
597 else
598 {
599 g_debug ("REMOVING_LIGHT_SOURCES:: j= %d, ltr[%d]= %d", j, j, ltr[j]);
600 }
601#endif // DEBUG
602 }
603 g_free (old_spots);
604 this_lightning -> lights = val;
605#ifdef DEBUG
606 g_debug ("LIGHT(s) HAVE BEEN REMOVED:: NEW_LIGHTS_NUM= %d", val);
607#endif
608 }
609 }
610 ogl_edit -> lights = destroy_this_widget (ogl_edit -> lights);
611 create_lights_combo (this_lightning -> lights, ogl_edit);
612 show_the_widgets (ogl_edit -> lights);
613 combo_set_active (ogl_edit -> lights, 0);
614 update_light_data (0, ogl_edit);
615 if (! preferences)
616 {
617 init_shaders (view);
618 update (view);
619 }
620}
621
630G_MODULE_EXPORT void set_nlights_spin (GtkSpinButton * res, gpointer data)
631{
632 add_remove_lights (gtk_spin_button_get_value_as_int(res), data);
633}
634
643G_MODULE_EXPORT void update_light_param (GtkEntry * res, gpointer data)
644{
645 dint * lid = (dint *)data;
646 glwin * view = (preferences) ? NULL : get_project_by_id(lid -> a) -> modelgl;
647 opengl_edition * ogl_edit = (preferences) ? pref_ogl_edit : (view) ? view -> opengl_win : NULL;
648 if (ogl_edit)
649 {
650 int li = combo_get_active (ogl_edit-> lights);
651 Light * this_light = (preferences) ? tmp_lightning.spot[li] : view -> anim -> last -> img -> l_ghtning.spot[li];
652 const gchar * m = entry_get_text (res);
653 double v = string_to_double ((gpointer)m);
654 switch (lid -> b)
655 {
656 case 0:
657 this_light -> attenuation.x = v;
658 break;
659 case 1:
660 this_light -> attenuation.y = v;
661 break;
662 case 2:
663 this_light -> attenuation.z = v;
664 break;
665 case 3:
666 this_light -> spot_data.x = v;
667 break;
668 case 4:
669 this_light -> spot_data.y = v;
670 break;
671 case 5:
672 this_light -> spot_data.z = v;
673 break;
674 }
676 if (this_light -> show) view -> create_shaders[LIGHT] = TRUE;
677 }
678 if (! preferences) update (view);
679}
680
690void set_data_pos (vec3_t * vect, int pos, double v)
691{
692 switch (pos)
693 {
694 case 0:
695 vect -> x = v;
696 break;
697 case 1:
698 vect -> y = v;
699 break;
700 case 2:
701 vect -> z = v;
702 break;
703 }
704}
705
714G_MODULE_EXPORT void set_object_pos (GtkEntry * res, gpointer data)
715{
716 tint * id = (tint *)data;
717 glwin * view;
718 opengl_edition * edit_ogl;
719 Material * the_mat;
720 Lightning * the_lightning;
721 Fog * the_fog;
722 const gchar * m = entry_get_text (res);
723 double v = string_to_double ((gpointer)m);
724 if (! preferences)
725 {
726 view = get_project_by_id(id -> a) -> modelgl;
727 the_mat = & view -> anim -> last -> img -> m_terial;
728 the_lightning = & view -> anim -> last -> img -> l_ghtning;
729 the_fog = & view -> anim -> last -> img -> f_g;
730 edit_ogl = view -> opengl_win;
731 }
732 else
733 {
734 the_mat = & tmp_material;
735 the_lightning = & tmp_lightning;
736 the_fog = & tmp_fog;
737 edit_ogl = pref_ogl_edit;
738 }
739 if (id -> b == 0)
740 {
741 set_data_pos (& the_mat -> albedo, id -> c, v);
742 }
743 else if (id -> b == 4)
744 {
745 set_data_pos (& the_fog -> color, id -> c, v);
746 }
747 else if (id -> b > 0 && edit_ogl)
748 {
749 int li = combo_get_active (edit_ogl -> lights);
750 switch (id -> b)
751 {
752 case 1:
753 set_data_pos (& the_lightning -> spot[li] -> position, id -> c, v);
754 break;
755 case 2:
756 set_data_pos (& the_lightning -> spot[li] -> direction, id -> c, v);
757 break;
758 case 3:
759 set_data_pos (& the_lightning -> spot[li] -> intensity, id -> c, v);
760 break;
761 }
762 if (the_lightning -> spot[li] -> show && ! preferences) view -> create_shaders[LIGHT] = TRUE;
763 }
764 if (edit_ogl) update_entry_double (res, v);
765 if (! preferences) update (view);
766}
767
776G_MODULE_EXPORT void set_light_type (GtkComboBox * box, gpointer data)
777{
778 opengl_edition * ogl_win = (opengl_edition *)data;
779 int li = combo_get_active (ogl_win -> lights);
780 int ti = combo_get_active ((GtkWidget *)box);
781 show_active_light_data (ogl_win, li, ti);
782}
783
792G_MODULE_EXPORT void set_light_fix (GtkComboBox * box, gpointer data)
793{
794 opengl_edition * ogl_win = (opengl_edition *)data;
795 glwin * view;
796 Lightning * ogl_ligthning;
797 if (! preferences)
798 {
799 view = get_project_by_id(ogl_win -> proj) -> modelgl;
800 ogl_ligthning = & view -> anim -> last -> img -> l_ghtning;
801 }
802 else
803 {
804 ogl_ligthning = & tmp_lightning;
805 }
806 int li = combo_get_active (ogl_win -> lights);
807 ogl_ligthning -> spot[li] -> fix = combo_get_active ((GtkWidget *)box);
808 if (! preferences)
809 {
810 view -> create_shaders[LIGHT] = TRUE;
811 update (view);
812 }
813}
814
815#ifdef GTK4
824G_MODULE_EXPORT void show_this_light (GtkCheckButton * but, gpointer data)
825#else
834G_MODULE_EXPORT void show_this_light (GtkToggleButton * but, gpointer data)
835#endif
836{
837 opengl_edition * ogl_win = (opengl_edition *)data;
838 glwin * view = get_project_by_id(ogl_win -> proj) -> modelgl;
839 int li = combo_get_active (ogl_win -> lights);
840 view -> anim -> last -> img -> l_ghtning.spot[li] -> show = button_get_status ((GtkWidget *)but);
841 view -> create_shaders[LIGHT] = TRUE;
842 update (view);
843}
844
858GtkWidget * create_setting_pos (gchar * lab, int size, float xalign, int pid, int lid, float * values, opengl_edition * ogl_win)
859{
860 int i;
861 GtkWidget * setting_pos = create_vbox (BSEP);
862 adv_box (setting_pos, lab, 5, size, xalign);
863 GtkWidget * hbox = create_hbox (0);
864 add_box_child_start (GTK_ORIENTATION_VERTICAL, setting_pos, hbox, FALSE, FALSE, 0);
865 GtkWidget * sbox = create_hbox (0);
866 gtk_widget_set_size_request (sbox, 500, -1);
867 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, sbox, FALSE, FALSE, 70);
868 GtkWidget * label;
869 for (i=0; i<3; i++)
870 {
871 ogl_win -> pos_pointer[pid][i].a = ogl_win -> proj;
872 ogl_win -> pos_pointer[pid][i].b = pid;
873 ogl_win -> pos_pointer[pid][i].c = i;
874 label = markup_label ((pid > 0 && pid < 3) ? lpos[i] : cpos[i], 20, -1, 1.0, 0.5);
875 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sbox, label, FALSE, FALSE, 5);
876 ogl_win -> entogl[pid][i] = create_entry (G_CALLBACK(set_object_pos), 80, 10, FALSE, & ogl_win -> pos_pointer[pid][i]);
877 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sbox, ogl_win -> entogl[pid][i], FALSE, FALSE, 0);
878 update_entry_double (GTK_ENTRY(ogl_win -> entogl[pid][i]), values[i]);
879 }
880 if (pid == 1 && ! preferences)
881 {
882 ogl_win -> light_show = check_button (_("Show light"), -1, -1, FALSE, G_CALLBACK(show_this_light), ogl_win);
883 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sbox, ogl_win -> light_show, FALSE, FALSE, 10);
884 }
885 return setting_pos;
886}
887
897GtkWidget * lights_tab (glwin * view, opengl_edition * ogl_edit, Lightning * ogl_lightning)
898{
899 int i, j, k;
900 GtkWidget * vbox;
901 GtkWidget * hbox, * lhbox;
902
903 GtkWidget * layout = create_layout (-1, 600);
904 vbox = add_vbox_to_layout (layout, 480, -1);
905 hbox = bdv_box (vbox, _("<b>Number of light sources</b>\n(add or remove lights - up to 10 sources)"), 250, 0.0);
906 gtk_widget_set_size_request (hbox, -1, 65);
907
908 GtkWidget * nlights = spin_button (G_CALLBACK(set_nlights_spin), ogl_lightning -> lights, 1.0, 10.0, 1.0, 0, 100, view);
909 gtk_widget_set_size_request (nlights, 25, -1);
910 GtkWidget * fix = gtk_fixed_new ();
911 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, fix, FALSE, FALSE, 20);
912 gtk_fixed_put (GTK_FIXED (fix), nlights, 0, 20);
913
914 hbox = bdv_box (vbox, _("<b>Configure light source <sup>*</sup></b>"), 250, 0.0);
915 ogl_edit -> lights_box = create_hbox (0);
916 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ogl_edit -> lights_box, FALSE, FALSE, 10);
917 create_lights_combo (ogl_lightning -> lights, ogl_edit);
918
919 bdv_box (vbox, _("<b>Light configuration</b>"), 250, 0.0);
920 hbox = create_hbox (0);
921 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
922 ogl_edit -> light_type = create_combo ();
923 combo_text_append (ogl_edit -> light_type, _("Directional"));
924 combo_text_append (ogl_edit -> light_type, _("Point"));
925 combo_text_append (ogl_edit -> light_type, _("Spot"));
926 g_signal_connect (G_OBJECT (ogl_edit -> light_type), "changed", G_CALLBACK(set_light_type), ogl_edit);
927 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ogl_edit -> light_type, FALSE, FALSE, 60);
928
929 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, gtk_label_new(_("Fixed by respect to: ")), FALSE, FALSE, 10);
930 ogl_edit -> light_fix = create_combo();
931 combo_text_append (ogl_edit -> light_fix, _("The viewer"));
932 combo_text_append (ogl_edit -> light_fix, _("The model"));
933 g_signal_connect (G_OBJECT (ogl_edit -> light_fix), "changed", G_CALLBACK(set_light_fix), ogl_edit);
934 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ogl_edit -> light_fix, FALSE, FALSE, 10);
935
936 float values[3] = {0.0, 0.0, 0.0};
937 // Position
938 gchar * str = (preferences) ? g_strdup_printf ("<u>%s:</u> <sup>**</sup>", _(ogl_settings[1][0])) : g_strdup_printf ("<u>%s:</u>", _(ogl_settings[1][0]));
939 ogl_edit -> light_b_coord[0] = create_setting_pos (str, 130, 0.0, 1, 0, values, ogl_edit);
940 g_free (str);
941 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, ogl_edit -> light_b_coord[0], FALSE, FALSE, 0);
942 // Direction
943 str = g_strdup_printf ("<u>%s:</u>", _(ogl_settings[1][1]));
944 ogl_edit -> light_b_coord[1] = create_setting_pos (str, 130, 0.0, 2, 1, values, ogl_edit);
945 g_free (str);
946 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, ogl_edit -> light_b_coord[1], FALSE, FALSE, 0);
947 // Intensity
948 str = (preferences) ? g_strdup_printf ("<u>%s:</u> <sup>**</sup>", _(ogl_settings[1][2])) : g_strdup_printf ("<u>%s:</u>", _(ogl_settings[1][2]));
949 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_setting_pos (str, 130, 0.0, 3, 2, values, ogl_edit), FALSE, FALSE, 0);
950 g_free (str);
952 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
953 ogl_edit -> advanced_light_box = create_vbox (BSEP);
954 add_box_child_start ( GTK_ORIENTATION_HORIZONTAL, hbox, ogl_edit -> advanced_light_box, FALSE, FALSE, 40);
955 add_box_child_start (GTK_ORIENTATION_VERTICAL, ogl_edit -> advanced_light_box, markup_label(_("<b>Advanced parameters</b>"), -1, -1, 0.1, 0.5), FALSE, FALSE, 10);
956 GtkWidget * lbox = create_hbox (BSEP);
957 add_box_child_start (GTK_ORIENTATION_VERTICAL, ogl_edit -> advanced_light_box, lbox, FALSE, FALSE, 0);
958 GtkWidget * lvbox = create_vbox (BSEP);
959 add_box_child_start ( GTK_ORIENTATION_HORIZONTAL, lbox, lvbox, FALSE, FALSE, 20);
960 k = 0;
961 for (i=0; i<2; i++)
962 {
963 ogl_edit -> light_b_entry[i] = create_vbox (BSEP);
964 add_box_child_start (GTK_ORIENTATION_VERTICAL, lvbox, ogl_edit -> light_b_entry[i], FALSE, FALSE, 0);
965 for (j=0; j<3; j++)
966 {
967 ogl_edit -> light_entry[k] = create_entry (G_CALLBACK(update_light_param), 100, 15, FALSE, & ogl_edit -> pointer[k]);
968 str = g_strdup_printf ("<u>%s:</u>", _(ogl_settings[1][k+3]));
969 lhbox = adv_box (ogl_edit -> light_b_entry[i], str, 0, 170, 0.0);
970 g_free (str);
971 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, lhbox, ogl_edit -> light_entry[k], FALSE, FALSE, 10);
972 if (i == 1) add_box_child_start (GTK_ORIENTATION_HORIZONTAL, lhbox, gtk_label_new("°"), FALSE, FALSE, 0);
973 k ++;
974 }
975 }
977 combo_set_active (ogl_edit -> lights, 0);
978 update_light_data (0, ogl_edit);
979
980 append_comments (vbox, "<sup>*</sup>", _("Note that light N°1 must be a directional light"));
981 if (preferences)
982 {
983 append_comments (vbox, "<sup>**</sup>", _("Position and attenuation will be corrected based on model depth"));
984 }
985 return layout;
986}
987
988// ***************** MATERIAL ******************* //
989
990#ifdef GTK4
999G_MODULE_EXPORT void set_use_template_toggle (GtkCheckButton * but, gpointer data)
1000#else
1009G_MODULE_EXPORT void set_use_template_toggle (GtkToggleButton * but, gpointer data)
1010#endif
1011{
1012 int i, j, k;
1013 Material * the_mat;
1014 opengl_edition * ogl_edit;
1015 glwin * view;
1016 if (! preferences)
1017 {
1018 view = (glwin *)data;
1019 ogl_edit = view -> opengl_win;
1020 the_mat = & view -> anim -> last -> img -> m_terial;
1021 i = combo_get_active (view -> opengl_win -> templates);
1022 }
1023 else
1024 {
1025 ogl_edit = pref_ogl_edit;
1026 the_mat = & tmp_material;
1027 i = combo_get_active (pref_ogl_edit -> templates);
1028 }
1029 j = button_get_status ((GtkWidget *)but);
1030 if (j)
1031 {
1032 if (i == -1) i = 3;
1033 the_mat -> albedo = vec3(0.5, 0.5, 0.5);
1034 for (k=0; k<5; k++)
1035 {
1036 the_mat -> param[k+1] = template_parameters[i][k];
1037 if (ogl_edit)
1038 {
1039 update_entry_double (GTK_ENTRY(ogl_edit -> m_entry[k]), the_mat -> param[k+1]);
1040 gtk_range_set_value (GTK_RANGE(ogl_edit -> m_scale[k]), the_mat -> param[k+1]);
1041 }
1042 }
1043 combo_set_active (ogl_edit -> templates, i);
1044 if (ogl_edit)
1045 {
1046 update_entry_double (GTK_ENTRY(ogl_edit -> entogl[0][0]), the_mat -> albedo.x);
1047 update_entry_double (GTK_ENTRY(ogl_edit -> entogl[0][1]), the_mat -> albedo.y);
1048 update_entry_double (GTK_ENTRY(ogl_edit -> entogl[0][2]), the_mat -> albedo.z);
1049 }
1050 k = i+1;
1051 }
1052 else
1053 {
1054 k = 0;
1055 }
1056 the_mat -> predefine = k;
1057 widget_set_sensitive (ogl_edit -> templates, the_mat -> predefine);
1058 widget_set_sensitive (ogl_edit -> param_mat, ! the_mat -> predefine);
1059 if (! preferences)
1060 {
1061 update (view);
1062 }
1063}
1064
1073G_MODULE_EXPORT void set_template (GtkComboBox * box, gpointer data)
1074{
1075 int i, j;
1076 Material * the_mat;
1077 glwin * view;
1078 opengl_edition * ogl_edit;
1079 if (preferences)
1080 {
1081 the_mat = & tmp_material;
1082 ogl_edit = pref_ogl_edit;
1083 }
1084 else
1085 {
1086 view = (glwin *)data;
1087 the_mat = & view -> anim -> last -> img -> m_terial;
1088 ogl_edit = view -> opengl_win;
1089 }
1090 i = combo_get_active ((GtkWidget *)box);
1091 the_mat -> predefine = i + 1;
1092 for (j=0; j<5; j++)
1093 {
1094 the_mat -> param[j+1] = template_parameters[i][j];
1095#ifdef DEBUG
1096 g_debug ("SET_TEMPLATES:: j= %d, val= %f", j, template_parameters[i][j]);
1097#endif
1098 if (ogl_edit)
1099 {
1100 update_entry_double (GTK_ENTRY(ogl_edit -> m_entry[j]), the_mat -> param[j+1]);
1101 gtk_range_set_value (GTK_RANGE(ogl_edit -> m_scale[j]), the_mat -> param[j+1]);
1102 }
1103 }
1104 if (ogl_edit)
1105 {
1106 update_entry_double (GTK_ENTRY(ogl_edit -> entogl[0][0]), the_mat -> albedo.x);
1107 update_entry_double (GTK_ENTRY(ogl_edit -> entogl[0][1]), the_mat -> albedo.y);
1108 update_entry_double (GTK_ENTRY(ogl_edit -> entogl[0][2]), the_mat -> albedo.z);
1109 }
1110 if (! preferences) update (view);
1111}
1112
1121G_MODULE_EXPORT void set_r_model (GtkComboBox * box, gpointer data)
1122{
1123 if (preferences)
1124 {
1125 tmp_opengl[4] = combo_get_active ((GtkWidget *)box);
1126 widget_set_sensitive (pref_ogl_edit -> render_fix, ! tmp_opengl[4]);
1127 }
1128 else
1129 {
1130 glwin * view = (glwin *)data;
1131 view -> anim -> last -> img -> ray_tracing = combo_get_active ((GtkWidget *)box);
1132 view -> anim -> last -> img -> render = 0;
1133 widget_set_sensitive (view -> opengl_win -> render_fix, ! view -> anim -> last -> img -> ray_tracing);
1134 init_default_shaders (view);
1135 update (view);
1136 }
1137}
1138
1147G_MODULE_EXPORT void set_f_model (GtkComboBox * box, gpointer data)
1148{
1149 glwin * view = (glwin *)data;
1150 view -> anim -> last -> img -> render = combo_get_active ((GtkWidget *)box);
1151 init_default_shaders (view);
1152 update (view);
1153}
1154
1163G_MODULE_EXPORT void set_l_model (GtkComboBox * box, gpointer data)
1164{
1165 if (preferences)
1166 {
1167 tmp_material.param[0] = combo_get_active ((GtkWidget *)box);
1168 }
1169 else
1170 {
1171 glwin * view = (glwin *)data;
1172 view -> anim -> last -> img -> m_terial.param[0] = combo_get_active ((GtkWidget *)box);
1173 update (view);
1174 }
1175}
1176
1185void param_has_changed (gpointer data, double val)
1186{
1187 dint * mid = (dint *)data;
1188 opengl_edition * edit_ogl;
1189 Material * the_mat;
1190 glwin * view;
1191 if (preferences)
1192 {
1193 edit_ogl = pref_ogl_edit;
1194 the_mat = & tmp_material;
1195 }
1196 else
1197 {
1198 view = get_project_by_id(mid -> a) -> modelgl;
1199 edit_ogl = view -> opengl_win;
1200 the_mat = & view -> anim -> last -> img -> m_terial;
1201 }
1202 if (mat_min_max[mid -> b][0] >= 0.0 && val <= mat_min_max[mid -> b][1]) the_mat -> param[mid -> b + 1] = val;
1203 if (edit_ogl)
1204 {
1205 update_entry_double (GTK_ENTRY(edit_ogl -> m_entry[mid -> b]), the_mat -> param[mid -> b + 1]);
1206 gtk_range_set_value (GTK_RANGE(edit_ogl -> m_scale[mid -> b]), the_mat -> param[mid -> b + 1]);
1207 }
1208 if (! preferences) update (view);
1209}
1210
1219G_MODULE_EXPORT void update_mat_param (GtkEntry * res, gpointer data)
1220{
1221 const gchar * m = entry_get_text (res);
1222 double v = string_to_double ((gpointer)m);
1223 param_has_changed (data, v);
1224}
1225
1236G_MODULE_EXPORT gboolean scroll_scale_param (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data)
1237{
1238 param_has_changed (data, value);
1239 return FALSE;
1240}
1241
1250G_MODULE_EXPORT void scale_param (GtkRange * range, gpointer data)
1251{
1252 param_has_changed (data, gtk_range_get_value (range));
1253}
1254
1265G_MODULE_EXPORT gboolean scroll_scale_quality (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data)
1266{
1267 set_quality ((int)value, data);
1268#ifdef GTK4
1269 if (! preferences) update_menu_bar ((glwin *)data);
1270#endif
1271 return FALSE;
1272}
1273
1282G_MODULE_EXPORT void scale_quality (GtkRange * range, gpointer data)
1283{
1284 set_quality ((int)gtk_range_get_value (range), data);
1285#ifdef GTK4
1286 if (! preferences) update_menu_bar ((glwin *)data);
1287#endif
1288}
1289
1298GtkWidget * rendering_fix (glwin * view, opengl_edition * ogl_edit)
1299{
1300 GtkWidget * fix = gtk_fixed_new ();
1301 GtkWidget * rmodel = create_combo ();
1302 gtk_fixed_put (GTK_FIXED (fix), rmodel, 0, 10);
1303 combo_text_append (rmodel, _("3D Objects"));
1304 combo_text_append (rmodel, _("Ray Tracing"));
1305
1306 g_signal_connect (G_OBJECT (rmodel), "changed", G_CALLBACK(set_r_model), view);
1307 gtk_widget_set_size_request (rmodel, 110, -1);
1308 combo_set_active (rmodel, (view) ? view -> anim -> last -> img -> ray_tracing : tmp_opengl[4]);
1309
1310 ogl_edit -> render_fix = gtk_fixed_new ();
1311 gtk_fixed_put (GTK_FIXED (fix), ogl_edit -> render_fix, 130, 0);
1312 GtkWidget * quality_scale = create_hscale (3, 500, 1, (view) ? view -> anim -> last -> img -> quality : tmp_opengl[3], GTK_POS_TOP, 1, 100, G_CALLBACK(scale_quality), G_CALLBACK(scroll_scale_quality), view);
1313 gtk_fixed_put (GTK_FIXED (ogl_edit -> render_fix), quality_scale, 20, 0);
1314 if (! preferences)
1315 {
1316 GtkWidget * fmodel = create_combo ();
1317 gtk_fixed_put (GTK_FIXED (ogl_edit -> render_fix), fmodel, 120, 10);
1318 combo_text_append (fmodel, _("Filled"));
1319 combo_text_append (fmodel, _("Lines"));
1320 combo_text_append (fmodel, _("Points"));
1321 g_signal_connect (G_OBJECT (fmodel), "changed", G_CALLBACK(set_f_model), view);
1322 gtk_widget_set_size_request (fmodel, 100, -1);
1323 combo_set_active (fmodel, view -> anim -> last -> img -> render);
1324 }
1325 widget_set_sensitive (ogl_edit -> render_fix, (view) ? ! view -> anim -> last -> img -> ray_tracing : ! tmp_opengl[4]);
1326
1327 return fix;
1328}
1329
1338GtkWidget * lightning_fix (glwin * view, Material * this_material)
1339{
1340 GtkWidget * fix = gtk_fixed_new ();
1341 GtkWidget * lmodel = create_combo ();
1342 gtk_fixed_put (GTK_FIXED (fix), lmodel, 0, 10);
1343
1344 char * l_model[6] = {i18n("None"), "Phong", "Blinn", "Cook-Torrance-Blinn", "Cook-Torrance-Beckmann", "Cook-Torrance-GCX"};
1345 int i;
1346 for (i=0; i<6; i++)
1347 {
1348 combo_text_append (lmodel, l_model[i]);
1349 }
1350 g_signal_connect (G_OBJECT (lmodel), "changed", G_CALLBACK(set_l_model), view);
1351 gtk_widget_set_size_request (lmodel, 200, -1);
1352 combo_set_active (lmodel, this_material -> param[0]);
1353 return fix;
1354}
1355
1365GtkWidget * materials_tab (glwin * view, opengl_edition * ogl_edit, Material * the_mat)
1366{
1367 GtkWidget * layout = create_layout (-1, 300);
1368 GtkWidget * vbox = add_vbox_to_layout (layout, 650, -1);
1369 int i;
1370 GtkWidget * box, * hbox;
1371
1372 gchar * str = g_strdup_printf ("<b>%s</b> ", _("Quality"));
1373 box = adv_box (vbox, str, 5, 150, 0.0);
1374 g_free (str);
1375 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, rendering_fix (view, ogl_edit), FALSE, FALSE, 0);
1376
1377 str = g_strdup_printf ("<b>%s</b> ", _("Lightning model"));
1378 box = adv_box (vbox, str, 5, 150, 0.0);
1379 g_free (str);
1380 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, lightning_fix (view, the_mat), FALSE, FALSE, 0);
1381 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 20);
1382
1383 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox,
1384 check_button (_("<b>Use template</b>"), 100, 40, the_mat -> predefine, G_CALLBACK(set_use_template_toggle), view),
1385 FALSE, FALSE, 0);
1386
1387 hbox = create_hbox (BSEP);
1388 str = g_strdup_printf ("<b>%s</b> ", _("Templates"));
1389 add_box_child_start (GTK_ORIENTATION_VERTICAL, hbox, markup_label (str, 150, -1, 0.0, 0.5), FALSE, FALSE, 50);
1390 g_free (str);
1391 gchar * material_template[TEMPLATES] = {i18n("Opaque"),
1392 i18n("Brushed Metal"),
1393 i18n("Shiny Metal"),
1394 i18n("Plastic"),
1395 i18n("Transparent"),
1396 i18n("Translucent"),
1397 i18n("Diffuse")};
1398 ogl_edit -> templates = create_combo ();
1399 for (i=0; i<TEMPLATES; i++)
1400 {
1401 combo_text_append (ogl_edit -> templates, _(material_template[i]));
1402 }
1403 combo_set_active (ogl_edit -> templates, the_mat -> predefine-1);
1404 g_signal_connect (G_OBJECT (ogl_edit -> templates), "changed", G_CALLBACK(set_template), view);
1405 gtk_widget_set_size_request (ogl_edit -> templates, 100, -1);
1406 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ogl_edit -> templates, FALSE, FALSE, 0);
1407 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1408 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 20);
1409 hbox = create_hbox (0);
1410 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1411 ogl_edit -> param_mat = create_vbox (BSEP);
1412 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ogl_edit -> param_mat, FALSE, FALSE, 50);
1413
1414 ogl_edit -> param_mat = create_vbox (BSEP);
1415 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, ogl_edit -> param_mat, FALSE, FALSE, 0);
1416
1417 bdv_box (ogl_edit -> param_mat, _("<b>Material properties</b>"), 250, -1);
1418
1419 GtkWidget * m_fixed;
1420 for (i=0; i<5; i++)
1421 {
1422 str = g_strdup_printf ("<u>%s:</u>", _(ogl_settings[0][i+1]));
1423 box = adv_box (ogl_edit -> param_mat, str, 0, 130, 0.0);
1424 g_free (str);
1425 ogl_edit -> m_scale[i] = create_hscale (mat_min_max[i][0], mat_min_max[i][1], 0.001, the_mat -> param[i+1],
1426 GTK_POS_TOP, 3, 200, G_CALLBACK(scale_param), G_CALLBACK(scroll_scale_param), & ogl_edit -> pointer[i]);
1427 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, ogl_edit -> m_scale[i], FALSE, FALSE, 10);
1428 ogl_edit -> m_entry[i] = create_entry (G_CALLBACK(update_mat_param), 100, 15, FALSE, & ogl_edit -> pointer[i]);
1429 update_entry_double(GTK_ENTRY(ogl_edit -> m_entry[i]), the_mat -> param[i+1]);
1430 m_fixed = gtk_fixed_new ();
1431 gtk_fixed_put (GTK_FIXED(m_fixed), ogl_edit -> m_entry[i], 0, 15);
1432 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, m_fixed, FALSE, FALSE, 15);
1433 }
1434 float values[] = {the_mat -> albedo.x, the_mat -> albedo.y, the_mat -> albedo.z};
1435 str = g_strdup_printf ("<u>%s:</u>", _(ogl_settings[0][0]));
1436 add_box_child_start (GTK_ORIENTATION_VERTICAL, ogl_edit -> param_mat, create_setting_pos (str, 130, -1, 0, 0, values, ogl_edit), FALSE, FALSE, 10);
1437 g_free (str);
1439 widget_set_sensitive (ogl_edit -> templates, the_mat -> predefine);
1440 widget_set_sensitive (ogl_edit -> param_mat, ! the_mat -> predefine);
1441 return layout;
1442}
1443
1444// ***************** FOG ******************* //
1445
1446GtkWidget * fogtype;
1447
1457void fog_param_changed (gpointer data, GLfloat u, GtkRange * range)
1458{
1459 dint * fid = (dint *)data;
1460 Fog * this_fog;
1461 opengl_edition * ogl_edit;
1462 glwin * view;
1463 if (! preferences)
1464 {
1465 view = get_project_by_id (fid -> a) -> modelgl;
1466 this_fog = & view -> anim -> last -> img -> f_g;
1467 ogl_edit = view -> opengl_win;
1468 }
1469 else
1470 {
1471 this_fog = & tmp_fog;
1472 ogl_edit = pref_ogl_edit;
1473 }
1474 GLfloat v, w;
1475 if (fid -> b > 0)
1476 {
1477 v = this_fog -> depth[0];
1478 w = this_fog -> depth[1];
1479 if (fid -> b == 1 && u < w)
1480 {
1481 this_fog -> depth[0] = u;
1482 }
1483 else if (fid -> b == 2 && u > v)
1484 {
1485 this_fog -> depth[1] = u;
1486 }
1487 else if (ogl_edit)
1488 {
1489 if (fid -> b == 1)
1490 {
1491 gtk_range_set_value (range, (gdouble) (w-0.1));
1492 }
1493 else
1494 {
1495 gtk_range_set_value (range, (gdouble) (v+0.1));
1496 }
1497 }
1498 }
1499 else
1500 {
1501 this_fog -> density = u;
1502 }
1503 if (! preferences) update (view);
1504}
1505
1516G_MODULE_EXPORT gboolean scroll_set_fog_param (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data)
1517{
1518 fog_param_changed (data, (GLfloat) value, range);
1519 return FALSE;
1520}
1521
1530G_MODULE_EXPORT void set_fog_param (GtkRange * range, gpointer data)
1531{
1532 fog_param_changed (data, (GLfloat) gtk_range_get_value (range), range);
1533}
1534
1543G_MODULE_EXPORT void set_fog_type (GtkWidget * widg, gpointer data)
1544{
1545 opengl_edition * ogl_edit = (opengl_edition *)data;
1546 Fog * this_fog;
1547 glwin * view;
1548 if (! preferences)
1549 {
1550 view = get_project_by_id (ogl_edit -> proj) -> modelgl;
1551 this_fog = & view -> anim -> last -> img -> f_g;
1552 }
1553 else
1554 {
1555 this_fog = & tmp_fog;
1556 }
1557 this_fog -> based = combo_get_active (widg);
1558 if (! preferences) update (view);
1559}
1560
1569void setup_fog_dialogs (opengl_edition * ogl_edit, int fid)
1570{
1571 Fog * this_fog;
1572 glwin * view;
1573 if (! preferences)
1574 {
1575 view = get_project_by_id (ogl_edit -> proj) -> modelgl;
1576 this_fog = & view -> anim -> last -> img -> f_g;
1577 }
1578 else
1579 {
1580 this_fog = & tmp_fog;
1581 }
1582 this_fog -> mode = fid;
1583 widget_set_sensitive (fogtype, (this_fog -> mode == 1) ? TRUE : FALSE);
1584 if (this_fog -> mode) combo_set_active (fogtype, 0);
1585 if (this_fog -> mode)
1586 {
1587 show_the_widgets (ogl_edit -> param_fog);
1588 if (this_fog -> mode == 1)
1589 {
1590 show_the_widgets (ogl_edit -> depth_box);
1591 hide_the_widgets (ogl_edit -> dens_box);
1592 }
1593 else
1594 {
1595 hide_the_widgets (ogl_edit -> depth_box);
1596 show_the_widgets (ogl_edit -> dens_box);
1597 }
1598 }
1599 else
1600 {
1601 hide_the_widgets (ogl_edit -> param_fog);
1602 }
1603 if (! preferences) update (view);
1604}
1605
1614G_MODULE_EXPORT void set_fog_mode (GtkWidget * widg, gpointer data)
1615{
1617}
1618
1628GtkWidget * fog_tab (glwin * view, opengl_edition * ogl_edit, Fog * the_fog)
1629{
1630 GtkWidget * layout = create_layout (480, -1);
1631 GtkWidget * vbox = add_vbox_to_layout (layout, 480, -1);
1632
1633 GtkWidget * box = adv_box (vbox, _("<b>Fog mode</b> "), 10, 150, 0.0);
1634 GtkWidget * fogmod = create_combo ();
1635 combo_text_append (fogmod, _("None"));
1636 combo_text_append (fogmod, _("Linear"));
1637 combo_text_append (fogmod, _("Exponential"));
1638 combo_text_append (fogmod, _("Exponential Squared"));
1639 gtk_widget_set_size_request (fogmod, 200, -1);
1640 combo_set_active (fogmod, the_fog -> mode);
1641 g_signal_connect (G_OBJECT (fogmod), "changed", G_CALLBACK(set_fog_mode), ogl_edit);
1642 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, fogmod, FALSE, FALSE, 0);
1643
1644 ogl_edit -> param_fog = create_vbox (BSEP);
1645 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, ogl_edit -> param_fog, FALSE, FALSE, 0);
1646
1647 box = adv_box (ogl_edit -> param_fog, _("<b>Fog type</b> "), 5, 150, 0.0);
1648 fogtype = create_combo ();
1649 combo_text_append (fogtype, _("Plane Based"));
1650 combo_text_append (fogtype, _("Range Based"));
1651 gtk_widget_set_size_request (fogtype, 200, -1);
1652 combo_set_active (fogtype, the_fog -> mode);
1653 g_signal_connect (G_OBJECT (fogtype), "changed", G_CALLBACK(set_fog_type), ogl_edit);
1654 widget_set_sensitive (fogtype, (the_fog -> mode == 1) ? TRUE : FALSE);
1655 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, fogtype, FALSE, FALSE, 0);
1656
1657 ogl_edit -> dens_box = adv_box (ogl_edit -> param_fog, _("<b>Fog density</b>"), 10, 150.0, 0.0);
1658 ogl_edit -> fog_range[0] = create_hscale (0.0, 1.0, 0.01, the_fog -> density, GTK_POS_TOP, 3,
1659 250, G_CALLBACK(set_fog_param), G_CALLBACK(scroll_set_fog_param), & ogl_edit -> pointer[0]);
1660 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ogl_edit -> dens_box, ogl_edit -> fog_range[0], FALSE, FALSE, 0);
1661
1662 gchar * depthfog[2] = {_("\t depth<sup>*</sup> start: "), _("\t depth<sup>*</sup> end: ")};
1663
1664 ogl_edit -> depth_box = create_vbox (5);
1665 add_box_child_start (GTK_ORIENTATION_VERTICAL, ogl_edit -> param_fog, ogl_edit -> depth_box, FALSE, FALSE, 0);
1666 box = adv_box (ogl_edit -> depth_box, _("<b>Fog depth</b>"), 10, 150.0, 0.0);
1667 int i;
1668 for (i=0; i<2; i++)
1669 {
1670 box = adv_box (ogl_edit -> depth_box, depthfog[i], 5, 170, 0.0);
1671 ogl_edit -> fog_range[i+1] = create_hscale (0.0, 100.0, 0.1, the_fog -> depth[i], GTK_POS_TOP, 2,
1672 250, G_CALLBACK(set_fog_param), G_CALLBACK(scroll_set_fog_param), & ogl_edit -> pointer[i+1]);
1673 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, ogl_edit -> fog_range[i+1], FALSE, FALSE, 0);
1674 }
1675 add_box_child_start (GTK_ORIENTATION_VERTICAL, ogl_edit -> depth_box, markup_label(_("* % of the OpenGL model depth."), -1, -1, 0.5, 0.5) , FALSE, FALSE, 5);
1676
1677 float values[] = {the_fog -> color.x, the_fog -> color.y, the_fog -> color.z};
1678 add_box_child_start (GTK_ORIENTATION_VERTICAL, ogl_edit -> param_fog, create_setting_pos (_(ogl_settings[2][0]), 130, 0.0, 4, 0, values, ogl_edit), FALSE, FALSE, 5);
1680 return layout;
1681}
1682
1690void close_advanced_opengl (gpointer data)
1691{
1692 glwin * view = (glwin *)data;
1693 view -> opengl_win -> win = destroy_this_widget (view -> opengl_win -> win);
1694 g_free (view -> opengl_win);
1695 view -> opengl_win = NULL;
1696}
1697
1698#ifdef GTK4
1707G_MODULE_EXPORT gboolean close_advanced (GtkWidget * window, gpointer data)
1708#else
1718G_MODULE_EXPORT gboolean close_advanced (GtkWidget * widg, GdkEvent * event, gpointer data)
1719#endif
1720{
1721 close_advanced_opengl (data);
1722 return FALSE;
1723}
1724
1733G_MODULE_EXPORT void opengl_advanced (GtkWidget * widg, gpointer data)
1734{
1735 glwin * view = (glwin *)data;
1736 if (view -> opengl_win == NULL)
1737 {
1738 view -> opengl_win = g_malloc0(sizeof*view -> opengl_win);
1739 view -> opengl_win -> proj = view -> proj;
1740 int i;
1741 for (i=0; i<6; i++)
1742 {
1743 view -> opengl_win -> pointer[i].a = view -> proj;
1744 view -> opengl_win -> pointer[i].b = i;
1745 }
1746 gchar * str = g_strdup_printf (_("OpenGL material aspect and light settings - %s"), get_project_by_id(view -> proj) -> name);
1747 view -> opengl_win -> win = create_win (str, view -> win, FALSE, FALSE);
1748 g_free (str);
1749#ifdef DEBUG
1750 gtk_window_set_resizable (GTK_WINDOW (view -> opengl_win -> win), TRUE);
1751#endif
1752 GtkWidget * vbox = create_vbox (5);
1753 add_container_child (CONTAINER_WIN, view -> opengl_win -> win, vbox);
1754
1755 GtkWidget * notebook = gtk_notebook_new ();
1756#ifdef GTK4
1757 gtk_widget_set_size_request (notebook, 580, 670);
1758#else
1759 gtk_widget_set_size_request (notebook, 580, 670);
1760#endif
1761 show_the_widgets (notebook);
1762#ifdef GTK4
1763 gtk_widget_set_vexpand (notebook, TRUE);
1764#endif
1765 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, notebook, TRUE, TRUE, 0);
1766 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), materials_tab (view, view -> opengl_win, & view -> anim -> last -> img -> m_terial),
1767 markup_label(_("<b>Material aspect</b>"), -1, -1, 0.0, 0.5));
1768 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), lights_tab (view, view -> opengl_win, & view -> anim -> last -> img -> l_ghtning),
1769 markup_label(_("<b>Configure light sources</b>"), -1, -1, 0.0, 0.5));
1770 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), fog_tab (view, view -> opengl_win, & view -> anim -> last -> img -> f_g),
1771 markup_label(_("<b>Configure fog</b>"), -1, -1, 0.0, 0.5));
1772 add_global_option (vbox, & view -> colorp[0][0]);
1773 add_gtk_close_event (view -> opengl_win -> win, G_CALLBACK(close_advanced), view);
1774 }
1775 show_the_widgets (view -> opengl_win -> win);
1776 update_light_data (0, view -> opengl_win);
1777 setup_fog_dialogs (view -> opengl_win, view -> anim -> last -> img -> f_g.mode);
1778}
color colorp[64]
gchar * param[2]
PangoLayout * layout
Definition curve.c:80
float val
Definition dlp_init.c:117
void init_default_shaders(glwin *view)
re-initialize the default OpenGL shaders
int * allocint(int val)
allocate an int * pointer
Definition global.c:301
#define i18n(String)
Definition global.c:80
double string_to_double(gpointer string)
convert string to double
Definition global.c:611
Global variable declarations Global convenience function declarations Global data structure defin...
void run_this_gtk_dialog(GtkWidget *dial, GCallback handler, gpointer data)
run a GTK (3 and 4) basic GtkDialog
Definition gtk-misc.c:533
int combo_get_active(GtkWidget *combo)
retrieve the active item's position
Definition gtk-misc.c:935
GtkWidget * create_entry(GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
Create a GtkEntry.
Definition gtk-misc.c:1401
void update_entry_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as double
Definition gtk-misc.c:688
void append_comments(GtkWidget *vbox, gchar *symbol, gchar *legend)
append comments to a vertical box
Definition gtk-misc.c:2048
GtkWidget * create_win(gchar *str, GtkWidget *parent, gboolean modal, gboolean resiz)
create a new GtkWindow
Definition gtk-misc.c:486
project * proj
void combo_set_active(GtkWidget *combo, int pos)
set the active item's position
Definition gtk-misc.c:958
GtkWidget * add_vbox_to_layout(GtkWidget *layout, int size_x, int size_y)
Insert a vertical GtkBox in a GtkLatout then send back the GtkBox.
Definition gtk-misc.c:900
const gchar * entry_get_text(GtkEntry *entry)
get the text in a GtkEntry
Definition gtk-misc.c:652
#define BSEP
Definition global.h:261
void add_gtk_close_event(GtkWidget *widg, GCallback handler, gpointer data)
add a close event signal and callback to a GtkWidget
Definition gtk-misc.c:2557
void button_set_status(GtkWidget *button, int status)
set status of check / toggle button
Definition gtk-misc.c:1916
void add_global_option(GtkWidget *vbox, tint *oid)
add a button to update global user preferences
GtkWidget * spin_button(GCallback handler, double value, double start, double end, double step, int digits, int dim, gpointer data)
create a spin button
Definition gtk-misc.c:1877
GtkWidget * check_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a check button
Definition gtk-misc.c:1937
@ CONTAINER_WIN
Definition global.h:266
GtkWidget * create_combo()
create a GtkCombox widget, note deprecated in GTK4
Definition gtk-misc.c:1010
GtkWidget * dialog_get_content_area(GtkWidget *widg)
prepare GtkWidget to insert content in a GtkDialog window
Definition gtk-misc.c:861
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1672
void add_box_child_start(int orientation, GtkWidget *widg, GtkWidget *child, gboolean expand, gboolean fill, int padding)
Add a GtkWidget in a GtkBox at the initial position.
Definition gtk-misc.c:340
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:247
void destroy_this_dialog(GtkDialog *dialog)
destroy a GtkDialog
Definition gtk-misc.c:2235
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:849
void combo_text_append(GtkWidget *combo, gchar *text)
append text in GtkComboBox widget
Definition gtk-misc.c:987
GtkWidget * create_layout(int x, int y)
create a GtkLayout / GtkFixed widget
Definition gtk-misc.c:916
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2213
GtkWidget * create_hscale(float min, float max, float delta, float val, int pos, int round, int size, GCallback handler, GCallback scroll_handler, gpointer data)
create an horizontal scale GtkWidget
Definition gtk-misc.c:780
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:267
GtkWidget * message_dialogmodal(gchar *message, gchar *title, GtkMessageType mtype, GtkButtonsType buttons, GtkWidget *parent)
create a modal (cannot be ignored) message window
Definition gtk-misc.c:573
void hide_the_widgets(GtkWidget *widg)
hide GtkWidget
Definition gtk-misc.c:224
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:837
int button_get_status(GtkWidget *button)
get status of check / toggle button
Definition gtk-misc.c:1899
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:202
project * get_project_by_id(int p)
get project pointer using id number
Definition project.c:120
void update(glwin *view)
update the rendering of the OpenGL window
Definition glview.c:461
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
#define DEFAULT_INTENSITY
Default light intensity.
Definition glview.h:94
gchar * material_template[TEMPLATES]
void init_shaders(glwin *view)
initialize all the OpenGL shaders
#define TEMPLATES
Number of material templates.
Definition glview.h:80
render
Definition glview.h:191
GLfloat template_parameters[TEMPLATES][5]
Definition w_advance.c:100
@ LIGHT
Definition glwin.h:100
Function declarations for the creation of the OpenGL window.
void show_warning(char *warning, GtkWidget *win)
show warning
Definition interface.c:266
Messaging function declarations.
position
Definition m_proj.c:48
double z
Definition ogl_draw.c:63
double y
Definition ogl_draw.c:63
double x
Definition ogl_draw.c:63
opengl_edition * pref_ogl_edit
GtkWidget * lights_tab(glwin *view, opengl_edition *ogl_edit, Lightning *the_light)
OpenGL light(s) parameters tab.
Definition w_advance.c:897
GtkWidget * materials_tab(glwin *view, opengl_edition *ogl_edit, Material *the_mat)
OpenGL material parameters tab.
Definition w_advance.c:1365
Material tmp_material
G_MODULE_EXPORT gboolean scroll_scale_quality(GtkRange *range, GtkScrollType scroll, gdouble value, gpointer data)
update OpenGL quality - scroll callback
Definition w_advance.c:1265
int * tmp_opengl
GtkWidget * fog_tab(glwin *view, opengl_edition *ogl_edit, Fog *the_fog)
OpenGL fog parameters tab.
Definition w_advance.c:1628
float mat_min_max[5][2]
Definition w_advance.c:108
Lightning tmp_lightning
GtkWidget * lightning_fix(glwin *view, Material *this_material)
Definition w_advance.c:1338
G_MODULE_EXPORT void scale_quality(GtkRange *range, gpointer data)
update OpenGL quality - range callback
Definition w_advance.c:1282
gboolean preferences
Fog tmp_fog
Preference variable declarations.
Definition glwin.h:234
Definition glwin.h:182
vec3_t spot_data
Definition glwin.h:190
vec3_t direction
Definition glwin.h:187
vec3_t attenuation
Definition glwin.h:189
int type
Definition glwin.h:183
vec3_t position
Definition glwin.h:186
vec3_t intensity
Definition glwin.h:188
Definition glwin.h:350
Definition global.h:111
Definition glwin.h:967
Definition global.h:118
float y
Definition math_3d.h:130
float x
Definition math_3d.h:130
float z
Definition math_3d.h:130
Light * init_light_source(int type, float size)
initialize a light source
Definition w_advance.c:336
G_MODULE_EXPORT void set_f_model(GtkComboBox *box, gpointer data)
change OpenGL filling model
Definition w_advance.c:1147
GtkWidget * d_close
Definition w_advance.c:172
G_MODULE_EXPORT void set_light_fix(GtkComboBox *box, gpointer data)
set light fix callback
Definition w_advance.c:792
void print_light_source(Light source, int i)
print light source data
Definition w_advance.c:298
G_MODULE_EXPORT void set_use_template_toggle(GtkToggleButton *but, gpointer data)
use or not OpenGL material template callback GTK3
Definition w_advance.c:1009
GtkWidget * materials_tab(glwin *view, opengl_edition *ogl_edit, Material *the_mat)
OpenGL material parameters tab.
Definition w_advance.c:1365
G_MODULE_EXPORT void set_object_pos(GtkEntry *res, gpointer data)
set object position
Definition w_advance.c:714
G_MODULE_EXPORT void set_nlights_spin(GtkSpinButton *res, gpointer data)
change the number of light(s) - spin button
Definition w_advance.c:630
void set_quality(int q, glwin *view)
set OpenGL quality
Definition m_quality.c:54
G_MODULE_EXPORT void set_template(GtkComboBox *box, gpointer data)
change the OpenGL material template
Definition w_advance.c:1073
G_MODULE_EXPORT void set_fog_mode(GtkWidget *widg, gpointer data)
set fog mode callback
Definition w_advance.c:1614
G_MODULE_EXPORT void set_fog_type(GtkWidget *widg, gpointer data)
set OpenGL fog type
Definition w_advance.c:1543
void setup_fog_dialogs(opengl_edition *ogl_edit, int fid)
update OpenGL fog tab based of fog type
Definition w_advance.c:1569
void fog_param_changed(gpointer data, GLfloat u, GtkRange *range)
update OpenGL fog parameter
Definition w_advance.c:1457
G_MODULE_EXPORT void opengl_advanced(GtkWidget *widg, gpointer data)
create OpenGL rendering advanced window
Definition w_advance.c:1733
int * light_source_to_be_removed(int val, Lightning *ogl_lightning, opengl_edition *ogl_edit)
remove light source(s) - creating the dialog
Definition w_advance.c:259
G_MODULE_EXPORT gboolean scroll_scale_quality(GtkRange *range, GtkScrollType scroll, gdouble value, gpointer data)
update OpenGL quality - scroll callback
Definition w_advance.c:1265
GtkWidget ** light_but
Definition w_advance.c:216
gchar * lpos[3]
Definition w_advance.c:132
int status
Definition w_advance.c:173
G_MODULE_EXPORT void update_mat_param(GtkEntry *res, gpointer data)
update OpenGL material parameter - entry
Definition w_advance.c:1219
GtkWidget * fog_tab(glwin *view, opengl_edition *ogl_edit, Fog *the_fog)
OpenGL fog parameters tab.
Definition w_advance.c:1628
G_MODULE_EXPORT void show_this_light(GtkToggleButton *but, gpointer data)
show / hide this light callback GTK3
Definition w_advance.c:834
G_MODULE_EXPORT gboolean scroll_set_fog_param(GtkRange *range, GtkScrollType scroll, gdouble value, gpointer data)
update OpenGL fog parameter - scroll callback
Definition w_advance.c:1516
void close_advanced_opengl(gpointer data)
close OpenGL rendering window free data
Definition w_advance.c:1690
void show_active_light_data(opengl_edition *ogl_win, int lid, int tid)
show active light data
Definition w_advance.c:422
G_MODULE_EXPORT void show_light_param(GtkComboBox *box, gpointer data)
update light parameters based on light id in combo box
Definition w_advance.c:499
void update_light_data(int li, opengl_edition *ogl_win)
update light data
Definition w_advance.c:464
GtkWidget * rendering_fix(glwin *view, opengl_edition *ogl_edit)
Definition w_advance.c:1298
G_MODULE_EXPORT gboolean close_advanced(GtkWidget *widg, GdkEvent *event, gpointer data)
close OpenGL rendering advanced window callback GTK3
Definition w_advance.c:1718
G_MODULE_EXPORT void scale_param(GtkRange *range, gpointer data)
update OpenGL material parameter - range callback
Definition w_advance.c:1250
gchar * ogl_settings[3][10]
Definition w_advance.c:114
Light ** copy_light_sources(int dima, int dimb, Light **old_sp)
create a copy of a list of light sources
Definition w_advance.c:400
GtkWidget * lightning_fix(glwin *view, Material *this_material)
Definition w_advance.c:1338
GtkWidget * fogtype
Definition w_advance.c:1446
GtkWidget * create_setting_pos(gchar *lab, int size, float xalign, int pid, int lid, float *values, opengl_edition *ogl_win)
create OpenGL setting entries table
Definition w_advance.c:858
void set_data_pos(vec3_t *vect, int pos, double v)
modify a vector component
Definition w_advance.c:690
int * light_list
Definition w_advance.c:215
G_MODULE_EXPORT void set_fog_param(GtkRange *range, gpointer data)
update OpenGL fog parameter - range callback
Definition w_advance.c:1530
G_MODULE_EXPORT void update_light_param(GtkEntry *res, gpointer data)
update light parameter
Definition w_advance.c:643
G_MODULE_EXPORT void toggled_delete_ligth(GtkToggleButton *but, gpointer data)
toggle delete light callback GTK3
Definition w_advance.c:194
void add_remove_lights(int val, gpointer data)
add or remove lights
Definition w_advance.c:537
GtkWidget * adv_box(GtkWidget *box, char *lab, int vspace, int size, float xalign)
create a box with markup label
Definition w_advance.c:146
gchar * cpos[3]
Definition w_advance.c:133
G_MODULE_EXPORT void scale_quality(GtkRange *range, gpointer data)
update OpenGL quality - range callback
Definition w_advance.c:1282
G_MODULE_EXPORT void set_l_model(GtkComboBox *box, gpointer data)
change OpenGL lightning model
Definition w_advance.c:1163
GtkWidget * bdv_box(GtkWidget *box, char *lab, int size, float xalign)
create a box with markup label
Definition w_advance.c:164
void param_has_changed(gpointer data, double val)
update OpenGL material parameter
Definition w_advance.c:1185
G_MODULE_EXPORT void set_r_model(GtkComboBox *box, gpointer data)
change OpenGL rendering model
Definition w_advance.c:1121
GtkWidget * lights_tab(glwin *view, opengl_edition *ogl_edit, Lightning *ogl_lightning)
OpenGL light(s) parameters tab.
Definition w_advance.c:897
Light * copy_light_source(Light *old_sp)
create a copy of a light source
Definition w_advance.c:377
G_MODULE_EXPORT gboolean scroll_scale_param(GtkRange *range, GtkScrollType scroll, gdouble value, gpointer data)
update OpenGL material parameter - scroll callback
Definition w_advance.c:1236
G_MODULE_EXPORT void set_light_type(GtkComboBox *box, gpointer data)
set light type callback
Definition w_advance.c:776
G_MODULE_EXPORT void run_light_source_to_be_removed(GtkDialog *win, gint response_id, gpointer data)
remove light source(s) - running the dialog
Definition w_advance.c:227
void create_lights_combo(int num_lights, opengl_edition *ogl_win)
create light combo box
Definition w_advance.c:513
GtkWidget * res[2]
Definition w_encode.c:342
GtkWidget * hbox
Definition workspace.c:71
GtkWidget * img
Definition workspace.c:70
GtkWidget * vbox
Definition workspace.c:72
GtkWidget * lab
Definition workspace.c:73