Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
18
Добавлен:
01.05.2014
Размер:
15.13 Кб
Скачать
// 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