#include #include #include #include #include #include #include #include MapTerrain::MapTerrain(SmartPointer &parentWindow,const String &strColorBitmap,const String &strHeightBitmap) : mSizeHandler(this,&MapTerrain::sizeHandler), mColorBitmap(strColorBitmap), mHeightBitmap(strHeightBitmap) { mParentWindow=parentWindow; mParentWindow->insertHandler(VectorHandler::SizeHandler,&mSizeHandler); mHeightBitmap.upsideDown(); mColorBitmap.upsideDown(); } MapTerrain::MapTerrain(const MapTerrain &mapTerrain) : mSizeHandler(this,&MapTerrain::sizeHandler) { // private implementation *this=mapTerrain; } MapTerrain &MapTerrain::operator=(const MapTerrain &/*mapTerrain*/) { // private implementation return *this; } MapTerrain::~MapTerrain() { } CallbackData::ReturnType MapTerrain::sizeHandler(CallbackData &someCallbackData) { Rect winRect; mParentWindow->windowRect(winRect); mAngles.screenWidth(winRect.right()); mGeometry.screenWidth(winRect.right()); mTrigTable.build(mAngles); return (CallbackData::ReturnType)FALSE; } void MapTerrain::mapTerrain(Display &display,ViewPoint &viewPoint) { DIBitmap &bitmap=(DIBitmap&)display; int bmWidth(bitmap.width()); int bmHeight(bitmap.height()); int rayCastAngle; int currVoxelScale; int mapAddress; int colHeight; int currRow; int rayPointx; int rayPointy; int rayPointz; int viewPointx; int viewPointy; int viewPointz; UCHAR color; UCHAR *pDestColPtr; UCHAR *pDestBuffer; int xr; int yr; int dx; int dy; int dz; viewPointx=(int)viewPoint.viewPos().x()<>FixedPoint::FPShift; yr=rayPointy>>FixedPoint::FPShift; xr=xr&(Geometry::HeightFieldWidth-1); yr=yr&(Geometry::HeightFieldHeight-1); mapAddress=(xr+(yr<rayPointz) { color=((char*)mColorBitmap.ptrData())[mapAddress]; while(TRUE) { *pDestColPtr=color; dz+=mGeometry.deltaSlope(); rayPointz+=currVoxelScale; pDestColPtr+=bmWidth; if(++currRow>=bmHeight) { currStep=Geometry::MaxSteps; break; } if(rayPointz>colHeight)break; } } rayPointx+=dx; rayPointy+=dy; rayPointz+=dz; currVoxelScale+=mGeometry.deltaSlope(); } pDestBuffer++; rayCastAngle--; } ((DIBitmap&)display).bitBlt((PureDevice&)display); }