EResult CompileShader( const char * szFileName, const char * szSource, const char * szEntryPoint, const char * szProfile, ID3D10Blob ** ppShaderByteCode ) { if ( ( NULL == szFileName ) || ( NULL == szSource ) || ( NULL == ppShaderByteCode ) ) return R_INVALID_ARG; size_t nSize = strlen( szSource ); if ( 0 == nSize ) return R_INVALID_ARG; ID3D10Blob * pErrorMsg = NULL; HRESULT hRes = D3D10CompileShader( szSource, // file data nSize, // file data size NULL, // file name (set to null if prev args not null) NULL, // macro array (defines) NULL, // ? include szEntryPoint, szProfile, 0, // shader compile flags ppShaderByteCode, &pErrorMsg ); if ( FAILED( hRes ) ) { if ( NULL != pErrorMsg ) { const char * szErr = Va( "\tShader compilation failed, file \"%s\"\n\t\t%s", szFileName, (const char *)pErrorMsg->GetBufferPointer() ); SysWrite( szErr ); DEBUG_MSG( szErr ); } return R_GENERIC_ERROR; } return R_OK; }
float Ship::Cth(){ return (8./PI()) * Tprop() / (1.025 * pow(Va() * Dprop(), 2.)); }
void CShaderCfgLoader::FinalizeRes( TResource * pRes ) { pRes->eState = TResource::FAILED; //-------------------------------------------------------------------------- // Tip: Check XMLWrapper //-------------------------------------------------------------------------- IXMLWrapper * pWrapper = (IXMLWrapper *)g_pSystem->GetInterface( IT_UTIL ); if ( !pWrapper ) return; CXMLElement * pRoot = NULL; pWrapper->LoadXMLFromMem( (char *)pRes->pBuffer, pRes->nSize, &pRoot ); DEL_ARRAY( pRes->pBuffer ); //pRes->pResource = pRoot; //-------------------------------------------------------------------------- // Tip: Check root element name //-------------------------------------------------------------------------- CStr sName( pRoot->GetName() ); if ( !sName.Compare( "Shaders" ) ) { DEL( pRoot ); return; } //-------------------------------------------------------------------------- // Tip: Parsing shaders //-------------------------------------------------------------------------- for ( size_t i = 0; i < pRoot->GetNumChilds(); ++i ) { //---------------------------------------------------------------------- // Tip: New shader //---------------------------------------------------------------------- CXMLElement * pShaderBranch = pRoot->GetChild( i ); CStr sPath( "Shaders/" ); sPath.Add( pShaderBranch->GetName() ); // const CStr sShader( pShaderBranch->GetName() ); // CBaseShader * pShader = NEW CBaseShader( sShader.GetString() ); // CXMLAttr * pProgPath = pShaderBranch->GetAttr( "ProgramPath" ); // CStr sProgPath( pProgPath->GetValue() ); SysWrite( Va( "\tshader %s", pShaderBranch->GetName() ) ); IVertexDecl * pDecl = NULL; TUniform * pUniforms = NULL; uint nUnfmCount = 0; //---------------------------------------------------------------------- // Tip: Parse shader data //---------------------------------------------------------------------- for ( size_t j = 0; j < pShaderBranch->GetNumChilds(); ++j ) { CXMLElement * pStruct = pShaderBranch->GetChild( j ); const CStr sStruct( pStruct->GetName() ); if ( sStruct.Compare( "VertexFormat" ) ) { pDecl = ParseVertexFormat( pStruct ); } else if ( sStruct.Compare( "Constants" ) ) { /* pShader->m_nUniformCount = 1; pShader->m_pUniforms = NEW CBaseShader::TUniform [ pShader->m_nUniformCount ]; pShader->m_pUniforms[ 0 ].sName = "vColorMod"; pShader->m_pUniforms[ 0 ].eType = TYPE_VEC4; pShader->m_pUniforms[ 0 ].nLoc = pShader->GetUniformLoc( pShader->m_pUniforms[ 0 ].sName ); pShader->m_pUniforms[ 0 ].nCount = 1; m_ppShaders[ UI_SHADER ] = pShader; */ nUnfmCount = ParseConstants( pStruct, &pUniforms ); //pShader->ParseMaps( pStruct ); } } g_pRenderer->CreateShader( sPath.GetString(), pDecl, pUniforms, nUnfmCount ); } DEL( pRoot ); pRes->eState = TResource::LOADED; }
bool CRendererD3D::CreateShader( const char * szPath, IVertexDecl * pDecl, TUniform * pUnfms, uint nUnfmCount ) { TResource * pShaderRes = NULL; g_pResManager->Request( Va( "%s/hlsl.vsh", szPath ), &pShaderRes ); g_pResManager->Request( Va( "%s/hlsl.psh", szPath ), &pShaderRes ); uint nConstBufferSize = 96; CShader * pShader = static_cast<CShader *>( pShaderRes->pResource ); // Tip: Create our vertex input layout --------------------------------- const D3D10_INPUT_ELEMENT_DESC layout_ui[] = { { "POSITION", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32_FLOAT, 0, 8, D3D10_INPUT_PER_VERTEX_DATA, 0 }, // { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 16, D3D10_INPUT_PER_VERTEX_DATA, 0 }, }; const D3D10_INPUT_ELEMENT_DESC layout_line[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32_FLOAT, 0, 0, D3D10_INPUT_PER_VERTEX_DATA, 0 }, { "COLOR", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 12, D3D10_INPUT_PER_VERTEX_DATA, 0 }, }; /* D3D10_INPUT_ELEMENT_DESC * pLayout = NEW D3D10_INPUT_ELEMENT_DESC [ pDecl->GetAttrCount() ]; for ( uint n = 0; n < pDecl->GetAttrCount(); ++n ) { TVertexAttr * pAttr = pDecl->GetAttr(); pLayout[ n ].SemanticName = pAttr->szName }*/ const D3D10_INPUT_ELEMENT_DESC * pLay = NULL; uint nCount = 0; if ( CStr::FinishWith( szPath, "UI" ) ) { pLay = layout_ui; nCount = 2; } else if ( CStr::FinishWith( szPath, "Line" ) ) { pLay = layout_line; nCount = 2; } if ( pLay ) { HRESULT hRes = g_pDevice->CreateInputLayout( pLay, nCount, pShader->m_pByteCodeVS->GetBufferPointer(), pShader->m_pByteCodeVS->GetBufferSize(), &pShader->m_pLayout ); if ( FAILED( hRes ) ) { return false; // fixme } } g_pDevice->IASetInputLayout ( pShader->m_pLayout ); pShader->m_pVDecl = pDecl; //---------------------------------------------------------------- g_pDevice->VSSetShader ( pShader->m_pVS ); g_pDevice->GSSetShader ( NULL ); g_pDevice->PSSetShader ( pShader->m_pPS ); pShader->m_ppConstBuffers = NEW ID3D10Buffer * [ 1 ]; D3D10_BUFFER_DESC bd; ZeroMemory( &bd, sizeof( D3D10_BUFFER_DESC ) ); bd.Usage = D3D10_USAGE_DYNAMIC; bd.ByteWidth = nConstBufferSize; bd.BindFlags = D3D10_BIND_CONSTANT_BUFFER; bd.CPUAccessFlags = D3D10_CPU_ACCESS_WRITE ; // set 0 to setup data at alloc only bd.MiscFlags = 0; g_pDevice->CreateBuffer( &bd, NULL, pShader->m_ppConstBuffers ); g_pDevice->VSSetConstantBuffers( 0, 1, pShader->m_ppConstBuffers ); //-------------------------------- pShader->m_sName.Set( szPath + CStr::GetSize( "Shaders" ) ); m_ShaderList.Add( pShader ); return true; }
void CModel::LoadObjects( const char * szFile ) { const int nFileVer = 1; IFile * pFile; if ( R_OK != g_pVfs->OpenFile( &pFile, szFile, VFS_BINARY | VFS_READ ) ) { SysWrite( Va( "Failed to open model file \"%s\"", szFile ) ); return; } TModelFileHdr tFileHdr; //-------------------------------------------------------------------------- // Tip: Читаем заголовок MODEL файла //-------------------------------------------------------------------------- if ( !g_pVfs->CheckRead( pFile, &tFileHdr, sizeof( TModelFileHdr ) ) ) { // invalid file goto error_label; } if ( /*( 0 != strcmp( "MDL ", (char *)&tFileHdr.nSign ) ) ||*/ ( 0 == tFileHdr.nNumObjects ) || ( nFileVer != tFileHdr.nVersion ) || ( sizeof( TModelFileHdr ) != tFileHdr.nHeaderSize ) ) { // invalid file or no objects goto error_label; } m_nNumObjects = tFileHdr.nNumObjects; m_pObjects = NEW CObject [ m_nNumObjects ]; if ( NULL == m_pObjects ) goto error_label; //-------------------------------------------------------------------------- // Tip: Читаем mesh //-------------------------------------------------------------------------- { TObjectHdr tMeshHdr; g_pVfs->Read( pFile, &tMeshHdr, sizeof( TObjectHdr ) ); } m_pShape = g_pEngine->CreateMesh(); m_pShape->LoadFromStream( pFile ); m_pBoneMatrices = NEW mat4[ m_nNumObjects ]; //-------------------------------------------------------------------------- // Tip: Читаем объекты //-------------------------------------------------------------------------- for ( uint nObj = 0; nObj < m_nNumObjects; ++nObj ) { TObjectHdr tObjHdr; CObject * pObject = m_pObjects + nObj; // Читаем заголовок объекта if ( sizeof ( TObjectHdr ) != g_pVfs->Read( pFile, &tObjHdr, sizeof( TObjectHdr ) ) ) { goto error_label; } pObject->SetParentName( tObjHdr.szParent ); pObject->SetName( tObjHdr.szName ); pObject->SetScale( tObjHdr.vScale ); pObject->SetPos( tObjHdr.vPos ); pObject->SetRot( tObjHdr.qRot ); //////////////////////////////////////////////////////////////////////// /*switch ( tObjHdr.eType ) { default: { g_pVfs->Seek( pFile, tObjHdr.nShapeBlockSize, VFS_SEEK_CUR ); continue; } }*/ } RebuildHierarchy(); g_pVfs->CloseFile( &pFile ); return; //-------------------------------------------------------------------------- // Tip: Поведение кода в случае ошибки при разборе файла //-------------------------------------------------------------------------- error_label: m_nNumObjects = 0; g_pVfs->CloseFile( &pFile ); }