TGC Codebase Backup



Mesh Manipulation Library by Hamish McHaggis

12th May 2004 10:47
Summary

A library that takes the confusing numbers out of editing a mesh.



Description

A library that takes the confusing numbers out of editing a mesh. Just make a mesh memblock with a certain number of vertices, assign the position to a faces verts, assign the normals, the UV coords, vertex colours and alpha and go.



Code
                                    ` This code was downloaded from The Game Creators
                                    ` It is reproduced here with full permission
                                    ` http://www.thegamecreators.com
                                    
                                      
`Creates a memblock for use as a mesh
FUNCTION MESH_CreateMemblock(memblock AS INTEGER, verts AS INTEGER)
	`Make memblock of size to match verts
	MAKE MEMBLOCK memblock,verts*3*3*36+12
	`FVF format (338)
	WRITE MEMBLOCK DWORD memblock,0,338
	`FVF size (36 bytes)
	WRITE MEMBLOCK DWORD memblock,4,36	
	`Number of vertices
	WRITE MEMBLOCK DWORD memblock,8,verts
ENDFUNCTION

`Set a vertice position in a memblock
FUNCTION MESH_SetVertPos(memblock AS INTEGER, face AS INTEGER, vert AS INTEGER, xPos AS FLOAT, yPos AS FLOAT, zPos AS FLOAT)
	WRITE MEMBLOCK FLOAT memblock, 12+(face-1)*108+(vert-1)*36, xPos
	WRITE MEMBLOCK FLOAT memblock, 12+(face-1)*108+(vert-1)*36+4, yPos
	WRITE MEMBLOCK FLOAT memblock, 12+(face-1)*108+(vert-1)*36+8, zPos
ENDFUNCTION

`Set a vertice normal in a memblock
FUNCTION MESH_SetVertNorm(memblock AS INTEGER, face AS INTEGER, vert AS INTEGER, xPos AS FLOAT, yPos AS FLOAT, zPos AS FLOAT)
	WRITE MEMBLOCK FLOAT memblock, 12+(face-1)*108+(vert-1)*36+12, xPos
	WRITE MEMBLOCK FLOAT memblock, 12+(face-1)*108+(vert-1)*36+16, yPos
	WRITE MEMBLOCK FLOAT memblock, 12+(face-1)*108+(vert-1)*36+20, zPos
ENDFUNCTION

`Set a vertice colour in a memblock
FUNCTION MESH_SetVertColor(memblock AS INTEGER, face AS INTEGER, vert AS INTEGER, red AS INTEGER, green AS INTEGER, blue AS INTEGER, alpha AS INTEGER)
	WRITE MEMBLOCK BYTE memblock, 12+(face-1)*108+(vert-1)*36+24, blue
	WRITE MEMBLOCK BYTE memblock, 12+(face-1)*108+(vert-1)*36+25, green
	WRITE MEMBLOCK BYTE memblock, 12+(face-1)*108+(vert-1)*36+26, red
	WRITE MEMBLOCK BYTE memblock, 12+(face-1)*108+(vert-1)*36+27, alpha
ENDFUNCTION

`Set a vertice UV co-ordinates in a memblock
FUNCTION MESH_SetVertUV(memblock AS INTEGER, face AS INTEGER, vert AS INTEGER, UCoord AS FLOAT, VCoord AS FLOAT)
	WRITE MEMBLOCK FLOAT memblock, 12+(face-1)*108+(vert-1)*36+28, UCoord
	WRITE MEMBLOCK FLOAT memblock, 12+(face-1)*108+(vert-1)*36+32, VCoord
ENDFUNCTION

`Set a vertice position in a memblock
FUNCTION MESH_GetVertPos(memblock AS INTEGER, face AS INTEGER, vert AS INTEGER, flag AS INTEGER)
	LOCAL value AS FLOAT

	if flag = 1 THEN value = MEMBLOCK FLOAT(memblock, 12+(face-1)*108+(vert-1)*36)
	if flag = 2 THEN value = MEMBLOCK FLOAT(memblock, 12+(face-1)*108+(vert-1)*36+4)
	if flag = 3 THEN value = MEMBLOCK FLOAT(memblock, 12+(face-1)*108+(vert-1)*36+8)
ENDFUNCTION value

`Set a vertice normal in a memblock
FUNCTION MESH_GetVertNorm(memblock AS INTEGER, face AS INTEGER, vert AS INTEGER, flag AS INTEGER)
	LOCAL value AS FLOAT

	if flag = 1 THEN value = MEMBLOCK FLOAT(memblock, 12+(face-1)*108+(vert-1)*36+12)
	if flag = 2 THEN value = MEMBLOCK FLOAT(memblock, 12+(face-1)*108+(vert-1)*36+16)
	if flag = 3 THEN value = MEMBLOCK FLOAT(memblock, 12+(face-1)*108+(vert-1)*36+20)
ENDFUNCTION value

`Set a vertice colour in a memblock
FUNCTION MESH_GetVertColor(memblock AS INTEGER, face AS INTEGER, vert AS INTEGER, flag AS INTEGER)
	LOCAL value AS INTEGER

	if flag = 3 THEN value = MEMBLOCK BYTE(memblock, 12+(face-1)*108+(vert-1)*36+24)
	if flag = 2 THEN value = MEMBLOCK BYTE(memblock, 12+(face-1)*108+(vert-1)*36+25)
	if flag = 1 THEN value = MEMBLOCK BYTE(memblock, 12+(face-1)*108+(vert-1)*36+26)
	if flag = 4 THEN value = MEMBLOCK BYTE(memblock, 12+(face-1)*108+(vert-1)*36+27)
ENDFUNCTION value

FUNCTION MESH_GetVertRGBA(memblock AS INTEGER, face AS INTEGER, vert AS INTEGER)
	LOCAL value AS INTEGER
	
	value = MEMBLOCK DWORD(memblock, 12+(face-1)*108+(vert-1)*36+24)
ENDFUNCTION value

`Set a vertice UV co-ordinates in a memblock
FUNCTION MESH_GetVertUV(memblock AS INTEGER, face AS INTEGER, vert AS INTEGER, flag AS INTEGER)
	LOCAL value AS FLOAT

	if flag = 1 THEN value = MEMBLOCK FLOAT(memblock, 12+(face-1)*108+(vert-1)*36+28)
	if flag = 2 THEN value = MEMBLOCK FLOAT(memblock, 12+(face-1)*108+(vert-1)*36+32)
ENDFUNCTION value