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();
39 m_EnvImg.InitEnvMap();
42 void SceneMain::FinalizeScene(void)
44 m_DefaultTexture.FinalizeTexture();
51 void SceneMain::ClearObjects(void)
53 for (GeomObject& obj : m_Objects)
59 m_Cursor3d.ResetCloseFace();
61 ReportDoneEditGeometry();
65 void SceneMain::ImportFileAutoFmt(const QString& path)
67 geom::GeomFileFormat fmt = FormatType::GetGeomFileTypeFromPath(path);
68 if (fmt == GeomFileFormat::None)
69 throw FileLoadErrorException("Unknown format");
71 std::string f = path.toLocal8Bit().data();
72 if (!ImportFile(f, fmt))
73 throw FileLoadErrorException("Failed Load Geometry");
76 bool SceneMain::ImportFile(const std::string& filename, geom::GeomFileFormat fmt)
78 std::auto_ptr<GeomFileReader> reader;
79 reader.reset(GeomReaderBuilder::Create(fmt));
80 if (reader.get() == NULL)
88 return reader->Load(*this, filename);
91 GeomObject* SceneMain::CreateNewGeometry(void)
93 GeomObject* geom = new GeomObject();
94 m_Objects.push_back(geom);
101 void SceneMain::SetFrame(int frame)
104 for (GeomObject& g : m_Objects)
112 int SceneMain::GetMaxFrame(void) const
114 size_t max_frame = 0;
115 for (const GeomObject& g : m_Objects)
117 for (const Bone& b : g.m_BoneAnimation.m_Bones)
119 max_frame = (std::max)(max_frame, b.m_Translate.size());
120 max_frame = (std::max)(max_frame, b.m_Scale.size());
121 max_frame = (std::max)(max_frame, b.m_Rotate.size());
129 void SceneMain::UpdateTransform(void)
131 SceneTransform& t = m_WorldTransform;
134 t.m_Translate.set_zero();
136 if (m_Config.m_EnableAutoCentering)
138 lm::range3f r = GetSceneBBox();
140 t.m_Translate = -r.mid_point();
143 if (m_Config.m_EnableAutoReisze)
145 lm::range3f r = GetSceneBBoxIni();
147 t.SetScale(1.0f / r.max_length());
152 void SceneMain::LoadDefaultMatTexture(const std::string& filename)
154 m_DefaultTexture.LoadTextureFromFile(filename.c_str(), true);
155 m_DefaultTexture.SetTextureGLAndReleaseImage(m_TexConfig);
159 //!
\83I
\83u
\83T
\81[
\83o
\82ð
\83Z
\83b
\83g.
160 //!
\8f\8a\97L
\8c \82Í
\8e\9d\82½
\82È
\82¢.
161 void SceneMain::AddObserver(SceneObserver* observer)
163 m_Observers.push_back(observer);
166 bool SceneMain::RemoveObserver(size_t idx)
168 assert(idx < m_Observers.size());
169 if (idx < m_Observers.size())
172 std::vector<SceneObserver*>::iterator i = m_Observers.begin();
173 std::advance(i, idx);
174 m_Observers.erase(i);
179 bool SceneMain::RemoveObserver(SceneObserver* registered_observer)
181 for (size_t i = 0; i < m_Observers.size(); ++i)
183 if (m_Observers[i] == registered_observer)
184 return RemoveObserver(i);
192 void SceneMain::ReportDoneEditGeometry(void)
194 for (SceneObserver* o : m_Observers)
196 o->OnGeometryBuild(*this);
200 lm::range3f SceneMain::GetSceneBBox(void) const
205 for (const GeomObject& obj : m_Objects)
207 bbox.expand(obj.GetGeomBBox(false));
213 lm::range3f SceneMain::GetSceneBBoxIni(void) const
218 for (const GeomObject& obj : m_Objects)
220 bbox.expand(obj.GetGeomBBox(true));
227 lm::range3f SceneMain::GetSceneTransformedBBox(void) const
229 lm::range3f bbox = GetSceneBBox();
233 tbb.expand(m_WorldTransform.TransformVec(bbox.min_point()));
234 tbb.expand(m_WorldTransform.TransformVec(bbox.max_point()));
240 GeomObject* SceneMain::GetPrimaryObject(void)
242 if (!m_Sels.IsObjectSelected())
245 if (m_Objects.empty())
248 return &m_Objects[m_Sels.GetSelObjectIdx()];
251 const GeomObject* SceneMain::GetPrimaryObject(void) const
253 if (!m_Sels.IsObjectSelected())
256 if (m_Objects.empty())
259 return &m_Objects[m_Sels.GetSelObjectIdx()];
263 void SceneMain::GetSelectedMeshes(std::vector<MeshBuf*>& meshes)
265 GeomObject* obj = GetPrimaryObject();
269 if (m_Sels.IsMBufSelected())
271 meshes.resize(1, &obj->m_MeshAry[m_Sels.GetMBufIdx()]);
275 meshes.reserve(obj->m_MeshAry.size());
276 for (MeshBuf& m : obj->m_MeshAry)
278 meshes.push_back(&m);
283 MeshBuf* SceneMain::GetPrimaryMeshbuf(void)
285 GeomObject* obj = GetPrimaryObject();
289 if (!m_Sels.IsMBufSelected())
292 return &obj->m_MeshAry[m_Sels.GetMBufIdx()];
295 const MeshBuf* SceneMain::GetPrimaryMeshbuf(void) const
297 const GeomObject* obj = GetPrimaryObject();
301 if (!m_Sels.IsMBufSelected())
304 return &obj->m_MeshAry[m_Sels.GetMBufIdx()];
307 GeomTextureSet* SceneMain::GetSelectedTexture(void)
309 int idx = GetSelectedMatIdx();
313 return GetPrimaryMeshbuf()->GetTexture(idx);
316 lib_geo::BaseMaterial* SceneMain::GetSelectedMaterial(void)
318 int idx = GetSelectedMatIdx();
322 return GetPrimaryMeshbuf()->GetMaterial(idx);
325 int SceneMain::GetSelectedMatIdx(void)
327 MeshBuf* mbuf = GetPrimaryMeshbuf();
331 int idx = m_Sels.GetSelMat();
332 if (!mbuf->IsValidMaterialIdx(idx))
339 void SceneMain::RemoveItem(int sel_idx)
341 boost::ptr_vector<GeomObject>::iterator i;
342 i = m_Objects.begin();
345 if (i->IsInChild(m_Cursor3d.CloseFaceMBuf))
346 m_Cursor3d.ResetCloseFace();
350 m_Sels.ClearSelect();
352 RefreshObjectIndex();
356 void SceneMain::CreateSampleTexture(SampleTextureBuilder::TextureType tex_type)
358 SDL_Surface* tex = SampleTextureBuilder::CreateTexture(tex_type, 256);
362 m_DefaultTexture.SetFromSDLSurface( tex );
363 m_DefaultTexture.SetTextureGLAndReleaseImage(m_TexConfig);
367 void SceneMain::RefreshObjectIndex(void)
369 for (size_t i = 0; i < m_Objects.size(); ++i)
371 GeomObject& o = m_Objects[i];
372 o.m_ObjectIndex = (int)i;
373 for (size_t j = 0; j < o.m_MeshAry.size(); ++j)
375 MeshBuf& m = o.m_MeshAry[j];
376 m.m_MBufIdx = (int)j;
382 bool SceneMain::ReloadObject(GeomObject* obj)
384 if(!obj->IsFileObject())
387 int idx = FindObjectIdx(obj);
394 geom::GeomFileFormat fmt = obj->m_FileFormat;
395 const std::string filename = obj->m_FilePath;
399 return ImportFile(filename, fmt);
402 int SceneMain::FindObjectIdx(const GeomObject* obj) const
404 for (const GeomObject& o : m_Objects)
407 return o.GetObjectIndex();
414 void SceneMain::ShowAllObject(void)
416 for (GeomObject& o : m_Objects)
419 for (MeshBuf& m : o.m_MeshAry)
424 void SceneMain::HideAllObject(void)
426 for (GeomObject& o : m_Objects)
429 for (MeshBuf& m : o.m_MeshAry)
434 void SceneMain::ClearAllVertSelect(void)
436 for (GeomObject& obj : m_Objects)
438 for (MeshBuf& mbuf : obj.m_MeshAry)
446 void SceneMain::AddCrossSectionRecord()
448 UpdateCrossSectionIfRequire(true);
450 for (GeomObject& obj : m_Objects)
452 for (MeshBuf& mbuf : obj.m_MeshAry)
454 mbuf.m_CrossSectionLog.push_back(lib_geo::CrossSection());
455 std::swap(mbuf.m_CrossSectionLog.back(), mbuf.m_CrossSection);
460 void SceneMain::ClearCrossSectionRecord()
462 for (GeomObject& obj : m_Objects)
464 for (MeshBuf& mbuf : obj.m_MeshAry)
466 mbuf.m_CrossSectionLog.clear();
471 void SceneMain::GetFreeCutParam(lm::vec3f& p, lm::vec3f& n)
473 Cursor3D& c = m_Cursor3d;
478 void SceneMain::UpdateCrossSectionIfRequire(bool force_update)
480 const CrossSectionConfig& conf = m_CrossSectionConfig;
484 if (!conf.IsRequireUpdateCS())
488 lib_geo::Plane cutplane;
490 if (conf.IsFreeCut())
491 GetFreeCutParam(cutplane.origin, cutplane.normal);
493 conf.GetCutPlane(GetSceneBBox(), cutplane);
495 bool cs_group = conf.m_EnableCrossSectionGroup;
497 for (GeomObject& obj : m_Objects)
499 for (MeshBuf& mbuf : obj.m_MeshAry)
501 mbuf.UpdateCrossSection(cs_group, cutplane);
506 std::vector<MeshBuf*> SceneMain::GetCurSelMeshes(void)
508 MeshBuf* mbuf = GetPrimaryMeshbuf();
510 std::vector<MeshBuf*>(1, mbuf);
512 GeomObject* geo = GetPrimaryObject();
513 std::vector<MeshBuf*> mv;
516 for (MeshBuf& m : geo->m_MeshAry)
525 void SceneMain::FlipCurselFace(bool normal_only)
527 std::vector<MeshBuf*> mv = GetCurSelMeshes();
528 for (MeshBuf* m : mv)
530 m->FlipFace(normal_only);
534 int SceneMain::GetKeyframeMax(void) const
537 for (const GeomObject& o : m_Objects)
539 kf = (std::max)(kf, o.m_BoneAnimation.GetFrameMax());