Compare commits

..

13 Commits

Author SHA1 Message Date
hecomi
467fa86f59 add function-scope timer for debug. 2018-12-08 13:36:16 +09:00
hecomi
608509aa22 output os version and graphics information. 2018-12-08 11:06:07 +09:00
hecomi
9aa488e100 code cleanups. 2018-12-02 23:52:30 +09:00
hecomi
4c225c21c9 rebuild DLLs. 2018-11-16 01:13:02 +09:00
hecomi
b8b4238b5f update unity version to Unity 2018.2.15f1. 2018-11-16 01:09:01 +09:00
hecomi
4d2766ce3f fix Shader.PropertyToID error on Unity 5.x #26 2018-11-13 00:16:55 +09:00
hecomi
f4096ec9fb fix crash bug caused by Windows sleep. 2018-09-12 21:40:57 +09:00
hecomi
0f43788650 add solution file. 2018-09-12 20:54:58 +09:00
hecomi
1c1381a7ba consider clipPos and clipScale for raycast #23. 2018-09-12 00:04:33 +09:00
hecomi
08903cd27a fix orientation of monitor object in Zoom scene. 2018-09-12 00:03:36 +09:00
hecomi
d840983829 update Unity version to 2018.2.7f1. 2018-09-12 00:03:01 +09:00
hecomi
8a6cee9c2d Merge pull request #24 from dj-kusuha/fix_il2cpp_runtime_error
fixed a runtime error when using the IL2CPP scripting backend
2018-09-11 21:36:08 +09:00
dj-kusuha
f7798f752f fixed a runtime error when using the IL2CPP scripting backend 2018-09-11 11:27:43 +09:00
21 changed files with 311 additions and 221 deletions

View File

@@ -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,6 +110,8 @@ NavMeshSettings:
manualTileSize: 0
tileSize: 256
accuratePlacement: 0
debug:
m_Flags: 0
m_NavMeshData: {fileID: 0}
--- !u!1001 &10684088
Prefab:
@@ -173,33 +178,17 @@ Prefab:
value: 0
objectReference: {fileID: 0}
m_RemovedComponents: []
m_ParentPrefab: {fileID: 100100000, guid: de6f36e446e5e8a48bf61fe198985bb4, type: 2}
m_RootGameObject: {fileID: 106183784}
m_IsPrefabParent: 0
--- !u!1 &106183784
m_SourcePrefab: {fileID: 100100000, guid: de6f36e446e5e8a48bf61fe198985bb4, type: 2}
m_IsPrefabAsset: 0
--- !u!1 &106183784 stripped
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 1000012642892690, guid: de6f36e446e5e8a48bf61fe198985bb4,
m_CorrespondingSourceObject: {fileID: 1000012642892690, guid: de6f36e446e5e8a48bf61fe198985bb4,
type: 2}
m_PrefabInternal: {fileID: 10684088}
serializedVersion: 5
m_Component:
- component: {fileID: 106183789}
- component: {fileID: 106183788}
- component: {fileID: 106183787}
- component: {fileID: 106183786}
- component: {fileID: 106183785}
m_Layer: 0
m_Name: Loupe
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!114 &106183785
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 106183784}
m_Enabled: 1
@@ -209,84 +198,12 @@ MonoBehaviour:
m_EditorClassIdentifier:
zoom: 10
aspect: 1
--- !u!114 &106183786
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 114000012274256594, guid: de6f36e446e5e8a48bf61fe198985bb4,
type: 2}
m_PrefabInternal: {fileID: 10684088}
m_GameObject: {fileID: 106183784}
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!23 &106183787
MeshRenderer:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 23000011974915108, guid: de6f36e446e5e8a48bf61fe198985bb4,
type: 2}
m_PrefabInternal: {fileID: 10684088}
m_GameObject: {fileID: 106183784}
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 &106183788
MeshFilter:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 33000012841683532, guid: de6f36e446e5e8a48bf61fe198985bb4,
type: 2}
m_PrefabInternal: {fileID: 10684088}
m_GameObject: {fileID: 106183784}
m_Mesh: {fileID: 4300002, guid: d6b30b913257fee4d8246bf7a2620fcd, type: 3}
--- !u!4 &106183789
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 4000011474108562, guid: de6f36e446e5e8a48bf61fe198985bb4,
type: 2}
m_PrefabInternal: {fileID: 10684088}
m_GameObject: {fileID: 106183784}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 7.1, y: -2.91, z: 9.52}
m_LocalScale: {x: 0.5, y: 0.5, z: 1}
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 4
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &691659230
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
serializedVersion: 5
serializedVersion: 6
m_Component:
- component: {fileID: 691659233}
- component: {fileID: 691659232}
@@ -302,7 +219,7 @@ GameObject:
TextMesh:
serializedVersion: 3
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 691659230}
m_Text: 'Tab: Next Screen Shift + Tab: Previous Screen'
@@ -322,15 +239,17 @@ TextMesh:
--- !u!23 &691659232
MeshRenderer:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 691659230}
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: 10100, guid: 0000000000000000e000000000000000, type: 0}
m_StaticBatchInfo:
@@ -343,6 +262,7 @@ MeshRenderer:
m_PreserveUVs: 0
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 0
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
@@ -354,7 +274,7 @@ MeshRenderer:
--- !u!4 &691659233
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 691659230}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
@@ -367,10 +287,10 @@ Transform:
--- !u!1 &813882971
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 1000012642892690, guid: de6f36e446e5e8a48bf61fe198985bb4,
m_CorrespondingSourceObject: {fileID: 1000012642892690, guid: de6f36e446e5e8a48bf61fe198985bb4,
type: 2}
m_PrefabInternal: {fileID: 0}
serializedVersion: 5
serializedVersion: 6
m_Component:
- component: {fileID: 813882978}
- component: {fileID: 813882977}
@@ -387,7 +307,7 @@ GameObject:
--- !u!114 &813882972
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 813882971}
m_Enabled: 1
@@ -398,7 +318,7 @@ MonoBehaviour:
--- !u!114 &813882974
MonoBehaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 114000012274256594, guid: de6f36e446e5e8a48bf61fe198985bb4,
m_CorrespondingSourceObject: {fileID: 114000012274256594, guid: de6f36e446e5e8a48bf61fe198985bb4,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 813882971}
@@ -415,16 +335,18 @@ MonoBehaviour:
--- !u!23 &813882975
MeshRenderer:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 23000011974915108, guid: de6f36e446e5e8a48bf61fe198985bb4,
m_CorrespondingSourceObject: {fileID: 23000011974915108, guid: de6f36e446e5e8a48bf61fe198985bb4,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 813882971}
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: 2100000, guid: c181d333a7bee7a44b94c0f4e02c4bd4, type: 2}
m_StaticBatchInfo:
@@ -437,6 +359,7 @@ MeshRenderer:
m_PreserveUVs: 1
m_IgnoreNormalsForChartDetection: 0
m_ImportantGI: 0
m_StitchLightmapSeams: 0
m_SelectedEditorRenderState: 3
m_MinimumChartSize: 4
m_AutoUVMaxDistance: 0.5
@@ -448,7 +371,7 @@ MeshRenderer:
--- !u!33 &813882977
MeshFilter:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 33000012841683532, guid: de6f36e446e5e8a48bf61fe198985bb4,
m_CorrespondingSourceObject: {fileID: 33000012841683532, guid: de6f36e446e5e8a48bf61fe198985bb4,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 813882971}
@@ -456,23 +379,23 @@ MeshFilter:
--- !u!4 &813882978
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 4000011474108562, guid: de6f36e446e5e8a48bf61fe198985bb4,
m_CorrespondingSourceObject: {fileID: 4000011474108562, guid: de6f36e446e5e8a48bf61fe198985bb4,
type: 2}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 813882971}
m_LocalRotation: {x: 0, y: 1, z: 0, w: 0}
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: 3
m_LocalEulerAnglesHint: {x: 0, y: 180, z: 0}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &1874811380
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
serializedVersion: 5
serializedVersion: 6
m_Component:
- component: {fileID: 1874811385}
- component: {fileID: 1874811384}
@@ -489,34 +412,38 @@ GameObject:
--- !u!81 &1874811381
AudioListener:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1874811380}
m_Enabled: 1
--- !u!124 &1874811382
Behaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1874811380}
m_Enabled: 1
--- !u!92 &1874811383
Behaviour:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1874811380}
m_Enabled: 1
--- !u!20 &1874811384
Camera:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1874811380}
m_Enabled: 1
serializedVersion: 2
m_ClearFlags: 1
m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0.019607844}
m_projectionMatrixMode: 1
m_SensorSize: {x: 36, y: 24}
m_LensShift: {x: 0, y: 0}
m_FocalLength: 50
m_NormalizedViewPortRect:
serializedVersion: 2
x: 0
@@ -538,15 +465,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 &1874811385
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1874811380}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
@@ -559,9 +486,9 @@ Transform:
--- !u!1 &1895115489
GameObject:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
serializedVersion: 5
serializedVersion: 6
m_Component:
- component: {fileID: 1895115491}
- component: {fileID: 1895115490}
@@ -575,7 +502,7 @@ GameObject:
--- !u!108 &1895115490
Light:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1895115489}
m_Enabled: 1
@@ -602,22 +529,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
@@ -625,7 +539,7 @@ Light:
--- !u!4 &1895115491
Transform:
m_ObjectHideFlags: 0
m_PrefabParentObject: {fileID: 0}
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInternal: {fileID: 0}
m_GameObject: {fileID: 1895115489}
m_LocalRotation: {x: 0.40821788, y: -0.23456968, z: 0.10938163, w: 0.8754261}

View File

@@ -62,8 +62,13 @@ public class Manager : MonoBehaviour
private float reinitializationTimer_ = 0f;
private bool isFirstFrame_ = true;
public static event Lib.DebugLogDelegate onDebugLog = msg => Debug.Log(msg);
public static event Lib.DebugLogDelegate onDebugErr = msg => Debug.LogError(msg);
public static event Lib.DebugLogDelegate onDebugLog = OnDebugLog;
public static event Lib.DebugLogDelegate onDebugErr = OnDebugErr;
[AOT.MonoPInvokeCallback(typeof(Lib.DebugLogDelegate))]
private static void OnDebugLog(string msg) { Debug.Log(msg); }
[AOT.MonoPInvokeCallback(typeof(Lib.DebugLogDelegate))]
private static void OnDebugErr(string msg) { Debug.LogError(msg); }
public delegate void ReinitializeHandler();
public static event ReinitializeHandler onReinitialized;

View File

@@ -240,6 +240,13 @@ public class Texture : MonoBehaviour
}
}
int clipPositionScaleKey_;
void Awake()
{
clipPositionScaleKey_ = Shader.PropertyToID("_ClipPositionScale");
}
void OnEnable()
{
if (monitor == null) {
@@ -271,8 +278,7 @@ public class Texture : MonoBehaviour
void RequireUpdate()
{
if (monitor != null)
{
if (monitor != null) {
monitor.shouldBeUpdated = true;
}
}
@@ -283,7 +289,6 @@ public class Texture : MonoBehaviour
monitor = Manager.GetMonitor(lastMonitorId_);
}
int clipPositionScaleKey_ = Shader.PropertyToID("_ClipPositionScale");
void UpdateMaterial()
{
width = transform.localScale.x;
@@ -409,6 +414,19 @@ public class Texture : MonoBehaviour
// Calculate coordinates.
var coordX = toAngle / halfWidthAngle * 0.5f;
var coordY = ly / halfHeight * 0.5f;
// Zoom
if (useClip) {
coordX = clipPos.x + (0.5f + coordX) * clipScale.x;
coordX -= Mathf.Floor(coordX);
coordX -= 0.5f;
coordY = (1f - clipPos.y) + (coordY - 0.5f) * clipScale.y;
coordY -= Mathf.Floor(coordY);
coordY -= 0.5f;
}
// Desktop position
int desktopX = monitor.left + (int)((coordX + 0.5f) * monitor.width);
int desktopY = monitor.top + (int)((0.5f - coordY) * monitor.height);

View File

@@ -0,0 +1,34 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 14
VisualStudioVersion = 14.0.25420.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "uDesktopDuplication", "uDesktopDuplication\uDesktopDuplication.vcxproj", "{BC5DE2F9-BDCC-4449-A017-E5642E04BB56}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|Win32 = Release|Win32
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{BC5DE2F9-BDCC-4449-A017-E5642E04BB56}.Debug|Win32.ActiveCfg = Debug|Win32
{BC5DE2F9-BDCC-4449-A017-E5642E04BB56}.Debug|Win32.Build.0 = Debug|Win32
{BC5DE2F9-BDCC-4449-A017-E5642E04BB56}.Debug|x64.ActiveCfg = Debug|x64
{BC5DE2F9-BDCC-4449-A017-E5642E04BB56}.Debug|x64.Build.0 = Debug|x64
{BC5DE2F9-BDCC-4449-A017-E5642E04BB56}.Debug|x86.ActiveCfg = Debug|Win32
{BC5DE2F9-BDCC-4449-A017-E5642E04BB56}.Debug|x86.Build.0 = Debug|Win32
{BC5DE2F9-BDCC-4449-A017-E5642E04BB56}.Release|Win32.ActiveCfg = Release|Win32
{BC5DE2F9-BDCC-4449-A017-E5642E04BB56}.Release|Win32.Build.0 = Release|Win32
{BC5DE2F9-BDCC-4449-A017-E5642E04BB56}.Release|x64.ActiveCfg = Release|x64
{BC5DE2F9-BDCC-4449-A017-E5642E04BB56}.Release|x64.Build.0 = Release|x64
{BC5DE2F9-BDCC-4449-A017-E5642E04BB56}.Release|x86.ActiveCfg = Release|Win32
{BC5DE2F9-BDCC-4449-A017-E5642E04BB56}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
EndGlobal

View File

@@ -17,6 +17,29 @@ extern std::unique_ptr<MonitorManager> g_manager;
extern std::queue<Message> g_messages;
void OutputWindowsInformation()
{
const auto hModule = ::LoadLibrary(TEXT("ntdll.dll"));
if (!hModule) return;
ScopedReleaser freeModule([&] { ::FreeLibrary(hModule); });
if (const auto address = ::GetProcAddress(hModule, "RtlGetVersion"))
{
using RtlGetVersionType = NTSTATUS(WINAPI *)(OSVERSIONINFOEXW*);
const auto RtlGetVersion = reinterpret_cast<RtlGetVersionType>(address);
OSVERSIONINFOEXW os = { sizeof(os) };
if (!FAILED(RtlGetVersion(&os)))
{
Debug::Log("OS Version : ", os.dwMajorVersion, ".", os.dwMinorVersion);
Debug::Log("Build Number : ", os.dwBuildNumber);
Debug::Log("Service Pack : ", os.szCSDVersion);
}
}
}
IUnityInterfaces* GetUnity()
{
return g_unity;
@@ -37,7 +60,9 @@ const std::unique_ptr<MonitorManager>& GetMonitorManager()
LUID GetUnityAdapterLuid()
{
const auto device = GetUnity()->Get<IUnityGraphicsD3D11>()->GetDevice();
UDD_FUNCTION_SCOPE_TIMER
const auto device = GetDevice();
Microsoft::WRL::ComPtr<IDXGIDevice1> dxgiDevice;
if (FAILED(device->QueryInterface(IID_PPV_ARGS(&dxgiDevice)))){

View File

@@ -7,6 +7,9 @@
// Output windows version
void OutputWindowsInformation();
// Unity interface getter
struct IUnityInterfaces;
IUnityInterfaces* GetUnity();

View File

@@ -21,6 +21,8 @@ Cursor::~Cursor()
void Cursor::UpdateBuffer(Duplicator* duplicator, const DXGI_OUTDUPL_FRAME_INFO& frameInfo)
{
UDD_FUNCTION_SCOPE_TIMER
if (frameInfo.LastMouseUpdateTime.QuadPart == 0)
{
return;
@@ -66,6 +68,8 @@ void Cursor::UpdateTexture(
Duplicator* duplicator,
const ComPtr<ID3D11Texture2D>& desktopTexture)
{
UDD_FUNCTION_SCOPE_TIMER
auto monitor = duplicator->GetMonitor();
// Check desktop texure
@@ -369,6 +373,8 @@ void Cursor::UpdateTexture(
void Cursor::Draw(const Microsoft::WRL::ComPtr<ID3D11Texture2D>& texture)
{
UDD_FUNCTION_SCOPE_TIMER
if (texture == nullptr)
{
Debug::Error("Cursor::UpdateTexture() => Desktop texture is null.");
@@ -384,6 +390,8 @@ void Cursor::Draw(const Microsoft::WRL::ComPtr<ID3D11Texture2D>& texture)
void Cursor::GetTexture(ID3D11Texture2D* texture)
{
UDD_FUNCTION_SCOPE_TIMER
if (!bgraBuffer_)
{
Debug::Error("Cursor::GetTexture() => bgra32Buffer is null.");

View File

@@ -39,4 +39,18 @@ void Debug::Finalize()
}
Debug::SetLogFunc(nullptr);
Debug::SetErrorFunc(nullptr);
}
decltype(DebugFunctionScopedTimer::currentId) DebugFunctionScopedTimer::currentId = 0;
DebugFunctionScopedTimer::DebugFunctionScopedTimer(const char* name)
: ScopedTimer([this](std::chrono::microseconds us) {
Debug::Log("<< [", id_, "]", name_, " : ", us.count(), "[us]");
})
, name_(name)
, id_(currentId++)
{
Debug::Log(">> [", id_, "]", name_);
}

View File

@@ -10,7 +10,9 @@
// Debug flag
#ifdef _DEBUG
#define UDD_DEBUG_ON
#endif
// Logging
@@ -40,12 +42,24 @@ private:
};
template <class T>
static void Output(T&& arg)
static void Output(const T& arg)
{
if (mode_ == Mode::None) return;
if (ss_.good())
{
ss_ << std::forward<T>(arg);
ss_ << arg;
}
}
static void Output(const WCHAR* arg)
{
if (mode_ == Mode::None) return;
if (ss_.good())
{
char buf[256];
size_t size;
wcstombs_s(&size, buf, arg, 256);
ss_ << buf;
}
}
@@ -89,10 +103,10 @@ private:
}
template <class Arg, class... RestArgs>
static void _Log(Level level, Arg&& arg, RestArgs&&... restArgs)
static void _Log(Level level, const Arg& arg, const RestArgs&... restArgs)
{
Output(std::forward<Arg>(arg));
_Log(level, std::forward<RestArgs>(restArgs)...);
Output(arg);
_Log(level, restArgs...);
}
static void _Log(Level level)
@@ -144,16 +158,25 @@ private:
};
class DebugFunctionScopedTimer : public ScopedTimer
{
public:
explicit DebugFunctionScopedTimer(const char* name);
private:
static unsigned int currentId;
const char* const name_;
const unsigned int id_;
};
#ifdef UDD_DEBUG_ON
#define UDD_FUNCTION_SCOPE_TIMER \
ScopedTimer _timer_##__COUNTER__([](std::chrono::microseconds us) \
{ \
Debug::Log(__FUNCTION__, "@", __FILE__, ":", __LINE__, " => ", us.count(), " [us]"); \
});
DebugFunctionScopedTimer _timer_##__COUNTER__(__FUNCTION__);
#define UDD_SCOPE_TIMER(Name) \
ScopedTimer _timer_##__COUNTER__([](std::chrono::microseconds us) \
{ \
Debug::Log(#Name, " => ", us.count(), " [us]"); \
Debug::Log(#Name, " : ", us.count(), " [us]"); \
});
#else
#define UDD_FUNCTION_SCOPE_TIMER

View File

@@ -27,6 +27,8 @@ IsolatedD3D11Device::~IsolatedD3D11Device()
HRESULT IsolatedD3D11Device::Create(const ComPtr<IDXGIAdapter>& adapter)
{
UDD_FUNCTION_SCOPE_TIMER
const auto driverType = adapter ?
D3D_DRIVER_TYPE_UNKNOWN :
D3D_DRIVER_TYPE_HARDWARE;
@@ -68,6 +70,8 @@ ComPtr<ID3D11Device> IsolatedD3D11Device::GetDevice()
Microsoft::WRL::ComPtr<ID3D11Texture2D> IsolatedD3D11Device::GetCompatibleSharedTexture(
const ComPtr<ID3D11Texture2D>& src)
{
UDD_FUNCTION_SCOPE_TIMER
D3D11_TEXTURE2D_DESC srcDesc;
src->GetDesc(&srcDesc);

View File

@@ -33,6 +33,8 @@ Duplicator::~Duplicator()
void Duplicator::InitializeDevice()
{
UDD_FUNCTION_SCOPE_TIMER
device_ = std::make_shared<IsolatedD3D11Device>();
if (FAILED(device_->Create(monitor_->GetAdapter())))
@@ -45,6 +47,8 @@ void Duplicator::InitializeDevice()
void Duplicator::InitializeDuplication()
{
UDD_FUNCTION_SCOPE_TIMER
ComPtr<IDXGIOutput1> output1;
if (FAILED(monitor_->GetOutput().As(&output1)))
{
@@ -57,17 +61,7 @@ void Duplicator::InitializeDuplication()
case S_OK:
{
state_ = State::Ready;
const auto rot = static_cast<DXGI_MODE_ROTATION>(monitor_->GetRotation());
Debug::Log("Duplicator::Initialize() => OK.");
Debug::Log(" ID : ", monitor_->GetId());
Debug::Log(" Size : (", monitor_->GetWidth(), ", ", monitor_->GetHeight(), ")");
Debug::Log(" DPI : (", monitor_->GetDpiX(), ", ", monitor_->GetDpiY(), ")");
Debug::Log(" Rot : ",
rot == DXGI_MODE_ROTATION_IDENTITY ? "Landscape" :
rot == DXGI_MODE_ROTATION_ROTATE90 ? "Portrait" :
rot == DXGI_MODE_ROTATION_ROTATE180 ? "Landscape (flipped)" :
rot == DXGI_MODE_ROTATION_ROTATE270 ? "Portrait (flipped)" :
"Unspecified");
break;
}
case E_INVALIDARG:
@@ -117,6 +111,8 @@ void Duplicator::InitializeDuplication()
void Duplicator::CheckUnityAdapter()
{
UDD_FUNCTION_SCOPE_TIMER
DXGI_ADAPTER_DESC desc;
monitor_->GetAdapter()->GetDesc(&desc);
@@ -135,6 +131,8 @@ void Duplicator::CheckUnityAdapter()
void Duplicator::Start()
{
UDD_FUNCTION_SCOPE_TIMER
if (state_ != State::Ready) return;
Stop();
@@ -180,6 +178,8 @@ void Duplicator::Start()
void Duplicator::Stop()
{
UDD_FUNCTION_SCOPE_TIMER
shouldRun_ = false;
if (thread_.joinable())
@@ -236,6 +236,8 @@ const Duplicator::Frame& Duplicator::GetLastFrame() const
void Duplicator::Duplicate(UINT timeout)
{
UDD_FUNCTION_SCOPE_TIMER
if (!dupl_ || !device_) return;
Release();
@@ -322,6 +324,8 @@ void Duplicator::Duplicate(UINT timeout)
void Duplicator::Release()
{
UDD_FUNCTION_SCOPE_TIMER
if (!isFrameAcquired_) return;
const auto hr = dupl_->ReleaseFrame();
@@ -357,6 +361,8 @@ void Duplicator::UpdateCursor(
const ComPtr<ID3D11Texture2D>& texture,
const DXGI_OUTDUPL_FRAME_INFO& frameInfo)
{
UDD_FUNCTION_SCOPE_TIMER
auto& manager = GetMonitorManager();
if (frameInfo.PointerPosition.Visible)
@@ -375,6 +381,8 @@ void Duplicator::UpdateCursor(
void Duplicator::UpdateMetadata(UINT totalBufferSize)
{
UDD_FUNCTION_SCOPE_TIMER
metaData_.buffer.ExpandIfNeeded(totalBufferSize);
if (!metaData_.buffer.Empty())
{
@@ -386,6 +394,8 @@ void Duplicator::UpdateMetadata(UINT totalBufferSize)
void Duplicator::UpdateMoveRects()
{
UDD_FUNCTION_SCOPE_TIMER
const auto hr = dupl_->GetFrameMoveRects(
metaData_.buffer.Size(),
metaData_.buffer.As<DXGI_OUTDUPL_MOVE_RECT>(),
@@ -428,6 +438,8 @@ void Duplicator::UpdateMoveRects()
void Duplicator::UpdateDirtyRects()
{
UDD_FUNCTION_SCOPE_TIMER
const auto hr = dupl_->GetFrameDirtyRects(
metaData_.buffer.Size() - metaData_.moveRectSize,
metaData_.buffer.As<RECT>(metaData_.moveRectSize /* offset */),

View File

@@ -77,7 +77,7 @@ private:
void UpdateMoveRects();
void UpdateDirtyRects();
Monitor* monitor_ = nullptr;
Monitor* const monitor_ = nullptr;
std::atomic<State> state_ = State::Ready;
std::shared_ptr<class IsolatedD3D11Device> device_;

View File

@@ -21,7 +21,6 @@ Monitor::Monitor(int id)
Monitor::~Monitor()
{
duplicator_->Stop();
}
@@ -30,6 +29,8 @@ void Monitor::Initialize(
const ComPtr<IDXGIOutput> &output
)
{
UDD_FUNCTION_SCOPE_TIMER
adapter_ = adapter;
output_ = output;
@@ -58,18 +59,34 @@ void Monitor::Initialize(
// DPI is set as -1, so the application has to use the appropriate value.
}
const auto rot = outputDesc_.Rotation;
Debug::Log("Monitor::Initialized() =>");
Debug::Log(" ID : ", id_);
Debug::Log(" Size : (", width_, ", ", height_, ")");
Debug::Log(" DPI : (", dpiX_, ", ", dpiY_, ")");
Debug::Log(" Rot : ",
rot == DXGI_MODE_ROTATION_IDENTITY ? "Landscape" :
rot == DXGI_MODE_ROTATION_ROTATE90 ? "Portrait" :
rot == DXGI_MODE_ROTATION_ROTATE180 ? "Landscape (flipped)" :
rot == DXGI_MODE_ROTATION_ROTATE270 ? "Portrait (flipped)" :
"Unspecified");
duplicator_ = std::make_shared<Duplicator>(this);
}
void Monitor::Finalize()
{
UDD_FUNCTION_SCOPE_TIMER
StopCapture();
}
void Monitor::Render()
{
UDD_FUNCTION_SCOPE_TIMER
const auto& frame = duplicator_->GetLastFrame();
if (frame.id == lastFrameId_) return;
@@ -77,7 +94,13 @@ void Monitor::Render()
if (unityTexture_ == nullptr)
{
Debug::Error("Monitor::Render() => Target texture has not been set yet..");
Debug::Error("Monitor::Render() => Target texture has not been set yet.");
return;
}
if (!frame.texture)
{
Debug::Error("Monitor::Render() => frame doesn't have texture.");
return;
}
@@ -116,6 +139,8 @@ void Monitor::Render()
void Monitor::StartCapture()
{
UDD_FUNCTION_SCOPE_TIMER
if (duplicator_->GetState() == DuplicatorState::Ready)
{
duplicator_->Start();
@@ -125,6 +150,8 @@ void Monitor::StartCapture()
void Monitor::StopCapture()
{
UDD_FUNCTION_SCOPE_TIMER
duplicator_->Stop();
}
@@ -285,6 +312,8 @@ bool Monitor::UseGetPixels() const
void Monitor::CopyTextureFromGpuToCpu(ID3D11Texture2D* texture)
{
UDD_FUNCTION_SCOPE_TIMER
const auto monitorRot = static_cast<DXGI_MODE_ROTATION>(GetRotation());
const auto monitorWidth = GetWidth();
const auto monitorHeight = GetHeight();
@@ -350,6 +379,8 @@ void Monitor::CopyTextureFromGpuToCpu(ID3D11Texture2D* texture)
bool Monitor::GetPixels(BYTE* output, int x, int y, int width, int height)
{
UDD_FUNCTION_SCOPE_TIMER
if (!UseGetPixels())
{
Debug::Error("Monitor::GetPixels() => UseGetPixels(true) must have been called when you want to use GetPixels().");

View File

@@ -9,6 +9,7 @@
#include "Common.h"
class MonitorManager;
enum class DuplicatorState;
@@ -56,11 +57,10 @@ public:
private:
void CopyTextureFromGpuToCpu(ID3D11Texture2D* texture);
int id_ = -1;
MonitorManager* manager_ = nullptr;
const int id_;
UINT dpiX_ = -1, dpiY_ = -1;
int width_ = -1, height_ = -1;
bool hasBeenUpdated_ = false;
bool useGetPixels_ = false;

View File

@@ -18,23 +18,20 @@ using namespace Microsoft::WRL;
MonitorManager::MonitorManager(LUID unityAdapterLuid)
: unityAdapterLuid_(unityAdapterLuid)
MonitorManager::MonitorManager()
{
}
MonitorManager::~MonitorManager()
{
Finalize();
}
void MonitorManager::Initialize()
{
Finalize();
UDD_FUNCTION_SCOPE_TIMER
// Get factory
ComPtr<IDXGIFactory1> factory;
if (FAILED(CreateDXGIFactory1(IID_PPV_ARGS(&factory))))
{
@@ -42,27 +39,40 @@ void MonitorManager::Initialize()
return;
}
// Check all display adapters
int id = 0;
std::vector<std::pair<ComPtr<IDXGIAdapter1>, ComPtr<IDXGIOutput>>> outputs;
ComPtr<IDXGIAdapter1> adapter;
for (int i = 0; (factory->EnumAdapters1(i, &adapter) != DXGI_ERROR_NOT_FOUND); ++i)
{
// Search the main monitor from all outputs
DXGI_ADAPTER_DESC desc;
if (FAILED(adapter->GetDesc(&desc))) continue;
Debug::Log("Graphics Card [", i, "] : ", desc.Description);
ComPtr<IDXGIOutput> output;
for (int j = 0; (adapter->EnumOutputs(j, &output) != DXGI_ERROR_NOT_FOUND); ++j)
{
auto monitor = std::make_shared<Monitor>(id++);
const auto unityAdapterLuid = GetUnityAdapterLuid();
monitor->Initialize(adapter, output);
monitor->StartCapture();
monitors_.push_back(monitor);
DXGI_OUTPUT_DESC desc;
if (FAILED(output->GetDesc(&desc))) continue;
Debug::Log(" > Monitor[", j, "] : ", desc.DeviceName);
outputs.emplace_back(adapter, output);
}
}
for (int id = 0; id < static_cast<int>(outputs.size()); ++id)
{
const auto& pair = outputs.at(id);
auto monitor = std::make_shared<Monitor>(id);
monitor->Initialize(pair.first, pair.second);
monitor->StartCapture();
monitors_.push_back(monitor);
}
}
void MonitorManager::Finalize()
{
UDD_FUNCTION_SCOPE_TIMER
for (const auto& monitor : monitors_)
{
monitor->Finalize();
@@ -74,6 +84,8 @@ void MonitorManager::Finalize()
void MonitorManager::Update()
{
UDD_FUNCTION_SCOPE_TIMER
if (isReinitializationRequired_)
{
Reinitialize();
@@ -91,7 +103,10 @@ void MonitorManager::RequireReinitilization()
void MonitorManager::Reinitialize()
{
UDD_FUNCTION_SCOPE_TIMER
Debug::Log("MonitorManager::Reinitialize()");
Finalize();
Initialize();
SendMessageToUnity(Message::Reinitialized);
}
@@ -99,6 +114,8 @@ void MonitorManager::Reinitialize()
bool MonitorManager::HasMonitorCountChanged() const
{
UDD_FUNCTION_SCOPE_TIMER
ComPtr<IDXGIFactory1> factory;
if (FAILED(CreateDXGIFactory1(IID_PPV_ARGS(&factory))))
{

View File

@@ -13,7 +13,7 @@ class Cursor;
class MonitorManager
{
public:
explicit MonitorManager(LUID unityAdapterLuid_);
MonitorManager();
~MonitorManager();
void Initialize();
void Finalize();
@@ -34,7 +34,6 @@ public:
int GetTotalHeight() const;
private:
LUID unityAdapterLuid_;
UINT frameRate_ = 60;
bool enableTextureCopyFromGpuToCpu_ = false;
std::vector<std::shared_ptr<Monitor>> monitors_;

View File

@@ -23,7 +23,6 @@
IUnityInterfaces* g_unity = nullptr;
std::unique_ptr<MonitorManager> g_manager;
std::queue<Message> g_messages;
ID3D11DeviceContext* g_deviceContextForMainThread = nullptr;
extern "C"
@@ -35,40 +34,24 @@ extern "C"
UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API Initialize()
{
if (g_unity && !g_manager)
if (!g_unity) return;
if (!g_manager)
{
Debug::Initialize();
auto device = g_unity->Get<IUnityGraphicsD3D11>()->GetDevice();
Microsoft::WRL::ComPtr<IDXGIDevice1> dxgiDevice;
if (FAILED(device->QueryInterface(IID_PPV_ARGS(&dxgiDevice))))
{
Debug::Error("Initialize() => device->QueryInterface() failed.");
return;
}
Microsoft::WRL::ComPtr<IDXGIAdapter> dxgiAdapter;
if (FAILED(dxgiDevice->GetAdapter(&dxgiAdapter)))
{
Debug::Error("Initialize() => dxgiDevice->GetAdapter() failed.");
return;
}
DXGI_ADAPTER_DESC desc;
dxgiAdapter->GetDesc(&desc);
g_manager = std::make_unique<MonitorManager>(desc.AdapterLuid);
OutputWindowsInformation();
g_manager = std::make_unique<MonitorManager>();
g_manager->Initialize();
}
}
UNITY_INTERFACE_EXPORT void UNITY_INTERFACE_API Finalize()
{
if (!g_manager) return;
g_manager->Finalize();
g_manager.reset();
if (g_manager)
{
g_manager->Finalize();
g_manager.reset();
}
std::queue<Message> empty;
g_messages.swap(empty);

View File

@@ -28,26 +28,26 @@
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>DynamicLibrary</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v141</PlatformToolset>
<PlatformToolset>v140</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>MultiByte</CharacterSet>
</PropertyGroup>

View File

@@ -1 +1 @@
m_EditorVersion: 2018.1.9f1
m_EditorVersion: 2018.2.15f1