Example #1
0
void OpenGL3Driver::draw(const RenderData& data)
{
    if (data.primitive == gpu_generated)
    {
        glDrawArrays(GL_POINTS, 0, data.elements_number);
        return;
    }
#ifdef MHE_OPENGL_USE_GL_DRAW_ELEMENTS_BASE_VERTEX
    OpenGLExtensions::instance().glDrawElementsBaseVertex(get_primitive_type(data.primitive),
            data.indexes_number != 0 ? data.indexes_number : current_index_buffer_->size(), GL_UNSIGNED_INT,
            (void*)(data.ibuffer_offset * sizeof(uint32_t)), data.vbuffer_offset);
#else
    glDrawElements(get_primitive_type(data.primitive),
                   data.indexes_number != 0 ? data.indexes_number : current_index_buffer_->size(), GL_UNSIGNED_INT,
                   (void*)(data.ibuffer_offset * sizeof(uint32_t)));
#endif
    CHECK_GL_ERRORS();
}
Example #2
0
void OpenGL3Driver::draw(size_t elements_number, size_t /*vbuffer_offset*/, size_t ibuffer_offset, size_t indices_number, Primitive primitive)
{
    if (primitive == gpu_generated)
    {
        glDrawArrays(GL_POINTS, 0, elements_number);
        return;
    }
    if (indices_number == 0)
        return;

#ifdef MHE_OPENGL_USE_GL_DRAW_ELEMENTS_BASE_VERTEX
    OpenGLExtensions::instance().glDrawElementsBaseVertex(get_primitive_type(primitive),
            indices_number != 0 ? indices_number : current_index_buffer_->size(), GL_UNSIGNED_INT,
            (void*)(ibuffer_offset * sizeof(uint32_t)), vbuffer_offset);
#else
    glDrawElements(get_primitive_type(primitive),
                   indices_number != 0 ? indices_number : current_index_buffer_->size(), GL_UNSIGNED_INT,
                   (void*)(ibuffer_offset * sizeof(uint32_t)));
#endif
    CHECK_GL_ERRORS();
}
      //разбор примитива
    void ParsePrimitive (Parser::Iterator primitive_iter, Mesh& mesh)
    {
      static const char* METHOD_NAME = "media::geometry::XmlMeshLibraryLoader::ParsePrimitive";
      
      const char*   type_string         = get<const char*> (*primitive_iter, "type");
      PrimitiveType type                = get_primitive_type (type_string);
      const char*   material            = get<const char*> (*primitive_iter, "material", "");
      unsigned int  vertex_buffer_index = get<unsigned int> (*primitive_iter, "vertex_buffer"),
                    first               = get<unsigned int> (*primitive_iter, "first"),
                    count               = get<unsigned int> (*primitive_iter, "count"),
                    base_vertex         = get<unsigned int> (*primitive_iter, "base_vertex", 0u);

      if (type >= PrimitiveType_Num)
        throw xtl::make_argument_exception (METHOD_NAME, "type", type_string);

      if (vertex_buffer_index >= mesh.VertexBuffersCount ())
        throw xtl::make_range_exception (METHOD_NAME, "vertex_buffer", vertex_buffer_index, mesh.VertexBuffersCount ());

      const VertexBuffer& vertex_buffer  = mesh.VertexBuffer (vertex_buffer_index);
      unsigned int        vertices_count = vertex_buffer.VerticesCount (),
                          indices_count  = mesh.IndexBuffer ().Size (),
                          max_primitives_count = 0,
                          max_count      = indices_count ? indices_count : vertices_count;                          

      if (first > max_count)
        throw xtl::make_range_exception (METHOD_NAME, "first", first, max_count);

      max_count -= first;

      switch (type)
      {
        case PrimitiveType_LineList:
          max_primitives_count = max_count / 2;
          break;
        case media::geometry::PrimitiveType_LineStrip:          
          max_primitives_count = max_count > 1 ? max_count - 1 : 0;
          break;
        case media::geometry::PrimitiveType_TriangleList:
          max_primitives_count = max_count / 3;
          break;
        case media::geometry::PrimitiveType_TriangleStrip:
          max_primitives_count = max_count > 2 ? max_count - 2 : 0;
          break;          
        case media::geometry::PrimitiveType_TriangleFan:
          max_primitives_count = max_count > 2 ? max_count - 2 : 0;
          break;            
        default:
          break;
      }

      if (count > max_primitives_count)
        throw xtl::make_range_exception (METHOD_NAME, "count", count, max_primitives_count + 1);

      if (base_vertex >= vertices_count)
        throw xtl::make_range_exception (METHOD_NAME, "base_vertex", base_vertex, vertices_count);

      if (!count)
      {
        primitive_iter->Log ().Warning (*primitive_iter, "Empty primitive");
        return;
      }

      mesh.AddPrimitive (type, vertex_buffer_index, first, count, base_vertex, material);
    }