Exemple #1
0
/*
================
idLight::ReadFromSnapshot
================
*/
void idLight::ReadFromSnapshot( const idBitMsgDelta &msg ) {
	idVec4	shaderColor;
	int		oldCurrentLevel = currentLevel;
	idVec3	oldBaseColor = baseColor;

	GetPhysics()->ReadFromSnapshot( msg );
	ReadBindFromSnapshot( msg );

	currentLevel = msg.ReadByte();
	if ( currentLevel != oldCurrentLevel ) {
		// need to call On/Off for flickering lights to start/stop the sound
		// while doing it this way rather than through events, the flickering is out of sync between clients
		// but at least there is no question about saving the event and having them happening globally in the world
		if ( currentLevel ) {
			On();
		} else {
			Off();
		}
	}
	UnpackColor( msg.ReadLong(), baseColor );
	// lightParentEntityNum = msg.ReadBits( GENTITYNUM_BITS );

/*	// only helps prediction
	UnpackColor( msg.ReadLong(), fadeFrom );
	UnpackColor( msg.ReadLong(), fadeTo );
	fadeStart = msg.ReadLong();
	fadeEnd = msg.ReadLong();
*/

	// FIXME: read renderLight.shader
	renderLight.lightRadius[0] = msg.ReadFloat( 5, 10 );
	renderLight.lightRadius[1] = msg.ReadFloat( 5, 10 );
	renderLight.lightRadius[2] = msg.ReadFloat( 5, 10 );

	UnpackColor( msg.ReadLong(), shaderColor );
	renderLight.shaderParms[SHADERPARM_RED] = shaderColor[0];
	renderLight.shaderParms[SHADERPARM_GREEN] = shaderColor[1];
	renderLight.shaderParms[SHADERPARM_BLUE] = shaderColor[2];
	renderLight.shaderParms[SHADERPARM_ALPHA] = shaderColor[3];

	renderLight.shaderParms[SHADERPARM_TIMESCALE] = msg.ReadFloat( 5, 10 );
	renderLight.shaderParms[SHADERPARM_TIMEOFFSET] = msg.ReadLong();
	//renderLight.shaderParms[SHADERPARM_DIVERSITY] = msg.ReadFloat();
	renderLight.shaderParms[SHADERPARM_MODE] = msg.ReadShort();

	ReadColorFromSnapshot( msg );

	if ( msg.HasChanged() ) {
		if ( ( currentLevel != oldCurrentLevel ) || ( baseColor != oldBaseColor ) ) {
			SetLightLevel();
		} else {
			PresentLightDefChange();
			PresentModelDefChange();
		}
	}
}
Exemple #2
0
MALIB_API COLOR::COLOR(uint c, PIXELFORMAT format)
{
	uchar red = 0;
	uchar green = 0;
	uchar blue = 0;
	uchar alpha = 0;
	UnpackColor(c, &red, &green, &blue, &alpha, format);
	this->r = float(red) / 255.0f;
	this->g = float(green) / 255.0f;
	this->b = float(blue) / 255.0f;
	this->a = float(alpha) / 255.0f;
}
Exemple #3
0
static LUA_DECLARE( drawBitmap )
{
    Bitmap *src;
    double x, y;
    double width, height;
    eDrawOpType drawOp;

    LUA_ARGS_BEGIN;
    argStream.ReadClass( src, LUACLASS_BITMAP );
    argStream.ReadNumber( x );
    argStream.ReadNumber( y );
    argStream.ReadNumber( width, 0 );
    argStream.ReadNumber( height, 0 );
    argStream.ReadEnumString( drawOp, DRAWOP_MODULATE );
    LUA_ARGS_END;

    // Establish draw operation scales.
    double xScale, yScale;

    if ( width == 0 )
    {
        xScale = 1.0f;
        width = src->GetWidth();
    }
    else
        xScale = width / (float)src->GetWidth();

    if ( height == 0 )
    {
        yScale = 1.0f;
        height = src->GetHeight();
    }
    else
        yScale = height / (float)src->GetHeight();

    // For now; later we may support flipping of images!
    LUA_CHECK( width > 0 && height > 0 );

    Bitmap *map = (Bitmap*)lua_getmethodtrans( L );

    // Cache the bitmap types
    Bitmap::eDataType srcDataType = src->m_dataType;
    Bitmap::eDataType dstDataType = map->m_dataType;

    // We cannot draw us to ourselves.
    LUA_CHECK( map != src );

    unsigned int srcWidth = src->GetWidth();
    unsigned int srcHeight = src->GetHeight();
    unsigned int dstWidth = map->GetWidth();
    unsigned int dstHeight = map->GetHeight();

    // Make sure the draw operations target valid zones
    double endTargetX = x + width;
    double endTargetY = y + height;

    // Is the draw zone clipping out of the target zone?
    // Do not render then.
    LUA_CHECK( endTargetX > 0 && endTargetY > 0 &&
               x < dstWidth   && y < dstHeight );

    // Draw it!
    unsigned int ySrcPos = 0;

    for ( double yPos = y; yPos < endTargetY; yPos += yScale, ySrcPos++ )
    {
        unsigned int xSrcPos = 0;

        for ( double xPos = x; xPos < endTargetX; xPos += xScale, xSrcPos++ )
        {
            unsigned int pixelDstX = (unsigned int)xPos;
            unsigned int pixelDstY = (unsigned int)yPos;
            unsigned int pixelSrcX = (unsigned int)xSrcPos;
            unsigned int pixelSrcY = (unsigned int)ySrcPos;

            // Unpack the colors
            double srcRed;
            double srcGreen;
            double srcBlue;
            double srcAlpha;

            UnpackColor( src->m_data, pixelSrcX, pixelSrcY, srcWidth, srcDataType, srcRed, srcGreen, srcBlue, srcAlpha );

            double dstRed;
            double dstGreen;
            double dstBlue;
            double dstAlpha;

            UnpackColor( map->m_data, pixelDstX, pixelDstY, dstWidth, dstDataType, dstRed, dstGreen, dstBlue, dstAlpha );

            // TODO: allow blendfactor changing.
            // Currently it is SRC_ALPHA, ONE_MINUS_SRC_ALPHA

            double resRed;
            double resGreen;
            double resBlue;
            double resAlpha;

            switch( drawOp )
            {
            case DRAWOP_MODULATE:
                // Alpha blend the bitmaps together
                resRed = SharedUtil::Min <double> ( 1.0f, ( srcRed * srcAlpha ) + ( dstRed * (1 - srcAlpha) ) );
                resGreen = SharedUtil::Min <double> ( 1.0f, ( srcGreen * srcAlpha ) + ( dstGreen * (1 - srcAlpha) ) );
                resBlue = SharedUtil::Min <double> ( 1.0f, ( srcBlue * srcAlpha ) + ( dstBlue * (1 - srcAlpha) ) );
                resAlpha = SharedUtil::Min <double> ( 1.0f, ( srcAlpha * srcAlpha ) + ( dstAlpha * (1 - srcAlpha) ) );
                break;
            case DRAWOP_WRITE:
                // We just copy data from bitmap src to dst
                resRed = srcRed;
                resGreen = srcGreen;
                resBlue = srcBlue;
                resAlpha = srcAlpha;
                break;
            default:
                // Unknown operation.
                resRed = 1.0f;
                resGreen = 1.0f;
                resBlue = 1.0f;
                resAlpha = 1.0f;
                break;
            }

            // Pack the colors again.
            PackColor( map->m_data, pixelDstX, pixelDstY, dstWidth, dstDataType, resRed, resGreen, resBlue, resAlpha );
        }
    }

    lua_pushboolean( L, true );
    return 1;
}