-------------------------------------------------------------------------------------- Description: Convert Trinity vertex definition back to a CMF layout. Arguments: vd - input definition cmfVertexDecl - pointer to at least maxSize elements maxSize - size of cmfVertexDecl array Return Value: true - If successful false - On error --------------------------------------------------------------------
| 386 | // false - On error |
| 387 | // -------------------------------------------------------------------------------------- |
| 388 | bool ConvertVertexDeclToCMF( Tr2VertexDefinition vd, cmf::Span<cmf::VertexElement>& cmfVertexDecl, unsigned maxSize ) |
| 389 | { |
| 390 | // Note: This function assumes the D3D vertex layout is described in increasing offset order |
| 391 | // ... so make sure. |
| 392 | std::sort( begin( vd.m_items ), end( vd.m_items ) ); |
| 393 | |
| 394 | for( size_t i = 0; i != std::min( maxSize, (unsigned int)vd.m_items.size() ); ++i ) |
| 395 | { |
| 396 | const auto& src = vd.m_items[i]; |
| 397 | |
| 398 | cmf::VertexElement& dst = cmfVertexDecl.begin()[i]; |
| 399 | |
| 400 | dst.elementCount = ( ( src.m_dataType & Tr2VertexDefinition::DT_SIZE_MASK ) >> Tr2VertexDefinition::DT_SIZE_OFFSET ) + 1; |
| 401 | const bool isUnsigned = ( src.m_dataType & Tr2VertexDefinition::DT_UNSIGNED_BIT ) != 0; |
| 402 | const bool isNormalized = ( src.m_dataType & Tr2VertexDefinition::DT_NORMALIZED_BIT ) != 0; |
| 403 | |
| 404 | switch( src.m_dataType & Tr2VertexDefinition::DT_TYPE_MASK ) |
| 405 | { |
| 406 | case Tr2VertexDefinition::DT_INT8: |
| 407 | dst.type = isUnsigned ? |
| 408 | ( isNormalized ? cmf::ElementType::UInt8Norm : cmf::ElementType::UInt8 ) : |
| 409 | ( isNormalized ? cmf::ElementType::Int8Norm : cmf::ElementType::Int8 ); |
| 410 | break; |
| 411 | |
| 412 | case Tr2VertexDefinition::DT_INT16: |
| 413 | dst.type = isUnsigned ? |
| 414 | ( isNormalized ? cmf::ElementType::UInt16Norm : cmf::ElementType::UInt16 ) : |
| 415 | ( isNormalized ? cmf::ElementType::Int16Norm : cmf::ElementType::Int16 ); |
| 416 | break; |
| 417 | |
| 418 | case Tr2VertexDefinition::DT_INT32: |
| 419 | CCP_ASSERT_M( false, "ConvertVertexDeclToCMF: INT32 is not supported by cmf" ); |
| 420 | return false; |
| 421 | |
| 422 | case Tr2VertexDefinition::DT_FLOAT16: |
| 423 | dst.type = cmf::ElementType::Float16; |
| 424 | break; |
| 425 | |
| 426 | case Tr2VertexDefinition::DT_FLOAT32: |
| 427 | dst.type = cmf::ElementType::Float32; |
| 428 | break; |
| 429 | |
| 430 | default: |
| 431 | CCP_ASSERT( false && "ConvertVertexDeclToCMF: Missing datatype support in cmf conversion" ); |
| 432 | return false; |
| 433 | } |
| 434 | |
| 435 | dst.offset = src.m_offset; |
| 436 | dst.usageIndex = src.m_usageIndex; |
| 437 | |
| 438 | switch( src.m_usage ) |
| 439 | { |
| 440 | case Tr2VertexDefinition::POSITION: |
| 441 | dst.usage = cmf::Usage::Position; |
| 442 | break; |
| 443 | case Tr2VertexDefinition::COLOR: |
| 444 | dst.usage = cmf::Usage::Color; |
| 445 | break; |