Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №34 / OGLSHVW
.CPP// oglshvw.cpp : implementation of the COglshapeView class
//
#include "stdafx.h"
#include "oglshape.h"
#include "oglshdoc.h"
#include "oglshvw.h"
#include "RotateDlg.h"
#include "TransDlg1.h"
#include "Trans.h"
#include "SczleDlg.h"
#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// COglshapeView
IMPLEMENT_DYNCREATE(COglshapeView, CView)
BEGIN_MESSAGE_MAP(COglshapeView, CView)
//{{AFX_MSG_MAP(COglshapeView)
ON_WM_CREATE()
ON_WM_DESTROY()
ON_COMMAND(ID_MODE_FILLED, OnModeFilled)
ON_COMMAND(ID_MODE_PROVOLOKA, OnModeProvoloka)
ON_UPDATE_COMMAND_UI(ID_MODE_FILLED, OnUpdateModeFilled)
ON_UPDATE_COMMAND_UI(ID_MODE_PROVOLOKA, OnUpdateModeProvoloka)
ON_COMMAND(ID_TEST_ROTATE_CORNER, OnTestRotateCorner)
ON_COMMAND(ID_TEST_ROTATE_START, OnTestRotateStart)
ON_UPDATE_COMMAND_UI(ID_TEST_ROTATE_START, OnUpdateTestRotateStart)
ON_COMMAND(ID_TEST_ROTATE_STOP, OnTestRotateStop)
ON_UPDATE_COMMAND_UI(ID_TEST_ROTATE_STOP, OnUpdateTestRotateStop)
ON_COMMAND(ID_TEST_TRANSLATE_CREATE, OnTestTranslateCreate)
ON_COMMAND(ID_TEST_TRANSLATE_STOP, OnTestTranslateStop)
ON_UPDATE_COMMAND_UI(ID_TEST_TRANSLATE_STOP, OnUpdateTestTranslateStop)
ON_COMMAND(ID_TEST_TRANSLATE_START, OnTestTranslateStart)
ON_UPDATE_COMMAND_UI(ID_TEST_TRANSLATE_START, OnUpdateTestTranslateStart)
ON_COMMAND(ID_TEST_SCALE_CREATE, OnTestScaleCreate)
ON_COMMAND(ID_TEST_SCALE_START, OnTestScaleStart)
ON_UPDATE_COMMAND_UI(ID_TEST_SCALE_START, OnUpdateTestScaleStart)
ON_COMMAND(ID_TEST_SCALE_STOP, OnTestScaleStop)
ON_UPDATE_COMMAND_UI(ID_TEST_SCALE_STOP, OnUpdateTestScaleStop)
ON_COMMAND(ID_LIGHT_ON, OnLightOn)
ON_COMMAND(ID_LIGHT_OFF, OnLightOff)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// COglshapeView construction/destruction
COglshapeView::COglshapeView()
{
// TODO: add construction code here
m_vid = 1;
m_ugol = 0.0f;
m_trans = NULL;
m_scale = NULL;
Is_light = false;
}
COglshapeView::~COglshapeView()
{
}
/////////////////////////////////////////////////////////////////////////////
// COglshapeView drawing
void COglshapeView::OnSize(unsigned int nType, int cx, int cy)
{
//COpenGLView::OnSize(nType, cx,cy);
int m_width = cx;
int m_height = cy;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-2.0f,
3.0f,
-3.0f,
2.0f,
-20.0f,
20.0f);
glMatrixMode(GL_MODELVIEW);
}
void COglshapeView::OnDraw(CDC* pDC)
{
COglshapeDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
///////////////////////////////////////
///////////////////////////////////////
// START CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
static float ambient[] = {0.0f, 0.0f, 0.0f, 1.0f};
static float diffuse[] = {1.0, 1.0,1.0, 1.0};
static float specular[] = {1.0, 1.0, 1.0, 1.0};
// static float position[] = {0.0, 5.0, 0.0, 0.0};
static float position[] = {0.0, 2.0, 0.0, 0.0};
static float cutoff[] = {45.0};
static float direction[] = {0.0,1.0,0.0,1.0};
//static float front_mat_shininess[] = {10.0};
static float front_mat_shininess[] = {10.0};
//static float front_mat_specular[] = {0.5f, 0.4f, 0.4f, 0.1f};
static float front_mat_specular[] ={0.0, 0.0, 0.0, 1.0};
//static float front_mat_diffuse[] = {0.0f, 0.9f, 0.3f, 0.1f};
static float front_mat_diffuse[] = {0.8, 0.8, 0.8, 1.0};
static float front_mat_ambient[] = {1.0, 0.2, 0.2, 1.0};
static float back_mat_shininess[] = {3.2};
static float back_mat_specular[] ={0.07568, 0.61424, 0.07568, 1.0};
static float back_mat_diffuse[] = {0.633, 0.727811, 0.633, 1.0};
static float lmodel_ambient[] = {1.0, 1.0, 0.0, 1.0};
static float lmodel_twoside[] = {GL_TRUE};
wglMakeCurrent(pDC->m_hDC, m_hRC);
glEnable(GL_NORMALIZE);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(90.0f,1.5,1.5f,20.0f);
//gluLookAt(1,2,1,0,1,0,2,10.0,0);
glMatrixMode(GL_MODELVIEW);
GLfloat x = 2.0f, y = 2.0f, z = 2.0f;
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
//glClearColor(1.0f,0.89f,0.866f,1.0f);
glClearColor(1.0f, 0.96f, 0.866f, 1.0f);
glDepthFunc(GL_LEQUAL);
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
glEnable(GL_BLEND);
glBlendFunc(GL_ONE,GL_SRC_COLOR);
//задаём источник света
glLightfv(GL_LIGHT0,GL_AMBIENT,ambient);
glLightfv(GL_LIGHT0,GL_DIFFUSE,diffuse);
glLightfv(GL_LIGHT0,GL_POSITION,position);
glLightfv(GL_LIGHT0,GL_SPOT_CUTOFF,cutoff);
glLightfv(GL_LIGHT0,GL_SPOT_DIRECTION,direction);
glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);
glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE,lmodel_twoside);
glShadeModel(GL_FLAT);
glPushMatrix();
switch(m_vid)
{
case 0 : glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);break;
case 1 : glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);break;
}
glTranslatef(0.0f, 0.0f, -4.0f);
glRotatef(30.0f, 1.0f, 0.0f, 0.0f);
glRotatef(-30.0f, 0.0f, 1.0f, 0.0f);
glLineWidth(2.0f);
//Osi koordinat
glBegin(GL_LINES);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(x, 0.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, y, 0.0f);
glColor3f(0.0f, 0.8f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, z);
glEnd();
glLineStipple(2, 0x1c47);
glEnable(GL_LINE_STIPPLE);
glBegin(GL_LINES);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(-x, 0.0f, 0.0f);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, -y, 0.0f);
glColor3f(0.0f, 0.8f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, -z);
glEnd();
glDisable(GL_LINE_STIPPLE);
glShadeModel(GL_SMOOTH);
glMatrixMode(GL_MODELVIEW);
if (Is_light)
{
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
}
else
{
glDisable(GL_LIGHTING);
glDisable(GL_LIGHT0);
}
glMaterialfv(GL_FRONT,GL_AMBIENT,front_mat_ambient);
glMaterialfv(GL_FRONT,GL_SHININESS,front_mat_shininess);
glMaterialfv(GL_FRONT,GL_SPECULAR, front_mat_specular);
glMaterialfv(GL_FRONT,GL_DIFFUSE,front_mat_diffuse);
glMaterialfv(GL_BACK,GL_SHININESS,back_mat_shininess);
glMaterialfv(GL_BACK,GL_SPECULAR,back_mat_specular);
glMaterialfv(GL_BACK,GL_DIFFUSE,back_mat_diffuse);
if (Is_Rotated) glRotatef(m_ugol,0.0,0.0,1.0);
if (Is_Translated) glTranslatef(m_trans->X,m_trans->Y,m_trans->Z);
if (Is_Scaled) glScalef(m_scale->X,m_scale->X,m_scale->X);
glBegin(GL_QUAD_STRIP);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(-0.5f, 0.5f, 1.5f);
glVertex3f(-0.5f,-0.5f, 1.5f);
glVertex3f( 0.5f, 0.5f, 1.5f);
glVertex3f( 0.5f,-0.5f, 1.5f);
glVertex3f( 0.5f, 0.5f,-2.5f);
glColor3f( 0.0f, 0.0f, 1.0f);
glVertex3f( 0.5f,-0.5f,-2.5f);
glVertex3f(-0.5f, 0.5f,-2.5f);
glVertex3f(-0.5f,-0.5f,-2.5f);
glVertex3f(-0.5f, 0.5f, 1.5f);
glVertex3f(-0.5f,-0.5f, 1.5f);
glEnd();
glBegin(GL_QUADS);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(-0.5f, 0.5f, 1.5f);
glVertex3f( 0.5f, 0.5f, 1.5f);
glVertex3f( 0.5f, 0.5f,-2.5f);
glVertex3f(-0.5f, 0.5f,-2.5f);
glEnd();
glBegin(GL_QUADS);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(-0.5f,-0.5f, 1.5f);
glVertex3f( 0.5f,-0.5f, 1.5f);
glVertex3f( 0.5f,-0.5f,-2.5f);
glVertex3f(-0.5f,-0.5f,-2.5f);
glEnd();
glPopMatrix();
glFinish();
//SwapBuffers(::wglGetCurrentDC());
wglMakeCurrent(pDC->m_hDC, NULL);
///////////////////////////////////////
///////////////////////////////////////
// END CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
}
/////////////////////////////////////////////////////////////////////////////
// COglshapeView diagnostics
#ifdef _DEBUG
void COglshapeView::AssertValid() const
{
CView::AssertValid();
}
void COglshapeView::Dump(CDumpContext& dc) const
{
CView::Dump(dc);
}
COglshapeDoc* COglshapeView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(COglshapeDoc)));
return (COglshapeDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// COglshapeView message handlers
int COglshapeView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CView::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
///////////////////////////////////////
///////////////////////////////////////
// START CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
PIXELFORMATDESCRIPTOR pfd =
{
sizeof(PIXELFORMATDESCRIPTOR), // Structure size.
1, // Structure version number.
PFD_DRAW_TO_WINDOW | // Property flags.
PFD_SUPPORT_OPENGL,
PFD_TYPE_RGBA,
24, // 24-bit color.
0, 0, 0, 0, 0, 0, // Not concerned with these.
0, 0, 0, 0, 0, 0, 0, // No alpha or accum buffer.
32, // 32-bit depth buffer.
0, 0, // No stencil or aux buffer.
PFD_MAIN_PLANE, // Main layer type.
0, // Reserved.
0, 0, 0 // Unsupported.
};
CClientDC clientDC(this);
int pixelFormat =
ChoosePixelFormat(clientDC.m_hDC, &pfd);
BOOL success =
SetPixelFormat(clientDC.m_hDC, pixelFormat, &pfd);
m_hRC = wglCreateContext(clientDC.m_hDC);
///////////////////////////////////////
///////////////////////////////////////
// END CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
return 0;
}
void COglshapeView::OnDestroy()
{
CView::OnDestroy();
// TODO: Add your message handler code here
///////////////////////////////////////
///////////////////////////////////////
// START CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
wglDeleteContext(m_hRC);
///////////////////////////////////////
///////////////////////////////////////
// END CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
}
BOOL COglshapeView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Add your specialized code here and/or call the base class
///////////////////////////////////////
///////////////////////////////////////
// START CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
cs.style |= WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
///////////////////////////////////////
///////////////////////////////////////
// END CUSTOM CODE
///////////////////////////////////////
///////////////////////////////////////
return CView::PreCreateWindow(cs);
}
void COglshapeView::OnModeFilled()
{
// TODO: Add your command handler code here
m_vid = 1;
Invalidate();
}
void COglshapeView::OnModeProvoloka()
{
// TODO: Add your command handler code here
m_vid = 0;
Invalidate();
}
void COglshapeView::OnUpdateModeFilled(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (m_vid == 1)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
void COglshapeView::OnUpdateModeProvoloka(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (m_vid == 0)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
void COglshapeView::OnTestRotateCorner()
{
// TODO: Add your command handler code here
CRotateDlg dlgRotate;
if (dlgRotate.DoModal() == IDOK)
{
m_ugol = dlgRotate.GetUgol();
}
}
void COglshapeView::OnTestRotateStart()
{
// TODO: Add your command handler code here
Is_Rotated = true;
Invalidate();
}
void COglshapeView::OnUpdateTestRotateStart(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (Is_Rotated == true)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
void COglshapeView::OnTestRotateStop()
{
// TODO: Add your command handler code here
Is_Rotated = false;
Invalidate();
}
void COglshapeView::OnUpdateTestRotateStop(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (Is_Rotated == true)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
void COglshapeView::OnTestTranslateCreate()
{
// TODO: Add your command handler code here
CTransDlg dlgTrans;
if (dlgTrans.DoModal() == IDOK)
{
if (m_trans != NULL)
delete m_trans;
m_trans = dlgTrans.GetTrans();
}
}
void COglshapeView::OnTestTranslateStop()
{
// TODO: Add your command handler code here
Is_Translated = false;
Invalidate();
}
void COglshapeView::OnUpdateTestTranslateStop(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (Is_Translated == false)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
void COglshapeView::OnTestTranslateStart()
{
// TODO: Add your command handler code here
Is_Translated = true;
Invalidate();
}
void COglshapeView::OnUpdateTestTranslateStart(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (Is_Translated == true)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
void COglshapeView::OnTestScaleCreate()
{
// TODO: Add your command handler code here
CSczleDlg dlgScale;
if (dlgScale.DoModal() == IDOK)
{
if (m_scale != NULL)
delete m_scale;
m_scale = dlgScale.GetScale();
}
}
void COglshapeView::OnTestScaleStart()
{
// TODO: Add your command handler code here
Is_Scaled = true;
Invalidate();
}
void COglshapeView::OnUpdateTestScaleStart(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (Is_Scaled == false)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
void COglshapeView::OnTestScaleStop()
{
// TODO: Add your command handler code here
Is_Scaled=false;
Invalidate();
}
void COglshapeView::OnUpdateTestScaleStop(CCmdUI* pCmdUI)
{
// TODO: Add your command update UI handler code here
if (Is_Scaled == false)
pCmdUI->SetCheck(TRUE);
else
pCmdUI->SetCheck(FALSE);
}
void COglshapeView::OnLightOn()
{
// TODO: Add your command handler code here
Is_light = true;
Invalidate();
}
void COglshapeView::OnLightOff()
{
// TODO: Add your command handler code here
Is_light = false;
Invalidate();
}
Соседние файлы в папке Лабораторная работа №34