00001 #ifndef GRAPHIC_MESH_
00002 #define GRAPHIC_MESH_
00003
00004 #include <sstream>
00005 #include <string>
00006 #include <vector>
00007 #include <memory>
00008 #include <algorithm>
00009 #include <array>
00010 #include <string.h>
00011 #include "defs.h"
00012 #include "Enums.h"
00013 #include "RenderParams.h"
00014 #include "Matrix.h"
00015 #include "MathHelper.h"
00016 #include "fv_inc.h"
00017 #include "fv_txt_utls.h"
00018 #include "Mesh.h"
00019 #include "Field.h"
00020 #include "Light.h"
00021 #include "Shader.h"
00022 #include"ViewManager.h"
00023 #include "GLRenderBase.h"
00024
00025 namespace FemViewer {
00026
00027 enum {
00028 EDGE_RENDERER,
00029 TRIANGLE_RENDERER,
00030 TRAINGLE_STRIP_RENDERER,
00031 };
00032
00033
00034
00035 class GraphicsSettings;
00036
00037 template<>
00038 class RenderObject<TypeOfRenderer::Wireframe> : public GLRenderBase {
00039
00040 public:
00041 RenderObject();
00042 ~RenderObject();
00043
00044 bool Create(void* arg_ptr);
00045 bool IsEnabled() const { return m_dirty; }
00046
00047 protected:
00048 virtual void DoSetup(const GraphicsSettings* settings);
00049 virtual void DoRender(RenderParams* rparams);
00050
00051 private:
00052 RenderObject(const RenderObject&);
00053 RenderObject& operator=(const RenderObject&);
00054
00055 GLShaderProgram m_program;
00056 GLuint m_dispLists[2];
00057
00058 bool m_dirty;
00059 };
00060
00061 template<>
00062 class RenderObject<TypeOfRenderer::WireframeSlice> : public GLRenderBase {
00063
00064 public:
00065 RenderObject(const std::vector<CutPlane>& cuts);
00066 ~RenderObject();
00067
00068 bool Create(void* arg_ptr);
00069 bool IsEnabled() const { return m_dirty; }
00070
00071 protected:
00072 virtual void DoSetup(const GraphicsSettings* settings);
00073 virtual void DoRender(RenderParams* rparams);
00074
00075 private:
00076 GLShaderProgram m_program;
00077 const std::vector<CutPlane>& m_cut_planes;
00078 std::vector<GLsizei> m_cutted_counts;
00079 std::vector<int64_t> m_cutted_addresses;
00080 GLuint m_dispLists[2];
00081
00082 std::vector<Vertex> m_vertices;
00083 std::vector<Origin> m_origins;
00084
00085 bool m_dirty;
00086
00087 };
00088
00089
00090 template<>
00091 class RenderObject<TypeOfRenderer::ColorMap> : public GLRenderBase {
00092
00093 public:
00094 RenderObject();
00095 ~RenderObject();
00096
00097 bool Create(void* arg_ptr);
00098 bool IsEnabled() const { return m_dirty; }
00099
00100 protected:
00101 virtual void DoSetup(const GraphicsSettings* settings);
00102 virtual void DoRender(RenderParams* rparams);
00103
00104 private:
00105 GLShaderProgram m_program;
00106 std::vector<GLsizei> m_counts;
00107 std::vector<int64_t> m_addresses;
00108 GLuint m_dispLists[2];
00109
00110 bool m_dirty;
00111 };
00112
00113
00114
00115 template<>
00116 class RenderObject<TypeOfRenderer::ColorMapSlice> : public GLRenderBase {
00117
00118 public:
00119 RenderObject(const std::vector<CutPlane>& cuts);
00120 ~RenderObject();
00121
00122
00123 bool Create(void* arg_ptr);
00124 bool IsEnabled() const { return m_dirty; }
00125
00126 protected:
00127 virtual void DoSetup(const GraphicsSettings* settings);
00128 virtual void DoRender(RenderParams* rparams);
00129
00130 private:
00131 GLShaderProgram m_program;
00132 const std::vector<CutPlane>& m_cut_planes;
00133 GLuint m_dispLists[2];
00134 bool m_dirty;
00135
00136 };
00137
00138 template<>
00139 class RenderObject<TypeOfRenderer::ColorMapStd> : public GLRenderBase {
00140
00141 public:
00142 RenderObject();
00143 ~RenderObject();
00144
00145 bool Create(void* arg_ptr);
00146 bool IsEnabled() const { return m_dirty; }
00147
00148 protected:
00149 virtual void DoSetup(const GraphicsSettings* settings);
00150 virtual void DoRender(RenderParams* rparams);
00151 private:
00152 GLShaderProgram m_program;
00153 int m_num_tri_faces;
00154 GLuint m_dispLists[2];
00155 bool m_dirty;
00156
00157 };
00158
00159
00160 template<>
00161 class RenderObject<TypeOfRenderer::ColorMapStdSlice> : public GLRenderBase {
00162
00163 public:
00164 RenderObject(const std::vector<CutPlane>& cuts);
00165 ~RenderObject();
00166
00167 bool Create(void* arg_ptr);
00168 bool IsEnabled() const { return m_dirty; }
00169
00170 protected:
00171 virtual void DoSetup(const GraphicsSettings* settings);
00172 virtual void DoRender(RenderParams* rparams);
00173 private:
00174 GLShaderProgram m_program;
00175 const std::vector<CutPlane>& m_cut_planes;
00176 GLuint m_dispLists[2];
00177 bool m_dirty;
00178 };
00179
00180 enum RenderCore {
00181 CORE_GL = 0,
00182 CORE_OPENCL
00183 };
00184
00185
00186 template< typename TCore >
00187 class RenderManager;
00188
00189 template< typename TCore>
00190 RenderManager<TCore>& RenderManagerInst(void)
00191 {
00192 static RenderManager<TCore> render_mgr;
00193 return render_mgr;
00194 }
00195
00196 template< typename TCore >
00197 using RenderCaller = void (RenderManager<TCore>::*)(RenderParams*);
00198
00199
00200 template< typename TCore >
00201 class RenderManager
00202 {
00203 friend RenderManager<TCore>& RenderManagerInst<>(void);
00204
00205 typedef std::unique_ptr<GLRenderBase> Hnd2Render;
00206 typedef std::array<Hnd2Render,NUM_DRAWS> arRenders;
00207 typedef arRenders::iterator itRenders;
00208
00209 typedef enum {
00210 mesh_items = 0,
00211 field_items,
00212 idlle,
00213 num_items,
00214 } render_type_index;
00215
00216 public:
00217 ~RenderManager(void);
00218
00219 private:
00220
00221 RenderManager();
00222
00223 RenderManager(const RenderManager&);
00224 RenderManager& operator=(const RenderManager&);
00225
00226
00227 arRenders m_renders;
00228 GLuint m_uboID;
00229 int m_currMethodId;
00230 Light& m_light;
00231 RenderCaller<TCore> m_renderCall;
00232 bool m_needSetup;
00233
00234 public:
00235 void Setup();
00236 void Update(BaseParams* pParams);
00237 void SetUniformParams(BaseParams* params);
00238 void SetUniformMatrix(GLfloat* matrix,const int type);
00239 void SetMatrix(GLfloat matrix[32]);
00240 void AddObject2Render(int objType,const std::vector<CutPlane>* pCutPlanes=nullptr);
00241 bool InitFromMeshData(Mesh* pMesh,std::vector<CutPlane>* pCutPlanes=nullptr);
00242 bool InitFromFieldData(Field* pField,std::vector<CutPlane>* pCutPlanes=nullptr);
00243
00244 bool IsObjectInitialized(std::size_t objType) const {
00245 return (m_renders.at(objType) ? m_renders.at(objType)->IsEnabled() : false);
00246 }
00247 void SetObjectVisibility(std::size_t objType, bool flag) { m_renders.at(objType)->SetVisible(true); }
00248
00249 void Render(RenderParams* pParams);
00250 private:
00251 void RenderColorMap(RenderParams* pParams);
00252 void RenderWireframe(RenderParams* pParams);
00253 void RenderIdle(RenderParams* pParams);
00254 public:
00255 void Clear();
00256
00257 };
00258
00259
00260 template< typename TCore >
00261 RenderManager<TCore>::RenderManager()
00262 : m_renders()
00263 , m_uboID(0)
00264 , m_currMethodId(field_items)
00265 , m_light(ViewManagerInst().GetSettings()->DirectionalLight)
00266 , m_renderCall(nullptr)
00267 , m_needSetup(true)
00268 {
00269
00270
00271 size_t size_bytes = sizeof(BaseParams);
00272 m_uboID = createBuffer(NULL, size_bytes, GL_UNIFORM_BUFFER, GL_STATIC_DRAW);
00273 if (m_uboID == 0) throw fv_exception("Can't allocate OpenGL memory for uniform parameters!");
00274 glBindBufferRange(GL_UNIFORM_BUFFER, GLShaderProgram::ParametersBlockIndex, m_uboID, 0, size_bytes);
00275 }
00276
00277 template< typename TCore >
00278 RenderManager<TCore>::~RenderManager()
00279 {
00280
00281 glBindBuffer(GL_UNIFORM_BUFFER, 0);
00282 if (m_uboID != 0) {
00283 glDeleteBuffers(1,&m_uboID);
00284 }
00285
00286 }
00287
00288 template< typename TCore >
00289 void RenderManager<TCore>::Setup()
00290 {
00291 m_needSetup = true;
00292 GraphicsSettings* settings_ptr = ViewManagerInst().GetSettings();
00293 for(itRenders it=m_renders.begin();it != m_renders.end();++it)
00294 {
00295 if (*it) (*it)->Setup(settings_ptr);
00296 }
00297 }
00298
00299 template< typename TCore >
00300 void RenderManager<TCore>::Update(BaseParams* pParams)
00301 {
00302
00303
00304 if (pParams == nullptr) return;
00305
00306 ViewManager& vm = ViewManagerInst();
00307 SetMatrix(pParams->proj);
00308
00309
00310 pParams->edges_on = vm.GetSettings()->bEdgeOn;
00311 pParams->isolines_on = vm.GetSettings()->bIsovalueLineOn;
00312
00313
00314 pParams->num_breaks = vm.GetLegend().PackValuesIntoArray<float>(
00315 pParams->iso_values,MAX_ISO_VALUES);
00316
00317
00318
00319
00320 int i;
00321 for (i=0;i<3;i++) pParams->light_intensity[i] = m_light.DiffuseIntensity()[i];
00322 pParams->light_intensity[i] = 1.0f;
00323
00324 for (i=0;i<3;i++) pParams->light_ambient[i] = m_light.AmbientIntensity()[i];
00325 pParams->light_ambient[i] = 1.0f;
00326
00327
00328 glBindBuffer(GL_UNIFORM_BUFFER, m_uboID);
00329 GLintptr offset = static_cast<GLintptr>(32*sizeof(GLfloat));
00330 GLsizeiptr size = static_cast<GLsizeiptr>(sizeof(BaseParams)-offset);
00331
00332 glBufferSubData(GL_UNIFORM_BUFFER, offset, size,reinterpret_cast<const GLvoid*>(pParams->wireframe_col));
00333 glBindBuffer(GL_UNIFORM_BUFFER, 0);
00334
00335 if (vm.GetSettings()->bShadingOn) {
00336 m_renderCall = &RenderManager::RenderColorMap;
00337 }
00338 else if (vm.GetSettings()->bEdgeOn) {
00339 m_renderCall = &RenderManager::RenderWireframe;
00340 }
00341 else {
00342 m_renderCall = &RenderManager::RenderIdle;
00343 }
00344
00345 FV_CHECK_ERROR_GL();
00346 }
00347
00348 template< typename TCore >
00349 void RenderManager<TCore>::SetUniformParams(BaseParams* params)
00350 {
00351
00352
00353
00354
00355
00356
00357
00358
00359
00360 }
00361
00362 template< typename TCore >
00363 void RenderManager<TCore>::SetUniformMatrix(GLfloat* pData,const int type)
00364 {
00365
00366
00367
00368
00369
00370
00371
00372
00373 }
00374
00375 template< typename TCore >
00376 void RenderManager<TCore>::SetMatrix(GLfloat matrices[32])
00377 {
00378 if (m_uboID == 0) return;
00379
00380 glGetFloatv(GL_PROJECTION_MATRIX, &matrices[0]);
00381 glGetFloatv(GL_MODELVIEW_MATRIX, &matrices[16]);
00382
00383 glBindBuffer(GL_UNIFORM_BUFFER, m_uboID);
00384 glBufferSubData(GL_UNIFORM_BUFFER, 0, 32*sizeof(GLfloat), reinterpret_cast<const GLvoid*>(matrices));
00385 glBindBuffer(GL_UNIFORM_BUFFER, 0);
00386 }
00387
00388
00389
00390 template< typename TCore >
00391 bool RenderManager<TCore>::InitFromMeshData(Mesh* pMesh,std::vector<CutPlane>* pCutPlanes)
00392 {
00393
00394 if (!pMesh) return false;
00395
00396
00397 int type = (pCutPlanes != nullptr ? WireframeSlice : Wireframe);
00398
00399
00400 AddObject2Render(type,pCutPlanes);
00401
00402
00403
00404
00405 if (m_renders.at(type)->IsEnabled()) m_renders.at(type)->Clear();
00406 m_renders.at(type)->Create(pMesh);
00407 m_renders.at(type)->SetVisible(true);
00408 return true;
00409 }
00410
00411
00412 template< typename TCore >
00413 bool RenderManager<TCore>::InitFromFieldData(Field* pField,std::vector<CutPlane>* pCutPlanes)
00414 {
00415
00416 if (!pField) return false;
00417
00418
00419 int type = (pField->GetApproximationType() == FieldDG ? ColorMap : ColorMapStd);
00420 int index = COLORMAP_GL;
00421
00422 if (pCutPlanes) { type++; index = COLORMAP_CUTS_GL; }
00423
00424
00425 AddObject2Render(type,pCutPlanes);
00426
00427
00428
00429 if (m_renders[index]->IsEnabled()) m_renders[index]->Clear();
00430 m_renders[index]->Create(pField);
00431 m_renders[index]->SetVisible(true);
00432
00433 return true;
00434 }
00435
00436
00437 template< typename TCore >
00438 void RenderManager<TCore>::Render(RenderParams* pParams)
00439 {
00440
00441 static Matrixf mat;
00442
00443
00444
00445
00446
00447 SetMatrix(pParams->sShaderParams.proj);
00448
00449 (this->*m_renderCall)(pParams);
00450
00451 glBindVertexArray(0);
00452 glUseProgram(0);
00453
00454
00455
00456
00457
00458
00459
00460
00461
00462
00463 }
00464
00465 template< typename TCore >
00466 void RenderManager<TCore>::RenderColorMap(RenderParams* pParams)
00467 {
00468 static Matrixf mat;
00469
00470 if (m_light.Type() == Light::Camera) {
00471 pParams->cLight.Position() = mat * m_light.Position();
00472 }
00473
00474 if (pParams->bDrawCutted) {
00475 m_renders[COLORMAP_CUTS_GL]->Render(pParams);
00476 }
00477 else {
00478
00479 m_renders[COLORMAP_GL]->Render(pParams);
00480 }
00481 }
00482
00483 template< typename TCore >
00484 void RenderManager<TCore>::RenderWireframe(RenderParams* pParams)
00485 {
00486 if (pParams->bDrawCutted) {
00487 m_renders[WIREFRAME_CUTS_GL]->Render(pParams);
00488 }
00489 else {
00490 m_renders[WIREFRAME_GL]->Render(pParams);
00491 }
00492 }
00493
00494 template< typename TCore >
00495 void RenderManager<TCore>::RenderIdle(RenderParams* pParams)
00496 {
00497 ;
00498 }
00499
00500
00501 template< typename TCore >
00502 void RenderManager<TCore>::Clear()
00503 {
00504
00505
00506
00507 for (auto& it : m_renders) it.reset();
00508
00509 m_renderCall = &RenderManager::RenderIdle;
00510 m_needSetup = false;
00511 }
00512
00513
00514
00515 template< typename TCore >
00516 void RenderManager<TCore>::AddObject2Render(int objType,const std::vector<CutPlane>* cuts_ptr)
00517 {
00518 int index = -1;
00519 switch (objType) {
00520 case Wireframe: index = WIREFRAME_GL; break;
00521 case WireframeSlice: index = WIREFRAME_CUTS_GL; break;
00522 case ColorMap:
00523 case ColorMapStd: index = COLORMAP_GL; break;
00524 case ColorMapSlice:
00525 case ColorMapStdSlice: index = COLORMAP_CUTS_GL; break;
00526 }
00527
00528 if (index < 0) throw fv_exception("Failed to add unknown type of renderer!");
00529
00530 if (m_renders.at(index)) {
00531
00532 }
00533 else {
00534 switch (objType) {
00535 case Wireframe:
00536
00537 m_renders[WIREFRAME_GL].reset(new RenderObject<Wireframe>()); break;
00538 case WireframeSlice:
00539
00540 m_renders[WIREFRAME_CUTS_GL].reset(new RenderObject<WireframeSlice>(*cuts_ptr)); break;
00541 case ColorMap:
00542
00543 m_renders[COLORMAP_GL].reset(new RenderObject<ColorMap>()); break;
00544 case ColorMapStd:
00545
00546 m_renders[COLORMAP_GL].reset(new RenderObject<ColorMapStd>()); break;
00547 case ColorMapSlice:
00548
00549 m_renders[COLORMAP_CUTS_GL].reset(new RenderObject<ColorMapSlice>(*cuts_ptr)); break;
00550 case ColorMapStdSlice:
00551
00552 m_renders[COLORMAP_CUTS_GL].reset(new RenderObject<ColorMapStdSlice>(*cuts_ptr)); break;
00553 default:
00554 assert(!"uknown render type");
00555 }
00556 }
00557
00558
00559
00560
00561 }
00562
00563
00564
00565
00566
00567
00568
00569
00570
00571
00572
00573
00574
00575 }
00576
00577 #endif