void CEditShape::Attach(CEditShape* from) { ApplyScale (); // transfer data from->ApplyScale (); Fmatrix M = from->_Transform(); M.mulA_43 (_ITransform()); for (ShapeIt it=from->shapes.begin(); it!=from->shapes.end(); it++){ switch (it->type){ case cfSphere:{ Fsphere& T = it->data.sphere; M.transform_tiny(T.P); add_sphere (T); }break; case cfBox:{ Fmatrix B = it->data.box; B.mulA_43 (M); add_box (B); }break; default: THROW; } } // common Scene->RemoveObject (from,true,true); xr_delete (from); ComputeBounds (); }
void CSceneObject::OnShowHint(AStringVec& dest) { inherited::OnShowHint(dest); dest.push_back(AnsiString("Reference: ")+*m_ReferenceName); dest.push_back(AnsiString("-------")); float dist = UI->ZFar(); SRayPickInfo pinf; if (m_pReference->RayPick(dist,UI->m_CurrentRStart,UI->m_CurrentRNorm,_ITransform(),&pinf)){ dest.push_back(AnsiString("Object Type: ")+get_token_name(eo_type_token,pinf.e_obj->m_Flags.flags)); R_ASSERT(pinf.e_mesh); CSurface* surf=pinf.e_mesh->GetSurfaceByFaceID(pinf.inf.id); dest.push_back(AnsiString("Surface: ")+AnsiString(surf->_Name())); dest.push_back(AnsiString("2 Sided: ")+AnsiString(surf->m_Flags.is(CSurface::sf2Sided)?"on":"off")); if (pinf.e_obj->m_Flags.is(CEditableObject::eoSoundOccluder)){ dest.push_back(AnsiString("Game Mtl: ")+AnsiString(surf->_GameMtlName())); int gm_id = surf->_GameMtl(); if (gm_id!=GAMEMTL_NONE_ID){ SGameMtl* mtl = GMLib.GetMaterialByID(gm_id); if (mtl) dest.push_back(AnsiString().sprintf("Occlusion Factor: %3.2f",mtl->fSndOcclusionFactor)); } }else if (pinf.e_obj->m_Flags.is(CEditableObject::eoHOM)){ }else{ dest.push_back(AnsiString("Texture: ")+AnsiString(surf->_Texture())); dest.push_back(AnsiString("Shader: ")+AnsiString(surf->_ShaderName())); dest.push_back(AnsiString("LC Shader: ")+AnsiString(surf->_ShaderXRLCName())); dest.push_back(AnsiString("Game Mtl: ")+AnsiString(surf->_GameMtlName())); } } }
bool CSceneObject::RayPick(float& dist, const Fvector& S, const Fvector& D, SRayPickInfo* pinf) { if (!m_pReference) return false; if (::Render->occ_visible(m_TBBox)) if (m_pReference->RayPick(dist, S, D, _ITransform(), pinf)){ if (pinf) pinf->s_obj = this; return true; } return false; }
void CSceneObject::GetFullTransformToLocal( Fmatrix& m ) { m.set(_ITransform()); }
bool CSceneObject::BoxPick(const Fbox& box, SBoxPickInfoVec& pinf) { if (!m_pReference) return false; return m_pReference->BoxPick(this, box, _ITransform(), pinf); }
void CSceneObject::BoxQuery(SPickQuery& pinf) { if (!m_pReference) return; m_pReference->BoxQuery(_Transform(), _ITransform(), pinf); }