X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;ds=sidebyside;f=source%2Feffects%2Fenvironmentmap.cpp;h=6fb0e5c3b314656dca8361dc9b54544969c98c68;hb=38712d8ecc57d043a2419ffbaeeb57f7a6586f14;hp=315390b1ca81664c47a2a5c940ef445ee94faa97;hpb=f19366d32cc29287a2730cfba90893e407754081;p=libs%2Fgl.git diff --git a/source/effects/environmentmap.cpp b/source/effects/environmentmap.cpp index 315390b1..6fb0e5c3 100644 --- a/source/effects/environmentmap.cpp +++ b/source/effects/environmentmap.cpp @@ -17,6 +17,7 @@ EnvironmentMap::EnvironmentMap(unsigned s, PixelFormat f, Renderable &r, Rendera EnvironmentMap::EnvironmentMap(unsigned s, PixelFormat f, unsigned l, Renderable &r, Renderable &e): Effect(r), + size(s), environment(e), irradiance_shprog(Resources::get_global().get("_envmap_irradiance.glsl.shader")), specular_shprog(Resources::get_global().get("_envmap_specular.glsl.shader")), @@ -27,11 +28,6 @@ EnvironmentMap::EnvironmentMap(unsigned s, PixelFormat f, unsigned l, Renderable if(!l || (1U<<(l-1))>=s) throw invalid_argument("EnvironmentMap::EnvironmentMap"); - size = s; - rendered = false; - update_interval = 1; - update_delay = 0; - env_tex.storage(f, size, l); depth_buf.storage(DEPTH_COMPONENT32F, size, size, 1); for(unsigned i=0; i<6; ++i) @@ -79,6 +75,12 @@ EnvironmentMap::EnvironmentMap(unsigned s, PixelFormat f, unsigned l, Renderable shdata.uniform("env_world_matrix", LinAl::SquareMatrix::identity()); } +void EnvironmentMap::set_fixed_position(const Vector3 &p) +{ + fixed_position = p; + use_fixed_pos = true; +} + void EnvironmentMap::set_depth_clip(float n, float f) { for(unsigned i=0; i<6; ++i) @@ -113,16 +115,22 @@ void EnvironmentMap::setup_frame(Renderer &renderer) update_delay = update_interval-1; environment.setup_frame(renderer); - const Matrix *matrix = renderable.get_matrix(); - if(!matrix) - return; + Vector3 center; + if(use_fixed_pos) + center = fixed_position; + else + { + const Matrix *matrix = renderable.get_matrix(); + if(!matrix) + return; + + center = matrix->column(3).slice<3>(0); + } Renderer::Push push(renderer); Renderer::Exclude exclude1(renderer, renderable); Renderer::Exclude exclude2(renderer, *this); - Vector3 center = matrix->column(3).slice<3>(0); - for(unsigned i=0; i<6; ++i) { faces[i].camera.set_position(center);