clock-source.lua 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. obs = obslua
  2. bit = require("bit")
  3. source_def = {}
  4. source_def.id = "lua_clock_source"
  5. source_def.output_flags = bit.bor(obs.OBS_SOURCE_VIDEO, obs.OBS_SOURCE_CUSTOM_DRAW)
  6. function image_source_load(image, file)
  7. obs.obs_enter_graphics();
  8. obs.gs_image_file_free(image);
  9. obs.obs_leave_graphics();
  10. obs.gs_image_file_init(image, file);
  11. obs.obs_enter_graphics();
  12. obs.gs_image_file_init_texture(image);
  13. obs.obs_leave_graphics();
  14. if not image.loaded then
  15. print("failed to load texture " .. file);
  16. end
  17. end
  18. source_def.get_name = function()
  19. return "Lua Clock"
  20. end
  21. source_def.create = function(source, settings)
  22. local data = {}
  23. data.image = obs.gs_image_file()
  24. data.hour_image = obs.gs_image_file()
  25. data.minute_image = obs.gs_image_file()
  26. data.second_image = obs.gs_image_file()
  27. image_source_load(data.image, script_path() .. "clock-source/dial.png")
  28. image_source_load(data.hour_image, script_path() .. "clock-source/hour.png")
  29. image_source_load(data.minute_image, script_path() .. "clock-source/minute.png")
  30. image_source_load(data.second_image, script_path() .. "clock-source/second.png")
  31. return data
  32. end
  33. source_def.destroy = function(data)
  34. obs.obs_enter_graphics();
  35. obs.gs_image_file_free(data.image);
  36. obs.gs_image_file_free(data.hour_image);
  37. obs.gs_image_file_free(data.minute_image);
  38. obs.gs_image_file_free(data.second_image);
  39. obs.obs_leave_graphics();
  40. end
  41. source_def.video_render = function(data, effect)
  42. if not data.image.texture then
  43. return;
  44. end
  45. local time = os.date("*t")
  46. local seconds = time.sec
  47. local mins = time.min + seconds / 60.0;
  48. local hours = time.hour + (mins * 60.0) / 3600.0;
  49. effect = obs.obs_get_base_effect(obs.OBS_EFFECT_DEFAULT)
  50. obs.gs_blend_state_push()
  51. obs.gs_reset_blend_state()
  52. while obs.gs_effect_loop(effect, "Draw") do
  53. obs.obs_source_draw(data.image.texture, 0, 0, data.image.cx, data.image.cy, false);
  54. end
  55. obs.gs_matrix_push()
  56. obs.gs_matrix_translate3f(250, 250, 0)
  57. obs.gs_matrix_rotaa4f(0.0, 0.0, 1.0, 2 * math.pi / 60 * mins);
  58. obs.gs_matrix_translate3f(-250, -250, 0)
  59. while obs.gs_effect_loop(effect, "Draw") do
  60. obs.obs_source_draw(data.minute_image.texture, 0, 0, data.image.cx, data.image.cy, false);
  61. end
  62. obs.gs_matrix_pop()
  63. obs.gs_matrix_push()
  64. obs.gs_matrix_translate3f(250, 250, 0)
  65. obs.gs_matrix_rotaa4f(0.0, 0.0, 1.0, 2.0 * math.pi / 12 * hours);
  66. obs.gs_matrix_translate3f(-250, -250, 0)
  67. while obs.gs_effect_loop(effect, "Draw") do
  68. obs.obs_source_draw(data.hour_image.texture, 0, 0, data.image.cx, data.image.cy, false);
  69. end
  70. obs.gs_matrix_pop()
  71. obs.gs_matrix_push()
  72. obs.gs_matrix_translate3f(250, 250, 0)
  73. obs.gs_matrix_rotaa4f(0.0, 0.0, 1.0, 2 * math.pi / 60 * seconds);
  74. obs.gs_matrix_translate3f(-250, -250, 0)
  75. while obs.gs_effect_loop(effect, "Draw") do
  76. obs.obs_source_draw(data.second_image.texture, 0, 0, data.image.cx, data.image.cy, false);
  77. end
  78. obs.gs_matrix_pop()
  79. obs.gs_blend_state_pop()
  80. end
  81. source_def.get_width = function(data)
  82. return 500
  83. end
  84. source_def.get_height = function(data)
  85. return 500
  86. end
  87. function script_description()
  88. return "Adds a \"Lua Clock\" source which draws an animated analog clock."
  89. end
  90. obs.obs_register_source(source_def)