Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019 #ifndef __CS_CSPLUGINCOMMON_RENDERMANAGER_AUTOFX_FRAMEBUFFERTEX_H__
00020 #define __CS_CSPLUGINCOMMON_RENDERMANAGER_AUTOFX_FRAMEBUFFERTEX_H__
00021
00026
00027 #include "csgfx/shadervarblockalloc.h"
00028
00029 #include "csplugincommon/rendermanager/posteffects.h"
00030 #include "csplugincommon/rendermanager/rendertree.h"
00031 #include "csplugincommon/rendermanager/texturecache.h"
00032
00033 namespace CS
00034 {
00035 namespace RenderManager
00036 {
00037 namespace AutoFX
00038 {
00044 class FramebufferTex_Base
00045 {
00046 public:
00048 enum { svUserFlags = iShader::svuTextures };
00049
00055 class CS_CRYSTALSPACE_EXPORT PersistentData
00056 {
00057 csRef<iTextureHandle> framebufferTex[rtaNumAttachments];
00058
00059 TextureCacheT<CS::Utility::ResourceCache::ReuseAlways> texCacheColor;
00060 TextureCacheT<CS::Utility::ResourceCache::ReuseAlways> texCacheDepth;
00061 public:
00062 csShaderVarBlockAlloc<csBlockAllocatorDisposeLeaky<csShaderVariable> >
00063 svAlloc;
00064
00065
00066 csRefArray<csShaderVariable> svKeeper;
00067
00068 CS::ShaderVarStringID svTexFramebuffer[rtaNumAttachments];
00069 CS::ShaderVarStringID svFramebufferCoordXform;
00070
00072 PersistentData();
00073
00081 void Initialize (iObjectRegistry* objReg,
00082 PostEffectManager* postEffects);
00083
00084 iTextureHandle* GetFramebufferTex (size_t n, int width, int height);
00085
00090 void UpdateNewFrame ();
00091 };
00092
00093 FramebufferTex_Base (PersistentData& persist) : persist (persist)
00094 {}
00095 protected:
00096 PersistentData& persist;
00097 };
00098
00130 template<typename RenderTree>
00131 class FramebufferTex : public FramebufferTex_Base
00132 {
00133 public:
00134 FramebufferTex (PersistentData& persist) :
00135 FramebufferTex_Base (persist)
00136 {}
00137
00143 void operator() (typename RenderTree::MeshNode* node,
00144 size_t layer,
00145 typename RenderTree::MeshNode::SingleMesh& mesh,
00146 const csBitArray& names)
00147 {
00148 size_t n = 0;
00149 int renderW = -1, renderH;
00150
00151 typename RenderTree::ContextNode& context = node->GetOwner();
00152 csShaderVariableStack localStack;
00153 context.svArrays.SetupSVStack (localStack, layer, mesh.contextLocalId);
00154
00155 csRef<csShaderVariable> svFBCoordXform;
00156 for (size_t i = 0; i < rtaNumAttachments; i++)
00157 {
00158 CS::ShaderVarStringID svName = persist.svTexFramebuffer[i];
00159 if (names.IsBitSetTolerant (svName))
00160 {
00161 if (renderW < 0)
00162 {
00163 renderW = renderH = 512;
00164 context.GetTargetDimensions (renderW, renderH);
00165 }
00166 mesh.preCopyAttachments[n] = (csRenderTargetAttachment)i;
00167 iTextureHandle* tex = persist.GetFramebufferTex (i, renderW, renderH);
00168 mesh.preCopyTextures[n] = tex;
00169
00170 if (!svFBCoordXform.IsValid())
00171 {
00172 svFBCoordXform.AttachNew (new csShaderVariable (
00173 persist.svFramebufferCoordXform));
00174
00175 if (tex->GetTextureType() == iTextureHandle::texTypeRect)
00176 {
00177 svFBCoordXform->SetValue (
00178 csVector4 (0.5f*renderW, 0.5f*renderH,
00179 0.5f*renderW, 0.5f*renderH));
00180 }
00181 else
00182 {
00183 int txt_w, txt_h;
00184 tex->GetRendererDimensions (txt_w, txt_h);
00185 svFBCoordXform->SetValue (
00186 csVector4 (0.5f*renderW/float (txt_w), 0.5f*renderH/float (txt_h),
00187 0.5f, 0.5f));
00188 }
00189
00190 persist.svKeeper.Push (svFBCoordXform);
00191 localStack[persist.svFramebufferCoordXform] = svFBCoordXform;
00192 }
00193
00194 csRef<csShaderVariable> svFramebufferTex;
00195 svFramebufferTex.AttachNew (new csShaderVariable (svName));
00196 persist.svKeeper.Push (svFramebufferTex);
00197 svFramebufferTex->SetValue (tex);
00198 localStack[svName] = svFramebufferTex;
00199
00200 n++;
00201 }
00202 }
00203 mesh.preCopyNum = n;
00204 }
00205 };
00206
00207 }
00208 }
00209 }
00210
00211 #endif // __CS_CSPLUGINCOMMON_RENDERMANAGER_AUTOFX_FRAMEBUFFERTEX_H__