From 267b286765ab88867fbf8c483d0b30d2e9ec37bd Mon Sep 17 00:00:00 2001 From: hecomi Date: Sat, 29 Dec 2018 00:02:19 +0900 Subject: [PATCH] add 'buffer' property to Monitor to access the buffer pointer directly. --- .../Examples/Scenes/Buffer.unity | 258 ++++++++++++++++++ .../Examples/Scenes/Buffer.unity.meta | 7 + .../Examples/Scenes/GetPixels.unity | 183 ++++--------- .../Examples/Scripts/BufferExample.cs | 72 +++++ .../Examples/Scripts/BufferExample.cs.meta | 11 + .../Examples/Scripts/GetPixelsExample.cs | 23 +- .../Plugins/x86/uDesktopDuplication.dll | Bin 90112 -> 90112 bytes .../Plugins/x86_64/uDesktopDuplication.dll | Bin 108032 -> 108544 bytes Assets/uDesktopDuplication/Scripts/Lib.cs | 2 + Assets/uDesktopDuplication/Scripts/Monitor.cs | 5 + .../uDesktopDuplication/Monitor.cpp | 11 + .../uDesktopDuplication/Monitor.h | 1 + .../uDesktopDuplication/main.cpp | 16 +- 13 files changed, 446 insertions(+), 143 deletions(-) create mode 100644 Assets/uDesktopDuplication/Examples/Scenes/Buffer.unity create mode 100644 Assets/uDesktopDuplication/Examples/Scenes/Buffer.unity.meta create mode 100644 Assets/uDesktopDuplication/Examples/Scripts/BufferExample.cs create mode 100644 Assets/uDesktopDuplication/Examples/Scripts/BufferExample.cs.meta diff --git a/Assets/uDesktopDuplication/Examples/Scenes/Buffer.unity b/Assets/uDesktopDuplication/Examples/Scenes/Buffer.unity new file mode 100644 index 0000000..53304b8 --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scenes/Buffer.unity @@ -0,0 +1,258 @@ +%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: 0 + m_SubtractiveShadowColor: {r: 0.42, g: 0.478, b: 0.627, a: 1} + m_SkyboxMaterial: {fileID: 10304, guid: 0000000000000000f000000000000000, type: 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: 11 + m_GIWorkflowMode: 0 + m_GISettings: + serializedVersion: 2 + m_BounceScale: 1 + m_IndirectOutputScale: 1 + m_AlbedoBoost: 1 + m_TemporalCoherenceThreshold: 1 + m_EnvironmentLightingMode: 0 + m_EnableBakedLightmaps: 1 + m_EnableRealtimeLightmaps: 1 + m_LightmapEditorSettings: + serializedVersion: 10 + m_Resolution: 2 + m_BakeResolution: 40 + m_AtlasSize: 1024 + m_AO: 0 + m_AOMaxDistance: 1 + m_CompAOExponent: 1 + m_CompAOExponentDirect: 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: 500 + m_PVRBounces: 2 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 + m_PVRFilteringMode: 1 + m_PVRCulling: 1 + m_PVRFilteringGaussRadiusDirect: 1 + m_PVRFilteringGaussRadiusIndirect: 5 + m_PVRFilteringGaussRadiusAO: 2 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 + m_LightingDataAsset: {fileID: 0} + m_UseShadowmask: 1 +--- !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 + debug: + m_Flags: 0 + m_NavMeshData: {fileID: 0} +--- !u!1 &15787040 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 15787043} + - component: {fileID: 15787042} + - component: {fileID: 15787041} + m_Layer: 0 + m_Name: Main Camera + m_TagString: MainCamera + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!81 &15787041 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 15787040} + m_Enabled: 1 +--- !u!20 &15787042 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 15787040} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + 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.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: -1 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &15787043 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 15787040} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 1, z: -10} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 0 + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &423308485 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 423308487} + - component: {fileID: 423308486} + m_Layer: 0 + m_Name: Directional Light + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!108 &423308486 +Light: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 423308485} + m_Enabled: 1 + serializedVersion: 8 + m_Type: 1 + m_Color: {r: 1, g: 0.95686275, b: 0.8392157, a: 1} + m_Intensity: 1 + m_Range: 10 + m_SpotAngle: 30 + m_CookieSize: 10 + m_Shadows: + m_Type: 2 + m_Resolution: -1 + m_CustomResolution: -1 + m_Strength: 1 + m_Bias: 0.05 + m_NormalBias: 0.4 + m_NearPlane: 0.2 + m_Cookie: {fileID: 0} + m_DrawHalo: 0 + m_Flare: {fileID: 0} + m_RenderMode: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_Lightmapping: 4 + m_LightShadowCasterMode: 0 + m_AreaSize: {x: 1, y: 1} + m_BounceIntensity: 1 + m_ColorTemperature: 6570 + m_UseColorTemperature: 0 + m_ShadowRadius: 0 + m_ShadowAngle: 0 +--- !u!4 &423308487 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInternal: {fileID: 0} + m_GameObject: {fileID: 423308485} + m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} + m_LocalPosition: {x: 0, y: 3, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_Children: [] + m_Father: {fileID: 0} + m_RootOrder: 1 + m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} diff --git a/Assets/uDesktopDuplication/Examples/Scenes/Buffer.unity.meta b/Assets/uDesktopDuplication/Examples/Scenes/Buffer.unity.meta new file mode 100644 index 0000000..ba54af8 --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scenes/Buffer.unity.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 36c8d626679d64b46b75b9f1a2923647 +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Examples/Scenes/GetPixels.unity b/Assets/uDesktopDuplication/Examples/Scenes/GetPixels.unity index 4d04895..600ca9a 100644 --- a/Assets/uDesktopDuplication/Examples/Scenes/GetPixels.unity +++ b/Assets/uDesktopDuplication/Examples/Scenes/GetPixels.unity @@ -13,7 +13,7 @@ OcclusionCullingSettings: --- !u!104 &2 RenderSettings: m_ObjectHideFlags: 0 - serializedVersion: 8 + serializedVersion: 9 m_Fog: 0 m_FogColor: {r: 0.5, g: 0.5, b: 0.5, a: 1} m_FogMode: 3 @@ -38,7 +38,8 @@ RenderSettings: m_ReflectionIntensity: 1 m_CustomReflection: {fileID: 0} m_Sun: {fileID: 0} - m_IndirectSpecularColor: {r: 0, g: 0, b: 0, a: 1} + m_IndirectSpecularColor: {r: 0.18028378, g: 0.22571412, b: 0.30692285, a: 1} + m_UseRadianceAmbientProbe: 0 --- !u!157 &3 LightmapSettings: m_ObjectHideFlags: 0 @@ -54,11 +55,10 @@ LightmapSettings: m_EnableBakedLightmaps: 1 m_EnableRealtimeLightmaps: 1 m_LightmapEditorSettings: - serializedVersion: 9 + serializedVersion: 10 m_Resolution: 2 m_BakeResolution: 40 - m_TextureWidth: 1024 - m_TextureHeight: 1024 + m_AtlasSize: 1024 m_AO: 0 m_AOMaxDistance: 1 m_CompAOExponent: 1 @@ -77,15 +77,18 @@ LightmapSettings: m_PVRDirectSampleCount: 32 m_PVRSampleCount: 500 m_PVRBounces: 2 - m_PVRFiltering: 0 + m_PVRFilterTypeDirect: 0 + m_PVRFilterTypeIndirect: 0 + m_PVRFilterTypeAO: 0 m_PVRFilteringMode: 1 m_PVRCulling: 1 m_PVRFilteringGaussRadiusDirect: 1 m_PVRFilteringGaussRadiusIndirect: 5 m_PVRFilteringGaussRadiusAO: 2 - m_PVRFilteringAtrousColorSigma: 1 - m_PVRFilteringAtrousNormalSigma: 1 - m_PVRFilteringAtrousPositionSigma: 1 + m_PVRFilteringAtrousPositionSigmaDirect: 0.5 + m_PVRFilteringAtrousPositionSigmaIndirect: 2 + m_PVRFilteringAtrousPositionSigmaAO: 1 + m_ShowResolutionOverlay: 1 m_LightingDataAsset: {fileID: 0} m_UseShadowmask: 0 --- !u!196 &4 @@ -107,13 +110,15 @@ NavMeshSettings: manualTileSize: 0 tileSize: 256 accuratePlacement: 0 + debug: + m_Flags: 0 m_NavMeshData: {fileID: 0} --- !u!1 &129126780 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 5 + serializedVersion: 6 m_Component: - component: {fileID: 129126782} - component: {fileID: 129126781} @@ -127,7 +132,7 @@ GameObject: --- !u!108 &129126781 Light: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 129126780} m_Enabled: 1 @@ -154,22 +159,9 @@ Light: serializedVersion: 2 m_Bits: 4294967295 m_Lightmapping: 4 + m_LightShadowCasterMode: 0 m_AreaSize: {x: 1, y: 1} m_BounceIntensity: 1 - m_FalloffTable: - m_Table[0]: 0 - m_Table[1]: 0 - m_Table[2]: 0 - m_Table[3]: 0 - m_Table[4]: 0 - m_Table[5]: 0 - m_Table[6]: 0 - m_Table[7]: 0 - m_Table[8]: 0 - m_Table[9]: 0 - m_Table[10]: 0 - m_Table[11]: 0 - m_Table[12]: 0 m_ColorTemperature: 6570 m_UseColorTemperature: 0 m_ShadowRadius: 0 @@ -177,7 +169,7 @@ Light: --- !u!4 &129126782 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 129126780} m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261} @@ -187,80 +179,6 @@ Transform: m_Father: {fileID: 0} m_RootOrder: 1 m_LocalEulerAnglesHint: {x: 50, y: -30, z: 0} ---- !u!1 &913398332 -GameObject: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 1000012642892690, guid: de6f36e446e5e8a48bf61fe198985bb4, - type: 2} - m_PrefabInternal: {fileID: 940835900} - serializedVersion: 5 - m_Component: - - component: {fileID: 913398335} - - component: {fileID: 913398334} - - component: {fileID: 913398333} - - component: {fileID: 1426812830} - m_Layer: 0 - m_Name: Monitor Board - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!23 &913398333 -MeshRenderer: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 23000011974915108, guid: de6f36e446e5e8a48bf61fe198985bb4, - type: 2} - m_PrefabInternal: {fileID: 940835900} - m_GameObject: {fileID: 913398332} - m_Enabled: 1 - m_CastShadows: 1 - m_ReceiveShadows: 1 - m_MotionVectors: 1 - m_LightProbeUsage: 1 - m_ReflectionProbeUsage: 1 - m_Materials: - - {fileID: 2100000, guid: c181d333a7bee7a44b94c0f4e02c4bd4, type: 2} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_PreserveUVs: 1 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 ---- !u!33 &913398334 -MeshFilter: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 33000012841683532, guid: de6f36e446e5e8a48bf61fe198985bb4, - type: 2} - m_PrefabInternal: {fileID: 940835900} - m_GameObject: {fileID: 913398332} - m_Mesh: {fileID: 4300002, guid: d6b30b913257fee4d8246bf7a2620fcd, type: 3} ---- !u!4 &913398335 -Transform: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 4000011474108562, guid: de6f36e446e5e8a48bf61fe198985bb4, - type: 2} - m_PrefabInternal: {fileID: 940835900} - m_GameObject: {fileID: 913398332} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 10} - m_LocalScale: {x: 1.92, y: 1.08, z: 1} - m_Children: [] - m_Father: {fileID: 0} - m_RootOrder: 2 - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1001 &940835900 Prefab: m_ObjectHideFlags: 0 @@ -301,15 +219,14 @@ Prefab: value: 2 objectReference: {fileID: 0} m_RemovedComponents: [] - m_ParentPrefab: {fileID: 100100000, guid: de6f36e446e5e8a48bf61fe198985bb4, type: 2} - m_RootGameObject: {fileID: 913398332} - m_IsPrefabParent: 0 + m_SourcePrefab: {fileID: 100100000, guid: de6f36e446e5e8a48bf61fe198985bb4, type: 2} + m_IsPrefabAsset: 0 --- !u!1 &1324913475 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 5 + serializedVersion: 6 m_Component: - component: {fileID: 1324913479} - component: {fileID: 1324913478} @@ -326,15 +243,17 @@ GameObject: --- !u!23 &1324913476 MeshRenderer: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1324913475} m_Enabled: 1 m_CastShadows: 1 m_ReceiveShadows: 1 + m_DynamicOccludee: 1 m_MotionVectors: 1 m_LightProbeUsage: 1 m_ReflectionProbeUsage: 1 + m_RenderingLayerMask: 4294967295 m_Materials: - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} m_StaticBatchInfo: @@ -347,6 +266,7 @@ MeshRenderer: m_PreserveUVs: 1 m_IgnoreNormalsForChartDetection: 0 m_ImportantGI: 0 + m_StitchLightmapSeams: 0 m_SelectedEditorRenderState: 3 m_MinimumChartSize: 4 m_AutoUVMaxDistance: 0.5 @@ -358,28 +278,28 @@ MeshRenderer: --- !u!64 &1324913477 MeshCollider: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1324913475} m_Material: {fileID: 0} m_IsTrigger: 0 m_Enabled: 1 - serializedVersion: 2 + serializedVersion: 3 m_Convex: 0 - m_InflateMesh: 0 + m_CookingOptions: 14 m_SkinWidth: 0.01 m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} --- !u!33 &1324913478 MeshFilter: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1324913475} m_Mesh: {fileID: 10209, guid: 0000000000000000e000000000000000, type: 0} --- !u!4 &1324913479 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1324913475} m_LocalRotation: {x: 0, y: -0.7071068, z: 0.7071068, w: 0} @@ -392,7 +312,7 @@ Transform: --- !u!114 &1324913480 MonoBehaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1324913475} m_Enabled: 1 @@ -403,30 +323,21 @@ MonoBehaviour: uddTexture: {fileID: 1426812830} x: 100 y: 100 + w: 32 + h: 64 texture: {fileID: 0} ---- !u!114 &1426812830 +--- !u!114 &1426812830 stripped MonoBehaviour: - m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 114000012274256594, guid: de6f36e446e5e8a48bf61fe198985bb4, + m_CorrespondingSourceObject: {fileID: 114000012274256594, guid: de6f36e446e5e8a48bf61fe198985bb4, type: 2} m_PrefabInternal: {fileID: 940835900} - m_GameObject: {fileID: 913398332} - m_Enabled: 1 - m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: bb54a34570e4747429b1c5b66c69d356, type: 3} - m_Name: - m_EditorClassIdentifier: - invertX_: 0 - invertY_: 0 - useClip_: 0 - clipPos: {x: 0, y: 0} - clipScale: {x: 0.2, y: 0.2} --- !u!1 &1446288312 GameObject: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} - serializedVersion: 5 + serializedVersion: 6 m_Component: - component: {fileID: 1446288317} - component: {fileID: 1446288316} @@ -443,34 +354,38 @@ GameObject: --- !u!81 &1446288313 AudioListener: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1446288312} m_Enabled: 1 --- !u!124 &1446288314 Behaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1446288312} m_Enabled: 1 --- !u!92 &1446288315 Behaviour: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1446288312} m_Enabled: 1 --- !u!20 &1446288316 Camera: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1446288312} m_Enabled: 1 serializedVersion: 2 m_ClearFlags: 1 m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_FocalLength: 50 m_NormalizedViewPortRect: serializedVersion: 2 x: 0 @@ -492,15 +407,15 @@ Camera: m_TargetEye: 3 m_HDR: 0 m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 m_ForceIntoRT: 0 m_OcclusionCulling: 1 m_StereoConvergence: 10 m_StereoSeparation: 0.022 - m_StereoMirrorMode: 0 --- !u!4 &1446288317 Transform: m_ObjectHideFlags: 0 - m_PrefabParentObject: {fileID: 0} + m_CorrespondingSourceObject: {fileID: 0} m_PrefabInternal: {fileID: 0} m_GameObject: {fileID: 1446288312} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} diff --git a/Assets/uDesktopDuplication/Examples/Scripts/BufferExample.cs b/Assets/uDesktopDuplication/Examples/Scripts/BufferExample.cs new file mode 100644 index 0000000..ad60fbb --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scripts/BufferExample.cs @@ -0,0 +1,72 @@ +using UnityEngine; +using System; +using System.Runtime.InteropServices; + +public class BufferExample : MonoBehaviour +{ + [SerializeField] + uDesktopDuplication.Texture uddTexture; + + Texture2D texture_; + Color32[] pixels_; + GCHandle handle_; + IntPtr ptr_ = IntPtr.Zero; + + [DllImport("msvcrt.dll", CallingConvention = CallingConvention.Cdecl, SetLastError = false)] + public static extern IntPtr memcpy(IntPtr dest, IntPtr src, int count); + + void Start() + { + if (!uddTexture) return; + + uddTexture.monitor.useGetPixels = true; + UpdateTexture(); + } + + void OnDestroy() + { + if (ptr_ != IntPtr.Zero) { + handle_.Free(); + } + } + + void Update() + { + if (!uddTexture) return; + + if (uddTexture.monitor.width != texture_.width || + uddTexture.monitor.height != texture_.height) { + UpdateTexture(); + } + + CopyTexture(); + } + + void UpdateTexture() + { + var width = uddTexture.monitor.width; + var height = uddTexture.monitor.height; + + // TextureFormat.BGRA32 should be set but it causes an error now. + texture_ = new Texture2D(width, height, TextureFormat.RGBA32, false); + texture_.filterMode = FilterMode.Bilinear; + pixels_ = texture_.GetPixels32(); + handle_ = GCHandle.Alloc(pixels_, GCHandleType.Pinned); + ptr_ = handle_.AddrOfPinnedObject(); + + GetComponent().material.mainTexture = texture_; + } + + void CopyTexture() + { + var buffer = uddTexture.monitor.buffer; + if (buffer == IntPtr.Zero) return; + + var width = uddTexture.monitor.width; + var height = uddTexture.monitor.height; + memcpy(ptr_, buffer, width * height * sizeof(Byte) * 4); + + texture_.SetPixels32(pixels_); + texture_.Apply(); + } +} diff --git a/Assets/uDesktopDuplication/Examples/Scripts/BufferExample.cs.meta b/Assets/uDesktopDuplication/Examples/Scripts/BufferExample.cs.meta new file mode 100644 index 0000000..5b8a347 --- /dev/null +++ b/Assets/uDesktopDuplication/Examples/Scripts/BufferExample.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 2bbc456c8248acd46976392616f32f8c +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/uDesktopDuplication/Examples/Scripts/GetPixelsExample.cs b/Assets/uDesktopDuplication/Examples/Scripts/GetPixelsExample.cs index a7d33b0..7cc174c 100644 --- a/Assets/uDesktopDuplication/Examples/Scripts/GetPixelsExample.cs +++ b/Assets/uDesktopDuplication/Examples/Scripts/GetPixelsExample.cs @@ -6,27 +6,38 @@ public class GetPixelsExample : MonoBehaviour [SerializeField] int x = 100; [SerializeField] int y = 100; - const int width = 64; - const int height = 32; + [SerializeField] int w = 64; + [SerializeField] int h = 32; public Texture2D texture; - Color32[] colors = new Color32[width * height]; + Color32[] colors; + + void CreateTextureIfNeeded() + { + if (!texture || texture.width != w || texture.height != h) + { + colors = new Color32[w * h]; + texture = new Texture2D(w, h, TextureFormat.ARGB32, false); + GetComponent().material.mainTexture = texture; + } + } void Start() { - texture = new Texture2D(width, height, TextureFormat.ARGB32, false); - GetComponent().material.mainTexture = texture; + CreateTextureIfNeeded(); } void Update() { + CreateTextureIfNeeded(); + // must be called (performance will be slightly down). uDesktopDuplication.Manager.primary.useGetPixels = true; var monitor = uddTexture.monitor; if (!monitor.hasBeenUpdated) return; - if (monitor.GetPixels(colors, x, y, width, height)) { + if (monitor.GetPixels(colors, x, y, w, h)) { texture.SetPixels32(colors); texture.Apply(); } diff --git a/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86/uDesktopDuplication.dll index 2b7407a5b054934425b82e95eeebff236a2ea3a9..9a4a39ea6d4000e9d4d1ae2c067873ab20fd60df 100644 GIT binary patch delta 9443 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 diff --git a/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll b/Assets/uDesktopDuplication/Plugins/x86_64/uDesktopDuplication.dll index 8ecda3d803d2eef7906a1d6d6f26ff5628106337..3a23a14f921ea7b10f1ea5e6cbd6e70c1513a2b2 100644 GIT binary patch delta 30498 zcmeHwdstLe_y5@ggPj>~r>@MMu4g>b)vibjOGuGbC{}OI`IHG@T^r4={GB%was5&GN~8gh?AbCFv?J zW3jB7?_g0H{RsXU8^p$QA5CogF;7BV$0TVjPu9e<$N2(HEGy?v;l7#g)WmYFM*zR1 z31P3whF zF=r&{Xv+l~ccY|f0DsOiMYCWtZ}9BZA$hYT?be}H_7d)^jf%{tTFSyuk$!p;KdtCP z@eJ5aB|KC63maq`>=mqGMLf$phW%+JHE%*2i&jIAIxI&^81>x_xV}fqwH>;>pxS|&WC^K-;-d!5(d;VU7#x8bb_eINfAg*(dxLg-Oo7OY zH5LEZXe!INe!<)R68|lvfL-Ewp(7#mM(9fRI`0wIi_PE@!k&wJ?I0->Lg6PUjJ|%M zgUNEtUQS%g^>LPuO_ncAmgDxh7B%KfG^N=1z=11|dorkf0ytH!;yJ$Px z`6W*_lNUwx)eQNI?}$3D$@r5$r%%vC|H(hm|Dy@M!9R&kV3+yz=&v-9*ZGOA39M;- zx6d`<*Z3FR64;M6&+bvIVEZs}k0%>$dpKz- zV-NAqhfIS;LUKBr!H3+K|qB4*#6x+x{NDpJ^h$=KG8Z>;`W(eyHhl zitk8G(D#nyCfJL)idipP(R(CA*{rqM$Y zhmz4Tp|&qjf#nps;g9{Sp#6KwBx#&AqdL>_C8AYp4_IlNF}WXOqxn-)mawJ# z=9Emtebik;b(5Z;=8o%bFs=EdK#Q2JyK9;5#N)Rx_uB%e&eve%ue^JZe@uy5rdJh0 zN_g$vlOt9YgNqOw4;j6&K1qj+9SJb?F%YMfYa(m;zG+JLO#4ui@*&?b9o_RGKRf-H zCglUZV+L{`@Ut_J+sk*%L~buXI}N)tizg=_xO%n zl)cB#=0b8e-!U7x-TdtAW12oSe8(K*YWUeXA84|6@lA6RG~v7WiMf#6$v4eIZYMu6 zuPB7CB6qHv*3=es!@N!W%w(yvH}i$_M{9Z%^6L37u{1t@!D0=@_ud7Mw_o?5B$Z+;U`{I-CymKohmSRxIx z4z#SUM`3jJ+Z04)`o6`Z77fw#e#bU#Q9H&C@HzL^vu!-_zP?!W=ic`fmiwWL`(oPO zw|Ed^_wmh3iZp)?;oa|F%+Q1PuVaUKw+Ad(DYrkckKN=;^JlTiwiEe*jFsAcT-rgy zR@p8uAI~(s^LW~dLmH1N-r>RLyz^d{BuDUjPjmkV6Kr2Uh!Ouc*A?0{nXlSDD(uPF zxBSw|xxvHdQorV4G5ev>R5p?pv-r7u;X^0cIzH^-yMq3ieOvhj{@TNp5o4$TV;#EUiCCqq|2+iu&K6AkEAkY<=Kz+Ws7*xqaU(2xzXI0t>pRU-~0d6qve@ooMbA# zsHebNGR5$nFcVc+#wug8z4{Ou&gG)ZLEd=$-m+eM+kdycxOxc-ne;rVxH_+pI&UYB zD()Q8tyPg8L)!j0A7A{3W?@%8x@4Gs!ri1igJ#b+1;HlE5&Ku?9FF&rXy_x;pTAOa zfZfj*uIZ|2mt(W631A_Y?x3=)dV7zl3UQs5viEGZ$77i0U{~I0t%;4{-AZ53d=P1? zE&YJ8Uv1_my_x363B2g(P+n=-sR@~2%URozX}q(+>dcF*&FrRa=~KRn?9+beDBIKJ zfMd3o*ZJcSY1^?Lxi@V4xQ=OFFhMDjH*aWWYi(zrK>^0Xvm-sVRl_he`PXs;AGNg$ z&wpVj8^vQ^d{h$~z+ZpSqDeMFuZt~vV?1M*ZL3~NS1i7q#n?UEZ`0VO-uI<(n!seV zEtu!8jSOst`NV_DFiW@WGg*9hO1x-uq-Ojv{_^IRG=4)Mspqp^2@6|t$tCKy^J`VQ z$|3QmU+JPr{gl7?iX82Yo}~WG!B{f7&sNM^lSO;tA3lG}49$hX{J@qN&Ai$C=PjL+ zOc>@UOucRzx^G!KM{tsokFPTo-|$|Je4LUmz7hK%G7+k9oqgG0KJ3+4-%~d!JZU-@ z-+7bgzdB0u-XLD{>OhU(7yQzz_iCmOvQ2-@zy|r>i;%qkki*e*h(W{3%Mq+Y8j~{c zETsTP@EJ^oHMJ}J5y8$RZheUFdws0gG>h0PJA(cDBCrjxV%dXLU9vypOSUF?+gD+G zI?g&a44EMN%jj8T&=Zq7+V|smR_tIae6U^(ht&)HiX9pyXQW)WVuy#4OQT#c>X-lm zvU32%4o{O`Q2IVoSxI+lugSVWLF~0&t_r8eYt_Y3Bd{@5dN5NG|9;rqybzju9>jpP zrfj(e*|JBrW2ff`ma!B#TlNBIC`NK@@rzR?|AeL&M59ZKkvGjXc^0n<*GVhlB};&>L1Gg*QsDe`HM4}*Lc$eZ^Hg&Rvq_OJ7#9^4ypQ0Z)% z>y#zikD{q$`xr#g1Iy9xG%xhytXbcTvuYD_k+)9yYBvUuWDgHf9!zlL!yK0*pMx%k zi@OvT-_4QCEk5q1qT-a5Xo2cn6>UCmaV|u(^-eUvzI7Tkcr3)pxp5Y4A>=dX8r_`x zezDr%I~3pa5QW$Th>>rq=rjrhIcHm-%Ko-kajw$Mxejoymh#pq?NsN62RofRheg-f zOV>f;S)8S8XfGu2xo<9w%X2GVtdv`yu7HP*;Nfm16Q}ZMo?$Kh~fSn5rdE0{t>D9?d?OUc_%z!p?J5tv{G|kCGGsBm?Aq- zlx|sF0%z09GG4S~23e+trCN>uZ2cS7{5I64TfQ%;P4`Pbn_f1*5^00wlwbPSWiu<% zEgNaUNiDW({7N=R7$YEA!CcFlB87dO6~t#)uB4YuS&LMZVcC~nmQ{`VS$FI*O6~8Sw|wtt+81#&MxX1_aBpU@;4&P}|p{wm$=4fDjO|4()cp`@0^s|lvkv{Z@pEX4(`o{06K15i~!;~3D9;wK%TuQa< zzt*s?QDdsWJ7rCpwd2N{2xY3@_QTdxjcIPZsccHEHI

Hkd5?P4Ndz9v?%n!J6s; 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 eIxpCCk_uMHmlNS-ksLk% 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�q(p|Q$&=VfS0WpS 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 diff --git a/Assets/uDesktopDuplication/Scripts/Lib.cs b/Assets/uDesktopDuplication/Scripts/Lib.cs index 88cb866..a9f6a1f 100644 --- a/Assets/uDesktopDuplication/Scripts/Lib.cs +++ b/Assets/uDesktopDuplication/Scripts/Lib.cs @@ -169,6 +169,8 @@ public static class Lib [DllImport("uDesktopDuplication", EntryPoint = "GetPixels")] private static extern bool GetPixels_Internal(int id, System.IntPtr ptr, int x, int y, int width, int height); [DllImport("uDesktopDuplication")] + public static extern IntPtr GetBuffer(int id); + [DllImport("uDesktopDuplication")] public static extern bool HasBeenUpdated(int id); [DllImport("uDesktopDuplication")] public static extern bool UseGetPixels(int id, bool use); diff --git a/Assets/uDesktopDuplication/Scripts/Monitor.cs b/Assets/uDesktopDuplication/Scripts/Monitor.cs index 588907b..99d0f58 100644 --- a/Assets/uDesktopDuplication/Scripts/Monitor.cs +++ b/Assets/uDesktopDuplication/Scripts/Monitor.cs @@ -238,6 +238,11 @@ public class Monitor get { return Lib.GetDirtyRects(id); } } + public System.IntPtr buffer + { + get { return Lib.GetBuffer(id); } + } + public bool hasBeenUpdated { get { return Lib.HasBeenUpdated(id); } diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp index e1c0f98..1612063 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.cpp @@ -499,3 +499,14 @@ bool Monitor::GetPixels(BYTE* output, int x, int y, int width, int height) return true; } + + +BYTE* Monitor::GetBuffer() const +{ + if (!bufferForGetPixels_) + { + Debug::Error("Monitor::GetBuffer() => CopyTextureFromGpuToCpu() has not been called yet."); + return nullptr; + } + return bufferForGetPixels_.Get(); +} diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h index bb6754f..4fb48c7 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/Monitor.h @@ -53,6 +53,7 @@ public: void UseGetPixels(bool use); bool UseGetPixels() const; bool GetPixels(BYTE* output, int x, int y, int width, int height); + BYTE* GetBuffer() const; private: void CopyTextureFromGpuToCpu(ID3D11Texture2D* texture); diff --git a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp index 2b49910..c7cd400 100644 --- a/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp +++ b/Plugins/uDesktopDuplication/uDesktopDuplication/main.cpp @@ -366,7 +366,7 @@ extern "C" return 0; } - UNITY_INTERFACE_EXPORT void* UNITY_INTERFACE_API GetMoveRects(int id) + UNITY_INTERFACE_EXPORT DXGI_OUTDUPL_MOVE_RECT* UNITY_INTERFACE_API GetMoveRects(int id) { if (!g_manager) return nullptr; if (auto monitor = g_manager->GetMonitor(id)) @@ -386,7 +386,7 @@ extern "C" return 0; } - UNITY_INTERFACE_EXPORT void* UNITY_INTERFACE_API GetDirtyRects(int id) + UNITY_INTERFACE_EXPORT RECT* UNITY_INTERFACE_API GetDirtyRects(int id) { if (!g_manager) return nullptr; if (auto monitor = g_manager->GetMonitor(id)) @@ -398,7 +398,7 @@ extern "C" UNITY_INTERFACE_EXPORT bool UNITY_INTERFACE_API GetPixels(int id, BYTE* output, int x, int y, int width, int height) { - if (!g_manager) return nullptr; + if (!g_manager) return false; if (auto monitor = g_manager->GetMonitor(id)) { return monitor->GetPixels(output, x, y, width, height); @@ -406,6 +406,16 @@ extern "C" return false; } + UNITY_INTERFACE_EXPORT BYTE* UNITY_INTERFACE_API GetBuffer(int id) + { + if (!g_manager) return nullptr; + if (auto monitor = g_manager->GetMonitor(id)) + { + return monitor->GetBuffer(); + } + return nullptr; + } + UNITY_INTERFACE_EXPORT bool UNITY_INTERFACE_API HasBeenUpdated(int id) { if (!g_manager) return nullptr;