home *** CD-ROM | disk | FTP | other *** search
- #include <owlrc.h>
- #include <dialog.h>
- #include <applicat.h>
- #include <edit.h>
- #include <button.h>
- #include <mdi.h>
- #include <stdio.h>
- #include <string.h>
- #include <math.h>
- #include <dir.h>
- #include <filedial.h>
-
- #include "vector.h"
- #include "threedq.h"
- #include "3dview.h"
- #include "quake.h"
- #include "qbsp.h"
-
- inline double MaxOf(double v1, double v2)
- {
- return (v1 > v2) ? v1 : v2;
- }
-
- inline long MinLong(long v1, long v2)
- {
- return (v1 > v2) ? v2 : v1;
- }
-
-
- extern ARRAY<vertex_t> vertices;
- extern ARRAY<edge_t> edges;
- extern long numvertices,numedges;
-
- class TThreeDMDIFrame : public TMDIFrame {
- public:
- TThreeDMDIFrame(LPSTR title, LPSTR menu);
- char Filename[MAXPATH];
- protected:
- virtual PTWindowsObject CreateChild();
- void CmPerspective() = [CM_FIRST + CM_PERSPECTIVE];
- void CmMoveIn() = [CM_FIRST + CM_MOVEIN];
- void CmMoveOut() = [CM_FIRST + CM_MOVEOUT];
- void CmPrint() = [CM_FIRST + CM_PRINT];
- };
-
- class TThreeDWindow : public TWindow {
- public:
- TThreeD *ThreeD;
- char Filename[MAXPATH];
- int nUpdates;
-
- POINT MoveStart;
- VECTOR FromStart, AtStart, UpStart;
- BOOL Moving,Ldown,Shifted;
- double Speed,RotSpeed;
-
- TThreeDWindow(PTWindow parent, LPSTR title);
- virtual ~TThreeDWindow() { delete ThreeD; };
- virtual void WMSize(RTMessage Msg) = [WM_FIRST + WM_SIZE] {
- TWindow::WMSize(Msg);
- ::InvalidateRect(HWindow, 0, FALSE); }
- virtual void WMRButtonDown(RTMessage Msg) = [WM_FIRST + WM_RBUTTONDOWN];
- virtual void WMLButtonDown(RTMessage Msg) = [WM_FIRST + WM_LBUTTONDOWN];
- virtual void WMLButtonUp(RTMessage Msg) = [WM_FIRST + WM_LBUTTONUP];
- virtual void WMMouseMove(RTMessage Msg) = [WM_FIRST + WM_MOUSEMOVE];
- virtual void WMRButtonUp(RTMessage) = [WM_FIRST + WM_RBUTTONUP];
-
- void SaveCursor();
- void Paint(HDC dc, PAINTSTRUCT _FAR &);
- };
-
- TThreeDWindow::TThreeDWindow(PTWindow parent, LPSTR title)
- :TWindow(parent,title)
- {
-
- ThreeD = new TThreeD;
- Moving = Ldown = Shifted = FALSE;
- Speed = 4.0;
- RotSpeed = 4.0;
- nUpdates = 0;
- _fstrcpy(Filename,title);
-
- if (ThreeD == NULL) ::MessageBox(HWindow,"Out of memory error","Error",MB_OK | MB_ICONEXCLAMATION);
- else if (ThreeD->Read3DObject(Filename)) {
- ThreeD->SetAt();
- ThreeD->SetFrom();
- }
- else {
- ::MessageBox(HWindow, "Failed to read file", "Error", MB_OK | MB_ICONEXCLAMATION);
- }
- }
-
-
- void TThreeDWindow::Paint(HDC dc, PAINTSTRUCT _FAR &)
- {
-
- RECT rect;
- ::GetClientRect(HWindow, &rect);
- ::FillRect(dc, &rect, HBRUSH(GetStockObject(WHITE_BRUSH)));
-
- ThreeD->Display(dc,rect);
-
- }
-
-
- inline void TThreeDWindow::SaveCursor()
- {
- FromStart = ThreeD->From;
- AtStart = ThreeD->At;
- UpStart = ThreeD->Up;
-
- SetCursorPos(MoveStart.x,MoveStart.y);
-
- nUpdates = 0;
- }
-
-
- void TThreeDWindow::WMRButtonDown(RTMessage Msg)
- {
- if (Msg.WParam & MK_LBUTTON) {
- Ldown = TRUE;
- }
- GetCursorPos(&MoveStart);
- SaveCursor();
- Moving = TRUE;
- nUpdates = 0;
- SetCapture(HWindow);
- ShowCursor(FALSE);
- }
-
-
- void TThreeDWindow::WMLButtonDown(RTMessage Msg)
- {
- if (Moving) {
- Ldown = TRUE;
- SaveCursor();
- }
- }
-
-
- void TThreeDWindow::WMLButtonUp(RTMessage Msg)
- {
- Ldown = FALSE;
- SaveCursor();
- }
-
-
-
- void TThreeDWindow::WMMouseMove(RTMessage Msg)
- {
- if (Moving) {
- if (Ldown) {
- POINT p;
- GetCursorPos(&p);
-
- double x = p.x - MoveStart.x;
- double y = - p.y + MoveStart.y;
-
- VECTOR FtoAt = Subtract(AtStart, FromStart);
- VECTOR Rotate = Cross(FtoAt,UpStart);
-
- Normalize(FtoAt);
- double deg = y * RotSpeed / 360.0;
- VECTOR delta = Add(Multiply(FtoAt,cos(deg)),Multiply(UpStart,sin(deg)));
- ThreeD->At = Add(ThreeD->From,delta);
-
- deg = x *RotSpeed / 360.0;
- delta = Cross(Rotate,delta);
- Normalize(delta);
- Normalize(Rotate);
- ThreeD->Up = Add(Multiply(delta,cos(deg)),Multiply(Rotate,sin(deg)));
- }
- else {
- if (Msg.WParam & MK_SHIFT) {
- // SHIFT = Strafe mode.
- if (!Shifted) {
- SaveCursor();
- Shifted = TRUE;
- return;
- }
- POINT p;
- GetCursorPos(&p);
- double x = p.x - MoveStart.x;
- double y = - p.y + MoveStart.y;
-
- VECTOR delta = Multiply(UpStart,y * Speed / Mag(UpStart));
- VECTOR AtUpCross = Cross(Subtract(AtStart, FromStart),UpStart);
- delta = Add(delta, Multiply(AtUpCross,x * Speed / Mag(AtUpCross)));
- ThreeD->From = Add(FromStart,delta);
- ThreeD->At = Add(AtStart, delta);
- }
- else {
- if (Shifted) {
- SaveCursor();
- Shifted = FALSE;
- return;
- }
- POINT p;
- GetCursorPos(&p);
- double x = p.x - MoveStart.x;
- double y = - p.y + MoveStart.y;
-
- VECTOR FtoAt = Subtract(AtStart, FromStart);
- VECTOR delta = Multiply(FtoAt,y*Speed/Mag(FtoAt));
- ThreeD->From = Add(FromStart,delta);
-
- double deg = x * RotSpeed / 360.0;
- VECTOR Rotate = Cross(FtoAt,UpStart);
- delta = Add(Multiply(FtoAt,cos(deg)),Multiply(Rotate,sin(deg)));
- ThreeD->At = Add(ThreeD->From,delta);
- }
- }
- ::InvalidateRect(HWindow, 0, FALSE);
- if (nUpdates++ > 3) SaveCursor();
- }
- }
-
- void TThreeDWindow::WMRButtonUp(RTMessage)
- {
- Moving = FALSE;
- Ldown = FALSE;
- ShowCursor(TRUE);
- ReleaseCapture();
- }
-
-
- TThreeDMDIFrame::TThreeDMDIFrame(LPSTR title, LPSTR menu): TMDIFrame(title, menu) { }
-
- PTWindowsObject TThreeDMDIFrame::CreateChild()
- {
- char *Filename = (char *) malloc(MAXPATH);
- strcpy(Filename,"*.bsp");
- TFileDialog *tfd = new TFileDialog(this,SD_FILEOPEN,Filename);
- if (tfd == NULL) OutOfMemory();
- GetModule()->ExecDialog(tfd);
-
- LoadQuake(Filename);
-
- FILE *fp;
- long i,nedge=0;
- strcpy(Filename, "test.dat");
-
- if ((fp = fopen(Filename,"w")) == NULL) {
- ::MessageBox(HWindow,"Couldn't open file",0,MB_OK);
- return NULL;
- }
-
- for(i=0;i<numedges;i++) {
- if ((edges[i].startvertex+1 < NUMVERTICES) &&
- (edges[i].endvertex+1 < NUMVERTICES) &&
- (edges[i].startvertex != edges[i].endvertex))
- nedge++;
- }
-
- fprintf(fp,"0\n");
- fprintf(fp,"%ld %ld\n",MinLong(numvertices,NUMVERTICES),nedge*3);
-
- for(i=0;i<MinLong(numvertices,NUMVERTICES);i++) {
- fprintf(fp,"%f %f %f\n",vertices[i].x,vertices[i].y,vertices[i].z);
- }
-
- for(i=0;i<numedges;i++) {
- if ((edges[i].startvertex+1<NUMVERTICES) &&
- (edges[i].endvertex+1 < NUMVERTICES) &&
- (edges[i].startvertex != edges[i].endvertex))
- fprintf(fp,"%u %u -1\n",edges[i].startvertex+1,
- edges[i].endvertex+1);
- }
-
- fclose(fp);
-
- return GetApplication()->MakeWindow(new TThreeDWindow(this, Filename));
-
- }
-
-
- void TThreeDMDIFrame::CmPerspective()
- {
- }
-
-
- void TThreeDMDIFrame::CmMoveIn()
- {
- }
-
-
- void TThreeDMDIFrame::CmMoveOut()
- {
- }
-
-
- void TThreeDMDIFrame::CmPrint()
- {
- }
-
-
- class TThreeDApp : public TApplication {
- public:
- TThreeDApp(LPSTR AName, HANDLE AnInstance, HANDLE APrevInstance, LPSTR ACmdLine, int ACmdShow):
- TApplication(AName, AnInstance, APrevInstance, ACmdLine, ACmdShow) { };
- void InitMainWindow();
- };
-
- void TThreeDApp::InitMainWindow()
- {
- MainWindow = new TThreeDMDIFrame("Tjoe","MENU_1");
- }
-
-
- int PASCAL WinMain(HANDLE hInstance,HANDLE hPrevInstance,
- LPSTR lpCmdLine, int nCmdShow)
- {
- TThreeDApp WinApp("Multiple views",hInstance,hPrevInstance,
- lpCmdLine,nCmdShow);
- WinApp.Run();
- return WinApp.Status;
- }