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:
build-cmake:
runs-on: ${{ matrix.os }}
env:
CARGO_HTTP_MULTIPLEXING: false
strategy:
fail-fast: false
matrix:

View file

@ -11,6 +11,8 @@ on:
jobs:
check-clang-san:
runs-on: ubuntu-latest
env:
CARGO_HTTP_MULTIPLEXING: false
steps:
- uses: actions/checkout@v3
with:
@ -24,14 +26,17 @@ jobs:
uses: Swatinem/rust-cache@v2
- name: Build with ASan and UBSan
run: |
mkdir clang-sanitizer
cd clang-sanitizer
export CC=clang
export CXX=clang++
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"
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)"
- name: Run server and headless client with ASan and UBSan
run: |
cd clang-sanitizer
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 LSAN_OPTIONS=suppressions=./lsan.supp
@ -44,6 +49,7 @@ jobs:
fi
- name: Run unit tests with ASan and UBSan
run: |
cd clang-sanitizer
cmake --build . --config Debug --target run_cxx_tests
# Rust tests work locally, but still not in CI, even with the same directory
if test -n "$(find . -maxdepth 1 -name 'SAN.*' -print -quit)"
@ -53,6 +59,7 @@ jobs:
fi
- name: Run integration tests with ASan and UBSan
run: |
cd clang-sanitizer
make run_integration_tests
if test -n "$(find . -maxdepth 1 -name 'SAN.*' -print -quit)"
then

View file

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

View file

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

View file

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

View file

@ -1,7 +1,4 @@
cmake_minimum_required(VERSION 2.8.12...3.19.1)
if(CMAKE_VERSION VERSION_LESS 3.12)
cmake_policy(VERSION ${CMAKE_VERSION})
endif()
cmake_minimum_required(VERSION 3.12...3.27.4)
set(CMAKE_OSX_DEPLOYMENT_TARGET 10.15 CACHE INTERNAL "Minimum macOS deployment version")
if(CMAKE_OSX_DEPLOYMENT_TARGET VERSION_LESS 10.15)
@ -26,16 +23,6 @@ else()
endif()
# 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")
project(DDNet VERSION ${VERSION_MAJOR}.${VERSION_MINOR})
else()
@ -165,26 +152,19 @@ endif()
set(DBG $<OR:$<CONFIG:Debug>,$<CONFIG:RelWithDebInfo>>)
if(IPO)
if(CMAKE_VERSION VERSION_GREATER 3.9)
include(CheckIPOSupported)
check_ipo_supported(RESULT ipo_supported OUTPUT ipo_output)
if(ipo_supported)
message(STATUS "IPO is enabled")
set(ENABLE_IPO TRUE)
else()
message(WARNING "IPO is not supported: ${ipo_output}")
endif()
include(CheckIPOSupported)
check_ipo_supported(RESULT ipo_supported OUTPUT ipo_output)
if(ipo_supported)
message(STATUS "IPO is enabled")
set(ENABLE_IPO TRUE)
else()
message(WARNING "IPO enablement requires CMake 3.9+")
message(WARNING "IPO is not supported: ${ipo_output}")
endif()
endif()
if(CMAKE_VERSION VERSION_LESS 3.0)
configure_file(src/game/version.h vd.h)
else()
set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS
src/game/version.h
)
if(NOT "${CMAKE_CURRENT_BINARY_DIR}" STREQUAL "${CMAKE_CURRENT_SOURCE_DIR}")
# Remove version.h generated by previous build code
file(REMOVE ${CMAKE_CURRENT_BINARY_DIR}/src/game/version.h)
endif()
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()
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)
endif()
@ -330,12 +310,6 @@ if(NOT MSVC AND NOT HAIKU)
endif()
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 -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)
@ -387,28 +361,25 @@ function(set_glob VAR GLOBBING EXTS DIRECTORY) # ...
if(NOT FILES STREQUAL GLOB_RESULT)
message(AUTHOR_WARNING "${VAR} does not contain every file from directory ${DIRECTORY}")
set(LIST_BUT_NOT_GLOB)
if(POLICY CMP0057)
cmake_policy(SET CMP0057 NEW)
foreach(file ${FILES})
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}")
foreach(file ${FILES})
if(NOT file IN_LIST GLOB_RESULT)
list(APPEND LIST_BUT_NOT_GLOB ${file})
endif()
set(GLOB_BUT_NOT_LIST)
foreach(file ${GLOB_RESULT})
if(NOT file IN_LIST FILES)
list(APPEND GLOB_BUT_NOT_LIST ${file})
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")
endforeach()
if(LIST_BUT_NOT_GLOB)
message(AUTHOR_WARNING "Entries only present in ${VAR}: ${LIST_BUT_NOT_GLOB}")
endif()
set(GLOB_BUT_NOT_LIST)
foreach(file ${GLOB_RESULT})
if(NOT file IN_LIST FILES)
list(APPEND GLOB_BUT_NOT_LIST ${file})
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()
@ -424,19 +395,11 @@ set(CHECKSUM_SRC)
function(set_own_rpath TARGET)
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")
endif()
set_property(TARGET ${TARGET} PROPERTY BUILD_RPATH "$ORIGIN")
set_property(TARGET ${TARGET} PROPERTY INSTALL_RPATH "$ORIGIN/../lib/ddnet")
endif()
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
########################################################################
@ -834,9 +797,6 @@ if(NOT(GTEST_FOUND) AND DOWNLOAD_GTEST)
set(GTEST_LIBRARIES gtest gmock)
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()
@ -1222,8 +1182,11 @@ set(EXPECTED_DATA
countryflags/EG.png
countryflags/EH.png
countryflags/ER.png
countryflags/ES-CT.png
countryflags/ES-GA.png
countryflags/ES.png
countryflags/ET.png
countryflags/EU.png
countryflags/FI.png
countryflags/FJ.png
countryflags/FK.png
@ -1231,6 +1194,10 @@ set(EXPECTED_DATA
countryflags/FO.png
countryflags/FR.png
countryflags/GA.png
countryflags/GB-ENG.png
countryflags/GB-NIR.png
countryflags/GB-SCT.png
countryflags/GB-WLS.png
countryflags/GB.png
countryflags/GD.png
countryflags/GE.png
@ -1396,13 +1363,6 @@ set(EXPECTED_DATA
countryflags/VU.png
countryflags/WF.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/ZA.png
countryflags/ZM.png
@ -1411,14 +1371,25 @@ set(EXPECTED_DATA
countryflags/index.txt
debug_font.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/basic_freeze.rules
editor/checker.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/FNG.png
editor/entities/Race.png
@ -1431,23 +1402,12 @@ set(EXPECTED_DATA
editor/entities_clear/fng.png
editor/entities_clear/race.png
editor/entities_clear/vanilla.png
editor/fadeout.rules
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/speedup.png
editor/switch.png
editor/tele.png
editor/tune.png
editor/water.rules
editor/winter_main.rules
emoticons.png
extras.png
fonts/DejaVuSans.ttf
@ -2019,6 +1979,7 @@ set_src(ENGINE_GFX GLOB src/engine/gfx
image_manipulation.h
)
set_src(GAME_SHARED GLOB src/game
alloc.h
collision.cpp
collision.h
ddracechat.h
@ -2303,7 +2264,7 @@ if(CLIENT)
ui_scrollregion.cpp
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.h
component.cpp
@ -2311,20 +2272,32 @@ if(CLIENT)
editor.cpp
editor.h
explanations.cpp
io.cpp
layer_game.cpp
layer_quads.cpp
layer_sounds.cpp
layer_tiles.cpp
map_grid.cpp
map_grid.h
map_view.cpp
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
proof_mode.cpp
proof_mode.h
smooth_value.cpp
smooth_value.h
tileart.cpp
)
set(GAME_GENERATED_CLIENT
src/game/generated/checksum.cpp
@ -2508,7 +2481,6 @@ if(SERVER)
upnp.h
)
set_src(GAME_SERVER GLOB_RECURSE src/game/server
alloc.h
ddracechat.cpp
ddracecommands.cpp
entities/character.cpp
@ -3078,8 +3050,6 @@ endif()
if(DEV)
# 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()
set(EXTRA_ARGS DESTINATION ${CPACK_PACKAGE_FILE_NAME} COMPONENT portable EXCLUDE_FROM_ALL)
install(TARGETS ${CPACK_TARGETS} ${EXTRA_ARGS})
@ -3309,11 +3279,9 @@ foreach(target ${TARGETS_LINK})
endforeach()
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_REQUIRED ON)
set_property(TARGET ${target} PROPERTY CXX_EXTENSIONS OFF)
endif()
set_property(TARGET ${target} PROPERTY CXX_STANDARD 17)
set_property(TARGET ${target} PROPERTY CXX_STANDARD_REQUIRED ON)
set_property(TARGET ${target} PROPERTY CXX_EXTENSIONS OFF)
if(MSVC)
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)
endif()
endif()
if(VERSION)
target_compile_definitions(${target} PRIVATE GAME_RELEASE_VERSION="${VERSION}")
endif()
if(CMAKE_SYSTEM_NAME STREQUAL "Emscripten")
target_compile_definitions(${target} PRIVATE CONF_WEBASM)
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
== -1
XEN
##### ISO 3166-2 subdivisions #####
GB-ENG
== 901
XNI
GB-NIR
== 902
XSC
GB-SCT
== 903
XWA
GB-WLS
== 904
XEU
== 905
XCA
ES-CT
== 906
XGL
ES-GA
== 907
#south sudan, non official code#
SS
== 737
##### ISO 3166/MA exceptional reservations #####
EU
== 905
##### ISO 3166-1 based #####
@ -648,6 +648,9 @@ SB
SO
== 706
SS
== 737
ZA
== 710

View file

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

View file

@ -140,9 +140,6 @@ Favorites
Feet
== ﺔﻣﺰﺟ
Filter
== ﺔﻴﻔﺼﺗ
Fire
== ﺭﺎﻧ
@ -155,9 +152,6 @@ Force vote
Free-View
== ﺮﺤﻟﺍ ﺮﻈﻨﻤﻟﺍ
Friends
== ﺀﺎﻗﺪﺻﻻﺍ
Fullscreen
== ﻞﻣﺎﻜﻟﺍ ﺔﺷﺎﺸﻟﺍ ﻊﺿﻭ
@ -354,12 +348,6 @@ Screenshot
Server address:
== ﺮﻓﺮﻴﺴﻟﺍ ﻥﺍﻮﻨﻋ:
Server details
== ﺮﻓﺮﻴﺴﻟﺍ ﻞﻴﺻﺎﻔﺗ
Server filter
== ﺮﻓﺮﻴﺴﻟﺍ ﺔﻴﻔﺼﺗ
Server info
== ﺮﻓﺮﻴﺴﻟﺍ ﺕﺎﻣﻮﻠﻌﻣ
@ -528,9 +516,6 @@ Netversion:
Map:
== ﺏﺎﻤﻟﺍ:
Info
== ﺕﺎﻣﻮﻠﻌﻣ
Hue
== ﻥﻮﻟ
@ -1355,12 +1340,35 @@ 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
==
@ -1376,12 +1384,6 @@ 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
==
@ -1397,6 +1399,9 @@ Cut interval
Cut length
==
Render cut to video
==
Loading demo files
==
@ -1448,10 +1453,10 @@ 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
==
Toggle to edit your dummy settings
Loading skin files
==
Download community skins

View file

@ -147,9 +147,6 @@ Favorites
Feet
== Ногі
Filter
== Фільтр
Fire
== Стрэл
@ -162,9 +159,6 @@ Force vote
Free-View
== Вольны агляд
Friends
== Сябры
Fullscreen
== Поўнаэкранны рэжым
@ -358,12 +352,6 @@ Screenshot
Server address:
== Адрас сервера:
Server details
== Дэталі сервера
Server filter
== Фільтр сервераў
Server info
== Інфармацыя
@ -532,9 +520,6 @@ Netversion:
Map:
== Карта:
Info
== Інфа
Hue
== Адценне
@ -1727,6 +1712,26 @@ Unable to rename the folder
(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
==

View file

@ -148,9 +148,6 @@ Favorites
Feet
== Stopala
Filter
== Filter
Fire
== Pucanje
@ -163,9 +160,6 @@ Force vote
Free-View
== Slobodan pogled
Friends
== Prijatelji
Fullscreen
== Čitav ekran
@ -359,12 +353,6 @@ Screenshot
Server address:
== Adresa servera:
Server details
== Podaci o serveru
Server filter
== Filter servera
Server info
== O Serveru
@ -535,9 +523,6 @@ Netversion:
Map:
== Mapa:
Info
== Info
Hue
== Nijans.
@ -1247,12 +1232,35 @@ 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
==
@ -1268,12 +1276,6 @@ 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
==
@ -1289,6 +1291,9 @@ Cut interval
Cut length
==
Render cut to video
==
Loading demo files
==
@ -1361,10 +1366,10 @@ Open the directory to add custom themes
Max CSVs
==
Loading skin files
Toggle to edit your dummy settings
==
Toggle to edit your dummy settings
Loading skin files
==
Download skins

View file

@ -170,9 +170,6 @@ Favorites
Feet
== Pés
Filter
== Filtro
Fire
== Atirar
@ -185,9 +182,6 @@ Force vote
Free-View
== Visualização livre
Friends
== Amigos
Fullscreen
== Tela cheia
@ -384,12 +378,6 @@ Screenshot
Server address:
== Endereço:
Server details
== Detalhes do servidor
Server filter
== Filtro de servidores
Server info
== Servidor
@ -576,9 +564,6 @@ Show ghost
Clan plates size
== Tamanho da placa do clã
Info
== Info
No updates available
== Nenhuma atualização disponível
@ -1767,3 +1752,23 @@ Unable to delete the folder '%s'. Make sure it's empty first.
Moved ingame
== 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
== Крака
Filter
== Филтър
Fire
== Стрелба
@ -160,9 +157,6 @@ Force vote
Free-View
== Свободен Изглед
Friends
== Приятели
Fullscreen
== Цял Екран
@ -356,12 +350,6 @@ Screenshot
Server address:
== Адрес на сървъра:
Server details
== Детайли за Сървъра
Server filter
== Филтър на сървъра
Server info
== Инфо
@ -529,9 +517,6 @@ Netversion:
Map:
== Карта:
Info
== Инфо
Hue
== Оттенък
@ -908,12 +893,35 @@ 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
==
@ -929,12 +937,6 @@ 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
==
@ -953,6 +955,9 @@ Cut length
Remove chat
==
Render cut to video
==
Please use a different name
==
@ -1103,10 +1108,10 @@ Max CSVs
Dummy settings
==
Loading skin files
Toggle to edit your dummy settings
==
Toggle to edit your dummy settings
Loading skin files
==
Download skins
@ -1160,10 +1165,16 @@ Show all
Toggle dyncam
==
Toggle dummy
Toggle ghost
==
Toggle ghost
Converse
==
Chat command
==
Toggle dummy
==
Dummy copy
@ -1172,9 +1183,6 @@ Dummy copy
Hammerfly dummy
==
Converse
==
Spectate previous
==
@ -1190,9 +1198,6 @@ Show entities
Show HUD
==
Chat command
==
Enable controller
==

View file

@ -140,9 +140,6 @@ Favorites
Feet
== Peus
Filter
== Filtre
Fire
== Disparar
@ -155,9 +152,6 @@ Force vote
Free-View
== Vista lliure
Friends
== Amics
Fullscreen
== Pantalla completa
@ -354,12 +348,6 @@ Screenshot
Server address:
== IP del servidor:
Server details
== Detalls del servidor
Server filter
== Filtre del servidor
Server info
== Servidor
@ -540,9 +528,6 @@ Netversion:
Map:
== Mapa:
Info
== Informació
Hue
== Tonalitat
@ -1427,12 +1412,35 @@ 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
==
@ -1448,12 +1456,6 @@ 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
==
@ -1469,6 +1471,9 @@ Cut interval
Cut length
==
Render cut to video
==
Loading demo files
==
@ -1514,10 +1519,10 @@ 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
==
Toggle to edit your dummy settings
Loading skin files
==
Download community skins

View file

@ -145,9 +145,6 @@ Favorites
Feet
== Урасем
Filter
== Фильтр
Fire
== Пĕрӳ
@ -160,9 +157,6 @@ Force vote
Free-View
== Ирĕклĕ обзор
Friends
== Юлташсем
Fullscreen
== Тулли экран
@ -356,12 +350,6 @@ Screenshot
Server address:
== Сервер адресĕ
Server details
== Сервер тĕплĕсем
Server filter
== Серверсен фильтр
Server info
== Пĕлтерӳ
@ -535,9 +523,6 @@ Miscellaneous
Netversion:
== Версия:
Info
== Пĕлтерӳ
UI Color
== Интерфейс тĕсĕ
@ -911,12 +896,35 @@ 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
==
@ -932,12 +940,6 @@ 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
==
@ -956,6 +958,9 @@ Cut length
Remove chat
==
Render cut to video
==
Please use a different name
==
@ -1106,10 +1111,10 @@ Max CSVs
Dummy settings
==
Loading skin files
Toggle to edit your dummy settings
==
Toggle to edit your dummy settings
Loading skin files
==
Download skins
@ -1163,10 +1168,16 @@ Show all
Toggle dyncam
==
Toggle dummy
Toggle ghost
==
Toggle ghost
Converse
==
Chat command
==
Toggle dummy
==
Dummy copy
@ -1175,9 +1186,6 @@ Dummy copy
Hammerfly dummy
==
Converse
==
Statboard
==
@ -1190,9 +1198,6 @@ Show entities
Show HUD
==
Chat command
==
Enable controller
==

View file

@ -148,9 +148,6 @@ Favorites
Feet
== Nohy
Filter
== Filtr
Fire
== Střelba
@ -163,9 +160,6 @@ Force vote
Free-View
== Volný pohled
Friends
== Přátelé
Fullscreen
== Celá obrazovka
@ -355,12 +349,6 @@ Screenshot
Server address:
== Adresa serveru:
Server details
== Detaily serveru
Server filter
== Filtr serverů
Server info
== Informace
@ -531,9 +519,6 @@ Netversion:
Map:
== Mapa:
Info
== Info
Hue
== Tón
@ -1365,12 +1350,35 @@ 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
==
@ -1386,12 +1394,6 @@ 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
==
@ -1407,6 +1409,9 @@ Cut interval
Cut length
==
Render cut to video
==
Loading demo files
==
@ -1458,10 +1463,10 @@ 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
==
Toggle to edit your dummy settings
Loading skin files
==
Download community skins

View file

@ -146,9 +146,6 @@ Favorites
Feet
== Fødder
Filter
== Filter
Fire
== Skyd
@ -161,9 +158,6 @@ Force vote
Free-View
== Free-View
Friends
== Venner
Fullscreen
== Fuldskærm
@ -357,12 +351,6 @@ Screenshot
Server address:
== Serveradresse
Server details
== Serverdetaljer
Server filter
== Serverfilter
Server info
== Serverinfo
@ -533,9 +521,6 @@ Netversion:
Map:
== Bane
Info
== Info
Hue
== Farve
@ -1363,12 +1348,35 @@ 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
==
@ -1384,12 +1392,6 @@ 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
==
@ -1405,6 +1407,9 @@ Cut interval
Cut length
==
Render cut to video
==
Loading demo files
==
@ -1456,10 +1461,10 @@ 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
==
Toggle to edit your dummy settings
Loading skin files
==
Download community skins

View file

@ -158,9 +158,6 @@ Favorites
Feet
== Voeten
Filter
== Filter
Fire
== Schieten
@ -173,9 +170,6 @@ Force vote
Free-View
== Vrij bewegen
Friends
== Vrienden
Fullscreen
== Volledig scherm
@ -369,12 +363,6 @@ Screenshot
Server address:
== Serveradres:
Server details
== Serverdetails
Server filter
== Serverfilter
Server info
== Serverinfo
@ -545,9 +533,6 @@ Netversion:
Map:
== Kaart:
Info
== Info
Hue
== Tint
@ -1473,12 +1458,35 @@ 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
==
@ -1494,12 +1502,6 @@ 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
==
@ -1515,6 +1517,9 @@ Cut interval
Cut length
==
Render cut to video
==
Loading demo files
==

View file

@ -273,9 +273,6 @@ Countries
Favorite
== Favorati
Friends
== Amikoj
Name
== Nomo
@ -285,9 +282,6 @@ Clan
Add Friend
== Aldoni amikon
Filter
== Filtri
Please use a different name
== Bonvolu uzi malsaman nomon
@ -767,9 +761,6 @@ The server is running a non-standard tuning on a pure game type.
Loading menu images
==
Server filter
==
Has people playing
==
@ -797,9 +788,6 @@ Types
Reset filter
==
Server details
==
Copy info
==
@ -843,9 +831,6 @@ Remove friend
Add Clan
==
Info
==
Play the current demo
==
@ -855,12 +840,35 @@ 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
==
@ -876,12 +884,6 @@ 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
==
@ -900,6 +902,9 @@ Cut interval
Cut length
==
Render cut to video
==
File already exists, do you want to overwrite it?
==
@ -1086,15 +1091,15 @@ Automatically create statboard csv
Max CSVs
==
Toggle to edit your dummy settings
==
Loading skin files
==
Your skin
==
Toggle to edit your dummy settings
==
Download skins
==
@ -1143,18 +1148,9 @@ Default zoom
Toggle dyncam
==
Toggle dummy
==
Toggle ghost
==
Dummy copy
==
Hammerfly dummy
==
Shotgun
==
@ -1173,6 +1169,18 @@ Team chat
Converse
==
Chat command
==
Toggle dummy
==
Dummy copy
==
Hammerfly dummy
==
Emoticon
==
@ -1209,9 +1217,6 @@ Show entities
Show HUD
==
Chat command
==
Enable controller
==

View file

@ -147,9 +147,6 @@ Favorites
Feet
== Jalat
Filter
== Suotimet
Fire
== Ammu
@ -162,9 +159,6 @@ Force vote
Free-View
== Vapaa näkymä
Friends
== Ystävät
Fullscreen
== Koko näyttö
@ -358,12 +352,6 @@ Screenshot
Server address:
== Palvelimen osoite:
Server details
== Palvelimen yksityiskohdat
Server filter
== Palvelinsuotimet
Server info
== Palvelintiedot
@ -532,9 +520,6 @@ Netversion:
Map:
== Kenttä:
Info
== Info
Hue
== Värisävy
@ -1320,12 +1305,35 @@ 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
==
@ -1341,12 +1349,6 @@ 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
==
@ -1362,6 +1364,9 @@ Cut interval
Cut length
==
Render cut to video
==
Loading demo files
==
@ -1422,10 +1427,10 @@ Automatically create statboard csv
Max CSVs
==
Loading skin files
Toggle to edit your dummy settings
==
Toggle to edit your dummy settings
Loading skin files
==
Download community skins
@ -1443,15 +1448,15 @@ Create a random skin
Open the directory to add custom skins
==
Converse
==
Dummy copy
==
Hammerfly dummy
==
Converse
==
Statboard
==

View file

@ -169,9 +169,6 @@ Favorites
Feet
== Pieds
Filter
== Filtre
Fire
== Tirer
@ -184,9 +181,6 @@ Force vote
Free-View
== Vue libre
Friends
== Amis
Fullscreen
== Plein écran
@ -380,12 +374,6 @@ Screenshot
Server address:
== Adresse du serveur :
Server details
== Détails du serveur
Server filter
== Filtres du serveur
Server info
== Info. serveur
@ -556,9 +544,6 @@ Netversion:
Map:
== Carte :
Info
== Info.
Hue
== Teinte
@ -1727,6 +1712,23 @@ Unable to rename the folder
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)
==
@ -1745,6 +1747,9 @@ Cut interval
Cut length
==
Render cut to video
==
All combined
==

View file

@ -145,9 +145,6 @@ Favorites
Feet
== Pés
Filter
== Filtro
Fire
== Disparar
@ -160,9 +157,6 @@ Force vote
Free-View
== Vista libre
Friends
== Amigos
Fullscreen
== Pantalla completa
@ -359,12 +353,6 @@ Screenshot
Server address:
== IP do servidor:
Server details
== Detalles do servidor
Server filter
== Filtro do servidor
Server info
== Servidor
@ -536,9 +524,6 @@ Netversion:
Map:
== Mapa:
Info
== Información
Hue
== Matiz
@ -1698,6 +1683,23 @@ Unable to rename the folder
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)
==
@ -1716,6 +1718,9 @@ Cut interval
Cut length
==
Render cut to video
==
All combined
==

View file

@ -163,9 +163,6 @@ Favorites
Feet
== Füße
Filter
== Filter
Fire
== Feuern
@ -178,9 +175,6 @@ Force vote
Free-View
== Freie Ansicht
Friends
== Freunde
Fullscreen
== Vollbild
@ -377,12 +371,6 @@ Screenshot
Server address:
== Serveradresse:
Server details
== Serverdetails
Server filter
== Filter
Server info
== Serverinfo
@ -566,9 +554,6 @@ Netversion:
Map:
== Karte:
Info
== Info
Hue
== Farb.
@ -1760,3 +1745,23 @@ Unable to delete the folder '%s'. Make sure it's empty first.
Moved ingame
== 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
== Πόδια
Filter
== Φίλτρο
Fire
== Πυρ
@ -160,9 +157,6 @@ Force vote
Free-View
== Ελεύθερη Όψη
Friends
== Φίλοι
Fullscreen
== Πλήρης οθόνη
@ -359,12 +353,6 @@ Screenshot
Server address:
== Διεύθ/ση διακομιστή:
Server details
== Λεπτομέριες διακομιστή
Server filter
== Φίλτρο διακομιστών
Server info
== Πληροφορίες
@ -538,9 +526,6 @@ Netversion:
Map:
== Χάρτης:
Info
== Πληροφορίες
Hue
== Απόχρωση
@ -914,12 +899,35 @@ 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
==
@ -935,12 +943,6 @@ 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
==
@ -959,6 +961,9 @@ Cut length
Remove chat
==
Render cut to video
==
Please use a different name
==
@ -1109,10 +1114,10 @@ Max CSVs
Dummy settings
==
Loading skin files
Toggle to edit your dummy settings
==
Toggle to edit your dummy settings
Loading skin files
==
Download skins
@ -1166,10 +1171,16 @@ Show all
Toggle dyncam
==
Toggle dummy
Toggle ghost
==
Toggle ghost
Converse
==
Chat command
==
Toggle dummy
==
Dummy copy
@ -1178,9 +1189,6 @@ Dummy copy
Hammerfly dummy
==
Converse
==
Statboard
==
@ -1193,9 +1201,6 @@ Show entities
Show HUD
==
Chat command
==
Enable controller
==

View file

@ -144,9 +144,6 @@ Favorites
Feet
== Láb
Filter
== Szűrő
Fire
== Tűz
@ -159,9 +156,6 @@ Force vote
Free-View
== Szabad nézet
Friends
== Barátok
Fullscreen
== Teljesképernyő
@ -349,12 +343,6 @@ Screenshot
Server address:
== Szerver címe:
Server details
== Szerver részletei
Server filter
== Szerver szűrő
Server info
== Szerver infó
@ -511,9 +499,6 @@ Netversion:
Map:
== Pálya:
Info
== Infó
Miscellaneous
== Egyéb
@ -1703,6 +1688,23 @@ None
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)
==
@ -1721,6 +1723,9 @@ Cut interval
Cut length
==
Render cut to video
==
All combined
==

View file

@ -152,9 +152,6 @@ Favorites
Feet
== Piedi
Filter
== Filtro
Fire
== Fuoco
@ -167,9 +164,6 @@ Force vote
Free-View
== Visione libera
Friends
== Amici
Fullscreen
== Schermo intero
@ -363,12 +357,6 @@ Screenshot
Server address:
== Indirizzo server:
Server details
== Dettagli server
Server filter
== Filtro server
Server info
== Info server
@ -536,9 +524,6 @@ Netversion:
Map:
== Mappa:
Info
== Info
Hue
== Tinta
@ -1167,51 +1152,6 @@ Grabs
9+ new mentions
== +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
== Preparando la riproduzione della demo
@ -1221,9 +1161,6 @@ Connected
Loading map file from storage
== Caricando il file mappa dalla memoria
Why are you slowmo replaying to read this?
==
Initializing components
== Inizializzando i componenti
@ -1302,55 +1239,18 @@ Join Tutorial Server
Skip Tutorial
== Salta Tutorial
Loading menu images
==
AFR
==
ASI
==
AUS
==
EUR
==
NA
==
SA
==
CHN
==
Getting server list from master server
== Ottenere l'elenco dei server dal server principale
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?
Copy info
==
Leak IP
==
No server selected
== Nessun server selezionato
Online players (%d)
==
Online clanmates (%d)
== Compagni di clan online
[friends (server browser)]
Offline (%d)
==
Click to select server. Double click to join your friend.
== 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
== 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
== 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
== Scarica skin comunitá
@ -1501,18 +1287,9 @@ Create a random skin
Open the directory to add custom skins
== Apri la cartella per aggiungere una skin custom
Converse
==
Chat command
==
Enable controller
== Abilitá controller
Controller
==
Ingame controller mode
== Modalitá controller in gioco
@ -1520,19 +1297,6 @@ Ingame controller mode
Relative
== Relativo
[Ingame controller mode]
Absolute
==
Ingame controller sens.
==
UI controller sens.
==
Controller jitter tolerance
==
No controller found. Plug in a controller.
== Nessun controller trovato. Collega un controller.
@ -1542,12 +1306,6 @@ Axis
Status
== Stato
Aim bind
==
Mouse
==
Ingame mouse sens.
== Sens. mouse in gioco
@ -1563,9 +1321,6 @@ Are you sure that you want to reset the controls to their defaults?
Cancel
== Cancella
Dummy
==
Windowed
== Finestra
@ -1578,42 +1333,15 @@ Windowed fullscreen
Desktop fullscreen
== Desktop schermo intero
Allows maps to render with more detail
==
Renderer
==
default
==
custom
==
Graphics card
== Scheda grafica
auto
==
Appearance
==
Name Plate
==
Hook Collisions
== Collisione Hook
Kill Messages
==
Show health, shields and ammo
== Mostra vita, scudi e munizioni
DDRace HUD
==
Show client IDs in scoreboard
== Mostra gli ID clienti nella scoreboard
@ -1671,51 +1399,12 @@ Nothing hookable
Something hookable
== Qualcosa hookabile
A Tee
==
Normal Color
==
Highlight Color
==
Weapons
== 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
== Quando attraversi la linea di partenza, mostra una maglietta fantasma che riproduce i movimenti del tuo miglior tempo
Overlay entities
==
Opacity
== Opacitá
@ -1746,15 +1435,343 @@ Chat command (e.g. showall 1)
Unregister protocol and file extensions
== Protocollo ed estensioni file non registrati
Extras
==
Loading assets
== Caricando assets
Open the directory to add custom assets
== 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
==
@ -1764,20 +1781,8 @@ https://ddnet.org/discord
Tutorial
==
Can't find a Tutorial server
== Impossibile trovare un Server Tutorial
Loading race demo files
== Caricando i file della demo della gara
Super
==
Loading sound files
== Caricando file musica
FPM
==
Moved ingame
== Spostato in gioco

View file

@ -145,9 +145,6 @@ Favorites
Feet
== 足
Filter
== フィルタ
Fire
== 射撃
@ -160,9 +157,6 @@ Force vote
Free-View
== 自由視点
Friends
== 友達
Game
== ゲーム
@ -353,12 +347,6 @@ Screenshot
Server address:
== IP アドレス:
Server details
== サーバー情報
Server filter
== サーバーフィルタ
Server info
== サーバー情報
@ -532,9 +520,6 @@ Miscellaneous
Netversion:
== 通信バージョン:
Info
== 情報
UI Color
== UI カラー
@ -1395,12 +1380,35 @@ 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
==
@ -1416,12 +1424,6 @@ 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
==
@ -1437,6 +1439,9 @@ Cut interval
Cut length
==
Render cut to video
==
Loading demo files
==
@ -1488,10 +1493,10 @@ 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
==
Toggle to edit your dummy settings
Loading skin files
==
Download community skins

View file

@ -154,9 +154,6 @@ Favorites
Feet
== 발
Filter
== 필터
Fire
== 발사
@ -169,9 +166,6 @@ Force vote
Free-View
== 자유 시점
Friends
== 친구
Fullscreen
== 전체화면
@ -359,12 +353,6 @@ Screenshot
Server address:
== 서버 주소:
Server details
== 서버 세부정보
Server filter
== 서버 필터
Server info
== 서버 정보
@ -550,9 +538,6 @@ Miscellaneous
Netversion:
== 통신 버전:
Info
== 정보
UI Color
== UI 색상
@ -1715,6 +1700,23 @@ None
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)
==
@ -1733,6 +1735,9 @@ Cut interval
Cut length
==
Render cut to video
==
All combined
==

View file

@ -150,9 +150,6 @@ Favorites
Feet
== Бут
Filter
== Фильтр
Fire
== Атуу
@ -165,9 +162,6 @@ Force vote
Free-View
== Эркин сереп
Friends
== Достор
Fullscreen
== Толук экран
@ -210,9 +204,6 @@ Hook
Hue
== Түсү
Info
== Маалымат
Internet
== Интернет
@ -424,12 +415,6 @@ Screenshot
Server address:
== Сервер дареги:
Server details
== Сервер деталдары
Server filter
== Сервер фильтри
Server info
== Маалымат
@ -905,12 +890,35 @@ 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
==
@ -926,12 +934,6 @@ 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
==
@ -950,6 +952,9 @@ Cut length
Remove chat
==
Render cut to video
==
Please use a different name
==
@ -1100,10 +1105,10 @@ Max CSVs
Dummy settings
==
Loading skin files
Toggle to edit your dummy settings
==
Toggle to edit your dummy settings
Loading skin files
==
Download skins
@ -1157,10 +1162,16 @@ Show all
Toggle dyncam
==
Toggle dummy
Toggle ghost
==
Toggle ghost
Converse
==
Chat command
==
Toggle dummy
==
Dummy copy
@ -1169,9 +1180,6 @@ Dummy copy
Hammerfly dummy
==
Converse
==
Statboard
==
@ -1184,9 +1192,6 @@ Show entities
Show HUD
==
Chat command
==
Enable controller
==

View file

@ -147,9 +147,6 @@ Favorites
Feet
== Føtter
Filter
== Filter
Fire
== Skyt
@ -162,9 +159,6 @@ Force vote
Free-View
== Fri-visning
Friends
== Venner
Fullscreen
== Fullskjerm
@ -358,12 +352,6 @@ Screenshot
Server address:
== Serveradresse:
Server details
== Serverdetaljer
Server filter
== Serverfilter
Server info
== Serverinfo
@ -534,9 +522,6 @@ Netversion:
Map:
== Bane:
Info
== Info
Hue
== Farge
@ -1364,12 +1349,35 @@ 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
==
@ -1385,12 +1393,6 @@ 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
==
@ -1406,6 +1408,9 @@ Cut interval
Cut length
==
Render cut to video
==
Loading demo files
==
@ -1457,10 +1462,10 @@ 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
==
Toggle to edit your dummy settings
Loading skin files
==
Download community skins

View file

@ -145,9 +145,6 @@ Favorites
Feet
== ﺎﭘ
Filter
== ﺮﺘﻠﯿﻓ
Fire
== ﻚﯿﻠﺷ
@ -160,9 +157,6 @@ Force vote
Free-View
== ﺩﺍﺯﺁ-ﺪﯾﺩ
Friends
== ﻥﺎﺘﺳﻭﺩ
Fullscreen
== ﻞﻣﺎﻛ ى ﻪﺤﻔﺻ
@ -472,9 +466,6 @@ Server address:
Refresh
== ﯼﺯﺎﺳ ﻩﺯﺎﺗ
Server filter
== ﺭﻭﺮﺳ ﺮﺘﻠﯿﻓ
Server not full
== ﺪﺷﺎﺒﻧ ﺮﭘ ﺭﻭﺮﺳ
@ -505,18 +496,12 @@ Types
Reset filter
== ﺮﺘﻠﯿﻓ ﻥﺩﺮﮐ ﺖﺴﯾﺭ
Server details
== ﺭﻭﺮﺳ ﺕﺎﻋﻼﻃﺍ
Scoreboard
== ﺕﺍﺯﺎﯿﺘﻣﺍ ﯼﻮﻠﺑﺎﺗ
Remove
== ﻥﺩﺮﮐ کﺎﭘ
Info
== ﺕﺎﻋﻼﻃﺍ
Please use a different name
== ﻦﮐ ﻩﺩﺎﻔﺘﺳﺍ ﺕﻭﺎﻔﺘﻣ ﻡﺎﻧ ﮏﯾ ﺯﺍ ﺎﻔﻄﻟ
@ -1685,6 +1670,23 @@ None
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)
==
@ -1703,6 +1705,9 @@ Cut interval
Cut length
==
Render cut to video
==
All combined
==

View file

@ -149,9 +149,6 @@ Favorites
Feet
== Stopy
Filter
== Filtr
Fire
== Strzał
@ -164,9 +161,6 @@ Force vote
Free-View
== Wolna kamera
Friends
== Znajomi
Fullscreen
== Pełny ekran
@ -360,12 +354,6 @@ Screenshot
Server address:
== Adres serwera:
Server details
== Szczegóły serwera
Server filter
== Filtr serwerów
Server info
== Info serwera
@ -551,9 +539,6 @@ Netversion:
Map:
== Mapa:
Info
== Info
Hue
== Kolor
@ -1465,12 +1450,35 @@ 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
==
@ -1486,12 +1494,6 @@ 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
==
@ -1507,6 +1509,9 @@ Cut interval
Cut length
==
Render cut to video
==
Loading demo files
==

View file

@ -152,9 +152,6 @@ Favorites
Feet
== Pés
Filter
== Filtro
Fire
== Disparar
@ -167,9 +164,6 @@ Force vote
Free-View
== Vista Livre
Friends
== Amigos
Fullscreen
== Ecrã inteiro
@ -375,12 +369,6 @@ Screenshot
Server address:
== Endereço do servidor:
Server details
== Detalhes do servidor
Server filter
== Filtro de servidores
Server info
== Info de servidor
@ -549,9 +537,6 @@ Map:
FSAA samples
== Amostras FSAA
Info
== Info
Miscellaneous
== Diversos
@ -1183,12 +1168,35 @@ 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
==
@ -1204,12 +1212,6 @@ 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
==
@ -1225,6 +1227,9 @@ Cut interval
Cut length
==
Render cut to video
==
Loading demo files
==
@ -1309,10 +1314,10 @@ 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
==
Toggle to edit your dummy settings
Loading skin files
==
Download skins
@ -1357,10 +1362,16 @@ Show all
Toggle dyncam
==
Toggle dummy
Toggle ghost
==
Toggle ghost
Converse
==
Chat command
==
Toggle dummy
==
Dummy copy
@ -1369,9 +1380,6 @@ Dummy copy
Hammerfly dummy
==
Converse
==
Statboard
==
@ -1384,9 +1392,6 @@ Show entities
Show HUD
==
Chat command
==
Enable controller
==

View file

@ -151,9 +151,6 @@ Favorites
Feet
== Picioare
Filter
== Filtre
Fire
== Foc
@ -166,9 +163,6 @@ Force vote
Free-View
== Vizualizare liberă
Friends
== Prieteni
Fullscreen
== Ecrat complet
@ -365,12 +359,6 @@ Screenshot
Server address:
== Adresă server:
Server details
== Detalii server
Server filter
== Filtru servere:
Server info
== Info. server
@ -544,9 +532,6 @@ Netversion:
Map:
== Harta:
Info
== Informații
Hue
== Tentă
@ -920,12 +905,35 @@ 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
==
@ -941,12 +949,6 @@ 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
==
@ -965,6 +967,9 @@ Cut length
Remove chat
==
Render cut to video
==
Please use a different name
==
@ -1115,10 +1120,10 @@ Max CSVs
Dummy settings
==
Loading skin files
Toggle to edit your dummy settings
==
Toggle to edit your dummy settings
Loading skin files
==
Download skins
@ -1172,10 +1177,16 @@ Show all
Toggle dyncam
==
Toggle dummy
Toggle ghost
==
Toggle ghost
Converse
==
Chat command
==
Toggle dummy
==
Dummy copy
@ -1184,9 +1195,6 @@ Dummy copy
Hammerfly dummy
==
Converse
==
Statboard
==
@ -1199,9 +1207,6 @@ Show entities
Show HUD
==
Chat command
==
Enable controller
==

View file

@ -159,9 +159,6 @@ Favorites
Feet
== Ноги
Filter
== Фильтр
Fire
== Стрелять
@ -174,9 +171,6 @@ Force vote
Free-View
== Свободный обзор
Friends
== Друзья
Fullscreen
== Полноэкранный(настр.)
@ -370,12 +364,6 @@ Screenshot
Server address:
== Адрес сервера:
Server details
== Сведения сервера
Server filter
== Фильтр серверов
Server info
== Информация
@ -607,9 +595,6 @@ Netversion:
Map:
== Карта:
Info
== Инфо
Hue
== Оттен.
@ -1756,3 +1741,23 @@ Unable to delete the folder '%s'. Make sure it's empty first.
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
== Stopala
Filter
== Filter
Fire
== Pucaj
@ -164,9 +161,6 @@ Force vote
Free-View
== Slobodan pregled
Friends
== Prijatelji
Fullscreen
== Preko celog ekrana
@ -356,12 +350,6 @@ Screenshot
Server address:
== Adresa servera:
Server details
== Detalji o serveru
Server filter
== Filter servera
Server info
== O serveru
@ -562,9 +550,6 @@ Netversion:
Map:
== Mapa
Info
== Info
Hue
== 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.
== Неуспешно слање рендерних команди. Покушајте ажурирати драјвере за вашу графичку картицу.
[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
==
== Није могуће сачувати преузету мапу. Покушајте ручно обрисати овај фајл: %s.
Initializing components
== Иницијализација компоненти
Quitting. Please wait…
== Излазим. Молим вас да почекате
== Излазим. Молим вас да почекате...
Restarting. Please wait…
== Поновно покрећем се. Молим вас да почекате
== Поновно покрећем се. Молим вас да почекате...
Multi-View
==
== Мулти-поглед
Rename folder
==
== Преименујте фасциклу
A demo with this name already exists
==
== Демо са овим именом већ постоји.
A folder with this name already exists
==
== Фасцикла са овим именом већ постоји.
Unable to rename the folder
==
== Није могуће преименовати фасциклу.
File '%s' already exists, do you want to overwrite it?
==
== Датотека '%s' већ постоји, желите ли да је препишете?
(paused)
==
== (паузирано)
transmits your player name to info.ddnet.org
==
== преноси ваше играчко име на info.ddnet.org
Copy info
==
== Копирај информације
No server selected
==
== Није изабран сервер
Online players (%d)
==
== Играчи на мрежи (%d)
Online clanmates (%d)
==
== Чланови клана на мрежи (%d)
[friends (server browser)]
Offline (%d)
==
== Изван мреже (%d)
Click to select server. Double click to join your friend.
==
== Кликните да бисте изабрали сервер. Дупли клик за придруживање пријатељу.
Click to remove this player from your friends list.
==
== Кликните да бисте уклонили овог играча са листе пријатеља.
Click to remove this clan from your friends list.
==
== Кликните да бисте уклонили овај клан са листе пријатеља.
None
==
== Ништа
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?
==
== Да ли сте сигурни да желите да уклоните клан '%s' са листе пријатеља?
Add 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
==
== Дужина сечења
All combined
==
== Све комбиновано
Folder Link
==
== Веза до фасцикле
Open the directory that contains the demo files
==
== Отвори директоријум који садржи демо фајлове
Are you sure that you want to delete the folder '%s'?
==
== Да ли сте сигурни да желите да обришете фасциклу '%s'?
Are you sure that you want to delete the demo '%s'?
==
== Да ли сте сигурни да желите да обришете демо запис '%s'?
Delete folder
==
== Обриши фасциклу
Unable to delete the demo '%s'
==
== Није могуће обрисати демо запис '%s'
Unable to delete the folder '%s'. Make sure it's empty first.
==
== Није могуће обрисати фасциклу '%s'. Проверите прво да ли је празна.
Menu opened. Press Esc key again to close menu.
==
== Мени је отворен. Поново притисните тастер Esc да бисте затворили мени.
Save power by lowering refresh rate (higher input latency)
==
== Уштедите струју смањивањем стопе освежавања (већа улазна латенција)
Open the settings file
==
== Отворите датотеку са подешавањима
Open the directory that contains the configuration and user files
== Отворите директоријум који садржи конфигурационе и корисничке датотеке.
@ -1747,4 +1723,32 @@ Open the directory to add custom assets
== Отворите директоријум за додавање прилагођених ресурса
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
== Стопала
Filter
== Филтер
Fire
== Пуцај
@ -160,9 +157,6 @@ Force vote
Free-View
== Слободан преглед
Friends
== Пријатељи
Fullscreen
== Преко целог екрана
@ -352,12 +346,6 @@ Screenshot
Server address:
== Адреса сервера:
Server details
== Детаљи о серверу
Server filter
== Филтер сервера
Server info
== О серверу
@ -558,9 +546,6 @@ Netversion:
Map:
== Мапа
Info
== Инфо
Hue
== Нијанса
@ -1601,12 +1586,35 @@ 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
==
@ -1622,12 +1630,6 @@ 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
==
@ -1643,6 +1645,9 @@ Cut interval
Cut length
==
Render cut to video
==
All combined
==

View file

@ -177,9 +177,6 @@ Favorites
Feet
== 脚
Filter
== 筛选
Fire
== 开火
@ -192,9 +189,6 @@ Force vote
Free-View
== 自由视角
Friends
== 好友
Fullscreen
== 独占全屏
@ -415,12 +409,6 @@ Screenshot
Server address:
== 服务器地址:
Server details
== 服务器详情
Server filter
== 服务器筛选
Server info
== 服务器信息
@ -616,9 +604,6 @@ Netversion:
Map:
== 地图:
Info
== 信息
Hue
== 色调
@ -1780,3 +1765,23 @@ Unable to delete the folder '%s'. Make sure it's empty first.
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
== Nohy
Filter
== Filter
Fire
== Streľba
@ -160,9 +157,6 @@ Force vote
Free-View
== Voľná Kamera
Friends
== Priatelia
Fullscreen
== Celá obrazovka
@ -356,12 +350,6 @@ Screenshot
Server address:
== Adresa servera:
Server details
== Detaily servera
Server filter
== Filter serverov
Server info
== Informácie
@ -532,9 +520,6 @@ Netversion:
Map:
== Mapa:
Info
== Info
Hue
== Hue
@ -911,12 +896,35 @@ 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
==
@ -932,12 +940,6 @@ 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
==
@ -956,6 +958,9 @@ Cut length
Remove chat
==
Render cut to video
==
Please use a different name
==
@ -1106,10 +1111,10 @@ Max CSVs
Dummy settings
==
Loading skin files
Toggle to edit your dummy settings
==
Toggle to edit your dummy settings
Loading skin files
==
Download skins
@ -1163,10 +1168,16 @@ Show all
Toggle dyncam
==
Toggle dummy
Toggle ghost
==
Toggle ghost
Converse
==
Chat command
==
Toggle dummy
==
Dummy copy
@ -1175,9 +1186,6 @@ Dummy copy
Hammerfly dummy
==
Converse
==
Statboard
==
@ -1190,9 +1198,6 @@ Show entities
Show HUD
==
Chat command
==
Enable controller
==

View file

@ -164,9 +164,6 @@ Favorites
Feet
== Pies
Filter
== Filtro
Fire
== Disparar
@ -179,9 +176,6 @@ Force vote
Free-View
== Vista libre
Friends
== Amigos
Fullscreen
== Pantalla completa
@ -378,12 +372,6 @@ Screenshot
Server address:
== IP del servidor:
Server details
== Detalles del servidor
Server filter
== Filtro del servidor
Server info
== Servidor
@ -557,9 +545,6 @@ Netversion:
Map:
== Mapa:
Info
== Información
Hue
== Matiz
@ -1763,3 +1748,23 @@ Unable to delete the folder '%s'. Make sure it's empty first.
Moved ingame
== 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
# cur.ie 2020-09-28 00:00:00
# simpygirl 2022-02-20 00:00:00
# furo 2023-08-29 00:00:00
##### /authors #####
##### translated strings #####
@ -149,9 +150,6 @@ Favorites
Feet
== Fötter
Filter
== Filter
Fire
== Skjuta
@ -164,9 +162,6 @@ Force vote
Free-View
== Friläge
Friends
== Kompisar
Fullscreen
== Fullskärm
@ -207,7 +202,7 @@ Hook
== Hook
Invalid Demo
== Ogiltigt deo
== Ogiltig demo
Join blue
== Spela i blått
@ -343,7 +338,7 @@ Rename demo
== Byt namn på demo
Reset filter
== Återställ filter
== Nollställ filter
Score
== Poäng
@ -360,12 +355,6 @@ Screenshot
Server address:
== Serveradress
Server details
== Serverdetaljer
Server filter
== Serverfilter
Server info
== Serverinfo
@ -415,7 +404,7 @@ Strict gametype filter
== Strikt speltypsfilter
Sudden Death
== Plötslig död
== Sudden Death
Switch weapon on pickup
== 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.
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
== Tidsbegränsning
@ -534,9 +523,6 @@ Netversion:
Map:
== Bana
Info
== Info
Hue
== Nyans
@ -550,7 +536,7 @@ Size:
== Storlek:
Reset to defaults
== Återställ till standard
== Nollställ till standard
Quit anyway?
== Avsluta i alla fall?
@ -607,7 +593,7 @@ Show kill messages
== Visa döds meddelanden
Reset
== Återställ
== Nollställ
DDNet
== DDNet
@ -643,7 +629,7 @@ Reconnect in %d sec
== Återkopplar om %d sekunder
Successfully saved the replay!
== Lyckades med att spara repris
== Lyckades med att spara repris!
Save ghost
== Spara spöken
@ -676,13 +662,13 @@ Show votes window after voting
== Visa röstnings fönster efter röstning
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
== Dö
Personal best:
== Personligs bästa:
== Personligt bästa:
Show DDNet map finishes in server browser
== Visa DDNet bana avklarningar i server bläddraren
@ -706,7 +692,7 @@ Render
== Rendera
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
@ -808,7 +794,7 @@ Date
== Datum
Show other players' hook collision lines
== Visa andra spelares hook kollision linor
== Visa andra spelares hook kollisions linjer
Fetch Info
== Hämta Info
@ -874,7 +860,7 @@ Show only chat messages from friends
== Visa bara chatt meddelanden från vänner
DDNet Client updated!
== DDNet Klienten updaterades!
== DDNet Klienten uppdaterades!
Converse
== Konversera
@ -916,7 +902,7 @@ Best
== Bäst
Updating...
== Updaterar...
== Uppdaterar...
Clan plates size
== Klanskylt storlek
@ -925,7 +911,7 @@ Size
== Storlek
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
@ -997,7 +983,7 @@ Show names in chat in team colors
== Visa namn in chatten med lagets färger
Update now
== Updatera nu
== Uppdatera nu
Toggle ghost
== Växla spöke
@ -1009,7 +995,7 @@ Team message
== Lag meddelande
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 kollisioner
@ -1069,7 +1055,7 @@ Server executable not found, can't run server
== Server exekveringsfil hittades ej, kan ej starta servern
Editor
== Editor
== Redigeraren
[Start menu]
Play
@ -1091,7 +1077,7 @@ Saving ddnet-settings.cfg failed
== 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.
== 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.
== 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
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
== Tema
@ -1223,7 +1209,7 @@ Entities
== Entities
Emoticons
== Emoticons
== Känsloikoner
Particles
== Partiklar
@ -1239,510 +1225,530 @@ https://ddnet.org/discord
[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.
==
== 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]
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]
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]
A render command failed. Try to update your GPU drivers.
==
== Ett "render command" misslyckades. Testa att uppdatera ditt grafikkorts drivrutiner.
[Graphics error]
Submitting the render commands failed. Try to update your GPU drivers.
==
== Inskickning av "render commands" misslyckades. Testa att uppdatera ditt grafikkorts drivrutiner.
[Graphics error]
Failed to swap framebuffers. Try to update your GPU drivers.
==
== Misslyckades att "swap framebuffers". Testa att uppdatera ditt grafikkorts drivrutiner.
[Graphics error]
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]
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]
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
==
== 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.
==
== Formatet av texturn %s är inte RGBA, vilket kommer att orsaka visuella buggar.
Preparing demo playback
==
== Förbreder för demo uppspelning
Connected
==
== Ansluten
Loading map file from storage
==
== Laddar bana fil från lagring
Why are you slowmo replaying to read this?
==
== Varför försöker du att läsa detta?
Initializing components
==
== Initierar komponenter
Initializing assets
==
== Initierar assets
Initializing map logic
==
== Initierar bana logik
Sending initial client info
==
== Skickar första klient info
Quitting. Please wait…
==
== Lämnar. Vänligen vänta…
Restarting. Please wait…
==
== Startar om. Vänligen vänta…
Position:
==
== Position
Speed:
==
== Hastighet:
Angle:
==
== Vinkel:
Multi-View
==
== Multi-Vy
Team %d
==
== Lag %d
Uploading map data to GPU
==
== Laddar upp bana data till grafikkortet
Trying to determine UDP connectivity...
==
== Försöker att bestämma UDP anslutning...
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 och TCP IP adresser verkar vara olika. Testa att stänga av VPN, proxy eller nätverksacceleratorer.
No answer from server yet.
==
== Inget svar från servern än.
Getting game info
==
== Hämtar spel info
Requesting to join the game
==
== Begär att få ansluta till spelet.
Rename folder
==
== Döp om mapp.
A demo with this name already exists
==
== Ett demo med detta namn finns redan
A folder with this name already exists
==
== En mapp finns redan med detta namn
Unable to rename the folder
==
== Misslyckades att döpa om mappen
File '%s' already exists, do you want to overwrite it?
==
== Fil '%s' finns redan, vill du skriva över den?
(paused)
==
== (pausad)
Join Tutorial Server
==
== Anslut till Tutorial
Skip Tutorial
==
== Skippa Tutorial
Loading menu images
==
== Laddar meny bilder
Copy info
==
== Kopiera info
No server selected
==
== Ingen server vald
Online players (%d)
==
== Online spelare (%d)
Online clanmates (%d)
==
== Online klanmedlemmar (%d)
[friends (server browser)]
Offline (%d)
==
== Offline (%d)
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.
==
== Klicka för att ta bort denna spelare från din kompis lista.
Click to remove this clan from your friends list.
==
== Klicka för att ta bort denna klan från din kompis lista.
None
==
== Ingen
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?
==
== Är du säker på att du vill ta bort klanen '%s' från din kompis lista?
Add Clan
==
== Lägg till klan
Play the current demo
==
== Spela demo
Pause the current demo
==
== Pausa demo
Stop the current demo
==
== Stoppa demo
Go back one tick
==
== Gå tillbaka en tick
Go forward one tick
==
== Gå framåt en tick
Slow down the demo
==
== Sakta ner demot
Speed up the demo
==
== Snabba up demot
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)
==
== Markera slutet av snittet (höger klicka för att nollställa)
Export cut as a separate demo
==
== Exportera snitt till en seperat demo fil
Go back one marker
==
== Gå tillbaka en markör
Go forward one marker
==
== Gå framåt en markör
Close the demo player
==
== Stäng demo spelaren
Toggle keyboard shortcuts
==
== Växla kortkommandon
Export demo cut
==
== Exportera demo snitt
Cut interval
==
== Snitt interval
Cut length
==
== Snitt längd
Loading demo files
==
== Laddar demo filer
All combined
==
== Alla kombinerade
Folder Link
==
== Mapp länk
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'?
==
== Är du säker på att du vill ta bort mappen '%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
==
== Ta bort mapp
Unable to delete the demo '%s'
==
== Misslyckades att ta bort demot '%s'
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
==
== Laddar spök filer
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)
==
== Spara batteri genom att sänka uppdateringsfrekvensen (högre inmatnings latens)
Open the settings file
==
== Öppna inställningsfil
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
==
== Öppna mappen för att lägga till egna teman
Loading skin files
==
== Laddar skin filer
Toggle to edit your dummy settings
==
== Växla till att ändra dina dummy inställningar
Download community skins
==
== Ladda ner community skins
Choose default eyes when joining a server
==
== Välj standard ögon när du ansluter till en server
Create a random skin
==
== Skapa ett slumpad skin
Open the directory to add custom skins
==
== Öppna mappen för att lägga till egna skins
Enable controller
==
== Aktivera kontroller
Controller
==
== Kontroller
Ingame controller mode
==
== Kontroller läge under spel
[Ingame controller mode]
Relative
==
== Relativ
[Ingame controller mode]
Absolute
==
== Absolut
Ingame controller sens.
==
== Kontroller känslighet i spelet.
UI controller sens.
==
== Kontroller känslighet i menyer.
Controller jitter tolerance
==
== Kontroller skaka tolerans
No controller found. Plug in a controller.
==
== Ingen kontroller hittad. Anslut en kontroller.
Axis
==
== Axel
Status
==
== Status
Aim bind
==
== Aim bind
Mouse
==
== Mus
Ingame mouse sens.
==
== Mus känslighet i spelet.
UI mouse sens.
==
== Mus känslighet i menyer.
Reset controls
==
== Nollställ kontrollerna
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
==
== Avbryt
Allows maps to render with more detail
==
== Tillåt banor att visa mer detaljer
Renderer
==
== Renderer
default
==
== standard
custom
==
== egna
Graphics card
==
== Grafikkort
auto
==
== auto
Appearance
==
== Utseende
Name Plate
==
== Namnskylt
Hook Collisions
==
== Hook kollisioner
Show health, shields and ammo
==
== Visa hälsa, sköldar och ammunition
DDRace HUD
==
== DDRace HUD
Show client IDs in scoreboard
==
== Visa klient ID i poänglista
Show DDRace HUD
==
== Visa DDRace HUD
Show jumps indicator
==
== Visa hopp indikator
Show dummy actions
==
== Visa dummy actions
Show player position
==
== Visa spelarens position
Show player speed
==
== Visa spelarens hastighet
Show player target angle
==
== Visa spelarens vinkel
Show freeze bars
==
== Visa freeze bars
Opacity of freeze bars inside freeze
==
== Opacitet av freeze bars i freeze
Show hook strength indicator
==
== Visa hook styrka indikator
Hook collision line
==
== Hook kollisions linje
Hook collision line width
==
== Hook kollisions linje bredd
Hook collision line opacity
==
== Hook kollisions linje opacitet
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
==
== Dina rörelser tas inte med i beräkningen av linjefärgerna
Nothing hookable
==
== Inget hookable
Something hookable
==
== Något hookable
A Tee
==
== En Tee
Normal Color
==
== Normal Färg
Highlight Color
==
== Betonad Färg
Weapons
==
== Vapen
Rifle Laser Outline Color
==
== Gevär Laser Kontur Färg
Rifle Laser Inner Color
==
== Gevär Laser Inre Färg
Shotgun Laser Outline Color
==
== Hagelgevär Laser Kontur Färg
Shotgun Laser Inner Color
==
== Hagelgevär Inre Färg
Door Laser Outline Color
==
== Dörr Laser Kontur Färg
Door Laser Inner Color
==
== Dörr Laser Inre Färg
Freeze Laser Outline Color
==
== Freeze Laser Kontur Färg
Freeze Laser Inner Color
==
== Freeze Laser Inre Färg
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
==
== När du passera start linjen, visa en spök tee som visar rörelsen av din bästa tid
Opacity
==
== Opacitet
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 används till bakgrunds decorationer
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
==
== Avregistera protokoll och filtillägg
Extras
==
== Extras
Loading assets
==
== Laddar assets
Open the directory to add custom assets
==
== Öppna mappen för att lägga till egna assets
Tutorial
==
== Tutorial
Can't find a Tutorial server
==
== Kunde inte hitta en Tutorial server
Loading race demo files
==
== Laddar race demo filer
Super
==
== Super
Loading sound files
==
== Laddar ljud filer
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
== 腳
Filter
== 過濾器
Fire
== 開火
@ -181,9 +178,6 @@ Force vote
Free-View
== 自由視角
Friends
== 好友
Fullscreen
== 獨占全螢幕
@ -404,12 +398,6 @@ Screenshot
Server address:
== 伺服器地址:
Server details
== 伺服器詳細資訊
Server filter
== 伺服器過濾器
Server info
== 伺服器資訊
@ -605,9 +593,6 @@ Netversion:
Map:
== 地圖:
Info
== 資訊
Hue
== 色調
@ -1769,3 +1754,23 @@ Unable to delete the folder '%s'. Make sure it's empty first.
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
# ardadem 2020-08-20 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 #####
##### translated strings #####
@ -151,9 +152,6 @@ Favorites
Feet
== Ayak
Filter
== Filtre
Fire
== Ateş
@ -166,9 +164,6 @@ Force vote
Free-View
== Serbest Bakış
Friends
== Arkadaşlar
Fullscreen
== Tam ekran
@ -359,12 +354,6 @@ Screenshot
Server address:
== Sunucu adresi:
Server details
== Sunucucu detayları
Server filter
== Filtreler
Server info
== Hakkında
@ -533,9 +522,6 @@ Netversion:
Map:
== Harita:
Info
== Bilgi
Hue
== 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.
Position:
== Pozisyon
== Pozisyon:
Speed:
== Hız
== Hız:
Angle:
== Açı
== Açı:
Multi-View
== Çoklu İzle
@ -1154,7 +1140,7 @@ UDP seems to be filtered.
== UDP filtrelenmiş görünüyor.
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.
== Henüz sunucudan cevap alınamadı.
@ -1172,7 +1158,7 @@ Existing Player
== Var olan oyuncu
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
== 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
%d players
== %d oyuncular
== %d oyuncu
%d player
== %d oyuncu
@ -1308,13 +1294,13 @@ Speed up the demo
== Demoyu hızlandır
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)
== 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
== Kesimi ayrı bir demo olarak dışarı aktar
== Kesiti ayrı bir demo olarak dışarı aktar
Go back one marker
== Bir işaret geri git
@ -1329,13 +1315,13 @@ Toggle keyboard shortcuts
== Klavye kısayollarını kullan
Export demo cut
== Kesimi dışarı aktar
== Kesiti dışarı aktar
Cut interval
== Kesim aralığı
== Kesit aralığı
Cut length
== Kesim uzunluğu
== Kesit uzunluğu
Loading demo files
== Demo dosyaları yükleniyor
@ -1472,10 +1458,10 @@ Mouse
== Fare
Ingame mouse sens.
== Oyun içi fare hassasiyeti
== Oyun hassasiyeti
UI mouse sens.
== Arayüz fare hassasiyeti
== Arayüz hassasiyeti
Reset controls
== Kontrolleri sıfırla
@ -1556,7 +1542,7 @@ Show DDRace HUD
== DDRace HUD göster
Show jumps indicator
== Zıplama göstergesini göster
== Kaç zıplama kaldığını göster
Show dummy actions
== Dummy aksiyonlarını göster
@ -1749,4 +1735,24 @@ Loading sound files
== Ses dosyaları yükleniyor
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
== Відтворити вирізку відео
[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 = [
"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"]
LegacyProjectileFlags = [f"CLIENTID_BIT{i}" for i in range(8)] + [
@ -71,7 +71,7 @@ enum
enum
{
GAMEINFO_CURVERSION=8,
GAMEINFO_CURVERSION=9,
};
'''
@ -549,4 +549,8 @@ Messages = [
NetIntRange("m_Team", 0, '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.
if ($args.length -lt 2) {
Write-Output "Usage: ./send_named_pipe.ps1 <pipename> <message> [message] ... [message]"
return
exit -1
}
$Wrapper = [pscustomobject]@{
@ -18,16 +18,24 @@ $Wrapper = [pscustomobject]@{
Reader = $null
Writer = $null
}
$Wrapper.Pipe.Connect(5000)
if (!$?) {
return
try {
$Wrapper.Pipe.Connect(5000)
$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() {}
/**
* Notifies thte logger of a changed `m_Filter`.
* Notifies the logger of a changed `m_Filter`.
*/
virtual void OnFilterChange() {}
};

View file

@ -11,7 +11,7 @@ use std::str;
///
/// Callbacks in C are usually represented by a function pointer and some
/// "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
/// [`UserPtr::cast`] because its lifetime and type information was lost.

View file

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

View file

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

View file

@ -167,7 +167,7 @@ public:
#if defined(CONF_VIDEORECORDER)
virtual const char *DemoPlayer_Render(const char *pFilename, int StorageType, const char *pVideoName, int SpeedIndex, bool StartPaused = false) = 0;
#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_Stop(int Recorder, bool RemoveFile = false) = 0;
virtual class IDemoRecorder *DemoRecorder(int Recorder) = 0;

View file

@ -1,24 +1,17 @@
#include "backend_base.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)
{
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;
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)
{
@ -28,7 +21,7 @@ bool CCommandProcessorFragment_GLBase::Texture2DTo3D(void *pImageBuffer, int Ima
{
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;
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));

View file

@ -84,12 +84,11 @@ protected:
SGFXErrorContainer m_Error;
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 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:
virtual ~CCommandProcessorFragment_GLBase() = default;

View file

@ -5,7 +5,7 @@
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;
bool Cmd_Init(const SCommand_Init *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);
}
void CCommandProcessorFragment_OpenGL::Cmd_Finish(const CCommandBuffer::SCommand_Finish *pCommand)
{
glFinish();
}
int CCommandProcessorFragment_OpenGL::TexFormatToOpenGLFormat(int TexFormat)
{
if(TexFormat == CCommandBuffer::TEXFORMAT_RGBA)
@ -54,7 +49,7 @@ int CCommandProcessorFragment_OpenGL::TexFormatToOpenGLFormat(int TexFormat)
return GL_RGBA;
}
size_t CCommandProcessorFragment_OpenGL::GLFormatToImageColorChannelCount(int GLFormat)
size_t CCommandProcessorFragment_OpenGL::GLFormatToPixelSize(int GLFormat)
{
switch(GLFormat)
{
@ -283,7 +278,7 @@ GfxOpenGLMessageCallback(GLenum Source,
}
#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)
{
@ -319,7 +314,7 @@ bool CCommandProcessorFragment_OpenGL::InitOpenGL(const SCommand_Init *pCommand)
m_IsOpenGLES = pCommand->m_RequestedBackend == BACKEND_TYPE_OPENGL_ES;
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);
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 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);
pTexData = pTmpData;
@ -671,7 +666,7 @@ void CCommandProcessorFragment_OpenGL::TextureUpdate(int Slot, int X, int Y, int
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);
pTexData = pTmpData;
}
@ -723,7 +718,7 @@ void CCommandProcessorFragment_OpenGL::Cmd_Texture_Destroy(const CCommandBuffer:
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
@ -746,7 +741,7 @@ void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int He
int PowerOfTwoHeight = HighestBit(Height);
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);
pTexData = pTmpData;
@ -778,7 +773,7 @@ void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int He
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);
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_RescaleCount = RescaleCount;
int Oglformat = GLFormat;
int StoreOglformat = GLStoreFormat;
const size_t PixelSize = GLFormatToPixelSize(GLFormat);
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_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
@ -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));
#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);
@ -886,14 +880,12 @@ void CCommandProcessorFragment_OpenGL::TextureCreate(int Slot, int Width, int He
glBindSampler(0, 0);
}
int ImageColorChannels = GLFormatToImageColorChannelCount(GLFormat);
uint8_t *p3DImageData = NULL;
bool IsSingleLayer = (Flags & (CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE_SINGLE_LAYER | CCommandBuffer::TEXFLAG_TO_3D_TEXTURE_SINGLE_LAYER)) != 0;
if(!IsSingleLayer)
p3DImageData = (uint8_t *)malloc((size_t)ImageColorChannels * Width * Height);
p3DImageData = (uint8_t *)malloc((size_t)Width * Height * PixelSize);
int Image3DWidth, Image3DHeight;
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");
int NewWidth = maximum<int>(HighestBit(ConvertWidth), 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;
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)
{
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
{
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;
// 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)
{
Width >>= 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);
@ -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)
{
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)
@ -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 *pTextData = pCommand->m_pTextData;
void *pTextOutlineData = 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);
TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, GL_ALPHA, GL_ALPHA, CCommandBuffer::TEXFLAG_NOMIPMAPS, pCommand->m_pTextData);
TextureCreate(pCommand->m_SlotOutline, pCommand->m_Width, pCommand->m_Height, GL_ALPHA, GL_ALPHA, CCommandBuffer::TEXFLAG_NOMIPMAPS, pCommand->m_pTextOutlineData);
}
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);
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)
@ -1102,9 +1102,6 @@ ERunCommandReturnTypes CCommandProcessorFragment_OpenGL::RunCommand(const CComma
case CCommandBuffer::CMD_UPDATE_VIEWPORT:
Cmd_Update_Viewport(static_cast<const CCommandBuffer::SCommand_Update_Viewport *>(pBaseCommand));
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_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; }
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 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 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 void Cmd_Shutdown(const SCommand_Shutdown *pCommand) {}
@ -102,7 +102,6 @@ protected:
virtual void Cmd_Screenshot(const CCommandBuffer::SCommand_TrySwapAndScreenshot *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_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;
}
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);
pTexData = pTmpData;
}
@ -577,7 +577,7 @@ void CCommandProcessorFragment_OpenGL3_3::Cmd_Texture_Destroy(const CCommandBuff
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())
m_vTextures.resize(m_vTextures.size() * 2);
@ -595,7 +595,7 @@ void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int
++RescaleCount;
} 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);
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_RescaleCount = RescaleCount;
int Oglformat = GLFormat;
int StoreOglformat = GLStoreFormat;
if(StoreOglformat == GL_RED)
StoreOglformat = GL_R8;
if(GLStoreFormat == GL_RED)
GLStoreFormat = GL_R8;
const size_t PixelSize = GLFormatToPixelSize(GLFormat);
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);
glSamplerParameteri(m_vTextures[Slot].m_Sampler, GL_TEXTURE_MAG_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
@ -649,7 +648,7 @@ void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 5.f);
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);
}
@ -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));
#endif
int ImageColorChannels = GLFormatToImageColorChannelCount(GLFormat);
uint8_t *p3DImageData = NULL;
bool IsSingleLayer = (Flags & CCommandBuffer::TEXFLAG_TO_2D_ARRAY_TEXTURE_SINGLE_LAYER) != 0;
if(!IsSingleLayer)
p3DImageData = (uint8_t *)malloc((size_t)ImageColorChannels * Width * Height);
p3DImageData = (uint8_t *)malloc((size_t)Width * Height * PixelSize);
int Image3DWidth, Image3DHeight;
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");
int NewWidth = maximum<int>(HighestBit(ConvertWidth), 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;
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)
{
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
{
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);
}
@ -723,12 +720,12 @@ void CCommandProcessorFragment_OpenGL3_3::TextureCreate(int Slot, int Width, int
m_vTextures[Slot].m_LastWrapMode = CCommandBuffer::WRAP_REPEAT;
// 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)
{
Width >>= 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);
@ -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)
{
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)
@ -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 *pTextData = pCommand->m_pTextData;
void *pTextOutlineData = 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);
TextureCreate(pCommand->m_Slot, pCommand->m_Width, pCommand->m_Height, GL_RED, GL_RED, CCommandBuffer::TEXFLAG_NOMIPMAPS, pCommand->m_pTextData);
TextureCreate(pCommand->m_SlotOutline, pCommand->m_Width, pCommand->m_Height, GL_RED, GL_RED, CCommandBuffer::TEXFLAG_NOMIPMAPS, pCommand->m_pTextOutlineData);
}
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)
{
glClearColor(pCommand->m_Color.r, pCommand->m_Color.g, pCommand->m_Color.b, 0.0f);
m_ClearColor = pCommand->m_Color;
}
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)

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 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;
void Cmd_Shutdown(const SCommand_Shutdown *pCommand) override;

View file

@ -1102,7 +1102,7 @@ protected:
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)
*/
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_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_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 UsesRGBALikeFormat = m_VKSurfFormat.format == VK_FORMAT_R8G8B8A8_UNORM || IsB8G8R8A8;
@ -1397,7 +1396,7 @@ protected:
Height = Viewport.height;
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;
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);
}
@ -2510,7 +2509,7 @@ protected:
* TEXTURES
************************/
size_t VulkanFormatToImageColorChannelCount(VkFormat Format)
size_t VulkanFormatToPixelSize(VkFormat Format)
{
if(Format == VK_FORMAT_R8G8B8_UNORM)
return 3;
@ -2521,9 +2520,9 @@ protected:
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;
if(!GetStagingBufferImage(StagingBuffer, pData, ImageSize))
return false;
@ -2541,7 +2540,7 @@ protected:
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);
pData = pTmpData;
}
@ -2571,14 +2570,13 @@ protected:
int Slot,
int Width,
int Height,
int PixelSize,
VkFormat Format,
VkFormat StoreFormat,
int Flags,
void *&pData)
{
size_t ImageIndex = (size_t)Slot;
int ImageColorChannels = VulkanFormatToImageColorChannelCount(Format);
const size_t PixelSize = VulkanFormatToPixelSize(Format);
while(ImageIndex >= m_vTextures.size())
{
@ -2596,7 +2594,7 @@ protected:
++RescaleCount;
} 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);
pData = pTmpData;
}
@ -2654,7 +2652,7 @@ protected:
dbg_msg("vulkan", "3D/2D array texture was resized");
int NewWidth = maximum<int>(HighestBit(ConvertWidth), 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;
ConvertHeight = NewHeight;
@ -2668,8 +2666,8 @@ protected:
bool Needs3DTexDel = false;
if(!Is2DTextureSingleLayer)
{
p3DTexData = malloc((size_t)ImageColorChannels * ConvertWidth * ConvertHeight);
if(!Texture2DTo3D(pData, ConvertWidth, ConvertHeight, ImageColorChannels, 16, 16, p3DTexData, Image3DWidth, Image3DHeight))
p3DTexData = malloc((size_t)PixelSize * ConvertWidth * ConvertHeight);
if(!Texture2DTo3D(pData, ConvertWidth, ConvertHeight, PixelSize, 16, 16, p3DTexData, Image3DWidth, Image3DHeight))
{
free(p3DTexData);
p3DTexData = nullptr;
@ -6467,7 +6465,7 @@ public:
Buffer.m_pRawCommand = pBaseCommand;
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();
}
@ -6493,7 +6491,7 @@ public:
Ret = CallbackObj.m_CMDIsHandled;
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;
}
}
@ -6582,7 +6580,7 @@ public:
m_MultiSamplingCount = (g_Config.m_GfxFsaaSamples & 0xFFFFFFFE); // ignore the uneven bit, only even multi sampling works
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;
@ -6657,7 +6655,7 @@ public:
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;
free(pData);
@ -6682,13 +6680,12 @@ public:
int Slot = pCommand->m_Slot;
int Width = pCommand->m_Width;
int Height = pCommand->m_Height;
int PixelSize = pCommand->m_PixelSize;
int Format = pCommand->m_Format;
int StoreFormat = pCommand->m_StoreFormat;
int Flags = pCommand->m_Flags;
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;
free(pData);
@ -6706,9 +6703,9 @@ public:
void *pTmpData = pCommand->m_pTextData;
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;
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;
if(!CreateNewTextDescriptorSets(Slot, SlotOutline))
@ -6741,7 +6738,7 @@ public:
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;
free(pData);
@ -6815,7 +6812,7 @@ public:
uint32_t Width;
uint32_t Height;
uint32_t Format;
CImageInfo::EImageFormat Format;
if(GetPresentedImageDataImpl(Width, Height, Format, m_vScreenshotHelper, false, true))
{
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_Height = (int)Height;
pCommand->m_pImage->m_Format = (int)Format;
pCommand->m_pImage->m_Format = Format;
return true;
}
@ -6921,12 +6918,6 @@ public:
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)
{
return NextFrame();
@ -7659,7 +7650,7 @@ public:
{
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;
break;
}

View file

@ -505,7 +505,7 @@ void CClient::RconAuth(const char *pName, const char *pPassword)
CMsgPacker Msg(NETMSG_RCON_AUTH, true);
Msg.AddString(pName, 32);
Msg.AddString(pPassword, 32);
Msg.AddString(pPassword, 128);
Msg.AddInt(1);
SendMsgActive(&Msg, MSGFLAG_VITAL);
}
@ -974,7 +974,7 @@ void CClient::ServerInfoRequest()
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
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)
g_Config.m_ClEditor = true;
else
@ -3376,12 +3376,6 @@ void CClient::Run()
else
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
m_LocalTime = (time_get() - m_LocalStartTime) / (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));
}
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)
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
{
char aFilename[IO_MAX_PATH_LENGTH];
@ -4038,9 +4035,9 @@ void CClient::Con_Record(IConsole::IResult *pResult, void *pUserData)
{
CClient *pSelf = (CClient *)pUserData;
if(pResult->NumArguments())
pSelf->DemoRecorder_Start(pResult->GetString(0), false, RECORDER_MANUAL);
pSelf->DemoRecorder_Start(pResult->GetString(0), false, RECORDER_MANUAL, true);
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)
@ -4629,7 +4626,7 @@ int main(int argc, const char **argv)
pClient->GetGPUInfoString(aGPUInfo);
char aMessage[768];
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"
"%s\n\n"
"Platform: %s\n"

View file

@ -164,9 +164,9 @@ class CClient : public IClient, public CDemoPlayer::IListener
int m_aCurrentRecvTick[NUM_DUMMIES];
int m_aRconAuthed[NUM_DUMMIES];
char m_aRconUsername[32];
char m_aRconPassword[32];
char m_aRconPassword[128];
int m_UseTempRconCommands;
char m_aPassword[32];
char m_aPassword[128];
bool m_SendPassword;
bool m_ButtonRender = false;
@ -482,7 +482,7 @@ public:
void RegisterCommands();
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_StartReplayRecorder();
void DemoRecorder_Stop(int Recorder, bool RemoveFile = false) override;

View file

@ -305,27 +305,17 @@ int CGraphics_Threaded::UnloadTexture(CTextureHandle *pIndex)
return 0;
}
static int ImageFormatToPixelSize(int Format)
{
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)
static bool ConvertToRGBA(uint8_t *pDest, const uint8_t *pSrc, size_t SrcWidth, size_t SrcHeight, CImageInfo::EImageFormat SrcFormat)
{
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;
}
else
{
size_t SrcChannelCount = ImageFormatToPixelSize(SrcFormat);
size_t DstChannelCount = 4;
const size_t SrcChannelCount = CImageInfo::PixelSize(SrcFormat);
const size_t DstChannelCount = CImageInfo::PixelSize(CImageInfo::FORMAT_RGBA);
for(size_t Y = 0; Y < SrcHeight; ++Y)
{
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 ImgOffsetDest = (Y * SrcWidth * DstChannelCount) + (X * DstChannelCount);
size_t CopySize = SrcChannelCount;
if(SrcChannelCount == 3)
if(SrcFormat == CImageInfo::FORMAT_RGB)
{
mem_copy(&pDest[ImgOffsetDest], &pSrc[ImgOffsetSrc], CopySize);
pDest[ImgOffsetDest + 3] = 255;
}
else if(SrcChannelCount == 1)
else if(SrcFormat == CImageInfo::FORMAT_SINGLE_COMPONENT)
{
pDest[ImgOffsetDest + 0] = 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.");
@ -364,7 +354,7 @@ int CGraphics_Threaded::LoadTextureRawSub(CTextureHandle TextureID, int x, int y
Cmd.m_Format = CCommandBuffer::TEXFORMAT_RGBA;
// calculate memory usage
const size_t MemSize = Width * Height * 4;
const size_t MemSize = Width * Height * CImageInfo::PixelSize(CImageInfo::FORMAT_RGBA);
// copy texture data
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)
{
const size_t PixelSize = ImageFormatToPixelSize(FromImageInfo.m_Format);
const size_t PixelSize = FromImageInfo.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);
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)
{
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 ix = 0; ix < w; ++ix)
{
int RealOffset = (x + ix) * bpp + (y + iy) * bpp * FromImageInfo.m_Width;
if(pImgData[RealOffset + (bpp - 1)] > 0)
const size_t RealOffset = (x + ix) * PixelSize + (y + iy) * PixelSize * FromImageInfo.m_Width;
if(pImgData[RealOffset + (PixelSize - 1)] > 0)
return false;
}
}
@ -438,7 +428,7 @@ bool CGraphics_Threaded::IsSpriteTextureFullyTransparent(CImageInfo &FromImageIn
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
#ifdef CONF_DEBUG
@ -472,7 +462,6 @@ IGraphics::CTextureHandle CGraphics_Threaded::LoadTextureRaw(size_t Width, size_
Cmd.m_Slot = TextureHandle.Id();
Cmd.m_Width = Width;
Cmd.m_Height = Height;
Cmd.m_PixelSize = 4;
Cmd.m_Format = 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;
// 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);
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
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
CImageInfo Img;
if(LoadPNG(&Img, pFilename, StorageType))
{
if(StoreFormat == CImageInfo::FORMAT_AUTO)
StoreFormat = Img.m_Format;
IGraphics::CTextureHandle ID = LoadTextureRaw(Img.m_Width, Img.m_Height, Img.m_Format, Img.m_pData, StoreFormat, Flags, pFilename);
IGraphics::CTextureHandle ID = LoadTextureRaw(Img.m_Width, Img.m_Height, Img.m_Format, Img.m_pData, Flags, pFilename);
free(Img.m_pData);
if(ID.Id() != m_InvalidTexture.Id() && g_Config.m_Debug)
dbg_msg("graphics/texture", "loaded %s", pFilename);
@ -696,15 +682,7 @@ bool CGraphics_Threaded::CheckImageDivisibility(const char *pFileName, CImageInf
NewWidth = (NewHeight / DivY) * DivX;
}
int ColorChannelCount = 4;
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);
uint8_t *pNewImg = ResizeImage((uint8_t *)Img.m_pData, Img.m_Width, Img.m_Height, NewWidth, NewHeight, Img.PixelSize());
free(Img.m_pData);
Img.m_pData = pNewImg;
Img.m_Width = NewWidth;
@ -734,23 +712,23 @@ bool CGraphics_Threaded::IsImageFormatRGBA(const char *pFileName, CImageInfo &Im
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)
{
const size_t ImgOffset = ((SubOffsetY + Y) * FullWidth * ColorChannelCount) + (SubOffsetX * ColorChannelCount);
const size_t CopySize = SubCopyWidth * ColorChannelCount;
const size_t ImgOffset = ((SubOffsetY + Y) * FullWidth * PixelSize) + (SubOffsetX * PixelSize);
const size_t CopySize = SubCopyWidth * PixelSize;
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)
{
const size_t SrcImgOffset = ((SrcSubOffsetY + Y) * SrcWidth * ColorChannelCount) + (SrcSubOffsetX * ColorChannelCount);
const size_t DstImgOffset = (Y * DestWidth * ColorChannelCount);
const size_t CopySize = SrcSubCopyWidth * ColorChannelCount;
const size_t SrcImgOffset = ((SrcSubOffsetY + Y) * SrcWidth * PixelSize) + (SrcSubOffsetX * PixelSize);
const size_t DstImgOffset = (Y * DestWidth * PixelSize);
const size_t CopySize = SrcSubCopyWidth * PixelSize;
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;
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};
@ -2939,12 +2917,6 @@ void CGraphics_Threaded::Swap()
AddCmd(Cmd);
}
if(g_Config.m_GfxFinish)
{
CCommandBuffer::SCommand_Finish Cmd;
AddCmd(Cmd);
}
// kick the command buffer
KickCommandBuffer();
// TODO: Remove when https://github.com/libsdl-org/SDL/issues/5203 is fixed

View file

@ -126,7 +126,6 @@ public:
// swap
CMD_SWAP,
CMD_FINISH,
// misc
CMD_MULTISAMPLING,
@ -495,12 +494,6 @@ public:
SCommand(CMD_SWAP) {}
};
struct SCommand_Finish : public SCommand
{
SCommand_Finish() :
SCommand(CMD_FINISH) {}
};
struct SCommand_VSync : public SCommand
{
SCommand_VSync() :
@ -542,7 +535,6 @@ public:
size_t m_Width;
size_t m_Height;
int m_PixelSize;
int m_Format;
int m_StoreFormat;
int m_Flags;
@ -974,8 +966,8 @@ public:
IGraphics::CTextureHandle FindFreeTextureIndex();
void FreeTextureIndex(CTextureHandle *pIndex);
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;
int LoadTextureRawSub(IGraphics::CTextureHandle TextureID, int x, int y, size_t Width, size_t Height, int Format, const void *pData) 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, CImageInfo::EImageFormat Format, const void *pData) override;
IGraphics::CTextureHandle InvalidTexture() const 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;
// 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;
void FreePNG(CImageInfo *pImg) override;
bool CheckImageDivisibility(const char *pFileName, CImageInfo &Img, int DivX, int DivY, bool AllowResize) 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 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 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 PixelSize, size_t SrcSubOffsetX, size_t SrcSubOffsetY, size_t SrcSubCopyWidth, size_t SrcSubCopyHeight) override;
bool ScreenshotDirect();

View file

@ -113,7 +113,7 @@ class CAtlas
/**
* Sections with a smaller width or height will not be created
* when cutting larger sections, to prevent collecting many
* small, mostly unuseable sections.
* small, mostly unusable sections.
*/
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,
// 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
@ -261,7 +261,7 @@ public:
}
} while(SectionIndex > 0);
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
const SSection Section = m_vSections[SmallestLossIndex];
@ -729,7 +729,7 @@ public:
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)
return;
@ -777,11 +777,11 @@ public:
{
const int ImgOffX = clamp(x + OffX + WidthLastChars, x, (x + TexSubWidth) - 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;
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;
}
@ -1574,7 +1574,11 @@ public:
float LastCharX = DrawX;
float LastCharWidth = 0;
// Returns true if line was started
const auto &&StartNewLine = [&]() {
if(pCursor->m_MaxLines > 0 && LineCount >= pCursor->m_MaxLines)
return false;
DrawX = pCursor->m_StartX;
DrawY += pCursor->m_AlignedFontSize;
if((RenderFlags & TEXT_RENDER_FLAG_NO_PIXEL_ALIGMENT) == 0)
@ -1587,6 +1591,7 @@ public:
LastCharX = DrawX;
LastCharWidth = 0;
++LineCount;
return true;
};
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 GotNewLineLast = false;
while(pCurrent < pEnd && (pCursor->m_MaxLines < 1 || LineCount <= pCursor->m_MaxLines) && pCurrent != pEllipsis)
while(pCurrent < pEnd && pCurrent != pEllipsis)
{
bool NewLine = false;
const char *pBatchEnd = pEnd;
@ -1667,8 +1672,7 @@ public:
if((pCursor->m_Flags & TEXTFLAG_DISALLOW_NEWLINE) == 0)
{
pLastGlyph = nullptr;
StartNewLine();
if(pCursor->m_MaxLines > 0 && LineCount > pCursor->m_MaxLines)
if(!StartNewLine())
break;
continue;
}
@ -1859,7 +1863,8 @@ public:
if(NewLine)
{
StartNewLine();
if(!StartNewLine())
break;
GotNewLine = true;
GotNewLineLast = true;
}
@ -2139,9 +2144,9 @@ public:
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

View file

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

View file

@ -585,7 +585,7 @@ void CVideo::ReadRGBFromGL(size_t ThreadIndex)
{
uint32_t Width;
uint32_t Height;
uint32_t Format;
CImageInfo::EImageFormat Format;
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`].
///
/// 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)]
pub const gs_ConsoleDefaultColor: ColorRGBA = ColorRGBA {
r: 1.0,

View file

@ -15,6 +15,7 @@ public:
virtual void OnActivate() = 0;
virtual void OnWindowResize() = 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 Save(const char *pFilename) = 0;
virtual void UpdateMentions() = 0;

View file

@ -17,14 +17,14 @@ struct SLibPNGWarningItem
{
SLibPNGWarningItem *pUserStruct = (SLibPNGWarningItem *)png_get_error_ptr(png_ptr);
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);
}
static void LibPNGWarning(png_structp png_ptr, png_const_charp warning_msg)
{
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)
@ -80,7 +80,7 @@ static void LibPNGDeleteReadStruct(png_structp pPNGStruct, png_infop pPNGInfo)
{
if(pPNGInfo != nullptr)
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)
@ -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)
{
png_infop pPNGInfo = nullptr;
int ColorType;
png_byte BitDepth;
int ColorChannelCount;
int BytesInRow;
Height = 0;
png_bytepp pRowPointers = nullptr;
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.");
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(pRowPointers != nullptr)
@ -165,9 +161,9 @@ bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIn
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.");
return false;
}
@ -175,6 +171,7 @@ bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIn
if(!FileMatchesImageType(ByteLoader))
{
LibPNGDeleteReadStruct(pPNGStruct, pPNGInfo);
dbg_msg("png", "file does not match image type.");
return false;
}
@ -189,13 +186,14 @@ bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIn
if(ByteLoader.m_Err != 0)
{
LibPNGDeleteReadStruct(pPNGStruct, pPNGInfo);
dbg_msg("png", "byte loader error.");
return false;
}
Width = png_get_image_width(pPNGStruct, pPNGInfo);
Height = png_get_image_height(pPNGStruct, pPNGInfo);
ColorType = png_get_color_type(pPNGStruct, pPNGInfo);
BitDepth = png_get_bit_depth(pPNGStruct, pPNGInfo);
const int ColorType = png_get_color_type(pPNGStruct, pPNGInfo);
const png_byte BitDepth = png_get_bit_depth(pPNGStruct, pPNGInfo);
PngliteIncompatible = PngliteIncompatibility(pPNGStruct, pPNGInfo);
if(BitDepth == 16)
@ -227,8 +225,8 @@ bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIn
png_read_update_info(pPNGStruct, pPNGInfo);
ColorChannelCount = LibPNGGetColorChannelCount(ColorType);
BytesInRow = png_get_rowbytes(pPNGStruct, pPNGInfo);
const int ColorChannelCount = LibPNGGetColorChannelCount(ColorType);
const int BytesInRow = png_get_rowbytes(pPNGStruct, pPNGInfo);
if(BytesInRow == Width * ColorChannelCount)
{
@ -255,6 +253,7 @@ bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIn
if(ByteLoader.m_Err != 0)
{
LibPNGDeleteReadStruct(pPNGStruct, pPNGInfo);
dbg_msg("png", "byte loader error.");
return false;
}
@ -263,11 +262,12 @@ bool LoadPNG(SImageByteBuffer &ByteLoader, const char *pFileName, int &PngliteIn
else
{
LibPNGDeleteReadStruct(pPNGStruct, pPNGInfo);
dbg_msg("png", "bytes in row incorrect.");
return false;
}
png_destroy_info_struct(pPNGStruct, &pPNGInfo);
png_destroy_read_struct(&pPNGStruct, NULL, NULL);
png_destroy_read_struct(&pPNGStruct, nullptr, nullptr);
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)
{
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.");
return false;
@ -314,9 +314,9 @@ bool SavePNG(EImageFormat ImageFormat, const uint8_t *pRawBuffer, SImageByteBuff
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.");
return false;
}
@ -361,7 +361,7 @@ bool SavePNG(EImageFormat ImageFormat, const uint8_t *pRawBuffer, SImageByteBuff
delete[](pRowPointers);
png_destroy_info_struct(pPNGStruct, &pPNGInfo);
png_destroy_write_struct(&pPNGStruct, NULL);
png_destroy_write_struct(&pPNGStruct, nullptr);
return true;
}

View file

@ -66,29 +66,54 @@ struct SGraphicTileTexureCoords
class CImageInfo
{
public:
enum
enum EImageFormat
{
FORMAT_AUTO = -1,
FORMAT_ERROR = -1,
FORMAT_RGB = 0,
FORMAT_RGBA = 1,
FORMAT_SINGLE_COMPONENT = 2,
};
/* Variable: width
Contains the width of the image */
int m_Width;
/**
* Contains the width of the image
*/
int m_Width = 0;
/* Variable: height
Contains the height of the image */
int m_Height;
/**
* Contains the height of the image
*/
int m_Height = 0;
/* Variable: format
Contains the format of the image. See <Image Formats> for more information. */
int m_Format;
/**
* Contains the format of the image.
*
* @see EImageFormat
*/
EImageFormat m_Format = FORMAT_ERROR;
/* Variable: data
Pointer to the image data. */
void *m_pData;
/**
* Pointer to the image data.
*/
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)
}
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
{
@ -307,15 +332,15 @@ public:
virtual bool IsImageFormatRGBA(const char *pFileName, CImageInfo &Img) = 0;
// 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
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 CTextureHandle LoadTextureRaw(size_t Width, size_t Height, int Format, const void *pData, int StoreFormat, 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 CTextureHandle LoadTexture(const char *pFilename, int StorageType, int StoreFormat, int Flags) = 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, CImageInfo::EImageFormat Format, const void *pData) = 0;
virtual CTextureHandle LoadTexture(const char *pFilename, int StorageType, int Flags = 0) = 0;
virtual CTextureHandle InvalidTexture() const = 0;
virtual void TextureSet(CTextureHandle Texture) = 0;
void TextureClear() { TextureSet(CTextureHandle()); }

View file

@ -277,10 +277,14 @@ class IGameServer : public IInterface
MACRO_INTERFACE("gameserver", 0)
protected:
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 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 OnPreSnap() = 0;
@ -315,6 +319,7 @@ public:
virtual bool IsClientReady(int ClientID) const = 0;
virtual bool IsClientPlayer(int ClientID) const = 0;
virtual int PersistentDataSize() const = 0;
virtual int PersistentClientDataSize() const = 0;
virtual CUuid GameUuid() const = 0;

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