source: trunk/src/gfx/debug_draw.cc @ 491

Last change on this file since 491 was 491, checked in by epyon, 9 years ago
  • mass update (will try to do atomic from now)
File size: 2.7 KB
RevLine 
[395]1// Copyright (C) 2014-2015 ChaosForge Ltd
[237]2// http://chaosforge.org/
3//
[395]4// This file is part of Nova libraries.
5// For conditions of distribution and use, see copying.txt file in root folder.
[237]6
7#include "nv/gfx/debug_draw.hh"
8
9#include "nv/interface/device.hh"
[469]10#include "nv/core/logging.hh"
[237]11
[346]12static const char *nv_debug_draw_vertex_shader = R"(
13#version 120
14attribute vec3 nv_position;
15attribute vec3 nv_color;
16varying vec3 v_color;
17uniform mat4 nv_m_mvp;
18void main(void)
19{
20        gl_Position = nv_m_mvp * vec4 (nv_position, 1.0);
21        v_color     = nv_color;
22};
23)";
24static const char *nv_debug_draw_fragment_shader = R"(
25#version 120
26varying vec3 v_color;
[491]27out vec4 o_frag_color;
[346]28void main(void)
29{
[491]30        o_frag_color = vec4( v_color, 1.0 );
[346]31}
32)";
[237]33
[313]34nv::debug_data::debug_data( context* a_context )
35        : m_context( a_context ), m_program(), m_va()
[237]36{
[313]37        m_program = m_context->get_device()->create_program( nv_debug_draw_vertex_shader, nv_debug_draw_fragment_shader );
[469]38        m_buffer_size = 0;
[237]39}
40
41void nv::debug_data::update()
42{
[469]43        if ( !m_va.is_valid() || m_data.size() > m_buffer_size )
44        {
45                if ( m_va.is_valid() ) m_context->release( m_va );
46                m_buffer_size = nv::max( m_data.size(), 4096U, m_buffer_size );
47                m_vb = m_context->get_device()->create_buffer( VERTEX_BUFFER, nv::STREAM_DRAW, m_buffer_size * sizeof( debug_vtx ), m_data.data() );
[491]48                vertex_array_desc va_desc;
49                va_desc.add_vertex_buffers< debug_vtx >( m_vb, true );
50                m_va = m_context->create_vertex_array( va_desc );
[469]51        }
52        else
53        {
54                m_context->update( m_vb, m_data.data(), 0, m_data.size()* sizeof( debug_vtx ) );
55        }
[237]56}
57
58void nv::debug_data::reset()
59{
60        m_data.clear();
61}
62
63void nv::debug_data::push_line( const vec3& a, const vec3& b, const vec3& color )
64{
65        m_data.emplace_back( a, color );
66        m_data.emplace_back( b, color );
67}
68
69void nv::debug_data::push_aabox( const vec3& a, const vec3& b, const vec3& color )
70{
71        vec3 corners[8] =
72        {
73                vec3( a.x, a.y, a.z ), vec3( b.x, a.y, a.z ), vec3( b.x, a.y, b.z ), vec3( a.x, a.y, b.z ),
74                vec3( a.x, b.y, a.z ), vec3( b.x, b.y, a.z ), vec3( b.x, b.y, b.z ), vec3( a.x, b.y, b.z ),
75        };
76
77        push_line( corners[0], corners[1], color );
78        push_line( corners[1], corners[2], color );
79        push_line( corners[2], corners[3], color );
80        push_line( corners[3], corners[0], color );
81        push_line( corners[0], corners[4], color );
82        push_line( corners[1], corners[5], color );
83        push_line( corners[2], corners[6], color );
84        push_line( corners[3], corners[7], color );
85        push_line( corners[4], corners[5], color );
86        push_line( corners[5], corners[6], color );
87        push_line( corners[6], corners[7], color );
88        push_line( corners[7], corners[4], color );
89}
90
91nv::debug_data::~debug_data()
92{
[313]93        m_context->release( m_va );
94        m_context->get_device()->release( m_program );
[237]95}
Note: See TracBrowser for help on using the repository browser.