Files
Work/proto/source/TERRAIN.CPP
2024-08-07 09:16:27 -04:00

121 lines
3.2 KiB
C++

#include <proto/terrain.hpp>
#include <proto/viewpt.hpp>
#include <proto/fixed.hpp>
#include <proto/display.hpp>
#include <proto/mapterr.hpp>
#include <common/guiwnd.hpp>
#include <common/rect.hpp>
#include <common/dib.hpp>
MapTerrain::MapTerrain(SmartPointer<GUIWindow> &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;
viewPointy=(int)viewPoint.viewPos().y()<<FixedPoint::FPShift;
viewPointz=(int)viewPoint.viewPos().z()<<FixedPoint::FPShift;
pDestBuffer=(UCHAR*)bitmap.ptrData();
rayCastAngle=viewPoint.viewAngle().y()+mAngles.angleHalfFOV();
for(int currCol=0;currCol<bmWidth-1;currCol++)
{
rayPointx=viewPointx;
rayPointy=viewPointy;
rayPointz=viewPointz;
dx=mTrigTable.cos(rayCastAngle)<<1;
dy=mTrigTable.sin(rayCastAngle)<<1;
dz=mGeometry.deltaSlope()*(viewPoint.viewAngle().x()-bmWidth);
currVoxelScale=0;
currRow=0;
pDestColPtr=pDestBuffer;
for(int currStep=0;currStep<Geometry::MaxSteps;currStep++)
{
xr=rayPointx>>FixedPoint::FPShift;
yr=rayPointy>>FixedPoint::FPShift;
xr=xr&(Geometry::HeightFieldWidth-1);
yr=yr&(Geometry::HeightFieldHeight-1);
mapAddress=(xr+(yr<<Geometry::HeightFieldBitShift));
colHeight=int(((char*)mHeightBitmap.ptrData())[mapAddress])<<(FixedPoint::FPShift+Geometry::TerrainScalex2);
if(colHeight>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);
}