diff --git a/Source/Private/MobuLiveLinkLayout.cpp b/Source/Private/MobuLiveLinkLayout.cpp index 40d36be4..a6b75b59 100644 --- a/Source/Private/MobuLiveLinkLayout.cpp +++ b/Source/Private/MobuLiveLinkLayout.cpp @@ -21,7 +21,6 @@ bool MobuLiveLinkLayout::FBCreate() ModelStoreFunctions.Emplace(FBLight::TypeInfo, (ModelStoreFunctionType)&MobuLiveLinkLayout::StoreLight); ModelStoreFunctions.Emplace(FBModelSkeleton::TypeInfo, (ModelStoreFunctionType)&MobuLiveLinkLayout::StoreSkeleton); ModelStoreFunctions.Emplace(FBModelRoot::TypeInfo, (ModelStoreFunctionType)&MobuLiveLinkLayout::StoreSkeleton); - ModelStoreFunctions.Emplace(FBModelNull::TypeInfo, (ModelStoreFunctionType)&MobuLiveLinkLayout::StoreGeneric); // Get a handle on the device. LiveLinkDevice = ((MobuLiveLink *)(FBDevice *)Device); @@ -73,21 +72,21 @@ void MobuLiveLinkLayout::UICreate() StreamLayout.AddRegion("ObjectSelector", "ObjectSelector", S, kFBAttachLeft, "", 1.00, S, kFBAttachTop, "", 1.00, - 2 * W, kFBAttachNone, NULL, 1.00, - H, kFBAttachNone, NULL, 1.00); + 2 * W, kFBAttachNone, nullptr, 1.00, + H, kFBAttachNone, nullptr, 1.00); StreamLayout.AddRegion("AddToStreamButton", "AddToStreamButton", S, kFBAttachRight, "ObjectSelector", 1.00, 0, kFBAttachTop, "ObjectSelector", 1.00, - W, kFBAttachNone, NULL, 1.00, - H, kFBAttachNone, NULL, 1.00); + W, kFBAttachNone, nullptr, 1.00, + H, kFBAttachNone, nullptr, 1.00); StreamLayout.AddRegion("RemoveFromStreamButton", "RemoveFromStreamButton", S, kFBAttachRight, "AddToStreamButton", 1.00, 0, kFBAttachTop, "AddToStreamButton", 1.00, - W, kFBAttachNone, NULL, 1.00, - H, kFBAttachNone, NULL, 1.00); + W, kFBAttachNone, nullptr, 1.00, + H, kFBAttachNone, nullptr, 1.00); StreamLayout.AddRegion("StreamSpread", "StreamSpread", S, kFBAttachLeft, "", 1.00, @@ -204,17 +203,21 @@ void MobuLiveLinkLayout::EventAddToStream(HISender Sender, HKEvent Event) else if (!IsModelInDeviceStream(LiveLinkDevice, Model)) { ModelStoreFunctionType* StoreFunction = ModelStoreFunctions.Find(Model->GetTypeId()); + StreamObjectPtr StoreObject; if (StoreFunction != nullptr) { - StreamObjectPtr StoreObject = (this->*(*StoreFunction))(Model); - - LiveLinkDevice->StreamObjects.Emplace((kReference)Model, StoreObject); - AddSpreadRowFromStreamObject(StoreObject); - FBTrace("Added New Object to StreamObject\n"); - - ParentsToIgnore.Emplace(Model); + StoreObject = (this->*(*StoreFunction))(Model); } + else + { + StoreObject = StoreGeneric(Model); + } + LiveLinkDevice->StreamObjects.Emplace((kReference)Model, StoreObject); + AddSpreadRowFromStreamObject(StoreObject); + FBTrace("Added New Object to StreamObject\n"); + ParentsToIgnore.Emplace(Model); + } } ObjectSelection.Clear(); diff --git a/Source/Public/StreamStore.h b/Source/Public/StreamStore.h index 8bd916d4..7356c82b 100644 --- a/Source/Public/StreamStore.h +++ b/Source/Public/StreamStore.h @@ -8,6 +8,11 @@ #include #pragma warning(pop) +// TODO: StreamObjectBase should not rely on FBModel, instead it should just have some virtual accessors for data like Root Name +// There would then be a ModelStreamObject which works with FBModels and then all specific cases of FBModel inherit from that +// i.e. StreamObjectBase -> ModelStreamObject -> LightStreamObject +// This would fix the hacks I had to do to support EditorActiveCameraStreamObject + // Abstract class. Inherit from this to support streaming. // Wraps an FBModel* to get the required data for streaming. class StreamObjectBase @@ -66,7 +71,7 @@ class StreamObjectBase StreamObjectBase(const FBModel* ModelPointer, const TSharedPtr StreamProvider, std::initializer_list Options); - // model-less constructor + // model-less constructor to support EditorActiveCameraStreamObject StreamObjectBase(const FName InSubjectName, const TSharedPtr StreamProvider); }; diff --git a/Source/StreamObjects/CameraStreamObject.cpp b/Source/StreamObjects/CameraStreamObject.cpp index 7e7b2ad3..fb6541e8 100644 --- a/Source/StreamObjects/CameraStreamObject.cpp +++ b/Source/StreamObjects/CameraStreamObject.cpp @@ -1,7 +1,7 @@ #include "StreamStore.h" CameraStreamObject::CameraStreamObject(const FBModel* ModelPointer, const TSharedPtr StreamProvider) : - StreamObjectBase(ModelPointer, StreamProvider, { TEXT("As Camera"), TEXT("As Transform") }) + StreamObjectBase(ModelPointer, StreamProvider, { TEXT("Camera"), TEXT("Root Only") }) { UpdateFromModel(); } diff --git a/Source/StreamObjects/GenericStreamObject.cpp b/Source/StreamObjects/GenericStreamObject.cpp index e5e49fe4..4aa6ffbd 100644 --- a/Source/StreamObjects/GenericStreamObject.cpp +++ b/Source/StreamObjects/GenericStreamObject.cpp @@ -1,7 +1,7 @@ #include "StreamStore.h" GenericStreamObject::GenericStreamObject(const FBModel* ModelPointer, const TSharedPtr StreamProvider) : - StreamObjectBase(ModelPointer, StreamProvider, { TEXT("As Transform") }) + StreamObjectBase(ModelPointer, StreamProvider, { TEXT("Root Only") }) { UpdateFromModel(); }; @@ -26,7 +26,7 @@ void GenericStreamObject::GetStreamData() BoneTransforms.Emplace(UnrealTransformFromModel((FBModel*)RootModel)); // Generic Models have no special properties - TArray CurveData; + TArray CurveData = GetAllAnimatableCurves((FBModel*)RootModel); FBTime LocalTime = FBSystem().LocalTime; Provider->UpdateSubjectFrame(SubjectName, BoneTransforms, CurveData, LocalTime.GetSecondDouble(), LocalTime.GetFrame()); diff --git a/Source/StreamObjects/LightStreamObject.cpp b/Source/StreamObjects/LightStreamObject.cpp index cc9dfc3c..8e47fbdb 100644 --- a/Source/StreamObjects/LightStreamObject.cpp +++ b/Source/StreamObjects/LightStreamObject.cpp @@ -1,7 +1,7 @@ #include "StreamStore.h" LightStreamObject::LightStreamObject(const FBModel* ModelPointer, const TSharedPtr StreamProvider) : - StreamObjectBase(ModelPointer, StreamProvider, { TEXT("As Light"), TEXT("As Transform") }) + StreamObjectBase(ModelPointer, StreamProvider, { TEXT("Light"), TEXT("Root Only") }) { UpdateFromModel(); }; diff --git a/Source/StreamObjects/SkeletonHeirarchyStreamObject.cpp b/Source/StreamObjects/SkeletonHeirarchyStreamObject.cpp index d9ac8ba9..5ee34bd5 100644 --- a/Source/StreamObjects/SkeletonHeirarchyStreamObject.cpp +++ b/Source/StreamObjects/SkeletonHeirarchyStreamObject.cpp @@ -1,7 +1,7 @@ #include "StreamStore.h" SkeletonHeirarchyStreamObject::SkeletonHeirarchyStreamObject(const FBModel* ModelPointer, const TSharedPtr StreamProvider) : - StreamObjectBase(ModelPointer, StreamProvider, { TEXT("As Heirarchy"), TEXT("As Transform") }) + StreamObjectBase(ModelPointer, StreamProvider, { TEXT("Full Heirarchy"), TEXT("Root Only") }) { UpdateFromModel(); };