Esempio n. 1
0
//***********************************************************************************************
// Draws a light source for EDITOR purpose...
//-----------------------------------------------------------------------------------------------
// VERIFIED (Cyril 2001/10/15)
//***********************************************************************************************
void EERIEDrawLight(LPDIRECT3DDEVICE7 pd3dDevice,EERIE_LIGHT * el) 
{
//	long i;
 
	D3DTLVERTEX in;
	D3DTLVERTEX center;
	SETCULL(pd3dDevice,D3DCULL_NONE);
	
	if (el!=NULL)
	if (el->treat) 
	{
		el->mins.x=999999999.f;
		in.sx=el->pos.x;
		in.sy=el->pos.y;
		in.sz=el->pos.z;

		if (ACTIVECAM->type==CAM_TOPVIEW)
			EERIEDrawSprite(pd3dDevice,&in,11.f,lightsource_tc,EERIERGB(el->rgb.r,el->rgb.g,el->rgb.b),2.f);
		else 
		{
			EERIEDrawSprite(pd3dDevice,&in,11.f,lightsource_tc,EERIERGB(el->rgb.r,el->rgb.g,el->rgb.b),2.f);
			memcpy(&el->mins,&SPRmins,sizeof(EERIE_3D));
			memcpy(&el->maxs,&SPRmaxs,sizeof(EERIE_3D));

			if (el->selected)
			{
				if ((el->mins.x>=-200.f) && (el->mins.x<=1000.f))
				if ((el->mins.y>=-200.f) && (el->mins.y<=1000.f))
				{
					in.sx=el->pos.x;
					in.sy=el->pos.y;
					in.sz=el->pos.z;
					EERIETreatPoint(&in,&center);	

					if ((center.sz>0.f) && (center.sz<1000.f))
					{
						float t=(1.f-center.sz)*ACTIVECAM->use_focal*DIV3000;
						float rad=el->fallstart*t;
						EERIEDrawCircle(center.sx,center.sy,rad,0xFFFFFF00,0.0001f);
						rad=el->fallend*t;
						EERIEDrawCircle(center.sx,center.sy,rad,0xFFFF0000,0.0001f);
						rad=el->intensity*200.f*t;
						EERIEDrawCircle(center.sx,center.sy,rad,0xFF00FF00,0.0001f);
					}
				}
			}			
		}
	}
}
Esempio n. 2
0
static void drawDebugLights() {
	
	GRenderer->SetRenderState(Renderer::AlphaBlending, true);
	GRenderer->SetCulling(CullNone);
	
	GRenderer->SetBlendFunc(BlendOne, BlendOne);
	
	for(size_t i = 0; i < MAX_LIGHTS; i++) {
		
		EERIE_LIGHT * light = GLight[i];
		if(!light) {
			continue;
		}
		
		TexturedVertex center;
		EE_RTP(light->pos, center);
		
		const Rect mouseTestRect(
		center.p.x - 20,
		center.p.y - 20,
		center.p.x + 20,
		center.p.y + 20
		);
		
		if(mouseTestRect.contains(Vec2i(DANAEMouse))) {
			
			Sphere fallstart;
			fallstart.origin = light->pos;
			fallstart.radius = light->fallstart;
			drawLineSphere(fallstart, Color(Color3<u8>::green, 200));
			Sphere fallend;
			fallend.origin = light->pos;
			fallend.radius = light->fallend;
			drawLineSphere(fallend, Color(Color3<u8>::red, 200));
		}
		
		if(light->m_screenRect.valid())
			drawDebugBoundingBox(light->m_screenRect);
	}
	
	for(size_t i = 0; i < MAX_LIGHTS; i++) {
		
		EERIE_LIGHT * light = GLight[i];
		if(!light) {
			continue;
		}
		
		EERIEDrawSprite(light->pos, 11.f, g_lightSourceTexture, light->rgb.to<u8>(), 0.5f);
	}
	
	GRenderer->SetCulling(CullCCW);
	GRenderer->SetRenderState(Renderer::AlphaBlending, false);
	
}
Esempio n. 3
0
//***********************************************************************************************
// Draws a light source for EDITOR purpose...
//-----------------------------------------------------------------------------------------------
// VERIFIED (Cyril 2001/10/15)
//***********************************************************************************************
void EERIEDrawLight(EERIE_LIGHT * el) 
{
//	long i;
 
	TexturedVertex in;
	TexturedVertex center;
	GRenderer->SetCulling(Renderer::CullNone);
	
	if(!el || !el->treat)
		return;


	el->mins.x=999999999.f;
	in.p = el->pos;

	EERIEDrawSprite(&in, 11.f, lightsource_tc, el->rgb.to<u8>(), 2.f);


	el->mins = SPRmins;
	el->maxs = SPRmaxs;

	if(el->selected) {
		if((el->mins.x>=-200.f) && (el->mins.x<=1000.f))
		if((el->mins.y>=-200.f) && (el->mins.y<=1000.f)) {
			in.p = el->pos;
			EE_RTP(&in, &center);

			if(center.p.z > 0.f && center.p.z < 1000.f) {
				float t=(1.f-center.p.z)*ACTIVECAM->orgTrans.use_focal*( 1.0f / 3000 );
				float rad=el->fallstart*t;
				EERIEDrawCircle(center.p.x, center.p.y, rad, Color::yellow, 0.0001f);
				rad=el->fallend*t;
				EERIEDrawCircle(center.p.x, center.p.y, rad, Color::red, 0.0001f);
				rad=el->intensity*200.f*t;
				EERIEDrawCircle(center.p.x, center.p.y, rad, Color::green, 0.0001f);
			}
		}
	}
}
Esempio n. 4
0
void renderLightFlares() {
	
	ARX_PROFILE_FUNC();
	
	if(g_debugToggles[6]) {
		RaycastDebugDraw();
	}
	
	GRenderer->SetFogColor(Color::none);
	UseRenderState state(render3D().blend(BlendOne, BlendOne).depthWrite(false).depthTest(false));
	
	for(size_t i = 0; i < g_culledDynamicLightsCount; i++) {
		const EERIE_LIGHT & el = *g_culledDynamicLights[i];
		
		if(!el.m_exists || !el.m_isVisible || !(el.extras & EXTRAS_FLARE) || el.m_flareFader <= 0.f) {
			continue;
		}
		
		float v = el.m_flareFader;
		
		if(FADEDIR) {
			v *= 1.f - LAST_FADEVALUE;
		}
		
		float size = -el.ex_flaresize;
		if(el.extras & EXTRAS_FIXFLARESIZE) {
			// This is only used for one light in the whole game and makes it's flare gigantic when up close
			// TODO Is this part of some puzze or a bug / obsolete workaround?
			size = el.ex_flaresize;
		}
		
		EERIEDrawSprite(el.pos, size, tflare, Color(el.rgb * v), EE_RT(el.pos).z);
		
	}
	
}
void ARX_MAGICAL_FLARES_Draw() {

	if(!flarenum)
		return;

	shinum++;
	if(shinum >= 10) {
		shinum = 1;
	}

	long TICKS = long(arxtime) - FRAMETICKS;
	FRAMETICKS = (unsigned long)(arxtime);
	if(TICKS < 0) {
		return;
	}

	GRenderer->SetRenderState(Renderer::DepthWrite, false);
	GRenderer->SetBlendFunc(Renderer::BlendOne, Renderer::BlendOne);
	GRenderer->SetRenderState(Renderer::AlphaBlending, true);

	bool key = !GInput->actionPressed(CONTROLS_CUST_MAGICMODE);

	for(long j = 1; j < 5; j++) {

		TextureContainer * surf;
		switch(j) {
			case 2:  surf = flaretc.lumignon; break;
			case 3:  surf = flaretc.lumignon2; break;
			case 4:  surf = flaretc.plasm; break;
			default: surf = flaretc.shine[shinum]; break;
		}

		for(long i = 0; i < MAX_FLARES; i++) {

			FLARES & flare = magicFlares[i];

			if(!flare.exist || flare.type != j) {
				continue;
			}

			flare.tolive -= float(TICKS * 2);
			if(flare.flags & 1) {
				flare.tolive -= float(TICKS * 4);
			} else if (key) {
				flare.tolive -= float(TICKS * 6);
			}

			float z = (flare.tolive * 0.00025f);
			float s;
			if(flare.type == 1) {
				s = flare.size * 2 * z;
			} else if(flare.type == 4) {
				s = flare.size * 2.f * z + 10.f;
			} else {
				s = flare.size;
			}

			if(flare.tolive <= 0.f || flare.y < -64.f || s < 3.f) {

				if(flare.io && ValidIOAddress(flare.io)) {
					flare.io->flarecount--;
				}

				if(ValidDynLight(flare.dynlight)) {
					DynLight[flare.dynlight].exist = 0;
				}

				flare.dynlight = -1;
				flare.exist = 0;
				flarenum--;

				continue;
			}

			if(flare.type == 1 && z < 0.6f)  {
				z = 0.6f;
			}

			Color3f c = flare.rgb * z;
			flare.tv.color = c.toBGR();
			flare.v.p = flare.tv.p;

			DynLight[0].rgb = componentwise_max(DynLight[0].rgb, c);

			if(ValidDynLight(flare.dynlight)) {
				EERIE_LIGHT * el = &DynLight[flare.dynlight];
				el->pos = flare.v.p;
				el->rgb = c;
			}

			if(!flare.io) {
				GRenderer->SetRenderState(Renderer::DepthTest, false);
			} else {
				GRenderer->SetRenderState(Renderer::DepthTest, true);
			}

			if(flare.bDrawBitmap) {
				s *= 2.f;
				EERIEDrawBitmap(flare.v.p.x, flare.v.p.y, s, s, flare.v.p.z,
								surf, Color::fromBGRA(flare.tv.color));
			} else {
				EERIEDrawSprite(&flare.v, s * 0.025f + 1.f, surf,
								Color::fromBGRA(flare.tv.color), 2.f);
			}

		}
	}

	DynLight[0].rgb = componentwise_min(DynLight[0].rgb, Color3f::white);

	GRenderer->SetRenderState(Renderer::DepthWrite, true);
	GRenderer->SetRenderState(Renderer::DepthTest, true);
}