void CScriptGameObject::start_particles(LPCSTR pname, LPCSTR bone) { CParticlesPlayer* PP = smart_cast<CParticlesPlayer*>(&object()); if (!PP) return; IKinematics* K = smart_cast<IKinematics*>(object().Visual()); R_ASSERT(K); u16 play_bone = K->LL_BoneID(bone); R_ASSERT(play_bone != BI_NONE); if (K->LL_GetBoneVisible(play_bone)) PP->StartParticles(pname, play_bone, Fvector().set(0, 1, 0), 9999); else ai().script_engine().script_log(ScriptStorage::eLuaMessageTypeError, "Cant start particles, bone [%s] is not visible now", bone); }
void CWeapon::UpdateAddonsVisibility() { IKinematics* pWeaponVisual = smart_cast<IKinematics*>(Visual()); R_ASSERT(pWeaponVisual); u16 bone_id; UpdateHUDAddonsVisibility (); pWeaponVisual->CalculateBones_Invalidate (); bone_id = pWeaponVisual->LL_BoneID (wpn_scope); if(ScopeAttachable()) { if(IsScopeAttached()) { if(!pWeaponVisual->LL_GetBoneVisible (bone_id)) pWeaponVisual->LL_SetBoneVisible (bone_id,TRUE,TRUE); }else{ if(pWeaponVisual->LL_GetBoneVisible (bone_id)) pWeaponVisual->LL_SetBoneVisible (bone_id,FALSE,TRUE); } } if(m_eScopeStatus==ALife::eAddonDisabled && bone_id!=BI_NONE && pWeaponVisual->LL_GetBoneVisible(bone_id) ) { pWeaponVisual->LL_SetBoneVisible (bone_id,FALSE,TRUE); // Log("scope", pWeaponVisual->LL_GetBoneVisible (bone_id)); } bone_id = pWeaponVisual->LL_BoneID (wpn_silencer); if(SilencerAttachable()) { if(IsSilencerAttached()){ if(!pWeaponVisual->LL_GetBoneVisible (bone_id)) pWeaponVisual->LL_SetBoneVisible (bone_id,TRUE,TRUE); }else{ if( pWeaponVisual->LL_GetBoneVisible (bone_id)) pWeaponVisual->LL_SetBoneVisible (bone_id,FALSE,TRUE); } } if(m_eSilencerStatus==ALife::eAddonDisabled && bone_id!=BI_NONE && pWeaponVisual->LL_GetBoneVisible(bone_id) ) { pWeaponVisual->LL_SetBoneVisible (bone_id,FALSE,TRUE); // Log("silencer", pWeaponVisual->LL_GetBoneVisible (bone_id)); } bone_id = pWeaponVisual->LL_BoneID (wpn_grenade_launcher); if(GrenadeLauncherAttachable()) { if(IsGrenadeLauncherAttached()) { if(!pWeaponVisual->LL_GetBoneVisible (bone_id)) pWeaponVisual->LL_SetBoneVisible (bone_id,TRUE,TRUE); }else{ if(pWeaponVisual->LL_GetBoneVisible (bone_id)) pWeaponVisual->LL_SetBoneVisible (bone_id,FALSE,TRUE); } } if(m_eGrenadeLauncherStatus==ALife::eAddonDisabled && bone_id!=BI_NONE && pWeaponVisual->LL_GetBoneVisible(bone_id) ) { pWeaponVisual->LL_SetBoneVisible (bone_id,FALSE,TRUE); // Log("gl", pWeaponVisual->LL_GetBoneVisible (bone_id)); } pWeaponVisual->CalculateBones_Invalidate (); pWeaponVisual->CalculateBones (TRUE); }
void render_box (IRenderVisual *visual, const Fmatrix &xform, const Fvector &additional, bool draw_child_boxes, const u32 &color) { CDebugRenderer &renderer = Level().debug_renderer(); IKinematics *kinematics = smart_cast<IKinematics*>(visual); VERIFY (kinematics); u16 bone_count = kinematics->LL_BoneCount(); VERIFY (bone_count); u16 visible_bone_count = kinematics->LL_VisibleBoneCount(); if (!visible_bone_count) return; Fmatrix matrix; Fvector *points = (Fvector*)_alloca(visible_bone_count*8*sizeof(Fvector)); Fvector *I = points; for (u16 i=0; i<bone_count; ++i) { if (!kinematics->LL_GetBoneVisible(i)) continue; const Fobb &obb = kinematics->LL_GetData(i).obb; if (fis_zero(obb.m_halfsize.square_magnitude())) { VERIFY (visible_bone_count > 1); --visible_bone_count; continue; } Fmatrix Mbox; obb.xform_get (Mbox); const Fmatrix &Mbone = kinematics->LL_GetBoneInstance(i).mTransform; Fmatrix X; matrix.mul_43 (xform,X.mul_43(Mbone,Mbox)); Fvector half_size = Fvector().add(obb.m_halfsize,additional); matrix.mulB_43 (Fmatrix().scale(half_size)); if (draw_child_boxes) renderer.draw_obb (matrix,color); static const Fvector local_points[8] = { Fvector().set(-1.f,-1.f,-1.f), Fvector().set(-1.f,-1.f,+1.f), Fvector().set(-1.f,+1.f,+1.f), Fvector().set(-1.f,+1.f,-1.f), Fvector().set(+1.f,+1.f,+1.f), Fvector().set(+1.f,+1.f,-1.f), Fvector().set(+1.f,-1.f,+1.f), Fvector().set(+1.f,-1.f,-1.f) }; for (u32 i=0; i<8; ++i, ++I) matrix.transform_tiny (*I,local_points[i]); } VERIFY (visible_bone_count); if (visible_bone_count == 1) { renderer.draw_obb (matrix,color); return; } VERIFY ((I - points) == (visible_bone_count*8)); MagicBox3 box = MagicMinBox(visible_bone_count*8,points); box.ComputeVertices (points); Fmatrix result; result.identity (); result.c = box.Center(); result.i.sub(points[3],points[2]).normalize(); result.j.sub(points[2],points[1]).normalize(); result.k.sub(points[2],points[6]).normalize(); Fvector scale; scale.x = points[3].distance_to(points[2])*.5f; scale.y = points[2].distance_to(points[1])*.5f; scale.z = points[2].distance_to(points[6])*.5f; result.mulB_43 (Fmatrix().scale(scale)); renderer.draw_obb (result,color); }
bool bone_has_pysics( IKinematics& K, u16 bone_id ) { return K.LL_GetBoneVisible( bone_id ) && shape_is_physic(K.LL_GetData( bone_id ).shape); }