#pragma comment(linker, "/SUBSYSTEM:WINDOWS /ENTRY:mainCRTStartup")
#include <stdio.h>
#include <GL/freeglut/freeglut.h>
#include <vector>
using namespace std;
#define WIDTH 320
#define HEIGHT 240
//頂点情報用
struct vector3d{
double x;
double y;
double z;
}vec3d;
vector <vector3d> vertex;
//テッセレータオブジェクト
GLUtesselator *tess;
//回転用
float anglex = 0.0f;
//白
GLfloat white[] = { 1.0, 1.0, 1.0, 1.0 };
//キーボード
BYTE KeyTbl[256];
void setdata(double x,double y,double z){
vec3d.x=x;
vec3d.y=y;
vec3d.z=z;
vertex.push_back(vec3d);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glViewport(0, 0, WIDTH, HEIGHT);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(30.0, (double)WIDTH / (double)HEIGHT, 1.0, 1000.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(0.0,0.0,800.0,
0.0,0.0,0.0,
0.0,1.0,0.0);
glMaterialfv(GL_FRONT, GL_DIFFUSE, white);
glColor3f(1,1,1);
GetKeyboardState(KeyTbl);
if(KeyTbl[VK_SPACE] & 0x80){
gluTessBeginPolygon(tess, 0);
gluTessBeginContour(tess);
for(int i=0;i<(signed)vertex.size();i++){
gluTessVertex(tess, &vertex[i].x, &vertex[i]);
}
gluTessEndContour(tess);
gluTessEndPolygon(tess);
}else{
glBegin(GL_LINE_LOOP);
for(int i=0;i<(signed)vertex.size();i++){
glVertex3dv(&vertex[i].x);
}
glEnd();
}
glutSwapBuffers();
}
void idle(void)
{
glutPostRedisplay();
}
void Init(){
//頂点情報セット
setdata(50,50,0);
setdata(200,50,0);
setdata(150,-50,0);
setdata(50,-20,0);
setdata(0,0,0);
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
glEnable(GL_DEPTH_TEST);
//ワイヤーフレーム
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
tess = gluNewTess();
if(tess == NULL){
printf("テッセレータオブジェクトがありません。");
exit(1);
}
gluTessCallback(tess, GLU_TESS_BEGIN, (void (__stdcall*)(void))glBegin);
gluTessCallback(tess, GLU_TESS_END, (void (__stdcall*)(void))glEnd);
gluTessCallback(tess, GLU_TESS_VERTEX, (void
(__stdcall*)(void))glVertex3dv);
}
int main(int argc, char *argv[])
{
glutInitWindowPosition(100, 100);
glutInitWindowSize(WIDTH, HEIGHT);
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE);
glutCreateWindow("テッセレーション");
glutDisplayFunc(display);
glutIdleFunc(idle);
Init();
glutMainLoop();
return 0;
}
|