Операции над точками и векторами

Операции над точками:

  • расстояние между точками \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, но при желании можно добавить любой известный формат.

Блог Евгения Жирнова