void SmokeRenderer::render()
{
	switch(mDisplayMode) {
	case POINTS:
		glColor3f(1.0, 1.0, 1.0);
		m_simpleProg->enable();
		drawPoints(0, mNumParticles, false);
		m_simpleProg->disable();
		break;
	case SPRITES:
        glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
		glColor4f(1.0, 1.0, 1.0, m_spriteAlpha);
		drawPointSprites(m_particleProg, 0, mNumParticles, false);
		break;
	case VOLUMETRIC:
		drawSlices();
		compositeResult();
		break;
	case NUM_MODES:
		break;
	}

    if (m_displayLightBuffer) {
        // display light buffer to screen
        glViewport(0, 0, m_lightBufferSize, m_lightBufferSize);
        glDisable(GL_DEPTH_TEST);
        displayTexture(m_lightTexture[m_srcLightTexture]);
        glViewport(0, 0, mWindowW, mWindowH);
    }

    glutReportErrors();
}
Ejemplo n.º 2
0
void Renderer::display(DisplayMode mode, GLSLProgram *prog)
{
    switch (mode)
    {
        case PARTICLE_POINTS:
            glColor3f(1, 1, 1);
            glPointSize(m_pointSize);
            _drawPoints();
            break;
		case PARTICLE_FLUID:
			glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
			glColor4f(0.5, 0.5, 0.5, 0.1);
			glEnable(GL_DEPTH_TEST);
			glDepthMask(GL_FALSE);  // don't write depth
			glEnable(GL_BLEND);
			prog->enable();
			//prog->setUniform1f("pointRadius", mParticleRadius);
			prog->setUniform1f("pointRadius", 0.5f);
			glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vbo);
			glVertexPointer(4, GL_FLOAT, 0, 0);
			glEnableClientState(GL_VERTEX_ARRAY);

			glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_indexBuffer);

			glDrawElements(GL_POINTS, m_numParticles, GL_UNSIGNED_INT, (void *)(0 * sizeof(unsigned int)));
			//glDrawArrays(GL_POINTS, 0, m_numParticles);
			glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);

			glDisableClientState(GL_VERTEX_ARRAY);
			glDisableClientState(GL_COLOR_ARRAY);

			prog->disable();
			glDepthMask(GL_TRUE);
			glDisable(GL_BLEND);

        default:
        case PARTICLE_SPHERES:

			//glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR);
			//glColor4f(0.5, 0.5, 0.5, 0.1);
			//glEnable(GL_DEPTH_TEST);
			//glDepthMask(GL_FALSE);  // don't write depth
			//glEnable(GL_BLEND);
			//prog->enable();
			////prog->setUniform1f("pointRadius", mParticleRadius);
			//prog->setUniform1f("pointRadius", 1.5f);
			//glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vbo);
			//glVertexPointer(4, GL_FLOAT, 0, 0);
			//glEnableClientState(GL_VERTEX_ARRAY);

			//if (m_colorVBO){
			//	glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_colorVBO);
			//	glColorPointer(4, GL_FLOAT, 0, 0);
			//	glEnableClientState(GL_COLOR_ARRAY);
			//}

			//if (m_velVbo)
			//{
			//	glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_velVbo);
			//	glClientActiveTexture(GL_TEXTURE0);
			//	glTexCoordPointer(4, GL_FLOAT, 0, 0);
			//	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
			//}

			//if (m_indexBuffer){
			//	glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, m_indexBuffer);
			//	glDrawElements(GL_POINTS, m_numParticles, GL_UNSIGNED_INT, (void *)(0 * sizeof(unsigned int)));
			//	glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0);
			//}

			//glDisableClientState(GL_VERTEX_ARRAY);
			//glDisableClientState(GL_COLOR_ARRAY);

			//prog->disable();
			//glDepthMask(GL_TRUE);
			//glDisable(GL_BLEND);



			m_imageFbo->Bind();
			glClearColor(0.0, 0.0, 0.0, 0.0);
			glClear(GL_COLOR_BUFFER_BIT);
			m_imageFbo->Disable();

			glActiveTexture(GL_TEXTURE0);
			glMatrixMode(GL_TEXTURE);

			m_imageFbo->Bind();
			glViewport(0, 0, m_imageW, m_imageH);
			glColor4f(1.0, 1.0, 1.0, 1.0);
			glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

			drawpointsprite();

			m_imageFbo->Disable();
			glActiveTexture(GL_TEXTURE0);
			glMatrixMode(GL_TEXTURE);
			glLoadIdentity();

			//drawPostProcess();
			compositeResult();


			//m_program->enable();
			//glBindBuffer(GL_ARRAY_BUFFER, m_vbo);
			//glVertexPointer(4, GL_FLOAT, 0, 0);
			//glEnableClientState(GL_VERTEX_ARRAY);

			///*glBindBufferARB(GL_ARRAY_BUFFER_ARB, normalVbo);
			//glNormalPointer(GL_FLOAT, sizeof(float) * 4, 0);
			//glEnableClientState(GL_NORMAL_ARRAY);*/

			//glColor3f(1.0, 0.0, 0.0);
			//glDrawArrays(GL_TRIANGLES, 0, totalVerts);
			//glDisableClientState(GL_VERTEX_ARRAY);
			//glDisableClientState(GL_NORMAL_ARRAY);

			//glBindBuffer(GL_ARRAY_BUFFER, 0);
			//m_program->disable();
   //         break;
    }
}