void Fixel::render (const Projection& projection, int axis, int slice) { if (fixel_tool.do_crop_to_slice && (slice < 0 || slice >= header.dim(axis))) return; start (fixel_shader); projection.set (fixel_shader); gl::Uniform1f (gl::GetUniformLocation (fixel_shader, "line_length"), line_length * line_length_multiplier); gl::Uniform1f (gl::GetUniformLocation (fixel_shader, "max_value"), value_max); gl::Uniform1f (gl::GetUniformLocation (fixel_shader, "scale_line_length_by_value"), scale_line_length_by_value); if (use_discard_lower()) gl::Uniform1f (gl::GetUniformLocation (fixel_shader, "lower"), lessthan); if (use_discard_upper()) gl::Uniform1f (gl::GetUniformLocation (fixel_shader, "upper"), greaterthan); if (color_type == Colour) gl::Uniform3fv (gl::GetUniformLocation (fixel_shader, "const_colour"), 1, colour); if (fixel_tool.line_opacity < 1.0) { gl::Enable (gl::BLEND); gl::Disable (gl::DEPTH_TEST); gl::DepthMask (gl::FALSE_); gl::BlendEquation (gl::FUNC_ADD); gl::BlendFunc (gl::CONSTANT_ALPHA, gl::ONE); gl::BlendColor (1.0, 1.0, 1.0, fixel_tool.line_opacity); } else { gl::Disable (gl::BLEND); gl::Enable (gl::DEPTH_TEST); gl::DepthMask (gl::TRUE_); } gl::LineWidth (fixel_tool.line_thickness); gl::BindVertexArray (vertex_array_object); if (!fixel_tool.do_crop_to_slice) { for (size_t x = 0; x < slice_fixel_indices[0].size(); ++x) gl::MultiDrawArrays (gl::LINES, &slice_fixel_indices[0][x][0], &slice_fixel_sizes[0][x][0], slice_fixel_counts[0][x]); } else { gl::MultiDrawArrays (gl::LINES, &slice_fixel_indices[axis][slice][0], &slice_fixel_sizes[axis][slice][0], slice_fixel_counts[axis][slice]); } if (fixel_tool.line_opacity < 1.0) { gl::Disable (gl::BLEND); gl::Enable (gl::DEPTH_TEST); gl::DepthMask (gl::TRUE_); } stop (fixel_shader); }
void AbstractFixel::render (const Projection& projection) { start (fixel_shader); projection.set (fixel_shader); gl::Uniform1f (gl::GetUniformLocation (fixel_shader, "length_mult"), voxel_size_length_multipler * user_line_length_multiplier); gl::Uniform1f (gl::GetUniformLocation (fixel_shader, "line_thickness"), line_thickness); if (use_discard_lower()) gl::Uniform1f (gl::GetUniformLocation (fixel_shader, "lower"), lessthan); if (use_discard_upper()) gl::Uniform1f (gl::GetUniformLocation (fixel_shader, "upper"), greaterthan); if (ColourMap::maps[colourmap].is_colour) gl::Uniform3f (gl::GetUniformLocation (fixel_shader, "colourmap_colour"), colour[0]/255.0f, colour[1]/255.0f, colour[2]/255.0f); if (fixel_tool.line_opacity < 1.0) { gl::Enable (gl::BLEND); gl::Disable (gl::DEPTH_TEST); gl::DepthMask (gl::FALSE_); gl::BlendEquation (gl::FUNC_ADD); gl::BlendFunc (gl::CONSTANT_ALPHA, gl::ONE); gl::BlendColor (1.0, 1.0, 1.0, fixel_tool.line_opacity); } else { gl::Disable (gl::BLEND); gl::Enable (gl::DEPTH_TEST); gl::DepthMask (gl::TRUE_); } if (!fixel_tool.do_crop_to_slice) { vertex_array_object.bind(); for (size_t x = 0, N = slice_fixel_indices[0].size(); x < N; ++x) { if (slice_fixel_counts[0][x]) gl::MultiDrawArrays (gl::POINTS, &slice_fixel_indices[0][x][0], &slice_fixel_sizes[0][x][0], slice_fixel_counts[0][x]); } } else { request_update_interp_image_buffer (projection); if (GLsizei points_count = regular_grid_buffer_pos.size()) gl::DrawArrays(gl::POINTS, 0, points_count); } if (fixel_tool.line_opacity < 1.0) { gl::Disable (gl::BLEND); gl::Enable (gl::DEPTH_TEST); gl::DepthMask (gl::TRUE_); } stop (fixel_shader); }