Example #1
0
/*
================
R_ClipEdge
================
*/
void R_ClipEdge(mvertex_t * pv0, mvertex_t * pv1, clipplane_t * clip)
{
    float d0, d1, f;
    mvertex_t clipvert;

    if (clip) {
        do {
            d0 = DotProduct(pv0->position, clip->normal) - clip->dist;
            d1 = DotProduct(pv1->position, clip->normal) - clip->dist;

            if (d0 >= 0) {
                // point 0 is unclipped
                if (d1 >= 0) {
                    // both points are unclipped
                    continue;
                }
                // only point 1 is clipped

                // we don't cache clipped edges
                cacheoffset = 0x7FFFFFFF;

                f = d0 / (d0 - d1);
                clipvert.position[0] = pv0->position[0] +
                                       f * (pv1->position[0] - pv0->position[0]);
                clipvert.position[1] = pv0->position[1] +
                                       f * (pv1->position[1] - pv0->position[1]);
                clipvert.position[2] = pv0->position[2] +
                                       f * (pv1->position[2] - pv0->position[2]);

                if (clip->leftedge) {
                    r_leftclipped = true;
                    r_leftexit = clipvert;
                } else if (clip->rightedge) {
                    r_rightclipped = true;
                    r_rightexit = clipvert;
                }

                R_ClipEdge(pv0, &clipvert, clip->next);
                return;
            } else {
                // point 0 is clipped
                if (d1 < 0) {
                    // both points are clipped
                    // we do cache fully clipped edges
                    if (!r_leftclipped)
                        cacheoffset = FULLY_CLIPPED_CACHED |
                                      (r_framecount & FRAMECOUNT_MASK);
                    return;
                }
                // only point 0 is clipped
                r_lastvertvalid = false;

                // we don't cache partially clipped edges
                cacheoffset = 0x7FFFFFFF;

                f = d0 / (d0 - d1);
                clipvert.position[0] = pv0->position[0] +
                                       f * (pv1->position[0] - pv0->position[0]);
                clipvert.position[1] = pv0->position[1] +
                                       f * (pv1->position[1] - pv0->position[1]);
                clipvert.position[2] = pv0->position[2] +
                                       f * (pv1->position[2] - pv0->position[2]);

                if (clip->leftedge) {
                    r_leftclipped = true;
                    r_leftenter = clipvert;
                } else if (clip->rightedge) {
                    r_rightclipped = true;
                    r_rightenter = clipvert;
                }

                R_ClipEdge(&clipvert, pv1, clip->next);
                return;
            }
        } while ((clip = clip->next) != NULL);
    }
// add the edge
    R_EmitEdge(pv0, pv1);
}
Example #2
0
/*
================
R_ClipEdge
================
*/
void R_ClipEdge(mvertex_t *pv0, mvertex_t *pv1, clipplane_t *clip)
{
    float       d0, d1, f;
    mvertex_t   clipvert;

    for (; clip; clip = clip->next) {
        d0 = DotProduct(pv0->point, clip->normal) - clip->dist;
        d1 = DotProduct(pv1->point, clip->normal) - clip->dist;

        if (d0 >= 0) {
            // point 0 is unclipped
            if (d1 >= 0) {
                // both points are unclipped
                continue;
            }

            // only point 1 is clipped

            // we don't cache clipped edges
            cacheoffset = CLIPPED_NOT_CACHED;

            f = d0 / (d0 - d1);
            LerpVector(pv0->point, pv1->point, f, clipvert.point);

            if (clip->leftedge) {
                r_leftclipped = qtrue;
                r_leftexit = clipvert;
            } else if (clip->rightedge) {
                r_rightclipped = qtrue;
                r_rightexit = clipvert;
            }

            R_ClipEdge(pv0, &clipvert, clip->next);
            return;
        } else {
            // point 0 is clipped
            if (d1 < 0) {
                // both points are clipped
                // we do cache fully clipped edges
                if (!r_leftclipped)
                    cacheoffset = FULLY_CLIPPED_CACHED |
                                  (r_framecount & FRAMECOUNT_MASK);
                return;
            }

            // only point 0 is clipped
            r_lastvertvalid = qfalse;

            // we don't cache partially clipped edges
            cacheoffset = CLIPPED_NOT_CACHED;

            f = d0 / (d0 - d1);
            LerpVector(pv0->point, pv1->point, f, clipvert.point);

            if (clip->leftedge) {
                r_leftclipped = qtrue;
                r_leftenter = clipvert;
            } else if (clip->rightedge) {
                r_rightclipped = qtrue;
                r_rightenter = clipvert;
            }

            R_ClipEdge(&clipvert, pv1, clip->next);
            return;
        }
    }

// add the edge
    R_EmitEdge(pv0, pv1);
}