Mesh Manipulation Library by Hamish McHaggis12th 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 |