#ifndef VIEWPORT_HPP
#define VIEWPORT_HPP
#include "Camera.hpp"
#include "Constants.hpp"
#include <wren/viewport.h>
namespace wren {
class FrameBuffer;
class Overlay;
class TextureRtt;
class PostProcessingEffect;
class Viewport {
public:
static Viewport *createViewport() { return new Viewport(); }
static void deleteViewport(Viewport *viewport) { delete viewport; }
void setClearColor(const glm::vec4 &clearColor) { mClearColor = clearColor; }
void setPolygonMode(WrViewportPolygonMode polygonMode) { mPolygonMode = polygonMode; }
void setVisbilityMask(int mask) { mVisibilityMask = mask; }
void setSize(int width, int height);
void setPixelRatio(int ratio) { mPixelRatio = ratio; }
void setCamera(Camera *camera);
void setFrameBuffer(FrameBuffer *frameBuffer);
void enableShadows(bool enable) { mAreShadowsEnabled = enable; }
void enableSkybox(bool enable) { mIsSkyboxEnabled = enable; }
void enableAspectRatioSync(bool enable) { mSyncAspectRatio = enable; }
void attachOverlay(Overlay *overlay);
void detachOverlay(Overlay *overlay);
void renderOverlay(Overlay *overlay);
void addPostProcessingEffect(PostProcessingEffect *postProcessingEffect);
void removePostProcessingEffect(PostProcessingEffect *postProcessingEffect);
void setAmbientOcclusionEffect(PostProcessingEffect *postProcessingEffect) {
mAmbientOcclusionEffect = postProcessingEffect;
}
void setAntiAliasingEffect(PostProcessingEffect *postProcessingEffect) { mAntiAliasingEffect = postProcessingEffect; }
int width() const { return mWidth; }
int height() const { return mHeight; }
int pixelRatio() const { return mPixelRatio; }
bool areShadowsEnabled() const { return mAreShadowsEnabled; }
WrViewportPolygonMode polygonMode() const { return mPolygonMode; }
int visibilityMask() const { return mVisibilityMask; }
Camera *camera() const { return mCamera; }
FrameBuffer *frameBuffer() const { return mFrameBuffer; }
bool isSkyboxEnabled() const { return mIsSkyboxEnabled; }
void updateUniforms() const;
void bind() const;
void clear() const;
void finishRender() const;
void applyPostProcessing();
void applyAmbientOcclusion();
void applyAntiAliasing();
void drawOverlays();
private:
Viewport();
~Viewport();
void sortOverlays();
mutable bool mIsSizeDirty;
bool mSyncAspectRatio;
glm::vec4 mClearColor;
WrViewportPolygonMode mPolygonMode;
int mVisibilityMask;
int mWidth;
int mHeight;
int mPixelRatio;
Camera *mCamera;
FrameBuffer *mFrameBuffer;
bool mAreShadowsEnabled;
bool mIsSkyboxEnabled;
std::vector<Overlay *> mOverlays;
std::vector<PostProcessingEffect *> mPostProcessingEffects;
PostProcessingEffect *mAmbientOcclusionEffect;
PostProcessingEffect *mAntiAliasingEffect;
};
}
#endif