Changeset 412 for trunk/src/gfx/mesh_creator.cc
- Timestamp:
- 07/09/15 14:40:36 (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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 :
Note: See TracChangeset
for help on using the changeset viewer.