www.pudn.com > music_spring.rar > springView.cpp
// springView.cpp : implementation of the CSpringView class
//
#include "stdafx.h"
#include "spring.h"
#include "springDoc.h"
#include "springView.h"
#include "glaux.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSpringView
IMPLEMENT_DYNCREATE(CSpringView, CView)
BEGIN_MESSAGE_MAP(CSpringView, CView)
//{{AFX_MSG_MAP(CSpringView)
ON_WM_ERASEBKGND()
ON_WM_CREATE()
ON_WM_DESTROY()
ON_WM_SIZE()
ON_WM_TIMER()
ON_COMMAND(ID_LIGHT_C, OnLightC)
ON_COMMAND(ID_LIGHT_O, OnLightO)
ON_COMMAND(ID_MUSIC_C, OnMusicC)
ON_COMMAND(ID_CHANGE, OnChange)
ON_COMMAND(ID_LOW, OnLow)
ON_COMMAND(ID_MEDIA, OnMedia)
ON_COMMAND(ID_HIGH, OnHigh)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSpringView construction/destruction
CSpringView::CSpringView()
{
// TODO: add construction code here
t=0;
blight=TRUE;
number=6000;
}
CSpringView::~CSpringView()
{
}
BOOL CSpringView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
cs.style|=WS_CLIPSIBLINGS|WS_CLIPCHILDREN;
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CSpringView drawing
void CSpringView::OnDraw(CDC* pDC)
{
CSpringDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
drawSence();
}
/////////////////////////////////////////////////////////////////////////////
// CSpringView diagnostics
#ifdef _DEBUG
void CSpringView::AssertValid() const
{
CView::AssertValid();
}
void CSpringView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CSpringDoc* CSpringView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CSpringDoc)));
return (CSpringDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CSpringView message handlers
BOOL CSpringView::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
return TRUE;
//return CView::OnEraseBkgnd(pDC);
}
int CSpringView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_hrc=setUpOpengl();
InitGL();
SetTimer(1,25,NULL);
//PlaySound("Data/yesterday.wav", NULL, SND_SYNC);
wave.Play(this,"Data/情人.wav");
wave.OpenDevice();
return 0;
}
HGLRC CSpringView::setUpOpengl()
{
HGLRC hglrc;
PIXELFORMATDESCRIPTOR pfd={
sizeof(PIXELFORMATDESCRIPTOR),//象素格式大小
1,//版本
PFD_DRAW_TO_WINDOW|//使之能在窗口或其他设备中画图
PFD_SUPPORT_OPENGL|//使之能调用OpenGL函数
PFD_DOUBLEBUFFER,//使之支持双缓存
// PFD_STEREO,//支持立体(NT不支持)
PFD_TYPE_RGBA,//使之采用RGBA模式
24,//24位颜色深度
0,0,0,//颜色位可忽略
0,0,0,//颜色位可忽略
0,//无Alpha颤抖
0,//无颜色抖动
0,//没有累积缓存
0,0,0,0,//累积缓存位数可以忽略
32,//32位深度缓存
0,//深度缓存位数
0,//辅助缓存
PFD_MAIN_PLANE,//主存类型
0,//保留
0,0,0,//相关掩码在此不设置
};
CClientDC dc(this);
int pixelformat=ChoosePixelFormat(dc.GetSafeHdc(),&pfd);
if (0==pixelformat)
{
MessageBox("ChoosePixelFormat Failed");
return 0;
}
BOOL bSetpix=SetPixelFormat(dc.GetSafeHdc(),pixelformat,&pfd);
if (FALSE==bSetpix)
{
MessageBox("SetPixelFormat Failed");
return FALSE;
}
hglrc=::wglCreateContext(dc.GetSafeHdc());
::wglMakeCurrent(dc.GetSafeHdc(),hglrc);
return hglrc;
}
void CSpringView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
HGLRC hrc=NULL;
hrc=wglGetCurrentContext();
if (hrc)
{
wglDeleteContext(hrc);
}
}
void CSpringView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
glViewport(0,0,cx,cy);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(65,(GLfloat)cx/(GLfloat)cy,0.1,100);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void CSpringView::InitGL()
{
glClearColor(0.0,0.0,0.0,0.0);
glClearDepth(1.0f);
glShadeModel(GL_SMOOTH);
for (int loop=0;loop(number/4)&&loop<=(number-number/4))
particle[loop].speed.yspeed=(float)(rand()%39)/10.0f+15.9;
else
particle[loop].speed.yspeed=(float)(rand()%19)/10.0f+17.9;
particle[loop].speed.zspeed=(float)(rand()%30-15)/10.0f;
particle[loop].gravity.xgravity=0.0;
particle[loop].gravity.ygravity=-9.8;
particle[loop].gravity.zgravity=0.0;
}
loadTexture("Data/Particle.bmp");
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE);
GLfloat whieLight[]={0.6,0.6,0.6,1.0};
GLfloat lightAmbient[]={0.8,0.8,0.8,1.0};
GLfloat lightSpecular[]={0.3,0.3,0.3,1.0};
GLfloat MatShininess[]={50.0};
GLfloat MatDiffuse[]={0.2,0.2,0.2,1.0};
GLfloat MatSpecular[]={0.5,0.5,0.5,1.0};
GLfloat lightPosition[]={10,10,-35,1.0};
GLfloat lightModel[]={0.4,0.4,0.4,1.0};
glLightfv(GL_LIGHT1,GL_AMBIENT,lightAmbient);
glLightfv(GL_LIGHT1,GL_DIFFUSE,whieLight);
glLightfv(GL_LIGHT1,GL_SPECULAR,lightSpecular);
glLightfv(GL_LIGHT1,GL_POSITION,lightPosition);
glMaterialfv(GL_FRONT,GL_SPECULAR,MatSpecular);
glMaterialfv(GL_FRONT,GL_SHININESS,MatShininess);
glMaterialfv(GL_FRONT,GL_DIFFUSE,MatDiffuse);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lightModel);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT1);
}
void CSpringView::drawSence()
{
float x,y,z;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D,TEXTURE);
glEnable(GL_TEXTURE_2D);
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
if (blight)
glEnable(GL_LIGHTING);
else
glDisable(GL_LIGHTING);
glPushMatrix();
for (int loop=0;loop=-10)
glColor3f(particle[loop].color.r,
particle[loop].color.g,particle[loop].color.b);
if (particle[loop].pos.y<-10)
glColor4f(particle[loop].color.r,
particle[loop].color.g,
particle[loop].color.b,particle[loop].color.a);
glBegin(GL_QUADS);
glTexCoord2f(1.0,1.0); glVertex3f(x+0.5f,y+0.5f,z);
glTexCoord2d(0.0,1.0); glVertex3f(x-0.5f,y+0.5f,z);
glTexCoord2d(0.0,0.0); glVertex3f(x-0.5f,y-0.5f,z);
glTexCoord2d(1.0,0.0); glVertex3f(x+0.5f,y-0.5f,z);
glEnd();
particle[loop].pos.x+=particle[loop].speed.xspeed*0.025;
if (particle[loop].pos.y>=-10)
particle[loop].pos.y+=particle[loop].speed.yspeed*0.025;
if (particle[loop].pos.y<-10)
{
particle[loop].pos.y+=particle[loop].speed.yspeed*0;
particle[loop].color.a-=0.04;
}
particle[loop].pos.z+=particle[loop].speed.zspeed*0.025;
particle[loop].life-=particle[loop].fade;
particle[loop].speed.yspeed+=particle[loop].gravity.ygravity*0.025;
}
for (loop=0;loop(number/4)&&loop<=(number-number/4))
particle[loop].speed.yspeed=(float)(rand()%39)/10.0f+15.9;
else
particle[loop].speed.yspeed=(float)(rand()%19)/10.0f+17.9;
particle[loop].speed.zspeed=(float)(rand()%30-15)/10.0f;
particle[loop].gravity.xgravity=0.0;
particle[loop].gravity.ygravity=-9.8;
particle[loop].gravity.zgravity=0.0;
}
}
glPopMatrix();
glFlush();
CClientDC dc(this);
SwapBuffers(dc.GetSafeHdc());
}
void CSpringView::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CView::OnTimer(nIDEvent);
if (nIDEvent==1)
{
Invalidate(FALSE);
}
}
void CSpringView::loadTexture(char* str)
{
AUX_RGBImageRec* texture;
texture=auxDIBImageLoad(str);
if (texture)
{
glGenTextures(1,&TEXTURE);
glGenTextures(1,&TEXTURE);
glBindTexture(GL_TEXTURE_2D,TEXTURE);
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,3,texture->sizeX,texture->sizeY,
0,GL_RGB,GL_UNSIGNED_BYTE,texture->data);
}
if (texture)
{
if (texture->data)
{
free(texture->data);
}
free(texture);
}
}
void CSpringView::OnLightC()
{
// TODO: Add your command handler code here
blight=FALSE;
Invalidate(FALSE);
}
void CSpringView::OnLightO()
{
// TODO: Add your command handler code here
blight=TRUE;
Invalidate(FALSE);
}
void CSpringView::OnMusicC()
{
// TODO: Add your command handler code here
wave.Stop();
wave.CloseDevice();
}
void CSpringView::OnChange()
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE,"wav","*.wav");
if (dlg.DoModal()!=IDOK)
{
return;
}
CString str;
str=dlg.GetPathName();
char* pstr=str.GetBuffer(str.GetLength());
wave.Stop();
wave.CloseDevice();
wave.OpenDevice();
wave.Play(this,pstr);
Invalidate(FALSE);
}
void CSpringView::OnLow()
{
// TODO: Add your command handler code here
number=1000;
Invalidate(FALSE);
}
void CSpringView::OnMedia()
{
// TODO: Add your command handler code here
number=2000;
Invalidate(FALSE);
}
void CSpringView::OnHigh()
{
// TODO: Add your command handler code here
number=6000;
Invalidate(FALSE);
}