NAP
cuberendertarget.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 // Local Includes
8 #include "irendertarget.h"
9 #include "rendertexturecube.h"
10 
11 // External Includes
12 #include <nap/resource.h>
13 #include <nap/resourceptr.h>
14 #include <vulkan/vulkan_core.h>
15 
16 namespace nap
17 {
18  // Forward Declares
19  class TextureCube;
20  class CubeRenderTarget;
21  class RenderService;
22  class PerspCameraComponentInstance;
23 
24  // Called when rendering a cube texture layer
25  using CubeRenderTargetCallback = std::function<void(CubeRenderTarget& target, const glm::mat4& projection, const glm::mat4& view)>;
26 
27 
29  // Cube RenderTarget
31 
43  class NAPAPI CubeRenderTarget : public Resource, public IRenderTarget
44  {
45  RTTI_ENABLE(Resource)
46  public:
51  CubeRenderTarget(Core& core);
52 
57 
63  virtual bool init(utility::ErrorState& errorState) override;
64 
68  virtual void beginRendering() override;
69 
73  virtual void endRendering() override;
74 
78  virtual const glm::ivec2 getBufferSize() const override { return mSize; }
79 
84  virtual void setClearColor(const RGBAColorFloat& color) override { mClearColor = color; }
85 
89  virtual const RGBAColorFloat& getClearColor() const override { return mClearColor; }
90 
94  virtual ECullWindingOrder getWindingOrder() const override { return ECullWindingOrder::Clockwise; }
95 
99  virtual VkRenderPass getRenderPass() const override { return mRenderPass; }
100 
104  TextureCube& getColorTexture() { return *mCubeTexture; }
105 
109  virtual VkFormat getColorFormat() const override { return mVulkanColorFormat; }
110 
114  virtual VkFormat getDepthFormat() const override { return mVulkanDepthFormat; }
115 
120  virtual VkSampleCountFlagBits getSampleCount() const override { return VK_SAMPLE_COUNT_1_BIT; }
121 
125  virtual bool getSampleShadingEnabled() const override { return mSampleShading; }
126 
130  glm::ivec2 getSize() const { return mSize; }
131 
149  void render(CubeRenderTargetCallback renderCallback);
150 
168  void render(PerspCameraComponentInstance& camera, CubeRenderTargetCallback renderCallback);
169 
175  uint getLayerIndex() const { return mLayerIndex; }
176 
180  static const std::vector<glm::mat4>& getCubeMapViewMatrices();
181 
185  static const std::vector<glm::mat4>& getCubeMapInverseViewMatrices();
186 
187  bool mSampleShading = true;
188  bool mUpdateLODs = false;
189  RGBAColorFloat mClearColor = { 0.0f, 0.0f, 0.0f, 0.0f };
190 
193 
195 
196  private:
200  void renderInternal(const glm::vec3& camPosition, const glm::mat4& projectionMatrix, CubeRenderTargetCallback renderCallback);
201 
205  void setLayerIndex(uint index);
206 
207  RenderService* mRenderService;
208  VkRenderPass mRenderPass = VK_NULL_HANDLE;
209 
210  VkFormat mVulkanColorFormat = VK_FORMAT_UNDEFINED;
211  VkFormat mVulkanDepthFormat = VK_FORMAT_UNDEFINED;
212 
213  ImageData mDepthImage{ TextureCube::layerCount };
214  ImageData mColorImage{ TextureCube::layerCount };
215 
216  std::array<VkFramebuffer, TextureCube::layerCount> mFramebuffers = { VK_NULL_HANDLE };
217 
218  glm::ivec2 mSize;
219  uint mLayerIndex = 0U;
220  bool mIsFirstPass = true;
221  };
222 }
nap::DepthRenderTextureCube::EDepthFormat::D16
@ D16
16 bit unsigned, 1 component
nap::ECullWindingOrder::Clockwise
@ Clockwise
nap::uint
unsigned int uint
Definition: numeric.h:23
nap::IRenderTarget
Definition: irendertarget.h:21
nap::CubeRenderTarget::getRenderPass
virtual VkRenderPass getRenderPass() const override
Definition: cuberendertarget.h:99
nap::RenderTextureCube::EFormat
EFormat
Definition: rendertexturecube.h:43
nap::TextureCube
Definition: texture.h:298
nap::DepthRenderTextureCube::EDepthFormat
EDepthFormat
Definition: rendertexturecube.h:99
nap::RGBAColor< float >
nap::CubeRenderTarget::getSampleCount
virtual VkSampleCountFlagBits getSampleCount() const override
Definition: cuberendertarget.h:120
nap::rtti::ObjectPtr
Definition: objectptr.h:154
nap::ECullWindingOrder
ECullWindingOrder
Definition: materialcommon.h:30
nap::CubeRenderTarget::getClearColor
virtual const RGBAColorFloat & getClearColor() const override
Definition: cuberendertarget.h:89
nap::utility::ErrorState
Definition: errorstate.h:19
nap::CubeRenderTarget::getColorFormat
virtual VkFormat getColorFormat() const override
Definition: cuberendertarget.h:109
nap::ImageData
Definition: imagedata.h:23
nap::RenderService
Definition: renderservice.h:275
nap::Core
Definition: core.h:82
nap::CubeRenderTarget::getDepthFormat
virtual VkFormat getDepthFormat() const override
Definition: cuberendertarget.h:114
nap::CubeRenderTarget::getLayerIndex
uint getLayerIndex() const
Definition: cuberendertarget.h:175
nap::CubeRenderTarget::getWindingOrder
virtual ECullWindingOrder getWindingOrder() const override
Definition: cuberendertarget.h:94
nap::CubeRenderTarget::getSampleShadingEnabled
virtual bool getSampleShadingEnabled() const override
Definition: cuberendertarget.h:125
nap::PerspCameraComponentInstance
Definition: perspcameracomponent.h:46
nap::CubeRenderTarget::getColorTexture
TextureCube & getColorTexture()
Definition: cuberendertarget.h:104
nap
Definition: templateapp.h:17
nap::RenderTextureCube::EFormat::RGBA8
@ RGBA8
08 bit unsigned, 4 components
nap::CubeRenderTargetCallback
std::function< void(CubeRenderTarget &target, const glm::mat4 &projection, const glm::mat4 &view)> CubeRenderTargetCallback
Definition: cuberendertarget.h:25
nap::TextureCube::layerCount
static constexpr const uint layerCount
Definition: texture.h:304
nap::Resource
Definition: resource.h:19
nap::CubeRenderTarget::setClearColor
virtual void setClearColor(const RGBAColorFloat &color) override
Definition: cuberendertarget.h:84
nap::CubeRenderTarget
Definition: cuberendertarget.h:43
nap::CubeRenderTarget::getSize
glm::ivec2 getSize() const
Definition: cuberendertarget.h:130
nap::CubeRenderTarget::getBufferSize
virtual const glm::ivec2 getBufferSize() const override
Definition: cuberendertarget.h:78
nap::CubeRenderTarget::mCubeTexture
ResourcePtr< TextureCube > mCubeTexture
Property: 'CubeTexture' cube texture to render to.
Definition: cuberendertarget.h:194