389 -1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
390 1.0f, -1.0f, -1.0f, 0.0f, 0.0f, -1.0f,
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,
396 -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
397 1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
398 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
399 1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
400 -1.0f, 1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
401 -1.0f, -1.0f, 1.0f, 0.0f, 0.0f, 1.0f,
403 -1.0f, 1.0f, 1.0f, -1.0f, 0.0f, 0.0f,
404 -1.0f, 1.0f, -1.0f, -1.0f, 0.0f, 0.0f,
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,
410 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
411 1.0f, 1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
412 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
413 1.0f, -1.0f, -1.0f, 1.0f, 0.0f, 0.0f,
414 1.0f, -1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
415 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, 0.0f,
417 -1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f,
418 1.0f, -1.0f, -1.0f, 0.0f, -1.0f, 0.0f,
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,
424 -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
425 1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
426 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
427 1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
428 -1.0f, 1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
429 -1.0f, 1.0f, -1.0f, 0.0f, 1.0f, 0.0f,
530 int i, j, k, l, m, n, o;
534 cvol = (paral[0][1]*paral[1][2]-paral[0][2]*paral[1][1])*paral[2][0];
535 cvol += (paral[0][2]*paral[1][0]-paral[0][0]*paral[1][2])*paral[2][1];
536 cvol += (paral[0][0]*paral[1][1]-paral[0][1]*paral[1][0])*paral[2][2];
540 object_3d * slab = g_malloc0(
sizeof*slab);
542 slab -> num_vertices = 36*(
plot -> abc -> extra_cell[0]+1)*(
plot -> abc -> extra_cell[1]+1)*(
plot -> abc -> extra_cell[2]+1);
543 slab -> vertices =
allocfloat (slab -> vert_buffer_size*slab -> num_vertices);
552 pos = vec3 (slab -> vertices[j], slab -> vertices[j+1], slab -> vertices[j+2]);
553 pos = m4_mul_pos (rot, pos);
554 slab -> vertices[j] = pos.
x +
cpos.x;
555 slab -> vertices[j+1] = pos.
y +
cpos.y;
556 slab -> vertices[j+2] = pos.
z +
cpos.z;
559 for (i=0; i<
plot -> abc -> extra_cell[0]+1; i++)
561 for (j=0; j<
plot -> abc -> extra_cell[1]+1; j++)
563 for (k=0; k<
plot -> abc -> extra_cell[2]+1; k++)
574 slab -> vertices[m+6+o] = (o) ? 1.0 : 0.0;
578 if (! o) slab -> vertices[m+6+o] =
col.red;
579 if (o == 1) slab -> vertices[m+6+o] =
col.green;
580 if (o == 2) slab -> vertices[m+6+o] =
col.blue;
584 pos = m4_mul_pos (rot, pos);
585 slab -> vertices[m+3] = pos.
x;
586 slab -> vertices[m+4] = pos.
y;
587 slab -> vertices[m+5] = pos.
z;
588 slab -> vertices[m+9] = slab_alpha;
609 double ang[3], cang[3], sang[3];
614 if (
wingl -> cell_win -> cparam[i+15] == 90.0)
622 ang[i] =
wingl -> cell_win -> cparam[i+15]*
pi/180.0;
623 sang[i] = sin(ang[i]);
624 cang[i] = cos(ang[i]);
627 paral[0][0] =
wingl -> cell_win -> cparam[9];
630 paral[1][0] =
wingl -> cell_win -> cparam[10] * cang[2];
631 paral[1][1] =
wingl -> cell_win -> cparam[10] * sang[2];
633 paral[2][0] =
wingl -> cell_win -> cparam[11] * cang[1];
634 tmp = (cang[0] - cang[1]*cang[2]) / sang[2];
635 paral[2][1] =
wingl -> cell_win -> cparam[11] * tmp;
636 paral[2][2] =
wingl -> cell_win -> cparam[11] * sqrt(sang[1]*sang[1] - tmp*tmp);
639 vec3(
wingl -> cell_win -> cparam[6],
wingl -> cell_win -> cparam[7],
wingl -> cell_win -> cparam[8]),
640 paral, null,
wingl -> cell_win -> slab_alpha);
645 vec3_t cat = vec3(
wingl -> cell_win -> cparam[6],
wingl -> cell_win -> cparam[7],
wingl -> cell_win -> cparam[8]);
649 for (i=-1; i<2; i+=2)
651 for (j=-1; j<2; j+=2)
653 for (k=-1; k<2; k+=2)
655 ps[l].
x = 0.5*(i*paral[0][0] + j*paral[1][0] + k*paral[2][0]);
656 ps[l].
y = 0.5*(i*paral[0][1] + j*paral[1][1] + k*paral[2][1]);
657 ps[l].
z = 0.5*(i*paral[0][2] + j*paral[1][2] + k*paral[2][2]);
658 ps[l] = m4_mul_pos (rot, ps[l]);
659 ps[l]= v3_add (ps[l], cat);
668 pmax[0] =
max(pmax[0],ps[l].
x);
669 pmax[1] =
max(pmax[1],ps[l].
y);
670 pmax[2] =
max(pmax[2],ps[l].
z);
684 ps[0] = v3_sub (ps[0], cat);
685 ps[7] = v3_sub (ps[7], cat);
687 for (i=0; i<
proj_gl -> nspec; i++)
wingl -> cell_win -> slab_lot[i] = 0;
688 wingl -> cell_win -> slab_atoms = 0;
692 slab_center.
x = cat.
x;
693 slab_center.
y = cat.
y;
694 slab_center.
z = cat.
z;
695 for (i=0; i<
proj_gl->natomes; i++)
698 at = vec3(slab_center.
x+at_slab.
x, slab_center.
y+at_slab.
y, slab_center.
z+at_slab.
z);
699 if (at.
x <= pmax[0] && at.
y <= pmax[1] && at.
z <= pmax[2])
702 atc = v3_sub (at, cat);
706 val = v3_dot (ps[k], pn[j]);
707 vbl = v3_dot (atc, pn[j]);
708 if (fabs(vbl) < fabs(
val))
717 if (m == 6 && (! at_slab.
pbc ||
wingl -> cell_win -> slab_pbc))
719 wingl -> cell_win -> slab_atoms ++;
721 wingl -> cell_win -> slab_lot[l] ++;
738 vec3_t pos_a = vec3(-
wingl -> cell_win -> cparam[12]/2.0, 0.0, 0.0);
739 vec3_t pos_b = vec3(
wingl -> cell_win -> cparam[12]/2.0, 0.0, 0.0);
740 pos_a = m4_mul_pos (rot, pos_a);
741 pos_b = m4_mul_pos (rot, pos_b);
742 vec3_t cat = vec3 (
wingl -> cell_win -> cparam[6],
wingl -> cell_win -> cparam[7],
wingl -> cell_win -> cparam[8]);
743 pos_a = v3_add (pos_a, cat);
744 pos_b = v3_add (pos_b, cat);
748 object_3d * slab = g_malloc0(
sizeof*slab);
749 object_3d * slab_cap = g_malloc0(
sizeof*slab_cap);
751 slab -> num_instances = (
plot -> abc -> extra_cell[0]+1)*(
plot -> abc -> extra_cell[1]+1)*(
plot -> abc -> extra_cell[2]+1);
755 slab_cap -> num_instances = 2 * slab -> num_instances;
762 col.alpha =
wingl -> cell_win -> slab_alpha;
764 for (i=0; i<
plot -> abc -> extra_cell[0]+1; i++)
766 for (j=0; j<
plot -> abc -> extra_cell[1]+1; j++)
768 for (k=0; k<
plot -> abc -> extra_cell[2]+1; k++)
773 pos_a = v3_add (pos_a,
shift);
774 pos_b = v3_add (pos_b,
shift);
776 pos_a = v3_sub (pos_a,
shift);
777 pos_b = v3_sub (pos_b,
shift);
783 int narray_cyl =
plot -> ray_tracing ? 8 : 6;
786 for (i=0; i<
plot -> abc -> extra_cell[0]+1; i++)
788 for (j=0; j<
plot -> abc -> extra_cell[1]+1; j++)
790 for (k=0; k<
plot -> abc -> extra_cell[2]+1; k++)
795 pos_a = v3_add (pos_a,
shift);
796 pos_b = v3_add (pos_b,
shift);
799 pos_a = v3_sub (pos_a,
shift);
800 pos_b = v3_sub (pos_b,
shift);
805 GLenum prim_slcp = (
plot -> ray_tracing) ? GL_TRIANGLE_STRIP : GL_TRIANGLE_FAN;
808 wingl -> cell_win -> slab_vol =
pi*pow(
wingl -> cell_win -> cparam[13], 2)*
wingl -> cell_win -> cparam[12];
809 for (i=0; i<
proj_gl -> nspec; i++)
wingl -> cell_win -> slab_lot[i] = 0;
810 wingl -> cell_win -> slab_atoms = 0;
814 slab_center.
x = cat.
x;
815 slab_center.
y = cat.
y;
816 slab_center.
z = cat.
z;
817 for (i=0; i<
proj_gl->natomes; i++)
821 if (
wingl -> cell_win -> slab_pbc || ! at_slab.
pbc)
823 atc = vec3(at_slab.
x, at_slab.
y, at_slab.
z);
824 patc = v3_proj (atc,
axis);
825 if (v3_length(patc) <=
wingl -> cell_win -> cparam[12]/2.0 && v3_length(v3_sub(patc,atc)) <=
wingl -> cell_win -> cparam[13])
827 wingl -> cell_win -> slab_atoms ++;
829 wingl -> cell_win -> slab_lot[j] ++;