Changeset 412 for trunk/src/gfx
- Timestamp:
- 07/09/15 14:40:36 (10 years ago)
- Location:
- trunk/src/gfx
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/gfx/keyframed_mesh.cc
r410 r412 23 23 , m_active( false ) 24 24 { 25 m_index_count = m_mesh_data->get_index_channel()-> count;26 m_vertex_count = m_mesh_data->get_channel<vertex_t>()-> count;25 m_index_count = m_mesh_data->get_index_channel()->element_count(); 26 m_vertex_count = m_mesh_data->get_channel<vertex_t>()->element_count(); 27 27 m_vchannel = m_mesh_data->get_channel<vertex_pnt>(); 28 28 m_vsize = sizeof( vertex_pnt ); … … 34 34 m_vsize = sizeof( vertex_pn ); 35 35 } 36 m_frame_count = m_vchannel-> count/ m_vertex_count;36 m_frame_count = m_vchannel->element_count() / m_vertex_count; 37 37 m_pbuffer = buffer(); 38 38 } … … 190 190 m_context->add_vertex_buffers( m_va, vb, m_mesh_data->get_channel<vertex_t>() ); 191 191 192 buffer ib = m_context->get_device()->create_buffer( INDEX_BUFFER, STATIC_DRAW, m_mesh_data->get_index_channel()->size(), m_mesh_data->get_index_channel()->data ); 193 194 m_context->set_index_buffer( m_va, ib, m_mesh_data->get_index_channel()->desc[0].etype, true ); 192 const raw_data_channel* index_channel = m_mesh_data->get_index_channel(); 193 buffer ib = m_context->get_device()->create_buffer( INDEX_BUFFER, STATIC_DRAW, index_channel->raw_size(), index_channel->raw_data() ); 194 195 m_context->set_index_buffer( m_va, ib, m_mesh_data->get_index_channel()->descriptor()[0].etype, true ); 195 196 196 197 m_data = new uint8[ m_vertex_count * m_vsize ]; -
trunk/src/gfx/mesh_creator.cc
r411 r412 57 57 size_t chan_count = old_keys->get_channel_count(); 58 58 if ( chan_count == 1 59 && old_keys->get_channel(0)->desc .slot_count() == 160 && old_keys->get_channel(0)->desc [0].etype == TRANSFORM ) continue;59 && old_keys->get_channel(0)->descriptor().slot_count() == 1 60 && old_keys->get_channel(0)->descriptor()[0].etype == TRANSFORM ) continue; 61 61 62 62 size_t max_keys = 0; 63 63 for ( size_t c = 0; c < chan_count; ++c ) 64 64 { 65 max_keys = nv::max( max_keys, old_keys->get_channel(c)-> count);65 max_keys = nv::max( max_keys, old_keys->get_channel(c)->element_count() ); 66 66 } 67 67 … … 79 79 for ( uint16 c = 0; c < chan_count; ++c ) 80 80 { 81 size_t idx = nv::min( old_keys->get_channel(c)-> count- 1, n );81 size_t idx = nv::min( old_keys->get_channel(c)->element_count() - 1, n ); 82 82 pkey += old_keys->get_raw( old_keys->get_channel(c), idx, pkey ); 83 83 } … … 107 107 { 108 108 const raw_data_channel* channel = kdata->get_channel(c); 109 size_t key_size = channel-> desc.element_size();110 for ( size_t n = 0; n < channel-> count; ++n )111 { 112 transform_key_raw( channel->desc , channel->data + n * key_size, scale, r33, ri33 );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 ); 113 113 } 114 114 } … … 126 126 { 127 127 const raw_data_channel* channel = m_data->get_channel(c); 128 const data_descriptor& desc = channel->desc ;128 const data_descriptor& desc = channel->descriptor(); 129 129 uint8* raw_data = channel->data; 130 130 uint32 vtx_size = desc.element_size(); … … 142 142 143 143 if ( p_offset != -1 ) 144 for ( uint32 i = 0; i < channel-> count; i++)144 for ( uint32 i = 0; i < channel->element_count(); 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-> count; i++)151 for ( uint32 i = 0; i < channel->element_count(); 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-> count; i++)157 for ( uint32 i = 0; i < channel->element_count(); i++) 158 158 { 159 159 vec4& t = *reinterpret_cast<vec4*>(raw_data + vtx_size*i + t_offset ); … … 174 174 if ( ch_n == -1 ) return; 175 175 raw_data_channel* channel = m_data->m_channels[ unsigned( ch_n ) ]; 176 for ( const auto& cslot : channel->desc )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-> count; ++i )183 { 184 vec3& normal = *reinterpret_cast<vec3*>( channel->data + channel-> desc.element_size() * i + n_offset );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 ); 185 185 normal = -normal; 186 186 } … … 205 205 const raw_data_channel* channel = m_data->get_channel(c); 206 206 207 for ( const auto& cslot : channel->desc )207 for ( const auto& cslot : channel->descriptor() ) 208 208 switch ( cslot.vslot ) 209 209 { … … 242 242 if ( !p_channel || !n_channel || !t_channel ) return; 243 243 244 if ( p_channel->count != n_channel->count || p_channel->count % t_channel->count != 0 || ( i_type != UINT && i_type != USHORT && i_type != NONE ) ) 244 if ( p_channel->element_count() != n_channel->element_count() 245 || p_channel->element_count() % t_channel->element_count() != 0 246 || ( i_type != UINT && i_type != USHORT && i_type != NONE ) ) 245 247 { 246 248 return; 247 249 } 248 250 249 raw_data_channel* g_channel = raw_data_channel::create<vertex_g>( p_channel-> count);251 raw_data_channel* g_channel = raw_data_channel::create<vertex_g>( p_channel->element_count() ); 250 252 vec4* tangents = reinterpret_cast<vec4*>( g_channel->data ); 251 vec3* tangents2 = new vec3[ p_channel-> count];252 uint32 tri_count = i_channel ? i_channel-> count / 3 : t_channel->count/ 3;253 uint32 vtx_count = p_channel-> count;254 uint32 sets = p_channel-> count / t_channel->count;253 vec3* tangents2 = new vec3[ p_channel->element_count() ]; 254 uint32 tri_count = i_channel ? i_channel->element_count() / 3 : t_channel->element_count() / 3; 255 uint32 vtx_count = p_channel->element_count(); 256 uint32 sets = p_channel->element_count() / t_channel->element_count(); 255 257 256 258 for ( unsigned int i = 0; i < tri_count; ++i ) … … 280 282 } 281 283 282 const vec2& w1 = *reinterpret_cast<vec2*>(t_channel->data + t_channel-> desc.element_size()*ti0 + t_offset );283 const vec2& w2 = *reinterpret_cast<vec2*>(t_channel->data + t_channel-> desc.element_size()*ti1 + t_offset );284 const vec2& w3 = *reinterpret_cast<vec2*>(t_channel->data + t_channel-> desc.element_size()*ti2 + t_offset );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 ); 285 287 vec2 st1 = w3 - w1; 286 288 vec2 st2 = w2 - w1; … … 290 292 for ( uint32 set = 0; set < sets; ++set ) 291 293 { 292 uint32 nti0 = t_channel-> count* set + ti0;293 uint32 nti1 = t_channel-> count* set + ti1;294 uint32 nti2 = t_channel-> count* set + ti2;295 vec3 v1 = *reinterpret_cast<vec3*>(p_channel->data + p_channel-> desc.element_size()*nti0 + p_offset );296 vec3 v2 = *reinterpret_cast<vec3*>(p_channel->data + p_channel-> desc.element_size()*nti1 + p_offset );297 vec3 v3 = *reinterpret_cast<vec3*>(p_channel->data + p_channel-> desc.element_size()*nti2 + p_offset );294 uint32 nti0 = t_channel->element_count() * set + ti0; 295 uint32 nti1 = t_channel->element_count() * set + ti1; 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 ); 298 300 vec3 xyz1 = v3 - v1; 299 301 vec3 xyz2 = v2 - v1; … … 319 321 for ( unsigned int i = 0; i < vtx_count; ++i ) 320 322 { 321 const vec3 n = *reinterpret_cast<vec3*>( n_channel->data + n_channel-> desc.element_size()*i + n_offset );323 const vec3 n = *reinterpret_cast<vec3*>( n_channel->data + n_channel->element_size()*i + n_offset ); 322 324 const vec3 t = vec3(tangents[i]); 323 325 if ( ! ( t.x == 0.0f && t.y == 0.0f && t.z == 0.0f ) ) … … 336 338 nv::raw_data_channel* nv::mesh_data_creator::merge_channels( raw_data_channel* a, raw_data_channel* b ) 337 339 { 338 NV_ASSERT( a->count == b->count, "merge_channel - bad channels!" ); 339 data_descriptor adesc = a->desc; 340 data_descriptor bdesc = b->desc; 341 uint32 count = a->count; 342 343 data_descriptor desc = a->desc; 344 for ( auto bslot : bdesc ) 345 { 346 desc.push_slot( bslot.etype, bslot.vslot ); 347 } 348 uint8* data = new uint8[ count * desc.element_size() ]; 349 for ( uint32 i = 0; i < count; ++i ) 350 { 351 raw_copy_n( a->data + i * adesc.element_size(), adesc.element_size(), data + i*desc.element_size() ); 352 raw_copy_n( b->data + i * bdesc.element_size(), bdesc.element_size(), data + i*desc.element_size() + adesc.element_size() ); 353 } 340 NV_ASSERT( a->element_count() == b->element_count(), "merge_channel - bad channels!" ); 341 data_descriptor desc = a->descriptor(); 342 desc.append( b->descriptor() ); 343 344 uint8* data = new uint8[a->element_count() * desc.element_size() ]; 345 for ( uint32 i = 0; i < a->element_count(); ++i ) 346 { 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 354 351 raw_data_channel* result = new raw_data_channel; 355 result-> count = count;356 result-> desc = desc;352 result->m_count = a->element_count(); 353 result->m_desc = desc; 357 354 result->data = data; 358 355 return result; … … 361 358 nv::raw_data_channel* nv::mesh_data_creator::append_channels( raw_data_channel* a, raw_data_channel* b, uint32 frame_count ) 362 359 { 363 if ( a->desc != b->desc) return nullptr;364 if ( a-> count% frame_count != 0 ) return nullptr;365 if ( b-> count% frame_count != 0 ) return nullptr;366 size_t vtx_size = a-> desc.element_size();367 368 uint8* data = new uint8[ ( a-> count + b->count) * vtx_size ];360 if ( a->descriptor() != b->descriptor() ) return nullptr; 361 if ( a->element_count() % frame_count != 0 ) return nullptr; 362 if ( b->element_count() % frame_count != 0 ) return nullptr; 363 size_t vtx_size = a->element_size(); 364 365 uint8* data = new uint8[ ( a->element_count() + b->element_count() ) * vtx_size ]; 369 366 370 367 371 368 if ( frame_count == 1 ) 372 369 { 373 size_t a_size = vtx_size * a-> count;370 size_t a_size = vtx_size * a->element_count(); 374 371 raw_copy_n( a->data, a_size, data ); 375 raw_copy_n( b->data, vtx_size * b-> count, data + a_size );372 raw_copy_n( b->data, vtx_size * b->element_count(), data + a_size ); 376 373 } 377 374 else 378 375 { 379 size_t frame_size_a = ( a-> count/ frame_count ) * vtx_size;380 size_t frame_size_b = ( b-> count/ frame_count ) * vtx_size;376 size_t frame_size_a = ( a->element_count() / frame_count ) * vtx_size; 377 size_t frame_size_b = ( b->element_count() / frame_count ) * vtx_size; 381 378 size_t pos_a = 0; 382 379 size_t pos_b = 0; … … 392 389 393 390 raw_data_channel* result = new raw_data_channel; 394 result-> count = a->element_count() + b->element_count();395 result-> desc = a->descriptor();391 result->m_count = a->element_count() + b->element_count(); 392 result->m_desc = a->descriptor(); 396 393 result->data = data; 397 394 return result; … … 429 426 { 430 427 raw_data_channel* old = m_data->m_channels[c]; 431 size_t frame_count = ( old->get_buffer_type() == INDEX_BUFFER ? 1 : old->element_count() / size ); 428 bool old_is_index = old->element_count() > 0 && old->descriptor()[0].vslot == slot::INDEX; 429 size_t frame_count = ( old_is_index ? 1 : old->element_count() / size ); 432 430 m_data->m_channels[c] = append_channels( old, other->m_channels[c], frame_count ); 433 431 NV_ASSERT( m_data->m_channels[c], "Merge problem!" ); 434 if ( old ->get_buffer_type() == INDEX_BUFFER)435 { 436 switch ( old->desc [0].etype )432 if ( old_is_index ) 433 { 434 switch ( old->descriptor()[0].etype ) 437 435 { 438 436 case USHORT : -
trunk/src/gfx/skeletal_mesh.cc
r411 r412 13 13 nv::skeletal_mesh_cpu::skeletal_mesh_cpu( context* a_context, const mesh_data* a_mesh_data, const mesh_nodes_data* bones ) 14 14 : skeletal_mesh( a_context ) 15 , m_data( a_mesh_data ) 16 { 17 const raw_data_channel* pnt_chan = a_mesh_data->get_channel<md5_vtx_pnt>(); 18 m_pntdata.assign( reinterpret_cast<const md5_vtx_pnt*>( pnt_chan->data ), pnt_chan->count ); 15 { 16 const raw_data_channel* pnt_chan = a_mesh_data->get_channel<md5_vtx_pnt>(); 17 const raw_data_channel* pntiw_chan = a_mesh_data->get_channel<md5_vtx_pntiw>(); 18 19 m_pntdata.assign( reinterpret_cast<const md5_vtx_pnt*>( pnt_chan->data ), pnt_chan->element_count() ); 19 20 m_bone_offset.resize( bones->get_count() ); 20 21 m_transform.resize( bones->get_count() ); … … 24 25 m_bone_offset[i] = transform( bones->get_node(i)->transform ); 25 26 } 27 26 28 m_vtx_data = a_mesh_data->get_channel_data<md5_vtx_pntiw>(); 27 29 m_indices = a_mesh_data->get_count(); 28 m_va = a_context->create_vertex_array( a_mesh_data, 29 STREAM_DRAW ); 30 m_va = a_context->create_vertex_array(); 31 32 array_view< raw_data_channel* > channels = a_mesh_data->get_raw_channels(); 33 for ( uint32 ch = 0; ch < channels.size(); ++ch ) 34 { 35 const raw_data_channel* channel = channels[ch]; 36 if ( channel->element_count() > 0 && channel != pntiw_chan ) 37 { 38 const data_descriptor& desc = channel->descriptor(); 39 if ( desc[0].vslot == slot::INDEX ) 40 { 41 buffer b = a_context->get_device()->create_buffer( INDEX_BUFFER, STREAM_DRAW, channel->raw_size(), channel->raw_data() ); 42 a_context->set_index_buffer( m_va, b, desc[0].etype, true ); 43 } 44 else 45 { 46 buffer b = a_context->get_device()->create_buffer( VERTEX_BUFFER, STREAM_DRAW, channel->raw_size(), channel->raw_data() ); 47 a_context->add_vertex_buffers( m_va, b, channel ); 48 } 49 } 50 } 51 30 52 m_pbuffer = a_context->find_buffer( m_va, slot::POSITION ); 31 53 }
Note: See TracChangeset
for help on using the changeset viewer.