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