bool leavesDoNotOverlap(const PointSetArray& pointSet, const vector<shared_ptr<DAGNode>>& nodes) { // Find the leaf nodes vector<shared_ptr<DAGNode>> leafNodes; for (const shared_ptr<DAGNode>& node : nodes) { if (node->isLeaf()) { leafNodes.push_back(node); } } // Check the leaf nodes never intersect with each other for (const shared_ptr<DAGNode>& outerNode : leafNodes) { TriRecord outerTri = outerNode->tri_; for (const shared_ptr<DAGNode>& innerNode : leafNodes) { TriRecord innerTri = innerNode->tri_; if (!(outerTri == innerTri) && isOverlapping(intersectsTriangle(pointSet, outerTri, innerTri))) { return false; } } } return true; }
void trace(ray* currentRay, int x, int y) { //First Case See if it intersects light source double time = 10000.0; for(int i = 0; i < num_lights; i++) { double timeToLight = 0.0; if(intersectsLight(currentRay,i, timeToLight)) { if(timeToLight < time) { time = timeToLight; //myImage->setPixel(x,y, // myImage->getPixel(x,y).getX() + (lights[i].color[0] * 255.0), // myImage->getPixel(x,y).getY() + (lights[i].color[1] * 255.0), // myImage->getPixel(x,y).getZ() + (lights[i].color[2] * 255.0)); myImage->setPixel(x,y, (lights[i].color[0] * 255.0), (lights[i].color[1] * 255.0), (lights[i].color[2] * 255.0)); } } } for(int j = 0; j < num_spheres; j++) { double timeToSphere = 0.0; bool insideSphere = false; vector* normal = new vector; //State shows what kind of intersection if(intersectsSphere(currentRay, normal, j, timeToSphere, insideSphere, false)) { if(timeToSphere < time) { bool clear = true; time = timeToSphere; vector* intersectionPoint = currentRay->getPositionAtTime(timeToSphere); vector* viewVector = &(currentRay->getDirection()); viewVector->negate(); viewVector->normalize(); normal->normalize(); vector* ambientComponent = new vector(ambient_light[0],ambient_light[1],ambient_light[2]); vector* diffuseComponent = new vector(); vector* specularComponent = new vector(); double dR, dG, dB, sR, sG, sB, shininess; dR = (spheres[j].color_diffuse[0]); dG = (spheres[j].color_diffuse[1]); dB = (spheres[j].color_diffuse[2]); sR = (spheres[j].color_specular[0]); sG = (spheres[j].color_specular[1]); sB = (spheres[j].color_specular[2]); shininess = (spheres[j].shininess); vector* diffuseColor = new vector(dR,dG,dB); vector* specularColor = new vector(sR,sG,sB); for(int i = 0; i < num_lights; i++) { vector* lightPos = new vector(lights[i].position[0], lights[i].position[1], lights[i].position[2]); vector* lightVector = intersectionPoint->subtract(lightPos); lightVector->normalize(); vector* rVector = lightVector->reflect(normal); rVector->normalize(); ray* toLight = new ray(intersectionPoint->getX(),intersectionPoint->getY(),intersectionPoint->getZ(), lightVector->getX(),lightVector->getY(),lightVector->getZ()); vector* tempNormal = new vector(); double lightTime = 0.0; intersectsLight(toLight, i, lightTime); bool tempState = false; for(int k = 0; k < num_spheres; k++) { double tempTime = 0.0; if(intersectsSphere(toLight, tempNormal, k, tempTime, tempState, true)) { if((tempTime < lightTime) && tempTime > 0.001) { clear = false; } } } for(int l = 0; l < num_triangles; l++) { vector* triV0 = new vector(triangles[l].v[0].position[0], triangles[l].v[0].position[1], triangles[l].v[0].position[2]); vector* triV1 = new vector(triangles[l].v[1].position[0], triangles[l].v[1].position[1], triangles[l].v[1].position[2]); vector* triV2 = new vector(triangles[l].v[2].position[0], triangles[l].v[2].position[1], triangles[l].v[2].position[2]); double tempAlpha, tempBeta, tempGamma; double tempTime = 0.0; if(intersectsTriangle(toLight, triV0, triV1, triV2, tempNormal, tempTime, tempAlpha, tempBeta, tempGamma)) { if(tempTime < lightTime) { clear = false; } } delete triV0; delete triV1; delete triV2; } //Diffuse Component double diffuseDotProduct = lightVector->dot(normal); if(diffuseDotProduct < 0.0) { diffuseDotProduct = 0.0; } //if(diffuseDotProduct > 1.0) //{ // diffuseDotProduct = 1.0; //} diffuseColor->scalarMultiply(diffuseDotProduct); diffuseComponent->addTo(diffuseColor); //Specular Component double specularDotProduct = rVector->dot(viewVector); if(specularDotProduct < 0.0) { specularDotProduct = 0.0; } //if(specularDotProduct > 1.0) //{ // specularDotProduct = 1.0; //} specularColor->scalarMultiply(pow(specularDotProduct,shininess)); specularComponent->addTo(specularColor); delete lightPos; delete lightVector; delete rVector; delete toLight; } if(clear) { ambientComponent->saturate(); diffuseComponent->saturate(); specularComponent->saturate(); vector* phongModel = ambientComponent->add(diffuseComponent); phongModel->addTo(specularComponent); phongModel->saturate(); myImage->setPixel(x,y,phongModel->getX()*255.0,phongModel->getY()*255.0,phongModel->getZ()*255.0); delete phongModel; } else { myImage->setPixel(x,y,0.0,0.0,0.0); } //delete viewVector; delete diffuseColor; delete specularColor; delete specularComponent; delete diffuseComponent; delete ambientComponent; } //END IF HERE } delete normal; } for(int k = 0; k < num_triangles; k++) { vector* triV0 = new vector(triangles[k].v[0].position[0], triangles[k].v[0].position[1], triangles[k].v[0].position[2]); vector* triV1 = new vector(triangles[k].v[1].position[0], triangles[k].v[1].position[1], triangles[k].v[1].position[2]); vector* triV2 = new vector(triangles[k].v[2].position[0], triangles[k].v[2].position[1], triangles[k].v[2].position[2]); vector* normal = new vector(); double alpha = 0.0; double beta = 0.0; double gamma = 0.0; double timeToTriangle = 0.0; if(intersectsTriangle(currentRay,triV0,triV1,triV2,normal,timeToTriangle,alpha,beta,gamma)) { if(timeToTriangle < time) { bool clear = true; time = timeToTriangle; //Do Intersection things normal->normalize(); vector* intersectionPoint = currentRay->getPositionAtTime(timeToTriangle); vector* viewVector = &(currentRay->getDirection()); viewVector->negate(); viewVector->normalize(); vector* ambientComponent = new vector(ambient_light[0],ambient_light[1],ambient_light[2]); vector* diffuseComponent = new vector(); vector* specularComponent = new vector(); double dR, dG, dB, sR, sG, sB, shininess; dR = (triangles[k].v[0].color_diffuse[0] * alpha) + (triangles[k].v[1].color_diffuse[0] * beta) + (triangles[k].v[2].color_diffuse[0] * gamma); dG = (triangles[k].v[0].color_diffuse[1] * alpha) + (triangles[k].v[1].color_diffuse[1] * beta) + (triangles[k].v[2].color_diffuse[1] * gamma); dB = (triangles[k].v[0].color_diffuse[2] * alpha) + (triangles[k].v[1].color_diffuse[2] * beta) + (triangles[k].v[2].color_diffuse[2] * gamma); sR = (triangles[k].v[0].color_specular[0] * alpha) + (triangles[k].v[1].color_specular[0] * beta) + (triangles[k].v[2].color_specular[0] * gamma); sG = (triangles[k].v[0].color_specular[1] * alpha) + (triangles[k].v[1].color_specular[1] * beta) + (triangles[k].v[2].color_specular[1] * gamma); sB = (triangles[k].v[0].color_specular[2] * alpha) + (triangles[k].v[1].color_specular[2] * beta) + (triangles[k].v[2].color_specular[2] * gamma); shininess = (triangles[k].v[0].shininess * alpha) + (triangles[k].v[1].shininess * beta) + (triangles[k].v[2].shininess * gamma); vector* diffuseColor = new vector(dR,dG,dB); vector* specularColor = new vector(sR,sG,sB); for(int i = 0; i < num_lights; i++) { vector* lightPos = new vector(lights[i].position[0], lights[i].position[1], lights[i].position[2]); vector* lightVector = intersectionPoint->subtract(lightPos); lightVector->normalize(); vector* rVector = lightVector->reflect(normal); rVector->normalize(); ray* toLight = new ray(intersectionPoint->getX(),intersectionPoint->getY(),intersectionPoint->getZ(), lightVector->getX(),lightVector->getY(),lightVector->getZ()); vector* tempNormal = new vector(); double lightTime = 0.0; intersectsLight(toLight, i, lightTime); double tempTime = 0.0; bool tempState; for(int l = 0; l < num_spheres; l++) { tempTime = 0.0; if(intersectsSphere(toLight, tempNormal, l, tempTime, tempState, false)) { if(tempTime < lightTime) { clear = false; } } } tempNormal = new vector(); for(int j = 0; j < num_triangles; j++) { tempTime = 0.0; vector* triVZ = new vector(triangles[j].v[0].position[0], triangles[j].v[0].position[1], triangles[j].v[0].position[2]); vector* triVO = new vector(triangles[j].v[1].position[0], triangles[j].v[1].position[1], triangles[j].v[1].position[2]); vector* triVT = new vector(triangles[j].v[2].position[0], triangles[j].v[2].position[1], triangles[j].v[2].position[2]); double tempAlpha, tempBeta, tempGamma; if(k != j && intersectsTriangle(toLight, triVZ, triVO, triVT, tempNormal, tempTime, tempAlpha, tempBeta, tempGamma)) { if(tempTime < lightTime) { clear = false; } } delete triVZ; delete triVO; delete triVT; } //Diffuse Component double diffuseDotProduct = lightVector->dot(normal); if(diffuseDotProduct < 0.0) { diffuseDotProduct = 0.0; } //if(diffuseDotProduct > 1.0) //{ // diffuseDotProduct = 1.0; //} diffuseColor->scalarMultiply(diffuseDotProduct); diffuseComponent->addTo(diffuseColor); //Specular Component double specularDotProduct = rVector->dot(viewVector); if(specularDotProduct < 0.0) { specularDotProduct = 0.0; } //if(specularDotProduct > 1.0) //{ // specularDotProduct = 1.0; //} specularColor->scalarMultiply(pow(specularDotProduct,shininess)); specularComponent->addTo(specularColor); delete lightPos; delete lightVector; delete rVector; } if(clear) { ambientComponent->saturate(); diffuseComponent->saturate(); specularComponent->saturate(); vector* phongModel = ambientComponent->add(diffuseComponent); phongModel->addTo(specularComponent); phongModel->saturate(); myImage->setPixel(x,y,phongModel->getX()*255.0,phongModel->getY()*255.0,phongModel->getZ()*255.0); delete phongModel; } else { myImage->setPixel(x,y,0.0,0.0,0.0); } delete intersectionPoint; //delete viewVector; delete diffuseColor; delete specularColor; delete specularComponent; delete diffuseComponent; delete ambientComponent; } } delete triV0; delete triV1; delete triV2; delete normal; } }