Exemplo n.º 1
0
void R_DivVertColors(Vector4f *dst, Vector4f const *src,
    WorldEdge const &leftEdge, WorldEdge const &rightEdge)
{
    int const numR = 3 + rightEdge.divisionCount();
    int const numL = 3 + leftEdge.divisionCount();

    if(numR + numL == 6) return; // Nothing to do.

    // Right fan:
    dst[numL + 0] = src[0];
    dst[numL + 1] = src[3];
    dst[numL + numR-1] = src[2];

    for(int n = 0; n < rightEdge.divisionCount(); ++n)
    {
        WorldEdge::Event const &icpt = rightEdge.at(rightEdge.lastDivision() - n);
        dst[numL + 2 + n] = src[2] + (src[3] - src[2]) * icpt.distance();
    }

    // Left fan:
    dst[0] = src[3];
    dst[1] = src[0];
    dst[numL - 1] = src[1];

    for(int n = 0; n < leftEdge.divisionCount(); ++n)
    {
        WorldEdge::Event const &icpt = leftEdge.at(leftEdge.firstDivision() + n);
        dst[2 + n] = src[0] + (src[1] - src[0]) * icpt.distance();
    }
}
Exemplo n.º 2
0
void R_DivVertColors(ColorRawf *dst, ColorRawf const *src,
    WorldEdge const &leftEdge, WorldEdge const &rightEdge)
{
#define COPYVCOLOR(d, s)    (d)->rgba[CR] = (s)->rgba[CR]; \
    (d)->rgba[CG] = (s)->rgba[CG]; \
    (d)->rgba[CB] = (s)->rgba[CB]; \
    (d)->rgba[CA] = (s)->rgba[CA];

    int const numR = 3 + rightEdge.divisionCount();
    int const numL = 3 + leftEdge.divisionCount();

    if(numR + numL == 6) return; // Nothing to do.

    // Right fan:
    COPYVCOLOR(&dst[numL + 0], &src[0]);
    COPYVCOLOR(&dst[numL + 1], &src[3]);
    COPYVCOLOR(&dst[numL + numR-1], &src[2]);

    for(int n = 0; n < rightEdge.divisionCount(); ++n)
    {
        WorldEdge::Event const &icpt = rightEdge.at(rightEdge.lastDivision() - n);
        double inter = icpt.distance();
        for(int c = 0; c < 4; ++c)
        {
            dst[numL + 2 + n].rgba[c] = src[2].rgba[c] + (src[3].rgba[c] - src[2].rgba[c]) * inter;
        }
    }

    // Left fan:
    COPYVCOLOR(&dst[0], &src[3]);
    COPYVCOLOR(&dst[1], &src[0]);
    COPYVCOLOR(&dst[numL - 1], &src[1]);

    for(int n = 0; n < leftEdge.divisionCount(); ++n)
    {
        WorldEdge::Event const &icpt = leftEdge.at(leftEdge.firstDivision() + n);
        double inter = icpt.distance();
        for(int c = 0; c < 4; ++c)
        {
            dst[2 + n].rgba[c] = src[0].rgba[c] + (src[1].rgba[c] - src[0].rgba[c]) * inter;
        }
    }

#undef COPYVCOLOR
}
Exemplo n.º 3
0
void R_DivVerts(rvertex_t *dst, rvertex_t const *src,
    WorldEdge const &leftEdge, WorldEdge const &rightEdge)
{
#define COPYVERT(d, s)  (d)->pos[VX] = (s)->pos[VX]; \
    (d)->pos[VY] = (s)->pos[VY]; \
    (d)->pos[VZ] = (s)->pos[VZ];

    int const numR = 3 + rightEdge.divisionCount();
    int const numL = 3 + leftEdge.divisionCount();

    if(numR + numL == 6) return; // Nothing to do.

    // Right fan:
    COPYVERT(&dst[numL + 0], &src[0])
    COPYVERT(&dst[numL + 1], &src[3]);
    COPYVERT(&dst[numL + numR - 1], &src[2]);

    for(int n = 0; n < rightEdge.divisionCount(); ++n)
    {
        WorldEdge::Event const &icpt = rightEdge.at(rightEdge.lastDivision() - n);
        Vector3d const &origin = icpt.origin();
        V3f_Set(dst[numL + 2 + n].pos, origin.x, origin.y, origin.z);
    }

    // Left fan:
    COPYVERT(&dst[0], &src[3]);
    COPYVERT(&dst[1], &src[0]);
    COPYVERT(&dst[numL - 1], &src[1]);

    for(int n = 0; n < leftEdge.divisionCount(); ++n)
    {
        WorldEdge::Event const &icpt = leftEdge.at(leftEdge.firstDivision() + n);
        Vector3d const &origin = icpt.origin();
        V3f_Set(dst[2 + n].pos, origin.x, origin.y, origin.z);
    }

#undef COPYVERT
}
Exemplo n.º 4
0
void R_DivTexCoords(rtexcoord_t *dst, rtexcoord_t const *src,
    WorldEdge const &leftEdge, WorldEdge const &rightEdge)
{
#define COPYTEXCOORD(d, s)    (d)->st[0] = (s)->st[0]; \
    (d)->st[1] = (s)->st[1];

    int const numR = 3 + rightEdge.divisionCount();
    int const numL = 3 + leftEdge.divisionCount();

    if(numR + numL == 6) return; // Nothing to do.

    // Right fan:
    COPYTEXCOORD(&dst[numL + 0], &src[0]);
    COPYTEXCOORD(&dst[numL + 1], &src[3]);
    COPYTEXCOORD(&dst[numL + numR-1], &src[2]);

    for(int n = 0; n < rightEdge.divisionCount(); ++n)
    {
        WorldEdge::Event const &icpt = rightEdge.at(rightEdge.lastDivision() - n);
        dst[numL + 2 + n].st[0] = src[3].st[0];
        dst[numL + 2 + n].st[1] = src[2].st[1] + (src[3].st[1] - src[2].st[1]) * icpt.distance();
    }

    // Left fan:
    COPYTEXCOORD(&dst[0], &src[3]);
    COPYTEXCOORD(&dst[1], &src[0]);
    COPYTEXCOORD(&dst[numL - 1], &src[1]);

    for(int n = 0; n < leftEdge.divisionCount(); ++n)
    {
        WorldEdge::Event const &icpt = leftEdge.at(leftEdge.firstDivision() + n);
        dst[2 + n].st[0] = src[0].st[0];
        dst[2 + n].st[1] = src[0].st[1] + (src[1].st[1] - src[0].st[1]) * icpt.distance();
    }

#undef COPYTEXCOORD
}