Files
Cyd 2b8ca921cb Initial full mirror of c:\VWE (source + assets + toolchain + outputs) via Git LFS
Complete disaster-recovery snapshot: engine/game source, game data assets,
VC6 toolchain + DX SDKs, build outputs, deployed game, and _UNUSED archive.
Large binaries in Git LFS; text preserved byte-for-byte (core.autocrlf=false,
no eol attributes). See RECOVERY.md for the one-clone rebuild procedure.
2026-06-24 21:28:16 -05:00

921 lines
20 KiB
C++

// FinalBitmapWnd.cpp : implementation file
//
#include "stdafx.h"
#include "TCTb.h"
#include "FinalBitmapWnd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
extern CTCTbApp theApp;
/////////////////////////////////////////////////////////////////////////////
// CFinalBitmapWnd
//IMPLEMENT_DYNCREATE(CFinalBitmapWnd, CMDIChildWnd)
CFinalBitmapWnd::CFinalBitmapWnd()
{
Adjust=1;
zfactor=(float)1.0;
hfname="none";
curpnt=-1;
}
CFinalBitmapWnd::~CFinalBitmapWnd()
{
}
BEGIN_MESSAGE_MAP(CFinalBitmapWnd, CMDIChildWnd)
//{{AFX_MSG_MAP(CFinalBitmapWnd)
ON_WM_DESTROY()
ON_WM_CLOSE()
ON_WM_CREATE()
ON_WM_PAINT()
ON_WM_SIZE()
ON_WM_DROPFILES()
ON_COMMAND(ID_EDIT_PASTE, OnEditPaste)
ON_WM_MOUSEMOVE()
ON_WM_LBUTTONDOWN()
ON_WM_LBUTTONUP()
ON_WM_RBUTTONDOWN()
ON_WM_RBUTTONUP()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CFinalBitmapWnd message handlers
void CFinalBitmapWnd::OnDestroy()
{
WhitePen.DeleteObject();
BluePen.DeleteObject();
RedPen.DeleteObject();
RDPen.DeleteObject();
RedBrush.DeleteObject();
BlueBrush.DeleteObject();
CMDIChildWnd::OnDestroy();
// TODO: Add your message handler code here
}
void CFinalBitmapWnd::OnClose()
{
//ShowWindow(SW_MINIMIZE);
ShowWindow(SW_HIDE);
// CMDIChildWnd::OnClose();
}
void CFinalBitmapWnd::MakeDisplayedBmp(TCTTerrainData *tdat)
{
Check_Pointer(tdat);
CDC *pDC=GetDC();
switch(theApp.DMode)
{
case DM_HFIELD:
{
int imw,imh;
Image timg;
HeightFieldLayer *lay;
lay=&tdat->HFLayer;
timg=lay->Img;
hfname=lay->Img.GetFileName();
timg.MakeGrayscalePalette();
timg.MakeRGB24();
//Change this make it work with arbitary pitch possibly code a method in image class
imw=timg.GetWidth();
imh=timg.GetHeight();
DispBmp.DeleteObject();
DispBmp.CreateCompatibleBitmap(pDC,imw,imh);
CRect trct;
trct.top=trct.left=0;
trct.bottom=imh; trct.right=imw;
CalcWindowRect(&trct);
SetWindowPos(&wndTop,trct.left,trct.top,trct.Width(),trct.Height(),SWP_NOMOVE|SWP_SHOWWINDOW);
BITMAPINFOHEADER bhd;
BITMAPINFO binf;
bhd.biSize=sizeof(BITMAPINFOHEADER);
bhd.biWidth=imw; bhd.biHeight=-imh;
bhd.biPlanes=1;
bhd.biBitCount=24;
bhd.biCompression=BI_RGB;
bhd.biSizeImage=0;
bhd.biClrImportant=0;
binf.bmiHeader=bhd;
CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&DispBmp);
SetDIBitsToDevice(memDC.m_hDC,0,0,imw,
imh,0,0,0,imh,timg.Lock(),
&binf,DIB_RGB_COLORS);
timg.UnLock();
memDC.DeleteDC();
}
break;
case DM_BASETEXTURE:
{
int imw,imh;
Image timg;
TextureLayer *lay;
lay=&tdat->BaseTexture;
timg=lay->Img;
hfname=lay->Img.GetFileName();
timg.MakeRGB24();
//Change this make it work with arbitary pitch possibly code a method in image class
imw=timg.GetWidth();
imh=timg.GetHeight();
DispBmp.DeleteObject();
DispBmp.CreateCompatibleBitmap(pDC,imw,imh);
CRect trct;
trct.top=trct.left=0;
trct.bottom=imh; trct.right=imw;
CalcWindowRect(&trct);
SetWindowPos(&wndTop,trct.left,trct.top,trct.Width(),trct.Height(),SWP_NOMOVE|SWP_SHOWWINDOW);
BITMAPINFOHEADER bhd;
BITMAPINFO binf;
bhd.biSize=sizeof(BITMAPINFOHEADER);
bhd.biWidth=imw; bhd.biHeight=-imh;
bhd.biPlanes=1;
bhd.biBitCount=24;
bhd.biCompression=BI_RGB;
bhd.biSizeImage=0;
bhd.biClrImportant=0;
binf.bmiHeader=bhd;
CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&DispBmp);
SetDIBitsToDevice(memDC.m_hDC,0,0,imw,
imh,0,0,0,imh,timg.Lock(),
&binf,DIB_RGB_COLORS);
timg.UnLock();
memDC.DeleteDC();
}
break;
}
SetWindowPos(NULL,0,0,640,640,SWP_NOMOVE|SWP_SHOWWINDOW);
ReleaseDC(pDC);
ReDraw();
}
int CFinalBitmapWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CMDIChildWnd::OnCreate(lpCreateStruct) == -1)
return -1;
// TODO: Add your specialized creation code here
CDC *pDC=GetDC();
DispBmp.CreateCompatibleBitmap(pDC,DEFAULTBMPSIZE,DEFAULTBMPSIZE);
DispBBuffer.CreateCompatibleBitmap(pDC,DEFAULTBMPSIZE,DEFAULTBMPSIZE);
//Make a BitMap and Black it out.
CDC memDC;
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&DispBmp);
BITMAP bmp;
DispBmp.GetBitmap(&bmp);
CRect trct;
trct.top=trct.left=0;
trct.bottom=bmp.bmHeight; trct.right=bmp.bmWidth;
LastWidth=bmp.bmWidth;
LastHeight=trct.bottom;
CalcWindowRect(&trct);
SetWindowPos(&wndTop,trct.left,trct.top,trct.Width(),trct.Height(),SWP_NOMOVE|SWP_SHOWWINDOW);
memDC.BitBlt(0,0,bmp.bmWidth,bmp.bmHeight,NULL,0,0,BLACKNESS);
memDC.DeleteDC();
WhitePen.CreatePen(PS_SOLID,1,RGB(255,255,255));
BluePen.CreatePen(PS_SOLID,1,RGB(0,0,255));
RedPen.CreatePen(PS_SOLID,3,RGB(255,0,0));
RDPen.CreatePen(PS_DASH,1,RGB(255,0,0));
RedBrush.CreateSolidBrush(RGB(255,0,0));
BlueBrush.CreateSolidBrush(RGB(0,255,0));
memDC.DeleteDC();
ReleaseDC(pDC);
return 0;
}
void CFinalBitmapWnd::OnPaint()
{
CPaintDC dc(this); // device context for painting
ReDraw();
// Do not call CMDIChildWnd::OnPaint() for painting messages
}
void CFinalBitmapWnd::ReDraw()
{
CDC *pDC,memDC,bbDC;
BITMAP bmp,bmp2;
DispBmp.GetBitmap(&bmp);
pDC=GetDC();
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&DispBmp);
bbDC.CreateCompatibleDC(pDC);
bbDC.SelectObject(&DispBBuffer);
//Blt image to back buffer
DispBBuffer.GetBitmap(&bmp);
DispBmp.GetBitmap(&bmp2);
bbDC.StretchBlt(0,0,bmp.bmWidth,bmp.bmHeight,&memDC,
0,0,bmp2.bmWidth,bmp2.bmHeight,SRCCOPY);
UpdateDims();
SplineLoop *ViewLoop;
ViewLoop=theApp.CamInfo.ViewLoop;
//Display the ViewSpline
if(ViewLoop && theApp.CamInfo.GetMode()==CameraInfo::CM_TRACK)
{
Stuff::Scalar t=0.0f,step=1.0f/VSRES;
Stuff::Point3D np;
Stuff::Vector3D nv;
CPoint loc;
int i;
bbDC.SelectObject(WhitePen);
bbDC.SelectObject(GetStockObject(NULL_BRUSH));
ViewLoop->Evaluate(0.0f,&np,&nv);
bbDC.MoveTo(GridToMap(np));
for(t=step;t<=1.0f;t+=step)
{
ViewLoop->Evaluate(t,&np,&nv);
bbDC.LineTo(GridToMap(np));
}
for(i=0;i<EDCPOINTS;i++)
{
ViewLoop->GetCPoint(i,&np,&nv);
loc=GridToMap(np);
bbDC.Rectangle(loc.x-5,loc.y-5,loc.x+5,loc.y+5);
}
}
//Display the Camera
if(theApp.RVWnd && theApp.RVWnd->ActiveHField)
{
Stuff::Point3D np;
Stuff::Vector3D nv;
CPoint loc,tloc;
bbDC.SelectObject(RedPen);
bbDC.SelectObject(RedBrush);
if(theApp.CamInfo.GetMode()==CameraInfo::CM_TRACK)
{
//theApp.ViewLoop->Evaluate(theApp.RVWnd->CTime,&np,&nv);
np=theApp.CamInfo.Loc;
nv=theApp.CamInfo.Dir;
loc=GridToMap(np);
bbDC.Rectangle(loc.x-5,loc.y-5,loc.x+5,loc.y+5);
}
else
{
np=theApp.CamInfo.Loc;
nv=theApp.CamInfo.Dir;
loc=GridToMap(np);
bbDC.Rectangle(loc.x-5,loc.y-5,loc.x+5,loc.y+5);
}
if(theApp.CamInfo.UseTarget)
{
tloc=GridToMap(theApp.CamInfo.TargetLoc);
bbDC.SelectObject(BluePen);
bbDC.SelectObject(GetStockObject(NULL_BRUSH));
bbDC.Rectangle(tloc.x-5,tloc.y-5,tloc.x+5,tloc.y+5);
bbDC.SelectObject(RDPen);
bbDC.MoveTo(loc);
bbDC.LineTo(tloc);
}
else
{
Stuff::Scalar xs,zs;
xs=theApp.RVWnd->ActiveHField->GetXScale();
zs=theApp.RVWnd->ActiveHField->GetZScale();
bbDC.SelectObject(RedPen);
bbDC.MoveTo(loc);
nv.Normalize(nv);
np.x+=nv.x*20*xs;
np.z+=nv.z*20*zs;
bbDC.LineTo(GridToMap(np));
}
} //end of draw camera
//Display the backbuffer
CRect crct;
GetClientRect(&crct);
DispBBuffer.GetBitmap(&bmp);
pDC->BitBlt(0,0,crct.Width(),crct.Height(),&bbDC,0,0,SRCCOPY);
bbDC.DeleteDC();
memDC.DeleteDC();
ReleaseDC(pDC);
}
void CFinalBitmapWnd::OnSize(UINT nType, int cx, int cy)
{
CMDIChildWnd::OnSize(nType, cx, cy);
CRect crct;
BITMAP bmp;
GetClientRect(&crct);
DispBmp.GetBitmap(&bmp);
CDC *pDC=GetDC();
DispBBuffer.DeleteObject();
DispBBuffer.CreateCompatibleBitmap(pDC,crct.Width(),crct.Height());
ReleaseDC(pDC);
if(crct.Width()==0 || crct.Height()==0) return;
if(Adjust)
{
int nw,nh;
int xdiff,ydiff;
float bmaspect,cltaspect;
xdiff=crct.Width()-LastWidth;
ydiff=crct.Height()-LastHeight;
bmaspect=(float)bmp.bmWidth/bmp.bmHeight;
cltaspect=(float)crct.Width()/crct.Height();
if(abs(xdiff)>abs(ydiff)) //Retain X and adjust Y to maintain Aspect Ratio
{
nw=crct.Width();
nh=(int)(crct.Width()/bmaspect);
}
else //Retain Y and adjust X to maintain Aspect Ratio
{
nh=crct.Height();
nw=(int)(bmaspect*crct.Height());
}
Adjust=0;
SetWindowPos(NULL,0,0,nw,nh,SWP_NOMOVE|SWP_SHOWWINDOW|SWP_NOZORDER|SWP_NOACTIVATE);
LastWidth=crct.Width();
LastHeight=crct.Height();
Adjust=1;
}
GetClientRect(&crct);
zfactor=(float)100*crct.Width()/bmp.bmWidth;
SetTitle();
UpdateDims();
}
void CFinalBitmapWnd::SetTitle()
{
CString tstr,tstr2;
int i;
i=hfname.ReverseFind('\\');
if(i!=-1)
{
tstr2=hfname.Right(hfname.GetLength()-i-1);
}
tstr.Format("%s - %3.2f%% - file = %s",TITLEVIEW2D,zfactor,tstr2);
SetWindowText(tstr);
}
BOOL CFinalBitmapWnd::Create(LPCTSTR lpszClassName, LPCTSTR lpszWindowName, DWORD dwStyle, const RECT& rect, CMDIFrameWnd* pParentWnd, CCreateContext* pContext)
{
// TODO: Add your specialized code here and/or call the base class
return CMDIChildWnd::Create(lpszClassName, lpszWindowName, dwStyle, rect, pParentWnd, pContext);
}
void CFinalBitmapWnd::OnDropFiles(HDROP hDropInfo)
{
// TODO: Add your message handler code here and/or call default
char fname[MAX_PATH];
CString tstr;
DragQueryFile(hDropInfo,0,fname,MAX_PATH);
tstr=fname;
theApp.ImportBitmap(tstr);
// CMDIChildWnd::OnDropFiles(hDropInfo);
}
void CFinalBitmapWnd::OnEditPaste()
{
// TODO: Add your command handler code here
COleDataObject DObj;
HRESULT res;
res=DObj.AttachClipboard();
if(DObj.IsDataAvailable(CF_DIB))
{
CFile *fle;
fle=DObj.GetFileData(CF_DIB);
BITMAPINFOHEADER ihdr;
fle->Read(&ihdr,sizeof(ihdr));
Image timg;
if(!(ihdr.biBitCount==8 || ihdr.biBitCount==16 || ihdr.biBitCount==24 || ihdr.biBitCount==32)) return;
if(ihdr.biBitCount==8)
{
timg.CreateSolid(ihdr.biWidth,ihdr.biHeight,ImgRGBColor(0,0,0),ITYPE_INDEXED,ihdr.biBitCount);
fle->Seek(256*sizeof(RGBQUAD),CFile::current);
}
else
timg.CreateSolid(ihdr.biWidth,ihdr.biHeight,ImgRGBColor(0,0,0),ITYPE_RGB,ihdr.biBitCount);
unsigned char *dat;
dat=timg.Lock();
fle->Read(dat,ihdr.biWidth*ihdr.biHeight*(ihdr.biBitCount>>3));
timg.UnLock();
theApp.ImportBitmap(timg);
delete fle;
}
}
void CFinalBitmapWnd::DrawViewSpline(SplineLoop *ViewLoop)
{
if(!ViewLoop) return;
Stuff::Scalar t=0.0f,step=1.0f/VSRES;
Stuff::Point3D np;
Stuff::Vector3D nv;
CPoint loc;
CDC *dc;
dc=GetDC();
int i;
UpdateDims();
dc->SelectObject(WhitePen);
dc->SelectObject(GetStockObject(NULL_BRUSH));
ViewLoop->Evaluate(0.0f,&np,&nv);
dc->MoveTo(GridToMap(np));
for(t=step;t<=1.0f;t+=step)
{
ViewLoop->Evaluate(t,&np,&nv);
dc->LineTo(GridToMap(np));
}
for(i=0;i<EDCPOINTS;i++)
{
ViewLoop->GetCPoint(i,&np,&nv);
loc=GridToMap(np);
dc->Rectangle(loc.x-5,loc.y-5,loc.x+5,loc.y+5);
}
ReleaseDC(dc);
}
void CFinalBitmapWnd::OnMouseMove(UINT nFlags, CPoint point)
{
if(nFlags&MK_LBUTTON)
{
UpdateDims();
if(nFlags&MK_CONTROL)
{
CPoint Dist;
Dist=point-LastPoint;
if(nFlags&MK_SHIFT)
{
if(theApp.CamInfo.TarATrkFlg) theApp.CamInfo.TarTrackAlt+=-Dist.y/100;
else theApp.CamInfo.TargetLoc.y+=Dist.y;
if(theApp.CamInfo.GetMode()==CameraInfo::CM_FREE)
if(theApp.CamInfo.CamATrkFlg) theApp.CamInfo.CamTrackAlt+=-Dist.y/100;
else theApp.CamInfo.Loc.y+=Dist.y;
} //end of if Lbutton && Shift
else
{
if(theApp.CamInfo.CamATrkFlg) theApp.CamInfo.CamTrackAlt+=-Dist.y/100;
else theApp.CamInfo.Loc.y+=-Dist.y/100;
}//end of if Lbutton && !Shift
}//end of if Ctrl
else
{
if(nFlags&MK_SHIFT)
{
if(theApp.CamInfo.UseTarget)
{
Stuff::Point3D tpt=MapToGrid(point);
theApp.CamInfo.TargetLoc.x=tpt.x;
theApp.CamInfo.TargetLoc.z=tpt.z;
}
else
{
if(theApp.CamInfo.GetMode()==CameraInfo::CM_FREE)
{
Stuff::Point3D tpt=MapToGrid(point),otloc=theApp.CamInfo.TargetLoc;
theApp.CamInfo.TargetLoc.x=tpt.x;
theApp.CamInfo.TargetLoc.z=tpt.z;
theApp.CamInfo.TargetLoc.y=theApp.CamInfo.Loc.y;
theApp.CamInfo.UseTarget=true;
theApp.CamInfo.UpdateCPos();
theApp.CamInfo.UseTarget=false;
theApp.CamInfo.TargetLoc=otloc;
}
}//end of if Use Target
} //end of if Lbutton && Shift
else
{
if(theApp.CamInfo.GetMode()==CameraInfo::CM_TRACK && curpnt>=0)
{
Stuff::Point3D tpt,p3d=MapToGrid(point);
Stuff::Vector3D v3d;
theApp.CamInfo.ViewLoop->GetCPoint(curpnt,&tpt,&v3d);
theApp.CamInfo.ViewLoop->SetCPoint(curpnt,p3d,v3d);
}
if(theApp.CamInfo.GetMode()==CameraInfo::CM_FREE)
{
Stuff::Point3D tpt=MapToGrid(point);
theApp.CamInfo.Loc.x=tpt.x;
theApp.CamInfo.Loc.z=tpt.z;
}
}//end of if Lbutton && !Shift
}//end of !Ctrl
theApp.CamInfo.UpdateCPos();
ReDraw();
}//end of if Lbutton
CMDIChildWnd::OnMouseMove(nFlags, point);
}
void CFinalBitmapWnd::OnLButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
UpdateDims();
LastPoint=point;
if(theApp.CamInfo.GetMode()==CameraInfo::CM_TRACK)
{
curpnt=theApp.CamInfo.ViewLoop->GetClosestCPoint(MapToGrid(point));
}
OnMouseMove(nFlags, point);
CMDIChildWnd::OnLButtonDown(nFlags, point);
}
Stuff::Point3D CFinalBitmapWnd::MapToGrid(CPoint &pnt)
{
Stuff::Point3D tpnt;
Stuff::Scalar xs,zs,xgsze,zgsze;
xs=theApp.RVWnd->ActiveHField->GetXScale();
zs=theApp.RVWnd->ActiveHField->GetZScale();
xgsze=theApp.TData.HFLayer.Img.GetWidth()*xs;
zgsze=theApp.TData.HFLayer.Img.GetHeight()*zs;
Stuff::Scalar xmapsize,ymapsize;
xmapsize=(float)crct.Width();
ymapsize=(float)crct.Height();
tpnt.x=(pnt.x/xmapsize)*xgsze;
tpnt.z=(pnt.y/ymapsize)*zgsze;
// tpnt.x=((pnt.x-crct.Width()/2)*xs)/(zfactor/100)+(DBmp.bmWidth/2)*xs;
// tpnt.z=((pnt.y-crct.Height()/2)*zs)/(zfactor/100)+(DBmp.bmHeight/2)*zs;
//tpnt.y=theApp.RVWnd->ActiveHField->GetHeight(tpnt.x,tpnt.z);
tpnt.y=0.0f;
return tpnt;
}
CPoint CFinalBitmapWnd::GridToMap(Stuff::Point3D &pnt)
{
CPoint tpnt;
Stuff::Scalar xs,zs,xgsze,zgsze;
xs=theApp.RVWnd->ActiveHField->GetXScale();
zs=theApp.RVWnd->ActiveHField->GetZScale();
xgsze=(theApp.TData.HFLayer.Img.GetWidth())*xs;
zgsze=(theApp.TData.HFLayer.Img.GetHeight())*zs;
Stuff::Scalar xmapsize,ymapsize;
xmapsize=(float)crct.Width();
ymapsize=(float)crct.Height();
tpnt.x=(int)((pnt.x/xgsze)*xmapsize);
tpnt.y=(int)((pnt.z/zgsze)*ymapsize);
/*
tpnt.x=(int)(
(pnt.x-(DBmp.bmWidth/2)*xs)*(zfactor*.01))/xs+crct.Width()/2;
tpnt.y=(int)(
(pnt.z-(DBmp.bmHeight/2)*zs)*(zfactor*.01))/zs+crct.Height()/2;
*/
return tpnt;
}
void CFinalBitmapWnd::OnLButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
curpnt=-1;
CMDIChildWnd::OnLButtonUp(nFlags, point);
}
void CFinalBitmapWnd::UpdateDims()
{
GetClientRect(&crct);
DispBmp.GetBitmap(&DBmp);
}
void CFinalBitmapWnd::DrawCamera()
{
if(!theApp.RVWnd || !theApp.RVWnd->ActiveHField) return;
CDC *dc;
dc=GetDC();
UpdateDims();
Stuff::Point3D np;
Stuff::Vector3D nv;
CPoint loc,tloc;
dc->SelectObject(RedPen);
dc->SelectObject(RedBrush);
if(theApp.CamInfo.GetMode()==CameraInfo::CM_TRACK)
{
//theApp.ViewLoop->Evaluate(theApp.RVWnd->CTime,&np,&nv);
np=theApp.CamInfo.Loc;
nv=theApp.CamInfo.Dir;
loc=GridToMap(np);
dc->Rectangle(loc.x-5,loc.y-5,loc.x+5,loc.y+5);
}
else
{
np=theApp.CamInfo.Loc;
nv=theApp.CamInfo.Dir;
loc=GridToMap(np);
dc->Rectangle(loc.x-5,loc.y-5,loc.x+5,loc.y+5);
}
if(theApp.CamInfo.UseTarget)
{
tloc=GridToMap(theApp.CamInfo.TargetLoc);
dc->SelectObject(BluePen);
dc->SelectObject(GetStockObject(NULL_BRUSH));
dc->Rectangle(tloc.x-5,tloc.y-5,tloc.x+5,tloc.y+5);
dc->SelectObject(RDPen);
dc->MoveTo(loc);
dc->LineTo(tloc);
}
else
{
Stuff::Scalar xs,zs;
xs=theApp.RVWnd->ActiveHField->GetXScale();
zs=theApp.RVWnd->ActiveHField->GetZScale();
dc->SelectObject(RedPen);
dc->MoveTo(loc);
nv.Normalize(nv);
np.x+=nv.x*20*xs;
np.z+=nv.z*20*zs;
dc->LineTo(GridToMap(np));
}
ReleaseDC(dc);
}
void CFinalBitmapWnd::OnRButtonDown(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMDIChildWnd::OnRButtonDown(nFlags, point);
}
void CFinalBitmapWnd::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
CMDIChildWnd::OnRButtonUp(nFlags, point);
}
void CFinalBitmapWnd::BoundSpline(SplineLoop *ViewLoop)
{
int i;
Stuff::Point3D np;
Stuff::Vector3D nv;
CPoint loc;
UpdateDims();
for(i=0;i<EDCPOINTS;i++)
{
ViewLoop->GetCPoint(i,&np,&nv);
loc=GridToMap(np);
if(loc.x<0) loc.x=0;
if(loc.y<0) loc.y=0;
if(loc.x>theApp.TData.HFLayer.Img.GetWidth()) loc.x=theApp.TData.HFLayer.Img.GetWidth();
if(loc.y>theApp.TData.HFLayer.Img.GetHeight()) loc.y=theApp.TData.HFLayer.Img.GetHeight();
np=MapToGrid(loc);
ViewLoop->SetCPoint(i,np,nv);
}
}
void CFinalBitmapWnd::DrawGrid(ToDrawTriangle **tlist,int tnum,COLORREF col,float cx,float cy,float rad)
{
CDC *pDC,memDC,bbDC;
BITMAP bmp,bmp2;
DispBmp.GetBitmap(&bmp);
pDC=GetDC();
CPen pen(PS_SOLID,1,col);
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&DispBmp);
bbDC.CreateCompatibleDC(pDC);
bbDC.SelectObject(&DispBBuffer);
//Blt image to back buffer
DispBBuffer.GetBitmap(&bmp);
DispBmp.GetBitmap(&bmp2);
/*
bbDC.StretchBlt(0,0,bmp.bmWidth,bmp.bmHeight,&memDC,
0,0,bmp2.bmWidth,bmp2.bmHeight,SRCCOPY);
*/
UpdateDims();
bbDC.SelectObject(pen);
bbDC.SelectObject(GetStockObject(NULL_BRUSH));
Stuff::Point3D np;
CPoint oloc,loc;
int i;
for(i=0;i<tnum;i++)
{
oloc=GridToMap(tlist[i]->GetV0());
bbDC.MoveTo(oloc);
loc=GridToMap(tlist[i]->GetV1());
bbDC.LineTo(loc);
loc=GridToMap(tlist[i]->GetV2());
bbDC.LineTo(loc);
bbDC.LineTo(oloc);
}
CRect rect;
np.x=cx+rad;
np.y=0.0f;
np.z=cy+rad;
loc=GridToMap(np);
rect.bottom=loc.y;
rect.right=loc.x;
np.x=cx-rad;
np.y=0.0f;
np.z=cy-rad;
loc=GridToMap(np);
rect.top=loc.y;
rect.left=loc.x;
bbDC.Ellipse(&rect);
//Display the backbuffer
CRect crct;
GetClientRect(&crct);
DispBBuffer.GetBitmap(&bmp);
pDC->BitBlt(0,0,crct.Width(),crct.Height(),&bbDC,0,0,SRCCOPY);
bbDC.DeleteDC();
memDC.DeleteDC();
pen.DeleteObject();
ReleaseDC(pDC);
}
void CFinalBitmapWnd::DrawGrid(ToDrawTriangle *tlist,int tnum)
{
CDC *pDC,memDC,bbDC;
BITMAP bmp,bmp2;
DispBmp.GetBitmap(&bmp);
pDC=GetDC();
memDC.CreateCompatibleDC(pDC);
memDC.SelectObject(&DispBmp);
bbDC.CreateCompatibleDC(pDC);
bbDC.SelectObject(&DispBBuffer);
//Blt image to back buffer
DispBBuffer.GetBitmap(&bmp);
DispBmp.GetBitmap(&bmp2);
bbDC.StretchBlt(0,0,bmp.bmWidth,bmp.bmHeight,&memDC,
0,0,bmp2.bmWidth,bmp2.bmHeight,SRCCOPY);
UpdateDims();
bbDC.SelectObject(WhitePen);
Stuff::Point3D np;
CPoint oloc,loc;
int i;
for(i=0;i<tnum;i++)
{
oloc=GridToMap(tlist[i].GetV0());
bbDC.MoveTo(oloc);
loc=GridToMap(tlist[i].GetV1());
bbDC.LineTo(loc);
loc=GridToMap(tlist[i].GetV2());
bbDC.LineTo(loc);
bbDC.LineTo(oloc);
}
//Display the backbuffer
CRect crct;
GetClientRect(&crct);
DispBBuffer.GetBitmap(&bmp);
pDC->BitBlt(0,0,crct.Width(),crct.Height(),&bbDC,0,0,SRCCOPY);
bbDC.DeleteDC();
memDC.DeleteDC();
ReleaseDC(pDC);
}