HRESULT StdDualVSImp::Initialize(MNMesh *mnmesh, INode *node) { HRESULT hr; hr = S_OK; if(!node) return E_FAIL; int index = FindNodeIndex(node); if( index < 0) { caches.SetCount(caches.Count()+1); caches[caches.Count()-1] = NULL; ReplaceReference(caches.Count()-1,node); index = caches.Count()-1; } if(forceInvalid || !caches[index]->GetValid()) { forceInvalid = false; caches[index]->SetValid(true); hr = callb->InitValid(mnmesh, node); } return hr; }
void CChildView::OnModifyDelete() { for (UINT i = 0; i < Selected.size(); i++) { CNodeClass* pClass = (CNodeClass*)Selected[i].object->pParent; UINT idx = FindNodeIndex(Selected[i].object); if (idx != MAX_NODES) { delete pClass->Nodes[idx]; pClass->Nodes.erase(pClass->Nodes.begin() + idx); theApp.CalcAllOffsets(); } } Selected.clear(); }
int CUrlTree::Add(const CVector<CString>& UrlVector, bool * AddedExternal) { // _L_DEBUG(3, cout << "CUrlTree::Add() - " << UrlVector << endl); bool Added = false; CTreeElement<CString> * Node = CTree<CString>::Add(UrlVector, &Added); int Result = -1; if (Added || ((Result = FindNodeIndex(Node)) == -1)) { if (AddedExternal) (* AddedExternal) = true; m_IndexVector.Add((CObject *)Node); Result = ((int) m_IndexVector.GetSize()) - 1; m_UrlVector.Add(ResolveAt(Result)); // set the index Node->SetData((void *) Result); } else { if (AddedExternal) (* AddedExternal) = false; } // _L_DEBUG(3, cout << "CUrlTree::Add() (result) " << endl << (* this) << endl); return Result; }
void CChildView::OnLButtonDown(UINT nFlags, CPoint point) { m_Edit.ShowWindow(SW_HIDE); for (UINT i = 0; i < HotSpots.size(); i++) { if (HotSpots[i].Rect.PtInRect(point)) { CNodeBase* pHitObject = (CNodeBase*)HotSpots[i].object; if (HotSpots[i].Type == HS_OPENCLOSE) { pHitObject->bOpen[HotSpots[i].Level] = !pHitObject->bOpen[HotSpots[i].Level]; } else if (HotSpots[i].Type == HS_CLICK) { pHitObject->Update(HotSpots[i]); } else if (HotSpots[i].Type == HS_SELECT) { if (nFlags == MK_LBUTTON) { theApp.ClearSelection(); Selected.clear(); pHitObject->bSelected = true; Selected.push_back(HotSpots[i]); } if (nFlags == (MK_LBUTTON | MK_CONTROL)) { pHitObject->bSelected = !pHitObject->bSelected; if (pHitObject->bSelected) { Selected.push_back(HotSpots[i]); } else { for (UINT s = 0; s < Selected.size(); s++) { if (Selected[s].object == pHitObject) { Selected.erase(Selected.begin() + s); break; } } } } if (nFlags == (MK_LBUTTON | MK_SHIFT)) { if (Selected.size() > 0) { CNodeBase* pSelected = Selected[0].object; if (pSelected->pParent != pHitObject->pParent) continue; CNodeClass* pClass = (CNodeClass*)pSelected->pParent; //if (pClass->GetType() != nt_class) continue; UINT idx1 = FindNodeIndex(pSelected); if (idx1 == MAX_NODES) continue; UINT idx2 = FindNodeIndex(pHitObject); if (idx2 == MAX_NODES) continue; if (idx2 < idx1) { UINT idxTemp = idx1; idx1 = idx2; idx2 = idxTemp; } theApp.ClearSelection(); Selected.clear(); for (UINT s = idx1; s <= idx2; s++) { pClass->Nodes[s]->bSelected = true; HotSpot spot; //ZeroMemory(&spot, sizeof(HotSpot)); spot.Address = pClass->offset + pClass->Nodes[s]->offset; spot.object = pClass->Nodes[s]; Selected.push_back(spot); } } } } else if (HotSpots[i].Type == HS_DROP) { CRect client; GetClientRect(&client); ClientToScreen(&client); CMenu menu; menu.LoadMenu(MAKEINTRESOURCE(IDR_MENU_QUICKMODIFY)); menu.GetSubMenu(0)->TrackPopupMenu(TPM_LEFTALIGN | TPM_HORNEGANIMATION, client.left + HotSpots[i].Rect.left, client.top + HotSpots[i].Rect.bottom, this); } else if (HotSpots[i].Type == HS_DELETE) { //isDeleting = true; // Ghetto fix to stop crashing from OnMouseHover for (UINT i = 0; i < Selected.size(); i++) { CNodeClass* pClass = (CNodeClass*)Selected[i].object->pParent; UINT idx = FindNodeIndex(Selected[i].object); if (idx != MAX_NODES) { delete pClass->Nodes[idx]; pClass->Nodes.erase(pClass->Nodes.begin() + idx); theApp.CalcAllOffsets(); } } Selected.clear(); //isDeleting = false; } else if ((HotSpots[i].Type == HS_CHANGE_A) || (HotSpots[i].Type == HS_CHANGE_X)) { ExchangeTarget = HotSpots[i]; CRect pos = ExchangeTarget.Rect; ClientToScreen(&pos); CNodeBase* pNode = HotSpots[i].object; CMenu menu; menu.CreatePopupMenu(); CImage img; img.LoadFromResource(AfxGetResourceHandle(), IDB_CLASSBITMAP); CBitmap bmp; bmp.Attach(img.Detach()); for (UINT m = 0; m < theApp.Classes.size(); m++) { if ((HotSpots[i].Type == HS_CHANGE_X) && (pNode->pParent == theApp.Classes[m])) continue; menu.AppendMenu(MF_STRING | MF_ENABLED, WM_CHANGECLASSMENU + m, theApp.Classes[m]->Name); menu.SetMenuItemBitmaps(m, MF_BYPOSITION, &bmp, &bmp); } menu.TrackPopupMenu(TPM_LEFTALIGN | TPM_NOANIMATION, pos.left, pos.bottom, this); } Invalidate(); } } CWnd::OnLButtonDown(nFlags, point); }
void CChildView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) { if (nChar == VK_DOWN) { if (Selected.size() > 0) { HotSpot* firstSelected = &Selected[0]; if (firstSelected->Address != HotSpots[HotSpots.size() - 1].Address) { theApp.ClearSelection(); Selected.clear(); for (UINT i = 0; i < HotSpots.size(); i++) { if (HotSpots[i].Type != HS_SELECT) continue; if (firstSelected->Address != HotSpots[i].Address) continue; if (HotSpots[0].object == firstSelected->object) // stop from crashing continue; #if _WIN64 __int64 nextAddress = HotSpots[i].Address + firstSelected->object->GetMemorySize(); #else int nextAddress = HotSpots[i].Address + firstSelected->object->GetMemorySize(); #endif UINT newIndex = 0; for (int j = 0; HotSpots[i + j].Address != nextAddress; j++) newIndex = i + j + 1; HotSpots[newIndex].object->bSelected = true; Selected.push_back(HotSpots[newIndex]); break; } } } } else if (nChar == VK_UP) { if (Selected.size() > 0) { HotSpot* firstSelected = &Selected[0]; if (firstSelected->Address != HotSpots[0].Address) { theApp.ClearSelection(); Selected.clear(); for (UINT i = 0; i < HotSpots.size(); i++) { if (HotSpots[i].Type != HS_SELECT) continue; if (firstSelected->Address != HotSpots[i].Address) continue; HotSpots[i - 1].object->bSelected = true; Selected.push_back(HotSpots[i - 1]); break; } } } } else if (nChar == VK_DELETE) { //isDeleting = true; // Ghetto fix to stop crashing from OnMouseHover for (UINT i = 0; i < Selected.size(); i++) { CNodeClass* pClass = (CNodeClass*)Selected[i].object->pParent; UINT idx = FindNodeIndex(Selected[i].object); if (idx != MAX_NODES) { delete pClass->Nodes[idx]; pClass->Nodes.erase(pClass->Nodes.begin() + idx); theApp.CalcAllOffsets(); } } Selected.clear(); //isDeleting = false; } CWnd::OnKeyDown(nChar, nRepCnt, nFlags); }
void CChildView::ReplaceSelectedWithType(NodeType Type) { std::vector<CNodeBase*> newSelected; PrintOut(_T("Replace Node Type %Ts"), NodeTypeToString(Type)); for (UINT i = 0; i < Selected.size(); i++) { if (!theApp.IsNodeValid(Selected[i].object)) continue; if (Selected[i].object->pParent->GetType() == nt_vtable) Type = nt_function; CNodeBase* pNewNode = theApp.CreateNewNode(Type); if (Type == nt_class) MakeBasicClass((CNodeClass*)pNewNode); if (Type == nt_custom) ((CNodeCustom*)pNewNode)->memsize = Selected[i].object->GetMemorySize(); if (Type == nt_text) ((CNodeText*)pNewNode)->memsize = Selected[i].object->GetMemorySize(); if (Type == nt_unicode) ((CNodeUnicode*)pNewNode)->memsize = Selected[i].object->GetMemorySize(); if (Type == nt_vtable) { for (int i = 0; i < 10; i++) { CNodeVTable* pVTable = (CNodeVTable*)pNewNode; CNodeFunctionPtr* pFun = new CNodeFunctionPtr; pFun->offset = i * 8; pFun->pParent = pVTable; pVTable->Nodes.push_back(pFun); } } if (Type == nt_pointer) { CNodePtr* pPtr = (CNodePtr*)pNewNode; CNodeClass* pClass = (CNodeClass*)theApp.CreateNewNode(nt_class); MakeBasicClass(pClass); pPtr->pNode = pClass; } if (Type == nt_array) { CNodeArray* pArray = (CNodeArray*)pNewNode; CNodeClass* pClass = (CNodeClass*)theApp.CreateNewNode(nt_class); MakeBasicClass(pClass); pArray->pNode = pClass; } if (Type == nt_instance) { CNodeClassInstance* pInstance = (CNodeClassInstance*)pNewNode; CNodeClass* pClass = (CNodeClass*)theApp.CreateNewNode(nt_class); MakeBasicClass(pClass); pInstance->pNode = pClass; } ReplaceNode((CNodeClass*)Selected[i].object->pParent, FindNodeIndex(Selected[i].object), pNewNode); newSelected.push_back(pNewNode); } Selected.clear(); for (UINT i = 0; i < newSelected.size(); i++) { newSelected[i]->bSelected = true; CNodeClass* pClass = (CNodeClass*)newSelected[i]->pParent; HotSpot spot; spot.Address = pClass->offset + newSelected[i]->offset; spot.object = newSelected[i]; Selected.push_back(spot); } Invalidate(FALSE); }
void CChildView::OnInsertInsert2048() { InsertBytes((CNodeClass*)Selected[0].object->pParent, FindNodeIndex(Selected[0].object), 2048); Invalidate(FALSE); }
RefResult StdDualVSImp::NotifyRefChanged(const Interval& changeInt, RefTargetHandle hTarget, PartID& partID, RefMessage message, BOOL propagate) { switch (message) { case REFMSG_TARGET_DELETED: { int i = FindNodeIndex((INode*)hTarget); assert(i >= 0); callb->DeleteRenderMeshCache(caches[i]->GetNode()); delete caches[i]; caches[i] = NULL; // NH 07|11|02 The cache is no longer dynamic - it will only grow but not shrink, // so there could be null entries. This was causing a problem in SetReference // caches.Delete(i,1); // caches.Shrink(); } break; case REFMSG_NODE_MATERIAL_CHANGED: { int i = FindNodeIndex((INode*)hTarget); assert(i >= 0); DeleteReference(i); } break; case REFMSG_NODE_WSCACHE_UPDATED: { int i = FindNodeIndex((INode*)hTarget); //NH:06|11|02 I removed this, as in an undo situation the node reference may not be restored yet // as the viewport shader has not been initialised and thus not set the node. In this case -1 is valid // assert(i >= 0); if(i >= 0) caches[i]->SetValid(false); } break; case REFMSG_SUBANIM_STRUCTURE_CHANGED: case REFMSG_REF_DELETED: { BOOL del = TRUE; int i = FindNodeIndex((INode*)hTarget); INode * n = (INode*)hTarget; Mtl * m = n->GetMtl(); if(m) { // NH|06|11|02 check for the Viewport Manager - if the Effect is the same as the callback then keep it ICustAttribContainer *cont = m->GetCustAttribContainer(); if (cont && cont->GetNumCustAttribs()) { IDXShaderManagerInterface *sm = GetDXShaderManager(); if (!sm) { break; } for (int kk = 0; kk < cont->GetNumCustAttribs(); kk++) { CustAttrib *ca = cont->GetCustAttrib(kk); IViewportShaderManager *manager = (IViewportShaderManager*)ca->GetInterface(VIEWPORT_SHADER_MANAGER_INTERFACE); if (manager) { ReferenceTarget *rt = manager->GetActiveEffect(); if(rt == callb->GetRefTarg()) del = FALSE; } } } } // Check, if there's still a reference path from the node to the MtlBase if(!DependsOn(hTarget,callb->GetRefTarg()) && del) { DeleteReference(i); } forceInvalid = true; } } return REF_SUCCEED; }