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

}
void polyhedron_edges( polyhedron &a, MySegments &e ) {
	e.empty();
	if( a.e.size() == 0 && a.p.size() != 0 ) {
		a.compute_neighbors();
	}
	for( unsigned int i = 0; i < a.e.size(); i++ ) {
		e.push_back( a.v[a.e[i].vi[0]] );
		e.push_back( a.v[a.e[i].vi[1]] );
	}
}
Пример #3
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]));
	}
}