d3d9odd2d.bmx 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. SuperStrict
  2. Rem
  3. bbdoc: Graphics/Direct3D9 Odd2D
  4. about:
  5. The Direct3D9 Odd2D module provides an Direct3D9 driver for #Odd2D.
  6. End Rem
  7. Module ODD.D3D9Odd2D
  8. ModuleInfo "Version: 1.03"
  9. ModuleInfo "Author: David Williamson"
  10. ModuleInfo "License: Public Domain"
  11. ?Win32
  12. Import ODD.Odd2D
  13. Import BRL.D3D9Max2D
  14. Private
  15. Global _driver:TD3D9Odd2DDriver
  16. Public
  17. Type TOD3D9ImageFrame Extends TImageFrame
  18. Field d3d9if:TD3D9ImageFrame
  19. Method Draw( x0#,y0#,x1#,y1#,tx#,ty#,sx#,sy#,sw#,sh# )
  20. Local rot:Float=GetRotation()
  21. Local sclx:Float,scly:Float
  22. GetScale sclx,scly
  23. SetRotation rot-_odd2dDriver.tform_scr_rot
  24. SetScale sclx*_odd2dDriver.tform_scr_zoom,scly*_odd2dDriver.tform_scr_zoom
  25. _odd2dDriver.TransformPoint tx,ty
  26. tx:+_odd2dDriver.focus_x+_odd2dDriver.border_x
  27. ty:+_odd2dDriver.focus_y+_odd2dDriver.border_y
  28. d3d9if.Draw x0,y0,x1,y1,tx,ty,sx,sy,sw,sh
  29. SetRotation rot
  30. SetScale sclx,scly
  31. End Method
  32. Method DrawPoly( xyuv:Float[], handlex:Float, handley:Float, tx:Float, ty:Float )
  33. If xyuv.length<12 Or (xyuv.length Mod 4<>0) Return
  34. Local segs:Int=xyuv.length/4
  35. Local vrts#[]=New Float[segs*6]
  36. Local x:Float, y:Float, u:Float, v:Float
  37. Local colour:Int=(Int(255*_driver.m2d_alpha) Shl 24)|(_driver.m2d_red Shl 16)|(_driver.m2d_green Shl 8)|_driver.m2d_blue
  38. Local c:Int Ptr=Int Ptr(Float Ptr(vrts))
  39. For Local i:Int=0 Until segs
  40. x=xyuv[i*4+0]-handlex
  41. y=xyuv[i*4+1]-handley
  42. u=xyuv[i*4+2]*d3d9if._uscale
  43. v=xyuv[i*4+3]*d3d9if._vscale
  44. vrts[i*6+0]=x*_driver.m2d_ix+y*_driver.m2d_iy+tx
  45. vrts[i*6+1]=x*_driver.m2d_jx+y*_driver.m2d_jy+ty
  46. c[i*6+3]=colour
  47. vrts[i*6+4]=u
  48. vrts[i*6+5]=v
  49. Next
  50. d3d9if.Draw 0,0,0,0,0,0,0,0,0,0 'KLUDGE - Note to Mr. Sibly an EnableTex function
  51. _driver._d3dDev.DrawPrimitiveUP D3DPT_TRIANGLEFAN,segs-2,vrts,24
  52. End Method
  53. Function CreateFromPixmap:TOD3D9ImageFrame( pixmap:TPixmap,flags:Int )
  54. Local frame:TOD3D9ImageFrame=New TOD3D9ImageFrame
  55. frame.d3d9if:TD3D9ImageFrame=TD3D9ImageFrame(D3D9Max2DDriver().CreateFrameFromPixmap(pixmap,flags))
  56. Return frame
  57. End Function
  58. End Type
  59. Type TD3D9Odd2DDriver Extends TOdd2DDriver
  60. Field _d3dDev:IDirect3DDevice9
  61. Method Create:TD3D9Odd2DDriver()
  62. _m2ddriver=D3D9Max2DDriver()
  63. InitFields
  64. If Not _m2ddriver Then Return Null Else Return Self
  65. End Method
  66. ' Method GraphicsModes:TGraphicsMode[]() Abstract
  67. Method AttachGraphics:TMax2DGraphics( widget:Byte Ptr, flags:Long )
  68. Local g:TD3D9Graphics=D3D9GraphicsDriver().AttachGraphics( widget,flags )
  69. If g Return TMax2DGraphics.Create( g,Self )
  70. End Method
  71. Method CreateGraphics:TGraphics( width:Int, height:Int ,depth:Int, hertz:Int, flags:Long, x:Int, y:Int )
  72. Local g:TD3D9Graphics=D3D9GraphicsDriver().CreateGraphics( width,height,depth,hertz,flags,x,y )
  73. If g Return TMax2DGraphics.Create( g,Self )
  74. End Method
  75. Method CreateRenderImageFrame:TImageFrame(width:UInt, height:UInt, flags:Int)
  76. ' TODO
  77. End Method
  78. Method SetBackBuffer()
  79. ' TODO
  80. End Method
  81. Method SetRenderImageFrame(RenderImageFrame:TImageFrame)
  82. ' TODO
  83. End Method
  84. Method SetGraphics( g:TGraphics )
  85. Super.SetGraphics g
  86. If g Then _d3dDev=TD3D9Graphics(TMax2DGraphics(g)._backendGraphics).GetDirect3DDevice()
  87. End Method
  88. ' Method Flip( sync ) Abstract
  89. Method CreateFrameFromPixmap:TOD3D9ImageFrame( pixmap:TPixmap, flags:Int )
  90. Return TOD3D9ImageFrame.CreateFromPixmap(pixmap,flags)
  91. End Method
  92. Method SetBlend( blend:Int )
  93. Super.SetBlend blend
  94. Select m2d_blend
  95. Case MOD2XBLEND
  96. _d3dDev.SetRenderState D3DRS_ALPHATESTENABLE,False
  97. _d3dDev.SetRenderState D3DRS_ALPHABLENDENABLE,True
  98. _d3dDev.SetRenderState D3DRS_SRCBLEND,D3DBLEND_DESTCOLOR
  99. _d3dDev.SetRenderState D3DRS_DESTBLEND,D3DBLEND_SRCCOLOR
  100. End Select
  101. End Method
  102. ' Method SetAlpha( alpha# ) Abstract
  103. ' Method SetColor( red,green,blue ) Abstract
  104. ' Method SetClsColor( red,green,blue ) Abstract
  105. ' Method SetViewport( x,y,width,height ) Abstract
  106. ' Method SetTransform( xx#,xy#,yx#,yy# ) Abstract
  107. ' Method SetLineWidth( width# ) Abstract
  108. ' Method Cls() Abstract
  109. ' Method Plot( x#,y# ) Abstract
  110. ' Method DrawLine( x0#,y0#,x1#,y1#,tx#,ty# ) Abstract
  111. ' Method DrawRect( x0#,y0#,x1#,y1#,tx#,ty# ) Abstract
  112. ' Method DrawOval( x0#,y0#,x1#,y1#,tx#,ty# ) Abstract
  113. ' Method DrawPoly( xy#[],handlex#,handley#,originx#,originy# ) Abstract
  114. ' Method DrawPixmap( pixmap:TPixmap,x,y ) Abstract
  115. ' Method GrabPixmap:TPixmap( x,y,width,height ) Abstract
  116. ' Method SetResolution( width#,height# ) Abstract
  117. Method DrawPolyImage( xyuv#[],iframe:TImageFrame,handlex#,handley#,originx#,originy# )
  118. TOD3D9ImageFrame(iframe).DrawPoly xyuv,handlex,handley,originx,originy
  119. End Method
  120. Method ToString:String()
  121. Return "Direct3D9 Odd2D Driver"
  122. End Method
  123. End Type
  124. Rem
  125. bbdoc: Get Direct3D9 Odd2D Driver
  126. about:
  127. The returned driver can be used with #SetGraphicsDriver to enable Direct3D9 Odd2D
  128. rendering.
  129. End Rem
  130. Function D3D9Odd2DDriver:TD3D9Odd2DDriver()
  131. If Not _driver Then
  132. _driver=New TD3D9Odd2DDriver.Create()
  133. EndIf
  134. Return _driver
  135. End Function
  136. ?