예제 #1
0
void PostProcessing::renderFog()
{
    const Track * const track = World::getWorld()->getTrack();

    // This function is only called once per frame - thus no need for setters.
    const float fogmax = track->getFogMax();
    const float startH = track->getFogStartHeight();
    const float endH = track->getFogEndHeight();
    const float start = track->getFogStart();
    const float end = track->getFogEnd();
    const SColor tmpcol = track->getFogColor();

    core::vector3df col( tmpcol.getRed() / 255.0f,
        tmpcol.getGreen() / 255.0f,
        tmpcol.getBlue() / 255.0f );

    glDisable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendEquation(GL_FUNC_ADD);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glUseProgram(FullScreenShader::FogShader::Program);
    glBindVertexArray(FullScreenShader::FogShader::vao);

    setTexture(0, irr_driver->getDepthStencilTexture(), GL_NEAREST, GL_NEAREST);
    FullScreenShader::FogShader::setUniforms(fogmax, startH, endH, start, end, col, 0);

    glDrawArrays(GL_TRIANGLES, 0, 3);
    glBindVertexArray(0);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
    glEnable(GL_DEPTH_TEST);
    glDisable(GL_BLEND);
}
예제 #2
0
void PostProcessing::renderFog()
{
    const Track * const track = World::getWorld()->getTrack();

    // This function is only called once per frame - thus no need for setters.
    const float fogmax = track->getFogMax();
    const float startH = track->getFogStartHeight();
    const float endH = track->getFogEndHeight();
    const float start = track->getFogStart();
    const float end = track->getFogEnd();
    const SColor tmpcol = track->getFogColor();

    core::vector3df col( tmpcol.getRed() / 255.0f,
        tmpcol.getGreen() / 255.0f,
        tmpcol.getBlue() / 255.0f );

    glDisable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendEquation(GL_FUNC_ADD);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);


    FullScreenShader::FogShader::getInstance()->SetTextureUnits(createVector<GLuint>(irr_driver->getDepthStencilTexture()));
    DrawFullScreenEffect<FullScreenShader::FogShader>(fogmax, startH, endH, start, end, col);

    glEnable(GL_DEPTH_TEST);
    glDisable(GL_BLEND);
}
예제 #3
0
IImage* createRainbowImage( u32 w, u32 h, u8 transparency, f64 gamma)
{
	// create image
	core::dimension2du size(w,h);

	IImage* img = (IImage*)new CImage(ECF_A8R8G8B8, size);

	if (!img) return 0;

	size = img->getDimension();

	// loop pixels per col
	for (u32 y=0; y<size.Height; y++)
	{
		// calculate rainbow-color
		SColor c = createRainbowColor( y, size.Height, gamma);

		// set transparency
		c.setAlpha(transparency);

		// write one row with same color
		for (u32 x=0; x<size.Width; x++)
		{
			// write rainbow-color
			img->setPixel(x,y,c,false);
		}
	}

	return img;
}
예제 #4
0
void CMenuLogin::updateHuds()
{
	_gerHud->clear();

	if(_loadingStage == LS_PERSONAGENS) 
	{
		_gameCore->_barraLoad = new CHudProgressBar(_gerHud->getRootGUIElement(), _gerHud, rect<s32>( 0+100, _gameCore->sHeight-200, _gameCore->sWidth-100, _gameCore->sHeight-100));
		_gameCore->_barraLoad->setProgress(0.00001f);
	}

	if(_loadingStage > LS_COUNT)
	{
		IGUIImage *img =_gerHud->addImage(_gerVideo->getTexture("recursos/huds/bg_login.png"), position2d<s32>(/*112, 84*/0,0));

		Login = _gerHud->addEditBox(L"fantini", rect<s32>(400,700,500,720), true, 0, 10);
		Password = _gerHud->addEditBox(L"wurzelion", rect<s32>(400,730,500,750), true, 0, 20);
		Password->setPasswordBox(true);
		Login->setMax(15);
		Password->setMax(15);

		_gerHud->addButton(rect<s32>(520,700,620,750), 0, 101, L"conectar");
		//IGUIButton *connect;
		//addNewBtn(connect, rect<s32>(550,700,602,752), 0, 101, 0, L"conectar", true, false, H_CONECTAR, H_CONECTAR);
	}

	for (u32 i=0; i<EGDC_COUNT ; ++i)
	{
		SColor col = _gerHud->getSkin()->getColor((EGUI_DEFAULT_COLOR)i);
		col.setAlpha(255);
		_gerHud->getSkin()->setColor((EGUI_DEFAULT_COLOR)i, col);
	}

	_menuFlag[HUDUPDATED] = true;
}
	void RasGouraud::RasterizePixel( SScanLine& scanLine, const SScanLinesData& rasData )
	{
#if USE_PERSPEC_CORRECT == 1
		//双曲插值最后一步
		float inv_w = 1 / scanLine.zw.y;
		scanLine.pixelColor.Set(scanLine.curClr.x*inv_w, scanLine.curClr.y*inv_w, scanLine.curClr.z*inv_w);
#else
		scanLine.pixelColor = scanLine.curClr;
#endif

		scanLine.pixelColor.Saturate();

		DWORD& dwDestColor = *scanLine.pFragmeng->finalColor;

#if USE_OIT == 0
		SColor destPixelColor;
		destPixelColor.SetAsInt(dwDestColor);

		DoAlphaBlending(destPixelColor, scanLine.pixelColor, destPixelColor, rasData.pMaterial);

		dwDestColor = destPixelColor.GetAsInt();
#else
		scanLine.pixelColor.a *= rasData.pMaterial->transparency;
		dwDestColor = scanLine.pixelColor.GetAsInt();
#endif

#if USE_PROFILER == 1
		g_env.profiler->AddRenderedPixel();
#endif
	}
예제 #6
0
//! sets a pixel
void SImage::setPixel(u32 x, u32 y, const SColor &color )
{
	if (x >= (u32)Size.Width || y >= (u32)Size.Height)
		return;

	switch(Format)
	{
		case ECF_A1R5G5B5:
		{
			u16 * dest = (u16*) ((u8*) Data + ( y * Pitch ) + ( x << 1 ));
			*dest = video::A8R8G8B8toA1R5G5B5 ( color.color );
		} break;

		case ECF_R5G6B5:
		{
			u16 * dest = (u16*) ((u8*) Data + ( y * Pitch ) + ( x << 1 ));
			*dest = video::A8R8G8B8toR5G6B5 ( color.color );
		} break;

		case ECF_R8G8B8:
		{
			u8* dest = (u8*) Data + ( y * Pitch ) + ( x * 3 );
			dest[0] = color.getRed();
			dest[1] = color.getGreen();
			dest[2] = color.getBlue();
		} break;

		case ECF_A8R8G8B8:
		{
			u32 * dest = (u32*) ((u8*) Data + ( y * Pitch ) + ( x << 2 ));
			*dest = color.color;
		} break;
	}
}
예제 #7
0
		//! Constructs a color from 32 bit Color.
		SColorf::SColorf(SColor c)
		{
			const f32 inv = 1.0f / 255.0f;
			Red = c.getRed() * inv;
			Green = c.getGreen() * inv;
			Blue = c.getBlue() * inv;
			Alpha = c.getAlpha() * inv;
		}
예제 #8
0
		//! fills the surface with given color
		void CImage::fill(const SColor &color)
		{
			u32 c;

			switch (Format)
			{
				case ECF_A1R5G5B5:
				{
					c = color.toA1R5G5B5();
					c |= c << 16;
					break;
				}
				case ECF_R5G6B5:
				{
					c = SharedColorConverter::getInstance().A8R8G8B8toR5G6B5(
							color.color);
					c |= c << 16;
					break;
				}
				case ECF_A8R8G8B8:
				{
					c = color.color;
					break;
				}
				case ECF_R8G8B8:
				{
					u8 rgb[3];
					SharedColorConverter::getInstance().convert_A8R8G8B8toR8G8B8(
							&color, 1, rgb);
					const u32 size = getImageDataSizeInBytes();
					for (u32 i = 0; i < size; i += 3)
					{
						memcpy(Data + i, rgb, 3);
					}
					return;

					break;
				}

				case ECF_R16F:
				case ECF_G16R16F:
				case ECF_A16B16G16R16F:
				case ECF_R32F:
				case ECF_G32R32F:
				case ECF_A32B32G32R32F:
				case ECF_UNKNOWN:
				default:
				{
					break;
				}
			}

			if (Format != ECF_A1R5G5B5 && Format != ECF_R5G6B5
					&& Format != ECF_A8R8G8B8)
			{
				return;
			}

			StaticVideoUtils::memset32(Data, c, getImageDataSizeInBytes());
		}
예제 #9
0
//! fills the surface with given color
void CImage::fill(const SColor &color)
{
	u32 c;

	switch ( Format )
	{
		case ECF_A1R5G5B5:
			c = color.toA1R5G5B5();
			c |= c << 16;
			break;
		case ECF_R5G6B5:
			c = video::A8R8G8B8toR5G6B5( color.color );
			c |= c << 16;
			break;
		case ECF_A8R8G8B8:
			c = color.color;
			break;
		case ECF_R8G8B8:
		{
			u8 rgb[3];
			CColorConverter::convert_A8R8G8B8toR8G8B8(&color, 1, rgb);
			const u32 size = getImageDataSizeInBytes();
			for (u32 i=0; i<size; i+=3)
			{
				memcpy(Data+i, rgb, 3);
			}
			return;
		}
		break;
		default:
		// TODO: Handle other formats
			return;
	}
	memset32( Data, c, getImageDataSizeInBytes() );
}
void WxIrrMainWindow::OnSimulationShowZAxisChangeColor(wxCommandEvent &event)
{
    wxColourData colorData;
    SColor currentIrrColor = OnSimulationZAxisGetColorFunctionPointer();
    wxColour currentWxColor(currentIrrColor.getRed(), currentIrrColor.getGreen(), currentIrrColor.getBlue());
    colorData.SetColour(currentWxColor);

    wxColourDialog colorDiag(this, &colorData);

    if (colorDiag.ShowModal() == wxID_OK)
    {
        wxColourData retData = colorDiag.GetColourData();
        wxColour col = retData.GetColour();

        OnSimulationZAxisChangeColorFunctionPointer(col);
    }
}
예제 #11
0
파일: raytracer.cpp 프로젝트: sondrele/NTNU
RayBuffer RayTracer::traceRays() {
    // #pragma omp parallel for
    for (uint y = 0; y < HEIGHT; y++) {
        // #pragma omp parallel for
        for (uint x = 0; x < WIDTH; x++) {
            Ray r = computeRay(x, y);
            Intersection in = scene->calculateRayIntersection(r);
            SColor c = shadeIntersection(in, depth);
            PX_Color color;
            color.R = (uint8_t) (255 * c.R());
            color.G = (uint8_t) (255 * c.G());
            color.B = (uint8_t) (255 * c.B());
            buffer.setPixel(x, y, color);
        }
    }
    return buffer;
}
	void RasNormalMap::FragmentPS( SFragment& frag )
	{
		SColor texColor(SColor::WHITE), lightColor(SColor::WHITE);
		SMaterial* pMaterial = frag.pMaterial;

		if(pMaterial->pDiffuseMap && pMaterial->bUseBilinearSampler)
		{
			pMaterial->pDiffuseMap->Tex2D_Bilinear(frag.uv, texColor, frag.texLod);
		}
		else if(pMaterial->pDiffuseMap)
		{
			pMaterial->pDiffuseMap->Tex2D_Point(frag.uv, texColor, frag.texLod);
		}

		SLightingContext_NormalMap lc;
		lc.uv = &frag.uv;
		lc.lightDirTS = &frag.lightDirTS;
		lc.hVectorTS = &frag.hVectorTS;

		DoPerPixelLighting(lightColor, &lc, pMaterial);

		// Don't modify alpha [1/19/2014 mavaL]
		float alpha = texColor.a;

		texColor *= lightColor;
		texColor.a = alpha;
		texColor.Saturate();

		DWORD& dwDestColor = *frag.finalColor;

#if USE_OIT == 0
		SColor destPixelColor;
		destPixelColor.SetAsInt(dwDestColor);

		DoAlphaBlending(destPixelColor, texColor, destPixelColor, pMaterial);

		dwDestColor = destPixelColor.GetAsInt();
#else
		texColor.a *= pMaterial->transparency;
		dwDestColor = texColor.GetAsInt();
#endif

#if USE_PROFILER == 1
		g_env.profiler->AddRenderedPixel();
#endif
	}
예제 #13
0
SColor SColor::mult(SColor other) {
    SColor c;
    c.R(R() * other.R());
    c.G(G() * other.G());
    c.B(B() * other.B());
    return c;
}
예제 #14
0
void CD3D9Texture::copy16BitMipMap(char* src, char* tgt,
				   s32 width, s32 height,
				   s32 pitchsrc, s32 pitchtgt) const
{
	for (s32 y=0; y<height; ++y)
	{
		for (s32 x=0; x<width; ++x)
		{
			u32 a=0, r=0, g=0, b=0;

			for (s32 dy=0; dy<2; ++dy)
			{
				const s32 tgy = (y*2)+dy;
				for (s32 dx=0; dx<2; ++dx)
				{
					const s32 tgx = (x*2)+dx;

					SColor c;
					if (ColorFormat == ECF_A1R5G5B5)
						c = A1R5G5B5toA8R8G8B8(*(u16*)(&src[(tgx*2)+(tgy*pitchsrc)]));
					else
						c = R5G6B5toA8R8G8B8(*(u16*)(&src[(tgx*2)+(tgy*pitchsrc)]));

					a += c.getAlpha();
					r += c.getRed();
					g += c.getGreen();
					b += c.getBlue();
				}
			}

			a /= 4;
			r /= 4;
			g /= 4;
			b /= 4;

			u16 c;
			if (ColorFormat == ECF_A1R5G5B5)
				c = RGBA16(r,g,b,a);
			else
				c = A8R8G8B8toR5G6B5(SColor(a,r,g,b).color);
			*(u16*)(&tgt[(x*2)+(y*pitchtgt)]) = c;
		}
	}
}
예제 #15
0
void EventReceiver::showExitConfirmDialog(){
	IGUIEnvironment* env = device->getGUIEnvironment();
	IGUIWindow* window = env->addWindow(
		rect<s32>(224, 200, 800, 390),true, L"Confirm dialog");
	env->addStaticText(L"Do you want to exit the game?",
		rect<s32>(35,50,600,150),
		false, // border?
		false, // wordwrap?
		window);
	for (u32 i=0; i<EGDC_COUNT ; ++i){
		SColor col = env->getSkin()->getColor((EGUI_DEFAULT_COLOR)i);
		col.setAlpha(255);
		env->getSkin()->setColor((EGUI_DEFAULT_COLOR)i, col);
	}
	env->addButton(
		rect<s32>(15, 100, 285, 170), window, EXIT_OK, L"Ok");
	env->addButton(
		rect<s32>(300, 100, 555, 170), window, EXIT_CANCEL, L"Cancel");
}
예제 #16
0
void SceneCharSelection::FillCharlist(void)
{
    ZThread::Guard<ZThread::FastMutex> g(mutex);
    charlistbox->clear();
    WorldSession *ws = instance->GetWSession();
    if(ws)
    {
        uint32 ffaction = racedb->GetFieldId("faction");
        for(uint32 i = 0; i < ws->GetCharsCount(); i++)
        {
            CharacterListExt& c = ws->GetCharFromList(i);
            core::stringw entry;
            entry += c.p._name.c_str();
            entry += L", ";
            entry += L"Level ";
            entry += c.p._level;
            entry += L" ";
            entry += c.race.c_str();
            entry += L" ";
            entry += c.class_.c_str();
            entry += L", ";
            entry += c.zone.c_str();
            entry += L" (";
            entry += c.map_.c_str();
            entry += L")";
            charlistbox->addItem(entry.c_str());

            uint32 faction = racedb->GetInt(c.p._race, ffaction);

            SColor col;
            switch(faction)
            {
            case 1: col.set(0xFF, 0xFF, 0x30, 0x30); break;
            case 7: col.set(0xFF, 0x30, 0x30, 0xFF); break;
            default: col.set(0xFFFFFFFF);
            }
            charlistbox->setItemOverrideColor(i,EGUI_LBC_TEXT,col);
            charlistbox->setItemOverrideColor(i,EGUI_LBC_TEXT_HIGHLIGHT,col);

        }
    }
}
예제 #17
0
파일: raytracer.cpp 프로젝트: sondrele/NTNU
SColor RayTracer::shadeIntersection(Intersection in, uint d) {
    if (d <= 0 || in.hasIntersected() == false) {
        // terminate recursion
        return SColor(0, 0, 0);
    }

    Vect shade(0, 0, 0);

    Material *mat = in.getMaterial();
    float kt = mat->getTransparency();
    SColor ks = mat->getSpecColor();
    SColor ka = mat->getAmbColor();
    SColor Cd = mat->getDiffColor();

    SColor ambLight = Whitted::AmbientLightning(kt, ka, Cd);

    std::vector<Light *> lts = scene->getLights();
    for (uint i = 0; i < lts.size(); i++) {
        Light *l = lts.at(i);

        SColor Sj = calculateShadowScalar(*l, in);
        shade = shade + Whitted::Illumination(l, in, Sj);
    }
    
    SColor reflection;
    if (ks.length() > 0) {
        Ray r = in.calculateReflection();
        Intersection rin = scene->calculateRayIntersection(r);
        reflection = shadeIntersection(rin, d-1).linearMult(ks);
    }

    SColor refraction;
    if (kt > 0) {
        Ray r = in.calculateRefraction();
        Intersection rin = scene->calculateRayIntersection(r);
        refraction = shadeIntersection(rin, d-1).linearMult(kt);
    }

    shade = ambLight + shade + reflection + refraction;

    return shade;
}
예제 #18
0
MyCharHeaderMsg::MyCharHeaderMsg( ISceneNode* parent,const wchar_t* msg)
{

	irr::core::list<ISceneNode*> msglist=parent->getChildren();
	irr::core::list<ISceneNode*>::Iterator oper;
	for(oper =msglist.begin(); oper !=msglist.end();++oper )
	{
		//又有新msg要显示,把上次的msg都遍历出来,隐藏..
		if((*oper)->getID()==33){
			(*oper)->setVisible(false);
			//oper=msglist.erase(oper);
		}
	}


		SColor color;
		color.setAlpha(255);
		color.setRed(255);
		color.setBlue(250);
		color.setGreen(0);

	char tmp[512];
	GetWindowsDirectory(tmp,511);
	strcat(tmp,"\\fonts\\SIMSUN.TTC");  //SIMSUN.TTC宋体,新宋体         SIMKAI.TTF楷体     \STXIHEI.TTF   Fixedsys

	IGUIFont* font = getIrrUI()->getFont(tmp,18,true,0);
//	IGUIFont* font = getIrrUI()->getDXFont("宋体",true,18,0,500);
	ITextSceneNode* textnode= getIrrSmgr()->addTextSceneNode(font,	
			msg, 
			color,	parent,
			vector3df(0,90,0), //text相对坐标
			33);   //ID



	scene::ISceneNodeAnimator* a = 0;
	//4.5秒删除
	a= getIrrSmgr()->createDeleteAnimator(4500);
	textnode->addAnimator(a);//字体节点删除
	a->drop();
}
void RenderTarget::getImageData(floatv &data)
{
	IImage* img = driver->createImage(target, position2d<s32>(0,0), target->getSize());

	uint y = img->getDimension().Height;
	uint x = img->getDimension().Width;

	for(uint i = 0; i < y; i++)
	{
		for(uint j = 0; j < x; j++)
		{
			SColor color = img->getPixel(j,i);
			data.push_back((float)(color.getRed()/255.0));
			data.push_back((float)(color.getGreen()/255.0));
			data.push_back((float)(color.getBlue()/255.0));
		}
	}

	img->drop();
	//delete img;
}
// -----------------------------------------------------------------------------
video::ITexture* IconButtonWidget::getDeactivatedTexture(video::ITexture* texture)
{
    SColor c;
    u32 g;

    video::IVideoDriver* driver = irr_driver->getVideoDriver();
    video::IImage* image = driver->createImageFromData (texture->getColorFormat(),
        texture->getSize(), texture->lock(), false);
    texture->unlock();

    //Turn the image into grayscale
    for (u32 x = 0; x < image->getDimension().Width; x++)
    {
        for (u32 y = 0; y < image->getDimension().Height; y++)
        {
            c = image->getPixel(x, y);
            g = ((c.getRed() + c.getGreen() + c.getBlue()) / 3);
            c.set(std::max (0, (int)c.getAlpha() - 120), g, g, g);
            image->setPixel(x, y, c);
        }
    }

    texture = driver->addTexture(texture->getName().getPath() + "_disabled", image);
    texture->grab();

    return texture;
}
예제 #21
0
//! get a filtered pixel
inline SColor CImage::getPixelBox( s32 x, s32 y, s32 fx, s32 fy, s32 bias ) const
{
	SColor c;
	s32 a = 0, r = 0, g = 0, b = 0;

	for ( s32 dx = 0; dx != fx; ++dx )
	{
		for ( s32 dy = 0; dy != fy; ++dy )
		{
			c = getPixel(	core::s32_min ( x + dx, Size.Width - 1 ) ,
							core::s32_min ( y + dy, Size.Height - 1 )
						);

			a += c.getAlpha();
			r += c.getRed();
			g += c.getGreen();
			b += c.getBlue();
		}

	}

	s32 sdiv = s32_log2_s32(fx * fy);

	a = core::s32_clamp( ( a >> sdiv ) + bias, 0, 255 );
	r = core::s32_clamp( ( r >> sdiv ) + bias, 0, 255 );
	g = core::s32_clamp( ( g >> sdiv ) + bias, 0, 255 );
	b = core::s32_clamp( ( b >> sdiv ) + bias, 0, 255 );

	c.set( a, r, g, b );
	return c;
}
예제 #22
0
		inline void SColorHSL::toRGB(SColor &color) const
		{
			if (core::SharedMath::getInstance().iszero(Saturation)) // grey
			{
				u8 c = (u8) (Luminance * 255.0);
				color.setRed(c);
				color.setGreen(c);
				color.setBlue(c);
				return;
			}

			f32 rm2;

			if (Luminance <= 0.5f)
			{
				rm2 = Luminance + Luminance * Saturation;
			}
			else
			{
				rm2 = Luminance + Saturation - Luminance * Saturation;
			}

			const f32 rm1 = 2.0f * Luminance - rm2;

			color.setRed(
					toRGB1(rm1, rm2,
							Hue + (120.0f * core::SharedMath::DegToRad)));
			color.setGreen(toRGB1(rm1, rm2, Hue));
			color.setBlue(
					toRGB1(rm1, rm2,
							Hue - (120.0f * core::SharedMath::DegToRad)));
		}
예제 #23
0
void CD3D8Texture::copy32BitMipMap(char* src, char* tgt,
				   s32 width, s32 height,
				   s32 pitchsrc, s32 pitchtgt) const
{
	SColor c;

	for (int x=0; x<width; ++x)
	{
		for (int y=0; y<height; ++y)
		{
			s32 a=0, r=0, g=0, b=0;

			for (int dx=0; dx<2; ++dx)
			{
				for (int dy=0; dy<2; ++dy)
				{
					int tgx = (x*2)+dx;
					int tgy = (y*2)+dy;

					c = *(u32*)((void*)&src[(tgx<<2)+(tgy*pitchsrc)]);

					a += c.getAlpha();
					r += c.getRed();
					g += c.getGreen();
					b += c.getBlue();
				}
			}

			a >>= 2;
			r >>= 2;
			g >>= 2;
			b >>= 2;

			c = ((a & 0xff)<<24) | ((r & 0xff)<<16) | ((g & 0xff)<<8) | (b & 0xff);
			*(u32*)((void*)&tgt[(x*4)+(y*pitchtgt)]) = c.color;
		}
	}
}
예제 #24
0
SColor CEnvironment::LerpColorMap( float fRisingRate_, const vector<SColor>& aColorMap_ )
{
	SColor ColorReturn;
	if( aColorMap_.empty() )
	{
		ColorReturn = 0xFFFFFFFF;
		return ColorReturn;
	}

	double fR = (aColorMap_.size()-1)*fRisingRate_;
	int nColorLeft = floor( fR );
	int nColorRight = ceil( fR );

	double fRatio = fR - (double)nColorLeft;

	SColor ColorLeft = aColorMap_[nColorLeft];
	SColor ColorRight = aColorMap_[nColorRight];

	ColorReturn.Lerp( ColorLeft, ColorRight, fRatio );
	ColorReturn.A = 255;

	return ColorReturn;
}
	void RasLightMap::RasterizePixel( SScanLine& scanLine, const SScanLinesData& rasData )
	{
#if USE_PERSPEC_CORRECT == 1
		//双曲插值最后一步
		float inv_w = 1 / scanLine.zw.y;
		scanLine.finalUV.Set(scanLine.curUV.x*inv_w, scanLine.curUV.y*inv_w);
#else
		scanLine.finalUV = scanLine.curUV;
#endif			

		if(rasData.pMaterial->bUseBilinearSampler)
		{
			rasData.pMaterial->pDiffuseMap->Tex2D_Bilinear(scanLine.finalUV, scanLine.pixelColor, rasData.texLod);
		}
		else
		{
			rasData.pMaterial->pDiffuseMap->Tex2D_Point(scanLine.finalUV, scanLine.pixelColor, rasData.texLod);
		}

		DWORD& dwDestColor = *(scanLine.pFragmeng->finalColor);

#if USE_OIT == 0
		SColor destPixelColor;
		destPixelColor.SetAsInt(dwDestColor);

		DoAlphaBlending(destPixelColor, scanLine.pixelColor, destPixelColor, rasData.pMaterial);

		dwDestColor = destPixelColor.GetAsInt();
#else
		scanLine.pixelColor.a *= rasData.pMaterial->transparency;
		dwDestColor = scanLine.pixelColor.GetAsInt();
#endif

#if USE_PROFILER == 1
		g_env.profiler->AddRenderedPixel();
#endif
	}
예제 #26
0
SColor Scene::getDiffuse(const vector3df& point, const vector3df& normal, const Material* mat)
{
	SColor ret = mat->getColor();

	SColorf light(0,0,0);
	core::list<Light*>::Iterator it;
	for (it = lights.begin(); it != lights.end(); it++)
	{
		float dot = ((*it)->Position - point).normalize().dotProduct(normal);
		if (dot < 0)
			continue;
		SColorf& lightcol = (*it)->Color;
		float coef = dot * (*it)->getIntensity(point);
		light.r += lightcol.r * coef;
		light.g += lightcol.g * coef;
		light.b += lightcol.b * coef;
	}

	ret.set(255,
		(u32)(ret.getRed() * light.r),
		(u32)(ret.getGreen() * light.g),
		(u32)(ret.getBlue() * light.b));
	return ret;
}
예제 #27
0
void PostProcessing::renderFog()
{
    const Track * const track = World::getWorld()->getTrack();

    // This function is only called once per frame - thus no need for setters.
    const float start = track->getFogStart();
    const SColor tmpcol = track->getFogColor();

    core::vector3df col( tmpcol.getRed() / 255.0f,
        tmpcol.getGreen() / 255.0f,
        tmpcol.getBlue() / 255.0f );

    glDisable(GL_DEPTH_TEST);
    glEnable(GL_BLEND);
    glBlendEquation(GL_FUNC_ADD);
    glBlendFunc(GL_ONE, GL_ONE);


    FullScreenShader::FogShader::getInstance()->SetTextureUnits(irr_driver->getDepthStencilTexture());
    DrawFullScreenEffect<FullScreenShader::FogShader>(1.f / (40.f * start), col);

    glEnable(GL_DEPTH_TEST);
    glDisable(GL_BLEND);
}
예제 #28
0
파일: Universe.cpp 프로젝트: insolite/RPG
Universe::Universe(char *serverAddress, char *serverPort)
{
	instance = this;

	strcpy(this->serverAddress, serverAddress);
	strcpy(this->serverPort, serverPort);
	
	render = new Render(1366, 768, true, L"Client");

	guienv = render->device->getGUIEnvironment();

	gui::IGUIFont* font2 = guienv->getFont("res/font.xml");
	guienv->getSkin()->setFont(font2);

	SColor color;

	color = guienv->getSkin()->getColor(EGDC_3D_FACE);
	color.setAlpha(192);
	guienv->getSkin()->setColor(EGDC_3D_FACE, color);
	
	color = guienv->getSkin()->getColor(EGDC_3D_SHADOW);
	color.setAlpha(192);
	guienv->getSkin()->setColor(EGDC_3D_SHADOW, color);
}
예제 #29
0
// ----------------------------------------------------------------------------
void Terrain::pixelHardBrush(u8* img, int ix, SColor col, bool erase)
{
    if (erase)
    {
        if (col.getBlue() > 0)  { img[ix]     = 0; return; }
        if (col.getGreen() > 0) { img[ix + 1] = 0; return; }
        if (col.getRed() > 0)   { img[ix + 2] = 0; return; }
        return;
    }

    img[ix + 2] = col.getRed();
    img[ix + 1] = col.getGreen();
    img[ix + 0] = col.getBlue();

} // vertexHardBrush
// -----------------------------------------------------------------------------
video::ITexture* IconButtonWidget::getDeactivatedTexture(video::ITexture* texture)
{
#if !defined(SERVER_ONLY) && !defined(USE_GLES2)
    STKTexture* stk_tex = static_cast<STKTexture*>(texture);
    // Compressed texture can't be turned into greyscale
    if (stk_tex->isMeshTexture() && CVS->isTextureCompressionEnabled())
        return stk_tex;

    std::string name = stk_tex->getName().getPtr();
    name += "_disabled";
    STKTexManager* stkm = STKTexManager::getInstance();
    STKTexture* disabled_stk_tex = static_cast<STKTexture*>(stkm->getTexture
        (name, NULL/*tc*/, false /*no_upload*/, false/*create_if_unfound*/));
    if (disabled_stk_tex == NULL)
    {
        SColor c;
        u32 g;

        video::IVideoDriver* driver = irr_driver->getVideoDriver();
        video::IImage* image = driver->createImageFromData
            (video::ECF_A8R8G8B8, stk_tex->getSize(), stk_tex->lock(),
            stk_tex->getTextureImage() == NULL/*ownForeignMemory*/);
        texture->unlock();

        //Turn the image into grayscale
        for (u32 x = 0; x < image->getDimension().Width; x++)
        {
            for (u32 y = 0; y < image->getDimension().Height; y++)
            {
                c = image->getPixel(x, y);
                g = ((c.getRed() + c.getGreen() + c.getBlue()) / 3);
                c.set(std::max (0, (int)c.getAlpha() - 120), g, g, g);
                image->setPixel(x, y, c);
            }
        }
        return stkm->addTexture(new STKTexture(image, name));
    }
    return disabled_stk_tex;
#else
    return texture;
#endif   // !SERVER_ONLY
}