atomes 1.2.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
glview.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: 'glview.c'
24*
25* Contains:
26*
27
28 - The callbacks of the OpenGL window
29
30*
31* List of functions:
32
33 GLuint * allocgluint (int val);
34 GLuint ** allocdgluint (int xal, int yal);
35
36 GLfloat ** allocdGLfloat (int xal, int yal);
37
38 GLdouble get_max_depth (GLdouble depth);
39
40 gboolean is_GLExtension_Supported (const char * extension);
41
42 G_MODULE_EXPORT gboolean on_motion (GtkWidget * widg, GdkEvent * event, gpointer data);
43 G_MODULE_EXPORT gboolean on_lib_pressed (GtkWidget * widg, GdkEvent * event, gpointer data);
44 G_MODULE_EXPORT gboolean on_glwin_button_event (GtkWidget * widg, GdkEvent * event, gpointer data);
45 G_MODULE_EXPORT gboolean on_scrolled (GtkWidget * widg, GdkEvent * event, gpointer data);
46 G_MODULE_EXPORT gboolean on_glwin_pointer_scoll (GtkEventControllerScroll * event, gdouble dx, gdouble dy, gpointer data);
47 G_MODULE_EXPORT gboolean on_expose (GtkGLArea * area, GdkGLContext * context, gpointer data);
48 G_MODULE_EXPORT gboolean on_expose (GtkWidget * widg, cairo_t * cr, gpointer data);
49
50 void update_bonds_ (int * bd, int * stp,
51 int * bdim, int bda[* bdim], int bdb[* bdim],
52 double * x, double * y, double * z);
53 void sort (int dim, int * tab);
54 void update_atom_neighbors_ (int * stp, int * at, int * nv);
55 void update_this_neighbor_ (int * stp, int * at, int * iv, int * nv);
56 void update (glwin * view);
57 void transform (glwin * view, double aspect);
58 void reshape (glwin * view, int width, int height, gboolean use_ratio);
59 void save_rotation_quaternion (glwin * view);
60 void edit_for_motion (glwin * view);
61 void motion (glwin * view, gint x, gint y, GdkModifierType state);
62 void render_this_gl_window (glwin * view, GtkGLArea * area);
63 void render_this_gl_window (glwin * view, GtkWidget * widg, gint button);
64 void glwin_lib_pressed (double x, double y, guint event_type, int event_button, gpointer data);
65 void glwin_button_event (double event_x, double event_y, guint event_button, guint event_type, guint32 event_time, gpointer data);
66 void zoom (glwin * view, int delta);
67 void rotate_x_y (glwin * view, double angle_x, double angle_y);
68 void init_camera (project * this_proj, int get_depth);
69 void setup_default_species_parameters_for_image (project * this_proj, image * img);
70 void setup_image_spec_data (project * this_proj, image * img);
71 void setup_default_lights (project * this_proj, image * img);
72 void setup_default_image (project * this_proj, image * img);
73 void init_img (project * this_proj);
74 void init_opengl ();
75 void center_molecule (project * this_proj);
76 void center_this_molecule (glwin * view);
77 void free_glwin_spec_data (project * this_proj, int spec);
78 void glwin_init_spec_data (project * this_proj, int nspec);
79 void init_glwin (glwin * view);
80 void gtk_window_change_gdk_visual (GtkWidget * win);
81
82 G_MODULE_EXPORT void on_glwin_pointer_motion (GtkEventControllerMotion * motc, gdouble x, gdouble y, gpointer data);
83 G_MODULE_EXPORT void on_lib_button_pressed (GtkGesture * gesture, int n_press, double x, double y, gpointer data);
84 G_MODULE_EXPORT void on_lib_button_released (GtkGesture * gesture, int n_press, double x, double y, gpointer data);
85 G_MODULE_EXPORT void on_glwin_button_pressed (GtkGesture * gesture, int n_press, double x, double y, gpointer data);
86 G_MODULE_EXPORT void on_glwin_button_released (GtkGesture * gesture, int n_press, double x, double y, gpointer data);
87 G_MODULE_EXPORT void on_realize (GtkGLArea * area, gpointer data);
88 G_MODULE_EXPORT void on_realize (GtkWidget * widg, gpointer data);
89
90 GError * init_gtk_gl_area (GtkGLArea * area);
91
92 ColRGBA set_default_color (int z);
93
94*/
95
96#include "global.h"
97#include "interface.h"
98#include "preferences.h"
99#include "initcoord.h"
100#include "bind.h"
101#include "project.h"
102#include "glview.h"
103
104extern vec3_t arc_ball_init;
106extern void process_the_hits (glwin * view, gint event_button, double ptx, double pty);
107extern void arc_ball_rotation (glwin * view, int x, int y);
108extern vec3_t get_arc_ball_vector (glwin * view, int x, int y);
109extern Light init_light_source (int type, float val, float vbl);
110extern void rotate_quat (project * this_proj, vec4_t q, int status, int axis);
111extern void translate (project * this_proj, int status, int axis, vec3_t trans);
112extern vec3_t get_bary (project * this_proj, int status);
113extern void update_labels (glwin * view);
114extern void prepare_atom_edition (gpointer data, gboolean visible);
115extern atom_search * allocate_atom_search (int proj, int action, int searchid, int tsize);
116extern int action_atoms_from_project (project * this_proj, atom_search * asearch, gboolean visible);
117extern atomic_object * create_object_from_frag_mol (project * this_proj, int coord, int geo, atom_search * remove);
118extern void duplicate_material (Material * new_mat, Material * old_mat);
119extern void duplicate_fog (Fog * new_fog, Fog * old_fog);
120extern void duplicate_screen_label (screen_label * new_lab, screen_label * old_lab);
121
123
131GLuint * allocgluint (int val)
132{
133 GLuint * var = NULL;
134
135 var = g_malloc0 (val*sizeof*var);
136 return var;
137}
138
147GLuint ** allocdgluint (int xal, int yal)
148{
149 GLuint ** var = NULL;
150 int i;
151
152 var = g_malloc (xal*sizeof*var);
153 for ( i = 0 ; i < xal ; i ++ )
154 {
155 /* allocation d'un tableau de tableau */
156 var[i] = allocgluint(yal);
157 }
158 return var;
159}
160
169GLfloat ** allocdGLfloat (int xal, int yal)
170{
171 GLfloat ** var = NULL;
172 int i;
173
174 var = g_malloc (xal*sizeof*var);
175 for ( i = 0 ; i < xal ; i ++ )
176 {
177 /* allocation d'un tableau de tableau */
178 var[i] = g_malloc0 (yal*sizeof*var[i]);
179 }
180 return var;
181}
182
183const float light_pos[MAX_LIGHTS][4] = {{-0.1f, 0.1f, 1.0f, 0.0f},
184 { 1.0f, 2.0f, 0.5f, 0.0f},
185 {-1.0f, 2.0f, -1.0f, 0.0f},
186 {-1.0f, -1.0f, 0.0f, 0.0f}};
187
196{
197 ColRGBA col;
198 double colors[118][3]={{1.00, 1.00, 1.00},
199 {0.85, 1.00, 1.00},
200 {0.80, 0.50, 1.00},
201 {0.76, 1.00, 0.00},
202 {1.00, 0.71, 0.71},
203 {0.56, 0.56, 0.56},
204 {0.18, 0.31, 0.97},
205 {1.00, 0.05, 0.05},
206 {0.56, 0.87, 0.31},
207 {0.70, 0.89, 0.96},
208 {0.67, 0.36, 0.95},
209 {0.54, 1.00, 0.00},
210 {0.75, 0.65, 0.65},
211 {0.94, 0.78, 0.62},
212 {1.00, 0.50, 0.00},
213 {1.00, 1.00, 0.19},
214 {0.12, 0.94, 0.12},
215 {0.50, 0.82, 0.89},
216 {0.56, 0.25, 0.83},
217 {0.24, 1.00, 0.00},
218 {0.90, 0.90, 0.90},
219 {0.75, 0.76, 0.78},
220 {0.65, 0.65, 0.67},
221 {0.54, 0.60, 0.78},
222 {0.61, 0.48, 0.78},
223 {0.87, 0.40, 0.20},
224 {0.94, 0.56, 0.62},
225 {0.31, 0.81, 0.31},
226 {0.78, 0.50, 0.20},
227 {0.49, 0.50, 0.69},
228 {0.76, 0.56, 0.56},
229 {0.40, 0.56, 0.56},
230 {0.74, 0.50, 0.89},
231 {1.00, 0.63, 0.00},
232 {0.65, 0.16, 0.16},
233 {0.36, 0.72, 0.82},
234 {0.44, 0.18, 0.69},
235 {0.00, 1.00, 0.00},
236 {0.58, 1.00, 1.00},
237 {0.58, 0.88, 0.88},
238 {0.45, 0.76, 0.79},
239 {0.33, 0.71, 0.71},
240 {0.23, 0.62, 0.62},
241 {0.14, 0.56, 0.56},
242 {0.04, 0.49, 0.55},
243 {0.00, 0.41, 0.52},
244 {0.75, 0.75, 0.75},
245 {1.00, 0.85, 0.56},
246 {0.65, 0.46, 0.45},
247 {0.40, 0.50, 0.50},
248 {0.62, 0.39, 0.71},
249 {0.83, 0.48, 0.00},
250 {0.58, 0.00, 0.58},
251 {0.26, 0.62, 0.69},
252 {0.34, 0.09, 0.56},
253 {0.00, 0.79, 0.00},
254 {0.44, 0.83, 1.00},
255 {1.00, 1.00, 0.78},
256 {0.85, 1.00, 0.78},
257 {0.78, 1.00, 0.78},
258 {0.64, 1.00, 0.78},
259 {0.56, 1.00, 0.78},
260 {0.38, 1.00, 0.78},
261 {0.27, 1.00, 0.78},
262 {0.19, 1.00, 0.78},
263 {0.12, 1.00, 0.78},
264 {0.00, 1.00, 0.61},
265 {0.00, 0.90, 0.46},
266 {0.00, 0.83, 0.32},
267 {0.00, 0.75, 0.22},
268 {0.00, 0.67, 0.14},
269 {0.30, 0.76, 1.00},
270 {0.30, 0.65, 1.00},
271 {0.13, 0.58, 0.84},
272 {0.15, 0.49, 0.67},
273 {0.15, 0.40, 0.59},
274 {0.09, 0.33, 0.53},
275 {0.81, 0.81, 0.87},
276 {1.00, 0.81, 0.13},
277 {0.72, 0.72, 0.81},
278 {0.65, 0.33, 0.30},
279 {0.34, 0.35, 0.38},
280 {0.62, 0.31, 0.71},
281 {0.67, 0.36, 0.00},
282 {0.46, 0.31, 0.27},
283 {0.26, 0.51, 0.59},
284 {0.26, 0.00, 0.40},
285 {0.00, 0.49, 0.00},
286 {0.44, 0.67, 0.98},
287 {0.00, 0.73, 1.00},
288 {0.00, 0.63, 1.00},
289 {0.00, 0.56, 1.00},
290 {0.00, 0.50, 1.00},
291 {0.00, 0.42, 1.00},
292 {0.33, 0.36, 0.95},
293 {0.54, 0.31, 0.89},
294 {0.63, 0.21, 0.83},
295 {0.70, 0.12, 0.83},
296 {0.70, 0.12, 0.73},
297 {0.70, 0.05, 0.65},
298 {0.74, 0.05, 0.53},
299 {0.78, 0.00, 0.40},
300 {0.80, 0.00, 0.35},
301 {0.82, 0.00, 0.31},
302 {0.85, 0.00, 0.27},
303 {0.88, 0.00, 0.22},
304 {0.90, 0.00, 0.18},
305 {0.92, 0.00, 0.15},
306 {0.93, 0.00, 0.14},
307 {0.94, 0.00, 0.13},
308 {0.95, 0.00, 0.12},
309 {0.96, 0.00, 0.10},
310 {0.97, 0.00, 0.10},
311 {0.98, 0.00, 0.10},
312 {0.99, 0.00, 0.10},
313 {1.00, 0.00, 0.10},
314 {1.00, 0.00, 0.15},
315 {1.00, 0.00, 0.20}};
316 // Dumy atoms have z < 1
317 int Z = (z < 1) ? 1 : z;
318 col.red = colors[Z-1][0];
319 col.green = colors[Z-1][1];
320 col.blue = colors[Z-1][2];
321 col.alpha = 1.0;
322 return col;
323}
324
341void update_bonds_ (int * bd, int * stp,
342 int * bdim, int bda[* bdim], int bdb[* bdim],
343 double * x, double * y, double * z)
344{
345 int i, j, k;
346
347 active_glwin -> allbonds[* bd] += * bdim;
348 active_glwin -> bonds[* stp][* bd] = * bdim;
349
350 if (* bdim > 0)
351 {
352 active_glwin -> bondid[* stp][* bd] = NULL;
353 active_glwin -> bondid[* stp][* bd] = allocdint (* bdim, 2);
354 for (i=0; i< * bdim; i++)
355 {
356 j = bda[i] - 1;
357 k = bdb[i] - 1;
358 active_glwin -> bondid[* stp][* bd][i][0] = j;
359 active_glwin -> bondid[* stp][* bd][i][1] = k;
360 }
361 if (* bd)
362 {
363 if (active_glwin -> clones[* stp] != NULL)
364 {
365 g_free (active_glwin -> clones[* stp]);
366 active_glwin -> clones[* stp] = NULL;
367 }
368 active_glwin -> clones[* stp] = g_malloc0 (*bdim*sizeof*active_glwin -> clones[* stp]);
369 for (i=0; i< * bdim; i++)
370 {
371 active_glwin -> clones[* stp][i].x = x[i];
372 active_glwin -> clones[* stp][i].y = y[i];
373 active_glwin -> clones[* stp][i].z = z[i];
374 j = bda[i] - 1;
375 k = bdb[i] - 1;
376 active_project -> atoms[* stp][j].cloned = TRUE;
377 active_project -> atoms[* stp][k].cloned = TRUE;
378 }
379 }
380 }
381}
382
391void sort (int dim, int * tab)
392{
393 int i, j, val;
394 for (i=1; i<dim; i++)
395 {
396 val = tab[i];
397 for (j=i-1; j>-1; j--)
398 {
399 if (tab[j] <= val) break;
400 tab[j+1] = tab[j];
401 }
402 tab[j+1] = val;
403 }
404}
405
415void update_atom_neighbors_ (int * stp, int * at, int * nv)
416{
417 active_project -> atoms[* stp][* at].numv = * nv;
418 if (* nv)
419 {
420 active_project -> atoms[* stp][* at].vois = allocint(* nv);
421 }
422}
423
434void update_this_neighbor_ (int * stp, int * at, int * iv, int * nv)
435{
436 active_project -> atoms[* stp][* at].vois[* iv] = * nv - 1;
437 if (* iv == active_project -> atoms[* stp][* at].numv - 1)
438 {
439 sort (active_project -> atoms[* stp][* at].numv, active_project -> atoms[* stp][* at].vois);
440 }
441}
442
450void update (glwin * view)
451{
452 gtk_gl_area_queue_render ((GtkGLArea *)view -> plot);
453#ifdef G_OS_WIN32
454#ifdef GTK3
455 hide_the_widgets (view -> plot);
456 show_the_widgets (view -> plot);
457#endif
458#endif
459}
460
469void transform (glwin * view, double aspect)
470{
471 GLdouble w, h;
472 GLdouble dw, dh;
473
474 double zoom = view -> anim -> last -> img -> zoom;
475 view -> zoom_factor = zoom * 0.1 * view -> anim -> last -> img -> p_depth / (2.0 * view -> anim -> last -> img -> gfar);
476 if (view -> anim -> last -> img -> rep == ORTHOGRAPHIC)
477 {
478 zoom *= (view -> anim -> last -> img -> p_depth / view -> anim -> last -> img -> gnear);
479 }
480 dw = view -> anim -> last -> img -> c_shift[0]*2.0*zoom;
481 dh = view -> anim -> last -> img -> c_shift[1]*2.0*zoom;
482 if (aspect > 1.0)
483 {
484 w = zoom * aspect;
485 h = zoom;
486 }
487 else
488 {
489 w = zoom;
490 h = zoom / aspect;
491 }
492 view -> anim -> last -> img -> gleft = -w + dw;
493 view -> anim -> last -> img -> gright = w + dw;
494 view -> anim -> last -> img -> gbottom = -h + dh;
495 view -> anim -> last -> img -> gtop = h + dh;
496
497 if (view -> anim -> last -> img -> rep == PERSPECTIVE)
498 {
499 view -> projection_matrix = m4_frustum (view -> anim -> last -> img -> gleft,
500 view -> anim -> last -> img -> gright,
501 view -> anim -> last -> img -> gbottom,
502 view -> anim -> last -> img -> gtop,
503 view -> anim -> last -> img -> gnear,
504 view -> anim -> last -> img -> gfar);
505 }
506 else
507 {
508 view -> projection_matrix = m4_ortho (view -> anim -> last -> img -> gleft,
509 view -> anim -> last -> img -> gright,
510 view -> anim -> last -> img -> gbottom,
511 view -> anim -> last -> img -> gtop,
512 -view -> anim -> last -> img -> gfar,
513 view -> anim -> last -> img -> gfar);
514 }
515}
516
527void reshape (glwin * view, int width, int height, gboolean use_ratio)
528{
529 double aspect;
530 int scale = 1.0;
531 if (use_ratio)
532 {
533 if (view -> win)
534 {
535 if (GTK_IS_WIDGET(view -> win))
536 {
537 scale = gtk_widget_get_scale_factor (view -> win);
538 }
539 }
540 }
541 glViewport (0, 0, (GLsizei) scale * width, (GLsizei) scale * height);
542 view -> view_port = vec4 (0.0, 0.0, width, height);
543 aspect = (double) width / (double) height;
544 transform (view, aspect);
545}
546
555{
556 //int i;
557 //for (i=0; i<4; i++) old_rotation_quaternion[i] = view -> anim -> last -> img -> rotation_quaternion[i];
558 old_rotation_quaternion.w = view -> anim -> last -> img -> rotation_quaternion.w;
559 old_rotation_quaternion.x = view -> anim -> last -> img -> rotation_quaternion.x;
560 old_rotation_quaternion.y = view -> anim -> last -> img -> rotation_quaternion.y;
561 old_rotation_quaternion.z = view -> anim -> last -> img -> rotation_quaternion.z;
562}
563
572{
573 gboolean check_edit = FALSE;
574 project * this_proj = get_project_by_id(view -> proj);
575 prepare_atom_edition (& view -> colorp[0][0], FALSE);
576 atom_search * move_search = allocate_atom_search (this_proj -> id, DISPL, DISPL, this_proj -> natomes);
577 int ** frag = allocdint (this_proj -> coord -> totcoord[2], 2);
578 int i, j, k;
579 j = 0;
580 for (i=0; i<this_proj -> natomes; i++)
581 {
582 k = this_proj -> atoms[0][i].coord[2];
583 frag[k][0] ++;
584 if (this_proj -> atoms[0][i].pick[0])
585 {
586 move_search -> todo[i] = 1;
587 frag[k][1] ++;
588 j ++;
589 }
590 }
591 if (j)
592 {
593 for (i=0; i<this_proj -> coord -> totcoord[2]; i++)
594 {
595 if (frag[i][1] && frag[i][1] < frag[i][0])
596 {
597 check_edit = TRUE;
598 break;
599 }
600 }
601 if (check_edit)
602 {
603 action_atoms_from_project (this_proj, move_search,
604 (this_proj -> modelgl -> atom_win) ? this_proj -> modelgl -> atom_win -> visible : FALSE);
605 }
606 else
607 {
608 atomic_object * object;
609 for (i=0; i<this_proj -> coord -> totcoord[2]; i++)
610 {
611 if (frag[i][1])
612 {
613 object_motion = TRUE;
614 object = create_object_from_frag_mol (this_proj, 2, i, NULL);
615 object_motion = FALSE;
616 g_free (object);
617 }
618 }
619 }
620 g_free (frag);
621 }
622 view -> baryc[1] = get_bary (this_proj, 1);
623 move_search = free_this_search_data (move_search);
624 view -> prepare_motion = FALSE;
625}
626
637void motion (glwin * view, gint x, gint y, GdkModifierType state)
638{
639 view -> mouseAction = MOTION;
640 int i;
641 if (view -> mode == EDITION && view -> prepare_motion && view -> rebuild[0][0]) edit_for_motion (view);
642
643 if (state & GDK_BUTTON1_MASK)
644 {
645 arc_ball_rotation (view, x, y);
646 }
647 else if (state & GDK_BUTTON2_MASK)
648 {
649 if (view -> mode != EDITION)
650 {
651 view -> anim -> last -> img -> c_shift[0] -= (double) (x - view -> mouseX) / view -> pixels[0];
652 view -> anim -> last -> img -> c_shift[1] += (double) (y - view -> mouseY) / view -> pixels[1];
653 for (i=0; i<2; i++)
654 {
655 if (view -> rep_win)
656 {
657 if (view -> rep_win -> camera_widg[i+5] && GTK_IS_WIDGET(view -> rep_win -> camera_widg[i+5]))
658 {
659 gtk_spin_button_set_value ((GtkSpinButton *)view -> rep_win -> camera_widg[i+5], - view -> anim -> last -> img -> c_shift[i]);
660 }
661 }
662 }
663 }
664 else
665 {
666 vec3_t pos_a = vec3(x, - y, 0.75);
667 vec3_t pos_b = vec3(view -> mouseX, - view -> mouseY, 0.75);
668 vec3_t trans_a = v3_un_project (pos_a, view -> view_port, view -> projection_matrix);
669 vec3_t trans_b = v3_un_project (pos_b, view -> view_port, view -> projection_matrix);
670 vec3_t trans;
671 trans.x = (trans_a.x - trans_b.x);
672 trans.y = (trans_b.y - trans_a.y);
673 if (view -> anim -> last -> img -> rep == PERSPECTIVE)
674 {
675 trans.x *= view -> anim -> last -> img -> p_depth;
676 trans.y *= view -> anim -> last -> img -> p_depth;
677 }
678 trans.z = 0.0;
679 translate (get_project_by_id(view -> proj), 1, 1, trans);
680 }
681 }
682 if (view -> mode == EDITION)
683 {
685#ifdef GTK3
686 // GTK3 Menu Action To Check
688#endif
689 }
690 view -> mouseX = x;
691 view -> mouseY = y;
692 update (view);
693}
694
695#ifdef GTK3
705G_MODULE_EXPORT gboolean on_motion (GtkWidget * widg, GdkEvent * event, gpointer data)
706{
707 glwin * view = (glwin *) data;
708 if (view -> mouseStatus != RELEASED)
709 {
710 GdkEventMotion * mevent = (GdkEventMotion *)event;
711 gint x, y;
712 GdkModifierType state;
713 if (mevent -> is_hint)
714 {
715 gdk_window_get_device_position (mevent -> window, mevent -> device, & x, & y, & state);
716 }
717 else
718 {
719 x = (gint) mevent -> x;
720 y = (gint) mevent -> y;
721 state = (GdkModifierType) mevent -> state;
722 }
723 motion (view, x, y, state);
724 }
725 return FALSE;
726}
727#else
738G_MODULE_EXPORT void on_glwin_pointer_motion (GtkEventControllerMotion * motc, gdouble x, gdouble y, gpointer data)
739{
740 glwin * view = (glwin *) data;
741 if (view -> mouseStatus != RELEASED)
742 {
743 motion (view, (gint)x, (gint)y, gtk_event_controller_get_current_event_state((GtkEventController*)motc));
744 }
745}
746#endif
747
748#ifdef GTKGLAREA
757void render_this_gl_window (glwin * view, GtkGLArea * area)
758#else
768void render_this_gl_window (glwin * view, GtkWidget * widg, gint button)
769#endif
770{
771#ifdef GTKGLAREA
772 view -> pixels[0] = get_widget_width (GTK_WIDGET(area));
773 view -> pixels[1] = get_widget_height (GTK_WIDGET(area));
774 gtk_gl_area_make_current (area);
775 if (gtk_gl_area_get_error (area) == NULL)
776#else
777 view -> pixels[0] = get_widget_width (widg);
778 view -> pixels[1] = get_widget_height (widg);
779 GdkWindow * win = gtk_widget_get_window (widg);
780 if (glXMakeCurrent (GDK_WINDOW_XDISPLAY (win), GDK_WINDOW_XID (win), view -> glcontext))
781#endif
782 {
783 reshape (view, view -> pixels[0], view -> pixels[1], TRUE);
784 draw (view);
785 if (view -> to_pick)
786 {
787 if (view -> mouseButton) process_the_hits (view, view -> mouseButton, view -> mouseX, view -> mouseY);
788 view -> to_pick = FALSE;
789 reshape (view, view -> pixels[0], view -> pixels[1], TRUE);
790 draw (view);
791 }
792#ifdef GTKGLAREA
793 glFlush ();
794#else
795 glXSwapBuffers (GDK_WINDOW_XDISPLAY (win), GDK_WINDOW_XID (win));
796#endif
797 }
798}
799
811void glwin_lib_pressed (double x, double y, guint event_type, guint event_button, gpointer data)
812{
813 glwin * view = (glwin *) data;
814 switch (event_type)
815 {
816 case GDK_BUTTON_PRESS:
817 view -> mouseStatus = CLICKED;
818 view -> mouseX = x;
819 view -> mouseY = y;
820 view -> mouseButton = event_button;
821 if (event_button == 1)
822 {
824 arc_ball_init = get_arc_ball_vector (view, view -> mouseX, view -> mouseY);
825 view -> to_pick = FALSE;
826 update (view);
827 }
828 break;
829 case GDK_BUTTON_RELEASE:
830 view -> mouseStatus = RELEASED;
831 break;
832 }
833}
834
835#ifdef GTK3
845G_MODULE_EXPORT gboolean on_lib_pressed (GtkWidget * widg, GdkEvent * event, gpointer data)
846{
847 GdkEventButton * bevent = (GdkEventButton*)event;
848 glwin_lib_pressed (bevent -> x, bevent -> y, bevent -> type, bevent -> button, data);
849 return FALSE;
850}
851#else
863G_MODULE_EXPORT void on_lib_button_pressed (GtkGesture * gesture, int n_press, double x, double y, gpointer data)
864{
865 glwin_lib_pressed (x, y, GDK_BUTTON_PRESS, gtk_gesture_single_get_current_button ((GtkGestureSingle * )gesture), data);
866}
867
879G_MODULE_EXPORT void on_lib_button_released (GtkGesture * gesture, int n_press, double x, double y, gpointer data)
880{
881 glwin_lib_pressed (x, y, GDK_BUTTON_RELEASE, gtk_gesture_single_get_current_button ((GtkGestureSingle * )gesture), data);
882}
883#endif // GTK3
884
886
899void glwin_button_event (double event_x, double event_y, guint event_button, guint event_type, guint32 event_time, gpointer data)
900{
901 glwin * view = (glwin *) data;
902 switch (event_type)
903 {
904 case GDK_BUTTON_PRESS:
905 view -> mouseStatus = CLICKED;
906 view -> mouseX = event_x;
907 view -> mouseY = event_y;
908 view -> mouseButton = event_button;
909 clock_gettime (CLOCK_MONOTONIC, & start_time);
910 if (event_button == 1 || event_button == 3)
911 {
913 arc_ball_init = get_arc_ball_vector (view, view -> mouseX, view -> mouseY);
914 view -> nth_copy = 0;
915 view -> insert_coords = get_insertion_coordinates (view);
916#ifdef GTKGLAREA
917 view -> to_pick = TRUE;
918 update (view);
919#else
920 render_this_gl_window (view, plot, event_button);
921#endif
922 }
923 break;
924 case GDK_BUTTON_RELEASE:
925 view -> mouseStatus = RELEASED;
926 view -> mouseButton = 0;
927 clock_gettime (CLOCK_MONOTONIC, & stop_time);
929 {
930#ifdef GTKGLAREA
931 update (view);
932#else
933 render_this_gl_window (view, plot, event_button);
934#endif
935 }
936 if (view -> mode == EDITION && view -> mouseAction == MOTION)
937 {
938 view -> baryc[1] = get_bary (get_project_by_id(view -> proj), 1);
939 view -> mouseAction = ANALYZE;
940 }
941 if (event_button == 3)
942 {
943 switch (to_pop.action)
944 {
945 case 1:
947 break;
948 case 2:
950 break;
951 }
952 to_pop.action = 0;
953 }
954 break;
955 }
956}
957
958#ifdef GTK3
968G_MODULE_EXPORT gboolean on_glwin_button_event (GtkWidget * widg, GdkEvent * event, gpointer data)
969{
970 GdkEventButton * bevent = (GdkEventButton*)event;
971 glwin_button_event (bevent -> x, bevent -> y, bevent -> button, bevent -> type, bevent -> time, data);
972 return FALSE;
973}
974#else
986G_MODULE_EXPORT void on_glwin_button_pressed (GtkGesture * gesture, int n_press, double x, double y, gpointer data)
987{
988 glwin_button_event (x, y, gtk_gesture_single_get_current_button ((GtkGestureSingle * )gesture), GDK_BUTTON_PRESS, gtk_event_controller_get_current_event_time((GtkEventController *)gesture), data);
989}
990
1002G_MODULE_EXPORT void on_glwin_button_released (GtkGesture * gesture, int n_press, double x, double y, gpointer data)
1003{
1004 glwin_button_event (x, y, gtk_gesture_single_get_current_button ((GtkGestureSingle * )gesture), GDK_BUTTON_RELEASE, gtk_event_controller_get_current_event_time((GtkEventController *)gesture), data);
1005}
1006#endif // GTK3
1007
1008// Zoom in or out
1017void zoom (glwin * view, int delta)
1018{
1019 view -> anim -> last -> img -> zoom += delta * view -> zoom_factor;
1020 if (view -> rep_win)
1021 {
1022 if (view -> rep_win -> camera_widg[0] && GTK_IS_WIDGET(view -> rep_win -> camera_widg[0]))
1023 {
1024 gtk_spin_button_set_value ((GtkSpinButton *)view -> rep_win -> camera_widg[0], 1.0-0.5*view -> anim -> last -> img -> zoom);
1025 }
1026 }
1027}
1028
1029#ifdef GTK3
1039G_MODULE_EXPORT gboolean on_scrolled (GtkWidget * widg, GdkEvent * event, gpointer data)
1040{
1041 glwin * view = (glwin *) data;
1042 GdkEventScroll * sevent = (GdkEventScroll *)event;
1043 if (sevent -> direction == GDK_SCROLL_UP)
1044 {
1045 zoom (view, 1);
1046 }
1047 else if (sevent -> direction == GDK_SCROLL_DOWN && view -> anim -> last -> img -> zoom > ZOOM_MAX)
1048 {
1049 zoom (view, -1);
1050 }
1051 update_labels (view);
1052 update (view);
1053 return FALSE;
1054}
1055#else
1066G_MODULE_EXPORT gboolean on_glwin_pointer_scoll (GtkEventControllerScroll * event, gdouble dx, gdouble dy, gpointer data)
1067{
1068 glwin * view = (glwin *) data;
1069 if (dy < 0)
1070 {
1071 zoom (view, 1);
1072 }
1073 else if (dy > 0 && view -> anim -> last -> img -> zoom > ZOOM_MAX)
1074 {
1075 zoom (view, -1);
1076 }
1077 update_labels (view);
1078 update (view);
1079 return TRUE;
1080}
1081#endif
1082
1092void rotate_x_y (glwin * view, double angle_x, double angle_y)
1093{
1094 vec3_t axis;
1095 vec4_t q_a, q_b, q_c;
1096 axis.x = 0.0;
1097 axis.y = 1.0;
1098 axis.z = 0.0;
1099 q_a = axis_to_quat (axis, -pi*angle_y/180.0);
1100 axis.x = 1.0;
1101 axis.y = 0.0;
1102 axis.z = 0.0;
1103 q_b = axis_to_quat (axis, -pi*angle_x/180.0);
1104 q_c = q4_mul (q_a, q_b);
1105 view -> anim -> last -> img -> c_angle[0] -= angle_x;
1106 view -> anim -> last -> img -> c_angle[1] -= angle_y;
1107 int i;
1108 for (i=0; i<2; i++)
1109 {
1110 if (fabs(view -> anim -> last -> img -> c_angle[i]) > 180.0) view -> anim -> last -> img -> c_angle[i] = 0.0;
1111 if (view -> rep_win)
1112 {
1113 if (view -> rep_win -> camera_widg[i+3] && GTK_IS_WIDGET(view -> rep_win -> camera_widg[i+3]))
1114 {
1115 gtk_spin_button_set_value ((GtkSpinButton *)view -> rep_win -> camera_widg[i+3], view -> anim -> last -> img -> c_angle[i]);
1116 }
1117 }
1118 }
1119
1120 if (view -> mode != EDITION)
1121 {
1122 view -> anim -> last -> img -> rotation_quaternion = q4_mul (old_rotation_quaternion, q_c);
1123 }
1124 else
1125 {
1126 rotate_quat (get_project_by_id(view -> proj), q_c, 1, 1);
1127 init_default_shaders (view);
1128#ifdef GTK3
1129 // GTK3 Menu Action To Check
1131#endif
1132 }
1133}
1134
1142GLdouble get_max_depth (GLdouble depth)
1143{
1144 if (depth < 10.0)
1145 {
1146 return 10.0;
1147 }
1148 else if (depth < 100.0)
1149 {
1150 return 100.0;
1151 }
1152 else if (depth < 1000.0)
1153 {
1154 return 1000.0;
1155 }
1156 else
1157 {
1158 return 10000.0;
1159 }
1160}
1161
1170void init_camera (project * this_proj, int get_depth)
1171{
1172 glwin * view = this_proj -> modelgl;
1173 if (get_depth)
1174 {
1175 view -> anim -> last -> img -> p_depth = (this_proj -> natomes) ? oglmax_ () : 50.0;
1176 view -> anim -> last -> img -> m_depth = get_max_depth (view -> anim -> last -> img -> p_depth);
1177 }
1178 view -> anim -> last -> img -> gnear = default_rep.gnear;
1179 view -> anim -> last -> img -> gfar = view -> anim -> last -> img -> p_depth*2.0;
1180 view -> anim -> last -> img -> rotation_quaternion.w = 0.0;
1181 view -> anim -> last -> img -> rotation_quaternion.x = 0.0;
1182 view -> anim -> last -> img -> rotation_quaternion.y = 0.0;
1183 view -> anim -> last -> img -> rotation_quaternion.z = 1.0;
1184 int i;
1185 for (i=0; i<2; i++)
1186 {
1187 view -> anim -> last -> img -> c_angle[i] = 0.0;
1188 view -> anim -> last -> img -> c_shift[i] = default_rep.c_shift[i];
1189 }
1192 view -> anim -> last -> img -> zoom = default_rep.zoom;
1193 if (view -> rep_win)
1194 {
1195 if (view -> rep_win -> camera_widg[0] && GTK_IS_WIDGET(view -> rep_win -> camera_widg[0]))
1196 {
1197 gtk_spin_button_set_value ((GtkSpinButton *)view -> rep_win -> camera_widg[0], 1.0 - 0.5*view -> anim -> last -> img -> zoom);
1198 }
1199 if (view -> rep_win -> camera_widg[1] && GTK_IS_WIDGET(view -> rep_win -> camera_widg[1]))
1200 {
1201 gtk_spin_button_set_value ((GtkSpinButton *)view -> rep_win -> camera_widg[1], view -> anim -> last -> img -> p_depth);
1202 }
1203 if (view -> rep_win -> camera_widg[2] && GTK_IS_WIDGET(view -> rep_win -> camera_widg[2]))
1204 {
1205 gtk_spin_button_set_value ((GtkSpinButton *)view -> rep_win -> camera_widg[2], view -> anim -> last -> img -> gnear);
1206 }
1207 }
1208}
1209
1219{
1220 int i, j;
1221 int nsp = this_proj -> nspec;
1222 img -> radall[0] = default_bd_rw[2];
1223 img -> radall[1] = default_bd_rw[5];
1224 for (i = 0; i < nsp; i++)
1225 {
1226 j = this_proj -> chemistry -> chem_prop[CHEM_Z][i];
1227 // B & S
1228 img -> sphererad[i] = (default_o_at_rs[0]) ? default_at_rs[0] : get_radius (2, 0, j, default_atomic_rad[0]);
1229 img -> sphererad[i+nsp] = (default_o_at_rs[5]) ? default_at_rs[5] : get_radius (7, 0, j, default_atomic_rad[5]);
1230 img -> bondrad[i][i] = (default_o_bd_rw[0]) ? default_bd_rw[0] : get_radius (-2, 0, j, default_bond_rad[0]);
1231 img -> bondrad[i+nsp][i+nsp] = (default_o_bd_rw[3]) ? default_bd_rw[3] : get_radius (-5, 0, j, default_bond_rad[3]);;
1232 // Filled
1233 img -> atomicrad[i] = (default_o_at_rs[3]) ? default_at_rs[3] : get_radius (5, 0, j, default_atomic_rad[3]);
1234 img -> atomicrad[i+nsp] = (default_o_at_rs[8]) ? default_at_rs[8] : get_radius (10, 0, j, default_atomic_rad[8]);
1235 // Wireframe & Dots
1236 img -> pointrad[i] = (default_o_at_rs[1]) ? default_at_rs[1] : get_radius (3, 0, j, default_atomic_rad[1]);
1237 img -> pointrad[i+nsp] = (default_o_at_rs[6]) ? default_at_rs[6] : get_radius (8, 0, j, default_atomic_rad[6]);
1238 img -> linerad[i][i] = (default_o_bd_rw[1]) ? default_bd_rw[1] : get_radius (-3, 0, j, default_bond_rad[1]);
1239 img -> linerad[i+nsp][i+nsp] = (default_o_bd_rw[4]) ? default_bd_rw[4] : get_radius (-6, 0, j, default_bond_rad[4]);
1240
1241 img -> at_color[i] = get_spec_color (j, default_atom_color[0]);
1242 img -> at_color[i+nsp] = get_spec_color (j, default_atom_color[1]);
1243 }
1244 for (i=0; i < nsp-1; i++)
1245 {
1246 for (j=i+1; j < nsp; j++)
1247 {
1248 img -> linerad[i][j] = img -> linerad[j][i] = min (img -> linerad[i][i], img -> linerad[j][j]);
1249 img -> linerad[i+nsp][j+nsp] = img -> linerad[j+nsp][i+nsp] = min (img -> linerad[i+nsp][i+nsp], img -> linerad[j+nsp][j+nsp]);
1250 img -> bondrad[i][j] = img -> bondrad[j][i] = min(img -> bondrad[i][i], img -> bondrad[j][j]);
1251 img -> bondrad[i+nsp][j+nsp] = img -> bondrad[j+nsp][i+nsp] = min(img -> bondrad[i+nsp][i+nsp], img -> bondrad[j+nsp][j+nsp]);
1252 }
1253 }
1254}
1255
1265{
1266 int i, j;
1267 int nsp = this_proj -> nspec;
1268 // Chemical species related
1269 for (i = 0; i<2; i++)
1270 {
1271 img -> show_label[i] = allocbool(nsp);
1272 img -> show_atom[i] = allocbool(nsp);
1273 for (j=0; j<nsp; j++) img -> show_atom[i][j] = TRUE;
1274 }
1275 img -> at_color = g_malloc0 (2*nsp*sizeof*img -> at_color);
1276 img -> sphererad = allocdouble (2*nsp);
1277 img -> pointrad = allocdouble (2*nsp);
1278 img -> atomicrad = allocdouble (2*nsp);
1279 img -> bondrad = allocddouble (2*nsp, 2*nsp);
1280 img -> linerad = allocddouble (2*nsp, 2*nsp);
1282 for (i=0; i<10; i++)
1283 {
1284 img -> spcolor[i] = NULL;
1285 if (i < 2)
1286 {
1287 img -> spcolor[i] = g_malloc (nsp*sizeof*img -> spcolor[i]);
1288 }
1289 else
1290 {
1291 img -> spcolor[i] = g_malloc (1*sizeof*img -> spcolor[i]);
1292 img -> spcolor[i][0] = NULL;
1293 }
1294 }
1295}
1296
1306{
1307 img -> l_ghtning.lights = default_lightning.lights;
1308 if (img -> l_ghtning.spot) g_free (img -> l_ghtning.spot);
1309 img -> l_ghtning.spot = g_malloc0 (img -> l_ghtning.lights*sizeof*img -> l_ghtning.spot);
1310 float size = 0.0;
1311 int i;
1312 if (this_proj -> cell.box)
1313 {
1314 for (i=0; i<3; i++) size = max (size, this_proj -> cell.box[0].param[0][i]);
1315 }
1316 size = (size) ? size : img -> p_depth;
1317 for (i=0; i<img -> l_ghtning.lights; i++)
1318 {
1319 img -> l_ghtning.spot[i] = init_light_source (default_lightning.spot[i].type, size, img -> p_depth);
1320 img -> l_ghtning.spot[i].fix = default_lightning.spot[i].fix;
1321 img -> l_ghtning.spot[i].intensity = default_lightning.spot[i].intensity;
1322 if (img -> p_depth <= 50.0)
1323 {
1324 img -> l_ghtning.spot[i].intensity = v3_muls (img -> l_ghtning.spot[i].intensity, img -> p_depth/100.0);
1325 }
1326 img -> l_ghtning.spot[i].attenuation = default_lightning.spot[i].attenuation;
1327 img -> l_ghtning.spot[i].direction = default_lightning.spot[i].direction;
1328 img ->l_ghtning.spot[i].position = default_lightning.spot[i].position;
1329 if (img -> l_ghtning.spot[i].type)
1330 {
1331 img -> l_ghtning.spot[i].position = v3_muls (img -> l_ghtning.spot[i].position, img -> p_depth);
1332 }
1333 }
1334}
1335
1345{
1346 int i;
1350
1351 for (i=0; i<2; i++)
1352 {
1353 img -> color_map[i] = default_opengl[i+1];
1354 img -> sel_color[i] = default_sel_color[i];
1355 }
1356 img -> quality = default_opengl[3];
1357 img -> rep = default_rep.rep;
1358 img -> filled_type = NONE;
1359 // Visual styles
1360 if (! default_opengl[0])
1361 {
1362 img -> style = (this_proj -> natomes <= 10000) ? BALL_AND_STICK : DEFAULT_STYLE;
1363 }
1364 else if (default_opengl[0] > 0)
1365 {
1366 img -> style = (default_opengl[0] < 2) ? default_opengl[0] - 1 : default_opengl[0];
1367 }
1368 else
1369 {
1370 img -> style = SPACEFILL;
1371 img -> filled_type = - default_opengl[0] - 1;
1372 }
1373 img -> xyz -> axis = (this_proj -> natomes) ? default_axis.axis : NONE;
1374 img -> abc -> box = (this_proj -> cell.ltype) ? default_box.box : NONE;
1375 for (i=0; i<5; i++)
1376 {
1378 }
1379 for (i=0; i<2; i++)
1380 {
1381 img -> mtilt[i] = default_mtilt[i];
1382 img -> mfactor[i] = default_mfactor[i];
1383 img -> mpattern[i] = default_mpattern[i];
1384 img -> mwidth[i] = default_mwidth[i];
1385 img -> acl_format[i] = default_acl_format[i];
1386 }
1387 setup_default_lights (this_proj, img);
1388 duplicate_material (& img -> m_terial, & default_material);
1389 duplicate_fog (& img -> f_g, & default_fog);
1390}
1391
1399void init_img (project * this_proj)
1400{
1401 this_proj -> modelgl -> anim -> last -> img = g_malloc0(sizeof*this_proj -> modelgl -> anim -> last -> img);
1402 image * img = this_proj -> modelgl -> anim -> last -> img;
1403 if (! img -> back) img -> back = g_malloc0(sizeof*img -> back);
1404 if (! img -> abc) img -> abc = g_malloc0(sizeof*img -> abc);
1405 if (! img -> xyz) img -> xyz = g_malloc0(sizeof*img -> xyz);
1406 img -> render = FILL;
1407 this_proj -> modelgl -> p_moy = img -> p_depth = (this_proj -> natomes) ? oglmax_ () : 50.0;
1408 img -> m_depth = get_max_depth (img -> p_depth);
1409 setup_default_image (this_proj, img);
1410 int i;
1411 for (i=0; i<2; i++) img -> selected[i] = g_malloc0 (sizeof*img -> selected[i]);
1412 if (this_proj -> nspec) setup_image_spec_data (this_proj, img);
1413}
1414
1422gboolean is_GLExtension_Supported (const char * extension)
1423{
1424 int i, j;
1425 i = j = 0;
1426 glGetIntegerv (GL_NUM_EXTENSIONS, & i);
1427 for (j=0; j<i; j++)
1428 {
1429 if (g_strcmp0 (extension, (const char*)glGetStringi(GL_EXTENSIONS, j)) == 0) return TRUE;
1430 }
1431 return FALSE;
1432}
1433
1440{
1441 glEnable (GL_DEPTH_TEST);
1442 glDepthMask (GL_TRUE);
1443 glDepthFunc (GL_LEQUAL);
1444 glDepthRange (0.0f, 1.0f);
1445 glClearDepth (1.0f);
1446 glEnable (GL_NORMALIZE);
1447
1448 glShadeModel(GL_SMOOTH);
1449 glCullFace(GL_BACK);
1450 glEnable (GL_CULL_FACE); // Incompatible with polyhedra viz
1451
1452 glEnable (GL_COLOR_SUM_EXT);
1453
1454 glEnable (GL_PROGRAM_POINT_SIZE);
1455 glEnable (GL_VERTEX_PROGRAM_POINT_SIZE);
1456 glEnable (GL_POINT_SPRITE);
1457
1458 glEnable (GL_POINT_SMOOTH);
1459 glHint (GL_POINT_SMOOTH_HINT, GL_NICEST);
1460 glEnable (GL_LINE_SMOOTH); // Lines antialiasing
1461 glHint (GL_LINE_SMOOTH_HINT, GL_NICEST);
1462
1463 glDisable (GL_POLYGON_SMOOTH); // To disable ploygon antialiasing
1464 glEnable (GL_POLYGON_STIPPLE);
1465 glEnable (GL_POLYGON_OFFSET_FILL);
1466
1467 glEnable (GL_BLEND);
1468 glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
1469
1470 glPolygonOffset (1.0, 1.0);
1471 glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
1472
1473 glHint (GL_FOG_HINT, GL_NICEST);
1474 glHint (GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); // Really Nice Perspective Calculations
1475
1476#ifdef OSX
1478#else
1479 ogl_texture = (is_GLExtension_Supported("GL_ARB_texture_rectangle")) ? GL_TEXTURE_RECTANGLE_ARB : GL_TEXTURE_2D;
1480#endif // OSX
1481}
1482
1490void center_molecule (project * this_proj)
1491{
1492 int l, i, j;
1493 double x, y, z;
1494 // We need to center the molecule at (0.0, 0.0, 0.0)
1495 // Thus (0, 0, 0) will be the center of the box
1496 mat4_t rot;
1497 vec3_t bini, bend;
1498 for (l = 0; l < this_proj -> steps; l++)
1499 {
1500 x = 0.0;
1501 y = 0.0;
1502 z = 0.0;
1503 for (i = 0; i < this_proj -> natomes; i++)
1504 {
1505 x += this_proj -> atoms[l][i].x;
1506 y += this_proj -> atoms[l][i].y;
1507 z += this_proj -> atoms[l][i].z;
1508 }
1509 x /= this_proj -> natomes;
1510 y /= this_proj -> natomes;
1511 z /= this_proj -> natomes;
1512 for (i = 0; i < this_proj -> natomes; i++)
1513 {
1514 this_proj -> atoms[l][i].x -= x;
1515 this_proj -> atoms[l][i].y -= y;
1516 this_proj -> atoms[l][i].z -= z;
1517 }
1518
1519 for (i=0; i<FILLED_STYLES; i++)
1520 {
1521 if (this_proj -> modelgl -> volume_box[i])
1522 {
1523 if (this_proj -> modelgl -> volume_box[i][l])
1524 {
1525 this_proj -> modelgl -> volume_box[i][l][6] -= x;
1526 this_proj -> modelgl -> volume_box[i][l][7] -= y;
1527 this_proj -> modelgl -> volume_box[i][l][8] -= z;
1528 rot = m4_rotation_anti_xyz (this_proj -> modelgl -> volume_box[i][l][3], this_proj -> modelgl -> volume_box[i][l][4], this_proj -> modelgl -> volume_box[i][l][5]);
1529 bini = m4_mul_coord (rot, vec3(this_proj -> modelgl -> volume_box[i][l][6], this_proj -> modelgl -> volume_box[i][l][7], this_proj -> modelgl -> volume_box[i][l][8]));
1530 bini.x -= x;
1531 bini.y -= y;
1532 bini.z -= z;
1533 rot = m4_rotation_xyz (this_proj -> modelgl -> volume_box[i][l][3], this_proj -> modelgl -> volume_box[i][l][4], this_proj -> modelgl -> volume_box[i][l][5]);
1534 bend = m4_mul_coord (rot, bini);
1535 this_proj -> modelgl -> volume_box[i][l][6] = bend.x;
1536 this_proj -> modelgl -> volume_box[i][l][7] = bend.y;
1537 this_proj -> modelgl -> volume_box[i][l][8] = bend.z;
1538 }
1539 }
1540 if (this_proj -> modelgl -> frag_box[i])
1541 {
1542 if (this_proj -> modelgl -> frag_box[i][l])
1543 {
1544 for (j=0; j<this_proj -> coord -> totcoord[2]; j++)
1545 {
1546 rot = m4_rotation_anti_xyz (this_proj -> modelgl -> frag_box[i][l][j][3], this_proj -> modelgl -> frag_box[i][l][j][4], this_proj -> modelgl -> frag_box[i][l][j][5]);
1547 bini = m4_mul_coord (rot, vec3(this_proj -> modelgl -> frag_box[i][l][j][6], this_proj -> modelgl -> frag_box[i][l][j][7], this_proj -> modelgl -> frag_box[i][l][j][8]));
1548 bini.x -= x;
1549 bini.y -= y;
1550 bini.z -= z;
1551 rot = m4_rotation_xyz (this_proj -> modelgl -> frag_box[i][l][j][3], this_proj -> modelgl -> frag_box[i][l][j][4], this_proj -> modelgl -> frag_box[i][l][j][5]);
1552 bend = m4_mul_coord (rot, bini);
1553 this_proj -> modelgl -> frag_box[i][l][j][6] = bend.x;
1554 this_proj -> modelgl -> frag_box[i][l][j][7] = bend.y;
1555 this_proj -> modelgl -> frag_box[i][l][j][8] = bend.z;
1556 }
1557 }
1558 }
1559 }
1560 }
1561 this_proj -> cell.crystal = FALSE;
1562}
1563
1572{
1574 view -> insert_coords = vec3(0.0, 0.0, 0.0);
1575 int shaders[6] = {ATOMS, BONDS, POLYS, RINGS, SELEC, VOLMS};
1577 view -> create_shaders[PICKS] = TRUE;
1578 view -> create_shaders[MDBOX] = TRUE;
1579 view -> create_shaders[LABEL] = TRUE;
1580 view -> create_shaders[MEASU] = TRUE;
1581 update (view);
1582}
1583
1592void free_glwin_spec_data (project * this_proj, int spec)
1593{
1594 int i, j, k;
1595
1596 for (i=0; i<NUM_COLORS; i++)
1597 {
1598 if (this_proj -> modelgl -> colorp[i] != NULL)
1599 {
1600 g_free (this_proj -> modelgl -> colorp[i]);
1601 this_proj -> modelgl -> colorp[i] = NULL;
1602 }
1603 }
1604 for (i=0; i<10; i++)
1605 {
1606 k = (i > 2) ? 1 : spec;
1607 if (i < 2 || i > 3)
1608 {
1609 for (j=0; j<k; j++)
1610 {
1611 if (this_proj -> coord -> geolist[i][j] != NULL)
1612 {
1613 g_free (this_proj -> coord -> geolist[i][j]);
1614 this_proj -> coord -> geolist[i][j] = NULL;
1615 }
1616 }
1617 this_proj -> coord -> geolist[i]=NULL;
1618 }
1619 }
1620 for (i=0; i<spec; i++)
1621 {
1622 if (this_proj -> coord -> partial_geo[i] != NULL) g_free (this_proj -> coord -> partial_geo[i]);
1623 this_proj -> coord -> partial_geo[i] = NULL;
1624 }
1625 g_free (this_proj -> coord -> partial_geo);
1626 this_proj -> coord -> partial_geo = NULL;
1627}
1628
1637void glwin_init_spec_data (project * this_proj, int nspec)
1638{
1639 int i, j, k;
1640 for (i=0; i<NUM_COLORS; i++)
1641 {
1642 this_proj -> modelgl -> colorp[i] = NULL;
1643 this_proj -> modelgl -> colorp[i] = g_malloc (nspec*2*sizeof*this_proj -> modelgl -> colorp[i]);
1644 for (j=0; j<nspec*2; j++)
1645 {
1646 this_proj -> modelgl -> colorp[i][j].a = this_proj -> id;
1647 this_proj -> modelgl -> colorp[i][j].b = i;
1648 this_proj -> modelgl -> colorp[i][j].c = j;
1649 }
1650 }
1651#ifdef GTK3
1652 // GTK3 Menu Action To Check
1653 int l;
1654#endif
1655 for (i=0; i<10; i++)
1656 {
1657 k = (i > 2) ? 1 : nspec;
1658#ifdef GTK3
1659 // GTK3 Menu Action To Check
1660 for (j = 0; j < 2; j++)
1661 {
1662 this_proj -> modelgl -> oglmv[j][i] = NULL;
1663 this_proj -> modelgl -> oglmv[j][i] = g_malloc0 (k*sizeof*this_proj -> modelgl -> oglmv[j][i]);
1664 if (i < 9)
1665 {
1666 this_proj -> modelgl -> oglmc[j][i] = NULL;
1667 this_proj -> modelgl -> oglmc[j][i] = g_malloc0 (k*sizeof*this_proj -> modelgl -> oglmc[j][i]);
1668 }
1669 if (i < 2 || (i > 3 && i < 9))
1670 {
1671 this_proj -> modelgl -> oglmpv[j][i] = NULL;
1672 this_proj -> modelgl -> oglmpv[j][i] = g_malloc0 (k*sizeof*this_proj -> modelgl -> oglmpv[j][i]);
1673 }
1674 for (l=0; l<k; l++)
1675 {
1676 this_proj -> modelgl -> oglmv[j][i][l] = NULL;
1677 if (i < 9) this_proj -> modelgl -> oglmc[j][i][l] = NULL;
1678 if (i < 2 || (i > 3 && i < 9)) this_proj -> modelgl -> oglmpv[j][i][l] = NULL;
1679 }
1680 }
1681#endif
1682 if (i < 2 || i > 3)
1683 {
1684 this_proj -> coord -> geolist[i] = g_malloc0 (k*sizeof*this_proj -> coord -> geolist[i]);
1685 for (j=0; j<k; j++)
1686 {
1687 this_proj -> coord -> geolist[i][j] = NULL;
1688 }
1689 }
1690 }
1691 this_proj -> coord -> partial_geo = g_malloc0 (nspec*sizeof*this_proj -> coord -> partial_geo);
1692 for (i=0; i<nspec; i++) this_proj -> coord -> partial_geo[i] = NULL;
1693}
1694
1702void init_glwin (glwin * view)
1703{
1704 project * this_proj = get_project_by_id(view -> proj); // Have to be the active project
1705 view -> anim = g_malloc0 (sizeof*view -> anim);
1706 snapshot * snap = g_malloc0 (sizeof*snap);
1707 view -> anim -> first = snap;
1708 view -> anim -> last = snap;
1709 init_img (this_proj);
1710 init_camera (this_proj, TRUE);
1711
1712 view -> mouseStatus = RELEASED;
1713 view -> mouseAction = ANALYZE;
1714 // Warning, if not centered at start-up, dmtx could fail
1715 if (! this_proj -> cell.crystal) center_molecule (this_proj);
1716
1717 view -> bonds = allocdint (this_proj -> steps, 2);
1718 view -> bondid = g_malloc0 (this_proj -> steps*sizeof*view -> bondid);
1719 view -> clones = g_malloc0 (this_proj -> steps*sizeof*view -> clones);
1720 int i;
1721 for (i=0; i < this_proj -> steps; i++)
1722 {
1723 view -> bondid[i] = g_malloc0 (2*sizeof*view -> bondid[i]);
1724 view -> clones[i] = NULL;
1725 }
1726
1727 // Data that depends on the number of chemical species
1728 glwin_init_spec_data (this_proj, (this_proj -> nspec) ? this_proj -> nspec : 1);
1729
1730 view -> stop = TRUE;
1731 view -> speed = 100;
1732 view -> zoom_factor = ZOOM_FACTOR;
1733 view -> mode = ANALYZE;
1734 view -> selection_mode = ATOMS;
1735 // On normal motion and copy rebuild:
1736 view -> rebuild[0][0] = view -> rebuild[1][0] = (this_proj -> steps > 1) ? FALSE : TRUE;
1737 view -> init = TRUE;
1738 init_opengl ();
1739 init_shaders (view);
1740 this_proj -> initgl = TRUE;
1741#ifdef GTK4
1742 if (view -> win) update_menu_bar (view);
1743#endif
1744}
1745
1753GError * init_gtk_gl_area (GtkGLArea * area)
1754{
1755 if (area == NULL)
1756 {
1757 area = (GtkGLArea *)gtk_gl_area_new ();
1758 }
1759 else
1760 {
1761 gtk_gl_area_make_current (area);
1762 }
1763 gtk_gl_area_set_has_depth_buffer (area, TRUE);
1764 gtk_gl_area_set_has_stencil_buffer (area, TRUE);
1765 return gtk_gl_area_get_error (area);
1766}
1767
1768#ifdef GTKGLAREA
1777G_MODULE_EXPORT void on_realize (GtkGLArea * area, gpointer data)
1778#else
1787G_MODULE_EXPORT void on_realize (GtkWidget * widg, gpointer data)
1788#endif
1789{
1790 glwin * view = (glwin *)data;
1791 GError * err;
1792#ifdef GTKGLAREA
1793 err = init_gtk_gl_area (area);
1794 if (err == NULL)
1795 {
1796#else
1797 GdkWindow * xwin = gtk_widget_get_window (view -> plot);
1798 GLint attr_list[] = {GLX_DOUBLEBUFFER,
1799 GLX_RGBA,
1800 GLX_DEPTH_SIZE, 1,
1801 GLX_RED_SIZE, 1,
1802 GLX_GREEN_SIZE, 1,
1803 GLX_BLUE_SIZE, 1,
1804 None};
1805 XVisualInfo * visualinfo = glXChooseVisual (GDK_WINDOW_XDISPLAY (xwin),
1806 gdk_screen_get_number (gdk_window_get_screen (xwin)), attr_list);
1807 view -> glcontext = glXCreateContext (GDK_WINDOW_XDISPLAY (xwin), visualinfo, NULL, TRUE);
1808 g_free (visualinfo);
1809 if (glXMakeCurrent (GDK_WINDOW_XDISPLAY (xwin), GDK_WINDOW_XID (xwin), view -> glcontext))
1810 {
1811#endif
1812 init_glwin (view);
1813 }
1814 else
1815 {
1816 gchar * errm = g_strdup_printf ("Impossible to initialize the OpenGL 3D rendering ! \n %s\n", err -> message);
1817 g_error_free (err);
1818 show_error (errm, 0, MainWindow);
1819 g_free (errm);
1820 }
1821}
1822
1823#ifdef GTKGLAREA
1833G_MODULE_EXPORT gboolean on_expose (GtkGLArea * area, GdkGLContext * context, gpointer data)
1834#else
1844G_MODULE_EXPORT gboolean on_expose (GtkWidget * widg, cairo_t * cr, gpointer data)
1845#endif
1846{
1847 glwin * view = (glwin *) data;
1848#ifdef GTK3
1849 GdkEvent * event = gtk_get_current_event ();
1850 if (event && event -> type == GDK_EXPOSE && ((GdkEventExpose *)event) -> count > 0) return TRUE;
1851#endif
1852#ifdef GTKGLAREA
1853 render_this_gl_window (view, area);
1854#else
1855 render_this_gl_window (view, widg, 0);
1856#endif
1857 return TRUE;
1858}
Binding to the Fortran90 subroutines.
double oglmax_()
integer(kind=c_int) function chemistry()
Definition chemistry.F90:22
color colorp[64]
double scale(double axe)
find appropriate major tick spacing based on axis length
Definition curve.c:204
ColRGBA col
Definition d_measures.c:77
int atoms[NUM_STYLES][2]
int bonds[NUM_STYLES][2]
float val
Definition dlp_init.c:117
void init_default_shaders(glwin *view)
re-initialize the default OpenGL shaders
dint rep
Definition dlp_edit.c:2227
int ** allocdint(int xal, int yal)
allocate an int ** pointer
Definition global.c:330
double pi
Definition global.c:195
struct timespec start_time
Definition global.c:191
gboolean * allocbool(int val)
allocate a gboolean * pointer
Definition global.c:254
double ** allocddouble(int xal, int yal)
allocate a double ** pointer
Definition global.c:475
double * allocdouble(int val)
allocate a double * pointer
Definition global.c:459
GtkWidget * MainWindow
Definition global.c:201
int * allocint(int val)
allocate an int * pointer
Definition global.c:314
gboolean object_motion
Definition global.c:186
double get_calc_time(struct timespec start, struct timespec stop)
get calculation time in s
Definition global.c:643
struct timespec stop_time
Definition global.c:192
Global variable declarations Global convenience function declarations Global data structure defin...
glwin * active_glwin
Definition project.c:53
project * proj
int get_widget_height(GtkWidget *widg)
retrive GtkWidget height
Definition gtk-misc.c:2554
int get_widget_width(GtkWidget *widg)
retrive GtkWidget width
Definition gtk-misc.c:2538
#define min(a, b)
Definition global.h:81
void hide_the_widgets(GtkWidget *widg)
hide GtkWidget
Definition gtk-misc.c:198
#define CHEM_Z
Definition global.h:299
project * active_project
Definition project.c:47
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
#define max(a, b)
Definition global.h:80
void transform(glwin *view, double aspect)
transform the OpenGL window
Definition glview.c:469
void update_bonds_(int *bd, int *stp, int *bdim, int bda[*bdim], int bdb[*bdim], double *x, double *y, double *z)
update bonding information from Fortran90
Definition glview.c:341
int action_atoms_from_project(project *this_proj, atom_search *asearch, gboolean visible)
apply atom edition action to project (motion, remove, replace, insert, random move)
vec3_t get_arc_ball_vector(glwin *view, int x, int y)
Definition arcball.c:46
G_MODULE_EXPORT void on_realize(GtkWidget *widg, gpointer data)
realize event for the OpenGL widget
Definition glview.c:1787
atomic_object * create_object_from_frag_mol(project *this_proj, int coord, int geo, atom_search *remove)
create object from a fragment or a molecule
G_MODULE_EXPORT void on_glwin_pointer_motion(GtkEventControllerMotion *motc, gdouble x, gdouble y, gpointer data)
handle mouse motion event in the OpenGL window GTK4
Definition glview.c:738
GLfloat ** allocdGLfloat(int xal, int yal)
allocate a GLfloat ** pointer
Definition glview.c:169
void render_this_gl_window(glwin *view, GtkWidget *widg, gint button)
render the OpenGL window
Definition glview.c:768
GLuint ** allocdgluint(int xal, int yal)
allocate a GLuint ** pointer
Definition glview.c:147
void glwin_button_event(double event_x, double event_y, guint event_button, guint event_type, guint32 event_time, gpointer data)
handle mouse button event on the OpenGL window
Definition glview.c:899
vec4_t old_rotation_quaternion
Definition arcball.c:44
void update_labels(glwin *view)
update labels (on representation data update)
Definition m_rep.c:85
void arc_ball_rotation(glwin *view, int x, int y)
Perform arcball rotation.
Definition arcball.c:73
void save_rotation_quaternion(glwin *view)
save the rotation quaternion of the last image
Definition glview.c:554
void update(glwin *view)
update the rendering of the OpenGL window
Definition glview.c:450
void setup_default_lights(project *this_proj, image *img)
initialize lightning for an image data structure
Definition glview.c:1305
vec3_t arc_ball_init
Definition arcball.c:42
void setup_default_image(project *this_proj, image *img)
setup default image parameters
Definition glview.c:1344
void prepare_atom_edition(gpointer data, gboolean visible)
prepare atom edition
Definition atom_edit.c:453
void duplicate_material(Material *new_mat, Material *old_mat)
duplicate material data
Definition ogl_draw.c:186
GError * init_gtk_gl_area(GtkGLArea *area)
initialize a GtkGLArea, return error if any
Definition glview.c:1753
void duplicate_screen_label(screen_label *new_lab, screen_label *old_lab)
copy screen_label data structure
Definition ogl_draw.c:239
void init_img(project *this_proj)
initialize an image data structure
Definition glview.c:1399
GLenum ogl_texture
Definition glview.c:122
Light init_light_source(int type, float val, float vbl)
initialize a light source
Definition w_advance.c:337
void free_glwin_spec_data(project *this_proj, int spec)
free the memory used by the chemical species related data in a glwin data structure
Definition glview.c:1592
gl_pop_info to_pop
Definition glview.c:885
void glwin_init_spec_data(project *this_proj, int nspec)
initialize the glwin chemical species related pointers
Definition glview.c:1637
G_MODULE_EXPORT void on_lib_button_released(GtkGesture *gesture, int n_press, double x, double y, gpointer data)
handle mouse button release event on the molecular library OpenGL window (limited interaction)
Definition glview.c:879
void zoom(glwin *view, int delta)
zoom in or zoom out in the OpenGL window
Definition glview.c:1017
atom_search * allocate_atom_search(int proj, int action, int searchid, int tsize)
allocate atom search data structure
Definition atom_edit.c:386
G_MODULE_EXPORT void on_lib_button_pressed(GtkGesture *gesture, int n_press, double x, double y, gpointer data)
handle mouse button press event on the molecular library OpenGL window (limited interaction)
Definition glview.c:863
void translate(project *this_proj, int status, int axis, vec3_t trans)
translate
Definition atom_move.c:230
G_MODULE_EXPORT void on_glwin_button_released(GtkGesture *gesture, int n_press, double x, double y, gpointer data)
mouse button released signal on the OpenGL window
Definition glview.c:1002
void setup_image_spec_data(project *this_proj, image *img)
initialize the chemical species related pointers in an image data structure
Definition glview.c:1264
void update_atom_neighbors_(int *stp, int *at, int *nv)
update an atom number of neighbors from Fortran90
Definition glview.c:415
void glwin_lib_pressed(double x, double y, guint event_type, guint event_button, gpointer data)
handle mouse button event on the molecular library OpenGL window
Definition glview.c:811
void reshape(glwin *view, int width, int height, gboolean use_ratio)
reshape (resize) the OpenGL window
Definition glview.c:527
void init_camera(project *this_proj, int get_depth)
initialize the OpenGL camera settings
Definition glview.c:1170
void init_opengl()
initialize OpenGL rendering parameters
Definition glview.c:1439
G_MODULE_EXPORT void on_glwin_button_pressed(GtkGesture *gesture, int n_press, double x, double y, gpointer data)
mouse button pressed signal on the OpenGL window
Definition glview.c:986
void edit_for_motion(glwin *view)
if edition mode is one some steps are required
Definition glview.c:571
void rotate_quat(project *this_proj, vec4_t q, int status, int axis)
rotate using quaternion
Definition atom_move.c:269
void process_the_hits(glwin *view, gint event_button, double ptx, double pty)
process a mouse click
Definition selection.c:590
void motion(glwin *view, gint x, gint y, GdkModifierType state)
mouse motion in the OpenGL window
Definition glview.c:637
ColRGBA set_default_color(int z)
pick the default color for an atom
Definition glview.c:195
void duplicate_fog(Fog *new_fog, Fog *old_fog)
duplicate fog data
Definition ogl_draw.c:203
GLuint * allocgluint(int val)
allocate a GLuint * pointer
Definition glview.c:131
vec3_t get_bary(project *this_proj, int status)
get barycenter of atomic coordinates
Definition atom_move.c:170
const float light_pos[MAX_LIGHTS][4]
Definition glview.c:183
void center_this_molecule(glwin *view)
center atomic coordinates around (0,0,0) and refresh shaders
Definition glview.c:1571
void rotate_x_y(glwin *view, double angle_x, double angle_y)
rotate the OpenGL camera
Definition glview.c:1092
GLdouble get_max_depth(GLdouble depth)
guess a reasonable maximum OpenGL window depth
Definition glview.c:1142
void init_glwin(glwin *view)
initialize a glwin pointer
Definition glview.c:1702
void setup_default_species_parameters_for_image(project *this_proj, image *img)
setup default chemical species related parameters for image
Definition glview.c:1218
void center_molecule(project *this_proj)
center atomic coordinates around (0,0,0)
Definition glview.c:1490
gboolean is_GLExtension_Supported(const char *extension)
test if this GLExtension is support
Definition glview.c:1422
G_MODULE_EXPORT gboolean on_glwin_pointer_scoll(GtkEventControllerScroll *event, gdouble dx, gdouble dy, gpointer data)
handle mouse scroll event on the OpenGL window
Definition glview.c:1066
G_MODULE_EXPORT gboolean on_expose(GtkWidget *widg, cairo_t *cr, gpointer data)
OpenGL rendering widget expose event callback GTK3.
Definition glview.c:1844
void update_this_neighbor_(int *stp, int *at, int *iv, int *nv)
update atom neighbor list from Fortran90
Definition glview.c:434
void sort(int dim, int *tab)
sort, nim to max, a table by integer value
Definition glview.c:391
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
image * plot
Definition ogl_draw.c:70
atom_search * free_this_search_data(atom_search *this_search)
free atom search data structure
Definition popup.c:284
#define ZOOM_MAX
Maximum value for the OpenGL zoom factor.
Definition glview.h:134
#define ZOOM_FACTOR
Default value for the OpenGL zoom factor.
Definition glview.h:129
void draw(glwin *view)
main drawing subroutine for the OpenGL window
Definition ogl_draw.c:509
void re_create_md_shaders(int nshaders, int shaders[nshaders], project *this_proj)
re-initialize some MD dependent OpenGL shaders
action
Definition glview.h:198
gboolean pick
void popup_main_menu(glwin *view, double ptx, double pty)
create the OpenGL window popup menu
Definition popup.c:4136
void init_shaders(glwin *view)
initialize all the OpenGL shaders
#define MAX_LIGHTS
Maximum number of light sources.
Definition glview.h:89
@ MOTION
Definition glview.h:168
@ ANALYZE
Definition glview.h:166
@ EDITION
Definition glview.h:167
render
Definition glview.h:191
@ FILL
Definition glview.h:192
void popup_selection(glwin *view, double ptx, double pty, int se, int pe, int ai, int bi, int ac)
create the contextual popup menu, right click on atom or bond
Definition popup.c:3671
@ PERSPECTIVE
Definition glview.h:161
@ ORTHOGRAPHIC
Definition glview.h:160
@ RELEASED
Definition glview.h:209
@ CLICKED
Definition glview.h:208
labels
Definition glview.h:223
#define DEFAULT_STYLE
Default OpenGL style: ball and stick.
Definition glview.h:43
vec3_t get_insertion_coordinates(glwin *view)
get the insertion coordinates to insert object in the 3D window
Definition glwindow.c:809
@ DISPL
Definition glview.h:233
@ SPACEFILL
Definition glview.h:184
@ BALL_AND_STICK
Definition glview.h:182
@ NONE
Definition glview.h:181
#define FILLED_STYLES
Definition glwin.h:106
#define NUM_COLORS
Definition glwin.h:65
struct axis axis
axis layout data structure
Definition glwin.h:331
shaders
The different types of shaders in the atomes program.
Definition glwin.h:88
@ BONDS
Definition glwin.h:90
@ PICKS
Definition glwin.h:97
@ LABEL
Definition glwin.h:98
@ VOLMS
Definition glwin.h:102
@ POLYS
Definition glwin.h:92
@ SELEC
Definition glwin.h:91
@ MDBOX
Definition glwin.h:93
@ MEASU
Definition glwin.h:99
@ ATOMS
Definition glwin.h:89
@ RINGS
Definition glwin.h:96
#define GL_COLOR_SUM_EXT
Definition glwin.h:39
#define GL_TEXTURE_RECTANGLE_ARB
Definition glwin.h:51
GLXContext glcontext
GdkWindow * xwin
Function declarations to handle the atomic coordination data.
void set_advanced_bonding_menus(glwin *view)
void show_error(char *error, int val, GtkWidget *win)
show error message
Definition interface.c:293
Messaging function declarations.
double z
Definition ogl_draw.c:61
double y
Definition ogl_draw.c:61
double x
Definition ogl_draw.c:61
background default_background
Lightning default_lightning
rep_data default_rep
double default_mwidth[2]
ColRGBA default_sel_color[2]
double * default_at_rs
int default_acl_format[2]
ColRGBA get_spec_color(int z, element_color *clist)
retrieve the color of a chemical species
double * default_bd_rw
box default_box
int default_mpattern[2]
float get_radius(int object, int col, int z, element_radius *rad_list)
retrieve the radius/width of a species depending on style
int * default_opengl
element_color * default_atom_color[2]
void duplicate_box_data(box *new_box, box *old_box)
duplicate box_data data structure
int default_mfactor[2]
gboolean * default_o_at_rs
Material default_material
element_radius * default_bond_rad[6]
gboolean default_mtilt[2]
void duplicate_background_data(background *new_back, background *old_back)
duplicate background data structure
void duplicate_axis_data(axis *new_axis, axis *old_axis)
duplicate axis_data data structure
element_radius * default_atomic_rad[16]
gboolean * default_o_bd_rw
axis default_axis
screen_label default_label[5]
Fog default_fog
Preference variable declarations.
Function declarations for reading atomes project file Function declarations for saving atomes proje...
float blue
Definition global.h:126
float alpha
Definition global.h:127
float red
Definition global.h:124
float green
Definition global.h:125
Definition glwin.h:234
Definition glwin.h:182
int fix
Definition glwin.h:184
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
int lights
Definition glwin.h:200
Light * spot
Definition glwin.h:201
Definition glwin.h:333
int axis
Definition glwin.h:334
Definition glwin.h:351
int box
Definition glwin.h:352
int action
Definition glview.h:378
double y
Definition glview.h:379
int pts[5]
Definition glview.h:380
double x
Definition glview.h:379
Definition glwin.h:965
Definition glwin.h:365
coord_info * coord
Definition global.h:961
GLdouble c_shift[2]
Definition preferences.h:85
GLdouble zoom
Definition preferences.h:87
GLdouble c_angle[2]
Definition preferences.h:84
GLdouble gnear
Definition preferences.h:86
float y
Definition math_3d.h:130
float x
Definition math_3d.h:130
float z
Definition math_3d.h:130
float w
Definition math_3d.h:149
float y
Definition math_3d.h:149
float x
Definition math_3d.h:149
float z
Definition math_3d.h:149
int status
Definition w_advance.c:178
GtkWidget * img
Definition workspace.c:70