//*********************************************************************************************** // 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,¢er); 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); } } } } } }
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); }
//*********************************************************************************************** // 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, ¢er); 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); } } } }
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); }