Hier ein paar einfache Zeichenbefehle, die Direct3D7 zum zeichnen verwenden:

Code: Alles auswählen
;Draw primitives with Direct3D7
Structure MyVertices
x1.f
y1.f
z1.f
rhw1.f
color1.l
diffuse1.l
x2.f
y2.f
z2.f
rhw2.f
color2.l
diffuse2.l
x3.f
y3.f
z3.f
rhw3.f
color3.l
diffuse3.l
x4.f
y4.f
z4.f
rhw4.f
color4.l
diffuse4.l
EndStructure
#D3DCLEAR_TARGET=1
#D3DFVF_XYZRHW=4
#D3DFVF_DIFFUSE=64
#D3DFVF_SPECULAR=128
#D3DPT_POINTLIST=1
#D3DPT_LINELIST=2
#D3DPT_TRIANGLELIST=4
#D3DPT_TRIANGLESTRIP=5
#D3DRENDERSTATE_CULLMODE=22
#D3DRENDERSTATE_DITHERENABLE=26
#D3DRENDERSTATE_SPECULARENABLE=29
#D3DRENDERSTATE_COLORKEYENABLE=41
#D3DRENDERSTATE_LIGHTING=137
#D3DCULL_NONE=1
#D3DCULL_CCW=3
Procedure Sprite3D_Start2DDrawing()
Global Sprite3D_Points.MyVertices
Global *D3DDevice.IDirect3DDevice7
Global TempSprite
!extrn _PB_Direct3D_Device
!MOV Eax,[_PB_Direct3D_Device]
!MOV [p_D3DDevice],Eax
Sprite3D_Points\rhw1=1.0
Sprite3D_Points\rhw2=1.0
Sprite3D_Points\rhw3=1.0
Sprite3D_Points\rhw4=1.0
*D3DDevice\SetRenderState(#D3DRENDERSTATE_COLORKEYENABLE,0) ; disables colorkey
*D3DDevice\SetRenderState(#D3DRENDERSTATE_SPECULARENABLE,1)
*D3DDevice\SetRenderState(#D3DRENDERSTATE_DITHERENABLE,1) ; enables dithering (improves the quality)
*D3DDevice\SetRenderState(#D3DRENDERSTATE_LIGHTING,0); deactivates lighting
*D3DDevice\SetRenderState(#D3DRENDERSTATE_CULLMODE,#D3DCULL_NONE); disables culling
CapsBuffer=AllocateMemory(228)
*D3DDevice\GetCaps(CapsBuffer)
minTextureWidth=PeekL(CapsBuffer+124)
minTextureHeight=PeekL(CapsBuffer+128)
FreeMemory(CapsBuffer)
TempSprite=CreateSprite(#PB_Any,minTextureWidth,minTextureHeight,#PB_Sprite_Texture)
If IsSprite(TempSprite)
*D3DDevice\SetTexture(0,PeekL(IsSprite(TempSprite)))
EndIf
EndProcedure
Procedure Sprite3D_Stop2DDrawing()
*D3DDevice\SetRenderState(#D3DRENDERSTATE_COLORKEYENABLE,1);enable colorkey
*D3DDevice\SetRenderState(#D3DRENDERSTATE_SPECULARENABLE,0)
*D3DDevice\SetRenderState(#D3DRENDERSTATE_DITHERENABLE,0)
*D3DDevice\SetRenderState(#D3DRENDERSTATE_LIGHTING,1); activate lighting
*D3DDevice\SetRenderState(#D3DRENDERSTATE_CULLMODE,#D3DCULL_CCW)
FreeSprite(TempSprite)
EndProcedure
Procedure Sprite3D_DrawLine2D(x1.f,y1.f,x2.f,y2.f,RGB1,RGB2)
Sprite3D_Points\x1=x1
Sprite3D_Points\y1=y1
Sprite3D_Points\diffuse1=RGB1>>16+(RGB1&$FF00)+(RGB1&$FF)<<16 ;convert RGB to BGR
Sprite3D_Points\x2=x2
Sprite3D_Points\y2=y2
Sprite3D_Points\diffuse2=RGB2>>16+(RGB2&$FF00)+(RGB2&$FF)<<16
ProcedureReturn *D3DDevice\DrawPrimitive(#D3DPT_LINELIST,#D3DFVF_XYZRHW|#D3DFVF_SPECULAR|#D3DFVF_DIFFUSE,@Sprite3D_Points,2,0)
EndProcedure
Procedure Sprite3D_ClearScreen(RGB)
*D3DDevice\Clear(0,0,#D3DCLEAR_TARGET,RGB>>16+(RGB&$FF00)+(RGB&$FF)<<16,0,0)
EndProcedure
Procedure Sprite3D_DrawTriangle2D(x1.f,y1.f,x2.f,y2.f,x3.f,y3.f,RGB1,RGB2,RGB3)
Sprite3D_Points\x1=x1
Sprite3D_Points\y1=y1
Sprite3D_Points\diffuse1=RGB1>>16+(RGB1&$FF00)+(RGB1&$FF)<<16
Sprite3D_Points\x2=x2
Sprite3D_Points\y2=y2
Sprite3D_Points\diffuse2=RGB2>>16+(RGB2&$FF00)+(RGB2&$FF)<<16
Sprite3D_Points\x3=x3
Sprite3D_Points\y3=y3
Sprite3D_Points\diffuse3=RGB3>>16+(RGB3&$FF00)+(RGB3&$FF)<<16
ProcedureReturn *D3DDevice\DrawPrimitive(#D3DPT_TRIANGLELIST,#D3DFVF_XYZRHW|#D3DFVF_SPECULAR|#D3DFVF_DIFFUSE,@Sprite3D_Points,3,0)
EndProcedure
Procedure Sprite3D_DrawBox2D(X.f,Y.f,Width.f,Height.f,RGB1,RGB2,RGB3,RGB4)
Sprite3D_Points\x1=X
Sprite3D_Points\y1=Y
Sprite3D_Points\diffuse1=RGB1>>16+(RGB1&$FF00)+(RGB1&$FF)<<16
Sprite3D_Points\x2=X+Width
Sprite3D_Points\y2=Y
Sprite3D_Points\diffuse2=RGB2>>16+(RGB2&$FF00)+(RGB2&$FF)<<16
Sprite3D_Points\x3=X
Sprite3D_Points\y3=Y+Height
Sprite3D_Points\diffuse3=RGB3>>16+(RGB3&$FF00)+(RGB3&$FF)<<16
Sprite3D_Points\x4=X+Width
Sprite3D_Points\y4=Y+Height
Sprite3D_Points\diffuse4=RGB4>>16+(RGB4&$FF00)+(RGB4&$FF)<<16
ProcedureReturn *D3DDevice\DrawPrimitive(#D3DPT_TRIANGLESTRIP,#D3DFVF_XYZRHW|#D3DFVF_SPECULAR|#D3DFVF_DIFFUSE,@Sprite3D_Points,4,0)
EndProcedure
Procedure Sprite3D_DrawPixel2D(X.f,Y.f,RGB)
Sprite3D_Points\x1=X
Sprite3D_Points\y1=Y
Sprite3D_Points\diffuse1=RGB>>16+(RGB&$FF00)+(RGB&$FF)<<16
ProcedureReturn *D3DDevice\DrawPrimitive(#D3DPT_POINTLIST,#D3DFVF_XYZRHW|#D3DFVF_SPECULAR|#D3DFVF_DIFFUSE,@Sprite3D_Points,1,0)
EndProcedure
example:
InitSprite()
InitSprite3D()
flags=#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget
OpenWindow(1,0,0,400,300,flags,"Direct3D 7 Primitives test")
OpenWindowedScreen(WindowID(),0,0,400,300,1,0,0)
XPos=50:addX=1
Repeat
Start3D()
Sprite3D_Start2DDrawing()
;The commands Sprite3D_ClearScreen(),Sprite3D_DrawTriangle2D(),Sprite3D_DrawPixel2D(),
;Sprite3D_DrawBox2D() and Sprite3D_DrawLine2D() must be in a
;Sprite3D_StartDrawing()...Sprite3D_StopDrawing() block.
Sprite3D_ClearScreen(#blue);clear the screen
;Draw a triangle
Sprite3D_DrawTriangle2D(50,150,150,150,150,250,#red,#green,#blue)
;Draw a few lines
Sprite3D_DrawLine2D(200,200,300,300,#black,#white)
Sprite3D_DrawLine2D(300,300,400,200,#black,#white)
Sprite3D_DrawLine2D(400,200,300,100,#black,#white)
Sprite3D_DrawLine2D(300,100,200,200,#black,#white)
Sprite3D_DrawBox2D(100,25,250,50,#magenta,#white,#yellow,#red)
XPos+addX
YPos+addY
If XPos<=0:addX=1:EndIf
If XPos>=300:addX=-1:EndIf
If YPos<=0:addY=2:EndIf
If YPos>=200:addY=-2:EndIf
Sprite3D_DrawBox2D(XPos,YPos,100,100,#black,#white,#green,#black)
Sprite3D_Stop2DDrawing()
Stop3D()
FlipBuffers()
Until WindowEvent()=#PB_Event_CloseWindow
Stefan