NAP
renderwindow.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 "renderutils.h"
9 #include "irendertarget.h"
10 
11 // External Includes
12 #include <window.h>
13 #include <rect.h>
14 
15 // SDL Forward declares
16 struct SDL_Window;
17 
18 namespace nap
19 {
20  // Forward Declares
21  class Core;
22  class RenderService;
23 
43  class NAPAPI RenderWindow : public Window, public IRenderTarget
44  {
45  RTTI_ENABLE(Window)
46  friend class RenderService;
47  public:
52  enum class EPresentationMode : int
53  {
54  Immediate,
55  Mailbox,
56  FIFO_Relaxed,
57  FIFO
58  };
59 
64  RenderWindow(Core& core);
65 
69  virtual ~RenderWindow() override;
70 
74  virtual bool init(utility::ErrorState& errorState) override;
75 
79  virtual void onDestroy() override;
80 
87  const glm::ivec2 getSize() const;
88 
95  int getWidth() const { return getSize().x; }
96 
101  int getWidthPixels() const { return getBufferSize().x; }
102 
109  int getHeight() const { return getSize().y; }
110 
115  int getHeightPixels() const { return getBufferSize().y; }
116 
121  const glm::ivec2 getBufferSize() const override;
122 
127  void show();
128 
132  void hide();
133 
137  const std::string& getTitle() const { return mTitle; }
138 
142  void setTitle(std::string newTitle);
143 
147  bool isResizable() const { return mResizable; }
148 
154  void setFullscreen(bool value);
155 
159  void toggleFullscreen();
160 
165  void setWidth(int width);
166 
171  void setHeight(int height);
172 
177  void setSize(const glm::ivec2& size);
178 
183  virtual void setClearColor(const RGBAColorFloat& color) override;
184 
189  virtual const RGBAColorFloat& getClearColor() const override;
190 
195  void setPosition(const glm::ivec2& position);
196 
200  const glm::ivec2 getPosition() const;
201 
205  SDL_Window* getNativeWindow() const;
206 
210  virtual uint getNumber() const override;
211 
218  math::Rect getRect() const;
219 
224  math::Rect getRectPixels() const;
225 
229  virtual void beginRendering() override;
230 
234  virtual void endRendering() override;
235 
239  virtual VkFormat getColorFormat() const override { return mSwapchainFormat; }
240 
244  virtual VkFormat getDepthFormat() const override;
245 
249  virtual VkSampleCountFlagBits getSampleCount() const override { return mRasterizationSamples; }
250 
254  virtual bool getSampleShadingEnabled() const override { return mSampleShadingEnabled; }
255 
259  virtual ECullWindingOrder getWindingOrder() const override;
260 
264  virtual VkRenderPass getRenderPass() const override { return mRenderPass; }
265 
266  bool mSampleShading = true;
267  int mWidth = 512;
268  int mHeight = 512;
269  bool mBorderless = false;
270  bool mResizable = true;
271  bool mVisible = true;
272  EPresentationMode mMode = EPresentationMode::Immediate;
273  std::string mTitle = "";
274  RGBAColorFloat mClearColor = { 0.0f, 0.0f, 0.0f, 1.0f };
276  int mAddedSwapImages = 1;
277  bool mRestorePosition = true;
278  bool mRestoreSize = true;
279 
280  private:
281  RenderService* mRenderService = nullptr;
282  SDL_Window* mSDLWindow = nullptr;
283  VkSampleCountFlagBits mRasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
284  VkDevice mDevice = VK_NULL_HANDLE;
285  VkSurfaceKHR mSurface = VK_NULL_HANDLE;
286  VkSwapchainKHR mSwapchain = VK_NULL_HANDLE;
287  VkRenderPass mRenderPass = VK_NULL_HANDLE;
288  VkQueue mPresentQueue = VK_NULL_HANDLE;
289  VkFormat mSwapchainFormat = VK_FORMAT_UNDEFINED;
290  std::vector<VkImageView> mSwapChainImageViews;
291  std::vector<VkFramebuffer> mSwapChainFramebuffers;
292  std::vector<VkCommandBuffer> mCommandBuffers;
293  std::vector<VkSemaphore> mImageAvailableSemaphores;
294  std::vector<VkSemaphore> mRenderFinishedSemaphores;
295  std::vector<int> mImagesInFlight;
296  VkPresentModeKHR mPresentationMode = VK_PRESENT_MODE_MAILBOX_KHR;
297  ImageData mDepthImage;
298  ImageData mColorImage;
299  bool mSampleShadingEnabled = false;
300  uint32 mCurrentImageIndex = 0;
301  uint32 mSwapChainImageCount = 0;
302  bool mRecreateSwapchain = false;
303  VkSurfaceCapabilitiesKHR mSurfaceCapabilities;
304  VkExtent2D mSwapchainExtent = {0,0};
305 
312  VkCommandBuffer beginRecording();
313 
318  void endRecording();
319 
323  void handleEvent(const Event& event);
324 
328  bool getSurfaceCapabilities(utility::ErrorState& error);
329 
335  bool recreateSwapChain(utility::ErrorState& errorState);
336 
342  bool createSwapChainResources(utility::ErrorState& errorState);
343 
347  void destroySwapChainResources();
348 
352  bool validSwapchainExtent() const;
353  };
354 }
nap::uint
unsigned int uint
Definition: numeric.h:23
nap::IRenderTarget
Definition: irendertarget.h:21
nap::RenderWindow
Definition: renderwindow.h:43
nap::ERasterizationSamples::Four
@ Four
nap::RenderWindow::getRenderPass
virtual VkRenderPass getRenderPass() const override
Definition: renderwindow.h:264
nap::ERasterizationSamples
ERasterizationSamples
Definition: renderutils.h:25
nap::RGBAColor< float >
nap::ECullWindingOrder
ECullWindingOrder
Definition: materialcommon.h:30
nap::RenderWindow::getTitle
const std::string & getTitle() const
Definition: renderwindow.h:137
nap::math::Rect
Definition: rect.h:19
nap::RenderWindow::getHeight
int getHeight() const
Definition: renderwindow.h:109
nap::utility::ErrorState
Definition: errorstate.h:19
nap::RenderWindow::EPresentationMode
EPresentationMode
Definition: renderwindow.h:52
nap::Event
Definition: event.h:17
nap::RenderWindow::isResizable
bool isResizable() const
Definition: renderwindow.h:147
nap::RenderWindow::getHeightPixels
int getHeightPixels() const
Definition: renderwindow.h:115
nap::uint32
uint32_t uint32
Definition: numeric.h:20
nap::ImageData
Definition: imagedata.h:23
nap::RenderService
Definition: renderservice.h:275
nap::Core
Definition: core.h:82
nap::RenderWindow::getWidthPixels
int getWidthPixels() const
Definition: renderwindow.h:101
nap::RenderWindow::getSampleShadingEnabled
virtual bool getSampleShadingEnabled() const override
Definition: renderwindow.h:254
nap
Definition: templateapp.h:17
nap::Window
Definition: window.h:26
nap::RenderWindow::getColorFormat
virtual VkFormat getColorFormat() const override
Definition: renderwindow.h:239
nap::RenderWindow::getSampleCount
virtual VkSampleCountFlagBits getSampleCount() const override
Definition: renderwindow.h:249
nap::RenderWindow::getWidth
int getWidth() const
Definition: renderwindow.h:95