Memblock mesh with turned triangles by Visigoth10th Feb 2008 20:51
|
---|
Summary This is a modification of the original mesh function, but this turns the triangles. It has the effect of looking like a diamond placed inside a square. Description This is just a modification of my other memblock mesh, but turns the triangles to create a diamond inside a square type mesh, instead of just having all the triangles oriented in the same direction. One thing though, it doesn't work with odd numbers of columns and rows, I haven't tried to figure that out yet, but works fine with even number rows and columns. Code ` This code was downloaded from The Game Creators ` It is reproduced here with full permission ` http://www.thegamecreators.com rem created by Mike Shihrer aka Visigoth function make_geo_grid2(id as integer, x_width# as float, z_height# as float, tLOD as integer, clr as dword, img as integer) rem you can change this to whatever you want. Rows and columns should be EVEN numbers, ODD numbers give strange results. rem 100 columns and rows MAXIMUM if tLOD = 1 x_cols = 100 z_rows = 100 endif if tLOD = 2 x_cols = 50 z_rows = 50 endif if tLOD = 3 x_cols = 24 z_rows = 24 endif total_verts = ((x_cols + 1) * (z_rows + 1)) total_polys = (x_cols * z_rows) * 2 total_cells = (x_cols * z_rows) real_verts = (total_polys * 3) cell_width# = x_width# / x_cols cell_height# = z_height# / z_rows mem_size = (real_verts * 36) + 12 x_pos# = 0 y_pos# = 0 z_pos# = 0 mem_pos = 12 rem memblock for storing vertice list make memblock 1,mem_size write memblock dword 1,0,338 write memblock dword 1,4,36 write memblock dword 1,8,real_verts rem put vertices into the memblock col = 0 for i = 1 to real_verts write memblock float 1,mem_pos,x_pos# : inc mem_pos,4 rem x coord write memblock float 1,mem_pos,y_pos# : inc mem_pos,4 rem y coord write memblock float 1,mem_pos,z_pos# : inc mem_pos,4 rem z coord write memblock float 1,mem_pos,0 : inc mem_pos,4 rem x normal write memblock float 1,mem_pos,1 : inc mem_pos,4 rem y normal write memblock float 1,mem_pos,0 : inc mem_pos,4 rem z normal write memblock dword 1,mem_pos,clr : inc mem_pos,4 rem diffuse color write memblock float 1,mem_pos,0 : inc mem_pos,4 rem U coord write memblock float 1,mem_pos,1 : inc mem_pos,4 rem V coord inc col,1 inc x_pos#,cell_width# if col = (x_cols + 1) col = 0 inc z_pos#,cell_height# x_pos# = 0 endif next i rem It won't let me change the vertexdata if I make a mesh from a memblock, so I have to make an object, then a mesh make mesh from memblock 1,1 make object id,1,0 delete mesh 1 make mesh from object 1,id delete object id rem reorder the indexdata to point at the correct vertices (weld the verts) row as byte row = 0 vt_1 = 0 vt_2 = 1 vt_3 = 2 vt_4 = (x_cols + 1) vt_5 = (x_cols + 2) vt_6 = (x_cols + 3) i_pos = 0 lock vertexdata for mesh 1 delete mesh from vertexdata total_verts,real_verts,0,0 rem get rid of all the verts we don't need in the vertex data col = 0 for i = 1 to total_cells if row = 0 set indexdata i_pos,vt_1 : inc i_pos,1 rem triangle 1, vertice 1 set indexdata i_pos,vt_4 : inc i_pos,1 rem triangle 1, vertice 2 set indexdata i_pos,vt_2 : inc i_pos,1 rem triangle 1, vertice 3 set indexdata i_pos,vt_4 : inc i_pos,1 rem triangle 2, vertice 1 set indexdata i_pos,vt_5 : inc i_pos,1 rem triangle 2, vertice 2 set indexdata i_pos,vt_2 : inc i_pos,1 rem triangle 2, vertice 3 set indexdata i_pos,vt_2 : inc i_pos,1 rem triangle 3, vertice 1 set indexdata i_pos,vt_5 : inc i_pos,1 rem triangle 3, vertice 2 set indexdata i_pos,vt_6 : inc i_pos,1 rem triangle 3, vertice 3 set indexdata i_pos,vt_6 : inc i_pos,1 rem triangle 4, vertice 1 set indexdata i_pos,vt_3 : inc i_pos,1 rem triangle 4, vertice 2 set indexdata i_pos,vt_2 : inc i_pos,1 rem triangle 4, vertice 3 else set indexdata i_pos,vt_1 : inc i_pos,1 rem triangle 1, vertice 1 set indexdata i_pos,vt_4 : inc i_pos,1 rem triangle 1, vertice 2 set indexdata i_pos,vt_5 : inc i_pos,1 rem triangle 1, vertice 3 set indexdata i_pos,vt_5 : inc i_pos,1 rem triangle 2, vertice 1 set indexdata i_pos,vt_2 : inc i_pos,1 rem triangle 2, vertice 2 set indexdata i_pos,vt_1 : inc i_pos,1 rem triangle 2, vertice 3 set indexdata i_pos,vt_2 : inc i_pos,1 rem triangle 3, vertice 1 set indexdata i_pos,vt_5 : inc i_pos,1 rem triangle 3, vertice 2 set indexdata i_pos,vt_3 : inc i_pos,1 rem triangle 3, vertice 3 set indexdata i_pos,vt_5 : inc i_pos,1 rem triangle 4, vertice 1 set indexdata i_pos,vt_6 : inc i_pos,1 rem triangle 4, vertice 2 set indexdata i_pos,vt_3 : inc i_pos,1 rem triangle 4, vertice 3 endif inc vt_1,2 inc vt_2,2 inc vt_3,2 inc vt_4,2 inc vt_5,2 inc vt_6,2 inc col,1 If col = (x_cols/2) col = 0 inc vt_1,1 inc vt_2,1 inc vt_3,1 inc vt_4,1 inc vt_5,1 inc vt_6,1 if row = 0 row = 1 else row = 0 endif endif next i rem set uv coordinates to stretch across object rem loop throught the texture coordinates and determine what percent of total width, height the vertex is at a = get vertexdata vertex count() for i = 0 to a set vertexdata uv i, get vertexdata position x(i) / x_width#, (z_height# - get vertexdata position z(i)) / z_height# next i unlock vertexdata make object id,1,img rem save it here if you want to load it as an .x file rem save mesh "mesh.x",1 delete mesh 1 delete memblock 1 rem set object cull id,1 set object wireframe id,1 endfunction |