Merge branch 'master' into Translation

This commit is contained in:
JuraIBOZO 2023-09-17 22:22:11 +03:00 committed by GitHub
commit a4101a751b
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
202 changed files with 12228 additions and 11509 deletions

View file

@ -10,6 +10,8 @@ on:
jobs: jobs:
build-cmake: build-cmake:
runs-on: ${{ matrix.os }} runs-on: ${{ matrix.os }}
env:
CARGO_HTTP_MULTIPLEXING: false
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:

View file

@ -11,6 +11,8 @@ on:
jobs: jobs:
check-clang-san: check-clang-san:
runs-on: ubuntu-latest runs-on: ubuntu-latest
env:
CARGO_HTTP_MULTIPLEXING: false
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
with: with:
@ -24,14 +26,17 @@ jobs:
uses: Swatinem/rust-cache@v2 uses: Swatinem/rust-cache@v2
- name: Build with ASan and UBSan - name: Build with ASan and UBSan
run: | run: |
mkdir clang-sanitizer
cd clang-sanitizer
export CC=clang export CC=clang
export CXX=clang++ export CXX=clang++
export CXXFLAGS="-fsanitize=address,undefined -fsanitize-recover=address,undefined -fno-omit-frame-pointer" export CXXFLAGS="-fsanitize=address,undefined -fsanitize-recover=address,undefined -fno-omit-frame-pointer"
export CFLAGS="-fsanitize=address,undefined -fsanitize-recover=address,undefined -fno-omit-frame-pointer" export CFLAGS="-fsanitize=address,undefined -fsanitize-recover=address,undefined -fno-omit-frame-pointer"
cmake -DCMAKE_BUILD_TYPE=Debug -DHEADLESS_CLIENT=ON -Werror=dev -DDOWNLOAD_GTEST=ON -DDEV=ON -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG=. . cmake -DCMAKE_BUILD_TYPE=Debug -DHEADLESS_CLIENT=ON -Werror=dev -DDOWNLOAD_GTEST=ON -DDEV=ON -DCMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG=. ..
make -j"$(nproc)" make -j"$(nproc)"
- name: Run server and headless client with ASan and UBSan - name: Run server and headless client with ASan and UBSan
run: | run: |
cd clang-sanitizer
export UBSAN_OPTIONS=suppressions=./ubsan.supp:log_path=./SAN:print_stacktrace=1:halt_on_errors=0 export UBSAN_OPTIONS=suppressions=./ubsan.supp:log_path=./SAN:print_stacktrace=1:halt_on_errors=0
export ASAN_OPTIONS=log_path=./SAN:print_stacktrace=1:check_initialization_order=1:detect_leaks=1:halt_on_errors=0 export ASAN_OPTIONS=log_path=./SAN:print_stacktrace=1:check_initialization_order=1:detect_leaks=1:halt_on_errors=0
export LSAN_OPTIONS=suppressions=./lsan.supp export LSAN_OPTIONS=suppressions=./lsan.supp
@ -44,6 +49,7 @@ jobs:
fi fi
- name: Run unit tests with ASan and UBSan - name: Run unit tests with ASan and UBSan
run: | run: |
cd clang-sanitizer
cmake --build . --config Debug --target run_cxx_tests cmake --build . --config Debug --target run_cxx_tests
# Rust tests work locally, but still not in CI, even with the same directory # Rust tests work locally, but still not in CI, even with the same directory
if test -n "$(find . -maxdepth 1 -name 'SAN.*' -print -quit)" if test -n "$(find . -maxdepth 1 -name 'SAN.*' -print -quit)"
@ -53,6 +59,7 @@ jobs:
fi fi
- name: Run integration tests with ASan and UBSan - name: Run integration tests with ASan and UBSan
run: | run: |
cd clang-sanitizer
make run_integration_tests make run_integration_tests
if test -n "$(find . -maxdepth 1 -name 'SAN.*' -print -quit)" if test -n "$(find . -maxdepth 1 -name 'SAN.*' -print -quit)"
then then

View file

@ -11,6 +11,8 @@ on:
jobs: jobs:
check-clang-tidy: check-clang-tidy:
runs-on: ubuntu-latest runs-on: ubuntu-latest
env:
CARGO_HTTP_MULTIPLEXING: false
steps: steps:
- uses: actions/checkout@v3 - uses: actions/checkout@v3
with: with:

View file

@ -18,6 +18,8 @@ jobs:
analyze: analyze:
name: Analyze name: Analyze
runs-on: ubuntu-latest runs-on: ubuntu-latest
env:
CARGO_HTTP_MULTIPLEXING: false
strategy: strategy:
fail-fast: false fail-fast: false

View file

@ -10,6 +10,8 @@ on:
jobs: jobs:
rustdoc: rustdoc:
runs-on: ubuntu-latest runs-on: ubuntu-latest
env:
CARGO_HTTP_MULTIPLEXING: false
steps: steps:
- uses: actions/checkout@v2 - uses: actions/checkout@v2
- name: Cache Rust dependencies - name: Cache Rust dependencies
@ -28,6 +30,8 @@ jobs:
cargo-deny: cargo-deny:
runs-on: ubuntu-latest runs-on: ubuntu-latest
env:
CARGO_HTTP_MULTIPLEXING: false
strategy: strategy:
matrix: matrix:
checks: checks:

View file

@ -1,7 +1,4 @@
cmake_minimum_required(VERSION 2.8.12...3.19.1) cmake_minimum_required(VERSION 3.12...3.27.4)
if(CMAKE_VERSION VERSION_LESS 3.12)
cmake_policy(VERSION ${CMAKE_VERSION})
endif()
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15 CACHE INTERNAL "Minimum macOS deployment version") set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15 CACHE INTERNAL "Minimum macOS deployment version")
if(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS 10.15) if(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS 10.15)
@ -26,16 +23,6 @@ else()
endif() endif()
# Extra support for CMake pre-3.0 # Extra support for CMake pre-3.0
if(NOT POLICY CMP0048)
set(PROJECT_VERSION_MAJOR ${VERSION_MAJOR})
set(PROJECT_VERSION_MINOR ${VERSION_MINOR})
set(PROJECT_VERSION_PATCH ${VERSION_PATCH})
if(VERSION_PATCH STREQUAL "0")
set(PROJECT_VERSION ${VERSION_MAJOR}.${VERSION_MINOR})
else()
set(PROJECT_VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
endif()
endif()
if(VERSION_PATCH STREQUAL "0") if(VERSION_PATCH STREQUAL "0")
project(DDNet VERSION ${VERSION_MAJOR}.${VERSION_MINOR}) project(DDNet VERSION ${VERSION_MAJOR}.${VERSION_MINOR})
else() else()
@ -165,26 +152,19 @@ endif()
set(DBG $<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>) set(DBG $<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>)
if(IPO) if(IPO)
if(CMAKE_VERSION VERSION_GREATER 3.9) include(CheckIPOSupported)
include(CheckIPOSupported) check_ipo_supported(RESULT ipo_supported OUTPUT ipo_output)
check_ipo_supported(RESULT ipo_supported OUTPUT ipo_output) if(ipo_supported)
if(ipo_supported) message(STATUS "IPO is enabled")
message(STATUS "IPO is enabled") set(ENABLE_IPO TRUE)
set(ENABLE_IPO TRUE)
else()
message(WARNING "IPO is not supported: ${ipo_output}")
endif()
else() else()
message(WARNING "IPO enablement requires CMake 3.9+") message(WARNING "IPO is not supported: ${ipo_output}")
endif() endif()
endif() endif()
if(CMAKE_VERSION VERSION_LESS 3.0) if(NOT "${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
configure_file(src/game/version.h vd.h) # Remove version.h generated by previous build code
else() file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/src/game/version.h)
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
src/game/version.h
)
endif() endif()
set(SERVER_EXECUTABLE DDNet-Server CACHE STRING "Name of the built server executable") set(SERVER_EXECUTABLE DDNet-Server CACHE STRING "Name of the built server executable")
@ -290,7 +270,7 @@ if(NOT MSVC AND NOT HAIKU)
endif() endif()
endif() endif()
if(CMAKE_VERSION VERSION_LESS 3.1 OR TARGET_OS STREQUAL "mac") if(TARGET_OS STREQUAL "mac")
add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -std=gnu++17) add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -std=gnu++17)
endif() endif()
@ -330,12 +310,6 @@ if(NOT MSVC AND NOT HAIKU)
endif() endif()
add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wall) add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wall)
if(CMAKE_VERSION VERSION_GREATER 3.3 OR CMAKE_VERSION VERSION_EQUAL 3.3)
add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN
$<$<COMPILE_LANGUAGE:C>:-Wdeclaration-after-statement>
-Wdeclaration-after-statement
)
endif()
add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wextra) add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wextra)
add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-psabi) # parameter passing for argument of type __gnu_cxx::__normal_iterator<CCommandProcessorFragment_Vulkan::SMemoryBlock<1>*, std::vector<CCommandProcessorFragment_Vulkan::SMemoryBlock<1>, std::allocator<CCommandProcessorFragment_Vulkan::SMemoryBlock<1> > > > changed in GCC 7.1 add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-psabi) # parameter passing for argument of type __gnu_cxx::__normal_iterator<CCommandProcessorFragment_Vulkan::SMemoryBlock<1>*, std::vector<CCommandProcessorFragment_Vulkan::SMemoryBlock<1>, std::allocator<CCommandProcessorFragment_Vulkan::SMemoryBlock<1> > > > changed in GCC 7.1
add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-unused-parameter) add_cxx_compiler_flag_if_supported(OUR_FLAGS_OWN -Wno-unused-parameter)
@ -387,28 +361,25 @@ function(set_glob VAR GLOBBING EXTS DIRECTORY) # ...
if(NOT FILES STREQUAL GLOB_RESULT) if(NOT FILES STREQUAL GLOB_RESULT)
message(AUTHOR_WARNING "${VAR} does not contain every file from directory ${DIRECTORY}") message(AUTHOR_WARNING "${VAR} does not contain every file from directory ${DIRECTORY}")
set(LIST_BUT_NOT_GLOB) set(LIST_BUT_NOT_GLOB)
if(POLICY CMP0057) foreach(file ${FILES})
cmake_policy(SET CMP0057 NEW) if(NOT file IN_LIST GLOB_RESULT)
foreach(file ${FILES}) list(APPEND LIST_BUT_NOT_GLOB ${file})
if(NOT file IN_LIST GLOB_RESULT)
list(APPEND LIST_BUT_NOT_GLOB ${file})
endif()
endforeach()
if(LIST_BUT_NOT_GLOB)
message(AUTHOR_WARNING "Entries only present in ${VAR}: ${LIST_BUT_NOT_GLOB}")
endif() endif()
set(GLOB_BUT_NOT_LIST) endforeach()
foreach(file ${GLOB_RESULT}) if(LIST_BUT_NOT_GLOB)
if(NOT file IN_LIST FILES) message(AUTHOR_WARNING "Entries only present in ${VAR}: ${LIST_BUT_NOT_GLOB}")
list(APPEND GLOB_BUT_NOT_LIST ${file}) endif()
endif() set(GLOB_BUT_NOT_LIST)
endforeach() foreach(file ${GLOB_RESULT})
if(GLOB_BUT_NOT_LIST) if(NOT file IN_LIST FILES)
message(AUTHOR_WARNING "Entries only present in ${DIRECTORY}: ${GLOB_BUT_NOT_LIST}") list(APPEND GLOB_BUT_NOT_LIST ${file})
endif()
if(NOT LIST_BUT_NOT_GLOB AND NOT GLOB_BUT_NOT_LIST)
message(AUTHOR_WARNING "${VAR} is not alphabetically sorted")
endif() endif()
endforeach()
if(GLOB_BUT_NOT_LIST)
message(AUTHOR_WARNING "Entries only present in ${DIRECTORY}: ${GLOB_BUT_NOT_LIST}")
endif()
if(NOT LIST_BUT_NOT_GLOB AND NOT GLOB_BUT_NOT_LIST)
message(AUTHOR_WARNING "${VAR} is not alphabetically sorted")
endif() endif()
endif() endif()
@ -424,19 +395,11 @@ set(CHECKSUM_SRC)
function(set_own_rpath TARGET) function(set_own_rpath TARGET)
if(NOT TARGET_OS STREQUAL "windows" AND NOT TARGET_OS STREQUAL "mac") if(NOT TARGET_OS STREQUAL "windows" AND NOT TARGET_OS STREQUAL "mac")
if(CMAKE_VERSION VERSION_GREATER 3.8 OR CMAKE_VERSION VERSION_EQUAL 3.8) set_property(TARGET ${TARGET} PROPERTY BUILD_RPATH "$ORIGIN")
set_property(TARGET ${TARGET} PROPERTY BUILD_RPATH "$ORIGIN")
endif()
set_property(TARGET ${TARGET} PROPERTY INSTALL_RPATH "$ORIGIN/../lib/ddnet") set_property(TARGET ${TARGET} PROPERTY INSTALL_RPATH "$ORIGIN/../lib/ddnet")
endif() endif()
endfunction() endfunction()
if(NOT TARGET_OS STREQUAL "windows" AND NOT TARGET_OS STREQUAL "mac" AND CMAKE_VERSION VERSION_LESS 3.8)
if((CLIENT AND (STEAM OR DISCORD_DYNAMIC)) OR ANTIBOT)
message(STATUS "Can't set BUILD_RPATH in CMake before 3.8, pass -Wl,-rpath,'$ORIGIN' manually if you wish to emulate this. Or just install a newer version of CMake...")
endif()
endif()
######################################################################## ########################################################################
# INITIALIZE TARGET LISTS # INITIALIZE TARGET LISTS
######################################################################## ########################################################################
@ -834,9 +797,6 @@ if(NOT(GTEST_FOUND) AND DOWNLOAD_GTEST)
set(GTEST_LIBRARIES gtest gmock) set(GTEST_LIBRARIES gtest gmock)
set(GTEST_INCLUDE_DIRS) set(GTEST_INCLUDE_DIRS)
if(CMAKE_VERSION VERSION_LESS 2.8.11)
set(GTEST_INCLUDE_DIRS "${gtest_SOURCE_DIR}/include" "${gmock_SOURCE_DIR}/include")
endif()
endif() endif()
endif() endif()
endif() endif()
@ -1222,8 +1182,11 @@ set(EXPECTED_DATA
countryflags/EG.png countryflags/EG.png
countryflags/EH.png countryflags/EH.png
countryflags/ER.png countryflags/ER.png
countryflags/ES-CT.png
countryflags/ES-GA.png
countryflags/ES.png countryflags/ES.png
countryflags/ET.png countryflags/ET.png
countryflags/EU.png
countryflags/FI.png countryflags/FI.png
countryflags/FJ.png countryflags/FJ.png
countryflags/FK.png countryflags/FK.png
@ -1231,6 +1194,10 @@ set(EXPECTED_DATA
countryflags/FO.png countryflags/FO.png
countryflags/FR.png countryflags/FR.png
countryflags/GA.png countryflags/GA.png
countryflags/GB-ENG.png
countryflags/GB-NIR.png
countryflags/GB-SCT.png
countryflags/GB-WLS.png
countryflags/GB.png countryflags/GB.png
countryflags/GD.png countryflags/GD.png
countryflags/GE.png countryflags/GE.png
@ -1396,13 +1363,6 @@ set(EXPECTED_DATA
countryflags/VU.png countryflags/VU.png
countryflags/WF.png countryflags/WF.png
countryflags/WS.png countryflags/WS.png
countryflags/XCA.png
countryflags/XEN.png
countryflags/XEU.png
countryflags/XGL.png
countryflags/XNI.png
countryflags/XSC.png
countryflags/XWA.png
countryflags/YE.png countryflags/YE.png
countryflags/ZA.png countryflags/ZA.png
countryflags/ZM.png countryflags/ZM.png
@ -1411,14 +1371,25 @@ set(EXPECTED_DATA
countryflags/index.txt countryflags/index.txt
debug_font.png debug_font.png
editor/audio_source.png editor/audio_source.png
editor/automap/basic_freeze.rules
editor/automap/ddmax_freeze.rules
editor/automap/ddnet_tiles.rules
editor/automap/ddnet_walls.rules
editor/automap/desert_main.rules
editor/automap/fadeout.rules
editor/automap/generic_clear.rules
editor/automap/generic_unhookable.rules
editor/automap/generic_unhookable_0.7.rules
editor/automap/grass_main.rules
editor/automap/grass_main_0.7.rules
editor/automap/jungle_main.rules
editor/automap/jungle_midground.rules
editor/automap/round_tiles.rules
editor/automap/water.rules
editor/automap/winter_main.rules
editor/background.png editor/background.png
editor/basic_freeze.rules
editor/checker.png editor/checker.png
editor/cursor.png editor/cursor.png
editor/ddmax_freeze.rules
editor/ddnet_tiles.rules
editor/ddnet_walls.rules
editor/desert_main.rules
editor/entities/DDNet.png editor/entities/DDNet.png
editor/entities/FNG.png editor/entities/FNG.png
editor/entities/Race.png editor/entities/Race.png
@ -1431,23 +1402,12 @@ set(EXPECTED_DATA
editor/entities_clear/fng.png editor/entities_clear/fng.png
editor/entities_clear/race.png editor/entities_clear/race.png
editor/entities_clear/vanilla.png editor/entities_clear/vanilla.png
editor/fadeout.rules
editor/front.png editor/front.png
editor/generic_clear.rules
editor/generic_unhookable.rules
editor/generic_unhookable_0.7.rules
editor/grass_main.rules
editor/grass_main_0.7.rules
editor/jungle_main.rules
editor/jungle_midground.rules
editor/round_tiles.rules
editor/speed_arrow.png editor/speed_arrow.png
editor/speedup.png editor/speedup.png
editor/switch.png editor/switch.png
editor/tele.png editor/tele.png
editor/tune.png editor/tune.png
editor/water.rules
editor/winter_main.rules
emoticons.png emoticons.png
extras.png extras.png
fonts/DejaVuSans.ttf fonts/DejaVuSans.ttf
@ -2019,6 +1979,7 @@ set_src(ENGINE_GFX GLOB src/engine/gfx
image_manipulation.h image_manipulation.h
) )
set_src(GAME_SHARED GLOB src/game set_src(GAME_SHARED GLOB src/game
alloc.h
collision.cpp collision.cpp
collision.h collision.h
ddracechat.h ddracechat.h
@ -2303,7 +2264,7 @@ if(CLIENT)
ui_scrollregion.cpp ui_scrollregion.cpp
ui_scrollregion.h ui_scrollregion.h
) )
set_src(GAME_EDITOR GLOB src/game/editor set_src(GAME_EDITOR GLOB_RECURSE src/game/editor
auto_map.cpp auto_map.cpp
auto_map.h auto_map.h
component.cpp component.cpp
@ -2311,20 +2272,32 @@ if(CLIENT)
editor.cpp editor.cpp
editor.h editor.h
explanations.cpp explanations.cpp
io.cpp
layer_game.cpp
layer_quads.cpp
layer_sounds.cpp
layer_tiles.cpp
map_grid.cpp map_grid.cpp
map_grid.h map_grid.h
map_view.cpp map_view.cpp
map_view.h map_view.h
mapitems/image.cpp
mapitems/image.h
mapitems/layer_front.cpp
mapitems/layer_game.cpp
mapitems/layer_group.cpp
mapitems/layer_quads.cpp
mapitems/layer_sounds.cpp
mapitems/layer_speedup.cpp
mapitems/layer_switch.cpp
mapitems/layer_tele.cpp
mapitems/layer_tiles.cpp
mapitems/layer_tune.cpp
mapitems/map.cpp
mapitems/map_io.cpp
mapitems/sound.cpp
mapitems/sound.h
popups.cpp popups.cpp
proof_mode.cpp proof_mode.cpp
proof_mode.h proof_mode.h
smooth_value.cpp smooth_value.cpp
smooth_value.h smooth_value.h
tileart.cpp
) )
set(GAME_GENERATED_CLIENT set(GAME_GENERATED_CLIENT
src/game/generated/checksum.cpp src/game/generated/checksum.cpp
@ -2508,7 +2481,6 @@ if(SERVER)
upnp.h upnp.h
) )
set_src(GAME_SERVER GLOB_RECURSE src/game/server set_src(GAME_SERVER GLOB_RECURSE src/game/server
alloc.h
ddracechat.cpp ddracechat.cpp
ddracecommands.cpp ddracecommands.cpp
entities/character.cpp entities/character.cpp
@ -3078,8 +3050,6 @@ endif()
if(DEV) if(DEV)
# Don't generate CPack targets. # Don't generate CPack targets.
elseif(CMAKE_VERSION VERSION_LESS 3.6 OR CMAKE_VERSION VERSION_EQUAL 3.6)
message(WARNING "Cannot create CPack targets, CMake version too old. Use CMake 3.6 or newer.")
else() else()
set(EXTRA_ARGS DESTINATION ${CPACK_PACKAGE_FILE_NAME} COMPONENT portable EXCLUDE_FROM_ALL) set(EXTRA_ARGS DESTINATION ${CPACK_PACKAGE_FILE_NAME} COMPONENT portable EXCLUDE_FROM_ALL)
install(TARGETS ${CPACK_TARGETS} ${EXTRA_ARGS}) install(TARGETS ${CPACK_TARGETS} ${EXTRA_ARGS})
@ -3309,11 +3279,9 @@ foreach(target ${TARGETS_LINK})
endforeach() endforeach()
foreach(target ${TARGETS_OWN}) foreach(target ${TARGETS_OWN})
if((CMAKE_VERSION VERSION_GREATER 3.1 OR CMAKE_VERSION VERSION_EQUAL 3.1)) set_property(TARGET ${target} PROPERTY CXX_STANDARD 17)
set_property(TARGET ${target} PROPERTY CXX_STANDARD 17) set_property(TARGET ${target} PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ${target} PROPERTY CXX_STANDARD_REQUIRED ON) set_property(TARGET ${target} PROPERTY CXX_EXTENSIONS OFF)
set_property(TARGET ${target} PROPERTY CXX_EXTENSIONS OFF)
endif()
if(MSVC) if(MSVC)
target_compile_options(${target} PRIVATE /wd4244) # Possible loss of data (float -> int, int -> float, etc.). target_compile_options(${target} PRIVATE /wd4244) # Possible loss of data (float -> int, int -> float, etc.).
@ -3377,9 +3345,6 @@ foreach(target ${TARGETS_OWN})
target_compile_definitions(${target} PRIVATE CONF_DISCORD_DYNAMIC) target_compile_definitions(${target} PRIVATE CONF_DISCORD_DYNAMIC)
endif() endif()
endif() endif()
if(VERSION)
target_compile_definitions(${target} PRIVATE GAME_RELEASE_VERSION="${VERSION}")
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten") if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
target_compile_definitions(${target} PRIVATE CONF_WEBASM) target_compile_definitions(${target} PRIVATE CONF_WEBASM)
endif() endif()

View file

Before

Width:  |  Height:  |  Size: 740 B

After

Width:  |  Height:  |  Size: 740 B

View file

Before

Width:  |  Height:  |  Size: 4 KiB

After

Width:  |  Height:  |  Size: 4 KiB

View file

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 1.6 KiB

View file

Before

Width:  |  Height:  |  Size: 814 B

After

Width:  |  Height:  |  Size: 814 B

View file

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 2 KiB

View file

Before

Width:  |  Height:  |  Size: 2 KiB

After

Width:  |  Height:  |  Size: 2 KiB

View file

Before

Width:  |  Height:  |  Size: 4.5 KiB

After

Width:  |  Height:  |  Size: 4.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.8 KiB

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 4.8 KiB

View file

@ -6,30 +6,30 @@
default default
== -1 == -1
XEN ##### ISO 3166-2 subdivisions #####
GB-ENG
== 901 == 901
XNI GB-NIR
== 902 == 902
XSC GB-SCT
== 903 == 903
XWA GB-WLS
== 904 == 904
XEU ES-CT
== 905
XCA
== 906 == 906
XGL ES-GA
== 907 == 907
#south sudan, non official code# ##### ISO 3166/MA exceptional reservations #####
SS
== 737 EU
== 905
##### ISO 3166-1 based ##### ##### ISO 3166-1 based #####
@ -648,6 +648,9 @@ SB
SO SO
== 706 == 706
SS
== 737
ZA ZA
== 710 == 710

View file

@ -1,448 +1,448 @@
[Random Blocks] [Random Blocks]
Index 1 Index 1
Index 1 XFLIP Index 1 XFLIP
Random 40 Random 40
Index 1 YFLIP Index 1 YFLIP
Random 40 Random 40
Index 1 YFLIP XFLIP Index 1 YFLIP XFLIP
Random 40 Random 40
Index 2 Index 2
Random 40 Random 40
Index 2 XFLIP Index 2 XFLIP
Random 40 Random 40
Index 2 YFLIP Index 2 YFLIP
Random 40 Random 40
Index 2 YFLIP XFLIP Index 2 YFLIP XFLIP
Random 40 Random 40
Index 3 XFLIP Index 3 XFLIP
Random 40 Random 40
Index 3 YFLIP Index 3 YFLIP
Random 40 Random 40
Index 3 YFLIP XFLIP Index 3 YFLIP XFLIP
Random 40 Random 40
Index 4 Index 4
Random 40 Random 40
Index 4 XFLIP Index 4 XFLIP
Random 40 Random 40
Index 4 YFLIP Index 4 YFLIP
Random 40 Random 40
Index 4 YFLIP XFLIP Index 4 YFLIP XFLIP
Random 40 Random 40
Index 5 Index 5
Random 40 Random 40
Index 5 XFLIP Index 5 XFLIP
Random 40 Random 40
Index 5 YFLIP Index 5 YFLIP
Random 40 Random 40
Index 5 YFLIP XFLIP Index 5 YFLIP XFLIP
Random 40 Random 40
Index 6 Index 6
Random 40 Random 40
Index 6 XFLIP Index 6 XFLIP
Random 40 Random 40
Index 6 YFLIP Index 6 YFLIP
Random 40 Random 40
Index 6 YFLIP XFLIP Index 6 YFLIP XFLIP
Random 40 Random 40
Index 64 Index 64
Random 40 Random 40
Index 64 XFLIP Index 64 XFLIP
Random 40 Random 40
Index 64 YFLIP Index 64 YFLIP
Random 40 Random 40
Index 64 YFLIP XFLIP Index 64 YFLIP XFLIP
Random 40 Random 40
Index 65 Index 65
Random 40 Random 40
Index 65 XFLIP Index 65 XFLIP
Random 40 Random 40
Index 65 YFLIP Index 65 YFLIP
Random 40 Random 40
Index 65 YFLIP XFLIP Index 65 YFLIP XFLIP
Random 40 Random 40
Index 66 Index 66
Random 40 Random 40
Index 66 XFLIP Index 66 XFLIP
Random 40 Random 40
Index 66 YFLIP Index 66 YFLIP
Random 40 Random 40
Index 66 YFLIP XFLIP Index 66 YFLIP XFLIP
Random 40 Random 40
Index 67 Index 67
Random 40 Random 40
Index 67 XFLIP Index 67 XFLIP
Random 40 Random 40
Index 67 YFLIP Index 67 YFLIP
Random 40 Random 40
Index 67 YFLIP XFLIP Index 67 YFLIP XFLIP
Random 40 Random 40
#random 2x2 #random 2x2
Index 19 Index 19
Pos 0 0 FULL Pos 0 0 FULL
Pos 1 0 FULL Pos 1 0 FULL
Pos 0 1 FULL Pos 0 1 FULL
Pos 1 1 FULL Pos 1 1 FULL
Pos -1 0 NOTINDEX -1 Pos -1 0 NOTINDEX -1
Pos 0 -1 NOTINDEX -1 Pos 0 -1 NOTINDEX -1
Pos 0 2 NOTINDEX -1 Pos 0 2 NOTINDEX -1
Pos 2 0 NOTINDEX -1 Pos 2 0 NOTINDEX -1
Random 100 Random 100
#random 3x3 #random 3x3
Index 16 Index 16
Pos 0 0 FULL Pos 0 0 FULL
Pos 1 0 FULL Pos 1 0 FULL
Pos 2 0 FULL Pos 2 0 FULL
Pos 0 1 FULL Pos 0 1 FULL
Pos 1 1 FULL Pos 1 1 FULL
Pos 2 1 FULL Pos 2 1 FULL
Pos 0 2 FULL Pos 0 2 FULL
Pos 1 2 FULL Pos 1 2 FULL
Pos 2 2 FULL Pos 2 2 FULL
Pos -1 0 NOTINDEX -1 Pos -1 0 NOTINDEX -1
Pos 0 -1 NOTINDEX -1 Pos 0 -1 NOTINDEX -1
Pos 0 3 NOTINDEX -1 Pos 0 3 NOTINDEX -1
Pos 3 0 NOTINDEX -1 Pos 3 0 NOTINDEX -1
Random 100 Random 100
NewRun NewRun
#Remove overlaps #Remove overlaps
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos -2 -2 INDEX 16 OR 19 Pos -2 -2 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos -1 -2 INDEX 16 OR 19 Pos -1 -2 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 0 -2 INDEX 16 OR 19 Pos 0 -2 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 1 -2 INDEX 16 OR 19 Pos 1 -2 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 2 -2 INDEX 16 OR 19 Pos 2 -2 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos -2 -1 INDEX 16 OR 19 Pos -2 -1 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos -1 -1 INDEX 16 OR 19 Pos -1 -1 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 0 -1 INDEX 16 OR 19 Pos 0 -1 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 1 -1 INDEX 16 OR 19 Pos 1 -1 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 2 -1 INDEX 16 OR 19 Pos 2 -1 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos -2 0 INDEX 16 OR 19 Pos -2 0 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos -1 0 INDEX 16 OR 19 Pos -1 0 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 1 0 INDEX 16 OR 19 Pos 1 0 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 2 0 INDEX 16 OR 19 Pos 2 0 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos -2 1 INDEX 16 OR 19 Pos -2 1 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos -1 1 INDEX 16 OR 19 Pos -1 1 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 0 1 INDEX 16 OR 19 Pos 0 1 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 1 1 INDEX 16 OR 19 Pos 1 1 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 2 1 INDEX 16 OR 19 Pos 2 1 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos -2 2 INDEX 16 OR 19 Pos -2 2 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos -1 2 INDEX 16 OR 19 Pos -1 2 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 0 2 INDEX 16 OR 19 Pos 0 2 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 1 2 INDEX 16 OR 19 Pos 1 2 INDEX 16 OR 19
Index 1 Index 1
Pos 0 0 INDEX 16 OR 19 Pos 0 0 INDEX 16 OR 19
Pos 2 2 INDEX 16 OR 19 Pos 2 2 INDEX 16 OR 19
NewRun NewRun
#Fill tiles #Fill tiles
Index 20 Index 20
Pos -1 0 INDEX 19 Pos -1 0 INDEX 19
Index 35 Index 35
Pos 0 -1 INDEX 19 Pos 0 -1 INDEX 19
Index 36 Index 36
Pos -1 -1 INDEX 19 Pos -1 -1 INDEX 19
Index 17 Index 17
Pos -1 0 INDEX 16 Pos -1 0 INDEX 16
Index 18 Index 18
Pos -2 0 INDEX 16 Pos -2 0 INDEX 16
Index 32 Index 32
Pos 0 -1 INDEX 16 Pos 0 -1 INDEX 16
Index 33 Index 33
Pos -1 -1 INDEX 16 Pos -1 -1 INDEX 16
Index 34 Index 34
Pos -2 -1 INDEX 16 Pos -2 -1 INDEX 16
Index 48 Index 48
Pos 0 -2 INDEX 16 Pos 0 -2 INDEX 16
Index 49 Index 49
Pos -1 -2 INDEX 16 Pos -1 -2 INDEX 16
Index 50 Index 50
Pos -2 -2 INDEX 16 Pos -2 -2 INDEX 16
[Random small Blocks] [Random small Blocks]
Index 1 Index 1
Index 1 XFLIP Index 1 XFLIP
Random 40 Random 40
Index 1 YFLIP Index 1 YFLIP
Random 40 Random 40
Index 1 YFLIP XFLIP Index 1 YFLIP XFLIP
Random 40 Random 40
Index 2 Index 2
Random 40 Random 40
Index 2 XFLIP Index 2 XFLIP
Random 40 Random 40
Index 2 YFLIP Index 2 YFLIP
Random 40 Random 40
Index 2 YFLIP XFLIP Index 2 YFLIP XFLIP
Random 40 Random 40
Index 3 XFLIP Index 3 XFLIP
Random 40 Random 40
Index 3 YFLIP Index 3 YFLIP
Random 40 Random 40
Index 3 YFLIP XFLIP Index 3 YFLIP XFLIP
Random 40 Random 40
Index 4 Index 4
Random 40 Random 40
Index 4 XFLIP Index 4 XFLIP
Random 40 Random 40
Index 4 YFLIP Index 4 YFLIP
Random 40 Random 40
Index 4 YFLIP XFLIP Index 4 YFLIP XFLIP
Random 40 Random 40
Index 5 Index 5
Random 40 Random 40
Index 5 XFLIP Index 5 XFLIP
Random 40 Random 40
Index 5 YFLIP Index 5 YFLIP
Random 40 Random 40
Index 5 YFLIP XFLIP Index 5 YFLIP XFLIP
Random 40 Random 40
Index 6 Index 6
Random 40 Random 40
Index 6 XFLIP Index 6 XFLIP
Random 40 Random 40
Index 6 YFLIP Index 6 YFLIP
Random 40 Random 40
Index 6 YFLIP XFLIP Index 6 YFLIP XFLIP
Random 40 Random 40
Index 64 Index 64
Random 40 Random 40
Index 64 XFLIP Index 64 XFLIP
Random 40 Random 40
Index 64 YFLIP Index 64 YFLIP
Random 40 Random 40
Index 64 YFLIP XFLIP Index 64 YFLIP XFLIP
Random 40 Random 40
Index 65 Index 65
Random 40 Random 40
Index 65 XFLIP Index 65 XFLIP
Random 40 Random 40
Index 65 YFLIP Index 65 YFLIP
Random 40 Random 40
Index 65 YFLIP XFLIP Index 65 YFLIP XFLIP
Random 40 Random 40
Index 66 Index 66
Random 40 Random 40
Index 66 XFLIP Index 66 XFLIP
Random 40 Random 40
Index 66 YFLIP Index 66 YFLIP
Random 40 Random 40
Index 66 YFLIP XFLIP Index 66 YFLIP XFLIP
Random 40 Random 40
Index 67 Index 67
Random 40 Random 40
Index 67 XFLIP Index 67 XFLIP
Random 40 Random 40
Index 67 YFLIP Index 67 YFLIP
Random 40 Random 40
Index 67 YFLIP XFLIP Index 67 YFLIP XFLIP
Random 40 Random 40
[Random Decoration] [Random Decoration]
Index 7 Index 7
Index 7 XFLIP Index 7 XFLIP
Random 18 Random 18
Index 7 YFLIP Index 7 YFLIP
Random 18 Random 18
Index 7 YFLIP XFLIP Index 7 YFLIP XFLIP
Random 18 Random 18
Index 21 Index 21
Random 18 Random 18
Index 21 XFLIP Index 21 XFLIP
Random 18 Random 18
Index 21 YFLIP Index 21 YFLIP
Random 18 Random 18
Index 21 YFLIP XFLIP Index 21 YFLIP XFLIP
Random 18 Random 18
Index 23 Index 23
Random 18 Random 18
Index 23 XFLIP Index 23 XFLIP
Random 18 Random 18
Index 23 YFLIP Index 23 YFLIP
Random 18 Random 18
Index 23 YFLIP XFLIP Index 23 YFLIP XFLIP
Random 18 Random 18
Index 51 Index 51
Random 18 Random 18
Index 51 XFLIP Index 51 XFLIP
Random 18 Random 18
Index 51 YFLIP Index 51 YFLIP
Random 18 Random 18
Index 51 YFLIP XFLIP Index 51 YFLIP XFLIP
Random 18 Random 18
Index 68 Index 68
Random 18 Random 18

View file

@ -140,9 +140,6 @@ Favorites
Feet Feet
== ﺔﻣﺰﺟ == ﺔﻣﺰﺟ
Filter
== ﺔﻴﻔﺼﺗ
Fire Fire
== ﺭﺎﻧ == ﺭﺎﻧ
@ -155,9 +152,6 @@ Force vote
Free-View Free-View
== ﺮﺤﻟﺍ ﺮﻈﻨﻤﻟﺍ == ﺮﺤﻟﺍ ﺮﻈﻨﻤﻟﺍ
Friends
== ﺀﺎﻗﺪﺻﻻﺍ
Fullscreen Fullscreen
== ﻞﻣﺎﻜﻟﺍ ﺔﺷﺎﺸﻟﺍ ﻊﺿﻭ == ﻞﻣﺎﻜﻟﺍ ﺔﺷﺎﺸﻟﺍ ﻊﺿﻭ
@ -354,12 +348,6 @@ Screenshot
Server address: Server address:
== ﺮﻓﺮﻴﺴﻟﺍ ﻥﺍﻮﻨﻋ: == ﺮﻓﺮﻴﺴﻟﺍ ﻥﺍﻮﻨﻋ:
Server details
== ﺮﻓﺮﻴﺴﻟﺍ ﻞﻴﺻﺎﻔﺗ
Server filter
== ﺮﻓﺮﻴﺴﻟﺍ ﺔﻴﻔﺼﺗ
Server info Server info
== ﺮﻓﺮﻴﺴﻟﺍ ﺕﺎﻣﻮﻠﻌﻣ == ﺮﻓﺮﻴﺴﻟﺍ ﺕﺎﻣﻮﻠﻌﻣ
@ -528,9 +516,6 @@ Netversion:
Map: Map:
== ﺏﺎﻤﻟﺍ: == ﺏﺎﻤﻟﺍ:
Info
== ﺕﺎﻣﻮﻠﻌﻣ
Hue Hue
== ﻥﻮﻟ == ﻥﻮﻟ
@ -1355,12 +1340,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -1376,12 +1384,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -1397,6 +1399,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
Loading demo files Loading demo files
== ==
@ -1448,10 +1453,10 @@ Open the directory that contains the configuration and user files
Open the directory to add custom themes Open the directory to add custom themes
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download community skins Download community skins

View file

@ -147,9 +147,6 @@ Favorites
Feet Feet
== Ногі == Ногі
Filter
== Фільтр
Fire Fire
== Стрэл == Стрэл
@ -162,9 +159,6 @@ Force vote
Free-View Free-View
== Вольны агляд == Вольны агляд
Friends
== Сябры
Fullscreen Fullscreen
== Поўнаэкранны рэжым == Поўнаэкранны рэжым
@ -358,12 +352,6 @@ Screenshot
Server address: Server address:
== Адрас сервера: == Адрас сервера:
Server details
== Дэталі сервера
Server filter
== Фільтр сервераў
Server info Server info
== Інфармацыя == Інфармацыя
@ -532,9 +520,6 @@ Netversion:
Map: Map:
== Карта: == Карта:
Info
== Інфа
Hue Hue
== Адценне == Адценне
@ -1727,6 +1712,26 @@ Unable to rename the folder
(paused) (paused)
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Render cut to video
==
All combined All combined
== ==

View file

@ -148,9 +148,6 @@ Favorites
Feet Feet
== Stopala == Stopala
Filter
== Filter
Fire Fire
== Pucanje == Pucanje
@ -163,9 +160,6 @@ Force vote
Free-View Free-View
== Slobodan pogled == Slobodan pogled
Friends
== Prijatelji
Fullscreen Fullscreen
== Čitav ekran == Čitav ekran
@ -359,12 +353,6 @@ Screenshot
Server address: Server address:
== Adresa servera: == Adresa servera:
Server details
== Podaci o serveru
Server filter
== Filter servera
Server info Server info
== O Serveru == O Serveru
@ -535,9 +523,6 @@ Netversion:
Map: Map:
== Mapa: == Mapa:
Info
== Info
Hue Hue
== Nijans. == Nijans.
@ -1247,12 +1232,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -1268,12 +1276,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -1289,6 +1291,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
Loading demo files Loading demo files
== ==
@ -1361,10 +1366,10 @@ Open the directory to add custom themes
Max CSVs Max CSVs
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download skins Download skins

View file

@ -170,9 +170,6 @@ Favorites
Feet Feet
== Pés == Pés
Filter
== Filtro
Fire Fire
== Atirar == Atirar
@ -185,9 +182,6 @@ Force vote
Free-View Free-View
== Visualização livre == Visualização livre
Friends
== Amigos
Fullscreen Fullscreen
== Tela cheia == Tela cheia
@ -384,12 +378,6 @@ Screenshot
Server address: Server address:
== Endereço: == Endereço:
Server details
== Detalhes do servidor
Server filter
== Filtro de servidores
Server info Server info
== Servidor == Servidor
@ -576,9 +564,6 @@ Show ghost
Clan plates size Clan plates size
== Tamanho da placa do clã == Tamanho da placa do clã
Info
== Info
No updates available No updates available
== Nenhuma atualização disponível == Nenhuma atualização disponível
@ -1767,3 +1752,23 @@ Unable to delete the folder '%s'. Make sure it's empty first.
Moved ingame Moved ingame
== Movido no jogo == Movido no jogo
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Render cut to video
==

View file

@ -145,9 +145,6 @@ Favorites
Feet Feet
== Крака == Крака
Filter
== Филтър
Fire Fire
== Стрелба == Стрелба
@ -160,9 +157,6 @@ Force vote
Free-View Free-View
== Свободен Изглед == Свободен Изглед
Friends
== Приятели
Fullscreen Fullscreen
== Цял Екран == Цял Екран
@ -356,12 +350,6 @@ Screenshot
Server address: Server address:
== Адрес на сървъра: == Адрес на сървъра:
Server details
== Детайли за Сървъра
Server filter
== Филтър на сървъра
Server info Server info
== Инфо == Инфо
@ -529,9 +517,6 @@ Netversion:
Map: Map:
== Карта: == Карта:
Info
== Инфо
Hue Hue
== Оттенък == Оттенък
@ -908,12 +893,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -929,12 +937,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -953,6 +955,9 @@ Cut length
Remove chat Remove chat
== ==
Render cut to video
==
Please use a different name Please use a different name
== ==
@ -1103,10 +1108,10 @@ Max CSVs
Dummy settings Dummy settings
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download skins Download skins
@ -1160,10 +1165,16 @@ Show all
Toggle dyncam Toggle dyncam
== ==
Toggle dummy Toggle ghost
== ==
Toggle ghost Converse
==
Chat command
==
Toggle dummy
== ==
Dummy copy Dummy copy
@ -1172,9 +1183,6 @@ Dummy copy
Hammerfly dummy Hammerfly dummy
== ==
Converse
==
Spectate previous Spectate previous
== ==
@ -1190,9 +1198,6 @@ Show entities
Show HUD Show HUD
== ==
Chat command
==
Enable controller Enable controller
== ==

View file

@ -140,9 +140,6 @@ Favorites
Feet Feet
== Peus == Peus
Filter
== Filtre
Fire Fire
== Disparar == Disparar
@ -155,9 +152,6 @@ Force vote
Free-View Free-View
== Vista lliure == Vista lliure
Friends
== Amics
Fullscreen Fullscreen
== Pantalla completa == Pantalla completa
@ -354,12 +348,6 @@ Screenshot
Server address: Server address:
== IP del servidor: == IP del servidor:
Server details
== Detalls del servidor
Server filter
== Filtre del servidor
Server info Server info
== Servidor == Servidor
@ -540,9 +528,6 @@ Netversion:
Map: Map:
== Mapa: == Mapa:
Info
== Informació
Hue Hue
== Tonalitat == Tonalitat
@ -1427,12 +1412,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -1448,12 +1456,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -1469,6 +1471,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
Loading demo files Loading demo files
== ==
@ -1514,10 +1519,10 @@ Open the directory that contains the configuration and user files
Open the directory to add custom themes Open the directory to add custom themes
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download community skins Download community skins

View file

@ -145,9 +145,6 @@ Favorites
Feet Feet
== Урасем == Урасем
Filter
== Фильтр
Fire Fire
== Пĕрӳ == Пĕрӳ
@ -160,9 +157,6 @@ Force vote
Free-View Free-View
== Ирĕклĕ обзор == Ирĕклĕ обзор
Friends
== Юлташсем
Fullscreen Fullscreen
== Тулли экран == Тулли экран
@ -356,12 +350,6 @@ Screenshot
Server address: Server address:
== Сервер адресĕ == Сервер адресĕ
Server details
== Сервер тĕплĕсем
Server filter
== Серверсен фильтр
Server info Server info
== Пĕлтерӳ == Пĕлтерӳ
@ -535,9 +523,6 @@ Miscellaneous
Netversion: Netversion:
== Версия: == Версия:
Info
== Пĕлтерӳ
UI Color UI Color
== Интерфейс тĕсĕ == Интерфейс тĕсĕ
@ -911,12 +896,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -932,12 +940,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -956,6 +958,9 @@ Cut length
Remove chat Remove chat
== ==
Render cut to video
==
Please use a different name Please use a different name
== ==
@ -1106,10 +1111,10 @@ Max CSVs
Dummy settings Dummy settings
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download skins Download skins
@ -1163,10 +1168,16 @@ Show all
Toggle dyncam Toggle dyncam
== ==
Toggle dummy Toggle ghost
== ==
Toggle ghost Converse
==
Chat command
==
Toggle dummy
== ==
Dummy copy Dummy copy
@ -1175,9 +1186,6 @@ Dummy copy
Hammerfly dummy Hammerfly dummy
== ==
Converse
==
Statboard Statboard
== ==
@ -1190,9 +1198,6 @@ Show entities
Show HUD Show HUD
== ==
Chat command
==
Enable controller Enable controller
== ==

View file

@ -148,9 +148,6 @@ Favorites
Feet Feet
== Nohy == Nohy
Filter
== Filtr
Fire Fire
== Střelba == Střelba
@ -163,9 +160,6 @@ Force vote
Free-View Free-View
== Volný pohled == Volný pohled
Friends
== Přátelé
Fullscreen Fullscreen
== Celá obrazovka == Celá obrazovka
@ -355,12 +349,6 @@ Screenshot
Server address: Server address:
== Adresa serveru: == Adresa serveru:
Server details
== Detaily serveru
Server filter
== Filtr serverů
Server info Server info
== Informace == Informace
@ -531,9 +519,6 @@ Netversion:
Map: Map:
== Mapa: == Mapa:
Info
== Info
Hue Hue
== Tón == Tón
@ -1365,12 +1350,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -1386,12 +1394,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -1407,6 +1409,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
Loading demo files Loading demo files
== ==
@ -1458,10 +1463,10 @@ Open the directory that contains the configuration and user files
Open the directory to add custom themes Open the directory to add custom themes
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download community skins Download community skins

View file

@ -146,9 +146,6 @@ Favorites
Feet Feet
== Fødder == Fødder
Filter
== Filter
Fire Fire
== Skyd == Skyd
@ -161,9 +158,6 @@ Force vote
Free-View Free-View
== Free-View == Free-View
Friends
== Venner
Fullscreen Fullscreen
== Fuldskærm == Fuldskærm
@ -357,12 +351,6 @@ Screenshot
Server address: Server address:
== Serveradresse == Serveradresse
Server details
== Serverdetaljer
Server filter
== Serverfilter
Server info Server info
== Serverinfo == Serverinfo
@ -533,9 +521,6 @@ Netversion:
Map: Map:
== Bane == Bane
Info
== Info
Hue Hue
== Farve == Farve
@ -1363,12 +1348,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -1384,12 +1392,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -1405,6 +1407,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
Loading demo files Loading demo files
== ==
@ -1456,10 +1461,10 @@ Open the directory that contains the configuration and user files
Open the directory to add custom themes Open the directory to add custom themes
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download community skins Download community skins

View file

@ -158,9 +158,6 @@ Favorites
Feet Feet
== Voeten == Voeten
Filter
== Filter
Fire Fire
== Schieten == Schieten
@ -173,9 +170,6 @@ Force vote
Free-View Free-View
== Vrij bewegen == Vrij bewegen
Friends
== Vrienden
Fullscreen Fullscreen
== Volledig scherm == Volledig scherm
@ -369,12 +363,6 @@ Screenshot
Server address: Server address:
== Serveradres: == Serveradres:
Server details
== Serverdetails
Server filter
== Serverfilter
Server info Server info
== Serverinfo == Serverinfo
@ -545,9 +533,6 @@ Netversion:
Map: Map:
== Kaart: == Kaart:
Info
== Info
Hue Hue
== Tint == Tint
@ -1473,12 +1458,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -1494,12 +1502,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -1515,6 +1517,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
Loading demo files Loading demo files
== ==

View file

@ -273,9 +273,6 @@ Countries
Favorite Favorite
== Favorati == Favorati
Friends
== Amikoj
Name Name
== Nomo == Nomo
@ -285,9 +282,6 @@ Clan
Add Friend Add Friend
== Aldoni amikon == Aldoni amikon
Filter
== Filtri
Please use a different name Please use a different name
== Bonvolu uzi malsaman nomon == Bonvolu uzi malsaman nomon
@ -767,9 +761,6 @@ The server is running a non-standard tuning on a pure game type.
Loading menu images Loading menu images
== ==
Server filter
==
Has people playing Has people playing
== ==
@ -797,9 +788,6 @@ Types
Reset filter Reset filter
== ==
Server details
==
Copy info Copy info
== ==
@ -843,9 +831,6 @@ Remove friend
Add Clan Add Clan
== ==
Info
==
Play the current demo Play the current demo
== ==
@ -855,12 +840,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -876,12 +884,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -900,6 +902,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
File already exists, do you want to overwrite it? File already exists, do you want to overwrite it?
== ==
@ -1086,15 +1091,15 @@ Automatically create statboard csv
Max CSVs Max CSVs
== ==
Toggle to edit your dummy settings
==
Loading skin files Loading skin files
== ==
Your skin Your skin
== ==
Toggle to edit your dummy settings
==
Download skins Download skins
== ==
@ -1143,18 +1148,9 @@ Default zoom
Toggle dyncam Toggle dyncam
== ==
Toggle dummy
==
Toggle ghost Toggle ghost
== ==
Dummy copy
==
Hammerfly dummy
==
Shotgun Shotgun
== ==
@ -1173,6 +1169,18 @@ Team chat
Converse Converse
== ==
Chat command
==
Toggle dummy
==
Dummy copy
==
Hammerfly dummy
==
Emoticon Emoticon
== ==
@ -1209,9 +1217,6 @@ Show entities
Show HUD Show HUD
== ==
Chat command
==
Enable controller Enable controller
== ==

View file

@ -147,9 +147,6 @@ Favorites
Feet Feet
== Jalat == Jalat
Filter
== Suotimet
Fire Fire
== Ammu == Ammu
@ -162,9 +159,6 @@ Force vote
Free-View Free-View
== Vapaa näkymä == Vapaa näkymä
Friends
== Ystävät
Fullscreen Fullscreen
== Koko näyttö == Koko näyttö
@ -358,12 +352,6 @@ Screenshot
Server address: Server address:
== Palvelimen osoite: == Palvelimen osoite:
Server details
== Palvelimen yksityiskohdat
Server filter
== Palvelinsuotimet
Server info Server info
== Palvelintiedot == Palvelintiedot
@ -532,9 +520,6 @@ Netversion:
Map: Map:
== Kenttä: == Kenttä:
Info
== Info
Hue Hue
== Värisävy == Värisävy
@ -1320,12 +1305,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -1341,12 +1349,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -1362,6 +1364,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
Loading demo files Loading demo files
== ==
@ -1422,10 +1427,10 @@ Automatically create statboard csv
Max CSVs Max CSVs
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download community skins Download community skins
@ -1443,15 +1448,15 @@ Create a random skin
Open the directory to add custom skins Open the directory to add custom skins
== ==
Converse
==
Dummy copy Dummy copy
== ==
Hammerfly dummy Hammerfly dummy
== ==
Converse
==
Statboard Statboard
== ==

View file

@ -169,9 +169,6 @@ Favorites
Feet Feet
== Pieds == Pieds
Filter
== Filtre
Fire Fire
== Tirer == Tirer
@ -184,9 +181,6 @@ Force vote
Free-View Free-View
== Vue libre == Vue libre
Friends
== Amis
Fullscreen Fullscreen
== Plein écran == Plein écran
@ -380,12 +374,6 @@ Screenshot
Server address: Server address:
== Adresse du serveur : == Adresse du serveur :
Server details
== Détails du serveur
Server filter
== Filtres du serveur
Server info Server info
== Info. serveur == Info. serveur
@ -556,9 +544,6 @@ Netversion:
Map: Map:
== Carte : == Carte :
Info
== Info.
Hue Hue
== Teinte == Teinte
@ -1727,6 +1712,23 @@ Unable to rename the folder
No server selected No server selected
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Mark the beginning of a cut (right click to reset) Mark the beginning of a cut (right click to reset)
== ==
@ -1745,6 +1747,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
All combined All combined
== ==

View file

@ -145,9 +145,6 @@ Favorites
Feet Feet
== Pés == Pés
Filter
== Filtro
Fire Fire
== Disparar == Disparar
@ -160,9 +157,6 @@ Force vote
Free-View Free-View
== Vista libre == Vista libre
Friends
== Amigos
Fullscreen Fullscreen
== Pantalla completa == Pantalla completa
@ -359,12 +353,6 @@ Screenshot
Server address: Server address:
== IP do servidor: == IP do servidor:
Server details
== Detalles do servidor
Server filter
== Filtro do servidor
Server info Server info
== Servidor == Servidor
@ -536,9 +524,6 @@ Netversion:
Map: Map:
== Mapa: == Mapa:
Info
== Información
Hue Hue
== Matiz == Matiz
@ -1698,6 +1683,23 @@ Unable to rename the folder
No server selected No server selected
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Mark the beginning of a cut (right click to reset) Mark the beginning of a cut (right click to reset)
== ==
@ -1716,6 +1718,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
All combined All combined
== ==

View file

@ -163,9 +163,6 @@ Favorites
Feet Feet
== Füße == Füße
Filter
== Filter
Fire Fire
== Feuern == Feuern
@ -178,9 +175,6 @@ Force vote
Free-View Free-View
== Freie Ansicht == Freie Ansicht
Friends
== Freunde
Fullscreen Fullscreen
== Vollbild == Vollbild
@ -377,12 +371,6 @@ Screenshot
Server address: Server address:
== Serveradresse: == Serveradresse:
Server details
== Serverdetails
Server filter
== Filter
Server info Server info
== Serverinfo == Serverinfo
@ -566,9 +554,6 @@ Netversion:
Map: Map:
== Karte: == Karte:
Info
== Info
Hue Hue
== Farb. == Farb.
@ -1760,3 +1745,23 @@ Unable to delete the folder '%s'. Make sure it's empty first.
Moved ingame Moved ingame
== Im Spiel bewegt == Im Spiel bewegt
Go back the specified duration
== Gesetzte Dauer zurück
[Demo player duration]
%d min.
== %d Min.
[Demo player duration]
%d sec.
== %d Sek.
Change the skip duration
== Überspring-Dauer ändern
Go forward the specified duration
== Gesetzte Dauer vorwärts
Render cut to video
== Schnitt zu Video rendern

View file

@ -145,9 +145,6 @@ Favorites
Feet Feet
== Πόδια == Πόδια
Filter
== Φίλτρο
Fire Fire
== Πυρ == Πυρ
@ -160,9 +157,6 @@ Force vote
Free-View Free-View
== Ελεύθερη Όψη == Ελεύθερη Όψη
Friends
== Φίλοι
Fullscreen Fullscreen
== Πλήρης οθόνη == Πλήρης οθόνη
@ -359,12 +353,6 @@ Screenshot
Server address: Server address:
== Διεύθ/ση διακομιστή: == Διεύθ/ση διακομιστή:
Server details
== Λεπτομέριες διακομιστή
Server filter
== Φίλτρο διακομιστών
Server info Server info
== Πληροφορίες == Πληροφορίες
@ -538,9 +526,6 @@ Netversion:
Map: Map:
== Χάρτης: == Χάρτης:
Info
== Πληροφορίες
Hue Hue
== Απόχρωση == Απόχρωση
@ -914,12 +899,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -935,12 +943,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -959,6 +961,9 @@ Cut length
Remove chat Remove chat
== ==
Render cut to video
==
Please use a different name Please use a different name
== ==
@ -1109,10 +1114,10 @@ Max CSVs
Dummy settings Dummy settings
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download skins Download skins
@ -1166,10 +1171,16 @@ Show all
Toggle dyncam Toggle dyncam
== ==
Toggle dummy Toggle ghost
== ==
Toggle ghost Converse
==
Chat command
==
Toggle dummy
== ==
Dummy copy Dummy copy
@ -1178,9 +1189,6 @@ Dummy copy
Hammerfly dummy Hammerfly dummy
== ==
Converse
==
Statboard Statboard
== ==
@ -1193,9 +1201,6 @@ Show entities
Show HUD Show HUD
== ==
Chat command
==
Enable controller Enable controller
== ==

View file

@ -144,9 +144,6 @@ Favorites
Feet Feet
== Láb == Láb
Filter
== Szűrő
Fire Fire
== Tűz == Tűz
@ -159,9 +156,6 @@ Force vote
Free-View Free-View
== Szabad nézet == Szabad nézet
Friends
== Barátok
Fullscreen Fullscreen
== Teljesképernyő == Teljesképernyő
@ -349,12 +343,6 @@ Screenshot
Server address: Server address:
== Szerver címe: == Szerver címe:
Server details
== Szerver részletei
Server filter
== Szerver szűrő
Server info Server info
== Szerver infó == Szerver infó
@ -511,9 +499,6 @@ Netversion:
Map: Map:
== Pálya: == Pálya:
Info
== Infó
Miscellaneous Miscellaneous
== Egyéb == Egyéb
@ -1703,6 +1688,23 @@ None
Add Clan Add Clan
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Mark the beginning of a cut (right click to reset) Mark the beginning of a cut (right click to reset)
== ==
@ -1721,6 +1723,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
All combined All combined
== ==

View file

@ -152,9 +152,6 @@ Favorites
Feet Feet
== Piedi == Piedi
Filter
== Filtro
Fire Fire
== Fuoco == Fuoco
@ -167,9 +164,6 @@ Force vote
Free-View Free-View
== Visione libera == Visione libera
Friends
== Amici
Fullscreen Fullscreen
== Schermo intero == Schermo intero
@ -363,12 +357,6 @@ Screenshot
Server address: Server address:
== Indirizzo server: == Indirizzo server:
Server details
== Dettagli server
Server filter
== Filtro server
Server info Server info
== Info server == Info server
@ -536,9 +524,6 @@ Netversion:
Map: Map:
== Mappa: == Mappa:
Info
== Info
Hue Hue
== Tinta == Tinta
@ -1167,51 +1152,6 @@ Grabs
9+ new mentions 9+ new mentions
== +9 nuove menzioni == +9 nuove menzioni
[Graphics error]
Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.
==
[Graphics error]
Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution.
==
[Graphics error]
An error during command recording occurred. Try to update your GPU drivers.
==
[Graphics error]
A render command failed. Try to update your GPU drivers.
==
[Graphics error]
Submitting the render commands failed. Try to update your GPU drivers.
==
[Graphics error]
Failed to swap framebuffers. Try to update your GPU drivers.
==
[Graphics error]
Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.
==
[Graphics error]
Could not initialize the given graphics backend, reverting to the default backend now.
==
[Graphics error]
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not save downloaded map. Try manually deleting this file: %s
==
The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs.
==
The format of texture %s is not RGBA which will cause visual bugs.
==
Preparing demo playback Preparing demo playback
== Preparando la riproduzione della demo == Preparando la riproduzione della demo
@ -1221,9 +1161,6 @@ Connected
Loading map file from storage Loading map file from storage
== Caricando il file mappa dalla memoria == Caricando il file mappa dalla memoria
Why are you slowmo replaying to read this?
==
Initializing components Initializing components
== Inizializzando i componenti == Inizializzando i componenti
@ -1302,55 +1239,18 @@ Join Tutorial Server
Skip Tutorial Skip Tutorial
== Salta Tutorial == Salta Tutorial
Loading menu images
==
AFR
==
ASI
==
AUS
==
EUR
==
NA
==
SA
==
CHN
==
Getting server list from master server Getting server list from master server
== Ottenere l'elenco dei server dal server principale == Ottenere l'elenco dei server dal server principale
Are you sure that you want to disconnect and switch to a different server? Are you sure that you want to disconnect and switch to a different server?
== Sei sicuro di voler disconnetterti e passare a un altro server? == Sei sicuro di voler disconnetterti e passare a un altro server?
Copy info
==
Leak IP
==
No server selected No server selected
== Nessun server selezionato == Nessun server selezionato
Online players (%d)
==
Online clanmates (%d) Online clanmates (%d)
== Compagni di clan online == Compagni di clan online
[friends (server browser)]
Offline (%d)
==
Click to select server. Double click to join your friend. Click to select server. Double click to join your friend.
== Fare click per selezionare il server. Fai doppio click per unirti al tuo amico. == Fare click per selezionare il server. Fai doppio click per unirti al tuo amico.
@ -1372,123 +1272,9 @@ Are you sure that you want to remove the clan '%s' from your friends list?
Add Clan Add Clan
== Aggiungi Clan == Aggiungi Clan
Play the current demo
==
Pause the current demo
==
Stop the current demo
==
Go back one tick
==
Go forward one tick
==
Slow down the demo
==
Speed up the demo
==
Mark the beginning of a cut (right click to reset)
==
Mark the end of a cut (right click to reset)
==
Export cut as a separate demo
==
Go back one marker
==
Go forward one marker
==
Close the demo player
==
Toggle keyboard shortcuts
==
Export demo cut
==
Cut interval
==
Cut length
==
Loading demo files
==
All combined
==
Folder Link
==
Markers:
==
%.2f MiB
==
%.2f KiB
==
Open the directory that contains the demo files
==
Are you sure that you want to delete the folder '%s'?
==
Are you sure that you want to delete the demo '%s'?
==
Delete folder Delete folder
== Cancella cartella == Cancella cartella
Unable to delete the demo '%s'
==
Unable to delete the folder '%s'. Make sure it's empty first.
==
Loading ghost files
==
Menu opened. Press Esc key again to close menu.
==
Save power by lowering refresh rate (higher input latency)
==
Settings file
==
Open the settings file
==
Config directory
==
Open the directory that contains the configuration and user files
==
Open the directory to add custom themes
==
Loading skin files
==
Toggle to edit your dummy settings
==
Download community skins Download community skins
== Scarica skin comunitá == Scarica skin comunitá
@ -1501,18 +1287,9 @@ Create a random skin
Open the directory to add custom skins Open the directory to add custom skins
== Apri la cartella per aggiungere una skin custom == Apri la cartella per aggiungere una skin custom
Converse
==
Chat command
==
Enable controller Enable controller
== Abilitá controller == Abilitá controller
Controller
==
Ingame controller mode Ingame controller mode
== Modalitá controller in gioco == Modalitá controller in gioco
@ -1520,19 +1297,6 @@ Ingame controller mode
Relative Relative
== Relativo == Relativo
[Ingame controller mode]
Absolute
==
Ingame controller sens.
==
UI controller sens.
==
Controller jitter tolerance
==
No controller found. Plug in a controller. No controller found. Plug in a controller.
== Nessun controller trovato. Collega un controller. == Nessun controller trovato. Collega un controller.
@ -1542,12 +1306,6 @@ Axis
Status Status
== Stato == Stato
Aim bind
==
Mouse
==
Ingame mouse sens. Ingame mouse sens.
== Sens. mouse in gioco == Sens. mouse in gioco
@ -1563,9 +1321,6 @@ Are you sure that you want to reset the controls to their defaults?
Cancel Cancel
== Cancella == Cancella
Dummy
==
Windowed Windowed
== Finestra == Finestra
@ -1578,42 +1333,15 @@ Windowed fullscreen
Desktop fullscreen Desktop fullscreen
== Desktop schermo intero == Desktop schermo intero
Allows maps to render with more detail
==
Renderer
==
default
==
custom
==
Graphics card Graphics card
== Scheda grafica == Scheda grafica
auto
==
Appearance
==
Name Plate
==
Hook Collisions Hook Collisions
== Collisione Hook == Collisione Hook
Kill Messages
==
Show health, shields and ammo Show health, shields and ammo
== Mostra vita, scudi e munizioni == Mostra vita, scudi e munizioni
DDRace HUD
==
Show client IDs in scoreboard Show client IDs in scoreboard
== Mostra gli ID clienti nella scoreboard == Mostra gli ID clienti nella scoreboard
@ -1671,51 +1399,12 @@ Nothing hookable
Something hookable Something hookable
== Qualcosa hookabile == Qualcosa hookabile
A Tee
==
Normal Color
==
Highlight Color
==
Weapons Weapons
== Armi == Armi
Rifle Laser Outline Color
==
Rifle Laser Inner Color
==
Shotgun Laser Outline Color
==
Shotgun Laser Inner Color
==
Door Laser Outline Color
==
Door Laser Inner Color
==
Freeze Laser Outline Color
==
Freeze Laser Inner Color
==
Set all to Rifle
==
When you cross the start line, show a ghost tee replicating the movements of your best time When you cross the start line, show a ghost tee replicating the movements of your best time
== Quando attraversi la linea di partenza, mostra una maglietta fantasma che riproduce i movimenti del tuo miglior tempo == Quando attraversi la linea di partenza, mostra una maglietta fantasma che riproduce i movimenti del tuo miglior tempo
Overlay entities
==
Opacity Opacity
== Opacitá == Opacitá
@ -1746,15 +1435,343 @@ Chat command (e.g. showall 1)
Unregister protocol and file extensions Unregister protocol and file extensions
== Protocollo ed estensioni file non registrati == Protocollo ed estensioni file non registrati
Extras
==
Loading assets Loading assets
== Caricando assets == Caricando assets
Open the directory to add custom assets Open the directory to add custom assets
== Apri la cartella per aggiungere assets custom == Apri la cartella per aggiungere assets custom
Can't find a Tutorial server
== Impossibile trovare un Server Tutorial
Loading race demo files
== Caricando i file della demo della gara
Loading sound files
== Caricando file musica
Moved ingame
== Spostato in gioco
[Graphics error]
Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.
==
[Graphics error]
Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution.
==
[Graphics error]
An error during command recording occurred. Try to update your GPU drivers.
==
[Graphics error]
A render command failed. Try to update your GPU drivers.
==
[Graphics error]
Submitting the render commands failed. Try to update your GPU drivers.
==
[Graphics error]
Failed to swap framebuffers. Try to update your GPU drivers.
==
[Graphics error]
Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.
==
[Graphics error]
Could not initialize the given graphics backend, reverting to the default backend now.
==
[Graphics error]
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
==
Could not save downloaded map. Try manually deleting this file: %s
==
The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs.
==
The format of texture %s is not RGBA which will cause visual bugs.
==
Why are you slowmo replaying to read this?
==
Loading menu images
==
AFR
==
ASI
==
AUS
==
EUR
==
NA
==
SA
==
CHN
==
Copy info
==
Leak IP
==
Online players (%d)
==
[friends (server browser)]
Offline (%d)
==
Play the current demo
==
Pause the current demo
==
Stop the current demo
==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick
==
Go forward one tick
==
Go back one marker
==
Go forward one marker
==
Slow down the demo
==
Speed up the demo
==
Mark the beginning of a cut (right click to reset)
==
Mark the end of a cut (right click to reset)
==
Export cut as a separate demo
==
Close the demo player
==
Toggle keyboard shortcuts
==
Export demo cut
==
Cut interval
==
Cut length
==
Render cut to video
==
Loading demo files
==
All combined
==
Folder Link
==
Markers:
==
%.2f MiB
==
%.2f KiB
==
Open the directory that contains the demo files
==
Are you sure that you want to delete the folder '%s'?
==
Are you sure that you want to delete the demo '%s'?
==
Unable to delete the demo '%s'
==
Unable to delete the folder '%s'. Make sure it's empty first.
==
Loading ghost files
==
Menu opened. Press Esc key again to close menu.
==
Save power by lowering refresh rate (higher input latency)
==
Settings file
==
Open the settings file
==
Config directory
==
Open the directory that contains the configuration and user files
==
Open the directory to add custom themes
==
Toggle to edit your dummy settings
==
Loading skin files
==
Converse
==
Chat command
==
Controller
==
[Ingame controller mode]
Absolute
==
Ingame controller sens.
==
UI controller sens.
==
Controller jitter tolerance
==
Aim bind
==
Mouse
==
Dummy
==
Allows maps to render with more detail
==
Renderer
==
default
==
custom
==
auto
==
Appearance
==
Name Plate
==
Kill Messages
==
DDRace HUD
==
A Tee
==
Normal Color
==
Highlight Color
==
Rifle Laser Outline Color
==
Rifle Laser Inner Color
==
Shotgun Laser Outline Color
==
Shotgun Laser Inner Color
==
Door Laser Outline Color
==
Door Laser Inner Color
==
Freeze Laser Outline Color
==
Freeze Laser Inner Color
==
Set all to Rifle
==
Overlay entities
==
Extras
==
Discord Discord
== ==
@ -1764,20 +1781,8 @@ https://ddnet.org/discord
Tutorial Tutorial
== ==
Can't find a Tutorial server
== Impossibile trovare un Server Tutorial
Loading race demo files
== Caricando i file della demo della gara
Super Super
== ==
Loading sound files
== Caricando file musica
FPM FPM
== ==
Moved ingame
== Spostato in gioco

View file

@ -145,9 +145,6 @@ Favorites
Feet Feet
== 足 == 足
Filter
== フィルタ
Fire Fire
== 射撃 == 射撃
@ -160,9 +157,6 @@ Force vote
Free-View Free-View
== 自由視点 == 自由視点
Friends
== 友達
Game Game
== ゲーム == ゲーム
@ -353,12 +347,6 @@ Screenshot
Server address: Server address:
== IP アドレス: == IP アドレス:
Server details
== サーバー情報
Server filter
== サーバーフィルタ
Server info Server info
== サーバー情報 == サーバー情報
@ -532,9 +520,6 @@ Miscellaneous
Netversion: Netversion:
== 通信バージョン: == 通信バージョン:
Info
== 情報
UI Color UI Color
== UI カラー == UI カラー
@ -1395,12 +1380,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -1416,12 +1424,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -1437,6 +1439,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
Loading demo files Loading demo files
== ==
@ -1488,10 +1493,10 @@ Open the directory that contains the configuration and user files
Open the directory to add custom themes Open the directory to add custom themes
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download community skins Download community skins

View file

@ -154,9 +154,6 @@ Favorites
Feet Feet
== 발 == 발
Filter
== 필터
Fire Fire
== 발사 == 발사
@ -169,9 +166,6 @@ Force vote
Free-View Free-View
== 자유 시점 == 자유 시점
Friends
== 친구
Fullscreen Fullscreen
== 전체화면 == 전체화면
@ -359,12 +353,6 @@ Screenshot
Server address: Server address:
== 서버 주소: == 서버 주소:
Server details
== 서버 세부정보
Server filter
== 서버 필터
Server info Server info
== 서버 정보 == 서버 정보
@ -550,9 +538,6 @@ Miscellaneous
Netversion: Netversion:
== 통신 버전: == 통신 버전:
Info
== 정보
UI Color UI Color
== UI 색상 == UI 색상
@ -1715,6 +1700,23 @@ None
Add Clan Add Clan
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Mark the beginning of a cut (right click to reset) Mark the beginning of a cut (right click to reset)
== ==
@ -1733,6 +1735,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
All combined All combined
== ==

View file

@ -150,9 +150,6 @@ Favorites
Feet Feet
== Бут == Бут
Filter
== Фильтр
Fire Fire
== Атуу == Атуу
@ -165,9 +162,6 @@ Force vote
Free-View Free-View
== Эркин сереп == Эркин сереп
Friends
== Достор
Fullscreen Fullscreen
== Толук экран == Толук экран
@ -210,9 +204,6 @@ Hook
Hue Hue
== Түсү == Түсү
Info
== Маалымат
Internet Internet
== Интернет == Интернет
@ -424,12 +415,6 @@ Screenshot
Server address: Server address:
== Сервер дареги: == Сервер дареги:
Server details
== Сервер деталдары
Server filter
== Сервер фильтри
Server info Server info
== Маалымат == Маалымат
@ -905,12 +890,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -926,12 +934,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -950,6 +952,9 @@ Cut length
Remove chat Remove chat
== ==
Render cut to video
==
Please use a different name Please use a different name
== ==
@ -1100,10 +1105,10 @@ Max CSVs
Dummy settings Dummy settings
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download skins Download skins
@ -1157,10 +1162,16 @@ Show all
Toggle dyncam Toggle dyncam
== ==
Toggle dummy Toggle ghost
== ==
Toggle ghost Converse
==
Chat command
==
Toggle dummy
== ==
Dummy copy Dummy copy
@ -1169,9 +1180,6 @@ Dummy copy
Hammerfly dummy Hammerfly dummy
== ==
Converse
==
Statboard Statboard
== ==
@ -1184,9 +1192,6 @@ Show entities
Show HUD Show HUD
== ==
Chat command
==
Enable controller Enable controller
== ==

View file

@ -147,9 +147,6 @@ Favorites
Feet Feet
== Føtter == Føtter
Filter
== Filter
Fire Fire
== Skyt == Skyt
@ -162,9 +159,6 @@ Force vote
Free-View Free-View
== Fri-visning == Fri-visning
Friends
== Venner
Fullscreen Fullscreen
== Fullskjerm == Fullskjerm
@ -358,12 +352,6 @@ Screenshot
Server address: Server address:
== Serveradresse: == Serveradresse:
Server details
== Serverdetaljer
Server filter
== Serverfilter
Server info Server info
== Serverinfo == Serverinfo
@ -534,9 +522,6 @@ Netversion:
Map: Map:
== Bane: == Bane:
Info
== Info
Hue Hue
== Farge == Farge
@ -1364,12 +1349,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -1385,12 +1393,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -1406,6 +1408,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
Loading demo files Loading demo files
== ==
@ -1457,10 +1462,10 @@ Open the directory that contains the configuration and user files
Open the directory to add custom themes Open the directory to add custom themes
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download community skins Download community skins

View file

@ -145,9 +145,6 @@ Favorites
Feet Feet
== ﺎﭘ == ﺎﭘ
Filter
== ﺮﺘﻠﯿﻓ
Fire Fire
== ﻚﯿﻠﺷ == ﻚﯿﻠﺷ
@ -160,9 +157,6 @@ Force vote
Free-View Free-View
== ﺩﺍﺯﺁ-ﺪﯾﺩ == ﺩﺍﺯﺁ-ﺪﯾﺩ
Friends
== ﻥﺎﺘﺳﻭﺩ
Fullscreen Fullscreen
== ﻞﻣﺎﻛ ى ﻪﺤﻔﺻ == ﻞﻣﺎﻛ ى ﻪﺤﻔﺻ
@ -472,9 +466,6 @@ Server address:
Refresh Refresh
== ﯼﺯﺎﺳ ﻩﺯﺎﺗ == ﯼﺯﺎﺳ ﻩﺯﺎﺗ
Server filter
== ﺭﻭﺮﺳ ﺮﺘﻠﯿﻓ
Server not full Server not full
== ﺪﺷﺎﺒﻧ ﺮﭘ ﺭﻭﺮﺳ == ﺪﺷﺎﺒﻧ ﺮﭘ ﺭﻭﺮﺳ
@ -505,18 +496,12 @@ Types
Reset filter Reset filter
== ﺮﺘﻠﯿﻓ ﻥﺩﺮﮐ ﺖﺴﯾﺭ == ﺮﺘﻠﯿﻓ ﻥﺩﺮﮐ ﺖﺴﯾﺭ
Server details
== ﺭﻭﺮﺳ ﺕﺎﻋﻼﻃﺍ
Scoreboard Scoreboard
== ﺕﺍﺯﺎﯿﺘﻣﺍ ﯼﻮﻠﺑﺎﺗ == ﺕﺍﺯﺎﯿﺘﻣﺍ ﯼﻮﻠﺑﺎﺗ
Remove Remove
== ﻥﺩﺮﮐ کﺎﭘ == ﻥﺩﺮﮐ کﺎﭘ
Info
== ﺕﺎﻋﻼﻃﺍ
Please use a different name Please use a different name
== ﻦﮐ ﻩﺩﺎﻔﺘﺳﺍ ﺕﻭﺎﻔﺘﻣ ﻡﺎﻧ ﮏﯾ ﺯﺍ ﺎﻔﻄﻟ == ﻦﮐ ﻩﺩﺎﻔﺘﺳﺍ ﺕﻭﺎﻔﺘﻣ ﻡﺎﻧ ﮏﯾ ﺯﺍ ﺎﻔﻄﻟ
@ -1685,6 +1670,23 @@ None
Add Clan Add Clan
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Mark the beginning of a cut (right click to reset) Mark the beginning of a cut (right click to reset)
== ==
@ -1703,6 +1705,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
All combined All combined
== ==

View file

@ -149,9 +149,6 @@ Favorites
Feet Feet
== Stopy == Stopy
Filter
== Filtr
Fire Fire
== Strzał == Strzał
@ -164,9 +161,6 @@ Force vote
Free-View Free-View
== Wolna kamera == Wolna kamera
Friends
== Znajomi
Fullscreen Fullscreen
== Pełny ekran == Pełny ekran
@ -360,12 +354,6 @@ Screenshot
Server address: Server address:
== Adres serwera: == Adres serwera:
Server details
== Szczegóły serwera
Server filter
== Filtr serwerów
Server info Server info
== Info serwera == Info serwera
@ -551,9 +539,6 @@ Netversion:
Map: Map:
== Mapa: == Mapa:
Info
== Info
Hue Hue
== Kolor == Kolor
@ -1465,12 +1450,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -1486,12 +1494,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -1507,6 +1509,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
Loading demo files Loading demo files
== ==

View file

@ -152,9 +152,6 @@ Favorites
Feet Feet
== Pés == Pés
Filter
== Filtro
Fire Fire
== Disparar == Disparar
@ -167,9 +164,6 @@ Force vote
Free-View Free-View
== Vista Livre == Vista Livre
Friends
== Amigos
Fullscreen Fullscreen
== Ecrã inteiro == Ecrã inteiro
@ -375,12 +369,6 @@ Screenshot
Server address: Server address:
== Endereço do servidor: == Endereço do servidor:
Server details
== Detalhes do servidor
Server filter
== Filtro de servidores
Server info Server info
== Info de servidor == Info de servidor
@ -549,9 +537,6 @@ Map:
FSAA samples FSAA samples
== Amostras FSAA == Amostras FSAA
Info
== Info
Miscellaneous Miscellaneous
== Diversos == Diversos
@ -1183,12 +1168,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -1204,12 +1212,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -1225,6 +1227,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
Loading demo files Loading demo files
== ==
@ -1309,10 +1314,10 @@ Open the directory that contains the configuration and user files
Open the directory to add custom themes Open the directory to add custom themes
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download skins Download skins
@ -1357,10 +1362,16 @@ Show all
Toggle dyncam Toggle dyncam
== ==
Toggle dummy Toggle ghost
== ==
Toggle ghost Converse
==
Chat command
==
Toggle dummy
== ==
Dummy copy Dummy copy
@ -1369,9 +1380,6 @@ Dummy copy
Hammerfly dummy Hammerfly dummy
== ==
Converse
==
Statboard Statboard
== ==
@ -1384,9 +1392,6 @@ Show entities
Show HUD Show HUD
== ==
Chat command
==
Enable controller Enable controller
== ==

View file

@ -151,9 +151,6 @@ Favorites
Feet Feet
== Picioare == Picioare
Filter
== Filtre
Fire Fire
== Foc == Foc
@ -166,9 +163,6 @@ Force vote
Free-View Free-View
== Vizualizare liberă == Vizualizare liberă
Friends
== Prieteni
Fullscreen Fullscreen
== Ecrat complet == Ecrat complet
@ -365,12 +359,6 @@ Screenshot
Server address: Server address:
== Adresă server: == Adresă server:
Server details
== Detalii server
Server filter
== Filtru servere:
Server info Server info
== Info. server == Info. server
@ -544,9 +532,6 @@ Netversion:
Map: Map:
== Harta: == Harta:
Info
== Informații
Hue Hue
== Tentă == Tentă
@ -920,12 +905,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -941,12 +949,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -965,6 +967,9 @@ Cut length
Remove chat Remove chat
== ==
Render cut to video
==
Please use a different name Please use a different name
== ==
@ -1115,10 +1120,10 @@ Max CSVs
Dummy settings Dummy settings
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download skins Download skins
@ -1172,10 +1177,16 @@ Show all
Toggle dyncam Toggle dyncam
== ==
Toggle dummy Toggle ghost
== ==
Toggle ghost Converse
==
Chat command
==
Toggle dummy
== ==
Dummy copy Dummy copy
@ -1184,9 +1195,6 @@ Dummy copy
Hammerfly dummy Hammerfly dummy
== ==
Converse
==
Statboard Statboard
== ==
@ -1199,9 +1207,6 @@ Show entities
Show HUD Show HUD
== ==
Chat command
==
Enable controller Enable controller
== ==

View file

@ -159,9 +159,6 @@ Favorites
Feet Feet
== Ноги == Ноги
Filter
== Фильтр
Fire Fire
== Стрелять == Стрелять
@ -174,9 +171,6 @@ Force vote
Free-View Free-View
== Свободный обзор == Свободный обзор
Friends
== Друзья
Fullscreen Fullscreen
== Полноэкранный(настр.) == Полноэкранный(настр.)
@ -370,12 +364,6 @@ Screenshot
Server address: Server address:
== Адрес сервера: == Адрес сервера:
Server details
== Сведения сервера
Server filter
== Фильтр серверов
Server info Server info
== Информация == Информация
@ -607,9 +595,6 @@ Netversion:
Map: Map:
== Карта: == Карта:
Info
== Инфо
Hue Hue
== Оттен. == Оттен.
@ -1756,3 +1741,23 @@ Unable to delete the folder '%s'. Make sure it's empty first.
Moved ingame Moved ingame
== Перемещены в игре == Перемещены в игре
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Render cut to video
==

View file

@ -149,9 +149,6 @@ Favorites
Feet Feet
== Stopala == Stopala
Filter
== Filter
Fire Fire
== Pucaj == Pucaj
@ -164,9 +161,6 @@ Force vote
Free-View Free-View
== Slobodan pregled == Slobodan pregled
Friends
== Prijatelji
Fullscreen Fullscreen
== Preko celog ekrana == Preko celog ekrana
@ -356,12 +350,6 @@ Screenshot
Server address: Server address:
== Adresa servera: == Adresa servera:
Server details
== Detalji o serveru
Server filter
== Filter servera
Server info Server info
== O serveru == O serveru
@ -562,9 +550,6 @@ Netversion:
Map: Map:
== Mapa == Mapa
Info
== Info
Hue Hue
== Nijansa == Nijansa
@ -1507,178 +1492,169 @@ A render command failed. Try to update your GPU drivers.
Submitting the render commands failed. Try to update your GPU drivers. Submitting the render commands failed. Try to update your GPU drivers.
== Неуспешно слање рендерних команди. Покушајте ажурирати драјвере за вашу графичку картицу. == Неуспешно слање рендерних команди. Покушајте ажурирати драјвере за вашу графичку картицу.
[Graphics error]
Failed to swap framebuffers. Try to update your GPU drivers.
==
[Graphics error]
Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.
== Неуспешно замена бафера фреймова. Покушајте ажурирати драјвере за вашу графичку картицу.
[Graphics error]
Could not initialize the given graphics backend, reverting to the default backend now. Could not initialize the given graphics backend, reverting to the default backend now.
== == Није било могуће иницијализовати дати графички позадину, сада се враћамо на подразумевану позадину.
[Graphics error] [Graphics error]
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
== == Није било могуће иницијализовати дати графички позадину, највероватније зато што нисте инсталирали драјвер за интегрисану графичку картицу.
Could not save downloaded map. Try manually deleting this file: %s Could not save downloaded map. Try manually deleting this file: %s
== == Није могуће сачувати преузету мапу. Покушајте ручно обрисати овај фајл: %s.
Initializing components Initializing components
== Иницијализација компоненти == Иницијализација компоненти
Quitting. Please wait… Quitting. Please wait…
== Излазим. Молим вас да почекате == Излазим. Молим вас да почекате...
Restarting. Please wait… Restarting. Please wait…
== Поновно покрећем се. Молим вас да почекате == Поновно покрећем се. Молим вас да почекате...
Multi-View Multi-View
== == Мулти-поглед
Rename folder Rename folder
== == Преименујте фасциклу
A demo with this name already exists A demo with this name already exists
== == Демо са овим именом већ постоји.
A folder with this name already exists A folder with this name already exists
== == Фасцикла са овим именом већ постоји.
Unable to rename the folder Unable to rename the folder
== == Није могуће преименовати фасциклу.
File '%s' already exists, do you want to overwrite it? File '%s' already exists, do you want to overwrite it?
== == Датотека '%s' већ постоји, желите ли да је препишете?
(paused) (paused)
== == (паузирано)
transmits your player name to info.ddnet.org transmits your player name to info.ddnet.org
== == преноси ваше играчко име на info.ddnet.org
Copy info Copy info
== == Копирај информације
No server selected No server selected
== == Није изабран сервер
Online players (%d) Online players (%d)
== == Играчи на мрежи (%d)
Online clanmates (%d) Online clanmates (%d)
== == Чланови клана на мрежи (%d)
[friends (server browser)] [friends (server browser)]
Offline (%d) Offline (%d)
== == Изван мреже (%d)
Click to select server. Double click to join your friend. Click to select server. Double click to join your friend.
== == Кликните да бисте изабрали сервер. Дупли клик за придруживање пријатељу.
Click to remove this player from your friends list. Click to remove this player from your friends list.
== == Кликните да бисте уклонили овог играча са листе пријатеља.
Click to remove this clan from your friends list. Click to remove this clan from your friends list.
== == Кликните да бисте уклонили овај клан са листе пријатеља.
None None
== == Ништа
Are you sure that you want to remove the player '%s' from your friends list? Are you sure that you want to remove the player '%s' from your friends list?
== == Да ли сте сигурни да желите да уклоните играча '%s' са листе пријатеља?
Are you sure that you want to remove the clan '%s' from your friends list? Are you sure that you want to remove the clan '%s' from your friends list?
== == Да ли сте сигурни да желите да уклоните клан '%s' са листе пријатеља?
Add Clan Add Clan
== == Додај клан
Play the current demo Play the current demo
== == Пусти тренутни демо запис
Pause the current demo Pause the current demo
== == Паузирај тренутни демо запис
Stop the current demo Stop the current demo
== == Заустави тренутни демо запис
Go back one tick Go back one tick
== == Иди назад један корак
Go forward one tick Go forward one tick
== == Иди напред један корак
Slow down the demo Slow down the demo
== == Успори демо запис
Speed up the demo Speed up the demo
== == Убрзај демо запис
Mark the beginning of a cut (right click to reset) Mark the beginning of a cut (right click to reset)
== == Обележи почетак сечења (десни клик за ресетовање)
Mark the end of a cut (right click to reset) Mark the end of a cut (right click to reset)
== == Обележи крај сечења (десни клик за ресетовање)
Export cut as a separate demo Export cut as a separate demo
== == Извоз сечења као засебног демо записа
Go back one marker Go back one marker
== == Иди назад један маркер
Go forward one marker Go forward one marker
== == Иди напред један маркер
Close the demo player Close the demo player
== == Затвори репродуктор демо записа
Toggle keyboard shortcuts Toggle keyboard shortcuts
== == Пребациванје тастатурних пречица
Export demo cut Export demo cut
== == Извоз демо сечења
Cut interval Cut interval
== == Интервал сечења
Cut length Cut length
== == Дужина сечења
All combined All combined
== == Све комбиновано
Folder Link Folder Link
== == Веза до фасцикле
Open the directory that contains the demo files Open the directory that contains the demo files
== == Отвори директоријум који садржи демо фајлове
Are you sure that you want to delete the folder '%s'? Are you sure that you want to delete the folder '%s'?
== == Да ли сте сигурни да желите да обришете фасциклу '%s'?
Are you sure that you want to delete the demo '%s'? Are you sure that you want to delete the demo '%s'?
== == Да ли сте сигурни да желите да обришете демо запис '%s'?
Delete folder Delete folder
== == Обриши фасциклу
Unable to delete the demo '%s' Unable to delete the demo '%s'
== == Није могуће обрисати демо запис '%s'
Unable to delete the folder '%s'. Make sure it's empty first. Unable to delete the folder '%s'. Make sure it's empty first.
== == Није могуће обрисати фасциклу '%s'. Проверите прво да ли је празна.
Menu opened. Press Esc key again to close menu. Menu opened. Press Esc key again to close menu.
== == Мени је отворен. Поново притисните тастер Esc да бисте затворили мени.
Save power by lowering refresh rate (higher input latency) Save power by lowering refresh rate (higher input latency)
== == Уштедите струју смањивањем стопе освежавања (већа улазна латенција)
Open the settings file Open the settings file
== == Отворите датотеку са подешавањима
Open the directory that contains the configuration and user files Open the directory that contains the configuration and user files
== Отворите директоријум који садржи конфигурационе и корисничке датотеке. == Отворите директоријум који садржи конфигурационе и корисничке датотеке.
@ -1747,4 +1723,32 @@ Open the directory to add custom assets
== Отворите директоријум за додавање прилагођених ресурса == Отворите директоријум за додавање прилагођених ресурса
Moved ingame Moved ingame
== Померено у игри
[Graphics error]
Failed to swap framebuffers. Try to update your GPU drivers.
==
[Graphics error]
Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.
==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Render cut to video
== ==

View file

@ -145,9 +145,6 @@ Favorites
Feet Feet
== Стопала == Стопала
Filter
== Филтер
Fire Fire
== Пуцај == Пуцај
@ -160,9 +157,6 @@ Force vote
Free-View Free-View
== Слободан преглед == Слободан преглед
Friends
== Пријатељи
Fullscreen Fullscreen
== Преко целог екрана == Преко целог екрана
@ -352,12 +346,6 @@ Screenshot
Server address: Server address:
== Адреса сервера: == Адреса сервера:
Server details
== Детаљи о серверу
Server filter
== Филтер сервера
Server info Server info
== О серверу == О серверу
@ -558,9 +546,6 @@ Netversion:
Map: Map:
== Мапа == Мапа
Info
== Инфо
Hue Hue
== Нијанса == Нијанса
@ -1601,12 +1586,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -1622,12 +1630,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -1643,6 +1645,9 @@ Cut interval
Cut length Cut length
== ==
Render cut to video
==
All combined All combined
== ==

View file

@ -177,9 +177,6 @@ Favorites
Feet Feet
== 脚 == 脚
Filter
== 筛选
Fire Fire
== 开火 == 开火
@ -192,9 +189,6 @@ Force vote
Free-View Free-View
== 自由视角 == 自由视角
Friends
== 好友
Fullscreen Fullscreen
== 独占全屏 == 独占全屏
@ -415,12 +409,6 @@ Screenshot
Server address: Server address:
== 服务器地址: == 服务器地址:
Server details
== 服务器详情
Server filter
== 服务器筛选
Server info Server info
== 服务器信息 == 服务器信息
@ -616,9 +604,6 @@ Netversion:
Map: Map:
== 地图: == 地图:
Info
== 信息
Hue Hue
== 色调 == 色调
@ -1780,3 +1765,23 @@ Unable to delete the folder '%s'. Make sure it's empty first.
Moved ingame Moved ingame
== 游戏内移动 == 游戏内移动
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Render cut to video
==

View file

@ -145,9 +145,6 @@ Favorites
Feet Feet
== Nohy == Nohy
Filter
== Filter
Fire Fire
== Streľba == Streľba
@ -160,9 +157,6 @@ Force vote
Free-View Free-View
== Voľná Kamera == Voľná Kamera
Friends
== Priatelia
Fullscreen Fullscreen
== Celá obrazovka == Celá obrazovka
@ -356,12 +350,6 @@ Screenshot
Server address: Server address:
== Adresa servera: == Adresa servera:
Server details
== Detaily servera
Server filter
== Filter serverov
Server info Server info
== Informácie == Informácie
@ -532,9 +520,6 @@ Netversion:
Map: Map:
== Mapa: == Mapa:
Info
== Info
Hue Hue
== Hue == Hue
@ -911,12 +896,35 @@ Pause the current demo
Stop the current demo Stop the current demo
== ==
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Go back one tick Go back one tick
== ==
Go forward one tick Go forward one tick
== ==
Go back one marker
==
Go forward one marker
==
Slow down the demo Slow down the demo
== ==
@ -932,12 +940,6 @@ Mark the end of a cut (right click to reset)
Export cut as a separate demo Export cut as a separate demo
== ==
Go back one marker
==
Go forward one marker
==
Close the demo player Close the demo player
== ==
@ -956,6 +958,9 @@ Cut length
Remove chat Remove chat
== ==
Render cut to video
==
Please use a different name Please use a different name
== ==
@ -1106,10 +1111,10 @@ Max CSVs
Dummy settings Dummy settings
== ==
Loading skin files Toggle to edit your dummy settings
== ==
Toggle to edit your dummy settings Loading skin files
== ==
Download skins Download skins
@ -1163,10 +1168,16 @@ Show all
Toggle dyncam Toggle dyncam
== ==
Toggle dummy Toggle ghost
== ==
Toggle ghost Converse
==
Chat command
==
Toggle dummy
== ==
Dummy copy Dummy copy
@ -1175,9 +1186,6 @@ Dummy copy
Hammerfly dummy Hammerfly dummy
== ==
Converse
==
Statboard Statboard
== ==
@ -1190,9 +1198,6 @@ Show entities
Show HUD Show HUD
== ==
Chat command
==
Enable controller Enable controller
== ==

View file

@ -164,9 +164,6 @@ Favorites
Feet Feet
== Pies == Pies
Filter
== Filtro
Fire Fire
== Disparar == Disparar
@ -179,9 +176,6 @@ Force vote
Free-View Free-View
== Vista libre == Vista libre
Friends
== Amigos
Fullscreen Fullscreen
== Pantalla completa == Pantalla completa
@ -378,12 +372,6 @@ Screenshot
Server address: Server address:
== IP del servidor: == IP del servidor:
Server details
== Detalles del servidor
Server filter
== Filtro del servidor
Server info Server info
== Servidor == Servidor
@ -557,9 +545,6 @@ Netversion:
Map: Map:
== Mapa: == Mapa:
Info
== Información
Hue Hue
== Matiz == Matiz
@ -1763,3 +1748,23 @@ Unable to delete the folder '%s'. Make sure it's empty first.
Moved ingame Moved ingame
== Movido dentro del juego == Movido dentro del juego
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Render cut to video
==

View file

@ -7,6 +7,7 @@
# 3edcxzaq1 2020-06-25 00:00:00 # 3edcxzaq1 2020-06-25 00:00:00
# cur.ie 2020-09-28 00:00:00 # cur.ie 2020-09-28 00:00:00
# simpygirl 2022-02-20 00:00:00 # simpygirl 2022-02-20 00:00:00
# furo 2023-08-29 00:00:00
##### /authors ##### ##### /authors #####
##### translated strings ##### ##### translated strings #####
@ -149,9 +150,6 @@ Favorites
Feet Feet
== Fötter == Fötter
Filter
== Filter
Fire Fire
== Skjuta == Skjuta
@ -164,9 +162,6 @@ Force vote
Free-View Free-View
== Friläge == Friläge
Friends
== Kompisar
Fullscreen Fullscreen
== Fullskärm == Fullskärm
@ -207,7 +202,7 @@ Hook
== Hook == Hook
Invalid Demo Invalid Demo
== Ogiltigt deo == Ogiltig demo
Join blue Join blue
== Spela i blått == Spela i blått
@ -343,7 +338,7 @@ Rename demo
== Byt namn på demo == Byt namn på demo
Reset filter Reset filter
== Återställ filter == Nollställ filter
Score Score
== Poäng == Poäng
@ -360,12 +355,6 @@ Screenshot
Server address: Server address:
== Serveradress == Serveradress
Server details
== Serverdetaljer
Server filter
== Serverfilter
Server info Server info
== Serverinfo == Serverinfo
@ -415,7 +404,7 @@ Strict gametype filter
== Strikt speltypsfilter == Strikt speltypsfilter
Sudden Death Sudden Death
== Plötslig död == Sudden Death
Switch weapon on pickup Switch weapon on pickup
== Byt vapen vid anskaffning == Byt vapen vid anskaffning
@ -433,7 +422,7 @@ The server is running a non-standard tuning on a pure game type.
== Denna server kör inte standardinställningar på en reserverad speltyp. == Denna server kör inte standardinställningar på en reserverad speltyp.
There's an unsaved map in the editor, you might want to save it before you quit the game. There's an unsaved map in the editor, you might want to save it before you quit the game.
== Det finns en osparad bana i redigeraden, du kanske vill spara den innan du avslutar. == Det finns en osparad bana i redigeraren, du kanske vill spara den innan du avslutar.
Time limit Time limit
== Tidsbegränsning == Tidsbegränsning
@ -534,9 +523,6 @@ Netversion:
Map: Map:
== Bana == Bana
Info
== Info
Hue Hue
== Nyans == Nyans
@ -550,7 +536,7 @@ Size:
== Storlek: == Storlek:
Reset to defaults Reset to defaults
== Återställ till standard == Nollställ till standard
Quit anyway? Quit anyway?
== Avsluta i alla fall? == Avsluta i alla fall?
@ -607,7 +593,7 @@ Show kill messages
== Visa döds meddelanden == Visa döds meddelanden
Reset Reset
== Återställ == Nollställ
DDNet DDNet
== DDNet == DDNet
@ -643,7 +629,7 @@ Reconnect in %d sec
== Återkopplar om %d sekunder == Återkopplar om %d sekunder
Successfully saved the replay! Successfully saved the replay!
== Lyckades med att spara repris == Lyckades med att spara repris!
Save ghost Save ghost
== Spara spöken == Spara spöken
@ -676,13 +662,13 @@ Show votes window after voting
== Visa röstnings fönster efter röstning == Visa röstnings fönster efter röstning
DDNet Client needs to be restarted to complete update! DDNet Client needs to be restarted to complete update!
== DDNet Klienten behöves startas om för att genomföra updateringen! == DDNet Klienten behövs startas om för att genomföra uppdateringen!
Kill Kill
== Dö == Dö
Personal best: Personal best:
== Personligs bästa: == Personligt bästa:
Show DDNet map finishes in server browser Show DDNet map finishes in server browser
== Visa DDNet bana avklarningar i server bläddraren == Visa DDNet bana avklarningar i server bläddraren
@ -706,7 +692,7 @@ Render
== Rendera == Rendera
Are you sure that you want to disconnect? Are you sure that you want to disconnect?
== Är du säker att du vill koppla ifrån? == Är du säker att du vill koppla ifrån?
Grabs Grabs
== Grabs == Grabs
@ -808,7 +794,7 @@ Date
== Datum == Datum
Show other players' hook collision lines Show other players' hook collision lines
== Visa andra spelares hook kollision linor == Visa andra spelares hook kollisions linjer
Fetch Info Fetch Info
== Hämta Info == Hämta Info
@ -874,7 +860,7 @@ Show only chat messages from friends
== Visa bara chatt meddelanden från vänner == Visa bara chatt meddelanden från vänner
DDNet Client updated! DDNet Client updated!
== DDNet Klienten updaterades! == DDNet Klienten uppdaterades!
Converse Converse
== Konversera == Konversera
@ -916,7 +902,7 @@ Best
== Bäst == Bäst
Updating... Updating...
== Updaterar... == Uppdaterar...
Clan plates size Clan plates size
== Klanskylt storlek == Klanskylt storlek
@ -925,7 +911,7 @@ Size
== Storlek == Storlek
Save the best demo of each race Save the best demo of each race
== Spara the bästa demon av varje race == Spara den bästa demot av varje race
Frags Frags
== Frags == Frags
@ -997,7 +983,7 @@ Show names in chat in team colors
== Visa namn in chatten med lagets färger == Visa namn in chatten med lagets färger
Update now Update now
== Updatera nu == Uppdatera nu
Toggle ghost Toggle ghost
== Växla spöke == Växla spöke
@ -1009,7 +995,7 @@ Team message
== Lag meddelande == Lag meddelande
File already exists, do you want to overwrite it? File already exists, do you want to overwrite it?
== Filen finns redan, vill du skriv över den? == Filen finns redan, vill du skriva över den?
Hook collisions Hook collisions
== Hook kollisioner == Hook kollisioner
@ -1069,7 +1055,7 @@ Server executable not found, can't run server
== Server exekveringsfil hittades ej, kan ej starta servern == Server exekveringsfil hittades ej, kan ej starta servern
Editor Editor
== Editor == Redigeraren
[Start menu] [Start menu]
Play Play
@ -1091,7 +1077,7 @@ Saving ddnet-settings.cfg failed
== Det gick inte att spara ddnet-settings.cfg == Det gick inte att spara ddnet-settings.cfg
The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs. The width of texture %s is not divisible by %d, or the height is not divisible by %d, which might cause visual bugs.
== Bredden på texturen %s är inte delbar med %d, eller höjden är inte delbar med %d, vilket kan orsaka visuella buggar. == Bredden på texturen %s är inte delbar med %d, eller är höjden inte delbar med %d, vilket kan orsaka visuella buggar.
Debug mode enabled. Press Ctrl+Shift+D to disable debug mode. Debug mode enabled. Press Ctrl+Shift+D to disable debug mode.
== Felsökningsläge är aktiverad, Klicka Ctrl+Shift+D för att stänga av felsökningsläge. == Felsökningsläge är aktiverad, Klicka Ctrl+Shift+D för att stänga av felsökningsläge.
@ -1106,7 +1092,7 @@ Checking for existing player with your name
== Söker efter en befintlig spelare med ditt namn == Söker efter en befintlig spelare med ditt namn
Are you sure that you want to disconnect and switch to a different server? Are you sure that you want to disconnect and switch to a different server?
== Är du säker att du vill koppla ifrån och byta server? == Är du säker att du vill koppla ifrån och byta server?
Theme Theme
== Tema == Tema
@ -1223,7 +1209,7 @@ Entities
== Entities == Entities
Emoticons Emoticons
== Emoticons == Känsloikoner
Particles Particles
== Partiklar == Partiklar
@ -1239,510 +1225,530 @@ https://ddnet.org/discord
[Graphics error] [Graphics error]
Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. Failed during initialization. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.
== == Misslyckades under uppstart. Testa att ändra gfx_backend till OpenGL eller Vulkan i settings_ddnet.cfg i konfig nappen och försök igen.
[Graphics error] [Graphics error]
Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution. Out of VRAM. Try removing custom assets (skins, entities, etc.), especially those with high resolution.
== == Slut på VRAM. Testa att ta bort assets (skins, entities, etc.), speciellt dem i hög upplösning.
[Graphics error] [Graphics error]
An error during command recording occurred. Try to update your GPU drivers. An error during command recording occurred. Try to update your GPU drivers.
== == Ett fel uppstod under "command recording". Testa att uppdatera ditt grafikkorts drivrutiner.
[Graphics error] [Graphics error]
A render command failed. Try to update your GPU drivers. A render command failed. Try to update your GPU drivers.
== == Ett "render command" misslyckades. Testa att uppdatera ditt grafikkorts drivrutiner.
[Graphics error] [Graphics error]
Submitting the render commands failed. Try to update your GPU drivers. Submitting the render commands failed. Try to update your GPU drivers.
== == Inskickning av "render commands" misslyckades. Testa att uppdatera ditt grafikkorts drivrutiner.
[Graphics error] [Graphics error]
Failed to swap framebuffers. Try to update your GPU drivers. Failed to swap framebuffers. Try to update your GPU drivers.
== == Misslyckades att "swap framebuffers". Testa att uppdatera ditt grafikkorts drivrutiner.
[Graphics error] [Graphics error]
Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again. Unknown error. Try to change gfx_backend to OpenGL or Vulkan in settings_ddnet.cfg in the config directory and try again.
== == Okänt fel. Testa att ändra gfx_backend till OpenGL eller Vulkan i settings_ddnet.cfg i konfig nappen och försök igen.
[Graphics error] [Graphics error]
Could not initialize the given graphics backend, reverting to the default backend now. Could not initialize the given graphics backend, reverting to the default backend now.
== == Kunde inte starta den angivna grafikbackend, återgår till standard backend nu.
[Graphics error] [Graphics error]
Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card. Could not initialize the given graphics backend, this is probably because you didn't install the driver of the integrated graphics card.
== == Kunde inte starta den angivna grafikbackend, detta beror någ på att du inte har installerad drivrutinerna för ditt integrerade grafikkort.
Could not save downloaded map. Try manually deleting this file: %s Could not save downloaded map. Try manually deleting this file: %s
== == Kunde inte spara nedladdade bana. Testa att manuellt ta bort denna fil: %s
The format of texture %s is not RGBA which will cause visual bugs. The format of texture %s is not RGBA which will cause visual bugs.
== == Formatet av texturn %s är inte RGBA, vilket kommer att orsaka visuella buggar.
Preparing demo playback Preparing demo playback
== == Förbreder för demo uppspelning
Connected Connected
== == Ansluten
Loading map file from storage Loading map file from storage
== == Laddar bana fil från lagring
Why are you slowmo replaying to read this? Why are you slowmo replaying to read this?
== == Varför försöker du att läsa detta?
Initializing components Initializing components
== == Initierar komponenter
Initializing assets Initializing assets
== == Initierar assets
Initializing map logic Initializing map logic
== == Initierar bana logik
Sending initial client info Sending initial client info
== == Skickar första klient info
Quitting. Please wait… Quitting. Please wait…
== == Lämnar. Vänligen vänta…
Restarting. Please wait… Restarting. Please wait…
== == Startar om. Vänligen vänta…
Position: Position:
== == Position
Speed: Speed:
== == Hastighet:
Angle: Angle:
== == Vinkel:
Multi-View Multi-View
== == Multi-Vy
Team %d Team %d
== == Lag %d
Uploading map data to GPU Uploading map data to GPU
== == Laddar upp bana data till grafikkortet
Trying to determine UDP connectivity... Trying to determine UDP connectivity...
== == Försöker att bestämma UDP anslutning...
UDP seems to be filtered. UDP seems to be filtered.
== == UDP verkar vara filtrerad.
UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators.
== == UDP och TCP IP adresser verkar vara olika. Testa att stänga av VPN, proxy eller nätverksacceleratorer.
No answer from server yet. No answer from server yet.
== == Inget svar från servern än.
Getting game info Getting game info
== == Hämtar spel info
Requesting to join the game Requesting to join the game
== == Begär att få ansluta till spelet.
Rename folder Rename folder
== == Döp om mapp.
A demo with this name already exists A demo with this name already exists
== == Ett demo med detta namn finns redan
A folder with this name already exists A folder with this name already exists
== == En mapp finns redan med detta namn
Unable to rename the folder Unable to rename the folder
== == Misslyckades att döpa om mappen
File '%s' already exists, do you want to overwrite it? File '%s' already exists, do you want to overwrite it?
== == Fil '%s' finns redan, vill du skriva över den?
(paused) (paused)
== == (pausad)
Join Tutorial Server Join Tutorial Server
== == Anslut till Tutorial
Skip Tutorial Skip Tutorial
== == Skippa Tutorial
Loading menu images Loading menu images
== == Laddar meny bilder
Copy info Copy info
== == Kopiera info
No server selected No server selected
== == Ingen server vald
Online players (%d) Online players (%d)
== == Online spelare (%d)
Online clanmates (%d) Online clanmates (%d)
== == Online klanmedlemmar (%d)
[friends (server browser)] [friends (server browser)]
Offline (%d) Offline (%d)
== == Offline (%d)
Click to select server. Double click to join your friend. Click to select server. Double click to join your friend.
== == Klicka för att välja server. Dubbel klicka för att ansluta till din kamrat.
Click to remove this player from your friends list. Click to remove this player from your friends list.
== == Klicka för att ta bort denna spelare från din kompis lista.
Click to remove this clan from your friends list. Click to remove this clan from your friends list.
== == Klicka för att ta bort denna klan från din kompis lista.
None None
== == Ingen
Are you sure that you want to remove the player '%s' from your friends list? Are you sure that you want to remove the player '%s' from your friends list?
== == Är du säker på att du vill ta bort spelare '%s' från din kompis lista?
Are you sure that you want to remove the clan '%s' from your friends list? Are you sure that you want to remove the clan '%s' from your friends list?
== == Är du säker på att du vill ta bort klanen '%s' från din kompis lista?
Add Clan Add Clan
== == Lägg till klan
Play the current demo Play the current demo
== == Spela demo
Pause the current demo Pause the current demo
== == Pausa demo
Stop the current demo Stop the current demo
== == Stoppa demo
Go back one tick Go back one tick
== == Gå tillbaka en tick
Go forward one tick Go forward one tick
== == Gå framåt en tick
Slow down the demo Slow down the demo
== == Sakta ner demot
Speed up the demo Speed up the demo
== == Snabba up demot
Mark the beginning of a cut (right click to reset) Mark the beginning of a cut (right click to reset)
== == Markera start av snittet (höger klicka för att nollställa)
Mark the end of a cut (right click to reset) Mark the end of a cut (right click to reset)
== == Markera slutet av snittet (höger klicka för att nollställa)
Export cut as a separate demo Export cut as a separate demo
== == Exportera snitt till en seperat demo fil
Go back one marker Go back one marker
== == Gå tillbaka en markör
Go forward one marker Go forward one marker
== == Gå framåt en markör
Close the demo player Close the demo player
== == Stäng demo spelaren
Toggle keyboard shortcuts Toggle keyboard shortcuts
== == Växla kortkommandon
Export demo cut Export demo cut
== == Exportera demo snitt
Cut interval Cut interval
== == Snitt interval
Cut length Cut length
== == Snitt längd
Loading demo files Loading demo files
== == Laddar demo filer
All combined All combined
== == Alla kombinerade
Folder Link Folder Link
== == Mapp länk
Open the directory that contains the demo files Open the directory that contains the demo files
== == Öppna mappen som innehåller demo filerna
Are you sure that you want to delete the folder '%s'? Are you sure that you want to delete the folder '%s'?
== == Är du säker på att du vill ta bort mappen '%s'?
Are you sure that you want to delete the demo '%s'? Are you sure that you want to delete the demo '%s'?
== == Är du säker på att du vill ta bort demot '%s'?
Delete folder Delete folder
== == Ta bort mapp
Unable to delete the demo '%s' Unable to delete the demo '%s'
== == Misslyckades att ta bort demot '%s'
Unable to delete the folder '%s'. Make sure it's empty first. Unable to delete the folder '%s'. Make sure it's empty first.
== == Misslyckades att ta bort mappen '%s'. Den måste vara tom först.
Loading ghost files Loading ghost files
== == Laddar spök filer
Menu opened. Press Esc key again to close menu. Menu opened. Press Esc key again to close menu.
== == Meny öppnad. Klicka Esc igen för att stänga menyn.
Save power by lowering refresh rate (higher input latency) Save power by lowering refresh rate (higher input latency)
== == Spara batteri genom att sänka uppdateringsfrekvensen (högre inmatnings latens)
Open the settings file Open the settings file
== == Öppna inställningsfil
Open the directory that contains the configuration and user files Open the directory that contains the configuration and user files
== == Öppna mappen som innehåller konfigurationen och användarfiler
Open the directory to add custom themes Open the directory to add custom themes
== == Öppna mappen för att lägga till egna teman
Loading skin files Loading skin files
== == Laddar skin filer
Toggle to edit your dummy settings Toggle to edit your dummy settings
== == Växla till att ändra dina dummy inställningar
Download community skins Download community skins
== == Ladda ner community skins
Choose default eyes when joining a server Choose default eyes when joining a server
== == Välj standard ögon när du ansluter till en server
Create a random skin Create a random skin
== == Skapa ett slumpad skin
Open the directory to add custom skins Open the directory to add custom skins
== == Öppna mappen för att lägga till egna skins
Enable controller Enable controller
== == Aktivera kontroller
Controller Controller
== == Kontroller
Ingame controller mode Ingame controller mode
== == Kontroller läge under spel
[Ingame controller mode] [Ingame controller mode]
Relative Relative
== == Relativ
[Ingame controller mode] [Ingame controller mode]
Absolute Absolute
== == Absolut
Ingame controller sens. Ingame controller sens.
== == Kontroller känslighet i spelet.
UI controller sens. UI controller sens.
== == Kontroller känslighet i menyer.
Controller jitter tolerance Controller jitter tolerance
== == Kontroller skaka tolerans
No controller found. Plug in a controller. No controller found. Plug in a controller.
== == Ingen kontroller hittad. Anslut en kontroller.
Axis Axis
== == Axel
Status Status
== == Status
Aim bind Aim bind
== == Aim bind
Mouse Mouse
== == Mus
Ingame mouse sens. Ingame mouse sens.
== == Mus känslighet i spelet.
UI mouse sens. UI mouse sens.
== == Mus känslighet i menyer.
Reset controls Reset controls
== == Nollställ kontrollerna
Are you sure that you want to reset the controls to their defaults? Are you sure that you want to reset the controls to their defaults?
== == Är du säker på att du vill nollställa kontrollerna till standard?
Cancel Cancel
== == Avbryt
Allows maps to render with more detail Allows maps to render with more detail
== == Tillåt banor att visa mer detaljer
Renderer Renderer
== == Renderer
default default
== == standard
custom custom
== == egna
Graphics card Graphics card
== == Grafikkort
auto auto
== == auto
Appearance Appearance
== == Utseende
Name Plate Name Plate
== == Namnskylt
Hook Collisions Hook Collisions
== == Hook kollisioner
Show health, shields and ammo Show health, shields and ammo
== == Visa hälsa, sköldar och ammunition
DDRace HUD DDRace HUD
== == DDRace HUD
Show client IDs in scoreboard Show client IDs in scoreboard
== == Visa klient ID i poänglista
Show DDRace HUD Show DDRace HUD
== == Visa DDRace HUD
Show jumps indicator Show jumps indicator
== == Visa hopp indikator
Show dummy actions Show dummy actions
== == Visa dummy actions
Show player position Show player position
== == Visa spelarens position
Show player speed Show player speed
== == Visa spelarens hastighet
Show player target angle Show player target angle
== == Visa spelarens vinkel
Show freeze bars Show freeze bars
== == Visa freeze bars
Opacity of freeze bars inside freeze Opacity of freeze bars inside freeze
== == Opacitet av freeze bars i freeze
Show hook strength indicator Show hook strength indicator
== == Visa hook styrka indikator
Hook collision line Hook collision line
== == Hook kollisions linje
Hook collision line width Hook collision line width
== == Hook kollisions linje bredd
Hook collision line opacity Hook collision line opacity
== == Hook kollisions linje opacitet
Colors of the hook collision line, in case of a possible collision with: Colors of the hook collision line, in case of a possible collision with:
== == Färger av hook kollisions linje, ifall det finns en kollision med:
Your movements are not taken into account when calculating the line colors Your movements are not taken into account when calculating the line colors
== == Dina rörelser tas inte med i beräkningen av linjefärgerna
Nothing hookable Nothing hookable
== == Inget hookable
Something hookable Something hookable
== == Något hookable
A Tee A Tee
== == En Tee
Normal Color Normal Color
== == Normal Färg
Highlight Color Highlight Color
== == Betonad Färg
Weapons Weapons
== == Vapen
Rifle Laser Outline Color Rifle Laser Outline Color
== == Gevär Laser Kontur Färg
Rifle Laser Inner Color Rifle Laser Inner Color
== == Gevär Laser Inre Färg
Shotgun Laser Outline Color Shotgun Laser Outline Color
== == Hagelgevär Laser Kontur Färg
Shotgun Laser Inner Color Shotgun Laser Inner Color
== == Hagelgevär Inre Färg
Door Laser Outline Color Door Laser Outline Color
== == Dörr Laser Kontur Färg
Door Laser Inner Color Door Laser Inner Color
== == Dörr Laser Inre Färg
Freeze Laser Outline Color Freeze Laser Outline Color
== == Freeze Laser Kontur Färg
Freeze Laser Inner Color Freeze Laser Inner Color
== == Freeze Laser Inre Färg
Set all to Rifle Set all to Rifle
== == Sätt alla till Gevär
When you cross the start line, show a ghost tee replicating the movements of your best time When you cross the start line, show a ghost tee replicating the movements of your best time
== == När du passera start linjen, visa en spök tee som visar rörelsen av din bästa tid
Opacity Opacity
== == Opacitet
Adjust the opacity of entities belonging to other teams, such as tees and nameplates Adjust the opacity of entities belonging to other teams, such as tees and nameplates
== == Justera opaciteten av entities som tillhör ett annat lag, som t.ex. tees och namnskyltar
Quads are used for background decoration Quads are used for background decoration
== == Quads används till bakgrunds decorationer
Tries to predict other entities to give a feel of low latency Tries to predict other entities to give a feel of low latency
== == Försöker att predicera andra entities för att ge känslan av låg latens.
Unregister protocol and file extensions Unregister protocol and file extensions
== == Avregistera protokoll och filtillägg
Extras Extras
== == Extras
Loading assets Loading assets
== == Laddar assets
Open the directory to add custom assets Open the directory to add custom assets
== == Öppna mappen för att lägga till egna assets
Tutorial Tutorial
== == Tutorial
Can't find a Tutorial server Can't find a Tutorial server
== == Kunde inte hitta en Tutorial server
Loading race demo files Loading race demo files
== == Laddar race demo filer
Super Super
== == Super
Loading sound files Loading sound files
== == Laddar ljud filer
Moved ingame Moved ingame
== == Förflyttades i spelet
Render cut to video
== Rendera snitt till video
Go back the specified duration
== Gå tillbaka den angivna tiden
[Demo player duration]
%d min.
== %d min.
[Demo player duration]
%d sec.
== %d sek.
Change the skip duration
== Ändra tiden för framspolning
Go forward the specified duration
== Gå framåt den angivna tiden

View file

@ -166,9 +166,6 @@ Favorites
Feet Feet
== 腳 == 腳
Filter
== 過濾器
Fire Fire
== 開火 == 開火
@ -181,9 +178,6 @@ Force vote
Free-View Free-View
== 自由視角 == 自由視角
Friends
== 好友
Fullscreen Fullscreen
== 獨占全螢幕 == 獨占全螢幕
@ -404,12 +398,6 @@ Screenshot
Server address: Server address:
== 伺服器地址: == 伺服器地址:
Server details
== 伺服器詳細資訊
Server filter
== 伺服器過濾器
Server info Server info
== 伺服器資訊 == 伺服器資訊
@ -605,9 +593,6 @@ Netversion:
Map: Map:
== 地圖: == 地圖:
Info
== 資訊
Hue Hue
== 色調 == 色調
@ -1769,3 +1754,23 @@ Unable to delete the folder '%s'. Make sure it's empty first.
Moved ingame Moved ingame
== 遊戲內移動 == 遊戲內移動
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Render cut to video
==

View file

@ -8,7 +8,8 @@
# Learath2 2012-01-01 22:54:29 # Learath2 2012-01-01 22:54:29
# ardadem 2020-08-20 00:00:00 # ardadem 2020-08-20 00:00:00
# ardadem 2020-08-22 00:00:00 # ardadem 2020-08-22 00:00:00
# h-kaan 2023-08-23 15:57:36 # h-kaan 2023-08-23 15:57:36
# h-kaan 2023-08-30 01:52:04
##### /authors ##### ##### /authors #####
##### translated strings ##### ##### translated strings #####
@ -151,9 +152,6 @@ Favorites
Feet Feet
== Ayak == Ayak
Filter
== Filtre
Fire Fire
== Ateş == Ateş
@ -166,9 +164,6 @@ Force vote
Free-View Free-View
== Serbest Bakış == Serbest Bakış
Friends
== Arkadaşlar
Fullscreen Fullscreen
== Tam ekran == Tam ekran
@ -359,12 +354,6 @@ Screenshot
Server address: Server address:
== Sunucu adresi: == Sunucu adresi:
Server details
== Sunucucu detayları
Server filter
== Filtreler
Server info Server info
== Hakkında == Hakkında
@ -533,9 +522,6 @@ Netversion:
Map: Map:
== Harita: == Harita:
Info
== Bilgi
Hue Hue
== Renk == Renk
@ -1130,13 +1116,13 @@ Debug mode enabled. Press Ctrl+Shift+D to disable debug mode.
== Hata ayıklama modu etkinleştirildi. Devre dışı bırakmak için Ctrl+Shift+D tuşlarına basın. == Hata ayıklama modu etkinleştirildi. Devre dışı bırakmak için Ctrl+Shift+D tuşlarına basın.
Position: Position:
== Pozisyon == Pozisyon:
Speed: Speed:
== Hız == Hız:
Angle: Angle:
== Açı == Açı:
Multi-View Multi-View
== Çoklu İzle == Çoklu İzle
@ -1154,7 +1140,7 @@ UDP seems to be filtered.
== UDP filtrelenmiş görünüyor. == UDP filtrelenmiş görünüyor.
UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators. UDP and TCP IP addresses seem to be different. Try disabling VPN, proxy or network accelerators.
== UPD ve TCP IP adresleri farklı görünüyor. Proxy, VPN veya ağ hızlandırıcılarını devre dışı bırakmayı deneyin. == UDP ve TCP IP adresleri farklı görünüyor. Proxy, VPN veya ağ hızlandırıcılarını devre dışı bırakmayı deneyin.
No answer from server yet. No answer from server yet.
== Henüz sunucudan cevap alınamadı. == Henüz sunucudan cevap alınamadı.
@ -1172,7 +1158,7 @@ Existing Player
== Var olan oyuncu == Var olan oyuncu
Your nickname '%s' is already used (%d points). Do you still want to use it? Your nickname '%s' is already used (%d points). Do you still want to use it?
== Takma adınız '%s' başkası tarafından kullanılıyor (%d points). Yine de kullanmak istiyor musunuz? == Takma adınız '%s' başkası tarafından kullanılıyor (%d puan). Yine de kullanmak istiyor musunuz?
Checking for existing player with your name Checking for existing player with your name
== Adınıza sahip diğer oyuncular aranıyor == Adınıza sahip diğer oyuncular aranıyor
@ -1238,7 +1224,7 @@ Getting server list from master server
== %2$d sunucunun %1$d tanesi == %2$d sunucunun %1$d tanesi
%d players %d players
== %d oyuncular == %d oyuncu
%d player %d player
== %d oyuncu == %d oyuncu
@ -1308,13 +1294,13 @@ Speed up the demo
== Demoyu hızlandır == Demoyu hızlandır
Mark the beginning of a cut (right click to reset) Mark the beginning of a cut (right click to reset)
== Bir kesimin başlangıcını işaretleyin (sıfırlamak için sağ tıkla) == Bir kesitin başlangıcını işaretleyin (sıfırlamak için sağ tıkla)
Mark the end of a cut (right click to reset) Mark the end of a cut (right click to reset)
== Bir kesimin bitişini işaretleyin (sıfırlamak için sağ tıkla) == Bir kesitin bitişini işaretleyin (sıfırlamak için sağ tıkla)
Export cut as a separate demo Export cut as a separate demo
== Kesimi ayrı bir demo olarak dışarı aktar == Kesiti ayrı bir demo olarak dışarı aktar
Go back one marker Go back one marker
== Bir işaret geri git == Bir işaret geri git
@ -1329,13 +1315,13 @@ Toggle keyboard shortcuts
== Klavye kısayollarını kullan == Klavye kısayollarını kullan
Export demo cut Export demo cut
== Kesimi dışarı aktar == Kesiti dışarı aktar
Cut interval Cut interval
== Kesim aralığı == Kesit aralığı
Cut length Cut length
== Kesim uzunluğu == Kesit uzunluğu
Loading demo files Loading demo files
== Demo dosyaları yükleniyor == Demo dosyaları yükleniyor
@ -1472,10 +1458,10 @@ Mouse
== Fare == Fare
Ingame mouse sens. Ingame mouse sens.
== Oyun içi fare hassasiyeti == Oyun hassasiyeti
UI mouse sens. UI mouse sens.
== Arayüz fare hassasiyeti == Arayüz hassasiyeti
Reset controls Reset controls
== Kontrolleri sıfırla == Kontrolleri sıfırla
@ -1556,7 +1542,7 @@ Show DDRace HUD
== DDRace HUD göster == DDRace HUD göster
Show jumps indicator Show jumps indicator
== Zıplama göstergesini göster == Kaç zıplama kaldığını göster
Show dummy actions Show dummy actions
== Dummy aksiyonlarını göster == Dummy aksiyonlarını göster
@ -1749,4 +1735,24 @@ Loading sound files
== Ses dosyaları yükleniyor == Ses dosyaları yükleniyor
Moved ingame Moved ingame
== Hareket edildi == Hareket edildi
Go back the specified duration
==
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Render cut to video
==

View file

@ -1749,3 +1749,20 @@ Go forward the specified duration
Render cut to video Render cut to video
== Відтворити вирізку відео == Відтворити вирізку відео
[Demo player duration]
%d min.
==
[Demo player duration]
%d sec.
==
Change the skip duration
==
Go forward the specified duration
==
Render cut to video
==

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.7 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

View file

@ -26,7 +26,7 @@ GameInfoFlags = [
] ]
GameInfoFlags2 = [ GameInfoFlags2 = [
"ALLOW_X_SKINS", "GAMETYPE_CITY", "GAMETYPE_FDDRACE", "ENTITIES_FDDRACE", "HUD_HEALTH_ARMOR", "HUD_AMMO", "ALLOW_X_SKINS", "GAMETYPE_CITY", "GAMETYPE_FDDRACE", "ENTITIES_FDDRACE", "HUD_HEALTH_ARMOR", "HUD_AMMO",
"HUD_DDRACE", "NO_WEAK_HOOK" "HUD_DDRACE", "NO_WEAK_HOOK", "NO_SKIN_CHANGE_FOR_FROZEN"
] ]
ExPlayerFlags = ["AFK", "PAUSED", "SPEC"] ExPlayerFlags = ["AFK", "PAUSED", "SPEC"]
LegacyProjectileFlags = [f"CLIENTID_BIT{i}" for i in range(8)] + [ LegacyProjectileFlags = [f"CLIENTID_BIT{i}" for i in range(8)] + [
@ -71,7 +71,7 @@ enum
enum enum
{ {
GAMEINFO_CURVERSION=8, GAMEINFO_CURVERSION=9,
}; };
''' '''
@ -549,4 +549,8 @@ Messages = [
NetIntRange("m_Team", 0, 'MAX_CLIENTS-1'), NetIntRange("m_Team", 0, 'MAX_CLIENTS-1'),
NetIntRange("m_First", -1, 'MAX_CLIENTS-1'), NetIntRange("m_First", -1, 'MAX_CLIENTS-1'),
]), ]),
NetMessageEx("Sv_YourVote", "yourvote@netmsg.ddnet.org", [
NetIntRange("m_Voted", -1, 1),
]),
] ]

View file

@ -4,7 +4,7 @@
# The second argument is the message to send. # The second argument is the message to send.
if ($args.length -lt 2) { if ($args.length -lt 2) {
Write-Output "Usage: ./send_named_pipe.ps1 <pipename> <message> [message] ... [message]" Write-Output "Usage: ./send_named_pipe.ps1 <pipename> <message> [message] ... [message]"
return exit -1
} }
$Wrapper = [pscustomobject]@{ $Wrapper = [pscustomobject]@{
@ -18,16 +18,24 @@ $Wrapper = [pscustomobject]@{
Reader = $null Reader = $null
Writer = $null Writer = $null
} }
$Wrapper.Pipe.Connect(5000) try {
if (!$?) { $Wrapper.Pipe.Connect(5000)
return $Wrapper.Reader = New-Object System.IO.StreamReader($Wrapper.Pipe)
$Wrapper.Writer = New-Object System.IO.StreamWriter($Wrapper.Pipe)
$Wrapper.Writer.AutoFlush = $true
for ($i = 1; $i -lt $args.length; $i++) {
$Wrapper.Writer.WriteLine($args[$i])
}
# Wait for pipe contents to be read.
$Wrapper.Pipe.WaitForPipeDrain()
# Dispose the pipe, which also calls Flush and Close.
$Wrapper.Pipe.Dispose()
# Explicity set error level 0 for success, as otherwise the current error level is kept.
exit 0
} catch [TimeoutException] {
Write-Output "Timeout connecting to pipe"
exit 1
} catch [System.IO.IOException] {
Write-Output "Broken pipe"
exit 2
} }
$Wrapper.Reader = New-Object System.IO.StreamReader($Wrapper.Pipe)
$Wrapper.Writer = New-Object System.IO.StreamWriter($Wrapper.Pipe)
$Wrapper.Writer.AutoFlush = $true
for ($i = 1; $i -lt $args.length; $i++) {
$Wrapper.Writer.WriteLine($args[$i])
}
# We need to wait because the lines will not be written if we close the pipe immediately
Start-Sleep -Seconds 1.5
$Wrapper.Pipe.Close()

View file

@ -103,7 +103,7 @@ public:
*/ */
virtual void GlobalFinish() {} virtual void GlobalFinish() {}
/** /**
* Notifies thte logger of a changed `m_Filter`. * Notifies the logger of a changed `m_Filter`.
*/ */
virtual void OnFilterChange() {} virtual void OnFilterChange() {}
}; };

View file

@ -11,7 +11,7 @@ use std::str;
/// ///
/// Callbacks in C are usually represented by a function pointer and some /// Callbacks in C are usually represented by a function pointer and some
/// "userdata" pointer that is also passed to the function pointer. This allows /// "userdata" pointer that is also passed to the function pointer. This allows
/// to hand data to the callback. This type represents such a userdata poiner. /// to hand data to the callback. This type represents such a userdata pointer.
/// ///
/// It is `unsafe` to convert the `UserPtr` back to its original pointer using /// It is `unsafe` to convert the `UserPtr` back to its original pointer using
/// [`UserPtr::cast`] because its lifetime and type information was lost. /// [`UserPtr::cast`] because its lifetime and type information was lost.

View file

@ -2209,16 +2209,12 @@ int net_would_block()
#endif #endif
} }
int net_init() void net_init()
{ {
#if defined(CONF_FAMILY_WINDOWS) #if defined(CONF_FAMILY_WINDOWS)
WSADATA wsaData; WSADATA wsa_data;
int err = WSAStartup(MAKEWORD(1, 1), &wsaData); dbg_assert(WSAStartup(MAKEWORD(1, 1), &wsa_data) == 0, "network initialization failed.");
dbg_assert(err == 0, "network initialization failed.");
return err == 0 ? 0 : 1;
#endif #endif
return 0;
} }
#if defined(CONF_FAMILY_UNIX) #if defined(CONF_FAMILY_UNIX)

View file

@ -879,11 +879,9 @@ typedef struct sockaddr_un UNIXSOCKETADDR;
* *
* @ingroup Network-General * @ingroup Network-General
* *
* @return 0 on success.
*
* @remark You must call this function before using any other network functions. * @remark You must call this function before using any other network functions.
*/ */
int net_init(); void net_init();
/* /*
Function: net_host_lookup Function: net_host_lookup

View file

@ -167,7 +167,7 @@ public:
#if defined(CONF_VIDEORECORDER) #if defined(CONF_VIDEORECORDER)
virtual const char *DemoPlayer_Render(const char *pFilename, int StorageType, const char *pVideoName, int SpeedIndex, bool StartPaused = false) = 0; virtual const char *DemoPlayer_Render(const char *pFilename, int StorageType, const char *pVideoName, int SpeedIndex, bool StartPaused = false) = 0;
#endif #endif
virtual void DemoRecorder_Start(const char *pFilename, bool WithTimestamp, int Recorder) = 0; virtual void DemoRecorder_Start(const char *pFilename, bool WithTimestamp, int Recorder, bool Verbose = false) = 0;
virtual void DemoRecorder_HandleAutoStart() = 0; virtual void DemoRecorder_HandleAutoStart() = 0;
virtual void DemoRecorder_Stop(int Recorder, bool RemoveFile = false) = 0; virtual void DemoRecorder_Stop(int Recorder, bool RemoveFile = false) = 0;
virtual class IDemoRecorder *DemoRecorder(int Recorder) = 0; virtual class IDemoRecorder *DemoRecorder(int Recorder) = 0;

View file

@ -1,24 +1,17 @@
#include "backend_base.h" #include "backend_base.h"
#include <engine/gfx/image_manipulation.h> #include <engine/gfx/image_manipulation.h>
size_t CCommandProcessorFragment_GLBase::TexFormatToImageColorChannelCount(int TexFormat)
{
if(TexFormat == CCommandBuffer::TEXFORMAT_RGBA)
return 4;
return 4;
}
void *CCommandProcessorFragment_GLBase::Resize(const unsigned char *pData, int Width, int Height, int NewWidth, int NewHeight, int BPP) void *CCommandProcessorFragment_GLBase::Resize(const unsigned char *pData, int Width, int Height, int NewWidth, int NewHeight, int BPP)
{ {
return ResizeImage((const uint8_t *)pData, Width, Height, NewWidth, NewHeight, BPP); return ResizeImage((const uint8_t *)pData, Width, Height, NewWidth, NewHeight, BPP);
} }
bool CCommandProcessorFragment_GLBase::Texture2DTo3D(void *pImageBuffer, int ImageWidth, int ImageHeight, int ImageColorChannelCount, int SplitCountWidth, int SplitCountHeight, void *pTarget3DImageData, int &Target3DImageWidth, int &Target3DImageHeight) bool CCommandProcessorFragment_GLBase::Texture2DTo3D(void *pImageBuffer, int ImageWidth, int ImageHeight, size_t PixelSize, int SplitCountWidth, int SplitCountHeight, void *pTarget3DImageData, int &Target3DImageWidth, int &Target3DImageHeight)
{ {
Target3DImageWidth = ImageWidth / SplitCountWidth; Target3DImageWidth = ImageWidth / SplitCountWidth;
Target3DImageHeight = ImageHeight / SplitCountHeight; Target3DImageHeight = ImageHeight / SplitCountHeight;
size_t FullImageWidth = (size_t)ImageWidth * ImageColorChannelCount; const size_t FullImageWidth = (size_t)ImageWidth * PixelSize;
for(int Y = 0; Y < SplitCountHeight; ++Y) for(int Y = 0; Y < SplitCountHeight; ++Y)
{ {
@ -28,7 +21,7 @@ bool CCommandProcessorFragment_GLBase::Texture2DTo3D(void *pImageBuffer, int Ima
{ {
int DepthIndex = X + Y * SplitCountWidth; int DepthIndex = X + Y * SplitCountWidth;
size_t TargetImageFullWidth = (size_t)Target3DImageWidth * ImageColorChannelCount; size_t TargetImageFullWidth = (size_t)Target3DImageWidth * PixelSize;
size_t TargetImageFullSize = (size_t)TargetImageFullWidth * Target3DImageHeight; size_t TargetImageFullSize = (size_t)TargetImageFullWidth * Target3DImageHeight;
ptrdiff_t ImageOffset = (ptrdiff_t)(((size_t)Y * FullImageWidth * (size_t)Target3DImageHeight) + ((size_t)Y3D * FullImageWidth) + ((size_t)X * TargetImageFullWidth)); ptrdiff_t ImageOffset = (ptrdiff_t)(((size_t)Y * FullImageWidth * (size_t)Target3DImageHeight) + ((size_t)Y3D * FullImageWidth) + ((size_t)X * TargetImageFullWidth));
ptrdiff_t TargetImageOffset = (ptrdiff_t)(TargetImageFullSize * (size_t)DepthIndex + ((size_t)Y3D * TargetImageFullWidth)); ptrdiff_t TargetImageOffset = (ptrdiff_t)(TargetImageFullSize * (size_t)DepthIndex + ((size_t)Y3D * TargetImageFullWidth));

View file

@ -84,12 +84,11 @@ protected:
SGFXErrorContainer m_Error; SGFXErrorContainer m_Error;
SGFXWarningContainer m_Warning; SGFXWarningContainer m_Warning;
static size_t TexFormatToImageColorChannelCount(int TexFormat);
static void *Resize(const unsigned char *pData, int Width, int Height, int NewWidth, int NewHeight, int BPP); static void *Resize(const unsigned char *pData, int Width, int Height, int NewWidth, int NewHeight, int BPP);
static bool Texture2DTo3D(void *pImageBuffer, int ImageWidth, int ImageHeight, int ImageColorChannelCount, int SplitCountWidth, int SplitCountHeight, void *pTarget3DImageData, int &Target3DImageWidth, int &Target3DImageHeight); static bool Texture2DTo3D(void *pImageBuffer, int ImageWidth, int ImageHeight, size_t PixelSize, int SplitCountWidth, int SplitCountHeight, void *pTarget3DImageData, int &Target3DImageWidth, int &Target3DImageHeight);
virtual bool GetPresentedImageData(uint32_t &Width, uint32_t &Height, uint32_t &Format, std::vector<uint8_t> &vDstData) = 0; virtual bool GetPresentedImageData(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector<uint8_t> &vDstData) = 0;
public: public:
virtual ~CCommandProcessorFragment_GLBase() = default; virtual ~CCommandProcessorFragment_GLBase() = default;

View file

@ -5,7 +5,7 @@
class CCommandProcessorFragment_Null : public CCommandProcessorFragment_GLBase class CCommandProcessorFragment_Null : public CCommandProcessorFragment_GLBase
{ {
bool GetPresentedImageData(uint32_t &Width, uint32_t &Height, uint32_t &Format, std::vector<uint8_t> &vDstData) override { return false; }; bool GetPresentedImageData(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector<uint8_t> &vDstData) override { return false; };
ERunCommandReturnTypes RunCommand(const CCommandBuffer::SCommand *pBaseCommand) override; ERunCommandReturnTypes RunCommand(const CCommandBuffer::SCommand *pBaseCommand) override;
bool Cmd_Init(const SCommand_Init *pCommand); bool Cmd_Init(const SCommand_Init *pCommand);
virtual void Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand); virtual void Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand);

View file

@ -42,11 +42,6 @@ void CCommandProcessorFragment_OpenGL::Cmd_Update_Viewport(const CCommandBuffer:
glViewport(pCommand->m_X, pCommand->m_Y, pCommand->m_Width, pCommand->m_Height); glViewport(pCommand->m_X, pCommand->m_Y, pCommand->m_Width, pCommand->m_Height);
} }
void CCommandProcessorFragment_OpenGL::Cmd_Finish(const CCommandBuffer::SCommand_Finish *pCommand)
{
glFinish();
}
int CCommandProcessorFragment_OpenGL::TexFormatToOpenGLFormat(int TexFormat) int CCommandProcessorFragment_OpenGL::TexFormatToOpenGLFormat(int TexFormat)
{ {
if(TexFormat == CCommandBuffer::TEXFORMAT_RGBA) if(TexFormat == CCommandBuffer::TEXFORMAT_RGBA)
@ -54,7 +49,7 @@ int CCommandProcessorFragment_OpenGL::TexFormatToOpenGLFormat(int TexFormat)
return GL_RGBA; return GL_RGBA;
} }
size_t CCommandProcessorFragment_OpenGL::GLFormatToImageColorChannelCount(int GLFormat) size_t CCommandProcessorFragment_OpenGL::GLFormatToPixelSize(int GLFormat)
{ {
switch(GLFormat) switch(GLFormat)
{ {
@ -283,7 +278,7 @@ GfxOpenGLMessageCallback(GLenum Source,
} }
#endif #endif
bool CCommandProcessorFragment_OpenGL::GetPresentedImageData(uint32_t &Width, uint32_t &Height, uint32_t &Format, std::vector<uint8_t> &vDstData) bool CCommandProcessorFragment_OpenGL::GetPresentedImageData(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector<uint8_t> &vDstData)
{ {
if(m_CanvasWidth == 0 || m_CanvasHeight == 0) if(m_CanvasWidth == 0 || m_CanvasHeight == 0)
{ {
@ -319,7 +314,7 @@ bool CCommandProcessorFragment_OpenGL::InitOpenGL(const SCommand_Init *pCommand)
m_IsOpenGLES = pCommand->m_RequestedBackend == BACKEND_TYPE_OPENGL_ES; m_IsOpenGLES = pCommand->m_RequestedBackend == BACKEND_TYPE_OPENGL_ES;
TGLBackendReadPresentedImageData &ReadPresentedImgDataFunc = *pCommand->m_pReadPresentedImageDataFunc; TGLBackendReadPresentedImageData &ReadPresentedImgDataFunc = *pCommand->m_pReadPresentedImageDataFunc;
ReadPresentedImgDataFunc = [this](uint32_t &Width, uint32_t &Height, uint32_t &Format, std::vector<uint8_t> &vDstData) { return GetPresentedImageData(Width, Height, Format, vDstData); }; ReadPresentedImgDataFunc = [this](uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector<uint8_t> &vDstData) { return GetPresentedImageData(Width, Height, Format, vDstData); };
const char *pVendorString = (const char *)glGetString(GL_VENDOR); const char *pVendorString = (const char *)glGetString(GL_VENDOR);
dbg_msg("opengl", "Vendor string: %s", pVendorString); dbg_msg("opengl", "Vendor string: %s", pVendorString);
@ -649,7 +644,7 @@ void CCommandProcessorFragment_OpenGL::TextureUpdate(int Slot, int X, int Y, int
int ResizedW = (int)(Width * ResizeW); int ResizedW = (int)(Width * ResizeW);
int ResizedH = (int)(Height * ResizeH); int ResizedH = (int)(Height * ResizeH);
void *pTmpData = Resize(static_cast<const unsigned char *>(pTexData), Width, Height, ResizedW, ResizedH, GLFormatToImageColorChannelCount(GLFormat)); void *pTmpData = Resize(static_cast<const unsigned char *>(pTexData), Width, Height, ResizedW, ResizedH, GLFormatToPixelSize(GLFormat));
free(pTexData); free(pTexData);
pTexData = pTmpData; pTexData = pTmpData;
@ -671,7 +666,7 @@ void CCommandProcessorFragment_OpenGL::TextureUpdate(int Slot, int X, int Y, int
Y /= 2; Y /= 2;
} }
void *pTmpData = Resize(static_cast<const unsigned char *>(pTexData), OldWidth, OldHeight, Width, Height, GLFormatToImageColorChannelCount(GLFormat)); void *pTmpData = Resize(static_cast<const unsigned char *>(pTexData), OldWidth, OldHeight, Width, Height, GLFormatToPixelSize(GLFormat));
free(pTexData); free(pTexData);
pTexData = pTmpData; pTexData = pTmpData;
} }
@ -723,7 +718,7 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Destroy(const CCommandBuffer:
DestroyTexture(pCommand->m_Slot); DestroyTexture(pCommand->m_Slot);
} }
void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int Height, int PixelSize, int GLFormat, int GLStoreFormat, int Flags, void *pTexData) void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int Height, int GLFormat, int GLStoreFormat, int Flags, void *pTexData)
{ {
#ifndef BACKEND_GL_MODERN_API #ifndef BACKEND_GL_MODERN_API
@ -746,7 +741,7 @@ void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int He
int PowerOfTwoHeight = HighestBit(Height); int PowerOfTwoHeight = HighestBit(Height);
if(Width != PowerOfTwoWidth || Height != PowerOfTwoHeight) if(Width != PowerOfTwoWidth || Height != PowerOfTwoHeight)
{ {
void *pTmpData = Resize(static_cast<const unsigned char *>(pTexData), Width, Height, PowerOfTwoWidth, PowerOfTwoHeight, GLFormatToImageColorChannelCount(GLFormat)); void *pTmpData = Resize(static_cast<const unsigned char *>(pTexData), Width, Height, PowerOfTwoWidth, PowerOfTwoHeight, GLFormatToPixelSize(GLFormat));
free(pTexData); free(pTexData);
pTexData = pTmpData; pTexData = pTmpData;
@ -778,7 +773,7 @@ void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int He
if(NeedsResize) if(NeedsResize)
{ {
void *pTmpData = Resize(static_cast<const unsigned char *>(pTexData), OldWidth, OldHeight, Width, Height, GLFormatToImageColorChannelCount(GLFormat)); void *pTmpData = Resize(static_cast<const unsigned char *>(pTexData), OldWidth, OldHeight, Width, Height, GLFormatToPixelSize(GLFormat));
free(pTexData); free(pTexData);
pTexData = pTmpData; pTexData = pTmpData;
} }
@ -787,8 +782,7 @@ void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int He
m_vTextures[Slot].m_Height = Height; m_vTextures[Slot].m_Height = Height;
m_vTextures[Slot].m_RescaleCount = RescaleCount; m_vTextures[Slot].m_RescaleCount = RescaleCount;
int Oglformat = GLFormat; const size_t PixelSize = GLFormatToPixelSize(GLFormat);
int StoreOglformat = GLStoreFormat;
if((Flags & CCommandBuffer::TEXFLAG_NO_2D_TEXTURE) == 0) if((Flags & CCommandBuffer::TEXFLAG_NO_2D_TEXTURE) == 0)
{ {
@ -802,7 +796,7 @@ void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int He
{ {
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, StoreOglformat, Width, Height, 0, Oglformat, GL_UNSIGNED_BYTE, pTexData); glTexImage2D(GL_TEXTURE_2D, 0, GLStoreFormat, Width, Height, 0, GLFormat, GL_UNSIGNED_BYTE, pTexData);
} }
} }
else else
@ -818,7 +812,7 @@ void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int He
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f)); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f));
#endif #endif
glTexImage2D(GL_TEXTURE_2D, 0, StoreOglformat, Width, Height, 0, Oglformat, GL_UNSIGNED_BYTE, pTexData); glTexImage2D(GL_TEXTURE_2D, 0, GLStoreFormat, Width, Height, 0, GLFormat, GL_UNSIGNED_BYTE, pTexData);
} }
int Flag2DArrayTexture = (CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE | CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE_SINGLE_LAYER); int Flag2DArrayTexture = (CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE | CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE_SINGLE_LAYER);
@ -886,14 +880,12 @@ void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int He
glBindSampler(0, 0); glBindSampler(0, 0);
} }
int ImageColorChannels = GLFormatToImageColorChannelCount(GLFormat);
uint8_t *p3DImageData = NULL; uint8_t *p3DImageData = NULL;
bool IsSingleLayer = (Flags & (CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE_SINGLE_LAYER | CCommandBuffer::TEXFLAG_TO_3D_TEXTURE_SINGLE_LAYER)) != 0; bool IsSingleLayer = (Flags & (CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE_SINGLE_LAYER | CCommandBuffer::TEXFLAG_TO_3D_TEXTURE_SINGLE_LAYER)) != 0;
if(!IsSingleLayer) if(!IsSingleLayer)
p3DImageData = (uint8_t *)malloc((size_t)ImageColorChannels * Width * Height); p3DImageData = (uint8_t *)malloc((size_t)Width * Height * PixelSize);
int Image3DWidth, Image3DHeight; int Image3DWidth, Image3DHeight;
int ConvertWidth = Width; int ConvertWidth = Width;
@ -906,7 +898,7 @@ void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int He
dbg_msg("gfx", "3D/2D array texture was resized"); dbg_msg("gfx", "3D/2D array texture was resized");
int NewWidth = maximum<int>(HighestBit(ConvertWidth), 16); int NewWidth = maximum<int>(HighestBit(ConvertWidth), 16);
int NewHeight = maximum<int>(HighestBit(ConvertHeight), 16); int NewHeight = maximum<int>(HighestBit(ConvertHeight), 16);
uint8_t *pNewTexData = (uint8_t *)Resize((const uint8_t *)pTexData, ConvertWidth, ConvertHeight, NewWidth, NewHeight, GLFormatToImageColorChannelCount(GLFormat)); uint8_t *pNewTexData = (uint8_t *)Resize((const uint8_t *)pTexData, ConvertWidth, ConvertHeight, NewWidth, NewHeight, GLFormatToPixelSize(GLFormat));
ConvertWidth = NewWidth; ConvertWidth = NewWidth;
ConvertHeight = NewHeight; ConvertHeight = NewHeight;
@ -916,15 +908,15 @@ void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int He
} }
} }
if(IsSingleLayer || (Texture2DTo3D(pTexData, ConvertWidth, ConvertHeight, ImageColorChannels, 16, 16, p3DImageData, Image3DWidth, Image3DHeight))) if(IsSingleLayer || (Texture2DTo3D(pTexData, ConvertWidth, ConvertHeight, PixelSize, 16, 16, p3DImageData, Image3DWidth, Image3DHeight)))
{ {
if(IsSingleLayer) if(IsSingleLayer)
{ {
glTexImage3D(Target, 0, StoreOglformat, ConvertWidth, ConvertHeight, 1, 0, Oglformat, GL_UNSIGNED_BYTE, pTexData); glTexImage3D(Target, 0, GLStoreFormat, ConvertWidth, ConvertHeight, 1, 0, GLFormat, GL_UNSIGNED_BYTE, pTexData);
} }
else else
{ {
glTexImage3D(Target, 0, StoreOglformat, Image3DWidth, Image3DHeight, 256, 0, Oglformat, GL_UNSIGNED_BYTE, p3DImageData); glTexImage3D(Target, 0, GLStoreFormat, Image3DWidth, Image3DHeight, 256, 0, GLFormat, GL_UNSIGNED_BYTE, p3DImageData);
} }
} }
@ -937,12 +929,12 @@ void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int He
m_vTextures[Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT; m_vTextures[Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT;
// calculate memory usage // calculate memory usage
m_vTextures[Slot].m_MemSize = Width * Height * PixelSize; m_vTextures[Slot].m_MemSize = (size_t)Width * Height * PixelSize;
while(Width > 2 && Height > 2) while(Width > 2 && Height > 2)
{ {
Width >>= 1; Width >>= 1;
Height >>= 1; Height >>= 1;
m_vTextures[Slot].m_MemSize += Width * Height * PixelSize; m_vTextures[Slot].m_MemSize += (size_t)Width * Height * PixelSize;
} }
m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) + m_vTextures[Slot].m_MemSize, std::memory_order_relaxed); m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) + m_vTextures[Slot].m_MemSize, std::memory_order_relaxed);
@ -952,7 +944,7 @@ void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int He
void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand) void CCommandProcessorFragment_OpenGL::Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand)
{ {
TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, pCommand->m_PixelSize, TexFormatToOpenGLFormat(pCommand->m_Format), TexFormatToOpenGLFormat(pCommand->m_StoreFormat), pCommand->m_Flags, pCommand->m_pData); TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, TexFormatToOpenGLFormat(pCommand->m_Format), TexFormatToOpenGLFormat(pCommand->m_StoreFormat), pCommand->m_Flags, pCommand->m_pData);
} }
void CCommandProcessorFragment_OpenGL::Cmd_TextTexture_Update(const CCommandBuffer::SCommand_TextTexture_Update *pCommand) void CCommandProcessorFragment_OpenGL::Cmd_TextTexture_Update(const CCommandBuffer::SCommand_TextTexture_Update *pCommand)
@ -968,16 +960,24 @@ void CCommandProcessorFragment_OpenGL::Cmd_TextTextures_Destroy(const CCommandBu
void CCommandProcessorFragment_OpenGL::Cmd_TextTextures_Create(const CCommandBuffer::SCommand_TextTextures_Create *pCommand) void CCommandProcessorFragment_OpenGL::Cmd_TextTextures_Create(const CCommandBuffer::SCommand_TextTextures_Create *pCommand)
{ {
void *pTextData = pCommand->m_pTextData; TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, GL_ALPHA, GL_ALPHA, CCommandBuffer::TEXFLAG_NOMIPMAPS, pCommand->m_pTextData);
void *pTextOutlineData = pCommand->m_pTextOutlineData; TextureCreate(pCommand->m_SlotOutline, pCommand->m_Width, pCommand->m_Height, GL_ALPHA, GL_ALPHA, CCommandBuffer::TEXFLAG_NOMIPMAPS, pCommand->m_pTextOutlineData);
TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, 1, GL_ALPHA, GL_ALPHA, CCommandBuffer::TEXFLAG_NOMIPMAPS, pTextData);
TextureCreate(pCommand->m_SlotOutline, pCommand->m_Width, pCommand->m_Height, 1, GL_ALPHA, GL_ALPHA, CCommandBuffer::TEXFLAG_NOMIPMAPS, pTextOutlineData);
} }
void CCommandProcessorFragment_OpenGL::Cmd_Clear(const CCommandBuffer::SCommand_Clear *pCommand) void CCommandProcessorFragment_OpenGL::Cmd_Clear(const CCommandBuffer::SCommand_Clear *pCommand)
{ {
// if clip is still active, force disable it for clearing, enable it again afterwards
bool ClipWasEnabled = m_LastClipEnable;
if(ClipWasEnabled)
{
glDisable(GL_SCISSOR_TEST);
}
glClearColor(pCommand->m_Color.r, pCommand->m_Color.g, pCommand->m_Color.b, 0.0f); glClearColor(pCommand->m_Color.r, pCommand->m_Color.g, pCommand->m_Color.b, 0.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
if(ClipWasEnabled)
{
glEnable(GL_SCISSOR_TEST);
}
} }
void CCommandProcessorFragment_OpenGL::Cmd_Render(const CCommandBuffer::SCommand_Render *pCommand) void CCommandProcessorFragment_OpenGL::Cmd_Render(const CCommandBuffer::SCommand_Render *pCommand)
@ -1102,9 +1102,6 @@ ERunCommandReturnTypes CCommandProcessorFragment_OpenGL::RunCommand(const CComma
case CCommandBuffer::CMD_UPDATE_VIEWPORT: case CCommandBuffer::CMD_UPDATE_VIEWPORT:
Cmd_Update_Viewport(static_cast<const CCommandBuffer::SCommand_Update_Viewport *>(pBaseCommand)); Cmd_Update_Viewport(static_cast<const CCommandBuffer::SCommand_Update_Viewport *>(pBaseCommand));
break; break;
case CCommandBuffer::CMD_FINISH:
Cmd_Finish(static_cast<const CCommandBuffer::SCommand_Finish *>(pBaseCommand));
break;
case CCommandBuffer::CMD_CREATE_BUFFER_OBJECT: Cmd_CreateBufferObject(static_cast<const CCommandBuffer::SCommand_CreateBufferObject *>(pBaseCommand)); break; case CCommandBuffer::CMD_CREATE_BUFFER_OBJECT: Cmd_CreateBufferObject(static_cast<const CCommandBuffer::SCommand_CreateBufferObject *>(pBaseCommand)); break;
case CCommandBuffer::CMD_UPDATE_BUFFER_OBJECT: Cmd_UpdateBufferObject(static_cast<const CCommandBuffer::SCommand_UpdateBufferObject *>(pBaseCommand)); break; case CCommandBuffer::CMD_UPDATE_BUFFER_OBJECT: Cmd_UpdateBufferObject(static_cast<const CCommandBuffer::SCommand_UpdateBufferObject *>(pBaseCommand)); break;

View file

@ -80,13 +80,13 @@ protected:
virtual bool IsNewApi() { return false; } virtual bool IsNewApi() { return false; }
void DestroyTexture(int Slot); void DestroyTexture(int Slot);
bool GetPresentedImageData(uint32_t &Width, uint32_t &Height, uint32_t &Format, std::vector<uint8_t> &vDstData) override; bool GetPresentedImageData(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector<uint8_t> &vDstData) override;
static int TexFormatToOpenGLFormat(int TexFormat); static int TexFormatToOpenGLFormat(int TexFormat);
static size_t GLFormatToImageColorChannelCount(int GLFormat); static size_t GLFormatToPixelSize(int GLFormat);
void TextureUpdate(int Slot, int X, int Y, int Width, int Height, int GLFormat, void *pTexData); void TextureUpdate(int Slot, int X, int Y, int Width, int Height, int GLFormat, void *pTexData);
void TextureCreate(int Slot, int Width, int Height, int PixelSize, int GLFormat, int GLStoreFormat, int Flags, void *pTexData); void TextureCreate(int Slot, int Width, int Height, int GLFormat, int GLStoreFormat, int Flags, void *pTexData);
virtual bool Cmd_Init(const SCommand_Init *pCommand); virtual bool Cmd_Init(const SCommand_Init *pCommand);
virtual void Cmd_Shutdown(const SCommand_Shutdown *pCommand) {} virtual void Cmd_Shutdown(const SCommand_Shutdown *pCommand) {}
@ -102,7 +102,6 @@ protected:
virtual void Cmd_Screenshot(const CCommandBuffer::SCommand_TrySwapAndScreenshot *pCommand); virtual void Cmd_Screenshot(const CCommandBuffer::SCommand_TrySwapAndScreenshot *pCommand);
virtual void Cmd_Update_Viewport(const CCommandBuffer::SCommand_Update_Viewport *pCommand); virtual void Cmd_Update_Viewport(const CCommandBuffer::SCommand_Update_Viewport *pCommand);
virtual void Cmd_Finish(const CCommandBuffer::SCommand_Finish *pCommand);
virtual void Cmd_CreateBufferObject(const CCommandBuffer::SCommand_CreateBufferObject *pCommand) { dbg_assert(false, "Call of unsupported Cmd_CreateBufferObject"); } virtual void Cmd_CreateBufferObject(const CCommandBuffer::SCommand_CreateBufferObject *pCommand) { dbg_assert(false, "Call of unsupported Cmd_CreateBufferObject"); }
virtual void Cmd_RecreateBufferObject(const CCommandBuffer::SCommand_RecreateBufferObject *pCommand) { dbg_assert(false, "Call of unsupported Cmd_RecreateBufferObject"); } virtual void Cmd_RecreateBufferObject(const CCommandBuffer::SCommand_RecreateBufferObject *pCommand) { dbg_assert(false, "Call of unsupported Cmd_RecreateBufferObject"); }

View file

@ -555,7 +555,7 @@ void CCommandProcessorFragment_OpenGL3_3::TextureUpdate(int Slot, int X, int Y,
Y /= 2; Y /= 2;
} }
void *pTmpData = Resize(static_cast<const unsigned char *>(pTexData), Width, Height, Width, Height, GLFormatToImageColorChannelCount(GLFormat)); void *pTmpData = Resize(static_cast<const unsigned char *>(pTexData), Width, Height, Width, Height, GLFormatToPixelSize(GLFormat));
free(pTexData); free(pTexData);
pTexData = pTmpData; pTexData = pTmpData;
} }
@ -577,7 +577,7 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Destroy(const CCommandBuff
DestroyTexture(pCommand->m_Slot); DestroyTexture(pCommand->m_Slot);
} }
void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int Height, int PixelSize, int GLFormat, int GLStoreFormat, int Flags, void *pTexData) void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int Height, int GLFormat, int GLStoreFormat, int Flags, void *pTexData)
{ {
if(Slot >= (int)m_vTextures.size()) if(Slot >= (int)m_vTextures.size())
m_vTextures.resize(m_vTextures.size() * 2); m_vTextures.resize(m_vTextures.size() * 2);
@ -595,7 +595,7 @@ void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int
++RescaleCount; ++RescaleCount;
} while(Width > m_MaxTexSize || Height > m_MaxTexSize); } while(Width > m_MaxTexSize || Height > m_MaxTexSize);
void *pTmpData = Resize(static_cast<const unsigned char *>(pTexData), Width, Height, Width, Height, GLFormatToImageColorChannelCount(GLFormat)); void *pTmpData = Resize(static_cast<const unsigned char *>(pTexData), Width, Height, Width, Height, GLFormatToPixelSize(GLFormat));
free(pTexData); free(pTexData);
pTexData = pTmpData; pTexData = pTmpData;
} }
@ -604,10 +604,9 @@ void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int
m_vTextures[Slot].m_Height = Height; m_vTextures[Slot].m_Height = Height;
m_vTextures[Slot].m_RescaleCount = RescaleCount; m_vTextures[Slot].m_RescaleCount = RescaleCount;
int Oglformat = GLFormat; if(GLStoreFormat == GL_RED)
int StoreOglformat = GLStoreFormat; GLStoreFormat = GL_R8;
if(StoreOglformat == GL_RED) const size_t PixelSize = GLFormatToPixelSize(GLFormat);
StoreOglformat = GL_R8;
int SamplerSlot = 0; int SamplerSlot = 0;
@ -628,7 +627,7 @@ void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glSamplerParameteri(m_vTextures[Slot].m_Sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glSamplerParameteri(m_vTextures[Slot].m_Sampler, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glSamplerParameteri(m_vTextures[Slot].m_Sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glSamplerParameteri(m_vTextures[Slot].m_Sampler, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D, 0, StoreOglformat, Width, Height, 0, Oglformat, GL_UNSIGNED_BYTE, pTexData); glTexImage2D(GL_TEXTURE_2D, 0, GLStoreFormat, Width, Height, 0, GLFormat, GL_UNSIGNED_BYTE, pTexData);
} }
} }
else else
@ -649,7 +648,7 @@ void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 5.f); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 5.f);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, 5); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LOD, 5);
} }
glTexImage2D(GL_TEXTURE_2D, 0, StoreOglformat, Width, Height, 0, Oglformat, GL_UNSIGNED_BYTE, pTexData); glTexImage2D(GL_TEXTURE_2D, 0, GLStoreFormat, Width, Height, 0, GLFormat, GL_UNSIGNED_BYTE, pTexData);
glGenerateMipmap(GL_TEXTURE_2D); glGenerateMipmap(GL_TEXTURE_2D);
} }
@ -671,14 +670,12 @@ void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int
glSamplerParameterf(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f)); glSamplerParameterf(m_vTextures[Slot].m_Sampler2DArray, GL_TEXTURE_LOD_BIAS, ((GLfloat)m_OpenGLTextureLodBIAS / 1000.0f));
#endif #endif
int ImageColorChannels = GLFormatToImageColorChannelCount(GLFormat);
uint8_t *p3DImageData = NULL; uint8_t *p3DImageData = NULL;
bool IsSingleLayer = (Flags & CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE_SINGLE_LAYER) != 0; bool IsSingleLayer = (Flags & CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE_SINGLE_LAYER) != 0;
if(!IsSingleLayer) if(!IsSingleLayer)
p3DImageData = (uint8_t *)malloc((size_t)ImageColorChannels * Width * Height); p3DImageData = (uint8_t *)malloc((size_t)Width * Height * PixelSize);
int Image3DWidth, Image3DHeight; int Image3DWidth, Image3DHeight;
int ConvertWidth = Width; int ConvertWidth = Width;
@ -691,7 +688,7 @@ void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int
dbg_msg("gfx", "3D/2D array texture was resized"); dbg_msg("gfx", "3D/2D array texture was resized");
int NewWidth = maximum<int>(HighestBit(ConvertWidth), 16); int NewWidth = maximum<int>(HighestBit(ConvertWidth), 16);
int NewHeight = maximum<int>(HighestBit(ConvertHeight), 16); int NewHeight = maximum<int>(HighestBit(ConvertHeight), 16);
uint8_t *pNewTexData = (uint8_t *)Resize((const uint8_t *)pTexData, ConvertWidth, ConvertHeight, NewWidth, NewHeight, GLFormatToImageColorChannelCount(GLFormat)); uint8_t *pNewTexData = (uint8_t *)Resize((const uint8_t *)pTexData, ConvertWidth, ConvertHeight, NewWidth, NewHeight, GLFormatToPixelSize(GLFormat));
ConvertWidth = NewWidth; ConvertWidth = NewWidth;
ConvertHeight = NewHeight; ConvertHeight = NewHeight;
@ -701,15 +698,15 @@ void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int
} }
} }
if(IsSingleLayer || (Texture2DTo3D(pTexData, ConvertWidth, ConvertHeight, ImageColorChannels, 16, 16, p3DImageData, Image3DWidth, Image3DHeight))) if(IsSingleLayer || (Texture2DTo3D(pTexData, ConvertWidth, ConvertHeight, PixelSize, 16, 16, p3DImageData, Image3DWidth, Image3DHeight)))
{ {
if(IsSingleLayer) if(IsSingleLayer)
{ {
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, StoreOglformat, ConvertWidth, ConvertHeight, 1, 0, Oglformat, GL_UNSIGNED_BYTE, pTexData); glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GLStoreFormat, ConvertWidth, ConvertHeight, 1, 0, GLFormat, GL_UNSIGNED_BYTE, pTexData);
} }
else else
{ {
glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, StoreOglformat, Image3DWidth, Image3DHeight, 256, 0, Oglformat, GL_UNSIGNED_BYTE, p3DImageData); glTexImage3D(GL_TEXTURE_2D_ARRAY, 0, GLStoreFormat, Image3DWidth, Image3DHeight, 256, 0, GLFormat, GL_UNSIGNED_BYTE, p3DImageData);
} }
glGenerateMipmap(GL_TEXTURE_2D_ARRAY); glGenerateMipmap(GL_TEXTURE_2D_ARRAY);
} }
@ -723,12 +720,12 @@ void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int
m_vTextures[Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT; m_vTextures[Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT;
// calculate memory usage // calculate memory usage
m_vTextures[Slot].m_MemSize = Width * Height * PixelSize; m_vTextures[Slot].m_MemSize = (size_t)Width * Height * PixelSize;
while(Width > 2 && Height > 2) while(Width > 2 && Height > 2)
{ {
Width >>= 1; Width >>= 1;
Height >>= 1; Height >>= 1;
m_vTextures[Slot].m_MemSize += Width * Height * PixelSize; m_vTextures[Slot].m_MemSize += (size_t)Width * Height * PixelSize;
} }
m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) + m_vTextures[Slot].m_MemSize, std::memory_order_relaxed); m_pTextureMemoryUsage->store(m_pTextureMemoryUsage->load(std::memory_order_relaxed) + m_vTextures[Slot].m_MemSize, std::memory_order_relaxed);
@ -737,7 +734,7 @@ void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int
void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand) void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Create(const CCommandBuffer::SCommand_Texture_Create *pCommand)
{ {
TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, pCommand->m_PixelSize, TexFormatToOpenGLFormat(pCommand->m_Format), TexFormatToOpenGLFormat(pCommand->m_StoreFormat), pCommand->m_Flags, pCommand->m_pData); TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, TexFormatToOpenGLFormat(pCommand->m_Format), TexFormatToOpenGLFormat(pCommand->m_StoreFormat), pCommand->m_Flags, pCommand->m_pData);
} }
void CCommandProcessorFragment_OpenGL3_3::Cmd_TextTexture_Update(const CCommandBuffer::SCommand_TextTexture_Update *pCommand) void CCommandProcessorFragment_OpenGL3_3::Cmd_TextTexture_Update(const CCommandBuffer::SCommand_TextTexture_Update *pCommand)
@ -753,20 +750,28 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_TextTextures_Destroy(const CComman
void CCommandProcessorFragment_OpenGL3_3::Cmd_TextTextures_Create(const CCommandBuffer::SCommand_TextTextures_Create *pCommand) void CCommandProcessorFragment_OpenGL3_3::Cmd_TextTextures_Create(const CCommandBuffer::SCommand_TextTextures_Create *pCommand)
{ {
void *pTextData = pCommand->m_pTextData; TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, GL_RED, GL_RED, CCommandBuffer::TEXFLAG_NOMIPMAPS, pCommand->m_pTextData);
void *pTextOutlineData = pCommand->m_pTextOutlineData; TextureCreate(pCommand->m_SlotOutline, pCommand->m_Width, pCommand->m_Height, GL_RED, GL_RED, CCommandBuffer::TEXFLAG_NOMIPMAPS, pCommand->m_pTextOutlineData);
TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, 1, GL_RED, GL_RED, CCommandBuffer::TEXFLAG_NOMIPMAPS, pTextData);
TextureCreate(pCommand->m_SlotOutline, pCommand->m_Width, pCommand->m_Height, 1, GL_RED, GL_RED, CCommandBuffer::TEXFLAG_NOMIPMAPS, pTextOutlineData);
} }
void CCommandProcessorFragment_OpenGL3_3::Cmd_Clear(const CCommandBuffer::SCommand_Clear *pCommand) void CCommandProcessorFragment_OpenGL3_3::Cmd_Clear(const CCommandBuffer::SCommand_Clear *pCommand)
{ {
// if clip is still active, force disable it for clearing, enable it again afterwards
bool ClipWasEnabled = m_LastClipEnable;
if(ClipWasEnabled)
{
glDisable(GL_SCISSOR_TEST);
}
if(pCommand->m_Color.r != m_ClearColor.r || pCommand->m_Color.g != m_ClearColor.g || pCommand->m_Color.b != m_ClearColor.b) if(pCommand->m_Color.r != m_ClearColor.r || pCommand->m_Color.g != m_ClearColor.g || pCommand->m_Color.b != m_ClearColor.b)
{ {
glClearColor(pCommand->m_Color.r, pCommand->m_Color.g, pCommand->m_Color.b, 0.0f); glClearColor(pCommand->m_Color.r, pCommand->m_Color.g, pCommand->m_Color.b, 0.0f);
m_ClearColor = pCommand->m_Color; m_ClearColor = pCommand->m_Color;
} }
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
if(ClipWasEnabled)
{
glEnable(GL_SCISSOR_TEST);
}
} }
void CCommandProcessorFragment_OpenGL3_3::UploadStreamBufferData(unsigned int PrimitiveType, const void *pVertices, size_t VertSize, unsigned int PrimitiveCount, bool AsTex3D) void CCommandProcessorFragment_OpenGL3_3::UploadStreamBufferData(unsigned int PrimitiveType, const void *pVertices, size_t VertSize, unsigned int PrimitiveCount, bool AsTex3D)

View file

@ -83,7 +83,7 @@ protected:
void RenderText(const CCommandBuffer::SState &State, int DrawNum, int TextTextureIndex, int TextOutlineTextureIndex, int TextureSize, const ColorRGBA &TextColor, const ColorRGBA &TextOutlineColor); void RenderText(const CCommandBuffer::SState &State, int DrawNum, int TextTextureIndex, int TextOutlineTextureIndex, int TextureSize, const ColorRGBA &TextColor, const ColorRGBA &TextOutlineColor);
void TextureUpdate(int Slot, int X, int Y, int Width, int Height, int GLFormat, void *pTexData); void TextureUpdate(int Slot, int X, int Y, int Width, int Height, int GLFormat, void *pTexData);
void TextureCreate(int Slot, int Width, int Height, int PixelSize, int GLFormat, int GLStoreFormat, int Flags, void *pTexData); void TextureCreate(int Slot, int Width, int Height, int GLFormat, int GLStoreFormat, int Flags, void *pTexData);
bool Cmd_Init(const SCommand_Init *pCommand) override; bool Cmd_Init(const SCommand_Init *pCommand) override;
void Cmd_Shutdown(const SCommand_Shutdown *pCommand) override; void Cmd_Shutdown(const SCommand_Shutdown *pCommand) override;

View file

@ -1102,7 +1102,7 @@ protected:
bool m_CanAssert = false; bool m_CanAssert = false;
/** /**
* After an error occured, the rendering stop as soon as possible * After an error occurred, the rendering stop as soon as possible
* Always stop the current code execution after a call to this function (e.g. return false) * Always stop the current code execution after a call to this function (e.g. return false)
*/ */
void SetError(EGFXErrorType ErrType, const char *pErr, const char *pErrStrExtra = nullptr) void SetError(EGFXErrorType ErrType, const char *pErr, const char *pErrStrExtra = nullptr)
@ -1282,7 +1282,6 @@ protected:
m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_RENDER_QUAD_CONTAINER_SPRITE_MULTIPLE)] = {true, [this](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) { Cmd_RenderQuadContainerAsSpriteMultiple_FillExecuteBuffer(ExecBuffer, static_cast<const CCommandBuffer::SCommand_RenderQuadContainerAsSpriteMultiple *>(pBaseCommand)); }, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_RenderQuadContainerAsSpriteMultiple(static_cast<const CCommandBuffer::SCommand_RenderQuadContainerAsSpriteMultiple *>(pBaseCommand), ExecBuffer); }}; m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_RENDER_QUAD_CONTAINER_SPRITE_MULTIPLE)] = {true, [this](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) { Cmd_RenderQuadContainerAsSpriteMultiple_FillExecuteBuffer(ExecBuffer, static_cast<const CCommandBuffer::SCommand_RenderQuadContainerAsSpriteMultiple *>(pBaseCommand)); }, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_RenderQuadContainerAsSpriteMultiple(static_cast<const CCommandBuffer::SCommand_RenderQuadContainerAsSpriteMultiple *>(pBaseCommand), ExecBuffer); }};
m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_SWAP)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_Swap(static_cast<const CCommandBuffer::SCommand_Swap *>(pBaseCommand)); }}; m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_SWAP)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_Swap(static_cast<const CCommandBuffer::SCommand_Swap *>(pBaseCommand)); }};
m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_FINISH)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_Finish(static_cast<const CCommandBuffer::SCommand_Finish *>(pBaseCommand)); }};
m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_VSYNC)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_VSync(static_cast<const CCommandBuffer::SCommand_VSync *>(pBaseCommand)); }}; m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_VSYNC)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_VSync(static_cast<const CCommandBuffer::SCommand_VSync *>(pBaseCommand)); }};
m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_MULTISAMPLING)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_MultiSampling(static_cast<const CCommandBuffer::SCommand_MultiSampling *>(pBaseCommand)); }}; m_aCommandCallbacks[CommandBufferCMDOff(CCommandBuffer::CMD_MULTISAMPLING)] = {false, [](SRenderCommandExecuteBuffer &ExecBuffer, const CCommandBuffer::SCommand *pBaseCommand) {}, [this](const CCommandBuffer::SCommand *pBaseCommand, SRenderCommandExecuteBuffer &ExecBuffer) { return Cmd_MultiSampling(static_cast<const CCommandBuffer::SCommand_MultiSampling *>(pBaseCommand)); }};
@ -1386,7 +1385,7 @@ protected:
} }
} }
[[nodiscard]] bool GetPresentedImageDataImpl(uint32_t &Width, uint32_t &Height, uint32_t &Format, std::vector<uint8_t> &vDstData, bool FlipImgData, bool ResetAlpha) [[nodiscard]] bool GetPresentedImageDataImpl(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector<uint8_t> &vDstData, bool FlipImgData, bool ResetAlpha)
{ {
bool IsB8G8R8A8 = m_VKSurfFormat.format == VK_FORMAT_B8G8R8A8_UNORM; bool IsB8G8R8A8 = m_VKSurfFormat.format == VK_FORMAT_B8G8R8A8_UNORM;
bool UsesRGBALikeFormat = m_VKSurfFormat.format == VK_FORMAT_R8G8B8A8_UNORM || IsB8G8R8A8; bool UsesRGBALikeFormat = m_VKSurfFormat.format == VK_FORMAT_R8G8B8A8_UNORM || IsB8G8R8A8;
@ -1397,7 +1396,7 @@ protected:
Height = Viewport.height; Height = Viewport.height;
Format = CImageInfo::FORMAT_RGBA; Format = CImageInfo::FORMAT_RGBA;
size_t ImageTotalSize = (size_t)Width * Height * 4; const size_t ImageTotalSize = (size_t)Width * Height * CImageInfo::PixelSize(Format);
uint8_t *pResImageData; uint8_t *pResImageData;
if(!PreparePresentedImageDataImage(pResImageData, Width, Height)) if(!PreparePresentedImageDataImage(pResImageData, Width, Height))
@ -1553,7 +1552,7 @@ protected:
} }
} }
[[nodiscard]] bool GetPresentedImageData(uint32_t &Width, uint32_t &Height, uint32_t &Format, std::vector<uint8_t> &vDstData) override [[nodiscard]] bool GetPresentedImageData(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector<uint8_t> &vDstData) override
{ {
return GetPresentedImageDataImpl(Width, Height, Format, vDstData, false, false); return GetPresentedImageDataImpl(Width, Height, Format, vDstData, false, false);
} }
@ -2510,7 +2509,7 @@ protected:
* TEXTURES * TEXTURES
************************/ ************************/
size_t VulkanFormatToImageColorChannelCount(VkFormat Format) size_t VulkanFormatToPixelSize(VkFormat Format)
{ {
if(Format == VK_FORMAT_R8G8B8_UNORM) if(Format == VK_FORMAT_R8G8B8_UNORM)
return 3; return 3;
@ -2521,9 +2520,9 @@ protected:
return 4; return 4;
} }
[[nodiscard]] bool UpdateTexture(size_t TextureSlot, VkFormat Format, void *&pData, int64_t XOff, int64_t YOff, size_t Width, size_t Height, size_t ColorChannelCount) [[nodiscard]] bool UpdateTexture(size_t TextureSlot, VkFormat Format, void *&pData, int64_t XOff, int64_t YOff, size_t Width, size_t Height)
{ {
size_t ImageSize = Width * Height * ColorChannelCount; const size_t ImageSize = Width * Height * VulkanFormatToPixelSize(Format);
SMemoryBlock<s_StagingBufferImageCacheID> StagingBuffer; SMemoryBlock<s_StagingBufferImageCacheID> StagingBuffer;
if(!GetStagingBufferImage(StagingBuffer, pData, ImageSize)) if(!GetStagingBufferImage(StagingBuffer, pData, ImageSize))
return false; return false;
@ -2541,7 +2540,7 @@ protected:
YOff /= 2; YOff /= 2;
} }
void *pTmpData = Resize((const uint8_t *)pData, Width, Height, Width, Height, VulkanFormatToImageColorChannelCount(Format)); void *pTmpData = Resize((const uint8_t *)pData, Width, Height, Width, Height, VulkanFormatToPixelSize(Format));
free(pData); free(pData);
pData = pTmpData; pData = pTmpData;
} }
@ -2571,14 +2570,13 @@ protected:
int Slot, int Slot,
int Width, int Width,
int Height, int Height,
int PixelSize,
VkFormat Format, VkFormat Format,
VkFormat StoreFormat, VkFormat StoreFormat,
int Flags, int Flags,
void *&pData) void *&pData)
{ {
size_t ImageIndex = (size_t)Slot; size_t ImageIndex = (size_t)Slot;
int ImageColorChannels = VulkanFormatToImageColorChannelCount(Format); const size_t PixelSize = VulkanFormatToPixelSize(Format);
while(ImageIndex >= m_vTextures.size()) while(ImageIndex >= m_vTextures.size())
{ {
@ -2596,7 +2594,7 @@ protected:
++RescaleCount; ++RescaleCount;
} while((size_t)Width > m_MaxTextureSize || (size_t)Height > m_MaxTextureSize); } while((size_t)Width > m_MaxTextureSize || (size_t)Height > m_MaxTextureSize);
void *pTmpData = Resize((const uint8_t *)(pData), Width, Height, Width, Height, ImageColorChannels); void *pTmpData = Resize((const uint8_t *)(pData), Width, Height, Width, Height, PixelSize);
free(pData); free(pData);
pData = pTmpData; pData = pTmpData;
} }
@ -2654,7 +2652,7 @@ protected:
dbg_msg("vulkan", "3D/2D array texture was resized"); dbg_msg("vulkan", "3D/2D array texture was resized");
int NewWidth = maximum<int>(HighestBit(ConvertWidth), 16); int NewWidth = maximum<int>(HighestBit(ConvertWidth), 16);
int NewHeight = maximum<int>(HighestBit(ConvertHeight), 16); int NewHeight = maximum<int>(HighestBit(ConvertHeight), 16);
uint8_t *pNewTexData = (uint8_t *)Resize((const uint8_t *)pData, ConvertWidth, ConvertHeight, NewWidth, NewHeight, ImageColorChannels); uint8_t *pNewTexData = (uint8_t *)Resize((const uint8_t *)pData, ConvertWidth, ConvertHeight, NewWidth, NewHeight, PixelSize);
ConvertWidth = NewWidth; ConvertWidth = NewWidth;
ConvertHeight = NewHeight; ConvertHeight = NewHeight;
@ -2668,8 +2666,8 @@ protected:
bool Needs3DTexDel = false; bool Needs3DTexDel = false;
if(!Is2DTextureSingleLayer) if(!Is2DTextureSingleLayer)
{ {
p3DTexData = malloc((size_t)ImageColorChannels * ConvertWidth * ConvertHeight); p3DTexData = malloc((size_t)PixelSize * ConvertWidth * ConvertHeight);
if(!Texture2DTo3D(pData, ConvertWidth, ConvertHeight, ImageColorChannels, 16, 16, p3DTexData, Image3DWidth, Image3DHeight)) if(!Texture2DTo3D(pData, ConvertWidth, ConvertHeight, PixelSize, 16, 16, p3DTexData, Image3DWidth, Image3DHeight))
{ {
free(p3DTexData); free(p3DTexData);
p3DTexData = nullptr; p3DTexData = nullptr;
@ -6467,7 +6465,7 @@ public:
Buffer.m_pRawCommand = pBaseCommand; Buffer.m_pRawCommand = pBaseCommand;
Buffer.m_ThreadIndex = 0; Buffer.m_ThreadIndex = 0;
if(m_CurCommandInPipe + 1 == m_CommandsInPipe && Buffer.m_Command != CCommandBuffer::CMD_FINISH) if(m_CurCommandInPipe + 1 == m_CommandsInPipe)
{ {
m_LastCommandsInPipeThreadIndex = std::numeric_limits<decltype(m_LastCommandsInPipeThreadIndex)>::max(); m_LastCommandsInPipeThreadIndex = std::numeric_limits<decltype(m_LastCommandsInPipeThreadIndex)>::max();
} }
@ -6493,7 +6491,7 @@ public:
Ret = CallbackObj.m_CMDIsHandled; Ret = CallbackObj.m_CMDIsHandled;
if(!CallbackObj.m_CommandCB(pBaseCommand, Buffer)) if(!CallbackObj.m_CommandCB(pBaseCommand, Buffer))
{ {
// an error occured, stop this command and ignore all further commands // an error occurred, stop this command and ignore all further commands
return ERunCommandReturnTypes::RUN_COMMAND_COMMAND_ERROR; return ERunCommandReturnTypes::RUN_COMMAND_COMMAND_ERROR;
} }
} }
@ -6582,7 +6580,7 @@ public:
m_MultiSamplingCount = (g_Config.m_GfxFsaaSamples & 0xFFFFFFFE); // ignore the uneven bit, only even multi sampling works m_MultiSamplingCount = (g_Config.m_GfxFsaaSamples & 0xFFFFFFFE); // ignore the uneven bit, only even multi sampling works
TGLBackendReadPresentedImageData &ReadPresentedImgDataFunc = *pCommand->m_pReadPresentedImageDataFunc; TGLBackendReadPresentedImageData &ReadPresentedImgDataFunc = *pCommand->m_pReadPresentedImageDataFunc;
ReadPresentedImgDataFunc = [this](uint32_t &Width, uint32_t &Height, uint32_t &Format, std::vector<uint8_t> &vDstData) { return GetPresentedImageData(Width, Height, Format, vDstData); }; ReadPresentedImgDataFunc = [this](uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector<uint8_t> &vDstData) { return GetPresentedImageData(Width, Height, Format, vDstData); };
m_pWindow = pCommand->m_pWindow; m_pWindow = pCommand->m_pWindow;
@ -6657,7 +6655,7 @@ public:
void *pData = pCommand->m_pData; void *pData = pCommand->m_pData;
if(!UpdateTexture(IndexTex, VK_FORMAT_B8G8R8A8_UNORM, pData, pCommand->m_X, pCommand->m_Y, pCommand->m_Width, pCommand->m_Height, TexFormatToImageColorChannelCount(pCommand->m_Format))) if(!UpdateTexture(IndexTex, VK_FORMAT_B8G8R8A8_UNORM, pData, pCommand->m_X, pCommand->m_Y, pCommand->m_Width, pCommand->m_Height))
return false; return false;
free(pData); free(pData);
@ -6682,13 +6680,12 @@ public:
int Slot = pCommand->m_Slot; int Slot = pCommand->m_Slot;
int Width = pCommand->m_Width; int Width = pCommand->m_Width;
int Height = pCommand->m_Height; int Height = pCommand->m_Height;
int PixelSize = pCommand->m_PixelSize;
int Format = pCommand->m_Format; int Format = pCommand->m_Format;
int StoreFormat = pCommand->m_StoreFormat; int StoreFormat = pCommand->m_StoreFormat;
int Flags = pCommand->m_Flags; int Flags = pCommand->m_Flags;
void *pData = pCommand->m_pData; void *pData = pCommand->m_pData;
if(!CreateTextureCMD(Slot, Width, Height, PixelSize, TextureFormatToVulkanFormat(Format), TextureFormatToVulkanFormat(StoreFormat), Flags, pData)) if(!CreateTextureCMD(Slot, Width, Height, TextureFormatToVulkanFormat(Format), TextureFormatToVulkanFormat(StoreFormat), Flags, pData))
return false; return false;
free(pData); free(pData);
@ -6706,9 +6703,9 @@ public:
void *pTmpData = pCommand->m_pTextData; void *pTmpData = pCommand->m_pTextData;
void *pTmpData2 = pCommand->m_pTextOutlineData; void *pTmpData2 = pCommand->m_pTextOutlineData;
if(!CreateTextureCMD(Slot, Width, Height, 1, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, CCommandBuffer::TEXFLAG_NOMIPMAPS, pTmpData)) if(!CreateTextureCMD(Slot, Width, Height, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, CCommandBuffer::TEXFLAG_NOMIPMAPS, pTmpData))
return false; return false;
if(!CreateTextureCMD(SlotOutline, Width, Height, 1, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, CCommandBuffer::TEXFLAG_NOMIPMAPS, pTmpData2)) if(!CreateTextureCMD(SlotOutline, Width, Height, VK_FORMAT_R8_UNORM, VK_FORMAT_R8_UNORM, CCommandBuffer::TEXFLAG_NOMIPMAPS, pTmpData2))
return false; return false;
if(!CreateNewTextDescriptorSets(Slot, SlotOutline)) if(!CreateNewTextDescriptorSets(Slot, SlotOutline))
@ -6741,7 +6738,7 @@ public:
void *pData = pCommand->m_pData; void *pData = pCommand->m_pData;
if(!UpdateTexture(IndexTex, VK_FORMAT_R8_UNORM, pData, pCommand->m_X, pCommand->m_Y, pCommand->m_Width, pCommand->m_Height, 1)) if(!UpdateTexture(IndexTex, VK_FORMAT_R8_UNORM, pData, pCommand->m_X, pCommand->m_Y, pCommand->m_Width, pCommand->m_Height))
return false; return false;
free(pData); free(pData);
@ -6815,7 +6812,7 @@ public:
uint32_t Width; uint32_t Width;
uint32_t Height; uint32_t Height;
uint32_t Format; CImageInfo::EImageFormat Format;
if(GetPresentedImageDataImpl(Width, Height, Format, m_vScreenshotHelper, false, true)) if(GetPresentedImageDataImpl(Width, Height, Format, m_vScreenshotHelper, false, true))
{ {
size_t ImgSize = (size_t)Width * (size_t)Height * (size_t)4; size_t ImgSize = (size_t)Width * (size_t)Height * (size_t)4;
@ -6828,7 +6825,7 @@ public:
} }
pCommand->m_pImage->m_Width = (int)Width; pCommand->m_pImage->m_Width = (int)Width;
pCommand->m_pImage->m_Height = (int)Height; pCommand->m_pImage->m_Height = (int)Height;
pCommand->m_pImage->m_Format = (int)Format; pCommand->m_pImage->m_Format = Format;
return true; return true;
} }
@ -6921,12 +6918,6 @@ public:
return true; return true;
} }
[[nodiscard]] bool Cmd_Finish(const CCommandBuffer::SCommand_Finish *pCommand)
{
// just ignore it with vulkan
return true;
}
[[nodiscard]] bool Cmd_Swap(const CCommandBuffer::SCommand_Swap *pCommand) [[nodiscard]] bool Cmd_Swap(const CCommandBuffer::SCommand_Swap *pCommand)
{ {
return NextFrame(); return NextFrame();
@ -7659,7 +7650,7 @@ public:
{ {
if(!m_aCommandCallbacks[CommandBufferCMDOff(NextCmd.m_Command)].m_CommandCB(NextCmd.m_pRawCommand, NextCmd)) if(!m_aCommandCallbacks[CommandBufferCMDOff(NextCmd.m_Command)].m_CommandCB(NextCmd.m_pRawCommand, NextCmd))
{ {
// an error occured, the thread will not continue execution // an error occurred, the thread will not continue execution
HasErrorFromCmd = true; HasErrorFromCmd = true;
break; break;
} }

View file

@ -505,7 +505,7 @@ void CClient::RconAuth(const char *pName, const char *pPassword)
CMsgPacker Msg(NETMSG_RCON_AUTH, true); CMsgPacker Msg(NETMSG_RCON_AUTH, true);
Msg.AddString(pName, 32); Msg.AddString(pName, 32);
Msg.AddString(pPassword, 32); Msg.AddString(pPassword, 128);
Msg.AddInt(1); Msg.AddInt(1);
SendMsgActive(&Msg, MSGFLAG_VITAL); SendMsgActive(&Msg, MSGFLAG_VITAL);
} }
@ -974,7 +974,7 @@ void CClient::ServerInfoRequest()
void CClient::LoadDebugFont() void CClient::LoadDebugFont()
{ {
m_DebugFont = Graphics()->LoadTexture("debug_font.png", IStorage::TYPE_ALL, CImageInfo::FORMAT_AUTO, 0); m_DebugFont = Graphics()->LoadTexture("debug_font.png", IStorage::TYPE_ALL);
} }
// --- // ---
@ -3120,7 +3120,7 @@ void CClient::Run()
// handle pending map edits // handle pending map edits
if(m_aCmdEditMap[0]) if(m_aCmdEditMap[0])
{ {
int Result = m_pEditor->Load(m_aCmdEditMap, IStorage::TYPE_ALL_OR_ABSOLUTE); int Result = m_pEditor->HandleMapDrop(m_aCmdEditMap, IStorage::TYPE_ALL_OR_ABSOLUTE);
if(Result) if(Result)
g_Config.m_ClEditor = true; g_Config.m_ClEditor = true;
else else
@ -3376,12 +3376,6 @@ void CClient::Run()
else else
LastTime = Now; LastTime = Now;
if(g_Config.m_DbgHitch)
{
std::this_thread::sleep_for(g_Config.m_DbgHitch * 1ms);
g_Config.m_DbgHitch = 0;
}
// update local and global time // update local and global time
m_LocalTime = (time_get() - m_LocalStartTime) / (float)time_freq(); m_LocalTime = (time_get() - m_LocalStartTime) / (float)time_freq();
m_GlobalTime = (time_get() - m_GlobalStartTime) / (float)time_freq(); m_GlobalTime = (time_get() - m_GlobalStartTime) / (float)time_freq();
@ -3957,10 +3951,13 @@ void CClient::Con_DemoSpeed(IConsole::IResult *pResult, void *pUserData)
pSelf->m_DemoPlayer.SetSpeed(pResult->GetFloat(0)); pSelf->m_DemoPlayer.SetSpeed(pResult->GetFloat(0));
} }
void CClient::DemoRecorder_Start(const char *pFilename, bool WithTimestamp, int Recorder) void CClient::DemoRecorder_Start(const char *pFilename, bool WithTimestamp, int Recorder, bool Verbose)
{ {
if(State() != IClient::STATE_ONLINE) if(State() != IClient::STATE_ONLINE)
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demorec/record", "client is not online"); {
if(Verbose)
m_pConsole->Print(IConsole::OUTPUT_LEVEL_STANDARD, "demorec/record", "client is not online");
}
else else
{ {
char aFilename[IO_MAX_PATH_LENGTH]; char aFilename[IO_MAX_PATH_LENGTH];
@ -4038,9 +4035,9 @@ void CClient::Con_Record(IConsole::IResult *pResult, void *pUserData)
{ {
CClient *pSelf = (CClient *)pUserData; CClient *pSelf = (CClient *)pUserData;
if(pResult->NumArguments()) if(pResult->NumArguments())
pSelf->DemoRecorder_Start(pResult->GetString(0), false, RECORDER_MANUAL); pSelf->DemoRecorder_Start(pResult->GetString(0), false, RECORDER_MANUAL, true);
else else
pSelf->DemoRecorder_Start(pSelf->m_aCurrentMap, true, RECORDER_MANUAL); pSelf->DemoRecorder_Start(pSelf->m_aCurrentMap, true, RECORDER_MANUAL, true);
} }
void CClient::Con_StopRecord(IConsole::IResult *pResult, void *pUserData) void CClient::Con_StopRecord(IConsole::IResult *pResult, void *pUserData)
@ -4629,7 +4626,7 @@ int main(int argc, const char **argv)
pClient->GetGPUInfoString(aGPUInfo); pClient->GetGPUInfoString(aGPUInfo);
char aMessage[768]; char aMessage[768];
str_format(aMessage, sizeof(aMessage), str_format(aMessage, sizeof(aMessage),
"An assertion error occured. Please write down or take a screenshot of the following information and report this error.\n" "An assertion error occurred. Please write down or take a screenshot of the following information and report this error.\n"
"Please also share the assert log which you should find in the 'dumps' folder in your config directory.\n\n" "Please also share the assert log which you should find in the 'dumps' folder in your config directory.\n\n"
"%s\n\n" "%s\n\n"
"Platform: %s\n" "Platform: %s\n"

View file

@ -164,9 +164,9 @@ class CClient : public IClient, public CDemoPlayer::IListener
int m_aCurrentRecvTick[NUM_DUMMIES]; int m_aCurrentRecvTick[NUM_DUMMIES];
int m_aRconAuthed[NUM_DUMMIES]; int m_aRconAuthed[NUM_DUMMIES];
char m_aRconUsername[32]; char m_aRconUsername[32];
char m_aRconPassword[32]; char m_aRconPassword[128];
int m_UseTempRconCommands; int m_UseTempRconCommands;
char m_aPassword[32]; char m_aPassword[128];
bool m_SendPassword; bool m_SendPassword;
bool m_ButtonRender = false; bool m_ButtonRender = false;
@ -482,7 +482,7 @@ public:
void RegisterCommands(); void RegisterCommands();
const char *DemoPlayer_Play(const char *pFilename, int StorageType) override; const char *DemoPlayer_Play(const char *pFilename, int StorageType) override;
void DemoRecorder_Start(const char *pFilename, bool WithTimestamp, int Recorder) override; void DemoRecorder_Start(const char *pFilename, bool WithTimestamp, int Recorder, bool Verbose = false) override;
void DemoRecorder_HandleAutoStart() override; void DemoRecorder_HandleAutoStart() override;
void DemoRecorder_StartReplayRecorder(); void DemoRecorder_StartReplayRecorder();
void DemoRecorder_Stop(int Recorder, bool RemoveFile = false) override; void DemoRecorder_Stop(int Recorder, bool RemoveFile = false) override;

View file

@ -305,27 +305,17 @@ int CGraphics_Threaded::UnloadTexture(CTextureHandle *pIndex)
return 0; return 0;
} }
static int ImageFormatToPixelSize(int Format) static bool ConvertToRGBA(uint8_t *pDest, const uint8_t *pSrc, size_t SrcWidth, size_t SrcHeight, CImageInfo::EImageFormat SrcFormat)
{
switch(Format)
{
case CImageInfo::FORMAT_RGB: return 3;
case CImageInfo::FORMAT_SINGLE_COMPONENT: return 1;
default: return 4;
}
}
static bool ConvertToRGBA(uint8_t *pDest, const uint8_t *pSrc, size_t SrcWidth, size_t SrcHeight, int SrcFormat)
{ {
if(SrcFormat == CImageInfo::FORMAT_RGBA) if(SrcFormat == CImageInfo::FORMAT_RGBA)
{ {
mem_copy(pDest, pSrc, SrcWidth * SrcHeight * 4); mem_copy(pDest, pSrc, SrcWidth * SrcHeight * CImageInfo::PixelSize(CImageInfo::FORMAT_RGBA));
return true; return true;
} }
else else
{ {
size_t SrcChannelCount = ImageFormatToPixelSize(SrcFormat); const size_t SrcChannelCount = CImageInfo::PixelSize(SrcFormat);
size_t DstChannelCount = 4; const size_t DstChannelCount = CImageInfo::PixelSize(CImageInfo::FORMAT_RGBA);
for(size_t Y = 0; Y < SrcHeight; ++Y) for(size_t Y = 0; Y < SrcHeight; ++Y)
{ {
for(size_t X = 0; X < SrcWidth; ++X) for(size_t X = 0; X < SrcWidth; ++X)
@ -333,12 +323,12 @@ static bool ConvertToRGBA(uint8_t *pDest, const uint8_t *pSrc, size_t SrcWidth,
size_t ImgOffsetSrc = (Y * SrcWidth * SrcChannelCount) + (X * SrcChannelCount); size_t ImgOffsetSrc = (Y * SrcWidth * SrcChannelCount) + (X * SrcChannelCount);
size_t ImgOffsetDest = (Y * SrcWidth * DstChannelCount) + (X * DstChannelCount); size_t ImgOffsetDest = (Y * SrcWidth * DstChannelCount) + (X * DstChannelCount);
size_t CopySize = SrcChannelCount; size_t CopySize = SrcChannelCount;
if(SrcChannelCount == 3) if(SrcFormat == CImageInfo::FORMAT_RGB)
{ {
mem_copy(&pDest[ImgOffsetDest], &pSrc[ImgOffsetSrc], CopySize); mem_copy(&pDest[ImgOffsetDest], &pSrc[ImgOffsetSrc], CopySize);
pDest[ImgOffsetDest + 3] = 255; pDest[ImgOffsetDest + 3] = 255;
} }
else if(SrcChannelCount == 1) else if(SrcFormat == CImageInfo::FORMAT_SINGLE_COMPONENT)
{ {
pDest[ImgOffsetDest + 0] = 255; pDest[ImgOffsetDest + 0] = 255;
pDest[ImgOffsetDest + 1] = 255; pDest[ImgOffsetDest + 1] = 255;
@ -351,7 +341,7 @@ static bool ConvertToRGBA(uint8_t *pDest, const uint8_t *pSrc, size_t SrcWidth,
} }
} }
int CGraphics_Threaded::LoadTextureRawSub(CTextureHandle TextureID, int x, int y, size_t Width, size_t Height, int Format, const void *pData) int CGraphics_Threaded::LoadTextureRawSub(CTextureHandle TextureID, int x, int y, size_t Width, size_t Height, CImageInfo::EImageFormat Format, const void *pData)
{ {
dbg_assert(TextureID.IsValid(), "Invalid texture handle used with LoadTextureRawSub."); dbg_assert(TextureID.IsValid(), "Invalid texture handle used with LoadTextureRawSub.");
@ -364,7 +354,7 @@ int CGraphics_Threaded::LoadTextureRawSub(CTextureHandle TextureID, int x, int y
Cmd.m_Format = CCommandBuffer::TEXFORMAT_RGBA; Cmd.m_Format = CCommandBuffer::TEXFORMAT_RGBA;
// calculate memory usage // calculate memory usage
const size_t MemSize = Width * Height * 4; const size_t MemSize = Width * Height * CImageInfo::PixelSize(CImageInfo::FORMAT_RGBA);
// copy texture data // copy texture data
void *pTmpData = malloc(MemSize); void *pTmpData = malloc(MemSize);
@ -377,7 +367,7 @@ int CGraphics_Threaded::LoadTextureRawSub(CTextureHandle TextureID, int x, int y
IGraphics::CTextureHandle CGraphics_Threaded::LoadSpriteTextureImpl(CImageInfo &FromImageInfo, int x, int y, size_t w, size_t h) IGraphics::CTextureHandle CGraphics_Threaded::LoadSpriteTextureImpl(CImageInfo &FromImageInfo, int x, int y, size_t w, size_t h)
{ {
const size_t PixelSize = ImageFormatToPixelSize(FromImageInfo.m_Format); const size_t PixelSize = FromImageInfo.PixelSize();
m_vSpriteHelper.resize(w * h * PixelSize); m_vSpriteHelper.resize(w * h * PixelSize);
CopyTextureFromTextureBufferSub(m_vSpriteHelper.data(), w, h, (uint8_t *)FromImageInfo.m_pData, FromImageInfo.m_Width, FromImageInfo.m_Height, PixelSize, x, y, w, h); CopyTextureFromTextureBufferSub(m_vSpriteHelper.data(), w, h, (uint8_t *)FromImageInfo.m_pData, FromImageInfo.m_Width, FromImageInfo.m_Height, PixelSize, x, y, w, h);
return LoadTextureRaw(w, h, FromImageInfo.m_Format, m_vSpriteHelper.data(), FromImageInfo.m_Format, 0); return LoadTextureRaw(w, h, FromImageInfo.m_Format, m_vSpriteHelper.data(), FromImageInfo.m_Format, 0);
@ -410,13 +400,13 @@ bool CGraphics_Threaded::IsImageSubFullyTransparent(CImageInfo &FromImageInfo, i
if(FromImageInfo.m_Format == CImageInfo::FORMAT_SINGLE_COMPONENT || FromImageInfo.m_Format == CImageInfo::FORMAT_RGBA) if(FromImageInfo.m_Format == CImageInfo::FORMAT_SINGLE_COMPONENT || FromImageInfo.m_Format == CImageInfo::FORMAT_RGBA)
{ {
uint8_t *pImgData = (uint8_t *)FromImageInfo.m_pData; uint8_t *pImgData = (uint8_t *)FromImageInfo.m_pData;
int bpp = ImageFormatToPixelSize(FromImageInfo.m_Format); const size_t PixelSize = FromImageInfo.PixelSize();
for(int iy = 0; iy < h; ++iy) for(int iy = 0; iy < h; ++iy)
{ {
for(int ix = 0; ix < w; ++ix) for(int ix = 0; ix < w; ++ix)
{ {
int RealOffset = (x + ix) * bpp + (y + iy) * bpp * FromImageInfo.m_Width; const size_t RealOffset = (x + ix) * PixelSize + (y + iy) * PixelSize * FromImageInfo.m_Width;
if(pImgData[RealOffset + (bpp - 1)] > 0) if(pImgData[RealOffset + (PixelSize - 1)] > 0)
return false; return false;
} }
} }
@ -438,7 +428,7 @@ bool CGraphics_Threaded::IsSpriteTextureFullyTransparent(CImageInfo &FromImageIn
return IsImageSubFullyTransparent(FromImageInfo, x, y, w, h); return IsImageSubFullyTransparent(FromImageInfo, x, y, w, h);
} }
IGraphics::CTextureHandle CGraphics_Threaded::LoadTextureRaw(size_t Width, size_t Height, int Format, const void *pData, int StoreFormat, int Flags, const char *pTexName) IGraphics::CTextureHandle CGraphics_Threaded::LoadTextureRaw(size_t Width, size_t Height, CImageInfo::EImageFormat Format, const void *pData, int Flags, const char *pTexName)
{ {
// don't waste memory on texture if we are stress testing // don't waste memory on texture if we are stress testing
#ifdef CONF_DEBUG #ifdef CONF_DEBUG
@ -472,7 +462,6 @@ IGraphics::CTextureHandle CGraphics_Threaded::LoadTextureRaw(size_t Width, size_
Cmd.m_Slot = TextureHandle.Id(); Cmd.m_Slot = TextureHandle.Id();
Cmd.m_Width = Width; Cmd.m_Width = Width;
Cmd.m_Height = Height; Cmd.m_Height = Height;
Cmd.m_PixelSize = 4;
Cmd.m_Format = CCommandBuffer::TEXFORMAT_RGBA; Cmd.m_Format = CCommandBuffer::TEXFORMAT_RGBA;
Cmd.m_StoreFormat = CCommandBuffer::TEXFORMAT_RGBA; Cmd.m_StoreFormat = CCommandBuffer::TEXFORMAT_RGBA;
@ -492,7 +481,7 @@ IGraphics::CTextureHandle CGraphics_Threaded::LoadTextureRaw(size_t Width, size_
Cmd.m_Flags |= CCommandBuffer::TEXFLAG_NO_2D_TEXTURE; Cmd.m_Flags |= CCommandBuffer::TEXFLAG_NO_2D_TEXTURE;
// copy texture data // copy texture data
const size_t MemSize = Width * Height * Cmd.m_PixelSize; const size_t MemSize = Width * Height * CImageInfo::PixelSize(CImageInfo::FORMAT_RGBA);
void *pTmpData = malloc(MemSize); void *pTmpData = malloc(MemSize);
if(!ConvertToRGBA((uint8_t *)pTmpData, (const uint8_t *)pData, Width, Height, Format)) if(!ConvertToRGBA((uint8_t *)pTmpData, (const uint8_t *)pData, Width, Height, Format))
{ {
@ -505,17 +494,14 @@ IGraphics::CTextureHandle CGraphics_Threaded::LoadTextureRaw(size_t Width, size_
} }
// simple uncompressed RGBA loaders // simple uncompressed RGBA loaders
IGraphics::CTextureHandle CGraphics_Threaded::LoadTexture(const char *pFilename, int StorageType, int StoreFormat, int Flags) IGraphics::CTextureHandle CGraphics_Threaded::LoadTexture(const char *pFilename, int StorageType, int Flags)
{ {
dbg_assert(pFilename[0] != '\0', "Cannot load texture from file with empty filename"); // would cause Valgrind to crash otherwise dbg_assert(pFilename[0] != '\0', "Cannot load texture from file with empty filename"); // would cause Valgrind to crash otherwise
CImageInfo Img; CImageInfo Img;
if(LoadPNG(&Img, pFilename, StorageType)) if(LoadPNG(&Img, pFilename, StorageType))
{ {
if(StoreFormat == CImageInfo::FORMAT_AUTO) IGraphics::CTextureHandle ID = LoadTextureRaw(Img.m_Width, Img.m_Height, Img.m_Format, Img.m_pData, Flags, pFilename);
StoreFormat = Img.m_Format;
IGraphics::CTextureHandle ID = LoadTextureRaw(Img.m_Width, Img.m_Height, Img.m_Format, Img.m_pData, StoreFormat, Flags, pFilename);
free(Img.m_pData); free(Img.m_pData);
if(ID.Id() != m_InvalidTexture.Id() && g_Config.m_Debug) if(ID.Id() != m_InvalidTexture.Id() && g_Config.m_Debug)
dbg_msg("graphics/texture", "loaded %s", pFilename); dbg_msg("graphics/texture", "loaded %s", pFilename);
@ -696,15 +682,7 @@ bool CGraphics_Threaded::CheckImageDivisibility(const char *pFileName, CImageInf
NewWidth = (NewHeight / DivY) * DivX; NewWidth = (NewHeight / DivY) * DivX;
} }
int ColorChannelCount = 4; uint8_t *pNewImg = ResizeImage((uint8_t *)Img.m_pData, Img.m_Width, Img.m_Height, NewWidth, NewHeight, Img.PixelSize());
if(Img.m_Format == CImageInfo::FORMAT_SINGLE_COMPONENT)
ColorChannelCount = 1;
else if(Img.m_Format == CImageInfo::FORMAT_RGB)
ColorChannelCount = 3;
else if(Img.m_Format == CImageInfo::FORMAT_RGBA)
ColorChannelCount = 4;
uint8_t *pNewImg = ResizeImage((uint8_t *)Img.m_pData, Img.m_Width, Img.m_Height, NewWidth, NewHeight, ColorChannelCount);
free(Img.m_pData); free(Img.m_pData);
Img.m_pData = pNewImg; Img.m_pData = pNewImg;
Img.m_Width = NewWidth; Img.m_Width = NewWidth;
@ -734,23 +712,23 @@ bool CGraphics_Threaded::IsImageFormatRGBA(const char *pFileName, CImageInfo &Im
return true; return true;
} }
void CGraphics_Threaded::CopyTextureBufferSub(uint8_t *pDestBuffer, uint8_t *pSourceBuffer, size_t FullWidth, size_t FullHeight, size_t ColorChannelCount, size_t SubOffsetX, size_t SubOffsetY, size_t SubCopyWidth, size_t SubCopyHeight) void CGraphics_Threaded::CopyTextureBufferSub(uint8_t *pDestBuffer, uint8_t *pSourceBuffer, size_t FullWidth, size_t FullHeight, size_t PixelSize, size_t SubOffsetX, size_t SubOffsetY, size_t SubCopyWidth, size_t SubCopyHeight)
{ {
for(size_t Y = 0; Y < SubCopyHeight; ++Y) for(size_t Y = 0; Y < SubCopyHeight; ++Y)
{ {
const size_t ImgOffset = ((SubOffsetY + Y) * FullWidth * ColorChannelCount) + (SubOffsetX * ColorChannelCount); const size_t ImgOffset = ((SubOffsetY + Y) * FullWidth * PixelSize) + (SubOffsetX * PixelSize);
const size_t CopySize = SubCopyWidth * ColorChannelCount; const size_t CopySize = SubCopyWidth * PixelSize;
mem_copy(&pDestBuffer[ImgOffset], &pSourceBuffer[ImgOffset], CopySize); mem_copy(&pDestBuffer[ImgOffset], &pSourceBuffer[ImgOffset], CopySize);
} }
} }
void CGraphics_Threaded::CopyTextureFromTextureBufferSub(uint8_t *pDestBuffer, size_t DestWidth, size_t DestHeight, uint8_t *pSourceBuffer, size_t SrcWidth, size_t SrcHeight, size_t ColorChannelCount, size_t SrcSubOffsetX, size_t SrcSubOffsetY, size_t SrcSubCopyWidth, size_t SrcSubCopyHeight) void CGraphics_Threaded::CopyTextureFromTextureBufferSub(uint8_t *pDestBuffer, size_t DestWidth, size_t DestHeight, uint8_t *pSourceBuffer, size_t SrcWidth, size_t SrcHeight, size_t PixelSize, size_t SrcSubOffsetX, size_t SrcSubOffsetY, size_t SrcSubCopyWidth, size_t SrcSubCopyHeight)
{ {
for(size_t Y = 0; Y < SrcSubCopyHeight; ++Y) for(size_t Y = 0; Y < SrcSubCopyHeight; ++Y)
{ {
const size_t SrcImgOffset = ((SrcSubOffsetY + Y) * SrcWidth * ColorChannelCount) + (SrcSubOffsetX * ColorChannelCount); const size_t SrcImgOffset = ((SrcSubOffsetY + Y) * SrcWidth * PixelSize) + (SrcSubOffsetX * PixelSize);
const size_t DstImgOffset = (Y * DestWidth * ColorChannelCount); const size_t DstImgOffset = (Y * DestWidth * PixelSize);
const size_t CopySize = SrcSubCopyWidth * ColorChannelCount; const size_t CopySize = SrcSubCopyWidth * PixelSize;
mem_copy(&pDestBuffer[DstImgOffset], &pSourceBuffer[SrcImgOffset], CopySize); mem_copy(&pDestBuffer[DstImgOffset], &pSourceBuffer[SrcImgOffset], CopySize);
} }
} }
@ -2671,7 +2649,7 @@ int CGraphics_Threaded::Init()
} }
const int TextureLoadFlags = HasTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE; const int TextureLoadFlags = HasTextureArrays() ? IGraphics::TEXLOAD_TO_2D_ARRAY_TEXTURE : IGraphics::TEXLOAD_TO_3D_TEXTURE;
m_InvalidTexture.Invalidate(); m_InvalidTexture.Invalidate();
m_InvalidTexture = LoadTextureRaw(InvalidTextureDimension, InvalidTextureDimension, CImageInfo::FORMAT_RGBA, aNullTextureData, CImageInfo::FORMAT_RGBA, TextureLoadFlags); m_InvalidTexture = LoadTextureRaw(InvalidTextureDimension, InvalidTextureDimension, CImageInfo::FORMAT_RGBA, aNullTextureData, TextureLoadFlags);
} }
ColorRGBA GPUInfoPrintColor{0.6f, 0.5f, 1.0f, 1.0f}; ColorRGBA GPUInfoPrintColor{0.6f, 0.5f, 1.0f, 1.0f};
@ -2939,12 +2917,6 @@ void CGraphics_Threaded::Swap()
AddCmd(Cmd); AddCmd(Cmd);
} }
if(g_Config.m_GfxFinish)
{
CCommandBuffer::SCommand_Finish Cmd;
AddCmd(Cmd);
}
// kick the command buffer // kick the command buffer
KickCommandBuffer(); KickCommandBuffer();
// TODO: Remove when https://github.com/libsdl-org/SDL/issues/5203 is fixed // TODO: Remove when https://github.com/libsdl-org/SDL/issues/5203 is fixed

View file

@ -126,7 +126,6 @@ public:
// swap // swap
CMD_SWAP, CMD_SWAP,
CMD_FINISH,
// misc // misc
CMD_MULTISAMPLING, CMD_MULTISAMPLING,
@ -495,12 +494,6 @@ public:
SCommand(CMD_SWAP) {} SCommand(CMD_SWAP) {}
}; };
struct SCommand_Finish : public SCommand
{
SCommand_Finish() :
SCommand(CMD_FINISH) {}
};
struct SCommand_VSync : public SCommand struct SCommand_VSync : public SCommand
{ {
SCommand_VSync() : SCommand_VSync() :
@ -542,7 +535,6 @@ public:
size_t m_Width; size_t m_Width;
size_t m_Height; size_t m_Height;
int m_PixelSize;
int m_Format; int m_Format;
int m_StoreFormat; int m_StoreFormat;
int m_Flags; int m_Flags;
@ -974,8 +966,8 @@ public:
IGraphics::CTextureHandle FindFreeTextureIndex(); IGraphics::CTextureHandle FindFreeTextureIndex();
void FreeTextureIndex(CTextureHandle *pIndex); void FreeTextureIndex(CTextureHandle *pIndex);
int UnloadTexture(IGraphics::CTextureHandle *pIndex) override; int UnloadTexture(IGraphics::CTextureHandle *pIndex) override;
IGraphics::CTextureHandle LoadTextureRaw(size_t Width, size_t Height, int Format, const void *pData, int StoreFormat, int Flags, const char *pTexName = NULL) override; IGraphics::CTextureHandle LoadTextureRaw(size_t Width, size_t Height, CImageInfo::EImageFormat Format, const void *pData, int Flags, const char *pTexName = nullptr) override;
int LoadTextureRawSub(IGraphics::CTextureHandle TextureID, int x, int y, size_t Width, size_t Height, int Format, const void *pData) override; int LoadTextureRawSub(IGraphics::CTextureHandle TextureID, int x, int y, size_t Width, size_t Height, CImageInfo::EImageFormat Format, const void *pData) override;
IGraphics::CTextureHandle InvalidTexture() const override; IGraphics::CTextureHandle InvalidTexture() const override;
bool LoadTextTextures(size_t Width, size_t Height, CTextureHandle &TextTexture, CTextureHandle &TextOutlineTexture, void *pTextData, void *pTextOutlineData) override; bool LoadTextTextures(size_t Width, size_t Height, CTextureHandle &TextTexture, CTextureHandle &TextOutlineTexture, void *pTextData, void *pTextOutlineData) override;
@ -990,15 +982,15 @@ public:
bool IsSpriteTextureFullyTransparent(CImageInfo &FromImageInfo, struct client_data7::CDataSprite *pSprite) override; bool IsSpriteTextureFullyTransparent(CImageInfo &FromImageInfo, struct client_data7::CDataSprite *pSprite) override;
// simple uncompressed RGBA loaders // simple uncompressed RGBA loaders
IGraphics::CTextureHandle LoadTexture(const char *pFilename, int StorageType, int StoreFormat, int Flags) override; IGraphics::CTextureHandle LoadTexture(const char *pFilename, int StorageType, int Flags = 0) override;
int LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType) override; int LoadPNG(CImageInfo *pImg, const char *pFilename, int StorageType) override;
void FreePNG(CImageInfo *pImg) override; void FreePNG(CImageInfo *pImg) override;
bool CheckImageDivisibility(const char *pFileName, CImageInfo &Img, int DivX, int DivY, bool AllowResize) override; bool CheckImageDivisibility(const char *pFileName, CImageInfo &Img, int DivX, int DivY, bool AllowResize) override;
bool IsImageFormatRGBA(const char *pFileName, CImageInfo &Img) override; bool IsImageFormatRGBA(const char *pFileName, CImageInfo &Img) override;
void CopyTextureBufferSub(uint8_t *pDestBuffer, uint8_t *pSourceBuffer, size_t FullWidth, size_t FullHeight, size_t ColorChannelCount, size_t SubOffsetX, size_t SubOffsetY, size_t SubCopyWidth, size_t SubCopyHeight) override; void CopyTextureBufferSub(uint8_t *pDestBuffer, uint8_t *pSourceBuffer, size_t FullWidth, size_t FullHeight, size_t PixelSize, size_t SubOffsetX, size_t SubOffsetY, size_t SubCopyWidth, size_t SubCopyHeight) override;
void CopyTextureFromTextureBufferSub(uint8_t *pDestBuffer, size_t DestWidth, size_t DestHeight, uint8_t *pSourceBuffer, size_t SrcWidth, size_t SrcHeight, size_t ColorChannelCount, size_t SrcSubOffsetX, size_t SrcSubOffsetY, size_t SrcSubCopyWidth, size_t SrcSubCopyHeight) override; void CopyTextureFromTextureBufferSub(uint8_t *pDestBuffer, size_t DestWidth, size_t DestHeight, uint8_t *pSourceBuffer, size_t SrcWidth, size_t SrcHeight, size_t PixelSize, size_t SrcSubOffsetX, size_t SrcSubOffsetY, size_t SrcSubCopyWidth, size_t SrcSubCopyHeight) override;
bool ScreenshotDirect(); bool ScreenshotDirect();

View file

@ -113,7 +113,7 @@ class CAtlas
/** /**
* Sections with a smaller width or height will not be created * Sections with a smaller width or height will not be created
* when cutting larger sections, to prevent collecting many * when cutting larger sections, to prevent collecting many
* small, mostly unuseable sections. * small, mostly unusable sections.
*/ */
static constexpr size_t MIN_SECTION_DIMENSION = 6; static constexpr size_t MIN_SECTION_DIMENSION = 6;
@ -227,7 +227,7 @@ public:
} }
// We don't iterate sections in the map with increasing width and height at the same time, // We don't iterate sections in the map with increasing width and height at the same time,
// because it's slower and doesn't noticable increase the atlas utilization. // because it's slower and doesn't noticeable increase the atlas utilization.
} }
// Check vector for larger section // Check vector for larger section
@ -261,7 +261,7 @@ public:
} }
} while(SectionIndex > 0); } while(SectionIndex > 0);
if(SmallestLossIndex == m_vSections.size()) if(SmallestLossIndex == m_vSections.size())
return false; // No useable section found in vector return false; // No usable section found in vector
// Use the section with the smallest loss // Use the section with the smallest loss
const SSection Section = m_vSections[SmallestLossIndex]; const SSection Section = m_vSections[SmallestLossIndex];
@ -729,7 +729,7 @@ public:
return vec2(0.0f, 0.0f); return vec2(0.0f, 0.0f);
} }
void UploadEntityLayerText(void *pTexBuff, size_t ImageColorChannelCount, int TexWidth, int TexHeight, int TexSubWidth, int TexSubHeight, const char *pText, int Length, float x, float y, int FontSize) void UploadEntityLayerText(void *pTexBuff, size_t PixelSize, size_t TexWidth, size_t TexHeight, int TexSubWidth, int TexSubHeight, const char *pText, int Length, float x, float y, int FontSize)
{ {
if(FontSize < 1) if(FontSize < 1)
return; return;
@ -777,11 +777,11 @@ public:
{ {
const int ImgOffX = clamp(x + OffX + WidthLastChars, x, (x + TexSubWidth) - 1); const int ImgOffX = clamp(x + OffX + WidthLastChars, x, (x + TexSubWidth) - 1);
const int ImgOffY = clamp(y + OffY, y, (y + TexSubHeight) - 1); const int ImgOffY = clamp(y + OffY, y, (y + TexSubHeight) - 1);
const size_t ImageOffset = ImgOffY * (TexWidth * ImageColorChannelCount) + ImgOffX * ImageColorChannelCount; const size_t ImageOffset = ImgOffY * (TexWidth * PixelSize) + ImgOffX * PixelSize;
const size_t GlyphOffset = OffY * pBitmap->width + OffX; const size_t GlyphOffset = OffY * pBitmap->width + OffX;
for(size_t i = 0; i < ImageColorChannelCount; ++i) for(size_t i = 0; i < PixelSize; ++i)
{ {
if(i != ImageColorChannelCount - 1) if(i != PixelSize - 1)
{ {
*(pImageBuff + ImageOffset + i) = 255; *(pImageBuff + ImageOffset + i) = 255;
} }
@ -1574,7 +1574,11 @@ public:
float LastCharX = DrawX; float LastCharX = DrawX;
float LastCharWidth = 0; float LastCharWidth = 0;
// Returns true if line was started
const auto &&StartNewLine = [&]() { const auto &&StartNewLine = [&]() {
if(pCursor->m_MaxLines > 0 && LineCount >= pCursor->m_MaxLines)
return false;
DrawX = pCursor->m_StartX; DrawX = pCursor->m_StartX;
DrawY += pCursor->m_AlignedFontSize; DrawY += pCursor->m_AlignedFontSize;
if((RenderFlags & TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT) == 0) if((RenderFlags & TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT) == 0)
@ -1587,6 +1591,7 @@ public:
LastCharX = DrawX; LastCharX = DrawX;
LastCharWidth = 0; LastCharWidth = 0;
++LineCount; ++LineCount;
return true;
}; };
if(pCursor->m_CalculateSelectionMode != TEXT_CURSOR_SELECTION_MODE_NONE || pCursor->m_CursorMode != TEXT_CURSOR_CURSOR_MODE_NONE) if(pCursor->m_CalculateSelectionMode != TEXT_CURSOR_SELECTION_MODE_NONE || pCursor->m_CursorMode != TEXT_CURSOR_CURSOR_MODE_NONE)
@ -1606,7 +1611,7 @@ public:
bool GotNewLine = false; bool GotNewLine = false;
bool GotNewLineLast = false; bool GotNewLineLast = false;
while(pCurrent < pEnd && (pCursor->m_MaxLines < 1 || LineCount <= pCursor->m_MaxLines) && pCurrent != pEllipsis) while(pCurrent < pEnd && pCurrent != pEllipsis)
{ {
bool NewLine = false; bool NewLine = false;
const char *pBatchEnd = pEnd; const char *pBatchEnd = pEnd;
@ -1667,8 +1672,7 @@ public:
if((pCursor->m_Flags & TEXTFLAG_DISALLOW_NEWLINE) == 0) if((pCursor->m_Flags & TEXTFLAG_DISALLOW_NEWLINE) == 0)
{ {
pLastGlyph = nullptr; pLastGlyph = nullptr;
StartNewLine(); if(!StartNewLine())
if(pCursor->m_MaxLines > 0 && LineCount > pCursor->m_MaxLines)
break; break;
continue; continue;
} }
@ -1859,7 +1863,8 @@ public:
if(NewLine) if(NewLine)
{ {
StartNewLine(); if(!StartNewLine())
break;
GotNewLine = true; GotNewLine = true;
GotNewLineLast = true; GotNewLineLast = true;
} }
@ -2139,9 +2144,9 @@ public:
return TextContainer.m_BoundingBox; return TextContainer.m_BoundingBox;
} }
void UploadEntityLayerText(void *pTexBuff, size_t ImageColorChannelCount, int TexWidth, int TexHeight, int TexSubWidth, int TexSubHeight, const char *pText, int Length, float x, float y, int FontSize) override void UploadEntityLayerText(void *pTexBuff, size_t PixelSize, size_t TexWidth, size_t TexHeight, int TexSubWidth, int TexSubHeight, const char *pText, int Length, float x, float y, int FontSize) override
{ {
m_pGlyphMap->UploadEntityLayerText(pTexBuff, ImageColorChannelCount, TexWidth, TexHeight, TexSubWidth, TexSubHeight, pText, Length, x, y, FontSize); m_pGlyphMap->UploadEntityLayerText(pTexBuff, PixelSize, TexWidth, TexHeight, TexSubWidth, TexSubHeight, pText, Length, x, y, FontSize);
} }
int AdjustFontSize(const char *pText, int TextLength, int MaxSize, int MaxWidth) const override int AdjustFontSize(const char *pText, int TextLength, int MaxSize, int MaxWidth) const override

View file

@ -8,6 +8,8 @@
#include <engine/shared/json.h> #include <engine/shared/json.h>
#include <engine/storage.h> #include <engine/storage.h>
#include <game/version.h>
#include <cstdlib> // system #include <cstdlib> // system
using std::map; using std::map;

View file

@ -585,7 +585,7 @@ void CVideo::ReadRGBFromGL(size_t ThreadIndex)
{ {
uint32_t Width; uint32_t Width;
uint32_t Height; uint32_t Height;
uint32_t Format; CImageInfo::EImageFormat Format;
m_pGraphics->GetReadPresentedImageDataFuncUnsafe()(Width, Height, Format, m_vPixelHelper[ThreadIndex]); m_pGraphics->GetReadPresentedImageDataFuncUnsafe()(Width, Height, Format, m_vPixelHelper[ThreadIndex]);
} }

View file

@ -512,7 +512,7 @@ mod ffi {
/// Used as a last parameter in [`IConsole::Print`]. /// Used as a last parameter in [`IConsole::Print`].
/// ///
/// It is treated as "no color" in the console code, meaning that the default /// It is treated as "no color" in the console code, meaning that the default
/// color of the output medium isn't overriden. /// color of the output medium isn't overridden.
#[allow(non_upper_case_globals)] #[allow(non_upper_case_globals)]
pub const gs_ConsoleDefaultColor: ColorRGBA = ColorRGBA { pub const gs_ConsoleDefaultColor: ColorRGBA = ColorRGBA {
r: 1.0, r: 1.0,

View file

@ -15,6 +15,7 @@ public:
virtual void OnActivate() = 0; virtual void OnActivate() = 0;
virtual void OnWindowResize() = 0; virtual void OnWindowResize() = 0;
virtual bool HasUnsavedData() const = 0; virtual bool HasUnsavedData() const = 0;
virtual bool HandleMapDrop(const char *pFilename, int StorageType) = 0;
virtual bool Load(const char *pFilename, int StorageType) = 0; virtual bool Load(const char *pFilename, int StorageType) = 0;
virtual bool Save(const char *pFilename) = 0; virtual bool Save(const char *pFilename) = 0;
virtual void UpdateMentions() = 0; virtual void UpdateMentions() = 0;

View file

@ -17,14 +17,14 @@ struct SLibPNGWarningItem
{ {
SLibPNGWarningItem *pUserStruct = (SLibPNGWarningItem *)png_get_error_ptr(png_ptr); SLibPNGWarningItem *pUserStruct = (SLibPNGWarningItem *)png_get_error_ptr(png_ptr);
pUserStruct->m_pByteLoader->m_Err = -1; pUserStruct->m_pByteLoader->m_Err = -1;
dbg_msg("libpng", "error for file \"%s\": %s", pUserStruct->m_pFileName, error_msg); dbg_msg("png", "error for file \"%s\": %s", pUserStruct->m_pFileName, error_msg);
std::longjmp(pUserStruct->m_Buf, 1); std::longjmp(pUserStruct->m_Buf, 1);
} }
static void LibPNGWarning(png_structp png_ptr, png_const_charp warning_msg) static void LibPNGWarning(png_structp png_ptr, png_const_charp warning_msg)
{ {
SLibPNGWarningItem *pUserStruct = (SLibPNGWarningItem *)png_get_error_ptr(png_ptr); SLibPNGWarningItem *pUserStruct = (SLibPNGWarningItem *)png_get_error_ptr(png_ptr);
dbg_msg("libpng", "warning for file \"%s\": %s", pUserStruct->m_pFileName, warning_msg); dbg_msg("png", "warning for file \"%s\": %s", pUserStruct->m_pFileName, warning_msg);
} }
static bool FileMatchesImageType(SImageByteBuffer &ByteLoader) static bool FileMatchesImageType(SImageByteBuffer &ByteLoader)
@ -80,7 +80,7 @@ static void LibPNGDeleteReadStruct(png_structp pPNGStruct, png_infop pPNGInfo)
{ {
if(pPNGInfo != nullptr) if(pPNGInfo != nullptr)
png_destroy_info_struct(pPNGStruct, &pPNGInfo); png_destroy_info_struct(pPNGStruct, &pPNGInfo);
png_destroy_read_struct(&pPNGStruct, NULL, NULL); png_destroy_read_struct(&pPNGStruct, nullptr, nullptr);
} }
static int PngliteIncompatibility(png_structp pPNGStruct, png_infop pPNGInfo) static int PngliteIncompatibility(png_structp pPNGStruct, png_infop pPNGInfo)
@ -131,23 +131,19 @@ static int PngliteIncompatibility(png_structp pPNGStruct, png_infop pPNGInfo)
bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIncompatible, int &Width, int &Height, uint8_t *&pImageBuff, EImageFormat &ImageFormat) bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIncompatible, int &Width, int &Height, uint8_t *&pImageBuff, EImageFormat &ImageFormat)
{ {
png_infop pPNGInfo = nullptr;
int ColorType;
png_byte BitDepth;
int ColorChannelCount;
int BytesInRow;
Height = 0;
png_bytepp pRowPointers = nullptr;
SLibPNGWarningItem UserErrorStruct = {&ByteLoader, pFileName, {}}; SLibPNGWarningItem UserErrorStruct = {&ByteLoader, pFileName, {}};
png_structp pPNGStruct = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); png_structp pPNGStruct = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
if(pPNGStruct == NULL) if(pPNGStruct == nullptr)
{ {
dbg_msg("png", "libpng internal failure: png_create_read_struct failed."); dbg_msg("png", "libpng internal failure: png_create_read_struct failed.");
return false; return false;
} }
png_infop pPNGInfo = nullptr;
png_bytepp pRowPointers = nullptr;
Height = 0; // ensure this is not undefined for the error handler
if(setjmp(UserErrorStruct.m_Buf)) if(setjmp(UserErrorStruct.m_Buf))
{ {
if(pRowPointers != nullptr) if(pRowPointers != nullptr)
@ -165,9 +161,9 @@ bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIn
pPNGInfo = png_create_info_struct(pPNGStruct); pPNGInfo = png_create_info_struct(pPNGStruct);
if(pPNGInfo == NULL) if(pPNGInfo == nullptr)
{ {
png_destroy_read_struct(&pPNGStruct, NULL, NULL); png_destroy_read_struct(&pPNGStruct, nullptr, nullptr);
dbg_msg("png", "libpng internal failure: png_create_info_struct failed."); dbg_msg("png", "libpng internal failure: png_create_info_struct failed.");
return false; return false;
} }
@ -175,6 +171,7 @@ bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIn
if(!FileMatchesImageType(ByteLoader)) if(!FileMatchesImageType(ByteLoader))
{ {
LibPNGDeleteReadStruct(pPNGStruct, pPNGInfo); LibPNGDeleteReadStruct(pPNGStruct, pPNGInfo);
dbg_msg("png", "file does not match image type.");
return false; return false;
} }
@ -189,13 +186,14 @@ bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIn
if(ByteLoader.m_Err != 0) if(ByteLoader.m_Err != 0)
{ {
LibPNGDeleteReadStruct(pPNGStruct, pPNGInfo); LibPNGDeleteReadStruct(pPNGStruct, pPNGInfo);
dbg_msg("png", "byte loader error.");
return false; return false;
} }
Width = png_get_image_width(pPNGStruct, pPNGInfo); Width = png_get_image_width(pPNGStruct, pPNGInfo);
Height = png_get_image_height(pPNGStruct, pPNGInfo); Height = png_get_image_height(pPNGStruct, pPNGInfo);
ColorType = png_get_color_type(pPNGStruct, pPNGInfo); const int ColorType = png_get_color_type(pPNGStruct, pPNGInfo);
BitDepth = png_get_bit_depth(pPNGStruct, pPNGInfo); const png_byte BitDepth = png_get_bit_depth(pPNGStruct, pPNGInfo);
PngliteIncompatible = PngliteIncompatibility(pPNGStruct, pPNGInfo); PngliteIncompatible = PngliteIncompatibility(pPNGStruct, pPNGInfo);
if(BitDepth == 16) if(BitDepth == 16)
@ -227,8 +225,8 @@ bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIn
png_read_update_info(pPNGStruct, pPNGInfo); png_read_update_info(pPNGStruct, pPNGInfo);
ColorChannelCount = LibPNGGetColorChannelCount(ColorType); const int ColorChannelCount = LibPNGGetColorChannelCount(ColorType);
BytesInRow = png_get_rowbytes(pPNGStruct, pPNGInfo); const int BytesInRow = png_get_rowbytes(pPNGStruct, pPNGInfo);
if(BytesInRow == Width * ColorChannelCount) if(BytesInRow == Width * ColorChannelCount)
{ {
@ -255,6 +253,7 @@ bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIn
if(ByteLoader.m_Err != 0) if(ByteLoader.m_Err != 0)
{ {
LibPNGDeleteReadStruct(pPNGStruct, pPNGInfo); LibPNGDeleteReadStruct(pPNGStruct, pPNGInfo);
dbg_msg("png", "byte loader error.");
return false; return false;
} }
@ -263,11 +262,12 @@ bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIn
else else
{ {
LibPNGDeleteReadStruct(pPNGStruct, pPNGInfo); LibPNGDeleteReadStruct(pPNGStruct, pPNGInfo);
dbg_msg("png", "bytes in row incorrect.");
return false; return false;
} }
png_destroy_info_struct(pPNGStruct, &pPNGInfo); png_destroy_info_struct(pPNGStruct, &pPNGInfo);
png_destroy_read_struct(&pPNGStruct, NULL, NULL); png_destroy_read_struct(&pPNGStruct, nullptr, nullptr);
return true; return true;
} }
@ -304,9 +304,9 @@ static int ImageLoaderHelperFormatToColorChannel(EImageFormat Format)
bool SavePNG(EImageFormat ImageFormat, const uint8_t *pRawBuffer, SImageByteBuffer &WrittenBytes, int Width, int Height) bool SavePNG(EImageFormat ImageFormat, const uint8_t *pRawBuffer, SImageByteBuffer &WrittenBytes, int Width, int Height)
{ {
png_structp pPNGStruct = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); png_structp pPNGStruct = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
if(pPNGStruct == NULL) if(pPNGStruct == nullptr)
{ {
dbg_msg("png", "libpng internal failure: png_create_write_struct failed."); dbg_msg("png", "libpng internal failure: png_create_write_struct failed.");
return false; return false;
@ -314,9 +314,9 @@ bool SavePNG(EImageFormat ImageFormat, const uint8_t *pRawBuffer, SImageByteBuff
png_infop pPNGInfo = png_create_info_struct(pPNGStruct); png_infop pPNGInfo = png_create_info_struct(pPNGStruct);
if(pPNGInfo == NULL) if(pPNGInfo == nullptr)
{ {
png_destroy_read_struct(&pPNGStruct, NULL, NULL); png_destroy_read_struct(&pPNGStruct, nullptr, nullptr);
dbg_msg("png", "libpng internal failure: png_create_info_struct failed."); dbg_msg("png", "libpng internal failure: png_create_info_struct failed.");
return false; return false;
} }
@ -361,7 +361,7 @@ bool SavePNG(EImageFormat ImageFormat, const uint8_t *pRawBuffer, SImageByteBuff
delete[](pRowPointers); delete[](pRowPointers);
png_destroy_info_struct(pPNGStruct, &pPNGInfo); png_destroy_info_struct(pPNGStruct, &pPNGInfo);
png_destroy_write_struct(&pPNGStruct, NULL); png_destroy_write_struct(&pPNGStruct, nullptr);
return true; return true;
} }

View file

@ -66,29 +66,54 @@ struct SGraphicTileTexureCoords
class CImageInfo class CImageInfo
{ {
public: public:
enum enum EImageFormat
{ {
FORMAT_AUTO = -1, FORMAT_ERROR = -1,
FORMAT_RGB = 0, FORMAT_RGB = 0,
FORMAT_RGBA = 1, FORMAT_RGBA = 1,
FORMAT_SINGLE_COMPONENT = 2, FORMAT_SINGLE_COMPONENT = 2,
}; };
/* Variable: width /**
Contains the width of the image */ * Contains the width of the image
int m_Width; */
int m_Width = 0;
/* Variable: height /**
Contains the height of the image */ * Contains the height of the image
int m_Height; */
int m_Height = 0;
/* Variable: format /**
Contains the format of the image. See <Image Formats> for more information. */ * Contains the format of the image.
int m_Format; *
* @see EImageFormat
*/
EImageFormat m_Format = FORMAT_ERROR;
/* Variable: data /**
Pointer to the image data. */ * Pointer to the image data.
void *m_pData; */
void *m_pData = nullptr;
static size_t PixelSize(EImageFormat Format)
{
dbg_assert(Format != FORMAT_ERROR, "Format invalid");
static const size_t s_aSizes[] = {3, 4, 1};
return s_aSizes[(int)Format];
}
size_t PixelSize() const
{
return PixelSize(m_Format);
}
static EImageFormat ImageFormatFromInt(int Format)
{
if(Format < (int)FORMAT_RGB || Format > (int)FORMAT_SINGLE_COMPONENT)
return FORMAT_ERROR;
return (EImageFormat)Format;
}
}; };
/* /*
@ -207,7 +232,7 @@ namespace client_data7 {
struct CDataSprite; // NOLINT(bugprone-forward-declaration-namespace) struct CDataSprite; // NOLINT(bugprone-forward-declaration-namespace)
} }
typedef std::function<bool(uint32_t &Width, uint32_t &Height, uint32_t &Format, std::vector<uint8_t> &vDstData)> TGLBackendReadPresentedImageData; typedef std::function<bool(uint32_t &Width, uint32_t &Height, CImageInfo::EImageFormat &Format, std::vector<uint8_t> &vDstData)> TGLBackendReadPresentedImageData;
class IGraphics : public IInterface class IGraphics : public IInterface
{ {
@ -307,15 +332,15 @@ public:
virtual bool IsImageFormatRGBA(const char *pFileName, CImageInfo &Img) = 0; virtual bool IsImageFormatRGBA(const char *pFileName, CImageInfo &Img) = 0;
// destination and source buffer require to have the same width and height // destination and source buffer require to have the same width and height
virtual void CopyTextureBufferSub(uint8_t *pDestBuffer, uint8_t *pSourceBuffer, size_t FullWidth, size_t FullHeight, size_t ColorChannelCount, size_t SubOffsetX, size_t SubOffsetY, size_t SubCopyWidth, size_t SubCopyHeight) = 0; virtual void CopyTextureBufferSub(uint8_t *pDestBuffer, uint8_t *pSourceBuffer, size_t FullWidth, size_t FullHeight, size_t PixelSize, size_t SubOffsetX, size_t SubOffsetY, size_t SubCopyWidth, size_t SubCopyHeight) = 0;
// destination width must be equal to the subwidth of the source // destination width must be equal to the subwidth of the source
virtual void CopyTextureFromTextureBufferSub(uint8_t *pDestBuffer, size_t DestWidth, size_t DestHeight, uint8_t *pSourceBuffer, size_t SrcWidth, size_t SrcHeight, size_t ColorChannelCount, size_t SrcSubOffsetX, size_t SrcSubOffsetY, size_t SrcSubCopyWidth, size_t SrcSubCopyHeight) = 0; virtual void CopyTextureFromTextureBufferSub(uint8_t *pDestBuffer, size_t DestWidth, size_t DestHeight, uint8_t *pSourceBuffer, size_t SrcWidth, size_t SrcHeight, size_t PixelSize, size_t SrcSubOffsetX, size_t SrcSubOffsetY, size_t SrcSubCopyWidth, size_t SrcSubCopyHeight) = 0;
virtual int UnloadTexture(CTextureHandle *pIndex) = 0; virtual int UnloadTexture(CTextureHandle *pIndex) = 0;
virtual CTextureHandle LoadTextureRaw(size_t Width, size_t Height, int Format, const void *pData, int StoreFormat, int Flags, const char *pTexName = nullptr) = 0; virtual CTextureHandle LoadTextureRaw(size_t Width, size_t Height, CImageInfo::EImageFormat Format, const void *pData, int Flags, const char *pTexName = nullptr) = 0;
virtual int LoadTextureRawSub(CTextureHandle TextureID, int x, int y, size_t Width, size_t Height, int Format, const void *pData) = 0; virtual int LoadTextureRawSub(CTextureHandle TextureID, int x, int y, size_t Width, size_t Height, CImageInfo::EImageFormat Format, const void *pData) = 0;
virtual CTextureHandle LoadTexture(const char *pFilename, int StorageType, int StoreFormat, int Flags) = 0; virtual CTextureHandle LoadTexture(const char *pFilename, int StorageType, int Flags = 0) = 0;
virtual CTextureHandle InvalidTexture() const = 0; virtual CTextureHandle InvalidTexture() const = 0;
virtual void TextureSet(CTextureHandle Texture) = 0; virtual void TextureSet(CTextureHandle Texture) = 0;
void TextureClear() { TextureSet(CTextureHandle()); } void TextureClear() { TextureSet(CTextureHandle()); }

View file

@ -277,10 +277,14 @@ class IGameServer : public IInterface
MACRO_INTERFACE("gameserver", 0) MACRO_INTERFACE("gameserver", 0)
protected: protected:
public: public:
virtual void OnInit() = 0; // `pPersistentData` may be null if this is the first time `IGameServer`
// is instantiated.
virtual void OnInit(const void *pPersistentData) = 0;
virtual void OnConsoleInit() = 0; virtual void OnConsoleInit() = 0;
virtual void OnMapChange(char *pNewMapName, int MapNameSize) = 0; virtual void OnMapChange(char *pNewMapName, int MapNameSize) = 0;
virtual void OnShutdown() = 0; // `pPersistentData` may be null if this is the last time `IGameServer`
// is destroyed.
virtual void OnShutdown(void *pPersistentData) = 0;
virtual void OnTick() = 0; virtual void OnTick() = 0;
virtual void OnPreSnap() = 0; virtual void OnPreSnap() = 0;
@ -315,6 +319,7 @@ public:
virtual bool IsClientReady(int ClientID) const = 0; virtual bool IsClientReady(int ClientID) const = 0;
virtual bool IsClientPlayer(int ClientID) const = 0; virtual bool IsClientPlayer(int ClientID) const = 0;
virtual int PersistentDataSize() const = 0;
virtual int PersistentClientDataSize() const = 0; virtual int PersistentClientDataSize() const = 0;
virtual CUuid GameUuid() const = 0; virtual CUuid GameUuid() const = 0;

Some files were not shown because too many files have changed in this diff Show more