#include #include #include #include #include #include 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 }