Page 1 of 1

Draw primitives with Direct3D7

Posted: Sun Apr 24, 2005 2:10 pm
by S.M.
A few commands, witch use Direct3D7 for drawing:

Code: Select all

;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
regards
Stefan

Re: Draw primitives with Direct3D7

Posted: Sun Apr 24, 2005 4:48 pm
by va!n
very nice! :)

Posted: Mon Apr 25, 2005 4:10 am
by npath
Cool. I especially like the gradient color fills.

Posted: Mon Apr 25, 2005 8:45 am
by DoubleDutch
Nice info, Thanks :)

-Anthony