void calc_cam_diff_rot(Fmatrix item_transform, Fvector diff, Fvector& res) { Fmatrix cam_m; cam_m.i.set (Device.vCameraRight); cam_m.j.set (Device.vCameraTop); cam_m.k.set (Device.vCameraDirection); cam_m.c.set (Device.vCameraPosition); Fmatrix R; R.identity (); if(!fis_zero(diff.x)) { R.rotation(cam_m.i,diff.x); }else if(!fis_zero(diff.y)) { R.rotation(cam_m.j,diff.y); }else if(!fis_zero(diff.z)) { R.rotation(cam_m.k,diff.z); }; Fmatrix item_transform_i; item_transform_i.invert (item_transform); R.mulB_43(item_transform); R.mulA_43(item_transform_i); R.getHPB (res); res.mul (180.0f/PI); }
void CUIArtefactDetectorElite::GetUILocatorMatrix(Fmatrix& _m) { Fmatrix trans = m_parent->HudItemData()->m_item_transform; u16 bid = m_parent->HudItemData()->m_model->LL_BoneID("cover"); Fmatrix cover_bone = m_parent->HudItemData()->m_model->LL_GetTransform(bid); _m.mul (trans, cover_bone); _m.mulB_43 (m_map_attach_offset); }
void PHDynamicData::InterpolateTransform(Fmatrix &transform){ //DMXPStoFMX(dBodyGetRotation(body), // dBodyGetPosition(body),BoneTransform); body_interpolation.InterpolateRotation(transform); body_interpolation.InterpolatePosition(transform.c); Fmatrix zero; zero.set (ZeroTransform); zero.invert (); //BoneTransform.mulB(zero); transform.mulB_43 (zero); }
void CWeapon::UpdateHudAdditonal (Fmatrix& trans) { CActor* pActor = smart_cast<CActor*>(H_Parent()); if(!pActor) return; if( (IsZoomed() && m_zoom_params.m_fZoomRotationFactor<=1.f) || (!IsZoomed() && m_zoom_params.m_fZoomRotationFactor>0.f)) { u8 idx = GetCurrentHudOffsetIdx(); // if(idx==0) return; attachable_hud_item* hi = HudItemData(); R_ASSERT (hi); Fvector curr_offs, curr_rot; curr_offs = hi->m_measures.m_hands_offset[0][idx];//pos,aim curr_rot = hi->m_measures.m_hands_offset[1][idx];//rot,aim curr_offs.mul (m_zoom_params.m_fZoomRotationFactor); curr_rot.mul (m_zoom_params.m_fZoomRotationFactor); Fmatrix hud_rotation; hud_rotation.identity (); hud_rotation.rotateX (curr_rot.x); Fmatrix hud_rotation_y; hud_rotation_y.identity (); hud_rotation_y.rotateY (curr_rot.y); hud_rotation.mulA_43 (hud_rotation_y); hud_rotation_y.identity (); hud_rotation_y.rotateZ (curr_rot.z); hud_rotation.mulA_43 (hud_rotation_y); hud_rotation.translate_over (curr_offs); trans.mulB_43 (hud_rotation); if(pActor->IsZoomAimingMode()) m_zoom_params.m_fZoomRotationFactor += Device.fTimeDelta/m_zoom_params.m_fZoomRotateTime; else m_zoom_params.m_fZoomRotationFactor -= Device.fTimeDelta/m_zoom_params.m_fZoomRotateTime; clamp(m_zoom_params.m_fZoomRotationFactor, 0.f, 1.f); } }
void player_hud::calc_transform(u16 attach_slot_idx, const Fmatrix& offset, Fmatrix& result) { Fmatrix ancor_m = m_model->dcast_PKinematics()->LL_GetTransform(m_ancors[attach_slot_idx]); result.mul (m_transform, ancor_m); result.mulB_43 (offset); }
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); }