home *** CD-ROM | disk | FTP | other *** search
- #define STRICT
-
- // Includes standard Windows
- #include <windows.h>
- #include <windowsx.h>
- #include <time.h>
- #include <stdlib.h>
- #include <malloc.h>
- #include <memory.h>
- #include <stdio.h>
-
- #ifdef _AMIGA_
- #include <stdarg.h>
- #endif
-
- // Includes D3D
- #define D3D_OVERLOADS
- #include <ddraw.h>
- #include <d3d.h>
- #include <d3dx.h>
-
- // Includes utilitaires D3D
- #include "d3dmath.h"
- #include "d3dutil.h"
- #include "D3DEnum.h"
-
- // Ids Resources
- #include "resource.h"
-
- // Constantes
- #include "const.h"
-
- // Types
- #include "types.h"
-
- // Variables globales projet
- #include "vars.h"
-
- // Prototypes fonctions autres modules
- #include "proto.h"
-
- // Macros
- #include "macros.h"
-
- /*
- int APIENTRY WinMain(HINSTANCE hInstance,
- HINSTANCE hPrevInstance,
- LPSTR lCmdLine,
- int iShowMode)
- {
- MSG hMessage;
- WNDCLASS wcPersp, wcPlanar, wcMenu;
- RECT rRectangle;
- HDC hdcScreen = GetDC(NULL);
-
- int iScreenWidth = GetDeviceCaps(hdcScreen, HORZRES),
- iScreenHeight = GetDeviceCaps(hdcScreen, VERTRES);
-
- ReleaseDC(NULL, hdcScreen);
-
- #ifndef NO3D
- HRESULT hResult;
- #endif
-
- // Ne pas se lancer si l'appli tourne déjà
- if (hPrevInstance) return(FALSE);
-
- // Stocker le pointeur d'instance courante
- hInst = hInstance;
-
- // Initialiser le générateur aléatoire
- srand( (unsigned)time( NULL ) );
-
- // Initialiser les tableaux d'objets 3D
- vDeleteObjects();
-
- // Créer les gadgets sculpt 3D
- vPrepareGadgets();
-
- // Enregistrer la classe de fenêtre menu / trace
- wcMenu.style = CS_HREDRAW | CS_VREDRAW;
- wcMenu.lpfnWndProc = (WNDPROC) lrMenuWndProc;
- wcMenu.cbClsExtra = 0;
- wcMenu.cbWndExtra = 0;
- wcMenu.hInstance = hInstance;
- wcMenu.hIcon = NULL;
- wcMenu.hCursor = LoadCursor(NULL, IDC_ARROW);
- wcMenu.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wcMenu.lpszMenuName = MAKEINTRESOURCE(IDR_MENU);
- wcMenu.lpszClassName = sMenu;
- RegisterClass(&wcMenu);
-
- // Créer la fenêtre menu / trace
- hWndMenu = CreateWindow(sMenu, NULL, WS_OVERLAPPEDWINDOW,
- 0, 0, iScreenWidth, iScreenHeight / 9,
- NULL, NULL, hInstance, NULL);
- if (!hWndMenu) return (FALSE);
-
- // Ajouter la listbox à la fenêtre menu / trace
- GetClientRect(hWndMenu, &rRectangle);
- hWndTrace = CreateWindow("LISTBOX",
- NULL,
- WS_BORDER | WS_CHILD | WS_VSCROLL | WS_VISIBLE,
- rRectangle.left, rRectangle.top, rRectangle.right, rRectangle.bottom,
- hWndMenu, NULL, hInstance, NULL);
-
- sprintf(cTitle, "%s %s", "sKulpt D3D - 1999-2000 Stéphane Guillard - Build", __TIMESTAMP__);
- SendMessage(hWndMenu, WM_SETTEXT, 0, (LPARAM)cTitle);
-
- ShowWindow(hWndMenu, iShowMode);
- UpdateWindow(hWndMenu);
-
- // A partir d'ici, les traces vTrace() sont possibles
-
- // Enregistrer la classe de fenêtre vue 3D
- vTrace("Enregistrement classe fenêtre vue 3d");
- wcPersp.style = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE;
- wcPersp.lpfnWndProc = (WNDPROC) lrPerspWndProc;
- wcPersp.cbClsExtra = 0;
- wcPersp.cbWndExtra = 0;
- wcPersp.hInstance = hInstance;
- wcPersp.hIcon = NULL;
- wcPersp.hCursor = LoadCursor(NULL, IDC_ARROW);
- wcPersp.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wcPersp.lpszMenuName = NULL;
- wcPersp.lpszClassName = sPersp;
- RegisterClass(&wcPersp);
-
- // Créer la fenêtre vue 3D
- vTrace("Création fenêtre vue 3d");
- hWndPersp = CreateWindowEx(WS_EX_TOOLWINDOW, sPersp, NULL, WS_OVERLAPPEDWINDOW,
- iScreenWidth/2, iScreenHeight / 9, iScreenWidth/2, 4 * iScreenHeight / 9,
- hWndMenu, NULL, hInstance, NULL);
- if (!hWndPersp) return (FALSE);
-
- #ifndef NO3D
-
- vTrace("Attachement DirectDraw 7...");
- hrPreInitD3D();
-
- vTrace("Pré-scan des devices D3D disponibles...");
- D3DEnum_EnumerateDevices(NULL);
-
- vTrace("Pré-sélection du device D3D le plus performant...");
- D3DEnum_SelectDefaultDevice(&m_pDeviceInfo);
-
- vTrace("Device pré-sélectionné : %s", m_pDeviceInfo -> strDesc);
-
- do
- {
- vTrace("Dialog sélection device...");
- D3DEnum_UserChangeDevice(&m_pDeviceInfo);
- vTrace("Device sélectionné : %s", m_pDeviceInfo -> strDesc);
-
- // Initialisation Direct3D (DirectX 7) en mode fenêtré
- vTrace("Initialisation D3D7 sur device choisi...");
- hResult = hrInitD3D(hWndPersp, m_pDeviceInfo->pDeviceGUID);// IID_IDirect3DTnLHalDevice);
-
- if (FAILED(hResult)) hrCloseD3D(FALSE);
- }
- while (FAILED(hResult));
-
- sprintf(cTitle, "%s(%s)", XDC_S_Title3D, m_pDeviceInfo->strDesc);
-
- #else
- sprintf(cTitle, "3D désactivée dans cette configuration");
- #endif
-
- // Mettre à jour le titre de la fenêtre 3D et l'afficher
- SendMessage(hWndPersp, WM_SETTEXT, 0, (LPARAM)cTitle);
- ShowWindow(hWndPersp, iShowMode);
- UpdateWindow(hWndPersp);
-
- #ifndef NO3D
- // Initialiser l'environnement 3D
- vTrace("Initialisation environnement applicatif 3D");
- if (FAILED(hResult = hrInitWorld(lpd3dDevice)))
- {
- hrCloseD3D(TRUE);
- return FALSE;
- }
- #endif
-
- // Initialisation librairie tools D3D
- if(FAILED(D3DXInitialize()))
- return FALSE;
-
- // Forcer le rafraichissement complet de la fenêtre 3D
- vForce3DRefresh(XDC_MODE_COMPLET);
-
- // Enregistrer la classe de fenêtre vue 2D
- vTrace("Enregistrement classe fenêtre vue 2d");
- wcPlanar.style = CS_HREDRAW | CS_VREDRAW | CS_NOCLOSE | CS_DBLCLKS;
- wcPlanar.lpfnWndProc = (WNDPROC) lrPlanarWndProc;
- wcPlanar.cbClsExtra = 0;
- wcPlanar.cbWndExtra = sizeof(WinThings *);
- wcPlanar.hInstance = hInstance;
- wcPlanar.hIcon = NULL;
- wcPlanar.hCursor = LoadCursor(NULL, IDC_ARROW);
- wcPlanar.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
- wcPlanar.lpszMenuName = NULL;
- wcPlanar.lpszClassName = sPlanar;
- RegisterClass(&wcPlanar);
-
- vTrace("Création fenêtre 2D : vue dessus");
- hWndTop = CreateWindowEx(WS_EX_TOOLWINDOW, sPlanar, "Vue de dessus", WS_OVERLAPPEDWINDOW,
- 0, iScreenHeight / 9, iScreenWidth/2, 4 * iScreenHeight / 9,
- hWndMenu, NULL, hInstance, NULL);
- if (!hWndTop) return (FALSE);
- SetWindowLong(hWndTop, GWL_USERDATA, XDC_WID_TOP);
- ShowWindow(hWndTop, iShowMode);
- UpdateWindow(hWndTop);
-
- vTrace("Création fenêtre 2D : vue face");
- hWndFace = CreateWindowEx(WS_EX_TOOLWINDOW, sPlanar, "Vue de face", WS_OVERLAPPEDWINDOW,
- 0, 5 * iScreenHeight / 9, iScreenWidth/2, 4 * iScreenHeight / 9,
- hWndMenu, NULL, hInstance, NULL);
- if (!hWndFace) return (FALSE);
- SetWindowLong(hWndFace, GWL_USERDATA, XDC_WID_FACE);
- ShowWindow(hWndFace, iShowMode);
- UpdateWindow(hWndFace);
-
- vTrace("Création fenêtre 2D : vue droite");
- hWndRight = CreateWindowEx(WS_EX_TOOLWINDOW, sPlanar, "Vue de droite", WS_OVERLAPPEDWINDOW,
- iScreenWidth/2, 5 * iScreenHeight / 9, iScreenWidth/2, 4 * iScreenHeight / 9,
- hWndMenu, NULL, hInstance, NULL);
- if (!hWndRight) return (FALSE);
- SetWindowLong(hWndRight, GWL_USERDATA, XDC_WID_SIDE);
- ShowWindow(hWndRight, iShowMode);
- UpdateWindow(hWndRight);
-
- FSInit();
-
- // Afficher l'AboutBox
- vLogo();
-
- // A partir de maintenant il est possible de dessiner dans la fenêtre 3D
- bReady = TRUE;
-
- // Mettre à jour les checkmarks des menus
- vUpdateMenu();
-
- // Traiter les messages windows jusqu'à réception d'un QuitMessage
- vTrace("Entrée dans la boucle de traitement événements");
- while (GetMessage(&hMessage, NULL, 0, 0))
- {
- TranslateMessage(&hMessage);
- DispatchMessage(&hMessage);
- }
-
- #ifndef NO3D
- // Fermer Direct3D
- hrCloseD3D(TRUE);
- #endif
-
- // Détruire les gadgets Sculpt 3D
- vEraseGadgets();
-
- // Libérer les classes de fenêtres
- UnregisterClass(sPlanar, hInst);
- UnregisterClass(sPersp, hInst);
- UnregisterClass(sMenu, hInst);
-
- FSClose();
-
- return (hMessage.wParam);
- }
- */
-
- // Sortir une trace formattée dans la listbox de la fenêtre trace
- void vTrace(LPSTR fmt, ... )
- {
- char cBuffer[256];
- va_list args;
-
- // Formatter la trace
- va_start(args, fmt);
- vsprintf(cBuffer, fmt, args);
- va_end(args);
-
- strcat(cBuffer, "\n");
-
- #ifndef _AMIGA_
- // Envoyer la trace à la listbox
- LRESULT lRes = SendMessage(hWndTrace, LB_ADDSTRING, 0, (LPARAM) (LPCSTR) cBuffer);
-
- // Si plus de place alors resetter la listbox
- if (lRes == LB_ERRSPACE)
- {
- SendMessage(hWndTrace, LB_RESETCONTENT, 0, 0L);
- lRes = SendMessage(hWndTrace, LB_ADDSTRING, 0, (LPARAM) (LPCSTR) cBuffer);
- }
-
- // Mettre le curseur de la listbox sur la trace
- SendMessage(hWndTrace, LB_SETTOPINDEX, (WPARAM)lRes, 0L);
- #else
- if (bConsoleOpened)
- ConPutS(cBuffer);
- else
- printf(cBuffer);
- #endif
- }
-
- /*
- // Préparer les hdc de sgadgets sculpt 3D
- void vPrepareGadgets(void)
- {
- HDC hdcWork = GetDC(hWndTop);
-
- gAddPoint.hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_ADD_POINT));
- gCenter.hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_CENTER));
- gGoDown.hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_GO_DOWN));
- gGoLeft.hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_GO_LEFT));
- gGoUp.hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_GO_UP));
- gGoRight.hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_GO_RIGHT));
- gGrab.hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_GRAB));
- gMakeTri.hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_MAKE_TRI));
- gReverse.hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_REVERSE));
- gRotAnti.hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_ROT_ANTI));
- gRotClock.hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_ROT_CLOCK));
- gZoomIn.hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_ZOOM_IN));
- gZoomOut.hbm = LoadBitmap(hInst, MAKEINTRESOURCE(IDB_ZOOM_OUT));
-
- gAddPoint.hdc = CreateCompatibleDC(hdcWork);
- gCenter.hdc = CreateCompatibleDC(hdcWork);
- gGoDown.hdc = CreateCompatibleDC(hdcWork);
- gGoLeft.hdc = CreateCompatibleDC(hdcWork);
- gGoUp.hdc = CreateCompatibleDC(hdcWork);
- gGoRight.hdc = CreateCompatibleDC(hdcWork);
- gGrab.hdc = CreateCompatibleDC(hdcWork);
- gMakeTri.hdc = CreateCompatibleDC(hdcWork);
- gReverse.hdc = CreateCompatibleDC(hdcWork);
- gRotAnti.hdc = CreateCompatibleDC(hdcWork);
- gRotClock.hdc = CreateCompatibleDC(hdcWork);
- gZoomIn.hdc = CreateCompatibleDC(hdcWork);
- gZoomOut.hdc = CreateCompatibleDC(hdcWork);
-
- gAddPoint.hold = SelectObject(gAddPoint.hdc, gAddPoint.hbm);
- gCenter.hold = SelectObject(gCenter.hdc, gCenter.hbm);
- gGoDown.hold = SelectObject(gGoDown.hdc, gGoDown.hbm);
- gGoLeft.hold = SelectObject(gGoLeft.hdc, gGoLeft.hbm);
- gGoUp.hold = SelectObject(gGoUp.hdc, gGoUp.hbm);
- gGoRight.hold = SelectObject(gGoRight.hdc, gGoRight.hbm);
- gGrab.hold = SelectObject(gGrab.hdc, gGrab.hbm);
- gMakeTri.hold = SelectObject(gMakeTri.hdc, gMakeTri.hbm);
- gReverse.hold = SelectObject(gReverse.hdc, gReverse.hbm);
- gRotAnti.hold = SelectObject(gRotAnti.hdc, gRotAnti.hbm);
- gRotClock.hold = SelectObject(gRotClock.hdc, gRotClock.hbm);
- gZoomIn.hold = SelectObject(gZoomIn.hdc, gZoomIn.hbm);
- gZoomOut.hold = SelectObject(gZoomOut.hdc, gZoomOut.hbm);
-
- ReleaseDC(hWndTop, hdcWork);
- }
-
- // Dépréparer les hdc des gadgets sculpt 3D
- void vEraseGadgets(void)
- {
- SelectObject(gAddPoint.hdc, gAddPoint.hold);
- SelectObject(gCenter.hdc, gCenter.hold);
- SelectObject(gGoDown.hdc, gGoDown.hold);
- SelectObject(gGoLeft.hdc, gGoLeft.hold);
- SelectObject(gGoUp.hdc, gGoUp.hold);
- SelectObject(gGoRight.hdc, gGoRight.hold);
- SelectObject(gGrab.hdc, gGrab.hold);
- SelectObject(gMakeTri.hdc, gMakeTri.hold);
- SelectObject(gReverse.hdc, gReverse.hold);
- SelectObject(gRotAnti.hdc, gRotAnti.hold);
- SelectObject(gRotClock.hdc, gRotClock.hold);
- SelectObject(gZoomIn.hdc, gZoomIn.hold);
- SelectObject(gZoomOut.hdc, gZoomOut.hold);
-
- DeleteObject(gAddPoint.hbm);
- DeleteObject(gCenter.hbm);
- DeleteObject(gGoDown.hbm);
- DeleteObject(gGoLeft.hbm);
- DeleteObject(gGoUp.hbm);
- DeleteObject(gGoRight.hbm);
- DeleteObject(gGrab.hbm);
- DeleteObject(gMakeTri.hbm);
- DeleteObject(gReverse.hbm);
- DeleteObject(gRotAnti.hbm);
- DeleteObject(gRotClock.hbm);
- DeleteObject(gZoomIn.hbm);
- DeleteObject(gZoomOut.hbm);
-
- DeleteDC(gAddPoint.hdc);
- DeleteDC(gCenter.hdc);
- DeleteDC(gGoDown.hdc);
- DeleteDC(gGoLeft.hdc);
- DeleteDC(gGoUp.hdc);
- DeleteDC(gGoRight.hdc);
- DeleteDC(gGrab.hdc);
- DeleteDC(gMakeTri.hdc);
- DeleteDC(gReverse.hdc);
- DeleteDC(gRotAnti.hdc);
- DeleteDC(gRotClock.hdc);
- DeleteDC(gZoomIn.hdc);
- DeleteDC(gZoomOut.hdc);
- }
- */
-