예제 #1
0
//==========================================================================
//
//
//
//==========================================================================
void GLSprite::SplitSprite(sector_t * frontsector, bool translucent)
{
    GLSprite copySprite;
    fixed_t lightbottom;
    float maplightbottom;
    unsigned int i;
    bool put=false;
    TArray<lightlist_t> & lightlist=frontsector->e->XFloor.lightlist;

    //y1+=y;
    //y2+=y;
    //y=0;
    for(i=0; i<lightlist.Size(); i++)
    {
        // Particles don't go through here so we can safely assume that actor is not NULL
        if (i<lightlist.Size()-1) lightbottom=lightlist[i+1].plane.ZatPoint(actor->x,actor->y);
        else lightbottom=frontsector->floorplane.ZatPoint(actor->x,actor->y);

        //maplighttop=FIXED2FLOAT(lightlist[i].height);
        maplightbottom=FIXED2FLOAT(lightbottom);
        if (maplightbottom<z2) maplightbottom=z2;

        if (maplightbottom<z1)
        {
            copySprite=*this;
            copySprite.lightlevel=*lightlist[i].p_lightlevel;
            copySprite.Colormap.CopyLightColor(*lightlist[i].p_extra_colormap);

            if (glset.nocoloredspritelighting)
            {
                int v = (copySprite.Colormap.LightColor.r + copySprite.Colormap.LightColor.g + copySprite.Colormap.LightColor.b )/3;
                copySprite.Colormap.LightColor.r=
                    copySprite.Colormap.LightColor.g=
                        copySprite.Colormap.LightColor.b=(255+v+v)/3;
            }

            if (!gl_isWhite(ThingColor))
            {
                copySprite.Colormap.LightColor.r=(copySprite.Colormap.LightColor.r*ThingColor.r)>>8;
                copySprite.Colormap.LightColor.g=(copySprite.Colormap.LightColor.g*ThingColor.g)>>8;
                copySprite.Colormap.LightColor.b=(copySprite.Colormap.LightColor.b*ThingColor.b)>>8;
            }

            z1=copySprite.z2=maplightbottom;
            vt=copySprite.vb=copySprite.vt+
                             (maplightbottom-copySprite.z1)*(copySprite.vb-copySprite.vt)/(z2-copySprite.z1);
            copySprite.PutSprite(translucent);
            put=true;
        }
예제 #2
0
void GLSprite::SplitSprite(HWDrawInfo *di, sector_t * frontsector, bool translucent)
{
	GLSprite copySprite;
	double lightbottom;
	unsigned int i;
	bool put=false;
	TArray<lightlist_t> & lightlist=frontsector->e->XFloor.lightlist;

	for(i=0;i<lightlist.Size();i++)
	{
		// Particles don't go through here so we can safely assume that actor is not nullptr
		if (i<lightlist.Size()-1) lightbottom=lightlist[i+1].plane.ZatPoint(actor);
		else lightbottom=frontsector->floorplane.ZatPoint(actor);

		if (lightbottom<z2) lightbottom=z2;

		if (lightbottom<z1)
		{
			copySprite=*this;
			copySprite.lightlevel = hw_ClampLight(*lightlist[i].p_lightlevel);
			copySprite.Colormap.CopyLight(lightlist[i].extra_colormap);

			if (level.flags3 & LEVEL3_NOCOLOREDSPRITELIGHTING)
			{
				copySprite.Colormap.Decolorize();
			}

			if (!ThingColor.isWhite())
			{
				copySprite.Colormap.LightColor.r = (copySprite.Colormap.LightColor.r*ThingColor.r) >> 8;
				copySprite.Colormap.LightColor.g = (copySprite.Colormap.LightColor.g*ThingColor.g) >> 8;
				copySprite.Colormap.LightColor.b = (copySprite.Colormap.LightColor.b*ThingColor.b) >> 8;
			}

			z1=copySprite.z2=lightbottom;
			vt=copySprite.vb=copySprite.vt+ 
				(lightbottom-copySprite.z1)*(copySprite.vb-copySprite.vt)/(z2-copySprite.z1);
			copySprite.PutSprite(di, translucent);
			put=true;
		}