File Environment.cpp
File List > scene > Environment.cpp
Go to the documentation of this file
#include "Environment.h"
#include "MeshData.h"
#include "Camera.h"
#include "xdz_math.h"
Environment::Environment(const std::string& texpath)
{
o_type = GO_ENVIR;
envir_shader = RenderShader("pps/Screen", "pps/EnvirBG");
const bool is_using_HDR = texpath.substr(texpath.find("."), texpath.length()-1)==".hdr";
Texture rough_tex(texpath, is_using_HDR ? Texture::HDR_TEXTURE : Texture::RGBA_TEXTURE, GL_MIRRORED_REPEAT);
envir_IBL_diff.GenIBLDiffuseFrom(rough_tex, true);
envir_IBL_spec.GenIBLSpecularFrom(rough_tex, true);
envir_sprite.spr_type = ENVIRN_SPRITE;
envir_sprite.SetTex();
//envir_frameBuffer = FrameBuffer(AVAIL_PASSES);
o_name = "Environment." + std::to_string(GetObjectID());
envir_shader.InitShader = [&] {
envir_shader.UseShader();
envir_shader.SetValue("hdr_texture", Texture::HDR_TEXTURE);
envir_shader.SetValue("buffer_texture", Texture::BUFFER_TEXTURE + COMBINE_FB);
envir_shader.SetValue("id_texture", Texture::BUFFER_TEXTURE + ID_FB);
envir_shader.SetValue("select_texture", Texture::BUFFER_TEXTURE + MASK_FB);
envir_shader.SetValue("ID_color", xdzm::get_id_color(GetObjectID()));
envir_shader.SetValue("RAND_color", xdzm::get_random_color(GetObjectID()));
envir_shader.UnuseShader();
};
//envir_frameBuffer->UnbindFrameBuffer();
}
Environment::Environment()
{
}
void Environment::ChangeEnvirTexture(const std::string& texpath) const
{
}
void Environment::ChangeEnvirType(EnvironmentType type) const
{
}
void Environment::BindFrameBuffer() const
{
//envir_frameBuffer->BindFrameBuffer();
}
void Environment::UnbindFrameBuffer() const
{
//envir_frameBuffer->UnbindFrameBuffer();
}
void Environment::SwapFrameBuffer(FBType type)
{
envir_shader.UseShader();
envir_shader.SetValue("buffer_texture", Texture::BUFFER_TEXTURE + type);
}
void Environment::BindEnvironTexture() const
{
envir_IBL_diff.Bind(Texture::HDR_TEXTURE);
envir_IBL_spec.Bind(Texture::HDR_TEXTURE + 1);
}
void Environment::UnbindEnvironTexture() const
{
envir_IBL_diff.Unbind();
envir_IBL_spec.Unbind();
}
void Environment::RenderEnvironment(const Context& ctx)
{
const Camera* cam = dynamic_cast<const Camera*>(ctx.scene.GetActiveCamera());
envir_shader.UseShader();
//envir_frameBuffer->BindFrameBufferTex(AVAIL_PASSES);
envir_IBL_spec.Bind(Texture::HDR_TEXTURE);
//DEBUG(envir_frameBuffer->GetFBCount())
if (envir_shader.is_shader_changed)
envir_shader.InitShader();
if(cam->is_invUniform_changed || envir_shader.is_shader_changed)
envir_shader.SetValue("cam_rotM", cam->o_Transform);
if (cam->is_frustum_changed || envir_shader.is_shader_changed) {
envir_shader.SetValue("cam_fov", glm::radians(cam->cam_pers));
envir_shader.SetValue("cam_ratio", cam->cam_w / cam->cam_h);
}
MeshLib::Square->RenderObjProxy();
envir_shader.is_shader_changed = false;
}
void Environment::RenderEnvirSpr(const Context& ctx)
{
envir_sprite.RenderSprite(ctx, o_position, envir_color, GetObjectID());
}