⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 teapots.cpp

📁 QT4 gui programming的随书光盘
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/* * The OpenGL code in this example is based on the "teapots" example in * "OpenGL Programming Guide" by Jackie Neider, Tom Davis, and Mason * Woo, Addison-Wesley, 1993. It can be obtained from ftp.sgi.com and * contains the following copyright notice: * * (c) Copyright 1993, Silicon Graphics, Inc. * ALL RIGHTS RESERVED * Permission to use, copy, modify, and distribute this software for * any purpose and without fee is hereby granted, provided that the * above copyright notice appear in all copies and that both the * copyright notice and this permission notice appear in supporting * documentation, and that the name of Silicon Graphics, Inc. not be * used in advertising or publicity pertaining to distribution of the * software without specific, written prior permission. * * THE MATERIAL EMBODIED ON THIS SOFTWARE IS PROVIDED TO YOU "AS-IS" * AND WITHOUT WARRANTY OF ANY KIND, EXPRESS, IMPLIED OR OTHERWISE, * INCLUDING WITHOUT LIMITATION, ANY WARRANTY OF MERCHANTABILITY OR * FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON * GRAPHICS, INC. BE LIABLE TO YOU OR ANYONE ELSE FOR ANY DIRECT, * SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY * KIND, OR ANY DAMAGES WHATSOEVER, INCLUDING WITHOUT LIMITATION, * LOSS OF PROFIT, LOSS OF USE, SAVINGS OR REVENUE, OR THE CLAIMS OF * THIRD PARTIES, WHETHER OR NOT SILICON GRAPHICS, INC. HAS BEEN * ADVISED OF THE POSSIBILITY OF SUCH LOSS, HOWEVER CAUSED AND ON * ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE * POSSESSION, USE OR PERFORMANCE OF THIS SOFTWARE. * * US Government Users Restricted Rights * Use, duplication, or disclosure by the Government is subject to * restrictions set forth in FAR 52.227.19(c)(2) or subparagraph * (c)(1)(ii) of the Rights in Technical Data and Computer Software * clause at DFARS 252.227-7013 and/or in similar or successor * clauses in the FAR or the DOD or NASA FAR Supplement. * Unpublished-- rights reserved under the copyright laws of the * United States. Contractor/manufacturer is Silicon Graphics, * Inc., 2011 N. Shoreline Blvd., Mountain View, CA 94039-7311. * * OpenGL(TM) is a trademark of Silicon Graphics, Inc. */#include <QtGui>#include <QtOpenGL>#include "teapots.h"Teapots::Teapots(QWidget *parent)    : QGLWidget(parent){    rubberBandIsShown = false;    makeCurrent();    fbObject = new QGLFramebufferObject(1024, 1024,                                        QGLFramebufferObject::Depth);    createGLTeapotObject();}Teapots::~Teapots(){    makeCurrent();    delete fbObject;    glDeleteLists(glTeapotObject, 1);}void Teapots::initializeGL(){    static const GLfloat ambient[] = { 0.0, 0.0, 0.0, 1.0 };    static const GLfloat diffuse[] = { 1.0, 1.0, 1.0, 1.0 };    static const GLfloat position[] = { 0.0, 3.0, 3.0, 0.0 };    static const GLfloat lmodelAmbient[] = { 0.2, 0.2, 0.2, 1.0 };    static const GLfloat localView[] = { 0.0 };    glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);    glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);    glLightfv(GL_LIGHT0, GL_POSITION, position);    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodelAmbient);    glLightModelfv(GL_LIGHT_MODEL_LOCAL_VIEWER, localView);    glFrontFace(GL_CW);    glEnable(GL_LIGHTING);    glEnable(GL_LIGHT0);    glEnable(GL_AUTO_NORMAL);    glEnable(GL_NORMALIZE);    glEnable(GL_DEPTH_TEST);    glDepthFunc(GL_LESS);}void Teapots::resizeGL(int width, int height){    fbObject->bind();    glDisable(GL_TEXTURE_2D);    glEnable(GL_LIGHTING);    glEnable(GL_DEPTH_TEST);    glViewport(0, 0, width, height);    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    if (width <= height) {        glOrtho(0.0, 20.0, 0.0, 20.0 * GLfloat(height) / GLfloat(width),                -10.0, 10.0);    } else {        glOrtho(0.0, 20.0 * GLfloat(width) / GLfloat(height), 0.0, 20.0,                -10.0, 10.0);    }    glMatrixMode(GL_MODELVIEW);    drawTeapots();    fbObject->release();}void Teapots::paintGL(){    glDisable(GL_LIGHTING);    glViewport(0, 0, width(), height());    glMatrixMode(GL_PROJECTION);    glLoadIdentity();    glMatrixMode(GL_MODELVIEW);    glLoadIdentity();    glDisable(GL_DEPTH_TEST);    glClear(GL_COLOR_BUFFER_BIT);    glEnable(GL_TEXTURE_2D);    glBindTexture(GL_TEXTURE_2D, fbObject->texture());    glColor3f(1.0, 1.0, 1.0);    GLfloat s = width() / GLfloat(fbObject->size().width());    GLfloat t = height() / GLfloat(fbObject->size().height());    glBegin(GL_QUADS);    glTexCoord2f(0.0, 0.0);    glVertex2f(-1.0, -1.0);    glTexCoord2f(s, 0.0);    glVertex2f(1.0, -1.0);    glTexCoord2f(s, t);    glVertex2f(1.0, 1.0);    glTexCoord2f(0.0, t);    glVertex2f(-1.0, 1.0);    glEnd();    if (rubberBandIsShown) {        glMatrixMode(GL_PROJECTION);        glOrtho(0, width(), height(), 0, 0, 100);        glMatrixMode(GL_MODELVIEW);        glDisable(GL_TEXTURE_2D);        glEnable(GL_BLEND);        glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);        glLineWidth(4.0);        glColor4f(1.0, 1.0, 1.0, 0.2);        glRecti(rubberBandCorner1.x(), rubberBandCorner1.y(),                rubberBandCorner2.x(), rubberBandCorner2.y());        glColor4f(1.0, 1.0, 0.0, 0.5);        glLineStipple(3, 0xAAAA);        glEnable(GL_LINE_STIPPLE);        glBegin(GL_LINE_LOOP);        glVertex2i(rubberBandCorner1.x(), rubberBandCorner1.y());        glVertex2i(rubberBandCorner2.x(), rubberBandCorner1.y());        glVertex2i(rubberBandCorner2.x(), rubberBandCorner2.y());        glVertex2i(rubberBandCorner1.x(), rubberBandCorner2.y());        glEnd();        glLineWidth(1.0);        glDisable(GL_LINE_STIPPLE);        glDisable(GL_BLEND);    }}void Teapots::mousePressEvent(QMouseEvent *event){    rubberBandCorner1 = event->pos();    rubberBandCorner2 = event->pos();    rubberBandIsShown = true;}void Teapots::mouseMoveEvent(QMouseEvent *event){    if (rubberBandIsShown) {        rubberBandCorner2 = event->pos();        updateGL();    }}void Teapots::mouseReleaseEvent(QMouseEvent * /* event */){    if (rubberBandIsShown) {        rubberBandIsShown = false;        updateGL();    }}void Teapots::createGLTeapotObject(){    static const int patch[][16] = {        { 102, 103, 104, 105, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,          15 },        { 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,          27 },        { 24, 25, 26, 27, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,          40 },        { 96, 96, 96, 96, 97, 98, 99, 100, 101, 101, 101, 101, 0, 1, 2,          3 },        { 0, 1, 2, 3, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115,          116, 117 },        { 118, 118, 118, 118, 124, 122, 119, 121, 123, 126, 125, 120,          40, 39, 38, 37 },        { 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55,          56 },        { 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 28, 65, 66,          67 },

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -