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 #include <texturelink.h>
16 
17 namespace nap
18 {
19  // Forward Declares
20  class TextureCube;
21  class CubeRenderTarget;
22  class RenderService;
23  class PerspCameraComponentInstance;
24 
25  // Called when rendering a cube texture layer
26  using CubeRenderTargetCallback = std::function<void(CubeRenderTarget& target, const glm::mat4& projection, const glm::mat4& view)>;
27 
28 
30  // Cube RenderTarget
32 
44  class NAPAPI CubeRenderTarget : public Resource, public IRenderTarget
45  {
46  RTTI_ENABLE(Resource)
47  public:
52  CubeRenderTarget(Core& core);
53 
58 
64  virtual bool init(utility::ErrorState& errorState) override;
65 
69  virtual void beginRendering() override;
70 
74  virtual void endRendering() override;
75 
79  virtual const glm::ivec2 getBufferSize() const override { return mSize; }
80 
85  virtual void setClearColor(const RGBAColorFloat& color) override { mClearColor = color; }
86 
90  virtual const RGBAColorFloat& getClearColor() const override { return mClearColor; }
91 
95  virtual ECullWindingOrder getWindingOrder() const override { return ECullWindingOrder::Clockwise; }
96 
100  virtual VkRenderPass getRenderPass() const override { return mRenderPass; }
101 
105  TextureCube& getColorTexture() { return *mCubeTexture; }
106 
110  virtual VkFormat getColorFormat() const override { return mVulkanColorFormat; }
111 
115  virtual VkFormat getDepthFormat() const override { return mVulkanDepthFormat; }
116 
121  virtual VkSampleCountFlagBits getSampleCount() const override { return VK_SAMPLE_COUNT_1_BIT; }
122 
126  virtual bool getSampleShadingEnabled() const override { return mSampleShading; }
127 
131  virtual VkImageLayout getFinalLayout() const override { return VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; }
132 
136  glm::ivec2 getSize() const { return mSize; }
137 
155  void render(CubeRenderTargetCallback renderCallback);
156 
174  void render(PerspCameraComponentInstance& camera, CubeRenderTargetCallback renderCallback);
175 
181  uint getLayerIndex() const { return mLayerIndex; }
182 
186  static const std::vector<glm::mat4>& getCubeMapViewTransforms();
187 
188  bool mSampleShading = true;
189  bool mUpdateLODs = false;
190  RGBAColorFloat mClearColor = { 0.0f, 0.0f, 0.0f, 0.0f };
194  bool mClear = true;
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 = { 0, 0 };
219  uint mLayerIndex = 0;
220  TextureCubeTargetLink mTextureLink;
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:100
nap::RenderTextureCube::EFormat
EFormat
Definition: rendertexturecube.h:43
nap::TextureCube
Definition: texture.h:302
nap::CubeRenderTarget::getFinalLayout
virtual VkImageLayout getFinalLayout() const override
Definition: cuberendertarget.h:131
nap::DepthRenderTextureCube::EDepthFormat
EDepthFormat
Definition: rendertexturecube.h:105
nap::CubeRenderTarget::mCubeTexture
ResourcePtr< RenderTextureCube > mCubeTexture
Property: 'CubeTexture' cube texture to render to.
Definition: cuberendertarget.h:193
nap::RGBAColor< float >
nap::CubeRenderTarget::getSampleCount
virtual VkSampleCountFlagBits getSampleCount() const override
Definition: cuberendertarget.h:121
nap::rtti::ObjectPtr
Definition: objectptr.h:150
nap::ECullWindingOrder
ECullWindingOrder
Definition: materialcommon.h:30
nap::CubeRenderTarget::getClearColor
virtual const RGBAColorFloat & getClearColor() const override
Definition: cuberendertarget.h:90
nap::utility::ErrorState
Definition: errorstate.h:19
nap::CubeRenderTarget::getColorFormat
virtual VkFormat getColorFormat() const override
Definition: cuberendertarget.h:110
nap::ImageData
Definition: imagedata.h:23
nap::RenderService
Definition: renderservice.h:198
nap::Core
Definition: core.h:82
nap::CubeRenderTarget::getDepthFormat
virtual VkFormat getDepthFormat() const override
Definition: cuberendertarget.h:115
nap::CubeRenderTarget::getLayerIndex
uint getLayerIndex() const
Definition: cuberendertarget.h:181
nap::CubeRenderTarget::getWindingOrder
virtual ECullWindingOrder getWindingOrder() const override
Definition: cuberendertarget.h:95
nap::CubeRenderTarget::getSampleShadingEnabled
virtual bool getSampleShadingEnabled() const override
Definition: cuberendertarget.h:126
nap::PerspCameraComponentInstance
Definition: perspcameracomponent.h:46
nap::CubeRenderTarget::getColorTexture
TextureCube & getColorTexture()
Definition: cuberendertarget.h:105
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:26
nap::TextureCube::layerCount
static constexpr const uint layerCount
Definition: texture.h:309
nap::Resource
Definition: resource.h:19
nap::CubeRenderTarget::setClearColor
virtual void setClearColor(const RGBAColorFloat &color) override
Definition: cuberendertarget.h:85
nap::CubeRenderTarget
Definition: cuberendertarget.h:44
nap::CubeRenderTarget::getSize
glm::ivec2 getSize() const
Definition: cuberendertarget.h:136
nap::CubeRenderTarget::getBufferSize
virtual const glm::ivec2 getBufferSize() const override
Definition: cuberendertarget.h:79