Ir.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. // Copyright (C) 2009-2015, Panagiotis Christopoulos Charitos.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <anki/renderer/Ir.h>
  6. #include <anki/renderer/Is.h>
  7. #include <anki/core/Config.h>
  8. #include <anki/scene/SceneNode.h>
  9. #include <anki/scene/Visibility.h>
  10. #include <anki/scene/FrustumComponent.h>
  11. #include <anki/scene/ReflectionProbe.h>
  12. namespace anki {
  13. //==============================================================================
  14. Ir::~Ir()
  15. {}
  16. //==============================================================================
  17. Error Ir::init(
  18. ThreadPool* threadpool,
  19. ResourceManager* resources,
  20. GrManager* gr,
  21. HeapAllocator<U8> alloc,
  22. StackAllocator<U8> frameAlloc,
  23. const ConfigSet& initializer,
  24. const Timestamp* globalTimestamp)
  25. {
  26. ANKI_LOGI("Initializing IR (Image Reflections)");
  27. m_fbSize = initializer.getNumber("ir.rendererSize");
  28. if(m_fbSize < Renderer::TILE_SIZE)
  29. {
  30. ANKI_LOGE("Too low ir.rendererSize");
  31. return ErrorCode::USER_DATA;
  32. }
  33. m_cubemapArrSize = initializer.getNumber("ir.cubemapTextureArraySize");
  34. if(m_cubemapArrSize < 2)
  35. {
  36. ANKI_LOGE("Too low ir.cubemapTextureArraySize");
  37. return ErrorCode::USER_DATA;
  38. }
  39. // Init the renderer
  40. Config config;
  41. config.set("dbg.enabled", false);
  42. config.set("is.sm.bilinearEnabled", true);
  43. config.set("is.groundLightEnabled", false);
  44. config.set("is.sm.enabled", true);
  45. config.set("is.sm.maxLights", 8);
  46. config.set("is.sm.poissonEnabled", false);
  47. config.set("is.sm.resolution", 16);
  48. config.set("lf.maxFlares", 8);
  49. config.set("pps.enabled", false);
  50. config.set("renderingQuality", 1.0);
  51. config.set("width", m_fbSize);
  52. config.set("height", m_fbSize);
  53. config.set("lodDistance", 10.0);
  54. config.set("samples", 1);
  55. ANKI_CHECK(m_r.init(threadpool, resources, gr, alloc, frameAlloc, config,
  56. globalTimestamp));
  57. // Init the texture
  58. TextureInitializer texinit;
  59. texinit.m_width = m_fbSize;
  60. texinit.m_height = m_fbSize;
  61. texinit.m_depth = m_cubemapArrSize;
  62. texinit.m_type = TextureType::CUBE;
  63. texinit.m_format = Is::RT_PIXEL_FORMAT;
  64. texinit.m_mipmapsCount = 1;
  65. texinit.m_samples = 1;
  66. texinit.m_sampling.m_minMagFilter = SamplingFilter::LINEAR;
  67. m_cubemapArr = gr->newInstance<Texture>(texinit);
  68. return ErrorCode::NONE;
  69. }
  70. //==============================================================================
  71. Error Ir::run(SceneNode& frustumNode)
  72. {
  73. FrustumComponent& frc = frustumNode.getComponent<FrustumComponent>();
  74. VisibilityTestResults& visRez = frc.getVisibilityTestResults();
  75. if(visRez.getReflectionProbeCount() == 0)
  76. {
  77. // Early out
  78. return ErrorCode::NONE;
  79. }
  80. const VisibleNode* begin = visRez.getReflectionProbesBegin();
  81. const VisibleNode* end = visRez.getReflectionProbesBegin();
  82. while(begin != end)
  83. {
  84. ANKI_CHECK(renderReflection(*begin->m_node));
  85. }
  86. return ErrorCode::NONE;
  87. }
  88. //==============================================================================
  89. Error Ir::renderReflection(SceneNode& node)
  90. {
  91. const ReflectionProbeComponent& reflc =
  92. node.getComponent<ReflectionProbeComponent>();
  93. for(U i = 0; i < 6; ++i)
  94. {
  95. Array<CommandBufferPtr, RENDERER_COMMAND_BUFFERS_COUNT> cmdb;
  96. for(U j = 0; j < cmdb.getSize(); ++j)
  97. {
  98. cmdb[j] = m_r.getGrManager().newInstance<CommandBuffer>();
  99. }
  100. // Render
  101. ANKI_CHECK(m_r.render(node, i, cmdb));
  102. // Copy textures
  103. cmdb[1]->copyTextureToTexture(m_r.getIs().getRt(), 0, 0,
  104. m_cubemapArr, i, 0);
  105. // Flush
  106. for(U j = 0; j < cmdb.getSize(); ++j)
  107. {
  108. cmdb[j]->flush();
  109. }
  110. }
  111. return ErrorCode::NONE;
  112. }
  113. } // end namespace anki