//#define _USEDIRECTDRAW_ #include #include #include #include #include #include #include #include #include #include #include char MainWindow::szClassName[]="DDrawTest"; char MainWindow::szMenuName[]=""; MainWindow::MainWindow(void) : mTextureBitmap("c:\\work\\scene\\media\\bmp\\FLAT221.bmp") { mPaintHandler.setCallback(this,&MainWindow::paintHandler); mDestroyHandler.setCallback(this,&MainWindow::destroyHandler); mCommandHandler.setCallback(this,&MainWindow::commandHandler); mKeyDownHandler.setCallback(this,&MainWindow::keyDownHandler); mKeyUpHandler.setCallback(this,&MainWindow::keyUpHandler); mSizeHandler.setCallback(this,&MainWindow::sizeHandler); mCreateHandler.setCallback(this,&MainWindow::createHandler); mTimerHandler.setCallback(this,&MainWindow::timerHandler); mActivateAppHandler.setCallback(this,&MainWindow::activateAppHandler); mDisplayChangeHandler.setCallback(this,&MainWindow::displayChangeHandler); mDialogCodeHandler.setCallback(this,&MainWindow::dialogCodeHandler); insertHandlers(); registerClass(); ::CreateWindow(szClassName,szClassName, WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX|WS_MAXIMIZEBOX|WS_DLGFRAME|WS_CLIPCHILDREN|WS_SIZEBOX, CW_USEDEFAULT,CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT, NULL,NULL,processInstance(),(LPSTR)this); show(SW_SHOW); update(); } MainWindow::~MainWindow() { destroy(); } void MainWindow::insertHandlers(void) { insertHandler(VectorHandler::DestroyHandler,&mDestroyHandler); insertHandler(VectorHandler::PaintHandler,&mPaintHandler); insertHandler(VectorHandler::CommandHandler,&mCommandHandler); insertHandler(VectorHandler::SizeHandler,&mSizeHandler); insertHandler(VectorHandler::KeyDownHandler,&mKeyDownHandler); insertHandler(VectorHandler::KeyUpHandler,&mKeyUpHandler); insertHandler(VectorHandler::CreateHandler,&mCreateHandler); insertHandler(VectorHandler::TimerHandler,&mTimerHandler); insertHandler(VectorHandler::ActivateAppHandler,&mActivateAppHandler); insertHandler(VectorHandler::DisplayChangeHandler,&mDisplayChangeHandler); insertHandler(VectorHandler::DialogCodeHandler,&mDialogCodeHandler); } void MainWindow::removeHandlers(void) { removeHandler(VectorHandler::DestroyHandler,&mDestroyHandler); removeHandler(VectorHandler::PaintHandler,&mPaintHandler); removeHandler(VectorHandler::CommandHandler,&mCommandHandler); removeHandler(VectorHandler::SizeHandler,&mSizeHandler); removeHandler(VectorHandler::KeyDownHandler,&mKeyDownHandler); insertHandler(VectorHandler::KeyDownHandler,&mKeyDownHandler); removeHandler(VectorHandler::CreateHandler,&mCreateHandler); removeHandler(VectorHandler::TimerHandler,&mTimerHandler); removeHandler(VectorHandler::ActivateAppHandler,&mActivateAppHandler); removeHandler(VectorHandler::DisplayChangeHandler,&mDisplayChangeHandler); removeHandler(VectorHandler::DialogCodeHandler,&mDialogCodeHandler); } void MainWindow::registerClass(void)const { WNDCLASS wndClass; if(::GetClassInfo(processInstance(),className(),(WNDCLASS FAR*)&wndClass))return; wndClass.style =CS_HREDRAW|CS_VREDRAW|CS_OWNDC|CS_DBLCLKS; wndClass.lpfnWndProc =(WNDPROC)Window::WndProc; wndClass.cbClsExtra =0; wndClass.cbWndExtra =sizeof(MainWindow*); wndClass.hInstance =processInstance(); wndClass.hIcon =::LoadIcon(NULL,IDI_APPLICATION); wndClass.hCursor =::LoadCursor(NULL,IDC_ARROW); wndClass.hbrBackground =(HBRUSH)::GetStockObject(BLACK_BRUSH); wndClass.lpszMenuName =szMenuName; wndClass.lpszClassName =szClassName; ::RegisterClass(&wndClass); assert(0!=::GetClassInfo(processInstance(),className(),(WNDCLASS FAR*)&wndClass)); } #if defined(_USEDIRECTDRAW_) CallbackData::ReturnType MainWindow::createHandler(CallbackData &/*someCallbackData*/) { SurfaceCapabilities surfaceCapabilities(SurfaceCapabilities::Capabilities(SurfaceCapabilities::PrimarySurface|SurfaceCapabilities::Device3D)); SurfaceDescription surfaceDescription; mDevice3D=::new Device3D(*this); mDevice3D.disposition(PointerDisposition::Delete); mDevice3D->focusPoint(Point3D(0,0,-1)); mDirectDraw=::new DirectDraw(); mDirectDraw.disposition(PointerDisposition::Delete); mDirectDraw->setCooperativeLevel(*this,DirectDraw::CoopFlags(DirectDraw::Exclusive|DirectDraw::FullScreen)); mDirectDraw->setDisplayMode(DisplayWidth,DisplayHeight,DisplayBPP); surfaceDescription.flags(SurfaceDescription::Capabilities); surfaceDescription.surfaceCapabilities(surfaceCapabilities); if(!mDirectDraw->createSurface(surfaceDescription,mPrimarySurface).okResult())return FALSE; mDirectPalette.readPalette("c:\\work\\scene\\media\\bmp\\redwall1.pal"); // mDirectPalette.systemPalette(); mDirectDraw->createPalette(mDirectPalette); mPrimarySurface.setPalette(mDirectPalette); mPrimarySurface.lock(); mPrimarySurface.unlock(); // mDirectDraw->createDirect3D(mPrimarySurface,mDirect3D,mDirectDevice3D); return FALSE; } CallbackData::ReturnType MainWindow::destroyHandler(CallbackData &/*someCallbackData*/) { mDirectPalette.destroy(); mDirectDevice3D.destroy(); mDirect3D.destroy(); mPrimarySurface.destroy(); mDirectDraw.destroy(); removeHandlers(); ::PostQuitMessage(0); return (CallbackData::ReturnType)FALSE; } #else CallbackData::ReturnType MainWindow::createHandler(CallbackData &/*someCallbackData*/) { // PurePalette purePalette("c:\\work\\scene\\media\\bmp\\redwall1.pal"); mPalette="c:\\work\\scene\\media\\bmp\\redwall1.pal"; mDevice3D=::new Device3D(*this); mDevice3D.disposition(PointerDisposition::Delete); mDevice3D->focusPoint(Point3D(0,0,-1)); mDIBitmap=::new DIBitmap(*mDevice3D,width(),height(),mPalette); mDIBitmap.disposition(PointerDisposition::Delete); mPalette.usePalette(*mDevice3D,TRUE); return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::destroyHandler(CallbackData &/*someCallbackData*/) { removeHandlers(); ::PostQuitMessage(0); return FALSE; } #endif CallbackData::ReturnType MainWindow::activateAppHandler(CallbackData &someCallbackData) { return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::displayChangeHandler(CallbackData &someCallbackData) { return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::sizeHandler(CallbackData &/*someCallbackData*/) { return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::commandHandler(CallbackData &someCallbackData) { switch(someCallbackData.wmCommandID()) { default : break; } return (CallbackData::ReturnType)FALSE; } #if defined(_USEDIRECTDRAW_) CallbackData::ReturnType MainWindow::paintHandler(CallbackData &/*someCallbackData*/) { Vector3D dstPoints; Triangle3D angle3D; Triangle angle; // mDirectDraw->setCooperativeLevel(*this,DirectDraw::CoopFlags(DirectDraw::Normal)); mDirectDraw->setCooperativeLevel(*this,DirectDraw::CoopFlags(DirectDraw::Exclusive|DirectDraw::FullScreen)); mDirectDraw->setDisplayMode(DisplayWidth,DisplayHeight,DisplayBPP); mDirectDraw->restoreAllSurfaces(); // dstPoints[0]=Point3D(-20,20,10); // dstPoints[1]=Point3D(20,20,10); // dstPoints[2]=Point3D(20,-20,10); // dstPoints[3]=Point3D(-20,-20,10); angle3D[0]=Point3D(-20,0,0); angle3D[1]=Point3D(0,20,0); angle3D[2]=Point3D(20,0,0); mPrimarySurface.lock(); mPrimarySurface.clear(); // DirectTexture directTexture(dstPoints,mTextureBitmap,mPrimarySurface,*mDevice3D); DirectTexture directTexture(angle3D,mTextureBitmap,mPrimarySurface,*mDevice3D); directTexture.mapTexture(); mDevice3D->mapCoordinates(angle3D,angle); mPrimarySurface.line(angle[0],angle[1],192); mPrimarySurface.line(angle[1],angle[2],192); mPrimarySurface.line(angle[2],angle[0],192); mPrimarySurface.unlock(); return (CallbackData::ReturnType)FALSE; } #else CallbackData::ReturnType MainWindow::paintHandler(CallbackData &/*someCallbackData*/) { Triangle3D angle3D[3]; Triangle angle; //VERTEX(-4,16,-25); //VERTEX(-24,16,-25); //VERTEX(-9,-10,11); //VERTEX(5,-19,0); //VERTEX(-11,12,-36); //VERTEX(-31,12,-36); //VERTEX(-11,-19,2); //VERTEX(3,-28,-8); //VERTEX(-2,1,-28); //VERTEX(-17,10,-17); //VERTEX(-10,14,-5); //VERTEX(4,5,-16); //SURFACE(3,0,2); //SURFACE(2,0,1); //SURFACE(7,3,2); //SURFACE(7,2,6); //SURFACE(3,7,0); //SURFACE(0,7,4); //SURFACE(0,4,1); //SURFACE(1,4,5); //SURFACE(6,2,1); //SURFACE(6,1,5); //SURFACE(5,4,6); //SURFACE(6,4,7); (angle3D[0])[0]=Point3D(5,-19,0); (angle3D[0])[1]=Point3D(-4,16,-25); (angle3D[0])[2]=Point3D(-9,-10,11); (angle3D[1])[0]=Point3D(-9,-10,11); (angle3D[1])[1]=Point3D(-4,16,-25); (angle3D[1])[2]=Point3D(-24,-16,-25); (angle3D[2])[0]=Point3D(3,-28,-8); (angle3D[2])[1]=Point3D(5,-19,0); (angle3D[2])[2]=Point3D(-9,-10,11); // Vector3D dstPoints; // dstPoints[0]=Point3D(-20,20,10); // dstPoints[1]=Point3D(20,20,10); // dstPoints[2]=Point3D(20,-20,10); // dstPoints[3]=Point3D(-20,-20,10); // Texture texture(dstPoints,mTextureBitmap,*mDIBitmap,*mDevice3D); mDIBitmap->clearBits(); for(int index=0;indexmapCoordinates(angle3D[index],angle); mDIBitmap->line(angle[0],angle[1],192); mDIBitmap->line(angle[1],angle[2],192); mDIBitmap->line(angle[2],angle[0],192); } mDIBitmap->bitBlt(*mDevice3D); #if 0 Triangle3D angle3D; Triangle angle; mDIBitmap->clearBits(); angle3D[0]=Point3D(0,0,0); angle3D[1]=Point3D(128,0,0); angle3D[2]=Point3D(0,128,0); { DirectTriTexture directTriTexture(angle3D,mTextureBitmap,*mDIBitmap,*mDevice3D); directTriTexture.mapTexture(); } mDevice3D->mapCoordinates(angle3D,angle); mDIBitmap->line(angle[0],angle[1],192); mDIBitmap->line(angle[1],angle[2],192); mDIBitmap->line(angle[2],angle[0],192); mDIBitmap->bitBlt(*mDevice3D); #endif return (CallbackData::ReturnType)FALSE; } #endif CallbackData::ReturnType MainWindow::timerHandler(CallbackData &/*someCallbackData*/) { return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::dialogCodeHandler(CallbackData &/*someCallbackData*/) { return (CallbackData::ReturnType)DLGC_WANTALLKEYS; } CallbackData::ReturnType MainWindow::keyUpHandler(CallbackData &/*someCallbackData*/) { return (CallbackData::ReturnType)FALSE; } CallbackData::ReturnType MainWindow::keyDownHandler(CallbackData &someCallbackData) { KeyData keyData(someCallbackData); int repeatIndex; switch(keyData.virtualKey()) { case inKey : if(shiftKeyPressed())mDevice3D->cameraTwistDegrees(mDevice3D->cameraTwistDegrees()-ThetaDelta); mDevice3D->viewPlaneDistance(mDevice3D->viewPlaneDistance()+ViewDelta); invalidate(FALSE); break; case outKey : if(shiftKeyPressed())mDevice3D->cameraTwistDegrees(mDevice3D->cameraTwistDegrees()+ThetaDelta); mDevice3D->viewPlaneDistance(mDevice3D->viewPlaneDistance()-ViewDelta); invalidate(FALSE); break; case VK_UP : for(repeatIndex=0;repeatIndexcameraPoint()); cameraPoint.y(cameraPoint.y()+TurnDelta); mDevice3D->cameraPoint(cameraPoint); return TRUE; } WORD MainWindow::handleDownArrow(void) { Point3D cameraPoint(mDevice3D->cameraPoint()); cameraPoint.y(cameraPoint.y()-TurnDelta); mDevice3D->cameraPoint(cameraPoint); return TRUE; } WORD MainWindow::handleLeftArrow(void) { Point3D cameraPoint(mDevice3D->cameraPoint()); if(shiftKeyPressed())mDevice3D->cameraTwistDegrees(mDevice3D->cameraTwistDegrees()-ThetaDelta); else cameraPoint.x(cameraPoint.x()+TurnDelta); mDevice3D->cameraPoint(cameraPoint); return TRUE; } WORD MainWindow::handleRightArrow(void) { Point3D cameraPoint(mDevice3D->cameraPoint()); if(shiftKeyPressed())mDevice3D->cameraTwistDegrees(mDevice3D->cameraTwistDegrees()+ThetaDelta); else cameraPoint.x(cameraPoint.x()-TurnDelta); mDevice3D->cameraPoint(cameraPoint); return TRUE; } inline WORD MainWindow::shiftKeyPressed(void)const { return ::GetKeyState(VK_SHIFT)&0x8000; }