#ifndef MSP_GL_ENVIRONMENTMAP_H_
#define MSP_GL_ENVIRONMENTMAP_H_
+#include <vector>
#include "camera.h"
#include "effect.h"
#include "framebuffer.h"
-#include "matrix.h"
#include "programdata.h"
-#include "renderbuffer.h"
+#include "texture2d.h"
#include "texturecube.h"
-#include "vector.h"
namespace Msp {
namespace GL {
-class Resources;
+class Mesh;
+class Sampler;
/**
Creates a cube map texture of the surroundings of the renderable. This texture
class EnvironmentMap: public Effect
{
private:
+ struct Face
+ {
+ Framebuffer fbo;
+ Camera camera;
+ };
+
unsigned size;
Renderable &environment;
TextureCube env_tex;
- Renderbuffer depth_buf;
- Framebuffer fbo[6];
+ Texture2D depth_buf;
+ Face faces[6];
+ Vector3 fixed_position;
+ bool use_fixed_pos = false;
+
+ TextureCube irradiance;
+ const Program &irradiance_shprog;
+ Framebuffer irradiance_fbo;
+ const Program &specular_shprog;
+ std::vector<Framebuffer> specular_fbos;
+ ProgramData prefilter_shdata;
+ const Mesh &fullscreen_mesh;
+
const Sampler &sampler;
- Camera camera;
- mutable ProgramData shdata;
- bool rendered;
- unsigned update_interval;
- unsigned update_delay;
+ const Sampler &mip_sampler;
+ ProgramData shdata;
+ bool rendered = false;
+ unsigned update_interval = 1;
+ unsigned update_delay = 0;
public:
- EnvironmentMap(Resources &, unsigned size, Renderable &rend, Renderable &env);
+ EnvironmentMap(unsigned size, PixelFormat, Renderable &rend, Renderable &env);
+ EnvironmentMap(unsigned size, PixelFormat, unsigned, Renderable &rend, Renderable &env);
+
+ void set_fixed_position(const Vector3 &);
void set_depth_clip(float, float);
+
+ /** Sets the interval in frames between environment map updates. A value of
+ 0 means an update is only done when manually requested. */
void set_update_interval(unsigned);
+
+ /** Request that the environment map is updated on the next frame. */
void queue_update();
virtual void setup_frame(Renderer &);
virtual void finish_frame();
virtual void render(Renderer &, Tag = Tag()) const;
+
+ virtual void set_debug_name(const std::string &);
};
} // namespace GL