Changeset 413
- Timestamp:
- 07/09/15 18:53:08 (10 years ago)
- Location:
- trunk
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/nv/gfx/animation.hh
r412 r413 89 89 if ( channel->element_count() == 0 ) return 0; 90 90 uint32 keyfsize = channel->element_size() / 4; 91 const float* fdata = reinterpret_cast<const float*>( channel-> data) + keyfsize * index;91 const float* fdata = reinterpret_cast<const float*>( channel->raw_data() ) + keyfsize * index; 92 92 uint32 mod = 0; 93 93 if ( channel->descriptor()[0].vslot == slot::TIME ) mod = 1; … … 102 102 uint32 keyfsize = channel->element_size() / 4; 103 103 uint32 keyfresult = keyfsize; 104 const float* fdata = reinterpret_cast<const float*>( channel-> data);104 const float* fdata = reinterpret_cast<const float*>( channel->raw_data() ); 105 105 106 106 uint32 slot = 0; … … 183 183 { 184 184 NV_ASSERT( m_data, "Data is null!" ); 185 const KEY* keys = m_data->data_cast<KEY>( ); 185 186 uint32 count = m_data->element_count(); 186 187 if ( count == 0 ) return; 187 188 if ( count == 1 ) 188 189 { 189 result = reinterpret_cast<KEY*>(m_data->data)[0];190 result = keys[0]; 190 191 return; 191 192 } 192 193 size_t index = glm::clamp<size_t>( size_t( frame ), 0, count - 2 ); 193 194 float factor = glm::clamp<float> ( frame - index, 0.0f, 1.0f ); 194 KEY* keys = reinterpret_cast<KEY*>( m_data->data );195 195 interpolate_key( result, keys[index], keys[index+1], factor ); 196 196 } … … 217 217 // TODO: this probably could be optimized 218 218 NV_ASSERT( m_data, "Data is null!" ); 219 const KEY* keys = reinterpret_cast<const KEY*>( m_data->data);219 const KEY* keys = m_data->data_cast<KEY>( ); 220 220 uint32 count = m_data->element_count(); 221 221 if ( count == 0 ) return; … … 341 341 bool empty() const { return m_channel->element_count() == 0; } 342 342 size_t size() const { return m_channel->element_count(); } 343 const transform& get( size_t index ) const { return reinterpret_cast<key*>(m_channel->data)[ index ].tform; }344 const transform* data() const { return reinterpret_cast<const transform*>( m_channel->data); }343 const transform& get( size_t index ) const { return m_channel->data_cast< key >()[ index ].tform; } 344 const transform* data() const { return &(m_channel->data_cast< key >()[0].tform); } 345 345 346 346 virtual uint32 raw_size() const -
trunk/nv/interface/data_descriptor.hh
r412 r413 284 284 } 285 285 286 template < typename Struct > 287 static data_descriptor create() 288 { 289 data_descriptor result; 290 result.initialize< Struct >(); 291 return result; 292 } 293 286 294 protected: 287 295 … … 306 314 struct raw_data_channel 307 315 { 308 raw_data_channel() : data( nullptr ), m_count( 0 ) {}316 raw_data_channel() : m_data( nullptr ), m_count( 0 ) {} 309 317 ~raw_data_channel() 310 318 { 311 if ( data != nullptr ) delete[]data;319 if ( m_data != nullptr ) delete[] m_data; 312 320 } 313 321 … … 316 324 uint32 element_count() const { return m_count; } 317 325 uint32 raw_size() const { return m_count * m_desc.element_size(); } 318 const uint8* raw_data() const { return data; } 326 const uint8* raw_data() const { return m_data; } 327 328 // TODO: constexpr compile-time cast check? 329 template < typename Struct > 330 const Struct* data_cast() const 331 { 332 return reinterpret_cast<const Struct*>( m_data ); 333 } 319 334 320 335 bool has_slot( slot vslot ) const { return m_desc.has_slot( vslot ); } 321 336 322 template < typename VTX>337 template < typename Struct > 323 338 static raw_data_channel* create( uint32 count = 0 ) 324 339 { 325 340 raw_data_channel* result = new raw_data_channel(); 326 result->m_desc.initialize< VTX>();341 result->m_desc.initialize<Struct>(); 327 342 result->m_count = count; 328 result-> data = ( count > 0 ? ( new uint8[result->raw_size()] ) : nullptr );343 result->m_data = ( count > 0 ? ( new uint8[result->raw_size()] ) : nullptr ); 329 344 return result; 330 345 } … … 334 349 result->m_desc = desc; 335 350 result->m_count = count; 336 result-> data = ( count > 0 ? ( new uint8[result->raw_size()] ) : nullptr );351 result->m_data = ( count > 0 ? ( new uint8[result->raw_size()] ) : nullptr ); 337 352 return result; 338 353 } 339 354 340 friend class mesh_creator;341 friend class mesh_data_creator;342 343 uint8* data; 355 template < typename Struct > 356 friend class data_channel_creator; 357 friend class raw_data_channel_creator; 358 344 359 protected: 360 uint8* m_data; 345 361 data_descriptor m_desc; 346 362 uint32 m_count; … … 348 364 }; 349 365 366 class raw_data_channel_creator 367 { 368 public: 369 raw_data_channel_creator( const data_descriptor& desc, uint32 size ) 370 { 371 m_channel = raw_data_channel::create( desc, size ); 372 m_owned = true; 373 } 374 explicit raw_data_channel_creator( raw_data_channel* channel ) 375 { 376 m_channel = channel; 377 m_owned = false; 378 } 379 380 uint32 element_size() const { return m_channel->element_size(); } 381 uint32 size() const { return m_channel->element_count(); } 382 uint32 raw_size() const { return m_channel->element_count() * m_channel->element_size(); } 383 uint8* raw_data() { return m_channel->m_data; } 384 const uint8* raw_data() const { return m_channel->m_data; } 385 raw_data_channel* channel() { return m_channel; } 386 387 data_descriptor& descriptor() { return m_channel->m_desc; } 388 const data_descriptor& descriptor() const { return m_channel->m_desc; } 389 390 raw_data_channel* release() 391 { 392 raw_data_channel* result = m_channel; 393 m_channel = nullptr; 394 return result; 395 } 396 397 ~raw_data_channel_creator() 398 { 399 if ( m_owned && m_channel ) delete m_channel; 400 } 401 protected: 402 raw_data_channel* m_channel; 403 bool m_owned; 404 }; 405 406 template < typename Struct > 407 class data_channel_creator : public raw_data_channel_creator 408 { 409 public: 410 explicit data_channel_creator( uint32 size ) 411 : raw_data_channel_creator( data_descriptor::create< Struct >(), size ) {} 412 // TODO - descriptor check 413 explicit data_channel_creator( raw_data_channel* channel ) 414 : raw_data_channel_creator( channel ) {} 415 416 Struct* data() { return reinterpret_cast< Struct* >( m_channel->m_data ); } 417 const Struct* data() const { return reinterpret_cast< const Struct* >( m_channel->m_data ); } 418 419 const Struct& operator []( uint32 i ) const 420 { 421 NV_ASSERT( i < m_channel->m_count, "data_channel_creator indexing failure!" ); 422 return reinterpret_cast< const Struct* >( m_channel->m_data )[i]; 423 } 424 425 Struct& operator []( uint32 i ) 426 { 427 NV_ASSERT( i < m_channel->m_count, "data_channel_creator indexing failure!" ); 428 return reinterpret_cast<Struct*>( m_channel->m_data )[i]; 429 } 430 }; 350 431 } 351 432 352 433 #endif // NV_INTERFACE_DATA_DESCRIPTOR_HH 353 -
trunk/nv/interface/mesh_data.hh
r412 r413 105 105 if ( ch->descriptor() == compare ) 106 106 { 107 return reinterpret_cast<VTX*>( ch->data);107 return ch->data_cast< VTX >(); 108 108 } 109 109 } -
trunk/src/formats/assimp_loader.cc
r412 r413 7 7 #include "nv/formats/assimp_loader.hh" 8 8 #include "nv/stl/unordered_map.hh" 9 #include "nv/gfx/mesh_creator.hh"10 9 #include "nv/lib/assimp.hh" 11 10 … … 123 122 else 124 123 channel = raw_data_channel::create< assimp_plain_vtx >( mesh->mNumVertices ); 124 uint8* cdata = const_cast< uint8*>( channel->raw_data() ); 125 125 126 126 data->add_channel( channel ); … … 139 139 nv::vec4 vt ( t_i[0], t_i[1], t_i[2], det ); 140 140 if ( skinned ) 141 reinterpret_cast< assimp_skinned_vtx* >( channel->data)[i] = assimp_skinned_vtx( v, s, n, vt );141 reinterpret_cast< assimp_skinned_vtx* >( cdata )[i] = assimp_skinned_vtx( v, s, n, vt ); 142 142 else 143 reinterpret_cast< assimp_plain_vtx* >( channel->data)[i] = assimp_plain_vtx( v, s, n, vt );143 reinterpret_cast< assimp_plain_vtx* >( cdata )[i] = assimp_plain_vtx( v, s, n, vt ); 144 144 } 145 145 146 146 if ( skinned ) 147 147 { 148 assimp_skinned_vtx* vtx = reinterpret_cast< assimp_skinned_vtx* >( c hannel->data );148 assimp_skinned_vtx* vtx = reinterpret_cast< assimp_skinned_vtx* >( cdata ); 149 149 for (unsigned int m=0; m<mesh->mNumBones; m++) 150 150 { … … 169 169 } 170 170 171 raw_data_channel* ichannel = raw_data_channel::create< index_u16 >( mesh->mNumFaces * 3 ); 172 data->add_channel( ichannel ); 173 uint16* indices = reinterpret_cast<uint16*>( ichannel->data ); 171 data_channel_creator< index_u16 > ichannel( mesh->mNumFaces * 3 ); 172 uint16* indices = reinterpret_cast<uint16*>( ichannel.raw_data() ); 174 173 for (unsigned int i=0; i<mesh->mNumFaces; i++) 175 174 { … … 180 179 } 181 180 } 181 data->add_channel( ichannel.release() ); 182 182 } 183 183 … … 315 315 if ( m > 0 && bones.size() > 0 ) 316 316 { 317 raw_data_channel* channel = meshes[m].get_raw_channels()[0]; 318 assimp_skinned_vtx* va = reinterpret_cast< assimp_skinned_vtx* >( channel->data ); 319 for ( unsigned v = 0; v < channel->element_count(); ++v ) 317 data_channel_creator< assimp_skinned_vtx > channel( meshes[m].get_raw_channels()[0] ); 318 for ( unsigned v = 0; v < channel.size(); ++v ) 320 319 { 321 assimp_skinned_vtx& vertex = va[v];320 assimp_skinned_vtx& vertex = channel.data()[v]; 322 321 323 322 for ( int i = 0 ; i < 4; ++i) … … 418 417 419 418 data->data = new key_data; 420 raw_data_channel* raw_pchannel = raw_data_channel::create<assimp_key_p>( node->mNumPositionKeys ); 421 raw_data_channel* raw_rchannel = raw_data_channel::create<assimp_key_r>( node->mNumRotationKeys ); 422 //raw_data_channel* raw_schannel = raw_data_channel::create<assimp_key_s>( node->mNumScalingKeys ); 423 data->data->add_channel( raw_pchannel ); 424 data->data->add_channel( raw_rchannel ); 425 //data->data->add_channel( raw_schannel ); 426 assimp_key_p* pchannel = reinterpret_cast< assimp_key_p* >( raw_pchannel->data ); 427 assimp_key_r* rchannel = reinterpret_cast< assimp_key_r* >( raw_rchannel->data ); 419 data_channel_creator< assimp_key_p > pchannel_creator( node->mNumPositionKeys ); 420 data_channel_creator< assimp_key_r > rchannel_creator( node->mNumRotationKeys ); 421 // data_channel_creator< assimp_key_s > schannel_creator( node->mNumScalingKeys ); 422 423 assimp_key_p* pchannel = pchannel_creator.data(); 424 assimp_key_r* rchannel = rchannel_creator.data(); 428 425 //assimp_key_s* schannel = ((assimp_key_s*)(raw_schannel->data)); 429 426 … … 457 454 // } 458 455 // } 459 456 data->data->add_channel( pchannel_creator.release() ); 457 data->data->add_channel( rchannel_creator.release() ); 458 // data->data->add_channel( schannel_creator.release() ); 460 459 } 461 460 -
trunk/src/formats/md2_loader.cc
r412 r413 324 324 size_t frame_count = ( frame == -1 ? num_frames : 1 ); 325 325 326 raw_data_channel* mc_pn = raw_data_channel::create< vtx_md2_pn >( num_verts * frame_count );327 vtx_md2_pn* vtx_pn = reinterpret_cast< vtx_md2_pn* >( mc_pn->data);326 data_channel_creator< vtx_md2_pn > mc_pn( num_verts * frame_count ); 327 vtx_md2_pn* vtx_pn = mc_pn.data(); 328 328 329 329 uint32 index = 0; … … 347 347 } 348 348 349 raw_data_channel* mc_t = raw_data_channel::create< vtx_md2_t >( num_verts );350 vtx_md2_t* vtx_t = reinterpret_cast< vtx_md2_t* >( mc_t->data);349 data_channel_creator< vtx_md2_t > mc_t( num_verts ); 350 vtx_md2_t* vtx_t = mc_t.data(); 351 351 352 352 vec2 scale( 1.0f / static_cast<float>( md2->header.skinwidth ), 1.0f / static_cast<float>( md2->header.skinheight ) ); … … 357 357 } 358 358 359 raw_data_channel* ic = raw_data_channel::create< index_u16 >( m_new_indexes.size() );359 data_channel_creator< index_u16 > ic( m_new_indexes.size() ); 360 360 if ( m_new_indexes.size() > 0 ) 361 361 { 362 uint16* icp = reinterpret_cast< uint16* >( ic ->data);362 uint16* icp = reinterpret_cast< uint16* >( ic.raw_data() ); 363 363 raw_copy_n( m_new_indexes.data(), m_new_indexes.size(), icp ); 364 364 } 365 365 366 data->add_channel( mc_pn );367 data->add_channel( mc_t );368 data->add_channel( ic );366 data->add_channel( mc_pn.release() ); 367 data->add_channel( mc_t.release() ); 368 data->add_channel( ic.release() ); 369 369 } 370 370 -
trunk/src/formats/md3_loader.cc
r412 r413 289 289 { 290 290 md3_t* md3 = reinterpret_cast< md3_t* >( m_md3 ); 291 raw_data_channel* result = raw_data_channel::create<md3_key>( uint32( md3->header.num_frames ) );291 data_channel_creator< md3_key > result( uint32( md3->header.num_frames ) ); 292 292 // TODO: is this brain damaged in efficiency (loop nest order) or what? 293 293 for ( sint32 f = 0; f < md3->header.num_frames; ++f ) … … 303 303 vec3 axisy ( md3_vec3( rtag.axis[2] ) ); 304 304 vec3 origin ( md3_vec3( rtag.origin ) ); 305 re interpret_cast< md3_key*>(result->data)[f].tform = transform( origin, quat( mat3( axisx, axisy, axisz ) ) );305 result.data()[f].tform = transform( origin, quat( mat3( axisx, axisy, axisz ) ) ); 306 306 } 307 307 } 308 308 309 309 } 310 return result ;310 return result.release(); 311 311 } 312 312 … … 352 352 } 353 353 354 raw_data_channel* mc_pn = raw_data_channel::create< vtx_md3_pn >( uint32( num_verts * frame_count ) );355 raw_data_channel* mc_t = raw_data_channel::create< vtx_md3_t >( uint32( num_verts ) );356 raw_data_channel* ic = raw_data_channel::create< index_u16 >( uint32( index_count ) );357 vtx_md3_pn* vtx_pn = reinterpret_cast< vtx_md3_pn* >( mc_pn->data);358 vtx_md3_t* vtx_t = reinterpret_cast< vtx_md3_t* >( mc_t->data);359 uint16* icp = reinterpret_cast< uint16* >( ic->data);354 data_channel_creator< vtx_md3_pn > mc_pn( static_cast< uint32 >( num_verts * frame_count ) ); 355 data_channel_creator< vtx_md3_t > mc_t( static_cast< uint32 >( num_verts ) ); 356 data_channel_creator< index_u16 > ic( static_cast< uint32 >( index_count ) ); 357 vtx_md3_pn* vtx_pn = mc_pn.data(); 358 vtx_md3_t* vtx_t = mc_t.data(); 359 uint16* icp = &(ic.data()[0].index); 360 360 361 361 uint32 index = 0; … … 413 413 414 414 data->set_name( reinterpret_cast< char* >( md3->header.name ) ); 415 data->add_channel( mc_pn );416 data->add_channel( mc_t );417 data->add_channel( ic );415 data->add_channel( mc_pn.release() ); 416 data->add_channel( mc_t.release() ); 417 data->add_channel( ic.release() ); 418 418 } 419 419 -
trunk/src/formats/md5_loader.cc
r412 r413 160 160 md5_vtx_t* tdata = nullptr; 161 161 { 162 raw_data_channel* ch_pnt = raw_data_channel::create<md5_vtx_pnt>( num_verts );163 raw_data_channel* ch_t = raw_data_channel::create<md5_vtx_t>( num_verts );162 data_channel_creator<md5_vtx_pnt> ch_pnt( num_verts ); 163 data_channel_creator<md5_vtx_t> ch_t( num_verts ); 164 164 ch_pntiw = raw_data_channel::create<md5_vtx_pntiw>( num_verts ); 165 tdata = reinterpret_cast< md5_vtx_t* >( ch_t->data);166 mesh->add_channel( ch_pnt );167 mesh->add_channel( ch_t );165 tdata = ch_t.data(); 166 mesh->add_channel( ch_pnt.release() ); 167 mesh->add_channel( ch_t.release() ); 168 168 // TODO: hack to prevent rendering 169 169 //ch_pntiw->m_count = 0; … … 191 191 sstream >> num_tris; 192 192 193 raw_data_channel* ch_i = raw_data_channel::create<index_u32>( num_tris * 3 );194 uint32* vtx_i = reinterpret_cast< uint32* >( ch_i ->data);193 data_channel_creator< index_u32 > ch_i( num_tris * 3 ); 194 uint32* vtx_i = reinterpret_cast< uint32* >( ch_i.raw_data() ); 195 195 uint32 idx = 0; 196 mesh->add_channel( ch_i );197 196 198 197 next_line( sstream ); … … 211 210 vtx_i[idx++] = ti2; 212 211 } 212 213 mesh->add_channel( ch_i.release() ); 213 214 } 214 215 else if ( command == "numweights" ) … … 235 236 } 236 237 237 prepare_mesh( reinterpret_cast< md5_vtx_pntiw* >( c h_pntiw->data), nodes, weight_info.size(), mesh, weights.data(), weight_info.data() );238 prepare_mesh( reinterpret_cast< md5_vtx_pntiw* >( const_cast< uint8* >( ch_pntiw->raw_data() ) ), nodes, weight_info.size(), mesh, weights.data(), weight_info.data() ); 238 239 239 240 m_meshes[ num_meshes ] = mesh; … … 337 338 { 338 339 assert( m_type == MESH ); 339 md5_vtx_pnt* vtcs = reinterpret_cast< md5_vtx_pnt* >( mdata->get_channel< md5_vtx_pnt >()->data ); 340 data_channel_creator< md5_vtx_pnt > pnt( const_cast< raw_data_channel* >( mdata->get_channel< md5_vtx_pnt >() ) ); 341 md5_vtx_pnt* vtcs = pnt.data(); 340 342 341 343 for ( uint32 i = 0; i < vtx_count; ++i ) … … 396 398 } 397 399 398 const uint32* idata = reinterpret_cast< uint32* >( mdata->get_index_channel()->data);400 const uint32* idata = reinterpret_cast< uint32* >( const_cast< uint8* >( mdata->get_index_channel()->raw_data() ) ); 399 401 const md5_vtx_t* tdata = mdata->get_channel_data<md5_vtx_t>(); 400 402 … … 484 486 { 485 487 const mesh_node_data& pjoint = nodes[parent_id]; 486 const transform* ptv = reinterpret_cast< const transform* >( pjoint.data->get_channel(0)-> data);488 const transform* ptv = reinterpret_cast< const transform* >( pjoint.data->get_channel(0)->raw_data() ); 487 489 transform ptr; 488 490 if ( pjoint.data->get_channel(0)->element_count() > index ) ptr = ptv[ index ]; … … 495 497 } 496 498 497 reinterpret_cast< transform* >( joint.data->get_channel(0)->data)[index] = transform( pos, orient );499 reinterpret_cast< transform* >( const_cast< uint8* >( joint.data->get_channel(0)->raw_data() ) )[index] = transform( pos, orient ); 498 500 } 499 501 } -
trunk/src/formats/nmd_loader.cc
r412 r413 43 43 nmd_stream_header stream_header; 44 44 source.read( &stream_header, sizeof( stream_header ), 1 ); 45 raw_data_channel * channel = raw_data_channel::create( stream_header.format, stream_header.count );46 source.read( channel ->data, stream_header.format.element_size(), stream_header.count);47 mesh->add_channel( channel );45 raw_data_channel_creator channel_creator( stream_header.format, stream_header.count ); 46 source.read( channel_creator.raw_data(), channel_creator.element_size(), channel_creator.size() ); 47 mesh->add_channel( channel_creator.release() ); 48 48 } 49 49 m_mesh_names.push_back( e.name ); … … 128 128 nv::nmd_stream_header cheader; 129 129 source.read( &cheader, sizeof( cheader ), 1 ); 130 raw_data_channel * channel = raw_data_channel::create( cheader.format, cheader.count );131 source.read( channel ->data, channel->element_size(), channel->element_count() );132 kdata->add_channel( channel );130 raw_data_channel_creator channel_creator( cheader.format, cheader.count ); 131 source.read( channel_creator.raw_data(), channel_creator.element_size(), channel_creator.size() ); 132 kdata->add_channel( channel_creator.release() ); 133 133 } 134 134 } -
trunk/src/formats/obj_loader.cc
r412 r413 324 324 } 325 325 326 raw_data_channel * channel = raw_data_channel::create( m_descriptor, reader->size * 3 );326 raw_data_channel_creator channel( m_descriptor, reader->size * 3 ); 327 327 if ( reader->raw_size() > 0 ) 328 328 { 329 raw_copy_n( reader->raw_pointer(), reader->raw_size(), channel ->data);329 raw_copy_n( reader->raw_pointer(), reader->raw_size(), channel.raw_data() ); 330 330 } 331 331 332 332 mesh_data* mesh = new mesh_data(reader->name); 333 mesh->add_channel( channel );333 mesh->add_channel( channel.release() ); 334 334 m_meshes.push_back( mesh ); 335 335 -
trunk/src/gfx/keyframed_mesh.cc
r412 r413 184 184 { 185 185 m_va = m_context->create_vertex_array(); 186 m_pbuffer = m_context->get_device()->create_buffer( VERTEX_BUFFER, STATIC_DRAW, m_vertex_count * m_vsize, m_vchannel-> data);186 m_pbuffer = m_context->get_device()->create_buffer( VERTEX_BUFFER, STATIC_DRAW, m_vertex_count * m_vsize, m_vchannel->raw_data() ); 187 187 m_context->add_vertex_buffers( m_va, m_pbuffer, m_vchannel ); 188 188 189 buffer vb = m_context->get_device()->create_buffer( VERTEX_BUFFER, STATIC_DRAW, m_vertex_count * sizeof( vec2 ), m_mesh_data->get_channel <vertex_t>()->data);189 buffer vb = m_context->get_device()->create_buffer( VERTEX_BUFFER, STATIC_DRAW, m_vertex_count * sizeof( vec2 ), m_mesh_data->get_channel_data<vertex_t>() ); 190 190 m_context->add_vertex_buffers( m_va, vb, m_mesh_data->get_channel<vertex_t>() ); 191 191 -
trunk/src/gfx/mesh_creator.cc
r412 r413 24 24 if ( pkeys && pkeys->get_channel_count() > 0 && keys && keys->get_channel_count() > 0 ) 25 25 { 26 nv_key_transform* channel = reinterpret_cast<nv_key_transform*>(keys->get_channel(0)->data); 27 nv_key_transform* pchannel = reinterpret_cast<nv_key_transform*>(pkeys->get_channel(0)->data); 26 data_channel_creator< nv_key_transform > channel_creator( const_cast< raw_data_channel* >( keys->get_channel( 0 ) ) ); 27 nv_key_transform* channel = channel_creator.data(); 28 const nv_key_transform* pchannel = pkeys->get_channel(0)->data_cast< nv_key_transform >(); 28 29 for ( unsigned n = 0; n < count; ++n ) 29 30 { … … 66 67 } 67 68 68 raw_data_channel* raw_channel = raw_data_channel::create<nv_key_transform>( max_keys );69 data_channel_creator< nv_key_transform > kt_channel( max_keys ); 69 70 key_data* new_keys = new key_data; 70 new_keys->add_channel( raw_channel );71 nv_key_transform* channel = reinterpret_cast<nv_key_transform*>(raw_channel->data);72 71 data_descriptor final_key = old_keys->get_final_key(); 73 72 … … 82 81 pkey += old_keys->get_raw( old_keys->get_channel(c), idx, pkey ); 83 82 } 84 channel[n].tform = extract_transform_raw( final_key, key );83 kt_channel.data()[n].tform = extract_transform_raw( final_key, key ); 85 84 } 86 85 87 86 delete old_keys; 87 new_keys->add_channel( kt_channel.release() ); 88 88 m_data->m_nodes[i].data = new_keys; 89 89 } … … 106 106 for ( size_t c = 0; c < kdata->get_channel_count(); ++c ) 107 107 { 108 const raw_data_channel* channel = kdata->get_channel(c);109 size_t key_size = channel ->element_size();110 for ( size_t n = 0; n < channel ->element_count(); ++n )111 { 112 transform_key_raw( channel->descriptor(), channel->data+ n * key_size, scale, r33, ri33 );108 raw_data_channel_creator channel( const_cast< raw_data_channel* >( kdata->get_channel( c ) ) ); 109 size_t key_size = channel.element_size(); 110 for ( size_t n = 0; n < channel.size(); ++n ) 111 { 112 transform_key_raw( kdata->get_channel( c )->descriptor(), channel.raw_data() + n * key_size, scale, r33, ri33 ); 113 113 } 114 114 } … … 125 125 for ( uint32 c = 0; c < m_data->get_channel_count(); ++c ) 126 126 { 127 const raw_data_channel* channel = m_data->get_channel(c);128 const data_descriptor& desc = channel ->descriptor();129 uint8* raw_data = channel ->data;127 raw_data_channel_creator channel( m_data->m_channels[ c ] ); 128 const data_descriptor& desc = channel.descriptor(); 129 uint8* raw_data = channel.raw_data(); 130 130 uint32 vtx_size = desc.element_size(); 131 131 int p_offset = -1; … … 142 142 143 143 if ( p_offset != -1 ) 144 for ( uint32 i = 0; i < channel ->element_count(); i++)144 for ( uint32 i = 0; i < channel.size(); i++) 145 145 { 146 146 vec3& p = *reinterpret_cast<vec3*>( raw_data + vtx_size*i + p_offset ); … … 149 149 150 150 if ( n_offset != -1 ) 151 for ( uint32 i = 0; i < channel ->element_count(); i++)151 for ( uint32 i = 0; i < channel.size(); i++) 152 152 { 153 153 vec3& n = *reinterpret_cast<vec3*>( raw_data + vtx_size*i + n_offset ); … … 155 155 } 156 156 if ( t_offset != -1 ) 157 for ( uint32 i = 0; i < channel ->element_count(); i++)157 for ( uint32 i = 0; i < channel.size(); i++) 158 158 { 159 159 vec4& t = *reinterpret_cast<vec4*>(raw_data + vtx_size*i + t_offset ); … … 173 173 size_t n_offset = 0; 174 174 if ( ch_n == -1 ) return; 175 raw_data_channel * channel = m_data->m_channels[ unsigned( ch_n ) ];176 for ( const auto& cslot : channel ->descriptor() )175 raw_data_channel_creator channel( m_data->m_channels[ unsigned( ch_n ) ] ); 176 for ( const auto& cslot : channel.descriptor() ) 177 177 if ( cslot.vslot == slot::NORMAL ) 178 178 { … … 180 180 } 181 181 182 for ( uint32 i = 0; i < channel ->element_count(); ++i )183 { 184 vec3& normal = *reinterpret_cast<vec3*>( channel ->data + channel->element_size() * i + n_offset );182 for ( uint32 i = 0; i < channel.size(); ++i ) 183 { 184 vec3& normal = *reinterpret_cast<vec3*>( channel.raw_data() + channel.element_size() * i + n_offset ); 185 185 normal = -normal; 186 186 } … … 249 249 } 250 250 251 raw_data_channel* g_channel = raw_data_channel::create<vertex_g>( p_channel->element_count() );252 vec4* tangents = reinterpret_cast<vec4*>( g_channel->data);251 data_channel_creator< vertex_g > g_channel( p_channel->element_count() ); 252 vec4* tangents = &( g_channel.data()[0].tangent ); 253 253 vec3* tangents2 = new vec3[ p_channel->element_count() ]; 254 254 uint32 tri_count = i_channel ? i_channel->element_count() / 3 : t_channel->element_count() / 3; … … 263 263 if ( i_type == UINT ) 264 264 { 265 const uint32* idata = reinterpret_cast<const uint32*>( i_channel-> data);265 const uint32* idata = reinterpret_cast<const uint32*>( i_channel->raw_data() ); 266 266 ti0 = idata[ i * 3 ]; 267 267 ti1 = idata[ i * 3 + 1 ]; … … 270 270 else if ( i_type == USHORT ) 271 271 { 272 const uint16* idata = reinterpret_cast<const uint16*>( i_channel-> data);272 const uint16* idata = reinterpret_cast<const uint16*>( i_channel->raw_data() ); 273 273 ti0 = idata[ i * 3 ]; 274 274 ti1 = idata[ i * 3 + 1 ]; … … 282 282 } 283 283 284 const vec2& w1 = *reinterpret_cast< vec2*>(t_channel->data+ t_channel->element_size()*ti0 + t_offset );285 const vec2& w2 = *reinterpret_cast< vec2*>(t_channel->data+ t_channel->element_size()*ti1 + t_offset );286 const vec2& w3 = *reinterpret_cast< vec2*>(t_channel->data+ t_channel->element_size()*ti2 + t_offset );284 const vec2& w1 = *reinterpret_cast<const vec2*>(t_channel->raw_data() + t_channel->element_size()*ti0 + t_offset ); 285 const vec2& w2 = *reinterpret_cast<const vec2*>(t_channel->raw_data() + t_channel->element_size()*ti1 + t_offset ); 286 const vec2& w3 = *reinterpret_cast<const vec2*>(t_channel->raw_data() + t_channel->element_size()*ti2 + t_offset ); 287 287 vec2 st1 = w3 - w1; 288 288 vec2 st2 = w2 - w1; … … 295 295 uint32 nti1 = t_channel->element_count() * set + ti1; 296 296 uint32 nti2 = t_channel->element_count() * set + ti2; 297 vec3 v1 = *reinterpret_cast<vec3*>(p_channel->data+ p_channel->element_size()*nti0 + p_offset );298 vec3 v2 = *reinterpret_cast<vec3*>(p_channel->data+ p_channel->element_size()*nti1 + p_offset );299 vec3 v3 = *reinterpret_cast<vec3*>(p_channel->data+ p_channel->element_size()*nti2 + p_offset );297 const vec3& v1 = *reinterpret_cast<const vec3*>(p_channel->raw_data() + p_channel->element_size()*nti0 + p_offset ); 298 const vec3& v2 = *reinterpret_cast<const vec3*>(p_channel->raw_data() + p_channel->element_size()*nti1 + p_offset ); 299 const vec3& v3 = *reinterpret_cast<const vec3*>(p_channel->raw_data() + p_channel->element_size()*nti2 + p_offset ); 300 300 vec3 xyz1 = v3 - v1; 301 301 vec3 xyz2 = v2 - v1; … … 321 321 for ( unsigned int i = 0; i < vtx_count; ++i ) 322 322 { 323 const vec3 n = *reinterpret_cast< vec3*>( n_channel->data+ n_channel->element_size()*i + n_offset );323 const vec3 n = *reinterpret_cast<const vec3*>( n_channel->raw_data() + n_channel->element_size()*i + n_offset ); 324 324 const vec3 t = vec3(tangents[i]); 325 325 if ( ! ( t.x == 0.0f && t.y == 0.0f && t.z == 0.0f ) ) … … 331 331 delete tangents2; 332 332 333 m_data->m_channels[ n_channel_index ] = merge_channels( n_channel, g_channel );333 m_data->m_channels[ n_channel_index ] = merge_channels( n_channel, g_channel.channel() ); 334 334 delete n_channel; 335 delete g_channel;336 335 } 337 336 … … 342 341 desc.append( b->descriptor() ); 343 342 344 uint8* data = new uint8[a->element_count() * desc.element_size() ];343 raw_data_channel_creator result( desc, a->element_count() ); 345 344 for ( uint32 i = 0; i < a->element_count(); ++i ) 346 345 { 347 raw_copy_n( a->data + i * a->element_size(), a->element_size(), data + i*desc.element_size() ); 348 raw_copy_n( b->data + i * b->element_size(), b->element_size(), data + i*desc.element_size() + a->element_size() ); 349 } 350 351 raw_data_channel* result = new raw_data_channel; 352 result->m_count = a->element_count(); 353 result->m_desc = desc; 354 result->data = data; 355 return result; 346 raw_copy_n( a->raw_data() + i * a->element_size(), a->element_size(), result.raw_data() + i*desc.element_size() ); 347 raw_copy_n( b->raw_data() + i * b->element_size(), b->element_size(), result.raw_data() + i*desc.element_size() + a->element_size() ); 348 } 349 350 return result.release(); 356 351 } 357 352 … … 363 358 size_t vtx_size = a->element_size(); 364 359 365 uint8* data = new uint8[ ( a->element_count() + b->element_count() ) * vtx_size ]; 366 360 raw_data_channel_creator result( a->descriptor(), a->element_count() + b->element_count() ); 367 361 368 362 if ( frame_count == 1 ) 369 363 { 370 364 size_t a_size = vtx_size * a->element_count(); 371 raw_copy_n( a-> data, a_size, data);372 raw_copy_n( b-> data, vtx_size * b->element_count(), data+ a_size );365 raw_copy_n( a->raw_data(), a_size, result.raw_data() ); 366 raw_copy_n( b->raw_data(), vtx_size * b->element_count(), result.raw_data() + a_size ); 373 367 } 374 368 else … … 381 375 for ( size_t i = 0; i < frame_count; ++i ) 382 376 { 383 raw_copy_n( a-> data + pos_a, frame_size_a, data+ pos );384 raw_copy_n( b-> data + pos_b, frame_size_b, data+ pos + frame_size_a ); pos_a += frame_size_a;377 raw_copy_n( a->raw_data() + pos_a, frame_size_a, result.raw_data() + pos ); 378 raw_copy_n( b->raw_data() + pos_b, frame_size_b, result.raw_data() + pos + frame_size_a ); pos_a += frame_size_a; 385 379 pos_b += frame_size_b; 386 380 pos += frame_size_a + frame_size_b; … … 388 382 } 389 383 390 raw_data_channel* result = new raw_data_channel; 391 result->m_count = a->element_count() + b->element_count(); 392 result->m_desc = a->descriptor(); 393 result->data = data; 394 return result; 384 return result.release(); 395 385 } 396 386 … … 437 427 { 438 428 NV_ASSERT( size + osize < uint16(-1), "Index out of range!" ); 439 uint16* indexes = reinterpret_cast<uint16*>( m_data->m_channels[c]->data ); 440 for ( uint16 i = uint16( old->element_count() ); i < m_data->m_channels[c]->element_count(); ++i ) 429 raw_data_channel_creator ic( m_data->m_channels[c] ); 430 uint16* indexes = reinterpret_cast<uint16*>( ic.raw_data() ); 431 for ( uint16 i = uint16( old->element_count() ); i < ic.size(); ++i ) 441 432 indexes[i] += uint16( size ); 442 433 … … 445 436 case UINT : 446 437 { 447 uint32* indexes = reinterpret_cast<uint32*>( m_data->m_channels[c]->data ); 448 for ( uint32 i = old->element_count(); i < m_data->m_channels[c]->element_count(); ++i ) 438 raw_data_channel_creator ic( m_data->m_channels[c] ); 439 uint32* indexes = reinterpret_cast<uint32*>( ic.raw_data() ); 440 for ( uint32 i = old->element_count(); i < ic.size(); ++i ) 449 441 indexes[i] += size; 450 442 } -
trunk/src/gfx/skeletal_mesh.cc
r412 r413 17 17 const raw_data_channel* pntiw_chan = a_mesh_data->get_channel<md5_vtx_pntiw>(); 18 18 19 m_pntdata.assign( reinterpret_cast<const md5_vtx_pnt*>( pnt_chan->data), pnt_chan->element_count() );19 m_pntdata.assign( pnt_chan->data_cast< md5_vtx_pnt >(), pnt_chan->element_count() ); 20 20 m_bone_offset.resize( bones->get_count() ); 21 21 m_transform.resize( bones->get_count() );
Note: See TracChangeset
for help on using the changeset viewer.