/* * OpenClonk, http://www.openclonk.org * * Copyright (c) 2014-2016, The OpenClonk Team and contributors * * Distributed under the terms of the ISC license; see accompanying file * "COPYING" for details. * * "Clonk" is a registered trademark of Matthes Bender, used with permission. * See accompanying file "TRADEMARK" for details. * * To redistribute this file separately, substitute the full license texts * for the above references. */ #ifndef C4FOW_H #define C4FOW_H #include "C4ForbidLibraryCompilation.h" #include "graphics/C4Surface.h" #include "graphics/C4FacetEx.h" #include "lib/C4Rect.h" #include "object/C4Object.h" #include "landscape/fow/C4FoWLight.h" #include "landscape/fow/C4FoWAmbient.h" #include "graphics/C4Shader.h" /** Simple transformation class which allows translation and scales in x and y. * This is typically used to initialize shader uniforms to transform fragment * coordinates to some texture coordinates (e.g. landscape coordinates or * light texture coordinates). */ class C4FragTransform { public: C4FragTransform(): x(1.0f), y(1.0f), x0(0.0f), y0(0.0f) {} // Multiplies from left inline void Translate(float dx, float dy) { x0 += dx; y0 += dy; } // Multiplies from left inline void Scale(float sx, float sy) { x *= sx; y *= sy; x0 *= sx; y0 *= sy; } inline void Get2x3(float transform[6]) { transform[0] = x; transform[1] = 0.f; transform[2] = x0; transform[3] = 0.f; transform[4] = y; transform[5] = y0; } private: float x, y; float x0, y0; }; enum C4FoWFramebufShaderUniforms { C4FoWFSU_ProjectionMatrix, // projection matrix C4FoWFSU_Texture, // source texture C4FoWFSU_Count }; enum C4FoWFramebufShaderAttributes { C4FoWFSA_Position, C4FoWFSA_TexCoord, C4FoWFSA_Count }; enum C4FoWRenderShaderUniforms { C4FoWRSU_ProjectionMatrix, // projection matrix C4FoWRSU_VertexOffset, // offset applied to vertex (TODO: could be encoded in projection matrix) C4FoWRSU_LightSourcePosition, // position of the light source (in same coordinates as C4FoWRSA_Position passed into the shader) C4FoWRSU_Count }; enum C4FoWRenderShaderAttributes { C4FoWRSA_Position, C4FoWRSA_Color, C4FoWRSA_Count }; /** This class holds all lights for the objects. It forwards the update, invalidation and render calls each to the lights. */ class C4FoW { public: C4FoW(); ~C4FoW(); private: /** linked list of all lights */ class C4FoWLight *pLights; /** linked list of all dead light objects to be deleted on next render pass*/ class C4FoWLight *deleted_lights; public: C4FoWAmbient Ambient; // Shader to use for updating the frame buffer C4Shader *GetFramebufShader(); // Shader to use for rendering the lights C4Shader *GetRenderShader(); // Shader to use for rendering the lights C4Shader *GetDirectionalRenderShader(); void ClearDeletedLights(); /** Updates the view range of the given object in its associated light or create a new light if none exists yet. */ void Add(C4Object *pObj); /** Removes the light associated with the given object, if any */ void Remove(C4Object *pObj); /** Update all light beams within the given rectangle */ void Update(C4Rect r, C4Player *player); /** Triggers the recalculation of all light beams within the given rectangle because the landscape changed. */ void Invalidate(C4Rect r); void Render(class C4FoWRegion *pRegion, const C4TargetFacet *pOnScreen, C4Player *pPlr, const StdProjectionMatrix& projectionMatrix); private: #ifndef USE_CONSOLE // Shader for updating the frame buffer C4Shader FramebufShader; C4Shader RenderShader; C4Shader DirectionalRenderShader; #endif }; #endif // C4FOW_H