?? billiardsplayview.cpp
字號:
// BilliardsPlayView.cpp : implementation file
//
#include "stdafx.h"
#include "Billiards.h"
#include <math.h>
#include <gl/gl.h>
#include <gl/glu.h>
#include <gl/glaux.h>
#include <gl/glut.h>
#include "BilliardsPlayView.h"
#include "InitOpenGL.h"
#include "BilliardsDoc.h"
#include "MainFrm.h"
#include "BilliardsFormView.h"
#include <Mmsystem.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
AUX_RGBImageRec *image1,*image2,*image3;
unsigned char *pdata1,*pdata2,*pdata3;
#define ImageWidth 256
#define ImageHeight 256
static GLuint texName[3];
/////////////////////////////////////////////////////////////////////////////
// CBilliardsPlayView
IMPLEMENT_DYNCREATE(CBilliardsPlayView, CView)
void CBilliardsPlayView::texinit(void)
{
// glClearColor(0.8,0.8,0.8,1.0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_AUTO_NORMAL);
glDepthFunc(GL_LESS);
// glFrontFace(GL_CW);
glShadeModel(GL_FLAT);
image1=auxDIBImageLoadA("MOHOGANY.bmp");
pdata1=(BYTE *)malloc(256*256*3*sizeof(BYTE));
if (!pdata1)
exit(0);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
gluScaleImage(GL_RGB,image1->sizeX,image1->sizeY,GL_UNSIGNED_BYTE,image1->data,
ImageWidth,ImageHeight,GL_UNSIGNED_BYTE,pdata1);
image2=auxDIBImageLoadA("BILLIARDSTABLE.bmp");
pdata2=(BYTE *)malloc(256*256*3*sizeof(BYTE));
if (!pdata2)
exit(0);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
gluScaleImage(GL_RGB,image2->sizeX,image2->sizeY,GL_UNSIGNED_BYTE,image2->data,
ImageWidth,ImageHeight,GL_UNSIGNED_BYTE,pdata2);
image3=auxDIBImageLoadA("tableface.bmp");
pdata3=(BYTE *)malloc(256*256*3*sizeof(BYTE));
if (!pdata3)
exit(0);
glPixelStorei(GL_UNPACK_ALIGNMENT,1);
gluScaleImage(GL_RGB,image3->sizeX,image3->sizeY,GL_UNSIGNED_BYTE,image3->data,
ImageWidth,ImageHeight,GL_UNSIGNED_BYTE,pdata3);
glGenTextures(3,texName);
glBindTexture(GL_TEXTURE_2D,texName[0]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,ImageWidth,ImageHeight,0,GL_RGB,GL_UNSIGNED_BYTE,pdata1);
glBindTexture(GL_TEXTURE_2D,texName[1]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,ImageWidth,ImageHeight,0,GL_RGB,GL_UNSIGNED_BYTE,pdata2);
glBindTexture(GL_TEXTURE_2D,texName[2]);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGB,ImageWidth,ImageHeight,0,GL_RGB,GL_UNSIGNED_BYTE,pdata3);
glEnable(GL_TEXTURE_2D);
}
CBilliardsPlayView::CBilliardsPlayView()
{
m_fViewHeight = 60.0;
m_fViewNear = 200.0;
m_fViewFar = 400.0;
m_nMouseAct = MOUSE_SELECT;
m_spinAngle = 0.0;
m_spinAxes[0] = m_spinAxes[2] = 0.0; m_spinAxes[1] = 1.0;
m_sEye.origin.x = m_sEye.origin.y = 0; m_sEye.origin.z = 300.0;
m_sEye.center.x = m_sEye.center.y = 0.0; m_sEye.center.z = 0.0;
m_sEye.up.x = m_sEye.up.z = 0.0; m_sEye.up.y = 1.0;
m_sEye.axisX.y = m_sEye.axisX.z = 0.0; m_sEye.axisX.x = 1.0;
m_sEye.axisY.x = m_sEye.axisY.z = 0.0; m_sEye.axisY.y = 1.0;
m_sEye.axisZ.x = m_sEye.axisZ.y = 0.0; m_sEye.axisZ.z = -1.0;
m_vProjectCenter[0] = 0.0f;
m_vProjectCenter[1] = 0.0f;
m_vProjectCenter[2] = (m_fViewNear+m_fViewFar)/2;
int i;
float tmpf;
for (i=0;i<NUM_BALL;i++)
m_bVisible[i]=TRUE;
for (i=0;i<NUM_BALL;i++)
m_fVelocity[i][0]=m_fVelocity[i][1]=m_fVelocity[i][2]=0.0f;
for (i=0;i<NUM_BALL;i++)
m_fPosition[i][1]=0.0f;
m_fPosition[0][0] = - 2.0*TABLE_LENGTH/3.0;
m_fPosition[0][2] = 0.0f;
m_fPosition[1][0] = TABLE_LENGTH/2.5;
m_fPosition[1][2] = 0.0f;
tmpf = 2.0*BALL_RADIUS*0.8661;
m_fPosition[2][0] = m_fPosition[1][0]+tmpf;
m_fPosition[2][2] = BALL_RADIUS;
m_fPosition[3][0] = m_fPosition[2][0]+tmpf;
m_fPosition[3][2] = 2.0*BALL_RADIUS;
m_fPosition[4][0] = m_fPosition[3][0]+tmpf;
m_fPosition[4][2] = 3.0*BALL_RADIUS;
m_fPosition[5][0] = m_fPosition[4][0]+tmpf;
m_fPosition[5][2] = 4.0*BALL_RADIUS;
m_fPosition[6][0] = m_fPosition[4][0];
m_fPosition[6][2] = BALL_RADIUS;
m_fPosition[7][0] = m_fPosition[5][0];
m_fPosition[7][2] = 2.0*BALL_RADIUS;
m_fPosition[8][0] = m_fPosition[3][0];
m_fPosition[8][2] = 0.0f;
m_fPosition[15][0]= m_fPosition[5][0];
m_fPosition[15][2]= 0.0f;
m_fPosition[9][0] = m_fPosition[2][0];
m_fPosition[9][2] = -m_fPosition[2][2];
m_fPosition[10][0]= m_fPosition[3][0];
m_fPosition[10][2]= -m_fPosition[3][2];
m_fPosition[11][0]= m_fPosition[4][0];
m_fPosition[11][2]= -m_fPosition[4][2];
m_fPosition[12][0]= m_fPosition[5][0];
m_fPosition[12][2]= -m_fPosition[5][2];
m_fPosition[13][0]= m_fPosition[6][0];
m_fPosition[13][2]= -m_fPosition[6][2];
m_fPosition[14][0]= m_fPosition[7][0];
m_fPosition[14][2]= -m_fPosition[7][2];
m_fStrength=22.5f;
m_fDirection[0]=1.0f;
m_fDirection[1]=0.0f;
m_fDirection[2]=0.0f;
m_fVelocity[0][0]=5.0f;
m_nSelectObject = -1;
m_bAnimate = FALSE;
m_bCanHit = TRUE;
}
CBilliardsPlayView::~CBilliardsPlayView()
{
}
BEGIN_MESSAGE_MAP(CBilliardsPlayView, CView)
//{{AFX_MSG_MAP(CBilliardsPlayView)
ON_WM_SIZE()
ON_WM_ERASEBKGND()
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_CREATE()
ON_WM_TIMER()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CBilliardsPlayView drawing
void CBilliardsPlayView::OnDraw(CDC* pDC)
{
CDocument* pDoc = GetDocument();
DrawScene();
// TODO: add draw code here
}
/////////////////////////////////////////////////////////////////////////////
// CBilliardsPlayView diagnostics
#ifdef _DEBUG
void CBilliardsPlayView::AssertValid() const
{
CView::AssertValid();
}
void CBilliardsPlayView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CBilliardsPlayView message handlers
void CBilliardsPlayView::Init()
{
CDC *pDC = GetDC();
m_hDc = pDC->GetSafeHdc();
SetThePixelFormat(pDC);
m_hRc = wglCreateContext(m_hDc);
wglMakeCurrent(m_hDc,m_hRc);
ReleaseDC(pDC);
GLfloat light0_posi[]={-40.0,0.0,100.0,1.0};
GLfloat light1_posi[]={40.0,0.0,100.0,1.0};
GLfloat light2_posi[]={0.0,100.0,0.0,1.0};
GLfloat white_light[]={1.0,1.0,1.0,1.0};
glClearColor(0.7,0.7,0.7,1.0);
glShadeModel(GL_SMOOTH);
glLightfv(GL_LIGHT0,GL_POSITION,light0_posi);
glLightfv(GL_LIGHT0,GL_DIFFUSE,white_light);
glLightfv(GL_LIGHT0,GL_SPECULAR,white_light);
glLightfv(GL_LIGHT1,GL_POSITION,light1_posi);
glLightfv(GL_LIGHT1,GL_DIFFUSE,white_light);
glLightfv(GL_LIGHT1,GL_SPECULAR,white_light);
glLightfv(GL_LIGHT2,GL_POSITION,light2_posi);
glLightfv(GL_LIGHT2,GL_DIFFUSE,white_light);
glLightfv(GL_LIGHT2,GL_SPECULAR,white_light);
glEnable(GL_DEPTH_TEST);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_LIGHT1);
glEnable(GL_LIGHT2);
glEnable(GL_AUTO_NORMAL);
glMatrixMode(GL_MODELVIEW);
glRotatef(80.0,1.0,0.0,0.0);
texinit();
}
void CBilliardsPlayView::DrawPlayground()
{
float tmpf,tmpf1;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
// glColor3f(1.0,1.0,1.0);
float ambient0[4] = {0.259459f,0.251553f,0.0800367f,1.0f};
float diffuse0[4] = {1.0f,0.969526f,0.308475f,1.0f};
float specular0[4] = {0.728905f,0.691826f,0.153194f,1.0f};
float shininess0 = 0.891892f;
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient0);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse0);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular0);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess0);
// glPushMatrix();
// glTranslatef( 0.0f, 0.0f, TABLE_WIDTH - 4.0*BAR_WIDTH);
// auxSolidCylinder(POLE_RADIUS,POLE_HEIGHT);
// glTranslatef( TABLE_LENGTH - 4.0*BAR_WIDTH, 0.0f, 0.0f);
// auxSolidCylinder(POLE_RADIUS,POLE_HEIGHT);
// glTranslatef( 0.0f, 0.0f, -2.0*(TABLE_WIDTH - 4.0*BAR_WIDTH));
// auxSolidCylinder(POLE_RADIUS,POLE_HEIGHT);
// glTranslatef( 4.0*BAR_WIDTH - TABLE_LENGTH, 0.0f, 0.0f);
// auxSolidCylinder(POLE_RADIUS,POLE_HEIGHT);
// glTranslatef( 4.0*BAR_WIDTH - TABLE_LENGTH, 0.0f, 0.0f);
// auxSolidCylinder(POLE_RADIUS,POLE_HEIGHT);
// glTranslatef( 0.0f, 0.0f, 2.0*(TABLE_WIDTH - 4.0*BAR_WIDTH));
// auxSolidCylinder(POLE_RADIUS,POLE_HEIGHT);
// glPopMatrix();
//下桌面
float ambient1[4] = {0.0f,0.023506f,0.014165f,1.0f};
float diffuse1[4] = {0.0f,0.019048f,0.020158f,1.0f};
float specular1[4] = {0.0714408f,0.20962f,0.126984f,1.0f};
float shininess1 = 0.0108108f;
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient1);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse1);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular1);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess1);
glPushMatrix();
// glColor3f(0.0,1.0,0.0);
glBegin(GL_QUAD_STRIP);
glVertex3f(-TABLE_LENGTH-12.0f,0.0f,-TABLE_WIDTH+1.5*BALL_RADIUS);
glVertex3f(-TABLE_LENGTH-12.0f,0.0f,TABLE_WIDTH-1.5*BALL_RADIUS);
glVertex3f(-TABLE_LENGTH-2.0f,0.0f,-TABLE_WIDTH+1.5*BALL_RADIUS);
glVertex3f(-TABLE_LENGTH-2.0f,0.0f,TABLE_WIDTH-1.5*BALL_RADIUS);
glVertex3f(-TABLE_LENGTH+1.5*BALL_RADIUS,0.0f,-TABLE_WIDTH-2.0f);
glVertex3f(-TABLE_LENGTH+1.5*BALL_RADIUS,0.0f,TABLE_WIDTH+2.0f);
glEnd();
glBegin(GL_QUADS);
glVertex3f(-TABLE_LENGTH+1.5*BALL_RADIUS,0.0f,-TABLE_WIDTH-12.0f);
glVertex3f(-TABLE_LENGTH+1.5*BALL_RADIUS,0.0f,TABLE_WIDTH+12.0f);
glVertex3f(-1.5*BALL_RADIUS,0.0f,TABLE_WIDTH+12.0f);
glVertex3f(-1.5*BALL_RADIUS,0.0f,-TABLE_WIDTH-12.0f);
glEnd();
glBegin(GL_QUADS);
glVertex3f(1.5*BALL_RADIUS,0.0f,-TABLE_WIDTH-2.0f);
glVertex3f(1.5*BALL_RADIUS,0.0f,TABLE_WIDTH+2.0f);
glVertex3f(-1.5*BALL_RADIUS,0.0f,TABLE_WIDTH+2.0f);
glVertex3f(-1.5*BALL_RADIUS,0.0f,-TABLE_WIDTH-2.0f);
glEnd();
glBegin(GL_QUADS);
glVertex3f(TABLE_LENGTH-1.5*BALL_RADIUS,0.0f,-TABLE_WIDTH-12.0f);
glVertex3f(TABLE_LENGTH-1.5*BALL_RADIUS,0.0f,TABLE_WIDTH+12.0f);
glVertex3f(1.5*BALL_RADIUS,0.0f,TABLE_WIDTH+12.0f);
glVertex3f(1.5*BALL_RADIUS,0.0f,-TABLE_WIDTH-12.0f);
glEnd();
glBegin(GL_QUAD_STRIP);
glVertex3f(TABLE_LENGTH+12.0f,0.0f,-TABLE_WIDTH+1.5*BALL_RADIUS);
glVertex3f(TABLE_LENGTH+12.0f,0.0f,TABLE_WIDTH-1.5*BALL_RADIUS);
glVertex3f(TABLE_LENGTH+2.0f,0.0f,-TABLE_WIDTH+1.5*BALL_RADIUS);
glVertex3f(TABLE_LENGTH+2.0f,0.0f,TABLE_WIDTH-1.5*BALL_RADIUS);
glVertex3f(TABLE_LENGTH-1.5*BALL_RADIUS,0.0f,-TABLE_WIDTH-2.0f);
glVertex3f(TABLE_LENGTH-1.5*BALL_RADIUS,0.0f,TABLE_WIDTH+2.0f);
glEnd();
float ambient2[4] = {0.7f,0.5f,0.5f,1.0f};
float diffuse2[4] = {0.4f,0.3f,0.3f,1.0f};
float specular2[4] = {0.0f,0.0f,0.0f,1.0f};
float shininess2 = 0.0f;
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, ambient2);
glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, diffuse2);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, specular2);
glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, shininess2);
glPushMatrix();
//left
glBegin(GL_QUADS);
glVertex3f(-TABLE_LENGTH-12.0f,0.0f,-TABLE_WIDTH+1.5*BALL_RADIUS);
glVertex3f(-TABLE_LENGTH-12.0f,0.0f,TABLE_WIDTH-1.5*BALL_RADIUS);
glVertex3f(-TABLE_LENGTH-12.0f,TABLE_HEIGHT+BALL_RADIUS+2.0f,TABLE_WIDTH-1.5*BALL_RADIUS);
glVertex3f(-TABLE_LENGTH-12.0f,TABLE_HEIGHT+BALL_RADIUS+2.0f,-TABLE_WIDTH+1.5*BALL_RADIUS);
glEnd();
//RIGHT
glBegin(GL_QUADS);
glVertex3f(TABLE_LENGTH+12.0f,0.0f,-TABLE_WIDTH+1.5*BALL_RADIUS);
glVertex3f(TABLE_LENGTH+12.0f,0.0f,TABLE_WIDTH-1.5*BALL_RADIUS);
glVertex3f(TABLE_LENGTH+12.0f,TABLE_HEIGHT+BALL_RADIUS+2.0f,TABLE_WIDTH-1.5*BALL_RADIUS);
glVertex3f(TABLE_LENGTH+12.0f,TABLE_HEIGHT+BALL_RADIUS+2.0f,-TABLE_WIDTH+1.5*BALL_RADIUS);
glEnd();
//LEFT TOP
glBegin(GL_QUADS);
glVertex3f(-TABLE_LENGTH+1.5*BALL_RADIUS,0.0f,-TABLE_WIDTH-12.0f);
glVertex3f(-1.5*BALL_RADIUS,0.0f,-TABLE_WIDTH-12.0f);
glVertex3f(-1.5*BALL_RADIUS,TABLE_HEIGHT+BALL_RADIUS+2.0f,-TABLE_WIDTH-12.0f);
glVertex3f(-TABLE_LENGTH+1.5*BALL_RADIUS,TABLE_HEIGHT+BALL_RADIUS+2.0f,-TABLE_WIDTH-12.0f);
glEnd();
//LEFT down
glBegin(GL_QUADS);
glVertex3f(-TABLE_LENGTH+1.5*BALL_RADIUS,0.0f,TABLE_WIDTH+12.0f);
glVertex3f(-1.5*BALL_RADIUS,0.0f,TABLE_WIDTH+12.0f);
glVertex3f(-1.5*BALL_RADIUS,TABLE_HEIGHT+BALL_RADIUS+2.0f,TABLE_WIDTH+12.0f);
glVertex3f(-TABLE_LENGTH+1.5*BALL_RADIUS,TABLE_HEIGHT+BALL_RADIUS+2.0f,TABLE_WIDTH+12.0f);
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -