示例#1
0
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;
}
示例#2
0
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;
	}
}