Кресты / Говнокод #18375 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 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

Вот так в моём движке идёт работа с параметрами шейдеров. Макросы делал, чтобы избежать копипаста. Выглядит ужасно, отлаживать неудобно, но зато использовать удобно. Буду думать, как красиво перевести это на шаблоны, чтобы не потерять удобство использования.

Запостил: gammaker gammaker, (Updated )

Комментарии (0) RSS

Добавить комментарий

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8