@@ -45,6 +45,11 @@ public class MeshInfo
4545 // Normal = 0, Tangent = 1, Bitangent = 2
4646 public List < Vector3 > [ ] m_Normals ;
4747
48+ /// <summary>
49+ /// 3 = Normal + Tangents, 1 = Normal, 0 = None,
50+ /// </summary>
51+ public int m_NormalChannels = 0 ;
52+
4853 public List < float > m_NormalFlips ;
4954
5055 public string m_Features ;
@@ -83,12 +88,20 @@ public void Update()
8388 Set ( ref m_Normals [ 0 ] , m_Mesh . normals ) ;
8489 Reset ( ref m_NormalFlips ) ;
8590 var tan = m_Mesh . tangents ;
86- for ( int i = 0 ; i < m_Normals [ 0 ] . Count ; i ++ )
91+ if ( tan . Length > 0 )
8792 {
88- m_Normals [ 1 ] . Add ( tan [ i ] ) ;
89- m_NormalFlips . Add ( tan [ i ] . w ) ;
90- m_Normals [ 2 ] . Add ( Vector3 . Cross ( m_Normals [ 0 ] [ i ] , m_Normals [ 1 ] [ i ] ) * m_NormalFlips [ i ] ) ;
93+ for ( int i = 0 ; i < m_Normals [ 0 ] . Count ; i ++ )
94+ {
95+ m_Normals [ 1 ] . Add ( tan [ i ] ) ;
96+ m_NormalFlips . Add ( tan [ i ] . w ) ;
97+ m_Normals [ 2 ] . Add ( Vector3 . Cross ( m_Normals [ 0 ] [ i ] , m_Normals [ 1 ] [ i ] ) * m_NormalFlips [ i ] ) ;
98+ }
99+ m_NormalChannels = 3 ;
91100 }
101+ else if ( m_Normals [ 0 ] . Count > 0 )
102+ m_NormalChannels = 1 ;
103+ else
104+ m_NormalChannels = 0 ;
92105 }
93106 {
94107 m_IndiceAreaMax = 0 ;
@@ -119,22 +132,26 @@ public void Update()
119132 case 1 :
120133 a = indice [ m ] ;
121134 m_IndiceMedians [ i ] . Add ( m_Verts [ a ] ) ;
122- m_IndiceNormals [ i ] . Add ( normal [ a ] ) ;
135+ if ( m_NormalChannels > 0 )
136+ m_IndiceNormals [ i ] . Add ( normal [ a ] ) ;
123137 m_IndiceAreas [ i ] . Add ( 0 ) ; break ;
124138 case 2 :
125139 a = indice [ m ] ; b = indice [ m + 1 ] ;
126140 m_IndiceMedians [ i ] . Add ( ( m_Verts [ a ] + m_Verts [ b ] ) / 2 ) ;
127- m_IndiceNormals [ i ] . Add ( ( normal [ a ] + normal [ b ] ) . normalized ) ;
141+ if ( m_NormalChannels > 0 )
142+ m_IndiceNormals [ i ] . Add ( ( normal [ a ] + normal [ b ] ) . normalized ) ;
128143 m_IndiceAreas [ i ] . Add ( ( m_Verts [ a ] + m_Verts [ b ] ) . magnitude ) ; break ;
129144 case 3 :
130145 a = indice [ m ] ; b = indice [ m + 1 ] ; c = indice [ m + 2 ] ;
131146 m_IndiceMedians [ i ] . Add ( ( m_Verts [ a ] + m_Verts [ b ] + m_Verts [ c ] ) / 3 ) ;
132- m_IndiceNormals [ i ] . Add ( ( normal [ a ] + normal [ b ] + normal [ c ] ) . normalized ) ;
147+ if ( m_NormalChannels > 0 )
148+ m_IndiceNormals [ i ] . Add ( ( normal [ a ] + normal [ b ] + normal [ c ] ) . normalized ) ;
133149 m_IndiceAreas [ i ] . Add ( GetTriArea ( m_Verts [ a ] , m_Verts [ b ] , m_Verts [ c ] ) ) ; break ;
134150 case 4 :
135151 a = indice [ m ] ; b = indice [ m + 1 ] ; c = indice [ m + 2 ] ; d = indice [ m + 3 ] ;
136152 m_IndiceMedians [ i ] . Add ( ( m_Verts [ a ] + m_Verts [ b ] + m_Verts [ c ] + m_Verts [ d ] ) / 4 ) ;
137- m_IndiceNormals [ i ] . Add ( ( normal [ a ] + normal [ b ] + normal [ c ] + normal [ d ] ) . normalized ) ;
153+ if ( m_NormalChannels > 0 )
154+ m_IndiceNormals [ i ] . Add ( ( normal [ a ] + normal [ b ] + normal [ c ] + normal [ d ] ) . normalized ) ;
138155 m_IndiceAreas [ i ] . Add ( GetTriArea ( m_Verts [ a ] , m_Verts [ b ] , m_Verts [ c ] ) +
139156 GetTriArea ( m_Verts [ d ] , m_Verts [ b ] , m_Verts [ c ] ) ) ; break ;
140157 }
@@ -180,16 +197,16 @@ public void Update()
180197 m_VertToIndicesDir [ idx ] = new List < int > ( ) ;
181198 }
182199 m_VertToIndicesDir [ idx ] . Add ( m_IndiceOffsets [ i ] + j ) ;
183- m_VertUsedCountMax = Mathf . Max ( m_VertUsedCountMax , ++ m_VertUsedCounts [ idx ] ) ;
200+ m_VertUsedCountMax = Mathf . Max ( m_VertUsedCountMax , ++ m_VertUsedCounts [ idx ] ) ;
184201 }
185202 }
186203 }
187204 {
188205 m_Features =
189206 "Vertices: " + m_VertCount + " total, " + ( m_VertOrphan > 0 ? m_VertOrphan + " orphan, " : "" ) + ( m_VertDuplicates > 0 ? m_VertDuplicates + " duplicates, " : "" ) +
190- "\n Indices: " + m_IndiceCountNormalized + " total, " + m_IndiceCount + " buffer capacity, " + m_IndiceAreaTotal . ToString ( "0.##" ) + " unit surface area, " +
191- ( m_MeshSubmeshCount > 1 ? m_MeshSubmeshCount + " submeshes, " : "" ) + ( m_IndiceInvalidArea > 0 ? m_IndiceInvalidArea + " invalid, " : "" ) +
192- "\n Channels: " + InternalMeshUtil . GetVertexFormat ( m_Mesh ) +
207+ "\n Indices: " + m_IndiceCountNormalized + " total, " + m_IndiceCount + " buffer capacity, " + m_IndiceAreaTotal . ToString ( "0.##" ) + " unit surface area, " +
208+ ( m_MeshSubmeshCount > 1 ? m_MeshSubmeshCount + " submeshes, " : "" ) + ( m_IndiceInvalidArea > 0 ? m_IndiceInvalidArea + " invalid, " : "" ) +
209+ "\n Channels: position," + ( m_NormalChannels >= 1 ? "normals," + ( m_NormalChannels >= 3 ? "tangents," : "" ) : "" ) + InternalMeshUtil . GetVertexFormat ( m_Mesh ) +
193210 "\n Size: " + m_MeshBounds . size . ToString ( "0.00" ) ;
194211 }
195212 m_lastMeshId = m_Mesh . GetInstanceID ( ) ;
@@ -276,7 +293,7 @@ private static void Set<T>(ref List<T> list, T[] array)
276293
277294 public void UnpackTriangleIdx ( int src , out int submesh , out int localidx )
278295 {
279- for ( int i = m_MeshSubmeshCount ; i -- > 0 ; )
296+ for ( int i = m_MeshSubmeshCount ; i -- > 0 ; )
280297 {
281298 if ( i > 0 && m_IndiceOffsets [ i ] > src )
282299 continue ;
0 commit comments