handle full-screen init resize better
This commit is contained in:
parent
632df1db88
commit
d243522ff6
|
|
@ -1298,7 +1298,7 @@ dx_setup()
|
|||
<< "wdxGraphicsWindow::config() - QI for D3D failed : result = " << ConvD3DErrorToString(hr) << endl;
|
||||
exit(1);
|
||||
}
|
||||
|
||||
|
||||
// just look for HAL and TnL devices right now. I dont think
|
||||
// we have any interest in the sw rasts at this point
|
||||
|
||||
|
|
@ -1320,9 +1320,11 @@ dx_setup()
|
|||
DX_DECLARE_CLEAN(DDCAPS,DDCaps);
|
||||
pDD->GetCaps(&DDCaps,NULL);
|
||||
|
||||
DWORD dwRenderWidth,dwRenderHeight;
|
||||
|
||||
if (dx_full_screen) {
|
||||
DWORD dwRenderWidth = _props._xsize;
|
||||
DWORD dwRenderHeight = _props._ysize;
|
||||
dwRenderWidth = _props._xsize;
|
||||
dwRenderHeight = _props._ysize;
|
||||
_props._xorg = _props._yorg = 0;
|
||||
SetRect(&view_rect, _props._xorg, _props._yorg, _props._xsize, _props._ysize);
|
||||
|
||||
|
|
@ -1413,7 +1415,14 @@ dx_setup()
|
|||
}
|
||||
#endif
|
||||
|
||||
if(FAILED(hr = pDD->SetCooperativeLevel(_mwindow, DDSCL_FPUSETUP | DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT ))) {
|
||||
|
||||
// extern bool dx_preserve_fpu_state;
|
||||
DWORD SCL_FPUFlag = DDSCL_FPUSETUP;
|
||||
|
||||
// if(dx_preserve_fpu_state)
|
||||
// SCL_FPUFlag = DDSCL_FPUPRESERVE; // tell d3d to preserve the fpu state across calls. this hurts perf, but is good for dbgging
|
||||
|
||||
if(FAILED(hr = pDD->SetCooperativeLevel(_mwindow, SCL_FPUFlag | DDSCL_FULLSCREEN | DDSCL_EXCLUSIVE | DDSCL_ALLOWREBOOT ))) {
|
||||
wdxdisplay_cat.fatal()
|
||||
<< "wdxGraphicsWindow::config() - SetCooperativeLevel failed : result = " << ConvD3DErrorToString(hr) << endl;
|
||||
exit(1);
|
||||
|
|
@ -1502,7 +1511,13 @@ dx_setup()
|
|||
exit(1);
|
||||
}
|
||||
|
||||
if(FAILED(hr = pDD->SetCooperativeLevel(_mwindow, DDSCL_FPUSETUP | DDSCL_NORMAL))) {
|
||||
// extern bool dx_preserve_fpu_state;
|
||||
DWORD SCL_FPUFlag = DDSCL_FPUSETUP;
|
||||
|
||||
// if(dx_preserve_fpu_state)
|
||||
// SCL_FPUFlag = DDSCL_FPUPRESERVE; // tell d3d to preserve the fpu state across calls. this hurts perf, but is good for dbgging
|
||||
|
||||
if(FAILED(hr = pDD->SetCooperativeLevel(_mwindow, SCL_FPUFlag | DDSCL_NORMAL))) {
|
||||
wdxdisplay_cat.fatal()
|
||||
<< "wdxGraphicsWindow::config() - SetCooperativeLevel failed : result = " << ConvD3DErrorToString(hr) << endl;
|
||||
exit(1);
|
||||
|
|
@ -1510,10 +1525,16 @@ dx_setup()
|
|||
// Get the dimensions of the viewport and screen bounds
|
||||
|
||||
GetClientRect( _mwindow, &view_rect );
|
||||
ClientToScreen( _mwindow, (POINT*)&view_rect.left );
|
||||
ClientToScreen( _mwindow, (POINT*)&view_rect.right );
|
||||
DWORD dwRenderWidth = view_rect.right - view_rect.left;
|
||||
DWORD dwRenderHeight = view_rect.bottom - view_rect.top;
|
||||
POINT ul,lr;
|
||||
ul.x=view_rect.left; ul.y=view_rect.top;
|
||||
lr.x=view_rect.right; lr.y=view_rect.bottom;
|
||||
ClientToScreen( _mwindow, &ul );
|
||||
ClientToScreen( _mwindow, &lr );
|
||||
view_rect.left=ul.x; view_rect.top=ul.y;
|
||||
view_rect.right=lr.x; view_rect.bottom=lr.y;
|
||||
|
||||
dwRenderWidth = view_rect.right - view_rect.left;
|
||||
dwRenderHeight = view_rect.bottom - view_rect.top;
|
||||
_props._xorg = view_rect.left; // _props should reflect view rectangle
|
||||
_props._yorg = view_rect.top;
|
||||
_props._xsize = dwRenderWidth;
|
||||
|
|
@ -1585,6 +1606,8 @@ dx_setup()
|
|||
|
||||
// ========================================================
|
||||
|
||||
resized(dwRenderWidth,dwRenderHeight); // update panda channel/display rgn info
|
||||
|
||||
// Check if the device supports z-bufferless hidden surface removal. If so,
|
||||
// we don't really need a z-buffer
|
||||
if(!(d3ddevs[0].dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_ZBUFFERLESSHSR )) {
|
||||
|
|
@ -1776,6 +1799,22 @@ void wdxGraphicsWindow::setup_colormap(void) {
|
|||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: begin_frame
|
||||
// Access:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void wdxGraphicsWindow::begin_frame(void) {
|
||||
GraphicsWindow::begin_frame();
|
||||
}
|
||||
|
||||
void wdxGraphicsWindow::show_frame(void)
|
||||
{
|
||||
DXGraphicsStateGuardian* dxgsg = DCAST(DXGraphicsStateGuardian, _gsg);
|
||||
dxgsg->show_frame();
|
||||
}
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: end_frame
|
||||
// Access:
|
||||
|
|
@ -1788,106 +1827,6 @@ void wdxGraphicsWindow::end_frame(void) {
|
|||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Name: SetViewMatrix()
|
||||
// Desc: Given an eye point, a lookat point, and an up vector, this
|
||||
// function builds a 4x4 view matrix.
|
||||
//-----------------------------------------------------------------------------
|
||||
HRESULT SetViewMatrix( D3DMATRIX& mat, D3DVECTOR& vFrom, D3DVECTOR& vAt,
|
||||
D3DVECTOR& vWorldUp )
|
||||
{
|
||||
// Get the z basis vector, which points straight ahead. This is the
|
||||
// difference from the eyepoint to the lookat point.
|
||||
D3DVECTOR vView = vAt - vFrom;
|
||||
|
||||
FLOAT fLength = Magnitude( vView );
|
||||
if( fLength < 1e-6f )
|
||||
return E_INVALIDARG;
|
||||
|
||||
// Normalize the z basis vector
|
||||
vView /= fLength;
|
||||
|
||||
// Get the dot product, and calculate the projection of the z basis
|
||||
// vector onto the up vector. The projection is the y basis vector.
|
||||
FLOAT fDotProduct = DotProduct( vWorldUp, vView );
|
||||
|
||||
D3DVECTOR vUp = vWorldUp - fDotProduct * vView;
|
||||
|
||||
// If this vector has near-zero length because the input specified a
|
||||
// bogus up vector, let's try a default up vector
|
||||
if( 1e-6f > ( fLength = Magnitude( vUp ) ) )
|
||||
{
|
||||
vUp = D3DVECTOR( 0.0f, 1.0f, 0.0f ) - vView.y * vView;
|
||||
|
||||
// If we still have near-zero length, resort to a different axis.
|
||||
if( 1e-6f > ( fLength = Magnitude( vUp ) ) )
|
||||
{
|
||||
vUp = D3DVECTOR( 0.0f, 0.0f, 1.0f ) - vView.z * vView;
|
||||
|
||||
if( 1e-6f > ( fLength = Magnitude( vUp ) ) )
|
||||
return E_INVALIDARG;
|
||||
}
|
||||
}
|
||||
|
||||
// Normalize the y basis vector
|
||||
vUp /= fLength;
|
||||
|
||||
// The x basis vector is found simply with the cross product of the y
|
||||
// and z basis vectors
|
||||
D3DVECTOR vRight = CrossProduct( vUp, vView );
|
||||
|
||||
// Start building the matrix. The first three rows contains the basis
|
||||
// vectors used to rotate the view to point at the lookat point
|
||||
mat._11 = vRight.x; mat._12 = vUp.x; mat._13 = vView.x; mat._14 = 0.0f;
|
||||
mat._21 = vRight.y; mat._22 = vUp.y; mat._23 = vView.y; mat._24 = 0.0f;
|
||||
mat._31 = vRight.z; mat._32 = vUp.z; mat._33 = vView.z; mat._34 = 0.0f;
|
||||
|
||||
// Do the translation values (rotations are still about the eyepoint)
|
||||
mat._41 = - DotProduct( vFrom, vRight );
|
||||
mat._42 = - DotProduct( vFrom, vUp );
|
||||
mat._43 = - DotProduct( vFrom, vView );
|
||||
mat._44 = 1.0f;
|
||||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: begin_frame
|
||||
// Access:
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void wdxGraphicsWindow::begin_frame(void) {
|
||||
GraphicsWindow::begin_frame();
|
||||
}
|
||||
|
||||
|
||||
void wdxGraphicsWindow::show_frame(void)
|
||||
{
|
||||
DXGraphicsStateGuardian* dxgsg = DCAST(DXGraphicsStateGuardian, _gsg);
|
||||
dxgsg->show_frame();
|
||||
}
|
||||
|
||||
/**
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: end_frame
|
||||
// Access:
|
||||
// Description: Swaps the front and back buffers.
|
||||
////////////////////////////////////////////////////////////////////
|
||||
void wdxGraphicsWindow::end_frame(void) {
|
||||
|
||||
BUGBUG: do we want this here (as it is in GL)??
|
||||
{
|
||||
PStatTimer timer(_swap_pcollector);
|
||||
SwapBuffers(_hdc);
|
||||
}
|
||||
|
||||
GraphicsWindow::end_frame();
|
||||
}
|
||||
**/
|
||||
|
||||
|
||||
|
||||
////////////////////////////////////////////////////////////////////
|
||||
// Function: handle_window_move
|
||||
|
|
|
|||
Loading…
Reference in New Issue