00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_CSPLUGINCOMMON_RENDERMANAGER_HDREXPOSURE_LUMINANCE_H__
00020 #define __CS_CSPLUGINCOMMON_RENDERMANAGER_HDREXPOSURE_LUMINANCE_H__
00021
00022 #include "csgfx/textureformatstrings.h"
00023 #include "csplugincommon/rendermanager/hdrhelper.h"
00024 #include "csplugincommon/rendermanager/posteffects.h"
00025
00026 namespace CS
00027 {
00028 namespace RenderManager
00029 {
00030 namespace HDR
00031 {
00032 namespace Luminance
00033 {
00034 class CS_CRYSTALSPACE_EXPORT BaseHierarchical
00035 {
00036 protected:
00037 float colorScale;
00038
00039 const char* intermediateTextureFormat;
00040 CS::StructuredTextureFormat readbackFmt;
00041 PostEffectManager::Layer* measureLayer;
00042 HDRHelper* hdr;
00043 csRef<iGraphics3D> graphics3D;
00044 csRef<iShaderVarStringSet> svNameStringSet;
00045 csRef<iShaderManager> shaderManager;
00046
00047 csRef<iShader> computeShader1;
00048 csRef<iShader> computeShaderN;
00049 struct LuminanceComputeStage
00050 {
00051 csArray<PostEffectManager::Layer*> layers;
00052 csRef<csShaderVariable> svInput;
00053 csRef<csShaderVariable> svWeightCoeff;
00054 csRef<iTextureHandle> target;
00055 int targetW, targetH;
00056
00057 LuminanceComputeStage() {}
00058 };
00059 csArray<LuminanceComputeStage> computeStages;
00060 PostEffectManager computeFX;
00061
00062 int lastTargetW, lastTargetH;
00063 csRef<iDataBuffer> lastData;
00064 int lastW, lastH;
00065 iTextureHandle* lastMeasureTex;
00066 float lastColorScale;
00067
00068 BaseHierarchical (const char* intermediateTextureFormat,
00069 const char* outputTextureFormat) : colorScale (1.0f),
00070 intermediateTextureFormat (intermediateTextureFormat),
00071 readbackFmt (CS::TextureFormatStrings::ConvertStructured (outputTextureFormat)),
00072 measureLayer (0), hdr (0), lastMeasureTex (0) {}
00073
00075 void Initialize (iObjectRegistry* objReg,
00076 HDRHelper& hdr,
00077 const char* firstShader, const char* stepShader);
00078
00080 csPtr<iDataBuffer> GetResultData (RenderTreeBase& renderTree,
00081 iView* view, int& resultW, int& resultH, float& usedColorScale);
00082 private:
00083 bool FindBlockSize (iShader* shader, size_t pticket,
00084 const CS::Graphics::RenderMeshModes& modes,
00085 const csShaderVariableStack& stack,
00086 int maxW, int maxH,
00087 int& blockSizeX, int& blockSizeY, csRef<iShader>* usedShader);
00088 bool SetupStage (LuminanceComputeStage& stage,
00089 int inputW, int inputH, int minSize, iTextureHandle* inputTex,
00090 iShader* computeShader);
00091 void SetupStages (int targetW, int targetH,
00092 iTextureHandle* measureTex);
00093 public:
00094 float GetColorScale () const { return colorScale; }
00095 void SetColorScale (float scale) { colorScale = scale; }
00096 };
00097
00098 class CS_CRYSTALSPACE_EXPORT Average : public BaseHierarchical
00099 {
00100 public:
00101 Average() : BaseHierarchical ("argb8", "argb8") {}
00102
00103 void Initialize (iObjectRegistry* objReg,
00104 HDRHelper& hdr);
00105
00106 bool ComputeLuminance (RenderTreeBase& renderTree, iView* view,
00107 float& averageLuminance, float& maxLuminance,
00108 float& usedColorScale);
00109 };
00110
00111 class CS_CRYSTALSPACE_EXPORT LogAverage : public BaseHierarchical
00112 {
00113 public:
00114 LogAverage() : BaseHierarchical ("bgr16_f",
00115 "abgr32_f")
00116 {}
00117
00118 void Initialize (iObjectRegistry* objReg,
00119 HDRHelper& hdr);
00120
00121 bool ComputeLuminance (RenderTreeBase& renderTree, iView* view,
00122 float& averageLuminance, float& maxLuminance, float& maxComp,
00123 float& usedColorScale);
00124 };
00125 }
00126 }
00127 }
00128 }
00129
00130 #endif // __CS_CSPLUGINCOMMON_RENDERMANAGER_HDREXPOSURE_LUMINANCE_H__