csplugincommon/rendermanager/viscull.h
Go to the documentation of this file.00001 /* 00002 Copyright (C) 2007 by Marten Svanfeldt 00003 00004 This library is free software; you can redistribute it and/or 00005 modify it under the terms of the GNU Library General Public 00006 License as published by the Free Software Foundation; either 00007 version 2 of the License, or (at your option) any later version. 00008 00009 This library is distributed in the hope that it will be useful, 00010 but WITHOUT ANY WARRANTY; without even the implied warranty of 00011 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00012 Library General Public License for more details. 00013 00014 You should have received a copy of the GNU Library General Public 00015 License along with this library; if not, write to the Free 00016 Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 00017 */ 00018 00019 #ifndef __CS_CSPLUGINCOMMON_RENDERMANAGER_VISCULL_H__ 00020 #define __CS_CSPLUGINCOMMON_RENDERMANAGER_VISCULL_H__ 00021 00026 #include "csplugincommon/rendermanager/rendertree.h" 00027 #include "csplugincommon/rendermanager/renderview.h" 00028 #include "iengine/viscull.h" 00029 00030 namespace CS 00031 { 00032 namespace RenderManager 00033 { 00034 // Forward declare the functions 00035 00036 template<typename RenderTree> 00037 bool Viscull (typename RenderTree::ContextNode& context, RenderView* rw, 00038 iVisibilityCuller* culler); 00039 00040 namespace Implementation 00041 { 00046 template<typename RenderTree> 00047 class ViscullCallback : 00048 public scfImplementation1<ViscullCallback<RenderTree>, iVisibilityCullerListener> 00049 { 00050 public: 00051 //---- Types 00052 typedef RenderTree RenderTreeType; 00053 typedef typename RenderTreeType::ContextNode ContextNodeType; 00054 00055 ViscullCallback (ContextNodeType& context, RenderView* currentRenderView, 00056 const CS::Utility::MeshFilter* filter) 00057 : scfImplementation1<ViscullCallback, iVisibilityCullerListener> (this), 00058 context (context), currentRenderView (currentRenderView), 00059 sector (currentRenderView->GetThisSector()), filter (filter) 00060 {} 00061 00062 00063 virtual void ObjectVisible (iVisibilityObject *visobject, 00064 iMeshWrapper *imesh, uint32 frustum_mask) 00065 { 00066 if (!(filter && filter->IsMeshFiltered (imesh))) 00067 { 00068 // Get the meshes 00069 int numMeshes; 00070 csSectorVisibleRenderMeshes* meshList = sector->GetVisibleRenderMeshes ( 00071 numMeshes, 00072 imesh, currentRenderView, frustum_mask); 00073 00074 for (int m = 0; m < numMeshes; ++m) 00075 { 00076 // Todo: Handle static lod & draw distance 00077 csZBufMode zmode = meshList[m].imesh->GetZBufMode (); 00078 CS::Graphics::RenderPriority renderPrio = meshList[m].imesh->GetRenderPriority (); 00079 00080 #ifdef CS_DEBUG 00081 const char* const db_mesh_name = meshList[m].imesh->QueryObject()->GetName(); 00082 #endif 00083 typename RenderTreeType::MeshNode::SingleMesh sm; 00084 sm.meshWrapper = meshList[m].imesh; 00085 sm.meshObjSVs = meshList[m].imesh->GetSVContext(); 00086 sm.zmode = zmode; 00087 sm.meshFlags = meshList[m].imesh->GetFlags(); 00088 00089 // Add it to the appropriate meshnode 00090 for (int i = 0; i < meshList[m].num; ++i) 00091 { 00092 csRenderMesh* rm = meshList[m].rmeshes[i]; 00093 00094 if (rm->portal) 00095 { 00096 #ifdef CS_DEBUG 00097 typename ContextNodeType::PortalHolder h = {db_mesh_name, rm->portal, imesh}; 00098 #else 00099 typename ContextNodeType::PortalHolder h = {rm->portal, imesh}; 00100 #endif 00101 context.allPortals.Push (h); 00102 } 00103 else 00104 { 00105 context.AddRenderMesh (rm, renderPrio, sm); 00106 } 00107 } 00108 00109 00110 } 00111 } 00112 } // end objectvisible 00113 00114 virtual int GetVisibleMeshes (iMeshWrapper* mw, uint32 frustum_mask, csSectorVisibleRenderMeshes*& meshList) 00115 { 00116 if (filter && filter->IsMeshFiltered (mw)) 00117 { 00118 // Return 0 visible meshes if filtered. 00119 return 0; 00120 } 00121 00122 // Get the meshes 00123 int numMeshes; 00124 meshList = sector->GetVisibleRenderMeshes (numMeshes, mw, currentRenderView, frustum_mask); 00125 return numMeshes; 00126 } 00127 00128 00129 virtual void MarkVisible (iMeshWrapper *mw, int numMeshes, csSectorVisibleRenderMeshes*& meshList) 00130 { 00131 for (int m = 0; m < numMeshes; ++m) 00132 { 00133 csZBufMode zmode = meshList[m].imesh->GetZBufMode (); 00134 CS::Graphics::RenderPriority renderPrio = 00135 meshList[m].imesh->GetRenderPriority (); 00136 00137 #ifdef CS_DEBUG 00138 const char* const db_mesh_name = meshList[m].imesh->QueryObject()->GetName(); 00139 #endif 00140 00141 typename RenderTreeType::MeshNode::SingleMesh sm; 00142 sm.meshWrapper = meshList[m].imesh; 00143 sm.meshObjSVs = meshList[m].imesh->GetSVContext(); 00144 sm.zmode = zmode; 00145 sm.meshFlags = meshList[m].imesh->GetFlags(); 00146 00147 // Add it to the appropriate meshnode 00148 for (int i = 0; i < meshList[m].num; ++i) 00149 { 00150 csRenderMesh* rm = meshList[m].rmeshes[i]; 00151 00152 if (rm->portal) 00153 { 00154 00155 #ifdef CS_DEBUG 00156 typename ContextNodeType::PortalHolder h = {db_mesh_name, rm->portal, mw}; 00157 #else 00158 typename ContextNodeType::PortalHolder h = {rm->portal, mw}; 00159 #endif 00160 00161 context.allPortals.Push (h); 00162 } 00163 else 00164 { 00165 context.AddRenderMesh (rm, renderPrio, sm); 00166 } 00167 } 00168 } 00169 } 00170 00171 private: 00172 ContextNodeType& context; 00173 RenderView* currentRenderView; 00174 iSector* sector; 00175 const CS::Utility::MeshFilter* filter; 00176 }; 00177 } 00178 00195 template<typename RenderTree> 00196 bool Viscull (typename RenderTree::ContextNode& context, RenderView* rw, 00197 iVisibilityCuller* culler) 00198 { 00199 const CS::Utility::MeshFilter* filter = &rw->GetMeshFilter(); 00200 CS::RenderManager::Implementation::ViscullCallback<RenderTree> cb (context, rw, filter); 00201 00202 int renderW = 0, renderH = 0; 00203 context.GetTargetDimensions (renderW, renderH); 00204 culler->VisTest (rw, &cb, renderW, renderH); 00205 00206 return true; 00207 } 00208 00209 } 00210 } 00211 00212 00213 00214 #endif
Generated for Crystal Space 2.1 by doxygen 1.6.1
