d3d9max2d.bmx 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. SuperStrict
  2. Rem
  3. bbdoc: Graphics/Direct3D9 Max2D
  4. about:
  5. The Direct3D9 Max2D module provides a Direct3D9 driver for #Max2D.
  6. End Rem
  7. Module BRL.D3D9Max2D
  8. ModuleInfo "Version: 1.02"
  9. ModuleInfo "License: zlib/libpng"
  10. ModuleInfo "Copyright: Blitz Research Ltd"
  11. ModuleInfo "History: 1.02"
  12. ModuleInfo "History: Changed to SuperStrict"
  13. ModuleInfo "History: Extended flags to Long"
  14. ModuleInfo "History: 1.01"
  15. ModuleInfo "History: Changed Assert to Throw. One can at least catch a Throw."
  16. ?win32
  17. Import BRL.Max2D
  18. Import BRL.DXGraphics
  19. 'Import BRL.D3D7Max2D
  20. Const LOG_ERRS:Int=True'False
  21. Private
  22. Global _gw:Int,_gh:Int,_gd:Int,_gr:Int,_gf:Long,_gx:Int,_gy:Int
  23. Global _color:Int
  24. Global _clscolor:Int
  25. Global _ix#,_iy#,_jx#,_jy#
  26. Global _fverts#[24]
  27. Global _iverts:Int Ptr=Int Ptr( Varptr _fverts[0] )
  28. Global _lineWidth#
  29. Global _bound_texture:IDirect3DTexture9
  30. Global _texture_enabled:Int
  31. Global _active_blend:Int
  32. Global _driver:TD3D9Max2DDriver
  33. Global _d3dDev:IDirect3DDevice9
  34. Global _d3d9Graphics:TD3D9Graphics
  35. Global _max2dGraphics:TMax2dGraphics
  36. Function Pow2Size:Int( n:Int )
  37. Local t:Int=1
  38. While t<n
  39. t:*2
  40. Wend
  41. Return t
  42. End Function
  43. Function DisableTex()
  44. If Not _texture_enabled Return
  45. _d3dDev.SetTextureStageState 0,D3DTSS_COLOROP,D3DTOP_SELECTARG2
  46. _d3dDev.SetTextureStageState 0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG2
  47. _texture_enabled=False
  48. End Function
  49. Function d3derr( str$ )
  50. If LOG_ERRS WriteStdout "D3DERR: "+str+"~n"
  51. End Function
  52. Public
  53. Type TD3D9ImageFrame Extends TImageFrame
  54. Method Delete()
  55. If _texture
  56. If _seq=GraphicsSeq
  57. If _texture=_bound_texture
  58. _d3dDev.SetTexture 0,Null
  59. _bound_texture=Null
  60. EndIf
  61. _d3d9Graphics.ReleaseNow _texture
  62. EndIf
  63. _texture=Null
  64. EndIf
  65. End Method
  66. Method Create:TD3D9ImageFrame( pixmap:TPixmap,flags:Int )
  67. Local width:Int=pixmap.width,pow2width:Int=Pow2Size( width )
  68. Local height:Int=pixmap.height,pow2height:Int=Pow2Size( height )
  69. If width<pow2width Or height<pow2height
  70. Local src:TPixmap=pixmap
  71. pixmap=TPixmap.Create( pow2width,pow2height,PF_BGRA8888 )
  72. pixmap.Paste src,0,0
  73. If width<pow2width
  74. pixmap.Paste pixmap.Window( width-1,0,1,height ),width,0
  75. EndIf
  76. If height<pow2height
  77. pixmap.Paste pixmap.Window( 0,height-1,width,1 ),0,height
  78. If width<pow2width
  79. pixmap.Paste pixmap.Window( width-1,height-1,1,1 ),width,height
  80. EndIf
  81. EndIf
  82. Else
  83. If pixmap.Format<>PF_BGRA8888 pixmap=pixmap.Convert( PF_BGRA8888 )
  84. EndIf
  85. Local levels:Int=(flags & MIPMAPPEDIMAGE)=0
  86. Local format:Int=D3DFMT_A8R8G8B8
  87. Local usage:Int=0
  88. Local pool:Int=D3DPOOL_MANAGED
  89. '_texture = New IDirect3DTexture9
  90. If _d3dDev.CreateTexture( pow2width,pow2height,levels,usage,format,pool,_texture,Null )<0
  91. d3derr "Unable to create texture~n"
  92. _texture = Null
  93. Return null
  94. EndIf
  95. _d3d9Graphics.AutoRelease _texture
  96. Local level:Int
  97. Local dstsurf:IDirect3DSurface9' = New IDirect3DSurface9
  98. Repeat
  99. If _texture.GetSurfaceLevel( level,dstsurf )<0
  100. If level=0
  101. d3derr "_texture.GetSurfaceLevel failed~n"
  102. EndIf
  103. Exit
  104. EndIf
  105. Local lockedrect:D3DLOCKED_RECT=New D3DLOCKED_RECT
  106. If dstsurf.LockRect( lockedrect,Null,0 )<0
  107. d3derr "dstsurf.LockRect failed~n"
  108. EndIf
  109. For Local y:Int=0 Until pixmap.height
  110. Local src:Byte Ptr=pixmap.pixels+y*pixmap.pitch
  111. Local dst:Byte Ptr=lockedrect.pBits+y*lockedrect.Pitch
  112. MemCopy dst,src,Size_T(pixmap.width*4)
  113. Next
  114. dstsurf.UnlockRect
  115. dstsurf.Release_
  116. If (flags & MIPMAPPEDIMAGE)=0 Exit
  117. level:+1
  118. If pixmap.width>1 And pixmap.height>1
  119. pixmap=ResizePixmap( pixmap,pixmap.width/2,pixmap.height/2 )
  120. Else If pixmap.width>1
  121. pixmap=ResizePixmap( pixmap,pixmap.width/2,pixmap.height )
  122. Else If pixmap.height>1
  123. pixmap=ResizePixmap( pixmap,pixmap.width,pixmap.height/2 )
  124. EndIf
  125. Forever
  126. _uscale=1.0/pow2width
  127. _vscale=1.0/pow2height
  128. Local u0#,u1#=width * _uscale
  129. Local v0#,v1#=height * _vscale
  130. _fverts[4]=u0
  131. _fverts[5]=v0
  132. _fverts[10]=u1
  133. _fverts[11]=v0
  134. _fverts[16]=u1
  135. _fverts[17]=v1
  136. _fverts[22]=u0
  137. _fverts[23]=v1
  138. If flags & FILTEREDIMAGE
  139. _magfilter=D3DTFG_LINEAR
  140. _minfilter=D3DTFG_LINEAR
  141. _mipfilter=D3DTFG_LINEAR
  142. Else
  143. _magfilter=D3DTFG_POINT
  144. _minfilter=D3DTFG_POINT
  145. _mipfilter=D3DTFG_POINT
  146. EndIf
  147. _seq=GraphicsSeq
  148. Return Self
  149. End Method
  150. Method Draw( x0#,y0#,x1#,y1#,tx#,ty#,sx#,sy#,sw#,sh# ) Override
  151. Local u0#=sx * _uscale
  152. Local v0#=sy * _vscale
  153. Local u1#=(sx+sw) * _uscale
  154. Local v1#=(sy+sh) * _vscale
  155. _fverts[0]=x0*_ix+y0*_iy+tx
  156. _fverts[1]=x0*_jx+y0*_jy+ty
  157. _iverts[3]=_color
  158. _fverts[4]=u0
  159. _fverts[5]=v0
  160. _fverts[6]=x1*_ix+y0*_iy+tx
  161. _fverts[7]=x1*_jx+y0*_jy+ty
  162. _iverts[9]=_color
  163. _fverts[10]=u1
  164. _fverts[11]=v0
  165. _fverts[12]=x1*_ix+y1*_iy+tx
  166. _fverts[13]=x1*_jx+y1*_jy+ty
  167. _iverts[15]=_color
  168. _fverts[16]=u1
  169. _fverts[17]=v1
  170. _fverts[18]=x0*_ix+y1*_iy+tx
  171. _fverts[19]=x0*_jx+y1*_jy+ty
  172. _iverts[21]=_color
  173. _fverts[22]=u0
  174. _fverts[23]=v1
  175. If _texture<>_bound_texture
  176. _d3dDev.SetTexture 0,_texture
  177. _d3dDev.SetTextureStageState 0,D3DTSS_MAGFILTER,_magfilter
  178. _d3dDev.SetTextureStageState 0,D3DTSS_MINFILTER,_minfilter
  179. _d3dDev.SetTextureStageState 0,D3DTSS_MIPFILTER,_mipfilter
  180. _bound_texture=_texture
  181. EndIf
  182. If Not _texture_enabled
  183. _d3dDev.SetTextureStageState 0,D3DTSS_COLOROP,D3DTOP_MODULATE
  184. _d3dDev.SetTextureStageState 0,D3DTSS_ALPHAOP,D3DTOP_MODULATE
  185. _texture_enabled=True
  186. EndIf
  187. _d3dDev.DrawPrimitiveUP D3DPT_TRIANGLEFAN,2,_fverts,24
  188. End Method
  189. Field _texture:IDirect3DTexture9,_seq:Int
  190. Field _magfilter:Int,_minfilter:Int,_mipfilter:Int,_uscale#,_vscale#
  191. Field _fverts#[24],_iverts:Int Ptr=Int Ptr( Varptr _fverts[0] )
  192. End Type
  193. Type TD3D9Max2DDriver Extends TMax2dDriver
  194. Method ToString$() Override
  195. Return "DirectX9"
  196. End Method
  197. Method Create:TD3D9Max2DDriver()
  198. If Not D3D9GraphicsDriver() Return Null
  199. Local d3d:IDirect3D9 = D3D9GraphicsDriver().GetDirect3D()
  200. If d3d.CheckDeviceFormat( D3DADAPTER_DEFAULT,D3DDEVTYPE_HAL,D3DFMT_X8R8G8B8,0,D3DRTYPE_TEXTURE,D3DFMT_A8R8G8B8 )<0
  201. Return Null
  202. EndIf
  203. Return Self
  204. End Method
  205. '***** TGraphicsDriver *****
  206. Method GraphicsModes:TGraphicsMode[]() Override
  207. Return D3D9GraphicsDriver().GraphicsModes()
  208. End Method
  209. Method AttachGraphics:TGraphics( widget:Byte Ptr,flags:Long ) Override
  210. Local g:TD3D9Graphics=D3D9GraphicsDriver().AttachGraphics( widget,flags )
  211. If g Return TMax2DGraphics.Create( g,Self )
  212. End Method
  213. Method CreateGraphics:TGraphics( width:Int,height:Int,depth:Int,hertz:Int,flags:Long,x:Int,y:Int ) Override
  214. Local g:TD3D9Graphics=D3D9GraphicsDriver().CreateGraphics( width,height,depth,hertz,flags,x,y )
  215. If Not g Return Null
  216. Return TMax2DGraphics.Create( g,Self )
  217. End Method
  218. Method SetGraphics( g:TGraphics ) Override
  219. If Not g
  220. If _d3dDev
  221. _d3dDev.EndScene
  222. _d3dDev=Null
  223. EndIf
  224. _d3d9graphics=Null
  225. _max2dGraphics=Null
  226. TMax2DGraphics.ClearCurrent
  227. D3D9GraphicsDriver().SetGraphics Null
  228. Return
  229. EndIf
  230. _max2dGraphics=TMax2dGraphics( g )
  231. _d3d9graphics=TD3D9Graphics( _max2dGraphics._graphics )
  232. If Not _max2dGraphics Or Not _d3d9graphics Then
  233. Throw "SetGraphics failed for D3D9"
  234. End If
  235. _d3dDev=_d3d9Graphics.GetDirect3DDevice()
  236. D3D9GraphicsDriver().SetGraphics _d3d9Graphics
  237. If _d3dDev.TestCooperativeLevel()<>D3D_OK Return
  238. ResetDevice
  239. _max2dGraphics.MakeCurrent
  240. End Method
  241. Method Flip:Int( sync:Int ) Override
  242. _d3dDev.EndScene
  243. If D3D9GraphicsDriver().Flip( sync )
  244. _d3dDev.BeginScene
  245. Else If _d3dDev.TestCooperativeLevel()=D3D_OK
  246. ResetDevice
  247. _max2dGraphics.MakeCurrent
  248. EndIf
  249. End Method
  250. Method ResetDevice()
  251. _d3d9graphics.ValidateSize
  252. _d3d9graphics.GetSettings _gw,_gh,_gd,_gr,_gf,_gx,_gy
  253. Local viewport:D3DVIEWPORT9
  254. viewport.X = 0
  255. viewport.Y = 0
  256. viewport.Width = _gw
  257. viewport.Height = _gh
  258. viewport.MinZ = 0.0
  259. viewport.MaxZ = 1.0
  260. _d3dDev.SetViewport(viewport)
  261. _d3dDev.SetRenderState D3DRS_ALPHAREF,$80
  262. _d3dDev.SetRenderState D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL
  263. _d3dDev.SetRenderState D3DRS_ALPHATESTENABLE,False
  264. _d3dDev.SetRenderState D3DRS_ALPHABLENDENABLE,False
  265. _active_blend=SOLIDBLEND
  266. _d3dDev.SetRenderState D3DRS_LIGHTING,False
  267. _d3dDev.SetRenderState D3DRS_CULLMODE,D3DCULL_NONE
  268. _d3dDev.SetTexture 0,Null
  269. _bound_texture=Null
  270. _d3dDev.SetFVF D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1
  271. _d3dDev.SetTextureStageState 0,D3DTSS_COLORARG1,D3DTA_TEXTURE
  272. _d3dDev.SetTextureStageState 0,D3DTSS_COLORARG2,D3DTA_DIFFUSE
  273. _d3dDev.SetTextureStageState 0,D3DTSS_COLOROP,D3DTOP_SELECTARG2
  274. _d3dDev.SetTextureStageState 0,D3DTSS_ALPHAARG1,D3DTA_TEXTURE
  275. _d3dDev.SetTextureStageState 0,D3DTSS_ALPHAARG2,D3DTA_DIFFUSE
  276. _d3dDev.SetTextureStageState 0,D3DTSS_ALPHAOP,D3DTOP_SELECTARG2
  277. _texture_enabled=False
  278. _d3dDev.SetTextureStageState 0,D3DTSS_ADDRESS,D3DTADDRESS_CLAMP
  279. _d3dDev.SetTextureStageState 0,D3DTSS_MAGFILTER,D3DTFG_POINT
  280. _d3dDev.SetTextureStageState 0,D3DTSS_MINFILTER,D3DTFN_POINT
  281. _d3dDev.SetTextureStageState 0,D3DTSS_MIPFILTER,D3DTFP_POINT
  282. _d3dDev.BeginScene
  283. End Method
  284. '***** TMax2DDriver *****
  285. Method CreateFrameFromPixmap:TImageFrame( pixmap:TPixmap,flags:Int ) Override
  286. Return New TD3D9ImageFrame.Create( pixmap,flags )
  287. End Method
  288. Method SetBlend( blend:Int ) Override
  289. If blend=_active_blend Return
  290. Select blend
  291. Case SOLIDBLEND
  292. _d3dDev.SetRenderState D3DRS_ALPHATESTENABLE,False
  293. _d3dDev.SetRenderState D3DRS_ALPHABLENDENABLE,False
  294. Case MASKBLEND
  295. _d3dDev.SetRenderState D3DRS_ALPHATESTENABLE,True
  296. _d3dDev.SetRenderState D3DRS_ALPHABLENDENABLE,False
  297. Case ALPHABLEND
  298. _d3dDev.SetRenderState D3DRS_ALPHATESTENABLE,False
  299. _d3dDev.SetRenderState D3DRS_ALPHABLENDENABLE,True
  300. _d3dDev.SetRenderState D3DRS_SRCBLEND,D3DBLEND_SRCALPHA
  301. _d3dDev.SetRenderState D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA
  302. Case LIGHTBLEND
  303. _d3dDev.SetRenderState D3DRS_ALPHATESTENABLE,False
  304. _d3dDev.SetRenderState D3DRS_ALPHABLENDENABLE,True
  305. _d3dDev.SetRenderState D3DRS_SRCBLEND,D3DBLEND_SRCALPHA
  306. _d3dDev.SetRenderState D3DRS_DESTBLEND,D3DBLEND_ONE
  307. Case SHADEBLEND
  308. _d3dDev.SetRenderState D3DRS_ALPHATESTENABLE,False
  309. _d3dDev.SetRenderState D3DRS_ALPHABLENDENABLE,True
  310. _d3dDev.SetRenderState D3DRS_SRCBLEND,D3DBLEND_ZERO
  311. _d3dDev.SetRenderState D3DRS_DESTBLEND,D3DBLEND_SRCCOLOR
  312. End Select
  313. _active_blend=blend
  314. End Method
  315. Method SetAlpha( alpha# ) Override
  316. alpha=Max(Min(alpha,1),0)
  317. _color=(Int(255*alpha) Shl 24)|(_color&$ffffff)
  318. _iverts[3]=_color
  319. _iverts[9]=_color
  320. _iverts[15]=_color
  321. _iverts[21]=_color
  322. End Method
  323. Method SetColor( red:Int,green:Int,blue:Int ) Override
  324. red=Max(Min(red,255),0)
  325. green=Max(Min(green,255),0)
  326. blue=Max(Min(blue,255),0)
  327. _color=(_color&$ff000000)|(red Shl 16)|(green Shl 8)|blue
  328. _iverts[3]=_color
  329. _iverts[9]=_color
  330. _iverts[15]=_color
  331. _iverts[21]=_color
  332. End Method
  333. Method SetColor( color:SColor8 ) Override
  334. _color=(_color&$ff000000)|color.ToARGB()
  335. _iverts[3]=_color
  336. _iverts[9]=_color
  337. _iverts[15]=_color
  338. _iverts[21]=_color
  339. End Method
  340. Method SetClsColor( red:Int,green:Int,blue:Int ) Override
  341. red=Max(Min(red,255),0)
  342. green=Max(Min(green,255),0)
  343. blue=Max(Min(blue,255),0)
  344. _clscolor=$ff000000|(red Shl 16)|(green Shl 8)|blue
  345. End Method
  346. Method SetClsColor( color:SColor8 ) Override
  347. _clscolor=$ff000000|color.ToARGB()
  348. End Method
  349. Method SetViewport( x:Int,y:Int,width:Int,height:Int ) Override
  350. If x=0 And y=0 And width=_gw And height=_gh 'GraphicsWidth() And height=GraphicsHeight()
  351. _d3dDev.SetRenderState D3DRS_SCISSORTESTENABLE,False
  352. Else
  353. _d3dDev.SetRenderState D3DRS_SCISSORTESTENABLE,True
  354. Local rect:Int[]=[x,y,x+width,y+height]
  355. _d3dDev.SetScissorRect rect
  356. EndIf
  357. End Method
  358. Method SetTransform( xx#,xy#,yx#,yy# ) Override
  359. _ix=xx
  360. _iy=xy
  361. _jx=yx
  362. _jy=yy
  363. End Method
  364. Method SetLineWidth( width# ) Override
  365. _lineWidth=width
  366. End Method
  367. Method Cls() Override
  368. _d3dDev.Clear 0,Null,D3DCLEAR_TARGET,_clscolor,0,0
  369. End Method
  370. Method Plot( x#,y# ) Override
  371. _fverts[0]=x+.5
  372. _fverts[1]=y+.5
  373. DisableTex
  374. _d3dDev.DrawPrimitiveUP D3DPT_POINTLIST,1,_fverts,24
  375. End Method
  376. Method DrawLine( x0#,y0#,x1#,y1#,tx#,ty# ) Override
  377. Local lx0# = x0*_ix + y0*_iy + tx
  378. Local ly0# = x0*_jx + y0*_jy + ty
  379. Local lx1# = x1*_ix + y1*_iy + tx
  380. Local ly1# = x1*_jx + y1*_jy + ty
  381. If _lineWidth<=1
  382. _fverts[0]=lx0+.5
  383. _fverts[1]=ly0+.5
  384. _fverts[6]=lx1+.5
  385. _fverts[7]=ly1+.5
  386. DisableTex
  387. _d3dDev.DrawPrimitiveUP D3DPT_LINELIST,1,_fverts,24
  388. Return
  389. EndIf
  390. Local lw#=_lineWidth*.5
  391. If Abs(ly1-ly0)>Abs(lx1-lx0)
  392. _fverts[0]=lx0-lw
  393. _fverts[1]=ly0
  394. _fverts[6]=lx0+lw
  395. _fverts[7]=ly0
  396. _fverts[12]=lx1-lw
  397. _fverts[13]=ly1
  398. _fverts[18]=lx1+lw
  399. _fverts[19]=ly1
  400. Else
  401. _fverts[0]=lx0
  402. _fverts[1]=ly0-lw
  403. _fverts[6]=lx0
  404. _fverts[7]=ly0+lw
  405. _fverts[12]=lx1
  406. _fverts[13]=ly1-lw
  407. _fverts[18]=lx1
  408. _fverts[19]=ly1+lw
  409. EndIf
  410. DisableTex
  411. _d3dDev.DrawPrimitiveUP D3DPT_TRIANGLESTRIP,2,_fverts,24
  412. End Method
  413. Method DrawRect( x0#,y0#,x1#,y1#,tx#,ty# ) Override
  414. _fverts[0] = x0*_ix + y0*_iy + tx
  415. _fverts[1] = x0*_jx + y0*_jy + ty
  416. _fverts[6] = x1*_ix + y0*_iy + tx
  417. _fverts[7] = x1*_jx + y0*_jy + ty
  418. _fverts[12] = x0*_ix + y1*_iy + tx
  419. _fverts[13] = x0*_jx + y1*_jy + ty
  420. _fverts[18] = x1*_ix + y1*_iy + tx
  421. _fverts[19] = x1*_jx + y1*_jy + ty
  422. DisableTex
  423. _d3dDev.DrawPrimitiveUP D3DPT_TRIANGLESTRIP,2,_fverts,24
  424. End Method
  425. Method DrawOval( x0#,y0#,x1#,y1#,tx#,ty# ) Override
  426. Local xr#=(x1-x0)*.5
  427. Local yr#=(y1-y0)*.5
  428. Local segs:Int=Abs(xr)+Abs(yr)
  429. segs=Max(segs,12)&~3
  430. x0:+xr
  431. y0:+yr
  432. Local fverts#[segs*6]
  433. Local iverts:Int Ptr=Int Ptr( Varptr fverts[0] )
  434. For Local i:Int=0 Until segs
  435. Local th#=-i*360#/segs
  436. Local x#=x0+Cos(th)*xr
  437. Local y#=y0-Sin(th)*yr
  438. fverts[i*6+0]=x*_ix+y*_iy+tx
  439. fverts[i*6+1]=x*_jx+y*_jy+ty
  440. iverts[i*6+3]=_color
  441. Next
  442. DisableTex
  443. _d3dDev.DrawPrimitiveUP D3DPT_TRIANGLEFAN,segs-2,fverts,24
  444. End Method
  445. Method DrawPoly( verts#[],handlex#,handley#,tx#,ty# ) Override
  446. If verts.length<6 Or (verts.length&1) Return
  447. Local segs:Int=verts.length/2
  448. Local fverts#[segs*6]
  449. Local iverts:Int Ptr=Int Ptr( Varptr fverts[0] )
  450. For Local i:Int=0 Until segs
  451. Local x#=verts[i*2+0]+handlex
  452. Local y#=verts[i*2+1]+handley
  453. fverts[i*6+0]= x*_ix + y*_iy + tx
  454. fverts[i*6+1]= x*_jx + y*_jy + ty
  455. iverts[i*6+3]=_color
  456. Next
  457. DisableTex
  458. _d3dDev.DrawPrimitiveUP D3DPT_TRIANGLEFAN,segs-2,fverts,24
  459. End Method
  460. 'GetDC/BitBlt MUCH faster than locking backbuffer!
  461. Method DrawPixmap( pixmap:TPixmap,x:Int,y:Int ) Override
  462. Local width:Int=pixmap.width,height:Int=pixmap.height
  463. Local dstsurf:IDirect3DSurface9' = New IDirect3DSurface9
  464. If _d3dDev.GetRenderTarget( 0,dstsurf )<0
  465. d3derr "GetRenderTarget failed~n"
  466. Return
  467. EndIf
  468. Local desc:D3DSURFACE_DESC
  469. If dstsurf.GetDesc( desc )<0
  470. d3derr "GetDesc failed~n"
  471. EndIf
  472. Local rect:Int[]=[x,y,x+width,y+height]
  473. Local lockedrect:D3DLOCKED_RECT=New D3DLOCKED_RECT
  474. If dstsurf.LockRect( lockedrect,rect,0 )<0
  475. d3derr "Unable to lock render target surface~n"
  476. dstsurf.Release_
  477. Return
  478. EndIf
  479. Local dstpixmap:TPixmap=CreateStaticPixmap( lockedrect.pBits,width,height,lockedrect.Pitch,PF_BGRA8888 );
  480. dstpixmap.Paste pixmap,0,0
  481. dstsurf.UnlockRect
  482. dstsurf.Release_
  483. End Method
  484. 'GetDC/BitBlt MUCH faster than locking backbuffer!
  485. Method GrabPixmap:TPixmap( x:Int,y:Int,width:Int,height:Int ) Override
  486. Local srcsurf:IDirect3DSurface9
  487. If _d3dDev.GetRenderTarget( 0,srcsurf )<0
  488. d3derr "GetRenderTarget failed~n"
  489. EndIf
  490. Local dstsurf:IDirect3DSurface9
  491. If _d3dDev.CreateOffscreenPlainSurface( width,height,D3DFMT_X8R8G8B8,D3DPOOL_SYSTEMMEM,dstsurf,Null )<0
  492. d3derr "CreateOffscreenPlainSurface failed~n"
  493. EndIf
  494. Local srcdc:Byte Ptr
  495. If srcsurf.GetDC( srcdc )<0
  496. d3derr "srcsurf.GetDC failed~n"
  497. EndIf
  498. Local dstdc:Byte Ptr
  499. If dstsurf.GetDC( dstdc )<0
  500. d3derr "dstsurf.GetDC failed~n"
  501. EndIf
  502. BitBlt dstdc,0,0,width,height,srcdc,x,y,ROP_SRCCOPY
  503. srcsurf.ReleaseDC srcdc
  504. dstsurf.ReleaseDC dstdc
  505. Local lockedrect:D3DLOCKED_RECT=New D3DLOCKED_RECT
  506. If dstsurf.LockRect( lockedrect,Null,D3DLOCK_READONLY )<0
  507. d3derr "dstsurf.LockRect failed~n"
  508. EndIf
  509. Local pixmap:TPixmap=CreatePixmap( width,height,PF_BGRA8888 )
  510. 'Copy and set alpha in the process...
  511. For Local y:Int=0 Until height
  512. Local src:Int Ptr=Int Ptr( lockedrect.pBits+y*lockedrect.Pitch )
  513. Local dst:Int Ptr=Int Ptr( pixmap.PixelPtr( 0,y ) )
  514. For Local x:Int=0 Until width
  515. dst[x]=src[x] | $ff000000
  516. Next
  517. Next
  518. srcsurf.Release_
  519. dstsurf.Release_
  520. Return pixmap
  521. End Method
  522. Method SetResolution( width#,height# ) Override
  523. Local matrix#[]=[..
  524. 2.0/width,0.0,0.0,0.0,..
  525. 0.0,-2.0/height,0.0,0.0,..
  526. 0.0,0.0,1.0,0.0,..
  527. -1-(1.0/width),1+(1.0/height),1.0,1.0]
  528. _d3dDev.SetTransform D3DTS_PROJECTION,matrix
  529. End Method
  530. End Type
  531. Rem
  532. bbdoc: Get Direct3D9 Max2D Driver
  533. about:
  534. The returned driver can be used with #SetGraphicsDriver to enable Direct3D9 Max2D rendering.
  535. End Rem
  536. Function D3D9Max2DDriver:TD3D9Max2DDriver()
  537. Global _done:Int
  538. If Not _done
  539. _driver=New TD3D9Max2DDriver.Create()
  540. _done=True
  541. EndIf
  542. Return _driver
  543. End Function
  544. Local driver:TD3D9Max2DDriver=D3D9Max2DDriver()
  545. If driver SetGraphicsDriver driver
  546. ?