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
|