- Timestamp:
- 05/16/14 05:48:01 (11 years ago)
- Location:
- trunk
- Files:
-
- 1 added
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/formats/obj_loader.hh
r236 r238 16 16 #include <nv/common.hh> 17 17 #include <nv/interface/mesh_loader.hh> 18 #include <nv/interface/mesh_data.hh> 18 19 19 20 namespace nv … … 34 35 }; 35 36 37 class wavefront_loader 38 { 39 public: 40 wavefront_loader( bool normals = true, bool tangents = false ); 41 virtual bool load( stream& source ); 42 mesh_data* release_mesh_data(); 43 ~wavefront_loader(); 44 private: 45 vertex_descriptor m_descriptor; 46 bool m_normals; 47 bool m_tangents; 48 mesh_data* m_mesh; 49 }; 50 51 36 52 } 37 53 -
trunk/nv/gfx/mesh_data.hh
r236 r238 5 5 // For conditions of distribution and use, see copyright notice in nv.hh 6 6 7 #ifndef NV_MESH_DATA_ HH8 #define NV_MESH_DATA_ HH7 #ifndef NV_MESH_DATA_OLD_HH 8 #define NV_MESH_DATA_OLD_HH 9 9 10 10 #include <nv/common.hh> … … 95 95 } 96 96 97 #endif // NV_MESH_DATA_ HH97 #endif // NV_MESH_DATA_OLD_HH -
trunk/nv/interface/device.hh
r237 r238 16 16 #include <nv/string.hh> 17 17 #include <nv/interface/mesh.hh> 18 #include <nv/interface/mesh_data.hh> 18 19 #include <nv/interface/vertex_buffer.hh> 19 20 #include <nv/interface/texture2d.hh> … … 112 113 } 113 114 115 // TODO: HINTS ARE DIFFERENT! 116 vertex_array* create_vertex_array( const mesh_data* data, buffer_hint hint ) 117 { 118 vertex_array* va = create_vertex_array(); 119 for ( uint32 ch = 0; ch < data->get_channel_data().size(); ++ch ) 120 { 121 const mesh_raw_channel* channel = data->get_channel_data()[ch]; 122 vertex_buffer* vb = create_vertex_buffer( hint, channel->size, channel->data ); 123 for ( uint32 s = 0; s < channel->desc.count; ++s ) 124 { 125 const vertex_descriptor_slot& slot = channel->desc.slots[s]; 126 const datatype_info& info = get_datatype_info(slot.etype); 127 va->add_vertex_buffer( slot.vslot, vb, info.base , info.elements, slot.offset, channel->desc.size, false ); 128 } 129 } 130 if ( data->get_index_channel() != nullptr ) 131 { 132 const mesh_raw_index_channel* index = data->get_index_channel(); 133 index_buffer* ib = create_index_buffer( hint, index->size, index->data ); 134 va->set_index_buffer( ib, index->etype, true ); 135 } 136 return va; 137 } 138 139 114 140 virtual ~device() {} 115 141 }; -
trunk/nv/interface/vertex.hh
r237 r238 273 273 slots[ count ].vslot = SLOT; 274 274 slots[ count ].offset = slot_info::offset; 275 count++ 275 count++; 276 276 } 277 277 } -
trunk/nv/math.hh
r237 r238 104 104 BYTE_VECTOR_3, 105 105 BYTE_VECTOR_4, 106 }; 106 DATATYPE_COUNT, 107 }; 108 109 struct datatype_info 110 { 111 size_t size; 112 datatype base; 113 size_t elements; 114 }; 115 116 inline const datatype_info& get_datatype_info( datatype dt ) 117 { 118 static datatype_info info[ DATATYPE_COUNT ] = { 119 { 0, NONE, 0 }, // NONE 120 { 4, INT, 1 }, // INT, 121 { 1, BYTE, 1 }, // BYTE, 122 { 2, SHORT, 1 }, // SHORT, 123 { 4, UINT, 1 }, // UINT, 124 { 1, UBYTE, 1 }, // UBYTE, 125 { 2, USHORT, 1 }, // USHORT, 126 { 4, FLOAT, 1 }, // FLOAT 127 { 4 * 2, FLOAT, 2 }, // FLOAT_VECTOR_2, 128 { 4 * 3, FLOAT, 3 }, // FLOAT_VECTOR_3, 129 { 4 * 4, FLOAT, 4 }, // FLOAT_VECTOR_4, 130 { 4 * 4, FLOAT, 4 }, // FLOAT_MATRIX_2, 131 { 4 * 9, FLOAT, 9 }, // FLOAT_MATRIX_3, 132 { 4 * 16, FLOAT, 16 }, // FLOAT_MATRIX_4, 133 { 4 * 2, INT, 2 }, // INT_VECTOR_2, 134 { 4 * 3, INT, 3 }, // INT_VECTOR_3, 135 { 4 * 4, INT, 4 }, // INT_VECTOR_4, 136 // unsupported gl conversion, remove? 137 { 1 * 2, BYTE, 2 }, // BYTE_VECTOR_2, 138 { 1 * 3, BYTE, 3 }, // BYTE_VECTOR_3, 139 { 1 * 4, BYTE, 4 }, // BYTE_VECTOR_4, 140 }; 141 return info[dt]; 142 } 107 143 108 144 template < datatype EnumType > struct enum_to_type {}; … … 181 217 182 218 219 183 220 } // namespace nv 184 221 -
trunk/src/formats/obj_loader.cc
r225 r238 11 11 using namespace nv; 12 12 13 struct obj_vertex_vt 14 { 15 vec3 position; 16 vec2 texcoord; 17 18 obj_vertex_vt( vec3 a_position, vec2 a_texcoord ) 19 : position( a_position ), texcoord( a_texcoord ) {} 20 }; 21 22 struct obj_vertex_vtn 23 { 24 vec3 position; 25 vec2 texcoord; 26 vec3 normal; 27 28 obj_vertex_vtn( vec3 a_position, vec2 a_texcoord, vec3 a_normal ) 29 : position( a_position ), texcoord( a_texcoord ), normal( a_normal ) {} 30 }; 31 32 33 struct obj_vertex_vtnt 34 { 35 vec3 position; 36 vec2 texcoord; 37 vec3 normal; 38 vec4 tangent; 39 40 obj_vertex_vtnt( vec3 a_position, vec2 a_texcoord, vec3 a_normal ) 41 : position( a_position ), texcoord( a_texcoord ), normal( a_normal ) {} 42 }; 43 13 44 struct obj_reader 14 45 { … … 24 55 obj_reader(); 25 56 bool read_stream( std::istream& stream ); 26 27 virtual std::size_t add_face( uint32* vi, uint32* ti, uint32* ni, size_t count ) = 0; 57 virtual size_t add_face( uint32* vi, uint32* ti, uint32* ni, size_t count ) = 0; 58 virtual size_t raw_size() { return 0; } 59 virtual const uint8* raw_pointer() { return nullptr; } 60 virtual void calculate_tangents() {} 61 28 62 virtual ~obj_reader(){} 29 63 }; … … 120 154 { 121 155 mesh_obj_reader( mesh_data_creator* m ) : m_mesh( m ) {} 122 virtual std::size_t add_face( uint32* v , uint32* t, uint32* n, size_t count );156 virtual std::size_t add_face( uint32* vi, uint32* ti, uint32* ni, size_t count ); 123 157 virtual void calculate_tangents(); 124 158 … … 238 272 bool nv::obj_loader::load( stream& source ) 239 273 { 240 if ( m_mesh != nullptr ) 241 { 242 delete m_mesh; 243 } 274 if ( m_mesh != nullptr ) delete m_mesh; 244 275 mesh_data_creator creator; 245 276 mesh_obj_reader reader( &creator ); … … 254 285 return true; 255 286 } 287 288 struct mesh_data_reader_vt : public obj_reader 289 { 290 mesh_data_reader_vt() {} 291 virtual std::size_t add_face( uint32* vi, uint32* ti, uint32*, size_t count ) 292 { 293 if ( count < 3 ) return 0; // TODO : report error? 294 // TODO : support if normals not present; 295 std::size_t result = 0; 296 // Simple triangulation - obj's shouldn't have more than quads anyway 297 for ( size_t i = 2; i < count; ++i ) 298 { 299 result++; 300 m_data.emplace_back( v[ vi[ 0 ] ], t[ ti[ 0 ] ] ); 301 m_data.emplace_back( v[ vi[ i-1 ] ], t[ ti[ i-1 ] ] ); 302 m_data.emplace_back( v[ vi[ i ] ], t[ ti[ i ] ] ); 303 } 304 return result; 305 } 306 std::vector< obj_vertex_vt > m_data; 307 virtual size_t raw_size() { return m_data.size() * sizeof( obj_vertex_vt ); } 308 virtual const uint8* raw_pointer() { return (const uint8*)m_data.data(); } 309 }; 310 311 struct mesh_data_reader_vtn : public obj_reader 312 { 313 mesh_data_reader_vtn() {} 314 virtual std::size_t add_face( uint32* vi, uint32* ti, uint32* ni, size_t count ) 315 { 316 if ( count < 3 ) return 0; // TODO : report error? 317 // TODO : support if normals not present; 318 std::size_t result = 0; 319 // Simple triangulation - obj's shouldn't have more than quads anyway 320 for ( size_t i = 2; i < count; ++i ) 321 { 322 result++; 323 m_data.emplace_back( v[ vi[ 0 ] ], t[ ti[ 0 ] ], n[ ni[ 0 ] ] ); 324 m_data.emplace_back( v[ vi[ i-1 ] ], t[ ti[ i-1 ] ], n[ ni[ i-1 ] ] ); 325 m_data.emplace_back( v[ vi[ i ] ], t[ ti[ i ] ], n[ ni[ i ] ] ); 326 } 327 return result; 328 } 329 std::vector< obj_vertex_vtn > m_data; 330 virtual size_t raw_size() { return m_data.size() * sizeof( obj_vertex_vtn ); } 331 virtual const uint8* raw_pointer() { return (const uint8*)m_data.data(); } 332 }; 333 334 struct mesh_data_reader_vtnt : public obj_reader 335 { 336 mesh_data_reader_vtnt() {} 337 virtual std::size_t add_face( uint32* vi, uint32* ti, uint32* ni, size_t count ) 338 { 339 if ( count < 3 ) return 0; // TODO : report error? 340 // TODO : support if normals not present; 341 std::size_t result = 0; 342 // Simple triangulation - obj's shouldn't have more than quads anyway 343 for ( size_t i = 2; i < count; ++i ) 344 { 345 result++; 346 m_data.emplace_back( v[ vi[ 0 ] ], t[ ti[ 0 ] ], n[ ni[ 0 ] ] ); 347 m_data.emplace_back( v[ vi[ i-1 ] ], t[ ti[ i-1 ] ], n[ ni[ i-1 ] ] ); 348 m_data.emplace_back( v[ vi[ i ] ], t[ ti[ i ] ], n[ ni[ i ] ] ); 349 } 350 return result; 351 } 352 std::vector< obj_vertex_vtnt > m_data; 353 virtual size_t raw_size() { return m_data.size() * sizeof( obj_vertex_vtnt ); } 354 virtual const uint8* raw_pointer() { return (const uint8*)m_data.data(); } 355 356 // based on http://www.terathon.com/code/tangent.html 357 void calculate_tangents() 358 { 359 // const std::vector< vec3 >& vp = m_mesh->get_positions(); 360 // const std::vector< vec2 >& vt = m_mesh->get_texcoords(); 361 // const std::vector< vec3 >& vn = m_mesh->get_normals(); 362 // std::vector< vec3 >& tg = m_mesh->get_tangents(); 363 364 size_t count = m_data.size(); 365 size_t tcount = count / 3; 366 367 std::vector< vec3 > tan1( count ); 368 std::vector< vec3 > tan2( count ); 369 370 for (size_t a = 0; a < tcount; ++a ) 371 { 372 size_t i1 = a * 3; 373 size_t i2 = a * 3 + 1; 374 size_t i3 = a * 3 + 2; 375 obj_vertex_vtnt& vtx1 = m_data[ i1 ]; 376 obj_vertex_vtnt& vtx2 = m_data[ i2 ]; 377 obj_vertex_vtnt& vtx3 = m_data[ i3 ]; 378 379 // TODO: simplify 380 vec3 xyz1 = vtx2.position - vtx1.position; 381 vec3 xyz2 = vtx3.position - vtx1.position; 382 //vec2 st1 = w2 - w1; 383 //vec2 st2 = w3 - w1; 384 385 float s1 = vtx2.texcoord.x - vtx1.texcoord.x; 386 float t1 = vtx2.texcoord.y - vtx1.texcoord.y; 387 float s2 = vtx3.texcoord.x - vtx1.texcoord.x; 388 float t2 = vtx3.texcoord.y - vtx1.texcoord.y; 389 390 float stst = s1 * t2 - s2 * t1; 391 float r = 0.0f; 392 if (stst > 0.0f || stst < 0.0f) r = 1.0f / stst; 393 394 vec3 sdir = ( t2 * xyz1 - t1 * xyz2 ) * r; 395 vec3 tdir = ( s1 * xyz2 - s2 * xyz1 ) * r; 396 397 // the += below obviously doesn't make sense in this case, but I'll 398 // leave it here for when I move to indices 399 tan1[i1] += sdir; 400 tan1[i2] += sdir; 401 tan1[i3] += sdir; 402 403 // tan2 not needed anymore?? 404 tan2[i1] += tdir; 405 tan2[i2] += tdir; 406 tan2[i3] += tdir; 407 } 408 409 for (std::size_t a = 0; a < count; ++a ) 410 { 411 const vec3& n = m_data[a].normal; 412 const vec3& t = tan1[a]; 413 if ( ! (t.x == 0.0f && t.y == 0.0f && t.z == 0.0f) ) 414 { 415 m_data[a].tangent = vec4( glm::normalize(t - n * glm::dot( n, t )), 0.0f ); 416 m_data[a].tangent[3] = (glm::dot(glm::cross(n, t), tan2[a]) < 0.0f) ? -1.0f : 1.0f; 417 } 418 } 419 420 } 421 422 423 }; 424 425 nv::wavefront_loader::wavefront_loader( bool normals /*= true*/, bool tangents /*= false */ ) 426 : m_normals( normals ), m_tangents( tangents ), m_mesh( nullptr ) 427 { 428 if ( normals ) 429 { 430 if ( tangents ) 431 m_descriptor.initialize<obj_vertex_vtnt>(); 432 else 433 m_descriptor.initialize<obj_vertex_vtn>(); 434 } 435 else 436 m_descriptor.initialize<obj_vertex_vt>(); 437 } 438 439 bool nv::wavefront_loader::load( stream& source ) 440 { 441 if ( m_mesh ) delete m_mesh; 442 443 obj_reader* reader = nullptr; 444 if ( m_normals ) 445 { 446 if ( m_tangents ) 447 reader = new mesh_data_reader_vtnt(); 448 else 449 reader = new mesh_data_reader_vtn(); 450 } 451 else 452 reader = new mesh_data_reader_vt(); 453 std_stream sstream( &source ); 454 reader->read_stream( sstream ); 455 456 if ( m_tangents ) 457 { 458 reader->calculate_tangents(); 459 } 460 461 462 mesh_raw_channel* channel = new mesh_raw_channel(); 463 nv::uint8* data = nullptr; 464 if ( reader->raw_size() > 0 ) 465 { 466 data = new uint8[ reader->raw_size() ]; 467 std::copy_n( reader->raw_pointer(), reader->raw_size(), data ); 468 } 469 channel->data = data; 470 channel->desc = m_descriptor; 471 channel->count = reader->size * 3; 472 channel->size = reader->raw_size(); 473 delete reader; 474 475 m_mesh = new mesh_data(); 476 m_mesh->add_channel( channel ); 477 return true; 478 479 } 480 481 mesh_data* nv::wavefront_loader::release_mesh_data() 482 { 483 mesh_data* result = m_mesh; 484 m_mesh = nullptr; 485 return result; 486 } 487 488 nv::wavefront_loader::~wavefront_loader() 489 { 490 if ( m_mesh ) delete m_mesh; 491 } -
trunk/tests/objload_test/objload_test.cc
r237 r238 32 32 nv::vertex_array* m_va; 33 33 nv::program* m_program; 34 nv::mesh_data_old* m_mesh; 35 nv::uint32 m_count; 34 nv::mesh_data* m_mesh; 36 35 }; 37 36 … … 64 63 nv::c_file_system fs; 65 64 nv::stream* mesh_file = fs.open( "mesh.obj" ); 66 nv::mesh_loader* loader = new nv::obj_loader(); 65 66 // nv::mesh_loader* loader = new nv::obj_loader(); 67 // loader->load( *mesh_file ); 68 // nv::mesh_data_old* mesh = loader->release_mesh_data(); 69 // m_count = loader->get_size(); 70 // delete mesh_file; 71 // delete loader; 72 73 nv::wavefront_loader* loader = new nv::wavefront_loader(); 67 74 loader->load( *mesh_file ); 68 75 m_mesh = loader->release_mesh_data(); 69 m_count = loader->get_size();70 76 delete mesh_file; 71 77 delete loader; … … 73 79 m_program = m_device->create_program( nv::slurp( "obj.vert" ), nv::slurp( "obj.frag" ) ); 74 80 75 nv::vertex_buffer* vb = nullptr; 76 m_va = m_device->create_vertex_array(); 77 vb = m_device->create_vertex_buffer( nv::STATIC_DRAW, m_mesh->get_vertex_count() * sizeof( nv::vec3 ), m_mesh->get_positions().data() ); 78 m_va->add_vertex_buffer( nv::slot::POSITION, vb, nv::FLOAT, 3 ); 79 vb = m_device->create_vertex_buffer( nv::STATIC_DRAW, m_mesh->get_vertex_count() * sizeof( nv::vec3 ), m_mesh->get_normals().data() ); 80 m_va->add_vertex_buffer( nv::slot::NORMAL, vb, nv::FLOAT, 3 ); 81 vb = m_device->create_vertex_buffer( nv::STATIC_DRAW, m_mesh->get_vertex_count() * sizeof( nv::vec2 ), m_mesh->get_texcoords().data() ); 82 m_va->add_vertex_buffer( nv::slot::TEXCOORD, vb, nv::FLOAT, 2 ); 81 // nv::vertex_buffer* vb = nullptr; 82 m_va = m_device->create_vertex_array( m_mesh, nv::STATIC_DRAW ); 83 83 84 return true; 84 85 } … … 113 114 m_program->set_uniform( "diffuse", 0 ); 114 115 m_program->set_uniform( "specular", 1 ); 115 m_window->get_context()->draw( nv::TRIANGLES, m_render_state, m_program, m_va, m_ count * 3);116 m_window->get_context()->draw( nv::TRIANGLES, m_render_state, m_program, m_va, m_mesh->get_count() ); 116 117 m_window->swap_buffers(); 117 118 … … 147 148 application::~application() 148 149 { 150 delete m_mesh; 149 151 delete m_program; 150 delete m_mesh;151 152 delete m_diffuse; 152 153 delete m_specular; -
trunk/tests/render_test/box.frag
r46 r238 4 4 varying vec3 f_material; 5 5 varying float f_diffuse_value; 6 uniform sampler2D tex;6 uniform sampler2D nv_t_diffuse; 7 7 uniform vec3 light; 8 8 … … 16 16 17 17 if (secondary) 18 gl_FragColor = texture2D( tex, vec2((fract(f_coord.z - f_coord.x) + modulus ), ( fract(-f_coord.y) + remmod) ) / 16.0);18 gl_FragColor = texture2D(nv_t_diffuse, vec2((fract(f_coord.z - f_coord.x) + modulus ), ( fract(-f_coord.y) + remmod) ) / 16.0); 19 19 else 20 gl_FragColor = texture2D( tex, vec2((fract(f_coord.z) + modulus ), ( fract(f_coord.x) + remmod) ) / 16.0);20 gl_FragColor = texture2D(nv_t_diffuse, vec2((fract(f_coord.z) + modulus ), ( fract(f_coord.x) + remmod) ) / 16.0); 21 21 gl_FragColor = vec4( gl_FragColor.xyz * (f_diffuse_value + 0.4), 1.0 ); 22 22 } -
trunk/tests/render_test/box.vert
r46 r238 1 1 #version 120 2 attribute vec3 coords; 3 attribute vec3 material; 2 attribute vec3 nv_position; 3 attribute vec3 nv_color; 4 uniform mat4 nv_m_mvp; 5 4 6 varying vec3 f_coord; 5 7 varying vec3 f_normal; 6 8 varying vec3 f_material; 7 9 varying float f_diffuse_value; 8 uniform mat4 matrix_mvp;9 10 uniform vec3 light; 10 11 11 12 void main(void) { 12 13 f_normal = vec3(0,0,0); 13 f_normal[int(abs( material.y)-1)] = sign( material.y );14 f_normal[int(abs(nv_color.y)-1)] = sign( nv_color.y ); 14 15 vec3 vnormal = normalize(f_normal); 15 vec3 vlight = normalize(light - coords);16 vec3 vlight = normalize(light - nv_position); 16 17 float diffuse = max(dot(vlight, vnormal), 0.0); 17 18 f_diffuse_value = diffuse; 18 f_coord = coords;19 f_material = material;20 gl_Position = matrix_mvp * vec4(coords, 1.0);19 f_coord = nv_position; 20 f_material = nv_color; 21 gl_Position = nv_m_mvp * vec4(nv_position, 1.0); 21 22 } -
trunk/tests/render_test/char.frag
r46 r238 2 2 varying vec3 f_coord; 3 3 varying vec3 f_material; 4 uniform sampler2D tex;4 uniform sampler2D nv_t_diffuse; 5 5 6 6 void main(void) { … … 9 9 float modulus = w - remmod * 16; 10 10 11 gl_FragColor = texture2D( tex, vec2((fract(f_coord.x) + modulus ), ( fract(f_coord.z) + remmod) ) / 16.0);11 gl_FragColor = texture2D(nv_t_diffuse, vec2((fract(f_coord.x) + modulus ), ( fract(f_coord.z) + remmod) ) / 16.0); 12 12 13 // gl_FragColor = texture2D( tex, vec2((fract(f_coord.z - f_coord.x) + modulus ), ( fract(-f_coord.y) + remmod) ) / 16.0);13 // gl_FragColor = texture2D(nv_t_diffuse, vec2((fract(f_coord.z - f_coord.x) + modulus ), ( fract(-f_coord.y) + remmod) ) / 16.0); 14 14 } -
trunk/tests/render_test/char.vert
r46 r238 1 1 #version 120 2 attribute vec3 coords; 3 attribute vec3 material; 2 attribute vec3 nv_position; 3 attribute vec3 nv_color; 4 uniform mat4 nv_m_mvp; 5 4 6 varying vec3 f_coord; 5 7 varying vec3 f_material; 6 uniform mat4 matrix_mvp;7 8 uniform vec3 pos; 8 9 9 10 void main(void) { 10 f_coord = coords;11 f_material = material;12 gl_Position = matrix_mvp * vec4(coords+ pos, 1.0);11 f_coord = nv_position; 12 f_material = nv_color; 13 gl_Position = nv_m_mvp * vec4(nv_position + pos, 1.0); 13 14 } -
trunk/tests/render_test/rl.cc
r231 r238 67 67 nv::window* m_window; 68 68 nv::texture2d* m_texture; 69 nv::clear_state m_clear_state; 69 70 nv::clear_state m_clear_state; 70 71 nv::render_state m_render_state; 72 nv::scene_state m_scene_state; 71 73 72 74 nv::program* m_char_program; … … 75 77 nv::vertex_array* m_box_va; 76 78 unsigned int m_count; 79 }; 80 81 struct vtx 82 { 83 nv::i8vec3 position; 84 nv::i8vec3 color; 85 86 vtx( const nv::i8vec3& a_position, const nv::i8vec3& a_color ) 87 : position( a_position ), color( a_color ) {} 77 88 }; 78 89 … … 99 110 { 100 111 { // CHARACTER 101 nv::mesh cmesh; 102 nv::vertex_attribute<nv::i8vec3>::list& vtx = cmesh.add_attribute<nv::i8vec3>("coords")->get(); 103 nv::vertex_attribute<nv::i8vec3>::list& mat = cmesh.add_attribute<nv::i8vec3>("material")->get(); 112 std::vector< vtx > v; 104 113 int m = 16; int x = 0; int y = 0; int h = 0; 105 vtx.emplace_back( x, h, y );106 v tx.emplace_back( x, h, y+1 );107 v tx.emplace_back( x+1, h, y+1);108 v tx.emplace_back( x+1, h, y+1);109 v tx.emplace_back( x+1, h, y );110 v tx.emplace_back( x, h, y);111 mat.insert( mat.end(), 6, nv::i8vec3( m, 1, 0 ) );114 nv::i8vec3 mt( m, 1, 0 ); 115 v.emplace_back( nv::i8vec3( x, h, y ), mt ); 116 v.emplace_back( nv::i8vec3( x, h, y+1 ), mt ); 117 v.emplace_back( nv::i8vec3( x+1, h, y+1 ), mt ); 118 v.emplace_back( nv::i8vec3( x+1, h, y+1 ), mt ); 119 v.emplace_back( nv::i8vec3( x+1, h, y ), mt ); 120 v.emplace_back( nv::i8vec3( x, h, y ), mt ); 112 121 m_char_program = m_device->create_program( nv::slurp( "char.vert" ), nv::slurp( "char.frag" ) ); 113 m_char_va = m_device->create_vertex_array( &cmesh, &(m_char_program->get_attributes()), nv::STATIC_DRAW );122 m_char_va = m_device->create_vertex_array( v, nv::STATIC_DRAW ); 114 123 } 115 124 116 125 { // WORLD 117 nv::mesh wmesh; 118 nv::vertex_attribute<nv::i8vec3>::list& vtx = wmesh.add_attribute<nv::i8vec3>("coords")->get(); 119 nv::vertex_attribute<nv::i8vec3>::list& mat = wmesh.add_attribute<nv::i8vec3>("material")->get(); 120 126 std::vector< vtx > v; 127 nv::i8vec3 mt; 121 128 for (int i = 0; i < size_x * size_y; ++i ) 122 129 { … … 124 131 int y = i / size_x; 125 132 126 vtx.emplace_back( x, height[i], y );127 v tx.emplace_back( x, height[i], y+1 );128 v tx.emplace_back( x+1, height[i], y+1 );129 v tx.emplace_back( x+1, height[i], y+1 );130 v tx.emplace_back( x+1, height[i], y );131 v tx.emplace_back( x, height[i], y );132 mat.insert( mat.end(), 6, nv::i8vec3( map[i], 2, 0 ));133 mt = nv::i8vec3( map[i], 2, 0 ); 134 v.emplace_back( nv::i8vec3( x, height[i], y ), mt ); 135 v.emplace_back( nv::i8vec3( x, height[i], y+1 ), mt ); 136 v.emplace_back( nv::i8vec3( x+1, height[i], y+1 ), mt ); 137 v.emplace_back( nv::i8vec3( x+1, height[i], y+1 ), mt ); 138 v.emplace_back( nv::i8vec3( x+1, height[i], y ), mt ); 139 v.emplace_back( nv::i8vec3( x, height[i], y ), mt ); 133 140 134 141 if (i > 0 && height[i-1] != height[i]) … … 139 146 { 140 147 m_count += 6; 141 vtx.emplace_back( x, h, y );142 v tx.emplace_back( x, h, y+1 );143 v tx.emplace_back( x, h+dir, y+1 );144 v tx.emplace_back( x, h+dir, y+1 );145 v tx.emplace_back( x, h+dir, y );146 v tx.emplace_back( x, h, y );147 mat.insert( mat.end(), 6, nv::i8vec3( m, -dir, 0 ));148 mt = nv::i8vec3( m, -dir, 0 ); 149 v.emplace_back( nv::i8vec3( x, h, y ), mt ); 150 v.emplace_back( nv::i8vec3( x, h, y+1 ), mt ); 151 v.emplace_back( nv::i8vec3( x, h+dir, y+1 ), mt ); 152 v.emplace_back( nv::i8vec3( x, h+dir, y+1 ), mt ); 153 v.emplace_back( nv::i8vec3( x, h+dir, y ), mt ); 154 v.emplace_back( nv::i8vec3( x, h, y ), mt ); 148 155 } 149 156 } … … 155 162 for ( int h = height[i-size_x]; h != height[i]; h = h + dir ) 156 163 { 157 vtx.emplace_back( x, h, y );158 v tx.emplace_back( x, h+dir, y );159 v tx.emplace_back( x+1, h+dir, y );160 161 vtx.emplace_back( x+1, h+dir, y ); 162 v tx.emplace_back( x+1, h, y );163 v tx.emplace_back( x, h, y );164 mat.insert( mat.end(), 6, nv::i8vec3( m, -3*dir, 0 ));164 mt = nv::i8vec3( m, -3*dir, 0 ); 165 v.emplace_back( nv::i8vec3( x, h, y ), mt ); 166 v.emplace_back( nv::i8vec3( x, h+dir, y ), mt ); 167 v.emplace_back( nv::i8vec3( x+1, h+dir, y ), mt ); 168 169 v.emplace_back( nv::i8vec3( x+1, h+dir, y ), mt ); 170 v.emplace_back( nv::i8vec3( x+1, h, y ), mt ); 171 v.emplace_back( nv::i8vec3( x, h, y ), mt ); 165 172 } 166 173 } … … 168 175 } 169 176 170 m_count = v tx.size();177 m_count = v.size(); 171 178 m_box_program = m_device->create_program( nv::slurp( "box.vert" ), nv::slurp( "box.frag" ) ); 172 m_box_va = m_device->create_vertex_array( &wmesh, &(m_box_program->get_attributes()), nv::STATIC_DRAW );179 m_box_va = m_device->create_vertex_array( v, nv::STATIC_DRAW ); 173 180 } 174 181 … … 181 188 182 189 glm::vec3 move( 0, 0, 0 ); 190 m_scene_state.get_camera().set_perspective(25.0f, 1.0f*800.0f/600.0f, 0.1f, 100.0f); 183 191 184 192 while(!keypress) 185 193 { 194 m_scene_state.set_model( glm::translate(glm::mat4(1.0f), glm::vec3(-8.5, 0.0, -8.0)) ); 195 m_scene_state.get_camera().set_lookat(glm::vec3(0.0, 20.0, 5.0) + move, glm::vec3(0.0, 4.0, 0.0) + move, glm::vec3(0.0, 1.0, 0.0)); 196 186 197 m_window->get_context()->clear( m_clear_state ); 187 188 glm::mat4 model = glm::translate(glm::mat4(1.0f), glm::vec3(-8.5, 0.0, -8.0));189 glm::mat4 view = glm::lookAt(glm::vec3(0.0, 20.0, 5.0) + move, glm::vec3(0.0, 4.0, 0.0) + move, glm::vec3(0.0, 1.0, 0.0));190 glm::mat4 projection = glm::perspective(25.0f, 1.0f*800.0f/600.0f, 0.1f, 100.0f);191 glm::mat4 mv = view * model;192 193 198 m_texture->bind( 0 ); 194 m_box_program->set_uniform( "matrix_mvp", projection * mv );195 199 m_box_program->set_uniform( "light", glm::vec3(8.5, 4.5, 6.5) + move ); 196 m_box_program->set_uniform( "tex", 0 ); 197 m_window->get_context()->draw( nv::TRIANGLES, m_render_state, m_box_program, m_box_va, m_count ); 198 199 m_char_program->set_uniform( "matrix_mvp", projection * mv ); 200 m_window->get_context()->draw( nv::TRIANGLES, m_render_state, m_scene_state, m_box_program, m_box_va, m_count ); 201 200 202 m_char_program->set_uniform( "pos", move + glm::vec3( 8, 4.1, 6 ) ); 201 m_char_program->set_uniform( "tex", 0 ); 202 m_window->get_context()->draw( nv::TRIANGLES, m_render_state, m_char_program, m_char_va, 6 ); 203 m_window->get_context()->draw( nv::TRIANGLES, m_render_state, m_scene_state, m_char_program, m_char_va, 6 ); 203 204 m_window->swap_buffers(); 204 205
Note: See TracChangeset
for help on using the changeset viewer.