- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
#define ADD_TYPE(type, tname, plname) \
int Get ## tname ## LocByName(string name) const\
{\
assert(MyInterface!=null);\
auto index=MyInterface.data->get_id_by_name(name);\
assert(index==-1 || MyInterface.data->Structure.Declarations[index].Type==ValueType::tname);\
return index;\
}\
ShaderParameters& Set ## tname (int loc, type val)\
{\
return Set ## plname (loc, &val, 0, 1);\
}\
ShaderParameters& Set ## tname (string name, type val)\
{\
return Set ## tname (Get ## tname ## LocByName(name), val);\
}\
ShaderParameters& Set ## plname (int loc, const type* vals, ushort first, ushort count)\
{\
if(loc==-1) return *this;\
assert(MyInterface!=null);\
update_id=++MyInterface.data->num_updates;\
values.Set(loc, vals, first, count);\
return *this;\
}\
ShaderParameters& Set ## plname (string name, const type* vals, ushort first, ushort count)\
{\
return Set ## plname (Get ## tname ## LocByName(name), vals, first, count);\
}\
type Get ## tname (int loc, ushort i=0) const\
{\
if(loc==-1) return type();\
return values.Get<type>(loc, i);\
}\
type Get ## tname (string name, ushort i=0) const\
{\
return Get ## tname (Get ## tname ## LocByName(name), i);\
}
ADD_TYPE(float, Float, Floats);
ADD_TYPE(Math::vec2, Vec2, Vecs2);
ADD_TYPE(Math::vec3, Vec3, Vecs3);
ADD_TYPE(Math::vec4, Vec4, Vecs4);
ADD_TYPE(int, Int, Ints);
ADD_TYPE(Math::ivec2, IVec2, IVecs2);
ADD_TYPE(Math::ivec3, IVec3, IVecs3);
ADD_TYPE(Math::ivec4, IVec4, IVecs4);
ADD_TYPE(Math::mat3, Mat3, Mats3);
ADD_TYPE(Math::mat4, Mat4, Mats4);
#undef ADD_TYPE
Вот так в моём движке идёт работа с параметрами шейдеров. Макросы делал, чтобы избежать копипаста. Выглядит ужасно, отлаживать неудобно, но зато использовать удобно. Буду думать, как красиво перевести это на шаблоны, чтобы не потерять удобство использования.