void PLODRessource::draw( RenderContext const& ctx, pbr::context_t context_id, pbr::view_t view_id, pbr::model_t model_id, scm::gl::vertex_array_ptr const& vertex_array, std::vector<bool> const& frustum_culling_results) const { pbr::ren::ModelDatabase* database = pbr::ren::ModelDatabase::GetInstance(); pbr::ren::CutDatabase* cuts = pbr::ren::CutDatabase::GetInstance(); pbr::ren::Cut& cut = cuts->GetCut(context_id, view_id, model_id); std::vector<pbr::ren::Cut::NodeSlotAggregate>& node_list = cut.complete_set(); pbr::ren::KdnTree const* kdn_tree = database->GetModel(model_id)->kdn_tree(); uint32_t surfels_per_node = database->surfels_per_node(); uint32_t surfels_per_node_of_model = kdn_tree->surfels_per_node(); scm::gl::context_vertex_input_guard vig(ctx.render_context); ctx.render_context->bind_vertex_array(vertex_array); ctx.render_context->apply(); pbr::node_t node_counter = 0; for (const auto& n : node_list) { ++node_counter; // true == inside or intersecting frustum // false == outside frustum if (frustum_culling_results[node_counter] == true) { ctx.render_context->draw_arrays(scm::gl::PRIMITIVE_POINT_LIST, n.slot_id_ * surfels_per_node, surfels_per_node_of_model); } } }
void TriMeshRessource::draw(RenderContext const& ctx) const { // upload to GPU if neccessary if (vertices_.size() <= ctx.id || vertices_[ctx.id] == nullptr) { upload_to(ctx); } scm::gl::context_vertex_input_guard vig(ctx.render_context); ctx.render_context->bind_vertex_array(vertex_array_[ctx.id]); ctx.render_context->bind_index_buffer( indices_[ctx.id], scm::gl::PRIMITIVE_TRIANGLE_LIST, scm::gl::TYPE_UINT); ctx.render_context->apply(); ctx.render_context->draw_elements(mesh_->mNumFaces * 3); }
void LodResource::draw( RenderContext const& ctx, lamure::context_t context_id, lamure::view_t view_id, lamure::model_t model_id, scm::gl::vertex_array_ptr const& vertex_array, std::unordered_set<lamure::node_t> const& nodes_in_frustum, scm::gl::primitive_topology const type, scm::math::mat4d model_view_matrix, bool draw_sorted) const { lamure::ren::model_database* database = lamure::ren::model_database::get_instance(); lamure::ren::cut_database* cuts = lamure::ren::cut_database::get_instance(); lamure::ren::cut& cut = cuts->get_cut(context_id, view_id, model_id); std::vector<lamure::ren::cut::node_slot_aggregate>& node_list = cut.complete_set(); lamure::ren::bvh const* bvh = database->get_model(model_id)->get_bvh(); uint32_t primitives_per_node = database->get_primitives_per_node(); uint32_t primitives_per_node_of_model = bvh->get_primitives_per_node(); scm::gl::context_vertex_input_guard vig(ctx.render_context); ctx.render_context->bind_vertex_array(vertex_array); ctx.render_context->apply(); if( draw_sorted ) { //sorting BEGIN std::vector<lamure::ren::cut::node_slot_aggregate> node_render_list; node_render_list.reserve(nodes_in_frustum.size()); for (const auto& n : node_list) { if (nodes_in_frustum.find(n.node_id_) != nodes_in_frustum.end()) { node_render_list.push_back(n); } } auto const & bounding_box_vector = bvh->get_bounding_boxes(); auto compute_dist = [](scm::math::vec3f const& v3, scm::math::vec4d const& v4) { scm::math::vec3d dist_vec(double(v3[2]) - v4[2]); return scm::math::length_sqr(dist_vec); }; std::sort(node_render_list.begin(), node_render_list.end(), [&](lamure::ren::cut::node_slot_aggregate const & lhs, lamure::ren::cut::node_slot_aggregate const & rhs) { bool result = compute_dist(scm::math::vec3f(0), scm::math::vec4d(model_view_matrix * scm::math::vec4d( scm::math::vec3d(bounding_box_vector[lhs.node_id_].center()) ,1.0)) ) < compute_dist(scm::math::vec3f(0), scm::math::vec4d(model_view_matrix * scm::math::vec4d(scm::math::vec3d(bounding_box_vector[rhs.node_id_].center()),1.0) ) ); return result; } ); for (const auto& n : node_render_list) { //result inside vector means the node is out of frustum //if (nodes_in_frustum.find(n.node_id_) != nodes_in_frustum.end()) { ctx.render_context->draw_arrays(type, n.slot_id_ * primitives_per_node, primitives_per_node_of_model); //} } } else { for (const auto& n : node_list) { if (nodes_in_frustum.find(n.node_id_) != nodes_in_frustum.end()) { ctx.render_context->draw_arrays(type, n.slot_id_ * primitives_per_node, primitives_per_node_of_model); } } } }