亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? multimirror.c

?? jhjuc jggyiiyi gjgu gjjgtu hhgg
?? C
字號:
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <GL/glut.h>

GLUquadricObj *cone, *base, *qsphere;

/* Some <math.h> files do not define M_PI... */
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif

#ifndef __sgi
#define trunc(x) ((double)((int)(x)))
#endif

int draw_passes = 8;

int headsUp = 0;

typedef struct {
  GLfloat verts[4][3];
  GLfloat scale[3];
  GLfloat trans[3];
} Mirror;

Mirror mirrors[] = {
  /* mirror on the left wall */
  {{{-1., -.75, -.75}, {-1., .75, -.75}, {-1., .75, .75}, {-1, -.75, .75}},
     {-1, 1, 1}, {2, 0, 0}},

  /* mirror on right wall */
  {{{1., -.75, .75}, {1., .75, .75}, {1., .75, -.75}, {1., -.75, -.75}},
     {-1, 1, 1}, {-2, 0, 0}},
};
int nMirrors = 2;

void init(void)
{
  static GLfloat lightpos[] = {.5, .75, 1.5, 1};

  glEnable(GL_DEPTH_TEST); 
  glEnable(GL_LIGHTING);
  glEnable(GL_LIGHT0);
  glLightfv(GL_LIGHT0, GL_POSITION, lightpos);

  glEnable(GL_CULL_FACE);

  glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

  cone = gluNewQuadric();
  qsphere = gluNewQuadric();
}

void make_viewpoint(void)
{
  if (headsUp) {
    float width = (1 + 2*(draw_passes/nMirrors)) * 1.25;
    float height = (width / tan((30./360.) * (2.*M_PI))) + 1;

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60, 1, height - 3, height + 3);
    gluLookAt(0, height, 0,
	      0, 0, 0, 
	      0, 0, 1);
  } else {
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(60, 1, .01, 4 + 2*(draw_passes / nMirrors));
    gluLookAt(-2, 0, .75, 
	      0, 0, 0, 
	      0, 1, 0);
  }
    
  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
}

void reshape(GLsizei w, GLsizei h) 
{
  glViewport(0, 0, w, h);
  make_viewpoint();
}

void draw_room(void)
{
  /* material for the walls, floor, ceiling */
  static GLfloat wall_mat[] = {1.f, 1.f, 1.f, 1.f};

  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, wall_mat);

  glBegin(GL_QUADS);
  
  /* floor */
  glNormal3f(0, 1, 0);
  glVertex3f(-1, -1, 1);
  glVertex3f(1, -1, 1);
  glVertex3f(1, -1, -1);
  glVertex3f(-1, -1, -1);

  /* ceiling */
  glNormal3f(0, -1, 0);
  glVertex3f(-1, 1, -1);
  glVertex3f(1, 1, -1);
  glVertex3f(1, 1, 1);
  glVertex3f(-1, 1, 1);  

  /* left wall */
  glNormal3f(1, 0, 0);
  glVertex3f(-1, -1, -1);
  glVertex3f(-1, 1, -1);
  glVertex3f(-1, 1, 1);
  glVertex3f(-1, -1, 1);

  /* right wall */
  glNormal3f(-1, 0, 0);
  glVertex3f(1, -1, 1);
  glVertex3f(1, 1, 1);
  glVertex3f(1, 1, -1);
  glVertex3f(1, -1, -1);

  /* far wall */
  glNormal3f(0, 0, 1);
  glVertex3f(-1, -1, -1);
  glVertex3f(1, -1, -1);
  glVertex3f(1, 1, -1);
  glVertex3f(-1, 1, -1);

  /* back wall */
  glNormal3f(0, 0, -1);
  glVertex3f(-1, 1, 1);
  glVertex3f(1, 1, 1);
  glVertex3f(1, -1, 1);
  glVertex3f(-1, -1, 1);
  glEnd();
}

void draw_cone(void)
{
  static GLfloat cone_mat[] = {0.f, .5f, 1.f, 1.f};

  glPushMatrix();
  glTranslatef(0, -1, 0);
  glRotatef(-90, 1, 0, 0);

  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, cone_mat);

  gluCylinder(cone, .3, 0, 1.25, 20, 1);

  glPopMatrix();
}

void draw_sphere(GLdouble secs)
{
  static GLfloat sphere_mat[] = {1.f, .5f, 0.f, 1.f};
  GLfloat angle;

  /* one revolution every 10 seconds... */
  secs = secs - 10.*trunc(secs / 10.);
  angle = (secs/10.) * (360.);

  glPushMatrix();
  glTranslatef(0, -.3, 0);
  glRotatef(angle, 0, 1, 0);
  glTranslatef(.6, 0, 0);

  glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, sphere_mat);
  gluSphere(qsphere, .3, 20, 20);

  glPopMatrix();
}

GLdouble get_secs(void)
{
  return glutGet(GLUT_ELAPSED_TIME) / 1000.0;
}

void draw_mirror(Mirror *m)
{
  glBegin(GL_QUADS);
  glVertex3fv(m->verts[0]);
  glVertex3fv(m->verts[1]);
  glVertex3fv(m->verts[2]);
  glVertex3fv(m->verts[3]);
  glEnd();
}

/* A note on matrix management:  it would be easier to use push and
 * pop to save and restore the matrices, but the projection matrix stack
 * is very shallow, so we just undo what we did.  In the extreme this
 * could lead to mathematic error. */

GLenum reflect_through_mirror(Mirror *m, GLenum cullFace)
{
  GLenum newCullFace = ((cullFace == GL_FRONT) ? GL_BACK : GL_FRONT);

  glMatrixMode(GL_PROJECTION);
  glScalef(m->scale[0], m->scale[1], m->scale[2]); 
  glTranslatef(m->trans[0], m->trans[1], m->trans[2]); 
  glMatrixMode(GL_MODELVIEW);

  /* must flip the cull face since reflection reverses the orientation
   * of the polygons */
  glCullFace(newCullFace);

  return newCullFace;
}

void undo_reflect_through_mirror(Mirror *m, GLenum cullFace)
{
  glMatrixMode(GL_PROJECTION);
  glTranslatef(-m->trans[0], -m->trans[1], -m->trans[2]);
  glScalef(1./m->scale[0], 1./m->scale[1], 1./m->scale[2]);
  glMatrixMode(GL_MODELVIEW);

  glCullFace(cullFace);
}

void draw_scene(GLdouble secs, int passes, GLenum cullFace, 
		GLuint stencilVal, GLuint mirror)
{
  GLenum newCullFace;
  int passesPerMirror, passesPerMirrorRem;
  unsigned int curMirror, drawMirrors;
  int i;

  /* one pass to draw the real scene */
  passes--;

  /* only draw in my designated locations */
  glStencilFunc(GL_EQUAL, stencilVal, 0xffffffff);

  /* draw things which may obscure the mirrors first */
  draw_sphere(secs);
  draw_cone();

  /* now draw the appropriate number of mirror reflections.  for
   * best results, we perform a depth-first traversal by allocating
   * a number of passes for each of the mirrors. */
  if (mirror != 0xffffffff) {
    passesPerMirror = passes / (nMirrors - 1);
    passesPerMirrorRem = passes % (nMirrors - 1);
    if (passes > nMirrors - 1) drawMirrors = nMirrors - 1;
    else drawMirrors = passes;
  } else {
    /* mirror == -1 means that this is the initial scene (there was no 
     * mirror) */
    passesPerMirror = passes / nMirrors;
    passesPerMirrorRem = passes % nMirrors;
    if (passes > nMirrors) drawMirrors = nMirrors;
    else drawMirrors = passes;
  }
  for (i = 0; drawMirrors > 0; i++) {
    curMirror = i % nMirrors;
    if (curMirror == mirror) continue;
    drawMirrors--;

    /* draw mirror into stencil buffer but not color or depth buffers */
    glColorMask(0, 0, 0, 0);
    glDepthMask(0);
    glStencilOp(GL_KEEP, GL_KEEP, GL_INCR); 
    draw_mirror(&mirrors[curMirror]);
    glColorMask(1, 1, 1, 1);
    glDepthMask(1);
    glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

    /* draw reflected scene */
    newCullFace = reflect_through_mirror(&mirrors[curMirror], cullFace);
    if (passesPerMirrorRem) {
      draw_scene(secs, passesPerMirror + 1, newCullFace, stencilVal + 1, 
		 curMirror);      
      passesPerMirrorRem--;
    } else {
      draw_scene(secs, passesPerMirror, newCullFace, stencilVal + 1, 
		 curMirror);
    }
    undo_reflect_through_mirror(&mirrors[curMirror], cullFace);

    /* back to our stencil value */
    glStencilFunc(GL_EQUAL, stencilVal, 0xffffffff);    
  }

  draw_room(); 
}

void draw(void)
{
  GLenum err;
  GLfloat secs = get_secs();
  
  glDisable(GL_STENCIL_TEST);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
  
  if (!headsUp) glEnable(GL_STENCIL_TEST);
  draw_scene(secs, draw_passes, GL_BACK, 0, (unsigned)-1);
  glDisable(GL_STENCIL_TEST);

  if (headsUp) {
    /* draw a red floor on the original scene */
    glDisable(GL_LIGHTING);
    glBegin(GL_QUADS);
    glColor3f(1, 0, 0);
    glVertex3f(-1, -.95, 1);
    glVertex3f(1, -.95, 1);
    glVertex3f(1, -.95, -1);
    glVertex3f(-1, -.95, -1);    
    glEnd();
    glEnable(GL_LIGHTING);
  }

  err = glGetError();
  if (err != GL_NO_ERROR) printf("Error:  %s\n", gluErrorString(err));
  
  glutSwapBuffers(); 
}

/* ARGSUSED1 */
void key(unsigned char key, int x, int y)
{
  switch(key) {
  case '.':  case '>':  case '+':  case '=':
    draw_passes++;
    printf("Passes = %d\n", draw_passes);
    make_viewpoint();
    break;
  case ',':  case '<':  case '-':  case '_':
    draw_passes--;
    if (draw_passes < 1) draw_passes = 1;
    printf("Passes = %d\n", draw_passes);
    make_viewpoint();
    break;
  case 'h':  case 'H':
    /* heads up mode */
    headsUp = (headsUp == 0);
    make_viewpoint();
    break;
  case 27:
    exit(0);
  }
}

#define MIN_COLOR_BITS 4
#define MIN_DEPTH_BITS 8

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitWindowSize(256, 256);
    glutInitWindowPosition(0, 0);
    if (argc > 1) {
      glutInitDisplayString("samples stencil>=3 rgb depth");
    } else { 
      glutInitDisplayString("samples stencil>=3 rgb double depth");
    }
    glutCreateWindow(argv[0]);
    glutDisplayFunc(draw);
    glutIdleFunc(draw);
    glutKeyboardFunc(key);
    glutReshapeFunc(reshape);
    init();

    glutMainLoop();
    return 0;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美亚洲国产另类| 日韩欧美你懂的| 六月丁香综合在线视频| 国产精品天天摸av网| 欧美日韩高清不卡| 国产福利一区二区三区视频| 婷婷亚洲久悠悠色悠在线播放| 国产亚洲欧洲一区高清在线观看| 欧美日韩一区二区在线视频| 成人午夜视频在线观看| 乱中年女人伦av一区二区| 一区二区三区高清| 国产精品视频一二三| 亚洲精品一区二区三区影院| 色爱区综合激月婷婷| 国产1区2区3区精品美女| 美国毛片一区二区| 亚洲成人免费视频| 亚洲视频在线观看一区| 国产性天天综合网| 日韩你懂的在线播放| 欧美伊人精品成人久久综合97| 粉嫩av亚洲一区二区图片| 精品在线视频一区| 青青草一区二区三区| 亚洲18色成人| 亚洲在线成人精品| 一区二区三区鲁丝不卡| 日韩毛片一二三区| 欧美国产日产图区| 国产喂奶挤奶一区二区三区| 日韩亚洲欧美高清| 欧美日韩国产系列| 欧美日韩国产美女| 欧美三级日韩在线| 欧美三级日韩三级国产三级| 亚洲精品一区二区三区福利| 91精品国产色综合久久不卡蜜臀| 欧美色图第一页| 91在线视频播放| 97se狠狠狠综合亚洲狠狠| 91在线观看成人| 97se亚洲国产综合自在线不卡 | 2021国产精品久久精品| 日韩一级片在线观看| 欧美大片在线观看一区二区| 日韩欧美的一区| 欧美精品一区二区不卡| 久久久精品人体av艺术| 中文字幕久久午夜不卡| 中文字幕一区av| 亚洲视频一区二区在线| 亚洲免费在线看| 亚洲国产综合视频在线观看| 亚洲香肠在线观看| 日韩二区三区四区| 久久精品国产亚洲高清剧情介绍| 精品在线免费观看| 国产91精品在线观看| 91丨porny丨最新| 欧美怡红院视频| 欧美变态口味重另类| 久久色在线视频| 亚洲欧美偷拍另类a∨色屁股| 亚洲国产婷婷综合在线精品| 青青草国产精品97视觉盛宴 | 日本久久电影网| 欧美日韩在线播放| 欧美一二三区在线| 国产三区在线成人av| 一区二区三区四区在线播放| 爽好久久久欧美精品| 国产在线麻豆精品观看| 成人午夜碰碰视频| 精品视频全国免费看| 精品不卡在线视频| 久久福利视频一区二区| 99久久综合国产精品| 91麻豆精品秘密| 日韩免费看网站| 亚洲欧洲日本在线| 日本女人一区二区三区| 国产白丝网站精品污在线入口| 色综合一区二区三区| 91精品国产乱码| 国产人久久人人人人爽| 亚洲小少妇裸体bbw| 国产在线精品视频| 在线观看日韩一区| 国产亚洲综合性久久久影院| 一区二区三区高清在线| 国产精品一级黄| 欧美色图一区二区三区| 国产香蕉久久精品综合网| 亚洲国产一区二区在线播放| 国产成人精品免费在线| 欧美一区二区在线视频| 亚洲精品午夜久久久| 激情小说欧美图片| 在线精品视频一区二区三四| 久久精品人人做人人爽人人| 日本午夜一区二区| av亚洲精华国产精华精华| 精品国产免费一区二区三区四区| 亚洲免费在线看| 国产盗摄精品一区二区三区在线| 欧美区在线观看| 亚洲婷婷在线视频| 国产一区二区在线观看免费| 91精品国产综合久久精品| 自拍偷拍亚洲欧美日韩| 国产成人高清在线| 精品国产成人在线影院| 三级欧美韩日大片在线看| 在线一区二区三区四区| 国产精品久久久久久妇女6080| 精品一区二区日韩| 欧美另类videos死尸| 亚洲精选视频在线| 国产激情视频一区二区在线观看| 欧美xxxxxxxx| 首页亚洲欧美制服丝腿| 欧美亚洲动漫精品| 最新欧美精品一区二区三区| 风间由美一区二区av101| www国产成人| 狠狠色丁香婷综合久久| 欧美一区二区三区视频在线| 首页综合国产亚洲丝袜| 欧美日韩国产一区| 性做久久久久久久免费看| 欧美性三三影院| 亚洲免费观看高清完整版在线观看| 粉嫩av亚洲一区二区图片| 国产欧美在线观看一区| 国产jizzjizz一区二区| 中文字幕av一区二区三区| 国产69精品一区二区亚洲孕妇 | 亚洲丝袜精品丝袜在线| 99国产精品一区| 免费在线视频一区| 日韩丝袜美女视频| 另类调教123区| 国产亚洲一区二区三区在线观看 | 欧美天天综合网| 亚洲成人av一区二区三区| 欧美日韩精品一区二区三区四区| 亚洲国产毛片aaaaa无费看| 欧美伊人久久久久久午夜久久久久| 一区二区免费看| 欧美日韩精品福利| 蜜臀91精品一区二区三区| 欧美成人三级在线| 免费成人在线观看| 国产亚洲成aⅴ人片在线观看| 成人激情免费网站| 亚洲精品日产精品乱码不卡| 国产美女主播视频一区| 日本韩国欧美三级| 久久色在线观看| av资源网一区| 亚洲一区二区在线免费观看视频| 91麻豆精品国产91久久久更新时间| 天堂av在线一区| 久久婷婷国产综合国色天香| 成人黄色av电影| 亚洲欧美日韩精品久久久久| 色八戒一区二区三区| 日本vs亚洲vs韩国一区三区二区 | 在线观看免费一区| 日韩av一区二| 国产欧美综合色| 日本高清无吗v一区| 青青草成人在线观看| 久久精品免费在线观看| 粉嫩绯色av一区二区在线观看| 亚洲一区二区av电影| 色88888久久久久久影院按摩 | 成人美女在线视频| 亚洲一区免费在线观看| 欧美色涩在线第一页| 久久99精品国产| 国产精品不卡视频| 欧美日韩一级二级| 美女网站一区二区| 亚洲美女视频在线观看| 欧美精品自拍偷拍动漫精品| 免费在线观看精品| 中文字幕久久午夜不卡| 日韩亚洲欧美一区二区三区| 国产v日产∨综合v精品视频| 一区二区三区欧美激情| 国产视频亚洲色图| 欧洲精品在线观看| 精品综合久久久久久8888| 尤物av一区二区| 精品久久久久久久久久久久久久久久久 | 欧美国产视频在线| 欧洲一区二区三区在线| 久久精品国产在热久久|