Войти
ПроектыФорумОцените

Handy Math Library v0.61 beta

Страницы: 1 2 3 Следующая »
#0
17:29, 5 окт. 2005

Всё начиналось довольно безобидно, вот с этой вот темы.
Тогда я думал, счас вот сяду за вечерок, да и напишу, простенькую, удобненькую, маленькую библиотечку.
Этот вечёрок как-то затянулся на... вот уже чёрт знает сколько месяцев, а делать я ничего так и не начал, т.е. даже кое-что сделал: 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 для расмотрения фич и обсуждения добавления их в библиотеку, эдакий консорциум разработчиков.


#1
18:07, 5 окт. 2005

мда, что сейчас будет.
и тему то как назвал.

#2
18:51, 5 окт. 2005

kroll
> мда, что сейчас будет.
Ужас щас будет... Поэтому лучше заранее заныкаться в бункер и до поры до времени оттуда не вылезать. :)

#3
19:12, 5 окт. 2005

resurected_timofei
Выпил. Не помогло.
Апстенку бился. Не помогло.
На вереффке висел. Не помогло.

Т.ч. лезем в бункеры пережидать очередную war. :)

#4
21:40, 5 окт. 2005

tav

Репект =)))
Скачаю гляну =)

[edit]
Скачал... стало страшно.. =)
[/edit]

#5
22:29, 5 окт. 2005

раз пошла такая пьянка, то и выложу свою либу MTL(Math Template Library). которая тоже написанна в GLSL-style. свизлинга никакого нет. да и не знаю, зачем он нужен. зато есть возможность использывать выравненные и невыравненные данные. для выравненных данных используются вычесления на основе SSE. недавно вот начал писать ODE Solver Library(OSL). в принципе уже на 80% закончил ее делать, осталось дописать алгоритмы и возможность динамически менять их во время выполнения, но в целом библиотека находится в рабочем состоянии. http://webfile.ru/556269

#6
22:49, 5 окт. 2005

[subscribe]

#7
2:44, 6 окт. 2005

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
>и тему то как назвал.
А шо ты хош. Практикуюсь в ПЕАРе.

#8
14:31, 6 окт. 2005

tav
>Опять же ИМХО не удобно. Где бинарные операторы +,-,* для векторов и матриц?
есть они там :)

#9
16:04, 6 окт. 2005

CyberZX
Сорри, сразу не заметил.

#10
18:15, 6 окт. 2005

CyberZX
ай-ай-ай как сыро :))

в векторе4 где еще 3 компонента? :)

protected:
		T				data;

*********

еще ради интереса - зачем масло-масляное?:
#pragma once и #ifndef :)

#11
18:19, 6 окт. 2005

tav
ИМХО надо писать код так, чтобы юзерам (да и тебе самому) понятнее было. В твоем коде без поллитры не разобраться.

А так очень даже неплохо!

#12
18:29, 6 окт. 2005

CyberZX
ээээ в качестве T - unaligned_float4?

#13
20:11, 6 окт. 2005

avost
почему сыро? работать с ней удобно, да и перфоманс весьма хорош. умножение матриц у меня 81 такт занимает :)

#pragma once и #ifndef так как используется либа нетолько на MSVC компиляторах. но в msvc #pragma once ускаоряет компиляцию, так как встречая ее не происходит повторного парсинга файла.

T data, потому что параметризируется типами aligned_float4, unaligned_float4, aligned_double4... ну и т.д.

#14
22:55, 6 окт. 2005

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 такт занимает :)
да нормальная либа ;) ее б еще потестить

Страницы: 1 2 3 Следующая »
ПроектыФорумОцените

Тема в архиве.