IC u32 it_height_rev_base(u32 d, u32 s) { return color_rgba ( color_get_A(d), // diff x color_get_B(d), // diff y color_get_G(d), // diff z (color_get_R(s)+color_get_G(s)+color_get_B(s))/3 ); // height }
IC u32 it_difference (u32 d, u32 orig, u32 ucomp) { return color_rgba( 128+(int(color_get_R(orig))-int(color_get_R(ucomp)))*2, // R-error 128+(int(color_get_G(orig))-int(color_get_G(ucomp)))*2, // G-error 128+(int(color_get_B(orig))-int(color_get_B(ucomp)))*2, // B-error 128+(int(color_get_A(orig))-int(color_get_A(ucomp)))*2 ); // A-error }
BOOL CRenderTarget::u_need_PP () { bool _blur = (param_blur>0.001f); bool _gray = (param_gray>0.001f); bool _noise = (param_noise>0.001f); bool _dual = (param_duality_h>0.001f)||(param_duality_v>0.001f); // bool _menu_pp= g_pGamePersistent?g_pGamePersistent->OnRenderPPUI_query():false; bool _cbase = false; { int _r = color_get_R(param_color_base) ; _r=_abs(_r-int(0x7f)); int _g = color_get_G(param_color_base) ; _g=_abs(_g-int(0x7f)); int _b = color_get_B(param_color_base) ; _b=_abs(_b-int(0x7f)); if (_r>2 || _g>2 || _b>2) _cbase = true ; } bool _cadd = false; { //int _r = color_get_R(param_color_add) ; //int _g = color_get_G(param_color_add) ; //int _b = color_get_B(param_color_add) ; //if (_r>2 || _g>2 || _b>2) _cadd = true ; int _r = _abs((int)(param_color_add.x*255)); int _g = _abs((int)(param_color_add.y*255)); int _b = _abs((int)(param_color_add.z*255)); if (_r>2 || _g>2 || _b>2) _cadd = true ; } return _blur || _gray || _noise || _dual || _cbase || _cadd || u_need_CM(); }
IC u32 it_height_rev (u32 d, u32 s) { return color_rgba ( color_get_A(d), // diff x color_get_B(d), // diff y color_get_G(d), // diff z color_get_R(s) ); // height }
IC u32 it_gloss_rev (u32 d, u32 s) { return color_rgba ( color_get_A(s), // gloss color_get_B(d), color_get_G(d), color_get_R(d) ); }
IC u32 it_gloss_rev_base(u32 d, u32 s) { u32 occ = color_get_A(d)/3; u32 def = 8; u32 gloss = (occ*1+def*3)/4; return color_rgba ( gloss, // gloss color_get_B(d), color_get_G(d), color_get_R(d) ); }
void CHangingLamp::UpdateCL () { inherited::UpdateCL (); if(m_pPhysicsShell) m_pPhysicsShell->InterpolateGlobalTransform(&XFORM()); if (Alive() && light_render->get_active()){ if(Visual()) PKinematics(Visual())->CalculateBones(); // update T&R from light (main) bone Fmatrix xf; if (light_bone!=BI_NONE){ Fmatrix& M = smart_cast<CKinematics*>(Visual())->LL_GetTransform(light_bone); xf.mul (XFORM(),M); VERIFY(!fis_zero(DET(xf))); }else{ xf.set (XFORM()); } light_render->set_rotation (xf.k,xf.i); light_render->set_position (xf.c); if (glow_render)glow_render->set_position (xf.c); // update T&R from ambient bone if (light_ambient){ if (ambient_bone!=light_bone){ if (ambient_bone!=BI_NONE){ Fmatrix& M = smart_cast<CKinematics*>(Visual())->LL_GetTransform(ambient_bone); xf.mul (XFORM(),M); VERIFY(!fis_zero(DET(xf))); }else{ xf.set (XFORM()); } } light_ambient->set_rotation (xf.k,xf.i); light_ambient->set_position (xf.c); } if (lanim){ int frame; u32 clr = lanim->CalculateBGR(Device.fTimeGlobal,frame); // возвращает в формате BGR Fcolor fclr; fclr.set ((float)color_get_B(clr),(float)color_get_G(clr),(float)color_get_R(clr),1.f); fclr.mul_rgb (fBrightness/255.f); light_render->set_color (fclr); if (glow_render) glow_render->set_color (fclr); if (light_ambient) { fclr.mul_rgb (ambient_power); light_ambient->set_color(fclr); } } } }
void ESceneObjectTools::HighlightTexture(LPCSTR tex_name, bool allow_ratio, u32 t_width, u32 t_height, BOOL mark) { if (tex_name&&tex_name[0]){ for (ObjectIt a_it=m_Objects.begin(); a_it!=m_Objects.end(); a_it++){ CSceneObject* s_obj = dynamic_cast<CSceneObject*>(*a_it); CEditableObject* e_obj = s_obj->GetReference(); VERIFY(e_obj); SurfaceVec& s_vec = e_obj->Surfaces(); for (SurfaceIt it=s_vec.begin(); it!=s_vec.end(); it++){ if (0==stricmp((*it)->_Texture(),tex_name)){ Fvector verts[3]; for (EditMeshIt mesh_it=e_obj->FirstMesh(); mesh_it!=e_obj->LastMesh(); mesh_it++){ SurfFaces& surf_faces = (*mesh_it)->GetSurfFaces(); SurfFacesPairIt sf_it = surf_faces.find(*it); if (sf_it!=surf_faces.end()){ IntVec& lst = sf_it->second; for (IntIt i_it=lst.begin(); i_it!=lst.end(); i_it++){ e_obj->GetFaceWorld (s_obj->_Transform(),*mesh_it,*i_it,verts); u32 clr = 0x80FFFFFF; if (allow_ratio){ // select color const Fvector2* tc[3]; Fvector c,e01,e02; e01.sub (verts[1],verts[0]); e02.sub (verts[2],verts[0]); float area = c.crossproduct(e01,e02).magnitude()/2.f; (*mesh_it)->GetFaceTC(*i_it,tc); e01.sub (Fvector().set(tc[1]->x,tc[1]->y,0),Fvector().set(tc[0]->x,tc[0]->y,0)); e02.sub (Fvector().set(tc[2]->x,tc[2]->y,0),Fvector().set(tc[0]->x,tc[0]->y,0)); float p_area = c.crossproduct(e01,e02).magnitude()/2.f; float ratio = _sqrt((p_area*t_width*t_height)/area); int idx_clr = 4; float w = 0.f; if (ratio>=0.f && ratio<50.f) {idx_clr=0; w=ratio/30.f;} else if (ratio>=50.f && ratio<150.f) {idx_clr=1; w=(ratio-30.f)/150.f;} else if (ratio>=150.f && ratio<250.f) {idx_clr=2; w=(ratio-150.f)/250.f;} else if (ratio>=250.f && ratio<500.f) {idx_clr=3; w=(ratio-250.f)/500.f;} float inv_w = 1.f-w; clr = color_rgba(color_get_R(ratio_colors[idx_clr+0])*inv_w+color_get_R(ratio_colors[idx_clr+1])*w, color_get_G(ratio_colors[idx_clr+0])*inv_w+color_get_G(ratio_colors[idx_clr+1])*w, color_get_B(ratio_colors[idx_clr+0])*inv_w+color_get_B(ratio_colors[idx_clr+1])*w, color_get_A(ratio_colors[idx_clr+0])*inv_w+color_get_A(ratio_colors[idx_clr+1])*w); } Tools->m_DebugDraw.AppendSolidFace(verts[0],verts[1],verts[2],clr,false); if (mark) Tools->m_DebugDraw.AppendWireFace(verts[0],verts[1],verts[2],clr,false); } } } } } } } }
void CUIColorAnimatorWrapper::Update() { if (colorAnimation && !isDone) { if (!isCyclic) { if (animationTime < (colorAnimation->iFrameCount / colorAnimation->fFPS)) { currColor = colorAnimation->CalculateBGR(std::abs(animationTime - kRev), currFrame); //Msg("name: %s, color: %x, frame: %d", *colorAnimation->cName,currColor, currFrame); currColor = color_rgba(color_get_B(currColor), color_get_G(currColor), color_get_R(currColor), color_get_A(currColor)); // обновим время animationTime += Device.dwTimeContinual/1000.0f - prevGlobalTime; } else { // В любом случае (при любом ФПС) последним кадром должен быть последний кадр анимации currColor = colorAnimation->CalculateBGR((colorAnimation->iFrameCount - 1) / colorAnimation->fFPS - kRev, currFrame); currColor = color_rgba(color_get_B(currColor), color_get_G(currColor), color_get_R(currColor), color_get_A(currColor)); // Индицируем конец анимации isDone = true; } } else { currColor = colorAnimation->CalculateBGR(Device.dwTimeContinual/1000.0f, currFrame); currColor = color_rgba(color_get_B(currColor), color_get_G(currColor), color_get_R(currColor), color_get_A(currColor)); } if (color) { *color = currColor; } } prevGlobalTime = Device.dwTimeContinual/1000.0f; }
void CEffect_Thunderbolt::OnFrame(shared_str id, float period, float duration) { BOOL enabled = !!(id.size()); if (bEnabled!=enabled){ bEnabled = enabled; next_lightning_time = Device.fTimeGlobal+period+Random.randF(-period*0.5f,period*0.5f); }else if (bEnabled&&(Device.fTimeGlobal>next_lightning_time)){ if (state==stIdle && !!(id.size())) Bolt(id,period,duration); } if (state==stWorking){ if (current_time>life_time) state = stIdle; current_time += Device.fTimeDelta; Fvector fClr; int frame; u32 uClr = current->color_anim->CalculateRGB(current_time/life_time,frame); fClr.set ( clampr(float(color_get_R(uClr)/255.f), 0.f, 1.f), clampr(float(color_get_G(uClr)/255.f), 0.f, 1.f), clampr(float(color_get_B(uClr)/255.f), 0.f, 1.f) ); lightning_phase = 1.5f*(current_time/life_time); clamp (lightning_phase,0.f,1.f); CEnvironment& environment = g_pGamePersistent->Environment(); Fvector& sky_color = environment.CurrentEnv->sky_color; sky_color.mad ( fClr, environment.p_sky_color ); clamp ( sky_color.x, 0.f, 1.f ); clamp ( sky_color.y, 0.f, 1.f ); clamp ( sky_color.z, 0.f, 1.f ); environment.CurrentEnv->sun_color.mad(fClr,environment.p_sun_color); environment.CurrentEnv->fog_color.mad(fClr,environment.p_fog_color); if (::Render->get_generation()==IRender_interface::GENERATION_R2) { R_ASSERT ( _valid(current_direction) ); g_pGamePersistent->Environment().CurrentEnv->sun_dir = current_direction; VERIFY2(g_pGamePersistent->Environment().CurrentEnv->sun_dir.y<0,"Invalid sun direction settings while CEffect_Thunderbolt"); } } }
void CCustomZone::UpdateIdleLight () { if(!m_pIdleLight || !m_pIdleLight->get_active()) return; VERIFY(m_pIdleLAnim); int frame = 0; u32 clr = m_pIdleLAnim->CalculateBGR(Device.fTimeGlobal,frame); // возвращает в формате BGR Fcolor fclr; fclr.set ((float)color_get_B(clr)/255.f,(float)color_get_G(clr)/255.f,(float)color_get_R(clr)/255.f,1.f); float range = m_fIdleLightRange + 0.25f*::Random.randF(-1.f,1.f); m_pIdleLight->set_range (range); m_pIdleLight->set_color (fclr); Fvector pos = Position(); pos.y += m_fIdleLightHeight; m_pIdleLight->set_position(pos); }
void CHelicopter::UpdateHeliParticles () { CKinematics* K = smart_cast<CKinematics*>(Visual()); m_particleXFORM = K->LL_GetTransform(m_smoke_bone); m_particleXFORM.mulA_43(XFORM()); if (m_pParticle){ Fvector vel; Fvector last_pos = PositionStack.back().vPosition; vel.sub(Position(), last_pos); vel.mul(5.0f); m_pParticle->UpdateParent(m_particleXFORM, vel ); } //lighting if(m_light_render->get_active()){ Fmatrix xf; Fmatrix& M = K->LL_GetTransform(u16(m_light_bone)); xf.mul (XFORM(),M); VERIFY(!fis_zero(DET(xf))); m_light_render->set_rotation (xf.k,xf.i); m_light_render->set_position (xf.c); if (m_lanim) { int frame; u32 clr = m_lanim->CalculateBGR(Device.fTimeGlobal,frame); // òþ÷ò¨ð•ðõª ò ¯þ¨üðªõ BGR Fcolor fclr; fclr.set ((float)color_get_B(clr),(float)color_get_G(clr),(float)color_get_R(clr),1.f); fclr.mul_rgb (m_light_brightness/255.f); m_light_render->set_color (fclr); } } }
u32 SSceneSummary::SelectPMColor(float pm) { VERIFY (!s_summary.pm_colors.empty()); u32 from; u32 to; float w = 0.f; if (pm<s_summary.pm_colors[0].pm){ from = s_summary.pm_colors[0].color; to = s_summary.pm_colors[0].color; }else if (pm>=s_summary.pm_colors[s_summary.pm_colors.size()-1].pm){ from = s_summary.pm_colors.back().color; to = s_summary.pm_colors.back().color; }else{ u32 idx_clr = 0; for (; idx_clr<s_summary.pm_colors.size()-1; ++idx_clr) if (pm>=s_summary.pm_colors[idx_clr].pm && pm<s_summary.pm_colors[idx_clr+1].pm) break; w = (pm-s_summary.pm_colors[idx_clr].pm)/float(s_summary.pm_colors[idx_clr+1].pm); from = s_summary.pm_colors[idx_clr+0].color; to = s_summary.pm_colors[idx_clr+1].color; } float inv_w = 1.f-w; return color_rgba (color_get_R(from)*inv_w+color_get_R(to)*w, color_get_G(from)*inv_w+color_get_G(to)*w, color_get_B(from)*inv_w+color_get_B(to)*w, color_get_A(from)*inv_w+color_get_A(to)*w); }
void CGameFont::OnRender() { VERIFY (g_bRendering); if (pShader) RCache.set_Shader (pShader); if (!(uFlags&fsValid)){ CTexture* T = RCache.get_ActiveTexture(0); vTS.set ((int)T->get_Width(),(int)T->get_Height()); /* vHalfPixel.set (0.5f/float(vTS.x),0.5f/float(vTS.y)); for (int i=0; i<256; i++){ Fvector& tc = TCMap[i]; tc.x /= float(vTS.x); tc.y /= float(vTS.y); tc.z /= float(vTS.x); } fTCHeight = fHeight/float(vTS.y); uFlags |= fsValid; */ fTCHeight = fHeight/float(vTS.y); uFlags |= fsValid; } for (u32 i=0; i<strings.size(); ){ // calculate first-fit int count = 1; int length = xr_strlen(strings[i].string); while ((i+count)<strings.size()) { int L = xr_strlen(strings[i+count].string); if ((L+length)<MAX_CHARS){ count ++; length += L; } else break; } // lock AGP memory u32 vOffset; FVF::TL* v = (FVF::TL*)RCache.Vertex.Lock (length*4,pGeom.stride(),vOffset); FVF::TL* start = v; // fill vertices u32 last = i+count; for (; i<last; i++) { String &PS = strings[i]; int len = xr_strlen(PS.string); if (len) { float X = float(iFloor(PS.x)); float Y = float(iFloor(PS.y)); float S = PS.height*g_current_font_scale.y; float Y2 = Y+S; switch(PS.align) { case alCenter: X -= ( iFloor(SizeOf_(PS.string,PS.height)*.5f) ) * g_current_font_scale.x; break; case alRight: X -= iFloor(SizeOf_(PS.string,PS.height)); break; } u32 clr,clr2; clr2 = clr = PS.c; if (uFlags&fsGradient){ u32 _R = color_get_R (clr)/2; u32 _G = color_get_G (clr)/2; u32 _B = color_get_B (clr)/2; u32 _A = color_get_A (clr); clr2 = color_rgba (_R,_G,_B,_A); } float tu,tv; for (int j=0; j<len; j++) { int c = GetCharRM (PS.string[j]); Fvector l = GetCharTC (PS.string[j]); float scw = l.z * g_current_font_scale.x; //. float scw = vTS.x * l.z * g_current_font_scale.x; float fTCWidth = l.z/vTS.x; if ((c>=0)&&!fis_zero(l.z)) { tu = l.x/vTS.x;//+vHalfPixel.x; tv = l.y/vTS.y;//+vHalfPixel.y; v->set (X-0.5f, Y2-0.5f, clr2,tu, tv+fTCHeight); v++; v->set (X-0.5f, Y-0.5f, clr, tu, tv); v++; v->set (X+scw-0.5f, Y2-0.5f, clr2,tu+fTCWidth, tv+fTCHeight); v++; v->set (X+scw-0.5f, Y-0.5f, clr, tu+fTCWidth, tv); v++; } X+=scw*vInterval.x; } } } // Unlock and draw u32 vCount = (u32)(v-start); RCache.Vertex.Unlock (vCount,pGeom.stride()); if (vCount){ RCache.set_Geometry (pGeom); RCache.Render (D3DPT_TRIANGLELIST,vOffset,0,vCount,0,vCount/2); } } strings.clear_not_free (); }
u32 CLAItem::InterpolateBGR(int frame) { u32 c = InterpolateRGB(frame); return color_rgba(color_get_B(c),color_get_G(c),color_get_R(c),color_get_A(c)); }
void CInifile::w_color ( LPCSTR S, LPCSTR L, u32 V, LPCSTR comment ) { string128 temp; sprintf_s (temp,sizeof(temp),"%d,%d,%d,%d", color_get_R(V), color_get_G(V), color_get_B(V), color_get_A(V)); w_string (S,L,temp,comment); }