4 #include <LibGeo/Path.h>
6 #include <C2/graph/MaterialSamples.h>
7 #include <C2/gl/GlApiExt.h>
9 #include <C2/util/string_util.h>
16 #include <boost/algorithm/string.hpp>
18 #include "Format/GeomReaderBuilder.h"
22 SceneMain::SceneMain(void)
25 m_ConstantColorStrength = 1.0f;
28 void SceneMain::Initialize(void)
30 m_DefaultMaterial = lib_graph::MaterialSamples::GetSilver();
32 m_DefaultAlphaMaterial = m_DefaultMaterial;
33 m_DefaultAlphaMaterial.SetAlphaAll( 0.75f );
35 m_DefaultTexture.InitializeTexture();
37 m_EnvImg.InitEnvMap();
40 void SceneMain::FinalizeScene(void)
42 m_DefaultTexture.FinalizeTexture();
49 void SceneMain::ClearObjects(void)
51 for (GeomObject& obj : m_Objects)
57 m_Cursor3d.ResetCloseFace();
59 ReportDoneEditGeometry();
63 void SceneMain::ImportFileAutoFmt(const QString& path)
65 geom::GeomFileFormat fmt = FormatType::GetGeomFileTypeFromPath(path);
66 if (fmt == GeomFileFormat::None)
67 throw FileLoadErrorException("Unknown format");
69 std::string f = path.toLocal8Bit().data();
70 if (!ImportFile(f, fmt))
71 throw FileLoadErrorException("Failed Load Geometry");
74 bool SceneMain::ImportFile(const std::string& filename, geom::GeomFileFormat fmt)
76 std::auto_ptr<GeomFileReader> reader;
77 reader.reset(GeomReaderBuilder::Create(fmt));
78 if (reader.get() == NULL)
86 return reader->Load(*this, filename);
89 GeomObject* SceneMain::CreateNewGeometry(void)
91 GeomObject* geom = new GeomObject();
92 m_Objects.push_back(geom);
99 void SceneMain::SetFrame(int frame)
103 for (GeomObject& g : m_Objects)
105 g.SetFrameShape(frame);
112 void SceneMain::UpdateTransform(void)
114 SceneTransform& t = m_WorldTransform;
117 t.m_Translate.set_zero();
119 if (m_Config.m_EnableAutoCentering)
121 lm::range3f r = GetSceneBBox();
123 t.m_Translate = -r.mid_point();
126 if (m_Config.m_EnableAutoReisze)
128 lm::range3f r = GetSceneBBoxIni();
130 t.SetScale(1.0f / r.max_length());
135 void SceneMain::LoadDefaultMatTexture(const std::string& filename)
137 m_DefaultTexture.LoadTextureFromFile(filename.c_str(), true);
138 m_DefaultTexture.SetTextureGLAndReleaseImage(m_TexConfig);
142 //!
\83I
\83u
\83T
\81[
\83o
\82ð
\83Z
\83b
\83g.
143 //!
\8f\8a\97L
\8c \82Í
\8e\9d\82½
\82È
\82¢.
144 void SceneMain::AddObserver(SceneObserver* observer)
146 m_Observers.push_back(observer);
149 bool SceneMain::RemoveObserver(size_t idx)
151 assert(idx < m_Observers.size());
152 if (idx < m_Observers.size())
155 std::vector<SceneObserver*>::iterator i = m_Observers.begin();
156 std::advance(i, idx);
157 m_Observers.erase(i);
162 bool SceneMain::RemoveObserver(SceneObserver* registered_observer)
164 for (size_t i = 0; i < m_Observers.size(); ++i)
166 if (m_Observers[i] == registered_observer)
167 return RemoveObserver(i);
175 void SceneMain::ReportDoneEditGeometry(void)
177 for (SceneObserver* o : m_Observers)
179 o->OnGeometryBuild(*this);
183 lm::range3f SceneMain::GetSceneBBox(void) const
188 for (const GeomObject& obj : m_Objects)
190 bbox.expand(obj.GetGeomBBox(false));
196 lm::range3f SceneMain::GetSceneBBoxIni(void) const
201 for (const GeomObject& obj : m_Objects)
203 bbox.expand(obj.GetGeomBBox(true));
210 lm::range3f SceneMain::GetSceneTransformedBBox(void) const
212 lm::range3f bbox = GetSceneBBox();
216 tbb.expand(m_WorldTransform.TransformVec(bbox.min_point()));
217 tbb.expand(m_WorldTransform.TransformVec(bbox.max_point()));
223 GeomObject* SceneMain::GetPrimaryObject(void)
225 int idx = GetPrimaryObjectIdx();
229 return &m_Objects[idx];
232 const GeomObject* SceneMain::GetPrimaryObject(void) const
234 int idx = GetPrimaryObjectIdx();
238 return &m_Objects[idx];
241 int SceneMain::GetPrimaryObjectIdx(void) const
243 if (m_Objects.empty())
246 return m_Sels.GetSelObjectIdx();
250 void SceneMain::GetSelectedMeshes(std::vector<MeshBuf*>& meshes)
252 GeomObject* obj = GetPrimaryObject();
256 if (m_Sels.IsMBufSelected())
258 meshes.resize(1, &obj->m_MeshAry[m_Sels.GetMBufIdx()]);
262 meshes.reserve(obj->m_MeshAry.size());
263 for (MeshBuf& m : obj->m_MeshAry)
265 meshes.push_back(&m);
270 MeshBuf* SceneMain::GetPrimaryMeshbuf(void)
272 int idx = GetPrimaryMeshbufIdx();
276 return &GetPrimaryObject()->m_MeshAry[idx];
279 const MeshBuf* SceneMain::GetPrimaryMeshbuf(void) const
281 int idx = GetPrimaryMeshbufIdx();
285 return &GetPrimaryObject()->m_MeshAry[idx];
288 int SceneMain::GetPrimaryMeshbufIdx(void) const
290 if (GetPrimaryObject() == NULL)
293 if (!m_Sels.IsMBufSelected())
296 return m_Sels.GetMBufIdx();
299 MeshBuf* SceneMain::GetSelOrFirstMeshbuf(void)
301 GeomObject* o = GetPrimaryObject();
304 if (o->m_MeshAry.empty())
307 if (m_Sels.IsMBufSelected())
308 return &o->m_MeshAry[m_Sels.GetMBufIdx()];
310 return &o->m_MeshAry[0];
313 const MeshBuf* SceneMain::GetSelOrFirstMeshbuf(void) const
315 const GeomObject* o = GetPrimaryObject();
318 if (o->m_MeshAry.empty())
321 if (m_Sels.IsMBufSelected())
322 return &o->m_MeshAry[m_Sels.GetMBufIdx()];
324 return &o->m_MeshAry[0];
327 GeomTextureSet* SceneMain::GetSelectedTexture(void)
329 MeshBuf* mbuf = GetSelOrFirstMeshbuf();
333 return mbuf->GeSeltTexture();
336 lib_geo::BaseMaterial* SceneMain::GetSelectedMaterial(void)
338 MeshBuf* mbuf = GetSelOrFirstMeshbuf();
342 return mbuf->GetSelMaterial();
346 void SceneMain::RemoveItem(int sel_idx)
348 boost::ptr_vector<GeomObject>::iterator i;
349 i = m_Objects.begin();
352 if (i->IsInChild(m_Cursor3d.CloseFaceMBuf))
353 m_Cursor3d.ResetCloseFace();
357 m_Sels.ClearSelect();
359 RefreshObjectIndex();
363 void SceneMain::CreateSampleTexture(SampleTextureBuilder::TextureType tex_type)
365 SDL_Surface* tex = SampleTextureBuilder::CreateTexture(tex_type, 256);
369 m_DefaultTexture.SetFromSDLSurface( tex );
370 m_DefaultTexture.SetTextureGLAndReleaseImage(m_TexConfig);
374 void SceneMain::RefreshObjectIndex(void)
377 for (size_t i = 0; i < m_Objects.size(); ++i)
379 GeomObject& o = m_Objects[i];
380 o.SetObjectIndex((int)i);
381 for (size_t j = 0; j < o.m_MeshAry.size(); ++j)
383 MeshBuf& m = o.m_MeshAry[j];
384 m.m_MBufIdx = (int)j;
385 m.m_WholeIndex = (int)(j + io);
387 io += o.m_MeshAry.size();
392 bool SceneMain::ReloadObject(GeomObject* obj)
394 if(!obj->IsFileObject())
397 int idx = FindObjectIdx(obj);
404 geom::GeomFileFormat fmt = obj->m_FileFormat;
405 const std::string filename = obj->m_FilePath;
409 return ImportFile(filename, fmt);
412 int SceneMain::FindObjectIdx(const GeomObject* obj) const
414 for (const GeomObject& o : m_Objects)
417 return o.GetObjectIndex();
424 void SceneMain::ShowAllObject(void)
426 for (GeomObject& o : m_Objects)
429 for (MeshBuf& m : o.m_MeshAry)
434 void SceneMain::HideAllObject(void)
436 for (GeomObject& o : m_Objects)
439 for (MeshBuf& m : o.m_MeshAry)
444 void SceneMain::ClearAllVertSelect(void)
446 for (GeomObject& obj : m_Objects)
448 for (MeshBuf& mbuf : obj.m_MeshAry)
456 void SceneMain::AddCrossSectionRecord()
458 UpdateCrossSectionIfRequire(true);
460 for (GeomObject& obj : m_Objects)
462 for (MeshBuf& mbuf : obj.m_MeshAry)
464 mbuf.m_CrossSectionLog.push_back(lib_geo::CrossSection());
465 std::swap(mbuf.m_CrossSectionLog.back(), mbuf.m_CrossSection);
470 void SceneMain::ClearCrossSectionRecord()
472 for (GeomObject& obj : m_Objects)
474 for (MeshBuf& mbuf : obj.m_MeshAry)
476 mbuf.m_CrossSectionLog.clear();
481 void SceneMain::UpdateCrossSectionIfRequire(bool force_update)
483 const CrossSectionConfig& conf = m_CrossSectionConfig;
487 if (!conf.IsRequireUpdateCS())
491 lib_geo::Plane cutplane;
493 if (conf.IsFreeCut())
494 m_Cursor3d.GetFreeCutParam(cutplane.origin, cutplane.normal);
496 conf.GetCutPlane(GetSceneBBox(), cutplane);
498 bool cs_group = conf.m_EnableCrossSectionGroup;
500 for (GeomObject& obj : m_Objects)
502 for (MeshBuf& mbuf : obj.m_MeshAry)
504 mbuf.UpdateCrossSection(cs_group, cutplane);
509 std::vector<MeshBuf*> SceneMain::GetCurSelMeshes(void)
511 MeshBuf* mbuf = GetPrimaryMeshbuf();
513 std::vector<MeshBuf*>(1, mbuf);
515 GeomObject* geo = GetPrimaryObject();
516 std::vector<MeshBuf*> mv;
519 for (MeshBuf& m : geo->m_MeshAry)
528 void SceneMain::FlipCurselFace(bool normal_only)
530 std::vector<MeshBuf*> mv = GetCurSelMeshes();
531 for (MeshBuf* m : mv)
533 m->FlipFace(normal_only);
537 void SceneMain::RebuildCurselNormal(void)
539 GeomObject* geo = GetPrimaryObject();
543 geo->ResetSmoothNormal();
546 int SceneMain::GetKeyframeMax(void) const
549 for (const GeomObject& obj : m_Objects)
551 kf = (std::max)(kf, obj.m_GTree.GetKeyframeMax());
557 float SceneMain::GetCursorSphereClipLen(void) const
559 return GetCursorSphereClipLen(GetSceneBBox());
562 float SceneMain::GetCursorSphereClipLen(const lm::range3f& scene_bb) const
564 return m_Cursor3d.GetSphereClipLen(scene_bb);
567 bool SceneMain::IsOutOfSphereClip(const lm::vec3f& v) const
569 return IsOutOfSphereClip(GetSceneBBox(), v);
572 bool SceneMain::IsOutOfSphereClip(const lm::range3f& scene_bb, const lm::vec3f& v) const
574 float l = GetCursorSphereClipLen(scene_bb);
576 float dsq = (v - m_Cursor3d.CursorPos).square_length();
578 if (m_Cursor3d.SphereClip == SphereClipType::Hole)
580 if (m_Cursor3d.SphereClip == SphereClipType::ShowAround)