TGC Codebase Backup



Memblock mesh with turned triangles by Visigoth

10th 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