52 if( value ) glutPostRedisplay();
65 CENSGraphics::~CENSGraphics() {
73 void CENSGraphics::initCENSGraphics(
int argc,
char ** argv )
81 if( std::string(argv[1]).compare(
"--hide")==0 ) {
98 m_grParameterManager.addParameter(
"SCREEN_WIDTH",m_grViewCamera.m_cScreenWidth);
99 m_grParameterManager.addParameter(
"SCREEN_HEIGHT",m_grViewCamera.m_cScreenHeight);
100 m_grParameterManager.addParameter(
"SCREEN_XGAP",m_grViewCamera.m_cScreenXGap);
101 m_grParameterManager.addParameter(
"SCREEN_YGAP",m_grViewCamera.m_cScreenYGap);
102 m_grParameterManager.addParameter(
"TIMESTEP",m_grTimestep);
103 m_grParameterManager.addParameter(
"SCREEN_TITLE",m_grViewCamera.m_cScreenTitle);
104 m_grParameterManager.addParameter(
"FIELD_OF_VIEW",m_grViewCamera.m_cFoV);
105 m_grParameterManager.addParameter(
"RATIO",m_grViewCamera.m_cRatio);
106 m_grParameterManager.addParameter(
"NEAR",m_grViewCamera.m_cNear);
107 m_grParameterManager.addParameter(
"FAR",m_grViewCamera.m_cFar);
108 m_grParameterManager.addParameter(
"ANGLE",m_grViewCamera.m_cAngle);
109 m_grParameterManager.addParameter(
"DISTANCE",m_grViewCamera.m_cDistance);
110 m_grParameterManager.addParameter(
"HEIGHT",m_grViewCamera.m_cHeight);
111 m_grParameterManager.addParameter(
"TARGET",m_grViewCamera.m_cTarget);
112 m_grParameterManager.addParameter(
"UP",m_grViewCamera.m_cUp);
113 m_grParameterManager.addParameter(
"MOV",m_grViewCamera.m_cMov);
114 m_grParameterManager.addParameter(
"GAP",m_grViewCamera.m_cGap);
120 m_grParameterManager.addParameter(
"ENV_COLOR",m_grEnvColor);
121 m_grParameterManager.addParameter(
"GROUND_COLOR",m_grGroundColor);
122 m_grParameterManager.addParameter(
"OBJECT_COLOR",m_grObjectColor);
123 m_grParameterManager.addParameter(
"BOX_COLOR",m_grBoxColor);
124 m_grParameterManager.addParameter(
"CAPSULE_COLOR",m_grCapsuleColor);
125 m_grParameterManager.addParameter(
"SPHERE_COLOR",m_grSphereColor);
126 m_grParameterManager.addParameter(
"COMPOUND_COLOR",m_grCompoundColor);
127 m_grParameterManager.addParameter(
"SOFT_COLOR",m_grSoftColor);
132 m_grParameterManager.addParameter(
"LIGHT_AMBIENT", m_grLight.m_lAmbient);
133 m_grParameterManager.addParameter(
"LIGHT_DIFFUSE", m_grLight.m_lDiffuse);
134 m_grParameterManager.addParameter(
"LIGHT_SPECULAR", m_grLight.m_lSpecular);
135 m_grParameterManager.addParameter(
"LIGHT_POSITION0", m_grLight.m_lPosition0);
136 m_grParameterManager.addParameter(
"LIGHT_POSITION1", m_grLight.m_lPosition1);
140 if (!m_grParameterManager.loadParameters())
143 m_grViewCamera.m_cScreenWidth = 800;
144 m_grViewCamera.m_cScreenHeight = 600;
145 m_grViewCamera.m_cScreenXGap = 10;
146 m_grViewCamera.m_cScreenYGap = 10;
148 m_grViewCamera.m_cScreenTitle =
"Demo";
149 m_grViewCamera.m_cFoV = 70.0;
150 m_grViewCamera.m_cRatio = 800/600;
151 m_grViewCamera.m_cNear = 1.0;
152 m_grViewCamera.m_cFar = 10000.0;
153 m_grViewCamera.m_cAngle = 0.75;
154 m_grViewCamera.m_cDistance = 85.0;
155 m_grViewCamera.m_cHeight = 4.5;
156 m_grViewCamera.m_cTarget << 0.0, 0.0, 1.0;
157 m_grViewCamera.m_cUp << 0.0, 0.0, 1.0;
158 m_grViewCamera.m_cMov = 45.0;
159 m_grViewCamera.m_cGap = 0.2;
165 m_grEnvColor << 0.1, 0.1, 0.0;
166 m_grGroundColor << 0.6, 0.2, 0.2;
167 m_grObjectColor << 0.2, 0.6, 0.2;
168 m_grBoxColor << 0.8, 0.8, 0.2;
169 m_grCapsuleColor << 0.4, 0.4, 0.6;
170 m_grSphereColor << 0.7, 0.1, 0.7;
171 m_grCompoundColor << 0.2, 0.6, 0.2;
172 m_grSoftColor << 0.0, 0.6, 0.0;
177 m_grLight.m_lAmbient << 0.2, 0.2, 0.2, 1.0;
178 m_grLight.m_lDiffuse << 1.0, 1.0, 1.0, 1.0;
179 m_grLight.m_lSpecular << 1.0, 1.0, 1.0, 1.0;
180 m_grLight.m_lPosition0 << 1.0, 10.0, 1.0, 0.0;
181 m_grLight.m_lPosition1 << -1.0, -10.0, -1.0, 0.0;
183 m_grParameterManager.saveParameters();
188 glutInit( &(m_grArgc), m_grArgv);
195 initCamera(m_grViewCamera,m_grLight);
201 m_grAxisEnabled =
false;
202 m_grSimEnabled =
true;
203 m_grTextureEnabled =
false;
204 m_grObjectAxesEnabled =
false;
205 m_grJointAxesEnabled =
false;
206 m_grCameraAxisEnabled =
false;
212 void CENSGraphics::loop( )
217 void CENSGraphics::stepToStepLoop( )
219 glutMainLoopEvent ();
224 void CENSGraphics::step(
int value )
226 for(
unsigned int x=0; x<m_grCameras.size(); x++) {
227 if(x > 0 || (not isIdle()) ) {
238 void CENSGraphics::display( )
245 bool CENSGraphics::isIdle()
252 void CENSGraphics::quit()
259 void CENSGraphics::keyboard(
unsigned char key,
int x,
int y )
263 case 'q' : quit();
break;
264 case 'l' : stepLeft();
break;
265 case 'j' : stepRight();
break;
266 case 'i' : stepFront();
break;
267 case 'm' : stepBack();
break;
268 case '4' : stepLeft();
break;
269 case '6' : stepRight();
break;
270 case '8' : stepFront();
break;
271 case '2' : stepBack();
break;
272 case '7' : stepLeft(); stepFront();
break;
273 case '9' : stepRight(); stepFront();
break;
274 case '1' : stepLeft(); stepBack();
break;
275 case '3' : stepRight(); stepBack();
break;
276 case 'z' : zoomIn();
break;
277 case 'x' : zoomOut();
break;
278 case 't' : toggleTexture();
break;
279 case 'a' : toggleAxis();
break;
280 case 'd' : toggleObjectAxes();
break;
281 case 'f' : toggleJointAxes();
break;
282 case 's' : toggleCameraAxis();
break;
283 case 'w' : toggleStop();
break;
293 void CENSGraphics::beginRendering()
296 glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
302 void CENSGraphics::endRendering()
309 void CENSGraphics::initTextures( ) {
311 m_grTextureInitialized=
true;
313 for(
unsigned int i=0; i<m_grShapes.size();i++)
314 m_grShapes[i]->initTexture();
319 void CENSGraphics::initTexture(
const GLubyte *source,
int width,
int height ) {
321 m_grTextureInitialized=
true;
329 image =
new GLubyte[256*256*3];
330 for(
int y=0;y<256;++y)
333 GLubyte*pi=image+y*256*3;
334 for(
int x=0;x<256;++x)
338 GLubyte c = b+(((s+t)&1)&1)*(255-b);
339 pi[0]=pi[1]=pi[2]=c;pi+=3;
345 image =
new GLubyte[width*height*3];
346 for(
int x=0;x<width*height*3; x++) {
347 image[x] = source[x];
355 glGenTextures( 1, &texture_id );
356 glBindTexture( GL_TEXTURE_2D, texture_id );
360 GL_TEXTURE_2D,3,width,height,
361 GL_RGB,GL_UNSIGNED_BYTE,
364 glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE );
365 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
366 glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
367 glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
368 glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
372 glEnable( GL_TEXTURE_2D );
382 m_grCameras.push_back(&camera);
385 glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB |
386 GLUT_DEPTH | GLUT_STENCIL);
395 glMatrixMode(GL_PROJECTION);
404 glMatrixMode(GL_MODELVIEW);
410 glEnable(GL_DEPTH_TEST);
412 glDepthFunc(GL_LESS);
413 glShadeModel(GL_SMOOTH);
416 glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
417 glEnable(GL_CULL_FACE);
418 glClearColor(m_grEnvColor(0),m_grEnvColor(1),m_grEnvColor(2),1.0);
419 glEnable(GL_COLOR_MATERIAL);
424 GLfloat m_lAmbient[] = {
428 GLfloat m_lDiffuse[] = {
432 GLfloat m_lSpecular[] = {
436 GLfloat m_lPosition0[] = {
440 GLfloat m_lPosition1[] = {
444 glLightfv(GL_LIGHT0, GL_AMBIENT, m_lAmbient);
445 glLightfv(GL_LIGHT0, GL_DIFFUSE, m_lDiffuse);
446 glLightfv(GL_LIGHT0, GL_SPECULAR, m_lSpecular);
447 glLightfv(GL_LIGHT0, GL_POSITION, m_lPosition0);
449 glLightfv(GL_LIGHT1, GL_AMBIENT, m_lAmbient);
450 glLightfv(GL_LIGHT1, GL_DIFFUSE, m_lDiffuse);
451 glLightfv(GL_LIGHT1, GL_SPECULAR, m_lSpecular);
452 glLightfv(GL_LIGHT1, GL_POSITION, m_lPosition1);
455 glEnable(GL_LIGHTING);
471 void CENSGraphics::focusCamera(
int camera_index ) {
473 CENSCamera &camera = *m_grCameras[camera_index];
476 glMatrixMode(GL_MODELVIEW);
483 void CENSGraphics::updateCamera(
int camera_index) {
485 CENSCamera &camera = *m_grCameras[camera_index];
489 if(&camera == &m_grViewCamera) {
526 const CENSPixelMap &CENSGraphics::getCameraPixelMap(
int camera_index ) {
528 CENSCamera &camera = *m_grCameras[camera_index];
533 unsigned char *pixels =
534 new unsigned char[ data_length ];
540 GL_RGB,GL_BYTE,pixels);
542 glutSetWindow(m_grViewCamera.m_cHandle);
545 .updateNoCopy(pixels,data_length);
554 void CENSGraphics::saveCameraPixelMap(
int camera_index,
int t,
const char * type ) {
556 CENSCamera &camera = *m_grCameras[camera_index];
561 unsigned int *pixels =
562 new unsigned int[ data_length ];
568 GL_RGBA,GL_UNSIGNED_BYTE,pixels);
570 glutSetWindow(m_grViewCamera.m_cHandle);
573 .updateNoCopy(pixels,data_length);
583 std::stringstream filename;
585 << std::setfill(
'0') << std::setw(3)
588 << std::setfill(
'0') << std::setw(8)
591 image.write(filename.str().c_str());
599 void CENSGraphics::drawPlane(
const Vector3f& orig,
const Vector3f& vec0,
const Vector3f& vec1 )
610 Vector3f pt0 = orig + vec0*vecLen;
611 Vector3f pt1 = orig - vec0*vecLen;
612 Vector3f pt2 = orig + vec1*vecLen;
613 Vector3f pt3 = orig - vec1*vecLen;
617 glVertex3f(pt0.x(),pt0.y(),pt0.z());
618 glVertex3f(pt2.x(),pt2.y(),pt2.z());
619 glVertex3f(pt1.x(),pt1.y(),pt1.z());
620 glVertex3f(pt3.x(),pt3.y(),pt3.z());
630 void CENSGraphics::drawBox(
631 const Vector3f& org,
const Matrix3f& rotMat,
const Vector3f& halfExtent )
634 static int indices[12][3] = {
650 static int tex_coords[12][6] = {
667 Vector3f dx(rotMat(0,0),rotMat(0,1),rotMat(0,2));
668 Vector3f dy(rotMat(1,0),rotMat(1,1),rotMat(1,2));
669 Vector3f dz(rotMat(2,0),rotMat(2,1),rotMat(2,2));
677 Vector3f vertices[8]={
696 glBegin(GL_TRIANGLES);
699 for (
int i=0;i<si;i++)
702 const Vector3f& v1 = vertices[indices[i][0]];;
703 const Vector3f& v2 = vertices[indices[i][1]];
704 const Vector3f& v3 = vertices[indices[i][2]];
708 Vector3f normal = (v3-v1).cross(v2-v1);
710 glNormal3f(normal.x(),normal.y(),normal.z());
714 glTexCoord2f(tex_coords[i][0],tex_coords[i][1]);
715 glVertex3f (v1.x(), v1.y(), v1.z());
716 glTexCoord2f(tex_coords[i][2],tex_coords[i][3]);
717 glVertex3f (v2.x(), v2.y(), v2.z());
718 glTexCoord2f(tex_coords[i][4],tex_coords[i][5]);
719 glVertex3f (v3.x(), v3.y(), v3.z());
730 void CENSGraphics::drawSphere(
const Vector3f& org,
const Matrix3f& rot,
float radius ) {
743 float xtag = 1/(float)lats;
744 float ytag = 1/(float)longs;
746 for(i = 0; i <= lats; i++) {
748 float lat0 = M_PI * (-float(0.5) + (i - 1) * xtag);
749 float z0 = radius*sin(lat0);
750 float zr0 = radius*cos(lat0);
752 float lat1 = M_PI * (-float(0.5) + i * xtag);
753 float z1 = radius*sin(lat1);
754 float zr1 = radius*cos(lat1);
756 glBegin(GL_QUAD_STRIP);
757 for(j = 0; j <= longs; j++) {
758 float lng = 2 * M_PI * (j - 1) * ytag;
762 Vector3f ver1(x * zr1, y * zr1, z1);
763 Vector3f ver2(x * zr0, y * zr0, z0);
765 ver1 = org + rot*ver1;
766 ver2 = org + rot*ver2;
768 glNormal3f(ver1.x(),ver1.y(),ver1.z());
769 glTexCoord2f(xtag*( i ), ytag*( j ));
770 glVertex3f(ver1.x(),ver1.y(),ver1.z());
772 glNormal3f(ver2.x(),ver2.y(),ver2.z());
773 glTexCoord2f(xtag*( i - 1 ), ytag*( j ));
774 glVertex3f(ver2.x(),ver2.y(),ver2.z());
787 void CENSGraphics::drawLine(
const Vector3f &v1,
const Vector3f &v2,
const Vector3f color) {
791 glColor3f( color.x(), color.y(),color.z());
797 glVertex3f (v1.x(), v1.y(), v1.z());
798 glVertex3f (v2.x(), v2.y(), v2.z());
810 void CENSGraphics::drawTriangle(
const Vector3f &v1,
const Vector3f &v2,
const Vector3f &v3,
const Vector3f n) {
819 glBegin(GL_TRIANGLES);
823 glNormal3f(n.x(),n.y(),n.z());
827 glVertex3f (v1.x(), v1.y(), v1.z());
828 glVertex3f (v2.x(), v2.y(), v2.z());
829 glVertex3f (v3.x(), v3.y(), v3.z());
841 void CENSGraphics::drawConvex(
const Vector3f& org,
const Matrix3f& rot,
842 const std::vector<Vector3f> &vtx,
const unsigned int *idx,
int nvtxs,
int nidxs,
int ntrns ) {
853 m_grCapsuleColor(2));
855 glBegin(GL_TRIANGLES);
857 for (
int i = 0; i < ntrns; i++)
868 int index1 = idx[i1];
869 int index2 = idx[i2];
870 int index3 = idx[i3];
871 assert(index1 < nvtxs &&
875 Vector3f v1 = org + rot*vtx[index1];
876 Vector3f v2 = org + rot*vtx[index2];
877 Vector3f v3 = org + rot*vtx[index3];
879 Vector3f axis = (v3-v1).cross(v2-v1);
882 glNormal3f(axis.x(),axis.y(),axis.z());
886 glTexCoord2f(v1.x()/div,v1.z()/div);
887 glVertex3f (v1.x(), v1.y(), v1.z());
888 glTexCoord2f(v2.x()/div,v2.z()/div);
889 glVertex3f (v2.x(), v2.y(), v2.z());
890 glTexCoord2f(v3.x()/div,v3.z()/div);
891 glVertex3f (v3.x(), v3.y(), v3.z());
904 void CENSGraphics::drawAxis(
const Vector3f &origin,
const Matrix3f &rotation,
float length) {
907 Vector3f x = origin + rotation*Vector3f(length,0,0);
908 Vector3f y = origin + rotation*Vector3f(0,length,0);
909 Vector3f z = origin + rotation*Vector3f(0,0,length);
918 glVertex3f (o.x(), o.y(), o.z());
919 glVertex3f (x.x(), x.y(), x.z());
922 glVertex3f (o.x(), o.y(), o.z());
923 glVertex3f (y.x(), y.y(), y.z());
926 glVertex3f (o.x(), o.y(), o.z());
927 glVertex3f (z.x(), z.y(), z.z());
941 void CENSGraphics::stepLeft()
943 m_grViewCamera.m_cAngle -= m_grViewCamera.m_cMov;
948 void CENSGraphics::stepRight()
950 m_grViewCamera.m_cAngle += m_grViewCamera.m_cMov;
955 void CENSGraphics::stepFront()
957 m_grViewCamera.m_cHeight += 4*m_grViewCamera.m_cGap;
961 void CENSGraphics::stepBack()
964 m_grViewCamera.m_cHeight -= 4*m_grViewCamera.m_cGap;
969 void CENSGraphics::zoomIn()
971 m_grViewCamera.m_cDistance -= 4*m_grViewCamera.m_cGap;
975 void CENSGraphics::zoomOut()
977 m_grViewCamera.m_cDistance += 4*m_grViewCamera.m_cGap;
982 void CENSGraphics::toggleTexture()
984 if(m_grTextureEnabled) {
986 for(
unsigned int i=0; i<m_grEyeCameras.size(); i++) {
987 glutSetWindow(m_grEyeCameras[i]->m_cHandle);
988 glDisable( GL_TEXTURE_2D );
992 glutSetWindow(m_grViewCamera.m_cHandle);
993 glDisable( GL_TEXTURE_2D );
995 m_grTextureEnabled =
false;
998 for(
unsigned int i=0; i<m_grEyeCameras.size(); i++) {
999 glutSetWindow(m_grEyeCameras[i]->m_cHandle);
1000 glEnable( GL_TEXTURE_2D );
1004 glutSetWindow(m_grViewCamera.m_cHandle);
1005 glEnable( GL_TEXTURE_2D );
1007 m_grTextureEnabled =
true;
1013 void CENSGraphics::toggleAxis()
1015 if(m_grAxisEnabled) {
1016 m_grAxisEnabled =
false;
1018 m_grAxisEnabled =
true;
1024 void CENSGraphics::toggleObjectAxes()
1026 if(m_grObjectAxesEnabled) {
1027 m_grObjectAxesEnabled =
false;
1029 m_grObjectAxesEnabled =
true;
1035 void CENSGraphics::toggleJointAxes()
1037 if(m_grJointAxesEnabled) {
1038 m_grJointAxesEnabled =
false;
1040 m_grJointAxesEnabled =
true;
1046 void CENSGraphics::toggleCameraAxis()
1048 if(m_grCameraAxisEnabled) {
1049 m_grCameraAxisEnabled =
false;
1051 m_grCameraAxisEnabled =
true;
1056 void CENSGraphics::toggleStop()
1058 if(m_grSimEnabled) {
1059 m_grSimEnabled =
false;
1061 m_grSimEnabled =
true;
Computational Embodied Neuroscience Simulator library.
A C++ wrapper for OpenGL.
virtual void keyboard(unsigned char key, int x, int y)
CENSGraphics * cens_graphics
void glutKeyboardCallback(unsigned char key, int x, int y)
Light settings of the scene.
std::string m_cScreenTitle
Use a byte vector as a matrix.
void glutDisplayCallback(void)
void glutTimerCallback(int value)
virtual void step(int ts)