void SetBoundingSphere(){ m_boundingSphere = Sphere3(m_particle.GetPosition(), m_particle.m_state.radius); }
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); } } }