atomes 1.2.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-2025 by CNRS and University of Strasbourg */
15
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 set_nlights (GtkEntry * res, gpointer data);
58 G_MODULE_EXPORT void update_light_param (GtkEntry * res, gpointer data);
59 G_MODULE_EXPORT void set_object_pos (GtkEntry * res, gpointer data);
60 G_MODULE_EXPORT void set_light_type (GtkComboBox * box, gpointer data);
61 G_MODULE_EXPORT void set_light_fix (GtkComboBox * box, gpointer data);
62 G_MODULE_EXPORT void show_this_light (GtkCheckButton * but, gpointer data);
63 G_MODULE_EXPORT void show_this_light (GtkToggleButton * but, gpointer data);
64 G_MODULE_EXPORT void set_use_template_toggle (GtkCheckButton * but, gpointer data);
65 G_MODULE_EXPORT void set_use_template_toggle (GtkToggleButton * but, gpointer data);
66 G_MODULE_EXPORT void set_template (GtkComboBox * box, gpointer data);
67 G_MODULE_EXPORT void set_l_model (GtkComboBox * box, gpointer data);
68 G_MODULE_EXPORT void update_mat_param (GtkEntry * res, gpointer data);
69 G_MODULE_EXPORT void scale_param (GtkRange * range, gpointer data);
70 G_MODULE_EXPORT void scale_quality (GtkRange * range, gpointer data);
71 G_MODULE_EXPORT void set_fog_param (GtkRange * range, gpointer data);
72 G_MODULE_EXPORT void set_fog_type (GtkWidget * widg, gpointer data);
73 G_MODULE_EXPORT void set_fog_mode (GtkWidget * widg, gpointer data);
74 G_MODULE_EXPORT void opengl_advanced (GtkWidget * widg, gpointer data);
75
76 GtkWidget * adv_box (GtkWidget * box, char * lab, int vspace, int size, float xalign);
77 GtkWidget * bdv_box (GtkWidget * box, char * lab, int size, float xalign);
78 GtkWidget * GtkWidget * create_setting_pos (gchar * lab, int size, float xalign, int pid, int lid, float * values, opengl_edition * ogl_win);
79 GtkWidget * lights_tab (glwin * view, opengl_edition * ogl_edit, Lightning * the_light);
80 GtkWidget * materials_tab (glwin * view, opengl_edition * ogl_edit, Material * the_mat);
81 GtkWidget * fog_tab (glwin * view, opengl_edition * ogl_edit, Fog * the_fog);
82
83 Light init_light_source (int type, float val, float vbl);
84 Light copy_light_source (Light old_sp);
85 Light * copy_light_sources (int dima, int dimb, Light * old_sp);
86
87*/
88
89#include "global.h"
90#include "interface.h"
91#include "preferences.h"
92#include "glview.h"
93#include "glwindow.h"
94
95extern void set_quality (int q, glwin * view);
96
97gchar * material_template[TEMPLATES] = {"Opaque",
98 "Brushed metal",
99 "Shiny metal",
100 "Plastic",
101 "Transparent",
102 "Translucent",
103 "Diffuse"};
104
105GLfloat template_parameters[TEMPLATES][5] ={{0.50, 0.50, 0.90, 1.00, 1.00}, // Ok
106 {0.90, 0.60, 1.00, 1.50, 1.00}, // Ok
107 {0.80, 0.40, 1.00, 1.00, 1.00}, // Ok
108 {0.35, 0.15, 1.00, 1.50, 1.00}, // Ok
109 {0.50, 0.50, 0.50, 1.00, 0.50}, //
110 {0.50, 0.50, 0.50, 1.00, 0.75}, //
111 {0.35, 0.80, 1.00, 1.50, 1.00}}; // Ok
112
113float mat_min_max[5][2] = {{0.0, 1.0},
114 {0.0, 1.0},
115 {0.0, 10.0},
116 {0.0, 10.0},
117 {0.0, 1.0}};
118
119gchar * ogl_settings[3][10] = {{"<u>Albedo:</u>",
120 "<u>Metallic:</u>",
121 "<u>Roughness:</u>",
122 "<u>Ambient occlusion:</u>",
123 "<u>Gamma correction:</u>",
124 "<u>Opacity:</u>"},
125 {"<u>Position:</u>",
126 "<u>Direction:</u>",
127 "<u>Intensity:</u>",
128 "<u>Constant attenuation:</u>",
129 "<u>Linear attenuation:</u>",
130 "<u>Quadratic attenuation:</u>",
131 "<u>Cone angle</u>",
132 "<u>Inner cutoff:</u>",
133 "<u>Outer cutoff:</u>",
134 "<u>Type:</u>"},
135 {"<b>Fog color</b>"}};
136
137gchar * lpos[3] = {"x", "y", "z"};
138gchar * cpos[3] = {"r", "g", "b"};
139
151GtkWidget * adv_box (GtkWidget * box, char * lab, int vspace, int size, float xalign)
152{
153 GtkWidget * hbox = create_hbox (BSEP);
154 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label(lab, size, -1, xalign, 0.5), FALSE, FALSE, 25);
155 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, FALSE, FALSE, vspace);
156 return hbox;
157}
158
169GtkWidget * bdv_box (GtkWidget * box, char * lab, int size, float xalign)
170{
171 GtkWidget * hbox = create_hbox (BSEP);
172 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, markup_label (lab, size, -1, xalign, 0.5), FALSE, FALSE, 15);
173 add_box_child_start (GTK_ORIENTATION_VERTICAL, box, hbox, FALSE, FALSE, 5);
174 return hbox;
175}
176
177GtkWidget * d_close;
179
180#ifdef GTK4
189G_MODULE_EXPORT void toggled_delete_ligth (GtkCheckButton * but, gpointer data)
190#else
199G_MODULE_EXPORT void toggled_delete_ligth (GtkToggleButton * but, gpointer data)
200#endif
201{
202 if (button_get_status ((GtkWidget *)but))
203 {
204 status --;
205 }
206 else
207 {
208 status ++;
209 }
210 if (status == 0)
211 {
213 }
214 else
215 {
217 }
218}
219
221GtkWidget ** light_but;
222
232G_MODULE_EXPORT void run_light_source_to_be_removed (GtkDialog * win, gint response_id, gpointer data)
233{
234 Lightning * ogl_lightning = (Lightning *)data;
235 int i, j;
236 j = 0;
237 for (i=0; i<ogl_lightning -> lights; i++)
238 {
239 if (button_get_status ((GtkWidget *)light_but[i]))
240 {
241 light_list[j] = i;
242 j ++;
243 }
244 }
246}
247
257int * light_source_to_be_removed (int val, Lightning * ogl_lightning, opengl_edition * ogl_edit)
258{
259 int i;
260 gchar * str;
261 status = val;
262 GtkWidget * win = dialogmodal ("Remove light source(s)", GTK_WINDOW(ogl_edit -> win));
263 GtkWidget * vbox = dialog_get_content_area (win);
264 d_close = gtk_dialog_get_widget_for_response (GTK_DIALOG (win), GTK_RESPONSE_CLOSE);
266 if (val > 1)
267 {
268 str = g_strdup_printf ("Please select the %d light sources to be removed: ", val);
269 }
270 else
271 {
272 str = g_strdup_printf ("Please select the %d light source to be removed: ", val);
273 }
274 bbox (vbox, str);
275 g_free (str);
276 light_but = g_malloc (ogl_lightning -> lights * sizeof*light_but);
277 for (i=0; i<ogl_lightning -> lights; i++)
278 {
279 str = g_strdup_printf ("Light N°%d", i+1);
280 light_but[i] = check_button (str, -1, 40, FALSE, G_CALLBACK(toggled_delete_ligth), (gpointer)GINT_TO_POINTER(i));
281 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, light_but[i], TRUE, TRUE, 0);
282 g_free (str);
283 }
285 run_this_gtk_dialog (win, G_CALLBACK(run_light_source_to_be_removed), ogl_lightning);
286 return light_list;
287}
288
297void print_light_source (Light source, int i)
298{
299 g_debug ("\n");
300 g_debug ("Light N°%d", i);
301 g_debug ("Type= %d", source.type);
302 g_debug ("Pos_x= %f, Pos_y= %f, Pos_z= %f", source.position.x, source.position.y, source.position.z);
303 g_debug ("Dir_x= %f, Dir_y= %f, Dir_z= %f", source.direction.x, source.direction.y, source.direction.z);
304 g_debug ("Int_r= %f, Int_g= %f, Int_b= %f", source.intensity.x, source.intensity.y, source.intensity.z);
305 g_debug ("Att_c= %f, Att_l= %f, Att_q= %f", source.attenuation.x, source.attenuation.y, source.attenuation.z);
306 g_debug ("Spo_a= %f, Spo_i= %f, Spo_o= %f", source.spot_data.x, source.spot_data.y, source.spot_data.z);
307 g_debug ("\n");
308}
309
310/*
311 Light attenuation table (from Ogre3D):
312 Distance(to object) Constant Linear Quadratic
313 7 1.0 0.7 1.8
314 13 1.0 0.35 0.44
315 20 1.0 0.22 0.20
316 32 1.0 0.14 0.07
317 50 1.0 0.09 0.032
318 65 1.0 0.07 0.017
319 100 1.0 0.045 0.0075
320 160 1.0 0.027 0.0028
321 200 1.0 0.022 0.0019
322 325 1.0 0.014 0.0007
323 600 1.0 0.007 0.0002
324 3250 1.0 0.0014 0.000007
325*/
326
337Light init_light_source (int type, float size, float depth)
338{
339 Light new_light;
340 new_light.type = type;
341 new_light.fix = (type != 1) ? 0 : 1;
342 new_light.show = 0;
343 new_light.direction = vec3(0.0, 0.0, 0.0);
344 double intensity = (type == 1) ? 100.0*DEFAULT_INTENSITY : DEFAULT_INTENSITY;
345 if (size != depth)
346 {
347 intensity *= exp (size/depth);
348 }
349 if (! preferences && depth <= 50.0) intensity *= depth / 100.0;
350 new_light.intensity = vec3 (intensity, intensity, intensity);
351 new_light.attenuation = vec3 (1.0, 0.14, 0.07);
352 new_light.spot_data = vec3 (20.0, 20.0, 20.0);
353 if (type == 0)
354 {
355 new_light.position = vec3 (0.0, 0.0, 0.0);
356 new_light.direction = vec3 (0.0, 0.0, -1.0);
357 }
358 else
359 {
360 new_light.position = vec3 (depth*1.5, 0.0, 0.0);
361 if (type == 2)
362 {
363 new_light.intensity = v3_muls (new_light.intensity, 100.0);
364 float tan = (size * sqrt(2.0) / 2.0) / (depth - size);
365 float tetha = fabs(atanf (tan)) * 90.0 / pi;
366 new_light.spot_data = vec3 (tetha, tetha, tetha);
367 }
368 }
369 return new_light;
370}
371
380{
381 Light new_sp;
382 new_sp.type = old_sp.type;
383 new_sp.fix = old_sp.fix;
384 new_sp.show = old_sp.show;
385 new_sp.position = old_sp.position;
386 new_sp.direction = old_sp.direction;
387 new_sp.intensity = old_sp.intensity;
388 new_sp.attenuation = old_sp.attenuation;
389 new_sp.spot_data = old_sp.spot_data;
390 return new_sp;
391}
392
402Light * copy_light_sources (int dima, int dimb, Light * old_sp)
403{
404 int j;
405 Light * new_sp = g_malloc (dima*sizeof * new_sp);
406 for (j=0; j<dimb; j++)
407 {
408 //print_light_source (old_sp[j], j);
409 new_sp[j] = copy_light_source (old_sp[j]);
410 /*new_sp[j].type = old_sp[j].type;
411 new_sp[j].fix = old_sp[j].fix;
412 new_sp[j].show = old_sp[j].show;
413 new_sp[j].position = old_sp[j].position;
414 new_sp[j].direction = old_sp[j].direction;
415 new_sp[j].intensity = old_sp[j].intensity;
416 new_sp[j].attenuation = old_sp[j].attenuation;
417 new_sp[j].spot_data = old_sp[j].spot_data;*/
418 //print_light_source (new_sp[j], j);
419 }
420 return new_sp;
421}
422
432void show_active_light_data (opengl_edition * ogl_win, int lid, int tid)
433{
434 Light * this_light = (preferences) ? & tmp_lightning.spot[lid] : & get_project_by_id(ogl_win -> proj) -> modelgl -> anim -> last -> img -> l_ghtning.spot[lid];
435 this_light -> type = tid;
436
437 if (is_the_widget_visible(ogl_win -> advanced_light_box)) hide_the_widgets (ogl_win -> advanced_light_box);
438 widget_set_sensitive (ogl_win -> light_type, lid);
439 if (this_light -> type) show_the_widgets (ogl_win -> advanced_light_box);
440 int i;
441 for (i=0; i<2; i++)
442 {
443 if (is_the_widget_visible(ogl_win -> light_b_coord[i])) hide_the_widgets (ogl_win -> light_b_coord[i]);
444 if (is_the_widget_visible(ogl_win -> light_b_entry[i])) hide_the_widgets (ogl_win -> light_b_entry[i]);
445 }
446 if (this_light -> type)
447 {
448 show_the_widgets (ogl_win -> light_b_coord[0]);
449 show_the_widgets (ogl_win -> light_b_entry[0]);
450 }
451 if (this_light -> type == 0 || this_light -> type == 2)
452 {
453 show_the_widgets (ogl_win -> light_b_coord[1]);
454 }
455 if (this_light -> type == 2)
456 {
457 show_the_widgets (ogl_win -> light_b_entry[1]);
458 }
459 if (! preferences)
460 {
461 if (is_the_widget_visible(ogl_win -> light_show)) hide_the_widgets (ogl_win -> light_show);
462 if (this_light -> type) show_the_widgets (ogl_win -> light_show);
463 }
464}
465
474void update_light_data (int li, opengl_edition * ogl_win)
475{
476 Light * this_light;
477 if (! preferences)
478 {
479 this_light = & get_project_by_id(ogl_win -> proj) -> modelgl -> anim -> last -> img -> l_ghtning.spot[li];
480 }
481 else
482 {
483 this_light = & tmp_lightning.spot[li];
484 }
485 combo_set_active (ogl_win -> light_type, this_light -> type);
486 combo_set_active (ogl_win -> light_fix, this_light -> fix);
487 show_active_light_data (ogl_win, li, this_light -> type);
488 update_entry_double (GTK_ENTRY(ogl_win -> light_entry[0]), this_light -> attenuation.x);
489 update_entry_double (GTK_ENTRY(ogl_win -> light_entry[1]), this_light -> attenuation.y);
490 update_entry_double (GTK_ENTRY(ogl_win -> light_entry[2]), this_light -> attenuation.z);
491 update_entry_double (GTK_ENTRY(ogl_win -> light_entry[3]), this_light -> spot_data.x);
492 update_entry_double (GTK_ENTRY(ogl_win -> light_entry[4]), this_light -> spot_data.y);
493 update_entry_double (GTK_ENTRY(ogl_win -> light_entry[5]), this_light -> spot_data.z);
494 update_entry_double (GTK_ENTRY(ogl_win -> entogl[1][0]), this_light -> position.x);
495 update_entry_double (GTK_ENTRY(ogl_win -> entogl[1][1]), this_light -> position.y);
496 update_entry_double (GTK_ENTRY(ogl_win -> entogl[1][2]), this_light -> position.z);
497 update_entry_double (GTK_ENTRY(ogl_win -> entogl[2][0]), this_light -> direction.x);
498 update_entry_double (GTK_ENTRY(ogl_win -> entogl[2][1]), this_light -> direction.y);
499 update_entry_double (GTK_ENTRY(ogl_win -> entogl[2][2]), this_light -> direction.z);
500 update_entry_double (GTK_ENTRY(ogl_win -> entogl[3][0]), this_light -> intensity.x);
501 update_entry_double (GTK_ENTRY(ogl_win -> entogl[3][1]), this_light -> intensity.y);
502 update_entry_double (GTK_ENTRY(ogl_win -> entogl[3][2]), this_light -> intensity.z);
503 if (! preferences)
504 {
505 button_set_status (ogl_win -> light_show, this_light -> show);
506 }
507}
508
517G_MODULE_EXPORT void show_light_param (GtkComboBox * box, gpointer data)
518{
519 int li = combo_get_active ((GtkWidget *)box);
520 update_light_data (li, (opengl_edition *)data);
521}
522
531void create_lights_combo (int num_lights, opengl_edition * ogl_win)
532{
533 ogl_win -> lights = create_combo ();
534 int i;
535 gchar * str;
536 for (i=0; i<num_lights; i++)
537 {
538 str = g_strdup_printf ("Light N°%d", i+1);
539 combo_text_append (ogl_win -> lights, str);
540 g_free (str);
541 }
542 gtk_widget_set_size_request (ogl_win -> lights, 100, -1);
543 g_signal_connect (G_OBJECT (ogl_win -> lights), "changed", G_CALLBACK(show_light_param), ogl_win);
544 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ogl_win -> lights_box, ogl_win -> lights, FALSE, FALSE, 10);
545}
546
555void add_remove_lights (int val, gpointer data)
556{
557 int i, j, k, m;
558 project * this_proj;
559 glwin * view;
560 Lightning * this_lightning;
561 opengl_edition * ogl_edit;
562 if (! preferences)
563 {
564 view = (glwin *)data;
565 this_proj = get_project_by_id (view -> proj);
566 this_lightning = & view -> anim -> last -> img -> l_ghtning;
567 ogl_edit = view -> opengl_win;
568 }
569 else
570 {
571 this_lightning = & tmp_lightning;
572 ogl_edit = pref_ogl_edit;
573 }
574
575 gboolean delete_ligth;
576 i = this_lightning -> lights;
577 Light * old_spots;
578 if (val > i)
579 {
580#ifdef DEBUG
581 g_debug ("ADDING_LIGHT_SOURCE:: val= %d, i= %d", val, i);
582#endif
583 // Adding light source(s)
584 old_spots = copy_light_sources (i, i, this_lightning -> spot);
585 g_free (this_lightning -> spot);
586 this_lightning -> spot = copy_light_sources (val, i, old_spots);
587 this_lightning -> lights = val;
588 float pos = (preferences) ? 20.0 : (this_proj -> cell.box[0].param[0][0] == 0.0) ? 20.0 : this_proj -> cell.box[0].param[0][0];
589 for (j=i; j<val; j++)
590 {
591 this_lightning -> spot[j] = init_light_source (0, pos, (! preferences) ? this_proj -> modelgl -> p_moy : 1.0); // Init directional by default
592 }
593 //free (old_spots);
594 }
595 else if (val < i)
596 {
597 // We need to remove a light
598#ifdef DEBUG
599 g_debug ("REMOVING_LIGHT_SOURCE:: val= %d, i= %d", val, i);
600#endif
601 int * ltr = light_source_to_be_removed (i-val, this_lightning, ogl_edit);
602 if (ltr != NULL)
603 {
604 old_spots = copy_light_sources (i, i, this_lightning -> spot);
605 for (k=0; k < i-val; k++)
606 {
607#ifdef DEBUG
608 g_debug ("REMOVING_LIGHT_SOURCES:: k= %d, ltr[%d]= %d", k, k, ltr[k]);
609#endif
610 }
611 g_free (this_lightning -> spot);
612 this_lightning -> spot = g_malloc (val*sizeof*this_lightning -> spot);
613 m = -1;
614 for (j=0; j<i; j++)
615 {
616 delete_ligth = FALSE;
617 for (k=0; k< i-val; k++)
618 {
619 if (j == ltr[k]) delete_ligth = TRUE;
620 }
621 if (! delete_ligth)
622 {
623 m ++;
624 this_lightning -> spot[m] = copy_light_source (old_spots[j]);
625 }
626 }
627 g_free (old_spots);
628 this_lightning -> lights = val;
629#ifdef DEBUG
630 g_debug ("LIGHT(s) HAVE BEEN REMOVED:: NEW_LIGHTS_NUM= %d", val);
631#endif
632 }
633 }
634 create_lights_combo (this_lightning -> lights, ogl_edit);
635 ogl_edit -> lights = destroy_this_widget (ogl_edit -> lights);
636 show_the_widgets (ogl_edit -> lights);
637 combo_set_active (ogl_edit -> lights, 0);
638 update_light_data (0, ogl_edit);
639 if (! preferences)
640 {
641 view -> create_shaders[LIGHT] = TRUE;
642 update (view);
643 }
644}
645
654G_MODULE_EXPORT void set_nlights_spin (GtkSpinButton * res, gpointer data)
655{
656 add_remove_lights (gtk_spin_button_get_value_as_int(res), data);
657}
658
667G_MODULE_EXPORT void set_nlights (GtkEntry * res, gpointer data)
668{
669 int i;
670 const gchar * m;
671 m = entry_get_text (res);
672 i = (int) string_to_double ((gpointer)m);
673 add_remove_lights (i, data);
674}
675
684G_MODULE_EXPORT void update_light_param (GtkEntry * res, gpointer data)
685{
686 dint * lid = (dint *)data;
687 glwin * view = (preferences) ? NULL : get_project_by_id(lid -> a) -> modelgl;
688 opengl_edition * ogl_edit = (preferences) ? pref_ogl_edit : (view) ? view -> opengl_win : NULL;
689 if (ogl_edit)
690 {
691 int li = combo_get_active (ogl_edit-> lights);
692 Light * this_light = (preferences) ? & tmp_lightning.spot[li] : & view -> anim -> last -> img -> l_ghtning.spot[li];
693 const gchar * m = entry_get_text (res);
694 double v = string_to_double ((gpointer)m);
695 switch (lid -> b)
696 {
697 case 0:
698 this_light -> attenuation.x = v;
699 break;
700 case 1:
701 this_light -> attenuation.y = v;
702 break;
703 case 2:
704 this_light -> attenuation.z = v;
705 break;
706 case 3:
707 this_light -> spot_data.x = v;
708 break;
709 case 4:
710 this_light -> spot_data.y = v;
711 break;
712 case 5:
713 this_light -> spot_data.z = v;
714 break;
715 }
717 if (this_light -> show) view -> create_shaders[LIGHT] = TRUE;
718 }
719 if (! preferences) update (view);
720}
721
731void set_data_pos (vec3_t * vect, int pos, double v)
732{
733 switch (pos)
734 {
735 case 0:
736 vect -> x = v;
737 break;
738 case 1:
739 vect -> y = v;
740 break;
741 case 2:
742 vect -> z = v;
743 break;
744 }
745}
746
755G_MODULE_EXPORT void set_object_pos (GtkEntry * res, gpointer data)
756{
757 tint * id = (tint *)data;
758 glwin * view;
759 opengl_edition * edit_ogl;
760 Material * the_mat;
761 Lightning * the_lightning;
762 Fog * the_fog;
763 const gchar * m = entry_get_text (res);
764 double v = string_to_double ((gpointer)m);
765 if (! preferences)
766 {
767 view = get_project_by_id(id -> a) -> modelgl;
768 the_mat = & view -> anim -> last -> img -> m_terial;
769 the_lightning = & view -> anim -> last -> img -> l_ghtning;
770 the_fog = & view -> anim -> last -> img -> f_g;
771 edit_ogl = view -> opengl_win;
772 }
773 else
774 {
775 the_mat = & tmp_material;
776 the_lightning = & tmp_lightning;
777 the_fog = & tmp_fog;
778 edit_ogl = pref_ogl_edit;
779 }
780 if (id -> b == 0)
781 {
782 set_data_pos (& the_mat -> albedo, id -> c, v);
783 }
784 else if (id -> b == 4)
785 {
786 set_data_pos (& the_fog -> color, id -> c, v);
787 }
788 else if (id -> b > 0 && edit_ogl)
789 {
790 int li = combo_get_active (edit_ogl -> lights);
791 switch (id -> b)
792 {
793 case 1:
794 set_data_pos (& the_lightning -> spot[li].position, id -> c, v);
795 break;
796 case 2:
797 set_data_pos (& the_lightning -> spot[li].direction, id -> c, v);
798 break;
799 case 3:
800 set_data_pos (& the_lightning -> spot[li].intensity, id -> c, v);
801 break;
802 }
803 if (the_lightning -> spot[li].show && ! preferences) view -> create_shaders[LIGHT] = TRUE;
804 }
805 if (edit_ogl) update_entry_double (res, v);
806 if (! preferences) update (view);
807}
808
817G_MODULE_EXPORT void set_light_type (GtkComboBox * box, gpointer data)
818{
819 opengl_edition * ogl_win = (opengl_edition *)data;
820 int li = combo_get_active (ogl_win -> lights);
821 int ti = combo_get_active ((GtkWidget *)box);
822 show_active_light_data (ogl_win, li, ti);
823}
824
833G_MODULE_EXPORT void set_light_fix (GtkComboBox * box, gpointer data)
834{
835 opengl_edition * ogl_win = (opengl_edition *)data;
836 glwin * view;
837 Lightning * ogl_ligthning;
838 if (! preferences)
839 {
840 view = get_project_by_id(ogl_win -> proj) -> modelgl;
841 ogl_ligthning = & view -> anim -> last -> img -> l_ghtning;
842 }
843 else
844 {
845 ogl_ligthning = & tmp_lightning;
846 }
847 int li = combo_get_active (ogl_win -> lights);
848 ogl_ligthning -> spot[li].fix = combo_get_active ((GtkWidget *)box);
849 if (! preferences)
850 {
851 view -> create_shaders[LIGHT] = TRUE;
852 update (view);
853 }
854}
855
856#ifdef GTK4
865G_MODULE_EXPORT void show_this_light (GtkCheckButton * but, gpointer data)
866#else
875G_MODULE_EXPORT void show_this_light (GtkToggleButton * but, gpointer data)
876#endif
877{
878 opengl_edition * ogl_win = (opengl_edition *)data;
879 glwin * view = get_project_by_id(ogl_win -> proj) -> modelgl;
880 int li = combo_get_active (ogl_win -> lights);
881 view -> anim -> last -> img -> l_ghtning.spot[li].show = button_get_status ((GtkWidget *)but);
882 view -> create_shaders[LIGHT] = TRUE;
883 update (view);
884}
885
899GtkWidget * create_setting_pos (gchar * lab, int size, float xalign, int pid, int lid, float * values, opengl_edition * ogl_win)
900{
901 int i;
902 GtkWidget * setting_pos = create_vbox (BSEP);
903 adv_box (setting_pos, lab, 5, size, xalign);
904 GtkWidget * hbox = create_hbox (0);
905 add_box_child_start (GTK_ORIENTATION_VERTICAL, setting_pos, hbox, FALSE, FALSE, 0);
906 GtkWidget * sbox = create_hbox (0);
907 gtk_widget_set_size_request (sbox, 500, -1);
908 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, sbox, FALSE, FALSE, 70);
909 GtkWidget * label;
910 for (i=0; i<3; i++)
911 {
912 ogl_win -> pos_pointer[pid][i].a = ogl_win -> proj;
913 ogl_win -> pos_pointer[pid][i].b = pid;
914 ogl_win -> pos_pointer[pid][i].c = i;
915 label = markup_label ((pid > 0 && pid < 3) ? lpos[i] : cpos[i], 20, -1, 1.0, 0.5);
916 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sbox, label, FALSE, FALSE, 5);
917 ogl_win -> entogl[pid][i] = create_entry (G_CALLBACK(set_object_pos), 80, 10, FALSE, & ogl_win -> pos_pointer[pid][i]);
918 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sbox, ogl_win -> entogl[pid][i], FALSE, FALSE, 0);
919 update_entry_double (GTK_ENTRY(ogl_win -> entogl[pid][i]), values[i]);
920 }
921 if (pid == 1 && ! preferences)
922 {
923 ogl_win -> light_show = check_button ("Show light", -1, -1, FALSE, G_CALLBACK(show_this_light), ogl_win);
924 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, sbox, ogl_win -> light_show, FALSE, FALSE, 10);
925 }
926 return setting_pos;
927}
928
938GtkWidget * lights_tab (glwin * view, opengl_edition * ogl_edit, Lightning * ogl_lightning)
939{
940 int i, j, k;
941 GtkWidget * vbox;
942 GtkWidget * hbox, * lhbox;
943
944 GtkWidget * layout = create_layout (-1, 600);
945 vbox = add_vbox_to_layout (layout, 480, -1);
946 hbox = bdv_box (vbox, "<b>Number of light sources</b>\n(add or remove lights - up to 10 sources)", 250, 0.0);
947 gtk_widget_set_size_request (hbox, -1, 65);
948
949 GtkWidget * nlights = spin_button (G_CALLBACK(set_nlights_spin), ogl_lightning -> lights, 1.0, 10.0, 1.0, 0, 100, view);
950 gtk_widget_set_size_request (nlights, 25, -1);
951 GtkWidget * fix = gtk_fixed_new ();
952 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, fix, FALSE, FALSE, 20);
953 gtk_fixed_put (GTK_FIXED (fix), nlights, 0, 20);
954
955 hbox = bdv_box (vbox, "<b>Configure light source <sup>*</sup></b>", 250, 0.0);
956 ogl_edit -> lights_box = create_hbox (0);
957 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ogl_edit -> lights_box, FALSE, FALSE, 10);
958 create_lights_combo (ogl_lightning -> lights, ogl_edit);
959
960 bdv_box (vbox, "<b>Light configuration</b>", 250, 0.0);
961 hbox = create_hbox (0);
962 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
963 ogl_edit -> light_type = create_combo ();
964 gchar * ltype[3] = {"Directional", "Point", "Spot"};
965 for (i=0; i<3; i++)
966 {
967 combo_text_append (ogl_edit -> light_type, ltype[i]);
968 }
969 g_signal_connect (G_OBJECT (ogl_edit -> light_type), "changed", G_CALLBACK(set_light_type), ogl_edit);
970 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ogl_edit -> light_type, FALSE, FALSE, 60);
971
972 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, gtk_label_new("Fixed by respect to: "), FALSE, FALSE, 10);
973 ogl_edit -> light_fix = create_combo();
974 gchar * lfix[2] = {"The viewer", "The model"};
975 for (i=0; i<2; i++)
976 {
977 combo_text_append (ogl_edit -> light_fix, lfix[i]);
978 }
979 g_signal_connect (G_OBJECT (ogl_edit -> light_fix), "changed", G_CALLBACK(set_light_fix), ogl_edit);
980 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ogl_edit -> light_fix, FALSE, FALSE, 10);
981
982 float values[3] = {0.0, 0.0, 0.0};
983 // Position
984 gchar * str = (preferences) ? g_strdup_printf ("%s <sup>**</sup>", ogl_settings[1][0]) : g_strdup_printf ("%s", ogl_settings[1][0]);
985 ogl_edit -> light_b_coord[0] = create_setting_pos (str, 130, 0.0, 1, 0, values, ogl_edit);
986 g_free (str);
987 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, ogl_edit -> light_b_coord[0], FALSE, FALSE, 0);
988 // Direction
989 ogl_edit -> light_b_coord[1] = create_setting_pos (ogl_settings[1][1], 130, 0.0, 2, 1, values, ogl_edit);
990 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, ogl_edit -> light_b_coord[1], FALSE, FALSE, 0);
991 // Intensity
992 str = (preferences) ? g_strdup_printf ("%s <sup>**</sup>", ogl_settings[1][2]) : g_strdup_printf ("%s", ogl_settings[1][2]);
993 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, create_setting_pos (str, 130, 0.0, 3, 2, values, ogl_edit), FALSE, FALSE, 0);
994 g_free (str);
996 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 5);
997 ogl_edit -> advanced_light_box = create_vbox (BSEP);
998 add_box_child_start ( GTK_ORIENTATION_HORIZONTAL, hbox, ogl_edit -> advanced_light_box, FALSE, FALSE, 40);
999 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);
1000 GtkWidget * lbox = create_hbox (BSEP);
1001 add_box_child_start (GTK_ORIENTATION_VERTICAL, ogl_edit -> advanced_light_box, lbox, FALSE, FALSE, 0);
1002 GtkWidget * lvbox = create_vbox (BSEP);
1003 add_box_child_start ( GTK_ORIENTATION_HORIZONTAL, lbox, lvbox, FALSE, FALSE, 20);
1004 k = 0;
1005 for (i=0; i<2; i++)
1006 {
1007 ogl_edit -> light_b_entry[i] = create_vbox (BSEP);
1008 add_box_child_start (GTK_ORIENTATION_VERTICAL, lvbox, ogl_edit -> light_b_entry[i], FALSE, FALSE, 0);
1009 for (j=0; j<3; j++)
1010 {
1011 ogl_edit -> light_entry[k] = create_entry (G_CALLBACK(update_light_param), 100, 15, FALSE, & ogl_edit -> pointer[k]);
1012 lhbox = adv_box (ogl_edit -> light_b_entry[i], ogl_settings[1][k+3], 0, 170, 0.0);
1013 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, lhbox, ogl_edit -> light_entry[k], FALSE, FALSE, 10);
1014 if (i == 1) add_box_child_start (GTK_ORIENTATION_HORIZONTAL, lhbox, gtk_label_new("°"), FALSE, FALSE, 0);
1015 k ++;
1016 }
1017 }
1019 combo_set_active (ogl_edit -> lights, 0);
1020 update_light_data (0, ogl_edit);
1021
1022 append_comments (vbox, "<sup>*</sup>", "Note that light N°1 must be a directional light");
1023 if (preferences) append_comments (vbox, "<sup>**</sup>", "Intensity and position will be corrected based on model depth");
1024
1025 return layout;
1026}
1027
1028// ***************** MATERIAL ******************* //
1029
1030#ifdef GTK4
1039G_MODULE_EXPORT void set_use_template_toggle (GtkCheckButton * but, gpointer data)
1040#else
1049G_MODULE_EXPORT void set_use_template_toggle (GtkToggleButton * but, gpointer data)
1050#endif
1051{
1052 int i, j, k;
1053 Material * the_mat;
1054 opengl_edition * ogl_edit;
1055 glwin * view;
1056 if (! preferences)
1057 {
1058 view = (glwin *)data;
1059 ogl_edit = view -> opengl_win;
1060 the_mat = & view -> anim -> last -> img -> m_terial;
1061 i = combo_get_active (view -> opengl_win -> templates);
1062 }
1063 else
1064 {
1065 ogl_edit = pref_ogl_edit;
1066 the_mat = & tmp_material;
1067 i = combo_get_active (pref_ogl_edit -> templates);
1068 }
1069 j = button_get_status ((GtkWidget *)but);
1070 if (j)
1071 {
1072 if (i == -1) i = 3;
1073 the_mat -> albedo = vec3(0.5, 0.5, 0.5);
1074 for (k=0; k<5; k++)
1075 {
1076 the_mat -> param[k+1] = template_parameters[i][k];
1077 if (ogl_edit)
1078 {
1079 update_entry_double (GTK_ENTRY(ogl_edit -> m_entry[k]), the_mat -> param[k+1]);
1080 gtk_range_set_value (GTK_RANGE(ogl_edit -> m_scale[k]), the_mat -> param[k+1]);
1081 }
1082 }
1083 combo_set_active (ogl_edit -> templates, i);
1084 if (ogl_edit)
1085 {
1086 update_entry_double (GTK_ENTRY(ogl_edit -> entogl[0][0]), the_mat -> albedo.x);
1087 update_entry_double (GTK_ENTRY(ogl_edit -> entogl[0][1]), the_mat -> albedo.y);
1088 update_entry_double (GTK_ENTRY(ogl_edit -> entogl[0][2]), the_mat -> albedo.z);
1089 }
1090 k = i+1;
1091 }
1092 else
1093 {
1094 k = 0;
1095 }
1096 the_mat -> predefine = k;
1097 widget_set_sensitive (ogl_edit -> templates, the_mat -> predefine);
1098 widget_set_sensitive (ogl_edit -> param_mat, ! the_mat -> predefine);
1099 if (! preferences)
1100 {
1101 update (view);
1102 }
1103}
1104
1113G_MODULE_EXPORT void set_template (GtkComboBox * box, gpointer data)
1114{
1115 int i, j;
1116 Material * the_mat;
1117 glwin * view;
1118 opengl_edition * ogl_edit;
1119 if (preferences)
1120 {
1121 the_mat = & tmp_material;
1122 ogl_edit = pref_ogl_edit;
1123 }
1124 else
1125 {
1126 view = (glwin *)data;
1127 the_mat = & view -> anim -> last -> img -> m_terial;
1128 ogl_edit = view -> opengl_win;
1129 }
1130 i = combo_get_active ((GtkWidget *)box);
1131 the_mat -> predefine = i + 1;
1132 for (j=0; j<5; j++)
1133 {
1134 the_mat -> param[j+1] = template_parameters[i][j];
1135#ifdef DEBUG
1136 g_debug ("SET_TEMPLATES:: j= %d, val= %f", j, template_parameters[i][j]);
1137#endif
1138 if (ogl_edit)
1139 {
1140 update_entry_double (GTK_ENTRY(ogl_edit -> m_entry[j]), the_mat -> param[j+1]);
1141 gtk_range_set_value (GTK_RANGE(ogl_edit -> m_scale[j]), the_mat -> param[j+1]);
1142 }
1143 }
1144 if (ogl_edit)
1145 {
1146 update_entry_double (GTK_ENTRY(ogl_edit -> entogl[0][0]), the_mat -> albedo.x);
1147 update_entry_double (GTK_ENTRY(ogl_edit -> entogl[0][1]), the_mat -> albedo.y);
1148 update_entry_double (GTK_ENTRY(ogl_edit -> entogl[0][2]), the_mat -> albedo.z);
1149 }
1150 if (! preferences) update (view);
1151}
1152
1161G_MODULE_EXPORT void set_l_model (GtkComboBox * box, gpointer data)
1162{
1163 if (preferences)
1164 {
1165 tmp_material.param[0] = combo_get_active ((GtkWidget *)box);
1166 }
1167 else
1168 {
1169 glwin * view = (glwin *)data;
1170 view -> anim -> last -> img -> m_terial.param[0] = combo_get_active ((GtkWidget *)box);
1171 update (view);
1172 }
1173}
1174
1183void param_has_changed (gpointer data, double val)
1184{
1185 dint * mid = (dint *)data;
1186 opengl_edition * edit_ogl;
1187 Material * the_mat;
1188 glwin * view;
1189 if (preferences)
1190 {
1191 edit_ogl = pref_ogl_edit;
1192 the_mat = & tmp_material;
1193 }
1194 else
1195 {
1196 view = get_project_by_id(mid -> a) -> modelgl;
1197 edit_ogl = view -> opengl_win;
1198 the_mat = & view -> anim -> last -> img -> m_terial;
1199 }
1200 if (mat_min_max[mid -> b][0] >= 0.0 && val <= mat_min_max[mid -> b][1]) the_mat -> param[mid -> b + 1] = val;
1201 if (edit_ogl)
1202 {
1203 update_entry_double (GTK_ENTRY(edit_ogl -> m_entry[mid -> b]), the_mat -> param[mid -> b + 1]);
1204 gtk_range_set_value (GTK_RANGE(edit_ogl -> m_scale[mid -> b]), the_mat -> param[mid -> b + 1]);
1205 }
1206 if (! preferences) update (view);
1207}
1208
1217G_MODULE_EXPORT void update_mat_param (GtkEntry * res, gpointer data)
1218{
1219 const gchar * m = entry_get_text (res);
1220 double v = string_to_double ((gpointer)m);
1221 param_has_changed (data, v);
1222}
1223
1234G_MODULE_EXPORT gboolean scroll_scale_param (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data)
1235{
1236 param_has_changed (data, value);
1237 return FALSE;
1238}
1239
1248G_MODULE_EXPORT void scale_param (GtkRange * range, gpointer data)
1249{
1250 param_has_changed (data, gtk_range_get_value (range));
1251}
1252
1263G_MODULE_EXPORT gboolean scroll_scale_quality (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data)
1264{
1265 set_quality ((int)value, data);
1266#ifdef GTK4
1267 if (! preferences) update_menu_bar ((glwin *)data);
1268#endif
1269 return FALSE;
1270}
1271
1280G_MODULE_EXPORT void scale_quality (GtkRange * range, gpointer data)
1281{
1282 set_quality ((int)gtk_range_get_value (range), data);
1283#ifdef GTK4
1284 if (! preferences) update_menu_bar ((glwin *)data);
1285#endif
1286}
1287
1296GtkWidget * lightning_fix (glwin * view, Material * this_material)
1297{
1298 GtkWidget * fix = gtk_fixed_new ();
1299 GtkWidget * lmodel = create_combo ();
1300 gtk_fixed_put (GTK_FIXED (fix), lmodel, 0, 10);
1301
1302 char * l_model[6] = {"None", "Phong", "Blinn", "Cook-Torrance-Blinn", "Cook-Torrance-Beckmann", "Cook-Torrance-GCX"};
1303 int i;
1304 for (i=0; i<6; i++)
1305 {
1306 combo_text_append (lmodel, l_model[i]);
1307 }
1308 g_signal_connect (G_OBJECT (lmodel), "changed", G_CALLBACK(set_l_model), view);
1309 gtk_widget_set_size_request (lmodel, 200, -1);
1310 combo_set_active (lmodel, this_material -> param[0]);
1311 return fix;
1312}
1313
1323GtkWidget * materials_tab (glwin * view, opengl_edition * ogl_edit, Material * the_mat)
1324{
1325 GtkWidget * layout = create_layout (-1, 300);
1326 GtkWidget * vbox = add_vbox_to_layout (layout, 650, -1);
1327 int i;
1328 GtkWidget * box, * hbox;
1329
1330 box = adv_box (vbox, "<b>Quality</b> ", 5, 150, 0.0);
1331 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, create_hscale (2, 500, 1, (view) ? view -> anim -> last -> img -> quality : tmp_opengl[3], GTK_POS_TOP, 1, 200,
1332 G_CALLBACK(scale_quality), G_CALLBACK(scroll_scale_quality), view), FALSE, FALSE, 0);
1333 box = adv_box (vbox, "<b>Lightning model</b> ", 5, 150, 0.0);
1334 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, lightning_fix (view, the_mat), FALSE, FALSE, 0);
1335 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 20);
1336
1337 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox,
1338 check_button ("<b>Use template</b>", 100, 40, the_mat -> predefine, G_CALLBACK(set_use_template_toggle), view),
1339 FALSE, FALSE, 0);
1340
1341 hbox = create_hbox (BSEP);
1342 add_box_child_start (GTK_ORIENTATION_VERTICAL, hbox, markup_label ("<b>Templates</b>", 150, -1, 0.0, 0.5), FALSE, FALSE, 50);
1343 ogl_edit -> templates = create_combo ();
1344 for (i=0; i<TEMPLATES; i++)
1345 {
1346 combo_text_append (ogl_edit -> templates, material_template[i]);
1347 }
1348 combo_set_active (ogl_edit -> templates, the_mat -> predefine-1);
1349 g_signal_connect (G_OBJECT (ogl_edit -> templates), "changed", G_CALLBACK(set_template), view);
1350 gtk_widget_set_size_request (ogl_edit -> templates, 100, -1);
1351 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ogl_edit -> templates, FALSE, FALSE, 0);
1352 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1353 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, gtk_separator_new (GTK_ORIENTATION_HORIZONTAL), FALSE, FALSE, 20);
1354 hbox = create_hbox (0);
1355 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, hbox, FALSE, FALSE, 0);
1356 ogl_edit -> param_mat = create_vbox (BSEP);
1357 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, hbox, ogl_edit -> param_mat, FALSE, FALSE, 50);
1358
1359 ogl_edit -> param_mat = create_vbox (BSEP);
1360 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, ogl_edit -> param_mat, FALSE, FALSE, 0);
1361
1362 bdv_box (ogl_edit -> param_mat, "<b>Material properties</b>", 250, -1);
1363
1364 GtkWidget * m_fixed;
1365 for (i=0; i<5; i++)
1366 {
1367 box = adv_box (ogl_edit -> param_mat, ogl_settings[0][i+1], 0, 130, 0.0);
1368 ogl_edit -> m_scale[i] = create_hscale (mat_min_max[i][0], mat_min_max[i][1], 0.001, the_mat -> param[i+1],
1369 GTK_POS_TOP, 3, 200, G_CALLBACK(scale_param), G_CALLBACK(scroll_scale_param), & ogl_edit -> pointer[i]);
1370 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, ogl_edit -> m_scale[i], FALSE, FALSE, 10);
1371 ogl_edit -> m_entry[i] = create_entry (G_CALLBACK(update_mat_param), 100, 15, FALSE, & ogl_edit -> pointer[i]);
1372 update_entry_double(GTK_ENTRY(ogl_edit -> m_entry[i]), the_mat -> param[i+1]);
1373 m_fixed = gtk_fixed_new ();
1374 gtk_fixed_put (GTK_FIXED(m_fixed), ogl_edit -> m_entry[i], 0, 15);
1375 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, m_fixed, FALSE, FALSE, 15);
1376 }
1377 float values[] = {the_mat -> albedo.x, the_mat -> albedo.y, the_mat -> albedo.z};
1378
1379 add_box_child_start (GTK_ORIENTATION_VERTICAL, ogl_edit -> param_mat, create_setting_pos (ogl_settings[0][0], 130, -1, 0, 0, values, ogl_edit), FALSE, FALSE, 20);
1381 widget_set_sensitive (ogl_edit -> templates, the_mat -> predefine);
1382 widget_set_sensitive (ogl_edit -> param_mat, ! the_mat -> predefine);
1383 return layout;
1384}
1385
1386// ***************** FOG ******************* //
1387
1397void fog_param_changed (gpointer data, GLfloat u, GtkRange * range)
1398{
1399 dint * fid = (dint *)data;
1400 Fog * this_fog;
1401 opengl_edition * ogl_edit;
1402 glwin * view;
1403 if (! preferences)
1404 {
1405 view = get_project_by_id (fid -> a) -> modelgl;
1406 this_fog = & view -> anim -> last -> img -> f_g;
1407 ogl_edit = view -> opengl_win;
1408 }
1409 else
1410 {
1411 this_fog = & tmp_fog;
1412 ogl_edit = pref_ogl_edit;
1413 }
1414 GLfloat v, w;
1415 if (fid -> b > 0)
1416 {
1417 v = this_fog -> depth[0];
1418 w = this_fog -> depth[1];
1419 if (fid -> b == 1 && u < w)
1420 {
1421 this_fog -> depth[0] = u;
1422 }
1423 else if (fid -> b == 2 && u > v)
1424 {
1425 this_fog -> depth[1] = u;
1426 }
1427 else if (ogl_edit)
1428 {
1429 if (fid -> b == 1)
1430 {
1431 gtk_range_set_value (range, (gdouble) (w-0.1));
1432 }
1433 else
1434 {
1435 gtk_range_set_value (range, (gdouble) (v+0.1));
1436 }
1437 }
1438 }
1439 else
1440 {
1441 this_fog -> density = u;
1442 }
1443 if (! preferences) update (view);
1444}
1445
1456G_MODULE_EXPORT gboolean scroll_set_fog_param (GtkRange * range, GtkScrollType scroll, gdouble value, gpointer data)
1457{
1458 fog_param_changed (data, (GLfloat) value, range);
1459 return FALSE;
1460}
1461
1470G_MODULE_EXPORT void set_fog_param (GtkRange * range, gpointer data)
1471{
1472 fog_param_changed (data, (GLfloat) gtk_range_get_value (range), range);
1473}
1474
1483G_MODULE_EXPORT void set_fog_type (GtkWidget * widg, gpointer data)
1484{
1485 opengl_edition * ogl_edit = (opengl_edition *)data;
1486 Fog * this_fog;
1487 glwin * view;
1488 if (! preferences)
1489 {
1490 view = get_project_by_id (ogl_edit -> proj) -> modelgl;
1491 this_fog = & view -> anim -> last -> img -> f_g;
1492 }
1493 else
1494 {
1495 this_fog = & tmp_fog;
1496 }
1497 this_fog -> based = combo_get_active (widg);
1498 if (! preferences) update (view);
1499}
1500
1509void setup_fog_dialogs (opengl_edition * ogl_edit, int fid)
1510{
1511 Fog * this_fog;
1512 glwin * view;
1513 if (! preferences)
1514 {
1515 view = get_project_by_id (ogl_edit -> proj) -> modelgl;
1516 this_fog = & view -> anim -> last -> img -> f_g;
1517 }
1518 else
1519 {
1520 this_fog = & tmp_fog;
1521 }
1522 this_fog -> mode = fid;
1523 if (this_fog -> mode)
1524 {
1525 show_the_widgets (ogl_edit -> param_fog);
1526 if (this_fog -> mode == 1)
1527 {
1528 show_the_widgets (ogl_edit -> depth_box);
1529 hide_the_widgets (ogl_edit -> dens_box);
1530 }
1531 else
1532 {
1533 hide_the_widgets (ogl_edit -> depth_box);
1534 show_the_widgets (ogl_edit -> dens_box);
1535 }
1536 }
1537 else
1538 {
1539 hide_the_widgets (ogl_edit -> param_fog);
1540 }
1541 if (! preferences) update (view);
1542}
1543
1552G_MODULE_EXPORT void set_fog_mode (GtkWidget * widg, gpointer data)
1553{
1555}
1556
1566GtkWidget * fog_tab (glwin * view, opengl_edition * ogl_edit, Fog * the_fog)
1567{
1568 GtkWidget * layout = create_layout (480, -1);
1569 GtkWidget * vbox = add_vbox_to_layout (layout, 480, -1);
1570
1571 GtkWidget * box = adv_box (vbox, "<b>Fog mode</b> ", 10, 150, 0.0);
1572 GtkWidget * fogmod = create_combo ();
1573 combo_text_append (fogmod, "None");
1574 combo_text_append (fogmod, "Linear");
1575 combo_text_append (fogmod, "Exponential");
1576 combo_text_append (fogmod, "Exponential squared");
1577 gtk_widget_set_size_request (fogmod, 200, -1);
1578 combo_set_active (fogmod, the_fog -> mode);
1579 g_signal_connect (G_OBJECT (fogmod), "changed", G_CALLBACK(set_fog_mode), ogl_edit);
1580 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, fogmod, FALSE, FALSE, 0);
1581
1582 ogl_edit -> param_fog = create_vbox (BSEP);
1583 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, ogl_edit -> param_fog, FALSE, FALSE, 0);
1584
1585 box = adv_box (ogl_edit -> param_fog, "<b>Fog type</b> ", 5, 150, 0.0);
1586 GtkWidget * fogtype = create_combo ();
1587 combo_text_append (fogtype, "Plane based");
1588 combo_text_append (fogtype, "Range based");
1589 gtk_widget_set_size_request (fogtype, 200, -1);
1590 combo_set_active (fogtype, the_fog -> based);
1591 g_signal_connect (G_OBJECT (fogtype), "changed", G_CALLBACK(set_fog_type), ogl_edit);
1592 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, fogtype, FALSE, FALSE, 0);
1593
1594 ogl_edit -> dens_box = adv_box (ogl_edit -> param_fog, "<b>Fog density</b>", 10, 150.0, 0.0);
1595 ogl_edit -> fog_range[0] = create_hscale (0.0, 1.0, 0.01, the_fog -> density, GTK_POS_TOP, 3,
1596 250, G_CALLBACK(set_fog_param), G_CALLBACK(scroll_set_fog_param), & ogl_edit -> pointer[0]);
1597 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, ogl_edit -> dens_box, ogl_edit -> fog_range[0], FALSE, FALSE, 0);
1598
1599 char * depthfog[2] = {"\t depth<sup>*</sup> start: ", "\t depth<sup>*</sup> end: "};
1600
1601 ogl_edit -> depth_box = create_vbox (5);
1602 add_box_child_start (GTK_ORIENTATION_VERTICAL, ogl_edit -> param_fog, ogl_edit -> depth_box, FALSE, FALSE, 0);
1603 box = adv_box (ogl_edit -> depth_box, "<b>Fog depth</b>", 10, 150.0, 0.0);
1604 int i;
1605 for (i=0; i<2; i++)
1606 {
1607 box = adv_box (ogl_edit -> depth_box, depthfog[i], 5, 170, 0.0);
1608 ogl_edit -> fog_range[i+1] = create_hscale (0.0, 100.0, 0.1, the_fog -> depth[i], GTK_POS_TOP, 2,
1609 250, G_CALLBACK(set_fog_param), G_CALLBACK(scroll_set_fog_param), & ogl_edit -> pointer[i+1]);
1610 add_box_child_start (GTK_ORIENTATION_HORIZONTAL, box, ogl_edit -> fog_range[i+1], FALSE, FALSE, 0);
1611 }
1612 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);
1613
1614 float values[] = {the_fog -> color.x, the_fog -> color.y, the_fog -> color.z};
1615 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);
1617 return layout;
1618}
1619
1627void close_advanced_opengl (gpointer data)
1628{
1629 glwin * view = (glwin *)data;
1630 view -> opengl_win -> win = destroy_this_widget (view -> opengl_win -> win);
1631 g_free (view -> opengl_win);
1632 view -> opengl_win = NULL;
1633}
1634
1635#ifdef GTK4
1644G_MODULE_EXPORT gboolean close_advanced (GtkWidget * window, gpointer data)
1645#else
1655G_MODULE_EXPORT gboolean close_advanced (GtkWidget * widg, GdkEvent * event, gpointer data)
1656#endif
1657{
1658 close_advanced_opengl (data);
1659 return FALSE;
1660}
1661
1670G_MODULE_EXPORT void opengl_advanced (GtkWidget * widg, gpointer data)
1671{
1672 glwin * view = (glwin *)data;
1673 if (view -> opengl_win == NULL)
1674 {
1675 view -> opengl_win = g_malloc0 (sizeof*view -> opengl_win);
1676 view -> opengl_win -> proj = view -> proj;
1677 int i;
1678 for (i=0; i<6; i++)
1679 {
1680 view -> opengl_win -> pointer[i].a = view -> proj;
1681 view -> opengl_win -> pointer[i].b = i;
1682 }
1683 gchar * str = g_strdup_printf ("OpenGL material aspect and light settings - %s", get_project_by_id(view -> proj) -> name);
1684 view -> opengl_win -> win = create_win (str, view -> win, FALSE, FALSE);
1685 g_free (str);
1686#ifdef DEBUG
1687 gtk_window_set_resizable (GTK_WINDOW (view -> opengl_win -> win), TRUE);
1688#endif
1689 GtkWidget * vbox = create_vbox (5);
1690 add_container_child (CONTAINER_WIN, view -> opengl_win -> win, vbox);
1691#ifdef GTK4
1692 gtk_widget_set_size_request (vbox, 580, 670);
1693#else
1694 gtk_widget_set_size_request (vbox, 580, 650);
1695#endif
1696 GtkWidget * notebook = gtk_notebook_new ();
1697 show_the_widgets (notebook);
1698#ifdef GTK4
1699 gtk_widget_set_vexpand (notebook, TRUE);
1700#endif
1701 add_box_child_start (GTK_ORIENTATION_VERTICAL, vbox, notebook, TRUE, TRUE, 0);
1702 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), materials_tab (view, view -> opengl_win, & view -> anim -> last -> img -> m_terial), markup_label("<b>Material aspect</b>", -1, -1, 0.0, 0.5));
1703 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), lights_tab (view, view -> opengl_win, & view -> anim -> last -> img -> l_ghtning),
1704 markup_label("<b>Configure light sources</b>", -1, -1, 0.0, 0.5));
1705 gtk_notebook_append_page (GTK_NOTEBOOK(notebook), fog_tab (view, view -> opengl_win, & view -> anim -> last -> img -> f_g), markup_label("<b>Configure fog</b>", -1, -1, 0.0, 0.5));
1706 add_global_option (vbox, & view -> colorp[0][0]);
1707 add_gtk_close_event (view -> opengl_win -> win, G_CALLBACK(close_advanced), view);
1708 }
1709 show_the_widgets (view -> opengl_win -> win);
1710 update_light_data (0, view -> opengl_win);
1711 setup_fog_dialogs (view -> opengl_win, view -> anim -> last -> img -> f_g.mode);
1712}
color colorp[64]
gchar * param[2]
PangoLayout * layout
Definition curve.c:79
void label(cairo_t *cr, double val, int axe, int p, project *this_proj)
draw axis label
Definition labels.c:56
float val
Definition dlp_init.c:117
double pi
Definition global.c:195
int * allocint(int val)
allocate an int * pointer
Definition global.c:314
double string_to_double(gpointer string)
convert string to double
Definition global.c:624
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:501
int combo_get_active(GtkWidget *combo)
retrieve the active item's position
Definition gtk-misc.c:909
GtkWidget * create_entry(GCallback handler, int dim, int cdim, gboolean key_release, gpointer data)
Create a GtkEntry.
Definition gtk-misc.c:1375
void update_entry_double(GtkEntry *entry, double doubleval)
update the content of a GtkEntry as double
Definition gtk-misc.c:643
void append_comments(GtkWidget *vbox, gchar *symbol, gchar *legend)
append comments to a vertical box
Definition gtk-misc.c:2004
GtkWidget * dialogmodal(gchar *str, GtkWindow *parent)
Create a new dialog modal window.
Definition gtk-misc.c:520
gboolean is_the_widget_visible(GtkWidget *widg)
test if a GtkWidget exist, then return if it is visible or not
Definition gtk-misc.c:724
GtkWidget * create_win(gchar *str, GtkWidget *parent, gboolean modal, gboolean resiz)
create a new GtkWindow
Definition gtk-misc.c:454
project * proj
void combo_set_active(GtkWidget *combo, int pos)
set the active item's position
Definition gtk-misc.c:932
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:874
const gchar * entry_get_text(GtkEntry *entry)
get the text in a GtkEntry
Definition gtk-misc.c:607
#define BSEP
Definition global.h:247
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:2522
void button_set_status(GtkWidget *button, int status)
set status of check / toggle button
Definition gtk-misc.c:1872
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:1833
GtkWidget * check_button(gchar *text, int dimx, int dimy, gboolean state, GCallback handler, gpointer data)
create a check button
Definition gtk-misc.c:1893
@ CONTAINER_WIN
Definition global.h:252
GtkWidget * create_combo()
create a GtkCombox widget, note deprecated in GTK4
Definition gtk-misc.c:984
GtkWidget * dialog_get_content_area(GtkWidget *widg)
prepare GtkWidget to insert content in a GtkDialog window
Definition gtk-misc.c:835
GtkWidget * markup_label(gchar *text, int dimx, int dimy, float ax, float ay)
create a GtkLabel with pango markup
Definition gtk-misc.c:1646
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:308
void widget_set_sensitive(GtkWidget *widg, gboolean sensitive)
Set sensitivity for a GtkWidget, ensuring it is a GtkWidget.
Definition gtk-misc.c:215
void destroy_this_dialog(GtkDialog *dialog)
destroy a GtkDialog
Definition gtk-misc.c:2200
GtkWidget * create_hbox(int spacing)
create a GtkBox with horizontal orientation
Definition gtk-misc.c:823
void combo_text_append(GtkWidget *combo, gchar *text)
append text in GtkComboBox widget
Definition gtk-misc.c:961
GtkWidget * create_layout(int x, int y)
create a GtkLayout / GtkFixed widget
Definition gtk-misc.c:890
GtkWidget * destroy_this_widget(GtkWidget *widg)
destroy a GtkWidget
Definition gtk-misc.c:2169
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:754
GtkWidget * bbox(GtkWidget *box, char *lab)
box creating routine, to help design faster elements for the GUI
Definition gtk-misc.c:2040
void add_container_child(int type, GtkWidget *widg, GtkWidget *child)
Add a GtkWidget into another GtkWidget.
Definition gtk-misc.c:235
void hide_the_widgets(GtkWidget *widg)
hide GtkWidget
Definition gtk-misc.c:198
GtkWidget * create_vbox(int spacing)
create a GtkBox with vertical orientation
Definition gtk-misc.c:811
int button_get_status(GtkWidget *button)
get status of check / toggle button
Definition gtk-misc.c:1855
void show_the_widgets(GtkWidget *widg)
show GtkWidget
Definition gtk-misc.c:182
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:450
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
#define DEFAULT_INTENSITY
Default light intensity.
Definition glview.h:94
#define TEMPLATES
Number of material templates.
Definition glview.h:80
struct box box
box layout data structure
Definition glwin.h:349
@ LIGHT
Definition glwin.h:100
Function declarations for the creation of the OpenGL window.
Messaging function declarations.
position
Definition m_proj.c:48
double z
Definition ogl_draw.c:61
double y
Definition ogl_draw.c:61
double x
Definition ogl_draw.c:61
opengl_edition * pref_ogl_edit
Material tmp_material
int * tmp_opengl
Lightning tmp_lightning
gboolean preferences
Fog tmp_fog
Preference variable declarations.
Definition glwin.h:234
Definition glwin.h:182
int fix
Definition glwin.h:184
vec3_t spot_data
Definition glwin.h:190
vec3_t direction
Definition glwin.h:187
vec3_t attenuation
Definition glwin.h:189
int show
Definition glwin.h:185
int type
Definition glwin.h:183
vec3_t position
Definition glwin.h:186
vec3_t intensity
Definition glwin.h:188
Light * spot
Definition glwin.h:201
GLfloat param[6]
Definition glwin.h:219
Definition glwin.h:351
Definition global.h:99
Definition glwin.h:965
int mode
Definition glwin.h:1048
Definition global.h:106
float y
Definition math_3d.h:130
float x
Definition math_3d.h:130
float z
Definition math_3d.h:130
int b
Definition tab-1.c:95
int c
Definition tab-1.c:95
int a
Definition tab-1.c:95
GtkWidget * d_close
Definition w_advance.c:177
Light * copy_light_sources(int dima, int dimb, Light *old_sp)
create a copy of a list of light sources
Definition w_advance.c:402
G_MODULE_EXPORT void set_light_fix(GtkComboBox *box, gpointer data)
set light fix callback
Definition w_advance.c:833
void print_light_source(Light source, int i)
print light source data
Definition w_advance.c:297
G_MODULE_EXPORT void set_use_template_toggle(GtkToggleButton *but, gpointer data)
use or not OpenGL material template callback GTK3
Definition w_advance.c:1049
GtkWidget * materials_tab(glwin *view, opengl_edition *ogl_edit, Material *the_mat)
OpenGL material parameters tab.
Definition w_advance.c:1323
G_MODULE_EXPORT void set_object_pos(GtkEntry *res, gpointer data)
set object position
Definition w_advance.c:755
Light init_light_source(int type, float size, float depth)
initialize a light source
Definition w_advance.c:337
G_MODULE_EXPORT void set_nlights_spin(GtkSpinButton *res, gpointer data)
change the number of light(s) - spin button
Definition w_advance.c:654
void set_quality(int q, glwin *view)
set OpenGL quality
Definition m_quality.c:60
G_MODULE_EXPORT void set_template(GtkComboBox *box, gpointer data)
change the OpenGL material template
Definition w_advance.c:1113
G_MODULE_EXPORT void set_fog_mode(GtkWidget *widg, gpointer data)
set fog mode callback
Definition w_advance.c:1552
G_MODULE_EXPORT void set_fog_type(GtkWidget *widg, gpointer data)
set OpenGL fog type
Definition w_advance.c:1483
void setup_fog_dialogs(opengl_edition *ogl_edit, int fid)
update OpenGL fog tab based of fog type
Definition w_advance.c:1509
void fog_param_changed(gpointer data, GLfloat u, GtkRange *range)
update OpenGL fog parameter
Definition w_advance.c:1397
G_MODULE_EXPORT void opengl_advanced(GtkWidget *widg, gpointer data)
create OpenGL rendering advanced window
Definition w_advance.c:1670
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:257
gchar * material_template[TEMPLATES]
Definition w_advance.c:97
G_MODULE_EXPORT gboolean scroll_scale_quality(GtkRange *range, GtkScrollType scroll, gdouble value, gpointer data)
update OpenGL quality - scroll callback
Definition w_advance.c:1263
GtkWidget ** light_but
Definition w_advance.c:221
gchar * lpos[3]
Definition w_advance.c:137
int status
Definition w_advance.c:178
Light copy_light_source(Light old_sp)
create a copy of a light source
Definition w_advance.c:379
G_MODULE_EXPORT void update_mat_param(GtkEntry *res, gpointer data)
update OpenGL material parameter - entry
Definition w_advance.c:1217
GtkWidget * fog_tab(glwin *view, opengl_edition *ogl_edit, Fog *the_fog)
OpenGL fog parameters tab.
Definition w_advance.c:1566
G_MODULE_EXPORT void show_this_light(GtkToggleButton *but, gpointer data)
show / hide this light callback GTK3
Definition w_advance.c:875
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:1456
void close_advanced_opengl(gpointer data)
close OpenGL rendering window free data
Definition w_advance.c:1627
void show_active_light_data(opengl_edition *ogl_win, int lid, int tid)
show active light data
Definition w_advance.c:432
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:517
float mat_min_max[5][2]
Definition w_advance.c:113
void update_light_data(int li, opengl_edition *ogl_win)
update light data
Definition w_advance.c:474
G_MODULE_EXPORT gboolean close_advanced(GtkWidget *widg, GdkEvent *event, gpointer data)
close OpenGL rendering advanced window callback GTK3
Definition w_advance.c:1655
G_MODULE_EXPORT void scale_param(GtkRange *range, gpointer data)
update OpenGL material parameter - range callback
Definition w_advance.c:1248
gchar * ogl_settings[3][10]
Definition w_advance.c:119
GtkWidget * lightning_fix(glwin *view, Material *this_material)
Definition w_advance.c:1296
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:899
void set_data_pos(vec3_t *vect, int pos, double v)
modify a vector component
Definition w_advance.c:731
int * light_list
Definition w_advance.c:220
G_MODULE_EXPORT void set_fog_param(GtkRange *range, gpointer data)
update OpenGL fog parameter - range callback
Definition w_advance.c:1470
G_MODULE_EXPORT void update_light_param(GtkEntry *res, gpointer data)
update light parameter
Definition w_advance.c:684
G_MODULE_EXPORT void toggled_delete_ligth(GtkToggleButton *but, gpointer data)
toggle delete light callback GTK3
Definition w_advance.c:199
void add_remove_lights(int val, gpointer data)
add or remove lights
Definition w_advance.c:555
G_MODULE_EXPORT void set_nlights(GtkEntry *res, gpointer data)
change the number of light(s) - entry
Definition w_advance.c:667
GtkWidget * adv_box(GtkWidget *box, char *lab, int vspace, int size, float xalign)
create a box with markup label
Definition w_advance.c:151
gchar * cpos[3]
Definition w_advance.c:138
G_MODULE_EXPORT void scale_quality(GtkRange *range, gpointer data)
update OpenGL quality - range callback
Definition w_advance.c:1280
GLfloat template_parameters[TEMPLATES][5]
Definition w_advance.c:105
G_MODULE_EXPORT void set_l_model(GtkComboBox *box, gpointer data)
change OpenGL lightning model
Definition w_advance.c:1161
GtkWidget * bdv_box(GtkWidget *box, char *lab, int size, float xalign)
create a box with markup label
Definition w_advance.c:169
void param_has_changed(gpointer data, double val)
update OpenGL material parameter
Definition w_advance.c:1183
GtkWidget * lights_tab(glwin *view, opengl_edition *ogl_edit, Lightning *ogl_lightning)
OpenGL light(s) parameters tab.
Definition w_advance.c:938
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:1234
G_MODULE_EXPORT void set_light_type(GtkComboBox *box, gpointer data)
set light type callback
Definition w_advance.c:817
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:232
void create_lights_combo(int num_lights, opengl_edition *ogl_win)
create light combo box
Definition w_advance.c:531
GtkWidget * res[2]
Definition w_encode.c:212
GtkWidget * hbox
Definition workspace.c:71
GtkWidget * img
Definition workspace.c:70
GtkWidget * vbox
Definition workspace.c:72
GtkWidget * lab
Definition workspace.c:73