Subversion Repositories AndroidProjects

Rev

Blame | Last modification | View Log | RSS feed

// This file is included by SWTri.cpp and should not be built directly by the project.

#pragma warning(disable:4101)

#if (TRI0==0)
        #define PTYPE unsigned long
        #define PIXEL_INCLUDE "SWTri_Pixel8888.cpp"
        #define NAME0 8888
#elif (TRI0==1)
        #define PTYPE unsigned long
        #define PIXEL_INCLUDE "SWTri_Pixel888.cpp"
        #define NAME0 0888
#elif (TRI0==2)
        #define PTYPE unsigned short
        #define PIXEL_INCLUDE "SWTri_Pixel565.cpp"
        #define NAME0 0565
#elif (TRI0==3)
        #define PTYPE unsigned short
        #define PIXEL_INCLUDE "SWTri_Pixel555.cpp"
        #define NAME0 0555
#endif

#if (TRI1==1)
        #define TEXTURED
        #define NAME1 TEX1
#else
        #define NAME1 TEX0
#endif


#if (TRI2==1)
        #define TEX_ALPHA
        #define NAME2 TALPHA1
#else
        #define NAME2 TALPHA0
#endif

#if (TRI3==1)
        #define MOD_ARGB
        #define NAME3 MOD1
#else
        #define NAME3 MOD0
#endif

#if (TRI4==1)
        #define GLOBAL_ARGB
        #define NAME4 GLOB1
#else
        #define NAME4 GLOB0
#endif

#if (TRI5==1)
        #define LINEAR_BLEND
        #define NAME5 BLEND1
#else
        #define NAME5 BLEND0
#endif

#define funcname2(t0,t1,t2,t3,t4,t5) DrawTriangle_##t0##_##t1##_##t2##_##t3##_##t4##_##t5
#define funcname1(t0,t1,t2,t3,t4,t5) funcname2(t0,t1,t2,t3,t4,t5)
#define funcname funcname1(NAME0,NAME1,NAME2,NAME3,NAME4,NAME5)
void    Sexy::funcname(SWHelper::SWVertex * pVerts, void * pFrameBuffer, const unsigned int bytepitch, const SWHelper::SWTextureInfo * textureInfo, SWHelper::SWDiffuse & globalDiffuse)
{
        const int pitch = bytepitch/sizeof(PTYPE);
        const int tex_pitch = textureInfo->pitch;
        const int tex_height = textureInfo->height;
        const unsigned int tex_endpos = textureInfo->endpos;

        const SWHelper::signed64 bigOne = static_cast<SWHelper::signed64>(1) << 48;
        #define  swap(a,b,type) {type tmp = a; a = b; b = tmp;}

        const unsigned int *    pTexture;
        unsigned int            vShift, uMask, vMask;
       
        #if defined(TEXTURED)
        {
                pTexture = textureInfo->pTexture;
                vShift = textureInfo->vShift;
                vMask = textureInfo->vMask;
                uMask = textureInfo->uMask;
        }
        #endif

        // Sort vertices by Y component

        SWHelper::SWVertex *    v0 = pVerts+0;
        SWHelper::SWVertex *    v1 = pVerts+1;
        SWHelper::SWVertex *    v2 = pVerts+2;

        if (v0->y > v1->y) swap(v0,v1,SWHelper::SWVertex *);
        if (v1->y > v2->y) swap(v1,v2,SWHelper::SWVertex *);
        if (v0->y > v1->y) swap(v0,v1,SWHelper::SWVertex *);

        #if defined(MOD_ARGB) && defined(GLOBAL_ARGB)
        {
                v0->a = (v0->a * globalDiffuse.a) >> 8;
                v0->r = (v0->r * globalDiffuse.r) >> 8;
                v0->g = (v0->g * globalDiffuse.g) >> 8;
                v0->b = (v0->b * globalDiffuse.b) >> 8;
                v1->a = (v1->a * globalDiffuse.a) >> 8;
                v1->r = (v1->r * globalDiffuse.r) >> 8;
                v1->g = (v1->g * globalDiffuse.g) >> 8;
                v1->b = (v1->b * globalDiffuse.b) >> 8;
                v2->a = (v2->a * globalDiffuse.a) >> 8;
                v2->r = (v2->r * globalDiffuse.r) >> 8;
                v2->g = (v2->g * globalDiffuse.g) >> 8;
                v2->b = (v2->b * globalDiffuse.b) >> 8;
        }
        #endif

        // Integer Y values (using a quick form of ceil() for positive values)

        int     y0 = (v0->y + 0xffff) >> 16;
        int     y2 = (v2->y + 0xffff) >> 16;
        if (y0 == y2) return;   // Null polygon (no height)?
        int     y1 = (v1->y + 0xffff) >> 16;

        // Calculate long-edge deltas

        SWHelper::signed64      oneOverHeight = bigOne / (v2->y - v0->y);
        int             ldx, ldr, ldg, ldb, lda, ldu, ldv;
                        ldx = static_cast<int>(((v2->x - v0->x) * oneOverHeight) >> 32);

        #if defined(MOD_ARGB)          
                lda = static_cast<int>(((v2->a - v0->a) * oneOverHeight) >> 32);
                ldr = static_cast<int>(((v2->r - v0->r) * oneOverHeight) >> 32);
                ldg = static_cast<int>(((v2->g - v0->g) * oneOverHeight) >> 32);
                ldb = static_cast<int>(((v2->b - v0->b) * oneOverHeight) >> 32);
        #endif
       
        #if defined(TEXTURED)
                ldu = static_cast<int>(((v2->u - v0->u) * oneOverHeight) >> 32);
                ldv = static_cast<int>(((v2->v - v0->v) * oneOverHeight) >> 32);
        #endif

        // Long-edge midpoint

        SWHelper::signed64      topHeight = v1->y - v0->y;
        int             mid = v0->x + static_cast<int>((topHeight * ldx)>>16);

        if (v1->x == mid) return;   // Null polygon (no width)?

        // Edge variables (long)

        SWHelper::signed64      subPix = (y0<<16) - v0->y;
        int             lx, lr, lg, lb, la, lu, lv;
                        lx = v0->x + static_cast<int>((ldx * subPix)>>16);

        #if defined(MOD_ARGB)
                la = v0->a + static_cast<int>((lda * subPix)>>16);
                lr = v0->r + static_cast<int>((ldr * subPix)>>16);
                lg = v0->g + static_cast<int>((ldg * subPix)>>16);
                lb = v0->b + static_cast<int>((ldb * subPix)>>16);
        #endif
       
        #if defined(TEXTURED)
                lu = v0->u + static_cast<int>((ldu * subPix)>>16);
                lv = v0->v + static_cast<int>((ldv * subPix)>>16);
        #endif

        // Scanline deltas

        SWHelper::signed64      oneOverWidth;
        int             dr, dg, db, da, du, dv;
        #if defined(TEXTURED) || defined(MOD_ARGB)     
                oneOverWidth = bigOne / (v1->x - mid);
        #endif
       
        #if defined (MOD_ARGB)
                da = static_cast<int>(((v1->a - (v0->a + ((topHeight * lda)>>16))) * oneOverWidth)>>32);
                dr = static_cast<int>(((v1->r - (v0->r + ((topHeight * ldr)>>16))) * oneOverWidth)>>32);
                dg = static_cast<int>(((v1->g - (v0->g + ((topHeight * ldg)>>16))) * oneOverWidth)>>32);
                db = static_cast<int>(((v1->b - (v0->b + ((topHeight * ldb)>>16))) * oneOverWidth)>>32);
        #endif
       
        #if defined (TEXTURED)
                du = static_cast<int>(((v1->u - (v0->u + ((topHeight * ldu)>>16))) * oneOverWidth)>>32);
                dv = static_cast<int>(((v1->v - (v0->v + ((topHeight * ldv)>>16))) * oneOverWidth)>>32);
        #endif

        // Screen info

        unsigned int    offset = y0 * pitch;
        PTYPE *         fb = reinterpret_cast<PTYPE *>(pFrameBuffer) + offset;
        int             iHeight = y1 - y0;

        if (iHeight)
        {
                // Short edge delta X

                oneOverHeight = bigOne / topHeight;
                int     sdx = static_cast<int>(((v1->x - v0->x) * oneOverHeight) >> 32);

                // Edge variables (short)

                int     sx = v0->x + static_cast<int>((sdx * subPix)>>16);

                // Scan-convert the top half

                if (mid < v1->x)
                {
                        while(iHeight-- > 0)
                        {
                                // Integer (ceil()) left and right X components

                                int             x0 = (lx + 0xffff) & 0xffff0000;
                                int             x1 = (sx + 0xffff) & 0xffff0000;
                                #include "SWTri_Loop.cpp"
                        }
                }
                else if (mid > v1->x)
                {
                        while(iHeight-- > 0)
                        {
                                // Integer (ceil()) left and right X components

                                int     x0 = (sx + 0xffff) & 0xffff0000;
                                int     x1 = (lx + 0xffff) & 0xffff0000;
                                #include "SWTri_Loop.cpp"
                        }
                }
        }

        // Done?

        iHeight = y2 - y1;
        if (!iHeight) return;

        // Short edge along bottom half

        oneOverHeight = bigOne / (v2->y - v1->y);
        int     sdx = static_cast<int>(((v2->x - v1->x) * oneOverHeight) >> 32);

        subPix = (y1<<16) - v1->y;
        int     sx = v1->x + static_cast<int>((sdx * subPix)>>16);

        // Scan-convert the bottom half

        if (mid < v1->x)
        {
                while(iHeight-- > 0)
                {
                        // Integer (ceil()) left and right X components

                        int     x0 = (lx + 0xffff) & 0xffff0000;
                        int     x1 = (sx + 0xffff) & 0xffff0000;
                        #include "SWTri_Loop.cpp"
                }
        }
        else if (mid > v1->x)
        {
                while(iHeight-- > 0)
                {
                        // Integer (ceil()) left and right X components

                        int     x0 = (sx + 0xffff) & 0xffff0000;
                        int     x1 = (lx + 0xffff) & 0xffff0000;
                        #include "SWTri_Loop.cpp"
                }
        }
}
#undef funcname2
#undef funcname1
#undef funcname
#undef PTYPE
#undef PIXEL_INCLUDE
#undef TEXTURED
#undef TEX_ALPHA
#undef MOD_ARGB
#undef GLOBAL_ARGB
#undef LINEAR_BLEND
#undef NAME0
#undef NAME1
#undef NAME2
#undef NAME3
#undef NAME4
#undef NAME5