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