Files
Work/ddraw/MAINWND.CPP
2024-08-07 09:16:27 -04:00

394 lines
13 KiB
C++

//#define _USEDIRECTDRAW_
#include <ddraw/mainwnd.hpp>
#include <ddraw/draw.hpp>
#include <ddraw/sfccaps.hpp>
#include <ddraw/sfcdesc.hpp>
#include <ddraw/surface.hpp>
#include <ddraw/pixform.hpp>
#include <ddraw/texture.hpp>
#include <engine/device3d.hpp>
#include <engine/texture.hpp>
#include <common/keydata.hpp>
#include <stdio.h>
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;index<sizeof(angle3D)/sizeof(Triangle3D);index++)
{
Texture texture(angle3D[index],mTextureBitmap,*mDIBitmap,*mDevice3D,Texture::MapLowerLeft);
texture.mapTexture();
}
for(index=0;index<sizeof(angle3D)/sizeof(Triangle3D);index++)
{
mDevice3D->mapCoordinates(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;repeatIndex<keyData.repeatCount();repeatIndex++)if(!handleUpArrow())break;
invalidate(FALSE);
break;
case VK_DOWN :
for(repeatIndex=0;repeatIndex<keyData.repeatCount();repeatIndex++)if(!handleDownArrow())break;
invalidate(FALSE);
break;
case VK_LEFT :
for(repeatIndex=0;repeatIndex<keyData.repeatCount();repeatIndex++)if(!handleLeftArrow())break;
invalidate(FALSE);
break;
case VK_RIGHT :
for(repeatIndex=0;repeatIndex<keyData.repeatCount();repeatIndex++)if(!handleRightArrow())break;
invalidate(FALSE);
break;
}
return (CallbackData::ReturnType)FALSE;
}
WORD MainWindow::handleUpArrow(void)
{
Point3D cameraPoint(mDevice3D->cameraPoint());
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;
}