Mesh Manipulations

BlitzMax Forums/BlitzMax Programming/Mesh Manipulations

Hardcoal(Posted 2013) [#1]
I wanna start to build a Mesh manipulation Commands Lib.
I will post the code here.

Any one who wants to improve it will be welcomed.

I will use Xors3D

The goal is to be able to modify Mesh in many ways.

For Example:

AttachTwoMeshes(Mesh1Handle,Mesh2Handle)
SplitMesh(MeshHandle)
ExplodeMesh(MeshHandle)

Then turn it into a module.

What do you guys think?

Anyway im doing it for my self so why not share it..


Danny(Posted 2013) [#2]
Always handy and or educational to have collected functions like that.
Any idas for funky features that can come in handy?

A procedural modelling lib would be very cool ;)


Hardcoal(Posted 2013) [#3]
Everything Imaginable for Mesh editing will go in.
Ill start with simple stuff and see where it goes.
Also might be followed with an Editor or Tester

Maybe Later Make Image Editing Lib as well


Hardcoal(Posted 2013) [#4]
Here is my first Command i worked today (Under Xors3D)

Turning a PNG into a Mesh
This is good for physics Use
The only thing I didnt manage to do is to make the texture appear.

This Is a basic outliner for png and not 100% accurate (at this point).
it just gives you the outlines
but its good for a start.

'------------------------------------------'

PS:

Dont forget to change the png load to what you wish.

Feel free to improve this code and repost it

'------------------------------------------'


Strict

Import xorsteam.xors3d

'set graphics mode
xGraphics3D 1024, 768, 32, False, True

Local CAMERA = xCreateCamera()
xPositionEntity(CAMERA, 0, 0, -20)
xCreateLight()

Local imghandle = xLoadImage("diablo1ef.png")

'Seems like 16777215 represents empty space in an image

TurnPngToMesh("diablo1ef.png")

Repeat
	xRenderWorld()
	xUpdateWorld()
	xDrawImage(imghandle, 0, 0)
	xFlip
Until xKeyHit(1)


'TurnPngToMesh
Function TurnPngToMesh(PNGURL:String, Resolution:Float = 128, Debug = False)
	Global ResJump:Float, CurrentAngle:Float, ImageW:Float, ImageH:Float, ImageRadius:Float, HalfImageW:Float, HalfImageH:Float, PPnt:Pntr_Class, Diversion:Float = 400
	Global CoordsList:TList, NewMesh, PNGHandle, MeshTexture
	
	PNGHandle = xLoadImage(PNGURL)
	MeshTexture = xLoadTexture(PNGURL)
	
	CoordsList = CreateList()
		
	ImageW = xImageWidth(PNGHandle)
	ImageH = xImageHeight(PNGHandle)
	
	HalfImageW = ImageW / 2
	HalfImageH = ImageH / 2
	
	ResJump = 360 / Resolution
	
	ImageRadius = (HalfImageW ^ 2 + HalfImageH ^ 2) ^ 0.5

	'Creat Net Coords	
	While CurrentAngle < 360
		PPnt = New Pntr_Class
		PPnt = GetFirstPixelIncounter(CurrentAngle)
		ListAddLast(CoordsList, PPnt)
		If Debug Then xLine(Diversion, Diversion, Diversion + PPnt.X, Diversion + PPnt.Y)
		CurrentAngle = CurrentAngle + ResJump
	Wend
	
   'MeshFromData
	CreateMeshFromData()

	xEntityTexture(NewMesh, MeshTexture)
	
	xFreeImage(PNGHandle)
	
	Return NewMesh
	 
	'------------------------------------------------------'
	
		'GetFirstPixelIncounter  (For Each Yeter)
		Function GetFirstPixelIncounter:Pntr_Class(Angel:Float)
			Local PointInTheRadius:Float, PIRX:Float, PIRY:Float, APntr:Pntr_Class, DiffrentFlg, Pixel, PIRAndHRX:Float, PIRAndHRY:Float
			
			APntr = New Pntr_Class
			
			For PointInTheRadius = ImageRadius To 0 Step - 1
			
				PIRX = Cos(Angel) * PointInTheRadius
				PIRY = Sin(Angel) * PointInTheRadius
				
				PIRAndHRX = HalfImageW + PIRX
				PIRAndHRY = HalfImageH + PIRY
				
				Pixel = xReadPixel(PIRAndHRX, PIRAndHRY, xImageBuffer(PNGHandle))
	
				If Pixel <> 16777215 And Pixel <> 0 Then
					APntr.X = PIRX
					APntr.Y = PIRY
					Exit
				End If
				
			Next
			
			Return APntr
		End Function
		
		Function CreateMeshFromData(SizeDiversion:Float = 40)		'How much to devide the coords (Changes Size)
			Local TempCoord:Pntr_Class, SURFACE
			
			NewMesh = xCreateMesh()
			
			SURFACE = xCreateSurface(NewMesh)
					
			xAddVertex(SURFACE, 0, 0, 0)		'MiddlePoint
			
			'Create all the Radius Vertix
			For TempCoord = EachIn CoordsList
				xAddVertex(SURFACE, TempCoord.X / SizeDiversion, -(TempCoord.Y / SizeDiversion), 0)  ' TempCoord.X / SizeDiversion, -(TempCoord.Y / SizeDiversion)
			Next
	
			Local VertexCounter, PreviousVertex
			
			'Create Triangles
			For TempCoord = EachIn CoordsList
				VertexCounter = VertexCounter + 1
				If VertexCounter = 1 Then
					PreviousVertex = CountList(CoordsList)
				Else
					PreviousVertex = VertexCounter - 1
				End If
				xAddTriangle(SURFACE, 0, PreviousVertex, VertexCounter)
			Next


		End Function
	
	'------------------------------------------------------'
	
End Function

	Type Pntr_Class
		Field X:Float
		Field Y:Float
	End Type