114 lines
3.7 KiB
C++
114 lines
3.7 KiB
C++
#include <ddraw/tritextr.hpp>
|
|
#include <common/bitmap.hpp>
|
|
#include <common/dib.hpp>
|
|
#include <common/file.hpp>
|
|
#include <engine/device3d.hpp>
|
|
#include <ddraw/drawsfc.hpp>
|
|
|
|
File outFile("output.dat","wb");
|
|
|
|
DirectTriTexture::DirectTriTexture(const Triangle3D &angle3D,Bitmap &textureBitmap,DIBitmap &drawingSurface,Device3D &displayDevice,MapFrom mapFrom)
|
|
{
|
|
mTriangle3D=angle3D;
|
|
displayDevice.mapCoordinates(mTriangle3D,mTriangle);
|
|
// mTriangle.orderPoints();
|
|
mTriEdge.x0(mTriangle[0].x());
|
|
mTriEdge.y0(mTriangle[0].y());
|
|
mTriEdge.x1(mTriangle[1].x());
|
|
mTriEdge.y1(mTriangle[1].y());
|
|
mTriEdge.x2(mTriangle[2].x());
|
|
mTriEdge.y2(mTriangle[2].y());
|
|
if(MapFromUpperRight==mapFrom)
|
|
{
|
|
mTriEdge.u0(0);
|
|
mTriEdge.v0(0);
|
|
mTriEdge.u1(textureBitmap.width()-1);
|
|
mTriEdge.v1(0);
|
|
mTriEdge.u2(textureBitmap.width()-1);
|
|
mTriEdge.v2(textureBitmap.height()-1);
|
|
}
|
|
else
|
|
{
|
|
mTriEdge.u0(0);
|
|
mTriEdge.v0(0);
|
|
mTriEdge.u1(textureBitmap.width()-1);
|
|
mTriEdge.v1(textureBitmap.height()-1);
|
|
mTriEdge.u2(0);
|
|
mTriEdge.v2(textureBitmap.height()-1);
|
|
}
|
|
::directTriSetSrcBitmapInfo(textureBitmap.width(),textureBitmap.height(),textureBitmap.getDataPtr());
|
|
::directTriSetDstBitmapInfo(drawingSurface.width(),drawingSurface.height(),drawingSurface.width(),(unsigned char*)drawingSurface.ptrData());
|
|
::directTriSetPixelCallback(&DirectTriTexture::pixelCallback);
|
|
::directTriSetEdgeCallback(&DirectTriTexture::edgeCallback);
|
|
}
|
|
|
|
DirectTriTexture::DirectTriTexture(const Triangle3D &angle3D,Bitmap &textureBitmap,DrawingSurface &drawingSurface,Device3D &displayDevice,MapFrom mapFrom)
|
|
{
|
|
mTriangle3D=angle3D;
|
|
displayDevice.mapCoordinates(mTriangle3D,mTriangle);
|
|
// mTriangle.orderPoints();
|
|
mTriEdge.x0(mTriangle[0].x());
|
|
mTriEdge.y0(mTriangle[0].y());
|
|
mTriEdge.x1(mTriangle[1].x());
|
|
mTriEdge.y1(mTriangle[1].y());
|
|
mTriEdge.x2(mTriangle[2].x());
|
|
mTriEdge.y2(mTriangle[2].y());
|
|
if(MapFromUpperRight==mapFrom)
|
|
{
|
|
mTriEdge.u0(0);
|
|
mTriEdge.v0(0);
|
|
mTriEdge.u1(textureBitmap.width()-1);
|
|
mTriEdge.v1(0);
|
|
mTriEdge.u2(textureBitmap.width()-1);
|
|
mTriEdge.v2(textureBitmap.height()-1);
|
|
}
|
|
else
|
|
{
|
|
mTriEdge.u0(0);
|
|
mTriEdge.v0(0);
|
|
mTriEdge.u1(textureBitmap.width()-1);
|
|
mTriEdge.v1(textureBitmap.height()-1);
|
|
mTriEdge.u2(0);
|
|
mTriEdge.v2(textureBitmap.height()-1);
|
|
}
|
|
::directTriSetSrcBitmapInfo(textureBitmap.width(),textureBitmap.height(),textureBitmap.getDataPtr());
|
|
::directTriSetDstBitmapInfo(drawingSurface.width(),drawingSurface.height(),drawingSurface.pitch(),(unsigned char*)drawingSurface.ptrSurface());
|
|
::directTriSetPixelCallback(&DirectTriTexture::pixelCallback);
|
|
::directTriSetEdgeCallback(&DirectTriTexture::edgeCallback);
|
|
}
|
|
|
|
DirectTriTexture::~DirectTriTexture()
|
|
{
|
|
}
|
|
|
|
void DirectTriTexture::mapTexture(void)
|
|
{
|
|
::directTriMapTexture(&mTriEdge);
|
|
}
|
|
|
|
void DirectTriTexture::pixelCallback(int y,int x,int vi,int ui)
|
|
{
|
|
#if 0
|
|
String strDebug;
|
|
|
|
if(!y&&!x&&!vi&&!ui)outFile.writeLine("scanline");
|
|
else
|
|
{
|
|
::sprintf(strDebug,"ui: %d vi:%d x:%d y:%d",ui,vi,x,y);
|
|
outFile.writeLine(strDebug);
|
|
}
|
|
#endif
|
|
}
|
|
|
|
void DirectTriTexture::edgeCallback(DirectTriEdge *pEdge)
|
|
{
|
|
#if 0
|
|
String strDebug;
|
|
strDebug.reserve(1024);
|
|
::sprintf(strDebug,"xLeft:%d xRight:%d uLeft:%d uRight:%d vLeft:%d vRight:%d dxLeft:%d dxRight:%d duLeft:%d duRight:%d dvLeft:%d duRight:%d",
|
|
int((float)pEdge->xLeft()/2048.00),int((float)pEdge->xRight()/2048.00),int((float)pEdge->uLeft()/2048.00),int((float)pEdge->uRight()/2048.00),int((float)pEdge->vLeft()/2048.00),int((float)pEdge->vRight()/2048.00),
|
|
int((float)pEdge->dxLeft()/2048.00),int((float)pEdge->dxRight()/2048.00),int((float)pEdge->duLeft()/2048.00),int((float)pEdge->duRight()/2048.00),int((float)pEdge->dvLeft()/2048.00),int((float)pEdge->dvRight()/2048.00));
|
|
outFile.writeLine(strDebug);
|
|
#endif
|
|
}
|