www.pudn.com > VRGIS-2005.rar > dem_testView.cpp, change:2001-04-06,size:16175b
// dem_testView.cpp : implementation of the CDem_testView class
//
#include "stdafx.h"
#include "dem_test.h"
#include "stdlib.h"
#include "stdio.h"
#include "math.h"
#include "dem_testDoc.h"
#include "dem_testView.h"
#include "gl/gl.h"
#include "gl/glu.h"
#include "gl/glaux.h"
#include "Texture.h"
#define rad 3.14159265f/180.0f
#define PI 3.14159265f
#define STEP 20.0f
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDem_testView
extern int YN;
IMPLEMENT_DYNCREATE(CDem_testView, CView)
BEGIN_MESSAGE_MAP(CDem_testView, CView)
//{{AFX_MSG_MAP(CDem_testView)
ON_WM_CREATE()
ON_WM_KEYDOWN()
ON_WM_SIZE()
ON_WM_DESTROY()
ON_WM_CANCELMODE()
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDem_testView construction/destruction
CDem_testView::CDem_testView()
{
// TODO: add construction code here
E_X=40.0;
E_Y=60.0;
D_X=40.0;
D_Y=80.0;
VL=20.0;
VA=(float)asin((E_Y-D_Y)/VL);
HIGH=4;
scale=1;
}
CDem_testView::~CDem_testView()
{
}
BOOL CDem_testView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CView::PreCreateWindow(cs);
}
/////////////////////////////////////////////////////////////////////////////
// CDem_testView drawing
void CDem_testView::OnDraw(CDC* pDC)
{
CDem_testDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
//pDoc->readdata();
float zz;
pDoc->SetTitle("标准的Dem程序三维显示!");
zz=80;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-0.5,0.2,-0.5,0.5,0.5,20000.0);//相机取景参数。
gluLookAt(E_X,E_Y,HIGH+zz,D_X,D_Y,HIGH+zz,0.0,0.0,1.0);
glMatrixMode(GL_MODELVIEW);
glPushAttrib(GL_ALL_ATTRIB_BITS);
glPushMatrix();
glClearDepth(1.0);
//glClearColor(1.0,0.0,1.5);
glClearColor(0.0f,0.0f,0.7f,0.0f);
glEnable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glCullFace(GL_BACK);
glFrontFace(GL_CCW);
// 绘制天空
// DrawSky();
// glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_DECAL);
glCallList(1);
// glEnable(GL_TEXTURE_2D);
// glBindTexture(GL_TEXTURE_2D,2);
// DrawGround(0.5,150,1,1);
// glDisable(GL_TEXTURE_2D);
glPopAttrib();
glPopMatrix();
SwapBuffers(wglGetCurrentDC());
}
/////////////////////////////////////////////////////////////////////////////
// CDem_testView printing
BOOL CDem_testView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CDem_testView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CDem_testView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
/////////////////////////////////////////////////////////////////////////////
// CDem_testView diagnostics
#ifdef _DEBUG
void CDem_testView::AssertValid() const
{
CView::AssertValid();
}
void CDem_testView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
CDem_testDoc* CDem_testView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDem_testDoc)));
return (CDem_testDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDem_testView message handlers
void CDem_testView::SetThePixelFormat(HDC pDC)
{
static PIXELFORMATDESCRIPTOR pfd=
{
sizeof(PIXELFORMATDESCRIPTOR), //size of this structure
1.2, //version number
PFD_DRAW_TO_WINDOW|
PFD_SUPPORT_OPENGL|
PFD_DOUBLEBUFFER, //flags
PFD_TYPE_RGBA, //RGBA pixels
24, //24-bit color
0,0,0,0,0,0, //default color bits
0,0, //no alpha channel
0,0,0,0,0, //no accumulation buffer
32, //32-bit depth buffer
0, //no stencil buffer
0, //no auxiliary buffers
PFD_MAIN_PLANE, //main layer
0, //reserved
0,0,0, //no layer masks
};
int nPixelFormat=ChoosePixelFormat(pDC,&pfd);
SetPixelFormat(pDC,nPixelFormat,&pfd);
}
int CDem_testView::SetTexture(unsigned char *TexImage, int width, int height, int ObjectType)
{
if((width % 16) == 0 &&(height % 16) == 0)
{
if(ObjectType==1)//若为实体
{
glTexImage2D(GL_TEXTURE_2D,0,3,width,height,
0,GL_RGB,GL_UNSIGNED_BYTE,TexImage);
}
// if(ObjectType)//若为透明
else
{
glTexImage2D(GL_TEXTURE_2D,0,4,width,height,
0,GL_RGBA,GL_UNSIGNED_BYTE,TexImage);
}
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
return 1;
}
else
return 0;
}
void CDem_testView::SetMaterial(float high)
{
static GLfloat vflHighAmbient[7][4]=
{
0.414f, 0.687f, 0.414f,0.f,
0.459f, 0.773f, 0.459f,0.f,
0.752f, 0.773f, 0.574f,0.f,
0.846f, 0.687f, 0.414f,0.f,
0.846f, 0.653f, 0.301f,0.f,
0.840f, 0.640f, 0.520f,0.f,
0.890f,0.890f,0.950f,0.f
};
static GLfloat vflHighDiffuse[7][4]=
{
0.414f, 0.687f, 0.414f,0.1f,
0.459f, 0.773f, 0.459f,0.1f,
0.752f, 0.773f, 0.574f,0.1f,
0.846f, 0.687f, 0.414f,0.1f,
0.846f, 0.653f, 0.301f,0.1f,
0.840f, 0.640f, 0.520f,0.1f,
0.890f,0.890f,0.950f,0.1f
};
/* for(i=0;i<7;i++)
for(j=0;j<3;j++)
{
vflHighAmbient[i][j]=vflHighAmbient[i][j]/1.1;
vflHighDiffuse[i][j]=vflHighDiffuse[i][j]/1.1;
}
*/
if(high>=0.95f)
{
glMaterialfv(GL_FRONT,GL_AMBIENT,vflHighAmbient[6]);
glMaterialfv(GL_FRONT,GL_DIFFUSE,vflHighDiffuse[6]);
}
else if(high>=0.8f)
{
glMaterialfv(GL_FRONT,GL_AMBIENT,vflHighAmbient[5]);
glMaterialfv(GL_FRONT,GL_DIFFUSE,vflHighDiffuse[5]);
}
else if(high>=0.6f)
{
glMaterialfv(GL_FRONT,GL_AMBIENT,vflHighAmbient[4]);
glMaterialfv(GL_FRONT,GL_DIFFUSE,vflHighDiffuse[4]);
}
else if(high>=0.5f)
{
glMaterialfv(GL_FRONT,GL_AMBIENT,vflHighAmbient[3]);
glMaterialfv(GL_FRONT,GL_DIFFUSE,vflHighDiffuse[3]);
}
else if(high>=0.4f)
{
glMaterialfv(GL_FRONT,GL_AMBIENT,vflHighAmbient[2]);
glMaterialfv(GL_FRONT,GL_DIFFUSE,vflHighDiffuse[2]);
}
else if(high>=0.3f)
{
glMaterialfv(GL_FRONT,GL_AMBIENT,vflHighAmbient[1]);
glMaterialfv(GL_FRONT,GL_DIFFUSE,vflHighDiffuse[1]);
}
else
{
glMaterialfv(GL_FRONT,GL_AMBIENT,vflHighAmbient[0]);
glMaterialfv(GL_FRONT,GL_DIFFUSE,vflHighDiffuse[0]);
}
}
void CDem_testView::DrawSky()
{
glEnable(GL_TEXTURE_2D);
#define TMMAX 3.0f // wrap from -3 to 3, or six times across our pyramid
#define TMMAX45 (TMMAX * 0.707f) // roughly sine(TMMAX)
glBindTexture(GL_TEXTURE_2D,1); //一般
glBegin (GL_TRIANGLE_FAN); {
glTexCoord2f (0.0f, 0.0f); glVertex3f (0.0f, 0.0f, 400.0f);
glTexCoord2f (-TMMAX45, -TMMAX45); glVertex3f (-353.5f, -353.5f, 0.0f);
glTexCoord2f (0.0f, -TMMAX); glVertex3f (0.0f, -400.0f, 0.0f);
glTexCoord2f (TMMAX45, -TMMAX45); glVertex3f (353.0f, -353.5f, 0.0f);
glTexCoord2f (TMMAX, 0.0f); glVertex3f (400.0f, 0.0f, 0.0f);
glTexCoord2f (TMMAX45, TMMAX45); glVertex3f (353.5f, 353.5f, -0.0f);
glTexCoord2f (0.0f, TMMAX); glVertex3f (0.0f, 400.0f, 0.0f);
glTexCoord2f (-TMMAX45, TMMAX45); glVertex3f (-353.5f, 353.5f, 0.0f);
glTexCoord2f (-TMMAX, 0.0f); glVertex3f (-400.0f, 0.0f, 0.0f);
glTexCoord2f (-TMMAX45, -TMMAX45); glVertex3f (-353.5f, -353.5f, 0.0f);
}
glEnd ();
glDisable(GL_TEXTURE_2D);
}
int CDem_testView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
m_pDC=GetDC()->m_hDC;
SetThePixelFormat(m_pDC);
m_hrc=wglCreateContext(m_pDC);
wglMakeCurrent(m_pDC,m_hrc);
CRect rr;
GetClientRect(&rr);
wx=rr.right;
wy=rr.bottom;
glBindTexture(GL_TEXTURE_2D,1);
deng=new CTexture("cloud.bmp",1);//绘制山脉
SetTexture(deng->Tex,deng->t_width,deng->t_height,deng->alpha);
glBindTexture(GL_TEXTURE_2D,2);
clouds=new CTexture("ground1.bmp",1);
SetTexture(clouds->Tex,clouds->t_width,clouds->t_height,clouds->alpha);
glBindTexture(GL_TEXTURE_2D,3);
clouds=new CTexture("ground2.bmp",1);
SetTexture(clouds->Tex,clouds->t_width,clouds->t_height,clouds->alpha);
glBindTexture(GL_TEXTURE_2D,4);
clouds=new CTexture("ground3.bmp",1);
SetTexture(clouds->Tex,clouds->t_width,clouds->t_height,clouds->alpha);
glBindTexture(GL_TEXTURE_2D,5);
clouds=new CTexture("ground4.bmp",1);
SetTexture(clouds->Tex,clouds->t_width,clouds->t_height,clouds->alpha);
return 0;
}
void CDem_testView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
CDem_testDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
GLdouble E_X0,E_Y0,D_X0,D_Y0;
E_X0=E_X;E_Y0=E_Y;D_X0=D_X;D_Y0=D_Y;
VA=(float)asin((D_Y-E_Y)/VL);
if( E_X>=D_X ) VA=PI-VA;
// if( E_X<D_X ) VA=2*PI-VA;
DetaX=(float)(STEP*cos(VA));
DetaY=(float)(STEP*sin(VA));
switch(nChar)
{
case VK_UP:
E_X=E_X+DetaX; E_Y=E_Y+DetaY;
D_X=D_X+DetaX; D_Y=D_Y+DetaY;
if(E_X=-9990 || E_X>=9990 || E_Y=-9990 || E_Y >=9990)
{E_X=E_X0;E_Y=E_Y0;D_X=D_X0;D_Y=D_Y0;}
break;
case VK_DOWN:
E_X=E_X-DetaX; E_Y=E_Y-DetaY;
D_X=D_X-DetaX; D_Y=D_Y-DetaY;
if(E_X=-9990 || E_X>=9990 || E_Y=-9990 || E_Y >=9990)
{E_X=E_X0;E_Y=E_Y0;D_X=D_X0;D_Y=D_Y0;}
break;
case VK_LEFT:
VA=VA+5.0f*PI/180.0f;
D_X=E_X+VL*cos(VA);
D_Y=E_Y+VL*sin(VA);
break;
case VK_RIGHT:
VA=VA-5.0f*PI/180.0f;
D_X=E_X+VL*cos(VA);
D_Y=E_Y+VL*sin(VA);
break;
case VK_F2:
//VA=VA-5.0f*PI/180.0f;
//D_X=E_X+VL*cos(VA);
//D_Y=E_Y+VL*sin(VA);
if(HIGH=9000)
HIGH=HIGH+10;
else
HIGH=10;
break;
case VK_F3:
//VA=VA-5.0f*PI/180.0f;
//D_X=E_X+VL*cos(VA);
//D_Y=E_Y+VL*sin(VA);
{ if(HIGH>-101)
HIGH=HIGH-5;
else
HIGH=100;}
break;
case VK_F4:
// scale=scale*2;
/* glNewList(1,GL_COMPILE);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,2);
DrawGround(0.5,150,1,scale);
glDisable(GL_TEXTURE_2D);
glEndList();*/
break;
case VK_F5:
// scale=scale/2;
// STEP=STEP*2;
/* glNewList(1,GL_COMPILE);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,2);
DrawGround(0.5,150,1,scale);
glDisable(GL_TEXTURE_2D);
glEndList();*/
break;
case 'W':
KeyDown_W(); break;
case 'S':
KeyDown_S(); break;
}
//UpdateALLViews(NULL);
Invalidate(false);
CView::OnKeyDown(nChar, nRepCnt, nFlags);
}
void CDem_testView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
// TODO: Add your message handler code here
CRect rr;
GetClientRect(&rr);
GLsizei nWidth=(GLsizei) rr.right;
GLsizei nHeight=(GLsizei)rr.bottom;
wx=rr.right;
wy=rr.bottom;
GLdouble dAspect=(GLdouble)nWidth/(GLdouble)nHeight;
glViewport(0,0,nWidth,nHeight);
//auxWireSphere(1.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glFrustum(-0.5,0.5,-0.5,.5,0.5,20000.0);//相机取景参数
gluLookAt(E_X,E_Y,5.5,D_X,D_Y,1.5,0.0,0.0,1.0);
glMatrixMode(GL_MODELVIEW);
DemList();
Invalidate(TRUE);
}
void CDem_testView::DrawGround(float M, float N, float d, float k)
{
CDem_testDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
int w;
w=8;
int i,j;
for(i=0;i<pDoc->m-1;i=i+1)
{ for(j=0;j<pDoc->n-1;j=j+1)
{ glBegin(GL_QUADS);
glTexCoord2f(k*i/(pDoc->m-2),k*j/(pDoc->n-2));
glVertex3f(w*k*i,w*k*j,pDoc->dix[i][j]/M);
glTexCoord2f(k*(i+1)/(pDoc->m-2),k*j/(pDoc->n-2));
glVertex3f(w*k*(i+1),w*k*j,pDoc->dix[i+1][j]/M);
glTexCoord2f(k*(i+1)/(pDoc->m-2),k*(j+1)/(pDoc->n-2));
glVertex3f(w*k*(i+1),w*k*(j+1),pDoc->dix[i+1][j+1]/M);
glTexCoord2f(k*i/(pDoc->m-2),k*(j+1)/(pDoc->n-2));
glVertex3f(w*k*i,w*k*(j+1),pDoc->dix[i][j+1]/M);
glEnd();
}
}
}
void CDem_testView::DemList()
{
glNewList(1,GL_COMPILE);
glEnable(GL_TEXTURE_2D);
glBindTexture(GL_TEXTURE_2D,2);
DrawGround(1,150,1,1);
glDisable(GL_TEXTURE_2D);
glEndList();
}
void CDem_testView::OnInitialUpdate()
{
CView::OnInitialUpdate();
// TODO: Add your specialized code here and/or call the base class
DemList();
}
void CDem_testView::KeyDown_W()
{
glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
Invalidate(false);
}
void CDem_testView::KeyDown_S()
{
glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
Invalidate(false);
}
void CDem_testView::Draw(int m, int n, int i, int fada)
{
int k,j,t;
for(t=0;t<i;t++)
{for(k=0;k<m-1;k=k+1)
{
for(j=0;j<n-1;j=j+1)
{
glBegin(GL_QUADS);
glTexCoord2f(fada*k,fada*j);
glVertex3f(fada*k,fada*j,t*fada);
glTexCoord2f(fada*(k+1),fada*j);
glVertex3f(fada*(k+1),fada*j,t*fada);
glTexCoord2f(fada*(k+1),fada*(j+1));
glVertex3f(fada*(k+1),fada*(j+1),t*fada);
glTexCoord2f(fada*k,fada*(j+1));
glVertex3f(fada*k,fada*(j+1),t*fada);
glEnd();
}
}
}
for(j=0;j<n;j++)
{for(k=0;k<m-1;k=k+1)
{
for(t=0;t<i-1;t=t+1)
{
glBegin(GL_QUADS);
glTexCoord2f(fada*k,fada*t);
glVertex3f(fada*k,fada*j,t*fada);
glTexCoord2f(fada*(k+1),fada*t);
glVertex3f(fada*(k+1),fada*j,t*fada);
glTexCoord2f(fada*(k+1),fada*(t+1));
glVertex3f(fada*(k+1),fada*j,(t+1)*fada);
glTexCoord2f(fada*k,fada*(t+1));
glVertex3f(fada*k,fada*j,(t+1)*fada);
glEnd();
}
}
}
}
void CDem_testView::RenderTerrain(int hs)
{
CDem_testDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// 绘制地形时必须关闭光照,因为这里没有定义法向量
int w;
w=4;
int position_x = (int)E_X/w;
int position_y = (int)E_Y/w;
int x,z,k,comp;
k=1;
comp=115;
float x1,x2,y1,y2;
glPushMatrix();
glDisable(GL_LIGHTING);
for(x=position_x-29; x<position_x+30; x++){
for(z=position_y-29; z<position_y+30; z++) {
if(x>0 && x<116*w && z>0 && z<116*w) {
x1 = (float)x*w;
x2 = (float)x*w + w;
y1 = (float)z*w;
y2 = (float)z*w + w;
glBegin(GL_QUADS);
glTexCoord2f(k*x1/comp,k*y1/comp);
glVertex3f(k*x1,k*y1,pDoc->dix[x][z]/hs);
glTexCoord2f(k*x2/comp,k*y1/comp);
glVertex3f(k*x2,k*y1,pDoc->dix[x+1][z]/hs);
glTexCoord2f(k*x2/comp,k*y2/comp);
glVertex3f(k*x2,k*y2,pDoc->dix[x+1][z+1]/hs);
glTexCoord2f(k*x1/comp,k*y2/comp);
glVertex3f(k*x1,k*y2,pDoc->dix[x][z+1]/hs);
glEnd();
}
}
}
glPopMatrix();
}
void CDem_testView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
}
void CDem_testView::OnCancelMode()
{
CView::OnCancelMode();
// TODO: Add your message handler code here
}