Code archives/3D Graphics - Mesh/PaintTriangle

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

Download source code

PaintTriangle by TeraBit2002
The PaintTriangle function (with supporting functions) allows you to paint triangles on a mesh individually with the brush of your choice.
; Paint Triangle Function
; By Lee Page
; TeraBit Software
; PaintTriangle(Mesh, Surface, TriangleIndex, Brush) 
; Mesh Must be UnWelded using the Unweld(Mesh) function.


; Example of Use

Type TRIS
	Field x0#
	Field y0#
	Field z0#
	Field u0#
	Field v0#
	Field U20#
	Field V20#
	Field x1#
	Field y1#
	Field z1#
	Field u1#
	Field v1#
	Field U21#
	Field V21#
	Field x2#
	Field y2#
	Field z2#
	Field u2#
	Field v2#
	Field U22#
	Field V22#
	Field surface
End Type

Dim b(2)
Dim txv(3)

Graphics3D 640,480
Global mash, mashs
cam = CreateCamera()
cub = CreateCube()
EntityPickMode cub,2
lit = CreateLight(1)
PositionEntity lit,5,-5,3
PositionEntity cam,0,0,-5
RotateMesh cub,45,45,0
EntityFX cub,16


;***********************************
b(0) = LoadBrush ("shingle.bmp") ; *Substitute your own ones*
b(1) = LoadBrush ("oldbric.bmp") ; *Substitute your own ones*
b(2) = LoadBrush ("gothic3.bmp") ; *Substitute your own ones*
;***********************************

Unweld(cub) : UpdateNormals cub 

While Not KeyDown(1)

If KeyHit(78) And bno<2 Then bno=bno + 1
If KeyHit(74) And bno >0 Then bno=bno - 1

If MouseHit(1) Then 
	psf = CameraPick(cam,MouseX(),MouseY())
	If psf<>0 Then
		psf = PickedSurface()
		ind = PickedTriangle()
		PaintTriangle(cub,psf,ind,b(bno))
	EndIf
EndIf
TurnEntity cub,0,0.5,0

UpdateWorld
RenderWorld
Color 0,0,255
Oval MouseX(),MouseY(),5,5,False
Color 255,255,255

Text 10,10,"Brush: "+bno+" of 2."
Text 10,25,"Use + or - on Keypad to Change Brush"

Flip
Wend
End


Function unWeld(mish)
For nsurf = 1 To CountSurfaces(mish)
su=GetSurface(mish,nsurf)
For tq = 0 To CountTriangles(su)-1
txv(0) = TriangleVertex(su,tq,0)
txv(1) = TriangleVertex(su,tq,1)
txv(2) = TriangleVertex(su,tq,2)
	vq.TRIS = New TRIS
	vq\x0# = VertexX(su,txv(0))
	vq\y0# = VertexY(su,txv(0))
	vq\z0# = VertexZ(su,txv(0))
	vq\u0# = VertexU(su,txv(0),0)
	vq\v0# = VertexV(su,txv(0),0)
	vq\u20# = VertexU(su,txv(0),1)
	vq\v20# = VertexV(su,txv(0),1)
	
	vq\x1# = VertexX(su,txv(1))
	vq\y1# = VertexY(su,txv(1))
	vq\z1# = VertexZ(su,txv(1))
	vq\u1# = VertexU(su,txv(1),0)
	vq\v1# = VertexV(su,txv(1),0)
	vq\u21# = VertexU(su,txv(1),1)
	vq\v21# = VertexV(su,txv(1),1)

	vq\x2# = VertexX(su,txv(2))
	vq\y2# = VertexY(su,txv(2))
	vq\z2# = VertexZ(su,txv(2))
	vq\u2# = VertexU(su,txv(2),0)
	vq\v2# = VertexV(su,txv(2),0)
	vq\u22# = VertexU(su,txv(2),1)
	vq\v22# = VertexV(su,txv(2),1)
Next

ClearSurface su

For vq.tris = Each tris

		AddVertex su,vq\x0#,vq\y0#,vq\z0#,vq\u0#,vq\v0#
		VertexTexCoords su,mycount,vq\u20#,vq\v20#,0,1
		mycount = mycount +1

		AddVertex su,vq\x1#,vq\y1#,vq\z1#,vq\u1#,vq\v1#
		VertexTexCoords su,mycount,vq\u21#,vq\v21#,0,1
		mycount = mycount +1

		AddVertex su,vq\x2#,vq\y2#,vq\z2#,vq\u2#,vq\v2#
		VertexTexCoords su,mycount,vq\u22#,vq\v22#,0,1
		mycount = mycount +1


	AddTriangle su,mycount-3,mycount-2,mycount-1

Next

For vq.tris = Each tris
Delete vq
Next

mycount=0
Next
End Function

Function PaintTriangle(PMesh, Surfhand, Trindex, Pbrush)
	
	dest = FindSurface(pmesh,pbrush)
	If dest = 0 Then dest = CreateSurface(pmesh,pbrush)	
	vertind = CountVertices(dest)
	For p=0 To 2
	vx# = VertexX(Surfhand,TriangleVertex(Surfhand,trindex,p))
	vy# = VertexY(Surfhand,TriangleVertex(Surfhand,trindex,p))
	vZ# = VertexZ(Surfhand,TriangleVertex(Surfhand,trindex,p))
			
	u# = VertexU(Surfhand,TriangleVertex(surfhand,trindex,p),0)
	V# = VertexV(Surfhand,TriangleVertex(surfhand,trindex,p),0)
			
	lmu# = VertexU(Surfhand,TriangleVertex(Surfhand,trindex,p),1)
	lmV# = VertexV(Surfhand,TriangleVertex(Surfhand,trindex,p),1)
	
				
		AddVertex dest,vx#,vy#,vz#
		VertexTexCoords dest,vertind+p,U#,v#,0,0
		VertexTexCoords dest,vertind+p,lmu#,lmv#,0,1
	Next
	vertind = CountVertices(dest)-3
	
	AddTriangle dest,vertind,vertind+1,vertind+2
	
	removetri(Surfhand,trindex)
	UpdateNormals pmesh
End Function

Function RemoveTRI(su,TRIGONE)

For tq = 0 To CountTriangles(su)-1
txv(0) = TriangleVertex(su,tq,0)
txv(1) = TriangleVertex(su,tq,1)
txv(2) = TriangleVertex(su,tq,2)
If tq <> TRIGONE Then
	vq.TRIS = New TRIS
	vq\x0# = VertexX(su,txv(0))
	vq\y0# = VertexY(su,txv(0))
	vq\z0# = VertexZ(su,txv(0))
	vq\u0# = VertexU(su,txv(0),0)
	vq\v0# = VertexV(su,txv(0),0)
	vq\u20# = VertexU(su,txv(0),1)
	vq\v20# = VertexV(su,txv(0),1)
	
	vq\x1# = VertexX(su,txv(1))
	vq\y1# = VertexY(su,txv(1))
	vq\z1# = VertexZ(su,txv(1))
	vq\u1# = VertexU(su,txv(1),0)
	vq\v1# = VertexV(su,txv(1),0)
	vq\u21# = VertexU(su,txv(1),1)
	vq\v21# = VertexV(su,txv(1),1)

	vq\x2# = VertexX(su,txv(2))
	vq\y2# = VertexY(su,txv(2))
	vq\z2# = VertexZ(su,txv(2))
	vq\u2# = VertexU(su,txv(2),0)
	vq\v2# = VertexV(su,txv(2),0)
	vq\u22# = VertexU(su,txv(2),1)
	vq\v22# = VertexV(su,txv(2),1)
	
EndIf
Next

ClearSurface su

For vq.tris = Each tris

		AddVertex su,vq\x0#,vq\y0#,vq\z0#,vq\u0#,vq\v0#
		VertexTexCoords su,mycount,vq\u20#,vq\v20#,0,1
		mycount = mycount +1

		AddVertex su,vq\x1#,vq\y1#,vq\z1#,vq\u1#,vq\v1#
		VertexTexCoords su,mycount,vq\u21#,vq\v21#,0,1
		mycount = mycount +1

		AddVertex su,vq\x2#,vq\y2#,vq\z2#,vq\u2#,vq\v2#
		VertexTexCoords su,mycount,vq\u22#,vq\v22#,0,1
		mycount = mycount +1


	AddTriangle su,mycount-3,mycount-2,mycount-1

Next

For vq.tris = Each tris
Delete vq
Next
End Function

Comments

Beaker2006
Improved version below. Fixed some bugs, removed redundant stuff, added vertex normals (no need to UpdateNormals anymore), added delete example, and weld function (from here:
http://www.blitzbasic.com/codearcs/codearcs.php?code=454 )

I also added an example of re-welding vertices (hit SPACE bar). Enjoy.




Beaker2009
Variable scope improvements (thanks to IDEal IDE):



Code Archives Forum