Code/Resource
Windows Develop
Linux-Unix program
Internet-Socket-Network
Web Server
Browser Client
Ftp Server
Ftp Client
Browser Plugins
Proxy Server
Email Server
Email Client
WEB Mail
Firewall-Security
Telnet Server
Telnet Client
ICQ-IM-Chat
Search Engine
Sniffer Package capture
Remote Control
xml-soap-webservice
P2P
WEB(ASP,PHP,...)
TCP/IP Stack
SNMP
Grid Computing
SilverLight
DNS
Cluster Service
Network Security
Communication-Mobile
Game Program
Editor
Multimedia program
Graph program
Compiler program
Compress-Decompress algrithms
Crypt_Decrypt algrithms
Mathimatics-Numerical algorithms
MultiLanguage
Disk/Storage
Java Develop
assembly language
Applications
Other systems
Database system
Embeded-SCM Develop
FlashMX/Flex
source in ebook
Delphi VCL
OS Develop
MiddleWare
MPI
MacOS develop
LabView
ELanguage
Software/Tools
E-Books
Artical/Document
3DEDITORVIEW.CPP
Package: openglsystem.rar [view]
Upload User: nthssl
Upload Date: 2022-04-05
Package Size: 25357k
Code Size: 42k
Category:
OpenCV
Development Platform:
Visual C++
- // 3DEditorView.cpp : implementation of the CMy3DEditorView class
- //
- #include "stdafx.h"
- #include "3DEditor.h"
- #include "MainFrm.h"
- #include "3DEditorDoc.h"
- #include "3DEditorView.h"
- #include "DlgMapping.h"
- #include "DlgProperties.h"
- #include "DlgMaterial.h"
- #include "DlgRayTrace.h"
- #include "mmsystem.h"
- #ifdef _DEBUG
- #define new DEBUG_NEW
- #undef THIS_FILE
- static char THIS_FILE[] = __FILE__;
- #endif
- extern CStatusBar *statbar;
- /////////////////////////////////////////////////////////////////////////////
- // CMy3DEditorView
- IMPLEMENT_DYNCREATE(CMy3DEditorView, CView)
- BEGIN_MESSAGE_MAP(CMy3DEditorView, CView)
- //{{AFX_MSG_MAP(CMy3DEditorView)
- ON_WM_CREATE()
- ON_WM_DESTROY()
- ON_WM_SIZE()
- ON_COMMAND(ID_VIEW_VIEWALL, OnViewViewall)
- ON_COMMAND(ID_VIEW_CAMERA_NEXT, OnViewCameraNext)
- ON_UPDATE_COMMAND_UI(ID_VIEW_CAMERA_NEXT, OnUpdateViewCameraNext)
- ON_COMMAND(ID_VIEW_CAMERA_PREVIOUS, OnViewCameraPrevious)
- ON_UPDATE_COMMAND_UI(ID_VIEW_CAMERA_PREVIOUS, OnUpdateViewCameraPrevious)
- ON_UPDATE_COMMAND_UI(ID_VIEW_VIEWALL, OnUpdateViewViewall)
- ON_COMMAND(ID_EDIT_CAMERA_RESET, OnEditCameraReset)
- ON_UPDATE_COMMAND_UI(ID_EDIT_CAMERA_RESET, OnUpdateEditCameraReset)
- ON_COMMAND(IDM_FLAT, OnFlat)
- ON_UPDATE_COMMAND_UI(IDM_FLAT, OnUpdateFlat)
- ON_COMMAND(IDM_GOURAUND, OnGouraund)
- ON_UPDATE_COMMAND_UI(IDM_GOURAUND, OnUpdateGouraund)
- ON_COMMAND(IDM_POINTS, OnPoints)
- ON_UPDATE_COMMAND_UI(IDM_POINTS, OnUpdatePoints)
- ON_COMMAND(IDM_SHADED, OnShaded)
- ON_UPDATE_COMMAND_UI(IDM_SHADED, OnUpdateShaded)
- ON_COMMAND(IDM_TEXTURED, OnTextured)
- ON_UPDATE_COMMAND_UI(IDM_TEXTURED, OnUpdateTextured)
- ON_COMMAND(IDM_WIREFRAME, OnWireframe)
- ON_UPDATE_COMMAND_UI(IDM_WIREFRAME, OnUpdateWireframe)
- ON_WM_LBUTTONDOWN()
- ON_WM_LBUTTONUP()
- ON_COMMAND(ID_LOOKAT, OnLookat)
- ON_WM_MOUSEMOVE()
- ON_WM_MOUSEWHEEL()
- ON_COMMAND(ID_PAN, OnPan)
- ON_WM_RBUTTONDOWN()
- ON_COMMAND(ID_SELECT, OnSelect)
- ON_WM_TIMER()
- ON_UPDATE_COMMAND_UI(ID_DOLLY, OnUpdateDolly)
- ON_UPDATE_COMMAND_UI(ID_LOOKAT, OnUpdateLookat)
- ON_UPDATE_COMMAND_UI(ID_PAN, OnUpdatePan)
- ON_UPDATE_COMMAND_UI(ID_SELECT, OnUpdateSelect)
- ON_COMMAND(ID_ELEMEMTMODE, OnElememtmode)
- ON_UPDATE_COMMAND_UI(ID_ELEMEMTMODE, OnUpdateElememtmode)
- ON_COMMAND(ID_MATERIALMODE, OnMaterialmode)
- ON_UPDATE_COMMAND_UI(ID_MATERIALMODE, OnUpdateMaterialmode)
- ON_COMMAND(ID_DOLLY, OnDolly)
- ON_COMMAND(ID_TILT, OnTilt)
- ON_UPDATE_COMMAND_UI(ID_TILT, OnUpdateTilt)
- ON_COMMAND(ID_RAYTRACE, OnRaytrace)
- ON_UPDATE_COMMAND_UI(ID_RAYTRACE, OnUpdateRaytrace)
- ON_WM_CHAR()
- ON_COMMAND(ID_CAPTURE_IMAGE, OnCaptureImage)
- ON_COMMAND(ID_CAPTURE_MOVIE, OnCaptureMovie)
- ON_UPDATE_COMMAND_UI(ID_CAPTURE_MOVIE, OnUpdateCaptureMovie)
- ON_COMMAND(ID_CAPTURE_RECORD, OnCaptureRecord)
- ON_UPDATE_COMMAND_UI(ID_CAPTURE_RECORD, OnUpdateCaptureRecord)
- ON_COMMAND(ID_CAPTURE_PAUSE, OnCapturePause)
- ON_UPDATE_COMMAND_UI(ID_CAPTURE_PAUSE, OnUpdateCapturePause)
- ON_COMMAND(ID_CAPTURE_STOP, OnCaptureStop)
- ON_UPDATE_COMMAND_UI(ID_CAPTURE_STOP, OnUpdateCaptureStop)
- ON_WM_ERASEBKGND()
- //}}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()
- /////////////////////////////////////////////////////////////////////////////
- // CMy3DEditorView construction/destruction
- CMy3DEditorView::CMy3DEditorView()
- {
- // TODO: add construction code here
- lbut=0;
- polymode=3;
- shademode=1;
- dtimer=0;
- cammode=0;
- cur_cam=-1;
- lastviewUp.Vec(0,0,1);
- movieCapture=NULL;
- recording=false;
- }
- CMy3DEditorView::~CMy3DEditorView()
- {
- }
- BOOL CMy3DEditorView::PreCreateWindow(CREATESTRUCT& cs)
- {
- // TODO: Modify the Window class or styles here by modifying
- // the CREATESTRUCT cs
- //设置窗口类型
- cs.style |=WS_CLIPCHILDREN | WS_CLIPSIBLINGS;
- return CView::PreCreateWindow(cs);
- }
- /////////////////////////////////////////////////////////////////////////////
- // CMy3DEditorView drawing
- void CMy3DEditorView::OnDraw(CDC* pDC)
- {
- CMy3DEditorDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- // TODO: add draw code for native data here
- if(pDC->IsPrinting())
- {
- // 将内存DC中的内容绘制到打印DC
- CRect drawRect;
- int cx, cy;
- m_MemImageDC.GetMemorySize(&cx, &cy);
- drawRect.SetRect(150, 200, 150 + cx*2 , 200 + cy*2);
- pDC->DPtoLP(&drawRect);
- m_MemImageDC.CopyDataToDC(pDC, drawRect);
- }
- else // 在当前的DC中绘制OpenGL图像
- {
- wglMakeCurrent( pDC->m_hDC, m_hRC );
- glClearColor( pDoc->background.x, pDoc->background.y, pDoc->background.z, 1.0 );
- if (pDoc->inuse==0)
- DrawScene(pDC);
- else
- {
- glDrawBuffer(GL_FRONT);
- glClear( GL_COLOR_BUFFER_BIT );
- glFinish();
- }
- wglMakeCurrent( 0, 0 );
- // 准备内存DC
- CRect rect;
- GetClientRect(&rect);
- m_MemImageDC.SetMemorySize(rect.Width(), rect.Height());
- // 将当前的DC的图像数据拷贝到内存中
- m_MemImageDC.CopyDataFromDC(pDC, rect);
- }
- }
- /////////////////////////////////////////////////////////////////////////////
- // CMy3DEditorView printing
- BOOL CMy3DEditorView::OnPreparePrinting(CPrintInfo* pInfo)
- {
- // default preparation
- return DoPreparePrinting(pInfo);
- }
- void CMy3DEditorView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
- {
- // TODO: add extra initialization before printing
- }
- void CMy3DEditorView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
- {
- // TODO: add cleanup after printing
- }
- /////////////////////////////////////////////////////////////////////////////
- // CMy3DEditorView diagnostics
- #ifdef _DEBUG
- void CMy3DEditorView::AssertValid() const
- {
- CView::AssertValid();
- }
- void CMy3DEditorView::Dump(CDumpContext& dc) const
- {
- CView::Dump(dc);
- }
- CMy3DEditorDoc* CMy3DEditorView::GetDocument() // non-debug version is inline
- {
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CMy3DEditorDoc)));
- return (CMy3DEditorDoc*)m_pDocument;
- }
- #endif //_DEBUG
- /////////////////////////////////////////////////////////////////////////////
- // CMy3DEditorView message handlers
- int CMy3DEditorView::OnCreate(LPCREATESTRUCT lpCreateStruct)
- {
- if (CView::OnCreate(lpCreateStruct) == -1)
- return -1;
- // TODO: Add your specialized creation code here
- CreateOpenGL();
- return 0;
- }
- void CMy3DEditorView::OnDestroy()
- {
- CView::OnDestroy();
- // TODO: Add your message handler code here
- DestroyOpenGL();
- }
- void CMy3DEditorView::OnSize(UINT nType, int cx, int cy)
- {
- CView::OnSize(nType, cx, cy);
- // TODO: Add your message handler code here
- CDC *dc = GetDC();
- wglMakeCurrent( dc->m_hDC, m_hRC );
- glViewport(0, 0, cx, cy);
- wglMakeCurrent( NULL, NULL );
- ReleaseDC(dc);
- if (cy==0)
- {
- cy=1;
- aspect=1.0;
- }
- else aspect=(GLfloat)cx/cy;
- }
- int CMy3DEditorView::CreateOpenGL()
- {
- CDC *dc = GetDC();
- HDC hDC = dc->GetSafeHdc();
- PIXELFORMATDESCRIPTOR pfd = {
- sizeof(PIXELFORMATDESCRIPTOR), // pfd结构的大小
- 1, // 版本号
- PFD_DRAW_TO_WINDOW | // 支持在窗口中绘图
- PFD_SUPPORT_OPENGL | // 支持 OpenGL
- PFD_DOUBLEBUFFER, // 双缓存模式
- PFD_TYPE_RGBA, // RGBA 颜色模式
- 24, // 24 位颜色深度
- 0, 0, 0, 0, 0, 0, // 忽略颜色位
- 0, // 没有非透明度缓存
- 0, // 忽略移位位
- 0, // 无累加缓存
- 0, 0, 0, 0, // 忽略累加位
- 32, // 32 位深度缓存
- 0, // 无模板缓存
- 0, // 无辅助缓存
- PFD_MAIN_PLANE, // 主层
- 0, // 保留
- 0, 0, 0 // 忽略层,可见性和损毁掩模
- };
- int pixelformat;
- pixelformat = ::ChoosePixelFormat(hDC, &pfd);//选择像素格式
- ::SetPixelFormat(hDC, pixelformat, &pfd); //设置像素格式
- if(pfd.dwFlags & PFD_NEED_PALETTE)
- SetLogicalPalette(); //设置逻辑调色板
- m_hRC = wglCreateContext( hDC );
- wglMakeCurrent( hDC, m_hRC );
- glClearDepth( 1.0 );
- glDepthFunc(GL_LEQUAL);
- glPointSize(2.0);
- glLineWidth(1.0);
- glCullFace(GL_BACK);
- glPixelStorei(GL_UNPACK_ALIGNMENT,1);
- glPixelStorei(GL_PACK_ALIGNMENT,1);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT);
- glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE);
- wglMakeCurrent( 0, 0 );
- ReleaseDC(dc);
- return 0;
- }
- /////////////////////////////////////////////////////////////////////
- // 设置逻辑调色板
- //////////////////////////////////////////////////////////////////////
- void CMy3DEditorView::SetLogicalPalette(void)
- {
- struct
- {
- WORD Version;
- WORD NumberOfEntries;
- PALETTEENTRY aEntries[256];
- } logicalPalette = { 0x300, 256 };
- BYTE reds[] = {0, 36, 72, 109, 145, 182, 218, 255};
- BYTE greens[] = {0, 36, 72, 109, 145, 182, 218, 255};
- BYTE blues[] = {0, 85, 170, 255};
- for (int colorNum=0; colorNum<256; ++colorNum)
- {
- logicalPalette.aEntries[colorNum].peRed =
- reds[colorNum & 0x07];
- logicalPalette.aEntries[colorNum].peGreen =
- greens[(colorNum >> 0x03) & 0x07];
- logicalPalette.aEntries[colorNum].peBlue =
- blues[(colorNum >> 0x06) & 0x03];
- logicalPalette.aEntries[colorNum].peFlags = 0;
- }
- m_hPalette = CreatePalette ((LOGPALETTE*)&logicalPalette);
- }
- void CMy3DEditorView::DestroyOpenGL()
- {
- wglMakeCurrent(NULL, NULL);
- if (m_hRC)
- wglDeleteContext(m_hRC);
- if (m_hPalette)
- DeleteObject(m_hPalette);
- m_hRC=0;
- }
- void DrawBBox(object *o)
- {
- glBegin(GL_LINES);
- glVertex3f(o->bbox1.x,o->bbox1.y,o->bbox1.z);
- glVertex3f(o->bbox1.x,o->bbox1.y,o->bbox2.z);
- glVertex3f(o->bbox1.x,o->bbox1.y,o->bbox1.z);
- glVertex3f(o->bbox1.x,o->bbox2.y,o->bbox1.z);
- glVertex3f(o->bbox1.x,o->bbox1.y,o->bbox1.z);
- glVertex3f(o->bbox2.x,o->bbox1.y,o->bbox1.z);
- glVertex3f(o->bbox2.x,o->bbox2.y,o->bbox2.z);
- glVertex3f(o->bbox2.x,o->bbox2.y,o->bbox1.z);
- glVertex3f(o->bbox2.x,o->bbox2.y,o->bbox2.z);
- glVertex3f(o->bbox2.x,o->bbox1.y,o->bbox2.z);
- glVertex3f(o->bbox2.x,o->bbox2.y,o->bbox2.z);
- glVertex3f(o->bbox1.x,o->bbox2.y,o->bbox2.z);
- glVertex3f(o->bbox1.x,o->bbox1.y,o->bbox2.z);
- glVertex3f(o->bbox2.x,o->bbox1.y,o->bbox2.z);
- glVertex3f(o->bbox2.x,o->bbox1.y,o->bbox2.z);
- glVertex3f(o->bbox2.x,o->bbox1.y,o->bbox1.z);
- glVertex3f(o->bbox2.x,o->bbox1.y,o->bbox1.z);
- glVertex3f(o->bbox2.x,o->bbox2.y,o->bbox1.z);
- glVertex3f(o->bbox2.x,o->bbox2.y,o->bbox1.z);
- glVertex3f(o->bbox1.x,o->bbox2.y,o->bbox1.z);
- glVertex3f(o->bbox1.x,o->bbox2.y,o->bbox1.z);
- glVertex3f(o->bbox1.x,o->bbox2.y,o->bbox2.z);
- glVertex3f(o->bbox1.x,o->bbox2.y,o->bbox2.z);
- glVertex3f(o->bbox1.x,o->bbox1.y,o->bbox2.z);
- glEnd();
- }
- void CMy3DEditorView::DrawScene(CDC* cDC)
- {
- CMy3DEditorDoc* pDoc = GetDocument();
- glDrawBuffer(GL_BACK);
- glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
- float f[4]={0,0,0,1};
- glDisable(GL_POINT_SMOOTH);
- glDisable(GL_LINE_SMOOTH);
- glDisable(GL_BLEND);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,pDoc->textinterp?GL_LINEAR:GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,pDoc->textinterp?GL_LINEAR:GL_NEAREST);
- if (pDoc->backface)
- glEnable(GL_CULL_FACE);
- else
- glDisable(GL_CULL_FACE);
- if (shademode)
- glShadeModel(GL_SMOOTH);
- else
- glShadeModel(GL_FLAT);
- // if (dither)
- glEnable(GL_DITHER);
- // else glDisable(GL_DITHER);
- if (polymode)
- if (polymode==1)
- glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
- else
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- else
- glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);
- if (polymode==3)
- {
- glEnable(GL_TEXTURE_2D);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,pDoc->textinterp?GL_LINEAR:GL_NEAREST);
- glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,pDoc->textinterp?GL_LINEAR:GL_NEAREST);
- }
- else
- glDisable(GL_TEXTURE_2D);
- glMatrixMode( GL_PROJECTION );
- glLoadIdentity();
- gluPerspective(cam.theta, aspect, nearplane, farplane);
- glMatrixMode( GL_MODELVIEW );
- glLoadIdentity();
- glMultMatrixf((float *)&cam.mat_t);
- glTranslatef(-cam.Vp.x,-cam.Vp.y,-cam.Vp.z);
- glEnable(GL_DEPTH_TEST);
- if (polymode>1)
- {
- glEnable(GL_LIGHTING);
- glLightModeli(GL_LIGHT_MODEL_TWO_SIDE,1);
- int i;
- f[0]=pDoc->amblight.x;
- f[1]=pDoc->amblight.y;
- f[2]=pDoc->amblight.z;
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT,f);
- if (pDoc->headlight==1)
- {
- glDisable(GL_LIGHT2);
- glDisable(GL_LIGHT3);
- glDisable(GL_LIGHT4);
- glDisable(GL_LIGHT5);
- glDisable(GL_LIGHT6);
- glDisable(GL_LIGHT7);
- glEnable(GL_LIGHT1);
- f[0]=(float)cam.Vp.x;
- f[1]=(float)cam.Vp.y;
- f[2]=(float)cam.Vp.z;
- glLightfv(GL_LIGHT1,GL_POSITION,f);
- f[0]=f[1]=f[2]=1.0;
- glLightfv(GL_LIGHT1,GL_DIFFUSE,f);
- glLightfv(GL_LIGHT1,GL_SPECULAR,f);
- glLightf(GL_LIGHT1,GL_SPOT_CUTOFF,180);
- }
- else
- if (pDoc->headlight==-1)
- {
- glDisable(GL_LIGHTING);
- }
- else
- {
- light *l;
- int ml;
- glDisable(GL_LIGHT1);
- glGetIntegerv(GL_MAX_LIGHTS,&ml);
- if (--ml>pDoc->nlights)
- ml=pDoc->nlights;
- for( i=0;i<ml;i++ )
- {
- l=&pDoc->lightlib[i];
- glEnable(GL_LIGHT1+i);
- f[0]=l->pos.x;
- f[1]=l->pos.y;
- f[2]=l->pos.z;
- glLightfv(GL_LIGHT1+i,GL_POSITION,f);
- f[0]=l->color.x;
- f[1]=l->color.y;
- f[2]=l->color.z;
- glLightfv(GL_LIGHT1+i,GL_DIFFUSE,f);
- glLightfv(GL_LIGHT1+i,GL_SPECULAR,f);
- if (l->type==1)
- {
- glLightfv(GL_LIGHT1+i,GL_SPOT_DIRECTION,&l->dir.x);
- glLightf(GL_LIGHT1+i,GL_SPOT_CUTOFF,(float)(Degrees(acos(l->falloff))));
- }
- else glLightf(GL_LIGHT1+i,GL_SPOT_CUTOFF,180);
- }
- }
- }
- else
- {
- glColor3f(1-pDoc->background.x,1-pDoc->background.y,1-pDoc->background.z);
- glDisable(GL_LIGHTING);
- }
- if (pDoc->fog)
- {
- glEnable(GL_FOG);
- glFogi( GL_FOG_MODE, GL_LINEAR );
- glFogf( GL_FOG_START , 0);
- glFogf( GL_FOG_END , pDoc->bboxdiag/4);
- f[0]=pDoc->background.x;
- f[1]=pDoc->background.y;
- f[2]=pDoc->background.z;
- glFogfv( GL_FOG_COLOR ,f );
- }
- else glDisable(GL_FOG);
- object *o=pDoc->obj0;
- while( o )
- {
- DrawObject(o);
- glFlush();
- o=(object *)o->next;
- }
- glDepthMask(GL_FALSE);
- if (pDoc->selobj)
- {
- glLineWidth(2.0);
- glTexImage2D(GL_TEXTURE_2D,0,3,0,0,0,GL_RGB,GL_UNSIGNED_BYTE,0);
- glDisable(GL_TEXTURE_2D);
- glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
- glShadeModel(GL_FLAT);
- glDisable(GL_LIGHTING);
- glDisable(GL_CULL_FACE);
- glColor3f(1.0f,1.0f,1.0f);
- int i;
- if (pDoc->selface==-1)
- DrawBBox(pDoc->selobj);
- else
- {
- for( i=0;i<pDoc->selobj->nf;i++ )
- if (pDoc->selobj->ft[i])
- pDoc->selobj->ft[i]->flag=1;
- ftlist *e=pDoc->selobj->ft[pDoc->selobj->elem[pDoc->selface].elem];
- e->flag=0;
- DrawElement(e);
- }
- glLineWidth(1.0);
- }
- if (pDoc->dlgmap)
- {
- DlgMapping *d=(DlgMapping *)pDoc->dlgmap;
- if (d->obj && d->vsel!=-1)
- {
- glColor3f(1.0f,0.2f,0.2f);
- glPointSize(10.0);
- glBegin(GL_POINTS);
- if (d->obj->vt[d->vsel])
- glVertex3fv((float *)&d->obj->vt[d->vsel]->pos);
- glEnd();
- glPointSize(2.0);
- }
- }
- glDepthMask(GL_TRUE);
- if (movieCapture != NULL && recording)
- {
- movieCapture->captureFrame();
- glPushMatrix();
- glColor4f(1, 0, 0, 1);
- RECT rect;
- GetClientRect(&rect);
- int x=(rect.right - MovieSize_X) / 2 - 1;
- int y =(rect.bottom - MovieSize_Y) / 2 - 1;
- int w=MovieSize_X + 1;
- int h=MovieSize_Y + 1;
- glBegin(GL_LINE_LOOP);
- glVertex3f(x, y, 0);
- glVertex3f(x + w, y, 0);
- glVertex3f(x + w, y + h, 0);
- glVertex3f(x, y + h, 0);
- glEnd();
- glPopMatrix();
- }
- glFinish();
- SwapBuffers(cDC->m_hDC);
- }
- void CMy3DEditorView::DrawObject(object *obj)
- {
- CMy3DEditorDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- int f=0;
- pDoc->SelectMaterial(pDoc->matlib,last_mat=0);
- ftlist **ft=obj->ft;
- switch (polymode)
- {
- case 2:
- glBegin(GL_TRIANGLES);
- if (shademode)
- for( f=0;f<obj->nf;f++ )
- if (ft[f])
- {
- if (ft[f]->material!=last_mat)
- {
- glEnd();
- pDoc->SelectMaterial(&pDoc->matlib[last_mat=ft[f]->material],polymode==3);
- glBegin(GL_TRIANGLES);
- }
- glNormal3fv((float *)&ft[f]->lv[0]->normal);
- glVertex3fv((float *)&ft[f]->lv[0]->pos);
- glNormal3fv((float *)&ft[f]->lv[1]->normal);
- glVertex3fv((float *)&ft[f]->lv[1]->pos);
- glNormal3fv((float *)&ft[f]->lv[2]->normal);
- glVertex3fv((float *)&ft[f]->lv[2]->pos);
- }
- else ;
- else
- for( f=0;f<obj->nf;f++ )
- if (ft[f])
- {
- if (ft[f]->material!=last_mat)
- {
- glEnd();
- pDoc->SelectMaterial(&pDoc->matlib[last_mat=ft[f]->material],polymode==3);
- glBegin(GL_TRIANGLES);
- }
- glNormal3fv((float *)&ft[f]->normal);
- glVertex3fv((float *)&ft[f]->lv[0]->pos);
- glVertex3fv((float *)&ft[f]->lv[1]->pos);
- glVertex3fv((float *)&ft[f]->lv[2]->pos);
- }
- glEnd();
- break;
- case 3:
- {
- float uv[2];
- glBegin(GL_TRIANGLES);
- if (shademode)
- for( f=0;f<obj->nf;f++ )
- if (ft[f])
- {
- if (ft[f]->material!=last_mat)
- {
- glEnd();
- pDoc->SelectMaterial(&pDoc->matlib[last_mat=ft[f]->material],polymode==3);
- glBegin(GL_TRIANGLES);
- }
- uv[0]=ft[f]->lv[0]->tx[0];
- uv[1]=ft[f]->lv[0]->tx[1];
- pDoc->calc_uv(uv[0], uv[1], &(pDoc->matlib[last_mat].map_texture1));
- glNormal3fv((float *)&ft[f]->lv[0]->normal);
- glTexCoord2fv(uv);
- glVertex3fv((float *)&ft[f]->lv[0]->pos);
- uv[0]=ft[f]->lv[1]->tx[0];
- uv[1]=ft[f]->lv[1]->tx[1];
- pDoc->calc_uv(uv[0], uv[1], &(pDoc->matlib[last_mat].map_texture1));
- glNormal3fv((float *)&ft[f]->lv[1]->normal);
- glTexCoord2fv(uv);
- glVertex3fv((float *)&ft[f]->lv[1]->pos);
- uv[0]=ft[f]->lv[2]->tx[0];
- uv[1]=ft[f]->lv[2]->tx[1];
- pDoc->calc_uv(uv[0], uv[1], &(pDoc->matlib[last_mat].map_texture1));
- glNormal3fv((float *)&ft[f]->lv[2]->normal);
- glTexCoord2fv(uv);
- glVertex3fv((float *)&ft[f]->lv[2]->pos);
- }
- else ;
- else
- for( f=0;f<obj->nf;f++ )
- if (ft[f])
- {
- if (ft[f]->material!=last_mat)
- {
- glEnd();
- pDoc->SelectMaterial(&pDoc->matlib[last_mat=ft[f]->material],polymode==3);
- glBegin(GL_TRIANGLES);
- }
- glNormal3fv((float *)&ft[f]->normal);
- uv[0]=ft[f]->lv[0]->tx[0];
- uv[1]=ft[f]->lv[0]->tx[1];
- pDoc->calc_uv(uv[0], uv[1], &(pDoc->matlib[last_mat].map_texture1));
- glTexCoord2fv(uv);
- glVertex3fv((float *)&ft[f]->lv[0]->pos);
- uv[0]=ft[f]->lv[1]->tx[0];
- uv[1]=ft[f]->lv[1]->tx[1];
- pDoc->calc_uv(uv[0], uv[1], &(pDoc->matlib[last_mat].map_texture1));
- glTexCoord2fv(uv);
- glVertex3fv((float *)&ft[f]->lv[1]->pos);
- uv[0]=ft[f]->lv[2]->tx[0];
- uv[1]=ft[f]->lv[2]->tx[1];
- pDoc->calc_uv(uv[0], uv[1], &(pDoc->matlib[last_mat].map_texture1));
- glTexCoord2fv(uv);
- glVertex3fv((float *)&ft[f]->lv[2]->pos);
- }
- glEnd();
- }
- break;
- case 0:
- glBegin(GL_POINTS);
- for( f=0;f<obj->nv;f++ )
- if (obj->vt[f])
- glVertex3fv((float *)&obj->vt[f]->pos);
- glEnd();
- break;
- case 1:
- glBegin(GL_TRIANGLES);
- for( f=0;f<obj->nf;f++ )
- if (ft[f])
- {
- glVertex3fv((float *)&ft[f]->lv[0]->pos);
- glVertex3fv((float *)&ft[f]->lv[1]->pos);
- glVertex3fv((float *)&ft[f]->lv[2]->pos);
- }
- glEnd();
- break;
- }
- }
- void CMy3DEditorView::DrawElement(ftlist *node)
- {
- unsigned short i;
- glBegin(GL_TRIANGLES);
- glVertex3fv(&node->lv[0]->pos.x);
- glVertex3fv(&node->lv[1]->pos.x);
- glVertex3fv(&node->lv[2]->pos.x);
- glEnd();
- for( i=0;i<3;i++ )
- if (node->lf[i])
- if (node->lf[i]->flag)
- {
- node->lf[i]->flag=0;
- DrawElement(node->lf[i]);
- }
- }
- void CMy3DEditorView::LookAt(vector& vp,vector& lp)
- {
- CMy3DEditorDoc* pDoc = GetDocument();
- vector U,N;
- cam.Vp=vp;
- cam.Lp=lp;
- cam.theta=45.0;
- N=lp-vp;
- N.Normalize();
- U=cam.Up - VecDot(N,cam.Up)*N;
- U.Normalize();
- cam.Up=U;
- cam.CalcSystemVectors();
- float d2=(pDoc->bboxC - cam.Vp).Length();
- nearplane=d2-pDoc->bboxdiag/2;
- farplane=pDoc->bboxdiag/2+d2;
- if (nearplane<pDoc->bboxdiag/1000)
- nearplane=pDoc->bboxdiag/1000;
- Invalidate(0);
- }
- void CMy3DEditorView::OnViewViewall()
- {
- // TODO: Add your command handler code here
- CMy3DEditorDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- vector vp;
- vp=pDoc->bboxC;
- vp.x-=pDoc->bboxdiag;
- LookAt(vp,pDoc->bboxC);
- }
- void CMy3DEditorView::OnUpdateViewViewall(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- CMy3DEditorDoc *pDoc=GetDocument();
- pCmdUI->Enable(pDoc->obj0!=0);
- }
- void CMy3DEditorView::OnViewCameraNext()
- {
- // TODO: Add your command handler code here
- CMy3DEditorDoc *pDoc=GetDocument();
- cur_cam=(cur_cam+1)%GetDocument()->ncamlib;
- LookAt(pDoc->camlib[cur_cam].Vp,pDoc->camlib[cur_cam].Lp);
- }
- void CMy3DEditorView::OnUpdateViewCameraNext(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->Enable(GetDocument()->ncamlib>1);
- }
- void CMy3DEditorView::OnViewCameraPrevious()
- {
- // TODO: Add your command handler code here
- CMy3DEditorDoc *pDoc=GetDocument();
- if (cur_cam==0)
- cur_cam=GetDocument()->ncamlib-1;
- else cur_cam=cur_cam-1;
- LookAt(pDoc->camlib[cur_cam].Vp,pDoc->camlib[cur_cam].Lp);
- }
- void CMy3DEditorView::OnUpdateViewCameraPrevious(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->Enable(GetDocument()->ncamlib>1);
- }
- void CMy3DEditorView::OnEditCameraReset()
- {
- // TODO: Add your command handler code here
- CMy3DEditorDoc *pDoc=GetDocument();
- LookAt(pDoc->camlib[cur_cam].Vp,pDoc->camlib[cur_cam].Lp);
- }
- void CMy3DEditorView::OnUpdateEditCameraReset(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->Enable(cur_cam!=-1);
- }
- void CMy3DEditorView::OnFlat()
- {
- // TODO: Add your command handler code here
- shademode=0;
- Invalidate(0);
- }
- void CMy3DEditorView::OnUpdateFlat(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetRadio(shademode==0);
- }
- void CMy3DEditorView::OnGouraund()
- {
- // TODO: Add your command handler code here
- shademode=1;
- Invalidate(0);
- }
- void CMy3DEditorView::OnUpdateGouraund(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetRadio(shademode==1);
- }
- void CMy3DEditorView::OnPoints()
- {
- // TODO: Add your command handler code here
- polymode=0;
- Invalidate(0);
- }
- void CMy3DEditorView::OnUpdatePoints(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetRadio(polymode==0);
- }
- void CMy3DEditorView::OnShaded()
- {
- // TODO: Add your command handler code here
- polymode=2;
- Invalidate(0);
- }
- void CMy3DEditorView::OnUpdateShaded(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetRadio(polymode==2);
- }
- void CMy3DEditorView::OnTextured()
- {
- // TODO: Add your command handler code here
- polymode=3;
- Invalidate(0);
- }
- void CMy3DEditorView::OnUpdateTextured(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetRadio(polymode==3);
- }
- void CMy3DEditorView::OnWireframe()
- {
- // TODO: Add your command handler code here
- polymode=1;
- Invalidate(0);
- }
- void CMy3DEditorView::OnUpdateWireframe(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetRadio(polymode==1);
- }
- void CMy3DEditorView::OnLButtonDown(UINT nFlags, CPoint point)
- {
- // TODO: Add your message handler code here and/or call default
- CMy3DEditorDoc *pDoc=GetDocument();
- if ((nFlags&MK_CONTROL) || (nFlags&MK_SHIFT) ||
- (GetAsyncKeyState(VK_MENU)&0x8000) )
- {
- lbut=1;
- mousex = point.x;
- mousey = point.y;
- SetCapture();
- }
- else if (cammode==0)
- Select(point,0);
- else if (cammode==7)
- Select(point,7);
- else if (cammode==4)
- Select(point,5);
- else if (cammode==8)
- Select(point,8);
- else
- {
- lbut=1;
- mousex = point.x;
- mousey = point.y;
- SetCapture();
- }
- CView::OnLButtonDown(nFlags, point);
- }
- void CMy3DEditorView::OnLButtonUp(UINT nFlags, CPoint point)
- {
- // TODO: Add your message handler code here and/or call default
- if (lbut)
- {
- lbut=0;
- ReleaseCapture();
- }
- CView::OnLButtonUp(nFlags, point);
- }
- void CMy3DEditorView::OnLookat()
- {
- // TODO: Add your command handler code here
- if (cammode==4)
- cammode=0;
- else cammode=4;
- }
- void CMy3DEditorView::OnMouseMove(UINT nFlags, CPoint point)
- {
- // TODO: Add your message handler code here and/or call default
- CMy3DEditorDoc* pDoc = GetDocument();
- int cmode;
- if (nFlags&MK_CONTROL)
- cmode=2;
- else if (nFlags&MK_SHIFT)
- cmode=3;
- else if (GetAsyncKeyState(VK_MENU)&0x8000)
- cmode=1;
- else if (cammode!=0)
- cmode=cammode;
- else
- {
- mousex=point.x;
- mousey=point.y;
- return;
- }
- switch(cmode)
- {
- case 1: SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));
- break;
- case 2: SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR2));
- break;
- case 3: SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR3));
- break;
- case 4: SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR4));
- break;
- }
- if (lbut==1)
- {
- vector disp;
- switch(cmode)
- {
- case 1:
- disp = ((float)(point.y-mousey)*cam.Y +
- (float)(mousex-point.x)*cam.X) * pDoc->bboxdiag/1000.0;
- break;
- case 2:
- disp = ((float)(mousey-point.y)*cam.Z) * pDoc->bboxdiag/-1000.0f;
- {
- CDC *dc = GetDC();
- wglMakeCurrent( dc->m_hDC, m_hRC );
- vector rot;
- rot.Vec(0,0,(mousex-point.x)/5.0f);
- cam.rotate(rot);
- wglMakeCurrent( 0, 0);
- ReleaseDC(dc);
- }
- break;
- case 3:
- {
- CDC *dc = GetDC();
- wglMakeCurrent( dc->m_hDC, m_hRC );
- vector rot;
- rot.Vec((point.y-mousey)/10.0f,-(mousex-point.x)/10.0f,0);
- cam.rotate(rot);
- wglMakeCurrent( 0, 0);
- ReleaseDC(dc);
- disp.Null();
- }
- break;
- default: disp.Null();
- }
- cam.Vp+=disp;
- cam.Lp+=disp;
- float d2=(pDoc->bboxC - cam.Vp).Length();
- nearplane=d2-pDoc->bboxdiag/2;
- farplane=pDoc->bboxdiag/2+d2;
- if (nearplane<pDoc->bboxdiag/1000)
- nearplane=pDoc->bboxdiag/1000;
- mousex=point.x;
- mousey=point.y;
- Invalidate(0);
- }
- CView::OnMouseMove(nFlags, point);
- }
- BOOL CMy3DEditorView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
- {
- // TODO: Add your message handler code here and/or call default
- CMy3DEditorDoc *pDoc=GetDocument();
- if (pDoc->dlgprop)
- ((DlgProperties *)pDoc->dlgprop)->step_slider(zDelta/WHEEL_DELTA);
- return CView::OnMouseWheel(nFlags, zDelta, pt);
- }
- void CMy3DEditorView::OnPan()
- {
- // TODO: Add your command handler code here
- if (cammode==1)
- cammode=0;
- else cammode=1;
- }
- void CMy3DEditorView::OnRButtonDown(UINT nFlags, CPoint point)
- {
- // TODO: Add your message handler code here and/or call default
- CMy3DEditorDoc *pDoc=GetDocument();
- if (cammode==4)
- Select(point,6);
- CView::OnRButtonDown(nFlags, point);
- }
- void CMy3DEditorView::OnSelect()
- {
- // TODO: Add your command handler code here
- cammode=0;
- }
- void CMy3DEditorView::OnTimer(UINT nIDEvent)
- {
- // TODO: Add your message handler code here and/or call default
- DWORD t0=timeGetTime();
- int t=t0-timer;
- if (t>dtimer)
- t=dtimer;
- dtimer-=t;
- timer=t0;
- if (dtimer==0)
- KillTimer(1);
- LookAt(cam.Vp+dvp*(float)t,cam.Lp+dlp*(float)t);
- CView::OnTimer(nIDEvent);
- }
- void CMy3DEditorView::OnUpdateDolly(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetRadio(cammode==2);
- }
- void CMy3DEditorView::OnUpdateLookat(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetRadio(cammode==4);
- }
- void CMy3DEditorView::OnUpdatePan(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetRadio(cammode==1);
- }
- void CMy3DEditorView::OnUpdateSelect(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetRadio(cammode==0);
- }
- LRESULT CMy3DEditorView::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
- {
- // TODO: Add your specialized code here and/or call the base class
- if (message==WM_MBUTTONDOWN)
- {
- CMy3DEditorDoc *pDoc=GetDocument();
- CPoint p(lParam);
- if (cammode==4)
- Select(p,4);
- }
- else if(message==WM_DISPLAYCHANGE)
- {
- if (wParam<=8)
- AfxMessageBox(IDS_DISPLAY_ERROR,MB_OK|MB_ICONEXCLAMATION);
- else
- {
- DestroyOpenGL();
- CreateOpenGL();
- Invalidate(1);
- }
- }
- return CView::WindowProc(message, wParam, lParam);
- }
- void CMy3DEditorView::Select(CPoint point,int mode)
- {
- char str[256];
- CMy3DEditorDoc *pDoc=GetDocument();
- CDC *pDC=GetDC();
- wglMakeCurrent( pDC->m_hDC, m_hRC );
- glShadeModel(GL_FLAT);
- glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
- if (pDoc->backface && mode!=7)
- glEnable(GL_CULL_FACE);
- else
- glDisable(GL_CULL_FACE);
- unsigned int intbuf[500];
- glSelectBuffer( 500,intbuf );
- int viewport[4];
- glGetIntegerv(GL_VIEWPORT,viewport);
- glRenderMode(GL_SELECT);
- glInitNames();
- glMatrixMode( GL_PROJECTION );
- glPushMatrix();
- glLoadIdentity();
- gluPickMatrix(point.x,viewport[3]-point.y,1,1,viewport);
- gluPerspective(cam.theta, aspect, nearplane, farplane );
- glMatrixMode( GL_MODELVIEW );
- object *o=pDoc->obj0;
- int f,counto=0;
- while( o )
- {
- glPushName(counto);
- glPushName(-1);
- for( f=0;f<o->nf;f++ )
- if (o->ft[f])
- {
- glLoadName( f );
- glBegin(GL_TRIANGLES);
- glVertex3fv((float *)&o->ft[f]->lv[0]->pos);
- glVertex3fv((float *)&o->ft[f]->lv[1]->pos);
- glVertex3fv((float *)&o->ft[f]->lv[2]->pos);
- glEnd();
- }
- glPopName();
- glPopName();
- counto++;
- o=o->next;
- }
- glPopMatrix();
- glFlush();
- counto=glRenderMode(GL_RENDER);
- if (counto>0)
- {
- int pos=0,selpos=0;
- unsigned int min=-1;
- for( f=0;f<counto;f++ )
- {
- if (intbuf[pos+1]<min)
- {
- min=intbuf[pos+1];
- selpos=pos;
- }
- pos+=5;
- }
- o=pDoc->obj0;
- for( f=0;f<(int)intbuf[selpos+3];f++ )
- o=o->next;
- f=intbuf[selpos+4];
- if (mode==4 || mode==5 || mode==6)
- {
- RECT rect;
- GetClientRect(&rect);
- float dist;
- double ipdist=0.5*rect.bottom/TanD(0.5*cam.theta),
- angx=atan((point.x-rect.right/2+0.5)/ipdist),
- angy=-atan((point.y-rect.bottom/2+0.5)/ipdist);
- vector Ro,Rd,vp,lp;
- Ro.Vec(-(float)(sin(angx)*cos(angy)),-(float)(sin(angy)*cos(angx)),(float)(cos(angx)*cos(angy)));
- Rd=Ro*cam.mat;
- Rd.Normalize();
- Rd.Negate();
- Ro=cam.Vp;
- o->ft[f]->ray_intersect(Ro,Rd,lp,dist);
- Rd=cam.Vp-lp;
- Ro=o->ft[f]->normal;
- if (VecDot(Rd,Ro)<0)
- Ro.Negate();
- if (mode==5)
- vp=lp+dist*Ro/2;
- else if (mode==6)
- vp=lp+dist*Ro*2;
- else vp=lp+dist*Ro;
- dtimer=1000;
- dvp=(vp-cam.Vp)/(float)dtimer;
- dlp=(lp-cam.Lp)/(float)dtimer;
- timer=timeGetTime();
- SetTimer(1,30,0);
- }
- else if(mode==8)
- {
- if (pDoc->dlgmat==0)
- {
- pDoc->dlgmat=new DlgMaterial;
- ((DlgMaterial *)pDoc->dlgmat)->doc=pDoc;
- pDoc->dlgmat->Create(IDD_MATERIAL);
- CString s;
- s.LoadString(IDS_MATERIAL);
- sprintf(str,s,pDoc->GetTitle());
- pDoc->dlgmat->SetWindowText(str);
- pDoc->dlgmat->ShowWindow(SW_SHOW);
- }
- ((DlgMaterial *)pDoc->dlgmat)->m_names.SelectString( -1, pDoc->matlib[o->ft[f]->material].name );
- ((DlgMaterial *)pDoc->dlgmat)->OnSelchangeName();
- }
- else if (mode==0 || mode==7)
- {
- if (pDoc->dlgprop==0)
- {
- pDoc->dlgprop=new DlgProperties;
- ((DlgProperties *)pDoc->dlgprop)->doc=pDoc;
- pDoc->dlgprop->Create(IDD_PROPERTIES);
- CString s;
- s.LoadString(IDS_DETAIL);
- sprintf(str,s,pDoc->GetTitle());
- pDoc->dlgprop->SetWindowText(str);
- pDoc->dlgprop->ShowWindow(SW_SHOW);
- }
- ((DlgProperties *)pDoc->dlgprop)->m_obj.SelectString( -1, o->name );
- ((DlgProperties *)pDoc->dlgprop)->OnSelchangeObj();
- if (mode==7)
- {
- ((DlgProperties *)pDoc->dlgprop)->m_elem.SetCurSel( o->ft[f]->group+1 );
- ((DlgProperties *)pDoc->dlgprop)->OnSelchangeElem();
- }
- }
- }
- else if (counto==0 && (mode==0 || mode==7))
- {
- if (pDoc->dlgprop!=0)
- {
- ((DlgProperties *)pDoc->dlgprop)->m_obj.SetCurSel( 0 );
- ((DlgProperties *)pDoc->dlgprop)->OnSelchangeObj();
- }
- else
- {
- pDoc->selobj=0;
- pDoc->selface=-1;
- pDoc->UpdateAllViews(0);
- }
- }
- wglMakeCurrent( NULL, NULL );
- }
- void CMy3DEditorView::OnElememtmode()
- {
- // TODO: Add your command handler code here
- if (cammode==7)
- cammode=0;
- else cammode=7;
- }
- void CMy3DEditorView::OnUpdateElememtmode(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetCheck(cammode==7);
- }
- void CMy3DEditorView::OnMaterialmode()
- {
- // TODO: Add your command handler code here
- if (cammode==8)
- cammode=0;
- else cammode=8;
- }
- void CMy3DEditorView::OnUpdateMaterialmode(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetCheck(cammode==8);
- }
- void CMy3DEditorView::OnDolly()
- {
- // TODO: Add your command handler code here
- if (cammode==2)
- cammode=0;
- else cammode=2;
- }
- void CMy3DEditorView::OnTilt()
- {
- // TODO: Add your command handler code here
- if (cammode==3)
- cammode=0;
- else cammode=3;
- }
- void CMy3DEditorView::OnUpdateTilt(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->SetRadio(cammode==3);
- }
- void CMy3DEditorView::OnRaytrace()
- {
- // TODO: Add your command handler code here
- DlgRayTrace d;
- CMy3DEditorDoc *pDoc=GetDocument();
- if (pDoc->dlgprop)
- ((DlgProperties *)(pDoc->dlgprop))->Close();
- if (pDoc->dlgmat)
- ((DlgMaterial *)(pDoc->dlgmat))->Close();
- d.m_ray_depth=AfxGetApp()->GetProfileInt("RayTrace","RayDepth",3);
- d.m_shadows=AfxGetApp()->GetProfileInt("RayTrace","Shadows",1);
- d.m_antialiase=AfxGetApp()->GetProfileInt("RayTrace","AntiAliase",0);
- d.m_antialiase_factor=AfxGetApp()->GetProfileInt("RayTrace","AntiAliaseFactor",0);
- d.view=AfxGetApp()->GetProfileInt("RayTrace","Resolution", 1);
- GetClientRect(&d.rect);
- d.doc=GetDocument();
- d.cam=&cam;
- if (d.view)
- {
- d.m_res_x=d.rect.right;
- d.m_res_y=d.rect.bottom;
- }
- else
- {
- d.m_res_x=AfxGetApp()->GetProfileInt("RayTrace","ResX",320);
- d.m_res_y=AfxGetApp()->GetProfileInt("RayTrace","ResY",240);
- }
- d.DoModal();
- AfxGetApp()->WriteProfileInt("RayTrace","ResX",d.m_res_x);
- AfxGetApp()->WriteProfileInt("RayTrace","ResY",d.m_res_y);
- AfxGetApp()->WriteProfileInt("RayTrace","RayDepth",d.m_ray_depth);
- AfxGetApp()->WriteProfileInt("RayTrace","Shadows",d.m_shadows);
- AfxGetApp()->WriteProfileInt("RayTrace","Resolution",d.view);
- AfxGetApp()->WriteProfileInt("RayTrace","AntiAliase",d.m_antialiase);
- AfxGetApp()->WriteProfileInt("RayTrace","AntiAliaseFactor",d.m_antialiase_factor);
- }
- void CMy3DEditorView::OnUpdateRaytrace(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->Enable(GetDocument()->obj0!=0);
- }
- void CMy3DEditorView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
- {
- // TODO: Add your message handler code here and/or call default
- if (nChar == VK_ESCAPE)
- {
- CMainFrame* pFrame = (CMainFrame*) AfxGetMainWnd();
- if(pFrame->m_bFullScreenMode) pFrame->FullScreenModeOff();
- }
- if (nChar ==115) //"S"
- {
- if (movieCapture != NULL)
- {
- if (isRecording())
- recordPause();
- else
- recordBegin();
- }
- }
- if (nChar ==112) //"P"
- {
- if (movieCapture != NULL)
- recordEnd();
- }
- CView::OnChar(nChar, nRepCnt, nFlags);
- }
- void CMy3DEditorView::OnCaptureImage()
- {
- // TODO: Add your command handler code here
- CString s;
- s.LoadString(IDS_FD_IMAGE);
- CFileDialog fd(FALSE,"jpg",0,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,s);
- CDC *dc=GetDC();
- wglMakeCurrent( dc->m_hDC, m_hRC );
- if(fd.DoModal()==IDOK)
- {
- BeginWaitCursor();
- int viewport[4];
- glGetIntegerv(GL_VIEWPORT,viewport);
- bool success = false;
- DWORD nFileType=0;
- if(strcmp(fd.GetFileExt(),"jpg")==0) nFileType=1;
- if(strcmp(fd.GetFileExt(),"png")==0) nFileType=2;
- if(strcmp(fd.GetFileExt(),"bmp")==0) nFileType=3;
- if (nFileType == 1)
- {
- success = m_imagecapture.CaptureGLBufferToJPEG(fd.GetPathName(),
- viewport[0],viewport[1],
- viewport[2],viewport[3]);
- }
- else if (nFileType == 2)
- {
- success = m_imagecapture.CaptureGLBufferToPNG(fd.GetPathName(),
- viewport[0],viewport[1],
- viewport[2],viewport[3]);
- }
- else if(nFileType==3)
- {
- success=m_imagecapture.CaptureGLBufferToBMP(fd.GetPathName(),
- viewport[0],viewport[1],
- viewport[2],viewport[3]);
- }
- else
- {
- // Invalid file extension specified.
- MessageBox("WTF? Unknown file extension specified for screen capture.n","Error",MB_OK);
- }
- if (!success)
- {
- char errorMsg[64];
- if(nFileType == 0)
- sprintf(errorMsg, "Specified file extension is not recognized.");
- else
- sprintf(errorMsg, "Could not save image file.");
- MessageBox(errorMsg, "Error", MB_OK | MB_ICONERROR);
- }
- EndWaitCursor();
- }
- wglMakeCurrent( 0, 0 );
- ReleaseDC(dc);
- }
- void CMy3DEditorView::OnCaptureMovie()
- {
- // TODO: Add your command handler code here
- CString s;
- s.LoadString(IDS_FD_MOVIE);
- CFileDialog fd(FALSE,"avi",0,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY|OFN_PATHMUSTEXIST,s);
- CDC *dc=GetDC();
- wglMakeCurrent( dc->m_hDC, m_hRC );
- if(fd.DoModal()==IDOK)
- {
- BeginWaitCursor();
- DWORD nFileType=0;
- if(strcmp(fd.GetFileExt(),"avi")==0) nFileType=1;
- if(m_DlgCaptureMovie.DoModal()==IDOK)
- {
- if(m_DlgCaptureMovie.Index_area==0)
- {
- MovieSize_X=160;
- MovieSize_Y=120;
- }
- if(m_DlgCaptureMovie.Index_area==1)
- {
- MovieSize_X=320;
- MovieSize_Y=240;
- }
- if(m_DlgCaptureMovie.Index_area==2)
- {
- MovieSize_X=640;
- MovieSize_Y=480;
- }
- if(m_DlgCaptureMovie.Index_area==3)
- {
- MovieSize_X=720;
- MovieSize_Y=480;
- }
- if(m_DlgCaptureMovie.Index_framerate==0)
- {
- MovieFramerate=15.0;
- }
- if(m_DlgCaptureMovie.Index_framerate==1)
- {
- MovieFramerate=24.0;
- }
- if(m_DlgCaptureMovie.Index_framerate==2)
- {
- MovieFramerate=25.0;
- }
- if(m_DlgCaptureMovie.Index_framerate==3)
- {
- MovieFramerate=29.97;
- }
- if(m_DlgCaptureMovie.Index_framerate==4)
- {
- MovieFramerate=30.0;
- }
- }
- bool success = false;
- if (nFileType == 1)
- {
- success = BeginMovieCapture(fd.GetPathName(),
- MovieSize_X,
- MovieSize_Y,
- MovieFramerate);
- }
- else
- {
- // Invalid file extension specified.
- MessageBox("WTF? Unknown file extension specified for screen capture.n","Error",MB_OK);
- }
- if (!success)
- {
- char errorMsg[64];
- if(nFileType == 0)
- sprintf(errorMsg, "Specified file extension is not recognized.");
- else
- sprintf(errorMsg, "Could not capture movie.");
- MessageBox(errorMsg, "Error", MB_OK | MB_ICONERROR);
- }
- EndWaitCursor();
- }
- wglMakeCurrent( 0, 0 );
- ReleaseDC(dc);
- }
- bool CMy3DEditorView::BeginMovieCapture(CString filename,
- int width, int height,
- float framerate)
- {
- movieCapture = new AVICapture();
- bool success = movieCapture->start(filename, width, height, framerate);
- if (success)
- initMovieCapture(movieCapture);
- else
- delete movieCapture;
- return success;
- }
- void CMy3DEditorView::initMovieCapture(AVICapture* mc)
- {
- if (movieCapture == NULL)
- movieCapture = mc;
- }
- void CMy3DEditorView::recordBegin()
- {
- if (movieCapture != NULL)
- recording = true;
- }
- void CMy3DEditorView::recordPause()
- {
- recording = false;
- }
- void CMy3DEditorView::recordEnd()
- {
- if (movieCapture != NULL)
- {
- recordPause();
- movieCapture->end();
- delete movieCapture;
- movieCapture = NULL;
- }
- }
- bool CMy3DEditorView::isRecording()
- {
- return recording;
- }
- void CMy3DEditorView::OnUpdateCaptureMovie(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->Enable(movieCapture == NULL);
- }
- void CMy3DEditorView::OnCaptureRecord()
- {
- // TODO: Add your command handler code here
- recordBegin();
- }
- void CMy3DEditorView::OnUpdateCaptureRecord(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->Enable(movieCapture != NULL);
- pCmdUI->SetCheck(recording==true);
- }
- void CMy3DEditorView::OnCapturePause()
- {
- // TODO: Add your command handler code here
- recording=!recording;
- }
- void CMy3DEditorView::OnUpdateCapturePause(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->Enable(movieCapture != NULL);
- pCmdUI->SetCheck(recording==false);
- }
- void CMy3DEditorView::OnCaptureStop()
- {
- // TODO: Add your command handler code here
- recordEnd();
- }
- void CMy3DEditorView::OnUpdateCaptureStop(CCmdUI* pCmdUI)
- {
- // TODO: Add your command update UI handler code here
- pCmdUI->Enable(recording != false);
- }
- BOOL CMy3DEditorView::OnEraseBkgnd(CDC* pDC)
- {
- // TODO: Add your message handler code here and/or call default
- // 禁止Windows刷新窗口背景,直接返回
- // return CView::OnEraseBkgnd(pDC);
- return true;
- }