예제 #1
0
void draw_segments( const viewDef_t *viewDef, const MySegments & s, idVec4 color )
{
	for(unsigned int i = 0; i < s.size(); i+=2)
	{
		viewDef->renderWorld->DebugLine( color, v4to3(s[i]), v4to3(s[i+1]));
	}
}
// clip the segments of e by the planes of polyhedron a.
void clip_segments(const polyhedron &ph, MySegments &is, MySegments &os)
{
	const MyArrayPoly &p = ph.p;

	for (unsigned int i = 0; i < is.size(); i+=2) {
		idVec4 a = is[i  ];
		idVec4 b = is[i+1];
		idVec4 c;

		bool discard = false;

		for (unsigned int j = 0; j < p.size(); j++) {
			float da = a * p[j].plane;
			float db = b * p[j].plane;
			float rdw = 1/(da - db);

			int code = 0;

			if (da > 0)
				code = 2;

			if (db > 0)
				code |= 1;


			switch (code) {
				case 3:
					discard = true;
					break;

				case 2:
					c = -db * rdw * a + da * rdw * b;
					a = c;
					break;

				case 1:
					c = -db * rdw * a + da * rdw * b;
					b = c;
					break;

				case 0:
					break;

				default:
					common->Printf("bad clip code!\n");
					break;
			}

			if (discard)
				break;
		}

		if (! discard) {
			os.push_back(a);
			os.push_back(b);
		}
	}

}