void CCarWeapon::UpdateCL() { if(!m_bActive) return; UpdateBarrelDir (); CKinematics* K = smart_cast<CKinematics*>(m_object->Visual()); K->CalculateBones_Invalidate(); K->CalculateBones (); UpdateFire (); }
void CHangingLamp::RespawnInit() { Init(); if(Visual()){ CKinematics* K = smart_cast<CKinematics*>(Visual()); K->LL_SetBonesVisible(u64(-1)); K->CalculateBones_Invalidate(); K->CalculateBones (); } }
void CInventoryItem::UpdateXForm () { if (0==object().H_Parent()) return; // Get access to entity and its visual CEntityAlive* E = smart_cast<CEntityAlive*>(object().H_Parent()); if (!E) return; if (E->cast_base_monster()) return; const CInventoryOwner *parent = smart_cast<const CInventoryOwner*>(E); if (parent && parent->use_simplified_visual()) return; if (parent->attached(this)) return; R_ASSERT (E); CKinematics* V = smart_cast<CKinematics*> (E->Visual()); VERIFY (V); // Get matrices int boneL,boneR,boneR2; E->g_WeaponBones(boneL,boneR,boneR2); // if ((HandDependence() == hd1Hand) || (STATE == eReload) || (!E->g_Alive())) // boneL = boneR2; #pragma todo("TO ALL: serious performance problem") V->CalculateBones (); Fmatrix& mL = V->LL_GetTransform(u16(boneL)); Fmatrix& mR = V->LL_GetTransform(u16(boneR)); // Calculate Fmatrix mRes; Fvector R,D,N; D.sub (mL.c,mR.c); D.normalize_safe(); if(fis_zero(D.magnitude())) { mRes.set(E->XFORM()); mRes.c.set(mR.c); } else { D.normalize(); R.crossproduct (mR.j,D); N.crossproduct (D,R); N.normalize(); mRes.set (R,N,D,mR.c); mRes.mulA_43 (E->XFORM()); } // UpdatePosition (mRes); object().Position().set(mRes.c); }
void CHangingLamp::TurnOn () { light_render->set_active (true); if (glow_render) glow_render->set_active (true); if (light_ambient) light_ambient->set_active (true); if (Visual()){ CKinematics* K = smart_cast<CKinematics*>(Visual()); K->LL_SetBoneVisible (light_bone, TRUE, TRUE); K->CalculateBones_Invalidate(); K->CalculateBones (); } processing_activate (); }
void CPhysicsShellHolder::UpdateXFORM(const Fmatrix &upd) { inherited::UpdateXFORM(upd); static int method = 1 + 4 + 8; // alpet: набор флагов для отладки, можно менять значение во время выполнения из Watches if (PPhysicsShell()) { // m_pPhysicsShell->SetTransform(upd); if (method & 1) { PPhysicsShell()->mXFORM.set(upd); PPhysicsShell()->SetGlTransformDynamic(upd); } if (method & 2) { // стянуто из Car.cpp и как-то не так работает bool enable = PPhysicsShell()->isEnabled(); Fmatrix inv, replace; Fmatrix restored_form; PPhysicsShell()->GetGlobalTransformDynamic(&restored_form); inv.set(restored_form); inv.invert(); replace.mul(upd, inv); PPhysicsShell()->SetTransform (replace); if (enable) PPhysicsShell()->Enable(); else PPhysicsShell()->Disable(); // PPhysicsShell()->GetGlobalTransformDynamic(&XFORM()); } // пересчет костей CKinematics *K = PKinematics(Visual()); if (K) { K->CalculateBones_Invalidate(); K->CalculateBones(); } if (method & 4) PPhysicsShell()->Update(); if (method & 8) PPhysicsShell()->GetGlobalTransformDynamic(&XFORM()); } }
void CHelicopter::DieHelicopter() { if ( state() == CHelicopter::eDead ) return; CEntity::Die(NULL); m_engineSound.stop (); m_brokenSound.create (pSettings->r_string(*cNameSect(), "broken_snd"),st_Effect,sg_SourceType); m_brokenSound.play_at_pos (0,XFORM().c,sm_Looped); CKinematics* K = smart_cast<CKinematics*>(Visual()); if(true /*!PPhysicsShell()*/){ string256 I; LPCSTR bone; u16 bone_id; for (u32 i=0, n=_GetItemCount(*m_death_bones_to_hide); i<n; ++i){ bone = _GetItem(*m_death_bones_to_hide,i,I); bone_id = K->LL_BoneID (bone); K->LL_SetBoneVisible(bone_id,FALSE,TRUE); } ///PPhysicsShell()=P_build_Shell (this,false); PPhysicsShell()->EnabledCallbacks(TRUE); PPhysicsShell()->set_ObjectContactCallback(CollisionCallbackDead); PPhysicsShell()->set_ContactCallback(ContactShotMark); } Fvector lin_vel; Fvector prev_pos = PositionStack.front().vPosition; lin_vel.sub (XFORM().c,prev_pos); if(Device.dwTimeGlobal != PositionStack.front().dwTime) lin_vel.div((Device.dwTimeGlobal-PositionStack.front().dwTime)/1000.0f); lin_vel.mul (m_death_lin_vel_k); PPhysicsShell()->set_LinearVel (lin_vel); PPhysicsShell()->set_AngularVel (m_death_ang_vel); PPhysicsShell()->Enable (); K->CalculateBones_Invalidate (); K->CalculateBones (); setState (CHelicopter::eDead); m_engineSound.stop (); processing_deactivate (); m_dead = true; }
void CArtefact::UpdateXForm() { if (Device.dwFrame!=dwXF_Frame) { dwXF_Frame = Device.dwFrame; if (0==H_Parent()) return; // Get access to entity and its visual CEntityAlive* E = smart_cast<CEntityAlive*>(H_Parent()); if(!E) return ; const CInventoryOwner *parent = smart_cast<const CInventoryOwner*>(E); if (parent && parent->use_simplified_visual()) return; VERIFY (E); CKinematics* V = smart_cast<CKinematics*> (E->Visual()); VERIFY (V); // Get matrices int boneL,boneR,boneR2; E->g_WeaponBones (boneL,boneR,boneR2); boneL = boneR2; V->CalculateBones (); Fmatrix& mL = V->LL_GetTransform(u16(boneL)); Fmatrix& mR = V->LL_GetTransform(u16(boneR)); // Calculate Fmatrix mRes; Fvector R,D,N; D.sub (mL.c,mR.c); D.normalize_safe(); R.crossproduct (mR.j,D); R.normalize_safe(); N.crossproduct (D,R); N.normalize_safe(); mRes.set (R,N,D,mR.c); mRes.mulA_43 (E->XFORM()); // UpdatePosition (mRes); XFORM().mul (mRes,offset()); } }
void CGraviArtefact::UpdateCLChild() { VERIFY(!ph_world->Processing()); if (getVisible() && m_pPhysicsShell) { if (m_fJumpHeight) { Fvector dir; dir.set(0, -1.f, 0); collide::rq_result RQ; //проверить высоту артифакта if(Level().ObjectSpace.RayPick(Position(), dir, m_fJumpHeight, collide::rqtBoth, RQ, this)) { dir.y = 1.f; m_pPhysicsShell->applyImpulse(dir, 30.f * Device.fTimeDelta * m_pPhysicsShell->getMass()); } } } else if(H_Parent()) { XFORM().set(H_Parent()->XFORM()); if (GameID() == GAME_ARTEFACTHUNT && m_CarringBoneID != u16(-1)) { CKinematics* K = smart_cast<CKinematics*>(H_Parent()->Visual()); if (K) { K->CalculateBones (); Fmatrix Ruck_MTX = K->LL_GetTransform(m_CarringBoneID); Fvector x; x.set(-0.1f, 0.f, -0.3f); Ruck_MTX.translate_add(x); Ruck_MTX.mulA_43 (XFORM()); XFORM().set(Ruck_MTX); }; }; }; }
void R_dsgraph_structure::r_dsgraph_render_R1_box (IRender_Sector* _S, Fbox& BB, int sh) { CSector* S = (CSector*)_S; lstVisuals.clear (); lstVisuals.push_back (S->root()); for (u32 test=0; test<lstVisuals.size(); test++) { IRender_Visual* V = lstVisuals[test]; // Visual is 100% visible - simply add it xr_vector<IRender_Visual*>::iterator I,E; // it may be usefull for 'hierrarhy' visuals switch (V->Type) { case MT_HIERRARHY: { // Add all children FHierrarhyVisual* pV = (FHierrarhyVisual*)V; I = pV->children.begin (); E = pV->children.end (); for (; I!=E; I++) { IRender_Visual* T = *I; if (BB.intersect(T->vis.box)) lstVisuals.push_back(T); } } break; case MT_SKELETON_ANIM: case MT_SKELETON_RIGID: { // Add all children (s) CKinematics * pV = (CKinematics*)V; pV->CalculateBones (TRUE); I = pV->children.begin (); E = pV->children.end (); for (; I!=E; I++) { IRender_Visual* T = *I; if (BB.intersect(T->vis.box)) lstVisuals.push_back(T); } } break; case MT_LOD: { FLOD * pV = (FLOD*) V; I = pV->children.begin (); E = pV->children.end (); for (; I!=E; I++) { IRender_Visual* T = *I; if (BB.intersect(T->vis.box)) lstVisuals.push_back(T); } } break; default: { // Renderable visual ShaderElement* E = V->shader->E[sh]._get(); if (E) { for (u32 pass=0; pass<E->passes.size(); pass++) { RCache.set_Element (E,pass); V->Render (-1.f); } } } break; } } }
void CRender::add_Static(IRender_Visual *pVisual, u32 planes) { // Check frustum visibility and calculate distance to visual's center EFC_Visible VIS; vis_data& vis = pVisual->vis; VIS = View->testSAABB (vis.sphere.P,vis.sphere.R,vis.box.data(),planes); if (fcvNone==VIS) return; if (!HOM.visible(vis)) return; // If we get here visual is visible or partially visible xr_vector<IRender_Visual*>::iterator I,E; // it may be usefull for 'hierrarhy' visuals switch (pVisual->Type) { case MT_PARTICLE_GROUP: { // Add all children, doesn't perform any tests PS::CParticleGroup* pG = (PS::CParticleGroup*)pVisual; for (PS::CParticleGroup::SItemVecIt i_it=pG->items.begin(); i_it!=pG->items.end(); i_it++){ PS::CParticleGroup::SItem& I = *i_it; if (fcvPartial==VIS) { if (I._effect) add_Dynamic (I._effect,planes); for (xr_vector<IRender_Visual*>::iterator pit = I._children_related.begin(); pit!=I._children_related.end(); pit++) add_Dynamic(*pit,planes); for (xr_vector<IRender_Visual*>::iterator pit = I._children_free.begin(); pit!=I._children_free.end(); pit++) add_Dynamic(*pit,planes); } else { if (I._effect) add_leafs_Dynamic (I._effect); for (xr_vector<IRender_Visual*>::iterator pit = I._children_related.begin(); pit!=I._children_related.end(); pit++) add_leafs_Dynamic(*pit); for (xr_vector<IRender_Visual*>::iterator pit = I._children_free.begin(); pit!=I._children_free.end(); pit++) add_leafs_Dynamic(*pit); } } } break; case MT_HIERRARHY: { // Add all children FHierrarhyVisual* pV = (FHierrarhyVisual*)pVisual; I = pV->children.begin (); E = pV->children.end (); if (fcvPartial==VIS) { for (; I!=E; I++) add_Static (*I,planes); } else { for (; I!=E; I++) add_leafs_Static (*I); } } break; case MT_SKELETON_ANIM: case MT_SKELETON_RIGID: { // Add all children, doesn't perform any tests CKinematics * pV = (CKinematics*)pVisual; pV->CalculateBones (TRUE); I = pV->children.begin (); E = pV->children.end (); if (fcvPartial==VIS) { for (; I!=E; I++) add_Static (*I,planes); } else { for (; I!=E; I++) add_leafs_Static (*I); } } break; case MT_LOD: { FLOD * pV = (FLOD*) pVisual; float D; float ssa = CalcSSA (D,pV->vis.sphere.P,pV); ssa *= pV->lod_factor; if (ssa<r_ssaLOD_A) { if (ssa<r_ssaDISCARD) return; mapLOD_Node* N = mapLOD.insertInAnyWay(D); N->val.ssa = ssa; N->val.pVisual = pVisual; } if (ssa>r_ssaLOD_B) { // Add all children, perform tests I = pV->children.begin (); E = pV->children.end (); for (; I!=E; I++) add_leafs_Static (*I); } } break; case MT_TREE_ST: case MT_TREE_PM: { // General type of visual r_dsgraph_insert_static (pVisual); } return; default: { // General type of visual r_dsgraph_insert_static (pVisual); } break; } }
BOOL CRender::add_Dynamic(IRender_Visual *pVisual, u32 planes) { // Check frustum visibility and calculate distance to visual's center Fvector Tpos; // transformed position EFC_Visible VIS; val_pTransform->transform_tiny (Tpos, pVisual->vis.sphere.P); VIS = View->testSphere (Tpos, pVisual->vis.sphere.R,planes); if (fcvNone==VIS) return FALSE ; // If we get here visual is visible or partially visible xr_vector<IRender_Visual*>::iterator I,E; // it may be usefull for 'hierrarhy' visuals switch (pVisual->Type) { case MT_PARTICLE_GROUP: { // Add all children, doesn't perform any tests PS::CParticleGroup* pG = (PS::CParticleGroup*)pVisual; for (PS::CParticleGroup::SItemVecIt i_it=pG->items.begin(); i_it!=pG->items.end(); i_it++) { PS::CParticleGroup::SItem& I = *i_it; if (fcvPartial==VIS) { if (I._effect) add_Dynamic (I._effect,planes); for (xr_vector<IRender_Visual*>::iterator pit = I._children_related.begin(); pit!=I._children_related.end(); pit++) add_Dynamic(*pit,planes); for (xr_vector<IRender_Visual*>::iterator pit = I._children_free.begin(); pit!=I._children_free.end(); pit++) add_Dynamic(*pit,planes); } else { if (I._effect) add_leafs_Dynamic (I._effect); for (xr_vector<IRender_Visual*>::iterator pit = I._children_related.begin(); pit!=I._children_related.end(); pit++) add_leafs_Dynamic(*pit); for (xr_vector<IRender_Visual*>::iterator pit = I._children_free.begin(); pit!=I._children_free.end(); pit++) add_leafs_Dynamic(*pit); } } } break; case MT_HIERRARHY: { // Add all children FHierrarhyVisual* pV = (FHierrarhyVisual*)pVisual; I = pV->children.begin (); E = pV->children.end (); if (fcvPartial==VIS) { for (; I!=E; I++) add_Dynamic (*I,planes); } else { for (; I!=E; I++) add_leafs_Dynamic (*I); } } break; case MT_SKELETON_ANIM: case MT_SKELETON_RIGID: { // Add all children, doesn't perform any tests CKinematics * pV = (CKinematics*)pVisual; BOOL _use_lod = FALSE ; if (pV->m_lod) { Fvector Tpos; float D; val_pTransform->transform_tiny (Tpos, pV->vis.sphere.P); float ssa = CalcSSA (D,Tpos,pV->vis.sphere.R/2.f); // assume dynamics never consume full sphere if (ssa<r_ssaLOD_A) _use_lod = TRUE ; } if (_use_lod) { add_leafs_Dynamic (pV->m_lod) ; } else { pV->CalculateBones (TRUE); pV->CalculateWallmarks (); //. bug? I = pV->children.begin (); E = pV->children.end (); for (; I!=E; I++) add_leafs_Dynamic (*I); } /* I = pV->children.begin (); E = pV->children.end (); if (fcvPartial==VIS) { for (; I!=E; I++) add_Dynamic (*I,planes); } else { for (; I!=E; I++) add_leafs_Dynamic (*I); } */ } break; default: { // General type of visual r_dsgraph_insert_dynamic(pVisual,Tpos); } break; } return TRUE; }
void CRender::add_leafs_Static(IRender_Visual *pVisual) { if (!HOM.visible(pVisual->vis)) return; // Visual is 100% visible - simply add it xr_vector<IRender_Visual*>::iterator I,E; // it may be usefull for 'hierrarhy' visuals switch (pVisual->Type) { case MT_PARTICLE_GROUP: { // Add all children, doesn't perform any tests PS::CParticleGroup* pG = (PS::CParticleGroup*)pVisual; for (PS::CParticleGroup::SItemVecIt i_it=pG->items.begin(); i_it!=pG->items.end(); i_it++){ PS::CParticleGroup::SItem& I = *i_it; if (I._effect) add_leafs_Dynamic (I._effect); for (xr_vector<IRender_Visual*>::iterator pit = I._children_related.begin(); pit!=I._children_related.end(); pit++) add_leafs_Dynamic(*pit); for (xr_vector<IRender_Visual*>::iterator pit = I._children_free.begin(); pit!=I._children_free.end(); pit++) add_leafs_Dynamic(*pit); } } return; case MT_HIERRARHY: { // Add all children, doesn't perform any tests FHierrarhyVisual* pV = (FHierrarhyVisual*)pVisual; I = pV->children.begin (); E = pV->children.end (); for (; I!=E; I++) add_leafs_Static (*I); } return; case MT_SKELETON_ANIM: case MT_SKELETON_RIGID: { // Add all children, doesn't perform any tests CKinematics * pV = (CKinematics*)pVisual; pV->CalculateBones (TRUE); I = pV->children.begin (); E = pV->children.end (); for (; I!=E; I++) add_leafs_Static (*I); } return; case MT_LOD: { FLOD * pV = (FLOD*) pVisual; float D; float ssa = CalcSSA(D,pV->vis.sphere.P,pV); ssa *= pV->lod_factor; if (ssa<r_ssaLOD_A) { if (ssa<r_ssaDISCARD) return; mapLOD_Node* N = mapLOD.insertInAnyWay(D); N->val.ssa = ssa; N->val.pVisual = pVisual; } if (ssa>r_ssaLOD_B) { // Add all children, doesn't perform any tests I = pV->children.begin (); E = pV->children.end (); for (; I!=E; I++) add_leafs_Static (*I); } } return; case MT_TREE_PM: case MT_TREE_ST: { // General type of visual r_dsgraph_insert_static (pVisual); } return; default: { // General type of visual r_dsgraph_insert_static (pVisual); } return; } }
void CRender::add_leafs_Dynamic (IRender_Visual *pVisual) { if (0==pVisual) return; // Visual is 100% visible - simply add it xr_vector<IRender_Visual*>::iterator I,E; // it may be useful for 'hierrarhy' visual switch (pVisual->Type) { case MT_PARTICLE_GROUP: { // Add all children, doesn't perform any tests PS::CParticleGroup* pG = (PS::CParticleGroup*)pVisual; for (PS::CParticleGroup::SItemVecIt i_it=pG->items.begin(); i_it!=pG->items.end(); i_it++) { PS::CParticleGroup::SItem& I = *i_it; if (I._effect) add_leafs_Dynamic (I._effect); for (xr_vector<IRender_Visual*>::iterator pit = I._children_related.begin(); pit!=I._children_related.end(); pit++) add_leafs_Dynamic(*pit); for (xr_vector<IRender_Visual*>::iterator pit = I._children_free.begin(); pit!=I._children_free.end(); pit++) add_leafs_Dynamic(*pit); } } return; case MT_HIERRARHY: { // Add all children, doesn't perform any tests FHierrarhyVisual* pV = (FHierrarhyVisual*)pVisual; I = pV->children.begin (); E = pV->children.end (); for (; I!=E; I++) add_leafs_Dynamic (*I); } return; case MT_SKELETON_ANIM: case MT_SKELETON_RIGID: { // Add all children, doesn't perform any tests CKinematics * pV = (CKinematics*)pVisual; BOOL _use_lod = FALSE ; if (pV->m_lod) { Fvector Tpos; float D; val_pTransform->transform_tiny (Tpos, pV->vis.sphere.P); float ssa = CalcSSA (D,Tpos,pV->vis.sphere.R/2.f); // assume dynamics never consume full sphere if (ssa<r_ssaLOD_A) _use_lod = TRUE; } if (_use_lod) { add_leafs_Dynamic (pV->m_lod) ; } else { pV->CalculateBones (TRUE); pV->CalculateWallmarks (); //. bug? I = pV->children.begin (); E = pV->children.end (); for (; I!=E; I++) add_leafs_Dynamic (*I); } } return; default: { // General type of visual // Calculate distance to it's center Fvector Tpos; val_pTransform->transform_tiny (Tpos, pVisual->vis.sphere.P); r_dsgraph_insert_dynamic (pVisual,Tpos); } return; } }
void CUIMainIngameWnd::draw_adjust_mode() { if (g_bHudAdjustMode&&m_pWeapon) //draw firePoint,ShellPoint etc { CActor* pActor = smart_cast<CActor*>(Level().CurrentEntity()); if(!pActor) return; bool bCamFirstEye = !!m_pWeapon->GetHUDmode(); string32 hud_view="HUD view"; string32 _3rd_person_view="3-rd person view"; CGameFont* F = UI()->Font()->pFontDI; F->SetAligment (CGameFont::alCenter); //. F->SetSizeI (0.02f); F->OutSetI (0.f,-0.8f); F->SetColor (0xffffffff); F->OutNext ("Hud_adjust_mode=%d",g_bHudAdjustMode); if(g_bHudAdjustMode==1) F->OutNext ("adjusting zoom offset"); else if(g_bHudAdjustMode==2) F->OutNext ("adjusting fire point for %s",bCamFirstEye?hud_view:_3rd_person_view); else if(g_bHudAdjustMode==3) F->OutNext ("adjusting missile offset"); else if(g_bHudAdjustMode==4) F->OutNext ("adjusting shell point for %s",bCamFirstEye?hud_view:_3rd_person_view); else if(g_bHudAdjustMode == 5) F->OutNext ("adjusting fire point 2 for %s",bCamFirstEye?hud_view:_3rd_person_view); if(bCamFirstEye) { CWeaponHUD *pWpnHud = NULL; pWpnHud = m_pWeapon->GetHUD(); Fvector FP,SP,FP2; CKinematics* V = smart_cast<CKinematics*>(pWpnHud->Visual()); VERIFY (V); V->CalculateBones (); // fire point&direction Fmatrix& fire_mat = V->LL_GetTransform(u16(pWpnHud->FireBone())); Fmatrix& parent = pWpnHud->Transform (); const Fvector& fp = pWpnHud->FirePoint(); const Fvector& fp2 = pWpnHud->FirePoint2(); const Fvector& sp = pWpnHud->ShellPoint(); fire_mat.transform_tiny (FP,fp); parent.transform_tiny (FP); fire_mat.transform_tiny (FP2,fp2); parent.transform_tiny (FP2); fire_mat.transform_tiny (SP,sp); parent.transform_tiny (SP); RCache.dbg_DrawAABB(FP,0.01f,0.01f,0.01f,D3DCOLOR_XRGB(255,0,0)); RCache.dbg_DrawAABB(FP2,0.02f,0.02f,0.02f,D3DCOLOR_XRGB(0,0,255)); RCache.dbg_DrawAABB(SP,0.01f,0.01f,0.01f,D3DCOLOR_XRGB(0,255,0)); }else{ Fvector FP = m_pWeapon->get_CurrentFirePoint(); Fvector FP2 = m_pWeapon->get_CurrentFirePoint2(); Fvector SP = m_pWeapon->get_LastSP(); RCache.dbg_DrawAABB(FP,0.01f,0.01f,0.01f,D3DCOLOR_XRGB(255,0,0)); RCache.dbg_DrawAABB(FP2,0.02f,0.02f,0.02f,D3DCOLOR_XRGB(0,0,255)); RCache.dbg_DrawAABB(SP,0.02f,0.02f,0.02f,D3DCOLOR_XRGB(0,255,0)); } } }