OSDN Git Service

形状データ再読み込み処理の整理
[qtgeoviewer/QtGeoViewer.git] / Src / LibQtGeoViewerCore / SceneMain.cpp
index e7f5043..ea8fb05 100644 (file)
 #include <boost/algorithm/string.hpp>
 
 #include "Format/GeomReaderBuilder.h"
+#include "Format/AssimpReader.h"
 
 
 
 SceneMain::SceneMain(void)
 {
+       m_CurFrame = 0;
        m_ConstantColorStrength = 1.0f;
 }
 
 void SceneMain::Initialize(void)
 {
-       m_DefaultMaterial = lib_graph::MaterialSamples::GetSilver();
+       m_DefaultMaterial = lgr::MaterialSamples::GetSilver();
 
        m_DefaultAlphaMaterial = m_DefaultMaterial;
        m_DefaultAlphaMaterial.SetAlphaAll( 0.75f );
 
        m_DefaultTexture.InitializeTexture();
 
-       ClearObjects();
-
        m_EnvImg.InitEnvMap();
 }
 
@@ -67,7 +67,8 @@ void SceneMain::ImportFileAutoFmt(const QString& path)
        if (fmt == GeomFileFormat::None)
                throw FileLoadErrorException("Unknown format");
 
-       if (!ImportFile(path.toLocal8Bit().data(), fmt))
+       std::string f = path.toLocal8Bit().data();
+       if (!ImportFile(f, fmt))
                throw FileLoadErrorException("Failed Load Geometry");
 }
 
@@ -83,7 +84,12 @@ bool SceneMain::ImportFile(const std::string& filename, geom::GeomFileFormat fmt
 
        RefreshObjectIndex();
 
-       return reader->Load(*this, filename);
+       if (!reader->Load(*this, filename))
+               return false;
+
+       UpdateCrossSectionIfRequire(false);
+
+       return true;
 }
 
 GeomObject* SceneMain::CreateNewGeometry(void)
@@ -96,73 +102,18 @@ GeomObject* SceneMain::CreateNewGeometry(void)
 }
 
 
-void AppendWeight(std::vector<float>& vw, std::vector<lm::vec3f>& vp, lm::matrix4f& mat_parent, GeomObject& g, Bone* b, int frame)
-{
-       lm::matrix4f md;
-       if(frame == -1)
-               md = b->m_NodeTrans;
-       else
-               md = b->GetFrameMatrix(frame);
-
-       md = md * mat_parent;
-
-       for(size_t j = 0; j < b->m_Weights.size(); ++j)
-       {
-               int vid = b->m_Weights[j].m_Vid;
-               float weight = b->m_Weights[j].m_Weight;
-
-               lm::vec3f v = g.m_BoneAnimation.m_SrcVertPos[vid];
-
-               v = v * b->m_Offset * md;
-               vw[vid] += weight;
-               vp[vid] += v * weight;
-       }
-
-       for(size_t i = 0; i < b->m_Children.size(); ++i)
-       {
-               AppendWeight(vw, vp, md, g, b->m_Children[i], frame);
-       }
-}
-
 void SceneMain::SetFrame(int frame)
 {
-       GeomObject& g = m_Objects[0];
-       lib_geo::BaseMesh& m = g.m_MeshAry[0].m_Mesh;
-
-       m.m_Verts = g.m_BoneAnimation.m_SrcVertPos;
-
-       std::vector<float> vw(m.m_Verts.size(), 0.0f);
-       std::vector<lm::vec3f> vp(m.m_Verts.size());
-
-       for (BoneRoot& br : g.m_BoneAnimation.m_RootNodes)
-       {
-               lm::matrix4f mi = br.m_Transform;
-               AppendWeight(vw, vp, mi, g, br.m_Bone, frame);
-       }
+       m_CurFrame = frame;
 
-       for (size_t i = 0; i < m.m_Verts.size(); ++i)
+       for (GeomObject& g : m_Objects)
        {
-               if(vw[i] > 0.0f)
-                       m.m_Verts[i] = vp[i] / vw[i];
+               g.SetFrameShape(frame);
        }
 
-       m.UpdateNormal();
-}
-
-int SceneMain::GetMaxFrame(void) const
-{
-       size_t max_frame = 0;
-       for (const GeomObject& g : m_Objects)
-       {
-               for (const Bone& b : g.m_BoneAnimation.m_Bones)
-               {
-                       max_frame = (std::max)(max_frame, b.m_Translate.size());
-                       max_frame = (std::max)(max_frame, b.m_Scale.size());
-                       max_frame = (std::max)(max_frame, b.m_Rotate.size());
-               }
-       }
+       m_Camera.SetFrame(frame);
 
-       return max_frame;
+       UpdateTransform();
 }
 
 
@@ -173,18 +124,18 @@ void SceneMain::UpdateTransform(void)
        t.SetScale(1.0);
        t.m_Translate.set_zero();
 
-       lm::range3f r = GetSceneBBox();
-       if (!r.is_valid())
-               return;
-
-       if( m_Config.m_EnableAutoCentering )
+       if (m_Config.m_EnableAutoCentering)
        {
-               t.m_Translate = -r.mid_point();
+               lm::range3f r = GetSceneBBox();
+               if (r.is_valid())
+                       t.m_Translate = -r.mid_point();
        }
 
-       if( m_Config.m_EnableAutoReisze )
+       if (m_Config.m_EnableAutoReisze)
        {
-               t.SetScale(1.0f / r.max_length());
+               lm::range3f r = GetSceneBBoxIni();
+               if (r.is_valid())
+                       t.SetScale(1.0f / r.max_length());
        }
 }
 
@@ -200,28 +151,28 @@ void SceneMain::LoadDefaultMatTexture(const std::string& filename)
 //! \8f\8a\97L\8c \82Í\8e\9d\82½\82È\82¢.
 void SceneMain::AddObserver(SceneObserver* observer)
 {
-       m_Observers.push_back( observer );
+       m_Observers.push_back(observer);
 }
 
 bool SceneMain::RemoveObserver(size_t idx)
 {
-       assert( idx < m_Observers.size() );
-       if( idx < m_Observers.size() )
+       assert(idx < m_Observers.size());
+       if (idx < m_Observers.size())
                return false;
 
        std::vector<SceneObserver*>::iterator i = m_Observers.begin();
-       std::advance( i , idx );
-       m_Observers.erase( i );
+       std::advance(i, idx);
+       m_Observers.erase(i);
 
        return true;
 }
 
 bool SceneMain::RemoveObserver(SceneObserver* registered_observer)
 {
-       for( size_t i = 0 ; i < m_Observers.size() ; ++i )
+       for (size_t i = 0; i < m_Observers.size(); ++i)
        {
-               if( m_Observers[i] == registered_observer )
-                       return RemoveObserver( i );
+               if (m_Observers[i] == registered_observer)
+                       return RemoveObserver(i);
        }
 
        assert(false);
@@ -231,9 +182,9 @@ bool SceneMain::RemoveObserver(SceneObserver* registered_observer)
 
 void SceneMain::ReportDoneEditGeometry(void)
 {
-       for( size_t i = 0 ; i < m_Observers.size() ; ++i )
+       for (SceneObserver* o : m_Observers)
        {
-               m_Observers[i]->OnGeometryBuild(*this);
+               o->OnGeometryBuild(*this);
        }
 }
 
@@ -244,12 +195,26 @@ lm::range3f SceneMain::GetSceneBBox(void) const
 
        for (const GeomObject& obj : m_Objects)
        {
-               bbox.expand(obj.GetBBox());
+               bbox.expand(obj.GetGeomBBox(false));
        }
 
        return bbox;
 }
 
+lm::range3f SceneMain::GetSceneBBoxIni(void) const
+{
+       lm::range3f bbox;
+       bbox.clear();
+
+       for (const GeomObject& obj : m_Objects)
+       {
+               bbox.expand(obj.GetGeomBBox(true));
+       }
+
+       return bbox;
+}
+
+
 lm::range3f SceneMain::GetSceneTransformedBBox(void) const
 {
        lm::range3f bbox = GetSceneBBox();
@@ -265,74 +230,124 @@ lm::range3f SceneMain::GetSceneTransformedBBox(void) const
 
 GeomObject* SceneMain::GetPrimaryObject(void)
 {
-       if (!m_Sels.IsObjectSelected())
+       int idx = GetPrimaryObjectIdx();
+       if (idx == -1)
                return NULL;
 
-       return &m_Objects[m_Sels.GetSelObjectIdx()];
+       return &m_Objects[idx];
 }
 
 const GeomObject* SceneMain::GetPrimaryObject(void) const
 {
-       if (!m_Sels.IsObjectSelected())
+       int idx = GetPrimaryObjectIdx();
+       if (idx == -1)
                return NULL;
 
-       return &m_Objects[m_Sels.GetSelObjectIdx()];
+       return &m_Objects[idx];
 }
 
+int SceneMain::GetPrimaryObjectIdx(void) const
+{
+       if (m_Objects.empty())
+               return -1;
 
-MeshBuf* SceneMain::GetPrimaryMeshbuf(void)
+       return m_Sels.GetSelObjectIdx();
+}
+
+
+void SceneMain::GetSelectedMeshes(std::vector<MeshBuf*>& meshes)
 {
        GeomObject* obj = GetPrimaryObject();
        if (obj == NULL)
-               return NULL;
+               return;
 
-       if (!m_Sels.IsMBufSelected())
+       if (m_Sels.IsMBufSelected())
+       {
+               meshes.resize(1, &obj->m_MeshAry[m_Sels.GetMBufIdx()]);
+       }
+       else
+       {
+               meshes.reserve(obj->m_MeshAry.size());
+               for (MeshBuf& m : obj->m_MeshAry)
+               {
+                       meshes.push_back(&m);
+               }
+       }
+}
+
+MeshBuf* SceneMain::GetPrimaryMeshbuf(void)
+{
+       int idx = GetPrimaryMeshbufIdx();
+       if (idx == -1)
                return NULL;
 
-       return &obj->m_MeshAry[m_Sels.GetMBufIdx()];
+       return &GetPrimaryObject()->m_MeshAry[idx];
 }
 
 const MeshBuf* SceneMain::GetPrimaryMeshbuf(void) const
 {
-       const GeomObject* obj = GetPrimaryObject();
-       if (obj == NULL)
+       int idx = GetPrimaryMeshbufIdx();
+       if (idx == -1)
                return NULL;
 
+       return &GetPrimaryObject()->m_MeshAry[idx];
+}
+
+int SceneMain::GetPrimaryMeshbufIdx(void) const
+{
+       if (GetPrimaryObject() == NULL)
+               return -1;
+
        if (!m_Sels.IsMBufSelected())
-               return NULL;
+               return -1;
 
-       return &obj->m_MeshAry[m_Sels.GetMBufIdx()];
+       return m_Sels.GetMBufIdx();
 }
 
-GeomTextureSet* SceneMain::GetSelectedTexture(void)
+MeshBuf* SceneMain::GetSelOrFirstMeshbuf(void)
 {
-       int idx = GetSelectedMatIdx();
-       if (idx == -1)
+       GeomObject* o = GetPrimaryObject();
+       if (o == NULL)
                return NULL;
+       if (o->m_MeshAry.empty())
+               return NULL;
+
+       if (m_Sels.IsMBufSelected())
+               return &o->m_MeshAry[m_Sels.GetMBufIdx()];
 
-       return GetPrimaryMeshbuf()->GetTexture(idx);
+       return &o->m_MeshAry[0];
 }
 
-lib_geo::BaseMaterial* SceneMain::GetSelectedMaterial(void)
+const MeshBuf* SceneMain::GetSelOrFirstMeshbuf(void) const
 {
-       int idx = GetSelectedMatIdx();
-       if (idx == -1)
+       const GeomObject* o = GetPrimaryObject();
+       if (o == NULL)
+               return NULL;
+       if (o->m_MeshAry.empty())
                return NULL;
 
-       return GetPrimaryMeshbuf()->GetMaterial(idx);
+       if (m_Sels.IsMBufSelected())
+               return &o->m_MeshAry[m_Sels.GetMBufIdx()];
+
+       return &o->m_MeshAry[0];
 }
 
-int SceneMain::GetSelectedMatIdx(void)
+GeomTextureSet* SceneMain::GetSelectedTexture(void)
 {
-       MeshBuf* mbuf = GetPrimaryMeshbuf();
+       MeshBuf* mbuf = GetSelOrFirstMeshbuf();
        if (mbuf == NULL)
-               return -1;
+               return NULL;
 
-       int idx = m_Sels.GetSelMat();
-       if (!mbuf->IsValidMaterialIdx(idx))
-               return -1;
+       return mbuf->GeSeltTexture();
+}
 
-       return idx;
+lib_geo::BaseMaterial* SceneMain::GetSelectedMaterial(void)
+{
+       MeshBuf* mbuf = GetSelOrFirstMeshbuf();
+       if (mbuf == NULL)
+               return NULL;
+
+       return mbuf->GetSelMaterial();
 }
 
 
@@ -343,12 +358,12 @@ void SceneMain::RemoveItem(int sel_idx)
        i += sel_idx;
 
        if (i->IsInChild(m_Cursor3d.CloseFaceMBuf))
-       {
                m_Cursor3d.ResetCloseFace();
-       }
 
        m_Objects.erase(i);
 
+       m_Sels.ClearSelect();
+
        RefreshObjectIndex();
 }
 
@@ -366,22 +381,25 @@ void SceneMain::CreateSampleTexture(SampleTextureBuilder::TextureType tex_type)
 
 void SceneMain::RefreshObjectIndex(void)
 {
+       size_t io = 0;
        for (size_t i = 0; i < m_Objects.size(); ++i)
        {
                GeomObject& o = m_Objects[i];
-               o.m_ObjectIndex = (int)i;
+               o.SetObjectIndex((int)i);
                for (size_t j = 0; j < o.m_MeshAry.size(); ++j)
                {
                        MeshBuf& m = o.m_MeshAry[j];
                        m.m_MBufIdx = (int)j;
+                       m.m_WholeIndex = (int)(j + io);
                }
+               io += o.m_MeshAry.size();
        }
 }
 
 
 bool SceneMain::ReloadObject(GeomObject* obj)
 {
-       if(!obj->IsFileObject())
+       if (!obj->IsFileObject())
                return false;
 
        int idx = FindObjectIdx(obj);
@@ -391,19 +409,42 @@ bool SceneMain::ReloadObject(GeomObject* obj)
                return false;
        }
 
+       if (obj->IsInChild(m_Cursor3d.CloseFaceMBuf))
+               m_Cursor3d.ResetCloseFace();
+
        geom::GeomFileFormat fmt = obj->m_FileFormat;
        const std::string filename = obj->m_FilePath;
 
-       RemoveItem(idx);
+       boost::ptr_vector<GeomObject>::iterator i;
+       i = m_Objects.begin();
+       i += idx;
+       m_Objects.erase(i);
+
+       m_Sels.ClearSelect();
+
+       std::auto_ptr<GeomFileReader> reader;
+       reader.reset(GeomReaderBuilder::Create(fmt));
+       if (reader.get() == NULL)
+       {
+               assert(false);
+               return false;
+       }
+
+       RefreshObjectIndex();
 
-       return ImportFile(filename, fmt);
+       if (!reader->Load(*this, filename))
+               return false;
+
+       UpdateCrossSectionIfRequire(false);
+
+       return true;
 }
 
 int SceneMain::FindObjectIdx(const GeomObject* obj) const
 {
        for (const GeomObject& o : m_Objects)
        {
-               if(&o == obj)
+               if (&o == obj)
                        return o.GetObjectIndex();
        }
 
@@ -411,37 +452,35 @@ int SceneMain::FindObjectIdx(const GeomObject* obj) const
 }
 
 
-void SceneMain::ShowAllObjects(void)
+void SceneMain::ShowAllObject(void)
 {
-       for (GeomObject& obj : m_Objects)
+       for (GeomObject& o : m_Objects)
        {
-               obj.m_Visible = false;
+               o.m_Visible = true;
+               for (MeshBuf& m : o.m_MeshAry)
+                       m.m_Visible = true;
        }
 }
 
-void SceneMain::ClearAllVertSelect(void)
+void SceneMain::HideAllObject(void)
 {
-       for (GeomObject& obj : m_Objects)
+       for (GeomObject& o : m_Objects)
        {
-               for (MeshBuf& mbuf : obj.m_MeshAry)
-               {
-                       mbuf.ClearSelect();
-               }
+               o.m_Visible = false;
+               for (MeshBuf& m : o.m_MeshAry)
+                       m.m_Visible = false;
        }
 }
 
-std::vector<GeomObject*> SceneMain::GetVisibleObjects(void)
+void SceneMain::ClearAllVertSelect(void)
 {
-       std::vector<GeomObject*> ov;
-       ov.reserve(m_Objects.size());
-
        for (GeomObject& obj : m_Objects)
        {
-               if (obj.m_Visible)
-                       ov.push_back(&obj);
+               for (MeshBuf& mbuf : obj.m_MeshAry)
+               {
+                       mbuf.ClearSelect();
+               }
        }
-
-       return ov;
 }
 
 
@@ -470,13 +509,6 @@ void SceneMain::ClearCrossSectionRecord()
        }
 }
 
-void SceneMain::GetFreeCutParam(lm::vec3f& p, lm::vec3f& n)
-{
-       Cursor3D& c = m_Cursor3d;
-       p = c.CursorPos;
-       n = c.MeasureNorm;
-}
-
 void SceneMain::UpdateCrossSectionIfRequire(bool force_update)
 {
        const CrossSectionConfig& conf = m_CrossSectionConfig;
@@ -490,7 +522,7 @@ void SceneMain::UpdateCrossSectionIfRequire(bool force_update)
        lib_geo::Plane cutplane;
 
        if (conf.IsFreeCut())
-               GetFreeCutParam(cutplane.origin, cutplane.normal);
+               m_Cursor3d.GetFreeCutParam(cutplane.origin, cutplane.normal);
        else
                conf.GetCutPlane(GetSceneBBox(), cutplane);
 
@@ -504,3 +536,88 @@ void SceneMain::UpdateCrossSectionIfRequire(bool force_update)
                }
        }
 }
+
+std::vector<MeshBuf*> SceneMain::GetCurSelMeshes(void)
+{
+       MeshBuf* mbuf = GetPrimaryMeshbuf();
+       if (mbuf != NULL)
+               std::vector<MeshBuf*>(1, mbuf);
+
+       GeomObject* geo = GetPrimaryObject();
+       std::vector<MeshBuf*> mv;
+       if (geo != NULL)
+       {
+               for (MeshBuf& m : geo->m_MeshAry)
+               {
+                       mv.push_back(&m);
+               }
+       }
+
+       return mv;
+}
+
+void SceneMain::FlipCurselFace(bool normal_only)
+{
+       std::vector<MeshBuf*> mv = GetCurSelMeshes();
+       for (MeshBuf* m : mv)
+       {
+               m->FlipFace(normal_only);
+       }
+}
+
+void SceneMain::RebuildCurselNormal(void)
+{
+       GeomObject* geo = GetPrimaryObject();
+       if (geo == NULL)
+               return;
+
+       geo->ResetSmoothNormal();
+}
+
+int SceneMain::GetKeyframeMax(void) const
+{
+       int kf = 0;
+       for (const GeomObject& obj : m_Objects)
+       {
+               kf = (std::max)(kf, obj.m_GTree.GetKeyframeMax());
+       }
+
+       kf = (std::max)(kf, m_Camera.m_SeqTrans.GetNumframes());
+
+       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;
+}
+
+bool SceneMain::LoadCameraSeq(const char* filename)
+{
+       AssimpReader reader;
+       return reader.LoadCamera(*this, filename);
+}