• R/O
  • HTTP
  • SSH
  • HTTPS

QtGeoViewer: Commit


Commit MetaInfo

Revisiondb6acbc7ea320b7172b449a55caa719808733b52 (tree)
Time2018-09-29 17:51:30
Authorqw_fuku <fkhideaki@gmai...>
Commiterqw_fuku

Log Message

Merge branch 'develop'

Change Summary

Incremental Difference

--- a/Lib/LibGeo/Mesh/BaseMesh.cpp
+++ b/Lib/LibGeo/Mesh/BaseMesh.cpp
@@ -28,7 +28,6 @@ void BaseMesh::Clear(void)
2828 m_Materials.clear();
2929 }
3030
31-
3231 //! 1頂点1法線となるように法線バッファを生成する
3332 void BaseMesh::CreateNormalsEachVerts(bool resetSmooth)
3433 {
@@ -75,11 +74,11 @@ void BaseMesh::UpdateNormal(void)
7574
7675 for (size_t j = 0; j < f.NumTriangles(); ++j)
7776 {
78- lm::vec3f n = CalcFaceNormal(f, 0, j+1, j+2);
77+ lm::vec3f n = CalcFaceNormal(f, 0, j + 1, j + 2);
7978
80- m_Normals[f.m_NormIds[0 ]] += n;
81- m_Normals[f.m_NormIds[j+1]] += n;
82- m_Normals[f.m_NormIds[j+2]] += n;
79+ m_Normals[f.m_NormIds[0]] += n;
80+ m_Normals[f.m_NormIds[j + 1]] += n;
81+ m_Normals[f.m_NormIds[j + 2]] += n;
8382 }
8483 }
8584
@@ -98,56 +97,60 @@ void BaseMesh::NormalizeNormal(void)
9897 m_Normals[i].normalize();
9998 }
10099
101-
102100 //! ポリゴンの構造からエッジバッファを生成する
103101 void BaseMesh::CreateEdgeFromFace(void)
104102 {
105103 m_Edges.clear();
106104
107- std::vector< std::set<int> > VertLinks(m_Verts.size());
105+ std::vector<std::set<int>> VertLinks(m_Verts.size());
108106 for (const BaseFace& f : m_Faces)
109107 {
110- for( size_t j = 0 ; j < f.NumVertices() ; ++j )
108+ for (size_t j = 0; j < f.NumVertices(); ++j)
111109 {
112- int edge_vid0 = f.m_VertIds[ j ];
113- int edge_vid1 = f.m_VertIds[ (j+1) % f.NumVertices() ];
114- if( edge_vid0 > edge_vid1 )
115- std::swap( edge_vid0 , edge_vid1 );
110+ int edge_vid0 = f.m_VertIds[j];
111+ int edge_vid1 = f.m_VertIds[(j + 1) % f.NumVertices()];
112+ if (edge_vid0 > edge_vid1)
113+ std::swap(edge_vid0, edge_vid1);
116114
117- VertLinks[edge_vid0].insert( edge_vid1 );
115+ VertLinks[edge_vid0].insert(edge_vid1);
118116 }
119117 }
120118
121119 for (size_t i = 0; i < VertLinks.size(); ++i)
122120 {
123- for( std::set<int>::iterator iter = VertLinks[i].begin() ; iter != VertLinks[i].end() ; ++iter )
121+ for (std::set<int>::iterator iter = VertLinks[i].begin(); iter != VertLinks[i].end(); ++iter)
124122 {
125123 BaseEdge e;
126124 e.m_EdgeVids[0] = (int)i;
127125 e.m_EdgeVids[1] = *iter;
128- m_Edges.push_back( e );
126+ m_Edges.push_back(e);
129127 }
130128 }
131129 }
132130
133131 void BaseMesh::CreateTangentsByUV(void)
134132 {
133+ if (true)
134+ CreateTangentsByUV_E();
135+ else
136+ CreateTangentsByUV_F();
137+}
138+
139+void BaseMesh::CreateTangentsByUV_E(void)
140+{
135141 m_Tangents.clear();
136142 m_Tangents.resize(m_UVs.size(), lm::vec3f::get_zero());
137143
138- for (size_t i = 0; i < m_Faces.size(); ++i)
144+ for (const lib_geo::BaseFace& f : m_Faces)
139145 {
140- const lib_geo::BaseFace& f = m_Faces[i];
141-
142- if( !f.HasUV() )
146+ if (!f.HasUV())
143147 continue;
144148
145- size_t polygon_size = f.m_UVIds.size();
146-
147- for(size_t j = 0; j < polygon_size; ++j)
149+ size_t numE = f.m_UVIds.size();
150+ for (size_t j = 0; j < numE; ++j)
148151 {
149152 size_t idx0 = j;
150- size_t idx1 = (j+1) % polygon_size;
153+ size_t idx1 = (j + 1) % numE;
151154
152155 int uvid0 = f.m_UVIds[idx0];
153156 int uvid1 = f.m_UVIds[idx1];
@@ -173,9 +176,68 @@ void BaseMesh::CreateTangentsByUV(void)
173176 }
174177 }
175178
176- for (size_t i = 0; i < m_UVs.size(); ++i)
179+ for (lm::vec3f& t : m_Tangents)
177180 {
178- m_Tangents[i].normalize();
181+ t.normalize();
182+ }
183+}
184+
185+void BaseMesh::CreateTangentsByUV_F(void)
186+{
187+ m_Tangents.clear();
188+ m_Tangents.resize(m_UVs.size(), lm::vec3f::get_zero());
189+
190+ for (const lib_geo::BaseFace& f : m_Faces)
191+ {
192+ if (!f.HasUV())
193+ continue;
194+
195+ size_t numT = f.m_UVIds.size() - 2;
196+ for (size_t j = 0; j < numT; ++j)
197+ {
198+ size_t idx1 = 0;
199+ size_t idx2 = j + 1;
200+ size_t idx3 = j + 2;
201+
202+ int uvid1 = f.m_UVIds[idx1];
203+ int uvid2 = f.m_UVIds[idx2];
204+ int uvid3 = f.m_UVIds[idx3];
205+ int vid1 = f.m_VertIds[idx1];
206+ int vid2 = f.m_VertIds[idx2];
207+ int vid3 = f.m_VertIds[idx3];
208+ int nid1 = f.m_NormIds[idx1];
209+ int nid2 = f.m_NormIds[idx2];
210+ int nid3 = f.m_NormIds[idx3];
211+
212+ lm::vec3f& P1 = m_Verts[vid1];
213+ lm::vec3f& P2 = m_Verts[vid2];
214+ lm::vec3f& P3 = m_Verts[vid3];
215+ lm::vec3f& N1 = m_Normals[nid1];
216+ lm::vec3f& N2 = m_Normals[nid2];
217+ lm::vec3f& N3 = m_Normals[nid3];
218+ lm::vec2f& uv1 = m_UVs[uvid1];
219+ lm::vec2f& uv2 = m_UVs[uvid2];
220+ lm::vec2f& uv3 = m_UVs[uvid3];
221+
222+ lm::vec3f dv21 = P2 - P1;
223+ lm::vec3f dv31 = P3 - P1;
224+ lm::vec2f dt21 = uv2 - uv1;
225+ lm::vec2f dt31 = uv3 - uv1;
226+
227+ float fn2 = dt21.x * dt31.y - dt21.y * dt31.x;
228+ if (fn2 != 0)
229+ {
230+ lm::vec3f tt = -(dv31 * dt21.y - dv21 * dt31.y) / fn2;
231+ m_Tangents[uvid1] = (N1 ^ tt) ^ N1;
232+ m_Tangents[uvid2] = (N2 ^ tt) ^ N2;
233+ m_Tangents[uvid3] = (N3 ^ tt) ^ N3;
234+ }
235+ }
236+ }
237+
238+ for (lm::vec3f& t : m_Tangents)
239+ {
240+ t.normalize();
179241 }
180242 }
181243
@@ -243,7 +305,7 @@ void BaseMesh::SetAdj_VtoE(void)
243305
244306 void BaseMesh::SetAdj_EtoF(void)
245307 {
246- std::vector< std::vector<BaseEdge*> > EidMap(m_Verts.size());
308+ std::vector<std::vector<BaseEdge*>> EidMap(m_Verts.size());
247309 for (size_t i = 0; i < m_Edges.size(); ++i)
248310 {
249311 BaseEdge& e = m_Edges[i];
@@ -267,7 +329,7 @@ void BaseMesh::SetAdj_EtoF(void)
267329 {
268330 int vid0 = f.m_VertIds[j];
269331 int vid1 = f.m_VertIds[(j + 1) % NumFVerts];
270- if(vid0 > vid1)
332+ if (vid0 > vid1)
271333 std::swap(vid0, vid1);
272334
273335 std::vector<BaseEdge*>& va_edges = EidMap[vid0];
@@ -311,11 +373,11 @@ void BaseMesh::UpdateAdjVertNormal(void)
311373 {
312374 for (size_t j = 0; j < f.NumTriangles(); ++j)
313375 {
314- lm::vec3f n = CalcFaceNormal(f, 0, j+1, j+2);
376+ lm::vec3f n = CalcFaceNormal(f, 0, j + 1, j + 2);
315377
316- m_VertAdj[f.m_VertIds[0 ]].m_NormalAvg += n;
317- m_VertAdj[f.m_VertIds[j+1]].m_NormalAvg += n;
318- m_VertAdj[f.m_VertIds[j+2]].m_NormalAvg += n;
378+ m_VertAdj[f.m_VertIds[0]].m_NormalAvg += n;
379+ m_VertAdj[f.m_VertIds[j + 1]].m_NormalAvg += n;
380+ m_VertAdj[f.m_VertIds[j + 2]].m_NormalAvg += n;
319381 }
320382 }
321383
@@ -341,7 +403,6 @@ lm::range3f BaseMesh::CalcAABB(void) const
341403 return aabb;
342404 }
343405
344-
345406 //! 全ポリゴンを三角化する.
346407 void BaseMesh::Triangulate(void)
347408 {
@@ -360,7 +421,7 @@ void BaseMesh::Triangulate(void)
360421 continue;
361422 }
362423
363- for (size_t j = 0 ; j < f.NumTriangles(); ++j)
424+ for (size_t j = 0; j < f.NumTriangles(); ++j)
364425 {
365426 int sub_vid0 = 0;
366427 int sub_vid1 = (int)j + 1;
@@ -382,7 +443,6 @@ void BaseMesh::Triangulate(void)
382443 CreateAdjBuffers();
383444 }
384445
385-
386446 //! 未使用頂点バッファを切り詰める.
387447 void BaseMesh::RemoveNotReferencedVertex(void)
388448 {
@@ -395,7 +455,7 @@ void BaseMesh::RemoveNotReferencedVertex(void)
395455 std::vector<int> NewVertIdx(m_Verts.size(), -1);
396456 for (size_t i = 0; i < VertRef.size(); ++i)
397457 {
398- if( VertRef[i] )
458+ if (VertRef[i])
399459 NewVertIdx[i] = (int)VidCount++;
400460 }
401461
@@ -408,7 +468,7 @@ void BaseMesh::RemoveNotReferencedVertex(void)
408468 }
409469
410470 size_t UidCount = 0;
411- std::vector<int> NewUVIdx( m_UVs.size() , -1 );
471+ std::vector<int> NewUVIdx(m_UVs.size(), -1);
412472 for (size_t i = 0; i < UVRef.size(); ++i)
413473 {
414474 if (UVRef[i])
@@ -491,45 +551,43 @@ void BaseMesh::RemoveNotReferencedVertex(void)
491551 // 修正前のメッシュで使用されていた頂点を求める
492552 void BaseMesh::GetReferencedVertMap(std::vector<bool>& VertRef, std::vector<bool>& NormalRef, std::vector<bool>& UVRef) const
493553 {
494- VertRef.resize( m_Verts.size() , false );
495- NormalRef.resize( m_Normals.size() , false );
496- UVRef.resize( m_UVs.size() , false );
554+ VertRef.resize(m_Verts.size(), false);
555+ NormalRef.resize(m_Normals.size(), false);
556+ UVRef.resize(m_UVs.size(), false);
497557
498558 for (const BaseFace& face : m_Faces)
499559 {
500- for( size_t j = 0 ; j < face.m_VertIds.size() ; ++j )
560+ for (size_t j = 0; j < face.m_VertIds.size(); ++j)
501561 {
502- VertRef[ face.m_VertIds[j] ] = true;
562+ VertRef[face.m_VertIds[j]] = true;
503563 }
504564
505- for( size_t j = 0 ; j < face.m_NormIds.size() ; ++j )
565+ for (size_t j = 0; j < face.m_NormIds.size(); ++j)
506566 {
507- NormalRef[ face.m_NormIds[j] ] = true;
567+ NormalRef[face.m_NormIds[j]] = true;
508568 }
509569
510- for( size_t j = 0 ; j < face.m_UVIds.size() ; ++j )
570+ for (size_t j = 0; j < face.m_UVIds.size(); ++j)
511571 {
512- UVRef[ face.m_UVIds[j] ] = true;
572+ UVRef[face.m_UVIds[j]] = true;
513573 }
514574 }
515575
516576 for (const BasePolyline& pl : m_Polylines)
517577 {
518- for( size_t j = 0; j < pl.m_PLVids.size(); ++j )
578+ for (size_t j = 0; j < pl.m_PLVids.size(); ++j)
519579 {
520- VertRef[ pl.m_PLVids[j] ] = true;
580+ VertRef[pl.m_PLVids[j]] = true;
521581 }
522582 }
523583 }
524584
525-
526585 //! 隣接頂点の結合
527586 void BaseMesh::RemDoubleVertex(void)
528587 {
529- // 実装中
588+ // 実装中
530589 }
531590
532-
533591 void BaseMesh::Translate(const lm::vec3f& v)
534592 {
535593 for (lm::vec3f& v : m_Verts)
@@ -538,7 +596,7 @@ void BaseMesh::Translate(const lm::vec3f& v)
538596 }
539597 }
540598
541-void BaseMesh::Translate(float x , float y , float z)
599+void BaseMesh::Translate(float x, float y, float z)
542600 {
543601 for (lm::vec3f& v : m_Verts)
544602 {
@@ -554,7 +612,7 @@ void BaseMesh::Scale(float s)
554612 }
555613 }
556614
557-void BaseMesh::Scale(float sx , float sy , float sz)
615+void BaseMesh::Scale(float sx, float sy, float sz)
558616 {
559617 for (lm::vec3f& v : m_Verts)
560618 {
@@ -586,7 +644,6 @@ void BaseMesh::Rotate(const lm::vec3f& axis, float angle)
586644 v.rotate(angle, axis);
587645 }
588646
589-
590647 size_t BaseMesh::NumTriangles(void) const
591648 {
592649 size_t n = 0;
@@ -598,19 +655,18 @@ size_t BaseMesh::NumTriangles(void) const
598655 return n;
599656 }
600657
601-
602658 void BaseMesh::CalcNormalEachVerts(std::vector<lm::vec3f>& normals) const
603659 {
604660 normals.clear();
605- normals.resize( m_Verts.size() , lm::vec3f(0.0f, 0.0f, 0.0f) );
661+ normals.resize(m_Verts.size(), lm::vec3f(0.0f, 0.0f, 0.0f));
606662
607663 for (const BaseFace& f : m_Faces)
608664 {
609665 for (size_t j = 0; j < f.NumTriangles(); ++j)
610666 {
611- int vid0 = f.m_VertIds[0 ];
612- int vid1 = f.m_VertIds[j+1];
613- int vid2 = f.m_VertIds[j+2];
667+ int vid0 = f.m_VertIds[0];
668+ int vid1 = f.m_VertIds[j + 1];
669+ int vid2 = f.m_VertIds[j + 2];
614670 const lm::vec3f& v0 = m_Verts[vid0];
615671 const lm::vec3f& v1 = m_Verts[vid1];
616672 const lm::vec3f& v2 = m_Verts[vid2];
@@ -622,11 +678,10 @@ void BaseMesh::CalcNormalEachVerts(std::vector<lm::vec3f>& normals) const
622678 }
623679 }
624680
625- for( size_t i = 0 ; i < normals.size() ; ++i )
681+ for (size_t i = 0; i < normals.size(); ++i)
626682 normals[i].normalize();
627683 }
628684
629-
630685 lm::vec3f BaseMesh::GetFaceCenter(const size_t face_idx) const
631686 {
632687 return GetFaceCenter(m_Faces[face_idx]);
@@ -665,32 +720,31 @@ lm::vec3f BaseMesh::CalcFaceNormal(const BaseFace& f, int lvid0, int lvid1, int
665720 return cross(v1 - v0, v2 - v0);
666721 }
667722
668-
669723 void BaseMesh::MergeLinkedPolylines(void)
670724 {
671- for(;;)
725+ for (;;)
672726 {
673727 bool updated = false;
674728
675- for(size_t i = 0; i < m_Polylines.size(); ++i)
729+ for (size_t i = 0; i < m_Polylines.size(); ++i)
676730 {
677- for(size_t j = i + 1; j < m_Polylines.size(); ++j)
731+ for (size_t j = i + 1; j < m_Polylines.size(); ++j)
678732 {
679733 BasePolyline& p0 = m_Polylines[i];
680734 BasePolyline& p1 = m_Polylines[j];
681735
682- if(p0.m_PLVids.back() == p1.m_PLVids.front())
736+ if (p0.m_PLVids.back() == p1.m_PLVids.front())
683737 {
684738 }
685- else if(p0.m_PLVids.back() == p1.m_PLVids.back())
739+ else if (p0.m_PLVids.back() == p1.m_PLVids.back())
686740 {
687741 std::reverse(p1.m_PLVids.begin(), p1.m_PLVids.end());
688742 }
689- else if(p0.m_PLVids.front() == p1.m_PLVids.front())
743+ else if (p0.m_PLVids.front() == p1.m_PLVids.front())
690744 {
691745 std::reverse(p0.m_PLVids.begin(), p0.m_PLVids.end());
692746 }
693- else if(p0.m_PLVids.front() == p1.m_PLVids.back())
747+ else if (p0.m_PLVids.front() == p1.m_PLVids.back())
694748 {
695749 std::reverse(p0.m_PLVids.begin(), p0.m_PLVids.end());
696750 std::reverse(p1.m_PLVids.begin(), p1.m_PLVids.end());
@@ -700,7 +754,7 @@ void BaseMesh::MergeLinkedPolylines(void)
700754 continue;
701755 }
702756
703- for(size_t k = 1; k < p1.m_PLVids.size(); ++k)
757+ for (size_t k = 1; k < p1.m_PLVids.size(); ++k)
704758 {
705759 p0.m_PLVids.push_back(p1.m_PLVids[k]);
706760 }
@@ -713,12 +767,11 @@ void BaseMesh::MergeLinkedPolylines(void)
713767 }
714768 }
715769
716- if(!updated)
770+ if (!updated)
717771 break;
718772 }
719773 }
720774
721-
722775 bool BaseMesh::GetClosestSubfacePos(const lm::vec3f& pos, SubfaceIdx& sf, lm::vec3f& close_pos) const
723776 {
724777 sf.Reset();
--- a/Lib/LibGeo/Mesh/BaseMesh.h
+++ b/Lib/LibGeo/Mesh/BaseMesh.h
@@ -32,6 +32,8 @@ public:
3232 virtual void CreateEdgeFromFace(void);
3333
3434 virtual void CreateTangentsByUV(void);
35+ virtual void CreateTangentsByUV_E(void);
36+ virtual void CreateTangentsByUV_F(void);
3537
3638 virtual void ClearAllAdjBuffer(void);
3739 virtual void CreateAdjBuffers(void);
--- a/Lib/LibGeo/Mesh/STL/STLMesh.cpp
+++ b/Lib/LibGeo/Mesh/STL/STLMesh.cpp
@@ -15,10 +15,7 @@ namespace lib_geo
1515
1616 StlMesh::StlMesh(void)
1717 {
18- for( int i = 0 ; i < MSG_LENGTH ; ++i )
19- {
20- m_Message[i] = 0;
21- }
18+ ClearMessage();
2219 }
2320
2421 void StlMesh::Clear(void)
@@ -29,7 +26,7 @@ void StlMesh::Clear(void)
2926
3027 void StlMesh::ClearMessage(void)
3128 {
32- for( int i = 0 ; i < MSG_LENGTH ; ++i )
29+ for (int i = 0; i < MSG_LENGTH; ++i)
3330 {
3431 m_Message[i] = 0;
3532 }
@@ -44,44 +41,44 @@ bool StlMesh::LoadBinary(std::istream& in)
4441 in.read(m_Message, MSG_LENGTH);
4542
4643 unsigned int NumFaces;
47- in.read((char*)&NumFaces , sizeof(unsigned int));
44+ in.read((char*)&NumFaces, sizeof(unsigned int));
4845
4946 const size_t expectedBinaryFileSize = NumFaces * 50 + 84;
5047
5148 if (expectedBinaryFileSize != fileSize)
5249 return false;
5350
54- m_Faces.resize( NumFaces );
51+ m_Faces.resize(NumFaces);
5552 for (size_t i = 0; i < NumFaces; ++i)
5653 {
57- char padding[2] = { 0 , 0 };
54+ char padding[2] = {0, 0};
5855
5956 StlFace& f = m_Faces[i];
60- in.read( (char*)f.m_Normal.v() , sizeof(float)*3 );
61- in.read( (char*)f.m_Verts[0].v() , sizeof(float)*3 );
62- in.read( (char*)f.m_Verts[1].v() , sizeof(float)*3 );
63- in.read( (char*)f.m_Verts[2].v() , sizeof(float)*3 );
64- in.read( padding , 2 );
57+ in.read((char*)f.m_Normal.v(), sizeof(float) * 3);
58+ in.read((char*)f.m_Verts[0].v(), sizeof(float) * 3);
59+ in.read((char*)f.m_Verts[1].v(), sizeof(float) * 3);
60+ in.read((char*)f.m_Verts[2].v(), sizeof(float) * 3);
61+ in.read(padding, 2);
6562 }
6663
6764 return true;
6865 }
6966
70-bool StlMesh::LoadText(std::istream& in)
67+bool StlMesh::LoadAscii(std::istream& in)
7168 {
7269 if (!IsExistValidAsciiHeader(in))
7370 return false;
7471
7572 Clear();
7673
77- in.seekg( 0 , std::ios::beg );
74+ in.seekg(0, std::ios::beg);
7875
7976 StlFace f;
8077 int vcount = 0;
8178
8279 std::string ws;
8380 std::getline(in, ws);
84- while(!in.eof())
81+ while (!in.eof())
8582 {
8683 std::getline(in, ws);
8784 if (ws.empty())
@@ -94,7 +91,7 @@ bool StlMesh::LoadText(std::istream& in)
9491 if (s == "facet")
9592 {
9693 lm::vec3f o(0.0f, 0.0f, 0.0f);
97- f.m_Normal = o;
94+ f.m_Normal = o;
9895 f.m_Verts[0] = o;
9996 f.m_Verts[1] = o;
10097 f.m_Verts[2] = o;
@@ -132,7 +129,7 @@ bool StlMesh::LoadText(std::istream& in)
132129
133130 bool StlMesh::IsExistValidAsciiHeader(std::istream& in)
134131 {
135- in.read( m_Message , MSG_LENGTH );
132+ in.read(m_Message, MSG_LENGTH);
136133
137134 m_Message[5] = '\0';
138135 std::string top = m_Message;
@@ -148,91 +145,128 @@ bool StlMesh::Load(std::istream& ist)
148145
149146 ist.seekg(0, std::ios::beg);
150147
151- if (LoadText(ist))
148+ if (LoadAscii(ist))
152149 return true;
153150
154151 return false;
155-
156152 }
157153
158-bool StlMesh::Load( const std::string& i_Filename )
154+bool StlMesh::Load(const std::string& filename)
159155 {
160- std::ifstream ifs( i_Filename.c_str() , std::ios::binary );
161- if( !ifs.is_open() )
156+ std::ifstream ifs(filename.c_str(), std::ios::binary);
157+ if (!ifs.is_open())
162158 return false;
163159
164160 return Load(ifs);
165161 }
166162
167-bool StlMesh::Save( std::ostream& ost ) const
163+bool StlMesh::SaveBinary(std::ostream& ost) const
168164 {
169165 unsigned int NumFaces = (unsigned int)m_Faces.size();
170- ost.write( m_Message , MSG_LENGTH );
171- ost.write( (char*)&NumFaces , sizeof(unsigned int) );
166+ ost.write(m_Message, MSG_LENGTH);
167+ ost.write((char*)&NumFaces, sizeof(unsigned int));
172168
173- for( size_t i = 0 ; i < NumFaces ; ++i )
169+ char padding[2] = {0, 0};
170+
171+ for (const StlFace& f : m_Faces)
174172 {
175- char padding[2] = { 0 , 0 };
173+ ost.write((char*)f.m_Normal.v(), sizeof(float) * 3);
174+ ost.write((char*)f.m_Verts[0].v(), sizeof(float) * 3);
175+ ost.write((char*)f.m_Verts[1].v(), sizeof(float) * 3);
176+ ost.write((char*)f.m_Verts[2].v(), sizeof(float) * 3);
177+ ost.write(padding, 2);
178+ }
179+
180+ return true;
181+}
182+
183+bool StlMesh::SaveBinary(const std::string& filename) const
184+{
185+ std::ofstream ofs(filename.c_str(), std::ios::binary);
186+ if (!ofs.is_open())
187+ return false;
188+
189+ return SaveBinary(ofs);
190+}
191+
192+bool StlMesh::SaveAscii(std::ostream& ost) const
193+{
194+ ost << "solid " << m_Message << std::endl;
176195
177- ost.write( (char*)m_Faces[i].m_Normal.v() , sizeof(float)*3 );
178- ost.write( (char*)m_Faces[i].m_Verts[0].v() , sizeof(float)*3 );
179- ost.write( (char*)m_Faces[i].m_Verts[1].v() , sizeof(float)*3 );
180- ost.write( (char*)m_Faces[i].m_Verts[2].v() , sizeof(float)*3 );
181- ost.write( padding , 2 );
196+ for (const StlFace& f : m_Faces)
197+ {
198+ WriteAscciiVert(ost, "facet normal", f.m_Normal);
199+ ost << "outer loop" << std::endl;
200+ WriteAscciiVert(ost, "vertex", f.m_Verts[0]);
201+ WriteAscciiVert(ost, "vertex", f.m_Verts[1]);
202+ WriteAscciiVert(ost, "vertex", f.m_Verts[2]);
203+ ost << "endloop" << std::endl;
204+ ost << "endfacet" << std::endl;
182205 }
183206
207+ ost << "endsolid" << std::endl;
208+
184209 return true;
185210 }
186211
187-bool StlMesh::Save( const std::string& i_Filename ) const
212+bool StlMesh::SaveAscii(const std::string& filename) const
188213 {
189- std::ofstream ofs( i_Filename.c_str() , std::ios::binary );
190- if( !ofs.is_open() )
214+ std::ofstream ofs(filename.c_str());
215+ if (!ofs.is_open())
191216 return false;
192217
193- return Save( ofs );
218+ return SaveAscii(ofs);
219+}
220+
221+void StlMesh::WriteAscciiVert(std::ostream& out, const char* head, const lm::vec3f& v) const
222+{
223+ out << head
224+ << " " << v.x
225+ << " " << v.y
226+ << " " << v.z
227+ << std::endl;
194228 }
195229
196-bool StlMesh::ConvertToBaseMesh( BaseMesh& o_mesh ) const
230+bool StlMesh::ConvertToBaseMesh(BaseMesh& bm) const
197231 {
198- o_mesh.Clear();
232+ bm.Clear();
199233
200- o_mesh.m_Verts.resize( m_Faces.size() * 3 );
201- o_mesh.m_Normals.resize( m_Faces.size() );
202- o_mesh.m_Faces.resize( m_Faces.size() );
234+ bm.m_Verts.resize(m_Faces.size() * 3);
235+ bm.m_Normals.resize(m_Faces.size());
236+ bm.m_Faces.resize(m_Faces.size());
203237
204- for( size_t i = 0 ; i < m_Faces.size() ; ++i )
238+ for (size_t i = 0; i < m_Faces.size(); ++i)
205239 {
206240 const StlFace& f = m_Faces[i];
207241
208- o_mesh.m_Verts[ i * 3 + 0 ] = f.m_Verts[0];
209- o_mesh.m_Verts[ i * 3 + 1 ] = f.m_Verts[1];
210- o_mesh.m_Verts[ i * 3 + 2 ] = f.m_Verts[2];
242+ bm.m_Verts[i * 3 + 0] = f.m_Verts[0];
243+ bm.m_Verts[i * 3 + 1] = f.m_Verts[1];
244+ bm.m_Verts[i * 3 + 2] = f.m_Verts[2];
211245
212- o_mesh.m_Normals[ i ] = f.m_Normal;
246+ bm.m_Normals[i] = f.m_Normal;
213247
214- o_mesh.m_Faces[i].m_VertIds.resize(3);
215- o_mesh.m_Faces[i].m_NormIds.resize(3);
248+ BaseFace& bf = bm.m_Faces[i];
249+ bf.m_VertIds.resize(3);
250+ bf.m_NormIds.resize(3);
216251
217- o_mesh.m_Faces[i].m_VertIds[0] = (int)(i * 3 + 0);
218- o_mesh.m_Faces[i].m_VertIds[1] = (int)(i * 3 + 1);
219- o_mesh.m_Faces[i].m_VertIds[2] = (int)(i * 3 + 2);
252+ bf.m_VertIds[0] = (int)(i * 3 + 0);
253+ bf.m_VertIds[1] = (int)(i * 3 + 1);
254+ bf.m_VertIds[2] = (int)(i * 3 + 2);
220255
221- o_mesh.m_Faces[i].m_NormIds[0] = (int)i;
222- o_mesh.m_Faces[i].m_NormIds[1] = (int)i;
223- o_mesh.m_Faces[i].m_NormIds[2] = (int)i;
256+ bf.m_NormIds[0] = (int)i;
257+ bf.m_NormIds[1] = (int)i;
258+ bf.m_NormIds[2] = (int)i;
224259 }
225260
226261 return true;
227262 }
228263
229-
230264 //! サイズ0の法線を含む場合にtrueを返す
231265 bool StlMesh::ExistZeroLengthNormal(void) const
232266 {
233- for( size_t i = 0 ; i < m_Faces.size() ; ++i )
267+ for (const StlFace& f : m_Faces)
234268 {
235- if( m_Faces[i].m_Normal.is_zero() )
269+ if (f.m_Normal.is_zero())
236270 return true;
237271 }
238272
--- a/Lib/LibGeo/Mesh/STL/STLMesh.h
+++ b/Lib/LibGeo/Mesh/STL/STLMesh.h
@@ -17,8 +17,8 @@ class BaseMesh;
1717 class StlFace
1818 {
1919 public:
20- lm::vec3f m_Normal;
21- lm::vec3f m_Verts[3];
20+ lm::vec3f m_Normal;
21+ lm::vec3f m_Verts[3];
2222 };
2323
2424
@@ -31,12 +31,16 @@ public:
3131 StlMesh(void);
3232 void Clear(void);
3333
34- bool Load( std::istream& ist );
35- bool Load( const std::string& i_Filename );
36- bool Save( std::ostream& ost ) const;
37- bool Save( const std::string& i_Filename ) const;
34+ bool Load(std::istream& ist);
35+ bool Load(const std::string& filename);
3836
39- bool ConvertToBaseMesh( BaseMesh& o_mesh ) const;
37+ bool SaveBinary(std::ostream& ost) const;
38+ bool SaveBinary(const std::string& filename) const;
39+
40+ bool SaveAscii(std::ostream& ost) const;
41+ bool SaveAscii(const std::string& filename) const;
42+
43+ bool ConvertToBaseMesh(BaseMesh& bm) const;
4044
4145 bool ExistZeroLengthNormal(void) const;
4246
@@ -44,12 +48,14 @@ private:
4448 void ClearMessage(void);
4549
4650 bool LoadBinary(std::istream& in);
47- bool LoadText(std::istream& in);
51+ bool LoadAscii(std::istream& in);
4852
4953 bool IsExistValidAsciiHeader(std::istream& in);
5054
5155 bool IsBinarySTL(size_t fileSize);
5256
57+ void WriteAscciiVert(std::ostream& out, const char* head, const lm::vec3f& v) const;
58+
5359 public:
5460 char m_Message[MSG_LENGTH];
5561 std::vector<StlFace> m_Faces;
--- a/Src/QtGeoViewer/FormMain.cpp
+++ b/Src/QtGeoViewer/FormMain.cpp
@@ -235,6 +235,7 @@ void FormMain::InitializeVisiblStateMenu(void)
235235 dbmap.AddBinder(new MenuBinder(ui.actionEnableCulling , &cfg_3d.m_EnableCullFace ));
236236 dbmap.AddBinder(new MenuBinder(ui.actionDrawVid , &cfg_3d.m_DrawVid ));
237237 dbmap.AddBinder(new MenuBinder(ui.actionDrawVertNormal , &cfg_3d.m_DrawVertNormal ));
238+ dbmap.AddBinder(new MenuBinder(ui.actionDrawVertTan , &cfg_3d.m_DrawVertTan ));
238239 dbmap.AddBinder(new MenuBinder(ui.actionDrawVert , &cfg_3d.m_DrawVert ));
239240 dbmap.AddBinder(new MenuBinder(ui.actionWireVBO , &cfg_3d.m_EnableWireVBO ));
240241 dbmap.AddBinder(new MenuBinder(ui.actionIndexColorMode , &cfg_3d.m_IndexMaterial ));
--- a/Src/QtGeoViewer/FormMain.qrc
+++ b/Src/QtGeoViewer/FormMain.qrc
@@ -49,5 +49,6 @@
4949 <file>Resources/RecordStroke.png</file>
5050 <file>Resources/HilightSelectWire.png</file>
5151 <file>Resources/VCol.png</file>
52+ <file>Resources/VertTan.png</file>
5253 </qresource>
5354 </RCC>
--- a/Src/QtGeoViewer/FormMain.ui
+++ b/Src/QtGeoViewer/FormMain.ui
@@ -256,6 +256,7 @@
256256 <addaction name="actionDrawVert"/>
257257 <addaction name="actionDrawVid"/>
258258 <addaction name="actionDrawVertNormal"/>
259+ <addaction name="actionDrawVertTan"/>
259260 <addaction name="actionDrawFid"/>
260261 <addaction name="actionHighlightSelected"/>
261262 <addaction name="actionHighlightSelectedWire"/>
@@ -997,6 +998,7 @@ border: 1px solid black;
997998 <addaction name="actionDrawWire"/>
998999 <addaction name="actionDrawVert"/>
9991000 <addaction name="actionDrawVertNormal"/>
1001+ <addaction name="actionDrawVertTan"/>
10001002 <addaction name="actionDrawVid"/>
10011003 <addaction name="actionDrawFid"/>
10021004 <addaction name="actionDrawPolyline"/>
@@ -3792,6 +3794,19 @@ border: 1px solid black;
37923794 <string>VertexColor(0-1)</string>
37933795 </property>
37943796 </action>
3797+ <action name="actionDrawVertTan">
3798+ <property name="checkable">
3799+ <bool>true</bool>
3800+ </property>
3801+ <property name="icon">
3802+ <iconset>
3803+ <normalon>:/FormMain/Resources/VertTan.png</normalon>
3804+ </iconset>
3805+ </property>
3806+ <property name="text">
3807+ <string>Tangent(Vert)</string>
3808+ </property>
3809+ </action>
37953810 </widget>
37963811 <layoutdefault spacing="6" margin="11"/>
37973812 <customwidgets>
--- a/Src/QtGeoViewer/GeometryRender.cpp
+++ b/Src/QtGeoViewer/GeometryRender.cpp
@@ -679,9 +679,11 @@ void GeometryRender::DrawMeshExtAll(void)
679679
680680 if (m_Mesh->GetParent()->m_VertexOnlyMode || m_Config->m_DrawVert)
681681 DrawVert(mesh);
682-
682+
683683 if (m_Config->m_DrawVertNormal)
684684 DrawVertNormal(mesh);
685+ if (m_Config->m_DrawVertTan)
686+ DrawVertTangent(mesh);
685687
686688 if (m_Config->m_DrawFid)
687689 DrawMeshFid(mesh);
@@ -855,10 +857,15 @@ void GeometryRender::DrawVertNormal(const lib_geo::BaseMesh& mesh)
855857 glColor3d(0, 0.5, 1);
856858 for (const lib_geo::BaseFace& f : mesh.m_Faces)
857859 {
860+ if (mesh.m_Normals.empty())
861+ continue;
862+
858863 for (size_t j = 0; j < f.m_NormIds.size(); ++j)
859864 {
860865 int vi = f.m_VertIds[j];
861866 int ni = f.m_NormIds[j];
867+ if (ni == -1)
868+ continue;
862869
863870 const lm::vec3f& v = mesh.m_Verts[vi];
864871 const lm::vec3f& n = mesh.m_Normals[ni];
@@ -866,3 +873,28 @@ void GeometryRender::DrawVertNormal(const lib_geo::BaseMesh& mesh)
866873 }
867874 }
868875 }
876+
877+void GeometryRender::DrawVertTangent(const lib_geo::BaseMesh& mesh)
878+{
879+ float LineLen = m_Config->m_NormalLength * m_Mesh->GetBBox().max_length();
880+
881+ glLineWidth(1.0f);
882+ glColor3d(1, 0, 0.5);
883+ for (const lib_geo::BaseFace& f : mesh.m_Faces)
884+ {
885+ if (mesh.m_Tangents.empty())
886+ continue;
887+
888+ for (size_t j = 0; j < f.m_UVIds.size(); ++j)
889+ {
890+ int vi = f.m_VertIds[j];
891+ int ni = f.m_UVIds[j];
892+ if (ni == -1)
893+ continue;
894+
895+ const lm::vec3f& v = mesh.m_Verts[vi];
896+ const lm::vec3f& t = mesh.m_Tangents[ni];
897+ glDrawSegment(v, v + t * LineLen);
898+ }
899+ }
900+}
--- a/Src/QtGeoViewer/GeometryRender.h
+++ b/Src/QtGeoViewer/GeometryRender.h
@@ -59,6 +59,7 @@ private:
5959 void DrawVertPoint(const lib_geo::BaseMesh& mesh);
6060 void DrawVertVid(MeshBuf& mbuf);
6161 void DrawVertNormal(const lib_geo::BaseMesh& mesh);
62+ void DrawVertTangent(const lib_geo::BaseMesh& mesh);
6263
6364 void SetGLNormalColor(const lm::vec3f& n) const;
6465
--- a/Src/QtGeoViewer/GuiConfig.cpp
+++ b/Src/QtGeoViewer/GuiConfig.cpp
@@ -118,6 +118,7 @@ void Serialize_Config_ViewOption(SerializeBase& s, View3DConfig& config_3d)
118118 s.Serialize( config_3d.m_DrawBBox );
119119 s.Serialize( config_3d.m_DrawBBoxRange );
120120 s.Serialize( config_3d.m_DrawVertNormal );
121+ s.Serialize( config_3d.m_DrawVertTan );
121122 s.Serialize( config_3d.m_ShowVidTopMost );
122123 s.Serialize( config_3d.m_DrawBone );
123124
Binary files /dev/null and b/Src/QtGeoViewer/Resources/VertTan.png differ
--- a/Src/QtGeoViewer/ShaderCode/Mesh/integrate_shader.frag
+++ b/Src/QtGeoViewer/ShaderCode/Mesh/integrate_shader.frag
@@ -35,6 +35,7 @@ uniform sampler2D tex_normal;
3535
3636 varying vec3 v_ref_view;
3737 varying vec3 v_ref_normal;
38+varying vec3 v_ref_tan;
3839
3940 uniform float env_reflection = 0.5;
4041 uniform float fresnel_refact = 1.6;
@@ -86,10 +87,10 @@ vec4 GetPhongSpecular(vec3 N, vec3 L, vec3 V, int light_idx)
8687 return gl_FrontLightProduct[light_idx].specular * NHP;
8788 }
8889
89-float GetFresnelReflection()
90+float GetFresnelReflection(vec3 N)
9091 {
9192 float fr = fresnel_refact;
92- float c = dot(v_ref_normal, v_ref_view);
93+ float c = dot(N, v_ref_view);
9394 if (RequireFlipNormal())
9495 c = -c;
9596
@@ -103,9 +104,9 @@ float GetFresnelReflection()
103104 return 0.5 * gc * gc * (1.0 + gc1 * gc1);
104105 }
105106
106-float GetFresnelReflectionLimit()
107+float GetFresnelReflectionLimit(vec3 N)
107108 {
108- return clamp(GetFresnelReflection(), 0.0, 1.0);
109+ return clamp(GetFresnelReflection(N), 0.0, 1.0);
109110 }
110111
111112
@@ -211,31 +212,32 @@ vec3 GetFlatNormal(void)
211212 return normalize(cross(dx, dy));
212213 }
213214
214-vec3 GetFlagNormal(void)
215+vec3 GetNormalmap(vec3 vn, vec3 vt)
216+{
217+ vec3 t_normal = texture2DProj(tex_normal, gl_TexCoord[0]).xyz;
218+ t_normal *= 2.0;
219+ t_normal -= 1.0;
220+ t_normal = normalize(t_normal);
221+
222+ vec3 VT = normalize(vt);
223+ vec3 VN = normalize(vn);
224+ vec3 VB = normalize(cross(VN, VT));
225+
226+ return normalize(
227+ VT * t_normal.x +
228+ VB * t_normal.y +
229+ VN * t_normal.z);
230+}
231+
232+vec3 GetFlagNormal(vec3 vn, vec3 vt)
215233 {
216234 if (enable_flatshade)
217235 return GetFlatNormal();
218236
219- vec3 N;
220237 if (enable_normalmap)
221- {
222- vec3 t_normal = texture2DProj(tex_normal, gl_TexCoord[0]).xyz;
223- t_normal *= 2.0;
224- t_normal -= 1.0;
225- t_normal = normalize(t_normal);
226-
227- vec3 VT = normalize(v_tangent);
228- vec3 VN = normalize(v_normal);
229- vec3 VB = normalize(cross(VN, VT));
230-
231- N = normalize(VT * t_normal.x + VB * t_normal.y + VN * t_normal.z);
232- }
238+ return GetNormalmap(vn, vt);
233239 else
234- {
235- N = normalize(v_normal);
236- }
237-
238- return N;
240+ return normalize(vn);
239241 }
240242
241243 vec3 GetDSNormal(vec3 N)
@@ -296,8 +298,8 @@ vec4 GetPhongReflectionSumWithShadow(vec3 N)
296298
297299 vec4 GetEnvironmentReflection()
298300 {
299- vec3 R = normalize(v_ref_normal * 2.0 * dot(v_ref_normal, v_ref_view) - v_ref_view);
300- //vec3 R = normalize(v_ref_normal);
301+ vec3 N = GetFlagNormal(v_ref_normal, v_ref_tan);
302+ vec3 R = normalize(N * 2.0 * dot(N, v_ref_view) - v_ref_view);
301303
302304 float ty = acos(R.y) / PI;
303305
@@ -305,7 +307,7 @@ vec4 GetEnvironmentReflection()
305307
306308 vec4 env_texcoord = vec4(tx, ty, 0.0, 1.0);
307309 vec4 ret = texture2DProj(tex_envmap, env_texcoord);
308- ret *= env_reflection * GetFresnelReflectionLimit();
310+ ret *= env_reflection * GetFresnelReflectionLimit(N);
309311
310312 ret.w = 0.0;
311313 return ret;
@@ -385,7 +387,7 @@ void main(void)
385387
386388 gl_FragColor = vec4(0.0, 0.0, 0.0, 0.0);
387389
388- vec3 N = GetFlagNormal();
390+ vec3 N = GetFlagNormal(v_normal, v_tangent);
389391
390392 if (enable_lighting)
391393 gl_FragColor += GetPhongReflectionSumWithShadow(GetDSNormal(N));
--- a/Src/QtGeoViewer/ShaderCode/Mesh/integrate_shader.vert
+++ b/Src/QtGeoViewer/ShaderCode/Mesh/integrate_shader.vert
@@ -11,6 +11,7 @@ varying vec4 v_shadow_pos;
1111
1212 varying vec3 v_ref_view;
1313 varying vec3 v_ref_normal;
14+varying vec3 v_ref_tan;
1415
1516 uniform mat4 scene_mat;
1617
@@ -32,11 +33,9 @@ void main(void)
3233 v_ref_view = vec3(t.x, t.y, t.z);
3334
3435 vec4 nt = scene_mat * vec4(gl_Normal.x, gl_Normal.y, gl_Normal.z, 1.0);
35- vec3 ntt = vec3(nt.x, nt.y, nt.z) / nt.w;
36-
37- v_ref_normal = ntt;
38-
39- //v_ref_normal = gl_Normal;
36+ v_ref_normal = nt.xyz/ nt.w;
37+ vec4 tt = scene_mat * vec4(Tangent.x, Tangent.y, Tangent.z, 1.0);
38+ v_ref_tan = tt.xyz/ tt.w;
4039
4140 v_shadow_pos = shadow_mat * gl_Vertex;
4241
--- a/Src/QtGeoViewer/View3DConfig.h
+++ b/Src/QtGeoViewer/View3DConfig.h
@@ -33,6 +33,7 @@ public:
3333 m_DrawBBox .Reset( false , "DrawBBox" );
3434 m_DrawBBoxRange .Reset( false , "DrawBBoxRange" );
3535 m_DrawVertNormal .Reset( false , "DrawVertNormal" );
36+ m_DrawVertTan .Reset( false , "DrawVertTan" );
3637 m_ShowVidTopMost .Reset( false , "IndexTopMost" );
3738 m_DrawBone .Reset( false , "DrawBone" );
3839
@@ -107,6 +108,7 @@ public:
107108 NamedValue<bool> m_DrawBBox;
108109 NamedValue<bool> m_DrawBBoxRange;
109110 NamedValue<bool> m_DrawVertNormal;
111+ NamedValue<bool> m_DrawVertTan;
110112 NamedValue<bool> m_ShowVidTopMost;
111113 NamedValue<bool> m_DrawBone;
112114
Show on old repository browser