Ejemplo n.º 1
0
eRETURN_TYPE DoIntersect(const cTRIANGLE3 &triangle,
				     const cSEGMENT3 &lseg, BOOL doDebug)
{

  if(DoIntersect(triangle.ComputeBbox(),
				  lseg.ComputeBbox()) == FAILURE)
    return FAILURE;

  cPLANE3 supportingPlane = triangle.SupportingPlane();
  cSEGMENT3 resultingSegment;
  cPOINT3 resultingPoint;
  if (doDebug){
	  printf("supportingPlane: ");
	  supportingPlane.Print();
  }
  if(DoIntersect(supportingPlane, lseg) != SUCCESS)
    return FAILURE;

  eRETURN_TYPE result = Intersection(supportingPlane, lseg,
						  resultingPoint, resultingSegment);


  eCOORD maxCoord = supportingPlane.Normal().AbsMaxCoord();

  cTRIANGLE2 transformedTriangle(triangle.Vertex(0).DropCoord(maxCoord),
				 triangle.Vertex(1).DropCoord(maxCoord),
				 triangle.Vertex(2).DropCoord(maxCoord));

  if(result == RT_POINT3) { //Intersection is a point.
    cPOINT2 transformedPoint = resultingPoint.DropCoord(maxCoord);
    if(transformedTriangle.IsPointInside(transformedPoint))
      return SUCCESS;
    else
      return FAILURE;
  }
  else {
    //Intersection is a line segment.
    //The segment is on the triangle plane.
    //Check for actual intersection.
    //Transform the problem to 2-D problem and try to compute the result.
    cSEGMENT2 transformedSegment(lseg.Source().DropCoord(maxCoord),
						  lseg.Target().DropCoord(maxCoord));

    if(DoIntersect(transformedTriangle,
				    transformedSegment) == SUCCESS)
      return SUCCESS;

    return FAILURE;
  }

  ASSERT(0); //Should be decided even before it gets here.

  return FAILURE;
}
Ejemplo n.º 2
0
void Renderer3DRasterization::render()
{
	setMaxDepth(1.0);

	TransformMatrix3D lookat = camera_->getLookatMatrix();
	TransformMatrix3D proj = camera_->getProjectionMatrix();
	TransformMatrix3D screen = camera_->getScreenMatrix();

	TransformMatrix3D transform = screen * proj * lookat;

	std::vector<Surface3D*> list = scene_->getTriangleList();

	std::cout << "Renderer3DRasterization: Found " << list.size() << " triangles" << std::endl;

	for (Surface3D* triangle : list)
	{
		Color color = triangle->getColor();

		// color shading according to Lambert
		// normally we need a light source, but we use camera this time

		Vector3D normal = triangle->getNormal();
		Vector3D center = triangle->getCenter();

		// get direction to camera

		Vector3D d = camera_->getCenter() - center;
		d.normalize();

		double lambert = Mathtools::dot(d, normal);

		color = color * (lambert < 0.0 ? 0.0 : lambert);

		Vector3D p0 = transform * *(triangle->getP0());
		Vector3D p1 = transform * *(triangle->getP1());
		Vector3D p2 = transform * *(triangle->getP2());

		// in case we used perspective projection: divide by homogeneous coordinate "w"
		p0.homogeneousDivide();
		p1.homogeneousDivide();
		p2.homogeneousDivide();

		
		Surface3D transformedTriangle(p0, p1, p2, &color, triangle->getTexture());
		transformedTriangle.setTextureAnchorPoints(triangle->getT0(), triangle->getT1(), triangle->getT2());

		rasterization(&transformedTriangle);
	}

}