Generators.cpp 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. #include "Generators.h"
  2. #include <cstdio>
  3. using mnd::Generator;
  4. using mnd::AdaptiveGenerator;
  5. Generator::~Generator(void)
  6. {
  7. }
  8. AdaptiveGenerator::AdaptiveGenerator(Generator* floatGen, Generator* doubleGen)
  9. {
  10. generators.push_back({ 0.0000001, floatGen });
  11. generators.push_back({ 0.0, doubleGen });
  12. }
  13. AdaptiveGenerator::AdaptiveGenerator(Generator* floatGen, Generator* doubleGen, Generator* quadGen)
  14. {
  15. generators.push_back({ 0.0000001, floatGen });
  16. generators.push_back({ 5.0e-16, doubleGen });
  17. generators.push_back({ 0.0, quadGen });
  18. }
  19. void AdaptiveGenerator::generate(const mnd::MandelInfo& info, float* data)
  20. {
  21. Real pixelW = info.view.width / info.bWidth;
  22. Real pixelH = info.view.height / info.bHeight;
  23. Real minimum = pixelW < pixelH ? pixelW : pixelH;
  24. Generator* toUse = nullptr;
  25. int i = 0;
  26. for (auto [thresh, gen] : generators) {
  27. ++i;
  28. if (minimum > thresh) {
  29. toUse = gen;
  30. break;
  31. }
  32. }
  33. if (toUse != nullptr) {
  34. toUse->generate(info, data);
  35. }
  36. else {
  37. for (long s = 0; s < info.bWidth * info.bHeight; s++) {
  38. data[s] = 0.0;
  39. }
  40. }
  41. }