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

Last change on this file since 529 was 520, checked in by epyon, 9 years ago
  • ecs updates
  • animation updates
  • ragdoll manager
  • lua has own random engine
  • several minor fixes
  • particle engine/particle group
  • shitload of other stuff
  • bullet world
File size: 4.7 KB
Line 
1// Copyright (C) 2014-2015 ChaosForge Ltd
2// http://chaosforge.org/
3//
4// This file is part of Nova libraries.
5// For conditions of distribution and use, see copying.txt file in root folder.
6
7#include "nv/gfx/debug_draw.hh"
8
9#include "nv/interface/device.hh"
10#include "nv/core/logging.hh"
11
12static const char *nv_debug_draw_vertex_shader = R"(
13#version 330
14in vec3 nv_position;
15in vec3 nv_color;
16out 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 330
26in  vec3 v_color;
27out vec4 o_frag_color;
28void main(void)
29{
30        o_frag_color = vec4( v_color, 1.0 );
31}
32)";
33
34nv::debug_data::debug_data( context* a_context )
35        : m_context( a_context ), m_program(), m_va()
36{
37        m_program = m_context->create_program( nv_debug_draw_vertex_shader, nv_debug_draw_fragment_shader );
38        m_buffer_size = 0;
39}
40
41void nv::debug_data::update()
42{
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->create_buffer( VERTEX_BUFFER, nv::STREAM_DRAW, m_buffer_size * sizeof( debug_vtx ) );
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 );
51        }
52        m_context->update( m_vb, m_data.data(), 0, m_data.size()* sizeof( debug_vtx ) );
53}
54
55void nv::debug_data::reset()
56{
57        m_data.clear();
58}
59
60void nv::debug_data::push_line( const vec3& a, const vec3& b, const vec3& color )
61{
62        m_data.emplace_back( a, color );
63        m_data.emplace_back( b, color );
64}
65
66void nv::debug_data::push_aabox( const vec3& a, const vec3& b, const vec3& color )
67{
68        vec3 corners[8] =
69        {
70                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 ),
71                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 ),
72        };
73
74        push_line( corners[0], corners[1], color );
75        push_line( corners[1], corners[2], color );
76        push_line( corners[2], corners[3], color );
77        push_line( corners[3], corners[0], color );
78        push_line( corners[0], corners[4], color );
79        push_line( corners[1], corners[5], color );
80        push_line( corners[2], corners[6], color );
81        push_line( corners[3], corners[7], color );
82        push_line( corners[4], corners[5], color );
83        push_line( corners[5], corners[6], color );
84        push_line( corners[6], corners[7], color );
85        push_line( corners[7], corners[4], color );
86}
87
88void nv::debug_data::push_gizmo( const transform& tr, float length )
89{
90        vec3 s( 0.0f,   0.0f,   0.0f );
91        vec3 r( length, 0.0f,   0.0f );
92        vec3 g( 0.0f,   length, 0.0f );
93        vec3 b( 0.0f,   0.0f,   length );
94        s = s * tr;
95        r = r * tr;
96        g = g * tr;
97        b = b * tr;
98        push_line( s, r, vec3( 1.0f, 0.0f, 0.0f ) );
99        push_line( s, g, vec3( 0.0f, 1.0f, 0.0f ) );
100        push_line( s, b, vec3( 0.0f, 0.0f, 1.0f ) );
101}
102
103void nv::debug_data::push_wire_capsule( const transform& tr, float radius, float height )
104{
105        vec3 p = tr.get_position();
106        quat o = tr.get_orientation();
107        vec3 dir   = o * vec3( 0, 1, 0 );
108        vec3 ldir  = o * vec3( 1, 0, 0 );
109        vec3 h1dir = o * normalize( vec3( 1, -1, 0 ) );
110        vec3 h2dir = o * normalize( vec3( 1, 1, 0 ) );
111        vec3 sp1[12];
112        vec3 sp2[12];
113        vec3 hsp1[12];
114        vec3 hsp2[12];
115        for ( uint32 i = 0; i < 12; ++i )
116        {
117                sp1[i]  = nv::math::rotate( ldir * radius, ( float( i ) / 12.0f ) * math::two_pi<float>(), dir );
118                hsp1[i] = nv::math::rotate( h1dir * radius, ( float( i ) / 12.0f ) * math::two_pi<float>(), dir );
119        }
120        for ( uint32 i = 0; i < 12; ++i )
121        {
122                sp2[i]  = nv::math::rotate( ldir * radius + height * dir, ( float( i ) / 12.0f ) * math::two_pi<float>(), dir );
123                hsp2[i] = nv::math::rotate( h2dir * radius + height * dir, ( float( i ) / 12.0f ) * math::two_pi<float>(), dir );
124        }
125
126        for ( uint32 i = 0; i < 12; ++i )
127        {
128                push_line( p + sp1[i], p + sp1[( i + 1 ) % 12], vec3( 1.0f, 0.0f, 0.0f ) );
129                push_line( p + sp2[i], p + sp2[( i + 1 ) % 12], vec3( 0.0f, 1.0f, 0.0f ) );
130                push_line( p + sp1[i], p + sp2[i], vec3( 0.0f, 0.0f, 1.0f ) );
131
132                push_line( p + hsp1[i], p + sp1[i], vec3( 0.0f, 0.0f, 1.0f ) );
133                push_line( p + hsp1[i], p + hsp1[( i + 1 ) % 12], vec3( 1.0f, 0.0f, 0.0f ) );
134                push_line( p + hsp2[i], p + sp2[i], vec3( 0.0f, 0.0f, 1.0f ) );
135                push_line( p + hsp2[i], p + hsp2[( i + 1 ) % 12], vec3( 0.0f, 1.0f, 0.0f ) );
136
137                push_line( p + hsp1[i], p - radius * dir, vec3( 0.0f, 0.0f, 1.0f ) );
138                push_line( p + hsp2[i], p + ( height + radius ) * dir, vec3( 0.0f, 0.0f, 1.0f ) );
139
140        }
141
142               
143}
144
145
146nv::debug_data::~debug_data()
147{
148        m_context->release( m_va );
149        m_context->release( m_program );
150}
Note: See TracBrowser for help on using the repository browser.