diff --git a/.gitignore b/.gitignore index c71c960..e591cbb 100755 --- a/.gitignore +++ b/.gitignore @@ -400,3 +400,4 @@ jumpingbird.* jumpingbird.data build build-emcmake +thirdparty1 diff --git a/BoneAnimatedModel.h b/BoneAnimatedModel.h index e643d2a..b59a9e9 100644 --- a/BoneAnimatedModel.h +++ b/BoneAnimatedModel.h @@ -1,5 +1,5 @@ #pragma once -#include "Math.h" +#include "ZLMath.h" #include "Renderer.h" #include diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..0388759 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,532 @@ +cmake_minimum_required(VERSION 3.16) + +project(space-game001 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +set(BUILD_CONFIGS Debug Release) + +# ============================== +# Папка для всех сторонних либ +# ============================== +set(THIRDPARTY_DIR "${CMAKE_SOURCE_DIR}/thirdparty1") +file(MAKE_DIRECTORY "${THIRDPARTY_DIR}") + +macro(log msg) + message(STATUS "${msg}") +endmacro() + +# =========================================== +# 1) ZLIB (zlib131.zip → zlib-1.3.1) - без изменений +# =========================================== +set(ZLIB_ARCHIVE "${THIRDPARTY_DIR}/zlib131.zip") +set(ZLIB_SRC_DIR "${THIRDPARTY_DIR}/zlib-1.3.1") +set(ZLIB_BUILD_DIR "${ZLIB_SRC_DIR}/build") +set(ZLIB_INSTALL_DIR "${ZLIB_SRC_DIR}/install") + +if(NOT EXISTS "${ZLIB_ARCHIVE}") + log("Downloading zlib131.zip ...") + file(DOWNLOAD + "https://www.zlib.net/zlib131.zip" + "${ZLIB_ARCHIVE}" + SHOW_PROGRESS + ) +endif() + +if(NOT EXISTS "${ZLIB_SRC_DIR}/CMakeLists.txt") + log("Extracting zlib131.zip to zlib-1.3.1 ...") + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar xvf "${ZLIB_ARCHIVE}" + WORKING_DIRECTORY "${THIRDPARTY_DIR}" + RESULT_VARIABLE _zlib_extract_res + ) + if(NOT _zlib_extract_res EQUAL 0) + message(FATAL_ERROR "Failed to extract zlib archive") + endif() +endif() + +file(MAKE_DIRECTORY "${ZLIB_BUILD_DIR}") + +# проверяем, собран ли уже zlib +set(_have_zlib FALSE) +foreach(candidate + "${ZLIB_INSTALL_DIR}/lib/zlibstatic.lib" +) + if(EXISTS "${candidate}") + set(_have_zlib TRUE) + break() + endif() +endforeach() + + +if(NOT _have_zlib) + log("Configuring zlib ...") + execute_process( + COMMAND ${CMAKE_COMMAND} + -G "${CMAKE_GENERATOR}" + -S "${ZLIB_SRC_DIR}" + -B "${ZLIB_BUILD_DIR}" + -DCMAKE_INSTALL_PREFIX=${ZLIB_INSTALL_DIR} + RESULT_VARIABLE _zlib_cfg_res + ) + if(NOT _zlib_cfg_res EQUAL 0) + message(FATAL_ERROR "zlib configure failed") + endif() + + foreach(cfg IN LISTS BUILD_CONFIGS) + log("Building ZLIB (${cfg}) ...") + execute_process( + COMMAND ${CMAKE_COMMAND} + --build "${ZLIB_BUILD_DIR}" --config ${cfg} + RESULT_VARIABLE _zlib_build_res + ) + if(NOT _zlib_build_res EQUAL 0) + message(FATAL_ERROR "ZLIB build failed for configuration ${cfg}") + endif() + + log("Installing ZLIB (${cfg}) ...") + execute_process( + COMMAND ${CMAKE_COMMAND} + --install "${ZLIB_BUILD_DIR}" --config ${cfg} + RESULT_VARIABLE _zlib_inst_res + ) + if(NOT _zlib_inst_res EQUAL 0) + message(FATAL_ERROR "ZLIB install failed for configuration ${cfg}") + endif() + endforeach() +endif() + +# ИСПРАВЛЕНИЕ: Используем свойства для конкретных конфигураций +add_library(zlib_external_lib UNKNOWN IMPORTED GLOBAL) +set_target_properties(zlib_external_lib PROPERTIES + # Динамическая линковка (если zlib.lib - это импорт-библиотека для zlibd.dll) + #IMPORTED_LOCATION_DEBUG "${ZLIB_INSTALL_DIR}/lib/zlibd.lib" + #IMPORTED_LOCATION_RELEASE "${ZLIB_INSTALL_DIR}/lib/zlib.lib" + + # Можно также указать статические библиотеки, если вы хотите их использовать + IMPORTED_LOCATION_DEBUG "${ZLIB_INSTALL_DIR}/lib/zlibstaticd.lib" + IMPORTED_LOCATION_RELEASE "${ZLIB_INSTALL_DIR}/lib/zlibstatic.lib" + + INTERFACE_INCLUDE_DIRECTORIES "${ZLIB_INSTALL_DIR}/include" +) + +# =========================================== +# 2) SDL2 (release-2.32.10.zip → SDL-release-2.32.10) - без изменений +# =========================================== +set(SDL2_ARCHIVE "${THIRDPARTY_DIR}/release-2.32.10.zip") +set(SDL2_SRC_DIR "${THIRDPARTY_DIR}/SDL-release-2.32.10") +set(SDL2_BUILD_DIR "${SDL2_SRC_DIR}/build") +set(SDL2_INSTALL_DIR "${SDL2_SRC_DIR}/install") + +if(NOT EXISTS "${SDL2_ARCHIVE}") + log("Downloading SDL2 release-2.32.10.zip ...") + file(DOWNLOAD + "https://github.com/libsdl-org/SDL/archive/refs/tags/release-2.32.10.zip" + "${SDL2_ARCHIVE}" + SHOW_PROGRESS + ) +endif() + +if(NOT EXISTS "${SDL2_SRC_DIR}/CMakeLists.txt") + log("Extracting SDL2 archive to SDL-release-2.32.10 ...") + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar xvf "${SDL2_ARCHIVE}" + WORKING_DIRECTORY "${THIRDPARTY_DIR}" + RESULT_VARIABLE _sdl_extract_res + ) + if(NOT _sdl_extract_res EQUAL 0) + message(FATAL_ERROR "Failed to extract SDL2 archive") + endif() +endif() + +file(MAKE_DIRECTORY "${SDL2_BUILD_DIR}") + +set(_have_sdl2 FALSE) +foreach(candidate + "${SDL2_INSTALL_DIR}/lib/SDL2.lib" + "${SDL2_INSTALL_DIR}/lib/SDL2-static.lib" + "${SDL2_INSTALL_DIR}/lib/SDL2d.lib" +) + if(EXISTS "${candidate}") + set(_have_sdl2 TRUE) + break() + endif() +endforeach() + +if(NOT _have_sdl2) + log("Configuring SDL2 ...") + execute_process( + COMMAND ${CMAKE_COMMAND} + -G "${CMAKE_GENERATOR}" + -S "${SDL2_SRC_DIR}" + -B "${SDL2_BUILD_DIR}" + -DCMAKE_INSTALL_PREFIX=${SDL2_INSTALL_DIR} + -DCMAKE_PREFIX_PATH=${ZLIB_INSTALL_DIR} # путь к zlib для SDL2 + RESULT_VARIABLE _sdl_cfg_res + ) + if(NOT _sdl_cfg_res EQUAL 0) + message(FATAL_ERROR "SDL2 configure failed") + endif() + + # --- ИЗМЕНЕНИЕ: Цикл по конфигурациям Debug и Release --- + foreach(cfg IN LISTS BUILD_CONFIGS) + log("Building SDL2 (${cfg}) ...") + execute_process( + COMMAND ${CMAKE_COMMAND} + --build "${SDL2_BUILD_DIR}" --config ${cfg} + RESULT_VARIABLE _sdl_build_res + ) + if(NOT _sdl_build_res EQUAL 0) + message(FATAL_ERROR "SDL2 build failed for configuration ${cfg}") + endif() + + log("Installing SDL2 (${cfg}) ...") + execute_process( + COMMAND ${CMAKE_COMMAND} + --install "${SDL2_BUILD_DIR}" --config ${cfg} + RESULT_VARIABLE _sdl_inst_res + ) + if(NOT _sdl_inst_res EQUAL 0) + message(FATAL_ERROR "SDL2 install failed for configuration ${cfg}") + endif() + endforeach() + # ------------------------------------------------------ +endif() + + +# ИСПРАВЛЕНИЕ: SDL2: Используем свойства для конкретных конфигураций +add_library(SDL2_external_lib UNKNOWN IMPORTED GLOBAL) +set_target_properties(SDL2_external_lib PROPERTIES + # Динамическая линковка SDL2 + IMPORTED_LOCATION_DEBUG "${SDL2_INSTALL_DIR}/lib/SDL2d.lib" + IMPORTED_LOCATION_RELEASE "${SDL2_INSTALL_DIR}/lib/SDL2.lib" + # Оба include-пути: и include, и include/SDL2 + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INSTALL_DIR}/include;${SDL2_INSTALL_DIR}/include/SDL2" +) + +# SDL2main (обычно статическая) +add_library(SDL2main_external_lib UNKNOWN IMPORTED GLOBAL) +set_target_properties(SDL2main_external_lib PROPERTIES + # ИСПРАВЛЕНО: Указываем пути для Debug и Release, используя + # соглашение, что Debug имеет суффикс 'd', а Release — нет. + IMPORTED_LOCATION_DEBUG "${SDL2_INSTALL_DIR}/lib/SDL2maind.lib" + IMPORTED_LOCATION_RELEASE "${SDL2_INSTALL_DIR}/lib/SDL2main.lib" + INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INSTALL_DIR}/include" +) + +log("-----${SDL2_INSTALL_DIR}/lib/SDL2maind.lib") + +# =========================================== +# 3) libpng (v1.6.51.zip → libpng-1.6.51) - без изменений +# =========================================== +set(LIBPNG_ARCHIVE "${THIRDPARTY_DIR}/v1.6.51.zip") +set(LIBPNG_SRC_DIR "${THIRDPARTY_DIR}/libpng-1.6.51") +set(LIBPNG_BUILD_DIR "${LIBPNG_SRC_DIR}/build") +set(LIBPNG_INSTALL_DIR "${LIBPNG_SRC_DIR}/install") # на будущее + +if(NOT EXISTS "${LIBPNG_ARCHIVE}") + log("Downloading libpng v1.6.51.zip ...") + file(DOWNLOAD + "https://github.com/pnggroup/libpng/archive/refs/tags/v1.6.51.zip" + "${LIBPNG_ARCHIVE}" + SHOW_PROGRESS + ) +endif() + +if(NOT EXISTS "${LIBPNG_SRC_DIR}/CMakeLists.txt") + log("Extracting libpng v1.6.51.zip to libpng-1.6.51 ...") + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar xvf "${LIBPNG_ARCHIVE}" + WORKING_DIRECTORY "${THIRDPARTY_DIR}" + RESULT_VARIABLE _png_extract_res + ) + if(NOT _png_extract_res EQUAL 0) + message(FATAL_ERROR "Failed to extract libpng archive") + endif() +endif() + +file(MAKE_DIRECTORY "${LIBPNG_BUILD_DIR}") + +# Проверяем, есть ли уже .lib (build/Debug или install/lib) +set(_libpng_candidates + "${LIBPNG_BUILD_DIR}/Debug/libpng16_staticd.lib" + "${LIBPNG_BUILD_DIR}/Release/libpng16_static.lib" +) + +set(_have_png FALSE) +foreach(candidate IN LISTS _libpng_candidates) + if(EXISTS "${candidate}") + set(_have_png TRUE) + break() + endif() +endforeach() + +if(NOT _have_png) + log("Configuring libpng ...") + execute_process( + COMMAND ${CMAKE_COMMAND} + -G "${CMAKE_GENERATOR}" + -S "${LIBPNG_SRC_DIR}" + -B "${LIBPNG_BUILD_DIR}" + -DCMAKE_INSTALL_PREFIX=${LIBPNG_INSTALL_DIR} + -DCMAKE_PREFIX_PATH=${ZLIB_INSTALL_DIR} + -DZLIB_ROOT=${ZLIB_INSTALL_DIR} + RESULT_VARIABLE _png_cfg_res + ) + if(NOT _png_cfg_res EQUAL 0) + message(FATAL_ERROR "libpng configure failed") + endif() + + # --- ИЗМЕНЕНИЕ: Цикл по конфигурациям Debug и Release --- + foreach(cfg IN LISTS BUILD_CONFIGS) + log("Building libpng (${cfg}) ...") + execute_process( + COMMAND ${CMAKE_COMMAND} + --build "${LIBPNG_BUILD_DIR}" --config ${cfg} + RESULT_VARIABLE _png_build_res + ) + if(NOT _png_build_res EQUAL 0) + message(FATAL_ERROR "libpng build failed for configuration ${cfg}") + endif() + + # Поскольку вы не используете "cmake --install" для libpng, + # здесь нет необходимости в дополнительном шаге установки. + # Файлы .lib будут сгенерированы в подкаталоге ${LIBPNG_BUILD_DIR}/${cfg} (например, build/Debug или build/Release). + + endforeach() + # ------------------------------------------------------ +endif() + +add_library(libpng_external_lib UNKNOWN IMPORTED GLOBAL) +set_target_properties(libpng_external_lib PROPERTIES + # Предполагая, что libpng использует статический вариант + IMPORTED_LOCATION_DEBUG "${LIBPNG_BUILD_DIR}/Debug/libpng16_staticd.lib" + IMPORTED_LOCATION_RELEASE "${LIBPNG_BUILD_DIR}/Release/libpng16_static.lib" + + # png.h, pngconf.h – в SRC, pnglibconf.h – в BUILD + INTERFACE_INCLUDE_DIRECTORIES "${LIBPNG_SRC_DIR};${LIBPNG_BUILD_DIR}" +) + +# =========================================== +# 4) libzip (v1.11.4.zip → libzip-1.11.4) - НОВАЯ ЗАВИСИМОСТЬ +# =========================================== +set(LIBZIP_ARCHIVE "${THIRDPARTY_DIR}/v1.11.4.zip") +set(LIBZIP_SRC_DIR "${THIRDPARTY_DIR}/libzip-1.11.4") +set(LIBZIP_BUILD_DIR "${LIBZIP_SRC_DIR}/build") +#set(LIBZIP_INSTALL_DIR "${LIBZIP_SRC_DIR}/install") +set(LIBZIP_BASE_DIR "${LIBZIP_SRC_DIR}/install") + +if(NOT EXISTS "${LIBZIP_ARCHIVE}") + log("Downloading libzip v1.11.4.zip ...") + file(DOWNLOAD + "https://github.com/nih-at/libzip/archive/refs/tags/v1.11.4.zip" + "${LIBZIP_ARCHIVE}" + SHOW_PROGRESS + ) +endif() + +if(NOT EXISTS "${LIBZIP_SRC_DIR}/CMakeLists.txt") + log("Extracting libzip v1.11.4.zip to libzip-1.11.4 ...") + execute_process( + COMMAND ${CMAKE_COMMAND} -E tar xvf "${LIBZIP_ARCHIVE}" + WORKING_DIRECTORY "${THIRDPARTY_DIR}" + RESULT_VARIABLE _zip_extract_res + ) + if(NOT _zip_extract_res EQUAL 0) + message(FATAL_ERROR "Failed to extract libzip archive") + endif() +endif() + +file(MAKE_DIRECTORY "${LIBZIP_BUILD_DIR}") + +# Проверяем, собран ли уже libzip +set(_have_zip FALSE) +foreach(candidate + "${LIBZIP_BASE_DIR}-Debug/lib/zip.lib" + "${LIBZIP_BASE_DIR}-Release/lib/zip.lib" +) + if(EXISTS "${candidate}") + set(_have_zip TRUE) + break() + endif() +endforeach() + + +if(NOT _have_zip) + foreach(cfg IN LISTS BUILD_CONFIGS) + log("Configuring libzip (${cfg})...") + execute_process( + COMMAND ${CMAKE_COMMAND} + -G "${CMAKE_GENERATOR}" + -S "${LIBZIP_SRC_DIR}" + -B "${LIBZIP_SRC_DIR}/build-${cfg}" + -DCMAKE_INSTALL_PREFIX=${LIBZIP_BASE_DIR}-${cfg} + -DCMAKE_PREFIX_PATH=${ZLIB_INSTALL_DIR} + -DZLIB_ROOT=${ZLIB_INSTALL_DIR} + -DENABLE_COMMONCRYPTO=OFF + -DENABLE_GNUTLS=OFF + -DENABLE_MBEDTLS=OFF + -DENABLE_OPENSSL=OFF + -DENABLE_WINDOWS_CRYPTO=OFF + -DENABLE_FUZZ=OFF + RESULT_VARIABLE _zip_cfg_res + ) + if(NOT _zip_cfg_res EQUAL 0) + message(FATAL_ERROR "libzip configure failed") + endif() + log("Building libzip (${cfg}) ...") + + + execute_process( + COMMAND ${CMAKE_COMMAND} --build "${LIBZIP_SRC_DIR}/build-${cfg}" --config ${cfg} -v + RESULT_VARIABLE _zip_build_res + ) + if(NOT _zip_build_res EQUAL 0) + message(FATAL_ERROR "libzip build failed for configuration ${cfg}") + endif() + + log("Installing libzip (${cfg}) ...") + + execute_process( + COMMAND ${CMAKE_COMMAND} --install "${LIBZIP_SRC_DIR}/build-${cfg}" --config ${cfg} -v + RESULT_VARIABLE _zip_inst_res + ) + if(NOT _zip_inst_res EQUAL 0) + message(FATAL_ERROR "libzip install failed for configuration ${cfg}") + endif() + endforeach() +endif() + + +add_library(libzip_external_lib UNKNOWN IMPORTED GLOBAL) +set_target_properties(libzip_external_lib PROPERTIES + IMPORTED_LOCATION_DEBUG "${LIBZIP_BASE_DIR}-Debug/lib/zip.lib" # ИСПРАВЛЕНО + IMPORTED_LOCATION_RELEASE "${LIBZIP_BASE_DIR}-Release/lib/zip.lib" # ИСПРАВЛЕНО + + INTERFACE_INCLUDE_DIRECTORIES "$,${LIBZIP_BASE_DIR}-Debug/include,${LIBZIP_BASE_DIR}-Release/include>" + # libzip требует zlib для линковки + INTERFACE_LINK_LIBRARIES zlib_external_lib +) + +# =========================================== +# Основной проект space-game001 +# =========================================== +add_executable(space-game001 + main.cpp + Game.cpp + Game.h + Environment.cpp + Environment.h + Renderer.cpp + Renderer.h + ShaderManager.cpp + ShaderManager.h + TextureManager.cpp + TextureManager.h + TextModel.cpp + TextModel.h + AudioPlayerAsync.cpp + AudioPlayerAsync.h + BoneAnimatedModel.cpp + BoneAnimatedModel.h + ZLMath.cpp + ZLMath.h + OpenGlExtensions.cpp + OpenGlExtensions.h + Utils.cpp + Utils.h +) + +# Установка проекта по умолчанию для Visual Studio +set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT space-game001) + +# include-пути проекта +target_include_directories(space-game001 PRIVATE + "${CMAKE_CURRENT_SOURCE_DIR}" + #"${CMAKE_CURRENT_SOURCE_DIR}/gl" + #"${CMAKE_CURRENT_SOURCE_DIR}/cmakeaudioplayer/include" + #"${SDL2_INSTALL_DIR}/include" + #"${SDL2_INSTALL_DIR}/include/SDL2" + #"${LIBZIP_INSTALL_DIR}-Release/include" # Добавил include-путь для libzip +) + +set_target_properties(space-game001 PROPERTIES + OUTPUT_NAME "space-game001" +) + +# Определения препроцессора: +# PNG_ENABLED – включает код PNG в TextureManager +# SDL_MAIN_HANDLED – отключает переопределение main -> SDL_main +target_compile_definitions(space-game001 PRIVATE + PNG_ENABLED + SDL_MAIN_HANDLED +) + +# Линкуем с SDL2main, если он вообще установлен +target_link_libraries(space-game001 PRIVATE SDL2main_external_lib) + +# Линкуем сторонние библиотеки +target_link_libraries(space-game001 PRIVATE + SDL2_external_lib + libpng_external_lib + zlib_external_lib + libzip_external_lib +) + +# Линкуем OpenGL (Windows) +if(WIN32) + target_link_libraries(space-game001 PRIVATE opengl32) +endif() + +# =========================================== +# Копирование SDL2d.dll и zlibd.dll рядом с exe +# =========================================== +if (WIN32) + + # SDL2: в Debug - SDL2d.dll, в Release - SDL2.dll + set(SDL2_DLL_SRC "$,${SDL2_INSTALL_DIR}/bin/SDL2d.dll,${SDL2_INSTALL_DIR}/bin/SDL2.dll>") + set(SDL2_DLL_DST "$,$/SDL2d.dll,$/SDL2.dll>") + + + set(LIBZIP_DLL_SRC "$,${LIBZIP_BASE_DIR}-Debug/bin/zip.dll,${LIBZIP_BASE_DIR}-Release/bin/zip.dll>") + + add_custom_command(TARGET space-game001 POST_BUILD + COMMAND ${CMAKE_COMMAND} -E echo "Copying DLLs to output folder..." + + # Копируем SDL2 (целевое имя всегда SDL2.dll) + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${SDL2_DLL_SRC}" + "${SDL2_DLL_DST}" + + # Копируем LIBZIP (целевое имя всегда zip.dll) + COMMAND ${CMAKE_COMMAND} -E copy_if_different + "${LIBZIP_DLL_SRC}" + "$/zip.dll" + ) +endif() + +# =========================================== +# Копирование ресурсов после сборки +# =========================================== + +# Какие папки с ресурсами нужно копировать +set(RUNTIME_RESOURCE_DIRS + "resources" + "shaders" +) + +# Копируем ресурсы и шейдеры в папку exe и в корень build/ +foreach(resdir IN LISTS RUNTIME_RESOURCE_DIRS) + add_custom_command(TARGET space-game001 POST_BUILD + COMMAND ${CMAKE_COMMAND} -E echo "Copying ${resdir} to runtime folders..." + # 1) туда, где лежит exe (build/Debug, build/Release и т.п.) + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${CMAKE_SOURCE_DIR}/${resdir}" + "$/${resdir}" + # 2) в корень build, если захочешь запускать из этой папки + COMMAND ${CMAKE_COMMAND} -E copy_directory + "${CMAKE_SOURCE_DIR}/${resdir}" + "${CMAKE_BINARY_DIR}/${resdir}" + ) +endforeach() \ No newline at end of file diff --git a/Environment.h b/Environment.h index 32ae87c..96487ce 100644 --- a/Environment.h +++ b/Environment.h @@ -1,5 +1,5 @@ #pragma once -#include "Math.h" +#include "ZLMath.h" #ifdef __linux__ #include #endif diff --git a/Game.cpp b/Game.cpp index 666dc00..d19757a 100755 --- a/Game.cpp +++ b/Game.cpp @@ -17,6 +17,23 @@ namespace ZL const char* CONST_ZIP_FILE = ""; #endif + Vector4f generateRandomQuaternion(std::mt19937& gen) + { + // + std::normal_distribution<> distrib(0.0, 1.0); + + // N(0, 1). + // 4D- (.. ). + Vector4f randomQuat = { + (float)distrib(gen), + (float)distrib(gen), + (float)distrib(gen), + (float)distrib(gen) + }; + + return randomQuat.normalized(); + } + // --- --- std::vector generateRandomBoxCoords(int N) @@ -76,8 +93,14 @@ namespace ZL if (accepted) { - // , - boxCoordsArr.emplace_back(BoxCoords{ newPos, Matrix3f::Identity() }); + // 2. + Vector4f randomQuat = generateRandomQuaternion(gen); + + // 3. + Matrix3f randomMatrix = QuatToMatrix(randomQuat); + + // 4. + boxCoordsArr.emplace_back(BoxCoords{ newPos, randomMatrix }); generatedCount++; } attempts++; @@ -267,6 +290,7 @@ void Game::drawBoxes() renderer.RotateMatrix(Environment::inverseShipMatrix); renderer.TranslateMatrix(-Environment::shipPosition); renderer.TranslateMatrix(boxCoordsArr[i].pos); + renderer.RotateMatrix(boxCoordsArr[i].m); glBindTexture(GL_TEXTURE_2D, boxTexture->getTexID()); renderer.DrawVertexRenderStruct(boxRenderArr[i]); diff --git a/Readme.md b/Readme.md index a4b3b98..34ca53d 100644 --- a/Readme.md +++ b/Readme.md @@ -1,3 +1,83 @@ +# Windows + +download from https://cmake.org/download/ + +Windows x64 Installer: cmake-4.2.0-windows-x86_64.msi + + +download from https://github.com/libsdl-org/SDL/releases/tag/release-2.32.10 + +SDL2-2.32.10-win32-x64.zip + +SDL2-2.32.10: + +``` +cd C:\..\SDL-realese-2.32.10 +mkdir build +cd build +cmake -G "Visual Studio 18 2026" -DCMAKE_INSTALL_PREFIX=install .. +cmake --build . --config Debug +cmake --install . --config Debug +``` + +download from https://www.zlib.net/ + +zlib source code, version 1.3.1, zipfile format (1616K, SHA-256 hash 72af66d44fcc14c22013b46b814d5d2514673dda3d115e64b690c1ad636e7b17): + US (zlib.net) + +zlib-1.3.1: + +``` +cd C:\..\zlib-1.3.1 +mkdir build +cd build +cmake -G "Visual Studio 18 2026" -DCMAKE_INSTALL_PREFIX=install .. +cmake --build . --config Debug +cmake --install . --config Debug +``` + +download from https://github.com/pnggroup/libpng/releases/tag/v1.6.51 + +Source code (zip) + +libpng-1.6.51: + +``` +cd C:\..\libpng-1.6.51 +mkdir build +cd build +``` + +To build libpng, you need to specify the path to the zlib installation directory as follows: + +``` +cmake -DCMAKE_PREFIX_PATH="../zlib-1.3.1/build/install" -DCMAKE_INSTALL_PREFIX=install -G "Visual Studio 18 2026" .. +cmake --build . --config Debug +cmake --install . --config Debug +``` + +Настройка проекта в Visual Studio: + +Перейдите в Project Properties (правый клик на проект, "Properties"). + +C/C++ - ОБЩИЕ; Дополнительные каталоги включаемых файлов, проверить чтобы был добавлен путь к папке include:(пример) + +..\SDL-release-2.32.10\include;..\libpng-1.6.51\build\install\include;C:\Work\OpenAL 1.1 SDK\include;..\Projects\libogg\include;..\vorbis\include + + +Компоновщик - ОБЩИЕ; Доподнительные каталоги библиотек (пример) + +..\SDL-release-2.32.10\build\install\lib;..\libpng-1.6.51\build\install\lib;..\zlib-1.3.1\build\install\lib + +Компоновщик - ВВОД; Дополнительные зависимости, добавить zlibstaticd.lib (пример) + +zlibstaticd.lib;libpng16_staticd.lib;SDL2d.lib;SDL2maind.lib;opengl32.lib;glu32.lib;shell32.lib;opengl32.lib;glu32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib + + +в папку ..\projectGAME01\x64\Debug добавить файл SDL2d.dll +который можно скопировать из папки ..\SDL-release-2.32.10\build\Debug + + # Script to run: ``` diff --git a/Renderer.h b/Renderer.h index 215b970..f3d0e54 100755 --- a/Renderer.h +++ b/Renderer.h @@ -1,7 +1,7 @@ #pragma once #include "OpenGlExtensions.h" -#include "Math.h" +#include "ZLMath.h" #include #include #include "ShaderManager.h" diff --git a/TextModel.h b/TextModel.h index df2a491..8273b03 100644 --- a/TextModel.h +++ b/TextModel.h @@ -1,6 +1,6 @@ #pragma once -#include "Math.h" +#include "ZLMath.h" #include "Renderer.h" #include diff --git a/Math.cpp b/ZLMath.cpp old mode 100755 new mode 100644 similarity index 96% rename from Math.cpp rename to ZLMath.cpp index ca7662e..a05843e --- a/Math.cpp +++ b/ZLMath.cpp @@ -1,757 +1,757 @@ -#include "Math.h" - -#include -#include - -namespace ZL { - - Vector2f operator+(const Vector2f& x, const Vector2f& y) - { - Vector2f result; - - result.v[0] = x.v[0] + y.v[0]; - result.v[1] = x.v[1] + y.v[1]; - - return result; - } - - Vector2f operator-(const Vector2f& x, const Vector2f& y) - { - Vector2f result; - - result.v[0] = x.v[0] - y.v[0]; - result.v[1] = x.v[1] - y.v[1]; - - return result; - } - - Vector3f operator+(const Vector3f& x, const Vector3f& y) - { - Vector3f result; - - result.v[0] = x.v[0] + y.v[0]; - result.v[1] = x.v[1] + y.v[1]; - result.v[2] = x.v[2] + y.v[2]; - return result; - } - - Vector3f operator-(const Vector3f& x, const Vector3f& y) - { - Vector3f result; - - result.v[0] = x.v[0] - y.v[0]; - result.v[1] = x.v[1] - y.v[1]; - result.v[2] = x.v[2] - y.v[2]; - return result; - } - - Vector3f operator-(const Vector3f& x) - { - Vector3f result; - - result.v[0] = -x.v[0]; - result.v[1] = -x.v[1]; - result.v[2] = -x.v[2]; - return result; - } - - Vector4f operator+(const Vector4f& x, const Vector4f& y) - { - Vector4f result; - - result.v[0] = x.v[0] + y.v[0]; - result.v[1] = x.v[1] + y.v[1]; - result.v[2] = x.v[2] + y.v[2]; - result.v[3] = x.v[3] + y.v[3]; - return result; - } - - Vector4f operator-(const Vector4f& x, const Vector4f& y) - { - Vector4f result; - - result.v[0] = x.v[0] - y.v[0]; - result.v[1] = x.v[1] - y.v[1]; - result.v[2] = x.v[2] - y.v[2]; - result.v[3] = x.v[3] - y.v[3]; - return result; - } - - - - Matrix3f Matrix3f::Identity() - { - Matrix3f r; - - r.m[0] = 1.f; - r.m[1] = 0.f; - r.m[2] = 0.f; - - r.m[3] = 0.f; - r.m[4] = 1.f; - r.m[5] = 0.f; - - r.m[6] = 0.f; - r.m[7] = 0.f; - r.m[8] = 1.f; - - return r; - - } - - Matrix4f Matrix4f::Identity() - { - Matrix4f r; - - r.m[0] = 1.f; - r.m[1] = 0.f; - r.m[2] = 0.f; - r.m[3] = 0.f; - - r.m[4] = 0.f; - r.m[5] = 1.f; - r.m[6] = 0.f; - r.m[7] = 0.f; - - r.m[8] = 0.f; - r.m[9] = 0.f; - r.m[10] = 1.f; - r.m[11] = 0.f; - - r.m[12] = 0.f; - r.m[13] = 0.f; - r.m[14] = 0.f; - r.m[15] = 1.f; - - return r; - - } - - Matrix4f operator*(const Matrix4f& m1, const Matrix4f& m2) - { - Matrix4f r; - - r.m[0] = m1.m[0] * m2.m[0] + m1.m[4] * m2.m[1] + m1.m[8] * m2.m[2] + m1.m[12] * m2.m[3]; - r.m[1] = m1.m[1] * m2.m[0] + m1.m[5] * m2.m[1] + m1.m[9] * m2.m[2] + m1.m[13] * m2.m[3]; - r.m[2] = m1.m[2] * m2.m[0] + m1.m[6] * m2.m[1] + m1.m[10] * m2.m[2] + m1.m[14] * m2.m[3]; - r.m[3] = m1.m[3] * m2.m[0] + m1.m[7] * m2.m[1] + m1.m[11] * m2.m[2] + m1.m[15] * m2.m[3]; - - r.m[4] = m1.m[0] * m2.m[4] + m1.m[4] * m2.m[5] + m1.m[8] * m2.m[6] + m1.m[12] * m2.m[7]; - r.m[5] = m1.m[1] * m2.m[4] + m1.m[5] * m2.m[5] + m1.m[9] * m2.m[6] + m1.m[13] * m2.m[7]; - r.m[6] = m1.m[2] * m2.m[4] + m1.m[6] * m2.m[5] + m1.m[10] * m2.m[6] + m1.m[14] * m2.m[7]; - r.m[7] = m1.m[3] * m2.m[4] + m1.m[7] * m2.m[5] + m1.m[11] * m2.m[6] + m1.m[15] * m2.m[7]; - - - r.m[8] = m1.m[0] * m2.m[8] + m1.m[4] * m2.m[9] + m1.m[8] * m2.m[10] + m1.m[12] * m2.m[11]; - r.m[9] = m1.m[1] * m2.m[8] + m1.m[5] * m2.m[9] + m1.m[9] * m2.m[10] + m1.m[13] * m2.m[11]; - r.m[10] = m1.m[2] * m2.m[8] + m1.m[6] * m2.m[9] + m1.m[10] * m2.m[10] + m1.m[14] * m2.m[11]; - r.m[11] = m1.m[3] * m2.m[8] + m1.m[7] * m2.m[9] + m1.m[11] * m2.m[10] + m1.m[15] * m2.m[11]; - - r.m[12] = m1.m[0] * m2.m[12] + m1.m[4] * m2.m[13] + m1.m[8] * m2.m[14] + m1.m[12] * m2.m[15]; - r.m[13] = m1.m[1] * m2.m[12] + m1.m[5] * m2.m[13] + m1.m[9] * m2.m[14] + m1.m[13] * m2.m[15]; - r.m[14] = m1.m[2] * m2.m[12] + m1.m[6] * m2.m[13] + m1.m[10] * m2.m[14] + m1.m[14] * m2.m[15]; - r.m[15] = m1.m[3] * m2.m[12] + m1.m[7] * m2.m[13] + m1.m[11] * m2.m[14] + m1.m[15] * m2.m[15]; - - return r; - } - - Matrix4f MakeOrthoMatrix(float width, float height, float zNear, float zFar) - { - float depthRange = zFar - zNear; - - if (depthRange <= 0) - { - throw std::runtime_error("zFar must be greater than zNear"); - } - - Matrix4f r; - - r.m[0] = 2.f / width; - r.m[1] = 0; - r.m[2] = 0; - r.m[3] = 0; - - r.m[4] = 0; - r.m[5] = 2.f / height; - r.m[6] = 0; - r.m[7] = 0; - - r.m[8] = 0; - r.m[9] = 0; - r.m[10] = -1 / depthRange; - r.m[11] = 0; - - r.m[12] = -1; - r.m[13] = -1; - r.m[14] = zNear / depthRange; - r.m[15] = 1; - - return r; - } - - Matrix4f MakePerspectiveMatrix(float fovY, float aspectRatio, float zNear, float zFar) - { - float tanHalfFovy = tan(fovY / 2.f); - Matrix4f r; - - if (zNear >= zFar || aspectRatio == 0) - { - throw std::runtime_error("Invalid perspective parameters"); - } - - r.m[0] = 1.f / (aspectRatio * tanHalfFovy); - r.m[1] = 0; - r.m[2] = 0; - r.m[3] = 0; - - r.m[4] = 0; - r.m[5] = 1.f / (tanHalfFovy); - r.m[6] = 0; - r.m[7] = 0; - - r.m[8] = 0; - r.m[9] = 0; - r.m[10] = -(zFar + zNear) / (zFar - zNear); - r.m[11] = -1; - - r.m[12] = 0; - r.m[13] = 0; - r.m[14] = -(2.f * zFar * zNear) / (zFar - zNear); - r.m[15] = 0; - - return r; - } - - Matrix3f QuatToMatrix(const Vector4f& q) - { - Matrix3f m; - - float wx, wy, wz, xx, yy, yz, xy, xz, zz, s, x2, y2, z2; - - s = 2.0f / (q.v[0] * q.v[0] + q.v[1] * q.v[1] + q.v[2] * q.v[2] + q.v[3] * q.v[3]); - - - x2 = q.v[0] * s; - y2 = q.v[1] * s; - z2 = q.v[2] * s; - - wx = q.v[3] * x2; wy = q.v[3] * y2; wz = q.v[3] * z2; - xx = q.v[0] * x2; xy = q.v[1] * x2; xz = q.v[2] * x2; - yy = q.v[1] * y2; yz = q.v[2] * y2; - zz = q.v[2] * z2; - - m.m[0] = 1.0f - (yy + zz); - m.m[1] = xy + wz; - m.m[2] = xz - wy; - - m.m[3] = xy - wz; - m.m[4] = 1.0f - (xx + zz); - m.m[5] = yz + wx; - - m.m[6] = xz + wy; - m.m[7] = yz - wx; - m.m[8] = 1.0f - (xx + yy); - - return m; - - } - - Vector4f MatrixToQuat(const Matrix3f& m) - { - Vector4f r; - float trace = m.m[0] + m.m[4] + m.m[8]; - - if (trace > 0) - { - float s = 0.5f / sqrtf(trace + 1.0f); - r.v[3] = 0.25f / s; - r.v[0] = (m.m[5] - m.m[7]) * s; - r.v[1] = (m.m[6] - m.m[2]) * s; - r.v[2] = (m.m[1] - m.m[3]) * s; - } - else if (m.m[0] > m.m[4] && m.m[0] > m.m[8]) - { - float s = 2.0f * sqrtf(1.0f + m.m[0] - m.m[4] - m.m[8]); - r.v[3] = (m.m[5] - m.m[7]) / s; - r.v[0] = 0.25f * s; - r.v[1] = (m.m[1] + m.m[3]) / s; - r.v[2] = (m.m[6] + m.m[2]) / s; - } - else if (m.m[4] > m.m[8]) - { - float s = 2.0f * sqrtf(1.0f + m.m[4] - m.m[0] - m.m[8]); - r.v[3] = (m.m[6] - m.m[2]) / s; - r.v[0] = (m.m[1] + m.m[3]) / s; - r.v[1] = 0.25f * s; - r.v[2] = (m.m[5] + m.m[7]) / s; - } - else - { - float s = 2.0f * sqrtf(1.0f + m.m[8] - m.m[0] - m.m[4]); - r.v[3] = (m.m[1] - m.m[3]) / s; - r.v[0] = (m.m[6] + m.m[2]) / s; - r.v[1] = (m.m[5] + m.m[7]) / s; - r.v[2] = 0.25f * s; - } - - return r.normalized(); - } - - Vector4f QuatFromRotateAroundX(float angle) - { - Vector4f result; - - result.v[0] = sinf(angle * 0.5f); - result.v[1] = 0.f; - result.v[2] = 0.f; - result.v[3] = cosf(angle * 0.5f); - - return result; - } - - Vector4f QuatFromRotateAroundY(float angle) - { - Vector4f result; - - result.v[0] = 0.f; - result.v[1] = sinf(angle * 0.5f); - result.v[2] = 0.f; - result.v[3] = cosf(angle * 0.5f); - - return result; - } - - Vector4f QuatFromRotateAroundZ(float angle) - { - Vector4f result; - - result.v[0] = 0.f; - result.v[1] = 0.f; - result.v[2] = sinf(angle * 0.5f); - result.v[3] = cosf(angle * 0.5f); - - return result; - } - - Matrix3f TransposeMatrix(const Matrix3f& m) - { - Matrix3f r; - r.m[0] = m.m[0]; - r.m[1] = m.m[3]; - r.m[2] = m.m[6]; - r.m[3] = m.m[1]; - r.m[4] = m.m[4]; - r.m[5] = m.m[7]; - r.m[6] = m.m[2]; - r.m[7] = m.m[5]; - r.m[8] = m.m[8]; - return r; - } - - Matrix3f InverseMatrix(const Matrix3f& m) - { - float d; - Matrix3f r; - - d = m.m[0] * (m.m[4] * m.m[8] - m.m[5] * m.m[7]); - d -= m.m[1] * (m.m[3] * m.m[8] - m.m[6] * m.m[5]); - d += m.m[2] * (m.m[3] * m.m[7] - m.m[6] * m.m[4]); - - if (fabs(d) < 0.01f) - { - throw std::runtime_error("Error: matrix cannot be inversed!"); - - } - else - { - - r.m[0] = (m.m[4] * m.m[8] - m.m[5] * m.m[7]) / d; - r.m[1] = -(m.m[1] * m.m[8] - m.m[2] * m.m[7]) / d; - r.m[2] = (m.m[1] * m.m[5] - m.m[2] * m.m[4]) / d; - - r.m[3] = -(m.m[3] * m.m[8] - m.m[5] * m.m[6]) / d; - r.m[4] = (m.m[0] * m.m[8] - m.m[2] * m.m[6]) / d; - r.m[5] = -(m.m[0] * m.m[5] - m.m[2] * m.m[3]) / d; - - r.m[6] = (m.m[3] * m.m[7] - m.m[6] * m.m[4]) / d; - r.m[7] = -(m.m[0] * m.m[7] - m.m[6] * m.m[1]) / d; - r.m[8] = (m.m[0] * m.m[4] - m.m[1] * m.m[3]) / d; - - }; - return r; - } - - - Matrix4f InverseMatrix(const Matrix4f& mat) - { - Matrix4f inv; - float det; - - inv.m[0] = mat.m[5] * mat.m[10] * mat.m[15] - - mat.m[5] * mat.m[11] * mat.m[14] - - mat.m[9] * mat.m[6] * mat.m[15] + - mat.m[9] * mat.m[7] * mat.m[14] + - mat.m[13] * mat.m[6] * mat.m[11] - - mat.m[13] * mat.m[7] * mat.m[10]; - - inv.m[4] = -mat.m[4] * mat.m[10] * mat.m[15] + - mat.m[4] * mat.m[11] * mat.m[14] + - mat.m[8] * mat.m[6] * mat.m[15] - - mat.m[8] * mat.m[7] * mat.m[14] - - mat.m[12] * mat.m[6] * mat.m[11] + - mat.m[12] * mat.m[7] * mat.m[10]; - - inv.m[8] = mat.m[4] * mat.m[9] * mat.m[15] - - mat.m[4] * mat.m[11] * mat.m[13] - - mat.m[8] * mat.m[5] * mat.m[15] + - mat.m[8] * mat.m[7] * mat.m[13] + - mat.m[12] * mat.m[5] * mat.m[11] - - mat.m[12] * mat.m[7] * mat.m[9]; - - inv.m[12] = -mat.m[4] * mat.m[9] * mat.m[14] + - mat.m[4] * mat.m[10] * mat.m[13] + - mat.m[8] * mat.m[5] * mat.m[14] - - mat.m[8] * mat.m[6] * mat.m[13] - - mat.m[12] * mat.m[5] * mat.m[10] + - mat.m[12] * mat.m[6] * mat.m[9]; - - inv.m[1] = -mat.m[1] * mat.m[10] * mat.m[15] + - mat.m[1] * mat.m[11] * mat.m[14] + - mat.m[9] * mat.m[2] * mat.m[15] - - mat.m[9] * mat.m[3] * mat.m[14] - - mat.m[13] * mat.m[2] * mat.m[11] + - mat.m[13] * mat.m[3] * mat.m[10]; - - inv.m[5] = mat.m[0] * mat.m[10] * mat.m[15] - - mat.m[0] * mat.m[11] * mat.m[14] - - mat.m[8] * mat.m[2] * mat.m[15] + - mat.m[8] * mat.m[3] * mat.m[14] + - mat.m[12] * mat.m[2] * mat.m[11] - - mat.m[12] * mat.m[3] * mat.m[10]; - - inv.m[9] = -mat.m[0] * mat.m[9] * mat.m[15] + - mat.m[0] * mat.m[11] * mat.m[13] + - mat.m[8] * mat.m[1] * mat.m[15] - - mat.m[8] * mat.m[3] * mat.m[13] - - mat.m[12] * mat.m[1] * mat.m[11] + - mat.m[12] * mat.m[3] * mat.m[9]; - - inv.m[13] = mat.m[0] * mat.m[9] * mat.m[14] - - mat.m[0] * mat.m[10] * mat.m[13] - - mat.m[8] * mat.m[1] * mat.m[14] + - mat.m[8] * mat.m[2] * mat.m[13] + - mat.m[12] * mat.m[1] * mat.m[10] - - mat.m[12] * mat.m[2] * mat.m[9]; - - inv.m[2] = mat.m[1] * mat.m[6] * mat.m[15] - - mat.m[1] * mat.m[7] * mat.m[14] - - mat.m[5] * mat.m[2] * mat.m[15] + - mat.m[5] * mat.m[3] * mat.m[14] + - mat.m[13] * mat.m[2] * mat.m[7] - - mat.m[13] * mat.m[3] * mat.m[6]; - - inv.m[6] = -mat.m[0] * mat.m[6] * mat.m[15] + - mat.m[0] * mat.m[7] * mat.m[14] + - mat.m[4] * mat.m[2] * mat.m[15] - - mat.m[4] * mat.m[3] * mat.m[14] - - mat.m[12] * mat.m[2] * mat.m[7] + - mat.m[12] * mat.m[3] * mat.m[6]; - - inv.m[10] = mat.m[0] * mat.m[5] * mat.m[15] - - mat.m[0] * mat.m[7] * mat.m[13] - - mat.m[4] * mat.m[1] * mat.m[15] + - mat.m[4] * mat.m[3] * mat.m[13] + - mat.m[12] * mat.m[1] * mat.m[7] - - mat.m[12] * mat.m[3] * mat.m[5]; - - inv.m[14] = -mat.m[0] * mat.m[5] * mat.m[14] + - mat.m[0] * mat.m[6] * mat.m[13] + - mat.m[4] * mat.m[1] * mat.m[14] - - mat.m[4] * mat.m[2] * mat.m[13] - - mat.m[12] * mat.m[1] * mat.m[6] + - mat.m[12] * mat.m[2] * mat.m[5]; - - inv.m[3] = -mat.m[1] * mat.m[6] * mat.m[11] + - mat.m[1] * mat.m[7] * mat.m[10] + - mat.m[5] * mat.m[2] * mat.m[11] - - mat.m[5] * mat.m[3] * mat.m[10] - - mat.m[9] * mat.m[2] * mat.m[7] + - mat.m[9] * mat.m[3] * mat.m[6]; - - inv.m[7] = mat.m[0] * mat.m[6] * mat.m[11] - - mat.m[0] * mat.m[7] * mat.m[10] - - mat.m[4] * mat.m[2] * mat.m[11] + - mat.m[4] * mat.m[3] * mat.m[10] + - mat.m[8] * mat.m[2] * mat.m[7] - - mat.m[8] * mat.m[3] * mat.m[6]; - - inv.m[11] = -mat.m[0] * mat.m[5] * mat.m[11] + - mat.m[0] * mat.m[7] * mat.m[9] + - mat.m[4] * mat.m[1] * mat.m[11] - - mat.m[4] * mat.m[3] * mat.m[9] - - mat.m[8] * mat.m[1] * mat.m[7] + - mat.m[8] * mat.m[3] * mat.m[5]; - - inv.m[15] = mat.m[0] * mat.m[5] * mat.m[10] - - mat.m[0] * mat.m[6] * mat.m[9] - - mat.m[4] * mat.m[1] * mat.m[10] + - mat.m[4] * mat.m[2] * mat.m[9] + - mat.m[8] * mat.m[1] * mat.m[6] - - mat.m[8] * mat.m[2] * mat.m[5]; - - // ��������� ����������� - det = mat.m[0] * inv.m[0] + mat.m[1] * inv.m[4] + mat.m[2] * inv.m[8] + mat.m[3] * inv.m[12]; - - if (std::fabs(det) < 0.01f) - { - throw std::runtime_error("Error: matrix cannot be inversed!"); - } - - // ����� ��� �������� �� ����������� - det = 1.0f / det; - for (int i = 0; i < 16; i++) - { - inv.m[i] *= det; - } - - return inv; - } - - Matrix3f CreateZRotationMatrix(float angle) - { - Matrix3f result = Matrix3f::Identity(); - - result.m[0] = cosf(angle); - result.m[1] = -sinf(angle); - result.m[3] = sinf(angle); - result.m[4] = cosf(angle); - - return result; - } - - Matrix4f MultMatrixMatrix(const Matrix4f& m1, const Matrix4f& m2) - { - Matrix4f rx; - - rx.m[0] = m1.m[0] * m2.m[0] + m1.m[4] * m2.m[1] + m1.m[8] * m2.m[2] + m1.m[12] * m2.m[3]; - rx.m[1] = m1.m[1] * m2.m[0] + m1.m[5] * m2.m[1] + m1.m[9] * m2.m[2] + m1.m[13] * m2.m[3]; - rx.m[2] = m1.m[2] * m2.m[0] + m1.m[6] * m2.m[1] + m1.m[10] * m2.m[2] + m1.m[14] * m2.m[3]; - rx.m[3] = m1.m[3] * m2.m[0] + m1.m[7] * m2.m[1] + m1.m[11] * m2.m[2] + m1.m[15] * m2.m[3]; - - rx.m[4] = m1.m[0] * m2.m[4] + m1.m[4] * m2.m[5] + m1.m[8] * m2.m[6] + m1.m[12] * m2.m[7]; - rx.m[5] = m1.m[1] * m2.m[4] + m1.m[5] * m2.m[5] + m1.m[9] * m2.m[6] + m1.m[13] * m2.m[7]; - rx.m[6] = m1.m[2] * m2.m[4] + m1.m[6] * m2.m[5] + m1.m[10] * m2.m[6] + m1.m[14] * m2.m[7]; - rx.m[7] = m1.m[3] * m2.m[4] + m1.m[7] * m2.m[5] + m1.m[11] * m2.m[6] + m1.m[15] * m2.m[7]; - - - rx.m[8] = m1.m[0] * m2.m[8] + m1.m[4] * m2.m[9] + m1.m[8] * m2.m[10] + m1.m[12] * m2.m[11]; - rx.m[9] = m1.m[1] * m2.m[8] + m1.m[5] * m2.m[9] + m1.m[9] * m2.m[10] + m1.m[13] * m2.m[11]; - rx.m[10] = m1.m[2] * m2.m[8] + m1.m[6] * m2.m[9] + m1.m[10] * m2.m[10] + m1.m[14] * m2.m[11]; - rx.m[11] = m1.m[3] * m2.m[8] + m1.m[7] * m2.m[9] + m1.m[11] * m2.m[10] + m1.m[15] * m2.m[11]; - - rx.m[12] = m1.m[0] * m2.m[12] + m1.m[4] * m2.m[13] + m1.m[8] * m2.m[14] + m1.m[12] * m2.m[15]; - rx.m[13] = m1.m[1] * m2.m[12] + m1.m[5] * m2.m[13] + m1.m[9] * m2.m[14] + m1.m[13] * m2.m[15]; - rx.m[14] = m1.m[2] * m2.m[12] + m1.m[6] * m2.m[13] + m1.m[10] * m2.m[14] + m1.m[14] * m2.m[15]; - rx.m[15] = m1.m[3] * m2.m[12] + m1.m[7] * m2.m[13] + m1.m[11] * m2.m[14] + m1.m[15] * m2.m[15]; - - return rx; - } - - Matrix3f MultMatrixMatrix(const Matrix3f& m1, const Matrix3f& m2) - { - Matrix3f r; - - r.m[0] = m1.m[0] * m2.m[0] + m1.m[3] * m2.m[1] + m1.m[6] * m2.m[2]; - r.m[1] = m1.m[1] * m2.m[0] + m1.m[4] * m2.m[1] + m1.m[7] * m2.m[2]; - r.m[2] = m1.m[2] * m2.m[0] + m1.m[5] * m2.m[1] + m1.m[8] * m2.m[2]; - - r.m[3] = m1.m[0] * m2.m[3] + m1.m[3] * m2.m[4] + m1.m[6] * m2.m[5]; - r.m[4] = m1.m[1] * m2.m[3] + m1.m[4] * m2.m[4] + m1.m[7] * m2.m[5]; - r.m[5] = m1.m[2] * m2.m[3] + m1.m[5] * m2.m[4] + m1.m[8] * m2.m[5]; - - r.m[6] = m1.m[0] * m2.m[6] + m1.m[3] * m2.m[7] + m1.m[6] * m2.m[8] ; - r.m[7] = m1.m[1] * m2.m[6] + m1.m[4] * m2.m[7] + m1.m[7] * m2.m[8]; - r.m[8] = m1.m[2] * m2.m[6] + m1.m[5] * m2.m[7] + m1.m[8] * m2.m[8]; - - return r; - } - - Matrix3f MakeTranslationMatrix(const Vector3f& p) - { - Matrix3f r = Matrix3f::Identity(); - - r.m[12] = p.v[0]; - r.m[13] = p.v[1]; - r.m[14] = p.v[2]; - - return r; - } - - Matrix3f MakeScaleMatrix(float scale) - { - Matrix3f r = Matrix3f::Identity(); - - r.m[0] = scale; - r.m[5] = scale; - r.m[10] = scale; - - return r; - } - - Matrix3f MakeRotationMatrix(const Vector3f& p) - { - Matrix3f r = Matrix3f::Identity(); - - r.m[12] = p.v[0]; - r.m[13] = p.v[1]; - r.m[14] = p.v[2]; - - return r; - } - - Vector3f operator*(Vector3f v, float scale) - { - Vector3f r = v; - - r.v[0] = v.v[0] * scale; - r.v[1] = v.v[1] * scale; - r.v[2] = v.v[2] * scale; - - return r; - } - - Vector4f operator*(Vector4f v, float scale) - { - Vector4f r = v; - - r.v[0] = v.v[0] * scale; - r.v[1] = v.v[1] * scale; - r.v[2] = v.v[2] * scale; - r.v[3] = v.v[3] * scale; - - return r; - } - - Vector3f MultVectorMatrix(Vector3f v, Matrix3f mt) - { - Vector3f r; - - r.v[0] = v.v[0] * mt.m[0] + v.v[1] * mt.m[1] + v.v[2] * mt.m[2]; - r.v[1] = v.v[0] * mt.m[3] + v.v[1] * mt.m[4] + v.v[2] * mt.m[5]; - r.v[2] = v.v[0] * mt.m[6] + v.v[1] * mt.m[7] + v.v[2] * mt.m[8]; - - return r; - } - - Vector4f MultVectorMatrix(Vector4f v, Matrix4f mt) - { - Vector4f r; - - r.v[0] = v.v[0] * mt.m[0] + v.v[1] * mt.m[1] + v.v[2] * mt.m[2] + v.v[3] * mt.m[3]; - r.v[1] = v.v[0] * mt.m[4] + v.v[1] * mt.m[5] + v.v[2] * mt.m[6] + v.v[3] * mt.m[7]; - r.v[2] = v.v[0] * mt.m[8] + v.v[1] * mt.m[9] + v.v[2] * mt.m[10] + v.v[3] * mt.m[11]; - r.v[3] = v.v[0] * mt.m[12] + v.v[1] * mt.m[13] + v.v[2] * mt.m[14] + v.v[3] * mt.m[15]; - - return r; - } - - Vector4f MultMatrixVector(Matrix4f mt, Vector4f v) - { - Vector4f r; - - r.v[0] = v.v[0] * mt.m[0] + v.v[1] * mt.m[4] + v.v[2] * mt.m[8] + v.v[3] * mt.m[12]; - r.v[1] = v.v[0] * mt.m[1] + v.v[1] * mt.m[5] + v.v[2] * mt.m[9] + v.v[3] * mt.m[13]; - r.v[2] = v.v[0] * mt.m[2] + v.v[1] * mt.m[6] + v.v[2] * mt.m[10] + v.v[3] * mt.m[14]; - r.v[3] = v.v[0] * mt.m[3] + v.v[1] * mt.m[7] + v.v[2] * mt.m[11] + v.v[3] * mt.m[15]; - - return r; - } - - Vector3f MultMatrixVector(Matrix3f mt, Vector3f v) - { - Vector3f r; - - r.v[0] = v.v[0] * mt.m[0] + v.v[1] * mt.m[3] + v.v[2] * mt.m[6]; - r.v[1] = v.v[0] * mt.m[1] + v.v[1] * mt.m[4] + v.v[2] * mt.m[7]; - r.v[2] = v.v[0] * mt.m[2] + v.v[1] * mt.m[5] + v.v[2] * mt.m[8]; - - return r; - } - - Vector4f slerp(const Vector4f& q1, const Vector4f& q2, float t) - { - const float epsilon = 1e-6f; - - // Нормализация входных кватернионов - Vector4f q1_norm = q1.normalized(); - Vector4f q2_norm = q2.normalized(); - - float cosTheta = q1_norm.dot(q2_norm); - - // Если q1 и q2 близки к противоположным направлениям, корректируем q2 - Vector4f q2_adjusted = q2_norm; - if (cosTheta < 0.0f) { - q2_adjusted.v[0] = -q2_adjusted.v[0]; - q2_adjusted.v[1] = -q2_adjusted.v[1]; - q2_adjusted.v[2] = -q2_adjusted.v[2]; - q2_adjusted.v[3] = -q2_adjusted.v[3]; - cosTheta = -cosTheta; - } - - // Если кватернионы близки, используем линейную интерполяцию - if (cosTheta > 1.0f - epsilon) { - Vector4f result; - - result.v[0] = q1_norm.v[0] + t * (q2_adjusted.v[0] - q1_norm.v[0]); - result.v[1] = q1_norm.v[1] + t * (q2_adjusted.v[1] - q1_norm.v[1]); - result.v[2] = q1_norm.v[2] + t * (q2_adjusted.v[2] - q1_norm.v[2]); - result.v[3] = q1_norm.v[3] + t * (q2_adjusted.v[3] - q1_norm.v[3]); - - return result.normalized(); - } - - // Иначе используем сферическую интерполяцию - float theta = std::acos(cosTheta); - float sinTheta = std::sin(theta); - - float coeff1 = std::sin((1.0f - t) * theta) / sinTheta; - float coeff2 = std::sin(t * theta) / sinTheta; - - Vector4f result; - - result.v[0] = coeff1 * q1_norm.v[0] + coeff2 * q2_adjusted.v[0]; - result.v[1] = coeff1 * q1_norm.v[1] + coeff2 * q2_adjusted.v[1]; - result.v[2] = coeff1 * q1_norm.v[2] + coeff2 * q2_adjusted.v[2]; - result.v[3] = coeff1 * q1_norm.v[3] + coeff2 * q2_adjusted.v[3]; - - return result.normalized(); - } - - Matrix4f MakeMatrix4x4(const Matrix3f& m, const Vector3f pos) - { - Matrix4f r; - - r.m[0] = m.m[0]; - r.m[1] = m.m[1]; - r.m[2] = m.m[2]; - r.m[3] = 0; - - r.m[4] = m.m[3]; - r.m[5] = m.m[4]; - r.m[6] = m.m[5]; - r.m[7] = 0; - - r.m[8] = m.m[6]; - r.m[9] = m.m[7]; - r.m[10] = m.m[8]; - r.m[11] = 0; - - r.m[12] = pos.v[0]; - r.m[13] = pos.v[1]; - r.m[14] = pos.v[2]; - r.m[15] = 1.0; - return r; - } - - -}; +#include "ZLMath.h" + +#include +#include + +namespace ZL { + + Vector2f operator+(const Vector2f& x, const Vector2f& y) + { + Vector2f result; + + result.v[0] = x.v[0] + y.v[0]; + result.v[1] = x.v[1] + y.v[1]; + + return result; + } + + Vector2f operator-(const Vector2f& x, const Vector2f& y) + { + Vector2f result; + + result.v[0] = x.v[0] - y.v[0]; + result.v[1] = x.v[1] - y.v[1]; + + return result; + } + + Vector3f operator+(const Vector3f& x, const Vector3f& y) + { + Vector3f result; + + result.v[0] = x.v[0] + y.v[0]; + result.v[1] = x.v[1] + y.v[1]; + result.v[2] = x.v[2] + y.v[2]; + return result; + } + + Vector3f operator-(const Vector3f& x, const Vector3f& y) + { + Vector3f result; + + result.v[0] = x.v[0] - y.v[0]; + result.v[1] = x.v[1] - y.v[1]; + result.v[2] = x.v[2] - y.v[2]; + return result; + } + + Vector3f operator-(const Vector3f& x) + { + Vector3f result; + + result.v[0] = -x.v[0]; + result.v[1] = -x.v[1]; + result.v[2] = -x.v[2]; + return result; + } + + Vector4f operator+(const Vector4f& x, const Vector4f& y) + { + Vector4f result; + + result.v[0] = x.v[0] + y.v[0]; + result.v[1] = x.v[1] + y.v[1]; + result.v[2] = x.v[2] + y.v[2]; + result.v[3] = x.v[3] + y.v[3]; + return result; + } + + Vector4f operator-(const Vector4f& x, const Vector4f& y) + { + Vector4f result; + + result.v[0] = x.v[0] - y.v[0]; + result.v[1] = x.v[1] - y.v[1]; + result.v[2] = x.v[2] - y.v[2]; + result.v[3] = x.v[3] - y.v[3]; + return result; + } + + + + Matrix3f Matrix3f::Identity() + { + Matrix3f r; + + r.m[0] = 1.f; + r.m[1] = 0.f; + r.m[2] = 0.f; + + r.m[3] = 0.f; + r.m[4] = 1.f; + r.m[5] = 0.f; + + r.m[6] = 0.f; + r.m[7] = 0.f; + r.m[8] = 1.f; + + return r; + + } + + Matrix4f Matrix4f::Identity() + { + Matrix4f r; + + r.m[0] = 1.f; + r.m[1] = 0.f; + r.m[2] = 0.f; + r.m[3] = 0.f; + + r.m[4] = 0.f; + r.m[5] = 1.f; + r.m[6] = 0.f; + r.m[7] = 0.f; + + r.m[8] = 0.f; + r.m[9] = 0.f; + r.m[10] = 1.f; + r.m[11] = 0.f; + + r.m[12] = 0.f; + r.m[13] = 0.f; + r.m[14] = 0.f; + r.m[15] = 1.f; + + return r; + + } + + Matrix4f operator*(const Matrix4f& m1, const Matrix4f& m2) + { + Matrix4f r; + + r.m[0] = m1.m[0] * m2.m[0] + m1.m[4] * m2.m[1] + m1.m[8] * m2.m[2] + m1.m[12] * m2.m[3]; + r.m[1] = m1.m[1] * m2.m[0] + m1.m[5] * m2.m[1] + m1.m[9] * m2.m[2] + m1.m[13] * m2.m[3]; + r.m[2] = m1.m[2] * m2.m[0] + m1.m[6] * m2.m[1] + m1.m[10] * m2.m[2] + m1.m[14] * m2.m[3]; + r.m[3] = m1.m[3] * m2.m[0] + m1.m[7] * m2.m[1] + m1.m[11] * m2.m[2] + m1.m[15] * m2.m[3]; + + r.m[4] = m1.m[0] * m2.m[4] + m1.m[4] * m2.m[5] + m1.m[8] * m2.m[6] + m1.m[12] * m2.m[7]; + r.m[5] = m1.m[1] * m2.m[4] + m1.m[5] * m2.m[5] + m1.m[9] * m2.m[6] + m1.m[13] * m2.m[7]; + r.m[6] = m1.m[2] * m2.m[4] + m1.m[6] * m2.m[5] + m1.m[10] * m2.m[6] + m1.m[14] * m2.m[7]; + r.m[7] = m1.m[3] * m2.m[4] + m1.m[7] * m2.m[5] + m1.m[11] * m2.m[6] + m1.m[15] * m2.m[7]; + + + r.m[8] = m1.m[0] * m2.m[8] + m1.m[4] * m2.m[9] + m1.m[8] * m2.m[10] + m1.m[12] * m2.m[11]; + r.m[9] = m1.m[1] * m2.m[8] + m1.m[5] * m2.m[9] + m1.m[9] * m2.m[10] + m1.m[13] * m2.m[11]; + r.m[10] = m1.m[2] * m2.m[8] + m1.m[6] * m2.m[9] + m1.m[10] * m2.m[10] + m1.m[14] * m2.m[11]; + r.m[11] = m1.m[3] * m2.m[8] + m1.m[7] * m2.m[9] + m1.m[11] * m2.m[10] + m1.m[15] * m2.m[11]; + + r.m[12] = m1.m[0] * m2.m[12] + m1.m[4] * m2.m[13] + m1.m[8] * m2.m[14] + m1.m[12] * m2.m[15]; + r.m[13] = m1.m[1] * m2.m[12] + m1.m[5] * m2.m[13] + m1.m[9] * m2.m[14] + m1.m[13] * m2.m[15]; + r.m[14] = m1.m[2] * m2.m[12] + m1.m[6] * m2.m[13] + m1.m[10] * m2.m[14] + m1.m[14] * m2.m[15]; + r.m[15] = m1.m[3] * m2.m[12] + m1.m[7] * m2.m[13] + m1.m[11] * m2.m[14] + m1.m[15] * m2.m[15]; + + return r; + } + + Matrix4f MakeOrthoMatrix(float width, float height, float zNear, float zFar) + { + float depthRange = zFar - zNear; + + if (depthRange <= 0) + { + throw std::runtime_error("zFar must be greater than zNear"); + } + + Matrix4f r; + + r.m[0] = 2.f / width; + r.m[1] = 0; + r.m[2] = 0; + r.m[3] = 0; + + r.m[4] = 0; + r.m[5] = 2.f / height; + r.m[6] = 0; + r.m[7] = 0; + + r.m[8] = 0; + r.m[9] = 0; + r.m[10] = -1 / depthRange; + r.m[11] = 0; + + r.m[12] = -1; + r.m[13] = -1; + r.m[14] = zNear / depthRange; + r.m[15] = 1; + + return r; + } + + Matrix4f MakePerspectiveMatrix(float fovY, float aspectRatio, float zNear, float zFar) + { + float tanHalfFovy = tan(fovY / 2.f); + Matrix4f r; + + if (zNear >= zFar || aspectRatio == 0) + { + throw std::runtime_error("Invalid perspective parameters"); + } + + r.m[0] = 1.f / (aspectRatio * tanHalfFovy); + r.m[1] = 0; + r.m[2] = 0; + r.m[3] = 0; + + r.m[4] = 0; + r.m[5] = 1.f / (tanHalfFovy); + r.m[6] = 0; + r.m[7] = 0; + + r.m[8] = 0; + r.m[9] = 0; + r.m[10] = -(zFar + zNear) / (zFar - zNear); + r.m[11] = -1; + + r.m[12] = 0; + r.m[13] = 0; + r.m[14] = -(2.f * zFar * zNear) / (zFar - zNear); + r.m[15] = 0; + + return r; + } + + Matrix3f QuatToMatrix(const Vector4f& q) + { + Matrix3f m; + + float wx, wy, wz, xx, yy, yz, xy, xz, zz, s, x2, y2, z2; + + s = 2.0f / (q.v[0] * q.v[0] + q.v[1] * q.v[1] + q.v[2] * q.v[2] + q.v[3] * q.v[3]); + + + x2 = q.v[0] * s; + y2 = q.v[1] * s; + z2 = q.v[2] * s; + + wx = q.v[3] * x2; wy = q.v[3] * y2; wz = q.v[3] * z2; + xx = q.v[0] * x2; xy = q.v[1] * x2; xz = q.v[2] * x2; + yy = q.v[1] * y2; yz = q.v[2] * y2; + zz = q.v[2] * z2; + + m.m[0] = 1.0f - (yy + zz); + m.m[1] = xy + wz; + m.m[2] = xz - wy; + + m.m[3] = xy - wz; + m.m[4] = 1.0f - (xx + zz); + m.m[5] = yz + wx; + + m.m[6] = xz + wy; + m.m[7] = yz - wx; + m.m[8] = 1.0f - (xx + yy); + + return m; + + } + + Vector4f MatrixToQuat(const Matrix3f& m) + { + Vector4f r; + float trace = m.m[0] + m.m[4] + m.m[8]; + + if (trace > 0) + { + float s = 0.5f / sqrtf(trace + 1.0f); + r.v[3] = 0.25f / s; + r.v[0] = (m.m[5] - m.m[7]) * s; + r.v[1] = (m.m[6] - m.m[2]) * s; + r.v[2] = (m.m[1] - m.m[3]) * s; + } + else if (m.m[0] > m.m[4] && m.m[0] > m.m[8]) + { + float s = 2.0f * sqrtf(1.0f + m.m[0] - m.m[4] - m.m[8]); + r.v[3] = (m.m[5] - m.m[7]) / s; + r.v[0] = 0.25f * s; + r.v[1] = (m.m[1] + m.m[3]) / s; + r.v[2] = (m.m[6] + m.m[2]) / s; + } + else if (m.m[4] > m.m[8]) + { + float s = 2.0f * sqrtf(1.0f + m.m[4] - m.m[0] - m.m[8]); + r.v[3] = (m.m[6] - m.m[2]) / s; + r.v[0] = (m.m[1] + m.m[3]) / s; + r.v[1] = 0.25f * s; + r.v[2] = (m.m[5] + m.m[7]) / s; + } + else + { + float s = 2.0f * sqrtf(1.0f + m.m[8] - m.m[0] - m.m[4]); + r.v[3] = (m.m[1] - m.m[3]) / s; + r.v[0] = (m.m[6] + m.m[2]) / s; + r.v[1] = (m.m[5] + m.m[7]) / s; + r.v[2] = 0.25f * s; + } + + return r.normalized(); + } + + Vector4f QuatFromRotateAroundX(float angle) + { + Vector4f result; + + result.v[0] = sinf(angle * 0.5f); + result.v[1] = 0.f; + result.v[2] = 0.f; + result.v[3] = cosf(angle * 0.5f); + + return result; + } + + Vector4f QuatFromRotateAroundY(float angle) + { + Vector4f result; + + result.v[0] = 0.f; + result.v[1] = sinf(angle * 0.5f); + result.v[2] = 0.f; + result.v[3] = cosf(angle * 0.5f); + + return result; + } + + Vector4f QuatFromRotateAroundZ(float angle) + { + Vector4f result; + + result.v[0] = 0.f; + result.v[1] = 0.f; + result.v[2] = sinf(angle * 0.5f); + result.v[3] = cosf(angle * 0.5f); + + return result; + } + + Matrix3f TransposeMatrix(const Matrix3f& m) + { + Matrix3f r; + r.m[0] = m.m[0]; + r.m[1] = m.m[3]; + r.m[2] = m.m[6]; + r.m[3] = m.m[1]; + r.m[4] = m.m[4]; + r.m[5] = m.m[7]; + r.m[6] = m.m[2]; + r.m[7] = m.m[5]; + r.m[8] = m.m[8]; + return r; + } + + Matrix3f InverseMatrix(const Matrix3f& m) + { + float d; + Matrix3f r; + + d = m.m[0] * (m.m[4] * m.m[8] - m.m[5] * m.m[7]); + d -= m.m[1] * (m.m[3] * m.m[8] - m.m[6] * m.m[5]); + d += m.m[2] * (m.m[3] * m.m[7] - m.m[6] * m.m[4]); + + if (fabs(d) < 0.01f) + { + throw std::runtime_error("Error: matrix cannot be inversed!"); + + } + else + { + + r.m[0] = (m.m[4] * m.m[8] - m.m[5] * m.m[7]) / d; + r.m[1] = -(m.m[1] * m.m[8] - m.m[2] * m.m[7]) / d; + r.m[2] = (m.m[1] * m.m[5] - m.m[2] * m.m[4]) / d; + + r.m[3] = -(m.m[3] * m.m[8] - m.m[5] * m.m[6]) / d; + r.m[4] = (m.m[0] * m.m[8] - m.m[2] * m.m[6]) / d; + r.m[5] = -(m.m[0] * m.m[5] - m.m[2] * m.m[3]) / d; + + r.m[6] = (m.m[3] * m.m[7] - m.m[6] * m.m[4]) / d; + r.m[7] = -(m.m[0] * m.m[7] - m.m[6] * m.m[1]) / d; + r.m[8] = (m.m[0] * m.m[4] - m.m[1] * m.m[3]) / d; + + }; + return r; + } + + + Matrix4f InverseMatrix(const Matrix4f& mat) + { + Matrix4f inv; + float det; + + inv.m[0] = mat.m[5] * mat.m[10] * mat.m[15] - + mat.m[5] * mat.m[11] * mat.m[14] - + mat.m[9] * mat.m[6] * mat.m[15] + + mat.m[9] * mat.m[7] * mat.m[14] + + mat.m[13] * mat.m[6] * mat.m[11] - + mat.m[13] * mat.m[7] * mat.m[10]; + + inv.m[4] = -mat.m[4] * mat.m[10] * mat.m[15] + + mat.m[4] * mat.m[11] * mat.m[14] + + mat.m[8] * mat.m[6] * mat.m[15] - + mat.m[8] * mat.m[7] * mat.m[14] - + mat.m[12] * mat.m[6] * mat.m[11] + + mat.m[12] * mat.m[7] * mat.m[10]; + + inv.m[8] = mat.m[4] * mat.m[9] * mat.m[15] - + mat.m[4] * mat.m[11] * mat.m[13] - + mat.m[8] * mat.m[5] * mat.m[15] + + mat.m[8] * mat.m[7] * mat.m[13] + + mat.m[12] * mat.m[5] * mat.m[11] - + mat.m[12] * mat.m[7] * mat.m[9]; + + inv.m[12] = -mat.m[4] * mat.m[9] * mat.m[14] + + mat.m[4] * mat.m[10] * mat.m[13] + + mat.m[8] * mat.m[5] * mat.m[14] - + mat.m[8] * mat.m[6] * mat.m[13] - + mat.m[12] * mat.m[5] * mat.m[10] + + mat.m[12] * mat.m[6] * mat.m[9]; + + inv.m[1] = -mat.m[1] * mat.m[10] * mat.m[15] + + mat.m[1] * mat.m[11] * mat.m[14] + + mat.m[9] * mat.m[2] * mat.m[15] - + mat.m[9] * mat.m[3] * mat.m[14] - + mat.m[13] * mat.m[2] * mat.m[11] + + mat.m[13] * mat.m[3] * mat.m[10]; + + inv.m[5] = mat.m[0] * mat.m[10] * mat.m[15] - + mat.m[0] * mat.m[11] * mat.m[14] - + mat.m[8] * mat.m[2] * mat.m[15] + + mat.m[8] * mat.m[3] * mat.m[14] + + mat.m[12] * mat.m[2] * mat.m[11] - + mat.m[12] * mat.m[3] * mat.m[10]; + + inv.m[9] = -mat.m[0] * mat.m[9] * mat.m[15] + + mat.m[0] * mat.m[11] * mat.m[13] + + mat.m[8] * mat.m[1] * mat.m[15] - + mat.m[8] * mat.m[3] * mat.m[13] - + mat.m[12] * mat.m[1] * mat.m[11] + + mat.m[12] * mat.m[3] * mat.m[9]; + + inv.m[13] = mat.m[0] * mat.m[9] * mat.m[14] - + mat.m[0] * mat.m[10] * mat.m[13] - + mat.m[8] * mat.m[1] * mat.m[14] + + mat.m[8] * mat.m[2] * mat.m[13] + + mat.m[12] * mat.m[1] * mat.m[10] - + mat.m[12] * mat.m[2] * mat.m[9]; + + inv.m[2] = mat.m[1] * mat.m[6] * mat.m[15] - + mat.m[1] * mat.m[7] * mat.m[14] - + mat.m[5] * mat.m[2] * mat.m[15] + + mat.m[5] * mat.m[3] * mat.m[14] + + mat.m[13] * mat.m[2] * mat.m[7] - + mat.m[13] * mat.m[3] * mat.m[6]; + + inv.m[6] = -mat.m[0] * mat.m[6] * mat.m[15] + + mat.m[0] * mat.m[7] * mat.m[14] + + mat.m[4] * mat.m[2] * mat.m[15] - + mat.m[4] * mat.m[3] * mat.m[14] - + mat.m[12] * mat.m[2] * mat.m[7] + + mat.m[12] * mat.m[3] * mat.m[6]; + + inv.m[10] = mat.m[0] * mat.m[5] * mat.m[15] - + mat.m[0] * mat.m[7] * mat.m[13] - + mat.m[4] * mat.m[1] * mat.m[15] + + mat.m[4] * mat.m[3] * mat.m[13] + + mat.m[12] * mat.m[1] * mat.m[7] - + mat.m[12] * mat.m[3] * mat.m[5]; + + inv.m[14] = -mat.m[0] * mat.m[5] * mat.m[14] + + mat.m[0] * mat.m[6] * mat.m[13] + + mat.m[4] * mat.m[1] * mat.m[14] - + mat.m[4] * mat.m[2] * mat.m[13] - + mat.m[12] * mat.m[1] * mat.m[6] + + mat.m[12] * mat.m[2] * mat.m[5]; + + inv.m[3] = -mat.m[1] * mat.m[6] * mat.m[11] + + mat.m[1] * mat.m[7] * mat.m[10] + + mat.m[5] * mat.m[2] * mat.m[11] - + mat.m[5] * mat.m[3] * mat.m[10] - + mat.m[9] * mat.m[2] * mat.m[7] + + mat.m[9] * mat.m[3] * mat.m[6]; + + inv.m[7] = mat.m[0] * mat.m[6] * mat.m[11] - + mat.m[0] * mat.m[7] * mat.m[10] - + mat.m[4] * mat.m[2] * mat.m[11] + + mat.m[4] * mat.m[3] * mat.m[10] + + mat.m[8] * mat.m[2] * mat.m[7] - + mat.m[8] * mat.m[3] * mat.m[6]; + + inv.m[11] = -mat.m[0] * mat.m[5] * mat.m[11] + + mat.m[0] * mat.m[7] * mat.m[9] + + mat.m[4] * mat.m[1] * mat.m[11] - + mat.m[4] * mat.m[3] * mat.m[9] - + mat.m[8] * mat.m[1] * mat.m[7] + + mat.m[8] * mat.m[3] * mat.m[5]; + + inv.m[15] = mat.m[0] * mat.m[5] * mat.m[10] - + mat.m[0] * mat.m[6] * mat.m[9] - + mat.m[4] * mat.m[1] * mat.m[10] + + mat.m[4] * mat.m[2] * mat.m[9] + + mat.m[8] * mat.m[1] * mat.m[6] - + mat.m[8] * mat.m[2] * mat.m[5]; + + // ��������� ����������� + det = mat.m[0] * inv.m[0] + mat.m[1] * inv.m[4] + mat.m[2] * inv.m[8] + mat.m[3] * inv.m[12]; + + if (std::fabs(det) < 0.01f) + { + throw std::runtime_error("Error: matrix cannot be inversed!"); + } + + // ����� ��� �������� �� ����������� + det = 1.0f / det; + for (int i = 0; i < 16; i++) + { + inv.m[i] *= det; + } + + return inv; + } + + Matrix3f CreateZRotationMatrix(float angle) + { + Matrix3f result = Matrix3f::Identity(); + + result.m[0] = cosf(angle); + result.m[1] = -sinf(angle); + result.m[3] = sinf(angle); + result.m[4] = cosf(angle); + + return result; + } + + Matrix4f MultMatrixMatrix(const Matrix4f& m1, const Matrix4f& m2) + { + Matrix4f rx; + + rx.m[0] = m1.m[0] * m2.m[0] + m1.m[4] * m2.m[1] + m1.m[8] * m2.m[2] + m1.m[12] * m2.m[3]; + rx.m[1] = m1.m[1] * m2.m[0] + m1.m[5] * m2.m[1] + m1.m[9] * m2.m[2] + m1.m[13] * m2.m[3]; + rx.m[2] = m1.m[2] * m2.m[0] + m1.m[6] * m2.m[1] + m1.m[10] * m2.m[2] + m1.m[14] * m2.m[3]; + rx.m[3] = m1.m[3] * m2.m[0] + m1.m[7] * m2.m[1] + m1.m[11] * m2.m[2] + m1.m[15] * m2.m[3]; + + rx.m[4] = m1.m[0] * m2.m[4] + m1.m[4] * m2.m[5] + m1.m[8] * m2.m[6] + m1.m[12] * m2.m[7]; + rx.m[5] = m1.m[1] * m2.m[4] + m1.m[5] * m2.m[5] + m1.m[9] * m2.m[6] + m1.m[13] * m2.m[7]; + rx.m[6] = m1.m[2] * m2.m[4] + m1.m[6] * m2.m[5] + m1.m[10] * m2.m[6] + m1.m[14] * m2.m[7]; + rx.m[7] = m1.m[3] * m2.m[4] + m1.m[7] * m2.m[5] + m1.m[11] * m2.m[6] + m1.m[15] * m2.m[7]; + + + rx.m[8] = m1.m[0] * m2.m[8] + m1.m[4] * m2.m[9] + m1.m[8] * m2.m[10] + m1.m[12] * m2.m[11]; + rx.m[9] = m1.m[1] * m2.m[8] + m1.m[5] * m2.m[9] + m1.m[9] * m2.m[10] + m1.m[13] * m2.m[11]; + rx.m[10] = m1.m[2] * m2.m[8] + m1.m[6] * m2.m[9] + m1.m[10] * m2.m[10] + m1.m[14] * m2.m[11]; + rx.m[11] = m1.m[3] * m2.m[8] + m1.m[7] * m2.m[9] + m1.m[11] * m2.m[10] + m1.m[15] * m2.m[11]; + + rx.m[12] = m1.m[0] * m2.m[12] + m1.m[4] * m2.m[13] + m1.m[8] * m2.m[14] + m1.m[12] * m2.m[15]; + rx.m[13] = m1.m[1] * m2.m[12] + m1.m[5] * m2.m[13] + m1.m[9] * m2.m[14] + m1.m[13] * m2.m[15]; + rx.m[14] = m1.m[2] * m2.m[12] + m1.m[6] * m2.m[13] + m1.m[10] * m2.m[14] + m1.m[14] * m2.m[15]; + rx.m[15] = m1.m[3] * m2.m[12] + m1.m[7] * m2.m[13] + m1.m[11] * m2.m[14] + m1.m[15] * m2.m[15]; + + return rx; + } + + Matrix3f MultMatrixMatrix(const Matrix3f& m1, const Matrix3f& m2) + { + Matrix3f r; + + r.m[0] = m1.m[0] * m2.m[0] + m1.m[3] * m2.m[1] + m1.m[6] * m2.m[2]; + r.m[1] = m1.m[1] * m2.m[0] + m1.m[4] * m2.m[1] + m1.m[7] * m2.m[2]; + r.m[2] = m1.m[2] * m2.m[0] + m1.m[5] * m2.m[1] + m1.m[8] * m2.m[2]; + + r.m[3] = m1.m[0] * m2.m[3] + m1.m[3] * m2.m[4] + m1.m[6] * m2.m[5]; + r.m[4] = m1.m[1] * m2.m[3] + m1.m[4] * m2.m[4] + m1.m[7] * m2.m[5]; + r.m[5] = m1.m[2] * m2.m[3] + m1.m[5] * m2.m[4] + m1.m[8] * m2.m[5]; + + r.m[6] = m1.m[0] * m2.m[6] + m1.m[3] * m2.m[7] + m1.m[6] * m2.m[8] ; + r.m[7] = m1.m[1] * m2.m[6] + m1.m[4] * m2.m[7] + m1.m[7] * m2.m[8]; + r.m[8] = m1.m[2] * m2.m[6] + m1.m[5] * m2.m[7] + m1.m[8] * m2.m[8]; + + return r; + } + + Matrix3f MakeTranslationMatrix(const Vector3f& p) + { + Matrix3f r = Matrix3f::Identity(); + + r.m[12] = p.v[0]; + r.m[13] = p.v[1]; + r.m[14] = p.v[2]; + + return r; + } + + Matrix3f MakeScaleMatrix(float scale) + { + Matrix3f r = Matrix3f::Identity(); + + r.m[0] = scale; + r.m[5] = scale; + r.m[10] = scale; + + return r; + } + + Matrix3f MakeRotationMatrix(const Vector3f& p) + { + Matrix3f r = Matrix3f::Identity(); + + r.m[12] = p.v[0]; + r.m[13] = p.v[1]; + r.m[14] = p.v[2]; + + return r; + } + + Vector3f operator*(Vector3f v, float scale) + { + Vector3f r = v; + + r.v[0] = v.v[0] * scale; + r.v[1] = v.v[1] * scale; + r.v[2] = v.v[2] * scale; + + return r; + } + + Vector4f operator*(Vector4f v, float scale) + { + Vector4f r = v; + + r.v[0] = v.v[0] * scale; + r.v[1] = v.v[1] * scale; + r.v[2] = v.v[2] * scale; + r.v[3] = v.v[3] * scale; + + return r; + } + + Vector3f MultVectorMatrix(Vector3f v, Matrix3f mt) + { + Vector3f r; + + r.v[0] = v.v[0] * mt.m[0] + v.v[1] * mt.m[1] + v.v[2] * mt.m[2]; + r.v[1] = v.v[0] * mt.m[3] + v.v[1] * mt.m[4] + v.v[2] * mt.m[5]; + r.v[2] = v.v[0] * mt.m[6] + v.v[1] * mt.m[7] + v.v[2] * mt.m[8]; + + return r; + } + + Vector4f MultVectorMatrix(Vector4f v, Matrix4f mt) + { + Vector4f r; + + r.v[0] = v.v[0] * mt.m[0] + v.v[1] * mt.m[1] + v.v[2] * mt.m[2] + v.v[3] * mt.m[3]; + r.v[1] = v.v[0] * mt.m[4] + v.v[1] * mt.m[5] + v.v[2] * mt.m[6] + v.v[3] * mt.m[7]; + r.v[2] = v.v[0] * mt.m[8] + v.v[1] * mt.m[9] + v.v[2] * mt.m[10] + v.v[3] * mt.m[11]; + r.v[3] = v.v[0] * mt.m[12] + v.v[1] * mt.m[13] + v.v[2] * mt.m[14] + v.v[3] * mt.m[15]; + + return r; + } + + Vector4f MultMatrixVector(Matrix4f mt, Vector4f v) + { + Vector4f r; + + r.v[0] = v.v[0] * mt.m[0] + v.v[1] * mt.m[4] + v.v[2] * mt.m[8] + v.v[3] * mt.m[12]; + r.v[1] = v.v[0] * mt.m[1] + v.v[1] * mt.m[5] + v.v[2] * mt.m[9] + v.v[3] * mt.m[13]; + r.v[2] = v.v[0] * mt.m[2] + v.v[1] * mt.m[6] + v.v[2] * mt.m[10] + v.v[3] * mt.m[14]; + r.v[3] = v.v[0] * mt.m[3] + v.v[1] * mt.m[7] + v.v[2] * mt.m[11] + v.v[3] * mt.m[15]; + + return r; + } + + Vector3f MultMatrixVector(Matrix3f mt, Vector3f v) + { + Vector3f r; + + r.v[0] = v.v[0] * mt.m[0] + v.v[1] * mt.m[3] + v.v[2] * mt.m[6]; + r.v[1] = v.v[0] * mt.m[1] + v.v[1] * mt.m[4] + v.v[2] * mt.m[7]; + r.v[2] = v.v[0] * mt.m[2] + v.v[1] * mt.m[5] + v.v[2] * mt.m[8]; + + return r; + } + + Vector4f slerp(const Vector4f& q1, const Vector4f& q2, float t) + { + const float epsilon = 1e-6f; + + // Нормализация входных кватернионов + Vector4f q1_norm = q1.normalized(); + Vector4f q2_norm = q2.normalized(); + + float cosTheta = q1_norm.dot(q2_norm); + + // Если q1 и q2 близки к противоположным направлениям, корректируем q2 + Vector4f q2_adjusted = q2_norm; + if (cosTheta < 0.0f) { + q2_adjusted.v[0] = -q2_adjusted.v[0]; + q2_adjusted.v[1] = -q2_adjusted.v[1]; + q2_adjusted.v[2] = -q2_adjusted.v[2]; + q2_adjusted.v[3] = -q2_adjusted.v[3]; + cosTheta = -cosTheta; + } + + // Если кватернионы близки, используем линейную интерполяцию + if (cosTheta > 1.0f - epsilon) { + Vector4f result; + + result.v[0] = q1_norm.v[0] + t * (q2_adjusted.v[0] - q1_norm.v[0]); + result.v[1] = q1_norm.v[1] + t * (q2_adjusted.v[1] - q1_norm.v[1]); + result.v[2] = q1_norm.v[2] + t * (q2_adjusted.v[2] - q1_norm.v[2]); + result.v[3] = q1_norm.v[3] + t * (q2_adjusted.v[3] - q1_norm.v[3]); + + return result.normalized(); + } + + // Иначе используем сферическую интерполяцию + float theta = std::acos(cosTheta); + float sinTheta = std::sin(theta); + + float coeff1 = std::sin((1.0f - t) * theta) / sinTheta; + float coeff2 = std::sin(t * theta) / sinTheta; + + Vector4f result; + + result.v[0] = coeff1 * q1_norm.v[0] + coeff2 * q2_adjusted.v[0]; + result.v[1] = coeff1 * q1_norm.v[1] + coeff2 * q2_adjusted.v[1]; + result.v[2] = coeff1 * q1_norm.v[2] + coeff2 * q2_adjusted.v[2]; + result.v[3] = coeff1 * q1_norm.v[3] + coeff2 * q2_adjusted.v[3]; + + return result.normalized(); + } + + Matrix4f MakeMatrix4x4(const Matrix3f& m, const Vector3f pos) + { + Matrix4f r; + + r.m[0] = m.m[0]; + r.m[1] = m.m[1]; + r.m[2] = m.m[2]; + r.m[3] = 0; + + r.m[4] = m.m[3]; + r.m[5] = m.m[4]; + r.m[6] = m.m[5]; + r.m[7] = 0; + + r.m[8] = m.m[6]; + r.m[9] = m.m[7]; + r.m[10] = m.m[8]; + r.m[11] = 0; + + r.m[12] = pos.v[0]; + r.m[13] = pos.v[1]; + r.m[14] = pos.v[2]; + r.m[15] = 1.0; + return r; + } + + +}; diff --git a/Math.h b/ZLMath.h similarity index 95% rename from Math.h rename to ZLMath.h index 750a113..609f14d 100755 --- a/Math.h +++ b/ZLMath.h @@ -141,4 +141,4 @@ namespace ZL { Matrix4f MultMatrixMatrix(const Matrix4f& m1, const Matrix4f& m2); Matrix4f MakeMatrix4x4(const Matrix3f& m, const Vector3f pos); -}; \ No newline at end of file +}; diff --git a/space-game001.sln b/space-game001.sln deleted file mode 100644 index b3c863c..0000000 --- a/space-game001.sln +++ /dev/null @@ -1,31 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.31402.337 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "space-game001", "space-game001.vcxproj", "{400A41AE-F904-4D49-9DBC-95934D0EF82E}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {400A41AE-F904-4D49-9DBC-95934D0EF82E}.Debug|x64.ActiveCfg = Debug|x64 - {400A41AE-F904-4D49-9DBC-95934D0EF82E}.Debug|x64.Build.0 = Debug|x64 - {400A41AE-F904-4D49-9DBC-95934D0EF82E}.Debug|x86.ActiveCfg = Debug|Win32 - {400A41AE-F904-4D49-9DBC-95934D0EF82E}.Debug|x86.Build.0 = Debug|Win32 - {400A41AE-F904-4D49-9DBC-95934D0EF82E}.Release|x64.ActiveCfg = Release|x64 - {400A41AE-F904-4D49-9DBC-95934D0EF82E}.Release|x64.Build.0 = Release|x64 - {400A41AE-F904-4D49-9DBC-95934D0EF82E}.Release|x86.ActiveCfg = Release|Win32 - {400A41AE-F904-4D49-9DBC-95934D0EF82E}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {C3D1B89D-D5F1-4E33-8439-56D6C43B07A2} - EndGlobalSection -EndGlobal diff --git a/space-game001.vcxproj b/space-game001.vcxproj deleted file mode 100644 index 84f4a3e..0000000 --- a/space-game001.vcxproj +++ /dev/null @@ -1,184 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 16.0 - Win32Proj - {400a41ae-f904-4d49-9dbc-95934d0ef82e} - ZeptoLabTest1 - 10.0 - space-game001 - - - - Application - true - v143 - Unicode - - - Application - false - v143 - true - Unicode - - - Application - true - v143 - Unicode - - - Application - false - v143 - true - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - false - - - true - - - false - Viola - - - - Level3 - true - WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - - - - - Level3 - true - true - true - WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions) - true - - - Console - true - true - true - - - - - Level3 - true - PNG_ENABLED;_DEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - true - ..\SDL2-2.28.3\include;..\lpng1645\build\install\include;C:\Work\OpenAL 1.1 SDK\include;..\Projects\libogg\include;..\vorbis\include - stdcpp17 - - - Console - true - libpng16_staticd.lib;SDL2.lib;SDL2main.lib;opengl32.lib;glu32.lib;shell32.lib;opengl32.lib;glu32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib - ..\SDL2-2.28.3\lib\x64;..\lpng1645\build\install\lib - - - - - - - Level3 - true - true - true - NDEBUG;_CONSOLE;_CRT_SECURE_NO_WARNINGS;%(PreprocessorDefinitions) - true - C:\Work\SDL2-2.28.3\include;C:\Work\Projects\lpng1645\build\install\include;C:\Work\OpenAL 1.1 SDK\include;C:\Work\Projects\libogg\include;C:\Work\Projects\vorbis\include - stdcpp17 - - - Windows - true - true - true - libogg_static.lib;audioplayer.lib;vorbisfile.lib;vorbis.lib;OpenAL32.lib;SDL2.lib;SDL2main.lib;opengl32.lib;glu32.lib;shell32.lib;opengl32.lib;glu32.lib;kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib - C:\Work\Projects\ZeptoLabTest1\cmakeaudioplayer\build\Release;C:\Work\SDL2-2.28.3\lib\x64;C:\Work\Projects\vorbis\build\lib\Release;C:\Work\OpenAL 1.1 SDK\libs\Win64;C:\Work\Projects\libogg\win32\VS2010\x64\Release - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/space-game001.vcxproj.filters b/space-game001.vcxproj.filters deleted file mode 100644 index eda1725..0000000 --- a/space-game001.vcxproj.filters +++ /dev/null @@ -1,93 +0,0 @@ - - - - - {4FC737F1-C7A5-4376-A066-2A32D752A2FF} - cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx - - - {93995380-89BD-4b04-88EB-625FBE52EBFB} - h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd - - - {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} - rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms - - - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - Source Files - - - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - \ No newline at end of file