rem Basic3D Functionality

rem Standard Setup Code for all examples
backdrop off : cls : sync on : sync rate 0 : hide mouse
set text font "arial" : set text size 16
set text to bold : set text transparent

rem Legacy or New Commands
legacyonly=rnd(1)
if legacyonly=1
 gosub _legacycommands
else
 gosub _newcommands
endif

rem End program
end

_legacycommands:

rem Test loop
do

rem Produce random values
ObjectNumber=1+rnd(500000)
Wireframe=rnd(1)
Transparency=rnd(1)
Cull=rnd(1)
Filter=rnd(1)
Light=rnd(1)
Fog=rnd(1)
Ambient=rnd(1)
MeshNumber=1+rnd(5)
TextureNumber=1+rnd(5)
LimbNumber=10
Size=10+rnd(90)
XSize=10+rnd(90)
YSize=10+rnd(90)
ZSize=10+rnd(90)
StartFrame=1+rnd(10)
EndFrame=StartFrame+1+rnd(10)
Speed=50+rnd(50)
QuarterPercent=100/4
ImageNumber=1+rnd(5)
TextureMode=1+rnd(2)
Percentage#=rnd(100)
SecondObject=1+rnd(500000)
TextureMode=1+rnd(2)
MipMode=1+rnd(2)
X=rnd(400)-200
Y=0
Z=rnd(400)
NewX=rnd(400)-200
NewY=0
NewZ=rnd(400)
Velocity=1+rnd(9)
XAngle=rnd(359)
YAngle=rnd(359)
ZAngle=rnd(359)
UValue=rnd(100)/100.0
VValue=rnd(100)/100.0
Scale=50+rnd(50)
XScale=50+rnd(50)
YScale=50+rnd(50)
ZScale=50+rnd(50)
MipmapGeneration=1+rnd(1)

rem Try each command group at random
r=r+1 : if r>=4 then r=0
if r=0 then gosub _3dobjects
if r=1 then gosub _3dmotion
if r=2 then gosub _3dcollision
if r=3 then gosub _3dlimbs

rem Display data
cls 0
print "BASIC3D EXPRESSION DATA"
print
if object exist(ObjectNumber)=1
if rnd(5)=1
 print "3D OBJECTS"
 print "exist:";object exist(ObjectNumber)
 print "frames:";total object frames(ObjectNumber)
 print "size:";object size(ObjectNumber)
 print "x:";object position x(ObjectNumber)
 print "y:";object position y(ObjectNumber)
 print "z:";object position z(ObjectNumber)
 print "anglex:";object angle x(ObjectNumber)
 print "angley:";object angle y(ObjectNumber)
 print "anglez:";object angle z(ObjectNumber)
 print "sizex:";object size x(ObjectNumber)
 print "sizey:";object size y(ObjectNumber)
 print "sizez:";object size z(ObjectNumber)
 print "visible:";object visible(ObjectNumber)
 print "playing:";object playing(ObjectNumber)
 print "looping:";object looping(ObjectNumber)
 print "frame:";object frame(ObjectNumber)
 print "speed:";object speed(ObjectNumber)
 print "interpolation:";object interpolation(ObjectNumber)
 print "object in screen:";object in screen(ObjectNumber)
 print "object screen x:";object screen x(ObjectNumber)
 print "object screen y:";object screen y(ObjectNumber)
 print
endif
if rnd(5)=1
 print "COLLISION"
 if object exist(SecondObject)=1
  print "object collision:";object collision(ObjectNumber, SecondObject)
  print "object hit:";object hit(ObjectNumber, SecondObject)
 endif
 print "object col radius:";object collision radius(ObjectNumber)
 print "object col center x:";object collision center x(ObjectNumber)
 print "object col center y:";object collision center y(ObjectNumber)
 print "object col center z:";object collision center z(ObjectNumber)
 print "object col x:";get object collision x()
 print "object col y:";get object collision y()
 print "object col z:";get object collision z()
 print "static hit:";get static collision hit( 2,2,2,10,10,10, 3,3,3,11,11,11 )
 print "static col x:";get static collision x()
 print "static col y:";get static collision y()
 print "static col z:";get static collision z()
 print "static line hit:";static line of sight( 0,0,0, 0,0,100, 1, 1 )
 print "static line col x:";static line of sight x()
 print "static line col y:";static line of sight y()
 print "static line col z:";static line of sight z()
 print
endif
if rnd(5)=1
 print "LIMBS"
 print "exist:";limb exist(ObjectNumber, LimbNumber)
 if limb exist(ObjectNumber, LimbNumber)=1
  print "offsetx:";limb offset x(ObjectNumber, LimbNumber)
  print "offsety:";limb offset y(ObjectNumber, LimbNumber)
  print "offsetz:";limb offset z(ObjectNumber, LimbNumber)
  print "anglex:";limb angle x(ObjectNumber, LimbNumber)
  print "angley:";limb angle y(ObjectNumber, LimbNumber)
  print "anglez:";limb angle z(ObjectNumber, LimbNumber)
  print "positionx:";limb position x(ObjectNumber, LimbNumber)
  print "positiony:";limb position y(ObjectNumber, LimbNumber)
  print "positionz:";limb position z(ObjectNumber, LimbNumber)
  print "directionx:";limb direction x(ObjectNumber, LimbNumber)
  print "directiony:";limb direction y(ObjectNumber, LimbNumber)
  print "directionz:";limb direction z(ObjectNumber, LimbNumber)
  print "texture:";limb texture(ObjectNumber, LimbNumber)
  print "visible:";limb visible(ObjectNumber, LimbNumber)
  print "linkvalid:";check limb link(ObjectNumber, LimbNumber)
  print "name$:";limb texture name(ObjectNumber, LimbNumber)
 endif
 print
endif
if rnd(5)=1
 print "MISC"
 print "mesh exist:";mesh exist(MeshIndex)
 print "alphablending available:";alphablending available()
 print "filtering available:";filtering available()
 print "fog available:";fog available()
 print "TnL available:";tnl available()
 print "Polys on nscreen:";statistic(1)
 print
endif
endif

rem Delete Object
if object exist(ObjectNumber)=1 then delete object ObjectNumber

rem Update screen
sync

loop

return

_3dobjects:

rem Load Objects
load object "models\model.x",ObjectNumber
load object "models\model.x",SecondObject

rem Load Image for object
load image "iron.jpg",ImageNumber

rem Append Object
append object "models\extraanim.x", ObjectNumber, total object frames(ObjectNumber)+1

rem Set Object Properties
set object ObjectNumber, Wireframe, Transparency, Cull
set object ObjectNumber, Wireframe, Transparency, Cull, Filter
set object ObjectNumber, Wireframe, Transparency, Cull, Filter, Light
set object ObjectNumber, Wireframe, Transparency, Cull, Filter, Light, Fog
set object ObjectNumber, Wireframe, Transparency, Cull, Filter, Light, Fog, Ambient

rem Control Object Animation
play object ObjectNumber
play object ObjectNumber,StartFrame
play object ObjectNumber,StartFrame,EndFrame
loop object ObjectNumber
loop object ObjectNumber,StartFrame
loop object ObjectNumber,StartFrame,EndFrame
stop object ObjectNumber
set object frame ObjectNumber, StartFrame
set object speed ObjectNumber, Speed
set object interpolation ObjectNumber, QuarterPercent

rem Control Object Orientation
set object rotation xyz ObjectNumber
set object rotation zyx ObjectNumber

rem Object Visuals
hide object ObjectNumber
show object ObjectNumber
color object ObjectNumber, rgb(255,255,0)
scale object ObjectNumber,XSize,YSize,ZSize
texture object ObjectNumber, ImageNumber
set object texture ObjectNumber, TextureMode, MipmapGeneration
scroll object texture ObjectNumber, 0.1, 0.2
scale object texture ObjectNumber, 75, 75
ghost object on ObjectNumber
ghost object off ObjectNumber
fade object ObjectNumber, Percentage#
glue object to limb ObjectNumber, SecondObject, 1
unglue object ObjectNumber
lock object on ObjectNumber
lock object off ObjectNumber
disable object zdepth ObjectNumber
enable object zdepth ObjectNumber

rem Load mesh
load mesh "mesh.x",MeshNumber

rem Make Primitives
delete object ObjectNumber : make object cube ObjectNumber, Size
delete object ObjectNumber : make object box ObjectNumber, XSize, YSize, ZSize
delete object ObjectNumber : make object cylinder ObjectNumber, Size
delete object ObjectNumber : make object cone ObjectNumber, Size
delete object ObjectNumber : make object plain ObjectNumber, XSize, YSize
delete object ObjectNumber : make object triangle ObjectNumber, 0, 0, 0, 1, 1, 0, 0, 1, 0
delete object ObjectNumber : make object sphere ObjectNumber, Size
delete object ObjectNumber : make object ObjectNumber, MeshNumber, TextureNumber

rem Change Mesh In Object
LimbNumber=0
change mesh ObjectNumber, LimbNumber, MeshNumber

rem Delete Mesh
delete mesh MeshNumber

rem Make Mesh From Object
make mesh from object MeshNumber, ObjectNumber

rem Delete second object
delete object SecondObject

rem Remove redundant video items
flush video memory

return

_3dmotion:

rem Load objects
load object "model.x",ObjectNumber
load object "model.x",SecondObject

rem Adjust model to face correct direction
rotate object ObjectNumber, 270, 0, 0
fix object pivot ObjectNumber

rem Control object motion using EULER
position object ObjectNumber, X, Y, Z
rotate object ObjectNumber, XAngle, YAngle, ZAngle
xrotate object ObjectNumber, XAngle
yrotate object ObjectNumber, YAngle
zrotate object ObjectNumber, ZAngle
point object ObjectNumber, NewX, NewY, NewZ
move object ObjectNumber, Velocity

rem Control object motion using FREEFLIGHT
turn object left ObjectNumber, Velocity
turn object right ObjectNumber, Velocity
pitch object up ObjectNumber, Velocity
pitch object down ObjectNumber, Velocity
roll object left ObjectNumber, Velocity
roll object right ObjectNumber, Velocity

rem Align position and angle with other entities
set object to object orientation ObjectNumber, SecondObject
set object to camera orientation ObjectNumber

rem Delete second object
delete object SecondObject

return

_3dcollision:

rem Activate global collision
set global collision on

rem Load object
load object "model.x",ObjectNumber

rem Deactivate object collision
set object collision off ObjectNumber

rem Activate object collision
set object collision on ObjectNumber

rem Make new collision box for object
make object collision box ObjectNumber, -50,-50,-50,50,50,50,1

rem Delete collision box from object
delete object collision box ObjectNumber

rem Set different styles of collision
set object collision to boxes ObjectNumber
set object collision to spheres ObjectNumber
set object collision to polygons ObjectNumber

rem Deactivate global collision
set global collision off

return

_3dlimbs:

rem Load object
load object "model.x",ObjectNumber

rem Load Image for object
load image "iron.jpg",ImageNumber

rem Get details for all object limbs
perform checklist for object limbs ObjectNumber
for c=1 to checklist quantity()
 print checklist string$(c)
next c

rem Manipulate single limb of the object
hide limb ObjectNumber, LimbNumber
show limb ObjectNumber, LimbNumber
offset limb ObjectNumber, LimbNumber, 0, 0, 100
rotate limb ObjectNumber, LimbNumber, XAngle, YAngle, ZAngle
scale limb ObjectNumber, LimbNumber, XScale, YScale, ZScale
color limb ObjectNumber, LimbNumber, rgb(0,255,0)
texture limb ObjectNumber, LimbNumber, ImageNumber
scroll limb texture ObjectNumber, LimbNumber, UValue, VValue
scale limb texture ObjectNumber, LimbNumber, XScale, YScale

return

_newcommands:

rem Set starting object numbers
ObjectNumber=1+rnd(49)
SecondObject=51+rnd(49)
ImageNumber=1+rnd(5)
Side=ImageNumber

rem Load image
load image "iron.jpg",ImageNumber

rem Create a higher quality sphere
make object sphere ObjectNumber,100,5,30
texture object ObjectNumber,ImageNumber

rem Test loop
do

rem Produce random values
Wireframe=rnd(1)
Transparency=rnd(1)
Cull=rnd(1)
Filter=rnd(1)
Light=rnd(1)
Fog=rnd(1)
Ambient=rnd(1)
VertexShaderNumber=1+rnd(5)

rem Try each command group at random
r=r+1 : if r>=5 then r=0
if r=0 then gosub _newobjectcommands
if r=1 then gosub _newtexturecommands
if r=2 then gosub _newvisualcommands
if r=3 then gosub _newshadercommands
if r=4 then gosub _newpixelshadercommands

rem Remove any second object
if object exist(SecondObject)=1 then delete object SecondObject

rem Display data
s=rnd(2)
cls
print "NEW BASIC3D EXPRESSION DATA (";r;")"
print
if s=0
 print "3D DEVICE DATA"
 print "devicetype:";get device type()
 print "max lights:";get maximum lights()
 print "max tex width:";get maximum texture width()
 print "max tex height:";get maximum texture height()
 print "max volume extent:";get maximum volume extent()
 print "max vertexshader version:";get maximum vertex shader version()
 print "max vertexshader constant:";get maximum vertex shader constants()
 print "max pixelshader version:";get maximum pixel shader version()
 print "max pixelshader value:";get maximum pixel shader value()
 print
endif
if s=1
 print "GENERAL AVAILABILITY FLAGS"
 print "blit sys to local:";blitsystolocal available()
 print "calibrate gamma:";calibrategamma available()
 print "fullscreen gamma:";fullscreengamma available()
 print "render after flip:";renderafterflip available()
 print "render windowed:";renderwindowed available()
 print "tlvertex system memory:";tlvertexsystemmemory available()
 print "tlvertex video memory:";tlvertexvideomemory available()
 print "nonlocal video memory:";nonlocalvideomemory available()
 print "texture system memory:";texturesystemmemory available()
 print "texture video memory:";texturevideomemory available()
 print "fog range:";fogrange available()
 print "fog table:";fogtable available()
 print "fog vertex:";fogvertex available()
 print "wbuffer:";wbuffer available()
 print "wfog:";wfog available()
 print "zbuffer:";zbuffer available()
 print "zfog:";zfog available()
 print
endif
if s=2
 print "TEXTURE AVAILABILITY FLAGS"
 print "alpha:";alpha available()
 print "alpha comparison:";alphacomparison available()
 print "anistropic filtering:";anistropicfiltering available()
 print "antialias:";antialias available()
 print "clip and scale points:";clipandscalepoints available()
 print "clip tlverts:";cliptlverts available()
 print "color perspective:";colorperspective available()
 print "color write enable:";colorwriteenable available()
 print "cubemap:";cubemap available()
 print "cullccw:";cullccw available()
 print "cullcw:";cullcw available()
 print "dither:";dither available()
 print "mipcubemap:";mipcubemap available()
 print "mipmap:";mipmap available()
 print "mipmap lodbias:";mipmaplodbias available()
 print "mipmap volume:";mipmapvolume available()
 print "non power of 2 textures:";nonpowtextures available()
 print "perspective textures:";perspectivetextures available()
 print "projected textures:";projectedtextures available()
 print "seperate texture memories:";seperatetexturememories available()
 print "only square textures:";onlysquaretextures available()
 print "volumemap:";volumemap available()
 print
endif

rem Update screen
sync

rem Short pause
sleep 1000

rem End loop
loop

return

_newobjectcommands:

rem Clone object
clone object ObjectNumber, SecondObject

rem Move clone slightly so we can see it
if object exist(SecondObject)=1 then position object SecondObject,50,50,50

rem Move against the object angle
move object up ObjectNumber, rnd(25)
move object down ObjectNumber, rnd(25)
move object left ObjectNumber, rnd(25)
move object right ObjectNumber, rnd(25)

rem Adjust the collision radius of the object
set object radius ObjectNumber, 50

return

_newtexturecommands:

rem Apply a texturing style
set light mapping on ObjectNumber, ImageNumber
set cube mapping on ObjectNumber, Side, Side, Side, Side, Side, Side
set sphere mapping on ObjectNumber, ImageNumber
set detail mapping on ObjectNumber, ImageNumber
set blend mapping on ObjectNumber, ImageNumber, 10
set bump mapping on ObjectNumber, ImageNumber
set cartoon shading on ObjectNumber, ImageNumber, ImageNumber

return

_newvisualcommands:

rem Adjust visual properties of the object
set object wireframe ObjectNumber, Wireframe
set object transparency ObjectNumber, Transparency
set object cull ObjectNumber, Cull
set object filter ObjectNumber, Filter
set object light ObjectNumber, Light
set object fog ObjectNumber, Fog
set object ambient ObjectNumber, Ambient

return

_newshadercommands:

rem Constants for vertex shader
#constant CSCALE          1
#constant CTRANSLATION    2
#constant CXROTATE        3
#constant CYROTATE        4
#constant CZROTATE        5
#constant CROTATION       6
#constant CWORLD          7
#constant CVIEW           8
#constant CPROJECTION     9
#constant CTEMP           10
#constant CLIGHT          11
#constant CDEGTORAD       ( 3.14 / 180.0 )

rem Provide vertex shader with stream count
set vertex shader streamcount VertexShaderNumber, 4

rem Provide vertex shader with stream
VSDT_FLOAT2=0x01 : VSDT_FLOAT3=0x02 : VSDT_D3DCOLOR=0x04
VSDE_POSITION=0 : VSDE_NORMAL=3 : VSDE_DIFFUSE=5 : VSDE_TEXCOORD0=7
set vertex shader stream VertexShaderNumber, 1, VSDE_POSITION, VSDT_FLOAT3
set vertex shader stream VertexShaderNumber, 2, VSDE_NORMAL, VSDT_FLOAT3
set vertex shader stream VertexShaderNumber, 3, VSDE_DIFFUSE, VSDT_D3DCOLOR
set vertex shader stream VertexShaderNumber, 4, VSDE_TEXCOORD0, VSDT_FLOAT2

rem Create a vertex shader from a text file
create vertex shader from file VertexShaderNumber, "vshader.vsh"

rem Make simple object
if object exist(ObjectNumber)=1 then delete object ObjectNumber
make object sphere ObjectNumber,100

rem Convert object to correct mesh format
FVF_XYZ=0x002 : FVF_NORMAL=0x010 : FVF_DIFFUSE=0x040 : FVF_TEX1=0x100
FVF_FINAL=D3DFVF_XYZ || D3DFVF_NORMAL || D3DFVF_DIFFUSE || D3DFVF_TEX1
convert object fvf ObjectNumber,FVF_FINAL

rem Check if vertex shader was created
if vertex shader exist(VertexShaderNumber)=1

 rem Apply vertex shader to object
 set vertex shader on ObjectNumber, VertexShaderNumber

 rem Create required matrices
 r=make matrix4(CVIEW)
 r=make matrix4(CPROJECTION)
 r=make matrix4(CSCALE)
 r=make matrix4(CTRANSLATION)
 r=make matrix4(CXROTATE)
 r=make matrix4(CYROTATE)
 r=make matrix4(CZROTATE)
 r=make matrix4(CROTATION)
 r=make matrix4(CWORLD)
 r=make matrix4(CTEMP)

 rem required light vector
 r=make vector3(CLIGHT)

 rem setup camera and light vector position
 sync on : position camera 0,0,-500
 set vector3 CLIGHT,0,0,-500

 rem Simple loop
 while mouseclick()=0

  rem get view and projection matrices
  view matrix4 CVIEW
  projection matrix4 CPROJECTION

  rem setup a scale matrix
  scale matrix4 CSCALE, 2.0, 2.0, 2.0

  rem now setup the position
  translate matrix4 CTRANSLATION, 0.0, 10.0, 0.0

  rem setup rotation
  rotate x matrix4 CXROTATE, 0.0 * CDEGTORAD
  rotate y matrix4 CYROTATE, 0.0 * CDEGTORAD
  rotate z matrix4 CZROTATE, 45.0 * CDEGTORAD

  rem multiply all 3 rotation matrices together
  multiply matrix4 CROTATION, CXROTATE, CYROTATE
  multiply matrix4 CROTATION, CROTATION, CZROTATE

  rem multiply all final matrices
  multiply matrix4 CTEMP,  CROTATION, CSCALE
  multiply matrix4 CWORLD, CTEMP,     CSCALE
  multiply matrix4 CWORLD, CWORLD,    CVIEW
  multiply matrix4 CWORLD, CWORLD,    CPROJECTION

  rem transpose the matrix
  transpose matrix4 CWORLD, CWORLD

  rem we send the light vector3 to the vertex shader
  set vertex shader vector VertexShaderNumber, 4, CLIGHT, 4

  rem this is an important part – we send the world matrix to the vertex shader
  set vertex shader matrix VertexShaderNumber, 0, CWORLD, 4

  rem camera look
  rotate camera camera angle x()+mousemovey(),camera angle y()+mousemovex(),0

  rem update screen
  sync

 rem end loop
 endwhile

 rem Deactivate vertex shader of the object
 set vertex shader off ObjectNumber

 rem Delete a vertex shader
 delete vertex shader VertexShaderNumber

endif

return

_newpixelshadercommands:

rem Create an object
if object exist(1)=1 then delete object 1
make object sphere 1,10

rem If Pixel Shaders supported
if get maximum pixel shader version()>0

 rem Create a pixel shader from a text file
 create pixel shader from file PixelShaderNumber, "pixelshader.psh"

 rem Provide pixel shader with a texture
 ImageNumber=1
 load image "face.bmp",ImageNumber
 set pixel shader texture PixelShaderNumber, 0, ImageNumber

 rem Check if pixel shader was created
 if pixel shader exist(PixelShaderNumber)=1

  rem Apply pixel shader to object
  set pixel shader on ObjectNumber, PixelShaderNumber

 endif

 rem Main loop
 while mouseclick()<>2
  set cursor 0,0 : print "Press Right Mouse Button To Exit"
 endwhile

 rem Check if pixel shader was created
 if pixel shader exist(PixelShaderNumber)=1

  rem Deactivate pixel shader of the object
  set pixel shader off ObjectNumber

  rem Delete a pixel shader
  delete pixel shader PixelShaderNumber

 endif

else
 print "No Pixel Shader Support - Press Key" : wait key
endif

return

