This is a little demo I worked up using the memblock idea. I got a little tired toward the end. So, I stopped commenting the code and the main loop could probably have been coded better. Notice the use of the dynamic type array. Hopefully you will be able to follow the code.
type t_objData
objName as string
objID as integer
endtype
dim objData() as t_objData
` turn sync on and set rate to 60
sync on
sync rate 60
` turn the backdrop on and set color to black
backdrop on
color backdrop 0
` turn autocam off and set camera position
autocam off
position camera 0, 0, -50
` create some object for testing
makeCube(5)
makeSphere(5)
makeCone(5)
makeCylinder(5)
` position objects
for i=0 to array count(objData())
if (objData(i).objName = "cube")
position object objData(i).objID, -20, 20, 0
endif
if (objData(i).objName = "sphere")
position object objData(i).objID, 20, 20, 0
endif
if (objData(i).objName = "cone")
position object objData(i).objID, -20, -20, 0
endif
if (objData(i).objName = "cylinder")
position object objData(i).objID, 20, -20, 0
endif
next i
for i=0 to array count(objData())
if (file exist(objData(i).objName+".dbo"))
delete file objData(i).objName+".dbo"
endif
saveDBO(objData(i).objName, objData(i).objID)
next i
do
set cursor 0, 0
if (getObjectExistByName("cube"))
print "1 - Delete Cube"
if (scancode()=2 and keyDelay=0)
keyDelay = 10
index = getIndexByName("cube")
delete object objData(index).objId
array delete element objData(), index
endif
else
print "1 - Load Cube"
if (scancode()=2 and keyDelay=0)
keyDelay = 10
loadObject("cube")
endif
endif
if (getObjectExistByName("sphere"))
print "2 - Delete Sphere"
if (scancode()=3 and keyDelay=0)
keyDelay = 10
index = getIndexByName("sphere")
delete object objData(index).objId
array delete element objData(), index
endif
else
print "2 - Load Sphere"
if (scancode()=3 and keyDelay=0)
keyDelay = 10
loadObject("sphere")
endif
endif
if (getObjectExistByName("cone"))
print "3 - Delete Cone"
if (scancode()=4 and keyDelay=0)
keyDelay = 10
index = getIndexByName("cone")
delete object objData(index).objId
array delete element objData(), index
endif
else
print "3 - Load Cone"
if (scancode()=4 and keyDelay=0)
keyDelay = 10
loadObject("cone")
endif
endif
if (getObjectExistByName("cylinder"))
print "4 - Delete Cylinder"
if (scancode()=5 and keyDelay=0)
keyDelay = 10
index = getIndexByName("cylinder")
delete object objData(index).objId
array delete element objData(), index
endif
else
print "4 - Load Cylinder"
if (scancode()=5 and keyDelay=0)
keyDelay = 10
loadObject("cylinder")
endif
endif
sync
if (keyDelay)
dec keyDelay
endif
loop
end
function checkDBOExtension(fileName as string)
local result as boolean
` check if file name extension is set to dbo
if (lower$(right$(fileName, 4)) = ".dbo")
result = 1
endif
endfunction result
function freeMemblock()
local freeMemblockID as integer
freeMemblockID = 1
while memblock exist(freeMemblockID)
inc freeMemblockID
endwhile
endfunction freeMemblockID
function freeObject()
local freeObjectID as integer
freeObjectID = 1
while object exist(freeObjectID)
inc freeObjectID
endwhile
endfunction freeObjectID
function getIndexByName(objName as string)
local result as integer
for i=0 to array count(objData())
if (objData(i).objName=objName)
result = i
endif
next i
endfunction result
function getObjectExistByName(objName as string)
local result as boolean
for i=0 to array count(objData())
if (objData(i).objName=objName)
result = 1
endif
next i
endfunction result
function loadDBO(fileName as string, objID as integer)
local memBlockID as integer
memBlockID = freeMemblock()
` insure DBO extension is present in file name and save
if (checkDBOExtension(fileName) = 0)
fileName = fileName+".dbo"
endif
` load object
load object fileName, objID
` get memblock from object and remove it from the object
get memblock from object memBlockID, objID
delete memblock from object objID
` set object position
position object objID, memblock float(memBlockID, 0), memblock float(memBlockID, 4), memblock float(memBlockID, 8)
` set object orientation
rotate object objID, memblock float(memBlockID, 12), memblock float(memBlockID, 16), memblock float(memBlockID, 20)
` clean up
delete memblock memBlockID
endfunction
function loadObject(objName as string)
array insert at bottom objData()
objData().objName = objName
objData().objID = freeObject()
loadDBO(objName, objData().objID)
endfunction
function makeCone(size as float)
array insert at bottom objData()
objData().objName = "cone"
objData().objID = freeObject()
make object cone objData().objID, size
endfunction
function makeCube(size as float)
array insert at bottom objData()
objData().objName = "cube"
objData().objID = freeObject()
make object cube objData().objID, size
endfunction
function makeCylinder(size as float)
array insert at bottom objData()
objData().objName = "cylinder"
objData().objID = freeObject()
make object cylinder objData().objID, size
endfunction
function makeSphere(size as float)
array insert at bottom objData()
objData().objName = "sphere"
objData().objID = freeObject()
make object sphere objData().objID, size
endfunction
function saveDBO(fileName as string, objID as integer)
local memBlockID as integer
` get free memblock and create memblock to store object data
memBlockID = freeMemblock()
make memblock memBlockID, 24
` store object position in memblock
write memblock float memBlockID, 0, object position x(objID)
write memblock float memBlockID, 4, object position y(objID)
write memblock float memBlockID, 8, object position z(objID)
` store object orientation in memblock
write memblock float memBlockID, 12, object angle x(objID)
write memblock float memBlockID, 16, object angle y(objID)
write memblock float memBlockID, 20, object angle z(objID)
` add position and orientation data to object
add memblock to object memBlockID, objID
` insure DBO extension is present in file name and save
if (checkDBOExtension(fileName))
save object fileName, objID
else
fileName = fileName+".dbo"
save object fileName, objID
endif
` clean up
delete memblock from object objID
delete memblock memBlockID
endfunction
