Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №31 / 3DProjectDlg
.cpp// 3DProjectDlg.cpp : implementation file
//
#include "stdafx.h"
#include "3DProject.h"
#include "3DProjectDlg.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// C3DProjectDlg dialog
C3DProjectDlg::C3DProjectDlg(CWnd* pParent /*=NULL*/)
: CDialog(C3DProjectDlg::IDD, pParent), m_bLamp1(FALSE), m_bLamp2(FALSE), m_bLamp3(FALSE),
m_bLightOn(FALSE)
{
//{{AFX_DATA_INIT(C3DProjectDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void C3DProjectDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(C3DProjectDlg)
DDX_Control(pDX, IDC_XROTATE, m_ctrlXRotate);
DDX_Control(pDX, IDC_XTRANSLATE, m_ctrlXTranslate);
DDX_Control(pDX, IDC_YROTATE, m_ctrlYRotate);
DDX_Control(pDX, IDC_YTRANSLATE, m_ctrlYTranslate);
DDX_Control(pDX, IDC_ZROTATE, m_ctrlZRotate);
DDX_Control(pDX, IDC_ZTRANSLATE, m_ctrlZTranslate);
DDX_Control(pDX, IDC_ANGLEROTATE, m_ctrlAngleRotate);
DDX_Control(pDX, IDC_CENTERY, m_ctrlCenterY);
DDX_Control(pDX, IDC_EYEZ, m_ctrlEyeZ);
DDX_Control(pDX, IDC_EYEY, m_ctrlEyeY);
DDX_Control(pDX, IDC_EYEX, m_ctrlEyeX);
DDX_Control(pDX, IDC_UPZ, m_ctrlUpZ);
DDX_Control(pDX, IDC_UPY, m_ctrlUpY);
DDX_Control(pDX, IDC_UPX, m_ctrlUpX);
DDX_Control(pDX, IDC_CENTERZ, m_ctrlCenterZ);
DDX_Control(pDX, IDC_CENTERX, m_ctrlCenterX);
DDX_Control(pDX, IDC_ZNEAR, m_ctrlZNear);
DDX_Control(pDX, IDC_ZFAR, m_ctrlZFar);
DDX_Control(pDX, IDC_ASPECT, m_ctrlAspect);
DDX_Control(pDX, IDC_ANGLEY, m_ctrlAngleY);
DDX_Control(pDX, IDC_AMBIENTR, m_ctrlAmbientR);
DDX_Control(pDX, IDC_AMBIENTG, m_ctrlAmbientG);
DDX_Control(pDX, IDC_AMBIENTB, m_ctrlAmbientB);
DDX_Control(pDX, IDC_AMBIENTA, m_ctrlAmbientA);
DDX_Control(pDX, IDC_DIFFUSER, m_ctrlDiffuseR);
DDX_Control(pDX, IDC_DIFFUSEG, m_ctrlDiffuseG);
DDX_Control(pDX, IDC_DIFFUSEB, m_ctrlDiffuseB);
DDX_Control(pDX, IDC_DIFFUSEA, m_ctrlDiffuseA);
DDX_Control(pDX, IDC_SPECULARR, m_ctrlSpecularR);
DDX_Control(pDX, IDC_SPECULARG, m_ctrlSpecularG);
DDX_Control(pDX, IDC_SPECULARB, m_ctrlSpecularB);
DDX_Control(pDX, IDC_SPECULARA, m_ctrlSpecularA);
DDX_Check(pDX, IDC_LAMP1, m_bLamp1);
DDX_Check(pDX, IDC_LAMP2, m_bLamp2);
DDX_Check(pDX, IDC_LAMP3, m_bLamp3);
DDX_Check(pDX, IDC_LIGHTON, m_bLightOn);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(C3DProjectDlg, CDialog)
//{{AFX_MSG_MAP(C3DProjectDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CREATE()
ON_WM_HSCROLL()
ON_BN_CLICKED(IDC_LAMP1, OnLamp1)
ON_BN_CLICKED(IDC_LAMP2, OnLamp2)
ON_BN_CLICKED(IDC_LAMP3, OnLamp3)
ON_BN_CLICKED(IDC_LIGHTON, OnLighton)
ON_WM_DESTROY()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// C3DProjectDlg message handlers
BOOL C3DProjectDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
//Controls settings
//Rotate
m_ctrlAngleRotate.SetRange(0,360,true);
m_ctrlAngleRotate.SetPos(0);
m_ctrlXRotate.SetRange(-100, 100,true);
m_ctrlXRotate.SetPos(0);
m_ctrlYRotate.SetRange(-100, 100,true);
m_ctrlYRotate.SetPos(0);
m_ctrlZRotate.SetRange(-100, 100,true);
m_ctrlZRotate.SetPos(4);
//Translate
m_ctrlXTranslate.SetRange(-100, 100,true);
m_ctrlXTranslate.SetPos(0);
m_ctrlYTranslate.SetRange(-100, 100,true);
m_ctrlYTranslate.SetPos(1);
m_ctrlZTranslate.SetRange(-100, 100,true);
m_ctrlZTranslate.SetPos(0);
//projection
m_ctrlAngleY.SetRange(0,180,true);
m_ctrlAngleY.SetPos(109);
m_ctrlAspect.SetRange(1,90,true);
m_ctrlAspect.SetPos(1);
m_ctrlZNear.SetRange(0,100,true);
m_ctrlZNear.SetPos(0);
m_ctrlZFar.SetRange(0,100,true);
m_ctrlZFar.SetPos(100);
//LookAt
m_ctrlEyeX.SetRange(-100,100,true);
m_ctrlEyeX.SetPos(-74);
m_ctrlEyeY.SetRange(-100,100,true);
m_ctrlEyeY.SetPos(0);
m_ctrlEyeZ.SetRange(-100,100,true);
m_ctrlEyeZ.SetPos(42);
m_ctrlCenterX.SetRange(-100,100,true);
m_ctrlCenterX.SetPos(0);
m_ctrlCenterY.SetRange(-100,100,true);
m_ctrlCenterY.SetPos(0);
m_ctrlCenterZ.SetRange(-100,100,true);
m_ctrlCenterZ.SetPos(0);
m_ctrlUpX.SetRange(-100,100,true);
m_ctrlUpX.SetPos(48);
m_ctrlUpY.SetRange(-100,100,true);
m_ctrlUpY.SetPos(100);
m_ctrlUpZ.SetRange(-100,100,true);
m_ctrlUpZ.SetPos(-28);
//Material
m_ctrlAmbientR.SetRange(0,100,true);
m_ctrlAmbientR.SetPos(20);
m_ctrlAmbientG.SetRange(0,100,true);
m_ctrlAmbientG.SetPos(60);
m_ctrlAmbientB.SetRange(0,100,true);
m_ctrlAmbientB.SetPos(20);
m_ctrlAmbientA.SetRange(0,100,true);
m_ctrlAmbientA.SetPos(0);
m_ctrlDiffuseR.SetRange(0,100,true);
m_ctrlDiffuseR.SetPos(80);
m_ctrlDiffuseG.SetRange(0,100,true);
m_ctrlDiffuseG.SetPos(60);
m_ctrlDiffuseB.SetRange(0,100,true);
m_ctrlDiffuseB.SetPos(80);
m_ctrlDiffuseA.SetRange(0,100,true);
m_ctrlDiffuseA.SetPos(0);
m_ctrlSpecularR.SetRange(0,100,true);
m_ctrlSpecularR.SetPos(50);
m_ctrlSpecularG.SetRange(0,100,true);
m_ctrlSpecularG.SetPos(70);
m_ctrlSpecularB.SetRange(0,100,true);
m_ctrlSpecularB.SetPos(100);
m_ctrlSpecularA.SetRange(0,100,true);
m_ctrlSpecularA.SetPos(0);
//set image rect
GetClientRect(&m_rImageRect);
m_rImageRect.right /= 2;
//recalc all EditBox`s
RecalcEdit();
return TRUE; // return TRUE unless you set the focus to a control
}
void C3DProjectDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void C3DProjectDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting
if (IsIconic())
{
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
OnDraw(&dc);
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR C3DProjectDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void C3DProjectDlg::OnDraw(CDC* pDC)
{
wglMakeCurrent(pDC->m_hDC, m_hRC);
//set a drawing rect
glViewport(0, 0, m_rImageRect.Width(), m_rImageRect.Height());
//draw 3D picture
DrawWithOpenGL();
wglMakeCurrent(pDC->m_hDC, NULL);
}
void C3DProjectDlg::DrawWithOpenGL()
{
//set all transformations(rotate, translate,...)
SetTransformations();
//on lamps
EnableLamps();
Draw3DFigure();//drawing 3D figure
//drawing coordinate lines
DrawCoordinates();
//off lamps
DisableLamps();
}
//drawing coordinate lines
void C3DProjectDlg::DrawCoordinates()
{
glViewport(0, m_rImageRect.Height() - 100, 100,100);
glBegin(GL_LINES);
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 1.0f, 0.0f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(1.0f, 0.0f, 0.0f);
glColor3f(0.0f, 0.0f, 1.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 1.0f);
glEnd();
}
void C3DProjectDlg::SetTransformations()
{
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
//set all transformations, making by user
glTranslatef(m_ctrlXTranslate.GetPos()/100.0f, m_ctrlYTranslate.GetPos()/100.0f, m_ctrlZTranslate.GetPos()/100.0f);
glRotatef(m_ctrlAngleRotate.GetPos()*1.0f, m_ctrlXRotate.GetPos()/100.0f, m_ctrlYRotate.GetPos()/100.0f, m_ctrlZRotate.GetPos()/100.0f);
gluLookAt(m_ctrlEyeX.GetPos()/100.0f, m_ctrlEyeY.GetPos()/100.0f, m_ctrlEyeZ.GetPos()/100.0f, m_ctrlCenterX.GetPos()/100.0f, m_ctrlCenterY.GetPos()/100.0f, m_ctrlCenterZ.GetPos()/100.0f, m_ctrlUpX.GetPos()/100.0f, m_ctrlUpY.GetPos()/100.0f, m_ctrlUpZ.GetPos()/100.0f);
GLfloat material_ambient[] = { m_ctrlAmbientR.GetPos()/100.0f, m_ctrlAmbientG.GetPos()/100.0f, m_ctrlAmbientB.GetPos()/100.0f, m_ctrlAmbientA.GetPos()/100.0f };
GLfloat material_diffuse[] = { m_ctrlDiffuseR.GetPos()/100.0f, m_ctrlDiffuseG.GetPos()/100.0f, m_ctrlDiffuseB.GetPos()/100.0f, m_ctrlDiffuseA.GetPos()/100.0f };
GLfloat material_specular[] = { m_ctrlSpecularR.GetPos()/100.0f, m_ctrlSpecularG.GetPos()/100.0f, m_ctrlSpecularB.GetPos()/100.0f, m_ctrlSpecularA.GetPos()/100.0f };
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT, material_ambient);
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE, material_diffuse);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR, material_specular);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
//set perspective projection
gluPerspective(m_ctrlAngleY.GetPos(), m_ctrlAspect.GetPos(), m_ctrlZNear.GetPos(), m_ctrlZFar.GetPos());
glMatrixMode(GL_MODELVIEW);
}
void C3DProjectDlg::EnableLamps()
{
//on lamps
if (m_bLightOn)
glEnable(GL_LIGHTING);
if (m_bLamp1)
glEnable(GL_LIGHT1);
if (m_bLamp2)
glEnable(GL_LIGHT2);
if (m_bLamp3)
glEnable(GL_LIGHT3);
}
void C3DProjectDlg::DisableLamps()
{
//off lamps
if (m_bLightOn)
glDisable(GL_LIGHTING);
if (m_bLamp1)
glDisable(GL_LIGHT1);
if (m_bLamp2)
glDisable(GL_LIGHT2);
if (m_bLamp3)
glDisable(GL_LIGHT3);
}
//make settings for 3 lamps
void C3DProjectDlg::SetLamps()
{
//lamp1
GLfloat light1_ambient[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat light1_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat light1_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat light1_position[] = { 1.0f, 1.0f, 1.0f, 1.0f };
//lamp2
GLfloat light2_ambient[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat light2_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat light2_specular[] = { 1.0f, 0.0f, 1.0f, 0.0f };
GLfloat light2_position[] = { -1.0f, -1.0f, -1.0f, 1.0f };
//lamp3
GLfloat light3_ambient[] = { 0.8f, 0.9f, 1.0f, 1.0f };
GLfloat light3_diffuse[] = { 0.5f, 0.75f, 0.75f, 1.0f };
GLfloat light3_specular[] = { 0.22f, 1.0f, .035f, 1.0f };
GLfloat light3_position[] = { 0.25f, 0.0f, -0.25f, 1.0f };
//direction for all lamps
GLfloat spot_direction[] = { 0.25f, 0.25f, 0.25f };
glLightfv(GL_LIGHT1, GL_AMBIENT, light1_ambient);
glLightfv(GL_LIGHT1, GL_DIFFUSE, light1_diffuse);
glLightfv(GL_LIGHT1, GL_SPECULAR, light1_specular);
glLightfv(GL_LIGHT1, GL_POSITION, light1_position);
glLightf(GL_LIGHT1, GL_CONSTANT_ATTENUATION, 1.5f);
glLightf(GL_LIGHT1, GL_LINEAR_ATTENUATION, 0.5f);
glLightf(GL_LIGHT1, GL_QUADRATIC_ATTENUATION, 0.2f);
glLightf(GL_LIGHT1, GL_SPOT_CUTOFF, 100.0f);
glLightfv(GL_LIGHT1, GL_SPOT_DIRECTION, spot_direction);
glLightf(GL_LIGHT1, GL_SPOT_EXPONENT, 128.0f);
glLightfv(GL_LIGHT2, GL_AMBIENT, light2_ambient);
glLightfv(GL_LIGHT2, GL_DIFFUSE, light2_diffuse);
glLightfv(GL_LIGHT2, GL_SPECULAR, light2_specular);
glLightfv(GL_LIGHT2, GL_POSITION, light2_position);
glLightf(GL_LIGHT2, GL_CONSTANT_ATTENUATION, 1.5f);
glLightf(GL_LIGHT2, GL_LINEAR_ATTENUATION, 0.5f);
glLightf(GL_LIGHT2, GL_QUADRATIC_ATTENUATION, 0.2f);
glLightf(GL_LIGHT2, GL_SPOT_CUTOFF, 100.0f);
glLightfv(GL_LIGHT2, GL_SPOT_DIRECTION, spot_direction);
glLightf(GL_LIGHT2, GL_SPOT_EXPONENT, 128.0f);
glLightfv(GL_LIGHT3, GL_AMBIENT, light3_ambient);
glLightfv(GL_LIGHT3, GL_DIFFUSE, light3_diffuse);
glLightfv(GL_LIGHT3, GL_SPECULAR, light3_specular);
glLightfv(GL_LIGHT3, GL_POSITION, light3_position);
glLightf(GL_LIGHT3, GL_CONSTANT_ATTENUATION, 3.7f);
glLightf(GL_LIGHT3, GL_LINEAR_ATTENUATION, 4.0f);
glLightf(GL_LIGHT3, GL_QUADRATIC_ATTENUATION, 0.2f);
glLightf(GL_LIGHT3, GL_SPOT_CUTOFF, 100.0f);
glLightfv(GL_LIGHT3, GL_SPOT_DIRECTION, spot_direction);
glLightf(GL_LIGHT3, GL_SPOT_EXPONENT, 128.0f);
}
//set material of the figure
void C3DProjectDlg::SetMaterial()
{
float mat_dif[]={0.8f,0.6f,0.8f};
float mat_amb[]= {0.2f,0.6f,0.2f};
float mat_spec[]={0.5f,0.7f,1.0f};
float shininess=0.5f;
glMaterialfv(GL_FRONT_AND_BACK,GL_AMBIENT,mat_amb);
glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mat_dif);
glMaterialfv(GL_FRONT_AND_BACK,GL_SPECULAR,mat_spec);
glMaterialf(GL_FRONT_AND_BACK,GL_SHININESS,shininess);
glShadeModel (GL_SMOOTH);
}
//draw figure
void C3DProjectDlg::Draw3DFigure()
{
/**
//draw figure
glBegin(GL_TRIANGLE_STRIP );
glColor3f(1.0f, 0.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.5f, 0.0f, 0.0f);
glVertex3f(0.25f, 0.5f, 0.0f);
glColor3f(1.0f, 1.0f, 0.0f);
glVertex3f(0.25f, 0.0f, 0.5f);
glColor3f(0.0f, 1.0f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glColor3f(0.0f, 1.0f, 1.0f);
glVertex3f(0.5f, 0.0f, 0.0f);
glEnd();
glColor3f(0.0f, 0.0f, 0.0f);
//draw rifflings of the figure
glBegin(GL_LINE_STRIP );
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.5f, 0.0f, 0.0f);
glVertex3f(0.25f, 0.5f, 0.0f);
glVertex3f(0.0f, 0.0f, 0.0f);
glVertex3f(0.25f, 0.0f, 0.5f);
glVertex3f(0.5f, 0.0f, 0.0f);
glVertex3f(0.25f, 0.5f, 0.0f);
glVertex3f(0.25f, 0.0f, 0.5f);
glEnd();
**/
glTranslatef(0.0, 0.0, -8.0);
glRotatef(30.0, 1.0, 0.0, 0.0);
glRotatef(70.0, 0.0, 1.0, 0.0);
glBegin (GL_QUADS);
glNormal3f(0.0, 0.0, 1.0);
glVertex3f (1.0, 1.0, 1.0);
glVertex3f (-1.0, 1.0, 1.0);
glVertex3f (-1.0, -1.0, 1.0);
glVertex3f (1.0, -1.0, 1.0);
glEnd();
glBegin (GL_QUADS);
glNormal3f(0.0, 0.0, -1.0);
glVertex3f (1.0, 1.0, -1.0);
glVertex3f (1.0, -1.0, -1.0);
glVertex3f (-1.0, -1.0, -1.0);
glVertex3f (-1.0, 1.0, -1.0);
glEnd();
glBegin (GL_QUADS);
glNormal3f(-1.0, 0.0, 0.0);
glVertex3f (-1.0, 1.0, 1.0);
glVertex3f (-1.0, 1.0, -1.0);
glVertex3f (-1.0, -1.0, -1.0);
glVertex3f (-1.0, -1.0, 1.0);
glEnd();
glBegin (GL_QUADS);
glNormal3f(1.0, 0.0, 0.0);
glVertex3f (1.0, 1.0, 1.0);
glVertex3f (1.0, -1.0, 1.0);
glVertex3f (1.0, -1.0, -1.0);
glVertex3f (1.0, 1.0, -1.0);
glEnd();
glBegin (GL_QUADS);
glNormal3f(0.0, 1.0, 0.0);
glVertex3f (-1.0, 1.0, -1.0);
glVertex3f (-1.0, 1.0, 1.0);
glVertex3f (1.0, 1.0, 1.0);
glVertex3f (1.0, 1.0, -1.0);
glEnd();
glBegin(GL_QUADS);
glNormal3f(0.0, -1.0, 0.0);
glVertex3f (-1.0, -1.0, -1.0);
glVertex3f (1.0, -1.0, -1.0);
glVertex3f (1.0, -1.0, 1.0);
glVertex3f (-1.0, -1.0, 1.0);
glEnd();
}
int C3DProjectDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDialog::OnCreate(lpCreateStruct) == -1)
return -1;
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);
//make settings for drawing
wglMakeCurrent(clientDC.m_hDC, m_hRC);
SetMaterial();
SetLamps();
wglMakeCurrent(clientDC.m_hDC, NULL);
return 0;
}
void C3DProjectDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)
{
RecalcEdit();
InvalidateRect(&m_rImageRect);
CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
}
void C3DProjectDlg::RecalcEdit()
{
//Rotate
SetDlgItemInt(IDC_XROTATEEDIT, m_ctrlXRotate.GetPos());
SetDlgItemInt(IDC_YROTATEEDIT, m_ctrlYRotate.GetPos());
SetDlgItemInt(IDC_ZROTATEEDIT, m_ctrlZRotate.GetPos());
SetDlgItemInt(IDC_ANGLEROTATEEDIT, m_ctrlAngleRotate.GetPos());
//Translate
SetDlgItemInt(IDC_XTRANSLATEEDIT, m_ctrlXTranslate.GetPos());
SetDlgItemInt(IDC_YTRANSLATEEDIT, m_ctrlYTranslate.GetPos());
SetDlgItemInt(IDC_ZTRANSLATEEDIT, m_ctrlZTranslate.GetPos());
//Eye
SetDlgItemInt(IDC_EYEXEDIT, m_ctrlEyeX.GetPos());
SetDlgItemInt(IDC_EYEYEDIT, m_ctrlEyeY.GetPos());
SetDlgItemInt(IDC_EYEZEDIT, m_ctrlEyeZ.GetPos());
//Center
SetDlgItemInt(IDC_CENTERXEDIT, m_ctrlCenterX.GetPos());
SetDlgItemInt(IDC_CENTERYEDIT, m_ctrlCenterY.GetPos());
SetDlgItemInt(IDC_CENTERZEDIT, m_ctrlCenterZ.GetPos());
//Up
SetDlgItemInt(IDC_UPXEDIT, m_ctrlUpX.GetPos());
SetDlgItemInt(IDC_UPYEDIT, m_ctrlUpY.GetPos());
SetDlgItemInt(IDC_UPZEDIT, m_ctrlUpZ.GetPos());
//Projection
SetDlgItemInt(IDC_ANGLEYEDIT, m_ctrlAngleY.GetPos());
SetDlgItemInt(IDC_ASPECTEDIT, m_ctrlAspect.GetPos());
SetDlgItemInt(IDC_ZNEAREDIT, m_ctrlZNear.GetPos());
SetDlgItemInt(IDC_ZFAREDIT, m_ctrlZFar.GetPos());
//Ambient
SetDlgItemInt(IDC_AMBIENTREDIT, m_ctrlAmbientR.GetPos());
SetDlgItemInt(IDC_AMBIENTGEDIT, m_ctrlAmbientG.GetPos());
SetDlgItemInt(IDC_AMBIENTBEDIT, m_ctrlAmbientB.GetPos());
SetDlgItemInt(IDC_AMBIENTAEDIT, m_ctrlAmbientA.GetPos());
//Diffuse
SetDlgItemInt(IDC_DIFFUSEREDIT, m_ctrlDiffuseR.GetPos());
SetDlgItemInt(IDC_DIFFUSEGEDIT, m_ctrlDiffuseG.GetPos());
SetDlgItemInt(IDC_DIFFUSEBEDIT, m_ctrlDiffuseB.GetPos());
SetDlgItemInt(IDC_DIFFUSEAEDIT, m_ctrlDiffuseA.GetPos());
//Specular
SetDlgItemInt(IDC_SPECULARREDIT, m_ctrlSpecularR.GetPos());
SetDlgItemInt(IDC_SPECULARGEDIT, m_ctrlSpecularG.GetPos());
SetDlgItemInt(IDC_SPECULARBEDIT, m_ctrlSpecularB.GetPos());
SetDlgItemInt(IDC_SPECULARAEDIT, m_ctrlSpecularA.GetPos());
}
void C3DProjectDlg::OnLamp1()
{
m_bLamp1 = !m_bLamp1;
InvalidateRect(&m_rImageRect);
}
void C3DProjectDlg::OnLamp2()
{
m_bLamp2 = !m_bLamp2;
InvalidateRect(&m_rImageRect);
}
void C3DProjectDlg::OnLamp3()
{
m_bLamp3 = !m_bLamp3;
InvalidateRect(&m_rImageRect);
}
void C3DProjectDlg::OnLighton()
{
CWnd* pWnd;
m_bLightOn = !m_bLightOn;
pWnd = GetDlgItem(IDC_LAMP1);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_LAMP2);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_LAMP3);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_AMBIENT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_AMBIENTR);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_AMBIENTG);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_AMBIENTB);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_AMBIENTA);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_AMBIENTRT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_AMBIENTGT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_AMBIENTBT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_AMBIENTAT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_AMBIENTREDIT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_AMBIENTGEDIT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_AMBIENTBEDIT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_AMBIENTAEDIT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_DIFFUSE);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_DIFFUSER);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_DIFFUSEG);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_DIFFUSEB);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_DIFFUSEA);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_DIFFUSERT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_DIFFUSEGT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_DIFFUSEBT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_DIFFUSEAT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_DIFFUSEREDIT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_DIFFUSEGEDIT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_DIFFUSEBEDIT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_DIFFUSEAEDIT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_SPECULAR);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_SPECULARR);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_SPECULARG);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_SPECULARB);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_SPECULARA);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_SPECULARRT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_SPECULARGT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_SPECULARBT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_SPECULARAT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_SPECULARREDIT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_SPECULARGEDIT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_SPECULARBEDIT);
pWnd->EnableWindow(m_bLightOn);
pWnd = GetDlgItem(IDC_SPECULARAEDIT);
pWnd->EnableWindow(m_bLightOn);
InvalidateRect(&m_rImageRect);
}
void C3DProjectDlg::OnDestroy()
{
CDialog::OnDestroy();
wglDeleteContext(m_hRC);
}
BEGIN_EVENTSINK_MAP(C3DProjectDlg, CDialog)
//{{AFX_EVENTSINK_MAP(C3DProjectDlg)
//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()
Соседние файлы в папке Лабораторная работа №31