121 lines
3.2 KiB
C++
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);
|
|
}
|