diff --git a/editor/syncdocument.h b/editor/syncdocument.h index 771d226..1adc86b 100644 --- a/editor/syncdocument.h +++ b/editor/syncdocument.h @@ -9,6 +9,9 @@ #include #include + +#import named_guids + class SyncDocument : public sync::Data { public: @@ -31,6 +34,8 @@ public: void sendDeleteKeyCommand(int track, int row) { if (INVALID_SOCKET == clientSocket) return; + if (clientRemap.count(track) == 0) return; + track = int(clientRemap[track]); unsigned char cmd = DELETE_KEY; send(clientSocket, (char*)&cmd, 1, 0); @@ -77,18 +82,19 @@ public: virtual void exec(SyncDocument *data) { - sync::Track &t = data->getTrack(this->track); - assert(!t.isKeyFrame(row)); - t.setKeyFrame(row, key); - + sync::Track *t = data->actualTracks[this->track]; + assert(NULL != t); + assert(!t->isKeyFrame(row)); + t->setKeyFrame(row, key); data->sendSetKeyCommand(track, row, key); // update clients } virtual void undo(SyncDocument *data) { - sync::Track &t = data->getTrack(this->track); - assert(t.isKeyFrame(row)); - t.deleteKeyFrame(row); + sync::Track *t = data->actualTracks[this->track]; + assert(NULL != t); + assert(t->isKeyFrame(row)); + t->deleteKeyFrame(row); data->sendDeleteKeyCommand(track, row); // update clients } @@ -249,6 +255,53 @@ public: else cmd = new InsertCommand(track, row, key); return cmd; } + + void load(const std::string &fileName) + { + MSXML2::IXMLDOMDocumentPtr doc(MSXML2::CLSID_DOMDocument); + + try + { + doc->load(fileName.c_str()); + MSXML2::IXMLDOMNodeListPtr trackNodes = doc->documentElement->selectNodes("track"); + for (int i = 0; i < trackNodes->Getlength(); ++i) + { + MSXML2::IXMLDOMNodePtr trackNode = trackNodes->Getitem(i); + MSXML2::IXMLDOMNamedNodeMapPtr attribs = trackNode->Getattributes(); + + std::string name = attribs->getNamedItem("name")->Gettext(); + sync::Track &t = getTrack(name); + + MSXML2::IXMLDOMNodeListPtr rowNodes = trackNode->GetchildNodes(); + for (int i = 0; i < rowNodes->Getlength(); ++i) + { + MSXML2::IXMLDOMNodePtr keyNode = rowNodes->Getitem(i); + std::string baseName = keyNode->GetbaseName(); + if (baseName == "key") + { + MSXML2::IXMLDOMNamedNodeMapPtr rowAttribs = keyNode->Getattributes(); + std::string rowString = rowAttribs->getNamedItem("row")->Gettext(); + std::string valueString = rowAttribs->getNamedItem("value")->Gettext(); + std::string interpolationString = rowAttribs->getNamedItem("interpolation")->Gettext(); + + sync::Track::KeyFrame keyFrame( + float(atof(valueString.c_str())), + sync::Track::KeyFrame::InterpolationType( + atoi(interpolationString.c_str()) + ) + ); + t.setKeyFrame(atoi(rowString.c_str()), keyFrame); + } + } + } + } + catch(_com_error &e) + { + char temp[256]; + _snprintf(temp, 256, "Error loading: %s\n", (const char*)_bstr_t(e.Description())); + MessageBox(NULL, temp, NULL, MB_OK | MB_ICONERROR | MB_SETFOREGROUND); + } + } SOCKET clientSocket; std::map clientRemap; diff --git a/editor/synctracker2.cpp b/editor/synctracker2.cpp index 5511925..5a66503 100644 --- a/editor/synctracker2.cpp +++ b/editor/synctracker2.cpp @@ -234,19 +234,6 @@ static ATOM registerMainWindowClass(HINSTANCE hInstance) return RegisterClassEx(&wc); } -SyncDocument loadDocument() -{ - SyncDocument document; - for (int i = 0; i < 10; ++i) - { - std::string trackName = "balle"; - - // find track - const sync::Track &track = document.getTrack(trackName); - } - return document; -} - int _tmain(int argc, _TCHAR* argv[]) { #ifdef _DEBUG @@ -258,6 +245,7 @@ int _tmain(int argc, _TCHAR* argv[]) #endif HINSTANCE hInstance = GetModuleHandle(NULL); + CoInitialize(NULL); #if 1 if (false == initNetwork()) @@ -317,7 +305,6 @@ int _tmain(int argc, _TCHAR* argv[]) CW_USEDEFAULT, CW_USEDEFAULT, // width, height NULL, NULL, hInstance, NULL ); - printf("main window: %p\n", hwnd); if (NULL == hwnd) { @@ -326,15 +313,11 @@ int _tmain(int argc, _TCHAR* argv[]) } HACCEL accel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR)); - printf("accel: %p\n", accel); ShowWindow(hwnd, TRUE); UpdateWindow(hwnd); #if 1 - - printf("server socket %x\n", serverSocket); - bool done = false; SOCKET clientSocket = INVALID_SOCKET; MSG msg; @@ -427,7 +410,6 @@ int _tmain(int argc, _TCHAR* argv[]) { int newRow = 0; int ret = recv(clientSocket, (char*)&newRow, sizeof(int), 0); - printf("new row: %d\n", newRow); trackView->setEditRow(newRow); } break; diff --git a/editor/trackview.cpp b/editor/trackview.cpp index ccfccbe..095ee6f 100644 --- a/editor/trackview.cpp +++ b/editor/trackview.cpp @@ -373,8 +373,9 @@ void TrackView::editCopy() std::vector copyEntries; for (int track = selectLeft; track <= selectRight; ++track) { - int localTrack = track - selectLeft; - const sync::Track &t = document->getTrack(track); + const size_t trackIndex = document->getTrackIndexFromPos(track); + const sync::Track &t = document->getTrack(trackIndex); + for (int row = selectTop; row <= selectBottom; ++row) { int localRow = row - selectTop; @@ -384,7 +385,7 @@ void TrackView::editCopy() assert(NULL != keyFrame); CopyEntry ce; - ce.track = localTrack; + ce.track = int(trackIndex); ce.row = localRow; ce.keyFrame = *keyFrame; @@ -682,13 +683,14 @@ void TrackView::editEnterValue() { if (int(editString.size()) > 0 && editTrack < int(document->getTrackCount())) { - sync::Track &t = document->getTrack(editTrack); + size_t trackIndex = document->getTrackIndexFromPos(editTrack); + sync::Track &t = document->getTrack(trackIndex); sync::Track::KeyFrame newKey; if (t.isKeyFrame(editRow)) newKey = *t.getKeyFrame(editRow); // copy old key newKey.value = float(_tstof(editString.c_str())); // modify value - SyncDocument::Command *cmd = document->getSetKeyFrameCommand(editTrack, editRow, newKey); + SyncDocument::Command *cmd = document->getSetKeyFrameCommand(int(trackIndex), editRow, newKey); document->exec(cmd); editString.clear(); @@ -702,7 +704,8 @@ void TrackView::editToggleInterpolationType() { if (editTrack < int(document->getTrackCount())) { - sync::Track &t = document->getTrack(editTrack); + size_t trackIndex = document->getTrackIndexFromPos(editTrack); + sync::Track &t = document->getTrack(trackIndex); // find key to modify sync::Track::KeyFrameContainer::const_iterator upper = t.keyFrames.upper_bound(editRow); @@ -728,7 +731,7 @@ void TrackView::editToggleInterpolationType() (int(newKey.interpolationType) + 1) % sync::Track::KeyFrame::IT_COUNT ); - SyncDocument::Command *cmd = document->getSetKeyFrameCommand(editTrack, int(lower->first), newKey); + SyncDocument::Command *cmd = document->getSetKeyFrameCommand(int(trackIndex), int(lower->first), newKey); document->exec(cmd); invalidateRange(editTrack, editTrack, int(lower->first), int(upper->first)); @@ -752,12 +755,14 @@ void TrackView::editDelete() SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand(); for (int track = selectLeft; track <= selectRight; ++track) { - sync::Track &t = document->getTrack(track); + size_t trackIndex = document->getTrackIndexFromPos(track); + sync::Track &t = document->getTrack(trackIndex); + for (int row = selectTop; row <= selectBottom; ++row) { if (t.isKeyFrame(row)) { - SyncDocument::Command *cmd = new SyncDocument::DeleteCommand(track, row); + SyncDocument::Command *cmd = new SyncDocument::DeleteCommand(int(trackIndex), row); multiCmd->addCommand(cmd); } } @@ -786,7 +791,9 @@ void TrackView::editBiasValue(float amount) SyncDocument::MultiCommand *multiCmd = new SyncDocument::MultiCommand(); for (int track = selectLeft; track <= selectRight; ++track) { - sync::Track &t = document->getTrack(track); + size_t trackIndex = document->getTrackIndexFromPos(track); + sync::Track &t = document->getTrack(trackIndex); + for (int row = selectTop; row <= selectBottom; ++row) { if (t.isKeyFrame(row)) @@ -795,7 +802,7 @@ void TrackView::editBiasValue(float amount) newKey.value += amount; // modify value // add sub-command - SyncDocument::Command *cmd = document->getSetKeyFrameCommand(track, row, newKey); + SyncDocument::Command *cmd = document->getSetKeyFrameCommand(int(trackIndex), row, newKey); multiCmd->addCommand(cmd); } } @@ -944,6 +951,10 @@ LRESULT TrackView::onChar(UINT keyCode, UINT flags) case 's': document->sendSaveCommand(); break; + + case 'l': + document->load("test.xml"); + break; } return FALSE; } diff --git a/sync/data.cpp b/sync/data.cpp index 8b8b8b2..e708804 100644 --- a/sync/data.cpp +++ b/sync/data.cpp @@ -9,7 +9,10 @@ using namespace sync; size_t Data::getTrackIndex(const std::basic_string &name) { TrackContainer::iterator iter = tracks.find(name); - if (iter != tracks.end()) return int(iter->second); + if (iter != tracks.end()) + { + return iter->second; + } size_t index = actualTracks.size(); tracks[name] = index; @@ -26,14 +29,16 @@ Track &Data::getTrack(const std::basic_string &name) return *actualTracks[index]; } -Track &Data::getTrack(size_t track) +size_t Data::getTrackIndexFromPos(size_t track) { assert(track >= 0); assert(track < tracks.size()); sync::Data::TrackContainer::iterator trackIter = tracks.begin(); for (size_t currTrack = 0; currTrack < track; ++currTrack, ++trackIter); - return *actualTracks[trackIter->second]; + + assert(tracks.end() != trackIter); + return trackIter->second; } size_t Data::getTrackCount() const diff --git a/sync/data.h b/sync/data.h index 8fd51ae..0b314ff 100644 --- a/sync/data.h +++ b/sync/data.h @@ -22,7 +22,16 @@ namespace sync public: size_t getTrackIndex(const std::basic_string &name); Track &getTrack(const std::basic_string &name); - Track &getTrack(size_t track); + + size_t getTrackIndexFromPos(size_t track); + + Track &getTrack(size_t track) + { + assert(track < actualTracks.size()); + assert(NULL != actualTracks[track]); + return *actualTracks[track]; + } + size_t getTrackCount() const; // private: diff --git a/sync/device_client.cpp b/sync/device_client.cpp index 8ef2d0d..01546fd 100644 --- a/sync/device_client.cpp +++ b/sync/device_client.cpp @@ -42,11 +42,12 @@ Track &ClientDevice::getTrack(const std::string &trackName) { sync::Data::TrackContainer::iterator iter = syncData.tracks.find(trackName); if (iter != syncData.tracks.end()) return *syncData.actualTracks[iter->second]; - + unsigned char cmd = GET_TRACK; send(serverSocket, (char*)&cmd, 1, 0); size_t clientIndex = syncData.actualTracks.size(); + send(serverSocket, (char*)&clientIndex, sizeof(size_t), 0); // send request data @@ -90,12 +91,11 @@ bool ClientDevice::update(float row) recv(serverSocket, (char*)&row, sizeof(int), 0); recv(serverSocket, (char*)&value, sizeof(float), 0); recv(serverSocket, (char*)&interp, 1, 0); - assert(interp >= 0); assert(interp < Track::KeyFrame::IT_COUNT); - sync::Track &t = syncData.getTrack(track); + sync::Track &t = *syncData.actualTracks[track]; t.setKeyFrame(row, Track::KeyFrame( value, diff --git a/sync/network.cpp b/sync/network.cpp index 7f15e04..10ced9a 100644 --- a/sync/network.cpp +++ b/sync/network.cpp @@ -25,7 +25,6 @@ SOCKET clientConnect(SOCKET serverSocket) { SOCKET clientSocket = accept(serverSocket, NULL, NULL); if (INVALID_SOCKET == clientSocket) return INVALID_SOCKET; - printf("%x\n", clientSocket); const char *expectedGreeting = clientGreeting; char recievedGreeting[128];