Primitives mit Direct3D7 zeichnen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Stefan
Beiträge: 125
Registriert: 29.08.2004 10:51
Kontaktdaten:

Primitives mit Direct3D7 zeichnen

Beitrag von Stefan »

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

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
Gruß
Stefan
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

Stark :allright:
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Green Snake
Beiträge: 1394
Registriert: 22.02.2005 19:08

Ja

Beitrag von Green Snake »

Wow, wirklich nicht schlecht,
gut gemacht
-.-"
Antworten