Code archives/3D Graphics - Mesh/Removing Triangles and Vertices

This code has been declared by its author to be Public Domain code.

Download source code

Removing Triangles and Vertices by Mr Snidesmin2004
A few useful functions. Note: they will probably be slow for large meshes.

RemoveTriangle(surface%, triangle_index%)
-removes specified triangle from a surface

RemoveVertex(surface%, vertex_index%)
-removes specified vertex from a surface

VertexIsUsed(surface%, vi%)
-returns true if vertex index is used in a triangle.

ClearUnusedVertices%(surface%)
-removes unused vertices in a surface
Function VertexIsUsed(surface%, vi%)
	For i% = 0 To CountTriangles(surface) - 1
		If TriangleVertex(surface, i, 0) = vi Then Return True
		If TriangleVertex(surface, i, 1) = vi Then Return True
		If TriangleVertex(surface, i, 2) = vi Then Return True
	Next
	Return False
End Function

Function ClearUnusedVertices%(surface%)
	For i% = 0 To CountVertices(surface) - 1
		If Not VertexIsUsed(surface, i) Then
			RemoveVertex surface, i
		End If
	Next
End Function


Function RemoveTriangle(surface%, triangle_index%)
	s0% = surface
	m% = CreateMesh()
	s% = CreateSurface(m)
	
	;copy, excluding triangle:
	For i% = 0 To CountVertices(s0)-1
		vi% = AddVertex(s, VertexX(s0, i),VertexY(s0, i),VertexZ(s0, i),VertexU(s0, i),VertexV(s0, i),VertexW(s0, i))
		VertexNormal s, vi, VertexNX(s0, i), VertexNY(s0, i), VertexNZ(s0, i)
		VertexColor s, vi, VertexRed(s0, i), VertexGreen(s0, i), VertexBlue(s0, i), VertexAlpha(s0, i)
	Next
	For i% = 0 To CountTriangles(s0)-1
		If i <> triangle_index Then
			AddTriangle s, TriangleVertex(s0, i, 0), TriangleVertex(s0, i, 1), TriangleVertex(s0, i, 2)
		End If
	Next
	
	;copy back
	CopySurface s, s0
	FreeEntity m
End Function


Function RemoveVertex(surface%, vertex_index%)
	s0% = surface
	m% = CreateMesh()
	s% = CreateSurface(m)
	
	;copy, excluding vertex:
	For i% = 0 To CountVertices(s0)-1
		If i <> vertex_index Then
			vi% = AddVertex(s, VertexX(s0, i),VertexY(s0, i),VertexZ(s0, i),VertexU(s0, i),VertexV(s0, i),VertexW(s0, i))
			VertexNormal s, vi, VertexNX(s0, i), VertexNY(s0, i), VertexNZ(s0, i)
			VertexColor s, vi, VertexRed(s0, i), VertexGreen(s0, i), VertexBlue(s0, i), VertexAlpha(s0, i)
		End If
	Next
	For i% = 0 To CountTriangles(s0)-1
		v0% = TriangleVertex(s0, i, 0)
		v1% = TriangleVertex(s0, i, 1)
		v2% = TriangleVertex(s0, i, 2)
		
		If v0 > vertex_index Then v0 = v0 - 1
		If v1 > vertex_index Then v1 = v1 - 1
		If v2 > vertex_index Then v2 = v2 - 1
		AddTriangle s, v0, v1, v2
	Next
	
	;copy back
	CopySurface s, s0
	FreeEntity m
End Function



Function CopySurface(source%, dest%, clear_unused_vertices%=False)
	s0% = source
	s% = dest
	ClearSurface s
	
	For i% = 0 To CountVertices(s0)-1
		vi% = AddVertex(s, VertexX(s0, i),VertexY(s0, i),VertexZ(s0, i),VertexU(s0, i),VertexV(s0, i),VertexW(s0, i))
		VertexNormal s, vi, VertexNX(s0, i), VertexNY(s0, i), VertexNZ(s0, i)
		VertexColor s, vi, VertexRed(s0, i), VertexGreen(s0, i), VertexBlue(s0, i), VertexAlpha(s0, i)
	Next
	For i% = 0 To CountTriangles(s0)-1
		AddTriangle s, TriangleVertex(s0, i, 0), TriangleVertex(s0, i, 1), TriangleVertex(s0, i, 2)
	Next
End Function

Comments

jfk EO-111102007
Unfortunately, as far as I see this works only with meshes with one single surface, right? all surfaces should be cloned and added to the recreated mesh instead.


Code Archives Forum