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)
24 m_ConstantColorStrength = 1.0f;
27 void SceneMain::Initialize(void)
29 m_DefaultMaterial = lib_graph::MaterialSamples::GetSilver();
31 m_DefaultAlphaMaterial = m_DefaultMaterial;
32 m_DefaultAlphaMaterial.SetAlphaAll( 0.75f );
34 m_DefaultTexture.InitializeTexture();
38 m_EnvImg.InitEnvMap();
41 void SceneMain::FinalizeScene(void)
43 m_DefaultTexture.FinalizeTexture();
50 void SceneMain::ClearObjects(void)
52 for (GeomObject& obj : m_Objects)
58 m_Cursor3d.ResetCloseFace();
60 ReportDoneEditGeometry();
64 void SceneMain::ImportFileAutoFmt(const QString& path)
66 geom::GeomFileFormat fmt = FormatType::GetGeomFileTypeFromPath(path);
67 if (fmt == GeomFileFormat::None)
68 throw FileLoadErrorException("Unknown format");
70 if (!ImportFile(path.toLocal8Bit().data(), 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 AppendWeight(std::vector<float>& vw, std::vector<lm::vec3f>& vp, lm::matrix4f& mat_parent, GeomObject& g, Bone* b, int frame)
105 md = b->GetFrameMatrix(frame);
107 md = md * mat_parent;
109 for(size_t j = 0; j < b->m_Weights.size(); ++j)
111 int vid = b->m_Weights[j].m_Vid;
112 float weight = b->m_Weights[j].m_Weight;
114 lm::vec3f v = g.m_BoneAnimation.m_SrcVertPos[vid];
116 v = v * b->m_Offset * md;
118 vp[vid] += v * weight;
121 for(size_t i = 0; i < b->m_Children.size(); ++i)
123 AppendWeight(vw, vp, md, g, b->m_Children[i], frame);
127 void SceneMain::SetFrame(int frame)
129 GeomObject& g = m_Objects[0];
130 lib_geo::BaseMesh& m = g.m_MeshAry[0].m_Mesh;
132 m.m_Verts = g.m_BoneAnimation.m_SrcVertPos;
134 std::vector<float> vw(m.m_Verts.size(), 0.0f);
135 std::vector<lm::vec3f> vp(m.m_Verts.size());
137 for (BoneRoot& br : g.m_BoneAnimation.m_RootNodes)
139 lm::matrix4f mi = br.m_Transform;
140 AppendWeight(vw, vp, mi, g, br.m_Bone, frame);
143 for (size_t i = 0; i < m.m_Verts.size(); ++i)
146 m.m_Verts[i] = vp[i] / vw[i];
152 int SceneMain::GetMaxFrame(void) const
154 size_t max_frame = 0;
155 for (const GeomObject& g : m_Objects)
157 for (const Bone& b : g.m_BoneAnimation.m_Bones)
159 max_frame = (std::max)(max_frame, b.m_Translate.size());
160 max_frame = (std::max)(max_frame, b.m_Scale.size());
161 max_frame = (std::max)(max_frame, b.m_Rotate.size());
169 void SceneMain::UpdateTransform(void)
171 SceneTransform& t = m_WorldTransform;
174 t.m_Translate.set_zero();
176 lm::range3f r = GetSceneBBox();
180 if( m_Config.m_EnableAutoCentering )
182 t.m_Translate = -r.mid_point();
185 if( m_Config.m_EnableAutoReisze )
187 t.SetScale(1.0f / r.max_length());
192 void SceneMain::LoadDefaultMatTexture(const std::string& filename)
194 m_DefaultTexture.LoadTextureFromFile(filename.c_str(), true);
195 m_DefaultTexture.SetTextureGLAndReleaseImage(m_TexConfig);
199 //!
\83I
\83u
\83T
\81[
\83o
\82ð
\83Z
\83b
\83g.
200 //!
\8f\8a\97L
\8c \82Í
\8e\9d\82½
\82È
\82¢.
201 void SceneMain::AddObserver(SceneObserver* observer)
203 m_Observers.push_back( observer );
206 bool SceneMain::RemoveObserver(size_t idx)
208 assert( idx < m_Observers.size() );
209 if( idx < m_Observers.size() )
212 std::vector<SceneObserver*>::iterator i = m_Observers.begin();
213 std::advance( i , idx );
214 m_Observers.erase( i );
219 bool SceneMain::RemoveObserver(SceneObserver* registered_observer)
221 for( size_t i = 0 ; i < m_Observers.size() ; ++i )
223 if( m_Observers[i] == registered_observer )
224 return RemoveObserver( i );
232 void SceneMain::ReportDoneEditGeometry(void)
234 for( size_t i = 0 ; i < m_Observers.size() ; ++i )
236 m_Observers[i]->OnGeometryBuild(*this);
240 lm::range3f SceneMain::GetSceneBBox(void) const
245 for (const GeomObject& obj : m_Objects)
247 bbox.expand(obj.GetBBox());
253 lm::range3f SceneMain::GetSceneTransformedBBox(void) const
255 lm::range3f bbox = GetSceneBBox();
259 tbb.expand(m_WorldTransform.TransformVec(bbox.min_point()));
260 tbb.expand(m_WorldTransform.TransformVec(bbox.max_point()));
266 GeomObject* SceneMain::GetPrimaryObject(void)
268 if (!m_Sels.IsObjectSelected())
271 if (m_Objects.empty())
274 return &m_Objects[m_Sels.GetSelObjectIdx()];
277 const GeomObject* SceneMain::GetPrimaryObject(void) const
279 if (!m_Sels.IsObjectSelected())
282 if (m_Objects.empty())
285 return &m_Objects[m_Sels.GetSelObjectIdx()];
289 void SceneMain::GetSelectedMeshes(std::vector<MeshBuf*>& meshes)
291 GeomObject* obj = GetPrimaryObject();
295 if (m_Sels.IsMBufSelected())
297 meshes.resize(1, &obj->m_MeshAry[m_Sels.GetMBufIdx()]);
301 meshes.reserve(obj->m_MeshAry.size());
302 for (MeshBuf& m : obj->m_MeshAry)
304 meshes.push_back(&m);
309 MeshBuf* SceneMain::GetPrimaryMeshbuf(void)
311 GeomObject* obj = GetPrimaryObject();
315 if (!m_Sels.IsMBufSelected())
318 return &obj->m_MeshAry[m_Sels.GetMBufIdx()];
321 const MeshBuf* SceneMain::GetPrimaryMeshbuf(void) const
323 const GeomObject* obj = GetPrimaryObject();
327 if (!m_Sels.IsMBufSelected())
330 return &obj->m_MeshAry[m_Sels.GetMBufIdx()];
333 GeomTextureSet* SceneMain::GetSelectedTexture(void)
335 int idx = GetSelectedMatIdx();
339 return GetPrimaryMeshbuf()->GetTexture(idx);
342 lib_geo::BaseMaterial* SceneMain::GetSelectedMaterial(void)
344 int idx = GetSelectedMatIdx();
348 return GetPrimaryMeshbuf()->GetMaterial(idx);
351 int SceneMain::GetSelectedMatIdx(void)
353 MeshBuf* mbuf = GetPrimaryMeshbuf();
357 int idx = m_Sels.GetSelMat();
358 if (!mbuf->IsValidMaterialIdx(idx))
365 void SceneMain::RemoveItem(int sel_idx)
367 boost::ptr_vector<GeomObject>::iterator i;
368 i = m_Objects.begin();
371 if (i->IsInChild(m_Cursor3d.CloseFaceMBuf))
372 m_Cursor3d.ResetCloseFace();
376 m_Sels.ClearSelect();
378 RefreshObjectIndex();
382 void SceneMain::CreateSampleTexture(SampleTextureBuilder::TextureType tex_type)
384 SDL_Surface* tex = SampleTextureBuilder::CreateTexture(tex_type, 256);
388 m_DefaultTexture.SetFromSDLSurface( tex );
389 m_DefaultTexture.SetTextureGLAndReleaseImage(m_TexConfig);
393 void SceneMain::RefreshObjectIndex(void)
395 for (size_t i = 0; i < m_Objects.size(); ++i)
397 GeomObject& o = m_Objects[i];
398 o.m_ObjectIndex = (int)i;
399 for (size_t j = 0; j < o.m_MeshAry.size(); ++j)
401 MeshBuf& m = o.m_MeshAry[j];
402 m.m_MBufIdx = (int)j;
408 bool SceneMain::ReloadObject(GeomObject* obj)
410 if(!obj->IsFileObject())
413 int idx = FindObjectIdx(obj);
420 geom::GeomFileFormat fmt = obj->m_FileFormat;
421 const std::string filename = obj->m_FilePath;
425 return ImportFile(filename, fmt);
428 int SceneMain::FindObjectIdx(const GeomObject* obj) const
430 for (const GeomObject& o : m_Objects)
433 return o.GetObjectIndex();
440 void SceneMain::ShowAllObject(void)
442 for (GeomObject& o : m_Objects)
445 for (MeshBuf& m : o.m_MeshAry)
450 void SceneMain::HideAllObject(void)
452 for (GeomObject& o : m_Objects)
455 for (MeshBuf& m : o.m_MeshAry)
460 void SceneMain::ClearAllVertSelect(void)
462 for (GeomObject& obj : m_Objects)
464 for (MeshBuf& mbuf : obj.m_MeshAry)
472 void SceneMain::AddCrossSectionRecord()
474 UpdateCrossSectionIfRequire(true);
476 for (GeomObject& obj : m_Objects)
478 for (MeshBuf& mbuf : obj.m_MeshAry)
480 mbuf.m_CrossSectionLog.push_back(lib_geo::CrossSection());
481 std::swap(mbuf.m_CrossSectionLog.back(), mbuf.m_CrossSection);
486 void SceneMain::ClearCrossSectionRecord()
488 for (GeomObject& obj : m_Objects)
490 for (MeshBuf& mbuf : obj.m_MeshAry)
492 mbuf.m_CrossSectionLog.clear();
497 void SceneMain::GetFreeCutParam(lm::vec3f& p, lm::vec3f& n)
499 Cursor3D& c = m_Cursor3d;
504 void SceneMain::UpdateCrossSectionIfRequire(bool force_update)
506 const CrossSectionConfig& conf = m_CrossSectionConfig;
510 if (!conf.IsRequireUpdateCS())
514 lib_geo::Plane cutplane;
516 if (conf.IsFreeCut())
517 GetFreeCutParam(cutplane.origin, cutplane.normal);
519 conf.GetCutPlane(GetSceneBBox(), cutplane);
521 bool cs_group = conf.m_EnableCrossSectionGroup;
523 for (GeomObject& obj : m_Objects)
525 for (MeshBuf& mbuf : obj.m_MeshAry)
527 mbuf.UpdateCrossSection(cs_group, cutplane);