Пример #1
0
/*
===============
R_BeginFrame
===============
*/
void R_BeginFrame( qboolean clearScene )
{
	glConfig.softwareGammaUpdate = false;	// in case of possible fails

	if(( gl_clear->integer || gl_overview->integer ) && clearScene && cls.state != ca_cinematic )
	{
		pglClear( GL_COLOR_BUFFER_BIT );
	}

	// update gamma
	if( vid_gamma->modified )
	{
		glConfig.softwareGammaUpdate = true;
		BuildGammaTable( vid_gamma->value, vid_texgamma->value );
		GL_RebuildLightmaps();
		glConfig.softwareGammaUpdate = false;
		vid_gamma->modified = false;
	}

	R_Set2DMode( true );

	// draw buffer stuff
	pglDrawBuffer( GL_BACK );

	// texturemode stuff
	// update texture parameters
	if( gl_texturemode->modified || gl_texture_anisotropy->modified || gl_texture_lodbias ->modified )
		R_SetTextureParameters();

	// swapinterval stuff
	GL_UpdateSwapInterval();

	CL_ExtraUpdate ();
}
Пример #2
0
/*
=================
V_CheckGamma
=================
*/
qboolean V_CheckGamma (void)
{
	static float oldgammavalue;
	
	if (v_gamma.value == oldgammavalue)
		return FALSE;
	oldgammavalue = v_gamma.value;
	
	BuildGammaTable (v_gamma.value);
	vid.recalc_refdef = 1;				// force a surface cache flush
	
	return TRUE;
}
Пример #3
0
void VID_StartupGamma( void )
{
	// Device supports gamma anyway, but cannot do anything with it.
	fs_offset_t	gamma_size;
	byte	*savedGamma;
	size_t	gammaTypeSize = sizeof(glState.stateRamp);

	// init gamma ramp
	Q_memset( glState.stateRamp, 0, gammaTypeSize);

	// force to set cvar
	Cvar_FullSet( "gl_ignorehwgamma", "1", CVAR_GLCONFIG );

	glConfig.deviceSupportsGamma = false;	// even if supported!
	BuildGammaTable( vid_gamma->value, vid_texgamma->value );
	MsgDev( D_NOTE, "VID_StartupGamma: software gamma initialized\n" );
}
Пример #4
0
void CRender::DrawSceneBegin( void )
{
	UpdateStudioRenderConfig();
	UpdateMaterialSystemConfig();
	if( MaterialConfigLightingChanged() || UpdateLightmapColorScale() )
	{
		ClearMaterialConfigLightingChanged();
		Con_Printf( "Redownloading all lightmaps\n" );
		float overbright = 1.0f;
		if (g_pMaterialSystemHardwareConfig->SupportsOverbright())
		{
			overbright = mat_overbright.GetFloat();
		}
		BuildGammaTable( 2.2f, 2.2f, 0.0f, overbright );
		R_RedownloadAllLightmaps( vec3_origin );
		materialSystemInterface->FlushLightmaps();
		StaticPropMgr()->RecomputeStaticLighting();
	}
}
Пример #5
0
/*
=============
V_Init
=============
*/
void
V_Init(void)
{
    Cmd_AddCommand("v_cshift", V_cshift_f);
    Cmd_AddCommand("bf", V_BonusFlash_f);
    Cmd_AddCommand("centerview", V_StartPitchDrift);

    Cvar_RegisterVariable(&v_centermove);
    Cvar_RegisterVariable(&v_centerspeed);

    Cvar_RegisterVariable(&v_iyaw_cycle);
    Cvar_RegisterVariable(&v_iroll_cycle);
    Cvar_RegisterVariable(&v_ipitch_cycle);
    Cvar_RegisterVariable(&v_iyaw_level);
    Cvar_RegisterVariable(&v_iroll_level);
    Cvar_RegisterVariable(&v_ipitch_level);

    Cvar_RegisterVariable(&v_idlescale);
    Cvar_RegisterVariable(&crosshair);
    Cvar_RegisterVariable(&crosshaircolor);
    Cvar_RegisterVariable(&cl_crossx);
    Cvar_RegisterVariable(&cl_crossy);
#ifdef GLQUAKE
    Cvar_RegisterVariable(&gl_cshiftpercent);
#endif

    Cvar_RegisterVariable(&scr_ofsx);
    Cvar_RegisterVariable(&scr_ofsy);
    Cvar_RegisterVariable(&scr_ofsz);
    Cvar_RegisterVariable(&cl_rollspeed);
    Cvar_RegisterVariable(&cl_rollangle);
    Cvar_RegisterVariable(&cl_bob);
    Cvar_RegisterVariable(&cl_bobcycle);
    Cvar_RegisterVariable(&cl_bobup);

    Cvar_RegisterVariable(&v_kicktime);
    Cvar_RegisterVariable(&v_kickroll);
    Cvar_RegisterVariable(&v_kickpitch);

    BuildGammaTable(1.0);	// no gamma yet
    Cvar_RegisterVariable(&v_gamma);
}
Пример #6
0
void VID_StartupGamma( void )
{
	// Device supports gamma anyway, but cannot do anything with it.
	fs_offset_t	gamma_size;
	byte	*savedGamma;
	size_t	gammaTypeSize = sizeof(glState.stateRamp);

	// init gamma ramp
	Q_memset( glState.stateRamp, 0, gammaTypeSize);

#if defined(XASH_SDL)
	glConfig.deviceSupportsGamma = !SDL_GetWindowGammaRamp( host.hWnd, NULL, NULL, NULL);
#endif

	if( !glConfig.deviceSupportsGamma )
	{
		// force to set cvar
		Cvar_FullSet( "gl_ignorehwgamma", "1", CVAR_GLCONFIG );
		MsgDev( D_ERROR, "VID_StartupGamma: hardware gamma unsupported\n");
	}

	if( gl_ignorehwgamma->integer )
	{
		glConfig.deviceSupportsGamma = false;	// even if supported!
		BuildGammaTable( vid_gamma->value, vid_texgamma->value );
		MsgDev( D_NOTE, "VID_StartupGamma: software gamma initialized\n" );
		return;
	}

	// share this extension so engine can grab them
	GL_SetExtension( GL_HARDWARE_GAMMA_CONTROL, glConfig.deviceSupportsGamma );

	savedGamma = FS_LoadFile( "gamma.dat", &gamma_size, false );

	if( !savedGamma || gamma_size != (fs_offset_t)gammaTypeSize)
	{
		// saved gamma not found or corrupted file
		FS_WriteFile( "gamma.dat", glState.stateRamp, gammaTypeSize);
		MsgDev( D_NOTE, "VID_StartupGamma: gamma.dat initialized\n" );
		if( savedGamma ) Mem_Free( savedGamma );
	}
	else
	{
		GL_BuildGammaTable();

		// validate base gamma
		if( !Q_memcmp( savedGamma, glState.stateRamp, gammaTypeSize))
		{
			// all ok, previous gamma is valid
			MsgDev( D_NOTE, "VID_StartupGamma: validate screen gamma - ok\n" );
		}
		else if( !Q_memcmp( glState.gammaRamp, glState.stateRamp, gammaTypeSize))
		{
			// screen gamma is equal to render gamma (probably previous instance crashed)
			// run additional check to make sure for it
			if( Q_memcmp( savedGamma, glState.stateRamp, gammaTypeSize))
			{
				// yes, current gamma it's totally wrong, restore it from gamma.dat
				MsgDev( D_NOTE, "VID_StartupGamma: restore original gamma after crash\n" );
				Q_memcpy( glState.stateRamp, savedGamma, gammaTypeSize);
			}
			else
			{
				// oops, savedGamma == glState.stateRamp == glState.gammaRamp
				// probably r_gamma set as default
				MsgDev( D_NOTE, "VID_StartupGamma: validate screen gamma - disabled\n" ); 
			}
		}
		else if( !Q_memcmp( glState.gammaRamp, savedGamma, gammaTypeSize))
		{
			// saved gamma is equal render gamma, probably gamma.dat wroted after crash
			// run additional check to make sure it
			if( Q_memcmp( savedGamma, glState.stateRamp, gammaTypeSize))
			{
				// yes, saved gamma it's totally wrong, get origianl gamma from screen
				MsgDev( D_NOTE, "VID_StartupGamma: merge gamma.dat after crash\n" );
				FS_WriteFile( "gamma.dat", glState.stateRamp, gammaTypeSize);
			}
			else
			{
				// oops, savedGamma == glState.stateRamp == glState.gammaRamp
				// probably r_gamma set as default
				MsgDev( D_NOTE, "VID_StartupGamma: validate screen gamma - disabled\n" ); 
			}
		}
		else
		{
			// current gamma unset by other application, so we can restore it here
			MsgDev( D_NOTE, "VID_StartupGamma: restore original gamma after crash\n" );
			Q_memcpy( glState.stateRamp, savedGamma, gammaTypeSize);
		}

		Mem_Free( savedGamma );
	}

	vid_gamma->modified = true;
}
Пример #7
0
int MpImage::GammaCorrection (double red_gamma, 
                              double green_gamma, 
                              double blue_gamma,
                              int minval, int maxval)
{
  int retval = true;
  const int MCV = int(MaxChannelValue);

  // nothing to do
  if (red_gamma   == 1.0 && 
      green_gamma == 1.0 && 
      blue_gamma  == 1.0) return true;

  // check for valid input
  if (red_gamma   == 0.0 || 
      green_gamma == 0.0 || 
      blue_gamma  == 0.0) return false;

  // defaults to maximal channel value
  if (maxval < 0) maxval = MCV;

  // enforce valid range
  MpForceRange(maxval,0,MCV);
  MpForceRange(minval,0,MCV);

  // allocate the gamma tables
  ImageChannelT *rtable = 0, *gtable = 0, *btable = 0;

  rtable = new ImageChannelT [MCV+1];
  if (! rtable) return false;
  BuildGammaTable (rtable,minval,maxval,red_gamma);

  if (green_gamma == red_gamma)
    gtable = rtable;
  else {
    gtable = new ImageChannelT [MCV+1];
    BuildGammaTable (gtable,minval,maxval,green_gamma);
    if (! gtable) retval = false;
  }

  if (retval) {
    if (blue_gamma == red_gamma)
      btable = rtable;
    else if (blue_gamma == green_gamma) {
      btable = gtable;
    } else {
      btable = new ImageChannelT [MCV+1];
      BuildGammaTable (btable,minval,maxval,blue_gamma);
      if (! btable) retval = false;
    }
    
    if (retval) {
      // do gamma correction
      ImageChannelT *data = GetData();
      int N = GetWidth() * GetLength();
      for (int i = 0; i < N; i++, data += 3) {
        data[0] = rtable[data[0]];
        data[1] = gtable[data[1]];
        data[2] = btable[data[2]];
      }
    }
  }

  // free tables
  if (rtable) delete rtable;
  if (gtable && green_gamma != red_gamma) delete gtable;
  if (btable && blue_gamma != red_gamma && blue_gamma != green_gamma) delete btable;

  return retval;
}
Пример #8
0
int main (int argc, char ** argv)
{
	int i = 0;
	int dir = 1;
	//Open port 
	int fd = open(kPortName, O_RDWR | O_SYNC);
	
	//Amt of memory for the strip
	int stripBuffSize = sizeof(char) * 3 * STRIP_SIZE + 1;
	char* strip = (char*)malloc(stripBuffSize);
	
	printf("Port id is %i. Building gamma table\n", fd);	
	//Build gamma table
	BuildGammaTable();
	printf("Gamma table generation complete\n");
	
	//Clear the strip
	memset(strip, 0, stripBuffSize);
	
	if (fd != -1)
	{
		int j = 0;
		int k = 0;
		for (;;)
		{
			//Write the colour buffer to the SPI port
			write(fd, strip, stripBuffSize);
			
			//Control direction of cosine wave. Pause at extrema
			if (j == STRIP_SIZE - 1)
			{
				dir = -1;
				usleep(100000);
			}
			else if (j == 0)
			{
				dir = 1;
				usleep(100000);
			}
			
			j += dir;
			usleep(16000);
			//RandomizeStrip(strip);
			
			//Update the colour buffer
			for (i = 0; i < STRIP_SIZE; ++i)
			{
				float val = cos(((float)(j % STRIP_SIZE) - (float)i) / (float)(STRIP_SIZE / 2.0f) * PI / 2.0f);
				if (val < 0.0f)
				{
					val = 0.0f;
				}
				SetPixel(strip, (char)round(pow(val, 3.0f) * 255.0f), 0, 0, i);
			}
		}
		//Close port
		close(fd);
	}
	else
	{
		printf("%s isn't a valid SPI port", kPortName);
	}
	
	//Free memory
	if (kGammaTable != 0)
	{
		free(kGammaTable);
	}
	
	free(strip);
	return 0;
}