OSDN Git Service

ピッキング処理の効率化
authorqw_fuku <fkhideaki@gmail.com>
Sun, 6 Mar 2016 09:23:25 +0000 (18:23 +0900)
committerqw_fuku <fkhideaki@gmail.com>
Sun, 6 Mar 2016 09:23:25 +0000 (18:23 +0900)
Lib/LibGeo/Mesh/BaryCoord.h
Lib/LibGeo/Mesh/BaseMesh.cpp
Lib/LibGeo/Mesh/BaseMesh.h
Lib/LibGeo/Mesh/BaseMeshPrimitives.h
Src/QtGeoViewer/FormMain.cpp
Src/QtGeoViewer/FormMain.h
Src/QtGeoViewer/View3D.cpp

index dbfa4c8..734047d 100644 (file)
@@ -2,6 +2,8 @@
 
 #include <C2/lm/vector3.h>
 
+#include "BaseMeshPrimitives.h"
+
 
 
 namespace lib_geo
@@ -11,48 +13,36 @@ namespace lib_geo
 class BaryCoord
 {
 public:
-       BaryCoord(void) :
-               Fid(-1),
-               Subface(-1)
+       BaryCoord(void)
        {
        }
 
        BaryCoord(int fid, int subface, const lm::vec3f& bc) :
-               Fid(fid),
-               Subface(subface),
+               Subface(fid, subface),
                Bary(bc)
        {
        }
 
        void Set(int fid, int subface, const lm::vec3f& bc)
        {
-               Fid = fid;
-               Subface = subface;
+               Subface.Set(fid, subface);
                Bary = bc;
        }
 
        void Reset(void)
        {
-               Fid = -1;
-               Subface = -1;
+               Subface.Reset();
                Bary.set(0.0f, 0.0f, 0.0f);
        }
 
        bool IsValid(void) const
        {
-               if (Fid == -1)
-                       return false;
-
-               if (Subface == -1)
-                       return false;
-
-               return true;
+               return Subface.IsValid();
        }
 
 
 public:
-       int Fid;
-       int Subface;
+       lib_geo::SubfaceIdx Subface;
        lm::vec3f Bary;
 };
 
index d2536ca..5aee0a8 100644 (file)
@@ -702,10 +702,9 @@ void BaseMesh::MergeLinkedPolylines(void)
 }
 
 
-bool BaseMesh::GetClosestSubfacePos(const lm::vec3f& pos, int& fid, int& subface, lm::vec3f& close_pos) const
+bool BaseMesh::GetClosestSubfacePos(const lm::vec3f& pos, SubfaceIdx& sf, lm::vec3f& close_pos) const
 {
-       fid = -1;
-       subface = -1;
+       sf.Reset();
        close_pos.set(0.0f, 0.0f, 0.0f);
        float close_dsq = (std::numeric_limits<float>::max)();
 
@@ -724,14 +723,13 @@ bool BaseMesh::GetClosestSubfacePos(const lm::vec3f& pos, int& fid, int& subface
                        if (dsq < close_dsq)
                        {
                                close_dsq = dsq;
-                               fid = (int)i;
-                               subface = (int)j;
+                               sf.Set((int)i, (int)j);
                                close_pos = cp;
                        }
                }
        }
 
-       return (fid != -1 && subface != -1);
+       return sf.IsValid();
 }
 
 bool BaseMesh::CalcBaryCoordMain(const lm::vec3f& pos, size_t fid, size_t subface, float& u, float& v, float& w) const
@@ -792,19 +790,18 @@ bool BaseMesh::CalcBaryCoord(const lm::vec3f& pos, size_t fid, size_t subface, B
        if (!CalcBaryCoordMain(pos, fid, subface, bc.Bary.x, bc.Bary.y, bc.Bary.z))
                return false;
 
-       bc.Fid = (int)fid;
-       bc.Subface = (int)subface;
+       bc.Subface.Set((int)fid, (int)subface);
 
        return true;
 }
 
 lm::vec3f BaseMesh::GetPosFromBaryCoord(const BaryCoord& bc) const
 {
-       const BaseFace& f = m_Faces[bc.Fid];
+       const BaseFace& f = m_Faces[bc.Subface.fid];
 
        const lm::vec3f& v0 = m_Verts[f.m_VertIds[0]];
-       const lm::vec3f& v1 = m_Verts[f.m_VertIds[1 + bc.Subface]];
-       const lm::vec3f& v2 = m_Verts[f.m_VertIds[2 + bc.Subface]];
+       const lm::vec3f& v1 = m_Verts[f.m_VertIds[1 + bc.Subface.subface]];
+       const lm::vec3f& v2 = m_Verts[f.m_VertIds[2 + bc.Subface.subface]];
 
        return v0 * bc.Bary.x + v1 * bc.Bary.y + v2 * bc.Bary.z;
 }
index e04cc31..2c7d55e 100644 (file)
@@ -72,7 +72,7 @@ public:
 
        virtual void MergeLinkedPolylines(void);
 
-       bool GetClosestSubfacePos(const lm::vec3f& pos, int& fid, int& subface, lm::vec3f& close_pos) const;
+       bool GetClosestSubfacePos(const lm::vec3f& pos, SubfaceIdx& sf, lm::vec3f& close_pos) const;
 
        bool CalcBaryCoord(const lm::vec3f& pos, size_t fid, size_t subface, float& u, float& v, float& w) const;
        bool CalcBaryCoord(const lm::vec3f& pos, size_t fid, size_t subface, lm::vec3f& bc) const;
index 26c378f..ddcb00e 100644 (file)
@@ -82,6 +82,43 @@ public:
 };
 
 
+class SubfaceIdx
+{
+public:
+       SubfaceIdx(void) :
+               fid(-1),
+               subface(-1)
+       {
+       }
+       SubfaceIdx(int fid_, int subface_) :
+               fid(fid_),
+               subface(subface_)
+       {
+       }
+
+       void Set(int fid_, int subface_)
+       {
+               fid = fid_;
+               subface = subface_;
+       }
+
+       void Reset(void)
+       {
+               fid = -1;
+               subface = -1;
+       }
+
+       bool IsValid(void) const
+       {
+               return (fid != -1 && subface != -1);
+       }
+
+public:
+       int fid;
+       int subface;
+};
+
+
 //! \92¸\93_\82Ì\97×\90Ú\8fî\95ñ
 class VertAdj
 {
index 4dbeb0b..340cd2e 100644 (file)
@@ -1474,7 +1474,7 @@ void FormMain::dropEvent(QDropEvent* e)
 
                        if (IsSupportedTextureExt(path))
                        {
-                               OpenFixTextureFile(path);
+                               OpenFixTextureFile(path, e->pos());
                                continue;
                        }
 
@@ -1495,8 +1495,9 @@ bool FormMain::IsResetSceneOnBeforeLoadFile(void) const
        return false;
 }
 
-//! \83I\83u\83W\83F\83N\83g\82Ì\83}\83e\83\8a\83A\83\8b\82É\90Ý\92è\82³\82ê\82½\82à\82Ì\82Æ\82Í\95Ê\82Ì\83e\83N\83X\83`\83\83\82ð\8ew\92è\82·\82é.
-void FormMain::OpenFixTextureFile(const QString& path)
+//! \83I\83u\83W\83F\83N\83g\82É\89æ\91\9c\82ð\83h\83\8d\83b\83v\82³\82ê\82½\8fê\8d\87\82Í\82»\82Ì\83}\83e\83\8a\83A\83\8b\82Ì\83J\83\89\81[\83e\83N\83X\83`\83\83\82ð\83Z\83b\83g
+//! \89½\82à\96³\82¢\8fê\8f\8a\82É\83h\83\8d\83b\83v\82³\82ê\82é\82Æ\83f\83t\83H\83\8b\83g\83e\83N\83X\83`\83\83\82ð\83Z\83b\83g
+void FormMain::OpenFixTextureFile(const QString& path, const QPoint& pos)
 {
        std::string fname = path.toLocal8Bit().data();
 
index 3ac2912..34f099d 100644 (file)
@@ -83,7 +83,7 @@ private:
 
        bool IsCameraFile(const QString& path) const;
 
-       void OpenFixTextureFile(const QString& path);
+       void OpenFixTextureFile(const QString& path, const QPoint& pos);
        bool OpenCameraFile(const QString& path);
 
        bool IsSupportedTextureExt(const QString& path) const;
index 73559de..5dea3e3 100644 (file)
@@ -553,11 +553,11 @@ void View3D::Draw3DCursorBary(void)
        glDisable(GL_LIGHTING);
        glLineWidth(1.0f);
 
-       const lib_geo::BaseFace& f = m.m_Faces[bc.Fid];
+       const lib_geo::BaseFace& f = m.m_Faces[bc.Subface.fid];
 
        int vid0 = f.m_VertIds[0];
-       int vid1 = f.m_VertIds[1 + bc.Subface];
-       int vid2 = f.m_VertIds[2 + bc.Subface];
+       int vid1 = f.m_VertIds[1 + bc.Subface.subface];
+       int vid2 = f.m_VertIds[2 + bc.Subface.subface];
        const lm::vec3f& v0 = m.m_Verts[vid0];
        const lm::vec3f& v1 = m.m_Verts[vid1];
        const lm::vec3f& v2 = m.m_Verts[vid2];
@@ -583,7 +583,7 @@ void View3D::Draw3DCursorBary(void)
 
                glColor3d(1, 0, 0.75);
                std::ostringstream ss;
-               ss << bc.Fid << " " << bc.Subface << " " << bc.Bary.x << " " << bc.Bary.y << " " << bc.Bary.z;
+               ss << bc.Subface.fid << " " << bc.Subface.subface << " " << bc.Bary.x << " " << bc.Bary.y << " " << bc.Bary.z;
                glutBitmapString3f(pos, ss.str().c_str());
        }
 
@@ -2100,16 +2100,15 @@ void View3D::TestOnCursorColseElement(void)
        if (meshes.empty())
                return;
 
-       int fid = -1;
-       int subface = -1;
+       lib_geo::SubfaceIdx subf;
        MeshBuf* close_mbuf = NULL;
        lm::vec3f close_pos;
        float close_disq = (std::numeric_limits<float>::max)();
        for (MeshBuf* mb : meshes)
        {
-               int f, fs;
+               lib_geo::SubfaceIdx fs;
                lm::vec3f p;
-               if (!mb->m_Mesh.GetClosestSubfacePos(cursor.CursorPos, f, fs, p))
+               if (!mb->m_Mesh.GetClosestSubfacePos(cursor.CursorPos, fs, p))
                        continue;
 
                float dsq = (cursor.CursorPos - p).square_length();
@@ -2117,8 +2116,7 @@ void View3D::TestOnCursorColseElement(void)
                {
                        close_disq = dsq;
                        close_mbuf = mb;
-                       fid = f;
-                       subface = fs;
+                       subf = fs;
                        close_pos = p;
                }
        }
@@ -2128,19 +2126,18 @@ void View3D::TestOnCursorColseElement(void)
        cursor.CloseFaceMBuf = close_mbuf;
 
        if (cursor.CheckBaryCoord)
-               close_mbuf->m_Mesh.CalcBaryCoord(close_pos, fid, subface, cursor.CloseFace);
+               close_mbuf->m_Mesh.CalcBaryCoord(close_pos, subf.fid, subf.subface, cursor.CloseFace);
 
        int new_midx = -1;
        if (cursor.SelCloseVert)
        {
-               const lib_geo::BaseFace& f = close_mbuf->m_Mesh.m_Faces[fid];
+               const lib_geo::BaseFace& f = close_mbuf->m_Mesh.m_Faces[subf.fid];
 
                if (!cursor.CheckBaryCoord)
                {
                        float mid = 1.0f / 3.0f;
                        cursor.CloseFace.Bary.set(mid, mid, mid);
-                       cursor.CloseFace.Fid = fid;
-                       cursor.CloseFace.Subface = subface;
+                       cursor.CloseFace.Subface = subf;
                }
 
                new_midx = f.m_MatIdx;