//! Gets all triangles which have or may have contact with a 3d line.
	// new version: from user Piraaate
	void COctreeTriangleSelector::getTriangles(triangle3df* triangles, SINT32 arraySize,
		SINT32& outTriangleCount, const line3df& line,
		const Matrix4* transform) const
	{
#if 0
		AxisAlignedBox box(line.start);
		box.addInternalPoint(line.end);

		// TODO: Could be optimized for line a little bit more.
		COctreeTriangleSelector::getTriangles(triangles, arraySize, outTriangleCount,
			box, transform);
#else

		Matrix4 mat(Matrix4::ZERO);

		Vector3 vectStartInv(line.start), vectEndInv(line.end);
		if (SceneNode)
		{
			mat = SceneNode->getAbsoluteTransformation();
			//mat.makeInverse();
			mat = Matrix4::IDENTITY;
			//mat.transformVect(vectStartInv, line.start);
			//mat.transformVect(vectEndInv, line.end);
			vectStartInv = mat.transformAffine(line.start);
			vectEndInv = mat.transformAffine(line.end);
		}
		line3d<FLOAT32> invline(vectStartInv, vectEndInv);

		//mat.makeIdentity();
		mat = Matrix4::IDENTITY;

		if (transform)
			mat = (*transform);

		if (SceneNode)
			mat = SceneNode->getAbsoluteTransformation() * mat;//mat *= SceneNode->getAbsoluteTransformation();

		SINT32 trianglesWritten = 0;

		if (Root)
			getTrianglesFromOctree(Root, trianglesWritten, arraySize, invline, &mat, triangles);

		outTriangleCount = trianglesWritten;
#endif
	}
Пример #2
0
//! Gets all triangles which have or may have contact with a 3d line.
// new version: from user Piraaate
void COctreeTriangleSelector::getTriangles(core::triangle3df* triangles, s32 arraySize,
		s32& outTriangleCount, const core::line3d<f32>& line,
		const core::matrix4* transform) const
{
#if 0
	core::aabbox3d<f32> box(line.start);
	box.addInternalPoint(line.end);

	// TODO: Could be optimized for line a little bit more.
	COctreeTriangleSelector::getTriangles(triangles, arraySize, outTriangleCount,
		box, transform);
#else

	core::matrix4 mat ( core::matrix4::EM4CONST_NOTHING );

	core::vector3df vectStartInv ( line.start ), vectEndInv ( line.end );
	if (SceneNode)
	{
		mat = SceneNode->getAbsoluteTransformation();
		mat.makeInverse();
		mat.transformVect(vectStartInv, line.start);
		mat.transformVect(vectEndInv, line.end);
	}
	core::line3d<f32> invline(vectStartInv, vectEndInv);

	mat.makeIdentity();

	if (transform)
		mat = (*transform);

	if (SceneNode)
		mat *= SceneNode->getAbsoluteTransformation();

	s32 trianglesWritten = 0;

	if (Root)
		getTrianglesFromOctree(Root, trianglesWritten, arraySize, invline, &mat, triangles);

	outTriangleCount = trianglesWritten;
#endif
}