#include <C2/lm/vector3.h>
+#include "BaseMeshPrimitives.h"
+
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;
};
}
-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)();
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
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;
}
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;
};
+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
{
if (IsSupportedTextureExt(path))
{
- OpenFixTextureFile(path);
+ OpenFixTextureFile(path, e->pos());
continue;
}
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();
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;
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];
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());
}
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();
{
close_disq = dsq;
close_mbuf = mb;
- fid = f;
- subface = fs;
+ subf = fs;
close_pos = p;
}
}
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;