From e5aa824dc2ce6d9521a041257756cee8c390a235 Mon Sep 17 00:00:00 2001 From: qw_fuku Date: Tue, 5 May 2015 23:59:23 +0900 Subject: [PATCH] =?utf8?q?3D=E3=82=AB=E3=83=BC=E3=82=BD=E3=83=AB=E5=91=A8?= =?utf8?q?=E5=9B=B2=E3=81=AE=E9=A0=82=E7=82=B9=E3=81=AE=E3=81=BF=E3=82=92?= =?utf8?q?=E8=A1=A8=E7=A4=BA=E3=81=99=E3=82=8B=E6=A9=9F=E8=83=BD=E3=82=92?= =?utf8?q?=E5=AE=9F=E8=A3=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- Src/LibQtGeoViewerCore/Cursor3D.cpp | 13 ++++-- Src/LibQtGeoViewerCore/Cursor3D.h | 6 ++- Src/LibQtGeoViewerCore/LazyDisp.h | 10 ++--- Src/LibQtGeoViewerCore/SceneMain.cpp | 29 ++++++++++++ Src/LibQtGeoViewerCore/SceneMain.h | 5 +++ Src/QtGeoViewer/FormMain.cpp | 8 ++-- Src/QtGeoViewer/GeometryRender.cpp | 71 +++++++++++++++++++++++++----- Src/QtGeoViewer/GeometryRender.h | 10 ++++- Src/QtGeoViewer/Shader/IntegrateShader.cpp | 2 +- Src/QtGeoViewer/View3D.cpp | 2 +- 10 files changed, 126 insertions(+), 30 deletions(-) diff --git a/Src/LibQtGeoViewerCore/Cursor3D.cpp b/Src/LibQtGeoViewerCore/Cursor3D.cpp index 9d0b2e9..1e9316c 100644 --- a/Src/LibQtGeoViewerCore/Cursor3D.cpp +++ b/Src/LibQtGeoViewerCore/Cursor3D.cpp @@ -20,7 +20,7 @@ Cursor3D::Cursor3D(void) ShowStrokeLen .Reset( false , "ShowStrokeLen" ); TranspStorke .Reset( false , "TranspStorke" ); - CircleClip = Cursor3DCircleClip::None; + SphereClip = SphereClipType::None; HoleRangeRatio = 0.25f; CloseFaceMBuf = NULL; @@ -68,7 +68,7 @@ bool Cursor3D::IsHoleActive(void) const if (!ShowCursor) return false; - return CircleClip == Cursor3DCircleClip::Hole; + return SphereClip == SphereClipType::Hole; } bool Cursor3D::IsHoleRevActive(void) const @@ -76,7 +76,7 @@ bool Cursor3D::IsHoleRevActive(void) const if (!ShowCursor) return false; - return CircleClip == Cursor3DCircleClip::ShowAround; + return SphereClip == SphereClipType::ShowAround; } bool Cursor3D::IsCircleClipActive(void) const @@ -84,7 +84,7 @@ bool Cursor3D::IsCircleClipActive(void) const if (!ShowCursor) return false; - return CircleClip != Cursor3DCircleClip::None; + return SphereClip != SphereClipType::None; } void Cursor3D::PushStroke(void) @@ -113,3 +113,8 @@ void Cursor3D::ClearStroke(void) { Strokes.clear(); } + +float Cursor3D::GetSphereClipLen(const lm::range3f& bbox) const +{ + return bbox.max_length() * HoleRangeRatio; +} diff --git a/Src/LibQtGeoViewerCore/Cursor3D.h b/Src/LibQtGeoViewerCore/Cursor3D.h index ef5271d..8a1972d 100644 --- a/Src/LibQtGeoViewerCore/Cursor3D.h +++ b/Src/LibQtGeoViewerCore/Cursor3D.h @@ -17,7 +17,7 @@ class MeshBuf; } -enum class Cursor3DCircleClip +enum class SphereClipType { None, Hole, @@ -83,6 +83,8 @@ public: void CutStroke(void); void ClearStroke(void); + float GetSphereClipLen(const lm::range3f& bbox) const; + public: NamedValue ShowCursor; NamedValue CursorDepth; @@ -97,7 +99,7 @@ public: NamedValue ShowStrokeLen; NamedValue TranspStorke; - Cursor3DCircleClip CircleClip; + SphereClipType SphereClip; float HoleRangeRatio; lm::vec3f CursorPos; diff --git a/Src/LibQtGeoViewerCore/LazyDisp.h b/Src/LibQtGeoViewerCore/LazyDisp.h index cd555f7..ff09ba1 100644 --- a/Src/LibQtGeoViewerCore/LazyDisp.h +++ b/Src/LibQtGeoViewerCore/LazyDisp.h @@ -22,21 +22,17 @@ public: virtual ~LazyDisp(void) { - if(m_State == BeginList) - { + if (m_State == BeginList) m_Disp->EndList(); - } } State CallOrBeginList(void) { assert(m_State == None); - if(m_State != None) - { + if (m_State != None) throw std::exception("LazyDisp::CallOrBeginList must not call twice"); - } - if(m_Disp->IsEnable()) + if (m_Disp->IsEnable()) { m_Disp->CallList(); diff --git a/Src/LibQtGeoViewerCore/SceneMain.cpp b/Src/LibQtGeoViewerCore/SceneMain.cpp index 4fa9982..e1772a2 100644 --- a/Src/LibQtGeoViewerCore/SceneMain.cpp +++ b/Src/LibQtGeoViewerCore/SceneMain.cpp @@ -528,3 +528,32 @@ int SceneMain::GetKeyframeMax(void) const return kf; } + +float SceneMain::GetCursorSphereClipLen(void) const +{ + return GetCursorSphereClipLen(GetSceneBBox()); +} + +float SceneMain::GetCursorSphereClipLen(const lm::range3f& scene_bb) const +{ + return m_Cursor3d.GetSphereClipLen(scene_bb); +} + +bool SceneMain::IsOutOfSphereClip(const lm::vec3f& v) const +{ + return IsOutOfSphereClip(GetSceneBBox(), v); +} + +bool SceneMain::IsOutOfSphereClip(const lm::range3f& scene_bb, const lm::vec3f& v) const +{ + float l = GetCursorSphereClipLen(scene_bb); + float lsq = l * l; + float dsq = (v - m_Cursor3d.CursorPos).square_length(); + + if (m_Cursor3d.SphereClip == SphereClipType::Hole) + return (lsq > dsq); + if (m_Cursor3d.SphereClip == SphereClipType::ShowAround) + return (lsq < dsq); + + return false; +} diff --git a/Src/LibQtGeoViewerCore/SceneMain.h b/Src/LibQtGeoViewerCore/SceneMain.h index 6194c2c..c53c158 100644 --- a/Src/LibQtGeoViewerCore/SceneMain.h +++ b/Src/LibQtGeoViewerCore/SceneMain.h @@ -141,6 +141,11 @@ public: int GetKeyframeMax(void) const; + float GetCursorSphereClipLen(void) const; + float GetCursorSphereClipLen(const lm::range3f& scene_bb) const; + bool IsOutOfSphereClip(const lm::vec3f& v) const; + bool IsOutOfSphereClip(const lm::range3f& scene_bb, const lm::vec3f& v) const; + private: void AddObjMeshsToSceneEachObject(const std::string& filename, lib_geo::ObjMesh& obj_mesh, std::vector& mesh_ary); void AddObjMeshsToSceneEachGroup(const std::string& filename, lib_geo::ObjMesh& obj_mesh, std::vector& mesh_ary); diff --git a/Src/QtGeoViewer/FormMain.cpp b/Src/QtGeoViewer/FormMain.cpp index 934cde7..3e8b3f1 100644 --- a/Src/QtGeoViewer/FormMain.cpp +++ b/Src/QtGeoViewer/FormMain.cpp @@ -2884,9 +2884,9 @@ void FormMain::on_checkHoleAroundCursor_clicked(bool checked) ui.checkShowOnlyAroundCursor->setChecked(false); if (checked) - m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::Hole; + m_Scene.m_Cursor3d.SphereClip = SphereClipType::Hole; else - m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::None; + m_Scene.m_Cursor3d.SphereClip = SphereClipType::None; updateView_All(); } @@ -2897,9 +2897,9 @@ void FormMain::on_checkShowOnlyAroundCursor_toggled(bool checked) ui.checkHoleAroundCursor->setChecked(false); if (checked) - m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::ShowAround; + m_Scene.m_Cursor3d.SphereClip = SphereClipType::ShowAround; else - m_Scene.m_Cursor3d.CircleClip = Cursor3DCircleClip::None; + m_Scene.m_Cursor3d.SphereClip = SphereClipType::None; updateView_All(); } diff --git a/Src/QtGeoViewer/GeometryRender.cpp b/Src/QtGeoViewer/GeometryRender.cpp index f33625e..93e203d 100644 --- a/Src/QtGeoViewer/GeometryRender.cpp +++ b/Src/QtGeoViewer/GeometryRender.cpp @@ -20,10 +20,13 @@ using namespace std; -GeometryRender::GeometryRender(MeshBuf* mbuf) +GeometryRender::GeometryRender(MeshBuf* mbuf) : + m_Mesh(mbuf), + m_Config(NULL), + m_SphereClipType(SphereClipType::None), + m_SphereClipDst(0.0f), + m_CursorPos(0, 0, 0) { - m_Mesh = mbuf; - m_Config = NULL; } GeometryRender::~GeometryRender(void) @@ -32,10 +35,11 @@ GeometryRender::~GeometryRender(void) } -void GeometryRender::InitializeRender(View3DConfig* config, ShaderLibrary* shaders) +void GeometryRender::InitializeGeoRender(View3DConfig* config, ShaderLibrary* shaders, SceneMain* scene) { m_Config = config; m_Shaders = shaders; + m_Scene = scene; m_LastConfig = *config; } @@ -663,11 +667,38 @@ void GeometryRender::DrawMeshFid(lib_geo::BaseMesh& mesh) disp_list.EndList(); } +bool GeometryRender::CheckSphereClipUpdated(void) +{ + Cursor3D& cursor = m_Scene->m_Cursor3d; + if (m_SphereClipType != cursor.SphereClip) + return true; + if (m_SphereClipDst != m_Scene->GetCursorSphereClipLen()) + return true; + if (m_CursorPos != cursor.CursorPos) + return true; + return false; +} + +void GeometryRender::UpdateSphereClipCache(void) +{ + Cursor3D& cursor = m_Scene->m_Cursor3d; + m_SphereClipType = cursor.SphereClip; + m_SphereClipDst = m_Scene->GetCursorSphereClipLen(); + m_CursorPos = cursor.CursorPos; +} + void GeometryRender::DrawVert(const lib_geo::BaseMesh& mesh) { glPointSize((float)m_Config->m_PointSize); - glColor3d(0,1,1); + glColor3d(0, 1, 1); + + if (CheckSphereClipUpdated()) + { + UpdateSphereClipCache(); + m_DispList_Vert.ReleaseList(); + m_DispList_Vid.ReleaseList(); + } DrawVertPoint(mesh); @@ -684,15 +715,25 @@ void GeometryRender::DrawVert(const lib_geo::BaseMesh& mesh) void GeometryRender::DrawVertPoint(const lib_geo::BaseMesh& mesh) { LazyDisp ld(m_DispList_Vert); - if (ld.CallOrBeginList() != LazyDisp::Called) + if (ld.CallOrBeginList() == LazyDisp::Called) + return; + + lm::range3f scene_bb; + if (m_Scene->m_Cursor3d.IsCircleClipActive()) + scene_bb = m_Scene->GetSceneBBox(); + + glBegin(GL_POINTS); + for (const lm::vec3f& v : mesh.m_Verts) { - glBegin(GL_POINTS); - for (const lm::vec3f& v : mesh.m_Verts) + if (m_Scene->m_Cursor3d.IsCircleClipActive()) { - glVertex3fv(v.v()); + if (m_Scene->IsOutOfSphereClip(scene_bb, v)) + continue; } - glEnd(); + + glVertex3fv(v.v()); } + glEnd(); } void GeometryRender::DrawVertVid(MeshBuf& mbuf) @@ -706,12 +747,22 @@ void GeometryRender::DrawVertVid(MeshBuf& mbuf) if (ld.CallOrBeginList() == LazyDisp::Called) return; + lm::range3f scene_bb; + if (m_Scene->m_Cursor3d.IsCircleClipActive()) + scene_bb = m_Scene->GetSceneBBox(); + for (size_t i = 0; i < m.m_Verts.size(); ++i) { const lm::vec3f& v0 = m.m_Verts[i]; const lm::vec3f& n = m.m_VertAdj[i].m_NormalAvg; const lm::vec3f& v1 = v0 + n * m_Config->m_IndexLineLen; + if (m_Scene->m_Cursor3d.IsCircleClipActive()) + { + if (m_Scene->IsOutOfSphereClip(scene_bb, v0)) + continue; + } + std::ostringstream s; s << " " << i; diff --git a/Src/QtGeoViewer/GeometryRender.h b/Src/QtGeoViewer/GeometryRender.h index 3a93df5..1c2b79c 100644 --- a/Src/QtGeoViewer/GeometryRender.h +++ b/Src/QtGeoViewer/GeometryRender.h @@ -26,7 +26,7 @@ public: GeometryRender(MeshBuf* mbuf); virtual ~GeometryRender(void); - void InitializeRender(View3DConfig* config, ShaderLibrary* shaders); + void InitializeGeoRender(View3DConfig* config, ShaderLibrary* shaders, SceneMain* scene); void ReleaseAccBuffer(void); @@ -79,7 +79,11 @@ private: GeometryRender(const GeometryRender&) {} void operator=(const GeometryRender&) {} + bool CheckSphereClipUpdated(void); + void UpdateSphereClipCache(void); + private: + SceneMain* m_Scene; MeshBuf* m_Mesh; View3DConfig* m_Config; ShaderLibrary* m_Shaders; @@ -91,4 +95,8 @@ private: lib_gl::GlDisplayList m_DispList_Fid; std::map m_FaceGroupVBO; + + SphereClipType m_SphereClipType; + float m_SphereClipDst; + lm::vec3f m_CursorPos; }; diff --git a/Src/QtGeoViewer/Shader/IntegrateShader.cpp b/Src/QtGeoViewer/Shader/IntegrateShader.cpp index 0a89815..95736a3 100644 --- a/Src/QtGeoViewer/Shader/IntegrateShader.cpp +++ b/Src/QtGeoViewer/Shader/IntegrateShader.cpp @@ -97,7 +97,7 @@ void IntegrateShader::BeginShader(void) glUniform1i(m_EnableHoleRev, cursor.IsHoleRevActive()); if (cursor.IsCircleClipActive()) { - float hole_range = scene->GetSceneBBox().max_length() * cursor.HoleRangeRatio; + float hole_range = scene->GetCursorSphereClipLen(); lm::vec3f cp = cursor.CursorPos; glUniform3f(m_HolePos, cp.x, cp.y, cp.z); glUniform1f(m_HoleRange, hole_range); diff --git a/Src/QtGeoViewer/View3D.cpp b/Src/QtGeoViewer/View3D.cpp index 6945f65..019d416 100644 --- a/Src/QtGeoViewer/View3D.cpp +++ b/Src/QtGeoViewer/View3D.cpp @@ -2355,7 +2355,7 @@ GeometryRender& View3D::GetRender(MeshBuf* mbuf) const MeshBuf* cm = const_cast(mbuf); rm.insert(cm, new_render); - new_render->InitializeRender(&m_Config, &m_ShaderLib); + new_render->InitializeGeoRender(&m_Config, &m_ShaderLib, m_Scene); return *new_render; } -- 2.11.0