atomes 1.2.1
atomes: an atomic scale modeling tool box
Loading...
Searching...
No Matches
d_box.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
24/*
25* This file: 'd_box.c'
26*
27* Contains:
28*
29
30 - The functions to prepare the OpenGL rendering for the box(es)
31 - The functions to prepare the OpenGL rendering for the slab(s)
32 - The functions to prepare the OpenGL rendering for the volume(s)
33
34*
35* List of functions:
36
37 int create_box_lists (int b_step);
38
39 double draw_cuboid (gboolean draw, int SHADID, int shadnum, mat4_t rot, vec3_t cpos, double paral[3][3], ColRGBA col, double slab_alpha);
40
41 gboolean are_identical_vec3 (vec3_t va, vec3_t vb);
42 gboolean not_in_already (vec3_t a, vec3_t b, float * vertices);
43 gboolean not_in_corners (vec3_t a, float * vertices);
44
45 void setup_extra_box_vertices (vec3_t a, vec3_t b, int id, float * c_vert, float * s_vert);
46 void setup_box_vertices (vec3_t ax, vec3_t bx, int id, float * c_vert, float * s_vert);
47 void prepare_box_vertices (void (*c_func)(vec3_t, vec3_t, int, float *, float *), float * verts, float * serts, int id);
48 void prepare_cuboid (vec3_t position, int id);
49 void create_light_lists ();
50 void cuboid_slab (mat4_t rot);
51 void cylinder_slab (mat4_t rot);
52 void spherical_slab ();
53 void create_slab_lists (project * this_proj);
54 void create_volumes_lists ();
55
56*/
57
58#include "global.h"
59#include "glview.h"
60
61extern object_3d * draw_sphere (int quality);
62extern object_3d * draw_cylinder (int quality, float ra, float rb);
63extern object_3d * draw_cylinder_cap (int quality, float rad, gboolean picked);
64extern void setup_line_vertice (float * vertices, vec3_t pos, ColRGBA col, float alpha);
65extern void setup_sphere_vertice (float * vertices, vec3_t pos, ColRGBA col, float rad, float alpha);
66extern void setup_cylinder_vertice (float * vertices, vec3_t pos_a, vec3_t pos_b, ColRGBA col, float rad, float alpha, float delta);
67extern void setup_cap_vertice (float * vertices, vec3_t pos_a, vec3_t pos_b, ColRGBA col, float rad, float alpha);
68extern void create_slab_info (project * this_proj);
69extern void process_selected_atom (project * this_proj, glwin * view, int id, int ac, int se, int pi);
70extern ColRGBA pcol;
71
73
83{
84
85 if (va.x == vb.x && va.y == vb.y && va.z == vb.z)
86 {
87 return TRUE;
88 }
89 else
90 {
91 return FALSE;
92 }
93}
94
104gboolean not_in_already (vec3_t a, vec3_t b, float * vertices)
105{
106 int i, j, k;
107 vec3_t tma, tmb;
108 for (i=0; i<nbs/2; i=i+2)
109 {
110 j = i*BOX_BUFF_SIZE;
111 k = j+BOX_BUFF_SIZE;
112 tma = vec3(vertices[j], vertices[j+1], vertices[j+2]);
113 tmb = vec3(vertices[k], vertices[k+1], vertices[k+2]);
114 if (are_identical_vec3(a, tma) && are_identical_vec3(b, tmb))
115 {
116 return FALSE;
117 }
118 else if (are_identical_vec3(b, tma) && are_identical_vec3(a, tmb))
119 {
120 return FALSE;
121 }
122 }
123 return TRUE;
124}
125
134gboolean not_in_corners (vec3_t a, float * vertices)
135{
136 int i, j;
137 vec3_t tma;
138 for (i=0; i<nbl; i++)
139 {
140 j = i*8;
141 tma = vec3(vertices[j], vertices[j+1], vertices[j+2]);
142 if (are_identical_vec3(a, tma))
143 {
144 return FALSE;
145 }
146 }
147 return TRUE;
148}
149
160void setup_extra_box_vertices (vec3_t a, vec3_t b, float * c_vert, float * s_vert)
161{
162 float j;
163 int p, q, r;
165 vec3_t t_a, t_b;
166 for (j=-1.0; j<2.0; j=j+2.0)
167 {
168 for (p=0; p<plot -> abc -> extra_cell[0]+1; p++)
169 {
170 for (q=0; q<plot -> abc -> extra_cell[1]+1; q++)
171 {
172 for (r=0; r<plot -> abc -> extra_cell[2]+1; r++)
173 {
174 if (p > 0 || q > 0 || r > 0)
175 {
176 shift.x = p*box_gl -> vect[0][0]+q*box_gl -> vect[1][0]+r*box_gl -> vect[2][0];
177 shift.y = p*box_gl -> vect[0][1]+q*box_gl -> vect[1][1]+r*box_gl -> vect[2][1];
178 shift.z = p*box_gl -> vect[0][2]+q*box_gl -> vect[1][2]+r*box_gl -> vect[2][2];
179
180 t_a = v3_add (v3_muls (a, j), shift);
181 t_b = v3_add (v3_muls (b, j), shift);
182 if (not_in_already (t_a, t_b, c_vert))
183 {
184 if (plot -> abc -> box == WIREFRAME)
185 {
186 setup_line_vertice (c_vert, t_a, pcol, 0.5);
187 setup_line_vertice (c_vert, t_b, pcol, 0.5);
188 }
189 else
190 {
191 if (not_in_corners(t_a, s_vert)) setup_sphere_vertice (s_vert, t_a, pcol, plot -> abc -> rad, pcol.alpha*0.5);
192 if (not_in_corners(t_b, s_vert)) setup_sphere_vertice (s_vert, t_b, pcol, plot -> abc -> rad, pcol.alpha*0.5);
193 setup_cylinder_vertice (c_vert, t_a, t_b, pcol, plot -> abc -> rad, 0.5, 0.0);
194 }
195 }
196 }
197 }
198 }
199 }
200 }
201}
202
213void setup_box_vertices (vec3_t ax, vec3_t bx, float * c_vert, float * s_vert)
214{
215 float j;
216 vec3_t a, b;
217 /*vec3_t cell[3];
218 int i;
219 for (i=0; i<3; i++)
220 {
221 cell[i] = vec3(box_gl -> vect[i][0], box_gl -> vect[i][1], box_gl -> vect[i][2]);
222 cell[i] = v3_divs (cell[i], 2.0);
223 }
224 vec3_t lattice = v3_add(v3_add(cell[0], cell[1]), cell[2]);*/
225 for (j=-1.0; j<2.0; j=j+2.0)
226 {
227 /*a = v3_sub (v3_muls (ax, j), lattice);
228 b = v3_sub (v3_muls (bx, j), lattice);*/
229 a = v3_muls (ax, j);
230 b = v3_muls (bx, j);
231 if (plot -> abc -> box == WIREFRAME)
232 {
233 setup_line_vertice (c_vert, a, pcol, 1.0);
234 setup_line_vertice (c_vert, b, pcol, 1.0);
235 }
236 else
237 {
238 if (not_in_corners(a, s_vert)) setup_sphere_vertice (s_vert, a, pcol, plot -> abc -> rad, pcol.alpha*1.0);
239 if (not_in_corners(b, s_vert)) setup_sphere_vertice (s_vert, b, pcol, plot -> abc -> rad, pcol.alpha*1.0);
240 setup_cylinder_vertice (c_vert, a, b, pcol, plot -> abc -> rad, 1.0, 0.0);
241 }
242 }
243}
244
254void prepare_box_vertices (void (*c_func)(vec3_t, vec3_t, float *, float *), float * verts, float * serts)
255{
256 int i;
257 vec3_t pa, pb;
258
259 for (i=-1; i<2; i=i+2)
260 {
261 pa.x = (- box_gl -> vect[0][0] - box_gl -> vect[1][0] + i * box_gl -> vect[2][0]) / 2.0;
262 pa.y = (- box_gl -> vect[0][1] - box_gl -> vect[1][1] + i * box_gl -> vect[2][1]) / 2.0;
263 pa.z = (- box_gl -> vect[0][2] - box_gl -> vect[1][2] + i * box_gl -> vect[2][2]) / 2.0;
264 pb.x = (box_gl -> vect[0][0] - box_gl -> vect[1][0] + i * box_gl -> vect[2][0]) / 2.0;
265 pb.y = (box_gl -> vect[0][1] - box_gl -> vect[1][1] + i * box_gl -> vect[2][1]) / 2.0;
266 pb.z = (box_gl -> vect[0][2] - box_gl -> vect[1][2] + i * box_gl -> vect[2][2]) / 2.0;
267 (* c_func)(pa, pb, verts, serts);
268 pa.x = (i * box_gl -> vect[0][0] - box_gl -> vect[1][0] + box_gl -> vect[2][0]) / 2.0;
269 pa.y = (i * box_gl -> vect[0][1] - box_gl -> vect[1][1] + box_gl -> vect[2][1]) / 2.0;
270 pa.z = (i * box_gl -> vect[0][2] - box_gl -> vect[1][2] + box_gl -> vect[2][2]) / 2.0;
271 pb.x = (i * box_gl -> vect[0][0] - box_gl -> vect[1][0] - box_gl -> vect[2][0]) / 2.0;
272 pb.y = (i * box_gl -> vect[0][1] - box_gl -> vect[1][1] - box_gl -> vect[2][1]) / 2.0;
273 pb.z = (i * box_gl -> vect[0][2] - box_gl -> vect[1][2] - box_gl -> vect[2][2]) / 2.0;
274 (* c_func)(pa, pb, verts, serts);
275 pa.x = (i * box_gl -> vect[0][0] + box_gl -> vect[1][0] + box_gl -> vect[2][0]) / 2.0;
276 pa.y = (i * box_gl -> vect[0][1] + box_gl -> vect[1][1] + box_gl -> vect[2][1]) / 2.0;
277 pa.z = (i * box_gl -> vect[0][2] + box_gl -> vect[1][2] + box_gl -> vect[2][2]) / 2.0;
278 pb.x = (i * box_gl -> vect[0][0] - box_gl -> vect[1][0] + box_gl -> vect[2][0]) / 2.0;
279 pb.y = (i * box_gl -> vect[0][1] - box_gl -> vect[1][1] + box_gl -> vect[2][1]) / 2.0;
280 pb.z = (i * box_gl -> vect[0][2] - box_gl -> vect[1][2] + box_gl -> vect[2][2]) / 2.0;
281 (* c_func)(pa, pb, verts, serts);
282 }
283}
284
292int create_box_lists (int b_step)
293{
294 int vertex = 8;
295 object_3d * box_a, * box_b;
296
298 wingl -> create_shaders[MDBOX] = FALSE;
299
300 if (plot -> abc -> box == NONE) return 0;
301
302 int shaders;
303 vertex *= (plot -> abc -> extra_cell[0]+1)*(plot -> abc -> extra_cell[1]+1)*(plot -> abc -> extra_cell[2]+1);
304
305 if (plot -> abc -> box == WIREFRAME)
306 {
307 shaders = 1;
309 box_b = g_malloc0 (sizeof*box_b);
310 box_b -> vert_buffer_size = LINE_BUFF_SIZE;
311 box_b -> num_vertices = vertex*3;
312 box_b -> vertices = allocfloat (box_b -> vert_buffer_size*box_b -> num_vertices);
313 }
314 else
315 {
316 shaders = 2;
318 // Spheres at corners
319 box_a = draw_sphere (plot -> quality);
320 box_a -> num_instances = 3*vertex*3/2;
321 box_a -> inst_buffer_size = ATOM_BUFF_SIZE;
322 box_a -> instances = allocfloat (box_a -> num_instances*ATOM_BUFF_SIZE);
323 // Cylinders
324 box_b = draw_cylinder (plot -> quality, 1.0, 1.0);
325 box_b -> num_instances = 3*vertex;
326 box_b -> inst_buffer_size = CYLI_BUFF_SIZE;
327 box_b -> instances = allocfloat (box_b -> num_instances*CYLI_BUFF_SIZE);
328
329 }
330 wingl -> ogl_glsl[MDBOX][b_step] = g_malloc0 (shaders*sizeof*wingl -> ogl_glsl[MDBOX][b_step]);
331
332 nbs = nbl = 0;
333 pcol = plot -> abc -> color;
334
336 (plot -> abc -> box == WIREFRAME) ? box_b -> vertices: box_b -> instances,
337 (plot -> abc -> box == WIREFRAME) ? NULL : box_a -> instances);
338 if (plot -> abc -> extra_cell[0] > 0 || plot -> abc -> extra_cell[1] > 0 || plot -> abc -> extra_cell[2] > 0)
339 {
340 prepare_box_vertices (setup_extra_box_vertices, (plot -> abc -> box == WIREFRAME) ? box_b -> vertices: box_b -> instances,
341 (plot -> abc -> box == WIREFRAME) ? NULL : box_a -> instances);
342 }
343 if (plot -> abc -> box == WIREFRAME)
344 {
345 wingl -> ogl_glsl[MDBOX][b_step][0] = init_shader_program (MDBOX, GLSL_LINES, line_vertex, NULL, line_color, GL_LINES, 2, 1, FALSE, box_b);
346 wingl -> ogl_glsl[MDBOX][b_step][0] -> line_width = plot -> abc -> line;
347 }
348 else
349 {
350 // Sphere at corners
351 wingl -> ogl_glsl[MDBOX][b_step][0] = init_shader_program (MDBOX, GLSL_SPHERES, sphere_vertex, NULL, full_color, GL_TRIANGLE_STRIP, 4, 1, TRUE, box_a);
352 g_free (box_a);
353 // Cylinders
354 wingl -> ogl_glsl[MDBOX][b_step][1] = init_shader_program (MDBOX, GLSL_CYLINDERS, cylinder_vertex, NULL, full_color, GL_TRIANGLE_STRIP, 6, 1, TRUE, box_b);
355 }
356 g_free (box_b);
357
358 return shaders;
359}
360
361/*vec3_t center;
362
363/ *
364* void setup_cuboid_vertices (vec3_t a, vec3_t b, int id)
365
366 \brief NOT USED !
367
368 \param a
369 \param b
370 \param id
371* /
372void setup_cuboid_vertices (vec3_t a, vec3_t b, int id)
373{
374 float j;
375 for (j=-1.0; j<2.0; j=j+2.0)
376 {
377 box_axis_vertices (wingl -> d_vertices[LIGHT][id], -1, 0.0, v3_muls (v3_add(a,center), j));
378 box_axis_vertices (wingl -> d_vertices[LIGHT][id], -1, 0.0, v3_muls (v3_add(b,center), j));
379 }
380}*/
381
382GLfloat cuboid_vertices[] = {
383 // Positions // Normals
384 -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
385 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
386 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
387 1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
388 -1.0f, 1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
389 -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
390
391 -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
392 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
393 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
394 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
395 -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
396 -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
397
398 -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f,
399 -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f,
400 -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f,
401 -1.0f, -1.0f, -1.0f, -1.0f, 0.0f, 0.0f,
402 -1.0f, -1.0f, 1.0f, -1.0f, 0.0f, 0.0f,
403 -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f,
404
405 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
406 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
407 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
408 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
409 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
410 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
411
412 -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f,
413 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f,
414 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f,
415 1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f,
416 -1.0f, -1.0f, 1.0f, 0.0f, -1.0f, 0.0f,
417 -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f,
418
419 -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
420 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
421 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
422 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
423 -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
424 -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
425 };
426
436{
437 float lgt = 1.0;
438 object_3d * light = g_malloc0 (sizeof*light);
439 light -> vert_buffer_size = POLY_BUFF_SIZE;
440 light -> num_vertices = 36;
441 light -> vertices = allocfloat (light -> vert_buffer_size*light -> num_vertices);
442 int i, j, k, l;
443 l = 0;
444 for (i=0; i<36; i++)
445 {
446 j = 10*l;
447 k = 6*l;
448 light -> vertices[j] = lgt*cuboid_vertices[k]*0.5 + position.x;
449 light -> vertices[j+1] = lgt*cuboid_vertices[k+1]*0.5 + position.y;
450 light -> vertices[j+2] = lgt*cuboid_vertices[k+2]*0.5 + position.z;
451 light -> vertices[j+3] = cuboid_vertices[k+3];
452 light -> vertices[j+4] = cuboid_vertices[k+4];
453 light -> vertices[j+5] = cuboid_vertices[k+5];
454 light -> vertices[j+6] = 1.0;
455 light -> vertices[j+7] = 1.0;
456 light -> vertices[j+8] = 1.0;
457 light -> vertices[j+9] = 1.0;
458 l ++;
459 }
460 wingl -> ogl_glsl[LIGHT][0][id] = init_shader_program (LIGHT, GLSL_POLYEDRA, full_vertex, NULL, full_color, GL_TRIANGLES, 3, 1, FALSE, light);
461 g_free (light);
462}
463
470{
471 int i, j;
472 j = 0;
474 for (i=0; i<plot -> l_ghtning.lights; i++)
475 {
476 if (plot -> l_ghtning.spot[i].show) j++;
477 }
478 wingl -> n_shaders[LIGHT][0] = j;
479 if (plot -> light_loc != NULL)
480 {
481 g_free (plot -> light_loc);
482 plot -> light_loc = NULL;
483 }
484
485 if (j > 0)
486 {
487 wingl -> ogl_glsl[LIGHT][0] = g_malloc0 (wingl -> n_shaders[LIGHT][0]*sizeof*wingl -> ogl_glsl[LIGHT][0]);
488 plot -> light_loc = allocint (j);
489 j = 0;
490 for (i=0; i<plot -> l_ghtning.lights; i++)
491 {
492 if (plot -> l_ghtning.spot[i].show)
493 {
494 prepare_cuboid (plot -> l_ghtning.spot[i].position, j);
495 if (plot -> l_ghtning.spot[i].type > 0 && plot -> l_ghtning.spot[i].fix == 0) plot -> light_loc[j] = 1;
496 j ++;
497 }
498 }
499 }
500 wingl -> create_shaders[LIGHT] = FALSE;
501}
502
504{
505 vec3_t edge_a = v3_sub(v3, v1);
506 vec3_t edge_b = v3_sub(v2, v1);
507 return v3_norm (v3_cross(edge_a, edge_b));
508}
509
524double draw_cuboid (gboolean draw, int SHADID, int shadnum, mat4_t rot, vec3_t cpos, double paral[3][3], ColRGBA col, double slab_alpha)
525{
526 int i, j, k, l, m, n, o;
527 vec3_t pos;
528 double cvol;
529 double shift[3];
530 cvol = (paral[0][1]*paral[1][2]-paral[0][2]*paral[1][1])*paral[2][0];
531 cvol += (paral[0][2]*paral[1][0]-paral[0][0]*paral[1][2])*paral[2][1];
532 cvol += (paral[0][0]*paral[1][1]-paral[0][1]*paral[1][0])*paral[2][2];
533 cvol = fabs(cvol);
534 if (draw)
535 {
536 object_3d * slab = g_malloc0 (sizeof*slab);
537 slab -> vert_buffer_size = POLY_BUFF_SIZE;
538 slab -> num_vertices = 36*(plot -> abc -> extra_cell[0]+1)*(plot -> abc -> extra_cell[1]+1)*(plot -> abc -> extra_cell[2]+1);
539 slab -> vertices = allocfloat (slab -> vert_buffer_size*slab -> num_vertices);
540 for (i=0; i<36; i++)
541 {
542 j = i*POLY_BUFF_SIZE;
543 k = 6*i;
544 for (l=0; l<3; l++)
545 {
546 slab -> vertices[j+l] += 0.5*(cuboid_vertices[k]*paral[0][l] + cuboid_vertices[k+1]*paral[1][l] + cuboid_vertices[k+2]*paral[2][l]);
547 }
548 pos = vec3 (slab -> vertices[j], slab -> vertices[j+1], slab -> vertices[j+2]);
549 pos = m4_mul_pos (rot, pos);
550 slab -> vertices[j] = pos.x + cpos.x;
551 slab -> vertices[j+1] = pos.y + cpos.y;
552 slab -> vertices[j+2] = pos.z + cpos.z;
553 }
554 n = 0;
555 for (i=0; i<plot -> abc -> extra_cell[0]+1; i++)
556 {
557 for (j=0; j<plot -> abc -> extra_cell[1]+1; j++)
558 {
559 for (k=0; k<plot -> abc -> extra_cell[2]+1; k++)
560 {
561 for (l=0; l<3; l++) shift[l] = i*box_gl -> vect[0][l] + j*box_gl -> vect[1][l] + k*box_gl -> vect[2][l];
562 for (l=0; l<36; l++)
563 {
564 m = POLY_BUFF_SIZE*n;
565 for (o=0; o<3; o++)
566 {
567 slab -> vertices[m+o] = slab -> vertices[l*POLY_BUFF_SIZE+o] + shift[o];
568 if (SHADID == SLABS)
569 {
570 slab -> vertices[m+6+o] = (o) ? 1.0 : 0.0;
571 }
572 else
573 {
574 if (! o) slab -> vertices[m+6+o] = col.red;
575 if (o == 1) slab -> vertices[m+6+o] = col.green;
576 if (o == 2) slab -> vertices[m+6+o] = col.blue;
577 }
578 }
579 pos = vec3 (cuboid_vertices[6*l+3], cuboid_vertices[6*l+4], cuboid_vertices[6*l+5]);
580 pos = m4_mul_pos (rot, pos);
581 slab -> vertices[m+3] = pos.x;
582 slab -> vertices[m+4] = pos.y;
583 slab -> vertices[m+5] = pos.z;
584 slab -> vertices[m+9] = slab_alpha;
585 n ++;
586 }
587 }
588 }
589 }
590 wingl -> ogl_glsl[SHADID][(SHADID == SLABS) ? 0 : step][shadnum] = init_shader_program (SHADID, GLSL_POLYEDRA, full_vertex, NULL, full_color, GL_TRIANGLES, 3, 1, TRUE, slab);
591 g_free (slab);
592 }
593 return cvol;
594}
595
604{
605 int i, j, k, l, m;
606 double ang[3], cang[3], sang[3];
607 double paral[3][3];
608 double tmp;
609 for (i=0; i<3; i++)
610 {
611 if (wingl -> cell_win -> cparam[i+15] == 90.0)
612 {
613 ang[i] = pi/2.0;
614 sang[i] = 1.0;
615 cang[i] = 0.0;
616 }
617 else
618 {
619 ang[i] = wingl -> cell_win -> cparam[i+15]*pi/180.0;
620 sang[i] = sin(ang[i]);
621 cang[i] = cos(ang[i]);
622 }
623 }
624 paral[0][0] = wingl -> cell_win -> cparam[9];
625 paral[0][1] = 0.0;
626 paral[0][2] = 0.0;
627 paral[1][0] = wingl -> cell_win -> cparam[10] * cang[2];
628 paral[1][1] = wingl -> cell_win -> cparam[10] * sang[2];
629 paral[1][2] = 0.0;
630 paral[2][0] = wingl -> cell_win -> cparam[11] * cang[1];
631 tmp = (cang[0] - cang[1]*cang[2]) / sang[2];
632 paral[2][1] = wingl -> cell_win -> cparam[11] * tmp;
633 paral[2][2] = wingl -> cell_win -> cparam[11] * sqrt(sang[1]*sang[1] - tmp*tmp);
634 ColRGBA null; // Not used
635 wingl -> cell_win -> slab_vol = draw_cuboid (! wingl -> cell_win -> cut_this_slab, SLABS, 0, rot,
636 vec3(wingl -> cell_win -> cparam[6], wingl -> cell_win -> cparam[7], wingl -> cell_win -> cparam[8]),
637 paral, null, wingl -> cell_win -> slab_alpha);
638
639 vec3_t at, atc;
640 vec3_t ps[8];
641 vec3_t pn[6];
642 vec3_t cat = vec3(wingl -> cell_win -> cparam[6], wingl -> cell_win -> cparam[7], wingl -> cell_win -> cparam[8]);
643 l = 0;
644 float pmax[3];
645
646 for (i=-1; i<2; i+=2)
647 {
648 for (j=-1; j<2; j+=2)
649 {
650 for (k=-1; k<2; k+=2)
651 {
652 ps[l].x = 0.5*(i*paral[0][0] + j*paral[1][0] + k*paral[2][0]);
653 ps[l].y = 0.5*(i*paral[0][1] + j*paral[1][1] + k*paral[2][1]);
654 ps[l].z = 0.5*(i*paral[0][2] + j*paral[1][2] + k*paral[2][2]);
655 ps[l] = m4_mul_pos (rot, ps[l]);
656 ps[l]= v3_add (ps[l], cat);
657 if (l == 0)
658 {
659 pmax[0] = ps[l].x;
660 pmax[1] = ps[l].y;
661 pmax[2] = ps[l].z;
662 }
663 else
664 {
665 pmax[0] = max(pmax[0],ps[l].x);
666 pmax[1] = max(pmax[1],ps[l].y);
667 pmax[2] = max(pmax[2],ps[l].z);
668 }
669 l ++;
670 }
671 }
672 }
673
674 pn[0] = get_normal (ps[1], ps[0], ps[2]);
675 pn[1] = get_normal (ps[1], ps[0], ps[4]);
676 pn[2] = get_normal (ps[2], ps[0], ps[4]);
677 pn[3] = get_normal (ps[3], ps[7], ps[5]);
678 pn[4] = get_normal (ps[3], ps[7], ps[6]);
679 pn[5] = get_normal (ps[5], ps[7], ps[6]);
680
681 ps[0] = v3_sub (ps[0], cat);
682 ps[7] = v3_sub (ps[7], cat);
683
684 for (i=0; i<proj_gl -> nspec; i++) wingl -> cell_win -> slab_lot[i] = 0;
685 wingl -> cell_win -> slab_atoms = 0;
686 float val, vbl;
687 atom slab_center;
688 distance at_slab;
689 slab_center.x = cat.x;
690 slab_center.y = cat.y;
691 slab_center.z = cat.z;
692 for (i=0; i<proj_gl->natomes; i++)
693 {
694 at_slab = distance_3d (cell_gl, (cell_gl -> npt) ? step : 0, & proj_gl -> atoms[0][i], & slab_center);
695 at = vec3(slab_center.x+at_slab.x, slab_center.y+at_slab.y, slab_center.z+at_slab.z);
696 if (at.x <= pmax[0] && at.y <= pmax[1] && at.z <= pmax[2])
697 {
698 m = 0;
699 atc = v3_sub (at, cat);
700 for (j=0; j<6; j++)
701 {
702 k = (j < 3) ? 0 : 7;
703 val = v3_dot (ps[k], pn[j]);
704 vbl = v3_dot (atc, pn[j]);
705 if (fabs(vbl) < fabs(val))
706 {
707 m ++;
708 }
709 else
710 {
711 break;
712 }
713 }
714 if (m == 6 && (! at_slab.pbc || wingl -> cell_win -> slab_pbc))
715 {
716 wingl -> cell_win -> slab_atoms ++;
717 l = proj_gl -> atoms[0][i].sp;
718 wingl -> cell_win -> slab_lot[l] ++;
719 if (wingl -> cell_win -> cut_this_slab) process_selected_atom (proj_gl, wingl, i, 0, 0, 0);
720 }
721 }
722 }
723}
724
733{
734 int i, j, k;
735 vec3_t pos_a = vec3(-wingl -> cell_win -> cparam[12]/2.0, 0.0, 0.0);
736 vec3_t pos_b = vec3( wingl -> cell_win -> cparam[12]/2.0, 0.0, 0.0);
737 pos_a = m4_mul_pos (rot, pos_a);
738 pos_b = m4_mul_pos (rot, pos_b);
739 vec3_t cat = vec3 (wingl -> cell_win -> cparam[6], wingl -> cell_win -> cparam[7], wingl -> cell_win -> cparam[8]);
740 pos_a = v3_add (pos_a, cat);
741 pos_b = v3_add (pos_b, cat);
742 vec3_t axis = v3_sub (pos_b, pos_a);
743 if (! wingl -> cell_win -> cut_this_slab)
744 {
745 object_3d * slab = g_malloc0 (sizeof*slab);
746 object_3d * slab_cap = g_malloc0 (sizeof*slab_cap);
747 slab = draw_cylinder (30, 1.0, 1.0);
748 slab -> num_instances = (plot -> abc -> extra_cell[0]+1)*(plot -> abc -> extra_cell[1]+1)*(plot -> abc -> extra_cell[2]+1);
749 slab -> inst_buffer_size = CYLI_BUFF_SIZE;
750 slab -> instances = allocfloat (slab -> num_instances*CYLI_BUFF_SIZE);
751 slab_cap = draw_cylinder_cap (50, 1.0, FALSE);
752 slab_cap -> num_instances = 2 * slab -> num_instances;
753 slab_cap -> inst_buffer_size = CAPS_BUFF_SIZE;
754 slab_cap -> instances = allocfloat (slab_cap -> num_instances*CAPS_BUFF_SIZE);
755 ColRGBA col;
756 col.red = 0.0;
757 col.blue = 1.0;
758 col.green = 1.0;
759 col.alpha = wingl -> cell_win -> slab_alpha;
761 for (i=0; i<plot -> abc -> extra_cell[0]+1; i++)
762 {
763 for (j=0; j<plot -> abc -> extra_cell[1]+1; j++)
764 {
765 for (k=0; k<plot -> abc -> extra_cell[2]+1; k++)
766 {
767 shift.x = i*box_gl -> vect[0][0]+j*box_gl -> vect[1][0]+k*box_gl -> vect[2][0];
768 shift.y = i*box_gl -> vect[0][1]+j*box_gl -> vect[1][1]+k*box_gl -> vect[2][1];
769 shift.z = i*box_gl -> vect[0][2]+j*box_gl -> vect[1][2]+k*box_gl -> vect[2][2];
770 pos_a = v3_add (pos_a, shift);
771 pos_b = v3_add (pos_b, shift);
772 setup_cylinder_vertice (slab -> instances, pos_a, pos_b, col, wingl -> cell_win -> cparam[13], 1.0, 0.0);
773 pos_a = v3_sub (pos_a, shift);
774 pos_b = v3_sub (pos_b, shift);
775 }
776 }
777 }
778 wingl -> ogl_glsl[SLABS][0][0] = init_shader_program (SLABS, GLSL_CYLINDERS, cylinder_vertex, NULL, full_color, GL_TRIANGLE_STRIP, 6, 1, TRUE, slab);
779 g_free (slab);
780 nbs = 0;
781 for (i=0; i<plot -> abc -> extra_cell[0]+1; i++)
782 {
783 for (j=0; j<plot -> abc -> extra_cell[1]+1; j++)
784 {
785 for (k=0; k<plot -> abc -> extra_cell[2]+1; k++)
786 {
787 shift.x = i*box_gl -> vect[0][0]+j*box_gl -> vect[1][0]+k*box_gl -> vect[2][0];
788 shift.y = i*box_gl -> vect[0][1]+j*box_gl -> vect[1][1]+k*box_gl -> vect[2][1];
789 shift.z = i*box_gl -> vect[0][2]+j*box_gl -> vect[1][2]+k*box_gl -> vect[2][2];
790 pos_a = v3_add (pos_a, shift);
791 pos_b = v3_add (pos_b, shift);
792 setup_cap_vertice (slab_cap -> instances, pos_a, pos_b, col, wingl -> cell_win -> cparam[13], 1.0);
793 setup_cap_vertice (slab_cap -> instances, pos_b, pos_a, col, wingl -> cell_win -> cparam[13], 1.0);
794 pos_a = v3_sub (pos_a, shift);
795 pos_b = v3_sub (pos_b, shift);
796 }
797 }
798 }
799 wingl -> ogl_glsl[SLABS][0][1] = init_shader_program (SLABS, GLSL_CAPS, cap_vertex, NULL, full_color, GL_TRIANGLE_FAN, 5, 1, TRUE, slab_cap);
800 g_free (slab_cap);
801 }
802 wingl -> cell_win -> slab_vol = pi*pow(wingl -> cell_win -> cparam[13], 2)*wingl -> cell_win -> cparam[12];
803 for (i=0; i<proj_gl -> nspec; i++) wingl -> cell_win -> slab_lot[i] = 0;
804 wingl -> cell_win -> slab_atoms = 0;
805 vec3_t atc, patc;
806 atom slab_center;
807 distance at_slab;
808 slab_center.x = cat.x;
809 slab_center.y = cat.y;
810 slab_center.z = cat.z;
811 for (i=0; i<proj_gl->natomes; i++)
812 {
813 atc = vec3(proj_gl -> atoms[0][i].x, proj_gl -> atoms[0][i].y, proj_gl -> atoms[0][i].z);
814 at_slab = distance_3d (cell_gl, (cell_gl -> npt) ? step : 0, & proj_gl -> atoms[0][i], & slab_center);
815 if (wingl -> cell_win -> slab_pbc || ! at_slab.pbc)
816 {
817 atc = vec3(at_slab.x, at_slab.y, at_slab.z);
818 patc = v3_proj (atc, axis);
819 if (v3_length(patc) <= wingl -> cell_win -> cparam[12]/2.0 && v3_length(v3_sub(patc,atc)) <= wingl -> cell_win -> cparam[13])
820 {
821 wingl -> cell_win -> slab_atoms ++;
822 j = proj_gl -> atoms[0][i].sp;
823 wingl -> cell_win -> slab_lot[j] ++;
824 if (wingl -> cell_win -> cut_this_slab) process_selected_atom (proj_gl, wingl, i, 0, 0, 0);
825 }
826 }
827 }
828}
829
836{
837 int i, j, k, l;
838 vec3_t pos;
839 if (! wingl -> cell_win -> cut_this_slab)
840 {
841 object_3d * slab = g_malloc0 (sizeof*slab);
842 slab = draw_sphere (50);
843 slab -> inst_buffer_size = ATOM_BUFF_SIZE;
844 slab -> num_instances = (plot -> abc -> extra_cell[0]+1)*(plot -> abc -> extra_cell[1]+1)*(plot -> abc -> extra_cell[2]+1);
845 slab -> instances = allocfloat (slab -> num_instances*ATOM_BUFF_SIZE);
846 ColRGBA col;
847 col.red = 0.0;
848 col.blue = 1.0;
849 col.green = 1.0;
850 col.alpha = wingl -> cell_win -> slab_alpha;
851 double shift[3];
852 for (i=0; i<plot -> abc -> extra_cell[0]+1; i++)
853 {
854 for (j=0; j<plot -> abc -> extra_cell[1]+1; j++)
855 {
856 for (k=0; k<plot -> abc -> extra_cell[2]+1; k++)
857 {
858 for (l=0; l<3; l++) shift[l] = i*box_gl -> vect[0][l] + j*box_gl -> vect[1][l] + k*box_gl -> vect[2][l] + wingl -> cell_win -> cparam[l+6];
859 pos = vec3(shift[0], shift[1], shift[2]);
860 setup_sphere_vertice (slab -> instances, pos, col, wingl -> cell_win -> cparam[14], 1.0);
861 }
862 }
863 }
864 wingl -> ogl_glsl[SLABS][0][0] = init_shader_program (SLABS, GLSL_SPHERES, sphere_vertex, NULL, full_color, GL_TRIANGLE_STRIP, 4, 1, TRUE, slab);
865 g_free (slab);
866 }
867 wingl -> cell_win -> slab_vol = (4.0*pi/3.0)*(pow(wingl -> cell_win -> cparam[14], 3));
868 vec3_t cat = vec3 (wingl -> cell_win -> cparam[6], wingl -> cell_win -> cparam[7], wingl -> cell_win -> cparam[8]);
869 for (i=0; i<proj_gl -> nspec; i++) wingl -> cell_win -> slab_lot[i] = 0;
870 wingl -> cell_win -> slab_atoms = 0;
871 atom slab_center;
872 distance at_slab;
873 slab_center.x = cat.x;
874 slab_center.y = cat.y;
875 slab_center.z = cat.z;
876 for (i=0; i<proj_gl->natomes; i++)
877 {
878 at_slab = distance_3d (cell_gl, (cell_gl -> npt) ? step : 0, & proj_gl -> atoms[0][i], & slab_center);
879 if (wingl -> cell_win -> slab_pbc || ! at_slab.pbc)
880 {
881 if (at_slab.length <= wingl -> cell_win -> cparam[14])
882 {
883 wingl -> cell_win -> slab_atoms ++;
884 j = proj_gl -> atoms[0][i].sp;
885 wingl -> cell_win -> slab_lot[j] ++;
886 if (wingl -> cell_win -> cut_this_slab) process_selected_atom (proj_gl, wingl, i, 0, 0, 0);
887 }
888 }
889 }
890}
891
899void create_slab_lists (project * this_proj)
900{
901 wingl = this_proj -> modelgl;
902 proj_gl = this_proj;
903 cell_gl = & proj_gl -> cell;
904 plot = wingl -> anim -> last -> img;
905 step = plot -> step;
906 box_gl = (cell_gl -> npt) ? & cell_gl -> box[step] : & cell_gl -> box[0];
908 if (wingl -> cell_win && (wingl -> cell_win -> slab_show || wingl -> cell_win -> cut_this_slab))
909 {
910 if (! wingl -> cell_win -> cut_this_slab)
911 {
912 wingl -> n_shaders[SLABS][0] = 1;
913 if (wingl -> cell_win -> slab_type == 1) wingl -> n_shaders[SLABS][0] ++;
914 wingl -> ogl_glsl[SLABS][0] = g_malloc0 (wingl -> n_shaders[SLABS][0]*sizeof*wingl -> ogl_glsl[SLABS][0]);
915 nbs = nbl = 0;
916 }
917 mat4_t rot = m4_rotation_xyz (wingl -> cell_win -> cparam[18], wingl -> cell_win -> cparam[19], wingl -> cell_win -> cparam[20]);
918 switch (wingl -> cell_win -> slab_type)
919 {
920 case 0:
921 cuboid_slab (rot);
922 break;
923 case 1:
924 cylinder_slab (rot);
925 break;
926 case 2:
928 break;
929 }
930 if (! wingl -> cell_win -> cut_this_slab) create_slab_info (proj_gl);
931 }
932 wingl -> create_shaders[SLABS] = FALSE;
933}
934
941{
943 int i, j, k, l, m;
944 wingl -> n_shaders[VOLMS][step] = 0;
945 for (i=0; i<FILLED_STYLES; i++) if (plot -> show_vol[i]) wingl -> n_shaders[VOLMS][step] ++;
946 if (wingl -> adv_bonding[0])
947 {
948 for (i=0; i<FILLED_STYLES; i++)
949 {
950 if (plot -> fm_show_vol[0][i])
951 {
952 for (j=0; j<proj_gl -> coord -> totcoord[2]; j++) if (plot -> fm_show_vol[0][i][j]) wingl -> n_shaders[VOLMS][step] ++;
953 }
954 if (plot -> fm_show_vol[1][i])
955 {
956 for (j=0; j<proj_gl -> coord -> totcoord[3]; j++) if (plot -> fm_show_vol[1][i][j]) wingl -> n_shaders[VOLMS][step] += proj_gl -> modelfc -> mols[step][j].multiplicity;
957 }
958 }
959 }
960 if (wingl -> n_shaders[VOLMS][step])
961 {
962 wingl -> ogl_glsl[VOLMS][step] = g_malloc0 (wingl -> n_shaders[VOLMS][step]*sizeof*wingl -> ogl_glsl[VOLMS][step]);
963 mat4_t rot;
964 vec3_t bx;
965 double paral[3][3];
966 m = 0;
967 if (wingl -> adv_bonding[1])
968 {
969 for (i=0; i<FILLED_STYLES; i++)
970 {
971 if (plot -> fm_show_vol[1][i])
972 {
973 for (j=0; j<proj_gl -> coord -> totcoord[3]; j++)
974 {
975 if (plot -> fm_show_vol[1][i][j])
976 {
977 for (k=0; k<proj_gl -> modelfc -> mols[step][j].multiplicity; k++)
978 {
979 l = proj_gl -> modelfc -> mols[step][j].fragments[k];
980 rot = m4_rotation_anti_xyz (wingl -> frag_box[i][step][l][3], wingl -> frag_box[i][step][l][4], wingl -> frag_box[i][step][l][5]);
981 paral[0][0] = wingl -> frag_box[i][step][l][0];
982 paral[0][1] = 0.0;
983 paral[0][2] = 0.0;
984 paral[1][0] = 0.0;
985 paral[1][1] = wingl -> frag_box[i][step][l][1];
986 paral[1][2] = 0.0;
987 paral[2][0] = 0.0;
988 paral[2][1] = 0.0;
989 paral[2][2] = wingl -> frag_box[i][step][l][2];
990 bx = m4_mul_coord (rot, vec3(wingl -> frag_box[i][step][l][6], wingl -> frag_box[i][step][l][7], wingl -> frag_box[i][step][l][8]));
991 draw_cuboid (TRUE, VOLMS, m, rot, bx, paral, plot -> fm_vol_col[1][i][j], plot -> fm_vol_col[1][i][j].alpha);
992 m ++;
993 }
994 }
995 }
996 }
997 }
998 }
999 if (wingl -> adv_bonding[0])
1000 {
1001 for (i=0; i<FILLED_STYLES; i++)
1002 {
1003 if (plot -> fm_show_vol[0][i])
1004 {
1005 for (j=0; j<proj_gl -> coord -> totcoord[2]; j++)
1006 {
1007 if (plot -> fm_show_vol[0][i][j])
1008 {
1009 rot = m4_rotation_anti_xyz (wingl -> frag_box[i][step][j][3], wingl -> frag_box[i][step][j][4], wingl -> frag_box[i][step][j][5]);
1010 paral[0][0] = wingl -> frag_box[i][step][j][0];
1011 paral[0][1] = 0.0;
1012 paral[0][2] = 0.0;
1013 paral[1][0] = 0.0;
1014 paral[1][1] = wingl -> frag_box[i][step][j][1];
1015 paral[1][2] = 0.0;
1016 paral[2][0] = 0.0;
1017 paral[2][1] = 0.0;
1018 paral[2][2] = wingl -> frag_box[i][step][j][2];
1019 bx = m4_mul_coord (rot, vec3(wingl -> frag_box[i][step][j][6], wingl -> frag_box[i][step][j][7], wingl -> frag_box[i][step][j][8]));
1020 draw_cuboid (TRUE, VOLMS, m, rot, bx, paral, plot -> fm_vol_col[0][i][j], plot -> fm_vol_col[0][i][j].alpha);
1021 m ++;
1022 }
1023 }
1024 }
1025 }
1026 }
1027 for (i=0; i<FILLED_STYLES; i++)
1028 {
1029 if (plot -> show_vol[i])
1030 {
1031 rot = m4_rotation_anti_xyz (wingl -> volume_box[i][step][3], wingl -> volume_box[i][step][4], wingl -> volume_box[i][step][5]);
1032 paral[0][0] = wingl -> volume_box[i][step][0];
1033 paral[0][1] = 0.0;
1034 paral[0][2] = 0.0;
1035 paral[1][0] = 0.0;
1036 paral[1][1] = wingl -> volume_box[i][step][1];
1037 paral[1][2] = 0.0;
1038 paral[2][0] = 0.0;
1039 paral[2][1] = 0.0;
1040 paral[2][2] = wingl -> volume_box[i][step][2];
1041 bx = m4_mul_coord (rot, vec3(wingl -> volume_box[i][step][6], wingl -> volume_box[i][step][7], wingl -> volume_box[i][step][8]));
1042 draw_cuboid (TRUE, VOLMS, m, rot, bx, paral, plot -> vol_col[i], plot -> vol_col[i].alpha);
1043 m ++;
1044 }
1045 }
1046 }
1047 wingl -> create_shaders[VOLMS] = FALSE;
1048}
G_MODULE_EXPORT void cut_this_slab(GtkButton *but, gpointer data)
cut this slab callback
Definition cell_cut.c:488
double ax
Definition curve.c:70
int nbs
Definition d_atoms.c:165
int nbl
Definition d_atoms.c:165
void prepare_cuboid(vec3_t position, int id)
OpenGL 3D light object rendering.
Definition d_box.c:435
int create_box_lists(int b_step)
prepare box OpenGL rendering
Definition d_box.c:292
object_3d * draw_sphere(int quality)
OpenGL 3D sphere object rendering.
Definition d_atoms.c:198
ColRGBA pcol
Definition d_poly.c:60
void create_slab_lists(project *this_proj)
prepare slab(s) OpenGL rendering
Definition d_box.c:899
void create_light_lists()
prepare light(s) OpenGL rendering
Definition d_box.c:469
double draw_cuboid(gboolean draw, int SHADID, int shadnum, mat4_t rot, vec3_t cpos, double paral[3][3], ColRGBA col, double slab_alpha)
draw cuboid vertices
Definition d_box.c:524
vec3_t get_normal(vec3_t v1, vec3_t v2, vec3_t v3)
Definition d_box.c:503
void setup_sphere_vertice(float *vertices, vec3_t pos, ColRGBA col, float rad, float alpha)
fill the OpenGL data buffer for a atom (or clone) to render
Definition d_atoms.c:301
void create_slab_info(project *this_proj)
create slab information widget
Definition cell_cut.c:109
gboolean not_in_corners(vec3_t a, float *vertices)
is this box cornder already saved ?
Definition d_box.c:134
void create_volumes_lists()
prepare volume(s) OpenGL rendering
Definition d_box.c:940
void setup_extra_box_vertices(vec3_t a, vec3_t b, float *c_vert, float *s_vert)
prepare the extra cell(s) OpenGL rendering
Definition d_box.c:160
void prepare_box_vertices(void(*c_func)(vec3_t, vec3_t, float *, float *), float *verts, float *serts)
prepare a box OpenGL rendering
Definition d_box.c:254
int BOX_BUFF_SIZE
Definition d_box.c:72
void cuboid_slab(mat4_t rot)
prepare cuboid slab OpenGL rendering
Definition d_box.c:603
void spherical_slab()
prepare spherical slab OpenGL rendering
Definition d_box.c:835
void setup_cylinder_vertice(float *vertices, vec3_t pos_a, vec3_t pos_b, ColRGBA col, float rad, float alpha, float delta)
fill the OpenGL data buffer for a cylinder bond (or clone bond) to render
Definition d_bonds.c:291
void process_selected_atom(project *this_proj, glwin *view, int id, int ac, int se, int pi)
process selected atom
Definition selection.c:514
void setup_line_vertice(float *vertices, vec3_t pos, ColRGBA col, float alpha)
fill the OpenGL data buffer for a line bond (or clone bond) to render
Definition d_bonds.c:265
object_3d * draw_cylinder_cap(int quality, float rad, gboolean picked)
OpenGL 3D cylinder cap object rendering.
Definition d_bonds.c:169
object_3d * draw_cylinder(int quality, float ra, float rb)
OpenGL 3D cylinder object rendering.
Definition d_bonds.c:98
void setup_box_vertices(vec3_t ax, vec3_t bx, float *c_vert, float *s_vert)
prepare the unit cell OpenGL rendering
Definition d_box.c:213
gboolean are_identical_vec3(vec3_t va, vec3_t vb)
are these 2 vectors indentical
Definition d_box.c:82
GLfloat cuboid_vertices[]
Definition d_box.c:382
void setup_cap_vertice(float *vertices, vec3_t pos_a, vec3_t pos_b, ColRGBA col, float rad, float alpha)
fill the OpenGL data buffer for a cylinder cap bond (or clone bond) to render
Definition d_bonds.c:323
gboolean not_in_already(vec3_t a, vec3_t b, float *vertices)
is this box edge vector already saved ?
Definition d_box.c:104
void cylinder_slab(mat4_t rot)
prepare cylinder slab OpenGL rendering
Definition d_box.c:732
ColRGBA col
Definition d_measures.c:77
int * shift
Definition d_measures.c:72
int atoms[NUM_STYLES][2]
float val
Definition dlp_init.c:117
distance distance_3d(cell_info *cell, int mdstep, atom *at, atom *bt)
distance between atom a and b in 3D
Definition ogl_utils.c:81
double pi
Definition global.c:195
int * allocint(int val)
allocate an int * pointer
Definition global.c:314
float * allocfloat(int val)
allocate a float * pointer
Definition global.c:398
Global variable declarations Global convenience function declarations Global data structure defin...
#define max(a, b)
Definition global.h:80
Variable declarations related to the OpenGL window Function declarations related to the OpenGL wind...
image * plot
Definition ogl_draw.c:70
void draw(glwin *view)
main drawing subroutine for the OpenGL window
Definition ogl_draw.c:509
project * proj_gl
Definition ogl_draw.c:64
glwin * wingl
Definition ogl_draw.c:63
box_info * box_gl
Definition ogl_draw.c:68
void cleaning_shaders(glwin *view, int shader)
re-initialize an OpenGL shader
int step
Definition ogl_draw.c:74
glsl_program * init_shader_program(int object, int object_id, const GLchar *vertex, const GLchar *geometry, const GLchar *fragment, GLenum type_of_vertices, int narray, int nunif, gboolean lightning, object_3d *obj)
create an OpenGL shader program
cell_info * cell_gl
Definition ogl_draw.c:69
@ WIREFRAME
Definition glview.h:183
@ NONE
Definition glview.h:181
#define FILLED_STYLES
Definition glwin.h:106
shaders
The different types of shaders in the atomes program.
Definition glwin.h:88
@ VOLMS
Definition glwin.h:102
@ SLABS
Definition glwin.h:101
@ MDBOX
Definition glwin.h:93
@ LIGHT
Definition glwin.h:100
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
const GLchar * full_color
const GLchar * cylinder_vertex
const GLchar * full_vertex
const GLchar * line_color
const GLchar * cap_vertex
const GLchar * line_vertex
Definition ogl_shaders.c:80
const GLchar * sphere_vertex
#define LINE_BUFF_SIZE
Definition ogl_shading.h:50
#define ATOM_BUFF_SIZE
Definition ogl_shading.h:53
#define CAPS_BUFF_SIZE
Definition ogl_shading.h:52
#define POLY_BUFF_SIZE
Definition ogl_shading.h:49
#define CYLI_BUFF_SIZE
Definition ogl_shading.h:51
@ GLSL_CAPS
Definition ogl_shading.h:42
@ GLSL_LINES
Definition ogl_shading.h:40
@ GLSL_POLYEDRA
Definition ogl_shading.h:43
@ GLSL_SPHERES
Definition ogl_shading.h:39
@ GLSL_CYLINDERS
Definition ogl_shading.h:41
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 global.h:891
double z
Definition global.h:897
double y
Definition global.h:896
double x
Definition global.h:895
Definition glwin.h:333
Definition glwin.h:351
double length
Definition glwin.h:124
double z
Definition glwin.h:127
double y
Definition glwin.h:126
gboolean pbc
Definition glwin.h:128
double x
Definition glwin.h:125
Definition glwin.h:965
int natomes
Definition global.h:956
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 a
Definition tab-1.c:95
gchar * cpos[3]
Definition w_advance.c:138
GtkWidget * img
Definition workspace.c:70