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

@ -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
@ -1750,3 +1736,23 @@ Loading sound files
Moved ingame
== 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