diff --git a/Assets/Keypoints.meta b/Assets/Keypoints.meta new file mode 100644 index 0000000..a1f4b53 --- /dev/null +++ b/Assets/Keypoints.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 5d89abaae882c4fe2b507f2f8a1f72c4 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Keypoints.unity b/Assets/Keypoints.unity new file mode 100644 index 0000000..28ec8b4 --- /dev/null +++ b/Assets/Keypoints.unity @@ -0,0 +1,508 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!29 &1 +OcclusionCullingSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_OcclusionBakeSettings: + smallestOccluder: 5 + smallestHole: 0.25 + backfaceThreshold: 100 + m_SceneGUID: 00000000000000000000000000000000 + m_OcclusionCullingData: {fileID: 0} +--- !u!104 &2 +RenderSettings: + m_ObjectHideFlags: 0 + serializedVersion: 9 + m_Fog: 0 + m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} + m_FogMode: 3 + m_FogDensity: 0.01 + m_LinearFogStart: 0 + m_LinearFogEnd: 300 + m_AmbientSkyColor: {r: 0.212, g: 0.227, b: 0.259, a: 1} + m_AmbientEquatorColor: {r: 0.114, g: 0.125, b: 0.133, a: 1} + m_AmbientGroundColor: {r: 0.047, g: 0.043, b: 0.035, a: 1} + m_AmbientIntensity: 1 + m_AmbientMode: 3 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 0} + m_HaloStrength: 0.5 + m_FlareStrength: 1 + m_FlareFadeSpeed: 3 + m_HaloTexture: {fileID: 0} + m_SpotCookie: {fileID: 10001, guid: 0000000000000000e000000000000000, type: 0} + m_DefaultReflectionMode: 0 + m_DefaultReflectionResolution: 128 + m_ReflectionBounces: 1 + m_ReflectionIntensity: 1 + m_CustomReflection: {fileID: 0} + m_Sun: {fileID: 0} + m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_UseRadianceAmbientProbe: 0 +--- !u!157 &3 +LightmapSettings: + m_ObjectHideFlags: 0 + serializedVersion: 12 + m_GIWorkflowMode: 1 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 0 + m_EnableRealtimeLightmaps: 0 + m_LightmapEditorSettings: + serializedVersion: 12 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 0 + m_ExtractAmbientOcclusion: 0 + m_Padding: 2 + m_LightmapParameters: {fileID: 0} + m_LightmapsBakeMode: 1 + m_TextureCompression: 1 + m_FinalGather: 0 + m_FinalGatherFiltering: 1 + m_FinalGatherRayCount: 256 + m_ReflectionCompression: 2 + m_MixedBakeMode: 2 + m_BakeBackend: 1 + m_PVRSampling: 1 + m_PVRDirectSampleCount: 32 + m_PVRSampleCount: 512 + m_PVRBounces: 2 + m_PVREnvironmentSampleCount: 256 + m_PVREnvironmentReferencePointCount: 2048 + m_PVRFilteringMode: 1 + m_PVRDenoiserTypeDirect: 1 + m_PVRDenoiserTypeIndirect: 1 + m_PVRDenoiserTypeAO: 1 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVREnvironmentMIS: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ExportTrainingData: 0 + m_TrainingDataDestination: TrainingData + m_LightProbeSampleCountMultiplier: 4 + m_LightingDataAsset: {fileID: 0} + m_LightingSettings: {fileID: 0} +--- !u!196 &4 +NavMeshSettings: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_BuildSettings: + serializedVersion: 2 + agentTypeID: 0 + agentRadius: 0.5 + agentHeight: 2 + agentSlope: 45 + agentClimb: 0.4 + ledgeDropHeight: 0 + maxJumpAcrossDistance: 0 + minRegionArea: 2 + manualCellSize: 0 + cellSize: 0.16666667 + manualTileSize: 0 + tileSize: 256 + accuratePlacement: 0 + maxJobWorkers: 0 + preserveTilesOutsideBounds: 0 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &274663181 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 274663183} + - component: {fileID: 274663182} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!20 &274663182 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 274663181} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0, g: 0.058700204, b: 0.1509434, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.1 + far clip plane: 100 + field of view: 60 + orthographic: 1 + orthographic size: 0.5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: 1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 0 + m_AllowMSAA: 0 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 0 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &274663183 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 274663181} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &431196467 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 431196468} + - component: {fileID: 431196470} + - component: {fileID: 431196471} + m_Layer: 5 + m_Name: View + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &431196468 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 431196467} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 1869171754} + m_Father: {fileID: 1339821705} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &431196470 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 431196467} + m_CullTransparentMesh: 1 +--- !u!114 &431196471 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 431196467} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 86710e43de46f6f4bac7c8e50813a599, type: 3} + m_Name: + m_EditorClassIdentifier: + m_AspectMode: 2 + m_AspectRatio: 1.3333334 +--- !u!1 &1106664931 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1106664934} + - component: {fileID: 1106664933} + - component: {fileID: 1106664932} + m_Layer: 0 + m_Name: Keypoint Viewer + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1106664932 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1106664931} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fb59fc5f660284b628181a2481152058, type: 3} + m_Name: + m_EditorClassIdentifier: + _source: {fileID: 1106664933} + _resources: {fileID: 11400000, guid: c0532b829d2dd49d99fa8e8df757816e, type: 2} + _resolution: {x: 512, y: 384} + _previewUI: {fileID: 1869171756} + _markerPrefab: {fileID: 4461991498135571732, guid: eee3f1712c0734bd3be7bea414530f1b, type: 3} +--- !u!114 &1106664933 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1106664931} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 40ff2e515a81541cbb664860588e2c6e, type: 3} + m_Name: + m_EditorClassIdentifier: + _sourceType: 0 + _texture: {fileID: 2800000, guid: 75b2c8951439440f0ae8794aebcbebc1, type: 3} + _textureUrl: + _video: {fileID: 0} + _videoUrl: + _webcamName: + _webcamResolution: {x: 1920, y: 1080} + _webcamFrameRate: 30 + _outputTexture: {fileID: 0} + _outputResolution: {x: 1440, y: 1080} + _shader: {fileID: 4800000, guid: 3f7d8db4748f54c638a46cec0b0e61f8, type: 3} +--- !u!4 &1106664934 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1106664931} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 2 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1339821701 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1339821705} + - component: {fileID: 1339821704} + - component: {fileID: 1339821703} + - component: {fileID: 1339821702} + m_Layer: 5 + m_Name: Canvas + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1339821702 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1339821701} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dc42784cf147c0c48a680349fa168899, type: 3} + m_Name: + m_EditorClassIdentifier: + m_IgnoreReversedGraphics: 1 + m_BlockingObjects: 0 + m_BlockingMask: + serializedVersion: 2 + m_Bits: 4294967295 +--- !u!114 &1339821703 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1339821701} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 0cd44c1031e13a943bb63640046fad76, type: 3} + m_Name: + m_EditorClassIdentifier: + m_UiScaleMode: 0 + m_ReferencePixelsPerUnit: 100 + m_ScaleFactor: 1 + m_ReferenceResolution: {x: 800, y: 600} + m_ScreenMatchMode: 0 + m_MatchWidthOrHeight: 0 + m_PhysicalUnit: 3 + m_FallbackScreenDPI: 96 + m_DefaultSpriteDPI: 96 + m_DynamicPixelsPerUnit: 1 + m_PresetInfoIsWorld: 0 +--- !u!223 &1339821704 +Canvas: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1339821701} + m_Enabled: 1 + serializedVersion: 3 + m_RenderMode: 1 + m_Camera: {fileID: 274663182} + m_PlaneDistance: 100 + m_PixelPerfect: 0 + m_ReceivesEvents: 1 + m_OverrideSorting: 0 + m_OverridePixelPerfect: 0 + m_SortingBucketNormalizedSize: 0 + m_AdditionalShaderChannelsFlag: 0 + m_SortingLayerID: 0 + m_SortingOrder: 0 + m_TargetDisplay: 0 +--- !u!224 &1339821705 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1339821701} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 431196468} + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0, y: 0} +--- !u!1 &1869171753 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1869171754} + - component: {fileID: 1869171755} + - component: {fileID: 1869171756} + m_Layer: 5 + m_Name: Preview + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &1869171754 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1869171753} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 431196468} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1869171755 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1869171753} + m_CullTransparentMesh: 1 +--- !u!114 &1869171756 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1869171753} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1344c3c82d62a2a41a3576d8abb8e3ea, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Texture: {fileID: 10309, guid: 0000000000000000f000000000000000, type: 0} + m_UVRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 diff --git a/Assets/Keypoints.unity.meta b/Assets/Keypoints.unity.meta new file mode 100644 index 0000000..2174c40 --- /dev/null +++ b/Assets/Keypoints.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 89af400eb20bd4108af86454ec18b91e +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Keypoints/KeypointMarker.prefab b/Assets/Keypoints/KeypointMarker.prefab new file mode 100644 index 0000000..d4cd657 --- /dev/null +++ b/Assets/Keypoints/KeypointMarker.prefab @@ -0,0 +1,161 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &6137921099632638934 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4461991498135571732} + - component: {fileID: 6490706928186325968} + - component: {fileID: 570774262892799599} + m_Layer: 5 + m_Name: KeypointMarker + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4461991498135571732 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6137921099632638934} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 2372182626392270488} + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 0, y: 0} + m_AnchoredPosition: {x: 100, y: 100} + m_SizeDelta: {x: 12, y: 12} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6490706928186325968 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6137921099632638934} + m_CullTransparentMesh: 1 +--- !u!114 &570774262892799599 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6137921099632638934} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0, b: 0.5458698, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 +--- !u!1 &6738031496189894061 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2372182626392270488} + - component: {fileID: 857082782510381915} + - component: {fileID: 1677703148358668360} + m_Layer: 5 + m_Name: Text + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &2372182626392270488 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6738031496189894061} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 4461991498135571732} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 12, y: 0} + m_SizeDelta: {x: 100, y: 30} + m_Pivot: {x: 0, y: 0.5} +--- !u!222 &857082782510381915 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6738031496189894061} + m_CullTransparentMesh: 1 +--- !u!114 &1677703148358668360 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6738031496189894061} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5f7201a12d95ffc409449d95f23cf332, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 0, b: 0.5458698, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_FontData: + m_Font: {fileID: 10102, guid: 0000000000000000e000000000000000, type: 0} + m_FontSize: 12 + m_FontStyle: 0 + m_BestFit: 0 + m_MinSize: 1 + m_MaxSize: 40 + m_Alignment: 3 + m_AlignByGeometry: 0 + m_RichText: 1 + m_HorizontalOverflow: 0 + m_VerticalOverflow: 0 + m_LineSpacing: 1 + m_Text: 'Name + + 1.000' diff --git a/Assets/Keypoints/KeypointMarker.prefab.meta b/Assets/Keypoints/KeypointMarker.prefab.meta new file mode 100644 index 0000000..39c2f30 --- /dev/null +++ b/Assets/Keypoints/KeypointMarker.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: eee3f1712c0734bd3be7bea414530f1b +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Keypoints/KeypointViewer.cs b/Assets/Keypoints/KeypointViewer.cs new file mode 100644 index 0000000..7cc4f9d --- /dev/null +++ b/Assets/Keypoints/KeypointViewer.cs @@ -0,0 +1,61 @@ +using UnityEngine; +using UI = UnityEngine.UI; +using Klak.TestTools; +using BodyPix; +using System.Linq; + +public sealed class KeypointViewer : MonoBehaviour +{ + [SerializeField] ImageSource _source = null; + [SerializeField] ResourceSet _resources = null; + [SerializeField] Vector2Int _resolution = new Vector2Int(512, 384); + [SerializeField] UI.RawImage _previewUI = null; + [SerializeField] RectTransform _markerPrefab = null; + + const float ScoreThreshold = 0.3f; + + BodyDetector _detector; + + (RectTransform xform, UI.Text label) [] + _markers = new (RectTransform, UI.Text) [Body.KeypointCount]; + + void Start() + { + // BodyPix detector initialization + _detector = new BodyDetector(_resources, _resolution.x, _resolution.y); + + // Marker population + for (var i = 0; i < Body.KeypointCount; i++) + { + var xform = Instantiate(_markerPrefab, _previewUI.transform); + _markers[i] = (xform, xform.GetComponentInChildren()); + } + } + + void OnDestroy() + => _detector.Dispose(); + + void LateUpdate() + { + // BodyPix detector update + _detector.ProcessImage(_source.Texture); + _previewUI.texture = _source.Texture; + + // Marker update + var rectSize = _previewUI.rectTransform.rect.size; + for (var i = 0; i < Body.KeypointCount; i++) + { + var key = _detector.Keypoints.ElementAt(i); + var (xform, label) = _markers[i]; + + // Visibility + var visible = key.Score > ScoreThreshold; + xform.gameObject.SetActive(visible); + if (!visible) continue; + + // Position and label + xform.anchoredPosition = key.Position * rectSize; + label.text = $"{(Body.KeypointID)i}\n{key.Score:0.00}"; + } + } +} diff --git a/Assets/Keypoints/KeypointViewer.cs.meta b/Assets/Keypoints/KeypointViewer.cs.meta new file mode 100644 index 0000000..510afde --- /dev/null +++ b/Assets/Keypoints/KeypointViewer.cs.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: fb59fc5f660284b628181a2481152058 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: + - _source: {instanceID: 0} + - _resources: {fileID: 11400000, guid: c0532b829d2dd49d99fa8e8df757816e, type: 2} + - _previewUI: {instanceID: 0} + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Pexels.meta b/Assets/Pexels.meta new file mode 100644 index 0000000..5236dee --- /dev/null +++ b/Assets/Pexels.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 8a6889137fe034e80a07d749c8551831 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/pexels-fauxels-3184419.jpg b/Assets/Pexels/pexels-fauxels-3184419.jpg similarity index 100% rename from Assets/pexels-fauxels-3184419.jpg rename to Assets/Pexels/pexels-fauxels-3184419.jpg diff --git a/Assets/pexels-fauxels-3184419.jpg.meta b/Assets/Pexels/pexels-fauxels-3184419.jpg.meta similarity index 100% rename from Assets/pexels-fauxels-3184419.jpg.meta rename to Assets/Pexels/pexels-fauxels-3184419.jpg.meta diff --git a/Assets/pexels-jack-sparrow-4046265.jpg b/Assets/Pexels/pexels-jack-sparrow-4046265.jpg similarity index 100% rename from Assets/pexels-jack-sparrow-4046265.jpg rename to Assets/Pexels/pexels-jack-sparrow-4046265.jpg diff --git a/Assets/pexels-jack-sparrow-4046265.jpg.meta b/Assets/Pexels/pexels-jack-sparrow-4046265.jpg.meta similarity index 100% rename from Assets/pexels-jack-sparrow-4046265.jpg.meta rename to Assets/Pexels/pexels-jack-sparrow-4046265.jpg.meta diff --git a/Assets/pexels-karolina-grabowska-4378882.jpg b/Assets/Pexels/pexels-karolina-grabowska-4378882.jpg similarity index 100% rename from Assets/pexels-karolina-grabowska-4378882.jpg rename to Assets/Pexels/pexels-karolina-grabowska-4378882.jpg diff --git a/Assets/pexels-karolina-grabowska-4378882.jpg.meta b/Assets/Pexels/pexels-karolina-grabowska-4378882.jpg.meta similarity index 100% rename from Assets/pexels-karolina-grabowska-4378882.jpg.meta rename to Assets/Pexels/pexels-karolina-grabowska-4378882.jpg.meta diff --git a/Assets/Visualizer.meta b/Assets/Visualizer.meta new file mode 100644 index 0000000..d460754 --- /dev/null +++ b/Assets/Visualizer.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 11832beb8803046fc97747e8c5600d95 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Visualizer.cs b/Assets/Visualizer/Visualizer.cs similarity index 73% rename from Assets/Visualizer.cs rename to Assets/Visualizer/Visualizer.cs index b2fa419..fb7ef41 100644 --- a/Assets/Visualizer.cs +++ b/Assets/Visualizer/Visualizer.cs @@ -3,7 +3,7 @@ using Klak.TestTools; using BodyPix; -sealed class Visualizer : MonoBehaviour +public sealed class Visualizer : MonoBehaviour { [SerializeField] ImageSource _source = null; [SerializeField] ResourceSet _resources = null; @@ -13,13 +13,13 @@ sealed class Visualizer : MonoBehaviour [SerializeField] bool _drawSkeleton = false; [SerializeField] Shader _shader = null; - BodyPixRuntime _bodypix; + BodyDetector _detector; Material _material; RenderTexture _mask; void Start() { - _bodypix = new BodyPixRuntime(_resources, _resolution.x, _resolution.y); + _detector = new BodyDetector(_resources, _resolution.x, _resolution.y); _material = new Material(_shader); @@ -30,29 +30,29 @@ void Start() void OnDestroy() { - _bodypix.Dispose(); + _detector.Dispose(); Destroy(_material); Destroy(_mask); } void LateUpdate() { - _bodypix.ProcessImage(_source.Texture); + _detector.ProcessImage(_source.Texture); _previewUI.texture = _source.Texture; - Graphics.Blit(_bodypix.MaskTexture, _mask, _material, 0); + Graphics.Blit(_detector.MaskTexture, _mask, _material, 0); } void OnRenderObject() { if (!_drawSkeleton) return; - _material.SetBuffer("_Keypoints", _bodypix.KeypointBuffer); + _material.SetBuffer("_Keypoints", _detector.KeypointBuffer); _material.SetFloat("_Aspect", (float)_resolution.x / _resolution.y); _material.SetPass(1); Graphics.DrawProceduralNow - (MeshTopology.Triangles, 6, BodyPixRuntime.KeypointCount); + (MeshTopology.Triangles, 6, Body.KeypointCount); _material.SetPass(2); Graphics.DrawProceduralNow(MeshTopology.Lines, 2, 12); diff --git a/Assets/Visualizer.cs.meta b/Assets/Visualizer/Visualizer.cs.meta similarity index 100% rename from Assets/Visualizer.cs.meta rename to Assets/Visualizer/Visualizer.cs.meta diff --git a/Assets/Visualizer.shader b/Assets/Visualizer/Visualizer.shader similarity index 99% rename from Assets/Visualizer.shader rename to Assets/Visualizer/Visualizer.shader index 8323413..7742765 100644 --- a/Assets/Visualizer.shader +++ b/Assets/Visualizer/Visualizer.shader @@ -124,7 +124,7 @@ Shader "Hidden/BodyPix/Visualizer" float x = lerp(-0.5, 0.5, key.x) * _Aspect; float y = lerp(-0.5, 0.5, key.y); - const float threshold = 0.5; + const float threshold = 0.3; bool mask = key.z > threshold; position = UnityObjectToClipPos(float4(x, y, 1, 1)); diff --git a/Assets/Visualizer.shader.meta b/Assets/Visualizer/Visualizer.shader.meta similarity index 100% rename from Assets/Visualizer.shader.meta rename to Assets/Visualizer/Visualizer.shader.meta diff --git a/Packages/jp.keijiro.bodypix/Script/Body.cs b/Packages/jp.keijiro.bodypix/Script/Body.cs new file mode 100644 index 0000000..4db4bc7 --- /dev/null +++ b/Packages/jp.keijiro.bodypix/Script/Body.cs @@ -0,0 +1,49 @@ +using System.Runtime.InteropServices; +using UnityEngine; + +namespace BodyPix { + +public static class Body +{ + public const int PartCount = 24; + public const int KeypointCount = 17; + + public enum KeypointID + { + Nose, + LeftEye, RightEye, + LeftEar, RightEar, + LeftShoulder, RightShoulder, + LeftElbow, RightElbow, + LeftWrist, RightWrist, + LeftHip, RightHip, + LeftKnee, RightKnee, + LeftAnkle, RightAnkle + } + + public enum PartID + { + LeftFace, RightFace, + LeftUpperArmFront, LeftUpperArmBack, + RightUpperArmFront, RightUpperArmBack, + LeftLowerArmFront, LeftLowerArmBack, + RightLowerArmFront, RightLowerArmBack, + LeftHand, RightHand, + TorsoFront, TorsoBack, + LeftUpperLegFront, LeftUpperLegBack, + RightUpperLegFront, RightUpperLegBack, + LeftLowerLegFront, LeftLowerLegBack, + RightLowerLegFront, RightLowerLegBack, + LeftFeet, RightFeet + } +} + +[StructLayout(LayoutKind.Sequential)] +public struct Keypoint +{ + public Vector2 Position; + public float Score; + public uint Padding; +} + +} // namespace BodyPix diff --git a/Packages/jp.keijiro.bodypix/Script/Body.cs.meta b/Packages/jp.keijiro.bodypix/Script/Body.cs.meta new file mode 100644 index 0000000..e6ecf3b --- /dev/null +++ b/Packages/jp.keijiro.bodypix/Script/Body.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 71eab9a72ecbf48e494274ea17fc75b9 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Packages/jp.keijiro.bodypix/Script/BodyPixRuntime.cs b/Packages/jp.keijiro.bodypix/Script/BodyDetector.cs similarity index 86% rename from Packages/jp.keijiro.bodypix/Script/BodyPixRuntime.cs rename to Packages/jp.keijiro.bodypix/Script/BodyDetector.cs index c44c589..909cdbd 100644 --- a/Packages/jp.keijiro.bodypix/Script/BodyPixRuntime.cs +++ b/Packages/jp.keijiro.bodypix/Script/BodyDetector.cs @@ -1,17 +1,14 @@ +using System.Collections.Generic; using Unity.Barracuda; using UnityEngine; namespace BodyPix { -public sealed class BodyPixRuntime : System.IDisposable +public sealed class BodyDetector : System.IDisposable { #region Public methods/properties - public const int PartCount = 24; - - public const int KeypointCount = 17; - - public BodyPixRuntime(ResourceSet resources, int width, int height) + public BodyDetector(ResourceSet resources, int width, int height) => AllocateObjects(resources, width, height); public void Dispose() @@ -20,6 +17,9 @@ public void Dispose() public void ProcessImage(Texture sourceTexture) => RunModel(sourceTexture); + public IEnumerable Keypoints + => _readCache.Cached; + public RenderTexture MaskTexture => _buffers.mask; @@ -42,6 +42,8 @@ public GraphicsBuffer KeypointBuffer RenderTexture mask, GraphicsBuffer keypoints) _buffers; + KeypointCache _readCache; + void AllocateObjects(ResourceSet resources, int width, int height) { // NN model loading @@ -63,17 +65,20 @@ void AllocateObjects(ResourceSet resources, int width, int height) (_config.OutputWidth * 24, _config.OutputHeight); _buffers.heatmaps = RTUtil.NewFloat - (_config.OutputWidth * KeypointCount, _config.OutputHeight); + (_config.OutputWidth * Body.KeypointCount, _config.OutputHeight); _buffers.offsets = RTUtil.NewFloat - (_config.OutputWidth * KeypointCount * 2, _config.OutputHeight); + (_config.OutputWidth * Body.KeypointCount * 2, _config.OutputHeight); _buffers.mask = RTUtil.NewArgbUav (_config.OutputWidth, _config.OutputHeight); _buffers.keypoints = new GraphicsBuffer (GraphicsBuffer.Target.Structured, - KeypointCount, sizeof(float) * 4); + Body.KeypointCount, sizeof(float) * 4); + + // Keypoint data read cache initialization + _readCache = new KeypointCache(_buffers.keypoints); } void DeallocateObjects() @@ -144,6 +149,9 @@ void RunModel(Texture source) post2.SetInt("Stride", _config.Stride); post2.SetBuffer(0, "Keypoints", _buffers.keypoints); post2.Dispatch(0, 1, 1, 1); + + // Cache data invalidation + _readCache.Invalidate(); } #endregion diff --git a/Packages/jp.keijiro.bodypix/Script/BodyPixRuntime.cs.meta b/Packages/jp.keijiro.bodypix/Script/BodyDetector.cs.meta similarity index 100% rename from Packages/jp.keijiro.bodypix/Script/BodyPixRuntime.cs.meta rename to Packages/jp.keijiro.bodypix/Script/BodyDetector.cs.meta diff --git a/Packages/jp.keijiro.bodypix/Script/Internal/Utility.cs b/Packages/jp.keijiro.bodypix/Script/Internal/Utility.cs index bc43980..9dab533 100644 --- a/Packages/jp.keijiro.bodypix/Script/Internal/Utility.cs +++ b/Packages/jp.keijiro.bodypix/Script/Internal/Utility.cs @@ -72,4 +72,27 @@ public static void CopyOutput #endregion +#region GPU to CPU readback helpers + +sealed class KeypointCache +{ + public KeypointCache(GraphicsBuffer source) => _source = source; + public Keypoint[] Cached => Read(); + public void Invalidate() => _isCached = false; + + GraphicsBuffer _source; + Keypoint[] _array = new Keypoint[Body.KeypointCount]; + bool _isCached; + + Keypoint[] Read() + { + if (_isCached) return _array; + _source.GetData(_array, 0, 0, Body.KeypointCount); + _isCached = true; + return _array; + } +} + +#endregion + } // namespace BodyPix diff --git a/Packages/jp.keijiro.bodypix/Shader/Keypoints.compute b/Packages/jp.keijiro.bodypix/Shader/Keypoints.compute index 3bdb18e..5b7c4ed 100644 --- a/Packages/jp.keijiro.bodypix/Shader/Keypoints.compute +++ b/Packages/jp.keijiro.bodypix/Shader/Keypoints.compute @@ -43,5 +43,5 @@ void PostprocessKeypoints(uint id : SV_DispatchThreadID) float2 offs = float2(Offsets[ix], -Offsets[iy]); float2 pos = (max_pos + offs / Stride + 0.5) / InputSize; - Keypoints[id] = float4(pos, BodyPix_Sigmoid(max_score), 0); + Keypoints[id] = float4(pos, max_score, 0); } diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index 62c5a75..db695cd 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -1,11 +1,11 @@ -%YAML 1.1 -%TAG !u! tag:unity3d.com,2011: ---- !u!1045 &1 -EditorBuildSettings: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Scenes: - - enabled: 1 - path: Assets/Scenes/SampleScene.unity - guid: 2cda990e2423bbf4892e6590ba056729 - m_configObjects: {} +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1045 &1 +EditorBuildSettings: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Scenes: + - enabled: 1 + path: Assets/Visualizer.unity + guid: 48ec58351d355467b959abe74cef934c + m_configObjects: {}