mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 02:15:43 -04:00
show_frame shouldnt flip if no valid backbuf
This commit is contained in:
parent
38db3b62d2
commit
c1db2dc152
@ -112,7 +112,7 @@ static void CountDPs(DWORD nVerts,DWORD nTris) {
|
|||||||
cVertcount+=nVerts;
|
cVertcount+=nVerts;
|
||||||
cTricount+=nTris;
|
cTricount+=nTris;
|
||||||
|
|
||||||
if(_pCurDeviceTexture==pLastTexture) {
|
if(_pCurDeviceTexture==pLastTexture) {
|
||||||
cDP_noTexChangeCount++;
|
cDP_noTexChangeCount++;
|
||||||
} else pLastTexture = _pCurDeviceTexture;
|
} else pLastTexture = _pCurDeviceTexture;
|
||||||
}
|
}
|
||||||
@ -152,7 +152,7 @@ Colorf_to_D3DCOLOR(const Colorf &cColorf) {
|
|||||||
|
|
||||||
fld DWORD PTR [ecx+4] ;grn
|
fld DWORD PTR [ecx+4] ;grn
|
||||||
fmul ST(0),ST(1)
|
fmul ST(0),ST(1)
|
||||||
fistp tempcolorval
|
fistp tempcolorval
|
||||||
mov ebx,tempcolorval
|
mov ebx,tempcolorval
|
||||||
shl ebx, 8
|
shl ebx, 8
|
||||||
or eax,ebx
|
or eax,ebx
|
||||||
@ -249,15 +249,15 @@ read_pixel_shader(string &filename) {
|
|||||||
dxgsg_cat.error() << "Could not find shader file '"<< filename << "'\n";
|
dxgsg_cat.error() << "Could not find shader file '"<< filename << "'\n";
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT BytesRead,FileSize = GetFileSize(hFile, NULL);
|
UINT BytesRead,FileSize = GetFileSize(hFile, NULL);
|
||||||
|
|
||||||
pShaderBytes = new BYTE[FileSize];
|
pShaderBytes = new BYTE[FileSize];
|
||||||
if (pShaderBytes==NULL) {
|
if (pShaderBytes==NULL) {
|
||||||
dxgsg_cat.error() << "MemAlloc failed for shader file '"<< filename << "'\n";
|
dxgsg_cat.error() << "MemAlloc failed for shader file '"<< filename << "'\n";
|
||||||
goto exit_create_pshader;
|
goto exit_create_pshader;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReadFile(hFile, (void*)pShaderBytes, FileSize, (LPDWORD)&BytesRead, NULL);
|
ReadFile(hFile, (void*)pShaderBytes, FileSize, (LPDWORD)&BytesRead, NULL);
|
||||||
assert(BytesRead==FileSize);
|
assert(BytesRead==FileSize);
|
||||||
} else {
|
} else {
|
||||||
@ -272,7 +272,7 @@ read_pixel_shader(string &filename) {
|
|||||||
if ( FindFileHandle == INVALID_HANDLE_VALUE ) {
|
if ( FindFileHandle == INVALID_HANDLE_VALUE ) {
|
||||||
dxgsg_cat.error() << "Could not find shader file '"<< filename << "'\n";
|
dxgsg_cat.error() << "Could not find shader file '"<< filename << "'\n";
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
FindClose(FindFileHandle);
|
FindClose(FindFileHandle);
|
||||||
|
|
||||||
hr = D3DXAssembleShaderFromFile(filename.c_str(),D3DXASM_DEBUG,NULL,&pD3DXBuf_CompiledShader,&pD3DXBuf_CompilationErrors);
|
hr = D3DXAssembleShaderFromFile(filename.c_str(),D3DXASM_DEBUG,NULL,&pD3DXBuf_CompiledShader,&pD3DXBuf_CompilationErrors);
|
||||||
@ -287,13 +287,13 @@ read_pixel_shader(string &filename) {
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = scrn.pD3DDevice->CreatePixelShader((DWORD*) ((pD3DXBuf_CompiledShader!=NULL) ? pD3DXBuf_CompiledShader->GetBufferPointer() : pShaderBytes),
|
hr = scrn.pD3DDevice->CreatePixelShader((DWORD*) ((pD3DXBuf_CompiledShader!=NULL) ? pD3DXBuf_CompiledShader->GetBufferPointer() : pShaderBytes),
|
||||||
&hShader);
|
&hShader);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
dxgsg_cat.error() << "CreatePixelShader failed for '"<< filename << "' " << D3DERRORSTRING(hr);
|
dxgsg_cat.error() << "CreatePixelShader failed for '"<< filename << "' " << D3DERRORSTRING(hr);
|
||||||
hShader=NULL;
|
hShader=NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(hShader!=NULL); // NULL is invalid I hope
|
assert(hShader!=NULL); // NULL is invalid I hope
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
@ -328,7 +328,7 @@ read_vertex_shader(string &filename) {
|
|||||||
D3DVSD_STREAM(0),
|
D3DVSD_STREAM(0),
|
||||||
D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3 ), // input register v0
|
D3DVSD_REG(D3DVSDE_POSITION, D3DVSDT_FLOAT3 ), // input register v0
|
||||||
D3DVSD_REG(D3DVSDE_DIFFUSE, D3DVSDT_D3DCOLOR ), // input Register v5
|
D3DVSD_REG(D3DVSDE_DIFFUSE, D3DVSDT_D3DCOLOR ), // input Register v5
|
||||||
// D3DVSD_CONST(0,1),*(DWORD*)&c[0],*(DWORD*)&c[1],*(DWORD*)&c[2],*(DWORD*)&c[3],
|
// D3DVSD_CONST(0,1),*(DWORD*)&c[0],*(DWORD*)&c[1],*(DWORD*)&c[2],*(DWORD*)&c[3],
|
||||||
};
|
};
|
||||||
|
|
||||||
memcpy(ShaderDeclHeader,Predefined_DeclArray,sizeof(Predefined_DeclArray));
|
memcpy(ShaderDeclHeader,Predefined_DeclArray,sizeof(Predefined_DeclArray));
|
||||||
@ -345,15 +345,15 @@ read_vertex_shader(string &filename) {
|
|||||||
dxgsg_cat.error() << "Could not find shader file '"<< filename << "'\n";
|
dxgsg_cat.error() << "Could not find shader file '"<< filename << "'\n";
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
UINT BytesRead,FileSize = GetFileSize(hFile, NULL);
|
UINT BytesRead,FileSize = GetFileSize(hFile, NULL);
|
||||||
|
|
||||||
pShaderBytes = new BYTE[FileSize];
|
pShaderBytes = new BYTE[FileSize];
|
||||||
if (pShaderBytes==NULL) {
|
if (pShaderBytes==NULL) {
|
||||||
dxgsg_cat.error() << "MemAlloc failed for shader file '"<< filename << "'\n";
|
dxgsg_cat.error() << "MemAlloc failed for shader file '"<< filename << "'\n";
|
||||||
goto exit_create_vshader;
|
goto exit_create_vshader;
|
||||||
}
|
}
|
||||||
|
|
||||||
ReadFile(hFile, (void*)pShaderBytes, FileSize, (LPDWORD)&BytesRead, NULL);
|
ReadFile(hFile, (void*)pShaderBytes, FileSize, (LPDWORD)&BytesRead, NULL);
|
||||||
assert(BytesRead==FileSize);
|
assert(BytesRead==FileSize);
|
||||||
} else {
|
} else {
|
||||||
@ -368,7 +368,7 @@ read_vertex_shader(string &filename) {
|
|||||||
if ( FindFileHandle == INVALID_HANDLE_VALUE ) {
|
if ( FindFileHandle == INVALID_HANDLE_VALUE ) {
|
||||||
dxgsg_cat.error() << "Could not find shader file '"<< filename << "'\n";
|
dxgsg_cat.error() << "Could not find shader file '"<< filename << "'\n";
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
FindClose(FindFileHandle);
|
FindClose(FindFileHandle);
|
||||||
|
|
||||||
hr = D3DXAssembleShaderFromFile(filename.c_str(),D3DXASM_DEBUG,&pD3DXBuf_Constants,&pD3DXBuf_CompiledShader,&pD3DXBuf_CompilationErrors);
|
hr = D3DXAssembleShaderFromFile(filename.c_str(),D3DXASM_DEBUG,&pD3DXBuf_Constants,&pD3DXBuf_CompiledShader,&pD3DXBuf_CompilationErrors);
|
||||||
@ -395,13 +395,13 @@ read_vertex_shader(string &filename) {
|
|||||||
|
|
||||||
UINT UsageFlags = (scrn.bCanUseHWVertexShaders ? 0x0 : D3DUSAGE_SOFTWAREPROCESSING);
|
UINT UsageFlags = (scrn.bCanUseHWVertexShaders ? 0x0 : D3DUSAGE_SOFTWAREPROCESSING);
|
||||||
hr = scrn.pD3DDevice->CreateVertexShader((DWORD*)ShaderDeclHeader,
|
hr = scrn.pD3DDevice->CreateVertexShader((DWORD*)ShaderDeclHeader,
|
||||||
(DWORD*) ((pD3DXBuf_CompiledShader!=NULL) ? pD3DXBuf_CompiledShader->GetBufferPointer() : pShaderBytes),
|
(DWORD*) ((pD3DXBuf_CompiledShader!=NULL) ? pD3DXBuf_CompiledShader->GetBufferPointer() : pShaderBytes),
|
||||||
&hShader, UsageFlags);
|
&hShader, UsageFlags);
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
dxgsg_cat.error() << "CreateVertexShader failed for '"<< filename << "' " << D3DERRORSTRING(hr);
|
dxgsg_cat.error() << "CreateVertexShader failed for '"<< filename << "' " << D3DERRORSTRING(hr);
|
||||||
hShader=NULL;
|
hShader=NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(hShader!=NULL); // NULL is invalid I hope
|
assert(hShader!=NULL); // NULL is invalid I hope
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
@ -463,7 +463,7 @@ DXGraphicsStateGuardian(GraphicsWindow *win) : GraphicsStateGuardian(win) {
|
|||||||
|
|
||||||
// _max_light_range = __D3DLIGHT_RANGE_MAX;
|
// _max_light_range = __D3DLIGHT_RANGE_MAX;
|
||||||
|
|
||||||
// non-dx obj values inited here should not change if resize is
|
// non-dx obj values inited here should not change if resize is
|
||||||
// called and dx objects need to be recreated (otherwise they
|
// called and dx objects need to be recreated (otherwise they
|
||||||
// belong in dx_init, with other renderstate
|
// belong in dx_init, with other renderstate
|
||||||
|
|
||||||
@ -499,7 +499,7 @@ DXGraphicsStateGuardian::
|
|||||||
void DXGraphicsStateGuardian::
|
void DXGraphicsStateGuardian::
|
||||||
reset(void) {
|
reset(void) {
|
||||||
reset_panda_gsg();
|
reset_panda_gsg();
|
||||||
dxgsg_cat.error() << "DXGSG reset() not implemented properly yet!\n";
|
dxgsg_cat.error() << "DXGSG reset() not implemented properly yet!\n";
|
||||||
// what else do we need to do?
|
// what else do we need to do?
|
||||||
// delete all the objs too, right?
|
// delete all the objs too, right?
|
||||||
// need to do a
|
// need to do a
|
||||||
@ -509,12 +509,12 @@ reset(void) {
|
|||||||
// setup up for re-calling dx_init(), this is not the final exit cleanup routine (see dx_cleanup)
|
// setup up for re-calling dx_init(), this is not the final exit cleanup routine (see dx_cleanup)
|
||||||
void DXGraphicsStateGuardian::
|
void DXGraphicsStateGuardian::
|
||||||
free_d3d_device(void) {
|
free_d3d_device(void) {
|
||||||
// dont want a full reset of gsg, just a state clear
|
// dont want a full reset of gsg, just a state clear
|
||||||
set_state(RenderState::make_empty());
|
set_state(RenderState::make_empty());
|
||||||
// want gsg to pass all state settings through
|
// want gsg to pass all state settings through
|
||||||
|
|
||||||
_bDXisReady = false;
|
_bDXisReady = false;
|
||||||
|
|
||||||
if(scrn.pD3DDevice!=NULL)
|
if(scrn.pD3DDevice!=NULL)
|
||||||
for(int i=0;i<D3D_MAXTEXTURESTAGES;i++)
|
for(int i=0;i<D3D_MAXTEXTURESTAGES;i++)
|
||||||
scrn.pD3DDevice->SetTexture(i,NULL); // d3d should release this stuff internally anyway, but whatever
|
scrn.pD3DDevice->SetTexture(i,NULL); // d3d should release this stuff internally anyway, but whatever
|
||||||
@ -576,7 +576,7 @@ dx_init(HCURSOR hMouseCursor) {
|
|||||||
scrn.pD3DDevice->SetRenderState(D3DRS_CLIPPING, true);
|
scrn.pD3DDevice->SetRenderState(D3DRS_CLIPPING, true);
|
||||||
_clipping_enabled = true;
|
_clipping_enabled = true;
|
||||||
|
|
||||||
// these both reflect d3d defaults
|
// these both reflect d3d defaults
|
||||||
_color_writemask = 0xFFFFFFFF;
|
_color_writemask = 0xFFFFFFFF;
|
||||||
_CurFVFType = 0x0; // guards SetVertexShader fmt
|
_CurFVFType = 0x0; // guards SetVertexShader fmt
|
||||||
|
|
||||||
@ -587,7 +587,7 @@ dx_init(HCURSOR hMouseCursor) {
|
|||||||
// (not related to gouraud/flat shading)
|
// (not related to gouraud/flat shading)
|
||||||
// scrn.pD3DDevice->SetRenderState(D3DRS_COLORVERTEX, true);
|
// scrn.pD3DDevice->SetRenderState(D3DRS_COLORVERTEX, true);
|
||||||
|
|
||||||
_depth_test_enabled = true;
|
_depth_test_enabled = true;
|
||||||
scrn.pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, _depth_test_enabled);
|
scrn.pD3DDevice->SetRenderState(D3DRS_ZWRITEENABLE, _depth_test_enabled);
|
||||||
|
|
||||||
_pCurTexContext = NULL;
|
_pCurTexContext = NULL;
|
||||||
@ -597,7 +597,7 @@ dx_init(HCURSOR hMouseCursor) {
|
|||||||
|
|
||||||
_color_material_enabled = false;
|
_color_material_enabled = false;
|
||||||
_normals_enabled = false;
|
_normals_enabled = false;
|
||||||
|
|
||||||
_depth_test_enabled = D3DZB_FALSE;
|
_depth_test_enabled = D3DZB_FALSE;
|
||||||
scrn.pD3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
|
scrn.pD3DDevice->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE);
|
||||||
|
|
||||||
@ -630,7 +630,7 @@ dx_init(HCURSOR hMouseCursor) {
|
|||||||
global_pD3DDevice = pDevice;
|
global_pD3DDevice = pDevice;
|
||||||
#endif
|
#endif
|
||||||
_pCurrentGeomContext = NULL;
|
_pCurrentGeomContext = NULL;
|
||||||
_bDrawPrimDoSetupVertexBuffer = false;
|
_bDrawPrimDoSetupVertexBuffer = false;
|
||||||
|
|
||||||
_last_testcooplevel_result = D3D_OK;
|
_last_testcooplevel_result = D3D_OK;
|
||||||
|
|
||||||
@ -695,7 +695,7 @@ dx_init(HCURSOR hMouseCursor) {
|
|||||||
dxgsg_cat.error() << "device is missing alpha blending capabilities, blending may not work correctly: SrcBlendCaps: 0x"<< (void*) scrn.d3dcaps.SrcBlendCaps << " DestBlendCaps: "<< (void*) scrn.d3dcaps.DestBlendCaps << endl;
|
dxgsg_cat.error() << "device is missing alpha blending capabilities, blending may not work correctly: SrcBlendCaps: 0x"<< (void*) scrn.d3dcaps.SrcBlendCaps << " DestBlendCaps: "<< (void*) scrn.d3dcaps.DestBlendCaps << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
// just 'require' bilinear with mip nearest.
|
// just 'require' bilinear with mip nearest.
|
||||||
#define REQUIRED_TEXFILTERCAPS (D3DPTFILTERCAPS_MAGFLINEAR | D3DPTFILTERCAPS_MIPFPOINT | D3DPTFILTERCAPS_MINFLINEAR)
|
#define REQUIRED_TEXFILTERCAPS (D3DPTFILTERCAPS_MAGFLINEAR | D3DPTFILTERCAPS_MIPFPOINT | D3DPTFILTERCAPS_MINFLINEAR)
|
||||||
|
|
||||||
if ((scrn.d3dcaps.TextureFilterCaps & REQUIRED_TEXFILTERCAPS)!=REQUIRED_TEXFILTERCAPS) {
|
if ((scrn.d3dcaps.TextureFilterCaps & REQUIRED_TEXFILTERCAPS)!=REQUIRED_TEXFILTERCAPS) {
|
||||||
@ -768,7 +768,7 @@ dx_init(HCURSOR hMouseCursor) {
|
|||||||
_current_fill_mode = RenderModeAttrib::M_filled;
|
_current_fill_mode = RenderModeAttrib::M_filled;
|
||||||
scrn.pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
|
scrn.pD3DDevice->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
|
||||||
|
|
||||||
scrn.pD3DDevice->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_COLOR1); // Use the diffuse vertex color.
|
scrn.pD3DDevice->SetRenderState(D3DRS_AMBIENTMATERIALSOURCE, D3DMCS_COLOR1); // Use the diffuse vertex color.
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Panda no longer requires us to specify the maximum number of
|
Panda no longer requires us to specify the maximum number of
|
||||||
@ -777,12 +777,13 @@ dx_init(HCURSOR hMouseCursor) {
|
|||||||
limit or not. Until we override this function, there is no
|
limit or not. Until we override this function, there is no
|
||||||
limit.
|
limit.
|
||||||
|
|
||||||
if(scrn.d3dcaps.MaxActiveLights==0) {
|
if(scrn.d3dcaps.MaxActiveLights==0) {
|
||||||
// 0 indicates no limit on # of lights, but we use DXGSG_MAX_LIGHTS anyway for now
|
// 0 indicates no limit on # of lights, but we use DXGSG_MAX_LIGHTS anyway for now
|
||||||
init_lights(DXGSG_MAX_LIGHTS);
|
init_lights(DXGSG_MAX_LIGHTS);
|
||||||
} else {
|
} else {
|
||||||
init_lights(min(DXGSG_MAX_LIGHTS,scrn.d3dcaps.MaxActiveLights));
|
init_lights(min(DXGSG_MAX_LIGHTS,scrn.d3dcaps.MaxActiveLights));
|
||||||
} */
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
if(dx_auto_normalize_lighting)
|
if(dx_auto_normalize_lighting)
|
||||||
scrn.pD3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true);
|
scrn.pD3DDevice->SetRenderState(D3DRS_NORMALIZENORMALS, true);
|
||||||
@ -824,7 +825,7 @@ dx_init(HCURSOR hMouseCursor) {
|
|||||||
scrn.pD3DDevice->SetRenderState(D3DRS_CULLMODE, dx_force_backface_culling);
|
scrn.pD3DDevice->SetRenderState(D3DRS_CULLMODE, dx_force_backface_culling);
|
||||||
} else {
|
} else {
|
||||||
dx_force_backface_culling=0;
|
dx_force_backface_culling=0;
|
||||||
if(dxgsg_cat.is_debug())
|
if(dxgsg_cat.is_debug())
|
||||||
dxgsg_cat.debug() << "error, invalid value for dx-force-backface-culling\n";
|
dxgsg_cat.debug() << "error, invalid value for dx-force-backface-culling\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -910,7 +911,7 @@ dx_init(HCURSOR hMouseCursor) {
|
|||||||
CPT(RenderAttrib) dta = DepthTestAttrib::make(DepthTestAttrib::M_less);
|
CPT(RenderAttrib) dta = DepthTestAttrib::make(DepthTestAttrib::M_less);
|
||||||
CPT(RenderAttrib) dwa = DepthWriteAttrib::make(DepthWriteAttrib::M_on);
|
CPT(RenderAttrib) dwa = DepthWriteAttrib::make(DepthWriteAttrib::M_on);
|
||||||
CPT(RenderAttrib) cfa = CullFaceAttrib::make(CullFaceAttrib::M_cull_clockwise);
|
CPT(RenderAttrib) cfa = CullFaceAttrib::make(CullFaceAttrib::M_cull_clockwise);
|
||||||
|
|
||||||
dta->issue(this);
|
dta->issue(this);
|
||||||
dwa->issue(this);
|
dwa->issue(this);
|
||||||
cfa->issue(this);
|
cfa->issue(this);
|
||||||
@ -948,7 +949,7 @@ init_shader(ShaderType stype,DXShaderHandle &hShader,string *pFname) {
|
|||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
char *sh_typename;
|
char *sh_typename;
|
||||||
if(stype==VertexShader)
|
if(stype==VertexShader)
|
||||||
sh_typename="Vertex";
|
sh_typename="Vertex";
|
||||||
else sh_typename="Pixel";
|
else sh_typename="Pixel";
|
||||||
|
|
||||||
@ -959,14 +960,14 @@ init_shader(ShaderType stype,DXShaderHandle &hShader,string *pFname) {
|
|||||||
|
|
||||||
if((hShader!=NULL)&&(!scrn.bIsDX81)) {
|
if((hShader!=NULL)&&(!scrn.bIsDX81)) {
|
||||||
// for dx8.0, need to release and recreate shaders after Reset() has been called
|
// for dx8.0, need to release and recreate shaders after Reset() has been called
|
||||||
if(stype==VertexShader)
|
if(stype==VertexShader)
|
||||||
hr = scrn.pD3DDevice->DeleteVertexShader(hShader);
|
hr = scrn.pD3DDevice->DeleteVertexShader(hShader);
|
||||||
else hr = scrn.pD3DDevice->DeletePixelShader(hShader);
|
else hr = scrn.pD3DDevice->DeletePixelShader(hShader);
|
||||||
if(FAILED(hr))
|
if(FAILED(hr))
|
||||||
dxgsg_cat.error() << "Delete"<< sh_typename<<"Shader failed!" << D3DERRORSTRING(hr);
|
dxgsg_cat.error() << "Delete"<< sh_typename<<"Shader failed!" << D3DERRORSTRING(hr);
|
||||||
hShader=NULL;
|
hShader=NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(hShader==NULL) {
|
if(hShader==NULL) {
|
||||||
// doing SetShader globally for testing purps. this really should be an object attribute
|
// doing SetShader globally for testing purps. this really should be an object attribute
|
||||||
// like current-texture is so it gets set and unset during traversal
|
// like current-texture is so it gets set and unset during traversal
|
||||||
@ -1007,7 +1008,7 @@ support_overlay_window(bool flag) {
|
|||||||
if (_overlay_windows_supported && !flag) {
|
if (_overlay_windows_supported && !flag) {
|
||||||
// Disable support for overlay windows.
|
// Disable support for overlay windows.
|
||||||
_overlay_windows_supported = false;
|
_overlay_windows_supported = false;
|
||||||
|
|
||||||
if (dx_full_screen) {
|
if (dx_full_screen) {
|
||||||
scrn.pddsPrimary->SetClipper(NULL);
|
scrn.pddsPrimary->SetClipper(NULL);
|
||||||
}
|
}
|
||||||
@ -1019,7 +1020,7 @@ support_overlay_window(bool flag) {
|
|||||||
if (dx_full_screen) {
|
if (dx_full_screen) {
|
||||||
// Create a Clipper object to blt the whole screen.
|
// Create a Clipper object to blt the whole screen.
|
||||||
LPDIRECTDRAWCLIPPER Clipper;
|
LPDIRECTDRAWCLIPPER Clipper;
|
||||||
|
|
||||||
if (scrn.pDD->CreateClipper(0, &Clipper, NULL) == DD_OK) {
|
if (scrn.pDD->CreateClipper(0, &Clipper, NULL) == DD_OK) {
|
||||||
Clipper->SetHWnd(0, scrn.hWnd);
|
Clipper->SetHWnd(0, scrn.hWnd);
|
||||||
scrn.pddsPrimary->SetClipper(Clipper);
|
scrn.pddsPrimary->SetClipper(Clipper);
|
||||||
@ -1234,15 +1235,15 @@ report_texmgr_stats() {
|
|||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
DDSCAPS2 ddsCaps;
|
DDSCAPS2 ddsCaps;
|
||||||
|
|
||||||
ZeroMemory(&ddsCaps,sizeof(ddsCaps));
|
ZeroMemory(&ddsCaps,sizeof(ddsCaps));
|
||||||
|
|
||||||
ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE;
|
ddsCaps.dwCaps = DDSCAPS_VIDEOMEMORY | DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE;
|
||||||
if(FAILED( hr = scrn.pD3DDevice->GetAvailableVidMem(&ddsCaps,&dwVidTotal,&dwVidFree))) {
|
if(FAILED( hr = scrn.pD3DDevice->GetAvailableVidMem(&ddsCaps,&dwVidTotal,&dwVidFree))) {
|
||||||
dxgsg_cat.debug() << "report_texmgr GetAvailableVidMem for VIDMEM failed : result = " << D3DERRORSTRING(hr);
|
dxgsg_cat.debug() << "report_texmgr GetAvailableVidMem for VIDMEM failed : result = " << D3DERRORSTRING(hr);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
ddsCaps.dwCaps = DDSCAPS_TEXTURE;
|
ddsCaps.dwCaps = DDSCAPS_TEXTURE;
|
||||||
if(FAILED( hr = scrn.pD3DDevice->GetAvailableVidMem(&ddsCaps,&dwTexTotal,&dwTexFree))) {
|
if(FAILED( hr = scrn.pD3DDevice->GetAvailableVidMem(&ddsCaps,&dwTexTotal,&dwTexFree))) {
|
||||||
dxgsg_cat.debug() << "report_texmgr GetAvailableVidMem for TEXTURE failed : result = " << D3DERRORSTRING(hr);
|
dxgsg_cat.debug() << "report_texmgr GetAvailableVidMem for TEXTURE failed : result = " << D3DERRORSTRING(hr);
|
||||||
@ -1297,7 +1298,7 @@ report_texmgr_stats() {
|
|||||||
char hitrate_str[20];
|
char hitrate_str[20];
|
||||||
float fHitRate = (pRStats->NumUsedInVidMem * 100.0f) / pRStats->NumUsed;
|
float fHitRate = (pRStats->NumUsedInVidMem * 100.0f) / pRStats->NumUsed;
|
||||||
sprintf(hitrate_str,"%.1f",fHitRate);
|
sprintf(hitrate_str,"%.1f",fHitRate);
|
||||||
|
|
||||||
dxgsg_cat.spam()
|
dxgsg_cat.spam()
|
||||||
<< "\n***** Stats for " << ResourceNameStrs[r] << " ********"
|
<< "\n***** Stats for " << ResourceNameStrs[r] << " ********"
|
||||||
<< "\n HitRate:\t" << hitrate_str << "%"
|
<< "\n HitRate:\t" << hitrate_str << "%"
|
||||||
@ -1326,7 +1327,7 @@ report_texmgr_stats() {
|
|||||||
dxgsg_cat.error() << "GetInfo(D3DVERTEXSTATS) failed : result = " << D3DERRORSTRING(hr);
|
dxgsg_cat.error() << "GetInfo(D3DVERTEXSTATS) failed : result = " << D3DERRORSTRING(hr);
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
dxgsg_cat.spam()
|
dxgsg_cat.spam()
|
||||||
<< "\n***** Triangle Stats ********"
|
<< "\n***** Triangle Stats ********"
|
||||||
<< "\n NumRenderedTriangles:\t" << vtxstats.NumRenderedTriangles
|
<< "\n NumRenderedTriangles:\t" << vtxstats.NumRenderedTriangles
|
||||||
<< "\n NumExtraClippingTriangles:\t" << vtxstats.NumExtraClippingTriangles << endl;
|
<< "\n NumExtraClippingTriangles:\t" << vtxstats.NumExtraClippingTriangles << endl;
|
||||||
@ -1379,7 +1380,7 @@ typedef enum {
|
|||||||
_pCurrentGeomContext->_PrimInfo.push_back(dpInfo); \
|
_pCurrentGeomContext->_PrimInfo.push_back(dpInfo); \
|
||||||
_pCurrentGeomContext->_num_verts+=dpInfo.nVerts; \
|
_pCurrentGeomContext->_num_verts+=dpInfo.nVerts; \
|
||||||
_pCurrentGeomContext->_pEndofVertData+=numVertBytes; }
|
_pCurrentGeomContext->_pEndofVertData+=numVertBytes; }
|
||||||
|
|
||||||
|
|
||||||
INLINE void DXGraphicsStateGuardian::
|
INLINE void DXGraphicsStateGuardian::
|
||||||
transform_color(Colorf &InColor,D3DCOLOR &OutRGBAColor) {
|
transform_color(Colorf &InColor,D3DCOLOR &OutRGBAColor) {
|
||||||
@ -1421,7 +1422,7 @@ draw_prim_setup(const Geom *geom) {
|
|||||||
}}
|
}}
|
||||||
|
|
||||||
////////
|
////////
|
||||||
|
|
||||||
// this stuff should eventually replace the iterators below
|
// this stuff should eventually replace the iterators below
|
||||||
PTA_Vertexf coords;
|
PTA_Vertexf coords;
|
||||||
PTA_ushort vindexes;
|
PTA_ushort vindexes;
|
||||||
@ -1468,7 +1469,7 @@ draw_prim_setup(const Geom *geom) {
|
|||||||
_perVertex &= ~PER_COLOR;
|
_perVertex &= ~PER_COLOR;
|
||||||
_perPrim &= ~PER_COLOR;
|
_perPrim &= ~PER_COLOR;
|
||||||
_perComp &= ~PER_COLOR;
|
_perComp &= ~PER_COLOR;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (geom->get_binding(G_NORMAL) != G_OFF) {
|
if (geom->get_binding(G_NORMAL) != G_OFF) {
|
||||||
@ -1507,7 +1508,7 @@ draw_prim_setup(const Geom *geom) {
|
|||||||
|
|
||||||
// Note on fogging:
|
// Note on fogging:
|
||||||
// the fogging expression should really be || (_fog_enabled && (_doFogType==PerVertexFog))
|
// the fogging expression should really be || (_fog_enabled && (_doFogType==PerVertexFog))
|
||||||
// instead of just || (_fog_enabled), since GOURAUD shading should not be required for PerPixel
|
// instead of just || (_fog_enabled), since GOURAUD shading should not be required for PerPixel
|
||||||
// fog, but the problem is some cards (Riva128,Matrox G200) emulate pixel fog with table fog
|
// fog, but the problem is some cards (Riva128,Matrox G200) emulate pixel fog with table fog
|
||||||
// but dont force the shading mode to gouraud internally, so you end up with flat-shaded fog colors
|
// but dont force the shading mode to gouraud internally, so you end up with flat-shaded fog colors
|
||||||
// (note, TNT does the right thing tho). So I guess we must do gouraud shading for all fog rendering for now
|
// (note, TNT does the right thing tho). So I guess we must do gouraud shading for all fog rendering for now
|
||||||
@ -1533,7 +1534,7 @@ draw_prim_inner_loop(int nVerts, const Geom *geom, ushort perFlags) {
|
|||||||
|
|
||||||
for(;nVerts > 0;nVerts--) {
|
for(;nVerts > 0;nVerts--) {
|
||||||
// coord info will always be _perVertex
|
// coord info will always be _perVertex
|
||||||
GET_NEXT_VERTEX(NextVert); // need to optimize these
|
GET_NEXT_VERTEX(NextVert); // need to optimize these
|
||||||
add_to_FVFBuf((void *)&NextVert, 3*sizeof(float));
|
add_to_FVFBuf((void *)&NextVert, 3*sizeof(float));
|
||||||
|
|
||||||
if(perFlags==(ushort)TexCoordOnly) {
|
if(perFlags==(ushort)TexCoordOnly) {
|
||||||
@ -1578,7 +1579,7 @@ draw_prim_inner_loop(int nVerts, const Geom *geom, ushort perFlags) {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void DXGraphicsStateGuardian::
|
void DXGraphicsStateGuardian::
|
||||||
draw_prim_inner_loop_coordtexonly(int nVerts, const Geom *geom) {
|
draw_prim_inner_loop_coordtexonly(int nVerts, const Geom *geom) {
|
||||||
// assumes coord and texcoord data is per-vertex,
|
// assumes coord and texcoord data is per-vertex,
|
||||||
// color is not per-vert/component (which would require fetching new vals in the vertex loop),
|
// color is not per-vert/component (which would require fetching new vals in the vertex loop),
|
||||||
// and no normal data. this should be common situation for animated character data
|
// and no normal data. this should be common situation for animated character data
|
||||||
// inc'ing local ptrs instead of member ones, seems to optimize better
|
// inc'ing local ptrs instead of member ones, seems to optimize better
|
||||||
@ -1606,7 +1607,7 @@ draw_prim_inner_loop_coordtexonly(int nVerts, const Geom *geom) {
|
|||||||
for(;nVerts>0;nVerts--) {
|
for(;nVerts>0;nVerts--) {
|
||||||
if(bDoIndexedCoords) {
|
if(bDoIndexedCoords) {
|
||||||
memcpy(pLocalFvfBufPtr,(void*)&_coord_array[*pCurCoordIndex],3*sizeof(float));
|
memcpy(pLocalFvfBufPtr,(void*)&_coord_array[*pCurCoordIndex],3*sizeof(float));
|
||||||
pCurCoordIndex++;
|
pCurCoordIndex++;
|
||||||
} else {
|
} else {
|
||||||
memcpy(pLocalFvfBufPtr,(void*)pCurCoord,3*sizeof(float));
|
memcpy(pLocalFvfBufPtr,(void*)pCurCoord,3*sizeof(float));
|
||||||
pCurCoord++;
|
pCurCoord++;
|
||||||
@ -1645,10 +1646,10 @@ draw_point(GeomPoint *geom, GeomContext *gc) {
|
|||||||
#ifdef GSG_VERBOSE
|
#ifdef GSG_VERBOSE
|
||||||
dxgsg_cat.debug() << "draw_point()" << endl;
|
dxgsg_cat.debug() << "draw_point()" << endl;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
DO_PSTATS_STUFF(PStatTimer timer(_draw_primitive_pcollector));
|
DO_PSTATS_STUFF(PStatTimer timer(_draw_primitive_pcollector));
|
||||||
DO_PSTATS_STUFF(_vertices_other_pcollector.add_level(geom->get_num_vertices()));
|
DO_PSTATS_STUFF(_vertices_other_pcollector.add_level(geom->get_num_vertices()));
|
||||||
|
|
||||||
// The DX Way
|
// The DX Way
|
||||||
|
|
||||||
int nPrims = geom->get_num_prims();
|
int nPrims = geom->get_num_prims();
|
||||||
@ -1685,7 +1686,7 @@ draw_point(GeomPoint *geom, GeomContext *gc) {
|
|||||||
// need to add code to handle fully indexed mode (and handle cases with index arrays of different lengths,
|
// need to add code to handle fully indexed mode (and handle cases with index arrays of different lengths,
|
||||||
// values (may only be possible to handle certain cases without reverting to old pipeline)
|
// values (may only be possible to handle certain cases without reverting to old pipeline)
|
||||||
|
|
||||||
_perVertex = 0x0;
|
_perVertex = 0x0;
|
||||||
_perPrim = 0;
|
_perPrim = 0;
|
||||||
if (geom->get_binding(G_NORMAL) == G_PER_VERTEX) _perVertex |= PER_NORMAL;
|
if (geom->get_binding(G_NORMAL) == G_PER_VERTEX) _perVertex |= PER_NORMAL;
|
||||||
if (geom->get_binding(G_COLOR) == G_PER_VERTEX) _perVertex |= PER_COLOR;
|
if (geom->get_binding(G_COLOR) == G_PER_VERTEX) _perVertex |= PER_COLOR;
|
||||||
@ -1705,7 +1706,7 @@ draw_point(GeomPoint *geom, GeomContext *gc) {
|
|||||||
} else {
|
} else {
|
||||||
COPYVERTDATA_2_VERTEXBUFFER(D3DPT_POINTLIST,nPrims);
|
COPYVERTDATA_2_VERTEXBUFFER(D3DPT_POINTLIST,nPrims);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
_pCurFvfBufPtr = NULL;
|
_pCurFvfBufPtr = NULL;
|
||||||
}
|
}
|
||||||
@ -1923,7 +1924,7 @@ draw_linestrip_base(Geom* geom, GeomContext *gc, bool bConnectEnds) {
|
|||||||
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,nVerts,0);
|
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,nVerts,0);
|
||||||
} else {
|
} else {
|
||||||
COPYVERTDATA_2_VERTEXBUFFER(D3DPT_LINESTRIP,nVerts);
|
COPYVERTDATA_2_VERTEXBUFFER(D3DPT_LINESTRIP,nVerts);
|
||||||
}
|
}
|
||||||
|
|
||||||
_pCurFvfBufPtr = NULL;
|
_pCurFvfBufPtr = NULL;
|
||||||
}
|
}
|
||||||
@ -2036,7 +2037,7 @@ draw_sprite(GeomSprite *geom, GeomContext *gc) {
|
|||||||
float tex_right = geom->get_ur_uv()[0];
|
float tex_right = geom->get_ur_uv()[0];
|
||||||
float tex_bottom = geom->get_ll_uv()[1];
|
float tex_bottom = geom->get_ll_uv()[1];
|
||||||
float tex_top = geom->get_ur_uv()[1];
|
float tex_top = geom->get_ur_uv()[1];
|
||||||
|
|
||||||
float half_width = 0.5f * tex_xsize * fabs(tex_right - tex_left);
|
float half_width = 0.5f * tex_xsize * fabs(tex_right - tex_left);
|
||||||
float half_height = 0.5f * tex_ysize * fabs(tex_top - tex_bottom);
|
float half_height = 0.5f * tex_ysize * fabs(tex_top - tex_bottom);
|
||||||
float scaled_width, scaled_height;
|
float scaled_width, scaled_height;
|
||||||
@ -2159,7 +2160,7 @@ draw_sprite(GeomSprite *geom, GeomContext *gc) {
|
|||||||
|
|
||||||
// disabling dither for alpha particle-systems.
|
// disabling dither for alpha particle-systems.
|
||||||
// ATI sez: most applications ignore the fact that since alpha blended primitives
|
// ATI sez: most applications ignore the fact that since alpha blended primitives
|
||||||
// combine the data in the frame buffer with the data in the current pixel, pixels
|
// combine the data in the frame buffer with the data in the current pixel, pixels
|
||||||
// can be dithered multiple times and accentuate the dither pattern. This is particularly
|
// can be dithered multiple times and accentuate the dither pattern. This is particularly
|
||||||
// true in particle systems which rely on the cumulative visual effect of many overlapping
|
// true in particle systems which rely on the cumulative visual effect of many overlapping
|
||||||
// alpha blended primitives.
|
// alpha blended primitives.
|
||||||
@ -2181,8 +2182,8 @@ draw_sprite(GeomSprite *geom, GeomContext *gc) {
|
|||||||
|
|
||||||
D3DCOLOR CurColor;
|
D3DCOLOR CurColor;
|
||||||
DWORD FVFType = D3DFVF_XYZ | (D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE2(0)) | D3DFVF_DIFFUSE;
|
DWORD FVFType = D3DFVF_XYZ | (D3DFVF_TEX1 | D3DFVF_TEXCOORDSIZE2(0)) | D3DFVF_DIFFUSE;
|
||||||
DWORD vertex_size = sizeof(float) * 2 + sizeof(float) * 3 + sizeof(D3DCOLOR);
|
DWORD vertex_size = sizeof(float) * 2 + sizeof(float) * 3 + sizeof(D3DCOLOR);
|
||||||
|
|
||||||
if (color_overall) {
|
if (color_overall) {
|
||||||
GET_NEXT_COLOR();
|
GET_NEXT_COLOR();
|
||||||
CurColor = _curD3Dcolor;
|
CurColor = _curD3Dcolor;
|
||||||
@ -2274,8 +2275,8 @@ draw_sprite(GeomSprite *geom, GeomContext *gc) {
|
|||||||
|
|
||||||
// if flat shading, dont need to write color for middle vtx, just incr ptr
|
// if flat shading, dont need to write color for middle vtx, just incr ptr
|
||||||
if(bUseGouraudShadedColor)
|
if(bUseGouraudShadedColor)
|
||||||
*((DWORD *)_pCurFvfBufPtr) = (DWORD) CurColor;
|
*((DWORD *)_pCurFvfBufPtr) = (DWORD) CurColor;
|
||||||
_pCurFvfBufPtr += sizeof(D3DCOLOR);
|
_pCurFvfBufPtr += sizeof(D3DCOLOR);
|
||||||
|
|
||||||
add_to_FVFBuf((void *)TexCrdSets[1], sizeof(float)*2);
|
add_to_FVFBuf((void *)TexCrdSets[1], sizeof(float)*2);
|
||||||
|
|
||||||
@ -2284,7 +2285,7 @@ draw_sprite(GeomSprite *geom, GeomContext *gc) {
|
|||||||
add_to_FVFBuf((void *)ul.get_data(), 3*sizeof(float));
|
add_to_FVFBuf((void *)ul.get_data(), 3*sizeof(float));
|
||||||
// if flat shading, dont need to write color for middle vtx, just incr ptr
|
// if flat shading, dont need to write color for middle vtx, just incr ptr
|
||||||
if(bUseGouraudShadedColor)
|
if(bUseGouraudShadedColor)
|
||||||
*((DWORD *)_pCurFvfBufPtr) = (DWORD) CurColor;
|
*((DWORD *)_pCurFvfBufPtr) = (DWORD) CurColor;
|
||||||
_pCurFvfBufPtr += sizeof(D3DCOLOR);
|
_pCurFvfBufPtr += sizeof(D3DCOLOR);
|
||||||
add_to_FVFBuf((void *)TexCrdSets[2], sizeof(float)*2);
|
add_to_FVFBuf((void *)TexCrdSets[2], sizeof(float)*2);
|
||||||
|
|
||||||
@ -2307,7 +2308,7 @@ draw_sprite(GeomSprite *geom, GeomContext *gc) {
|
|||||||
// cant do tristrip/fan since multiple quads arent connected
|
// cant do tristrip/fan since multiple quads arent connected
|
||||||
// best we can do is indexed primitive, which sends 2 redundant indices instead of sending 2 redundant full verts
|
// best we can do is indexed primitive, which sends 2 redundant indices instead of sending 2 redundant full verts
|
||||||
HRESULT hr = scrn.pD3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, // start index in array
|
HRESULT hr = scrn.pD3DDevice->DrawIndexedPrimitiveUP(D3DPT_TRIANGLELIST, 0, // start index in array
|
||||||
nVerts, numTris,
|
nVerts, numTris,
|
||||||
_index_buf, D3DFMT_INDEX16,
|
_index_buf, D3DFMT_INDEX16,
|
||||||
_pFvfBufBasePtr, vertex_size);
|
_pFvfBufBasePtr, vertex_size);
|
||||||
TestDrawPrimFailure(DrawIndexedPrim,hr,scrn.pD3DDevice,QUADVERTLISTLEN*nPrims,numTris);
|
TestDrawPrimFailure(DrawIndexedPrim,hr,scrn.pD3DDevice,QUADVERTLISTLEN*nPrims,numTris);
|
||||||
@ -2387,7 +2388,7 @@ draw_tri(GeomTri *geom, GeomContext *gc) {
|
|||||||
DO_PSTATS_STUFF(_vertices_tri_pcollector.add_level(geom->get_num_vertices()));
|
DO_PSTATS_STUFF(_vertices_tri_pcollector.add_level(geom->get_num_vertices()));
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
if (_pCurTexContext!=NULL) {
|
if (_pCurTexContext!=NULL) {
|
||||||
dxgsg_cat.spam() << "Cur active DX texture: " << _pCurTexContext->_tex->get_name() << "\n";
|
dxgsg_cat.spam() << "Cur active DX texture: " << _pCurTexContext->_tex->get_name() << "\n";
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -2410,7 +2411,7 @@ draw_tri(GeomTri *geom, GeomContext *gc) {
|
|||||||
geom->get_normals(norms,NormalBinding,nindexes);
|
geom->get_normals(norms,NormalBinding,nindexes);
|
||||||
geom->get_colors(colors,ColorBinding,cindexes);
|
geom->get_colors(colors,ColorBinding,cindexes);
|
||||||
geom->get_texcoords(texcoords,TexCoordBinding,tindexes);
|
geom->get_texcoords(texcoords,TexCoordBinding,tindexes);
|
||||||
|
|
||||||
// this is the old geom setup, it reformats every vtx into an output array passed to d3d
|
// this is the old geom setup, it reformats every vtx into an output array passed to d3d
|
||||||
|
|
||||||
_perVertex = 0x0;
|
_perVertex = 0x0;
|
||||||
@ -2425,22 +2426,22 @@ draw_tri(GeomTri *geom, GeomContext *gc) {
|
|||||||
bool bPerPrimColor=(ColorBinding == G_PER_PRIM);
|
bool bPerPrimColor=(ColorBinding == G_PER_PRIM);
|
||||||
if(bPerPrimColor)
|
if(bPerPrimColor)
|
||||||
_perPrim = PER_COLOR;
|
_perPrim = PER_COLOR;
|
||||||
else if(ColorBinding == G_PER_VERTEX)
|
else if(ColorBinding == G_PER_VERTEX)
|
||||||
_perVertex = PER_COLOR;
|
_perVertex = PER_COLOR;
|
||||||
|
|
||||||
if(bUseTexCoordOnlyLoop) {
|
if(bUseTexCoordOnlyLoop) {
|
||||||
_perVertex |= PER_TEXCOORD; // TexCoords are either G_OFF or G_PER_VERTEX
|
_perVertex |= PER_TEXCOORD; // TexCoords are either G_OFF or G_PER_VERTEX
|
||||||
} else {
|
} else {
|
||||||
if(NormalBinding == G_PER_VERTEX)
|
if(NormalBinding == G_PER_VERTEX)
|
||||||
_perVertex |= PER_NORMAL;
|
_perVertex |= PER_NORMAL;
|
||||||
else if(NormalBinding == G_PER_PRIM)
|
else if(NormalBinding == G_PER_PRIM)
|
||||||
_perPrim |= PER_NORMAL;
|
_perPrim |= PER_NORMAL;
|
||||||
|
|
||||||
bPerPrimNormal=((_perPrim & PER_NORMAL)!=0);
|
bPerPrimNormal=((_perPrim & PER_NORMAL)!=0);
|
||||||
|
|
||||||
if(TexCoordBinding == G_PER_VERTEX)
|
if(TexCoordBinding == G_PER_VERTEX)
|
||||||
_perVertex |= PER_TEXCOORD;
|
_perVertex |= PER_TEXCOORD;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t vertex_size = draw_prim_setup(geom);
|
size_t vertex_size = draw_prim_setup(geom);
|
||||||
|
|
||||||
@ -2456,7 +2457,7 @@ draw_tri(GeomTri *geom, GeomContext *gc) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(bUseTexCoordOnlyLoop) {
|
if(bUseTexCoordOnlyLoop) {
|
||||||
draw_prim_inner_loop_coordtexonly(3, geom);
|
draw_prim_inner_loop_coordtexonly(3, geom);
|
||||||
} else {
|
} else {
|
||||||
if(bPerPrimNormal)
|
if(bPerPrimNormal)
|
||||||
p_normal = geom->get_next_normal(ni); // set primitive normal if there is one.
|
p_normal = geom->get_next_normal(ni); // set primitive normal if there is one.
|
||||||
@ -2610,7 +2611,7 @@ draw_multitri(Geom *geom, D3DPRIMITIVETYPE trilisttype) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
bPerPrimNormal=((_perPrim & PER_NORMAL)!=0);
|
bPerPrimNormal=((_perPrim & PER_NORMAL)!=0);
|
||||||
|
|
||||||
if (TexCoordBinding == G_PER_VERTEX)
|
if (TexCoordBinding == G_PER_VERTEX)
|
||||||
_perVertex |= PER_TEXCOORD;
|
_perVertex |= PER_TEXCOORD;
|
||||||
@ -2630,7 +2631,7 @@ draw_multitri(Geom *geom, D3DPRIMITIVETYPE trilisttype) {
|
|||||||
|
|
||||||
if(pLengthArr!=NULL) {
|
if(pLengthArr!=NULL) {
|
||||||
nVerts = *(pLengthArr++);
|
nVerts = *(pLengthArr++);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(bPerPrimColor) { // remember color might be G_OVERALL too!
|
if(bPerPrimColor) { // remember color might be G_OVERALL too!
|
||||||
GET_NEXT_COLOR();
|
GET_NEXT_COLOR();
|
||||||
@ -2644,8 +2645,8 @@ draw_multitri(Geom *geom, D3DPRIMITIVETYPE trilisttype) {
|
|||||||
_pCurFvfBufPtr = _pFvfBufBasePtr; // _pCurFvfBufPtr changes, _pFvfBufBasePtr doesn't
|
_pCurFvfBufPtr = _pFvfBufBasePtr; // _pCurFvfBufPtr changes, _pFvfBufBasePtr doesn't
|
||||||
|
|
||||||
if(_perComp==0x0) {
|
if(_perComp==0x0) {
|
||||||
if(bUseTexCoordOnlyLoop) {
|
if(bUseTexCoordOnlyLoop) {
|
||||||
draw_prim_inner_loop_coordtexonly(nVerts, geom);
|
draw_prim_inner_loop_coordtexonly(nVerts, geom);
|
||||||
} else {
|
} else {
|
||||||
if (bPerPrimNormal)
|
if (bPerPrimNormal)
|
||||||
p_normal = geom->get_next_normal(ni); // set primitive normal if there is one.
|
p_normal = geom->get_next_normal(ni); // set primitive normal if there is one.
|
||||||
@ -2657,7 +2658,7 @@ draw_multitri(Geom *geom, D3DPRIMITIVETYPE trilisttype) {
|
|||||||
p_normal = geom->get_next_normal(ni); // set primitive normal if there is one.
|
p_normal = geom->get_next_normal(ni); // set primitive normal if there is one.
|
||||||
|
|
||||||
if(bIsTriList) {
|
if(bIsTriList) {
|
||||||
// in flat shade mode, D3D strips color using the 1st vertex.
|
// in flat shade mode, D3D strips color using the 1st vertex.
|
||||||
// (note: differs from OGL, which always uses last vtx for strips&fans
|
// (note: differs from OGL, which always uses last vtx for strips&fans
|
||||||
|
|
||||||
// Store all but last 2 verts
|
// Store all but last 2 verts
|
||||||
@ -2666,7 +2667,7 @@ draw_multitri(Geom *geom, D3DPRIMITIVETYPE trilisttype) {
|
|||||||
// _perComp attribs should not be fetched for last 2 verts
|
// _perComp attribs should not be fetched for last 2 verts
|
||||||
draw_prim_inner_loop(2, geom, _perVertex);
|
draw_prim_inner_loop(2, geom, _perVertex);
|
||||||
} else {
|
} else {
|
||||||
// in flat shade mode, D3D fans color using the 2nd vertex.
|
// in flat shade mode, D3D fans color using the 2nd vertex.
|
||||||
// (note: differs from OGL, which always uses last vtx for strips&fans
|
// (note: differs from OGL, which always uses last vtx for strips&fans
|
||||||
// _perComp attribs should not be fetched for first & last verts, they will
|
// _perComp attribs should not be fetched for first & last verts, they will
|
||||||
// be associated with middle n-2 verts
|
// be associated with middle n-2 verts
|
||||||
@ -2685,7 +2686,7 @@ draw_multitri(Geom *geom, D3DPRIMITIVETYPE trilisttype) {
|
|||||||
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,nVerts,numTris);
|
TestDrawPrimFailure(DrawPrim,hr,scrn.pD3DDevice,nVerts,numTris);
|
||||||
} else {
|
} else {
|
||||||
COPYVERTDATA_2_VERTEXBUFFER(trilisttype,nVerts);
|
COPYVERTDATA_2_VERTEXBUFFER(trilisttype,nVerts);
|
||||||
}
|
}
|
||||||
|
|
||||||
_pCurFvfBufPtr = NULL;
|
_pCurFvfBufPtr = NULL;
|
||||||
}
|
}
|
||||||
@ -3071,7 +3072,7 @@ apply_texture(TextureContext *tc) {
|
|||||||
|
|
||||||
if (dirty) {
|
if (dirty) {
|
||||||
// If the texture image has changed, or if its use of mipmaps has
|
// If the texture image has changed, or if its use of mipmaps has
|
||||||
// changed, we need to re-create the image. Ignore other types of
|
// changed, we need to re-create the image. Ignore other types of
|
||||||
// changes, which arent significant for dx
|
// changes, which arent significant for dx
|
||||||
|
|
||||||
if((dirty & (Texture::DF_image | Texture::DF_mipmap)) != 0) {
|
if((dirty & (Texture::DF_image | Texture::DF_mipmap)) != 0) {
|
||||||
@ -3082,13 +3083,13 @@ apply_texture(TextureContext *tc) {
|
|||||||
dxgsg_cat.warning()
|
dxgsg_cat.warning()
|
||||||
<< "Texture " << *dtc->_texture << " has changed mipmap state.\n";
|
<< "Texture " << *dtc->_texture << " has changed mipmap state.\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
dtc->DeleteTexture();
|
dtc->DeleteTexture();
|
||||||
if (dtc->CreateTexture(scrn) == NULL) {
|
if (dtc->CreateTexture(scrn) == NULL) {
|
||||||
|
|
||||||
// Oops, we can't re-create the texture for some reason.
|
// Oops, we can't re-create the texture for some reason.
|
||||||
dxgsg_cat.error() << "Unable to re-create texture " << *dtc->_texture << endl;
|
dxgsg_cat.error() << "Unable to re-create texture " << *dtc->_texture << endl;
|
||||||
|
|
||||||
release_texture(dtc);
|
release_texture(dtc);
|
||||||
enable_texturing(false);
|
enable_texturing(false);
|
||||||
return;
|
return;
|
||||||
@ -3395,7 +3396,7 @@ copy_pixel_buffer(PixelBuffer *pb, const DisplayRegion *dr) {
|
|||||||
TmpSurfYsize=RECT_YSIZE(minfo.rcMonitor);
|
TmpSurfYsize=RECT_YSIZE(minfo.rcMonitor);
|
||||||
|
|
||||||
// set SrcCopyRect to client area of window in scrn coords
|
// set SrcCopyRect to client area of window in scrn coords
|
||||||
GetClientRect( scrn.hWnd, &SrcCopyRect);
|
GetClientRect( scrn.hWnd, &SrcCopyRect);
|
||||||
ClientToScreen( scrn.hWnd, (POINT*)&SrcCopyRect.left );
|
ClientToScreen( scrn.hWnd, (POINT*)&SrcCopyRect.left );
|
||||||
ClientToScreen( scrn.hWnd, (POINT*)&SrcCopyRect.right );
|
ClientToScreen( scrn.hWnd, (POINT*)&SrcCopyRect.right );
|
||||||
} else {
|
} else {
|
||||||
@ -3406,15 +3407,15 @@ copy_pixel_buffer(PixelBuffer *pb, const DisplayRegion *dr) {
|
|||||||
SrcCopyRect.right=TmpSurfXsize;
|
SrcCopyRect.right=TmpSurfXsize;
|
||||||
SrcCopyRect.bottom=TmpSurfYsize;
|
SrcCopyRect.bottom=TmpSurfYsize;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr=scrn.pD3DDevice->CreateImageSurface(TmpSurfXsize,TmpSurfYsize,D3DFMT_A8R8G8B8,&pD3DSurf);
|
hr=scrn.pD3DDevice->CreateImageSurface(TmpSurfXsize,TmpSurfYsize,D3DFMT_A8R8G8B8,&pD3DSurf);
|
||||||
if(FAILED(hr)) {
|
if(FAILED(hr)) {
|
||||||
dxgsg_cat.error() << "CreateImageSurface failed in copy_pixel_buffer()" << D3DERRORSTRING(hr);
|
dxgsg_cat.error() << "CreateImageSurface failed in copy_pixel_buffer()" << D3DERRORSTRING(hr);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
hr=scrn.pD3DDevice->GetFrontBuffer(pD3DSurf);
|
hr=scrn.pD3DDevice->GetFrontBuffer(pD3DSurf);
|
||||||
|
|
||||||
if(hr==D3DERR_DEVICELOST) {
|
if(hr==D3DERR_DEVICELOST) {
|
||||||
// dont necessary want to exit in this case
|
// dont necessary want to exit in this case
|
||||||
pD3DSurf->Release();
|
pD3DSurf->Release();
|
||||||
@ -3644,9 +3645,9 @@ issue_transform(const TransformState *transform) {
|
|||||||
// so need to reset this vshader 'constant' every time view matrix changes
|
// so need to reset this vshader 'constant' every time view matrix changes
|
||||||
HRESULT hr = scrn.pD3DDevice->SetVertexShaderConstant(VSHADER_XFORMMATRIX_CONSTANTREGNUMSTART, pMat, 4);
|
HRESULT hr = scrn.pD3DDevice->SetVertexShaderConstant(VSHADER_XFORMMATRIX_CONSTANTREGNUMSTART, pMat, 4);
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
if(FAILED(hr)) {
|
if(FAILED(hr)) {
|
||||||
dxgsg_cat.error() << "SetVertexShader failed" << D3DERRORSTRING(hr);
|
dxgsg_cat.error() << "SetVertexShader failed" << D3DERRORSTRING(hr);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
@ -3856,19 +3857,19 @@ bind_light(PointLight *light, int light_id) {
|
|||||||
alight.Diffuse = *(D3DCOLORVALUE *)(light->get_color().get_data());
|
alight.Diffuse = *(D3DCOLORVALUE *)(light->get_color().get_data());
|
||||||
alight.Ambient = black ;
|
alight.Ambient = black ;
|
||||||
alight.Specular = *(D3DCOLORVALUE *)(light->get_specular_color().get_data());
|
alight.Specular = *(D3DCOLORVALUE *)(light->get_specular_color().get_data());
|
||||||
|
|
||||||
// Position needs to specify x, y, z, and w
|
// Position needs to specify x, y, z, and w
|
||||||
// w == 1 implies non-infinite position
|
// w == 1 implies non-infinite position
|
||||||
alight.Position = *(D3DVECTOR *)pos.get_data();
|
alight.Position = *(D3DVECTOR *)pos.get_data();
|
||||||
|
|
||||||
alight.Range = __D3DLIGHT_RANGE_MAX;
|
alight.Range = __D3DLIGHT_RANGE_MAX;
|
||||||
alight.Falloff = 1.0f;
|
alight.Falloff = 1.0f;
|
||||||
|
|
||||||
const LVecBase3f &att = light->get_attenuation();
|
const LVecBase3f &att = light->get_attenuation();
|
||||||
alight.Attenuation0 = att[0];
|
alight.Attenuation0 = att[0];
|
||||||
alight.Attenuation1 = att[1];
|
alight.Attenuation1 = att[1];
|
||||||
alight.Attenuation2 = att[2];
|
alight.Attenuation2 = att[2];
|
||||||
|
|
||||||
HRESULT res = scrn.pD3DDevice->SetLight(light_id, &alight);
|
HRESULT res = scrn.pD3DDevice->SetLight(light_id, &alight);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3900,16 +3901,16 @@ bind_light(DirectionalLight *light, int light_id) {
|
|||||||
alight.Diffuse = *(D3DCOLORVALUE *)(light->get_color().get_data());
|
alight.Diffuse = *(D3DCOLORVALUE *)(light->get_color().get_data());
|
||||||
alight.Ambient = black ;
|
alight.Ambient = black ;
|
||||||
alight.Specular = *(D3DCOLORVALUE *)(light->get_specular_color().get_data());
|
alight.Specular = *(D3DCOLORVALUE *)(light->get_specular_color().get_data());
|
||||||
|
|
||||||
alight.Direction = *(D3DVECTOR *)dir.get_data();
|
alight.Direction = *(D3DVECTOR *)dir.get_data();
|
||||||
|
|
||||||
alight.Range = __D3DLIGHT_RANGE_MAX;
|
alight.Range = __D3DLIGHT_RANGE_MAX;
|
||||||
alight.Falloff = 1.0f;
|
alight.Falloff = 1.0f;
|
||||||
|
|
||||||
alight.Attenuation0 = 1.0f; // constant
|
alight.Attenuation0 = 1.0f; // constant
|
||||||
alight.Attenuation1 = 0.0f; // linear
|
alight.Attenuation1 = 0.0f; // linear
|
||||||
alight.Attenuation2 = 0.0f; // quadratic
|
alight.Attenuation2 = 0.0f; // quadratic
|
||||||
|
|
||||||
HRESULT res = scrn.pD3DDevice->SetLight(light_id, &alight);
|
HRESULT res = scrn.pD3DDevice->SetLight(light_id, &alight);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3937,32 +3938,32 @@ bind_light(Spotlight *light, int light_id) {
|
|||||||
|
|
||||||
D3DCOLORVALUE black;
|
D3DCOLORVALUE black;
|
||||||
black.r = black.g = black.b = black.a = 0.0f;
|
black.r = black.g = black.b = black.a = 0.0f;
|
||||||
|
|
||||||
D3DLIGHT8 alight;
|
D3DLIGHT8 alight;
|
||||||
ZeroMemory(&alight, sizeof(D3DLIGHT8));
|
ZeroMemory(&alight, sizeof(D3DLIGHT8));
|
||||||
|
|
||||||
alight.Type = D3DLIGHT_SPOT;
|
alight.Type = D3DLIGHT_SPOT;
|
||||||
alight.Ambient = black ;
|
alight.Ambient = black ;
|
||||||
alight.Diffuse = *(D3DCOLORVALUE *)(light->get_color().get_data());
|
alight.Diffuse = *(D3DCOLORVALUE *)(light->get_color().get_data());
|
||||||
alight.Specular = *(D3DCOLORVALUE *)(light->get_specular_color().get_data());
|
alight.Specular = *(D3DCOLORVALUE *)(light->get_specular_color().get_data());
|
||||||
|
|
||||||
alight.Position = *(D3DVECTOR *)pos.get_data();
|
alight.Position = *(D3DVECTOR *)pos.get_data();
|
||||||
|
|
||||||
alight.Direction = *(D3DVECTOR *)dir.get_data();
|
alight.Direction = *(D3DVECTOR *)dir.get_data();
|
||||||
|
|
||||||
alight.Range = __D3DLIGHT_RANGE_MAX;
|
alight.Range = __D3DLIGHT_RANGE_MAX;
|
||||||
alight.Falloff = 1.0f;
|
alight.Falloff = 1.0f;
|
||||||
alight.Theta = 0.0f;
|
alight.Theta = 0.0f;
|
||||||
alight.Phi = lens->get_hfov();
|
alight.Phi = lens->get_hfov();
|
||||||
|
|
||||||
const LVecBase3f &att = light->get_attenuation();
|
const LVecBase3f &att = light->get_attenuation();
|
||||||
alight.Attenuation0 = att[0];
|
alight.Attenuation0 = att[0];
|
||||||
alight.Attenuation1 = att[1];
|
alight.Attenuation1 = att[1];
|
||||||
alight.Attenuation2 = att[2];
|
alight.Attenuation2 = att[2];
|
||||||
|
|
||||||
HRESULT res = scrn.pD3DDevice->SetLight(light_id, &alight);
|
HRESULT res = scrn.pD3DDevice->SetLight(light_id, &alight);
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: DXGraphicsStateGuardian::begin_frame
|
// Function: DXGraphicsStateGuardian::begin_frame
|
||||||
// Access: Public, Virtual
|
// Access: Public, Virtual
|
||||||
@ -3998,8 +3999,6 @@ begin_frame() {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void DXGraphicsStateGuardian::
|
void DXGraphicsStateGuardian::
|
||||||
end_frame() {
|
end_frame() {
|
||||||
GraphicsStateGuardian::end_frame();
|
|
||||||
|
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
if(_bShowFPSMeter) {
|
if(_bShowFPSMeter) {
|
||||||
@ -4015,16 +4014,16 @@ end_frame() {
|
|||||||
|
|
||||||
// usually only want to call BeginText() & EndText() once/frame
|
// usually only want to call BeginText() & EndText() once/frame
|
||||||
// to bracket all the text for a given cd3dfont obj
|
// to bracket all the text for a given cd3dfont obj
|
||||||
hr=_pStatMeterFont->BeginText();
|
hr=_pStatMeterFont->BeginText();
|
||||||
if(SUCCEEDED(hr))
|
if(SUCCEEDED(hr))
|
||||||
hr=_pStatMeterFont->DrawText(_fpsmeter_x_offset, _fpsmeter_y_offset, fontColor, fps_msg);
|
hr=_pStatMeterFont->DrawText(_fpsmeter_x_offset, _fpsmeter_y_offset, fontColor, fps_msg);
|
||||||
if(SUCCEEDED(hr))
|
if(SUCCEEDED(hr))
|
||||||
hr=_pStatMeterFont->EndText();
|
hr=_pStatMeterFont->EndText();
|
||||||
if(FAILED(hr))
|
if(FAILED(hr))
|
||||||
_bShowFPSMeter=false;
|
_bShowFPSMeter=false;
|
||||||
}
|
}
|
||||||
|
|
||||||
hr = scrn.pD3DDevice->EndScene();
|
hr = scrn.pD3DDevice->EndScene();
|
||||||
|
|
||||||
// any GDI operations MUST occur after EndScene
|
// any GDI operations MUST occur after EndScene
|
||||||
|
|
||||||
@ -4093,7 +4092,7 @@ end_frame() {
|
|||||||
<< "\n Avg Verts/frame:\t" << verts_per_frame
|
<< "\n Avg Verts/frame:\t" << verts_per_frame
|
||||||
<< "\n Avg Tris/frame:\t" << tris_per_frame
|
<< "\n Avg Tris/frame:\t" << tris_per_frame
|
||||||
<< "\n Avg DrawPrims/frm:\t" << DPs_per_frame
|
<< "\n Avg DrawPrims/frm:\t" << DPs_per_frame
|
||||||
<< "\n Avg Verts/DrawPrim:\t" << verts_per_DP
|
<< "\n Avg Verts/DrawPrim:\t" << verts_per_DP
|
||||||
<< "\n Avg DrawPrims w/no Texture Change from prev DrawPrim/frm:\t" << DPs_notexchange_per_frame
|
<< "\n Avg DrawPrims w/no Texture Change from prev DrawPrim/frm:\t" << DPs_notexchange_per_frame
|
||||||
<< "\n Avg Geoms/frm:\t" << Geoms_per_frame
|
<< "\n Avg Geoms/frm:\t" << Geoms_per_frame
|
||||||
<< "\n Avg DrawPrims/Geom:\t" << DrawPrims_per_Geom
|
<< "\n Avg DrawPrims/Geom:\t" << DrawPrims_per_Geom
|
||||||
@ -4109,7 +4108,7 @@ end_frame() {
|
|||||||
|
|
||||||
#if defined(DO_PSTATS)||defined(PRINT_RESOURCESTATS)
|
#if defined(DO_PSTATS)||defined(PRINT_RESOURCESTATS)
|
||||||
#ifndef PRINT_RESOURCESTATS
|
#ifndef PRINT_RESOURCESTATS
|
||||||
if (_texmgrmem_total_pcollector.is_active())
|
if (_texmgrmem_total_pcollector.is_active())
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
#define TICKS_PER_GETTEXINFO (2.5*1000) // 2.5 second interval
|
#define TICKS_PER_GETTEXINFO (2.5*1000) // 2.5 second interval
|
||||||
@ -4122,6 +4121,8 @@ end_frame() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
GraphicsStateGuardian::end_frame();
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -4291,7 +4292,7 @@ get_fog_mode_type(Fog::Mode m) const {
|
|||||||
switch (m) {
|
switch (m) {
|
||||||
case Fog::M_linear:
|
case Fog::M_linear:
|
||||||
return D3DFOG_LINEAR;
|
return D3DFOG_LINEAR;
|
||||||
case Fog::M_exponential:
|
case Fog::M_exponential:
|
||||||
return D3DFOG_EXP;
|
return D3DFOG_EXP;
|
||||||
case Fog::M_exponential_squared:
|
case Fog::M_exponential_squared:
|
||||||
return D3DFOG_EXP2;
|
return D3DFOG_EXP2;
|
||||||
@ -4323,7 +4324,7 @@ enable_lighting(bool enable) {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void DXGraphicsStateGuardian::
|
void DXGraphicsStateGuardian::
|
||||||
set_ambient_light(const Colorf &color) {
|
set_ambient_light(const Colorf &color) {
|
||||||
scrn.pD3DDevice->SetRenderState(D3DRS_AMBIENT,
|
scrn.pD3DDevice->SetRenderState(D3DRS_AMBIENT,
|
||||||
Colorf_to_D3DCOLOR(color));
|
Colorf_to_D3DCOLOR(color));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4427,7 +4428,7 @@ set_blend_mode(ColorWriteAttrib::Mode color_write_mode,
|
|||||||
|
|
||||||
if((color_write_mode == ColorWriteAttrib::M_off) && !scrn.bCanDirectDisableColorWrites) {
|
if((color_write_mode == ColorWriteAttrib::M_off) && !scrn.bCanDirectDisableColorWrites) {
|
||||||
// need !scrn.bCanDirectDisableColorWrites guard because other issue_colorblend,issue_transp
|
// need !scrn.bCanDirectDisableColorWrites guard because other issue_colorblend,issue_transp
|
||||||
// will come this way, and they should ignore the colorwriteattrib value since it's been
|
// will come this way, and they should ignore the colorwriteattrib value since it's been
|
||||||
// handled separately in set_color_writemask
|
// handled separately in set_color_writemask
|
||||||
enable_blend(true);
|
enable_blend(true);
|
||||||
call_dxBlendFunc(D3DBLEND_ZERO, D3DBLEND_ONE);
|
call_dxBlendFunc(D3DBLEND_ZERO, D3DBLEND_ONE);
|
||||||
@ -4573,7 +4574,7 @@ dx_cleanup(bool bRestoreDisplayMode,bool bAtExitFnCalled) {
|
|||||||
if(dxgsg_cat.is_spam()) {
|
if(dxgsg_cat.is_spam()) {
|
||||||
dxgsg_cat.spam() << "dx_cleanup called, bAtExitFnCalled=" << bAtExitFnCalled << ", bAtExitFnEverCalled=" << bAtExitFnEverCalled << endl;
|
dxgsg_cat.spam() << "dx_cleanup called, bAtExitFnCalled=" << bAtExitFnCalled << ", bAtExitFnEverCalled=" << bAtExitFnEverCalled << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
bAtExitFnEverCalled = (bAtExitFnEverCalled || bAtExitFnCalled);
|
bAtExitFnEverCalled = (bAtExitFnEverCalled || bAtExitFnCalled);
|
||||||
|
|
||||||
// for now, I can't trust any of the ddraw/d3d releases during atexit(),
|
// for now, I can't trust any of the ddraw/d3d releases during atexit(),
|
||||||
@ -4699,15 +4700,36 @@ HRESULT DXGraphicsStateGuardian::ReleaseAllDeviceObjects(void) {
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: show_frame
|
// Function: show_frame
|
||||||
// Access:
|
// Access:
|
||||||
// Description: Repaint primary buffer from back buffer
|
// Description: redraw primary buffer
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
void DXGraphicsStateGuardian::show_frame(void) {
|
void DXGraphicsStateGuardian::show_frame(bool bNoNewFrameDrawn) {
|
||||||
if(scrn.pD3DDevice==NULL)
|
if(scrn.pD3DDevice==NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
DO_PSTATS_STUFF(PStatTimer timer(_win->_swap_pcollector)); // this times just the flip, so it must go here in dxgsg, instead of wdxdisplay, which would time the whole frame
|
DO_PSTATS_STUFF(PStatTimer timer(_win->_swap_pcollector)); // this times just the flip, so it must go here in dxgsg, instead of wdxdisplay, which would time the whole frame
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
|
if(bNoNewFrameDrawn) {
|
||||||
|
// a new frame has not been rendered, we just want to display the last thing
|
||||||
|
// that was drawn into backbuf, if backbuf is valid
|
||||||
|
if(scrn.PresParams.SwapEffect==D3DSWAPEFFECT_DISCARD) {
|
||||||
|
// in DISCARD mode, old backbufs are not guaranteed to have valid pixels,
|
||||||
|
// so we cant copy back->front here. just give up.
|
||||||
|
return;
|
||||||
|
} else if(scrn.PresParams.SwapEffect==D3DSWAPEFFECT_FLIP) {
|
||||||
|
/* bugbug: here we should use CopyRects here to copy backbuf to front (except in
|
||||||
|
the case of frames 1 and 2 where we have no valid data in the backbuffer yet,
|
||||||
|
for those cases give up and return).
|
||||||
|
not implemented yet since right now we always do discard mode for fullscrn Present()
|
||||||
|
for speed.
|
||||||
|
*/
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// otherwise we have D3DSWAPEFFECT_COPY, so fall-thru to normal Present()
|
||||||
|
// may work ok as long as backbuf hasnt been touched
|
||||||
|
}
|
||||||
|
|
||||||
hr = scrn.pD3DDevice->Present((CONST RECT*)NULL,(CONST RECT*)NULL,(HWND)NULL,NULL);
|
hr = scrn.pD3DDevice->Present((CONST RECT*)NULL,(CONST RECT*)NULL,(HWND)NULL,NULL);
|
||||||
if(FAILED(hr)) {
|
if(FAILED(hr)) {
|
||||||
if(hr == D3DERR_DEVICELOST) {
|
if(hr == D3DERR_DEVICELOST) {
|
||||||
@ -4729,7 +4751,7 @@ HRESULT DXGraphicsStateGuardian::reset_d3d_device(D3DPRESENT_PARAMETERS *pPresPa
|
|||||||
ReleaseAllDeviceObjects();
|
ReleaseAllDeviceObjects();
|
||||||
|
|
||||||
if(!dx_full_screen) {
|
if(!dx_full_screen) {
|
||||||
// for windowed make sure out format matches the desktop fmt, in case the
|
// for windowed make sure out format matches the desktop fmt, in case the
|
||||||
// desktop mode has been changed
|
// desktop mode has been changed
|
||||||
|
|
||||||
scrn.pD3D8->GetAdapterDisplayMode(scrn.CardIDNum, &scrn.DisplayMode);
|
scrn.pD3D8->GetAdapterDisplayMode(scrn.CardIDNum, &scrn.DisplayMode);
|
||||||
@ -4748,7 +4770,7 @@ bool DXGraphicsStateGuardian::CheckCooperativeLevel(bool bDoReactivateWindow) {
|
|||||||
|
|
||||||
HRESULT hr = scrn.pD3DDevice->TestCooperativeLevel();
|
HRESULT hr = scrn.pD3DDevice->TestCooperativeLevel();
|
||||||
if(SUCCEEDED(hr)) {
|
if(SUCCEEDED(hr)) {
|
||||||
assert(SUCCEEDED(_last_testcooplevel_result));
|
assert(SUCCEEDED(_last_testcooplevel_result));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -4766,7 +4788,7 @@ bool DXGraphicsStateGuardian::CheckCooperativeLevel(bool bDoReactivateWindow) {
|
|||||||
_win->reactivate_window(); //must reactivate window before you can restore surfaces (otherwise you are in WRONGVIDEOMODE, and DDraw RestoreAllSurfaces fails)
|
_win->reactivate_window(); //must reactivate window before you can restore surfaces (otherwise you are in WRONGVIDEOMODE, and DDraw RestoreAllSurfaces fails)
|
||||||
hr = scrn.pD3DDevice->TestCooperativeLevel();
|
hr = scrn.pD3DDevice->TestCooperativeLevel();
|
||||||
if(FAILED(hr)) {
|
if(FAILED(hr)) {
|
||||||
// internal chk, shouldnt fail
|
// internal chk, shouldnt fail
|
||||||
dxgsg_cat.error() << "TestCooperativeLevel following Reset() failed, hr = " << D3DERRORSTRING(hr);
|
dxgsg_cat.error() << "TestCooperativeLevel following Reset() failed, hr = " << D3DERRORSTRING(hr);
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
@ -4796,7 +4818,7 @@ bool DXGraphicsStateGuardian::CheckCooperativeLevel(bool bDoReactivateWindow) {
|
|||||||
// This means that mode changes had taken place, surfaces
|
// This means that mode changes had taken place, surfaces
|
||||||
// were lost but still we are in the original mode, so we
|
// were lost but still we are in the original mode, so we
|
||||||
// simply restore all surfaces and keep going.
|
// simply restore all surfaces and keep going.
|
||||||
|
|
||||||
if(dxgsg_cat.is_debug()) {
|
if(dxgsg_cat.is_debug()) {
|
||||||
if(dx_full_screen)
|
if(dx_full_screen)
|
||||||
dxgsg_cat.debug() << "Lost access to DDRAW exclusive mode, waiting to regain it...\n";
|
dxgsg_cat.debug() << "Lost access to DDRAW exclusive mode, waiting to regain it...\n";
|
||||||
@ -4806,7 +4828,7 @@ bool DXGraphicsStateGuardian::CheckCooperativeLevel(bool bDoReactivateWindow) {
|
|||||||
} else if(hr==D3DERR_DEVICENOTRESET) {
|
} else if(hr==D3DERR_DEVICENOTRESET) {
|
||||||
// need to call Reset()
|
// need to call Reset()
|
||||||
|
|
||||||
// do I want to do it here, or do
|
// do I want to do it here, or do
|
||||||
HRESULT hr=scrn.pD3DDevice->Reset(&scrn.PresParams);
|
HRESULT hr=scrn.pD3DDevice->Reset(&scrn.PresParams);
|
||||||
if(FAILED(hr)) {
|
if(FAILED(hr)) {
|
||||||
dxgsg_cat.error() << "CheckCooperativeLevel Reset() failed, hr = " << D3DERRORSTRING(hr);
|
dxgsg_cat.error() << "CheckCooperativeLevel Reset() failed, hr = " << D3DERRORSTRING(hr);
|
||||||
@ -4828,11 +4850,11 @@ bool DXGraphicsStateGuardian::CheckCooperativeLevel(bool bDoReactivateWindow) {
|
|||||||
if(dxgsg_cat.is_debug())
|
if(dxgsg_cat.is_debug())
|
||||||
dxgsg_cat.debug() << "regained exclusive mode, refilling surfs...\n";
|
dxgsg_cat.debug() << "regained exclusive mode, refilling surfs...\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
if(bDoReactivateWindow)
|
if(bDoReactivateWindow)
|
||||||
_win->reactivate_window(); //must reactivate window before you can restore surfaces (otherwise you are in WRONGVIDEOMODE, and DDraw RestoreAllSurfaces fails)
|
_win->reactivate_window(); //must reactivate window before you can restore surfaces (otherwise you are in WRONGVIDEOMODE, and DDraw RestoreAllSurfaces fails)
|
||||||
|
|
||||||
RestoreAllVideoSurfaces();
|
RestoreAllVideoSurfaces();
|
||||||
|
|
||||||
_bDXisReady = TRUE;
|
_bDXisReady = TRUE;
|
||||||
|
|
||||||
@ -5068,7 +5090,7 @@ HRESULT CreateDX8Cursor(LPDIRECT3DDEVICE8 pd3dDevice, HCURSOR hCursor,BOOL bAddW
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Create a surface for the cursor
|
// Create a surface for the cursor
|
||||||
if( FAILED( hr = pd3dDevice->CreateImageSurface( dwWidth, dwHeightDest,
|
if( FAILED( hr = pd3dDevice->CreateImageSurface( dwWidth, dwHeightDest,
|
||||||
D3DFMT_A8R8G8B8, &pCursorBitmap ) ) ) {
|
D3DFMT_A8R8G8B8, &pCursorBitmap ) ) ) {
|
||||||
goto End;
|
goto End;
|
||||||
}
|
}
|
||||||
@ -5091,7 +5113,7 @@ HRESULT CreateDX8Cursor(LPDIRECT3DDEVICE8 pd3dDevice, HCURSOR hCursor,BOOL bAddW
|
|||||||
goto End;
|
goto End;
|
||||||
}
|
}
|
||||||
hgdiobjOld = SelectObject(hdcMask, iconinfo.hbmMask);
|
hgdiobjOld = SelectObject(hdcMask, iconinfo.hbmMask);
|
||||||
GetDIBits(hdcMask, iconinfo.hbmMask, 0, dwHeightSrc,
|
GetDIBits(hdcMask, iconinfo.hbmMask, 0, dwHeightSrc,
|
||||||
pcrArrayMask, &bmi, DIB_RGB_COLORS);
|
pcrArrayMask, &bmi, DIB_RGB_COLORS);
|
||||||
SelectObject(hdcMask, hgdiobjOld);
|
SelectObject(hdcMask, hgdiobjOld);
|
||||||
|
|
||||||
@ -5105,7 +5127,7 @@ HRESULT CreateDX8Cursor(LPDIRECT3DDEVICE8 pd3dDevice, HCURSOR hCursor,BOOL bAddW
|
|||||||
goto End;
|
goto End;
|
||||||
}
|
}
|
||||||
SelectObject(hdcColor, iconinfo.hbmColor);
|
SelectObject(hdcColor, iconinfo.hbmColor);
|
||||||
GetDIBits(hdcColor, iconinfo.hbmColor, 0, dwHeightDest,
|
GetDIBits(hdcColor, iconinfo.hbmColor, 0, dwHeightDest,
|
||||||
pcrArrayColor, &bmi, DIB_RGB_COLORS);
|
pcrArrayColor, &bmi, DIB_RGB_COLORS);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -5132,8 +5154,8 @@ HRESULT CreateDX8Cursor(LPDIRECT3DDEVICE8 pd3dDevice, HCURSOR hCursor,BOOL bAddW
|
|||||||
else
|
else
|
||||||
pBitmap[dwWidth*y + x] = 0x00000000;
|
pBitmap[dwWidth*y + x] = 0x00000000;
|
||||||
|
|
||||||
// It may be helpful to make the D3D cursor look slightly
|
// It may be helpful to make the D3D cursor look slightly
|
||||||
// different from the Windows cursor so you can distinguish
|
// different from the Windows cursor so you can distinguish
|
||||||
// between the two when developing/testing code. When
|
// between the two when developing/testing code. When
|
||||||
// bAddWatermark is TRUE, the following code adds some
|
// bAddWatermark is TRUE, the following code adds some
|
||||||
// small grey "D3D" characters to the upper-left corner of
|
// small grey "D3D" characters to the upper-left corner of
|
||||||
@ -5157,7 +5179,7 @@ HRESULT CreateDX8Cursor(LPDIRECT3DDEVICE8 pd3dDevice, HCURSOR hCursor,BOOL bAddW
|
|||||||
pCursorBitmap->UnlockRect();
|
pCursorBitmap->UnlockRect();
|
||||||
|
|
||||||
// Set the device cursor
|
// Set the device cursor
|
||||||
if( FAILED( hr = pd3dDevice->SetCursorProperties( iconinfo.xHotspot,
|
if( FAILED( hr = pd3dDevice->SetCursorProperties( iconinfo.xHotspot,
|
||||||
iconinfo.yHotspot, pCursorBitmap ) ) )
|
iconinfo.yHotspot, pCursorBitmap ) ) )
|
||||||
{
|
{
|
||||||
goto End;
|
goto End;
|
||||||
@ -5204,8 +5226,8 @@ typedef struct {
|
|||||||
} POS_TEX_VERTEX;
|
} POS_TEX_VERTEX;
|
||||||
|
|
||||||
// define junk vars so symbols are included in dbginfo
|
// define junk vars so symbols are included in dbginfo
|
||||||
POS_TEX_VERTEX junk11;
|
POS_TEX_VERTEX junk11;
|
||||||
POS_COLOR_TEX_VERTEX junk22;
|
POS_COLOR_TEX_VERTEX junk22;
|
||||||
POS_NORM_COLOR_TEX_VERTEX junk33;
|
POS_NORM_COLOR_TEX_VERTEX junk33;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -180,7 +180,7 @@ protected:
|
|||||||
DXTextureContext *_pCurTexContext;
|
DXTextureContext *_pCurTexContext;
|
||||||
|
|
||||||
bool _bTransformIssued; // decaling needs to tell when a transform has been issued
|
bool _bTransformIssued; // decaling needs to tell when a transform has been issued
|
||||||
D3DMATRIX _SavedTransform;
|
D3DMATRIX _SavedTransform;
|
||||||
|
|
||||||
RenderBuffer::Type _cur_read_pixel_buffer; // source for copy_pixel_buffer operation
|
RenderBuffer::Type _cur_read_pixel_buffer; // source for copy_pixel_buffer operation
|
||||||
|
|
||||||
@ -197,7 +197,7 @@ protected:
|
|||||||
INLINE void enable_multisample_alpha_one(bool val);
|
INLINE void enable_multisample_alpha_one(bool val);
|
||||||
INLINE void enable_multisample_alpha_mask(bool val);
|
INLINE void enable_multisample_alpha_mask(bool val);
|
||||||
INLINE void enable_multisample(bool val);
|
INLINE void enable_multisample(bool val);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
INLINE void enable_color_material(bool val);
|
INLINE void enable_color_material(bool val);
|
||||||
INLINE void enable_fog(bool val);
|
INLINE void enable_fog(bool val);
|
||||||
@ -263,7 +263,7 @@ protected:
|
|||||||
PTA_Normalf _norms;
|
PTA_Normalf _norms;
|
||||||
PTA_Colorf _colors;
|
PTA_Colorf _colors;
|
||||||
PTA_ushort _cindexes,_nindexes;
|
PTA_ushort _cindexes,_nindexes;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
Colorf _lmodel_ambient;
|
Colorf _lmodel_ambient;
|
||||||
float _material_ambient;
|
float _material_ambient;
|
||||||
@ -278,10 +278,10 @@ protected:
|
|||||||
} DxgsgFogType;
|
} DxgsgFogType;
|
||||||
DxgsgFogType _doFogType;
|
DxgsgFogType _doFogType;
|
||||||
bool _fog_enabled;
|
bool _fog_enabled;
|
||||||
/*
|
/*
|
||||||
TODO: cache fog state
|
TODO: cache fog state
|
||||||
float _fog_start,_fog_end,_fog_density,float _fog_color;
|
float _fog_start,_fog_end,_fog_density,float _fog_color;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
float _alpha_func_refval; // d3d stores UINT, panda stores this as float. we store float
|
float _alpha_func_refval; // d3d stores UINT, panda stores this as float. we store float
|
||||||
D3DCMPFUNC _alpha_func;
|
D3DCMPFUNC _alpha_func;
|
||||||
@ -352,11 +352,11 @@ public:
|
|||||||
#define DO_REACTIVATE_WINDOW true
|
#define DO_REACTIVATE_WINDOW true
|
||||||
bool CheckCooperativeLevel(bool bDoReactivateWindow = false);
|
bool CheckCooperativeLevel(bool bDoReactivateWindow = false);
|
||||||
|
|
||||||
void show_frame();
|
void show_frame(bool bNoNewFrameDrawn = false);
|
||||||
void dx_init(HCURSOR hMouseCursor);
|
void dx_init(HCURSOR hMouseCursor);
|
||||||
|
|
||||||
void support_overlay_window(bool flag);
|
void support_overlay_window(bool flag);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
static TypeHandle _type_handle;
|
static TypeHandle _type_handle;
|
||||||
};
|
};
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -34,6 +34,8 @@ class wdxGraphicsWindowGroup;
|
|||||||
const int WDXWIN_CONFIGURE = 4;
|
const int WDXWIN_CONFIGURE = 4;
|
||||||
const int WDXWIN_EVENT = 8;
|
const int WDXWIN_EVENT = 8;
|
||||||
|
|
||||||
|
//#define FIND_CARD_MEMAVAILS
|
||||||
|
|
||||||
typedef HRESULT (WINAPI * LPDIRECTDRAWCREATEEX)(GUID FAR * lpGuid, LPVOID *lplpDD, REFIID iid,IUnknown FAR *pUnkOuter);
|
typedef HRESULT (WINAPI * LPDIRECTDRAWCREATEEX)(GUID FAR * lpGuid, LPVOID *lplpDD, REFIID iid,IUnknown FAR *pUnkOuter);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@ -54,6 +56,7 @@ class EXPCL_PANDADX wdxGraphicsWindow : public GraphicsWindow {
|
|||||||
friend class DXGraphicsStateGuardian;
|
friend class DXGraphicsStateGuardian;
|
||||||
friend class DXTextureContext;
|
friend class DXTextureContext;
|
||||||
friend class wdxGraphicsWindowGroup;
|
friend class wdxGraphicsWindowGroup;
|
||||||
|
friend class DInput8Info;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
wdxGraphicsWindow(GraphicsPipe* pipe);
|
wdxGraphicsWindow(GraphicsPipe* pipe);
|
||||||
@ -63,7 +66,6 @@ public:
|
|||||||
wdxGraphicsWindow(GraphicsPipe* pipe,const GraphicsWindow::Properties& props,wdxGraphicsWindowGroup *pParentGroup);
|
wdxGraphicsWindow(GraphicsPipe* pipe,const GraphicsWindow::Properties& props,wdxGraphicsWindowGroup *pParentGroup);
|
||||||
|
|
||||||
virtual ~wdxGraphicsWindow(void);
|
virtual ~wdxGraphicsWindow(void);
|
||||||
virtual void end_frame( void );
|
|
||||||
|
|
||||||
virtual TypeHandle get_gsg_type() const;
|
virtual TypeHandle get_gsg_type() const;
|
||||||
static GraphicsWindow* make_wdxGraphicsWindow(const FactoryParams ¶ms);
|
static GraphicsWindow* make_wdxGraphicsWindow(const FactoryParams ¶ms);
|
||||||
@ -76,11 +78,14 @@ public:
|
|||||||
void handle_window_move( int x, int y );
|
void handle_window_move( int x, int y );
|
||||||
void handle_mouse_motion( int x, int y );
|
void handle_mouse_motion( int x, int y );
|
||||||
void handle_mouse_exit(void);
|
void handle_mouse_exit(void);
|
||||||
void handle_keypress( ButtonHandle key, int x, int y );
|
void handle_keypress(ButtonHandle key, int x, int y );
|
||||||
void handle_keyrelease( ButtonHandle key);
|
void handle_keyrelease(ButtonHandle key);
|
||||||
void dx_setup();
|
void dx_setup();
|
||||||
virtual void begin_frame( void );
|
|
||||||
void show_frame();
|
// dont need to override these now?
|
||||||
|
// virtual void begin_frame( void );
|
||||||
|
// virtual void end_frame( void );
|
||||||
|
|
||||||
virtual bool resize(unsigned int xsize,unsigned int ysize);
|
virtual bool resize(unsigned int xsize,unsigned int ysize);
|
||||||
virtual unsigned int verify_window_sizes(unsigned int numsizes,unsigned int *dimen);
|
virtual unsigned int verify_window_sizes(unsigned int numsizes,unsigned int *dimen);
|
||||||
virtual int get_depth_bitwidth(void);
|
virtual int get_depth_bitwidth(void);
|
||||||
@ -104,7 +109,7 @@ public:
|
|||||||
UINT_PTR _PandaPausedTimer;
|
UINT_PTR _PandaPausedTimer;
|
||||||
DXGraphicsStateGuardian *_dxgsg;
|
DXGraphicsStateGuardian *_dxgsg;
|
||||||
void CreateScreenBuffersAndDevice(DXScreenData &Display);
|
void CreateScreenBuffersAndDevice(DXScreenData &Display);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wdxGraphicsWindowGroup *_pParentWindowGroup;
|
wdxGraphicsWindowGroup *_pParentWindowGroup;
|
||||||
HDC _hdc;
|
HDC _hdc;
|
||||||
@ -146,7 +151,7 @@ class EXPCL_PANDADX wdxGraphicsWindowGroup {
|
|||||||
// group of windows are all created at the same time
|
// group of windows are all created at the same time
|
||||||
friend class wdxGraphicsWindow;
|
friend class wdxGraphicsWindow;
|
||||||
|
|
||||||
PUBLISHED:
|
PUBLISHED:
|
||||||
wdxGraphicsWindowGroup(GraphicsPipe *,const GraphicsWindow::Properties&);
|
wdxGraphicsWindowGroup(GraphicsPipe *,const GraphicsWindow::Properties&);
|
||||||
wdxGraphicsWindowGroup(GraphicsPipe *,const GraphicsWindow::Properties&,const GraphicsWindow::Properties&);
|
wdxGraphicsWindowGroup(GraphicsPipe *,const GraphicsWindow::Properties&,const GraphicsWindow::Properties&);
|
||||||
wdxGraphicsWindowGroup(GraphicsPipe *,const GraphicsWindow::Properties&,const GraphicsWindow::Properties&,
|
wdxGraphicsWindowGroup(GraphicsPipe *,const GraphicsWindow::Properties&,const GraphicsWindow::Properties&,
|
||||||
@ -167,7 +172,7 @@ public:
|
|||||||
pvector<wdxGraphicsWindow *> _windows;
|
pvector<wdxGraphicsWindow *> _windows;
|
||||||
DXDeviceInfoVec *_pDeviceInfoVec; // only used during init to store valid devices
|
DXDeviceInfoVec *_pDeviceInfoVec; // only used during init to store valid devices
|
||||||
HWND _hParentWindow;
|
HWND _hParentWindow;
|
||||||
HWND _hOldForegroundWindow;
|
HWND _hOldForegroundWindow;
|
||||||
HCURSOR _hMouseCursor;
|
HCURSOR _hMouseCursor;
|
||||||
bool _bLoadedCustomCursor;
|
bool _bLoadedCustomCursor;
|
||||||
bool _bClosingAllWindows;
|
bool _bClosingAllWindows;
|
||||||
@ -175,6 +180,7 @@ public:
|
|||||||
DWORD _numMonitors,_numAdapters;
|
DWORD _numMonitors,_numAdapters;
|
||||||
LPDIRECT3D8 _pD3D8;
|
LPDIRECT3D8 _pD3D8;
|
||||||
HINSTANCE _hD3D8_DLL;
|
HINSTANCE _hD3D8_DLL;
|
||||||
|
DInput8Info *_pDInputInfo;
|
||||||
DXDeviceInfoVec _DeviceInfoVec;
|
DXDeviceInfoVec _DeviceInfoVec;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user