Thanks WLGfx
Actually I have used these array functions before. This is a function I played with to build an object similar to a trianglefan function. Going by Nicks link I expected make array from memblock to add the index count.
REM ***** Main Source File *****
` udt for vertex data.
type vertex
vposx as float
vposy as float
vposz as float
vnorx as float
vnory as float
vnorz as float
vertu as float
vertv as float
endtype
` set display properties.
Sync On
Sync Rate 60
Backdrop On
Color Backdrop 0
Autocam Off
Position Camera 0, 0, -20
` call D3D_Object_Create_Begin to initialize functions.
D3D_Object_Create_Begin()
` add vertex data.
D3D_Object_Add_Vertex(5, -5, 0)
D3D_Object_Add_Vertex(-5, -5, 0)
D3D_Object_Add_Vertex(-5, 5, 0)
D3D_Object_Add_Vertex(-5, 5, 0)
D3D_Object_Add_Vertex(5, 5, 0)
D3D_Object_Add_Vertex(5, -5, 0)
` call D3D_Object_Create_End to create the object.
D3D_Object_Create_End(1, 0)
do
Yrotate Object 1,Object Angle Y(1)+0.5
sync
loop
end
Rem ***** End Main Source *****
Remstart
==========================================================================================
Get_Free_Memblk()
-----------------
Purpose: Return free memblock ID.
On exit: Nothing.
Returns: Free Memblock ID.
==========================================================================================
Remend
function Get_Free_Memblk()
repeat
inc ID
until memblock exist(ID) = 0
endfunction ID
Remstart
==========================================================================================
Get_Free_Mesh()
---------------
Purpose: Return free mesh ID.
On exit: Nothing.
Returns: Free Mesh ID.
==========================================================================================
Remend
function Get_Free_Mesh()
repeat
inc ID
until mesh exist(ID) = 0
endfunction ID
Remstart
==========================================================================================
D3D_Object_Create_Begin()
-------------------------
Purpose: Initialize global arrays, vertexdata() and cnt(0).
On exit: Nothing.
Returns: Nothing.
==========================================================================================
Remend
function D3D_Object_Create_Begin()
global dim vertdata() as vertex
empty array vertdata()
global dim cnt(0)
endfunction
Remstart
==========================================================================================
D3D_Object_Create_End(object number, image number)
--------------------------------------------------
Purpose: Create the object from vertexdata array. To use no image set image number = 0.
On exit: Undimension initialized arrays, vertexdata() and cnt().
Returns: Nothing.
==========================================================================================
Remend
function D3D_Object_Create_End(obj as integer, img as integer)
blk1 = Get_Free_Memblk()
make memblock from array blk1, vertdata(0)
memsize = get memblock size (blk1)
blk2 = Get_Free_Memblk()
make memblock blk2, memsize + 12
write memblock dword blk2,0,274
write memblock dword blk2,4,32
write memblock dword blk2,8,memsize / 32
copy memblock blk1, blk2, 0, 12, memsize
mesh1 = Get_Free_Mesh()
make mesh from memblock mesh1, blk2
make object obj, mesh1, img
undim vertdata()
undim cnt()
delete memblock blk1
delete memblock blk2
delete mesh mesh1
endfunction
Remstart
==========================================================================================
D3D_Object_Create_Add_Vertex(x vertex, y vertex, z vertex)
----------------------------------------------------------
Purpose: Add vertex data. On triplet call D3D_Object_Calc_Normals().
On exit: Nothing.
Returns: Nothing.
==========================================================================================
Remend
function D3D_Object_Add_Vertex(x as float, y as float, z as float)
array insert at bottom vertdata()
vcnt = array count(vertdata())
inc cnt(0)
vertdata(vcnt).vposx = x
vertdata(vcnt).vposy = y
vertdata(vcnt).vposz = z
if cnt(0) = 3
cnt(0) = 0
`D3D_Object_Calc_Normals()
venomNormaliseObject()
endif
vertdata(vcnt).vertu = 0
vertdata(vcnt).vertv = 0
endfunction
Remstart
==========================================================================================
D3D_Object_Create_Add_Vertex_TexUV(x vertex, y vertex, z vertex, texture U, texture V)
--------------------------------------------------------------------------------------
Purpose: Add vertex data with UV coords. On triplet call D3D_Object_Calc_Normals().
On exit: Nothing.
Returns: Nothing.
==========================================================================================
Remend
function D3D_Object_Add_Vertex_TexUV(x as float, y as float, z as float, u as float, v as float)
array insert at bottom vertdata()
vcnt = array count(vertdata())
cnt(0) = cnt(0) + 1
vertdata(vcnt).vposx = x
vertdata(vcnt).vposy = y
vertdata(vcnt).vposz = z
if cnt(0) = 3
cnt(0) = 0
D3D_Object_Calc_Normals()
endif
vertdata(vcnt).vertu = u
vertdata(vcnt).vertv = v
endfunction
Remstart
==========================================================================================
D3D_Object_Calc_Add_Normals()
-----------------------------
Purpose: Calculate surface normals in a clockwise winding order.
On exit: Nothing.
Returns: Nothing.
==========================================================================================
Remend
function D3D_Object_Calc_Normals()
local dim x(3) as float
local dim y(3) as float
local dim z(3) as float
local crossx as float
local crossy as float
local crossz as float
local length as float
local normx as float
local normy as float
local normz as float
vcnt = array count(vertdata()) - 2
for i = 0 to 2
x(i) = vertdata(vcnt + i).vposx
y(i) = vertdata(vcnt + i).vposy
z(i) = vertdata(vcnt + i).vposz
next i
crossx = (y(1) - y(0)) * (z(2) - z(0)) - (y(2) - y(0)) * (z(1) - z(0))
crossy = (z(1) - z(0)) * (x(2) - x(0)) - (z(2) - z(0)) * (x(1) - x(0))
crossz = (x(1) - x(0)) * (y(2) - y(0)) - (x(2) - x(0)) * (y(1) - y(0))
length = sqrt((crossx ^ 2) + (crossy ^ 2) + (crossz ^ 2))
normx = crossx / length
normy = crossy / length
normz = crossz / length
for i = 0 to 2
vertdata(vcnt + i).vnorx = normx
vertdata(vcnt + i).vnory = normy
vertdata(vcnt + i).vnorz = normz
next i
undim x()
undim y()
undim z()
endfunction
function venomNormaliseObject()
local dim x(3) as float
local dim y(3) as float
local dim z(3) as float
local normx as float
local normy as float
local normz as float
r = make vector3(1)
r = make vector3(2)
r = make vector3(3)
r = make vector3(4)
r = make vector3(5)
r = make vector3(6)
r = make vector3(7)
vcnt = array count(vertdata()) - 2
for i = 0 to 2
x(i) = vertdata(vcnt + i).vposx
y(i) = vertdata(vcnt + i).vposy
z(i) = vertdata(vcnt + i).vposz
next i
set vector3 1, x(0), y(0), z(0)
set vector3 2, x(1), y(1), z(1)
set vector3 3, x(2), y(2), z(2)
subtract vector3 4, 2, 1
subtract vector3 5, 3, 1
cross product vector3 6, 4, 5
normalize vector3 7, 6
normx = x vector3(7)
normy = y vector3(7)
normz = z vector3(7)
for i = 0 to 2
vertdata(vcnt + i).vnorx = normx
vertdata(vcnt + i).vnory = normy
vertdata(vcnt + i).vnorz = normz
next i
undim x()
undim y()
undim z()
r = delete vector3(1)
r = delete vector3(2)
r = delete vector3(3)
r = delete vector3(4)
r = delete vector3(5)
r = delete vector3(6)
r = delete vector3(7)
endfunction
Now back to this thread. If each type array index is fixed in size. You could try this.
type PlayerData
xp as integer
health as integer
Level as integer
canupgrade as integer
dead as integer
won as integer
oldpositionz as float
oldpositiony as float
endtype
REM READ FROM MEMBLOCK
open to read 1, "player.dat"
read memblock 1, 1
dim player(get memblock size(1) / 32-1) as PlayerData
make array from memblock player(),1
delete memblock 1
close file 1
REM PRINT VALUES
print "Read From Memblock:"
print "Array Count:"; array count (player())
for i = 0 to array count (player())
print player(i).xp
print player(i).health
print player(i).Level
print player(i).canupgrade
print player(i).dead
print player(i).won
print player(i).oldpositionz
print player(i).oldpositiony
next i
wait key