void ae3d::Shader::Load( const FileSystem::FileContentsData& vertexGLSL, const FileSystem::FileContentsData& fragmentGLSL, const char* /*metalVertexShaderName*/, const char* /*metalFragmentShaderName*/, const FileSystem::FileContentsData& /*vertexHLSL*/, const FileSystem::FileContentsData& /*fragmentHLSL*/ ) { const std::string vertexStr = std::string( std::begin( vertexGLSL.data ), std::end( vertexGLSL.data ) ); const std::string fragmentStr = std::string( std::begin( fragmentGLSL.data ), std::end( fragmentGLSL.data ) ); Load( vertexStr.c_str(), fragmentStr.c_str() ); bool isInCache = false; for (const auto& entry : cacheEntries) { if (entry.shader == this) { isInCache = true; } } if (!isInCache && !vertexGLSL.path.empty() && !fragmentGLSL.path.empty()) { fileWatcher.AddFile( vertexGLSL.path.c_str(), ShaderReload ); fileWatcher.AddFile( fragmentGLSL.path.c_str(), ShaderReload ); cacheEntries.push_back( { vertexGLSL.path, fragmentGLSL.path, this } ); } }
void ae3d::Texture2D::Load( const FileSystem::FileContentsData& fileContents, TextureWrap aWrap, TextureFilter aFilter, Mipmaps aMipmaps, float aAnisotropy ) { filter = aFilter; wrap = aWrap; mipmaps = aMipmaps; anisotropy = aAnisotropy; if (!fileContents.isLoaded) { *this = Texture2DGlobal::defaultTexture; return; } const bool isCached = Texture2DGlobal::pathToCachedTexture.find( fileContents.path ) != Texture2DGlobal::pathToCachedTexture.end(); if (isCached && handle == 0) { *this = Texture2DGlobal::pathToCachedTexture[ fileContents.path ]; return; } // First load. if (handle == 0) { handle = GfxDevice::CreateTextureId(); if (GfxDevice::HasExtension( "KHR_debug" )) { glObjectLabel( GL_TEXTURE, handle, (GLsizei)fileContents.path.size(), fileContents.path.c_str() ); } fileWatcher.AddFile( fileContents.path, TexReload ); } glBindTexture( GL_TEXTURE_2D, handle ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, filter == TextureFilter::Nearest ? GL_NEAREST : (mipmaps == Mipmaps::Generate ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR ) ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, filter == TextureFilter::Nearest ? GL_NEAREST : GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, wrap == TextureWrap::Repeat ? GL_REPEAT : GL_CLAMP_TO_EDGE ); glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, wrap == TextureWrap::Repeat ? GL_REPEAT : GL_CLAMP_TO_EDGE ); if (GfxDevice::HasExtension( "GL_EXT_texture_filter_anisotropic" ) && anisotropy > 1) { glTexParameterf( GL_TEXTURE_2D, 0x84FE/*GL_TEXTURE_MAX_ANISOTROPY_EXT*/, anisotropy ); } const bool isDDS = fileContents.path.find( ".dds" ) != std::string::npos || fileContents.path.find( ".DDS" ) != std::string::npos; if (HasStbExtension( fileContents.path )) { LoadSTB( fileContents ); } else if (isDDS) { LoadDDS( fileContents.path.c_str() ); } if (mipmaps == Mipmaps::Generate) { glGenerateMipmap( GL_TEXTURE_2D ); } Texture2DGlobal::pathToCachedTexture[ fileContents.path ] = *this; #if DEBUG Texture2DGlobal::pathToCachedTextureSizeInBytes[ fileContents.path ] = static_cast< std::size_t >(width * height * 4 * (mipmaps == Mipmaps::Generate ? 1.0f : 1.33333f)); //Texture2DGlobal::PrintMemoryUsage(); #endif }