Explorar el Código

add fps meter

cxgeorge hace 25 años
padre
commit
18fc45119a

+ 4 - 0
panda/src/dxgsg/config_dxgsg.cxx

@@ -28,6 +28,10 @@ bool dx_cull_traversal = config_dxgsg.GetBool("dx-cull-traversal", true);
 bool dx_ignore_mipmaps = config_dxgsg.GetBool("dx-ignore-mipmaps", false);
 float dx_global_miplevel_bias = config_dxgsg.GetFloat("dx-global-miplevel-bias", 0.0);
 
+bool dx_force_16bpp_screenbuffers = config_dxgsg.GetBool("dx-force-16bpp-screenbuffers", false);
+bool dx_show_fps_meter = config_dxgsg.GetBool("dx-show-fps-meter", false);
+float dx_fps_meter_update_interval = config_dxgsg.GetFloat("dx-fps-meter-update-interval", 1.7);
+
 #ifdef _DEBUG
 bool dx_debug_view_mipmaps = config_dxgsg.GetBool("dx-debug-view-mipmaps", false);
 bool dx_force_16bpptextures = config_dxgsg.GetBool("dx-force-16bpptextures", false);

+ 3 - 0
panda/src/dxgsg/config_dxgsg.h

@@ -15,6 +15,9 @@ extern bool dx_show_transforms;
 extern bool dx_full_screen;
 extern bool dx_cull_traversal;
 extern bool dx_ignore_mipmaps;
+extern bool dx_force_16bpp_screenbuffers;
+extern bool dx_show_fps_meter;
+extern float dx_fps_meter_update_interval;
 
 #ifdef _DEBUG
 extern float dx_global_miplevel_bias;

+ 56 - 12
panda/src/dxgsg/dxGraphicsStateGuardian.cxx

@@ -269,6 +269,10 @@ init_dx(  LPDIRECTDRAW7     context,
 	_view_rect = viewrect;
 	HRESULT hr;
 
+    _start_time = 0.0;
+    _start_frame_count = _cur_frame_count = 0;
+	_current_fps = 0.0;
+
 	_pTexPixFmts = new DDPIXELFORMAT[MAX_DX_TEXPIXFMTS];
 
 	assert(_pTexPixFmts!=NULL);
@@ -705,7 +709,39 @@ render_frame(const AllAttributesWrapper &initial_state) {
 
 	_d3dDevice->EndScene();
 
+	if(dx_show_fps_meter) {
+
+		 DWORD now = timeGetTime();  // this is win32 fn
+
+		 float time_delta = (now - _start_time)/1000.0;
+
+		 if(time_delta > dx_fps_meter_update_interval) {
+			 // didnt use global clock object, it wasnt working properly when I tried,
+			 // its probably slower due to cache faults, and I can easily track all the
+			 // info I need in dxgsg
+			 DWORD num_frames = _cur_frame_count - _start_frame_count;
+
+			 _current_fps = num_frames / time_delta;
+			 _start_time = now;
+			 _start_frame_count = _cur_frame_count;
+		 }
+
+		 HDC hDC;
+
+		 if(SUCCEEDED(_back->GetDC(&hDC))) {
+			 char fps_msg[20];
+			 sprintf(fps_msg, "%7.02f fps", _current_fps);
+			 SetTextColor(hDC, RGB(255,255,0) );
+			 SetBkMode(hDC, TRANSPARENT );
+             TextOutA(hDC, (_view_rect.right-_view_rect.left)-85, 0, fps_msg, strlen(fps_msg));
+             _back->ReleaseDC(hDC);
+		 }
+
+		 _cur_frame_count++;  // only used by fps meter right now
+	}
+
 	_win->end_frame();  
+
 	show_frame();
 
 #ifdef PRINT_TEXSTATS
@@ -1720,9 +1756,11 @@ draw_sprite(const GeomSprite *geom) {
 		vertex_size+=sizeof(D3DCOLOR);
 	}
 
-	nassertv(_pCurFvfBufPtr == NULL);	 // make sure the storage pointer is clean.
-	nassertv(nprims * 4 * vertex_size < VERT_BUFFER_SIZE);
-	nassertv(nprims * 6 < D3DMAXNUMVERTICES );
+	#ifdef _DEBUG
+  	 nassertv(_pCurFvfBufPtr == NULL);	 // make sure the storage pointer is clean.
+     nassertv(nprims * 4 * vertex_size < VERT_BUFFER_SIZE);
+	 nassertv(nprims * 6 < D3DMAXNUMVERTICES );
+	#endif
 
 	_pCurFvfBufPtr = _pFvfBufBasePtr;		   // _pCurFvfBufPtr changes,  _pFvfBufBasePtr doesn't
 	const float TexCrdSets[4][2] = {{0.0,0.0},{1.0,0.0},{0.0,1.0},{1.0,1.0}};
@@ -3665,20 +3703,26 @@ void DXGraphicsStateGuardian::apply_material( const Material* material ) {
 ////////////////////////////////////////////////////////////////////
 void DXGraphicsStateGuardian::
 apply_fog(Fog *fog) {
-	_d3dDevice->SetRenderState(D3DRENDERSTATE_FOGTABLEMODE, 
-							   get_fog_mode_type(fog->get_mode()));
-	_d3dDevice->SetRenderState(D3DRENDERSTATE_FOGVERTEXMODE, 
-							   get_fog_mode_type(fog->get_mode()));
+      // need to re-examine this fog stuff
+
+	Fog::Mode panda_fogmode = fog->get_mode();
+	D3DFOGMODE d3dfogmode = get_fog_mode_type(panda_fogmode);
+
+	if(_D3DDevDesc.dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_FOGTABLE ) {
+  	   _d3dDevice->SetRenderState(D3DRENDERSTATE_FOGTABLEMODE, d3dfogmode);
+	} else if(_D3DDevDesc.dpcTriCaps.dwRasterCaps & D3DPRASTERCAPS_FOGVERTEX ) {
+	  _d3dDevice->SetRenderState(D3DRENDERSTATE_FOGVERTEXMODE, d3dfogmode);
+	}
 
-	switch (fog->get_mode()) {
+	switch (panda_fogmode) {
 		case Fog::M_linear:
 			{
 				float fog_start = fog->get_start();   
 				float fog_end = fog->get_end();   
 				_d3dDevice->SetRenderState( D3DRENDERSTATE_FOGSTART, 
-											*((LPDWORD) (&fog_start)) );
+							*((LPDWORD) (&fog_start)) );
 				_d3dDevice->SetRenderState( D3DRENDERSTATE_FOGEND, 
-											*((LPDWORD) (&fog_end)) );
+							*((LPDWORD) (&fog_end)) );
 			}
 			break;
 		case Fog::M_exponential:
@@ -3686,7 +3730,7 @@ apply_fog(Fog *fog) {
 			{
 				float fog_density = fog->get_density();   
 				_d3dDevice->SetRenderState( D3DRENDERSTATE_FOGDENSITY, 
-											*((LPDWORD) (&fog_density)) );
+							*((LPDWORD) (&fog_density)) );
 			}
 			break;
 		case Fog::M_spline:
@@ -3695,7 +3739,7 @@ apply_fog(Fog *fog) {
 
 	Colorf  fog_colr = fog->get_color();
 	_d3dDevice->SetRenderState(D3DRENDERSTATE_FOGCOLOR, 
-							   D3DRGBA(fog_colr[0], fog_colr[1], fog_colr[2], 0.0));
+				   D3DRGBA(fog_colr[0], fog_colr[1], fog_colr[2], 0.0));
 }
 
 ////////////////////////////////////////////////////////////////////

+ 6 - 0
panda/src/dxgsg/dxGraphicsStateGuardian.h

@@ -365,6 +365,12 @@ protected:
 
   int _pass_number;
 
+  // vars for frames/sec meter
+  DWORD _start_time;
+  DWORD _start_frame_count;
+  DWORD _cur_frame_count;
+  float _current_fps;
+
 public:
   static GraphicsStateGuardian*
   make_DXGraphicsStateGuardian(const FactoryParams &params);