Blitz3D SDK samples for PureBasic

Share your advanced PureBasic knowledge/code with the community.
Godai
Enthusiast
Enthusiast
Posts: 171
Joined: Thu Oct 05, 2006 8:13 pm

Blitz3D SDK samples for PureBasic

Post by Godai »

First you need to locate the examples in your SDK.
They are in the BlitzMax->blitz3d.mod->blitz3dsdk.mod->doc->samples->mak directory.
(At least those ported so far)

In this directory you need to place the 'blitz3dsdk.pbi' file as well as a new file named "start.pb" containing the following code:

Code: Select all

IncludeFile "../blitz3dsdk.pbi"

Declare SetGfx()

SetGfx()

Procedure SetGfx()

  ; Initialise Blitz3D engine...
  bbBeginBlitz3D ()
  
  ; Set debug mode (it's on by default -- just added this so you can turn it off)...
  bbSetBlitz3DDebugMode(0) ; 1 = DEBUG ON, 0 = DEBUG OFF



	If info1$<>""
		bbSetBlitz3DTitle( info1$, "Exit "+info1$+"?")
	EndIf
	
	bbFlushKeys()
	
	mode_cnt=bbCountGfxModes3D()
	If Not mode_cnt 
	  bbRuntimeError("Can't find any 3D graphics modes")
	EndIf
	
	mode=0	
	If Not bbWindowed3D()
	 mode=1	
	EndIf
	
	bbGraphics(640,480,16,2)
	bbSetBuffer(bbBackBuffer())
	
	image=bbLoadImage( "b3dlogo.jpg" )
	If Not image 
	  image=bbLoadImage( "../b3dlogo.jpg" )
	EndIf
	bbMidHandle(image)
	
	font=bbLoadFont( "verdana",16,0,0,0 )
	bbSetFont(font)
	
	tx=640+160
	nx=-160
	ty=280
	
	url$="www.blitzbasic.com"
	url_x=640-bbStringWidth( url$ )
	url_y=480-bbFontHeight()

	Repeat
		bbCls()
		
		bbDrawBlock(image,320,144,0)
					
		bbColor(0,255,0)		
		bbText(tx,ty+bbFontHeight()*0,info1$,#True)
		If (info2$ <> "")
		  bbText(nx,ty+bbFontHeight()*1,info2$,#True)
		EndIf
		If (info3$ <> "")
		  bbText(tx,ty+bbFontHeight()*2,info3$,#True)
		EndIf
		If (info4$ <> "")
		  bbText(nx,ty+bbFontHeight()*3,info4$,#True)
		EndIf
	
		bbColor(255,255,255)
		If mode=0
			bbText(tx,ty+bbFontHeight()*5,"Windowed",#True)
		Else
			bbText(tx,ty+bbFontHeight()*5,Str(bbGfxModeWidth( mode ))+","+Str(bbGfxModeHeight( mode ))+","+Str(bbGfxModeDepth( mode )),#True)
		EndIf
		
		bbColor(255,0,0)
		bbText(nx,ty+bbFontHeight()*7,"[Return] to begin",#True)
		bbText(tx,ty+bbFontHeight()*8,"[Arrows] change mode",#True)
		bbText(nx,ty+bbFontHeight()*9,"[Escape] to exit",#True)
		
		bbColor(0,0,255)
		bbText(url_x,url_y,url$)
		
		If bbKeyHit( 1 ) 
		End
		EndIf
		If bbKeyHit( 28 )
			bbCls():bbFlip()
			bbCls():bbFlip()
			bbFreeFont(font)
			bbFreeImage(image)
			bbEndGraphics()
			If mode
				bbGraphics3D(bbGfxModeWidth(mode),bbGfxModeHeight(mode),bbGfxModeDepth(mode),1)
			Else
				bbGraphics3D(640,480,0,2)
			EndIf
			bbSetBuffer(bbBackBuffer())
			ProcedureReturn
		EndIf
		If bbKeyHit( 203 )
			mode=mode-1
			If mode<0 Or (mode=0 And (Not bbWindowed3D()))
				mode=mode_cnt
			EndIf
		ElseIf bbKeyHit( 205 )
			mode=mode+1
			If mode>mode_cnt
				mode=0
				If Not bbWindowed3D() 
				mode=1
				EndIf
			EndIf
		EndIf
		
		If tx>320 
		tx=tx-8
		EndIf
		If nx<320 
		nx=nx+8
		EndIf
		
		bbFlip()
		
	ForEver
	
EndProcedure
Now you can place the following samples in their respective directories and run them from there. (Feel free to post any additional samples you port here. I will do the same :))

Dragon example

Code: Select all

;0,40  : idle
;40,46 : run
;46,54 : attack
;54,58 : paina
;58,62 : painb
;62,66 : painc
;66,72 : jump
;72,84 : flip

Global info1$="Dragon Demo"
Global info2$="Use arrows keys to pan, A/Z to zoom"
Global info3$="MD2 Dragon model courtesy of Polycount"


; Run start code
IncludeFile "../start.pb"

;environment cube
cube=bbCreateCube()
bbFitMesh(cube,-250,0,-250,500,500,500)
bbFlipMesh(cube)
tex=bbLoadTexture( "chorme-2.bmp" )
bbScaleTexture(tex,1.0/3,1.0/3)
bbEntityTexture(cube,tex)
bbEntityAlpha(cube,0.4)
bbEntityFX(cube,1)

;floor mirror
m=bbCreateMirror()

;simple light
light=bbCreateLight()
bbTurnEntity(light,45,45,0)

;camera
camera=bbCreateCamera()
cam_xr.f=30:cam_yr.f=0:cam_zr.f=0:cam_z.f=-100

;cool dragon model!
tex=bbLoadTexture( "model\dragon.bmp" )
dragon=bbLoadMD2( "model\dragon.md2" )
bbEntityTexture(dragon,tex)
bbPositionEntity(dragon,0,25,0)
bbTurnEntity(dragon,0,150,0)

bbAnimateMD2(dragon,1,0.05,0,40)

While Not bbKeyHit(1)

	If bbKeyDown(203)
		cam_yr=cam_yr-2
	ElseIf bbKeyDown(205)
		cam_yr=cam_yr+2
	EndIf
	
	If bbKeyDown(200)
		cam_xr=cam_xr+2
		If cam_xr>90 
		cam_xr=90
		EndIf
	ElseIf bbKeyDown(208)
		cam_xr=cam_xr-2
		If cam_xr<5 
		cam_xr=5
		EndIf
	EndIf
	
	If bbKeyDown(26)
		cam_zr=cam_zr+2
	ElseIf bbKeyDown(27)
		cam_zr=cam_zr-2
	EndIf
	
	If bbKeyDown(30)
		cam_z=cam_z+1:If cam_z>-10 
		cam_z=-10
		EndIf
	ElseIf bbKeyDown(44)
		cam_z=cam_z-1:If cam_z<-180 
		cam_z=-180
		EndIf
	EndIf
	
	bbPositionEntity(camera,0,0,0)
	bbRotateEntity(camera,cam_xr,cam_yr,cam_zr)
	bbMoveEntity(camera,0,0,cam_z)

	bbUpdateWorld()
	bbRenderWorld()
	bbFlip()
Wend

; Close down Blitz3D engine...
bbEndBlitz3D ()

End
Multicam example

Code: Select all

; Just dummies here
Global info1$ = "Multicam"
Global info2$ = "Demonstrates the use of multiple cameras"
Global info3$ = "Use arrows keys to pan, A/Z to zoom"

; Run start code
IncludeFile "../start.pb"

tex=bbCreateTexture( 64,64 )
bbSetBuffer(bbTextureBuffer( tex ))
bbColor(255,0,0):bbRect(0,0,32,32):bbRect(32,32,32,32)
bbColor(255,128,0):bbRect(32,0,32,32):bbRect(0,32,32,32)
bbSetBuffer(bbBackBuffer())
bbColor(255,255,255)

cone=bbCreateCone(20)
bbEntityTexture(cone,tex)

sphere=bbCreateSphere(10)
bbPositionEntity(sphere,2,0,0)
bbEntityTexture(sphere,tex)

cylinder=bbCreateCylinder(20)
bbPositionEntity(cylinder,-2,0,0)
bbEntityTexture(cylinder,tex)

light=bbCreateLight()
bbTurnEntity(light,45,45,0)

pivot=bbCreatePivot()

z_cam=bbCreateCamera( pivot )
bbCameraViewport(z_cam,0,0,320,240)
bbPositionEntity(z_cam,0,0,-5)

y_cam=bbCreateCamera( pivot )
bbCameraViewport(y_cam,320,0,320,240)
bbPositionEntity(y_cam,0,5,0)
bbTurnEntity(y_cam,90,0,0)

x_cam=bbCreateCamera( pivot )
bbCameraViewport(x_cam,0,240,320,240)
bbTurnEntity(x_cam,0,-90,0)
bbPositionEntity(x_cam,-5,0,0)

While Not bbKeyHit(1)

	If bbKeyDown(203) 
	  bbMoveEntity(pivot,-0.1,0,0)
	EndIf
	If bbKeyDown(205) 
	  bbMoveEntity(pivot,0.1,0,0)
	EndIf
	If bbKeyDown(200) 
	  bbMoveEntity(pivot,0,0.1,0)
	EndIf
	If bbKeyDown(208) 
	  bbMoveEntity(pivot,0,-0.1,0)
	EndIf
	If bbKeyDown(30) 
	  bbMoveEntity(pivot,0,0,0.1)
	EndIf
	If bbKeyDown(44) 
	  bbMoveEntity(pivot,0,0,-0.1)
	EndIf

	bbUpdateWorld()
	bbRenderWorld()
	bbText(0,0,"Front")
	bbText(320,0,"Top")
	bbText(0,240,"Left")
	bbFlip()

Wend

End
Teapot example

Code: Select all


Global info1$="Teapot demo"
Global info2$="Features Cubic/spheriocal reflection mapping"
Global info3$="Arrows keys to pan camera"

IncludeFile "../start.pb"

cube_ref=#False

If bbGfxDriverCaps3D()>=110
Global out$ = PeekS(bbInput("")); First call fails? Is this a bug?
bbLocate(0,0) ; Oh well, place it on top of failed one :)
	If Left(LCase(PeekS(bbInput("Select (c)ubic or (s)pherical mapping :"))),1)="c" 
	  cube_ref=#True
	EndIf
EndIf

teapot=bbLoadMesh( "teapot.x" )
If cube_ref
	tex=bbLoadTexture( "castle_env.bmp",128+8 )
Else
	tex=bbLoadTexture( "spheremap.bmp",64+1 )
EndIf
bbEntityTexture(teapot,tex,0,0)
bbEntityFX(teapot,1)

cam_pivot=bbCreatePivot(); teapot )
camera=bbCreateCamera( cam_pivot )
bbPositionEntity(camera,0,0,-3)

While Not bbKeyHit(1)

	If bbKeyDown(200) 
	  bbTurnEntity(cam_pivot,3,0,0)
	EndIf
	If bbKeyDown(208) 
	  bbTurnEntity(cam_pivot,-3,0,0)
	EndIf
	If bbKeyDown(203)
	  bbTurnEntity(cam_pivot,0,3,0)
	EndIf
	If bbKeyDown(205) 
	  bbTurnEntity(cam_pivot,0,-3,0)
	EndIf
	
	bbTurnEntity(teapot,0.1,0.3,0)
	
	bbUpdateWorld()
	bbRenderWorld()
	bbFlip()
Wend
End
Tex_render example

Code: Select all

Global info1$="Texture render demo"
Global info2$="Renders a 3D scene onto a texture"
Global info3$="Use Arrow keys to Pan, A/Z to zoom"

; Run start code
IncludeFile "../start.pb"

grid_tex=bbCreateTexture( 16,16,8,1 )
bbScaleTexture(grid_tex,10,10)
bbSetBuffer(bbTextureBuffer( grid_tex ))
bbClsColor(255,255,255):bbCls():bbClsColor(0,0,0)
bbColor(192,192,192):bbRect(0,0,8,8):bbRect(8,8,8,8)
bbSetBuffer(bbBackBuffer())

plane=bbCreatePlane()
bbEntityTexture(plane,grid_tex)

pivot=bbCreatePivot()
bbPositionEntity(pivot,0,2,0)

t_sphere=bbCreateSphere( 8 )
bbEntityShininess(t_sphere,0.2)
For t=0 To 359 Step 36
	sphere=bbCopyEntity( t_sphere,pivot )
	bbEntityColor(sphere,Random(256),Random(256),Random(256))
	bbTurnEntity(sphere,0,t,0)
	bbMoveEntity(sphere,0,0,10)
Next
bbFreeEntity(t_sphere)

texture=bbCreateTexture( 128,128,256 )

cube=bbCreateCube()
bbEntityTexture(cube,texture)
bbPositionEntity(cube,0,7,0)
bbScaleEntity(cube,3,3,3)

light=bbCreateLight()
bbTurnEntity(light,45,45,0)

camera=bbCreateCamera()

plan_cam=bbCreateCamera()
bbTurnEntity(plan_cam,90,0,0)
bbPositionEntity(plan_cam,0,20,0)
bbCameraViewport(plan_cam,0,0,128,128)
bbCameraClsColor(plan_cam,0,128,0)

d.f=-20

While Not bbKeyHit(1)

	If bbKeyDown(30) 
	  d=d+1
	EndIf
	If bbKeyDown(44) 
	  d=d-1
	EndIf
	If bbKeyDown(203)
	 bbTurnEntity(camera,0,-3,0)
	EndIf
	If bbKeyDown(205) 
	  bbTurnEntity(camera,0,3,0)
	EndIf
	bbPositionEntity(camera,0,7,0)
	bbMoveEntity(camera,0,0,d)
	
	bbTurnEntity(cube,0.1,0.2,0.3)
	bbTurnEntity(pivot,0,1,0)
	
	bbUpdateWorld()
	
	bbHideEntity(camera)
	bbShowEntity(plan_cam)
	bbRenderWorld()
	
	bbCopyRect(0,0,128,128,0,0,0,bbTextureBuffer( texture ))
	
	bbShowEntity(camera)
	bbHideEntity(plan_cam)
	bbRenderWorld()
	
	bbFlip()
Wend
Tron example

Code: Select all


smooth=#True

Global info1$="Tron demo"
Global info2$="Features dynamic mesh creation"
Global info3$="Use arrow keys to steer, A/Z to zoom"

IncludeFile "../start.pb"

grid_tex=bbCreateTexture( 32,32,8 )
bbScaleTexture(grid_tex,10,10)
bbSetBuffer(bbTextureBuffer( grid_tex ))
bbColor(0,0,64):bbRect(0,0,32,32)
bbColor(0,0,255):bbRect(0,0,32,32,#False)
bbSetBuffer(bbBackBuffer())

grid_plane=bbCreatePlane()
bbEntityTexture(grid_plane,grid_tex)
bbEntityBlend(grid_plane,1)
bbEntityAlpha(grid_plane,0.6)
bbEntityFX(grid_plane,1)

mirror=bbCreateMirror()

pivot=bbCreatePivot()

p=bbCreatePivot( p )
cube=bbCreateCube( p )
bbScaleEntity(cube,1,1,5)
bbSetAnimKey(cube,0)
bbRotateEntity(cube,0,120,0)
bbSetAnimKey(cube,60)
bbRotateEntity(cube,0,240,0)
bbSetAnimKey(cube,120)
bbRotateEntity(cube,0,0,0)
bbSetAnimKey(cube,180)
bbAddAnimSeq(p,180)

For x=-100 To 100 Step 25
For z=-100 To 100 Step 25
e=bbCopyEntity( p,pivot )
bbPositionEntity(e,x,5,z)
bbAnimate(e)
Next
Next
bbFreeEntity(cube)

trail_mesh=bbCreateMesh()
trail_brush=bbCreateBrush()
bbBrushColor(trail_brush,255,0,0)
bbBrushBlend(trail_brush,3)
bbBrushFX(trail_brush,1)
trail_surf=bbCreateSurface( trail_mesh,trail_brush )
bbAddVertex(trail_surf,0,2,0,0,0)
bbAddVertex(trail_surf,0,0,0,0,1)
bbAddVertex(trail_surf,0,2,0,0,0)
bbAddVertex(trail_surf,0,0,0,0,1)
bbAddTriangle(trail_surf,0,2,3)
bbAddTriangle(trail_surf,0,3,1)
bbAddTriangle(trail_surf,0,3,2)
bbAddTriangle(trail_surf,0,1,3)
trail_vert=2

bike=bbCreateSphere()
bbScaleMesh(bike,0.75,1,2)
bbPositionEntity(bike,0,1,0)
bbEntityShininess(bike,1)
bbEntityColor(bike,192,0,255)

camera=bbCreateCamera()
bbTurnEntity(camera,45,0,0)
cam_d.f=30

light=bbCreateLight()
bbTurnEntity(light,45,45,0)

add_flag=#False

While Not bbKeyHit(1)

	If bbKeyHit(17)
		wire=~wire
		bbWireFrame(wire)
	EndIf
	
	If bbKeyDown(30) 
	  cam_d=cam_d-1
	EndIf
	If bbKeyDown(44) 
	  cam_d=cam_d+1
	EndIf
	
	turn=0
	If smooth
		If bbKeyDown(203) 
		  turn=5
		EndIf
		If bbKeyDown(205)
		  turn=-5
		EndIf
		If turn
			add_cnt=add_cnt+1
			If add_cnt=3
				add_cnt=0
				add_flag=#True
			Else
				add_flag=#False
			EndIf
		ElseIf add_cnt
			add_cnt=0
			add_flag=#True
		Else
			add_flag=#False
		EndIf
	Else
		If bbKeyHit(203) 
		  turn=90
		EndIf
		If bbKeyHit(205) 
		  turn=-90
		EndIf
		If turn 
		  add_flag=#True
		Else 
		  add_flag=#False
		EndIf
	EndIf
	
	If turn
		bbTurnEntity(bike,0,turn,0)
	EndIf
	
	bbMoveEntity(bike,0,0,1)
	
	If add_flag
		bbAddVertex(trail_surf,bbEntityX(bike),2,bbEntityZ(bike),0,0)
		bbAddVertex(trail_surf,bbEntityX(bike),0,bbEntityZ(bike),0,1)
		bbAddTriangle(trail_surf,trail_vert,trail_vert+2,trail_vert+3)
		bbAddTriangle(trail_surf,trail_vert,trail_vert+3,trail_vert+1)
		bbAddTriangle(trail_surf,trail_vert,trail_vert+3,trail_vert+2)
		bbAddTriangle(trail_surf,trail_vert,trail_vert+1,trail_vert+3)
		trail_vert=trail_vert+2
	Else
		bbVertexCoords(trail_surf,trail_vert,bbEntityX(bike),2,bbEntityZ(bike))
		bbVertexCoords(trail_surf,trail_vert+1,bbEntityX(bike),0,bbEntityZ(bike))
	EndIf
	
	bbUpdateWorld()
	
	bbPositionEntity(camera,bbEntityX(bike)-5,0,bbEntityZ(bike))
	bbMoveEntity(camera,0,0,-cam_d)

;	PositionEntity camera,0,20,0
;	PointEntity camera,bike
	
	bbRenderWorld()
	bbFlip()

Wend
End