├── .clang-format ├── .gitignore ├── .gitmodules ├── .nojekyll ├── .vscode ├── c_cpp_properties.json ├── launch.json ├── settings.json └── tasks.json ├── CMakeLists.txt ├── FindSphinx.cmake ├── Findbsf.cmake ├── LICENSE ├── README.md ├── appveyor.yml ├── content └── shaders │ └── World.bsl ├── docs-source ├── .vscode │ └── settings.json ├── CMakeLists.txt ├── Doxyfile.in ├── conf.py.in ├── content │ ├── caching.rst │ ├── materials.rst │ ├── morphmeshes.rst │ ├── skeletalmeshes.rst │ ├── staticmeshes.rst │ ├── textures.rst │ └── vdfs.rst └── index.rst ├── docs ├── .buildinfo ├── .nojekyll ├── _sources │ ├── content │ │ ├── caching.rst.txt │ │ ├── importers.rst.txt │ │ ├── materials.rst.txt │ │ ├── morphmeshes.rst.txt │ │ ├── skeletalmeshes.rst.txt │ │ ├── staticmeshes.rst.txt │ │ ├── textures.rst.txt │ │ └── vdfs.rst.txt │ ├── index.rst.txt │ └── modindex │ │ ├── importers.rst.txt │ │ └── textures.rst.txt ├── _static │ ├── ajax-loader.gif │ ├── basic.css │ ├── classic.css │ ├── comment-bright.png │ ├── comment-close.png │ ├── comment.png │ ├── css │ │ ├── badge_only.css │ │ └── theme.css │ ├── default.css │ ├── doctools.js │ ├── documentation_options.js │ ├── down-pressed.png │ ├── down.png │ ├── file.png │ ├── fonts │ │ ├── Inconsolata-Bold.ttf │ │ ├── Inconsolata-Regular.ttf │ │ ├── Inconsolata.ttf │ │ ├── Lato-Bold.ttf │ │ ├── Lato-Regular.ttf │ │ ├── Lato │ │ │ ├── lato-bold.eot │ │ │ ├── lato-bold.ttf │ │ │ ├── lato-bold.woff │ │ │ ├── lato-bold.woff2 │ │ │ ├── lato-bolditalic.eot │ │ │ ├── lato-bolditalic.ttf │ │ │ ├── lato-bolditalic.woff │ │ │ ├── lato-bolditalic.woff2 │ │ │ ├── lato-italic.eot │ │ │ ├── lato-italic.ttf │ │ │ ├── lato-italic.woff │ │ │ ├── lato-italic.woff2 │ │ │ ├── lato-regular.eot │ │ │ ├── lato-regular.ttf │ │ │ ├── lato-regular.woff │ │ │ └── lato-regular.woff2 │ │ ├── RobotoSlab-Bold.ttf │ │ ├── RobotoSlab-Regular.ttf │ │ ├── RobotoSlab │ │ │ ├── roboto-slab-v7-bold.eot │ │ │ ├── roboto-slab-v7-bold.ttf │ │ │ ├── roboto-slab-v7-bold.woff │ │ │ ├── roboto-slab-v7-bold.woff2 │ │ │ ├── roboto-slab-v7-regular.eot │ │ │ ├── roboto-slab-v7-regular.ttf │ │ │ ├── roboto-slab-v7-regular.woff │ │ │ └── roboto-slab-v7-regular.woff2 │ │ ├── fontawesome-webfont.eot │ │ ├── fontawesome-webfont.svg │ │ ├── fontawesome-webfont.ttf │ │ ├── fontawesome-webfont.woff │ │ └── fontawesome-webfont.woff2 │ ├── jquery-3.2.1.js │ ├── jquery.js │ ├── js │ │ ├── modernizr.min.js │ │ └── theme.js │ ├── language_data.js │ ├── minus.png │ ├── plus.png │ ├── pygments.css │ ├── searchtools.js │ ├── sidebar.js │ ├── underscore-1.3.1.js │ ├── underscore.js │ ├── up-pressed.png │ ├── up.png │ └── websupport.js ├── content │ ├── caching.html │ ├── importers.html │ ├── materials.html │ ├── morphmeshes.html │ ├── skeletalmeshes.html │ ├── staticmeshes.html │ ├── textures.html │ └── vdfs.html ├── genindex.html ├── index.html ├── modindex │ ├── importers.html │ └── textures.html ├── objects.inv ├── search.html └── searchindex.js ├── include └── BsZenLib │ ├── CacheUtility.hpp │ ├── ImportAnimation.hpp │ ├── ImportFont.hpp │ ├── ImportMaterial.hpp │ ├── ImportMorphMesh.hpp │ ├── ImportPath.hpp │ ├── ImportSkeletalMesh.hpp │ ├── ImportStaticMesh.hpp │ ├── ImportTexture.hpp │ ├── ImportZEN.hpp │ ├── ResourceManifest.hpp │ └── ZenResources.hpp ├── lib └── FreeImage │ ├── FreeImage.h │ └── why-is-this-here.txt ├── samples ├── CMakeLists.txt ├── common │ ├── BsCameraZoomer.cpp │ ├── BsCameraZoomer.h │ ├── BsFPSCamera.cpp │ ├── BsFPSCamera.h │ ├── BsFPSWalker.cpp │ ├── BsFPSWalker.h │ ├── BsObjectRotator.cpp │ └── BsObjectRotator.h ├── mesh-viewer.cpp ├── npc-viewer.cpp └── zen-bs.cpp └── src ├── CacheUtility.cpp ├── ImportAnimation.cpp ├── ImportFont.cpp ├── ImportMaterial.cpp ├── ImportMorphMesh.cpp ├── ImportPath.cpp ├── ImportSkeletalMesh.cpp ├── ImportStaticMesh.cpp ├── ImportTexture.cpp ├── ImportZEN.cpp ├── ResourceManifest.cpp └── ZenResources.cpp /.clang-format: -------------------------------------------------------------------------------- 1 | --- 2 | Language: Cpp 3 | BasedOnStyle: Google 4 | IndentWidth: 2 5 | # don't indent public, private and protected 6 | AccessModifierOffset: -2 7 | BreakBeforeBraces: Allman 8 | # respect user choice for line breaking 9 | ColumnLimit: 101 10 | BreakConstructorInitializersBeforeComma: true 11 | ConstructorInitializerAllOnOneLineOrOnePerLine: false 12 | SortIncludes: false 13 | DerivePointerAlignment: false 14 | PointerAlignment: Left 15 | NamespaceIndentation: All 16 | SortIncludes: true 17 | 18 | IncludeCategories: 19 | - Regex: '<[^./]+>' # c++ stl includes 20 | Priority: 1 21 | - Regex: '(<|")[^/]+(>|")' # includes without path 22 | Priority: 2 23 | - Regex: '(<|").+(>|")' # includes with path 24 | Priority: 3 25 | ... 26 | 27 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # CMake 2 | build/ 3 | 4 | # Prerequisites 5 | *.d 6 | 7 | # Compiled Object files 8 | *.slo 9 | *.lo 10 | *.o 11 | *.obj 12 | 13 | # Precompiled Headers 14 | *.gch 15 | *.pch 16 | 17 | # Compiled Dynamic libraries 18 | *.so 19 | *.dylib 20 | *.dll 21 | 22 | # Fortran module files 23 | *.mod 24 | *.smod 25 | 26 | # Compiled Static libraries 27 | *.lai 28 | *.la 29 | *.a 30 | *.lib 31 | 32 | # Executables 33 | *.exe 34 | *.out 35 | *.app 36 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/ZenLib"] 2 | path = lib/ZenLib 3 | url = https://github.com/ataulien/ZenLib.git 4 | -------------------------------------------------------------------------------- /.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/.nojekyll -------------------------------------------------------------------------------- /.vscode/c_cpp_properties.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "Win32", 5 | "includePath": [ 6 | "${workspaceFolder}/**" 7 | ], 8 | "defines": [ 9 | "_DEBUG", 10 | "UNICODE", 11 | "_UNICODE" 12 | ], 13 | "windowsSdkVersion": "10.0.17134.0", 14 | "compilerPath": "C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.15.26726/bin/Hostx64/x64/cl.exe", 15 | "cStandard": "c11", 16 | "cppStandard": "c++17", 17 | "intelliSenseMode": "msvc-x64", 18 | "configurationProvider": "vector-of-bool.cmake-tools", 19 | "compileCommands": "${workspaceFolder}/build/compile_commands.json" 20 | } 21 | ], 22 | "version": 4 23 | } -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | 8 | { 9 | "name": "mesh-viewer", 10 | "type": "cppvsdbg", 11 | "request": "launch", 12 | "program": "${workspaceFolder}/build/bin/mesh-viewer.exe", 13 | "args": [ "D:/Games/Gothic II/Data"], 14 | "stopAtEntry": false, 15 | "cwd": "${workspaceFolder}/build/bin", 16 | "environment": [], 17 | "externalConsole": true 18 | }, 19 | 20 | { 21 | "name": "npc-viewer", 22 | "type": "cppvsdbg", 23 | "request": "launch", 24 | "program": "${workspaceFolder}/build/bin/npc-viewer.exe", 25 | "args": [ "D:/Games/Gothic II/Data"], 26 | "stopAtEntry": false, 27 | "cwd": "${workspaceFolder}/build/bin", 28 | "environment": [], 29 | "externalConsole": true 30 | }, 31 | { 32 | "name": "zen-bs", 33 | "type": "cppvsdbg", 34 | "request": "launch", 35 | "program": "${workspaceFolder}/build/bin/zen-bs.exe", 36 | "args": [ "D:/Games/Gothic II/Data", "dragonisland.zen"], 37 | "stopAtEntry": false, 38 | "cwd": "${workspaceFolder}/build/bin", 39 | "environment": [], 40 | "externalConsole": true 41 | } 42 | ] 43 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "C_Cpp.configurationWarnings": "Disabled", 3 | "restructuredtext.confPath": "", 4 | "files.associations": { 5 | "xstring": "cpp", 6 | "memory": "cpp", 7 | "xmemory0": "cpp" 8 | } 9 | } -------------------------------------------------------------------------------- /.vscode/tasks.json: -------------------------------------------------------------------------------- 1 | { 2 | // See https://go.microsoft.com/fwlink/?LinkId=733558 3 | // for the documentation about the tasks.json format 4 | "version": "2.0.0", 5 | "tasks": [ 6 | { 7 | "label": "zen-bs", 8 | "type": "shell", 9 | "command": "${workspaceRoot}/build/bin/zen-bs 'D:/Games/Gothic II/Data' newworld.zen", 10 | "problemMatcher": [], 11 | "options": { 12 | "cwd": "${workspaceRoot}/build/bin" 13 | } 14 | }, 15 | 16 | { 17 | "label": "mesh-viewer", 18 | "type": "shell", 19 | "command": "${workspaceRoot}/build/bin/mesh-viewer 'D:/Games/Gothic II/Data'", 20 | "problemMatcher": [], 21 | "options": { 22 | "cwd": "${workspaceRoot}/build/bin" 23 | } 24 | }, 25 | 26 | { 27 | "label": "npc-viewer", 28 | "type": "shell", 29 | "command": "${workspaceRoot}/build/bin/npc-viewer 'D:/Games/Gothic II/Data'", 30 | "problemMatcher": [], 31 | "options": { 32 | "cwd": "${workspaceRoot}/build/bin" 33 | } 34 | }, 35 | 36 | { 37 | "label": "clean cache", 38 | "type": "shell", 39 | "command": "rm -r build/bin/cache", 40 | "problemMatcher": [] 41 | } 42 | ] 43 | } -------------------------------------------------------------------------------- /CMakeLists.txt: -------------------------------------------------------------------------------- 1 | cmake_minimum_required (VERSION 3.9.0) 2 | project (BsZenLib) 3 | 4 | option(BSZENLIB_BUILD_SAMPLES "Whether to build BsZenLib samples" OFF) 5 | option(BSZENLIB_BUILD_DOCS "Whether to add targets to build the documentation" OFF) 6 | option(BSZENLIB_DOWNLOAD_BSF_BINARIES "Download and use precompiled binaries for bsf." OFF) 7 | option(BSZENLIB_SKIP_FIND_BSF "When set, BsZenLib will not try to find and build bsf." OFF) 8 | set(BSZENLIB_BSF_SUBMODULE_PATH "" CACHE PATH "Path to bsf sources to add as cmake subdirectory") 9 | 10 | # Add necessary compiler flags 11 | if(CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR 12 | CMAKE_CXX_COMPILER_ID MATCHES "AppleClang" OR 13 | CMAKE_CXX_COMPILER_ID MATCHES "GNU") 14 | # This is what the example file does, is this really needed at a global scale? 15 | set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -g") 16 | endif() 17 | 18 | # Make sure to use the C++14 standard 19 | set(CMAKE_CXX_STANDARD 14) 20 | 21 | set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 22 | set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib) 23 | set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin) 24 | 25 | ############################################################################### 26 | # Optional Prebuilt bs:f Download # 27 | ############################################################################### 28 | if (BSZENLIB_DOWNLOAD_BSF_BINARIES) 29 | 30 | message(STATUS "Downloading prebuilt bs:f...") 31 | 32 | include(FetchContent) 33 | 34 | set(bsf_INSTALL_DIR ${CMAKE_BINARY_DIR}/bsf-binaries CACHE PATH "" FORCE) 35 | 36 | if (WIN32) 37 | FetchContent_Declare(bsfBinaries 38 | SOURCE_DIR ${bsf_INSTALL_DIR} 39 | URL https://dilborceisv8p.cloudfront.net/bsf_2019.01.23_win64.zip 40 | ) 41 | elseif (APPLE) 42 | FetchContent_Declare(bsfBinaries 43 | SOURCE_DIR ${bsf_INSTALL_DIR} 44 | URL https://dilborceisv8p.cloudfront.net/bsf_2019.01.23_osx.tar.gz 45 | ) 46 | elseif (UNIX) 47 | FetchContent_Declare(bsfBinaries 48 | SOURCE_DIR ${bsf_INSTALL_DIR} 49 | URL https://dilborceisv8p.cloudfront.net/bsf_2019.01.23_linux.tar.gz 50 | ) 51 | else() 52 | message(FATAL_ERROR "No prebuilt binaries available for this platform!") 53 | endif() 54 | 55 | FetchContent_Populate(bsfBinaries) 56 | endif() 57 | 58 | 59 | ############################################################################### 60 | # Add external libraries # 61 | ############################################################################### 62 | 63 | # Let CMake know where to find the Findbsf.cmake file (at current folder) 64 | set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}") 65 | 66 | if(NOT BSZENLIB_SKIP_FIND_BSF) 67 | if(BSZENLIB_BSF_SUBMODULE_PATH) 68 | # Optionally include bsf as cmake submodule for easier development on bsf 69 | add_subdirectory(${BSZENLIB_BSF_SUBMODULE_PATH} bsf) 70 | else() 71 | # Find bsf libraries and headers 72 | find_package(bsf REQUIRED) 73 | endif() 74 | endif() 75 | 76 | add_subdirectory(lib/ZenLib) 77 | 78 | ############################################################################### 79 | # Add main library # 80 | ############################################################################### 81 | add_library(BsZenLib 82 | src/ImportSkeletalMesh.cpp 83 | src/ImportStaticMesh.cpp 84 | src/ImportMorphMesh.cpp 85 | src/ImportTexture.cpp 86 | src/ImportMaterial.cpp 87 | src/ImportZEN.cpp 88 | src/ImportPath.cpp 89 | src/ImportAnimation.cpp 90 | src/ImportFont.cpp 91 | src/ZenResources.cpp 92 | src/ResourceManifest.cpp 93 | src/CacheUtility.cpp 94 | ) 95 | 96 | target_link_libraries(BsZenLib PRIVATE bsf daedalus zenload vdfs utils) 97 | target_include_directories(BsZenLib PRIVATE include/BsZenLib) 98 | 99 | target_link_libraries(BsZenLib PUBLIC vdfs) 100 | target_include_directories(BsZenLib PUBLIC include) 101 | 102 | # Make sure our calls to BS_LOG work 103 | target_compile_definitions(BsZenLib PRIVATE -DBS_LOG_VERBOSITY=LogVerbosity::Log) 104 | 105 | # target_link_libraries(BsZenLib PRIVATE bsfFreeImgImporter) 106 | # target_include_directories(BsZenLib PRIVATE lib/FreeImage) 107 | 108 | ############################################################################### 109 | # Add Samples, etc # 110 | ############################################################################### 111 | 112 | if (BSZENLIB_BUILD_SAMPLES) 113 | add_subdirectory(samples) 114 | endif() 115 | 116 | if (BSZENLIB_BUILD_DOCS) 117 | add_subdirectory(docs-source) 118 | endif() 119 | -------------------------------------------------------------------------------- /FindSphinx.cmake: -------------------------------------------------------------------------------- 1 | # CMake find_package() Module for Sphinx documentation generator 2 | # http://sphinx-doc.org/ 3 | # 4 | # Example usage: 5 | # 6 | # find_package(Sphinx) 7 | # 8 | # If successful the following variables will be defined 9 | # SPHINX_FOUND 10 | # SPHINX_EXECUTABLE 11 | 12 | find_program(SPHINX_EXECUTABLE 13 | NAMES sphinx-build sphinx-build2 14 | DOC "Path to sphinx-build executable") 15 | 16 | # Handle REQUIRED and QUIET arguments 17 | # this will also set SPHINX_FOUND to true if SPHINX_EXECUTABLE exists 18 | include(FindPackageHandleStandardArgs) 19 | find_package_handle_standard_args(Sphinx 20 | "Failed to locate sphinx-build executable" 21 | SPHINX_EXECUTABLE) 22 | 23 | # Provide options for controlling different types of output 24 | option(SPHINX_OUTPUT_HTML "Output standalone HTML files" ON) 25 | option(SPHINX_OUTPUT_MAN "Output man pages" ON) 26 | 27 | option(SPHINX_WARNINGS_AS_ERRORS "When building documentation treat warnings as errors" ON) -------------------------------------------------------------------------------- /Findbsf.cmake: -------------------------------------------------------------------------------- 1 | # Find bsf dependency 2 | # 3 | # This module defines 4 | # bsf_INCLUDE_DIRS 5 | # bsf_LIBRARIES 6 | # bsf_FOUND 7 | 8 | message(STATUS "Looking for bsf installation...") 9 | if(NOT bsf_INSTALL_DIR) 10 | set(bsf_INSTALL_DIR ${PROJECT_SOURCE_DIR}/Dependencies/bsf CACHE PATH "") 11 | endif() 12 | 13 | set(bsf_INCLUDE_SEARCH_DIRS "${bsf_INSTALL_DIR}/include") 14 | set(INCLUDE_FILES "bsfCore/BsCorePrerequisites.h") 15 | 16 | find_path(bsf_INCLUDE_DIR NAMES NAMES ${INCLUDE_FILES} PATHS ${bsf_INCLUDE_SEARCH_DIRS} NO_DEFAULT_PATH) 17 | find_path(bsf_INCLUDE_DIR NAMES NAMES ${INCLUDE_FILES} PATHS ${bsf_INCLUDE_SEARCH_DIRS}) 18 | 19 | if(bsf_INCLUDE_DIR) 20 | set(bsf_FOUND TRUE) 21 | else() 22 | message(STATUS "...Cannot find include file \"${INCLUDE_FILES}\" at path ${bsf_INCLUDE_SEARCH_DIRS}") 23 | set(bsf_FOUND FALSE) 24 | endif() 25 | 26 | # Add configuration specific search directories 27 | list(APPEND bsf_LIBRARY_RELEASE_SEARCH_DIRS "${bsf_INSTALL_DIR}/lib/Release") 28 | list(APPEND bsf_LIBRARY_DEBUG_SEARCH_DIRS "${bsf_INSTALL_DIR}/lib/Debug") 29 | 30 | # Add search directories with no specified configuration 31 | list(APPEND bsf_LIBRARY_RELEASE_SEARCH_DIRS "${bsf_INSTALL_DIR}/lib") 32 | list(APPEND bsf_LIBRARY_DEBUG_SEARCH_DIRS "${bsf_INSTALL_DIR}/lib") 33 | 34 | find_library(bsf_LIBRARY_RELEASE NAMES bsf PATHS ${bsf_LIBRARY_RELEASE_SEARCH_DIRS} NO_DEFAULT_PATH) 35 | find_library(bsf_LIBRARY_RELEASE NAMES bsf PATHS ${bsf_LIBRARY_RELEASE_SEARCH_DIRS}) 36 | 37 | find_library(bsf_LIBRARY_DEBUG NAMES bsf PATHS ${bsf_LIBRARY_DEBUG_SEARCH_DIRS} NO_DEFAULT_PATH) 38 | find_library(bsf_LIBRARY_DEBUG NAMES bsf PATHS ${bsf_LIBRARY_DEBUG_SEARCH_DIRS}) 39 | 40 | if(bsf_LIBRARY_RELEASE) 41 | if(NOT WIN32) 42 | add_library(bsf SHARED IMPORTED) 43 | else() 44 | add_library(bsf STATIC IMPORTED) 45 | endif() 46 | 47 | if(CMAKE_CONFIGURATION_TYPES) # Multiconfig generator? 48 | set_target_properties(bsf PROPERTIES IMPORTED_LOCATION_RELEASE "${bsf_LIBRARY_RELEASE}") 49 | set_target_properties(bsf PROPERTIES IMPORTED_LOCATION_RELWITHDEBINFO "${bsf_LIBRARY_RELEASE}") 50 | set_target_properties(bsf PROPERTIES IMPORTED_LOCATION_MINSIZEREL "${bsf_LIBRARY_RELEASE}") 51 | 52 | if(bsf_LIBRARY_DEBUG) 53 | set_target_properties(bsf PROPERTIES IMPORTED_LOCATION_DEBUG "${bsf_LIBRARY_DEBUG}") 54 | else() 55 | set_target_properties(bsf PROPERTIES IMPORTED_LOCATION_DEBUG "${bsf_LIBRARY_RELEASE}") 56 | endif() 57 | else() 58 | set_target_properties(bsf PROPERTIES IMPORTED_LOCATION "${bsf_LIBRARY_RELEASE}") 59 | endif() 60 | 61 | set(bsf_LIBRARIES bsf) 62 | else() 63 | set(bsf_FOUND FALSE) 64 | endif() 65 | 66 | mark_as_advanced(bsf_LIBRARY_RELEASE) 67 | mark_as_advanced(bsf_LIBRARY_DEBUG) 68 | 69 | if(NOT bsf_FOUND) 70 | if(bsf_FIND_REQUIRED) 71 | message(FATAL_ERROR "Cannot find bsf installation. Try modifying the bsf_INSTALL_DIR path.") 72 | elseif(NOT bsf_FIND_QUIETLY) 73 | message(WARNING "Cannot find bsf installation. Try modifying the bsf_INSTALL_DIR path.") 74 | endif() 75 | else() 76 | list(APPEND INCLUDE_DIRS "${bsf_INCLUDE_DIR}/bsfUtility") 77 | list(APPEND INCLUDE_DIRS "${bsf_INCLUDE_DIR}/bsfCore") 78 | list(APPEND INCLUDE_DIRS "${bsf_INCLUDE_DIR}/bsfEngine") 79 | 80 | set_target_properties(bsf PROPERTIES INTERFACE_INCLUDE_DIRECTORIES "${INCLUDE_DIRS}") 81 | mark_as_advanced(bsf_INSTALL_DIR) 82 | message(STATUS "...bsf OK.") 83 | endif() 84 | 85 | mark_as_advanced(bsf_INCLUDE_DIR) 86 | set(bsf_INCLUDE_DIRS ${bsf_INCLUDE_DIR}) 87 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # BsZenLib 2 | 3 | Importers for files from the games Gothic and Gothic II for the [bs:framework](https://github.com/GameFoundry/bsf). 4 | 5 | # Documentation 6 | 7 | https://regoth-project.github.io/BsZenLib/index.html 8 | 9 | # Building 10 | 11 | You will need the bsframework for building BsZenLib. You can either download or compile it yourself, or have CMake download prebuilt binaries 12 | for you. 13 | 14 | ## Let CMake download bs:f 15 | 16 | This will download all needed dependencies automatically. 17 | 18 | ```sh 19 | git clone --recursive https://github.com/REGoth-project/BsZenLib.git 20 | 21 | cd BsZenLib 22 | mkdir build 23 | cd build 24 | cmake -DBSZENLIB_DOWNLOAD_BSF_BINARIES=On .. 25 | cmake --build . -j 8 26 | ``` 27 | 28 | ## With external bs:f installation 29 | 30 | For this you will have to have an external bs:f-installation: 31 | 32 | ```sh 33 | git clone --recursive https://github.com/REGoth-project/BsZenLib.git 34 | 35 | cd BsZenLib 36 | mkdir build 37 | cd build 38 | cmake -bsf_INSTALL_DIR=path/to/bsf .. 39 | cmake --build . -j 8 40 | ``` 41 | 42 | ## Note for Windows users 43 | 44 | Make sure to have CMake use the `Win64` kind of the Visual-Studio generator by passing `-G"Visual Studio 15 2017 Win64"` to it. 45 | Otherwise linking with bs:f will likely fail, since the prebuilt binaries are all 64-bit. 46 | 47 | ## Building the Documentation 48 | 49 | You will need: 50 | 51 | * Doxygen 52 | * Python 53 | * Sphinx (install via `pip install sphinx`) 54 | * Breathe (install via `pip install breathe`) 55 | 56 | With a cmake-project generated, run this from within the `build`-directory: 57 | 58 | ```sh 59 | cmake --build . --target BsZenLib_docs 60 | ``` 61 | 62 | This will generate the documentation as HTML into `build/docs-source/html`. 63 | To update Github-pages, copy the contents of that directory into the `docs` directory at the repository root. 64 | -------------------------------------------------------------------------------- /appveyor.yml: -------------------------------------------------------------------------------- 1 | version: 0.1.{build} 2 | image: Visual Studio 2017 3 | 4 | build_script: 5 | - git submodule update --init --recursive 6 | - 7 | - mkdir build 8 | - cd build 9 | - cmake -G"Visual Studio 15 2017 Win64" -DBSZENLIB_DOWNLOAD_BSF_BINARIES=On -DCMAKE_BUILD_TYPE=Release .. 10 | - cmake --build . --config Release -j 4 11 | - 12 | - cp -r bsf-binaries/bin/* bin/Release 13 | - 7z a BsZenLib.zip bin/ 14 | - 15 | - mv BsZenLib.zip BsZenLib-%appveyor_repo_branch%-%APPVEYOR_BUILD_VERSION%-win32.zip 16 | - appveyor PushArtifact BsZenLib-%appveyor_repo_branch%-%APPVEYOR_BUILD_VERSION%-win32.zip 17 | 18 | -------------------------------------------------------------------------------- /content/shaders/World.bsl: -------------------------------------------------------------------------------- 1 | #include "$ENGINE$\GBufferOutput.bslinc" 2 | #include "$ENGINE$\PerCameraData.bslinc" 3 | #include "$ENGINE$\PerObjectData.bslinc" 4 | 5 | shader Surface 6 | { 7 | mixin GBufferOutput; 8 | mixin PerCameraData; 9 | mixin PerObjectData; 10 | 11 | code 12 | { 13 | [alias(gAlbedoTex)] 14 | SamplerState gAlbedoSamp; 15 | 16 | Texture2D gAlbedoTex = white; 17 | 18 | struct ZenVertexInput 19 | { 20 | float3 position : POSITION; 21 | float2 uv0 : TEXCOORD0; 22 | float3 normal : NORMAL; 23 | float4 color : COLOR; 24 | }; 25 | 26 | struct ZenVStoFS 27 | { 28 | // Position in clip space (multiplied by world-view-projection matrix) 29 | float4 position : SV_Position; 30 | 31 | // Texture coordinates 32 | float2 uv0 : TEXCOORD0; 33 | 34 | // Position in world space (multiplied by the world matrix) 35 | float3 worldPosition : TEXCOORD1; 36 | 37 | // Normal vector in world space (multiplied by the world matrix) 38 | float3 worldNormal : NORMAL; 39 | 40 | // Per-vertex color 41 | float4 color : COLOR; 42 | }; 43 | 44 | 45 | ZenVStoFS vsmain(ZenVertexInput input) 46 | { 47 | ZenVStoFS output; 48 | 49 | float4 worldPosition = mul(gMatWorld, float4(input.position, 1.0f)); 50 | 51 | output.uv0 = input.uv0; 52 | output.worldPosition = worldPosition.xyz; 53 | output.position = mul(gMatViewProj, worldPosition); 54 | output.worldNormal = mul((float3x3)gMatWorld, input.normal); 55 | output.color = float4(input.color.rrr, 1.0); 56 | 57 | return output; 58 | } 59 | 60 | void fsmain( 61 | in ZenVStoFS input, 62 | out float3 OutSceneColor : SV_Target0, 63 | out float4 OutGBufferA : SV_Target1, 64 | out float4 OutGBufferB : SV_Target2, 65 | out float2 OutGBufferC : SV_Target3, 66 | out float OutGBufferD : SV_Target4) 67 | { 68 | float2 uv = input.uv0; 69 | 70 | SurfaceData surfaceData; 71 | surfaceData.albedo = gAlbedoTex.Sample(gAlbedoSamp, uv); 72 | surfaceData.worldNormal.xyz = input.worldNormal; 73 | surfaceData.roughness = 1.0f; 74 | surfaceData.metalness = 0.0f; 75 | surfaceData.mask = gLayer; 76 | 77 | clip(surfaceData.albedo.a - 0.5f); 78 | 79 | encodeGBuffer(surfaceData, OutGBufferA, OutGBufferB, OutGBufferC, OutGBufferD); 80 | 81 | OutSceneColor = surfaceData.albedo.rgb * input.color.rgb * 0.1f; 82 | } 83 | }; 84 | }; 85 | 86 | subshader DeferredDirectLighting 87 | { 88 | // An example shader that implements the basic Lambert BRDF 89 | mixin StandardBRDF 90 | { 91 | code 92 | { 93 | float3 evaluateStandardBRDF(float3 V, float3 L, float specLobeEnergy, SurfaceData surfaceData) 94 | { 95 | return surfaceData.albedo.rgb / 3.14f; 96 | } 97 | }; 98 | }; 99 | 100 | }; -------------------------------------------------------------------------------- /docs-source/.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "restructuredtext.confPath": "" 3 | } -------------------------------------------------------------------------------- /docs-source/CMakeLists.txt: -------------------------------------------------------------------------------- 1 | 2 | find_package(Doxygen) 3 | find_package(Sphinx) 4 | 5 | if (DOXYGEN_FOUND AND SPHINX_FOUND) 6 | 7 | # Configure Doxygen paths 8 | set(DOXYGEN_IN ${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in) 9 | set(DOXYGEN_OUT ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile) 10 | configure_file(${DOXYGEN_IN} ${DOXYGEN_OUT} @ONLY) 11 | 12 | # Build Doxygen XML, which can be read by Sphinx using Breathe 13 | add_custom_target( doc_doxygen ALL 14 | COMMAND ${DOXYGEN_EXECUTABLE} ${DOXYGEN_OUT} 15 | WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 16 | COMMENT "Generating API documentation with Doxygen" 17 | VERBATIM ) 18 | 19 | # Configure Sphinx 20 | set(SPHINX_WARNINGS_AS_ERRORS OFF) 21 | 22 | if(NOT DEFINED SPHINX_THEME) 23 | set(SPHINX_THEME sphinx_rtd_theme) 24 | endif() 25 | 26 | if(NOT DEFINED SPHINX_THEME_DIR) 27 | set(SPHINX_THEME_DIR) 28 | endif() 29 | 30 | # configured documentation tools and intermediate build results 31 | set(BINARY_BUILD_DIR "${CMAKE_CURRENT_BINARY_DIR}/_build") 32 | 33 | # Sphinx cache with pickled ReST documents 34 | set(SPHINX_CACHE_DIR "${CMAKE_CURRENT_BINARY_DIR}/_doctrees") 35 | 36 | # HTML output directory 37 | set(SPHINX_HTML_DIR "${CMAKE_CURRENT_BINARY_DIR}/html") 38 | 39 | # Make sure Breathe can find the generated XML 40 | set(DOXYGEN_XML_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/doc-doxygen/xml") 41 | 42 | configure_file( 43 | "${CMAKE_CURRENT_SOURCE_DIR}/conf.py.in" 44 | "${BINARY_BUILD_DIR}/conf.py" 45 | @ONLY) 46 | 47 | add_custom_target(BsZenLib_docs 48 | ${SPHINX_EXECUTABLE} 49 | -q -b html 50 | -c "${BINARY_BUILD_DIR}" 51 | -d "${SPHINX_CACHE_DIR}" 52 | "${CMAKE_CURRENT_SOURCE_DIR}" 53 | "${SPHINX_HTML_DIR}" 54 | COMMENT "Building HTML documentation with Sphinx" 55 | DEPENDS doc_doxygen) 56 | 57 | endif() 58 | -------------------------------------------------------------------------------- /docs-source/conf.py.in: -------------------------------------------------------------------------------- 1 | # -*- coding: utf-8 -*- 2 | # 3 | # Configuration file for the Sphinx documentation builder. 4 | # 5 | # This file does only contain a selection of the most common options. For a 6 | # full list see the documentation: 7 | # http://www.sphinx-doc.org/en/master/config 8 | 9 | # -- Path setup -------------------------------------------------------------- 10 | 11 | # If extensions (or modules to document with autodoc) are in another directory, 12 | # add these directories to sys.path here. If the directory is relative to the 13 | # documentation root, use os.path.abspath to make it absolute, like shown here. 14 | # 15 | # import os 16 | # import sys 17 | # sys.path.insert(0, os.path.abspath('.')) 18 | 19 | 20 | # -- Project information ----------------------------------------------------- 21 | 22 | project = 'BsZenLib' 23 | copyright = '2019, Andre Taulien' 24 | author = 'Andre Taulien' 25 | 26 | # The short X.Y version 27 | version = '' 28 | # The full version, including alpha/beta/rc tags 29 | release = '' 30 | 31 | 32 | # -- General configuration --------------------------------------------------- 33 | 34 | # If your documentation needs a minimal Sphinx version, state it here. 35 | # 36 | # needs_sphinx = '1.0' 37 | 38 | # Add any Sphinx extension module names here, as strings. They can be 39 | # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom 40 | # ones. 41 | extensions = [ 42 | 'breathe' 43 | ] 44 | 45 | # Add any paths that contain templates here, relative to this directory. 46 | templates_path = ['.templates'] 47 | 48 | # The suffix(es) of source filenames. 49 | # You can specify multiple suffix as a list of string: 50 | # 51 | # source_suffix = ['.rst', '.md'] 52 | source_suffix = '.rst' 53 | 54 | # The master toctree document. 55 | master_doc = 'index' 56 | 57 | # The language for content autogenerated by Sphinx. Refer to documentation 58 | # for a list of supported languages. 59 | # 60 | # This is also used if you do content translation via gettext catalogs. 61 | # Usually you set "language" from the command line for these cases. 62 | language = None 63 | 64 | # List of patterns, relative to source directory, that match files and 65 | # directories to ignore when looking for source files. 66 | # This pattern also affects html_static_path and html_extra_path. 67 | exclude_patterns = [] 68 | 69 | # The name of the Pygments (syntax highlighting) style to use. 70 | pygments_style = None 71 | 72 | 73 | # -- Options for HTML output ------------------------------------------------- 74 | 75 | # The theme to use for HTML and HTML Help pages. See the documentation for 76 | # a list of builtin themes. 77 | # 78 | html_theme = '@SPHINX_THEME@' 79 | html_theme_path = '@SPHINX_THEME_DIR@' 80 | 81 | # Theme options are theme-specific and customize the look and feel of a theme 82 | # further. For a list of options available for each theme, see the 83 | # documentation. 84 | # 85 | # html_theme_options = {} 86 | 87 | # Add any paths that contain custom static files (such as style sheets) here, 88 | # relative to this directory. They are copied after the builtin static files, 89 | # so a file named "default.css" will overwrite the builtin "default.css". 90 | html_static_path = ['.static'] 91 | 92 | # Custom sidebar templates, must be a dictionary that maps document names 93 | # to template names. 94 | # 95 | # The default sidebars (for documents that don't match any pattern) are 96 | # defined by theme itself. Builtin themes are using these templates by 97 | # default: ``['localtoc.html', 'relations.html', 'sourcelink.html', 98 | # 'searchbox.html']``. 99 | # 100 | # html_sidebars = {} 101 | 102 | 103 | # -- Options for HTMLHelp output --------------------------------------------- 104 | 105 | # Output file base name for HTML help builder. 106 | htmlhelp_basename = 'BsZenLibdoc' 107 | 108 | 109 | # -- Options for LaTeX output ------------------------------------------------ 110 | 111 | latex_elements = { 112 | # The paper size ('letterpaper' or 'a4paper'). 113 | # 114 | # 'papersize': 'letterpaper', 115 | 116 | # The font size ('10pt', '11pt' or '12pt'). 117 | # 118 | # 'pointsize': '10pt', 119 | 120 | # Additional stuff for the LaTeX preamble. 121 | # 122 | # 'preamble': '', 123 | 124 | # Latex figure (float) alignment 125 | # 126 | # 'figure_align': 'htbp', 127 | } 128 | 129 | # Grouping the document tree into LaTeX files. List of tuples 130 | # (source start file, target name, title, 131 | # author, documentclass [howto, manual, or own class]). 132 | latex_documents = [ 133 | (master_doc, 'BsZenLib.tex', 'BsZenLib Documentation', 134 | 'Andre Taulien', 'manual'), 135 | ] 136 | 137 | 138 | # -- Options for manual page output ------------------------------------------ 139 | 140 | # One entry per manual page. List of tuples 141 | # (source start file, name, description, authors, manual section). 142 | man_pages = [ 143 | (master_doc, 'bszenlib', 'BsZenLib Documentation', 144 | [author], 1) 145 | ] 146 | 147 | 148 | # -- Options for Texinfo output ---------------------------------------------- 149 | 150 | # Grouping the document tree into Texinfo files. List of tuples 151 | # (source start file, target name, title, author, 152 | # dir menu entry, description, category) 153 | texinfo_documents = [ 154 | (master_doc, 'BsZenLib', 'BsZenLib Documentation', 155 | author, 'BsZenLib', 'One line description of project.', 156 | 'Miscellaneous'), 157 | ] 158 | 159 | 160 | # -- Options for Epub output ------------------------------------------------- 161 | 162 | # Bibliographic Dublin Core info. 163 | epub_title = project 164 | 165 | # The unique identifier of the text. This can be a ISBN number 166 | # or the project homepage. 167 | # 168 | # epub_identifier = '' 169 | 170 | # A unique identification for the text. 171 | # 172 | # epub_uid = '' 173 | 174 | # A list of files that should not be packed into the epub file. 175 | epub_exclude_files = ['search.html'] 176 | 177 | 178 | # -- Extension configuration ------------------------------------------------- 179 | 180 | # -- Breathe -- 181 | breathe_projects = { "BsZenLib": "@DOXYGEN_XML_OUTPUT_DIR@" } 182 | breathe_default_project = "BsZenLib" -------------------------------------------------------------------------------- /docs-source/content/caching.rst: -------------------------------------------------------------------------------- 1 | Caching 2 | ======= 3 | 4 | For better compatibility with the bs::framework, BsZenLib can *cache* the original 5 | games files in the format bs::f expects. 6 | Since bs::f does not support using the actual Importer-modules with content comming 7 | from a package format, BsZenLib has to craft the bs::f resources manually. After doing 8 | so, it will save the imported resources into the ``cache``-directory. 9 | 10 | Example 11 | ------- 12 | 13 | To generate the cache for a texture, you would use the functions 14 | described in the chapter :ref:`import-textures`. 15 | You will also need to set up a virtual file index containing the texture you 16 | want to import. See :ref:`vdfs` on how to populate one. 17 | 18 | Suppose you would want to import the texture ``STONE.TGA``: 19 | 20 | .. code-block:: c 21 | 22 | #include 23 | 24 | // ... 25 | 26 | HTexture ImportStoneTga() 27 | { 28 | VDFS::FileIndex vdfs = ...; 29 | 30 | return BsZenLib::ImportAndCacheTexture("STONE.TGA", vdfs); 31 | } 32 | 33 | This will search for the compiled version of that texture (``STONE-C.TEX``), load it 34 | and write it to the cache. -------------------------------------------------------------------------------- /docs-source/content/materials.rst: -------------------------------------------------------------------------------- 1 | Importing Materials 2 | =================== 3 | 4 | .. doxygenfile:: ImportMaterial.hpp 5 | -------------------------------------------------------------------------------- /docs-source/content/morphmeshes.rst: -------------------------------------------------------------------------------- 1 | Importing Morph Meshes 2 | ====================== 3 | 4 | .. doxygenfile:: ImportMorphMesh.hpp 5 | -------------------------------------------------------------------------------- /docs-source/content/skeletalmeshes.rst: -------------------------------------------------------------------------------- 1 | Importing Skeletal Meshes 2 | ========================= 3 | 4 | .. doxygenfile:: ImportSkeletalMesh.hpp 5 | -------------------------------------------------------------------------------- /docs-source/content/staticmeshes.rst: -------------------------------------------------------------------------------- 1 | Importing Static Meshes 2 | ======================= 3 | 4 | 5 | The following declarations can be found in ``ImportStaticMesh.hpp``: 6 | 7 | .. doxygenfile:: ImportStaticMesh.hpp 8 | -------------------------------------------------------------------------------- /docs-source/content/textures.rst: -------------------------------------------------------------------------------- 1 | .. _import-textures: 2 | 3 | Importing Textures 4 | ================== 5 | 6 | .. doxygenfile:: ImportTexture.hpp 7 | -------------------------------------------------------------------------------- /docs-source/content/vdfs.rst: -------------------------------------------------------------------------------- 1 | 2 | .. _vdfs: 3 | 4 | Virtual File System 5 | =================== 6 | 7 | Gothic stores it's files in something called a *Virtual File System*, or short *VDFS*. It is built out of multiple packages, 8 | which are all loaded into one file index. Think of it as putting all textures, meshes and other content into different ZIP-Archives 9 | and have the engine merge them all during load-time. 10 | 11 | The package format used by Gothic is *not* ZIP, but an uncompressed proprietary format. We won't get into details about how that 12 | format is structured here. 13 | 14 | Creating a VDFS-File index 15 | -------------------------- 16 | 17 | To do anything with this library, you need to populate a Virtual File Index with the packages from the original game, which is rather 18 | straight forward: 19 | 20 | First, you need to include the VDFS-module from ZenLib: 21 | 22 | .. code-block:: cpp 23 | 24 | #include 25 | 26 | In `main`, you then need to initialize the VDFS with `argv[0]`, which is the path to the running executable. This is a detail of the underlaying PhysFS library. 27 | 28 | .. code-block:: cpp 29 | 30 | VDFS::FileIndex::initVDFS(argv[0]); 31 | 32 | Now you can create a FileIndex and load some packages from your games `DATA`-folder into it: 33 | 34 | .. code-block:: cpp 35 | 36 | const std::string dataDir = "D:/Games/Gothic II/Data"; 37 | 38 | VDFS::FileIndex vdfs; 39 | vdfs.loadVDF(dataDir + "/Meshes.vdf"); 40 | vdfs.loadVDF(dataDir + "/Textures.vdf"); 41 | vdfs.loadVDF(dataDir + "/Anims.vdf"); 42 | vdfs.finalizeLoad(); 43 | 44 | With the file index populated, you can now access the files stored inside the packages: 45 | 46 | .. code-block:: cpp 47 | 48 | for(std::string file : vdf.getKnownFiles()) 49 | { 50 | std::cout << file << std::endl; 51 | } 52 | 53 | The full example: 54 | 55 | .. code-block:: cpp 56 | 57 | #include 58 | #include 59 | 60 | int main(int argc, char** argv) 61 | { 62 | VDFS::FileIndex::initVDFS(argv[0]); 63 | 64 | const std::string dataDir = "D:/Games/Gothic II/Data"; 65 | 66 | VDFS::FileIndex vdfs; 67 | vdfs.loadVDF(dataDir + "/Meshes.vdf"); 68 | vdfs.loadVDF(dataDir + "/Textures.vdf"); 69 | vdfs.loadVDF(dataDir + "/Anims.vdf"); 70 | vdfs.finalizeLoad(); 71 | 72 | for(std::string file : vdf.getKnownFiles()) 73 | { 74 | std::cout << file << std::endl; 75 | } 76 | 77 | return 0; 78 | } 79 | 80 | 81 | Importing content using a FileIndex 82 | ----------------------------------- 83 | 84 | A populated VDFS FileIndex can now be used to import files, as an example, this is how one would import a texture: 85 | 86 | .. code-block:: cpp 87 | 88 | HTexture wood = BsZenLib::ImportTexture("WOOD.TGA", vdfs); 89 | 90 | The a file matching `WOOD.TGA` must be registered inside the passed VDFS FileIndex. 91 | 92 | .. note:: The Texture-Importer searches for `WOOD.TGA` *and* `WOOD-C.TEX` automatically. -------------------------------------------------------------------------------- /docs-source/index.rst: -------------------------------------------------------------------------------- 1 | .. BsZenLib documentation master file, created by 2 | sphinx-quickstart on Fri Jan 4 19:24:52 2019. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to BsZenLib's documentation! 7 | ==================================== 8 | 9 | .. toctree:: 10 | :maxdepth: 2 11 | :caption: Contents: 12 | 13 | content/caching 14 | content/vdfs 15 | content/textures 16 | content/staticmeshes 17 | content/morphmeshes 18 | content/skeletalmeshes 19 | content/materials 20 | 21 | 22 | Indices and tables 23 | ================== 24 | 25 | * :ref:`genindex` 26 | * :ref:`modindex` 27 | * :ref:`search` 28 | 29 | -------------------------------------------------------------------------------- /docs/.buildinfo: -------------------------------------------------------------------------------- 1 | # Sphinx build info version 1 2 | # This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. 3 | config: 85016884a47278ed3a867eb9f803ed75 4 | tags: 645f666f9bcd5a90fca523b33c5a78b7 5 | -------------------------------------------------------------------------------- /docs/.nojekyll: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/.nojekyll -------------------------------------------------------------------------------- /docs/_sources/content/caching.rst.txt: -------------------------------------------------------------------------------- 1 | Caching 2 | ======= 3 | 4 | For better compatibility with the bs::framework, BsZenLib can *cache* the original 5 | games files in the format bs::f expects. 6 | Since bs::f does not support using the actual Importer-modules with content comming 7 | from a package format, BsZenLib has to craft the bs::f resources manually. After doing 8 | so, it will save the imported resources into the ``cache``-directory. 9 | 10 | Example 11 | ------- 12 | 13 | To generate the cache for a texture, you would use the functions 14 | described in the chapter :ref:`import-textures`. 15 | You will also need to set up a virtual file index containing the texture you 16 | want to import. See :ref:`vdfs` on how to populate one. 17 | 18 | Suppose you would want to import the texture ``STONE.TGA``: 19 | 20 | .. code-block:: c 21 | 22 | #include 23 | 24 | // ... 25 | 26 | HTexture ImportStoneTga() 27 | { 28 | VDFS::FileIndex vdfs = ...; 29 | 30 | return BsZenLib::ImportAndCacheTexture("STONE.TGA", vdfs); 31 | } 32 | 33 | This will search for the compiled version of that texture (``STONE-C.TEX``), load it 34 | and write it to the cache. -------------------------------------------------------------------------------- /docs/_sources/content/importers.rst.txt: -------------------------------------------------------------------------------- 1 | Importers 2 | ========= -------------------------------------------------------------------------------- /docs/_sources/content/materials.rst.txt: -------------------------------------------------------------------------------- 1 | Importing Materials 2 | =================== 3 | 4 | .. doxygenfile:: ImportMaterial.hpp 5 | -------------------------------------------------------------------------------- /docs/_sources/content/morphmeshes.rst.txt: -------------------------------------------------------------------------------- 1 | Importing Morph Meshes 2 | ====================== 3 | 4 | .. doxygenfile:: ImportMorphMesh.hpp 5 | -------------------------------------------------------------------------------- /docs/_sources/content/skeletalmeshes.rst.txt: -------------------------------------------------------------------------------- 1 | Importing Skeletal Meshes 2 | ========================= 3 | 4 | .. doxygenfile:: ImportSkeletalMesh.hpp 5 | -------------------------------------------------------------------------------- /docs/_sources/content/staticmeshes.rst.txt: -------------------------------------------------------------------------------- 1 | Importing Static Meshes 2 | ======================= 3 | 4 | 5 | The following declarations can be found in ``ImportStaticMesh.hpp``: 6 | 7 | .. doxygenfile:: ImportStaticMesh.hpp 8 | -------------------------------------------------------------------------------- /docs/_sources/content/textures.rst.txt: -------------------------------------------------------------------------------- 1 | .. _import-textures: 2 | 3 | Importing Textures 4 | ================== 5 | 6 | .. doxygenfile:: ImportTexture.hpp 7 | -------------------------------------------------------------------------------- /docs/_sources/content/vdfs.rst.txt: -------------------------------------------------------------------------------- 1 | 2 | .. _vdfs: 3 | 4 | Virtual File System 5 | =================== 6 | 7 | Gothic stores it's files in something called a *Virtual File System*, or short *VDFS*. It is built out of multiple packages, 8 | which are all loaded into one file index. Think of it as putting all textures, meshes and other content into different ZIP-Archives 9 | and have the engine merge them all during load-time. 10 | 11 | The package format used by Gothic is *not* ZIP, but an uncompressed proprietary format. We won't get into details about how that 12 | format is structured here. 13 | 14 | Creating a VDFS-File index 15 | -------------------------- 16 | 17 | To do anything with this library, you need to populate a Virtual File Index with the packages from the original game, which is rather 18 | straight forward: 19 | 20 | First, you need to include the VDFS-module from ZenLib: 21 | 22 | .. code-block:: cpp 23 | 24 | #include 25 | 26 | In `main`, you then need to initialize the VDFS with `argv[0]`, which is the path to the running executable. This is a detail of the underlaying PhysFS library. 27 | 28 | .. code-block:: cpp 29 | 30 | VDFS::FileIndex::initVDFS(argv[0]); 31 | 32 | Now you can create a FileIndex and load some packages from your games `DATA`-folder into it: 33 | 34 | .. code-block:: cpp 35 | 36 | const std::string dataDir = "D:/Games/Gothic II/Data"; 37 | 38 | VDFS::FileIndex vdfs; 39 | vdfs.loadVDF(dataDir + "/Meshes.vdf"); 40 | vdfs.loadVDF(dataDir + "/Textures.vdf"); 41 | vdfs.loadVDF(dataDir + "/Anims.vdf"); 42 | vdfs.finalizeLoad(); 43 | 44 | With the file index populated, you can now access the files stored inside the packages: 45 | 46 | .. code-block:: cpp 47 | 48 | for(std::string file : vdf.getKnownFiles()) 49 | { 50 | std::cout << file << std::endl; 51 | } 52 | 53 | The full example: 54 | 55 | .. code-block:: cpp 56 | 57 | #include 58 | #include 59 | 60 | int main(int argc, char** argv) 61 | { 62 | VDFS::FileIndex::initVDFS(argv[0]); 63 | 64 | const std::string dataDir = "D:/Games/Gothic II/Data"; 65 | 66 | VDFS::FileIndex vdfs; 67 | vdfs.loadVDF(dataDir + "/Meshes.vdf"); 68 | vdfs.loadVDF(dataDir + "/Textures.vdf"); 69 | vdfs.loadVDF(dataDir + "/Anims.vdf"); 70 | vdfs.finalizeLoad(); 71 | 72 | for(std::string file : vdf.getKnownFiles()) 73 | { 74 | std::cout << file << std::endl; 75 | } 76 | 77 | return 0; 78 | } 79 | 80 | 81 | Importing content using a FileIndex 82 | ----------------------------------- 83 | 84 | A populated VDFS FileIndex can now be used to import files, as an example, this is how one would import a texture: 85 | 86 | .. code-block:: cpp 87 | 88 | HTexture wood = BsZenLib::ImportTexture("WOOD.TGA", vdfs); 89 | 90 | The a file matching `WOOD.TGA` must be registered inside the passed VDFS FileIndex. 91 | 92 | .. note:: The Texture-Importer searches for `WOOD.TGA` *and* `WOOD-C.TEX` automatically. -------------------------------------------------------------------------------- /docs/_sources/index.rst.txt: -------------------------------------------------------------------------------- 1 | .. BsZenLib documentation master file, created by 2 | sphinx-quickstart on Fri Jan 4 19:24:52 2019. 3 | You can adapt this file completely to your liking, but it should at least 4 | contain the root `toctree` directive. 5 | 6 | Welcome to BsZenLib's documentation! 7 | ==================================== 8 | 9 | .. toctree:: 10 | :maxdepth: 2 11 | :caption: Contents: 12 | 13 | content/caching 14 | content/vdfs 15 | content/textures 16 | content/staticmeshes 17 | content/morphmeshes 18 | content/skeletalmeshes 19 | content/materials 20 | 21 | 22 | Indices and tables 23 | ================== 24 | 25 | * :ref:`genindex` 26 | * :ref:`modindex` 27 | * :ref:`search` 28 | 29 | -------------------------------------------------------------------------------- /docs/_sources/modindex/importers.rst.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_sources/modindex/importers.rst.txt -------------------------------------------------------------------------------- /docs/_sources/modindex/textures.rst.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_sources/modindex/textures.rst.txt -------------------------------------------------------------------------------- /docs/_static/ajax-loader.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/ajax-loader.gif -------------------------------------------------------------------------------- /docs/_static/classic.css: -------------------------------------------------------------------------------- 1 | /* 2 | * classic.css_t 3 | * ~~~~~~~~~~~~~ 4 | * 5 | * Sphinx stylesheet -- classic theme. 6 | * 7 | * :copyright: Copyright 2007-2018 by the Sphinx team, see AUTHORS. 8 | * :license: BSD, see LICENSE for details. 9 | * 10 | */ 11 | 12 | @import url("basic.css"); 13 | 14 | /* -- page layout ----------------------------------------------------------- */ 15 | 16 | body { 17 | font-family: sans-serif; 18 | font-size: 100%; 19 | background-color: #11303d; 20 | color: #000; 21 | margin: 0; 22 | padding: 0; 23 | } 24 | 25 | div.document { 26 | background-color: #1c4e63; 27 | } 28 | 29 | div.documentwrapper { 30 | float: left; 31 | width: 100%; 32 | } 33 | 34 | div.bodywrapper { 35 | margin: 0 0 0 230px; 36 | } 37 | 38 | div.body { 39 | background-color: #ffffff; 40 | color: #000000; 41 | padding: 0 20px 30px 20px; 42 | } 43 | 44 | div.footer { 45 | color: #ffffff; 46 | width: 100%; 47 | padding: 9px 0 9px 0; 48 | text-align: center; 49 | font-size: 75%; 50 | } 51 | 52 | div.footer a { 53 | color: #ffffff; 54 | text-decoration: underline; 55 | } 56 | 57 | div.related { 58 | background-color: #133f52; 59 | line-height: 30px; 60 | color: #ffffff; 61 | } 62 | 63 | div.related a { 64 | color: #ffffff; 65 | } 66 | 67 | div.sphinxsidebar { 68 | } 69 | 70 | div.sphinxsidebar h3 { 71 | font-family: 'Trebuchet MS', sans-serif; 72 | color: #ffffff; 73 | font-size: 1.4em; 74 | font-weight: normal; 75 | margin: 0; 76 | padding: 0; 77 | } 78 | 79 | div.sphinxsidebar h3 a { 80 | color: #ffffff; 81 | } 82 | 83 | div.sphinxsidebar h4 { 84 | font-family: 'Trebuchet MS', sans-serif; 85 | color: #ffffff; 86 | font-size: 1.3em; 87 | font-weight: normal; 88 | margin: 5px 0 0 0; 89 | padding: 0; 90 | } 91 | 92 | div.sphinxsidebar p { 93 | color: #ffffff; 94 | } 95 | 96 | div.sphinxsidebar p.topless { 97 | margin: 5px 10px 10px 10px; 98 | } 99 | 100 | div.sphinxsidebar ul { 101 | margin: 10px; 102 | padding: 0; 103 | color: #ffffff; 104 | } 105 | 106 | div.sphinxsidebar a { 107 | color: #98dbcc; 108 | } 109 | 110 | div.sphinxsidebar input { 111 | border: 1px solid #98dbcc; 112 | font-family: sans-serif; 113 | font-size: 1em; 114 | } 115 | 116 | 117 | 118 | /* -- hyperlink styles ------------------------------------------------------ */ 119 | 120 | a { 121 | color: #355f7c; 122 | text-decoration: none; 123 | } 124 | 125 | a:visited { 126 | color: #355f7c; 127 | text-decoration: none; 128 | } 129 | 130 | a:hover { 131 | text-decoration: underline; 132 | } 133 | 134 | 135 | 136 | /* -- body styles ----------------------------------------------------------- */ 137 | 138 | div.body h1, 139 | div.body h2, 140 | div.body h3, 141 | div.body h4, 142 | div.body h5, 143 | div.body h6 { 144 | font-family: 'Trebuchet MS', sans-serif; 145 | background-color: #f2f2f2; 146 | font-weight: normal; 147 | color: #20435c; 148 | border-bottom: 1px solid #ccc; 149 | margin: 20px -20px 10px -20px; 150 | padding: 3px 0 3px 10px; 151 | } 152 | 153 | div.body h1 { margin-top: 0; font-size: 200%; } 154 | div.body h2 { font-size: 160%; } 155 | div.body h3 { font-size: 140%; } 156 | div.body h4 { font-size: 120%; } 157 | div.body h5 { font-size: 110%; } 158 | div.body h6 { font-size: 100%; } 159 | 160 | a.headerlink { 161 | color: #c60f0f; 162 | font-size: 0.8em; 163 | padding: 0 4px 0 4px; 164 | text-decoration: none; 165 | } 166 | 167 | a.headerlink:hover { 168 | background-color: #c60f0f; 169 | color: white; 170 | } 171 | 172 | div.body p, div.body dd, div.body li, div.body blockquote { 173 | text-align: justify; 174 | line-height: 130%; 175 | } 176 | 177 | div.admonition p.admonition-title + p { 178 | display: inline; 179 | } 180 | 181 | div.admonition p { 182 | margin-bottom: 5px; 183 | } 184 | 185 | div.admonition pre { 186 | margin-bottom: 5px; 187 | } 188 | 189 | div.admonition ul, div.admonition ol { 190 | margin-bottom: 5px; 191 | } 192 | 193 | div.note { 194 | background-color: #eee; 195 | border: 1px solid #ccc; 196 | } 197 | 198 | div.seealso { 199 | background-color: #ffc; 200 | border: 1px solid #ff6; 201 | } 202 | 203 | div.topic { 204 | background-color: #eee; 205 | } 206 | 207 | div.warning { 208 | background-color: #ffe4e4; 209 | border: 1px solid #f66; 210 | } 211 | 212 | p.admonition-title { 213 | display: inline; 214 | } 215 | 216 | p.admonition-title:after { 217 | content: ":"; 218 | } 219 | 220 | pre { 221 | padding: 5px; 222 | background-color: #eeffcc; 223 | color: #333333; 224 | line-height: 120%; 225 | border: 1px solid #ac9; 226 | border-left: none; 227 | border-right: none; 228 | } 229 | 230 | code { 231 | background-color: #ecf0f3; 232 | padding: 0 1px 0 1px; 233 | font-size: 0.95em; 234 | } 235 | 236 | th { 237 | background-color: #ede; 238 | } 239 | 240 | .warning code { 241 | background: #efc2c2; 242 | } 243 | 244 | .note code { 245 | background: #d6d6d6; 246 | } 247 | 248 | .viewcode-back { 249 | font-family: sans-serif; 250 | } 251 | 252 | div.viewcode-block:target { 253 | background-color: #f4debf; 254 | border-top: 1px solid #ac9; 255 | border-bottom: 1px solid #ac9; 256 | } 257 | 258 | div.code-block-caption { 259 | color: #efefef; 260 | background-color: #1c4e63; 261 | } -------------------------------------------------------------------------------- /docs/_static/comment-bright.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/comment-bright.png -------------------------------------------------------------------------------- /docs/_static/comment-close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/comment-close.png -------------------------------------------------------------------------------- /docs/_static/comment.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/comment.png -------------------------------------------------------------------------------- /docs/_static/css/badge_only.css: -------------------------------------------------------------------------------- 1 | .fa:before{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-weight:normal;font-style:normal;src:url("../fonts/fontawesome-webfont.eot");src:url("../fonts/fontawesome-webfont.eot?#iefix") format("embedded-opentype"),url("../fonts/fontawesome-webfont.woff") format("woff"),url("../fonts/fontawesome-webfont.ttf") format("truetype"),url("../fonts/fontawesome-webfont.svg#FontAwesome") format("svg")}.fa:before{display:inline-block;font-family:FontAwesome;font-style:normal;font-weight:normal;line-height:1;text-decoration:inherit}a .fa{display:inline-block;text-decoration:inherit}li .fa{display:inline-block}li .fa-large:before,li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-0.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before,ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before{content:""}.icon-book:before{content:""}.fa-caret-down:before{content:""}.icon-caret-down:before{content:""}.fa-caret-up:before{content:""}.icon-caret-up:before{content:""}.fa-caret-left:before{content:""}.icon-caret-left:before{content:""}.fa-caret-right:before{content:""}.icon-caret-right:before{content:""}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:"Lato","proxima-nova","Helvetica Neue",Arial,sans-serif;z-index:400}.rst-versions a{color:#2980B9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27AE60;*zoom:1}.rst-versions .rst-current-version:before,.rst-versions .rst-current-version:after{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book{float:left}.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#E74C3C;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#F1C40F;color:#000}.rst-versions.shift-up{height:auto;max-height:100%}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:gray;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:solid 1px #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px}.rst-versions.rst-badge .icon-book{float:none}.rst-versions.rst-badge .fa-book{float:none}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book{float:left}.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge .rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width: 768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} 2 | -------------------------------------------------------------------------------- /docs/_static/default.css: -------------------------------------------------------------------------------- 1 | @import url("classic.css"); 2 | -------------------------------------------------------------------------------- /docs/_static/documentation_options.js: -------------------------------------------------------------------------------- 1 | var DOCUMENTATION_OPTIONS = { 2 | URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'), 3 | VERSION: '', 4 | LANGUAGE: 'None', 5 | COLLAPSE_INDEX: false, 6 | FILE_SUFFIX: '.html', 7 | HAS_SOURCE: true, 8 | SOURCELINK_SUFFIX: '.txt', 9 | NAVIGATION_WITH_KEYS: false, 10 | }; -------------------------------------------------------------------------------- /docs/_static/down-pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/down-pressed.png -------------------------------------------------------------------------------- /docs/_static/down.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/down.png -------------------------------------------------------------------------------- /docs/_static/file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/file.png -------------------------------------------------------------------------------- /docs/_static/fonts/Inconsolata-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Inconsolata-Bold.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/Inconsolata-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Inconsolata-Regular.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/Inconsolata.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Inconsolata.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/Lato-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato-Bold.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/Lato-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato-Regular.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-bold.eot -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-bold.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-bold.woff -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-bold.woff2 -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-bolditalic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-bolditalic.eot -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-bolditalic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-bolditalic.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-bolditalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-bolditalic.woff -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-bolditalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-bolditalic.woff2 -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-italic.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-italic.eot -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-italic.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-italic.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-italic.woff -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-italic.woff2 -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-regular.eot -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-regular.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-regular.woff -------------------------------------------------------------------------------- /docs/_static/fonts/Lato/lato-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/Lato/lato-regular.woff2 -------------------------------------------------------------------------------- /docs/_static/fonts/RobotoSlab-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/RobotoSlab-Bold.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/RobotoSlab-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/RobotoSlab-Regular.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.eot -------------------------------------------------------------------------------- /docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff -------------------------------------------------------------------------------- /docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/RobotoSlab/roboto-slab-v7-bold.woff2 -------------------------------------------------------------------------------- /docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.eot -------------------------------------------------------------------------------- /docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff -------------------------------------------------------------------------------- /docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/RobotoSlab/roboto-slab-v7-regular.woff2 -------------------------------------------------------------------------------- /docs/_static/fonts/fontawesome-webfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/fontawesome-webfont.eot -------------------------------------------------------------------------------- /docs/_static/fonts/fontawesome-webfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/fontawesome-webfont.ttf -------------------------------------------------------------------------------- /docs/_static/fonts/fontawesome-webfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/fontawesome-webfont.woff -------------------------------------------------------------------------------- /docs/_static/fonts/fontawesome-webfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/REGoth-project/BsZenLib/0ae209b73fec8cda6a2a61293b221cb78df2c611/docs/_static/fonts/fontawesome-webfont.woff2 -------------------------------------------------------------------------------- /docs/_static/js/theme.js: -------------------------------------------------------------------------------- 1 | /* sphinx_rtd_theme version 0.4.2 | MIT license */ 2 | /* Built 20181005 13:10 */ 3 | require=function r(s,a,l){function c(e,n){if(!a[e]){if(!s[e]){var i="function"==typeof require&&require;if(!n&&i)return i(e,!0);if(u)return u(e,!0);var t=new Error("Cannot find module '"+e+"'");throw t.code="MODULE_NOT_FOUND",t}var o=a[e]={exports:{}};s[e][0].call(o.exports,function(n){return c(s[e][1][n]||n)},o,o.exports,r,s,a,l)}return a[e].exports}for(var u="function"==typeof require&&require,n=0;n"),i("table.docutils.footnote").wrap("
"),i("table.docutils.citation").wrap("
"),i(".wy-menu-vertical ul").not(".simple").siblings("a").each(function(){var e=i(this);expand=i(''),expand.on("click",function(n){return t.toggleCurrent(e),n.stopPropagation(),!1}),e.prepend(expand)})},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),i=e.find('[href="'+n+'"]');if(0===i.length){var t=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(i=e.find('[href="#'+t.attr("id")+'"]')).length&&(i=e.find('[href="#"]'))}0this.docHeight||(this.navBar.scrollTop(i),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",function(){this.linkScroll=!1})},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current"),e.siblings().find("li.current").removeClass("current"),e.find("> ul li.current").removeClass("current"),e.toggleClass("current")}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:e.exports.ThemeNav,StickyNav:e.exports.ThemeNav}),function(){for(var r=0,n=["ms","moz","webkit","o"],e=0;e