// Retrieve specified vertex shader //----------------------------------------------------------------------------- CPUTResult CPUTAssetLibraryDX11::GetVertexShader( const cString &name, ID3D11Device *pD3dDevice, const cString &shaderMain, const cString &shaderProfile, CPUTVertexShaderDX11 **ppVertexShader, bool nameIsFullPathAndFilename ) { CPUTResult result = CPUT_SUCCESS; cString finalName; if( name.at(0) == '$' ) { finalName = name; } else { // Resolve name to absolute path CPUTOSServices *pServices = CPUTOSServices::GetOSServices(); pServices->ResolveAbsolutePathAndFilename( nameIsFullPathAndFilename? name : (mShaderDirectoryName + name), &finalName); } // see if the shader is already in the library void *pShader = FindVertexShader(finalName + shaderMain + shaderProfile, true); if(NULL!=pShader) { *ppVertexShader = (CPUTVertexShaderDX11*) pShader; (*ppVertexShader)->AddRef(); return result; } *ppVertexShader = CPUTVertexShaderDX11::CreateVertexShader( finalName, pD3dDevice, shaderMain, shaderProfile ); return result; }
//============================================================================== VertexShader * CGraphicsMgr::FindVertexShaderRaii (const std::wstring & name) { VertexShader * result = FindVertexShader(name); if (!result) { m_vertexShaders.push_back(VertexShader()); result = &m_vertexShaders.back(); } return result; }
CPUTResult CPUTAssetLibraryOGL::GetVertexShader( const std::vector<cString> &fileNames, const cString &shaderMain, const cString &shaderProfile, CPUTShaderOGL **ppVertexShader, bool nameIsFullPathAndFilename, CPUT_SHADER_MACRO *pShaderMacros ) { CPUTResult result = CPUT_SUCCESS; std::vector<cString> finalNames; cString libName; for(UINT i=0; i<fileNames.size(); i++) { cString name = fileNames[i]; cString finalName; if( fileNames[i].at(0) == '%' ) { // Consider moving slashes to some sub variable dependent from OS, // or even MACRO would be better in such situation. finalName = mSystemDirectoryName + _L("Shader/") + name.substr(1); // TODO: Instead of having the Shader/ directory hardcoded here it could be set like the normal material directory. But then there would need to be a bunch new variables like SetSystemMaterialDirectory } else if( fileNames[i].at(0) == '$' ) { finalName = fileNames[i]; } else { CPUTFileSystem::ResolveAbsolutePathAndFilename( nameIsFullPathAndFilename? name : (mShaderDirectoryName + name), &finalName ); } libName += finalName; finalNames.push_back(finalName); } // see if the shader is already in the library void *pShader = FindVertexShader(libName + shaderMain + shaderProfile, true); if(NULL!=pShader) { *ppVertexShader = (CPUTShaderOGL*)pShader; (*ppVertexShader)->AddRef(); return result; } *ppVertexShader = CPUTShaderOGL::CreateShaderFromFiles( finalNames, GL_VERTEX_SHADER, CPUT_OGL::GLSL_VERSION, CPUT_OGL::DEFAULT_MACROS, pShaderMacros); return result; }