|
@@ -0,0 +1,181 @@
|
|
|
+#include <igl/get_seconds.h>
|
|
|
+#include <igl/png/render_to_png.h>
|
|
|
+#include <igl/material_colors.h>
|
|
|
+
|
|
|
+#ifdef __APPLE__
|
|
|
+# include <GLUT/glut.h>
|
|
|
+#else
|
|
|
+# include <GL/glut.h>
|
|
|
+#endif
|
|
|
+
|
|
|
+#include <cstdlib>
|
|
|
+#include <cstdio>
|
|
|
+#include <cmath>
|
|
|
+#include <iostream>
|
|
|
+#include <iomanip>
|
|
|
+#include <sstream>
|
|
|
+#include <algorithm>
|
|
|
+
|
|
|
+// This example displays one of the following shapes
|
|
|
+typedef enum { SHAPE_TEAPOT=1, SHAPE_TORUS=2, SHAPE_CONE=3, SHAPE_SPHERE=4 } Shape;
|
|
|
+#define NUM_SHAPES 4
|
|
|
+Shape g_CurrentShape = SHAPE_TEAPOT;
|
|
|
+int width,height;
|
|
|
+double alpha = 0.8;
|
|
|
+int capture_count = 0;
|
|
|
+bool capture_on_next = false;
|
|
|
+
|
|
|
+const float light_pos[4] = {-0.1,-0.1,1.0,0.0};
|
|
|
+
|
|
|
+// Callback function called by GLUT to render screen
|
|
|
+void Display(void)
|
|
|
+{
|
|
|
+ using namespace igl;
|
|
|
+ using namespace std;
|
|
|
+ float v[4]; // will be used to set light paramters
|
|
|
+
|
|
|
+ // Clear frame buffer
|
|
|
+ glClearColor(1, 1, 1, 0);
|
|
|
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
|
+
|
|
|
+ glEnable(GL_DEPTH_TEST);
|
|
|
+ glDisable(GL_CULL_FACE);
|
|
|
+ glEnable(GL_NORMALIZE);
|
|
|
+ glEnable(GL_LIGHTING);
|
|
|
+ glLightModelf(GL_LIGHT_MODEL_TWO_SIDE,GL_TRUE);
|
|
|
+
|
|
|
+ // Set light
|
|
|
+ glEnable(GL_LIGHTING);
|
|
|
+ glEnable(GL_LIGHT0);
|
|
|
+ v[0] = v[1] = v[2] = 0.4f; v[3] = 1.0f;
|
|
|
+ glLightfv(GL_LIGHT0, GL_AMBIENT, v);
|
|
|
+ v[0] = v[1] = v[2] = 0.8f; v[3] = 1.0f;
|
|
|
+ glLightfv(GL_LIGHT0, GL_DIFFUSE, v);
|
|
|
+ glLightfv(GL_LIGHT0, GL_POSITION, light_pos);
|
|
|
+
|
|
|
+ // Set material
|
|
|
+ glDisable(GL_COLOR_MATERIAL);
|
|
|
+ float mat_ambient[4], mat_diffuse[4], mat_specular[4], mat_shininess=128;
|
|
|
+ copy(CYAN_AMBIENT,CYAN_AMBIENT+4,mat_ambient);
|
|
|
+ copy(CYAN_DIFFUSE,CYAN_DIFFUSE+4,mat_diffuse);
|
|
|
+ copy(CYAN_SPECULAR,CYAN_SPECULAR+4,mat_specular);
|
|
|
+ mat_ambient[3] = alpha;
|
|
|
+ mat_diffuse[3] = alpha;
|
|
|
+ mat_specular[3] = alpha;
|
|
|
+ glMaterialfv(GL_BACK, GL_AMBIENT, mat_ambient);
|
|
|
+ glMaterialfv(GL_BACK, GL_DIFFUSE, mat_diffuse);
|
|
|
+ glMaterialfv(GL_BACK, GL_SPECULAR, mat_specular);
|
|
|
+ glMaterialf( GL_BACK, GL_SHININESS, mat_shininess);
|
|
|
+
|
|
|
+ copy(GOLD_AMBIENT,GOLD_AMBIENT+4,mat_ambient);
|
|
|
+ copy(GOLD_DIFFUSE,GOLD_DIFFUSE+4,mat_diffuse);
|
|
|
+ copy(GOLD_SPECULAR,GOLD_SPECULAR+4,mat_specular);
|
|
|
+ glMaterialfv(GL_FRONT, GL_AMBIENT, mat_ambient);
|
|
|
+ glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
|
|
|
+ glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
|
|
|
+ glMaterialf( GL_FRONT, GL_SHININESS, mat_shininess);
|
|
|
+
|
|
|
+ if(g_CurrentShape==SHAPE_TEAPOT)
|
|
|
+ {
|
|
|
+ glFrontFace(GL_CW);
|
|
|
+ }else
|
|
|
+ {
|
|
|
+ glFrontFace(GL_CCW);
|
|
|
+ }
|
|
|
+ // Rotate and draw shape
|
|
|
+ glPushMatrix();
|
|
|
+ glRotated(30,1,0,0);
|
|
|
+ glRotated(360*(fmod(get_seconds(),10.0)/10.0),0,1,0);
|
|
|
+ glScaled(1.5,1.5,1.5);
|
|
|
+ glCallList(g_CurrentShape);
|
|
|
+ glPopMatrix();
|
|
|
+
|
|
|
+ if(capture_on_next)
|
|
|
+ {
|
|
|
+ stringstream padnum;
|
|
|
+ padnum << "render_to_png-example-" << setw(4) << setfill('0') << capture_count++ << ".png";
|
|
|
+ render_to_png(padnum.str(),width,height);
|
|
|
+ capture_on_next = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // Present frame buffer
|
|
|
+ glutSwapBuffers();
|
|
|
+
|
|
|
+ // Recall Display at next frame
|
|
|
+ glutPostRedisplay();
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+// Callback function called by GLUT when window size changes
|
|
|
+void Reshape(int width, int height)
|
|
|
+{
|
|
|
+ // Set OpenGL viewport and camera
|
|
|
+ glViewport(0, 0, width, height);
|
|
|
+ ::width = width;
|
|
|
+ ::height = height;
|
|
|
+ glMatrixMode(GL_PROJECTION);
|
|
|
+ glLoadIdentity();
|
|
|
+ gluPerspective(40, (double)width/height, 1, 10);
|
|
|
+ glMatrixMode(GL_MODELVIEW);
|
|
|
+ glLoadIdentity();
|
|
|
+ gluLookAt(0,0,5, 0,0,0, 0,1,0);
|
|
|
+ glTranslatef(0, 0.6f, -1);
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+void key(unsigned char key, int mouse_x, int mouse_y)
|
|
|
+{
|
|
|
+ using namespace std;
|
|
|
+ switch(key)
|
|
|
+ {
|
|
|
+ case 's':
|
|
|
+ g_CurrentShape = (Shape)((g_CurrentShape)%NUM_SHAPES+1);
|
|
|
+ cout<<"g_CurrentShape: "<<g_CurrentShape<<endl;
|
|
|
+ break;
|
|
|
+ case char(27):
|
|
|
+ exit(0);
|
|
|
+ case ' ':
|
|
|
+ capture_on_next = true;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ cout<<"Unknown key command: "<<key<<" "<<int(key)<<endl;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// Main
|
|
|
+int main(int argc, char *argv[])
|
|
|
+{
|
|
|
+ // Initialize GLUT
|
|
|
+ glutInit(&argc, argv);
|
|
|
+ glutInitDisplayString( "rgba depth double samples>=8 ");
|
|
|
+ glutInitWindowSize(640, 480);
|
|
|
+ glutCreateWindow("render_to_png example (press space to render)");
|
|
|
+ glutCreateMenu(NULL);
|
|
|
+
|
|
|
+ // Set GLUT callbacks
|
|
|
+ glutDisplayFunc(Display);
|
|
|
+ glutReshapeFunc(Reshape);
|
|
|
+
|
|
|
+ glutKeyboardFunc(key);
|
|
|
+
|
|
|
+ // Create some 3D objects (stored in display lists)
|
|
|
+ glNewList(SHAPE_TEAPOT, GL_COMPILE);
|
|
|
+ glutSolidTeapot(1.0);
|
|
|
+ glEndList();
|
|
|
+ glNewList(SHAPE_TORUS, GL_COMPILE);
|
|
|
+ glutSolidTorus(0.3, 1.0, 16, 32);
|
|
|
+ glEndList();
|
|
|
+ glNewList(SHAPE_CONE, GL_COMPILE);
|
|
|
+ glutSolidCone(1.0, 1.5, 64, 4);
|
|
|
+ glEndList();
|
|
|
+ glNewList(SHAPE_SPHERE, GL_COMPILE);
|
|
|
+ glutSolidSphere(1.0, 50, 40);
|
|
|
+ glEndList();
|
|
|
+
|
|
|
+ // Call the GLUT main loop
|
|
|
+ glutMainLoop();
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|