renderer.cxx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. //
  2. // renderer.cxx
  3. // graphics
  4. //
  5. // Created by Sam Jaffe on 5/19/19.
  6. // Copyright © 2019 Sam Jaffe. All rights reserved.
  7. //
  8. #include "game/graphics/renderer.hpp"
  9. #include <vector>
  10. #include "game/graphics/exception.h"
  11. #include "game/graphics/object.hpp"
  12. #include "game/graphics/vertex.h"
  13. #include "matrix/matrix.hpp"
  14. #include "matrix/matrix_helpers.hpp"
  15. #include "renderer_impl.hpp"
  16. using namespace graphics;
  17. renderer_impl * get_renderer_impl(driver d) {
  18. switch (d) {
  19. case driver::openGL:
  20. return get_renderer_impl<driver::openGL>();
  21. default:
  22. throw unmapped_enum<driver>(d);
  23. }
  24. }
  25. direct_renderer::direct_renderer(driver d) : pimpl(::get_renderer_impl(d)) {}
  26. direct_renderer::direct_renderer(renderer_impl * pi) : pimpl(pi) {}
  27. std::shared_ptr<class manager const> direct_renderer::manager() const {
  28. return pimpl->manager();
  29. }
  30. void direct_renderer::draw(object const & obj) {
  31. std::vector<vertex> verts;
  32. vertices(verts, obj);
  33. draw(obj.material, math::matr4(), verts);
  34. }
  35. void direct_renderer::draw(identity<material> material,
  36. math::matr4 const & object_to_world,
  37. std::vector<vertex> const & verts) {
  38. pimpl->draw(material, object_to_world, verts);
  39. }
  40. void direct_renderer::clear() { pimpl->clear(); }
  41. void direct_renderer::flush() { pimpl->flush(); }
  42. batch_renderer::batch_renderer(renderer * impl, std::size_t batch_size)
  43. : impl_(impl), batches_(), batch_size_(batch_size), elements_(0) {}
  44. batch_renderer::~batch_renderer() { flush(); }
  45. void batch_renderer::draw(object const & obj) {
  46. std::vector<vertex> & batch_verts = batches_[obj.material];
  47. auto old_size = batch_verts.size();
  48. vertices(batch_verts, obj);
  49. elements_ += batch_verts.size() - old_size;
  50. check();
  51. }
  52. // TODO (sjaffe): object-to-world matrix...
  53. void batch_renderer::draw(identity<material> material, math::matr4 const &,
  54. std::vector<vertex> const & verts) {
  55. auto & batch_verts = batches_[material];
  56. batch_verts.insert(batch_verts.end(), verts.begin(), verts.end());
  57. elements_ += verts.size();
  58. check();
  59. }
  60. void batch_renderer::flush() {
  61. write();
  62. impl_->flush();
  63. }
  64. void batch_renderer::check() {
  65. if (batch_size_ && elements_ >= batch_size_) { write(); }
  66. }
  67. void batch_renderer::write() {
  68. for (auto & pair : batches_) {
  69. impl_->draw(pair.first, math::matrix::identity<float, 4>(), pair.second);
  70. }
  71. batches_.clear();
  72. elements_ = 0;
  73. }