summaryrefslogtreecommitdiffhomepage
path: root/Magic2/MagicView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Magic2/MagicView.cpp')
-rw-r--r--Magic2/MagicView.cpp2898
1 files changed, 1461 insertions, 1437 deletions
diff --git a/Magic2/MagicView.cpp b/Magic2/MagicView.cpp
index 294c794..e29e5d3 100644
--- a/Magic2/MagicView.cpp
+++ b/Magic2/MagicView.cpp
@@ -1,1437 +1,1461 @@
-/* Project Magic 2.0
- Destroyer Studios LLC
- Copyright © 1997-2004. All Rights Reserved.
-
- SUBSYSTEM: Magic.exe
- FILE: MagicView.cpp
- AUTHOR: John DiCamillo
-
-
- OVERVIEW
- ========
- Implementation of the MagicView class
-*/
-
-#include "stdafx.h"
-#include "Magic.h"
-
-#include "MagicDoc.h"
-#include "MagicView.h"
-#include "MainFrm.h"
-#include "MaterialDialog.h"
-#include "SurfacePropertiesDialog.h"
-#include "TextureMapDialog.h"
-#include "Editor.h"
-#include "Grid.h"
-#include "GridProps.h"
-#include "Selection.h"
-#include "Selector.h"
-#include "UVMapView.h"
-
-#include "ActiveWindow.h"
-#include "Color.h"
-#include "Layout.h"
-#include "Light.h"
-#include "Scene.h"
-#include "Screen.h"
-#include "Shadow.h"
-#include "Solid.h"
-#include "Video.h"
-#include "VideoDX9.h"
-#include "VideoSettings.h"
-
-#include "ModelView.h"
-
-DWORD GetRealTime();
-
-#ifdef _DEBUG
-#define new DEBUG_NEW
-#undef THIS_FILE
-static char THIS_FILE[] = __FILE__;
-#endif
-
-extern PALETTEENTRY standard_palette[256];
-extern BYTE inverse_palette[32768];
-
-// +--------------------------------------------------------------------+
-
-IMPLEMENT_DYNCREATE(MagicView, CView)
-
-BEGIN_MESSAGE_MAP(MagicView, CView)
- //{{AFX_MSG_MAP(MagicView)
- ON_WM_SIZE()
- ON_COMMAND(ID_VIEW_RENDER, OnRender)
- ON_WM_PAINT()
- ON_COMMAND(ID_VIEW_ALL, OnViewAll)
- ON_UPDATE_COMMAND_UI(ID_VIEW_ALL, OnUpdateViewAll)
- ON_COMMAND(ID_VIEW_FRONT, OnViewFront)
- ON_UPDATE_COMMAND_UI(ID_VIEW_FRONT, OnUpdateViewFront)
- ON_COMMAND(ID_VIEW_PERSPECTIVE, OnViewPerspective)
- ON_UPDATE_COMMAND_UI(ID_VIEW_PERSPECTIVE, OnUpdateViewPerspective)
- ON_COMMAND(ID_VIEW_SIDE, OnViewSide)
- ON_UPDATE_COMMAND_UI(ID_VIEW_SIDE, OnUpdateViewSide)
- ON_COMMAND(ID_VIEW_TOP, OnViewTop)
- ON_UPDATE_COMMAND_UI(ID_VIEW_TOP, OnUpdateViewTop)
- ON_COMMAND(ID_MODIFY_TEXTURE_MAP, OnTextureMap)
- ON_COMMAND(ID_MODIFY_MATERIAL, OnModifyMaterial)
- ON_WM_LBUTTONDOWN()
- ON_WM_LBUTTONUP()
- ON_WM_LBUTTONDBLCLK()
- ON_WM_RBUTTONDOWN()
- ON_WM_RBUTTONUP()
- ON_WM_MOUSEMOVE()
- ON_WM_MOUSEWHEEL()
- ON_COMMAND(ID_VIEW_ZOOM_NORMAL, OnViewZoomNormal)
- ON_COMMAND(ID_VIEW_ZOOM_IN, OnViewZoomIn)
- ON_COMMAND(ID_VIEW_ZOOM_OUT, OnViewZoomOut)
- ON_COMMAND(ID_VIEW_MODE_WIREFRAME, OnViewModeWireframe)
- ON_COMMAND(ID_VIEW_MODE_SOLID, OnViewModeSolid)
- ON_COMMAND(ID_VIEW_MODE_TEXTURED, OnViewModeTextured)
- ON_WM_RBUTTONDBLCLK()
- ON_COMMAND(ID_PROP_GRID, OnGridProperties)
- ON_COMMAND(ID_GRID_SHOW, OnGridShow)
- ON_COMMAND(ID_GRID_SNAP, OnGridSnap)
- ON_UPDATE_COMMAND_UI(ID_GRID_SNAP, OnUpdateGridSnap)
- ON_COMMAND(ID_VIEW_BACK_COLOR, OnViewBackColor)
- ON_COMMAND(ID_FILE_IMPORT, OnFileImport)
- ON_COMMAND(ID_FILE_EXPORT, OnFileExport)
- ON_COMMAND(ID_EDIT_SELECT_ALL, OnSelectAll)
- ON_COMMAND(ID_EDIT_SELECT_NONE, OnSelectNone)
- ON_UPDATE_COMMAND_UI(ID_MODIFY_TEXTURE_MAP, OnUpdateTextureMap)
- ON_UPDATE_COMMAND_UI(ID_MODIFY_MATERIAL, OnUpdateModifyMaterial)
- ON_COMMAND(ID_EDIT_SELECT_INVERSE, OnSelectInverse)
- ON_COMMAND(ID_MODIFY_UV_MAP, OnModifyUVMap)
- ON_UPDATE_COMMAND_UI(ID_MODIFY_UV_MAP, OnUpdateModifyUVMap)
- ON_COMMAND(ID_VIEW_SHADOWS, OnViewShadows)
- ON_UPDATE_COMMAND_UI(ID_VIEW_SHADOWS, OnUpdateViewShadows)
- ON_COMMAND(ID_VIEW_ANIMATELIGHT, OnViewAnimatelight)
- ON_UPDATE_COMMAND_UI(ID_VIEW_ANIMATELIGHT, OnUpdateViewAnimatelight)
- ON_COMMAND(ID_VIEW_BUMPMAPS, OnViewBumpmaps)
- ON_UPDATE_COMMAND_UI(ID_VIEW_BUMPMAPS, OnUpdateViewBumpmaps)
- ON_COMMAND(ID_VIEW_VERTEXSHADER, OnViewVertexshader)
- ON_UPDATE_COMMAND_UI(ID_VIEW_VERTEXSHADER, OnUpdateViewVertexshader)
- ON_COMMAND(ID_VIEW_PIXELSHADER, OnViewPixelshader)
- ON_UPDATE_COMMAND_UI(ID_VIEW_PIXELSHADER, OnUpdateViewPixelshader)
- ON_COMMAND(ID_VIEW_VISIBLESHADOWS, OnViewVisibleshadows)
- ON_UPDATE_COMMAND_UI(ID_VIEW_VISIBLESHADOWS, OnUpdateViewVisibleshadows)
- ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
- ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
- ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
- ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
- ON_COMMAND(ID_PROP_SURFACE, OnSurfaceProperties)
- ON_UPDATE_COMMAND_UI(ID_PROP_SURFACE, OnUpdateSurfaceProperties)
- //}}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()
-
-// +--------------------------------------------------------------------+
-
-static MagicView* magic_view = 0;
-
-MagicView::MagicView()
- : video(0), video_settings(0), screen(0), scene(0),
- drag_left(false), drag_right(false), grid(0),
- main_light(0), back_light(0), view_shadows(true), view_bumpmaps(true),
- animate_light(false)
-{
- window_style = 0;
- is_minimized = false;
- is_maximized = false;
- is_sizing = false;
- view_mode = VIEW_ALL;
-
- main_win = 0;
- view_win[0] = 0;
- view_win[1] = 0;
- view_win[2] = 0;
- view_win[3] = 0;
- model_view[0] = 0;
- model_view[1] = 0;
- model_view[2] = 0;
- model_view[3] = 0;
- uvmap_win = 0;
-
- grid = new Grid;
- magic_view = this;
-
- Solid::EnableCollision(false);
-}
-
-MagicView::~MagicView()
-{
- if (grid) {
- delete grid;
- }
-
- if (scene) {
- scene->Graphics().clear();
- delete scene;
- }
-
- if (screen) delete screen;
- if (video) delete video;
- if (video_settings) delete video_settings;
-
- if (magic_view == this)
- magic_view = 0;
-}
-
-MagicView* MagicView::GetInstance()
-{
- return magic_view;
-}
-
-BOOL MagicView::PreCreateWindow(CREATESTRUCT& cs)
-{
- return CView::PreCreateWindow(cs);
-}
-
-// +--------------------------------------------------------------------+
-//
-// MagicView diagnostics
-
-#ifdef _DEBUG
-void MagicView::AssertValid() const
-{
- CView::AssertValid();
-}
-
-void MagicView::Dump(CDumpContext& dc) const
-{
- CView::Dump(dc);
-}
-
-MagicDoc* MagicView::GetDocument() // non-debug version is inline
-{
- ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(MagicDoc)));
- return (MagicDoc*)m_pDocument;
-}
-#endif //_DEBUG
-
-
-// +--------------------------------------------------------------------+
-
-void MagicView::OnInitialUpdate()
-{
- CView::OnInitialUpdate();
- Color::SetPalette(standard_palette, 256, inverse_palette);
-
- if (!video_settings)
- video_settings = new VideoSettings;
-
- GetClientRect(&client_rect);
-
- // Use client area to set video window size
- int w = client_rect.right - client_rect.left;
- int h = client_rect.bottom - client_rect.top;
-
- video_settings->is_windowed = true;
- video_settings->window_width = w;
- video_settings->window_height = h;
-
- if (!video) {
- video = new VideoDX9(GetSafeHwnd(), video_settings);
- *video_settings = *video->GetVideoSettings();
-
- if (video) {
- Color::UseVideo(video);
- video->UseXFont("System", 12, false, false);
-
- screen = new Screen(video);
- if (!screen) {
- ::Print("ERROR: Could not create Screen object.\n");
- return;
- }
-
- ::Print(" Created screen object (%d x %d).\n", w, h);
-
- if (!screen->SetBackgroundColor(Color::Black))
- ::Print(" WARNING: could not set video background color to Black\n");
-
- screen->ClearAllFrames(true);
-
- ::Print(" Established requested video parameters.\n");
- ::Print(" ---------------------------------------\n\n");
-
- if (!scene) {
- scene = new Scene;
-
- scene->SetAmbient(Color(60,60,60));
-
- Point light_pos(3e6, 5e6, 4e6);
-
- main_light = new Light(1.0f); //1.25f);
- main_light->MoveTo(light_pos);
- main_light->SetType(Light::LIGHT_DIRECTIONAL);
- main_light->SetColor(Color::White);
- main_light->SetShadow(true);
-
- scene->AddLight(main_light);
-
- back_light = new Light(0.5f);
- back_light->MoveTo(light_pos * -1);
- back_light->SetType(Light::LIGHT_DIRECTIONAL);
- back_light->SetColor(Color::White);
-
- scene->AddLight(back_light);
-
- Selection* seln = GetDocument()->GetSelection();
- Selector* selector = GetDocument()->GetSelector();
-
- if (seln && selector) {
- scene->Graphics().clear();
- scene->AddGraphic(seln);
- scene->AddGraphic(selector);
-
- selector->UseModel(0);
- }
- }
-
- int mins[2] = { 0, 0 };
- float weights[2] = { 1, 1 };
-
- main_win = new ActiveWindow(screen, 0, 0, w, h, 100, 0);
- main_win->UseLayout(2, 2, mins, mins, weights, weights);
- main_win->SetBackColor(Color::Gray);
-
- screen->AddWindow(main_win);
-
- DWORD view_types[] = {
- ModelView::VIEW_PLAN,
- ModelView::VIEW_PROJECT,
- ModelView::VIEW_SIDE,
- ModelView::VIEW_FRONT
- };
-
- for (int row = 0; row < 2; row++) {
- for (int col = 0; col < 2; col++) {
- int index = 2*row + col;
-
- ActiveWindow* win = new ActiveWindow(screen,
- col*w/2,
- row*h/2,
- w/2,
- h/2,
- 101+index,
- WIN_BLACK_FRAME,
- main_win);
-
- win->SetCells(col, row, 1, 1);
- win->SetCellInsets(Insets(1,1,1,1));
- win->SetBackColor(Color(160,160,160));
-
- ModelView* mv = new ModelView(win, scene, view_types[index]);
-
- if (view_types[index] == ModelView::VIEW_PROJECT)
- mv->SetFillMode(ModelView::FILL_TEXTURE);
-
- mv->UseGrid(grid);
- win->AddView(mv);
-
- view_win[index] = win;
- model_view[index] = mv;
- }
- }
-
- view_win[0]->SetStyle(WIN_WHITE_FRAME);
-
- uvmap_win = new ActiveWindow(screen, 0, 0, w, h, 110, WIN_BLACK_FRAME, main_win);
- uvmap_view = new UVMapView(uvmap_win);
- uvmap_win->AddView(uvmap_view);
-
- main_win->DoLayout();
- }
-
- else {
- ::Print(" Could not establish requested video parameters.\n");
- ::Print(" -----------------------------------------------\n\n");
- }
- }
-}
-
-// +--------------------------------------------------------------------+
-
-void
-MagicView::SetupModelViews()
-{
- switch (view_mode) {
- case VIEW_ALL: {
- for (int row = 0; row < 2; row++) {
- for (int col = 0; col < 2; col++) {
- int index = 2*row + col;
-
- ActiveWindow* win = view_win[index];
-
- win->Show();
- win->SetCells(col, row, 1, 1);
- win->SetCellInsets(Insets(1,1,1,1));
- }
- }
-
- uvmap_win->Hide();
- uvmap_win->SetCells(0,0,0,0);
- }
- break;
-
- case VIEW_TOP:
- case VIEW_SIDE:
- case VIEW_FRONT:
- case VIEW_PERSPECTIVE: {
- view_focus = view_mode;
-
- for (int i = 0; i < 4; i++) {
- ActiveWindow* win = view_win[i];
-
- if (i == view_mode) {
- win->Show();
- win->SetCells(0,0,2,2);
- win->SetStyle(WIN_WHITE_FRAME);
- }
-
- else {
- win->Hide();
- win->SetCells(0,0,0,0);
- win->SetStyle(WIN_BLACK_FRAME);
- }
- }
-
- uvmap_win->Hide();
- uvmap_win->SetCells(0,0,0,0);
- }
- break;
-
- case VIEW_UV_MAP: {
- view_focus = view_mode;
-
- for (int i = 0; i < 4; i++) {
- ActiveWindow* win = view_win[i];
- win->Hide();
- win->SetCells(0,0,0,0);
- win->SetStyle(WIN_BLACK_FRAME);
- }
-
- uvmap_win->Show();
- uvmap_win->SetCells(0,0,2,2);
- }
- break;
-
- default:
- break;
- }
-
- main_win->DoLayout();
-}
-
-void
-MagicView::SetFocusModelView(int f)
-{
- if (view_mode == VIEW_ALL) {
- view_focus = f;
-
- for (int row = 0; row < 2; row++) {
- for (int col = 0; col < 2; col++) {
- int index = 2*row + col;
-
- ActiveWindow* win = view_win[index];
-
- win->Show();
- win->SetCells(col, row, 1, 1);
- win->SetCellInsets(Insets(1,1,1,1));
-
- if (index == view_focus) {
- win->SetStyle(WIN_WHITE_FRAME);
- }
- else {
- win->SetStyle(WIN_BLACK_FRAME);
- }
- }
- }
- }
- else if (IsUVEdit()) {
- view_focus = view_mode;
- }
- else {
- view_mode = f;
- view_focus = f;
-
- for (int i = 0; i < 4; i++) {
- ActiveWindow* win = view_win[i];
-
- if (i == view_mode) {
- win->Show();
- win->SetCells(0,0,2,2);
- win->SetStyle(WIN_WHITE_FRAME);
- }
-
- else {
- win->Hide();
- win->SetCells(0,0,0,0);
- win->SetStyle(WIN_BLACK_FRAME);
- }
- }
- }
-
- main_win->DoLayout();
-}
-
-int
-MagicView::GetWinIndexByPoint(int x, int y)
-{
- if (view_mode == VIEW_ALL) {
- for (int row = 0; row < 2; row++) {
- for (int col = 0; col < 2; col++) {
- int index = 2*row + col;
-
- ActiveWindow* win = view_win[index];
- if (win->GetRect().Contains(x, y))
- return index;
- }
- }
- }
-
- return view_mode;
-}
-
-ModelView*
-MagicView::GetModelViewByIndex(int index)
-{
- if (index >= 0 && index < 4) {
- return model_view[index];
- }
-
- return model_view[0];
-}
-
-// +--------------------------------------------------------------------+
-
-void MagicView::OnPaint()
-{
- ValidateRect(0);
- OnRender();
-}
-
-void MagicView::OnDraw(CDC* dc)
-{
-}
-
-// +--------------------------------------------------------------------+
-
-void MagicView::ResizeVideo()
-{
- if (!video || !video_settings) return;
-
- HRESULT hr = S_OK;
- RECT client_old;
-
- client_old = client_rect;
-
- // Update window properties
- GetClientRect(&client_rect);
-
- if (client_old.right - client_old.left !=
- client_rect.right - client_rect.left ||
- client_old.bottom - client_old.top !=
- client_rect.bottom - client_rect.top) {
-
- // A new window size will require a new backbuffer
- // size, so the 3D structures must be changed accordingly.
-
- video_settings->is_windowed = true;
- video_settings->window_width = client_rect.right - client_rect.left;
- video_settings->window_height = client_rect.bottom - client_rect.top;
-
- ::Print("ResizeVideo() %d x %d\n", video_settings->window_width, video_settings->window_height);
-
- if (video) {
- video->Reset(video_settings);
- }
- }
-
- // save a copy of the device-specific video settings:
- if (video->GetVideoSettings()) {
- *video_settings = *video->GetVideoSettings();
- }
-
- if (screen)
- screen->Resize(video_settings->window_width,
- video_settings->window_height);
-
- video->InvalidateCache();
- video->SetShadowEnabled(view_shadows);
- video->SetBumpMapEnabled(view_bumpmaps);
-}
-
-// +--------------------------------------------------------------------+
-
-void MagicView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
-{
- CView::OnUpdate(pSender, lHint, pHint);
-
- Solid* solid = GetDocument()->GetSolid();
- Selection* seln = GetDocument()->GetSelection();
- Selector* selector = GetDocument()->GetSelector();
-
- if (solid && scene) {
- scene->Graphics().clear();
- scene->AddGraphic(solid);
- scene->AddGraphic(seln);
- scene->AddGraphic(selector);
- }
-
- if (selector)
- selector->UseModel(solid->GetModel());
-}
-
-CPoint
-MagicView::LPtoWP(const CPoint& p)
-{
- CPoint result;
- ModelView* view = GetModelViewByIndex(view_focus);
- CPoint origin = view->ProjectPoint(Vec3(0,0,0));
- double scale = view->GetFieldOfView() / 2;
-
- result.x = (LONG) (( p.x - origin.x) / scale);
- result.y = (LONG) ((-p.y + origin.y) / scale);
-
- return result;
-}
-
-// +--------------------------------------------------------------------+
-//
-// MagicView message handlers
-
-void MagicView::OnEnterSizeMove()
-{
- is_sizing = true;
-}
-
-void MagicView::OnExitSizeMove()
-{
- is_sizing = false;
- ResizeVideo();
-}
-
-void MagicView::OnSize(UINT nType, int cx, int cy)
-{
- CView::OnSize(nType, cx, cy);
-
- window_style = GetWindowLong(m_hWnd, GWL_STYLE);
-
- if (nType == SIZE_MINIMIZED) {
- is_minimized = true;
- is_maximized = false;
- }
-
- else if (nType == SIZE_MAXIMIZED) {
- is_minimized = false;
- is_maximized = true;
- ResizeVideo();
- }
-
- else if (nType == SIZE_RESTORED) {
- if (is_maximized) {
- is_maximized = false;
- ResizeVideo();
- }
-
- else if (is_minimized) {
- is_minimized = false;
- ResizeVideo();
- }
- else if (!is_sizing) {
- // if this is not a resize due to dragging...
- ResizeVideo();
- }
- else {
- // If we're neither maximized nor minimized, the window size
- // is changing by the user dragging the window edges. In this
- // case, we don't reset the device yet -- we wait until the
- // user stops dragging, and a WM_EXITSIZEMOVE message comes.
- }
- }
-}
-
-// +--------------------------------------------------------------------+
-
-void MagicView::OnRender()
-{
- if (!screen || !video)
- return;
-
- double s = sin(timeGetTime() * 0.001);
- double c = cos(timeGetTime() * 0.001);
-
- // IF LIGHTS ANIMATED:
- if (animate_light) {
- Point light_pos(3e6*s, 5e6*c, 4e6*s);
-
- if (main_light) {
- main_light->SetType(Light::LIGHT_POINT);
- main_light->MoveTo(light_pos);
- main_light->SetType(Light::LIGHT_DIRECTIONAL);
- }
-
- if (back_light) {
- back_light->SetType(Light::LIGHT_POINT);
- back_light->MoveTo(light_pos * -1);
- back_light->SetType(Light::LIGHT_DIRECTIONAL);
- }
- }
-
- if (screen->Refresh()) {
- video->Present();
- }
- else {
- ::Print("ERROR: Screen refresh failed.\n");
- }
-}
-
-void MagicView::CloseUVEditor()
-{
- if (IsUVEdit()) {
- MagicDoc* doc = GetDocument();
- Editor* editor = doc->GetEditor();
- Solid* solid = doc->GetSolid();
-
- if (editor && solid) {
- editor->UseModel(solid->GetModel());
- editor->Resegment();
- }
- }
-}
-
-// +--------------------------------------------------------------------+
-
-void MagicView::OnViewAll()
-{
- CloseUVEditor();
- view_mode = VIEW_ALL;
- SetupModelViews();
-}
-
-void MagicView::OnUpdateViewAll(CCmdUI* pCmdUI)
-{
- if (pCmdUI)
- pCmdUI->SetCheck(view_mode == VIEW_ALL);
-}
-
-void MagicView::OnViewFront()
-{
- CloseUVEditor();
- view_mode = VIEW_FRONT;
- SetupModelViews();
-}
-
-void MagicView::OnUpdateViewFront(CCmdUI* pCmdUI)
-{
- if (pCmdUI)
- pCmdUI->SetCheck(view_mode == VIEW_FRONT);
-}
-
-void MagicView::OnViewPerspective()
-{
- CloseUVEditor();
- view_mode = VIEW_PERSPECTIVE;
- SetupModelViews();
-}
-
-void MagicView::OnUpdateViewPerspective(CCmdUI* pCmdUI)
-{
- if (pCmdUI)
- pCmdUI->SetCheck(view_mode == VIEW_PERSPECTIVE);
-}
-
-void MagicView::OnViewSide()
-{
- CloseUVEditor();
- view_mode = VIEW_SIDE;
- SetupModelViews();
-}
-
-void MagicView::OnUpdateViewSide(CCmdUI* pCmdUI)
-{
- if (pCmdUI)
- pCmdUI->SetCheck(view_mode == VIEW_SIDE);
-}
-
-void MagicView::OnViewTop()
-{
- CloseUVEditor();
- view_mode = VIEW_TOP;
- SetupModelViews();
-}
-
-void MagicView::OnUpdateViewTop(CCmdUI* pCmdUI)
-{
- if (pCmdUI)
- pCmdUI->SetCheck(view_mode == VIEW_TOP);
-}
-
-// +--------------------------------------------------------------------+
-
-void MagicView::OnFileImport()
-{
- DWORD err = 0;
- char filename[256];
- filename[0] = '\0';
- CFileDialog ofd(TRUE, "mag");
-
- ofd.m_ofn.lpstrFilter = "All 3D Files\0*.mag; *.obj; *.3ds\0Magic Files (*.mag)\0*.mag\0Wavefront/OBJ Files (*.obj)\0*.obj\0003DS MAX Files (*.3ds)\0*.3ds\0\0";
- ofd.m_ofn.lpstrFile = filename;
- ofd.m_ofn.nMaxFile = sizeof(filename);
-
- if (ofd.DoModal() != IDOK)
- return;
-
- char mag_name[256];
- sprintf_s(mag_name, "%s", ofd.GetFileName().GetBuffer(0));
-
- MagicDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
-
- if (pDoc->ImportFile(mag_name)) {
- Invalidate();
- pDoc->SetModifiedFlag(TRUE);
- pDoc->UpdateAllViews(this);
- }
-}
-
-void MagicView::OnFileExport()
-{
- DWORD err = 0;
- char filename[256];
- filename[0] = '\0';
- CFileDialog ofd(FALSE, "mag");
-
- ofd.m_ofn.lpstrFilter = "All 3D Files\0*.mag; *.obj; *.3ds\0Magic Files (*.mag)\0*.mag\0Wavefront/OBJ Files (*.obj)\0*.obj\0003DS MAX Files (*.3ds)\0*.3ds\0\0";
- ofd.m_ofn.lpstrFile = filename;
- ofd.m_ofn.nMaxFile = sizeof(filename);
-
- if (ofd.DoModal() != IDOK)
- return;
-
- char mag_name[256];
- sprintf_s(mag_name, "%s", ofd.GetFileName().GetBuffer(0));
-
- MagicDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
-
- if (pDoc->ExportFile(mag_name)) {
- pDoc->SetModifiedFlag(FALSE);
- pDoc->UpdateAllViews(this);
- }
-}
-
-// +--------------------------------------------------------------------+
-
-void MagicView::OnSurfaceProperties()
-{
- SurfacePropertiesDialog dlg(this);
- dlg.DoModal();
-}
-
-void MagicView::OnUpdateSurfaceProperties(CCmdUI* pCmdUI)
-{
- Solid* solid = GetDocument()->GetSolid();
- pCmdUI->Enable(solid && solid->GetModel());
-}
-
-// +--------------------------------------------------------------------+
-
-void MagicView::OnTextureMap()
-{
- TextureMapDialog dlg(this);
- if (dlg.DoModal() == IDOK) {
- MagicDoc* doc = GetDocument();
- Solid* solid = doc->GetSolid();
- Selection* seln = doc->GetSelection();
- Selector* selector = doc->GetSelector();
- Editor* editor = doc->GetEditor();
- Material* mtl = 0;
-
- if (dlg.mMaterialIndex >= 0) {
- mtl = solid->GetModel()->GetMaterials()[dlg.mMaterialIndex];
- }
-
- editor->UseModel(solid->GetModel());
- editor->ApplyMaterial(mtl, seln->GetPolys(),
- dlg.mMapType, 2-dlg.mAxis, (float) dlg.mScaleU, (float) dlg.mScaleV,
- dlg.mFlip, dlg.mMirror, dlg.mRotate);
-
- selector->Reselect();
-
- Invalidate();
- doc->SetModifiedFlag(TRUE);
- doc->UpdateAllViews(this);
- }
-}
-
-void MagicView::OnUpdateTextureMap(CCmdUI* pCmdUI)
-{
- Solid* solid = GetDocument()->GetSolid();
- Selection* seln = GetDocument()->GetSelection();
-
- pCmdUI->Enable(solid && solid->GetModel() && seln && seln->GetPolys().size() > 0);
-}
-
-void MagicView::OnModifyMaterial()
-{
- MaterialDialog dlg(this);
- dlg.DoModal();
-
- Invalidate();
- GetDocument()->SetModifiedFlag(TRUE);
- GetDocument()->UpdateAllViews(this);
-}
-
-void MagicView::OnUpdateModifyMaterial(CCmdUI* pCmdUI)
-{
- Solid* solid = GetDocument()->GetSolid();
- pCmdUI->Enable(solid && solid->GetModel());
-}
-
-void MagicView::OnModifyUVMap()
-{
- Selection* seln = GetDocument()->GetSelection();
-
- view_mode = VIEW_UV_MAP;
- SetupModelViews();
-
- if (seln && uvmap_view) {
- Poly* p = seln->GetPolys().first();
-
- if (p) {
- uvmap_view->UseMaterial(p->material);
- uvmap_view->UsePolys(seln->GetPolys());
- }
- }
-}
-
-void MagicView::OnUpdateModifyUVMap(CCmdUI* pCmdUI)
-{
- OnUpdateTextureMap(pCmdUI);
-}
-
-// +--------------------------------------------------------------------+
-
-void MagicView::OnGridProperties()
-{
- GridProps dlg(grid, this);
- dlg.DoModal();
-}
-
-void MagicView::OnGridShow()
-{
- if (grid)
- grid->SetShow(!grid->IsShow());
-}
-
-void MagicView::OnGridSnap()
-{
- if (grid)
- grid->SetSnap(!grid->IsSnap());
-}
-
-void MagicView::OnUpdateGridSnap(CCmdUI* pCmdUI)
-{
- if (grid)
- pCmdUI->SetCheck(grid->IsSnap());
-}
-
-// +--------------------------------------------------------------------+
-
-void MagicView::OnLButtonDown(UINT nFlags, CPoint point)
-{
- CView::OnLButtonDown(nFlags, point);
- SetCapture();
-
- // set focus to the view that was clicked:
- int index = GetWinIndexByPoint(point.x, point.y);
- SetFocusModelView(index);
-
- drag_start = point;
- drag_left = true;
- drag_right = false;
-
- ModelView* mv = GetModelViewByIndex(index);
- MagicDoc* pDoc = GetDocument();
- Model* model = pDoc->GetSolid()->GetModel();
- Selector* selector = pDoc->GetSelector();
-
- if (IsUVEdit()) {
- int select_mode = UVMapView::SELECT_APPEND;
-
- if (nFlags & MK_CONTROL)
- select_mode = UVMapView::SELECT_REMOVE;
-
- if (!uvmap_view->WillSelect(point)) {
- uvmap_view->Begin(select_mode);
- uvmap_view->AddMark(point);
- }
- }
-
- else if (mv && selector) {
- int select_mode = Selector::SELECT_APPEND;
-
- if (nFlags & MK_CONTROL)
- select_mode = Selector::SELECT_REMOVE;
-
- selector->Begin(model, mv->GetViewMode(), select_mode);
- selector->AddMark(point);
- }
-}
-
-void MagicView::OnLButtonUp(UINT nFlags, CPoint point)
-{
- CView::OnLButtonUp(nFlags, point);
- ReleaseCapture();
-
- drag_left = false;
-
- MagicDoc* pDoc = GetDocument();
- Selector* selector = pDoc->GetSelector();
-
- if (IsUVEdit())
- uvmap_view->End();
-
- else if (selector && selector->IsActive())
- selector->End();
-}
-
-void MagicView::OnLButtonDblClk(UINT nFlags, CPoint point)
-{
- CView::OnLButtonDblClk(nFlags, point);
-
- drag_left = false;
-
- MagicDoc* pDoc = GetDocument();
- Selector* selector = pDoc->GetSelector();
-
- if (IsUVEdit())
- uvmap_view->Clear();
-
- else if (selector)
- selector->Clear();
-}
-
-void MagicView::OnRButtonDown(UINT nFlags, CPoint point)
-{
- CView::OnRButtonDown(nFlags, point);
- SetCapture();
-
- // set focus to the view that was clicked:
- int index = GetWinIndexByPoint(point.x, point.y);
- SetFocusModelView(index);
-
- drag_start = point;
- drag_left = false;
- drag_right = true;
-}
-
-void MagicView::OnRButtonUp(UINT nFlags, CPoint point)
-{
- CView::OnRButtonUp(nFlags, point);
- ReleaseCapture();
-
- drag_right = false;
-}
-
-void MagicView::OnRButtonDblClk(UINT nFlags, CPoint point)
-{
- CView::OnRButtonDblClk(nFlags, point);
- ReleaseCapture();
-
- drag_right = false;
-
- if (view_mode == VIEW_ALL) {
- view_mode = view_focus;
- }
- else if (IsUVEdit()) {
- CloseUVEditor();
- view_mode = VIEW_ALL;
- SetupModelViews();
- }
- else {
- view_mode = VIEW_ALL;
- }
-
- SetFocusModelView(view_focus);
-}
-
-void MagicView::OnMouseMove(UINT nFlags, CPoint point)
-{
- if (drag_right) {
- CPoint offset = point - drag_start;
-
- if (view_focus == VIEW_PERSPECTIVE) {
- ModelView* view = GetModelViewByIndex(view_focus);
- view->SpinBy(offset.x * 0.5 * DEGREES,
- offset.y * 0.5 * DEGREES);
- }
-
- else if (IsUVEdit()) {
- uvmap_view->MoveBy(offset.x, offset.y);
- }
-
- else {
- ModelView* view = GetModelViewByIndex(view_focus);
- view->MoveBy(offset.x, offset.y);
- }
-
- drag_start = point;
- Invalidate();
- }
-
- else if (drag_left) {
- CPoint offset = point - drag_start;
- MagicDoc* pDoc = GetDocument();
- Selector* selector = pDoc->GetSelector();
-
- if (IsUVEdit()) {
- if (uvmap_view->IsActive()) {
- uvmap_view->AddMark(point);
- }
- else {
- uvmap_view->DragBy(offset.x, offset.y);
- drag_start = point;
- }
- }
-
- else if (selector && selector->IsActive()) {
- selector->AddMark(point);
- }
- }
-
- // xy status message:
- if (view_focus != VIEW_PERSPECTIVE) {
- char xy[80];
- CPoint mouse = LPtoWP(point);
- Selection* seln = GetDocument()->GetSelection();
-
- int nv = seln ? seln->GetVerts().size() : 0;
- int np = seln ? seln->GetPolys().size() : 0;
-
- if (np || nv)
- sprintf_s(xy, "(%05d,%05d) Verts:%d Polys:%d", mouse.x, mouse.y, nv, np);
- else
- sprintf_s(xy, "(%05d,%05d)", mouse.x, mouse.y);
- MainFrame::StatusXY(xy);
- }
-
- CView::OnMouseMove(nFlags, point);
-}
-
-BOOL MagicView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
-{
- if (view_focus == VIEW_PERSPECTIVE) {
- ModelView* view = GetModelViewByIndex(view_focus);
-
- if (view) {
- Camera* cam = view->GetCamera();
- Point pos = cam->Pos();
- double len = pos.length();
-
- if (zDelta < 0) {
- if (len < 10000)
- pos *= 1.15;
- }
- else {
- if (len > 0.10)
- pos *= 0.85;
- }
-
- cam->MoveTo(pos);
- }
- }
-
- else if (IsUVEdit()) {
- if (zDelta < 0) {
- uvmap_view->ZoomOut();
- }
- else {
- uvmap_view->ZoomIn();
- }
- }
-
- else {
- if (zDelta > 0)
- OnViewZoomIn();
- else
- OnViewZoomOut();
- }
-
- return 0;
-}
-
-// +--------------------------------------------------------------------+
-
-void MagicView::OnViewZoomNormal()
-{
- for (int i = 0; i < 4; i++) {
- ModelView* view = GetModelViewByIndex(i);
-
- if (view) {
- view->ZoomNormal();
- }
- }
-}
-
-void MagicView::OnViewZoomIn()
-{
- for (int i = 0; i < 4; i++) {
- ModelView* view = GetModelViewByIndex(i);
-
- if (view && view->GetViewMode() != ModelView::VIEW_PROJECT) {
- double fov = view->GetFieldOfView() * 1.15;
- view->SetFieldOfView(fov);
- }
- }
-}
-
-void MagicView::OnViewZoomOut()
-{
- for (int i = 0; i < 4; i++) {
- ModelView* view = GetModelViewByIndex(i);
-
- if (view && view->GetViewMode() != ModelView::VIEW_PROJECT) {
- double fov = view->GetFieldOfView() * 0.85;
- view->SetFieldOfView(fov);
- }
- }
-}
-
-// +--------------------------------------------------------------------+
-
-void MagicView::OnViewModeWireframe()
-{
- ModelView* view = GetModelViewByIndex(view_focus);
-
- if (view) {
- view->SetFillMode(ModelView::FILL_WIRE);
- }
-}
-
-void MagicView::OnViewModeSolid()
-{
- ModelView* view = GetModelViewByIndex(view_focus);
-
- if (view) {
- view->SetFillMode(ModelView::FILL_SOLID);
- }
-}
-
-void MagicView::OnViewModeTextured()
-{
- ModelView* view = GetModelViewByIndex(view_focus);
-
- if (view) {
- view->SetFillMode(ModelView::FILL_TEXTURE);
- }
-}
-
-void MagicView::OnViewBackColor()
-{
- ModelView* view = GetModelViewByIndex(view_focus);
-
- if (view) {
- ActiveWindow* win = (ActiveWindow*) view->GetWindow();
- Color c = win->GetBackColor();
- COLORREF crgb = RGB(c.Red(), c.Green(), c.Blue());
- CColorDialog chooser(crgb);
-
- if (chooser.DoModal() == IDOK) {
- crgb = chooser.GetColor();
- win->SetBackColor( Color(GetRValue(crgb), GetGValue(crgb), GetBValue(crgb)) );
- }
- }
-}
-
-// +--------------------------------------------------------------------+
-
-void MagicView::OnSelectAll()
-{
- Solid* solid = GetDocument()->GetSolid();
- Selector* selector = GetDocument()->GetSelector();
-
- if (IsUVEdit()) {
- uvmap_view->SelectAll();
- }
-
- else if (solid && selector) {
- selector->UseModel(solid->GetModel());
- selector->SelectAll(Selector::SELECT_APPEND);
- }
-}
-
-void MagicView::OnSelectNone()
-{
- Solid* solid = GetDocument()->GetSolid();
- Selector* selector = GetDocument()->GetSelector();
-
- if (IsUVEdit()) {
- uvmap_view->SelectNone();
- }
-
- else if (solid && selector) {
- selector->UseModel(solid->GetModel());
- selector->SelectAll(Selector::SELECT_REMOVE);
- }
-}
-
-void MagicView::OnSelectInverse()
-{
- Solid* solid = GetDocument()->GetSolid();
- Selector* selector = GetDocument()->GetSelector();
-
- if (IsUVEdit()) {
- uvmap_view->SelectInverse();
- }
-
- else if (solid && selector) {
- selector->UseModel(solid->GetModel());
- selector->SelectInverse();
- }
-}
-
-void MagicView::OnViewShadows()
-{
- view_shadows = !view_shadows;
-
- if (video)
- video->SetShadowEnabled(view_shadows);
-}
-
-void MagicView::OnUpdateViewShadows(CCmdUI* pCmdUI)
-{
- pCmdUI->SetCheck(view_shadows);
-}
-
-void MagicView::OnViewAnimatelight()
-{
- animate_light = !animate_light;
-}
-
-void MagicView::OnUpdateViewAnimatelight(CCmdUI* pCmdUI)
-{
- pCmdUI->SetCheck(animate_light);
-}
-
-void MagicView::OnViewBumpmaps()
-{
- view_bumpmaps = !view_bumpmaps;
-
- if (video)
- video->SetBumpMapEnabled(view_bumpmaps);
-}
-
-void MagicView::OnUpdateViewBumpmaps(CCmdUI* pCmdUI)
-{
- pCmdUI->SetCheck(view_bumpmaps);
-}
-
-void MagicView::OnViewVertexshader()
-{
- if (video) {
- VideoSettings* vs = (VideoSettings*) video->GetVideoSettings();
- vs->enable_vs = !vs->enable_vs;
- }
-}
-
-void MagicView::OnUpdateViewVertexshader(CCmdUI* pCmdUI)
-{
- if (video)
- pCmdUI->SetCheck(video->GetVideoSettings()->enable_vs);
-}
-
-void MagicView::OnViewPixelshader()
-{
- if (video) {
- VideoSettings* vs = (VideoSettings*) video->GetVideoSettings();
- vs->enable_ps = !vs->enable_ps;
- }
-}
-
-void MagicView::OnUpdateViewPixelshader(CCmdUI* pCmdUI)
-{
- if (video)
- pCmdUI->SetCheck(video->GetVideoSettings()->enable_ps);
-}
-
-void MagicView::OnViewVisibleshadows()
-{
- Shadow::SetVisibleShadowVolumes(!Shadow::GetVisibleShadowVolumes());
-}
-
-void MagicView::OnUpdateViewVisibleshadows(CCmdUI* pCmdUI)
-{
- pCmdUI->SetCheck(Shadow::GetVisibleShadowVolumes());
-}
-
-void MagicView::OnEditUndo()
-{
- MagicDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- pDoc->Undo();
-
- Solid* solid = GetDocument()->GetSolid();
- Selector* selector = GetDocument()->GetSelector();
-
- if (selector) {
- selector->UseModel(solid->GetModel());
- selector->Reselect();
- }
-
- Invalidate();
- pDoc->SetModifiedFlag(TRUE);
- pDoc->UpdateAllViews(this);
-}
-
-void MagicView::OnUpdateEditUndo(CCmdUI* pCmdUI)
-{
- MagicDoc* pDoc = GetDocument();
-
- if (pDoc->NumUndo() > 0) {
- pCmdUI->Enable(TRUE);
- pCmdUI->SetText(CString("Undo ") + pDoc->GetUndoName() + CString("\tCtrl+Z"));
- }
- else {
- pCmdUI->Enable(FALSE);
- pCmdUI->SetText("Can't Undo\tCtrl+Z");
- }
-}
-
-void MagicView::OnEditRedo()
-{
- MagicDoc* pDoc = GetDocument();
- ASSERT_VALID(pDoc);
- pDoc->Redo();
-
- Solid* solid = GetDocument()->GetSolid();
- Selector* selector = GetDocument()->GetSelector();
-
- if (selector) {
- selector->UseModel(solid->GetModel());
- selector->Reselect();
- }
-
- Invalidate();
- pDoc->SetModifiedFlag(TRUE);
- pDoc->UpdateAllViews(this);
-}
-
-void MagicView::OnUpdateEditRedo(CCmdUI* pCmdUI)
-{
- MagicDoc* pDoc = GetDocument();
-
- if (pDoc->NumRedo() > 0) {
- pCmdUI->Enable(TRUE);
- pCmdUI->SetText(CString("Redo ") + pDoc->GetRedoName() + CString("\tCtrl+Y"));
- }
- else {
- pCmdUI->Enable(FALSE);
- pCmdUI->SetText("Can't Redo");
- }
-}
+/* Starshatter OpenSource Distribution
+ Copyright (c) 1997-2004, Destroyer Studios LLC.
+ All Rights Reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+ * Neither the name "Destroyer Studios" nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+ SUBSYSTEM: Magic.exe
+ FILE: MagicView.cpp
+ AUTHOR: John DiCamillo
+
+
+ OVERVIEW
+ ========
+ Implementation of the MagicView class
+*/
+
+#include "stdafx.h"
+#include "Magic.h"
+
+#include "MagicDoc.h"
+#include "MagicView.h"
+#include "MainFrm.h"
+#include "MaterialDialog.h"
+#include "SurfacePropertiesDialog.h"
+#include "TextureMapDialog.h"
+#include "Editor.h"
+#include "Grid.h"
+#include "GridProps.h"
+#include "Selection.h"
+#include "Selector.h"
+#include "UVMapView.h"
+
+#include "ActiveWindow.h"
+#include "Color.h"
+#include "Layout.h"
+#include "Light.h"
+#include "Scene.h"
+#include "Screen.h"
+#include "Shadow.h"
+#include "Solid.h"
+#include "Video.h"
+#include "VideoDX9.h"
+#include "VideoSettings.h"
+
+#include "ModelView.h"
+
+DWORD GetRealTime();
+
+#ifdef _DEBUG
+#define new DEBUG_NEW
+#undef THIS_FILE
+static char THIS_FILE[] = __FILE__;
+#endif
+
+extern PALETTEENTRY standard_palette[256];
+extern BYTE inverse_palette[32768];
+
+// +--------------------------------------------------------------------+
+
+IMPLEMENT_DYNCREATE(MagicView, CView)
+
+BEGIN_MESSAGE_MAP(MagicView, CView)
+ //{{AFX_MSG_MAP(MagicView)
+ ON_WM_SIZE()
+ ON_COMMAND(ID_VIEW_RENDER, OnRender)
+ ON_WM_PAINT()
+ ON_COMMAND(ID_VIEW_ALL, OnViewAll)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_ALL, OnUpdateViewAll)
+ ON_COMMAND(ID_VIEW_FRONT, OnViewFront)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_FRONT, OnUpdateViewFront)
+ ON_COMMAND(ID_VIEW_PERSPECTIVE, OnViewPerspective)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_PERSPECTIVE, OnUpdateViewPerspective)
+ ON_COMMAND(ID_VIEW_SIDE, OnViewSide)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_SIDE, OnUpdateViewSide)
+ ON_COMMAND(ID_VIEW_TOP, OnViewTop)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_TOP, OnUpdateViewTop)
+ ON_COMMAND(ID_MODIFY_TEXTURE_MAP, OnTextureMap)
+ ON_COMMAND(ID_MODIFY_MATERIAL, OnModifyMaterial)
+ ON_WM_LBUTTONDOWN()
+ ON_WM_LBUTTONUP()
+ ON_WM_LBUTTONDBLCLK()
+ ON_WM_RBUTTONDOWN()
+ ON_WM_RBUTTONUP()
+ ON_WM_MOUSEMOVE()
+ ON_WM_MOUSEWHEEL()
+ ON_COMMAND(ID_VIEW_ZOOM_NORMAL, OnViewZoomNormal)
+ ON_COMMAND(ID_VIEW_ZOOM_IN, OnViewZoomIn)
+ ON_COMMAND(ID_VIEW_ZOOM_OUT, OnViewZoomOut)
+ ON_COMMAND(ID_VIEW_MODE_WIREFRAME, OnViewModeWireframe)
+ ON_COMMAND(ID_VIEW_MODE_SOLID, OnViewModeSolid)
+ ON_COMMAND(ID_VIEW_MODE_TEXTURED, OnViewModeTextured)
+ ON_WM_RBUTTONDBLCLK()
+ ON_COMMAND(ID_PROP_GRID, OnGridProperties)
+ ON_COMMAND(ID_GRID_SHOW, OnGridShow)
+ ON_COMMAND(ID_GRID_SNAP, OnGridSnap)
+ ON_UPDATE_COMMAND_UI(ID_GRID_SNAP, OnUpdateGridSnap)
+ ON_COMMAND(ID_VIEW_BACK_COLOR, OnViewBackColor)
+ ON_COMMAND(ID_FILE_IMPORT, OnFileImport)
+ ON_COMMAND(ID_FILE_EXPORT, OnFileExport)
+ ON_COMMAND(ID_EDIT_SELECT_ALL, OnSelectAll)
+ ON_COMMAND(ID_EDIT_SELECT_NONE, OnSelectNone)
+ ON_UPDATE_COMMAND_UI(ID_MODIFY_TEXTURE_MAP, OnUpdateTextureMap)
+ ON_UPDATE_COMMAND_UI(ID_MODIFY_MATERIAL, OnUpdateModifyMaterial)
+ ON_COMMAND(ID_EDIT_SELECT_INVERSE, OnSelectInverse)
+ ON_COMMAND(ID_MODIFY_UV_MAP, OnModifyUVMap)
+ ON_UPDATE_COMMAND_UI(ID_MODIFY_UV_MAP, OnUpdateModifyUVMap)
+ ON_COMMAND(ID_VIEW_SHADOWS, OnViewShadows)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_SHADOWS, OnUpdateViewShadows)
+ ON_COMMAND(ID_VIEW_ANIMATELIGHT, OnViewAnimatelight)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_ANIMATELIGHT, OnUpdateViewAnimatelight)
+ ON_COMMAND(ID_VIEW_BUMPMAPS, OnViewBumpmaps)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_BUMPMAPS, OnUpdateViewBumpmaps)
+ ON_COMMAND(ID_VIEW_VERTEXSHADER, OnViewVertexshader)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_VERTEXSHADER, OnUpdateViewVertexshader)
+ ON_COMMAND(ID_VIEW_PIXELSHADER, OnViewPixelshader)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_PIXELSHADER, OnUpdateViewPixelshader)
+ ON_COMMAND(ID_VIEW_VISIBLESHADOWS, OnViewVisibleshadows)
+ ON_UPDATE_COMMAND_UI(ID_VIEW_VISIBLESHADOWS, OnUpdateViewVisibleshadows)
+ ON_COMMAND(ID_EDIT_UNDO, OnEditUndo)
+ ON_UPDATE_COMMAND_UI(ID_EDIT_UNDO, OnUpdateEditUndo)
+ ON_COMMAND(ID_EDIT_REDO, OnEditRedo)
+ ON_UPDATE_COMMAND_UI(ID_EDIT_REDO, OnUpdateEditRedo)
+ ON_COMMAND(ID_PROP_SURFACE, OnSurfaceProperties)
+ ON_UPDATE_COMMAND_UI(ID_PROP_SURFACE, OnUpdateSurfaceProperties)
+ //}}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()
+
+// +--------------------------------------------------------------------+
+
+static MagicView* magic_view = 0;
+
+MagicView::MagicView()
+ : video(0), video_settings(0), screen(0), scene(0),
+ drag_left(false), drag_right(false), grid(0),
+ main_light(0), back_light(0), view_shadows(true), view_bumpmaps(true),
+ animate_light(false)
+{
+ window_style = 0;
+ is_minimized = false;
+ is_maximized = false;
+ is_sizing = false;
+ view_mode = VIEW_ALL;
+
+ main_win = 0;
+ view_win[0] = 0;
+ view_win[1] = 0;
+ view_win[2] = 0;
+ view_win[3] = 0;
+ model_view[0] = 0;
+ model_view[1] = 0;
+ model_view[2] = 0;
+ model_view[3] = 0;
+ uvmap_win = 0;
+
+ grid = new Grid;
+ magic_view = this;
+
+ Solid::EnableCollision(false);
+}
+
+MagicView::~MagicView()
+{
+ if (grid) {
+ delete grid;
+ }
+
+ if (scene) {
+ scene->Graphics().clear();
+ delete scene;
+ }
+
+ if (screen) delete screen;
+ if (video) delete video;
+ if (video_settings) delete video_settings;
+
+ if (magic_view == this)
+ magic_view = 0;
+}
+
+MagicView* MagicView::GetInstance()
+{
+ return magic_view;
+}
+
+BOOL MagicView::PreCreateWindow(CREATESTRUCT& cs)
+{
+ return CView::PreCreateWindow(cs);
+}
+
+// +--------------------------------------------------------------------+
+//
+// MagicView diagnostics
+
+#ifdef _DEBUG
+void MagicView::AssertValid() const
+{
+ CView::AssertValid();
+}
+
+void MagicView::Dump(CDumpContext& dc) const
+{
+ CView::Dump(dc);
+}
+
+MagicDoc* MagicView::GetDocument() // non-debug version is inline
+{
+ ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(MagicDoc)));
+ return (MagicDoc*)m_pDocument;
+}
+#endif //_DEBUG
+
+
+// +--------------------------------------------------------------------+
+
+void MagicView::OnInitialUpdate()
+{
+ CView::OnInitialUpdate();
+ Color::SetPalette(standard_palette, 256, inverse_palette);
+
+ if (!video_settings)
+ video_settings = new VideoSettings;
+
+ GetClientRect(&client_rect);
+
+ // Use client area to set video window size
+ int w = client_rect.right - client_rect.left;
+ int h = client_rect.bottom - client_rect.top;
+
+ video_settings->is_windowed = true;
+ video_settings->window_width = w;
+ video_settings->window_height = h;
+
+ if (!video) {
+ video = new VideoDX9(GetSafeHwnd(), video_settings);
+ *video_settings = *video->GetVideoSettings();
+
+ if (video) {
+ Color::UseVideo(video);
+ video->UseXFont("System", 12, false, false);
+
+ screen = new Screen(video);
+ if (!screen) {
+ ::Print("ERROR: Could not create Screen object.\n");
+ return;
+ }
+
+ ::Print(" Created screen object (%d x %d).\n", w, h);
+
+ if (!screen->SetBackgroundColor(Color::Black))
+ ::Print(" WARNING: could not set video background color to Black\n");
+
+ screen->ClearAllFrames(true);
+
+ ::Print(" Established requested video parameters.\n");
+ ::Print(" ---------------------------------------\n\n");
+
+ if (!scene) {
+ scene = new Scene;
+
+ scene->SetAmbient(Color(60,60,60));
+
+ Point light_pos(3e6, 5e6, 4e6);
+
+ main_light = new Light(1.0f); //1.25f);
+ main_light->MoveTo(light_pos);
+ main_light->SetType(Light::LIGHT_DIRECTIONAL);
+ main_light->SetColor(Color::White);
+ main_light->SetShadow(true);
+
+ scene->AddLight(main_light);
+
+ back_light = new Light(0.5f);
+ back_light->MoveTo(light_pos * -1);
+ back_light->SetType(Light::LIGHT_DIRECTIONAL);
+ back_light->SetColor(Color::White);
+
+ scene->AddLight(back_light);
+
+ Selection* seln = GetDocument()->GetSelection();
+ Selector* selector = GetDocument()->GetSelector();
+
+ if (seln && selector) {
+ scene->Graphics().clear();
+ scene->AddGraphic(seln);
+ scene->AddGraphic(selector);
+
+ selector->UseModel(0);
+ }
+ }
+
+ int mins[2] = { 0, 0 };
+ float weights[2] = { 1, 1 };
+
+ main_win = new ActiveWindow(screen, 0, 0, w, h, 100, 0);
+ main_win->UseLayout(2, 2, mins, mins, weights, weights);
+ main_win->SetBackColor(Color::Gray);
+
+ screen->AddWindow(main_win);
+
+ DWORD view_types[] = {
+ ModelView::VIEW_PLAN,
+ ModelView::VIEW_PROJECT,
+ ModelView::VIEW_SIDE,
+ ModelView::VIEW_FRONT
+ };
+
+ for (int row = 0; row < 2; row++) {
+ for (int col = 0; col < 2; col++) {
+ int index = 2*row + col;
+
+ ActiveWindow* win = new ActiveWindow(screen,
+ col*w/2,
+ row*h/2,
+ w/2,
+ h/2,
+ 101+index,
+ WIN_BLACK_FRAME,
+ main_win);
+
+ win->SetCells(col, row, 1, 1);
+ win->SetCellInsets(Insets(1,1,1,1));
+ win->SetBackColor(Color(160,160,160));
+
+ ModelView* mv = new ModelView(win, scene, view_types[index]);
+
+ if (view_types[index] == ModelView::VIEW_PROJECT)
+ mv->SetFillMode(ModelView::FILL_TEXTURE);
+
+ mv->UseGrid(grid);
+ win->AddView(mv);
+
+ view_win[index] = win;
+ model_view[index] = mv;
+ }
+ }
+
+ view_win[0]->SetStyle(WIN_WHITE_FRAME);
+
+ uvmap_win = new ActiveWindow(screen, 0, 0, w, h, 110, WIN_BLACK_FRAME, main_win);
+ uvmap_view = new UVMapView(uvmap_win);
+ uvmap_win->AddView(uvmap_view);
+
+ main_win->DoLayout();
+ }
+
+ else {
+ ::Print(" Could not establish requested video parameters.\n");
+ ::Print(" -----------------------------------------------\n\n");
+ }
+ }
+}
+
+// +--------------------------------------------------------------------+
+
+void
+MagicView::SetupModelViews()
+{
+ switch (view_mode) {
+ case VIEW_ALL: {
+ for (int row = 0; row < 2; row++) {
+ for (int col = 0; col < 2; col++) {
+ int index = 2*row + col;
+
+ ActiveWindow* win = view_win[index];
+
+ win->Show();
+ win->SetCells(col, row, 1, 1);
+ win->SetCellInsets(Insets(1,1,1,1));
+ }
+ }
+
+ uvmap_win->Hide();
+ uvmap_win->SetCells(0,0,0,0);
+ }
+ break;
+
+ case VIEW_TOP:
+ case VIEW_SIDE:
+ case VIEW_FRONT:
+ case VIEW_PERSPECTIVE: {
+ view_focus = view_mode;
+
+ for (int i = 0; i < 4; i++) {
+ ActiveWindow* win = view_win[i];
+
+ if (i == view_mode) {
+ win->Show();
+ win->SetCells(0,0,2,2);
+ win->SetStyle(WIN_WHITE_FRAME);
+ }
+
+ else {
+ win->Hide();
+ win->SetCells(0,0,0,0);
+ win->SetStyle(WIN_BLACK_FRAME);
+ }
+ }
+
+ uvmap_win->Hide();
+ uvmap_win->SetCells(0,0,0,0);
+ }
+ break;
+
+ case VIEW_UV_MAP: {
+ view_focus = view_mode;
+
+ for (int i = 0; i < 4; i++) {
+ ActiveWindow* win = view_win[i];
+ win->Hide();
+ win->SetCells(0,0,0,0);
+ win->SetStyle(WIN_BLACK_FRAME);
+ }
+
+ uvmap_win->Show();
+ uvmap_win->SetCells(0,0,2,2);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ main_win->DoLayout();
+}
+
+void
+MagicView::SetFocusModelView(int f)
+{
+ if (view_mode == VIEW_ALL) {
+ view_focus = f;
+
+ for (int row = 0; row < 2; row++) {
+ for (int col = 0; col < 2; col++) {
+ int index = 2*row + col;
+
+ ActiveWindow* win = view_win[index];
+
+ win->Show();
+ win->SetCells(col, row, 1, 1);
+ win->SetCellInsets(Insets(1,1,1,1));
+
+ if (index == view_focus) {
+ win->SetStyle(WIN_WHITE_FRAME);
+ }
+ else {
+ win->SetStyle(WIN_BLACK_FRAME);
+ }
+ }
+ }
+ }
+ else if (IsUVEdit()) {
+ view_focus = view_mode;
+ }
+ else {
+ view_mode = f;
+ view_focus = f;
+
+ for (int i = 0; i < 4; i++) {
+ ActiveWindow* win = view_win[i];
+
+ if (i == view_mode) {
+ win->Show();
+ win->SetCells(0,0,2,2);
+ win->SetStyle(WIN_WHITE_FRAME);
+ }
+
+ else {
+ win->Hide();
+ win->SetCells(0,0,0,0);
+ win->SetStyle(WIN_BLACK_FRAME);
+ }
+ }
+ }
+
+ main_win->DoLayout();
+}
+
+int
+MagicView::GetWinIndexByPoint(int x, int y)
+{
+ if (view_mode == VIEW_ALL) {
+ for (int row = 0; row < 2; row++) {
+ for (int col = 0; col < 2; col++) {
+ int index = 2*row + col;
+
+ ActiveWindow* win = view_win[index];
+ if (win->GetRect().Contains(x, y))
+ return index;
+ }
+ }
+ }
+
+ return view_mode;
+}
+
+ModelView*
+MagicView::GetModelViewByIndex(int index)
+{
+ if (index >= 0 && index < 4) {
+ return model_view[index];
+ }
+
+ return model_view[0];
+}
+
+// +--------------------------------------------------------------------+
+
+void MagicView::OnPaint()
+{
+ ValidateRect(0);
+ OnRender();
+}
+
+void MagicView::OnDraw(CDC* dc)
+{
+}
+
+// +--------------------------------------------------------------------+
+
+void MagicView::ResizeVideo()
+{
+ if (!video || !video_settings) return;
+
+ HRESULT hr = S_OK;
+ RECT client_old;
+
+ client_old = client_rect;
+
+ // Update window properties
+ GetClientRect(&client_rect);
+
+ if (client_old.right - client_old.left !=
+ client_rect.right - client_rect.left ||
+ client_old.bottom - client_old.top !=
+ client_rect.bottom - client_rect.top) {
+
+ // A new window size will require a new backbuffer
+ // size, so the 3D structures must be changed accordingly.
+
+ video_settings->is_windowed = true;
+ video_settings->window_width = client_rect.right - client_rect.left;
+ video_settings->window_height = client_rect.bottom - client_rect.top;
+
+ ::Print("ResizeVideo() %d x %d\n", video_settings->window_width, video_settings->window_height);
+
+ if (video) {
+ video->Reset(video_settings);
+ }
+ }
+
+ // save a copy of the device-specific video settings:
+ if (video->GetVideoSettings()) {
+ *video_settings = *video->GetVideoSettings();
+ }
+
+ if (screen)
+ screen->Resize(video_settings->window_width,
+ video_settings->window_height);
+
+ video->InvalidateCache();
+ video->SetShadowEnabled(view_shadows);
+ video->SetBumpMapEnabled(view_bumpmaps);
+}
+
+// +--------------------------------------------------------------------+
+
+void MagicView::OnUpdate(CView* pSender, LPARAM lHint, CObject* pHint)
+{
+ CView::OnUpdate(pSender, lHint, pHint);
+
+ Solid* solid = GetDocument()->GetSolid();
+ Selection* seln = GetDocument()->GetSelection();
+ Selector* selector = GetDocument()->GetSelector();
+
+ if (solid && scene) {
+ scene->Graphics().clear();
+ scene->AddGraphic(solid);
+ scene->AddGraphic(seln);
+ scene->AddGraphic(selector);
+ }
+
+ if (selector)
+ selector->UseModel(solid->GetModel());
+}
+
+CPoint
+MagicView::LPtoWP(const CPoint& p)
+{
+ CPoint result;
+ ModelView* view = GetModelViewByIndex(view_focus);
+ CPoint origin = view->ProjectPoint(Vec3(0,0,0));
+ double scale = view->GetFieldOfView() / 2;
+
+ result.x = (LONG) (( p.x - origin.x) / scale);
+ result.y = (LONG) ((-p.y + origin.y) / scale);
+
+ return result;
+}
+
+// +--------------------------------------------------------------------+
+//
+// MagicView message handlers
+
+void MagicView::OnEnterSizeMove()
+{
+ is_sizing = true;
+}
+
+void MagicView::OnExitSizeMove()
+{
+ is_sizing = false;
+ ResizeVideo();
+}
+
+void MagicView::OnSize(UINT nType, int cx, int cy)
+{
+ CView::OnSize(nType, cx, cy);
+
+ window_style = GetWindowLong(m_hWnd, GWL_STYLE);
+
+ if (nType == SIZE_MINIMIZED) {
+ is_minimized = true;
+ is_maximized = false;
+ }
+
+ else if (nType == SIZE_MAXIMIZED) {
+ is_minimized = false;
+ is_maximized = true;
+ ResizeVideo();
+ }
+
+ else if (nType == SIZE_RESTORED) {
+ if (is_maximized) {
+ is_maximized = false;
+ ResizeVideo();
+ }
+
+ else if (is_minimized) {
+ is_minimized = false;
+ ResizeVideo();
+ }
+ else if (!is_sizing) {
+ // if this is not a resize due to dragging...
+ ResizeVideo();
+ }
+ else {
+ // If we're neither maximized nor minimized, the window size
+ // is changing by the user dragging the window edges. In this
+ // case, we don't reset the device yet -- we wait until the
+ // user stops dragging, and a WM_EXITSIZEMOVE message comes.
+ }
+ }
+}
+
+// +--------------------------------------------------------------------+
+
+void MagicView::OnRender()
+{
+ if (!screen || !video)
+ return;
+
+ double s = sin(timeGetTime() * 0.001);
+ double c = cos(timeGetTime() * 0.001);
+
+ // IF LIGHTS ANIMATED:
+ if (animate_light) {
+ Point light_pos(3e6*s, 5e6*c, 4e6*s);
+
+ if (main_light) {
+ main_light->SetType(Light::LIGHT_POINT);
+ main_light->MoveTo(light_pos);
+ main_light->SetType(Light::LIGHT_DIRECTIONAL);
+ }
+
+ if (back_light) {
+ back_light->SetType(Light::LIGHT_POINT);
+ back_light->MoveTo(light_pos * -1);
+ back_light->SetType(Light::LIGHT_DIRECTIONAL);
+ }
+ }
+
+ if (screen->Refresh()) {
+ video->Present();
+ }
+ else {
+ ::Print("ERROR: Screen refresh failed.\n");
+ }
+}
+
+void MagicView::CloseUVEditor()
+{
+ if (IsUVEdit()) {
+ MagicDoc* doc = GetDocument();
+ Editor* editor = doc->GetEditor();
+ Solid* solid = doc->GetSolid();
+
+ if (editor && solid) {
+ editor->UseModel(solid->GetModel());
+ editor->Resegment();
+ }
+ }
+}
+
+// +--------------------------------------------------------------------+
+
+void MagicView::OnViewAll()
+{
+ CloseUVEditor();
+ view_mode = VIEW_ALL;
+ SetupModelViews();
+}
+
+void MagicView::OnUpdateViewAll(CCmdUI* pCmdUI)
+{
+ if (pCmdUI)
+ pCmdUI->SetCheck(view_mode == VIEW_ALL);
+}
+
+void MagicView::OnViewFront()
+{
+ CloseUVEditor();
+ view_mode = VIEW_FRONT;
+ SetupModelViews();
+}
+
+void MagicView::OnUpdateViewFront(CCmdUI* pCmdUI)
+{
+ if (pCmdUI)
+ pCmdUI->SetCheck(view_mode == VIEW_FRONT);
+}
+
+void MagicView::OnViewPerspective()
+{
+ CloseUVEditor();
+ view_mode = VIEW_PERSPECTIVE;
+ SetupModelViews();
+}
+
+void MagicView::OnUpdateViewPerspective(CCmdUI* pCmdUI)
+{
+ if (pCmdUI)
+ pCmdUI->SetCheck(view_mode == VIEW_PERSPECTIVE);
+}
+
+void MagicView::OnViewSide()
+{
+ CloseUVEditor();
+ view_mode = VIEW_SIDE;
+ SetupModelViews();
+}
+
+void MagicView::OnUpdateViewSide(CCmdUI* pCmdUI)
+{
+ if (pCmdUI)
+ pCmdUI->SetCheck(view_mode == VIEW_SIDE);
+}
+
+void MagicView::OnViewTop()
+{
+ CloseUVEditor();
+ view_mode = VIEW_TOP;
+ SetupModelViews();
+}
+
+void MagicView::OnUpdateViewTop(CCmdUI* pCmdUI)
+{
+ if (pCmdUI)
+ pCmdUI->SetCheck(view_mode == VIEW_TOP);
+}
+
+// +--------------------------------------------------------------------+
+
+void MagicView::OnFileImport()
+{
+ DWORD err = 0;
+ char filename[256];
+ filename[0] = '\0';
+ CFileDialog ofd(TRUE, "mag");
+
+ ofd.m_ofn.lpstrFilter = "All 3D Files\0*.mag; *.obj; *.3ds\0Magic Files (*.mag)\0*.mag\0Wavefront/OBJ Files (*.obj)\0*.obj\0003DS MAX Files (*.3ds)\0*.3ds\0\0";
+ ofd.m_ofn.lpstrFile = filename;
+ ofd.m_ofn.nMaxFile = sizeof(filename);
+
+ if (ofd.DoModal() != IDOK)
+ return;
+
+ char mag_name[256];
+ sprintf_s(mag_name, "%s", ofd.GetFileName().GetBuffer(0));
+
+ MagicDoc* pDoc = GetDocument();
+ ASSERT_VALID(pDoc);
+
+ if (pDoc->ImportFile(mag_name)) {
+ Invalidate();
+ pDoc->SetModifiedFlag(TRUE);
+ pDoc->UpdateAllViews(this);
+ }
+}
+
+void MagicView::OnFileExport()
+{
+ DWORD err = 0;
+ char filename[256];
+ filename[0] = '\0';
+ CFileDialog ofd(FALSE, "mag");
+
+ ofd.m_ofn.lpstrFilter = "All 3D Files\0*.mag; *.obj; *.3ds\0Magic Files (*.mag)\0*.mag\0Wavefront/OBJ Files (*.obj)\0*.obj\0003DS MAX Files (*.3ds)\0*.3ds\0\0";
+ ofd.m_ofn.lpstrFile = filename;
+ ofd.m_ofn.nMaxFile = sizeof(filename);
+
+ if (ofd.DoModal() != IDOK)
+ return;
+
+ char mag_name[256];
+ sprintf_s(mag_name, "%s", ofd.GetFileName().GetBuffer(0));
+
+ MagicDoc* pDoc = GetDocument();
+ ASSERT_VALID(pDoc);
+
+ if (pDoc->ExportFile(mag_name)) {
+ pDoc->SetModifiedFlag(FALSE);
+ pDoc->UpdateAllViews(this);
+ }
+}
+
+// +--------------------------------------------------------------------+
+
+void MagicView::OnSurfaceProperties()
+{
+ SurfacePropertiesDialog dlg(this);
+ dlg.DoModal();
+}
+
+void MagicView::OnUpdateSurfaceProperties(CCmdUI* pCmdUI)
+{
+ Solid* solid = GetDocument()->GetSolid();
+ pCmdUI->Enable(solid && solid->GetModel());
+}
+
+// +--------------------------------------------------------------------+
+
+void MagicView::OnTextureMap()
+{
+ TextureMapDialog dlg(this);
+ if (dlg.DoModal() == IDOK) {
+ MagicDoc* doc = GetDocument();
+ Solid* solid = doc->GetSolid();
+ Selection* seln = doc->GetSelection();
+ Selector* selector = doc->GetSelector();
+ Editor* editor = doc->GetEditor();
+ Material* mtl = 0;
+
+ if (dlg.mMaterialIndex >= 0) {
+ mtl = solid->GetModel()->GetMaterials()[dlg.mMaterialIndex];
+ }
+
+ editor->UseModel(solid->GetModel());
+ editor->ApplyMaterial(mtl, seln->GetPolys(),
+ dlg.mMapType, 2-dlg.mAxis, (float) dlg.mScaleU, (float) dlg.mScaleV,
+ dlg.mFlip, dlg.mMirror, dlg.mRotate);
+
+ selector->Reselect();
+
+ Invalidate();
+ doc->SetModifiedFlag(TRUE);
+ doc->UpdateAllViews(this);
+ }
+}
+
+void MagicView::OnUpdateTextureMap(CCmdUI* pCmdUI)
+{
+ Solid* solid = GetDocument()->GetSolid();
+ Selection* seln = GetDocument()->GetSelection();
+
+ pCmdUI->Enable(solid && solid->GetModel() && seln && seln->GetPolys().size() > 0);
+}
+
+void MagicView::OnModifyMaterial()
+{
+ MaterialDialog dlg(this);
+ dlg.DoModal();
+
+ Invalidate();
+ GetDocument()->SetModifiedFlag(TRUE);
+ GetDocument()->UpdateAllViews(this);
+}
+
+void MagicView::OnUpdateModifyMaterial(CCmdUI* pCmdUI)
+{
+ Solid* solid = GetDocument()->GetSolid();
+ pCmdUI->Enable(solid && solid->GetModel());
+}
+
+void MagicView::OnModifyUVMap()
+{
+ Selection* seln = GetDocument()->GetSelection();
+
+ view_mode = VIEW_UV_MAP;
+ SetupModelViews();
+
+ if (seln && uvmap_view) {
+ Poly* p = seln->GetPolys().first();
+
+ if (p) {
+ uvmap_view->UseMaterial(p->material);
+ uvmap_view->UsePolys(seln->GetPolys());
+ }
+ }
+}
+
+void MagicView::OnUpdateModifyUVMap(CCmdUI* pCmdUI)
+{
+ OnUpdateTextureMap(pCmdUI);
+}
+
+// +--------------------------------------------------------------------+
+
+void MagicView::OnGridProperties()
+{
+ GridProps dlg(grid, this);
+ dlg.DoModal();
+}
+
+void MagicView::OnGridShow()
+{
+ if (grid)
+ grid->SetShow(!grid->IsShow());
+}
+
+void MagicView::OnGridSnap()
+{
+ if (grid)
+ grid->SetSnap(!grid->IsSnap());
+}
+
+void MagicView::OnUpdateGridSnap(CCmdUI* pCmdUI)
+{
+ if (grid)
+ pCmdUI->SetCheck(grid->IsSnap());
+}
+
+// +--------------------------------------------------------------------+
+
+void MagicView::OnLButtonDown(UINT nFlags, CPoint point)
+{
+ CView::OnLButtonDown(nFlags, point);
+ SetCapture();
+
+ // set focus to the view that was clicked:
+ int index = GetWinIndexByPoint(point.x, point.y);
+ SetFocusModelView(index);
+
+ drag_start = point;
+ drag_left = true;
+ drag_right = false;
+
+ ModelView* mv = GetModelViewByIndex(index);
+ MagicDoc* pDoc = GetDocument();
+ Model* model = pDoc->GetSolid()->GetModel();
+ Selector* selector = pDoc->GetSelector();
+
+ if (IsUVEdit()) {
+ int select_mode = UVMapView::SELECT_APPEND;
+
+ if (nFlags & MK_CONTROL)
+ select_mode = UVMapView::SELECT_REMOVE;
+
+ if (!uvmap_view->WillSelect(point)) {
+ uvmap_view->Begin(select_mode);
+ uvmap_view->AddMark(point);
+ }
+ }
+
+ else if (mv && selector) {
+ int select_mode = Selector::SELECT_APPEND;
+
+ if (nFlags & MK_CONTROL)
+ select_mode = Selector::SELECT_REMOVE;
+
+ selector->Begin(model, mv->GetViewMode(), select_mode);
+ selector->AddMark(point);
+ }
+}
+
+void MagicView::OnLButtonUp(UINT nFlags, CPoint point)
+{
+ CView::OnLButtonUp(nFlags, point);
+ ReleaseCapture();
+
+ drag_left = false;
+
+ MagicDoc* pDoc = GetDocument();
+ Selector* selector = pDoc->GetSelector();
+
+ if (IsUVEdit())
+ uvmap_view->End();
+
+ else if (selector && selector->IsActive())
+ selector->End();
+}
+
+void MagicView::OnLButtonDblClk(UINT nFlags, CPoint point)
+{
+ CView::OnLButtonDblClk(nFlags, point);
+
+ drag_left = false;
+
+ MagicDoc* pDoc = GetDocument();
+ Selector* selector = pDoc->GetSelector();
+
+ if (IsUVEdit())
+ uvmap_view->Clear();
+
+ else if (selector)
+ selector->Clear();
+}
+
+void MagicView::OnRButtonDown(UINT nFlags, CPoint point)
+{
+ CView::OnRButtonDown(nFlags, point);
+ SetCapture();
+
+ // set focus to the view that was clicked:
+ int index = GetWinIndexByPoint(point.x, point.y);
+ SetFocusModelView(index);
+
+ drag_start = point;
+ drag_left = false;
+ drag_right = true;
+}
+
+void MagicView::OnRButtonUp(UINT nFlags, CPoint point)
+{
+ CView::OnRButtonUp(nFlags, point);
+ ReleaseCapture();
+
+ drag_right = false;
+}
+
+void MagicView::OnRButtonDblClk(UINT nFlags, CPoint point)
+{
+ CView::OnRButtonDblClk(nFlags, point);
+ ReleaseCapture();
+
+ drag_right = false;
+
+ if (view_mode == VIEW_ALL) {
+ view_mode = view_focus;
+ }
+ else if (IsUVEdit()) {
+ CloseUVEditor();
+ view_mode = VIEW_ALL;
+ SetupModelViews();
+ }
+ else {
+ view_mode = VIEW_ALL;
+ }
+
+ SetFocusModelView(view_focus);
+}
+
+void MagicView::OnMouseMove(UINT nFlags, CPoint point)
+{
+ if (drag_right) {
+ CPoint offset = point - drag_start;
+
+ if (view_focus == VIEW_PERSPECTIVE) {
+ ModelView* view = GetModelViewByIndex(view_focus);
+ view->SpinBy(offset.x * 0.5 * DEGREES,
+ offset.y * 0.5 * DEGREES);
+ }
+
+ else if (IsUVEdit()) {
+ uvmap_view->MoveBy(offset.x, offset.y);
+ }
+
+ else {
+ ModelView* view = GetModelViewByIndex(view_focus);
+ view->MoveBy(offset.x, offset.y);
+ }
+
+ drag_start = point;
+ Invalidate();
+ }
+
+ else if (drag_left) {
+ CPoint offset = point - drag_start;
+ MagicDoc* pDoc = GetDocument();
+ Selector* selector = pDoc->GetSelector();
+
+ if (IsUVEdit()) {
+ if (uvmap_view->IsActive()) {
+ uvmap_view->AddMark(point);
+ }
+ else {
+ uvmap_view->DragBy(offset.x, offset.y);
+ drag_start = point;
+ }
+ }
+
+ else if (selector && selector->IsActive()) {
+ selector->AddMark(point);
+ }
+ }
+
+ // xy status message:
+ if (view_focus != VIEW_PERSPECTIVE) {
+ char xy[80];
+ CPoint mouse = LPtoWP(point);
+ Selection* seln = GetDocument()->GetSelection();
+
+ int nv = seln ? seln->GetVerts().size() : 0;
+ int np = seln ? seln->GetPolys().size() : 0;
+
+ if (np || nv)
+ sprintf_s(xy, "(%05d,%05d) Verts:%d Polys:%d", mouse.x, mouse.y, nv, np);
+ else
+ sprintf_s(xy, "(%05d,%05d)", mouse.x, mouse.y);
+ MainFrame::StatusXY(xy);
+ }
+
+ CView::OnMouseMove(nFlags, point);
+}
+
+BOOL MagicView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt)
+{
+ if (view_focus == VIEW_PERSPECTIVE) {
+ ModelView* view = GetModelViewByIndex(view_focus);
+
+ if (view) {
+ Camera* cam = view->GetCamera();
+ Point pos = cam->Pos();
+ double len = pos.length();
+
+ if (zDelta < 0) {
+ if (len < 10000)
+ pos *= 1.15;
+ }
+ else {
+ if (len > 0.10)
+ pos *= 0.85;
+ }
+
+ cam->MoveTo(pos);
+ }
+ }
+
+ else if (IsUVEdit()) {
+ if (zDelta < 0) {
+ uvmap_view->ZoomOut();
+ }
+ else {
+ uvmap_view->ZoomIn();
+ }
+ }
+
+ else {
+ if (zDelta > 0)
+ OnViewZoomIn();
+ else
+ OnViewZoomOut();
+ }
+
+ return 0;
+}
+
+// +--------------------------------------------------------------------+
+
+void MagicView::OnViewZoomNormal()
+{
+ for (int i = 0; i < 4; i++) {
+ ModelView* view = GetModelViewByIndex(i);
+
+ if (view) {
+ view->ZoomNormal();
+ }
+ }
+}
+
+void MagicView::OnViewZoomIn()
+{
+ for (int i = 0; i < 4; i++) {
+ ModelView* view = GetModelViewByIndex(i);
+
+ if (view && view->GetViewMode() != ModelView::VIEW_PROJECT) {
+ double fov = view->GetFieldOfView() * 1.15;
+ view->SetFieldOfView(fov);
+ }
+ }
+}
+
+void MagicView::OnViewZoomOut()
+{
+ for (int i = 0; i < 4; i++) {
+ ModelView* view = GetModelViewByIndex(i);
+
+ if (view && view->GetViewMode() != ModelView::VIEW_PROJECT) {
+ double fov = view->GetFieldOfView() * 0.85;
+ view->SetFieldOfView(fov);
+ }
+ }
+}
+
+// +--------------------------------------------------------------------+
+
+void MagicView::OnViewModeWireframe()
+{
+ ModelView* view = GetModelViewByIndex(view_focus);
+
+ if (view) {
+ view->SetFillMode(ModelView::FILL_WIRE);
+ }
+}
+
+void MagicView::OnViewModeSolid()
+{
+ ModelView* view = GetModelViewByIndex(view_focus);
+
+ if (view) {
+ view->SetFillMode(ModelView::FILL_SOLID);
+ }
+}
+
+void MagicView::OnViewModeTextured()
+{
+ ModelView* view = GetModelViewByIndex(view_focus);
+
+ if (view) {
+ view->SetFillMode(ModelView::FILL_TEXTURE);
+ }
+}
+
+void MagicView::OnViewBackColor()
+{
+ ModelView* view = GetModelViewByIndex(view_focus);
+
+ if (view) {
+ ActiveWindow* win = (ActiveWindow*) view->GetWindow();
+ Color c = win->GetBackColor();
+ COLORREF crgb = RGB(c.Red(), c.Green(), c.Blue());
+ CColorDialog chooser(crgb);
+
+ if (chooser.DoModal() == IDOK) {
+ crgb = chooser.GetColor();
+ win->SetBackColor( Color(GetRValue(crgb), GetGValue(crgb), GetBValue(crgb)) );
+ }
+ }
+}
+
+// +--------------------------------------------------------------------+
+
+void MagicView::OnSelectAll()
+{
+ Solid* solid = GetDocument()->GetSolid();
+ Selector* selector = GetDocument()->GetSelector();
+
+ if (IsUVEdit()) {
+ uvmap_view->SelectAll();
+ }
+
+ else if (solid && selector) {
+ selector->UseModel(solid->GetModel());
+ selector->SelectAll(Selector::SELECT_APPEND);
+ }
+}
+
+void MagicView::OnSelectNone()
+{
+ Solid* solid = GetDocument()->GetSolid();
+ Selector* selector = GetDocument()->GetSelector();
+
+ if (IsUVEdit()) {
+ uvmap_view->SelectNone();
+ }
+
+ else if (solid && selector) {
+ selector->UseModel(solid->GetModel());
+ selector->SelectAll(Selector::SELECT_REMOVE);
+ }
+}
+
+void MagicView::OnSelectInverse()
+{
+ Solid* solid = GetDocument()->GetSolid();
+ Selector* selector = GetDocument()->GetSelector();
+
+ if (IsUVEdit()) {
+ uvmap_view->SelectInverse();
+ }
+
+ else if (solid && selector) {
+ selector->UseModel(solid->GetModel());
+ selector->SelectInverse();
+ }
+}
+
+void MagicView::OnViewShadows()
+{
+ view_shadows = !view_shadows;
+
+ if (video)
+ video->SetShadowEnabled(view_shadows);
+}
+
+void MagicView::OnUpdateViewShadows(CCmdUI* pCmdUI)
+{
+ pCmdUI->SetCheck(view_shadows);
+}
+
+void MagicView::OnViewAnimatelight()
+{
+ animate_light = !animate_light;
+}
+
+void MagicView::OnUpdateViewAnimatelight(CCmdUI* pCmdUI)
+{
+ pCmdUI->SetCheck(animate_light);
+}
+
+void MagicView::OnViewBumpmaps()
+{
+ view_bumpmaps = !view_bumpmaps;
+
+ if (video)
+ video->SetBumpMapEnabled(view_bumpmaps);
+}
+
+void MagicView::OnUpdateViewBumpmaps(CCmdUI* pCmdUI)
+{
+ pCmdUI->SetCheck(view_bumpmaps);
+}
+
+void MagicView::OnViewVertexshader()
+{
+ if (video) {
+ VideoSettings* vs = (VideoSettings*) video->GetVideoSettings();
+ vs->enable_vs = !vs->enable_vs;
+ }
+}
+
+void MagicView::OnUpdateViewVertexshader(CCmdUI* pCmdUI)
+{
+ if (video)
+ pCmdUI->SetCheck(video->GetVideoSettings()->enable_vs);
+}
+
+void MagicView::OnViewPixelshader()
+{
+ if (video) {
+ VideoSettings* vs = (VideoSettings*) video->GetVideoSettings();
+ vs->enable_ps = !vs->enable_ps;
+ }
+}
+
+void MagicView::OnUpdateViewPixelshader(CCmdUI* pCmdUI)
+{
+ if (video)
+ pCmdUI->SetCheck(video->GetVideoSettings()->enable_ps);
+}
+
+void MagicView::OnViewVisibleshadows()
+{
+ Shadow::SetVisibleShadowVolumes(!Shadow::GetVisibleShadowVolumes());
+}
+
+void MagicView::OnUpdateViewVisibleshadows(CCmdUI* pCmdUI)
+{
+ pCmdUI->SetCheck(Shadow::GetVisibleShadowVolumes());
+}
+
+void MagicView::OnEditUndo()
+{
+ MagicDoc* pDoc = GetDocument();
+ ASSERT_VALID(pDoc);
+ pDoc->Undo();
+
+ Solid* solid = GetDocument()->GetSolid();
+ Selector* selector = GetDocument()->GetSelector();
+
+ if (selector) {
+ selector->UseModel(solid->GetModel());
+ selector->Reselect();
+ }
+
+ Invalidate();
+ pDoc->SetModifiedFlag(TRUE);
+ pDoc->UpdateAllViews(this);
+}
+
+void MagicView::OnUpdateEditUndo(CCmdUI* pCmdUI)
+{
+ MagicDoc* pDoc = GetDocument();
+
+ if (pDoc->NumUndo() > 0) {
+ pCmdUI->Enable(TRUE);
+ pCmdUI->SetText(CString("Undo ") + pDoc->GetUndoName() + CString("\tCtrl+Z"));
+ }
+ else {
+ pCmdUI->Enable(FALSE);
+ pCmdUI->SetText("Can't Undo\tCtrl+Z");
+ }
+}
+
+void MagicView::OnEditRedo()
+{
+ MagicDoc* pDoc = GetDocument();
+ ASSERT_VALID(pDoc);
+ pDoc->Redo();
+
+ Solid* solid = GetDocument()->GetSolid();
+ Selector* selector = GetDocument()->GetSelector();
+
+ if (selector) {
+ selector->UseModel(solid->GetModel());
+ selector->Reselect();
+ }
+
+ Invalidate();
+ pDoc->SetModifiedFlag(TRUE);
+ pDoc->UpdateAllViews(this);
+}
+
+void MagicView::OnUpdateEditRedo(CCmdUI* pCmdUI)
+{
+ MagicDoc* pDoc = GetDocument();
+
+ if (pDoc->NumRedo() > 0) {
+ pCmdUI->Enable(TRUE);
+ pCmdUI->SetText(CString("Redo ") + pDoc->GetRedoName() + CString("\tCtrl+Y"));
+ }
+ else {
+ pCmdUI->Enable(FALSE);
+ pCmdUI->SetText("Can't Redo");
+ }
+}