/* 一つ分の受信データを解析し、AXIS Neuron の BVH データならば格納 */ bool PacketParserNeuron::Read(const uint8* raw, const int32 length, UMocapPose* pose) { if (!CheckHeader(raw, length)) return false; /* ヘッダーを読んだ時点でユーザーIDが分るので設定 */ pose->UserId = this->userId; /* 読み込まれないボーンを空にする */ for (int i = 0; i < (sizeof(EmptyBoneIndices) / sizeof(EmptyBoneIndices[0])); i++) { pose->BoneRotations[EmptyBoneIndices[i]] = FQuat(0, 0, 0, 1); } /* 読込開始 */ int index = 64; /* Refecence ありの場合、float16 × 6 がヘッダー後に存在するのでスキップ */ if (this->hasReference) index += 24; /* 最初はルート位置が届く */ FVector position = GetPosition(raw, index); pose->OriginalRootPosition = position; index += 12; /* 各関節の角度 */ for (int i = 0; i < BoneCount; i++) { ProcessSegment(raw, i, index, pose); index += (this->hasDisplacement ? 24 : 12); } return true; }
//在本函数中会利用临界区提供线程安全机制 void SegmentList::ProcessSegment_s(bool (*Processor)(Segment *)) { //进入临界区 m_Lock->on(); ProcessSegment(Processor); //离开 m_Lock->off(); }
//时间步进。将所有Segment的Deadline-1,并调整链表结构,取出deadline<0的节点 void SegmentList::TimeStep() { if (NULL== m_lpRoot) { return; } //TODO: StartSegID ++; m_Lock->on(); ProcessSegment(DecreaseDeadline);//Deadline --; //调整链表。将头链表重置,然后加入队尾 SegmentNode *p = m_lpRoot; p->Segment->m_Lock->on(); m_lpRoot = m_lpRoot->Next; #if _DEBUG SEGMENTID wOID = p->Segment->getSegID(); char* _lpData = p->Segment->m_Data; if(p->Segment->getHasData()) { //log::WriteToFile( _lpData,Segment::getSegmentSize()); } else { int icnt =p->Segment->getPacketCount(); cout << "Segment:" << p->Segment->getSegID() << " only has " << icnt << " Packets"; // ::_CrtDbgBreak(); } #endif p->Next = NULL; p->Segment->Reset(p->Segment->getSegID() + MAX_LIVE_TIME); p->Segment->m_Lock->off(); m_lpTail->Next=p; m_lpTail = p; //#if _DEBUG // char buf[50]; // sprintf(buf,"TimeStep.Release %d , get New ID %d" ,wOID,p->Segment->getSegID()); // log::WriteLine(buf); //#endif m_Lock->off(); }
/******************************************************************************************** > void OpBaseConvertPathSegment::Do(OpDescriptor*) Author: Peter_Arnold (Xara Group Ltd) <*****@*****.**> Created: 16/8/95 Inputs: OpDescriptor (unused) Purpose: Performs the common SelRange scanning part of converting path segments. Calls the ProcessSegment function in derived classes to do the actual processing Errors: - SeeAlso: - ********************************************************************************************/ void OpBaseConvertPathSegment::Do(OpDescriptor*) { #ifndef STANDALONE // Obtain the current selections and the first node in the selection SelRange* Selected = GetApplication()->FindSelection(); BOOL ok = (Selected != NULL); // Start the op BeginSlowJob(); if (ok) ok = DoStartSelOp(TRUE,TRUE); // Check with the selrange it is ok to run this op ObjChangeFlags cFlags; ObjChangeParam ObjChange(OBJCHANGE_STARTING,cFlags,NULL,this); if (ok) { if (!Selected->AllowOp(&ObjChange)) { EndSlowJob(); FailAndExecute(); End(); return; } } Node* pNode = Selected->FindFirst(); NodePath* ThisPath = NULL; while (ok && (pNode != NULL)) { // we're only interested in NodePaths which have selected points BOOL DoThisNode = pNode->IsNodePath(); if (DoThisNode) DoThisNode = (((NodePath*)pNode)->InkPath.IsSubSelection()); if (DoThisNode) DoThisNode = (((NodePath*)pNode)->IsPathAllowable()); if ( DoThisNode ) { // for convenience, cast the pointer to a pointer to a NodePath ThisPath = (NodePath*)pNode; // First get pointers to the arrays PathVerb* Verbs = NULL; PathFlags* Flags = NULL; DocCoord* Coords = NULL; ThisPath->InkPath.GetPathArrays(&Verbs, &Coords, &Flags); INT32 NumCoords = ThisPath->InkPath.GetNumCoords(); BOOL PrevSelected = FALSE; INT32 PrevPos = 0; // Set the NeedToRender flags INT32 loop; for (loop = 0; loop < NumCoords; loop++) { if (Flags[loop].IsEndPoint && Flags[loop].IsSelected) Flags[loop].NeedToRender = TRUE; else Flags[loop].NeedToRender = FALSE; } // Force a re-draw of the place where the path used to be if (ok) ok = (RecalcBoundsAction::DoRecalc(this, &UndoActions, ThisPath, TRUE) != AC_FAIL); // loop through the points for (loop = 0; loop<NumCoords; loop++) { if (Flags[loop].IsEndPoint) { // its an endpoint if (Flags[loop].IsSelected) { // which is selected if (PrevSelected && ((Verbs[loop] & ~PT_CLOSEFIGURE) == GetProcessPathType()) ) { // and the previous was selected and it's a processable segment if (ok) ok = ProcessSegment(ThisPath, &loop, PrevPos); // Recache array pointers ThisPath->InkPath.GetPathArrays(&Verbs, &Coords, &Flags); NumCoords = ThisPath->InkPath.GetNumCoords(); Flags[loop].NeedToRender = TRUE; } PrevSelected = TRUE; PrevPos = loop; } else PrevSelected = FALSE; } } // Having finished processing this path go round and smooth it. DocCoord NewCoord; for (loop = 0; (ok && (loop < NumCoords)); loop++) { if (Verbs[loop] == PT_BEZIERTO && !(Flags[loop].IsEndPoint) && Flags[loop].IsSmooth) { NewCoord = ThisPath->InkPath.SmoothControlPoint(loop); if (ok && (NewCoord != Coords[loop])) { ok = DoAlterPathElement(ThisPath, loop, NewCoord, Flags[loop], Verbs[loop], FALSE); ThisPath->InkPath.GetPathArrays(&Verbs, &Coords, &Flags); } } } ThisPath->InvalidateBoundingRect(); // Force a redraw of the place where the path is now. if (ok) ok = (RecordBoundsAction::DoRecord(this, &UndoActions, ThisPath, TRUE) != AC_FAIL); } pNode = Selected->FindNext(pNode); } if (ok) { ObjChange.Define(OBJCHANGE_FINISHED,cFlags,NULL,this); if (!UpdateChangedNodes(&ObjChange)) { FailAndExecute(); End(); return; } } EndSlowJob(); if (!ok) { FailAndExecute(); InformError(); } #endif End(); }