//! Drawable:: Called after drawing void BillboardParticles::postDraw(SceneRenderer & renderer) { renderer.setDepthMask(true); renderer.setBlend(false); renderer.getProgram().disableArrayPtr("in_position"); renderer.getProgram().disableArrayPtr("in_texcoord"); renderer.getProgram().disableArrayPtr("in_color"); }
//! Drawable:: Draw one occurrence void BillboardParticles::drawOccurrence(SceneRenderer & renderer, SceneNode & node) { Mat4 model_view = node.getScene().getCamera().getTransform() * node.getCachedTransformRef(); Mat4 model_view_projection = node.getScene().getCamera().getProjection() * model_view; renderer.getProgram().setParamMat4("model_view_projection_matrix", model_view_projection); renderer.getProgram().setVertexData(vbo.get(), current_node * sizeof(VertexTemplate) * particle_count * 4); renderer.drawElements(GL_TRIANGLE_STRIP, particle_count * 6, ibo); current_node++; }
//! Drawable:: Called upon drawing void BillboardParticles::preDraw(SceneRenderer & renderer) { renderer.useProgram("BillboardParticleShader.shader"); renderer.setDepthMask(false); renderer.setBlend(true); renderer.setBlendFunc(GL_SRC_ALPHA, GL_ONE); renderer.useTexture(emitter->properties->texture); renderer.getProgram().setVertexData(tbo.get()); current_node = 0; }