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