void SetBoundingSphere(){
		m_boundingSphere = Sphere3(m_particle.GetPosition(), m_particle.m_state.radius);
	}
Ejemplo n.º 2
0
void FluidSim::Render(GLuint capsuleShaderID, GLuint particleShaderID, glm::mat4 &viewMat, glm::mat4 &projMat)
{
	glm::mat4 finalTransform;
	int transformID, colorID;

	GLUquadricObj* refSphere = gluNewQuadric();
	gluQuadricTexture(refSphere, TRUE);
	gluQuadricNormals(refSphere, TRUE);

	if(!brokenCapsule)
	{
		GLUquadricObj* refCylinder = gluNewQuadric();
		gluQuadricTexture(refSphere, TRUE);
		gluQuadricNormals(refSphere, TRUE);

		glUseProgram(capsuleShaderID);
		glUniformMatrix4fv(glGetUniformLocation(capsuleShaderID, "mView"), 1, GL_FALSE, glm::value_ptr(viewMat));
		glUniformMatrix4fv(glGetUniformLocation(capsuleShaderID, "mProjection"), 1, GL_FALSE, glm::value_ptr(projMat));

		transformID = glGetUniformLocation(capsuleShaderID, "mTransform");
		colorID = glGetUniformLocation(capsuleShaderID, "vColor");

		float initialRotationOffset = glm::pi<float>() / 2.0f;

		glDepthFunc(GL_LEQUAL);
		glDepthMask(GL_FALSE);
		glUniform3f(colorID, 0.3f, 0.3f, 0.3f);	
		finalTransform = glm::translate(container.centre) * glm::eulerAngleYXZ(initialRotationOffset + container.rotation.y, initialRotationOffset + container.rotation.x, container.rotation.z) * glm::translate(0.0f, 0.0f, container.length);
		glUniformMatrix4fv(transformID, 1, GL_FALSE, &finalTransform[0][0]);
		gluSphere(refSphere, container.radius * 1.2f, 16, 16);

		finalTransform = glm::translate(container.centre) * glm::eulerAngleYXZ(initialRotationOffset + container.rotation.y, initialRotationOffset + container.rotation.x, container.rotation.z) * glm::translate(0.0f, 0.0f, -container.length);
		glUniformMatrix4fv(transformID, 1, GL_FALSE, &finalTransform[0][0]);
		gluSphere(refSphere, container.radius * 1.2f, 16, 16);

		finalTransform = glm::translate(container.centre) * glm::eulerAngleYXZ(initialRotationOffset + container.rotation.y, initialRotationOffset + container.rotation.x, container.rotation.z) * glm::translate(0.0f, 0.0f, -container.length);
		glUniformMatrix4fv(transformID, 1, GL_FALSE, &finalTransform[0][0]);
		gluCylinder(refCylinder, container.radius * 1.2f, container.radius * 1.2f, container.length * 2.0, 16, 16);
		glDepthMask(GL_TRUE);

		glUseProgram(particleShaderID);
		glUniformMatrix4fv(glGetUniformLocation(particleShaderID, "mView"), 1, GL_FALSE, glm::value_ptr(viewMat));
		glUniformMatrix4fv(glGetUniformLocation(particleShaderID, "mProjection"), 1, GL_FALSE, glm::value_ptr(projMat));

		transformID = glGetUniformLocation(particleShaderID, "mTransform");
		colorID = glGetUniformLocation(particleShaderID, "vColor");

		glUniform3f(colorID, 0.0f, 1.0f, 0.0f);
		finalTransform = glm::translate(innerContainer.centre) * glm::eulerAngleYXZ(initialRotationOffset + innerContainer.rotation.y, initialRotationOffset + innerContainer.rotation.x, innerContainer.rotation.z) * glm::translate(0.0f, 0.0f, innerContainer.length);
		glUniformMatrix4fv(transformID, 1, GL_FALSE, &finalTransform[0][0]);
		gluSphere(refSphere, innerContainer.radius, 16, 16);

		finalTransform = glm::translate(innerContainer.centre) * glm::eulerAngleYXZ(initialRotationOffset + innerContainer.rotation.y, initialRotationOffset + innerContainer.rotation.x, innerContainer.rotation.z) * glm::translate(0.0f, 0.0f, -innerContainer.length);
		glUniformMatrix4fv(transformID, 1, GL_FALSE, &finalTransform[0][0]);
		gluSphere(refSphere, innerContainer.radius, 16, 16);

		finalTransform = glm::translate(innerContainer.centre) * glm::eulerAngleYXZ(initialRotationOffset + innerContainer.rotation.y, initialRotationOffset + innerContainer.rotation.x, innerContainer.rotation.z) * glm::translate(0.0f, 0.0f, -innerContainer.length);
		glUniformMatrix4fv(transformID, 1, GL_FALSE, &finalTransform[0][0]);
		gluCylinder(refCylinder, innerContainer.radius, innerContainer.radius, innerContainer.length * 2.0, 16, 16);
	}
	else
	{
		glUseProgram(particleShaderID);
		glUniformMatrix4fv(glGetUniformLocation(particleShaderID, "mView"), 1, GL_FALSE, glm::value_ptr(viewMat));
		glUniformMatrix4fv(glGetUniformLocation(particleShaderID, "mProjection"), 1, GL_FALSE, glm::value_ptr(projMat));

		transformID = glGetUniformLocation(particleShaderID, "mTransform");
		colorID = glGetUniformLocation(particleShaderID, "vColor");
	}

	if(showNeighbours)
	{
		Particle* curParticle = particles[particleHighlightID];
		finalTransform = glm::translate(curParticle->GetPosition());
		glUniformMatrix4fv(transformID, 1, GL_FALSE, &finalTransform[0][0]);
		glUniform3f(colorID, curParticle->color.x, curParticle->color.y, curParticle->color.z);

		float particleRenderSize = glm::pow((3.0f * curParticle->mass) / (4.0f * glm::pi<float>() * curParticle->density), 1.0f / 3.0f);	
		gluSphere(refSphere, particleRenderSize, 4, 4);

		for(int i = 0; i < curParticle->neighbours.size(); i++)
		{
			Particle* neighbourParticle = curParticle->neighbours[i];

			if(curParticle == neighbourParticle)
				continue;

			finalTransform = glm::translate(neighbourParticle->GetPosition());
			glUniformMatrix4fv(transformID, 1, GL_FALSE, &finalTransform[0][0]);
			glUniform3f(colorID, 1.0f, 0.0f, 0.0f);

			float particleRenderSize = glm::pow((3.0f * neighbourParticle->mass) / (4.0f * glm::pi<float>() * neighbourParticle->density), 1.0f / 3.0f);	
			gluSphere(refSphere, particleRenderSize, 4, 4);
		}
	}
	else
	{  
		for(int i = 0; i < particles.size(); i++)
		{
			finalTransform = glm::translate(particles[i]->GetPosition());
			   
			if(hideSurfaceParticles && particles[i]->color == glm::vec3(1.0f, 1.0f, 1.0f))
				continue;

			glUniformMatrix4fv(transformID, 1, GL_FALSE, &finalTransform[0][0]);
			glUniform3f(colorID, particles[i]->color.x, particles[i]->color.y, particles[i]->color.z);

			float particleRenderSize = glm::pow((3.0f * particles[i]->mass) / (4.0f * glm::pi<float>() * particles[i]->density), 1.0f / 3.0f);	
			gluSphere(refSphere, particleRenderSize, 4, 4);
		}
	}
}