]> git.treefish.org Git - phys/latlib.git/blob - culooks_cube.cpp
Made c++11 standard dependency obsolete.
[phys/latlib.git] / culooks_cube.cpp
1 #include "culooks.h"
2
3 #include <GL/glut.h>
4
5 #include <iostream>
6 #include <cmath>
7
8 using namespace std;
9
10 using namespace std;
11
12 int culooks::cube::allid = 0;
13
14 void culooks::cube::setLink (const int& posdir,
15                              const float& red, const float& green, const float& blue, const float& alpha) {
16   linkbuf[(linkbuf_active+1)%2][ posdir*4 ] = red;
17   linkbuf[(linkbuf_active+1)%2][ posdir*4 + 1 ] = green;
18   linkbuf[(linkbuf_active+1)%2][ posdir*4 + 2 ] = blue;
19   linkbuf[(linkbuf_active+1)%2][ posdir*4 + 3 ] = alpha;
20 }
21
22 void culooks::cube::setPlaq (const int& posdir,
23                              const float& red, const float& green, const float& blue, const float& alpha) {
24   plaqbuf[(plaqbuf_active+1)%2][ posdir*4 ] = red;
25   plaqbuf[(plaqbuf_active+1)%2][ posdir*4 + 1 ] = green;
26   plaqbuf[(plaqbuf_active+1)%2][ posdir*4 + 2 ] = blue;
27   plaqbuf[(plaqbuf_active+1)%2][ posdir*4 + 3 ] = alpha;
28 }
29
30 void culooks::cube::hidePlaqs()
31 {
32   hideplaquettes = true;
33 }
34
35 void culooks::cube::hideLinks()
36 {
37   hidelinks = true;
38 }
39
40 void culooks::cube::swapLinkBuffer()
41 {
42   linkbuf_active = (linkbuf_active+1)%2;
43   link = linkbuf[linkbuf_active];
44 }
45
46 void culooks::cube::swapPlaqBuffer()
47 {
48   plaqbuf_active = (plaqbuf_active+1)%2;
49   plaq = plaqbuf[plaqbuf_active];
50 }
51
52 void culooks::cube::draw()
53 {
54   glMatrixMode(GL_MODELVIEW);
55
56   /* draw frame */
57   glEnable(GL_DEPTH_TEST);
58   glDepthMask(GL_TRUE);
59   glDisable(GL_BLEND);
60   glPushMatrix();
61   glScalef(zoom*1.01, zoom*1.01, zoom*1.01);
62   glRotatef(alt, 1, 0, 0);
63   glRotatef(az, 0, 1, 0);
64   glColor4f(wireColor[0], wireColor[1], wireColor[2], wireColor[3]);
65   glLineWidth(framewidth);
66   glutWireCube(2);
67   glPopMatrix();
68
69   glEnable(GL_DEPTH_TEST);
70   glDepthMask(GL_FALSE);
71   glEnable(GL_BLEND);
72   glPushMatrix();
73   glScalef(zoom, zoom, zoom);
74   glRotatef(alt, 1, 0, 0);
75   glRotatef(az, 0, 1, 0);
76   drawAll();
77   glPopMatrix();
78
79   glDepthMask(GL_TRUE);
80 }
81
82 void culooks::cube::drawAll()
83 {
84   glMatrixMode(GL_MODELVIEW);
85   glPushMatrix();
86
87   glTranslatef(-1,-1,-1);
88
89   for (int iz=0; iz<l; iz++) {
90     for (int iy=0; iy<l; iy++) {
91       for (int ix=0; ix<l; ix++) {
92         glPushMatrix();
93         glTranslatef(2.0*ix/l,2.0*iy/l,2.0*iz/l);
94         glScalef(2.0/l,2.0/l,2.0/l);
95
96         glLineWidth(linkwidth);
97
98         /* draw links */
99         if (!hidelinks) {
100           glBegin(GL_LINES);
101           glColor4f(link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 0],
102                     link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 1],
103                     link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 2],
104                     link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 3]);
105           glVertex3f(0,0,0); glVertex3f(1,0,0);
106           glColor4f(link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 0],
107                     link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 1],
108                     link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 2],
109                     link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 3]);
110           glVertex3f(0,0,0); glVertex3f(0,1,0);
111           glColor4f(link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 0],
112                     link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 1],
113                     link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 2],
114                     link[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 3]);
115           glVertex3f(0,0,0); glVertex3f(0,0,1);
116           glEnd();
117         }
118
119         glLineWidth(1);
120
121         /* draw plaquettes */
122         if (!hideplaquettes) {
123           glBegin(GL_QUADS);
124           glColor4f(plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 0],
125                     plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 1],
126                     plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 2],
127                     plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 2*4 + 3]);
128           glVertex3f(0, 0, 0); glVertex3f(1, 0, 0); glVertex3f(1, 1, 0); glVertex3f(0, 1, 0);
129           glColor4f(plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 0],
130                     plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 1],
131                     plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 2],
132                     plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 1*4 + 3]);
133           glVertex3f(0, 0, 0); glVertex3f(1, 0, 0); glVertex3f(1, 0, 1); glVertex3f(0, 0, 1);
134           glColor4f(plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 0],
135                     plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 1],
136                     plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 2],
137                     plaq[iz*l*l*3*4 + iy*l*3*4 + ix*3*4 + 0*4 + 3]);
138           glVertex3f(0, 0, 0); glVertex3f(0, 1, 0); glVertex3f(0, 1, 1); glVertex3f(0, 0, 1);
139           glEnd();
140         }
141
142         glPopMatrix();
143       }
144     }
145   }
146     
147   glPopMatrix();
148 }
149
150 culooks::cube::cube(int _l)
151 {
152   azRotSpeed = 0;
153
154   l = _l;
155   plaqbuf[0] = new float[l*l*l*3 * 4];
156   plaqbuf[1] = new float[l*l*l*3 * 4];
157   linkbuf[0] = new float[l*l*l*3 * 4];
158   linkbuf[1] = new float[l*l*l*3 * 4];
159   
160   linkbuf_active = 0;
161   plaqbuf_active = 0;
162
163   link = linkbuf[0];
164   plaq = plaqbuf[0];
165   az = 45;
166   alt = -30;
167   zoom = 0.57;
168   id = allid;
169   allid++;
170
171   for (int ibuf=0; ibuf<2; ibuf++)
172     for (int i=0; i<l*l*l*3; i++) {
173       linkbuf[ibuf][i*4+0]=1; linkbuf[ibuf][i*4+3]=0.6;
174       plaqbuf[ibuf][i*4+1]=1; plaqbuf[ibuf][i*4+3]=0.2;
175     }
176   
177   hideplaquettes = 0;
178   hidelinks = 0;
179 }
180
181 void culooks::cube::setWireColor(const float& r, const float& g, const float& b, const float& a)
182 {
183   wireColor[0] = r;
184   wireColor[1] = g;
185   wireColor[2] = b;
186   wireColor[3] = a;
187 }
188
189 void culooks::cube::setFrameWidth(float width) {
190   framewidth = width;
191 }
192
193 void culooks::cube::setLinkWidth(float width) {
194   linkwidth = width;
195 }