/* ================ 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); }
/* ================ 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); }