'   0 IDirect3DViewport2_QueryInterface(p,a,b)        (p)->lpVtbl->QueryInterface(p,a,b)        
'   1 IDirect3DViewport2_AddRef(p)                    (p)->lpVtbl->AddRef(p)                    
'   2 IDirect3DViewport2_Release(p)                   (p)->lpVtbl->Release(p)                   
'   3 IDirect3DViewport2_Initialize(p,a)              (p)->lpVtbl->Initialize(p,a)              
'   4 IDirect3DViewport2_GetViewport(p,a)             (p)->lpVtbl->GetViewport(p,a)             
'   5 IDirect3DViewport2_SetViewport(p,a)             (p)->lpVtbl->SetViewport(p,a)             
'   6 IDirect3DViewport2_TransformVertices(p,a,b,c,d) (p)->lpVtbl->TransformVertices(p,a,b,c,d) 
'   7 IDirect3DViewport2_LightElements(p,a,b)         (p)->lpVtbl->LightElements(p,a,b)         
'   8 IDirect3DViewport2_SetBackground(p,a)           (p)->lpVtbl->SetBackground(p,a)           
'   9 IDirect3DViewport2_GetBackground(p,a,b)         (p)->lpVtbl->GetBackground(p,a,b)         
'  10 IDirect3DViewport2_SetBackgroundDepth(p,a)      (p)->lpVtbl->SetBackgroundDepth(p,a)      
'  11 IDirect3DViewport2_GetBackgroundDepth(p,a,b)    (p)->lpVtbl->GetBackgroundDepth(p,a,b)    
'  12 IDirect3DViewport2_Clear(p,a,b,c)               (p)->lpVtbl->Clear(p,a,b,c)               
'  13 IDirect3DViewport2_AddLight(p,a)                (p)->lpVtbl->AddLight(p,a)                
'  14 IDirect3DViewport2_DeleteLight(p,a)             (p)->lpVtbl->DeleteLight(p,a)             
'  15 IDirect3DViewport2_NextLight(p,a,b,c)           (p)->lpVtbl->NextLight(p,a,b,c)           
'  16 IDirect3DViewport2_GetViewport2(p,a)            (p)->lpVtbl->GetViewport2(p,a)            
'  17 IDirect3DViewport2_SetViewport2(p,a)            (p)->lpVtbl->SetViewport2(p,a)            
'                                                                                               

' ****************************************************************************************
function d3dViewPort2Prototype() as hresult
  FatalError("D3D::ViewPort2.#%i Function not implemented",D3DVIEWPORT2PROTOID)    
  return DDERR_UNSUPPORTED  
  
  asm
    .balign 32
    _d3dViewPort2ProtoTable_:  
    #macro ProtoNum(X)
    mov dword ptr [D3DVIEWPORT2PROTOID],X
    jmp d3dViewPort2Prototype
    .balign 32
    #endmacro
    ProtoNum(0)
    ProtoNum(1)
    ProtoNum(2)
    ProtoNum(3)
    ProtoNum(4)
    ProtoNum(5)
    ProtoNum(6)
    ProtoNum(7)
    ProtoNum(8)
    ProtoNum(9)
    ProtoNum(10)
    ProtoNum(11)
    ProtoNum(12)
    ProtoNum(13)
    ProtoNum(14)
    ProtoNum(15)
    ProtoNum(16)
    ProtoNum(17)
    ProtoNum(18)
    ProtoNum(19)
    ProtoNum(20)
    ProtoNum(21)
    ProtoNum(22)
    ProtoNum(23)
    ProtoNum(24)
    ProtoNum(25)
    ProtoNum(26)
    ProtoNum(27)
    ProtoNum(28)
    ProtoNum(29)
    ProtoNum(30)
    ProtoNum(31)
    ProtoNum(32)
    ProtoNum(33)
    ProtoNum(34)
    ProtoNum(35)
    ProtoNum(36)
    ProtoNum(37)
    ProtoNum(38)
    ProtoNum(39)
    ProtoNum(40)
  end asm  
  
end function
' ****************************************************************************************
UndefAll()
#define P1 pTHIS as d3dViewPort2Object ptr
function d3dViewPort2_2_Release(P1) as hresult
  #ifdef MyDebugD3D
  Cout("IDirect3D2::ViewPort2.Release (2)" + chr$(13,10) + _
  " >> THIS: "+hex$(cast(uinteger,pTHIS),8))
  #endif  
  if pTHIS=0 then ddrawError(DDERR_INVALIDPARAMS)
  if pTHIS->Interface <> itd3dViewPort2 then ddrawError(DDERR_INVALIDOBJECT)
  Delete pTHIS
  return DD_OK
end function
' ****************************************************************************************
UndefAll()
#define P1 pTHIS as d3dViewPort2Object ptr
#define P2 pPort as LPD3DVIEWPORT2
function d3dViewPort2_16_GetViewport2(P1,P2) as hresult
  #ifdef MyDebugD3D
  Cout("IDirect3D2::ViewPort2.GetViewport2 (16)" + chr$(13,10) + _
  " >> THIS: "+hex$(cast(uinteger,pThis),8) + _
  " ViewPort = "+hexptr(pPort))
  #endif  
  if pTHIS=0 then ddrawError(DDERR_INVALIDPARAMS)
  if pTHIS->Interface <> itd3dViewPort2 then
    ddrawerror(DDERR_INVALIDOBJECT)
  end if
  
  #if 0
  with *pPort
    .dwsize = sizeof(D3DVIEWPORT2)
    .dwX = 0 : .dwY = 0 'DDRAWCOOP.wposx=x:DDRAWCOOP.wposy=y
    .dwWidth = DDRAWCOOP.wwid
    .dwHeight = DDRAWCOOP.whei
    .dvClipX = 1: .dvClipY = 1
    .dvClipWidth = 2048: .dvClipHeight = 2048
    .dvMinZ = 0: .dvMaxZ = 2048  
  end with
  #endif
  *pPort = pTHIS->Regs
  
  return DD_OK
end function
' ****************************************************************************************
UndefAll()
#define P1 pTHIS as d3dViewPort2Object ptr
#define P2 pPort as LPD3DVIEWPORT2
function d3dViewPort2_17_SetViewport2(P1,P2) as hresult  
  if pTHIS=0 then ddrawError(DDERR_INVALIDPARAMS)
  if pTHIS->Interface <> itd3dViewPort2 then ddrawerror(DDERR_INVALIDOBJECT)    
  with *pPort    
    #ifdef MyDebugD3D
    Cout("IDirect3D2::ViewPort2.SetViewport2 (17)" + chr$(13,10) + _
    " >> THIS: "+hexptr(pTHIS)+" ViewPort: "+hexptr(pPort)+" sz: " & .dwSize & chr$(13,10) + _
    "    X=" & .dwX & " Y=" & .dwY & " W=" & .dwWidth & " H=" & .dwHeight & _
    " ClX=" & .dvClipX & " ClY=" & .dvClipY & " ClW=" & .dvClipWidth & _
    " ClH=" & .dvClipHeight & " miZ=" & .dvMinZ & " maZ=" & .dvMaxZ)
    #endif  
    ogl.PortX = .dwWidth: ogl.PortY = .dwHeight
    pTHIS->Regs = *pPort
    'TODO glViewPort?? (think not because dw::SetDisplayMode() was used too)
  end with
  return DD_OK
end function
' ****************************************************************************************
' ****************************************************************************************
' ****************************************************************************************
sub d3dViewPort2Funcs(VTABLE() as any ptr)
  dim as any ptr PROTOTABLE
  asm mov dword ptr [PROTOTABLE], offset _d3dViewPort2ProtoTable_
  for CNT as integer = 0 to 40
    VTABLE(CNT) = PROTOTABLE+CNT*32
  next CNT  
  VTABLE( 2) = @d3dViewPort2_2_Release  
  VTABLE(16) = @d3dViewPort2_16_GetViewport2
  VTABLE(17) = @d3dViewPort2_17_SetViewport2
end sub

