Clipscreen3D DirectX9

Share your advanced PureBasic knowledge/code with the community.
User avatar
djes
Addict
Addict
Posts: 1806
Joined: Sat Feb 19, 2005 2:46 pm
Location: Pas-de-Calais, France

Clipscreen3D DirectX9

Post by djes »

Code: Select all

;*****************************************************************************
;*
;* Clipscreen3D Demo
;* djes 10/2009
;*
;* Tested on PB 4.4b4
;* Subsystem DirectX9
;*
;*****************************************************************************

Structure D3DVIEWPORT9
   X.l
   Y.l
   Width.i
   Height.i
   MinZ.f
   MaxZ.f
EndStructure 

Procedure.l ScreenWidth()
  !extrn _PB_Screen_Width
  !MOV   eax, [_PB_Screen_Width]
  ProcedureReturn
EndProcedure

Procedure.l ScreenHeight()
  !extrn _PB_Screen_Height
  !MOV   eax, [_PB_Screen_Height]
  ProcedureReturn
EndProcedure

Procedure.l ScreenDepth()
  !extrn _PB_Screen_Depth
  !MOV   eax, [_PB_Screen_Depth]
  ProcedureReturn
EndProcedure

;*****************************************************************************
;*
;* Restrain the future drawing operations to the specified box
;*
;*****************************************************************************

Procedure.i ClipScreen3D(x.l, y.l, width.l, height.l)

	!extrn _PB_Screen_Direct3DDevice

  Protected *ViewPort.D3DVIEWPORT9
  Protected D3Ddevice_interface.IDirect3DDevice9
 
	!MOV dword EAX, [_PB_Screen_Direct3DDevice]
	!MOV dword [p.v_D3Ddevice_interface],EAX
	*ViewPort.D3DVIEWPORT9 = AllocateMemory(SizeOf(D3DVIEWPORT9))

  If *Viewport 

  	If D3Ddevice_interface\GetViewport(*ViewPort) = #S_OK
 
		  *ViewPort\X = x
		  *ViewPort\Y = y
		  *ViewPort\Width  = Width
		  *ViewPort\Height = Height
		  *ViewPort\MinZ = 0.0
		  *ViewPort\MaxZ = 1.0
		 
		  If D3Ddevice_interface\SetViewport(*ViewPort) = #S_OK
		    clip = #True
		  Else
		  	clip = #False
		  EndIf
		  
		EndIf
		
		FreeMemory(*Viewport)

	EndIf

  ProcedureReturn Clip

EndProcedure

;*****************************************************************************

InitSprite()
InitSprite3D()

OpenWindow(0, 0, 0, 640, 480, "ClipScreen3D")
OpenWindowedScreen(WindowID(0), 0, 0, 640, 480, 0, 0, 0)

CreateSprite(0, 128, 128, #PB_Sprite_Texture)

If StartDrawing( SpriteOutput(0) )
  Box(0, 0, 128, 128, #Green)
  Circle(64, 64, 64, #Red)
  StopDrawing()
EndIf

CreateSprite3D(0, 0)
frame_counter = 0

Repeat

	ClearScreen(0)
	ev = WindowEvent()

	If Start3D()
	 
	  If frame_counter % 2000 < 1000 
	  	ClipScreen3D(0, 0, ScreenWidth(), ScreenHeight())
		Else
		  ClipScreen3D(320 - 50, 240 - 50, 100, 100)
		EndIf

	  DisplaySprite3D(0, 320 + 25 * Sin(frame_counter / 100) - 64, 240 + 25 * Cos(frame_counter / 100) - 64)
	  Stop3D()
	
	EndIf
	
	FlipBuffers()
	frame_counter + 1

Until ev = #PB_Event_CloseWindow