├── .gitattributes ├── .github └── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── general-issue-or-feature-request.md │ └── mod-issues.md ├── .gitignore ├── .gitmodules ├── CMakeLists.txt ├── CMakeSettings.json ├── CONTRIBUTING.md ├── Info.plist.in ├── LICENSE ├── README.md ├── appveyor.yml ├── game ├── bink │ ├── README.md │ ├── frame.cpp │ ├── frame.h │ ├── video.cpp │ └── video.h ├── build.h ├── camera.cpp ├── camera.h ├── commandline.cpp ├── commandline.h ├── dmusic │ ├── band.cpp │ ├── band.h │ ├── directmusic.cpp │ ├── directmusic.h │ ├── dlscollection.cpp │ ├── dlscollection.h │ ├── hydra.cpp │ ├── hydra.h │ ├── info.cpp │ ├── info.h │ ├── mixer.cpp │ ├── mixer.h │ ├── music.cpp │ ├── music.h │ ├── pattern.cpp │ ├── pattern.h │ ├── patternlist.cpp │ ├── patternlist.h │ ├── reference.cpp │ ├── reference.h │ ├── riff.cpp │ ├── riff.h │ ├── segment.cpp │ ├── segment.h │ ├── soundfont.cpp │ ├── soundfont.h │ ├── structs.h │ ├── style.cpp │ ├── style.h │ ├── track.cpp │ ├── track.h │ ├── wave.cpp │ └── wave.h ├── game │ ├── aiouputpipe.cpp │ ├── aiouputpipe.h │ ├── aistate.cpp │ ├── aistate.h │ ├── compatibility │ │ ├── ikarus.cpp │ │ ├── ikarus.h │ │ ├── lego.cpp │ │ ├── lego.h │ │ ├── mem32.cpp │ │ ├── mem32.h │ │ ├── phoenix.cpp │ │ ├── phoenix.h │ │ ├── scriptplugin.cpp │ │ └── scriptplugin.h │ ├── constants.h │ ├── damagecalculator.cpp │ ├── damagecalculator.h │ ├── definitions │ │ ├── cameradefinitions.cpp │ │ ├── cameradefinitions.h │ │ ├── fightaidefinitions.cpp │ │ ├── fightaidefinitions.h │ │ ├── musicdefinitions.cpp │ │ ├── musicdefinitions.h │ │ ├── particlesdefinitions.cpp │ │ ├── particlesdefinitions.h │ │ ├── sounddefinitions.cpp │ │ ├── sounddefinitions.h │ │ ├── spelldefinitions.cpp │ │ ├── spelldefinitions.h │ │ ├── svmdefinitions.cpp │ │ ├── svmdefinitions.h │ │ ├── visualfxdefinitions.cpp │ │ └── visualfxdefinitions.h │ ├── fightalgo.cpp │ ├── fightalgo.h │ ├── gamescript.cpp │ ├── gamescript.h │ ├── gamesession.cpp │ ├── gamesession.h │ ├── gametime.h │ ├── globaleffects.cpp │ ├── globaleffects.h │ ├── inventory.cpp │ ├── inventory.h │ ├── movealgo.cpp │ ├── movealgo.h │ ├── perceptionmsg.h │ ├── playercontrol.cpp │ ├── playercontrol.h │ ├── questlog.cpp │ ├── questlog.h │ ├── savegameheader.cpp │ ├── savegameheader.h │ ├── serialize.cpp │ ├── serialize.h │ ├── worldstatestorage.cpp │ └── worldstatestorage.h ├── gamemusic.cpp ├── gamemusic.h ├── gothic.cpp ├── gothic.h ├── graphics │ ├── bounds.cpp │ ├── bounds.h │ ├── drawbuckets.cpp │ ├── drawbuckets.h │ ├── drawclusters.cpp │ ├── drawclusters.h │ ├── drawcommands.cpp │ ├── drawcommands.h │ ├── dynamic │ │ ├── frustrum.cpp │ │ └── frustrum.h │ ├── effect.cpp │ ├── effect.h │ ├── instancestorage.cpp │ ├── instancestorage.h │ ├── inventoryrenderer.cpp │ ├── inventoryrenderer.h │ ├── lightgroup.cpp │ ├── lightgroup.h │ ├── lightsource.cpp │ ├── lightsource.h │ ├── material.cpp │ ├── material.h │ ├── mdlvisual.cpp │ ├── mdlvisual.h │ ├── mesh │ │ ├── animation.cpp │ │ ├── animation.h │ │ ├── animationsolver.cpp │ │ ├── animationsolver.h │ │ ├── animmath.cpp │ │ ├── animmath.h │ │ ├── attachbinder.cpp │ │ ├── attachbinder.h │ │ ├── landscape.cpp │ │ ├── landscape.h │ │ ├── pose.cpp │ │ ├── pose.h │ │ ├── protomesh.cpp │ │ ├── protomesh.h │ │ ├── skeleton.cpp │ │ ├── skeleton.h │ │ └── submesh │ │ │ ├── animmesh.cpp │ │ │ ├── animmesh.h │ │ │ ├── packedmesh.cpp │ │ │ ├── packedmesh.h │ │ │ ├── pfxemittermesh.cpp │ │ │ ├── pfxemittermesh.h │ │ │ ├── staticmesh.cpp │ │ │ └── staticmesh.h │ ├── meshobjects.cpp │ ├── meshobjects.h │ ├── objvisual.cpp │ ├── objvisual.h │ ├── pfx │ │ ├── particlefx.cpp │ │ ├── particlefx.h │ │ ├── pfxbucket.cpp │ │ ├── pfxbucket.h │ │ ├── pfxobjects.cpp │ │ └── pfxobjects.h │ ├── renderer.cpp │ ├── renderer.h │ ├── rtscene.cpp │ ├── rtscene.h │ ├── sceneglobals.cpp │ ├── sceneglobals.h │ ├── shaders.cpp │ ├── shaders.h │ ├── sky │ │ ├── sky.cpp │ │ └── sky.h │ ├── visualfx.cpp │ ├── visualfx.h │ ├── visualobjects.cpp │ ├── visualobjects.h │ ├── worldview.cpp │ └── worldview.h ├── main.cpp ├── mainwindow.cpp ├── mainwindow.h ├── marvin.cpp ├── marvin.h ├── physics │ ├── collisionworld.cpp │ ├── collisionworld.h │ ├── dynamicworld.cpp │ ├── dynamicworld.h │ ├── physicmesh.cpp │ ├── physicmesh.h │ ├── physicmeshshape.cpp │ ├── physicmeshshape.h │ ├── physics.h │ ├── physicvbo.cpp │ └── physicvbo.h ├── resources.cpp ├── resources.h ├── sound │ ├── soundfx.cpp │ └── soundfx.h ├── ui │ ├── chapterscreen.cpp │ ├── chapterscreen.h │ ├── consolewidget.cpp │ ├── consolewidget.h │ ├── dialogmenu.cpp │ ├── dialogmenu.h │ ├── documentmenu.cpp │ ├── documentmenu.h │ ├── gamemenu.cpp │ ├── gamemenu.h │ ├── inventorymenu.cpp │ ├── inventorymenu.h │ ├── menuroot.cpp │ ├── menuroot.h │ ├── stacklayout.cpp │ ├── stacklayout.h │ ├── touchinput.cpp │ ├── touchinput.h │ ├── videowidget.cpp │ └── videowidget.h ├── utils │ ├── crashlog.cpp │ ├── crashlog.h │ ├── dbgpainter.cpp │ ├── dbgpainter.h │ ├── fileext.h │ ├── fileutil.cpp │ ├── fileutil.h │ ├── gthfont.cpp │ ├── gthfont.h │ ├── inifile.cpp │ ├── inifile.h │ ├── installdetect.cpp │ ├── installdetect.h │ ├── installdetect.mm │ ├── keycodec.cpp │ ├── keycodec.h │ ├── mouseutil.cpp │ ├── mouseutil.h │ ├── parser.cpp │ ├── parser.h │ ├── string_frm.h │ ├── versioninfo.h │ ├── workers.cpp │ └── workers.h └── world │ ├── aiqueue.cpp │ ├── aiqueue.h │ ├── bullet.cpp │ ├── bullet.h │ ├── collisionzone.cpp │ ├── collisionzone.h │ ├── focus.cpp │ ├── focus.h │ ├── fplock.cpp │ ├── fplock.h │ ├── objects │ ├── fireplace.cpp │ ├── fireplace.h │ ├── globalfx.cpp │ ├── globalfx.h │ ├── interactive.cpp │ ├── interactive.h │ ├── item.cpp │ ├── item.h │ ├── itemtorchburning.cpp │ ├── itemtorchburning.h │ ├── npc.cpp │ ├── npc.h │ ├── pfxemitter.cpp │ ├── pfxemitter.h │ ├── sound.cpp │ ├── sound.h │ ├── staticobj.cpp │ ├── staticobj.h │ ├── vob.cpp │ ├── vob.h │ ├── vobbundle.cpp │ └── vobbundle.h │ ├── spaceindex.cpp │ ├── spaceindex.h │ ├── triggers │ ├── abstracttrigger.cpp │ ├── abstracttrigger.h │ ├── codemaster.cpp │ ├── codemaster.h │ ├── cscamera.cpp │ ├── cscamera.h │ ├── earthquake.cpp │ ├── earthquake.h │ ├── messagefilter.cpp │ ├── messagefilter.h │ ├── movercontroler.cpp │ ├── movercontroler.h │ ├── movetrigger.cpp │ ├── movetrigger.h │ ├── pfxcontroller.cpp │ ├── pfxcontroller.h │ ├── touchdamage.cpp │ ├── touchdamage.h │ ├── trigger.cpp │ ├── trigger.h │ ├── triggerlist.cpp │ ├── triggerlist.h │ ├── triggerscript.cpp │ ├── triggerscript.h │ ├── triggerworldstart.cpp │ ├── triggerworldstart.h │ ├── zonetrigger.cpp │ └── zonetrigger.h │ ├── waymatrix.cpp │ ├── waymatrix.h │ ├── waypath.cpp │ ├── waypath.h │ ├── waypoint.cpp │ ├── waypoint.h │ ├── world.cpp │ ├── world.h │ ├── worldlight.cpp │ ├── worldlight.h │ ├── worldobjects.cpp │ ├── worldobjects.h │ ├── worldsound.cpp │ └── worldsound.h ├── icon.ico ├── icon.rc ├── lib ├── edd-dbg │ ├── CMakeLists.txt │ ├── include │ │ └── dbg │ │ │ ├── assert.hpp │ │ │ ├── config.hpp │ │ │ ├── debugger.hpp │ │ │ ├── fatality.hpp │ │ │ ├── frames.hpp │ │ │ ├── impl │ │ │ ├── format.hpp │ │ │ ├── quality_infraction.hpp │ │ │ └── raise.hpp │ │ │ ├── log.hpp │ │ │ ├── logstream.hpp │ │ │ ├── note.hpp │ │ │ ├── static_assert.hpp │ │ │ ├── symbols.hpp │ │ │ ├── symlog.hpp │ │ │ ├── throw.hpp │ │ │ ├── unusual.hpp │ │ │ └── version.hpp │ └── src │ │ ├── assert.cpp │ │ ├── envvar.hpp │ │ ├── format.cpp │ │ ├── frames_common.cpp │ │ ├── log.cpp │ │ ├── logstream.cpp │ │ ├── memcpy_cast.hpp │ │ ├── note.cpp │ │ ├── osx │ │ ├── debugger.cpp │ │ ├── envvar.cpp │ │ ├── frames.cpp │ │ ├── symbols.cpp │ │ ├── throw_state.cpp │ │ └── timestamp.cpp │ │ ├── quality_infraction.cpp │ │ ├── spin_mutex.hpp │ │ ├── symlog.cpp │ │ ├── throw.cpp │ │ ├── throw_state.hpp │ │ ├── timestamp.hpp │ │ ├── timestamp_common.cpp │ │ ├── unusual.cpp │ │ └── windows │ │ ├── dbghelp.cpp │ │ ├── dbghelp.hpp │ │ ├── debugger.cpp │ │ ├── dll.cpp │ │ ├── dll.hpp │ │ ├── envvar.cpp │ │ ├── frames.cpp │ │ ├── mingw │ │ ├── file.cpp │ │ ├── file.hpp │ │ ├── pe.cpp │ │ ├── pe.hpp │ │ ├── pe_symtab.cpp │ │ ├── pe_symtab.hpp │ │ └── symbols.cpp │ │ ├── ms_symdb.cpp │ │ ├── ms_symdb.hpp │ │ ├── msvc │ │ └── symbols.cpp │ │ ├── symsink.cpp │ │ ├── throw_state.cpp │ │ └── timestamp.cpp └── miniz │ ├── ChangeLog.md │ ├── LICENSE │ ├── miniz.c │ ├── miniz.h │ └── readme.md ├── packaging └── opengothic.appdata.xml ├── scr0.png ├── scripts ├── Gothic2Notr.bat └── Gothic2Notr.sh └── shader ├── CMakeLists.txt ├── antialiasing └── cmaa2 │ ├── cmaa2_common.glsl │ ├── deferred_color_apply_2x2.frag │ ├── deferred_color_apply_2x2.vert │ ├── edge_color2x2.comp │ └── process_candidates.comp ├── common.glsl ├── copy.comp ├── copy.frag ├── copy.vert ├── copy_img.comp ├── epipolar ├── epipolar_common.glsl ├── fog_epipolar.comp ├── fog_epipolar_occlusion.comp └── fog_shadow_sample.comp ├── hiz ├── hiz_mip.comp └── hiz_pot.comp ├── inventory ├── item.frag └── item.vert ├── lighting ├── ambient_light.frag ├── direct_light.frag ├── irradiance.comp ├── light.frag ├── light.vert ├── purkinje_shift.glsl ├── rt │ ├── probe_allocation.comp │ ├── probe_ambient.frag │ ├── probe_aux.comp │ ├── probe_common.glsl │ ├── probe_dbg.frag │ ├── probe_dbg.vert │ ├── probe_hit_dbg.frag │ ├── probe_hit_dbg.vert │ ├── probe_lighting.comp │ ├── probe_trace.comp │ └── rt_common.glsl ├── shadow_sampling.glsl ├── sky_exposure.comp ├── tonemapping.frag └── tonemapping.glsl ├── link_shaders.cmake ├── materials ├── cluster_init.comp ├── cluster_patch.comp ├── main.frag ├── main.tesc ├── main.tese ├── main.vert ├── materials_common.glsl ├── pfx.vert ├── vertex_process.glsl └── visibility_pass.comp ├── patch.comp ├── rtsm ├── rtsm_clear.comp ├── rtsm_clear_omni.comp ├── rtsm_common.glsl ├── rtsm_cull_lights.comp ├── rtsm_culling.comp ├── rtsm_culling_omni.comp ├── rtsm_dbg.frag ├── rtsm_direct_light.frag ├── rtsm_hiz_pages.comp ├── rtsm_mark_fog_pages.comp ├── rtsm_mark_pages.comp ├── rtsm_meshlet_complex.comp ├── rtsm_meshlet_cull.comp ├── rtsm_meshlet_omni.comp ├── rtsm_position.comp ├── rtsm_primitive_cull.comp ├── rtsm_raster.comp ├── rtsm_raster_omni.comp ├── rtsm_rendering.comp ├── rtsm_sample_cull.comp ├── rtsm_scratch.glsl └── rtsm_tile_bboxes.glsl ├── scalar_ops.glsl ├── scene.glsl ├── sky ├── clouds.glsl ├── clouds_lut.comp ├── fog.frag ├── fog_epipolar.frag ├── fog_view_lut.comp ├── shadow_downsample.comp ├── sky.frag ├── sky_common.glsl ├── sky_multi_scattering.frag ├── sky_pathtrace.frag ├── sky_transmittance.frag ├── sky_view_clouds_lut.frag ├── sky_view_lut.frag ├── sun.frag └── sun.vert ├── software_rendering ├── sw_light.comp ├── sw_rendering_imm.comp ├── sw_rendering_tbr.comp └── vbuffer_blit.frag ├── ssao ├── ssao.comp └── ssao_blur.comp ├── stash.frag ├── upscale └── lanczos.glsl ├── virtual_shadow ├── vsm_alloc_pages.comp ├── vsm_alloc_pages2.comp ├── vsm_clear.comp ├── vsm_clear_omni.comp ├── vsm_clump_pages.comp ├── vsm_common.glsl ├── vsm_cull_lights.comp ├── vsm_direct_light.frag ├── vsm_fog_shadow.comp ├── vsm_fog_trace.comp ├── vsm_list_pages.comp ├── vsm_mark_omni_pages.comp ├── vsm_mark_pages.comp ├── vsm_merge_pages.comp ├── vsm_pack_draws.comp ├── vsm_postprocess_omni.comp ├── vsm_rendering.comp ├── vsm_sort_pages.comp ├── vsm_trim_pages.comp └── vsm_visibility_pass.comp └── water ├── gerstner_wave.glsl ├── underwater.frag ├── water_reflection.frag └── water_reflection.mesh /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **Save-game/Log-file/Screenshots/Video** 14 | If applicable, add screenshots or save-game file to help explain your problem. 15 | 16 | **Application log** 17 | If relevant attach `log.txt` file or, in case of game-crash, `crash.log` 18 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/general-issue-or-feature-request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: General issue or feature request 3 | about: Some general request 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/mod-issues.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Mod issues 3 | about: Issue with modded gothic2 4 | title: '' 5 | labels: mod 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the issue** 11 | A clear and concise description of what the bug is. 12 | 13 | **Information about the mod** 14 | Please provide mod name and download link. 15 | 16 | **Save-game/Log-file/Screenshots/Video** 17 | If applicable, add screenshots or save-game file to help explain your problem. 18 | 19 | **Application log** 20 | If relevant attach `log.txt` file or, in case of game-crash, `crash.log` 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled Dynamic libraries 2 | *.so 3 | *.dylib 4 | *.dll 5 | 6 | # Executables 7 | *.exe 8 | *.out 9 | *.app 10 | 11 | # IDE 12 | CMakeLists.txt.user* 13 | .idea 14 | 15 | # Build-dir 16 | build/ 17 | build-*/ 18 | bin/log.txt 19 | bin/crash.log 20 | bin/dbg.bin 21 | bin/*.sav 22 | bin/Gothic.ini 23 | out/* 24 | 25 | # internal 26 | .vs/ 27 | internal/ 28 | 29 | #os 30 | .DS_Store 31 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "lib/Tempest"] 2 | path = lib/Tempest 3 | url = https://github.com/Try/Tempest.git 4 | [submodule "lib/bullet3"] 5 | path = lib/bullet3 6 | url = https://github.com/bulletphysics/bullet3.git 7 | [submodule "lib/TinySoundFont"] 8 | path = lib/TinySoundFont 9 | url = https://github.com/schellingb/TinySoundFont.git 10 | [submodule "lib/ZenKit"] 11 | path = lib/ZenKit 12 | url = https://github.com/GothicKit/ZenKit.git 13 | [submodule "lib/dmusic"] 14 | path = lib/dmusic 15 | url = https://github.com/GothicKit/dmusic.git 16 | -------------------------------------------------------------------------------- /CMakeSettings.json: -------------------------------------------------------------------------------- 1 | { 2 | "configurations": [ 3 | { 4 | "name": "x64-Debug", 5 | "generator": "Ninja", 6 | "configurationType": "Debug", 7 | "inheritEnvironments": [ "msvc_x64_x64" ], 8 | "buildRoot": "${projectDir}\\out\\build\\${name}", 9 | "installRoot": "${projectDir}\\out\\install\\${name}", 10 | "cmakeCommandArgs": "", 11 | "buildCommandArgs": "", 12 | "ctestCommandArgs": "" 13 | }, 14 | { 15 | "name": "x64-Profile", 16 | "generator": "Ninja", 17 | "configurationType": "RelWithDebInfo", 18 | "buildRoot": "${projectDir}\\out\\build\\${name}", 19 | "installRoot": "${projectDir}\\out\\install\\${name}", 20 | "cmakeCommandArgs": "", 21 | "buildCommandArgs": "", 22 | "ctestCommandArgs": "", 23 | "inheritEnvironments": [ "msvc_x64_x64" ], 24 | "variables": [] 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | ## Contributing 2 | 3 | This page design to help you contribute to this project. 4 | 5 | ### Project structure 6 | - OpenGothic 7 | - Game - game itself 8 | - shader - glsl shaders 9 | - lib 10 | - MoltenTempest - graphics engine 11 | - bullet3 - physic engine 12 | - ZenLib - gothic-asset loading library 13 | - TinySoundFont - midi sound support library 14 | - edd-dbg - crashlog library 15 | 16 | ### Tracking of progress and bug reporting 17 | Those guidlined are not strict, just a recomandations rather. 18 | This project uses wiki to track not implemented features and issues to track bugs: 19 | 20 | * Features: 21 | [Detailed list of features](https://github.com/Try/OpenGothic/wiki/Feature-list) 22 | You can create a issue, if you want to work on a feature and want to notify everyone. 23 | 24 | * Script-api: 25 | [Detailed list of implemented api functions](https://github.com/Try/OpenGothic/wiki/Daedalus-scripts) 26 | 27 | * Bugs in already implemented stuff: 28 | This is a good case for issue 29 | 30 | * Bugs in partially implemented feature: 31 | You can submit a issue, if this bug causes crash, or makes game unplayable somehow. 32 | 33 | * Renderer: 34 | At this moment I'm looking forward to rewrite it - not much need in issues here 35 | 36 | -------------------------------------------------------------------------------- /Info.plist.in: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | English 7 | CFBundleExecutable 8 | ${MACOSX_BUNDLE_EXECUTABLE_NAME} 9 | CFBundleGetInfoString 10 | ${MACOSX_BUNDLE_INFO_STRING} 11 | CFBundleIconFile 12 | ${MACOSX_BUNDLE_ICON_FILE} 13 | CFBundleIdentifier 14 | ${MACOSX_BUNDLE_GUI_IDENTIFIER} 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleLongVersionString 18 | ${MACOSX_BUNDLE_LONG_VERSION_STRING} 19 | CFBundleName 20 | ${MACOSX_BUNDLE_BUNDLE_NAME} 21 | CFBundlePackageType 22 | APPL 23 | CFBundleShortVersionString 24 | ${MACOSX_BUNDLE_SHORT_VERSION_STRING} 25 | CFBundleSignature 26 | ???? 27 | CFBundleVersion 28 | ${MACOSX_BUNDLE_BUNDLE_VERSION} 29 | CSResourcesFileMapped 30 | 31 | NSHumanReadableCopyright 32 | ${MACOSX_BUNDLE_COPYRIGHT} 33 | UIFileSharingEnabled 34 | 35 | LSSupportsOpeningDocumentsInPlace 36 | 37 | com.apple.developer.kernel.increased-memory-limit 38 | 39 | UILaunchScreen 40 | 41 | UIColorName 42 | black 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019 Try 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /game/bink/README.md: -------------------------------------------------------------------------------- 1 | ### This folder contains a Bink-video codec 2 | 3 | Implementation is based on ffmpeg library source code (LGPLv2.1+). 4 | Codec itself is completely independent unit, which does not require any other OpenGothic parts in order to work - fell free to use it for your open-source game remake. 5 | 6 | Classes: 7 | * Bink::Video - video codec 8 | * Bink::Frame - frame image 9 | * Bink::Video::Input - data input adapter 10 | * Bink::Frame::Plane - one of YUV planes 11 | 12 | Usage example: 13 | ```c++ 14 | #include 15 | 16 | MyInput fin(filename); // see Bink::Video::Input 17 | Bink::Video vid(&fin); 18 | for(size_t i=0; i 4 | #include 5 | #include 6 | 7 | namespace Bink { 8 | 9 | class Video; 10 | 11 | class Frame final { 12 | public: 13 | Frame(); 14 | Frame(Frame&&) = default; 15 | Frame& operator = (Frame&&) = default; 16 | 17 | class Plane final { 18 | public: 19 | void getPixels8x8 (uint32_t rx, uint32_t ry, uint8_t* out) const; 20 | 21 | void getBlock8x8 (uint32_t x, uint32_t y, uint8_t* out) const; 22 | void putBlock8x8 (uint32_t x, uint32_t y, const uint8_t* in); 23 | void putScaledBlock(uint32_t x, uint32_t y, const uint8_t* in); 24 | void fill (uint8_t v); 25 | 26 | uint8_t at(uint32_t x, uint32_t y) const; 27 | const uint8_t* data() const { return dat.data(); } 28 | 29 | private: 30 | void setSize(uint32_t w, uint32_t h); 31 | 32 | std::vector dat; 33 | uint32_t w = 0; 34 | uint32_t h = 0; 35 | uint32_t stride = 0; 36 | 37 | friend class Frame; 38 | }; 39 | 40 | class Audio final { 41 | public: 42 | std::vector samples; 43 | }; 44 | 45 | uint32_t width() const { return planes[0].w; } 46 | uint32_t stride() const { return planes[0].stride; } 47 | uint32_t height() const { return planes[0].h; } 48 | 49 | const Plane& plane(uint8_t id) const { return planes[id]; } 50 | const Audio& audio(uint8_t id) const; 51 | size_t audioCount() const { return aud.size(); } 52 | 53 | private: 54 | Plane planes[4]; 55 | std::vector