LINUX.ORG.RU

GLM 1.0.0 — математическая библиотека для C++

 , , header-only, ,

GLM 1.0.0 — математическая библиотека для C++

2

3

24 января, после почти четырёхлетней паузы, состоялся выпуск 1.0.0 header-only SIMD-оптимизированной библиотеки для C++ GLM (OpenGL Mathematics), основанной на спецификациях GLSL (pdf) (OpenGL Shading Language).

Изменения:

  • добавлен модуль GLM_EXT_scalar_reciprocal с тестами;
  • добавлен модуль GLM_EXT_vector_reciprocal с тестами;
  • добавлен модуль GLM_EXT_matrix_integer с тестами;
  • добавлены функции glm::iround и glm::uround в модули GLM_EXT_scalar_common и GLM_EXT_vector_common;
  • добавлена функция GLM_FORCE_UNRESTRICTED_FLOAT для предотвращения статических утверждений при использовании других скалярных типов с функцией, ожидающей тип float;
  • добавлен классификатор constexpr в функции cross и dot;
  • исправлено некорректное утверждение для glm::min и glm::max;
  • исправлена ориентация кватернионов в функции glm::decompose;
  • исправлена сингулярность при преобразовании кватерниона в эйлеров угол крена;
  • исправлена работа glm::pow с кватернионами малой величины;
  • исправлена ошибка компиляции glm::fastNormalize;
  • исправлена ошибка компиляции glm::isMultiple;
  • исправлено вычисление в функции glm::adjugate;
  • исправлено отбрасывание знака результата в функции glm::angle для углов в диапазоне (2pi-1, 2pi);
  • устранен запрет на использование glm::string_cast в коде хоста CUDA;
  • добавлены Github Actions.

>>> Подробности

★★★★

Проверено: hobbit ()
Последнее исправление: hobbit (всего исправлений: 4)

Почитал об отличиях OpenGL-SL and OpenCL/CUDA, не очень понял зачем зоопарк такой

One ★★★★★
()

исправлена сингулярность при преобразовании кватерниона в эйлеров угол крена

Всё. Это самое эпическое название багфикса, которым я отныне и присно буду пугать джунов!

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

Сначала подумал что аббревиатура означает «жизни экстремистов имеют значение»

perl5_guy ★★★★★
()
Ответ на: комментарий от hobbit

Всё. Это самое эпическое название багфикса, которым я отныне и присно буду пугать джунов!

 - Пил, тварь?
 - Нет, не пил.
 - А ну скажи "сингулярность при преобразовании кватерниона в эйлеров угол крена"!
 - Ладно, пил
windows10 ★★★★★
()
Последнее исправление: windows10 (всего исправлений: 1)
Ответ на: комментарий от hobbit

сингулярность при преобразовании кватерниона в эйлеров угол крена

классическая проблема же

static_lab ★★★★★
()

@hobbit, а можно исправить на «header-only SIMD-оптимизированной C++ библиотеки»?

dataman ★★★★
() автор топика
Последнее исправление: dataman (всего исправлений: 1)
Ответ на: комментарий от gns

Вот бы знать еще, что такое «Эйлеров угол крена».

Обычное вращение кватерниона вокруг осей. Это насколько же сырой была библиотека если при попытке поворота падала с сегфолт.

Для понимания - без поворотов/вращений кватернионы фактически бесполезны.

Obezyan
()
Ответ на: комментарий от windows10

А то. Это посильнее, чем Trello-подобная канбан-доска на PHP!

hobbit ★★★★★
()

header-only

Кстати, разве такие библиотеки не вызывают разжирения бинарников и значительного увеличения времени компиляции?

Werenter ★★★
()
Ответ на: комментарий от Werenter

Увеличение времени компиляции не слишком коррелирует с жирностью бинарника, к тому же, -O1 и выше никто не отменял

XMs ★★★★★
()
Ответ на: комментарий от dataman

«Покопаю» это API.
Если понравится, переведу API на C++.

https://cglm.readthedocs.io/en/latest/getting_started.html#array-vs-struct

Array vs Struct:

cglm uses arrays for vector and matrix types. So you can’t access 
individual elements like vec.x, vec.y, vec.z… You must use 
subscript to access vector elements e.g. vec[0], vec[1], vec[2].

Also I think it is more meaningful to access matrix elements with 
subscript e.g matrix[2][3] instead of matrix._23. Since matrix is 
array of vectors, vectors are also defined as array. This makes 
types homogeneous.

Return arrays?

Since C doesn’t support return arrays, cglm also doesn’t support 
this feature.

Function design:
cglm provides a few way to call a function to do same operation.
Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 1)
Ответ на: комментарий от Obezyan

Да я уж нагуглил про что это. Я теормех, где это было, учил лет много назад, забыл все напрочь. Ладно, кому надо, пусть пользуют. Далек я от всей этой компьютерной геометрии.

gns ★★★★★
()
Ответ на: комментарий от hobbit

Ещё можно использовать фразу «с крена ли эйлерова?!».

dataman ★★★★
() автор топика
Ответ на: комментарий от dataman

В сторонних проектах провожу рефакторинг, чтобы не было разных «велосипедов».
Например для обеспечения кроссплатформенности в проектах имеются хэдэры, которые учитывают типы ОС, ...
При этом алгоритмы используют кроссплатформенные типы данных.
Так как для разного железа, ОС, компиляторов, ... они могут разниться.

Поэтому не использую такие хэдэры, так как в своих это всё учтено.
Произвожу рефакторинг исходников к единому стилю.
В этом абсолютно ничего сложного нет.
Профит в том, что всё API использует единые названия типов данных, ...

Кроме этого обычно удаляю десятки макросов.
Например в SDL много макросов убрал потому, что без них и
компиляция идёт быстрее и код много readable ...

Вообще-то хотя и перевожу код на C++, но он по существу а-ля Си с «плюшками» и заодно
в случае необходимости можно использовать все «навороты» C++.

Синтаксис C++ более удобный, чем в Си.

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 10)
Ответ на: комментарий от fox72

Да ничего эпичного там нет. Обычная потребность физиков описывать ортогональное четырёхмерное пространство одним числом (привет ОТО Эйнштейна). Так же как геометрам потребовалось описывать одной буквею плоскость (обычный complex) - зато очень хорошо прижилось в электродинамике...

drfaust ★★★★★
()
Последнее исправление: drfaust (всего исправлений: 1)
Ответ на: комментарий от fox72

А что там не так с понятием кватерниона? Для математика это просто обобщение понятия комплексного числа. Или мы про разные кватернионы говорим? :)))

Но вот где-то ближе к концу ведущий вдруг сообщил залу, что его давно мучает слово «дизъюнкция», которого он не понимает. И попросил у зала дать определение.

После вопроса в зале сделалась странная такая тишина. Особенно эффектно это было с учетом того, что чуть раньше один из выступавших произнес со сцены фразу «Кто передаст?», отчего весь зал разразился громким пошлым хихикаканьем. «Извините! Кто отдаст?», поправился тогда смущенный выступающий. Теперь же красноречивое молчание зала означало, что никто из присутствующих, так хорошо разбирающихся в передастах, не способен дать определение элементарной операции со множествами из курса школьной алгебры. В конце концов где-то сзади поднялся какой-то скромник и сказал что-то про пересечение и объединение ареалов и локусов. Собравшиеся дружно схватились за головы и застонали. Я хмыкнул. «Это Еськов, он палеонтолог, - объяснил мне Переслегин. - Он дал биологическое определение».

hobbit ★★★★★
()
Ответ на: комментарий от Forum0888

cglm uses arrays for vector and matrix types. So you can’t access individual elements like vec.x, vec.y, vec.z… You must use subscript to access vector elements e.g. vec[0], vec[1], vec[2]

А вот в C3 и Odin во встроенных векторах vec[0] == vec.x.

dataman ★★★★
() автор топика
Ответ на: комментарий от Obezyan

Я так понимаю, там не сегфолт, а некорректное вычисление при преобразовании кватерниона в Эйлеровы углы, приводящее к вырождению в крайних случаях.

unC0Rr ★★★★★
()
Ответ на: комментарий от thunar

Хоть бесконечность и не имеет отношения к сингулярности, но скорее всего вы правы и именно такое поведение имелось ввиду. Отдельное спасибо за пример.

Obezyan
()
Ответ на: комментарий от hobbit

Так. Понятно. Я еще и не математик. Гуманитарий в чистом виде. А вы эпичней предыдущего оратора. Пошел я спать.

fox72
()
Последнее исправление: fox72 (всего исправлений: 1)

Я бы не доверял людям, которые не могут перерисовать свой логотип хотя бы в svg.

Ygor ★★★★★
()
Ответ на: комментарий от One

GLSL сейчас наиболее переносимый способ организации gpu compute. И даже не GLSL, а все что компилируется в spir-v. CUDA это nvidia only, а opencl теперь deprecated на технике apple.

Reset ★★★★★
()
Ответ на: комментарий от Obezyan

Под сингулярностью что угодно можно понимать. Скорее всего, получение NaN в качестве угла или что-то такое.

unC0Rr ★★★★★
()
Ответ на: комментарий от hobbit

эпично что этот глюк там был. конвертнуть кватернион в углы проще чем с бревна упасть

avv
()
Ответ на: комментарий от dataman

«Разработчики библиотеки GTK объявили о готовности двух новых
движков отрисовки - „ngl“ и „vulkan“, использующих графические API OpenGL (GL 3.3+ и GLES 3.0+) и Vulkan.»

https://gitlab.gnome.org/GNOME/gtk/-/tree/main/gsk/gpu

https://www.opennet.ru/opennews/art.shtml?num=60515 В GTK добавлены новые движки отрисовки для OpenGL и Vulkan

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 3)
Ответ на: комментарий от dataman

Компилятор умный, всё на регистрах.
Пока не понял чем им массив так приглянулся.

На всякий случай.

Сводная таблица с регистрами и их назначением, очень полезна при чтении ассемблера:

Регистр	        Назначение

rax	        Временный регистр, возврат первого (ret 1) INTEGER результата.
rbx	        Принадлежит вызывающей функции, не должен быть изменён на момент возврата.
rcx	        Передача четвёртого (4) INTEGER аргумента.
rdx	        Передача третьего (3) INTEGER аргумента, возврат второго (ret 2)         INTEGER результата.
rsp	        Указатель на стек.
rbp	        Принадлежит вызывающей функции, не должен быть изменён на момент возврата.
rsi	        Передача второго (2) INTEGER аргумента.
rdi	        Передача первого (1) INTEGER аргумента.
r8	        Передача пятого (5) INTEGER аргумента.
r9	        Передача шестого (6) INTEGER аргумента.
r10-r11	        Временные регистры.
r12-r15	        Принадлежит вызывающей функции, не должны быть изменены на момент возврата.
xmm0-xmm1	Передача и возврат первого и второго SSE аргументов.
xmm2-xmm7	Передача с третьего по шестой SSE аргументов.
xmm8-xmm15	Временные регистры.

Forum0888
()
Последнее исправление: Forum0888 (всего исправлений: 3)
Ответ на: комментарий от Forum0888

Пока не понял чем им массив так приглянулся.

Например, в C3 есть foreach:

module output;	// necessary for compiler explorer

import std::io;

fn void main()
{
    float[<3>] v;
    v[0] = 123;
    v.y = 456;
    v.z = v[2];
    foreach(i, val: v)
    {
        io::printfn("%d %s", i, val);
    }
}
dataman ★★★★
() автор топика
Ответ на: комментарий от dataman
#include <stdio.h>

typedef float vec3 __attribute__((ext_vector_type(3)));

int main() {
  vec3 v = { 0, 0, 0 };
  v.xz = 1.5;
  v.y = -0.25;
  v[0] = v.y + v[2];
  printf("%f\n", v.x); // 1.25

  vec3 b = v + v;
  printf("%f\n", b[0]); // 2.5

  return 0;
}

clang main.c ; ./a.out

https://clang.llvm.org/docs/LanguageExtensions.html#vectors-and-extended-vectors

MOPKOBKA ★★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 3)
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.