Well - thats has got to be the shortest source code for physics I've ever seen! Zotoaster made this in DBPro and it's pretty small too... but not as small as yours LOL....
I'll attach the code - it runs - a marble bouncing around on a bumpy matrix - I was impressed. I know this isn't the place but it seemed appropriate with ColdFire's post.
--Jason
`Kinetix - Physics Library #857584
`Alastair Zotos (Zotoaster)
`Main Source File
`setup
sync on : sync rate 60
set display mode 1024,768,32 : hide mouse
autocam off : set camera range 1,0x7fffffff
backdrop on : color backdrop 0
`set ambient light 75
`start Kinetix
kx_startKinetix()
`setup Kinetix world
kx_setupWorld(-1.3,0.02)
`create a simple sphere
//create bitmap 1,50,50 : set current bitmap 1
// ink rgb(0,0,0),0 : box 0,0,50,50
// ink rgb(255,0,0),0 : box 0,23,50,27
// get image 1,0,0,50,50
//set current bitmap 0 : delete bitmap 1
make object sphere 1,100,100,100 : position object 1,-200,45,20
//make object cube 1,100 : position object 1,-200,45,20
//texture object 1,1 :
set object rotation zyx 1
//kx_createBody==(Object, Dynamic mode, Mass, Drag Constant, Density, Material)
//kx_createMaterial==(Friction, Collision Object)
//kx_createBody==(Object, Dynamic mode, Mass, Drag Constant, Density, Material)
mat = kx_createMaterial(0.1,20)
sph = kx_createBody(1,1,500,0.1,1.1,mat)
vec1 = kx_makeVector()
vec2 = kx_makeVector()
frc#=100
remstart
make object sphere 2,100 : position object 2,-200,45,20
set object rotation zyx 2
jmat = kx_createMaterial(0.5,1)
jsph = kx_createBody(2,1,50,0.03,0.02,mat)
jsph2 = kx_createBody(2,1,50,0.03,0.02,jmat)
jvec1 = kx_makeVector()
jvec2 = kx_makeVector()
jfrc#=100
remend
`level
rem start
make matrix 1,10000,10000,30,30
for z=1 to 29
for x=1 to 29
height#=50.0-(abs(sin((x*40))*400))
height#=height#+(50.0-(abs(cos((z*40))*400)))
height#=height#/1.5
set matrix height 1,x,z,height#
next x
next z
update matrix 1
matrix_to_mesh(1,10000,10000,30,30,1)
make object 20,1,0 : delete mesh 1 : set object normals 20
position object 20,-5000,0,-50 : delete matrix 1
rem end
`load object "kintest3.x",2 : scale object 2,70,70,70 : yrotate object 2,180 : xrotate object 2,355 : fix object pivot 2
flr = kx_createBody(20,0,0,0,0.2,0)
`Main Loop
do
set cursor 0,0
print Screen fps()
`get object positions
x#=object position x(1)
y#=object position y(1)
z#=object position z(1)
`control object
if upkey()
frcx#=sin(ay#)*frc#
frcz#=cos(ay#)*frc#
endif
if downkey()
frcx#=-sin(ay#)*frc#
frcz#=-cos(ay#)*frc#
endif
if upkey()=0 and downkey()=0 then frcx#=0 : frcz#=0
if leftkey() then a#=-3
if rightkey() then a#=3
if leftkey()=0 and rightkey()=0 then a#=0
ay#=wrapvalue(ay#+a#)
if spacekey() and kx_getColliding(sph)
frcy#=5500
else
frcy#=0
endif
kx_setVector(vec1,frcx#,frcy#,frcz#) : kx_setBodyForce(sph)
kx_setVector(vec2,frcz#,0,frcx#) : kx_setBodyTorque(sph)
kx_updateBody(sph)
frcx#=curvevalue(0,frcx#,0.05)
frcy#=curvevalue(0,frcy#,0.05)
frcz#=curvevalue(0,frcz#,0.05)
//-------------
remstart
kx_setVector(jvec1,jfrcx#,frcy#,jfrcz#) : kx_setBodyForce(jsph)
kx_setVector(jvec2,jfrcz#,0,jfrcx#) : kx_setBodyTorque(jsph)
kx_setVector(jvec1,jfrcx#,frcy#,jfrcz#) : kx_setBodyForce(jsph2)
kx_setVector(jvec2,jfrcz#,0,jfrcx#) : kx_setBodyTorque(jsph2)
kx_updateBody(jsph)
kx_updateBody(jsph2)
remend
`camera
ca#=curveangle(ay#,ca#,6.0)
cx#=x#-sin(ca#)*600
cy#=y#+300
cz#=z#-cos(ca#)*600
position camera cx#,cy#,cz#
point camera x#,y#,z#
sync
loop
`*Kinetix Physics Functions*
`---------------------------
function kx_startKinetix()
Global kxcontvec as integer
Global kxworlddata as tkxworlddata
dim kxbody(0) as tkxbodydata
dim kxmat(0) as tkxmatdata
dim kxvec(0) as vec3
endfunction
function kx_setupWorld(grav as float, dens as float)
kxworlddata.grav=grav
kxworlddata.dens=dens
endfunction
function kx_makeVector()
local vec as integer
array insert at bottom kxvec() : vec=array count(kxvec())
endfunction vec
function kx_setVector(vec,x as float, y as float, z as float)
kxcontvec=vec
kxvec(vec).x=x
kxvec(vec).y=y
kxvec(vec).z=z
endfunction
function kx_createMaterial(fric as float, cobj)
local mat as integer
array insert at bottom kxmat() : mat=array count(kxmat())
kxmat(mat).fric=fric
if cobj>0
kxmat(mat).cobj=cobj
kxmat(mat).coll=1
endif
endfunction mat
function kx_createBody(obj, mode, mass as float, dragc as float, dens as float, mat)
local body as integer
array insert at bottom kxbody() : body=array count(kxbody())
kxbody(body).obj=obj
kxbody(body).mass=mass
kxbody(body).dragc=dragc
kxbody(body).dens=dens
kxbody(body).size=object size(obj)
kxbody(body).mat=mat
kxbody(body).cobj=kxmat(mat).cobj
kxbody(body).mode=mode
kxbody(body).pos.x=object position x(obj)
kxbody(body).pos.y=object position y(obj)
kxbody(body).pos.z=object position z(obj)
kxbody(body).circ=kxbody(body).size*3.14
sc_setupComplexObject obj,0,2
endfunction body
function kx_setBodyForce(body)
kxbody(body).frct.x=kxvec(kxcontvec).x
kxbody(body).frct.y=kxvec(kxcontvec).y
kxbody(body).frct.z=kxvec(kxcontvec).z
endfunction
function kx_setBodyTorque(body)
kxbody(body).trqt.x=kxvec(kxcontvec).x
kxbody(body).trqt.y=kxvec(kxcontvec).y
kxbody(body).trqt.z=kxvec(kxcontvec).z
endfunction
function kx_setBodyVelocity(body)
kxbody(body).vel.x=kxvec(kxcontvec).x
kxbody(body).vel.y=kxvec(kxcontvec).y
kxbody(body).vel.z=kxvec(kxcontvec).z
endfunction
function kx_setBodyOmega(body)
kxbody(body).omega.x=kxvec(kxcontvec).x
kxbody(body).omega.y=kxvec(kxcontvec).y
kxbody(body).omega.z=kxvec(kxcontvec).z
endfunction
function kx_updateBody(body)
kxbody(body).mang.x=atanfull(kxbody(body).vel.y,kxbody(body).vel.z)
kxbody(body).mang.y=atanfull(kxbody(body).vel.x,kxbody(body).vel.z)
kxbody(body).mang.z=atanfull(kxbody(body).vel.x,kxbody(body).vel.y)
kxbody(body).fdir.x=sin(kxbody(body).ang.y)*cos(kxbody(body).ang.x)
kxbody(body).fdir.y=-sin(kxbody(body).ang.x)
kxbody(body).fdir.z=cos(kxbody(body).ang.y)*cos(kxbody(body).ang.x)
kxbody(body).mdir.x=sin(kxbody(body).mang.y)*cos(kxbody(body).mang.x)
kxbody(body).mdir.y=-sin(kxbody(body).mang.x)
kxbody(body).mdir.z=cos(kxbody(body).mang.y)*cos(kxbody(body).mang.x)
kxbody(body).frcw.x=0
kxbody(body).frcw.y=kxbody(body).mass*kxworlddata.grav
kxbody(body).frcw.z=0
kxbody(body).frcd.x=-(((kxbody(body).dragc+(kxmat(kxbody(body).mat).fric*kxbody(body).ccoll))/2)*kxbody(body).size*kxworlddata.dens*((kxbody(body).vel.x^2)*sgn(kxbody(body).vel.x)))
kxbody(body).frcd.y=-(((kxbody(body).dragc+(kxmat(kxbody(body).mat).fric*kxbody(body).ccoll))/2)*kxbody(body).size*kxworlddata.dens*((kxbody(body).vel.y^2)*sgn(kxbody(body).vel.y)))
kxbody(body).frcd.z=-(((kxbody(body).dragc+(kxmat(kxbody(body).mat).fric*kxbody(body).ccoll))/2)*kxbody(body).size*kxworlddata.dens*((kxbody(body).vel.z^2)*sgn(kxbody(body).vel.z)))
kxbody(body).frc.x=kxbody(body).frct.x+kxbody(body).frcw.x+kxbody(body).frcd.x+kxbody(body).frcc.x
kxbody(body).frc.y=kxbody(body).frct.y+(kxbody(body).frcw.y*(1-kxbody(body).ccoll))+kxbody(body).frcd.y+kxbody(body).frcc.y
kxbody(body).frc.z=kxbody(body).frct.z+kxbody(body).frcw.z+kxbody(body).frcd.z+kxbody(body).frcc.z
kxbody(body).acc.x=kxbody(body).frc.x/kxbody(body).mass
kxbody(body).acc.y=kxbody(body).frc.y/kxbody(body).mass
kxbody(body).acc.z=kxbody(body).frc.z/kxbody(body).mass
kxbody(body).vel.x=kxbody(body).vel.x+kxbody(body).acc.x
kxbody(body).vel.y=kxbody(body).vel.y+kxbody(body).acc.y
kxbody(body).vel.z=kxbody(body).vel.z+kxbody(body).acc.z
kxbody(body).speed=sqrt(kxbody(body).vel.x^2+kxbody(body).vel.y^2+kxbody(body).vel.z^2)
kxbody(body).pos.x=kxbody(body).pos.x+kxbody(body).vel.x
kxbody(body).pos.y=kxbody(body).pos.y+kxbody(body).vel.y
kxbody(body).pos.z=kxbody(body).pos.z+kxbody(body).vel.z
kxbody(body).trq.x=kxbody(body).trqt.x+kxbody(body).trqd.x+kxbody(body).trqc.x
kxbody(body).trq.y=kxbody(body).trqt.y+kxbody(body).trqd.y+kxbody(body).trqc.y
kxbody(body).trq.z=kxbody(body).trqt.z+kxbody(body).trqd.z+kxbody(body).trqc.z
kxbody(body).angacc.x=kxbody(body).trq.x/kxbody(body).mass
kxbody(body).angacc.y=kxbody(body).trq.y/kxbody(body).mass
kxbody(body).angacc.z=kxbody(body).trq.z/kxbody(body).mass
kxbody(body).omega.x=kxbody(body).omega.x+kxbody(body).angacc.x
kxbody(body).omega.y=kxbody(body).omega.y+kxbody(body).angacc.y
kxbody(body).omega.z=kxbody(body).omega.z+kxbody(body).angacc.z
kxbody(body).ang.x=kxbody(body).ang.x+kxbody(body).omega.x
kxbody(body).ang.y=kxbody(body).ang.y+kxbody(body).omega.y
kxbody(body).ang.z=kxbody(body).ang.z+kxbody(body).omega.z
if kxbody(body).mode=1
c=sc_sphereSlide(kxbody(body).cobj,kxbody(body).pos.x-kxbody(body).vel.x,kxbody(body).pos.y-kxbody(body).vel.y,kxbody(body).pos.z-kxbody(body).vel.z,kxbody(body).pos.x,kxbody(body).pos.y,kxbody(body).pos.z,kxbody(body).size,0)
if c>0 then kxbody(body).ccoll=1 else kxbody(body).ccoll=0
if kxbody(body).ccoll=1
kxbody(body).vel.x=sc_getCollisionbounceX()
kxbody(body).vel.y=sc_getCollisionbounceY()
kxbody(body).vel.z=sc_getCollisionbounceZ()
kxbody(body).cnorm.x=sc_getCollisionNormalX()
kxbody(body).cnorm.y=sc_getCollisionNormalY()
kxbody(body).cnorm.z=sc_getCollisionNormalZ()
endif
kxbody(body).mom.x=kxbody(body).mass*kxbody(body).vel.x
kxbody(body).mom.y=kxbody(body).mass*kxbody(body).vel.y
kxbody(body).mom.z=kxbody(body).mass*kxbody(body).vel.z
endif
position object kxbody(body).obj,kxbody(body).pos.x,kxbody(body).pos.y,kxbody(body).pos.z
rotate object kxbody(body).obj,kxbody(body).ang.x,kxbody(body).ang.y,kxbody(body).ang.z
sc_updateObject kxbody(body).obj
endfunction
function kx_getColliding(body)
local coll as boolean
coll=kxbody(body).ccoll
endfunction coll
function kx_getCollisionNormalX(body)
local nx as float
nx=kxbody(body).cnorm.x
endfunction nx
function kx_getCollisionNormalY(body)
local ny as float
ny=kxbody(body).cnorm.y
endfunction ny
function kx_getCollisionNormalZ(body)
local nz as float
nz=kxbody(body).cnorm.z
endfunction nz
function kx_getBodyVelocityX(body)
local vx as float
vx=kxbody(body).vel.x
endfunction vx
function kx_getBodyVelocityY(body)
local vy as float
vy=kxbody(body).vel.y
endfunction vy
function kx_getBodyVelocityZ(body)
local vz as float
vz=kxbody(body).vel.z
endfunction vz
function sgn(value#)
if value#>=0 then exitfunction 1
endfunction -1
function startsparky()
make memblock 1,0
delete memblock 1
endfunction
`Impotant Types
Type vec3
x as float
y as float
z as float
endtype
type tkxworlddata
grav as float
dens as float
endtype
type tkxmatdata
fric as float
cobj as integer
coll as boolean
endtype
type tkxbodydata
obj as integer
circ as float
pos as vec3
vel as vec3
acc as vec3
fdir as vec3
mdir as vec3
frct as vec3
frcw as vec3
frcd as vec3
frcc as vec3
frc as vec3
mom as vec3
mang as vec3
ang as vec3
omega as vec3
angacc as vec3
angmove as vec3
trqt as vec3
trqd as vec3
trqc as vec3
trq as vec3
mass as float
dens as float
mat as integer
dragc as float
size as float
speed as float
cobj as integer
coll as vec3
cnorm as vec3
ccoll as boolean
mode as boolean
endtype
`Deamon's Functions (Thanks)
function matrix_to_mesh(matrixnum,width,height,xtiles,ztiles,meshnum)
create_memblockobject(meshnum,xtiles*ztiles*6)
for x=0 to xtiles-1
for z=0 to ztiles-1
div#=2
create_vertex(meshnum,vertex,x*width/(xtiles+0.0),get matrix height(matrixnum,x,z),z*height/(ztiles+0.0),rgb(get matrix height(matrixnum,x,z)/div#,get matrix height(matrixnum,x,z)/div#,get matrix height(matrixnum,x,z)/div#),0,0)
create_vertex(meshnum,vertex+1,x*width/(xtiles+0.0),get matrix height(matrixnum,x,z+1),(z+1)*height/(ztiles+0.0),rgb(get matrix height(matrixnum,x,z+1)/div#,get matrix height(matrixnum,x,z+1)/div#,get matrix height(matrixnum,x,z+1)/div#),0,0)
create_vertex(meshnum,vertex+2,(x+1)*width/(xtiles+0.0),get matrix height(matrixnum,x+1,z),z*height/(ztiles+0.0),rgb(get matrix height(matrixnum,x+1,z)/div#,get matrix height(matrixnum,x+1,z)/div#,get matrix height(matrixnum,x+1,z)/div#),0,0)
create_vertex(meshnum,vertex+3,(x+1)*width/(xtiles+0.0),get matrix height(matrixnum,x+1,z),z*height/(ztiles+0.0),rgb(get matrix height(matrixnum,x+1,z)/div#,get matrix height(matrixnum,x+1,z)/div#,get matrix height(matrixnum,x+1,z)/div#),0,0)
create_vertex(meshnum,vertex+4,x*width/(xtiles+0.0),get matrix height(matrixnum,x,z+1),(z+1)*height/(ztiles+0.0),rgb(get matrix height(matrixnum,x,z+1)/div#,get matrix height(matrixnum,x,z+1)/div#,get matrix height(matrixnum,x,z+1)/div#),0,0)
create_vertex(meshnum,vertex+5,(x+1)*width/(xtiles+0.0),get matrix height(matrixnum,x+1,z+1),(z+1)*height/(ztiles+0.0),rgb(get matrix height(matrixnum,x+1,z+1)/div#,get matrix height(matrixnum,x+1,z+1)/div#,get matrix height(matrixnum,x+1,z+1)/div#),0,0)
for i=0 to 5
set_normal(meshnum,vertex+i,1,1,1)
next i
inc vertex,6
next z
next x
make mesh from memblock meshnum,meshnum
delete memblock meshnum
endfunction
function create_memblockobject(memnum,v)
make memblock memnum,12+(36*v)
write memblock dword memnum,0,338
write memblock dword memnum,4,36
write memblock dword memnum,8,v
endfunction
function create_vertex(memnum,v,vposx#,vposy#,vposz#,color as dword,u#,v#)
write memblock float memnum,v*36+12,vposx#
write memblock float memnum,v*36+16,vposy#
write memblock float memnum,v*36+20,vposz#
write memblock dword memnum,v*36+36,color
write memblock float memnum,v*36+40,u#
write memblock float memnum,v*36+44,v#
endfunction
function set_normal(memnum,v,normalx#,normaly#,normalz#)
write memblock float memnum,v*36+24,normalx#
write memblock float memnum,v*36+28,normaly#
write memblock float memnum,v*36+32,normalz#
endfunction
function make_object(objnum,meshnum,memnum,imgnum)
make mesh from memblock meshnum,memnum
make object objnum,meshnum,imgnum
endfunction
`*Command List*
`--------------
remstart
Ignore the stupid layout, they're like that so they can be put in a keywords file.
Main Functions:
kx_startKinetix==(*No Parameters*)
kx_setupWorld==(Gravity, Air Density)
kx_makeVector==(*No Parameters*)
kx_setVector==(Vec, X, Y, Z)
kx_createMaterial==(Friction, Collision Object)
kx_createBody==(Object, Dynamic mode, Mass, Drag Constant, Density, Material)
kx_setBodyForce==(Body)
kx_setBodyTorque==(Body)
kx_setBodyVelocity==(Body)
kx_setBodyOmega==(Body)
kx_updateBody==(Body)
kx_getColliding==(Body)
kx_getCollisionNormalX==(Body)
kx_getCollisionNormalY==(Body)
kx_getCollisionNormalZ==(Body)
kx_getBodyVelocityX==(body)
kx_getBodyVelocityY==(body)
kx_getBodyVelocityZ==(body)
Extra Functions:
sgn==(Value)
startsparky==(*No Parameters*)
You will need:
Sparky's DLL V2.0
remend