// check if all of the corners of entity's bounding box are influenced by current select-on-render selection void SelectEntityOnRender(CProjection3D &prProjection, CEntity &en) { FLOATaabbox3D bbox; FLOATmatrix3D mOne = FLOATmatrix3D(0.0f); mOne.Diagonal(1.0f); FLOATmatrix3D *pmR; FLOAT3D vOffset; // if this entity is model if (en.en_RenderType==CEntity::RT_MODEL || en.en_RenderType==CEntity::RT_EDITORMODEL) { // get bbox of current frame CModelObject *pmo = en.GetModelObject(); pmo->GetCurrentFrameBBox( bbox); pmR = &en.en_mRotation; vOffset = en.GetPlacement().pl_PositionVector; } // if it is ska model else if(en.en_RenderType==CEntity::RT_SKAMODEL || en.en_RenderType==CEntity::RT_SKAEDITORMODEL) { en.GetModelInstance()->GetCurrentColisionBox( bbox); pmR = &en.en_mRotation; vOffset = en.GetPlacement().pl_PositionVector; } // if it is brush else { // get bbox of brush's first mip CBrush3D *pbr = en.GetBrush(); CBrushMip *pbrmip = pbr->GetFirstMip(); bbox = pbrmip->bm_boxBoundingBox; pmR = &mOne; vOffset = FLOAT3D( 0.0f, 0.0f, 0.0f); } if( IsBoundingBoxInLasso( prProjection, bbox, pmR, vOffset)) { if( _bSelectAlternative) { // deselect if (en.IsSelected(ENF_SELECTED)) { _pselenSelectOnRender->Deselect(en); } } else { // select if (!en.IsSelected(ENF_SELECTED)) { _pselenSelectOnRender->Select(en); } } } }
int CEntitiesDialog::EditEntity( CEntityArray& Entities, int CurrentEntity, CFusionDoc* Doc) { // If more than one entity selected, make sure they're all the same type. int nSel = 0; CString EntityClassname; int i; pDoc = Doc; mEntityArray = &Entities; for (i = 0; i < mEntityArray->GetSize(); ++i) { CEntity *pEnt; pEnt = &Entities[i]; if (pEnt->IsSelected ()) { if (nSel == 0) { EntityClassname = pEnt->GetClassname (); mCurrentEntity = i; } else { if (pEnt->GetClassname () != EntityClassname) { AfxMessageBox ("To edit multiple entities, they must all be of the same type."); return CurrentEntity; } } ++nSel; } } MultiEntityFlag = (nSel > 1); if (MultiEntityFlag) { } else { if (CurrentEntity != -1) { mCurrentEntity = CurrentEntity; } else { // Let's set entity 0 as selected if it exists... mCurrentEntity = 0; if (mEntityArray->GetSize() > 0) { pDoc->ResetAllSelectedEntities(); pDoc->SelectEntity (&(*mEntityArray)[mCurrentEntity]); pDoc->mCurrentEntity = mCurrentEntity; } } } DoModal(); return mCurrentEntity; }
void CEntitiesDialog::OnDblclkPropertieslist() { // Double-click on the item...Edit it. mCurrentKey = m_PropertiesList.GetCurSel (); if (mCurrentKey != LB_ERR) { CEntity *Ent = &((*mEntityArray)[mCurrentEntity]); CString EntityTypeName = Ent->GetClassname (); CString KeyName; CString TheValue; m_PropertiesList.GetText (mCurrentKey, KeyName); Ent->GetKeyValue (KeyName, TheValue); TopType eType; if (EntityTable_GetEntityPropertyType (Level_GetEntityDefs (pDoc->pLevel), EntityTypeName, KeyName, &eType)) { CDialog *pEditDialog = NULL; // Create the dialog that's appropriate for this type.... switch (eType) { case T_INT : pEditDialog = new CIntKeyEditDlg (this, KeyName, &TheValue); break; case T_FLOAT : pEditDialog = new CFloatKeyEditDlg (this, KeyName, &TheValue); break; case T_COLOR : pEditDialog = new CColorKeyEditDlg (this, KeyName, &TheValue); break; case T_POINT : pEditDialog = new CPointKeyEditDlg (this, KeyName, &TheValue); break; case T_STRING : pEditDialog = new CKeyEditDlg (this, KeyName, &TheValue); break; case T_MODEL : pEditDialog = new CModelKeyEditDlg (this, Level_GetModelInfo (pDoc->pLevel)->Models, KeyName, &TheValue); break; case T_STRUCT : pEditDialog = new CStructKeyEditDlg (this, *Ent, KeyName, mEntityArray, &TheValue, Level_GetEntityDefs (pDoc->pLevel)); break; case T_BOOLEAN : pEditDialog = new CBoolKeyEditDlg (this, KeyName, &TheValue); break; case T_PTR : default : // bad or unknown type assert (0); break; } if (pEditDialog != NULL) { int ModalResult = pEditDialog->DoModal (); delete pEditDialog; if (ModalResult == IDOK) { if (MultiEntityFlag) { // multiple entities--change this property on all of them int i; for (i = 0; i < mEntityArray->GetSize (); ++i) { CEntity *pEnt; pEnt = &(*mEntityArray)[i]; if (pEnt->IsSelected ()) { pEnt->SetKeyValue (KeyName, TheValue); } } } else { // update Ent->SetKeyValue (KeyName, TheValue); } FillInKeyValuePairs(mCurrentKey); } } } } }