Операции над точками и векторами
Операции над точками:
- расстояние между точками \sqrt{(x_a-x_b)^2+(y_a-y_b)^2+(z_a-z_b)^2}
Операции над векторами:
- длина \left|\vec{v}\right|=\sqrt{x^2+y^2+z^2}
- скалярное произведение n=(\vec{a}, \vec{b})=|\vec{a}|* |\vec{b}|*cos\angle(\vec{a},\vec{b}) = x_a x_b + y_a y_b + z_a z_b, где n длина проекции вектора \vec{a} на вектор \vec{b}
- векторное произведение \vec{c}=(y_a z_b-z_a y_b;z_a x_b-x_a z_b;x_a y_b-y_a x_b), где \vec{c} перпендикуляр к плоскости, которую образуют \vec{a} и \vec{b}
- сложение векторов \vec{a}+\vec{b}=(x_a+x_b;y_a+y_b;z_a+z_b)
- вычитание векторов \vec{a}-\vec{b}=(x_a-x_b;y_a-y_b;z_a-z_b)
Использование precompiled headers в CMake
Макрос для использования precompiled headers в CMake + Visual Studio 2008.
macro(USE_PRECOMPILED_HEADER PrecompiledHeader Sources)
get_filename_component(HEADER_NAME ${PrecompiledHeader} NAME_WE)
set(PrecompiledBinary ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${HEADER_NAME}.pch)
set(PrecompiledSource ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_BUILD_TYPE}/${HEADER_NAME}.cpp)
set(NEED_UPDATE_HEADER_CPP TRUE)
set(PrecompiledData "#include \"${PrecompiledHeader}\"")
if (EXISTS ${PrecompiledSource})
file(READ ${PrecompiledSource} HEADER_CPP_DATA_IN)
if (NOT ${HEADER_CPP_DATA_IN} STREQUAL ${PrecompiledData})
SET(NEED_UPDATE_HEADER_CPP TRUE)
else ()
SET(NEED_UPDATE_HEADER_CPP FALSE)
endif ()
endif ()
if (NEED_UPDATE_HEADER_CPP)
file(WRITE ${PrecompiledSource} ${PrecompiledData})
endif ()
set_source_files_properties(${PrecompiledSource}
PROPERTIES
COMPILE_FLAGS "/Yc${PrecompiledHeader} /Fp${PrecompiledBinary}"
OBJECT_OUTPUTS ${PrecompiledBinary}
)
set(DUPLICATE_SOURCES ${${Sources}})
set_source_files_properties(${DUPLICATE_SOURCES}
PROPERTIES
COMPILE_FLAGS "/Yu${PrecompiledBinary} /FI${PrecompiledBinary} /Fp${PrecompiledBinary}"
OBJECT_DEPENDS ${PrecompiledBinary}
)
source_group(src ${PrecompiledSource})
list(APPEND ${Sources} ${PrecompiledSource})
endmacro(USE_PRECOMPILED_HEADER)
Использование тривиально:
FILE( GLOB_RECURSE SRC *.cpp )USE_PRECOMPILED_HEADER("precompiled.h" SRC )
UPDATE: Окончательный вариант precompiled headers смотрим здесь.
Пустая переменная CMAKE_BUILD_TYPE при запуске INSTALL из MSVC
Для генерация файлов сборки проекта в последнее время пользуюсь замечательной утилитой CMake.
В процессе использования утилиты наткнулся на неприятный баг. Переменная CMAKE_BUILD_TYPE при сборки из под Visual Studio 2008 всегда оказывается пустой, вне зависимости от выбранного типа сборки (Debug, Release, RelWithDebInfo).
Решение проблемы заключается в использовании макроса CMAKE_INSTALL_CONFIG_NAME. Макрос этот хитрый и в документации к CMake вы его не найдете. Он используется только в сгенерированном файле cmake_install.cmake при выполнении цели INSTALL.
Пример использования этого макроса
set( INSTALL_PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/bin/\${CMAKE_INSTALL_CONFIG_NAME})
Обратите внимание на обратный слеш после «bin/», он не дает раскрыть макрос до выполнения скрипта cmake_install.cmake, который вызывается из Visual Studio 2008 при компиляции цели INSTALL
Утилита для создания текстурных атласов
Представляю на суд общественности утилиту для создания текстурных атласов из набора изображений.
Утилита написана на питоне мной и моим коллегой, работает исправно до сих пор.
Использование тривиально:
Usage: atlastool.py [options] directory
Options:
--version show program's version number and exit
-h, --help show this help message and exit
-v, --verbose verbose output
Atlas options:
-W MAXWIDTH, --max-width=MAXWIDTH
max atlas width [default 2048]
-H MAXHEIGHT, --max-height=MAXHEIGHT
max atlas height [default 2048]
-p PADDING, --padding=PADDING
atlas image padding [default 1]
-s SORTON, --sort-on=SORTON
sort parameter (width or height) [default "height"]
--skip-dimension-sum=SKIPDIMENSIONSUM
skip images with dimension sum greater then [default
4294967296]
-a ALPHATHRESHOLD, --alpha-threshold=ALPHATHRESHOLD
alpha threshold for image trimming [default 1]
--no-optimize disable atlas size optimization
Output options:
-f FORMAT, --format=FORMAT
output format (ogre, cocos2d, cocos2d-with-path)
-o OUTPUTDIRECTORY, --output=OUTPUTDIRECTORY
output directory [default "./atlases"]
-n OUTPUTNAME, --output-name=OUTPUTNAME
output filename [default "atlas"]
На данный момент поддерживает только png, но при желании можно добавить любой известный формат.