Initial
This commit is contained in:
120
proto/source/TERRAIN.CPP
Normal file
120
proto/source/TERRAIN.CPP
Normal file
@@ -0,0 +1,120 @@
|
||||
#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);
|
||||
}
|
||||
Reference in New Issue
Block a user