195 lines
5.5 KiB
VB.net
195 lines
5.5 KiB
VB.net
Imports System.Numerics
|
|
|
|
Public Class Object3D
|
|
|
|
Public ReadOnly Property Meshes As New List(Of Mesh)
|
|
Public ReadOnly Property Materials As New Dictionary(Of String, Material)
|
|
Public Property Shading As New Shading
|
|
|
|
Public Sub ScaleModel(factor As Single)
|
|
For Each m As Mesh In Meshes
|
|
For Each v As Vertex In m.Vertices
|
|
v.X *= factor
|
|
v.Y *= factor
|
|
v.Z *= factor
|
|
Next
|
|
Next
|
|
End Sub
|
|
|
|
Public Sub OffsetModel(off As Vector3)
|
|
For Each m As Mesh In Meshes
|
|
For Each v As Vertex In m.Vertices
|
|
v.X += off.X
|
|
v.Y += off.Y
|
|
v.Z += off.Z
|
|
Next
|
|
Next
|
|
End Sub
|
|
|
|
Public Function GetBoundaries() As ModelBoundaries
|
|
Dim maxX As Single? = Nothing
|
|
Dim maxY As Single? = Nothing
|
|
Dim maxZ As Single? = Nothing
|
|
Dim minX As Single? = Nothing
|
|
Dim minY As Single? = Nothing
|
|
Dim minZ As Single? = Nothing
|
|
|
|
For Each m As Mesh In Meshes
|
|
For Each vert As Vertex In m.Vertices
|
|
If maxX Is Nothing OrElse vert.X > maxX Then maxX = vert.X
|
|
If maxY Is Nothing OrElse vert.Y > maxY Then maxY = vert.Y
|
|
If maxZ Is Nothing OrElse vert.Z > maxZ Then maxZ = vert.Z
|
|
If minX Is Nothing OrElse vert.X < minX Then minX = vert.X
|
|
If minY Is Nothing OrElse vert.Y < minY Then minY = vert.Y
|
|
If minZ Is Nothing OrElse vert.Z < minZ Then minZ = vert.Z
|
|
Next
|
|
Next
|
|
|
|
If maxX Is Nothing Then maxX = 0
|
|
If maxY Is Nothing Then maxY = 0
|
|
If maxZ Is Nothing Then maxZ = 0
|
|
If minX Is Nothing Then minX = 0
|
|
If minY Is Nothing Then minY = 0
|
|
If minZ Is Nothing Then minZ = 0
|
|
|
|
Return New ModelBoundaries(New Vector3(maxX, maxY, maxZ),
|
|
New Vector3(minX, minY, minZ))
|
|
End Function
|
|
|
|
Public Sub SetNullVertices()
|
|
Dim newVert As New Vertex With {.X = 0, .Y = 0, .Z = 0}
|
|
Dim nullCounter As Integer
|
|
|
|
For Each m As Mesh In Meshes
|
|
nullCounter = 0
|
|
|
|
For Each f As Face In m.Faces
|
|
For Each p As Point In f.Points
|
|
If p.Vertex Is Nothing Then
|
|
p.Vertex = newVert
|
|
nullCounter += 1
|
|
End If
|
|
Next
|
|
Next
|
|
|
|
If nullCounter > 0 Then
|
|
m.Vertices.Add(newVert)
|
|
End If
|
|
Next
|
|
End Sub
|
|
|
|
Public Sub SetNullUVs()
|
|
Dim newUV As New UV With {.U = 0, .V = 0}
|
|
Dim nullCounter As Integer
|
|
|
|
For Each m As Mesh In Meshes
|
|
nullCounter = 0
|
|
|
|
For Each f As Face In m.Faces
|
|
For Each p As Point In f.Points
|
|
If p.UV Is Nothing Then
|
|
p.UV = newUV
|
|
nullCounter += 1
|
|
End If
|
|
Next
|
|
Next
|
|
|
|
If nullCounter > 0 Then
|
|
m.UVs.Add(newUV)
|
|
End If
|
|
Next
|
|
End Sub
|
|
|
|
Public Sub SetNullNormals()
|
|
Dim newNormal As New Normal With {.X = 0, .Y = 0, .Z = 1}
|
|
Dim nullCounter As Integer
|
|
|
|
For Each m As Mesh In Meshes
|
|
nullCounter = 0
|
|
|
|
For Each f As Face In m.Faces
|
|
For Each p As Point In f.Points
|
|
If p.Normal Is Nothing Then
|
|
p.Normal = newNormal
|
|
nullCounter += 1
|
|
End If
|
|
Next
|
|
Next
|
|
|
|
If nullCounter > 0 Then
|
|
m.Normals.Add(newNormal)
|
|
End If
|
|
Next
|
|
End Sub
|
|
|
|
Public Sub RemoveUnusedMaterials()
|
|
'Dim usedMats As New List(Of Material)
|
|
'Dim unusedMats As New List(Of String)
|
|
|
|
'For Each f As Face In Faces
|
|
' If Not usedMats.Contains(f.Material) Then
|
|
' usedMats.Add(f.Material)
|
|
' End If
|
|
'Next
|
|
|
|
'For Each kvp As KeyValuePair(Of String, Material) In Materials
|
|
' If Not usedMats.Contains(kvp.Value) Then
|
|
' unusedMats.Add(kvp.Key)
|
|
' End If
|
|
'Next
|
|
|
|
'For Each k As String In unusedMats
|
|
' Materials.Remove(k)
|
|
'Next
|
|
End Sub
|
|
|
|
Public Function ToOneMesh() As Object3D
|
|
Dim newObject3D As New Object3D
|
|
Dim newMesh As New Mesh
|
|
|
|
For Each mat As KeyValuePair(Of String, Material) In Materials
|
|
newObject3D.Materials.Add(mat.Key, mat.Value)
|
|
Next
|
|
|
|
For Each m As Mesh In Meshes
|
|
For Each v As Vertex In m.Vertices
|
|
newMesh.Vertices.Add(v)
|
|
Next
|
|
|
|
For Each vc As VertexColor In m.VertexColors
|
|
newMesh.VertexColors.Add(vc)
|
|
Next
|
|
|
|
For Each n As Normal In m.Normals
|
|
newMesh.Normals.Add(n)
|
|
Next
|
|
|
|
For Each uv As UV In m.UVs
|
|
newMesh.UVs.Add(uv)
|
|
Next
|
|
|
|
For Each f As Face In m.Faces
|
|
newMesh.Faces.Add(f)
|
|
Next
|
|
Next
|
|
|
|
newObject3D.Meshes.Add(newMesh)
|
|
Return newObject3D
|
|
End Function
|
|
|
|
Public Sub CenterModel()
|
|
Mesh.CenterModel(Meshes)
|
|
End Sub
|
|
|
|
Public Shared Sub CenterModel(objs As IEnumerable(Of Object3D))
|
|
Dim meshes As New List(Of Mesh)
|
|
|
|
For Each obj As Object3D In objs
|
|
meshes.AddRange(obj.Meshes)
|
|
Next
|
|
|
|
Mesh.CenterModel(meshes)
|
|
End Sub
|
|
|
|
End Class
|