Всё начиналось довольно безобидно, вот с этой вот темы.
Тогда я думал, счас вот сяду за вечерок, да и напишу, простенькую, удобненькую, маленькую библиотечку.
Этот вечёрок как-то затянулся на... вот уже чёрт знает сколько месяцев, а делать я ничего так и не начал, т.е. даже кое-что сделал: vec.h и заготовку mat.h. Если б не моя лень, то либа появилась бы наверное уже давно.
Короче, неделю назад решил взяться за дело серьёзно и скорее его закончить. Что из этого вышло, смотрите сами: http://tav86.narod.ru/HandyMathLib.rar.
Итак, пока заливается этот архивчик с библой, я продолжу.
Сначала рекомендую ознакомиться с краткой документацией.
Весь код либы я переписал с нуля, т.е. заново переизобрёл тучу велосипедов (вроде того как получить матрицу отражения от плоскости или как преобразовать кватернион в матрицу и наоборот), и даже добавил пару новых фич, вроде отражения одной плоскости относительно другой (интересно, а это и в правду работает? :-) ), или операции преобразования векторов (или матриц или кватернионов) с компонентами одного типа в вектора (или м. или к.) с компонентами другого типа, причём допускаются даже такие "хаки":
mat3 a=mat3(1);
dmat4 b=mat_cast<dmat4>(a);//mat_cast<dmat4>(a) возвращает единичную 4D матрицу
(это пример из документации.)
Вообще насчёт реализации, если чё можете спрашивать, пока я ещё вывод формул помню, но... там так всё просто реализовано, что... думаю только из кода понять несложно.
Изначально либа задумывалась как комплексное решение для задач 2D/3D графики и физики. Приоритеты при её создании были расставлены примерно так:
1. Удобство. Сочетание удобства работы GLSL с дополнительными функциями и новыми типами данных должно было сделать процесс реализации алгоритмов физики и графики максимально простым и удобным. Код, написанный с использованием библиотеки, должен получаться максимально кратким, понятным и наглядным.
2. Надёжность. Библиотека должна быть написана в стиле, полностью соответствующему стандарту языка. Абсолютная надёжность её компонентов не зависимо от платформы и компилятора.
3. Скорость. Наиболее часто-употребляемые функции библиотеки сделаны с максимальной эффективностью. 4-хмерные вектора и матрицы полностью векторизуются на всех операциях (векторизовать, правда умеет только IC++).
Либа была мной протестирована на 5-ти компиляторах: VC++ 6.0, VC++ 7.0, VC++ 7.1, IC++ 7.1 и... даже GNU G++ 3.2.3. Причём на всех компиляторах тестирующая система проходит полностью (свыше 400 тестов), на всех комбинациях опций либы и даже без ошибок и багов.
И ещё, чуть не забыл. Если кому в голову взбредёт чудовищная мысль самому скомпилировать тест-систему и он не верит мне на слово, что всё работает, нужно не забыть добавить опцию компилятора /Zm400. Ну, ето только для VC++.
Итак, предлагаю создать некий комитет наподобие ARB для расмотрения фич и обсуждения добавления их в библиотеку, эдакий консорциум разработчиков.
мда, что сейчас будет.
и тему то как назвал.
kroll
> мда, что сейчас будет.
Ужас щас будет... Поэтому лучше заранее заныкаться в бункер и до поры до времени оттуда не вылезать. :)
resurected_timofei
Выпил. Не помогло.
Апстенку бился. Не помогло.
На вереффке висел. Не помогло.
Т.ч. лезем в бункеры пережидать очередную war. :)
tav
Репект =)))
Скачаю гляну =)
[edit]
Скачал... стало страшно.. =)
[/edit]
раз пошла такая пьянка, то и выложу свою либу MTL(Math Template Library). которая тоже написанна в GLSL-style. свизлинга никакого нет. да и не знаю, зачем он нужен. зато есть возможность использывать выравненные и невыравненные данные. для выравненных данных используются вычесления на основе SSE. недавно вот начал писать ODE Solver Library(OSL). в принципе уже на 80% закончил ее делать, осталось дописать алгоритмы и возможность динамически менять их во время выполнения, но в целом библиотека находится в рабочем состоянии. http://webfile.ru/556269
[subscribe]
all
Жду первых отзывов. В принципе, я немного приукрасил. На non-IC++ компиляторах может даже и работает.
CyberZX
>свизлинга никакого нет. да и не знаю, зачем он нужен.
При его отключении либа может не компилиться. :-) Функции с псевдо-плоскостью (4-хмерный вектор; класса "плоскость" как такового нет за ненадобностью) извлекают нормаль плоскости как pl.xyz.
Покажите мне хоть одну мат. библу, где в классах векторов/матриц и т.д. нет ни одного метода. AFAIK, в этом плане HandyML уникальна.
>то и выложу свою либу MTL(Math Template Library)
Опять же ИМХО не удобно. Где бинарные операторы +,-,* для векторов и матриц? Я хочу писать так: v'=(M1*(1-t)+M2*t)*v;
Потому что, за километр видно, что делает этот код. А напиши теперь его для своей либы?
alex_r
>Скачал... стало страшно.. =)
Ну что, страшшшно? Имплементация отдыхает. :-)
Особенно вот ети все:
#define operator_xx(d,op,arg,secondOperand) \ INLINE Tmat##d &operator op(const arg) \ {for (int i=0;i<d*d;i++) e[i] op secondOperand; return *this;}
И ети:
#define op(o) INLINE Tvec4 &operator o(const T a) {x o a; y o a; z o a; w o a; return *this;} op(+=) op(-=) op(*=) op(/=) #undef op
И вот ети векторные каскады:
#define op_begin(o) INLINE Tvec4 &operator o(const Tvec4 &v) { #define op_end(o) for (int i=0;i<4;i++) e[i] o v[i]; return *this;} op_begin(+=) #pragma ivdep #pragma vector always op_end(+=) op_begin(-=) #pragma ivdep #pragma vector always op_end(-=) op_begin(*=) #pragma ivdep #pragma vector always op_end(*=) op_begin(/=) #pragma ivdep #pragma vector always op_end(/=) op_begin(=) #pragma ivdep op_end(=) #undef op_begin #undef op_end
А дефайн 2D матрицы -- просто супер, не правда ли?
Dinosaur
>Поэтому лучше заранее заныкаться в бункер и до поры до времени оттуда не вылезать. :)
Ааа. И не надейтесь, от HML никто не уйдёт!
kroll
>и тему то как назвал.
А шо ты хош. Практикуюсь в ПЕАРе.
tav
>Опять же ИМХО не удобно. Где бинарные операторы +,-,* для векторов и матриц?
есть они там :)
CyberZX
Сорри, сразу не заметил.
CyberZX
ай-ай-ай как сыро :))
в векторе4 где еще 3 компонента? :)
protected: T data;
*********
еще ради интереса - зачем масло-масляное?:
#pragma once и #ifndef :)
tav
ИМХО надо писать код так, чтобы юзерам (да и тебе самому) понятнее было. В твоем коде без поллитры не разобраться.
А так очень даже неплохо!
CyberZX
ээээ в качестве T - unaligned_float4?
avost
почему сыро? работать с ней удобно, да и перфоманс весьма хорош. умножение матриц у меня 81 такт занимает :)
#pragma once и #ifndef так как используется либа нетолько на MSVC компиляторах. но в msvc #pragma once ускаоряет компиляцию, так как встречая ее не происходит повторного парсинга файла.
T data, потому что параметризируется типами aligned_float4, unaligned_float4, aligned_double4... ну и т.д.
CyberZX
>> T data, потому что параметризируется типами aligned_float4, unaligned_float4, aligned_double4... ну и т.д.
да я уже воткнулся
>> #pragma once и #ifndef так как используется либа нетолько на MSVC компиляторах. но в msvc #pragma once ускаоряет компиляцию, так как встречая ее не происходит повторного парсинга файла.
я про это место:
#ifdef _MSC_VER #pragma once #endif #ifndef __MATH_H_INCLUDED #define __MATH_H_INCLUDED
а, еще :)
если ты говоришь о разных компиляторах то align в aligned_float4 соблюдать через __m128 нехорошо :))
может как нить через #pragma pack(16)
>> почему сыро? работать с ней удобно, да и перфоманс весьма хорош. умножение матриц у меня 81 такт занимает :)
да нормальная либа ;) ее б еще потестить
Тема в архиве.