コード例 #1
0
ファイル: PLODRessource.cpp プロジェクト: 4og/guacamole
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);
    }
  }
}
コード例 #2
0
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);
}
コード例 #3
0
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);
    }
  }

}

}