WallpaperParser.cpp 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "WallpaperParser.h"
  2. #include "ObjectParser.h"
  3. #include "WallpaperEngine/Data/Model/Project.h"
  4. #include "WallpaperEngine/Data/Model/Wallpaper.h"
  5. #include "WallpaperEngine/FileSystem/Container.h"
  6. #include "WallpaperEngine/Logging/Log.h"
  7. using namespace WallpaperEngine::Data::Parsers;
  8. WallpaperUniquePtr WallpaperParser::parse (const JSON& file, Project& project) {
  9. switch (project.type) {
  10. case Project::Type_Scene:
  11. return parseScene (file, project);
  12. case Project::Type_Video:
  13. return parseVideo (file, project);
  14. case Project::Type_Web:
  15. return parseWeb (file, project);
  16. default:
  17. sLog.exception ("Unexpected project type value found... This is likely a bug");
  18. }
  19. }
  20. SceneUniquePtr WallpaperParser::parseScene (const JSON& file, Project& project) {
  21. const auto scene = JSON::parse (project.assetLocator->readString (file));
  22. const auto camera = scene.require ("camera", "Scenes must have a camera section");
  23. const auto general = scene.require ("general", "Scenes must have a general section");
  24. const auto projection
  25. = general.require ("orthogonalprojection", "General section must have orthogonal projection info");
  26. const auto objects = scene.require ("objects", "Scenes must have an objects section");
  27. const auto& properties = project.properties;
  28. // TODO: FIND IF THESE DEFAULTS ARE SENSIBLE OR NOT AND PERFORM PROPER VALIDATION WHEN CAMERA PREVIEW AND CAMERA
  29. // PARALLAX ARE PRESENT
  30. return std::make_unique <Scene> (
  31. WallpaperData {
  32. .filename = "",
  33. .project = project
  34. }, SceneData {
  35. .colors = {
  36. .ambient = general.optional ("ambientcolor", glm::vec3 (0.0f)),
  37. .skylight = general.optional ("skylightcolor", glm::vec3 (0.0f)),
  38. .clear = general.user ("clearcolor", properties, glm::vec3 (1.0f)),
  39. },
  40. .camera = {
  41. .fade = general.optional ("camerafade", false),
  42. .preview = general.optional ("camerapreview", false),
  43. .bloom = {
  44. .enabled = general.user ("bloom", properties, false),
  45. .strength = general.user ("bloomstrength", properties, 0.0f),
  46. .threshold = general.user ("bloomthreshold", properties, 0.0f),
  47. },
  48. .parallax = {
  49. .enabled = general.user ("cameraparallax", properties, false),
  50. .amount = general.user ("cameraparallaxamount", properties, 1.0f),
  51. .delay = general.user ("cameraparallaxdelay", properties, 0.0f),
  52. .mouseInfluence = general.user ("cameraparallaxmouseinfluence", properties, 1.0f),
  53. },
  54. .shake = {
  55. .enabled = general.user ("camerashake", properties, false),
  56. .amplitude = general.user ("camerashakeamplitude", properties, 0.0f),
  57. .roughness = general.user ("camerashakeroughness", properties, 0.0f),
  58. .speed = general.user ("camerashakespeed", properties, 0.0f),
  59. },
  60. .configuration = {
  61. .center = camera.require <glm::vec3> ("center", "Camera must have a center position"),
  62. .eye = camera.require <glm::vec3> ("eye", "Camera must have an eye position"),
  63. .up = camera.require <glm::vec3> ("up", "Camera must have an up position"),
  64. },
  65. .projection = {
  66. .width = projection.optional ("auto", false) ? 0 : projection.require <int> ("width", "Projection must have a width"),
  67. .height = projection.optional ("auto", false) ? 0 : projection.require <int> ("height", "Projection must have a height"),
  68. .isAuto = projection.optional ("auto", false),
  69. .nearz = camera.optional <float> ("nearz", 0.0f),
  70. .farz = camera.optional <float> ("farz", 1000.0f),
  71. .fov = camera.optional <float> ("fov", 50.0f)
  72. }
  73. },
  74. .objects = parseObjects (objects, project),
  75. }
  76. );
  77. }
  78. VideoUniquePtr WallpaperParser::parseVideo (const JSON& file, Project& project) {
  79. return std::make_unique<Video> (WallpaperData { .filename = file, .project = project });
  80. }
  81. WebUniquePtr WallpaperParser::parseWeb (const JSON& file, Project& project) {
  82. return std::make_unique<Web> (WallpaperData {
  83. .filename = file,
  84. .project = project,
  85. });
  86. }
  87. ObjectList WallpaperParser::parseObjects (const JSON& objects, const Project& project) {
  88. ObjectList result = {};
  89. for (const auto& cur : objects) {
  90. result.emplace_back (ObjectParser::parse (cur, project));
  91. }
  92. return result;
  93. }