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(); } }
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 }
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 }
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 }