1
0
mirror of https://github.com/xiaopeng12138/MaiDXR.git synced 2024-11-30 13:44:28 +01:00

add screen share over netcode using nvenc

This commit is contained in:
xpeng 2022-08-24 04:03:27 +02:00
parent 99106fa378
commit 13c18c8fc2
17 changed files with 548 additions and 43 deletions

View File

@ -59,7 +59,7 @@ Material:
m_Offset: {x: 0, y: 0} m_Offset: {x: 0, y: 0}
- _MainTex: - _MainTex:
m_Texture: {fileID: 2800000, guid: 6660365cd3c564f4582541b1cf6cce84, type: 3} m_Texture: {fileID: 2800000, guid: 6660365cd3c564f4582541b1cf6cce84, type: 3}
m_Scale: {x: 1, y: 1} m_Scale: {x: 1, y: -1}
m_Offset: {x: 0, y: 0} m_Offset: {x: 0, y: 0}
- _MetallicGlossMap: - _MetallicGlossMap:
m_Texture: {fileID: 0} m_Texture: {fileID: 0}
@ -73,6 +73,10 @@ Material:
m_Texture: {fileID: 0} m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1} m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0} m_Offset: {x: 0, y: 0}
- _SecTex:
m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0}
- _SpecGlossMap: - _SpecGlossMap:
m_Texture: {fileID: 0} m_Texture: {fileID: 0}
m_Scale: {x: 1, y: 1} m_Scale: {x: 1, y: 1}
@ -92,16 +96,31 @@ Material:
m_Ints: [] m_Ints: []
m_Floats: m_Floats:
- _AlphaClip: 0 - _AlphaClip: 0
- _BUILTIN_QueueControl: -1
- _BUILTIN_QueueOffset: 0
- _Blend: 0 - _Blend: 0
- _BlendOp: 0
- _BumpScale: 1 - _BumpScale: 1
- _CameraFadingEnabled: 0
- _CameraFarFadeDistance: 2
- _CameraNearFadeDistance: 1
- _ClearCoatMask: 0 - _ClearCoatMask: 0
- _ClearCoatSmoothness: 0 - _ClearCoatSmoothness: 0
- _ColorMode: 0
- _Cull: 2 - _Cull: 2
- _Cutoff: 0.5 - _Cutoff: 0.5
- _DetailAlbedoMapScale: 1 - _DetailAlbedoMapScale: 1
- _DetailNormalMapScale: 1 - _DetailNormalMapScale: 1
- _DistortionBlend: 0.5
- _DistortionEnabled: 0
- _DistortionStrength: 1
- _DistortionStrengthScaled: 0.1
- _DstBlend: 0 - _DstBlend: 0
- _EnvironmentReflections: 1 - _EnvironmentReflections: 1
- _FlipX: 0
- _FlipY: 0
- _FlipbookBlending: 0
- _FlipbookMode: 0
- _GlossMapScale: 1 - _GlossMapScale: 1
- _Glossiness: 0 - _Glossiness: 0
- _GlossyReflections: 1 - _GlossyReflections: 1
@ -111,8 +130,12 @@ Material:
- _Parallax: 0.02 - _Parallax: 0.02
- _QueueOffset: 0 - _QueueOffset: 0
- _ReceiveShadows: 1 - _ReceiveShadows: 1
- _SampleGI: 0
- _Smoothness: 0.5 - _Smoothness: 0.5
- _SmoothnessTextureChannel: 0 - _SmoothnessTextureChannel: 0
- _SoftParticlesEnabled: 0
- _SoftParticlesFarFadeDistance: 1
- _SoftParticlesNearFadeDistance: 0
- _SpecularHighlights: 1 - _SpecularHighlights: 1
- _SrcBlend: 1 - _SrcBlend: 1
- _Surface: 0 - _Surface: 0
@ -121,7 +144,10 @@ Material:
- _ZWrite: 1 - _ZWrite: 1
m_Colors: m_Colors:
- _BaseColor: {r: 0.38058165, g: 0.38058165, b: 0.38058165, a: 1} - _BaseColor: {r: 0.38058165, g: 0.38058165, b: 0.38058165, a: 1}
- _Color: {r: 0.38058162, g: 0.38058162, b: 0.38058162, a: 1} - _BaseColorAddSubDiff: {r: 0, g: 0, b: 0, a: 0}
- _CameraFadeParams: {r: 0, g: 0, b: 0, a: 0}
- _Color: {r: 1, g: 1, b: 1, a: 1}
- _EmissionColor: {r: 0, g: 0, b: 0, a: 1} - _EmissionColor: {r: 0, g: 0, b: 0, a: 1}
- _SoftParticleFadeParams: {r: 0, g: 0, b: 0, a: 0}
- _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1}
m_BuildTextureStacks: [] m_BuildTextureStacks: []

View File

@ -58,8 +58,8 @@ Material:
m_Scale: {x: 1, y: 1} m_Scale: {x: 1, y: 1}
m_Offset: {x: 0, y: 0} m_Offset: {x: 0, y: 0}
- _MainTex: - _MainTex:
m_Texture: {fileID: 2800000, guid: f44b1ed140e7104439a23e290bf6ed3f, type: 3} m_Texture: {fileID: 2800000, guid: 6660365cd3c564f4582541b1cf6cce84, type: 3}
m_Scale: {x: 1, y: 1} m_Scale: {x: 1, y: -1}
m_Offset: {x: 0, y: 0} m_Offset: {x: 0, y: 0}
- _MetallicGlossMap: - _MetallicGlossMap:
m_Texture: {fileID: 0} m_Texture: {fileID: 0}

Binary file not shown.

View File

@ -1551,6 +1551,7 @@ MonoBehaviour:
HandPositionX: 0 HandPositionX: 0
HandPositionY: 0 HandPositionY: 0
HandPositionZ: 0 HandPositionZ: 0
Sliders: []
--- !u!1 &149481173433458732 --- !u!1 &149481173433458732
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@ -1479,6 +1479,8 @@ GameObject:
- component: {fileID: 7954102358903816433} - component: {fileID: 7954102358903816433}
- component: {fileID: 6166462342570134929} - component: {fileID: 6166462342570134929}
- component: {fileID: 6918064188570338137} - component: {fileID: 6918064188570338137}
- component: {fileID: 5523943268535035658}
- component: {fileID: 8812900737838453218}
m_Layer: 0 m_Layer: 0
m_Name: XRNetwork m_Name: XRNetwork
m_TagString: Untagged m_TagString: Untagged
@ -1698,8 +1700,54 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 5be4365f045c3264ea500128c655fae6, type: 3} m_Script: {fileID: 11500000, guid: 5be4365f045c3264ea500128c655fae6, type: 3}
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
Player1Position: {x: -1, y: 0} Player1Position: {x: -0.75, y: 0}
Player2Position: {x: 1, y: 0} Player2Position: {x: 0.75, y: 0}
--- !u!114 &5523943268535035658
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 149481173429413636}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: a50a416b20df1fe4e95e9982b82c084b, type: 3}
m_Name:
m_EditorClassIdentifier:
Encoder: {fileID: 8812900737838453218}
Decoder: {fileID: 0}
DecoderTexture: {fileID: 0}
maxPacketSize: 4096
timeout: 100
--- !u!114 &8812900737838453218
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 149481173429413636}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 1beb3ca2d3590d64aaa6e95c89db59aa, type: 3}
m_Name:
m_EditorClassIdentifier:
texture: {fileID: 0}
encoder:
onEncoded:
m_PersistentCalls:
m_Calls: []
outputError: 0
setting:
width: 1920
height: 1080
frameRate: 24
bitRate: 98304
maxFrameSize: 4096
format: 87
idrFrameIntervalFrame: 24
ResolutionDivider: 2
sTexture: {fileID: 0}
ResizeShader: {fileID: 0}
--- !u!1 &149481173433458732 --- !u!1 &149481173433458732
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@ -888,6 +888,37 @@ MonoBehaviour:
m_PersistentCalls: m_PersistentCalls:
m_Calls: [] m_Calls: []
m_IsOn: 1 m_IsOn: 1
--- !u!1 &87509939
GameObject:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
serializedVersion: 6
m_Component:
- component: {fileID: 87509942}
m_Layer: 0
m_Name: Test
m_TagString: Untagged
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
--- !u!4 &87509942
Transform:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 87509939}
m_LocalRotation: {x: 0, y: 0, z: 0, w: 1}
m_LocalPosition: {x: 0.5159848, y: 1.8461566, z: 1.1951983}
m_LocalScale: {x: 1, y: 1, z: 1}
m_ConstrainProportionsScale: 0
m_Children: []
m_Father: {fileID: 0}
m_RootOrder: 12
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &96262323 --- !u!1 &96262323
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0
@ -5398,7 +5429,7 @@ MonoBehaviour:
Port: 7777 Port: 7777
Address: 127.0.0.1 Address: 127.0.0.1
MaxClients: 100 MaxClients: 100
MessageBufferSize: 5120 MessageBufferSize: 51200
PingInterval: 500 PingInterval: 500
TimeoutLimit: 32 TimeoutLimit: 32
TimeoutMinimum: 5000 TimeoutMinimum: 5000
@ -5416,12 +5447,12 @@ MonoBehaviour:
m_Name: m_Name:
m_EditorClassIdentifier: m_EditorClassIdentifier:
PlayerIOs: PlayerIOs:
- {fileID: 1716582342}
- {fileID: 1006346016}
- {fileID: 393682}
- {fileID: 2079759568} - {fileID: 2079759568}
- {fileID: 934521997} - {fileID: 1006346016}
- {fileID: 2069467403} - {fileID: 2069467403}
- {fileID: 393682}
- {fileID: 1716582342}
- {fileID: 934521997}
PlayerIOsOpposite: PlayerIOsOpposite:
- {fileID: 1390826961} - {fileID: 1390826961}
- {fileID: 1023774752} - {fileID: 1023774752}
@ -7887,6 +7918,11 @@ PrefabInstance:
propertyPath: m_IsActive propertyPath: m_IsActive
value: 1 value: 1
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 1995990277796536632, guid: 4cbf0dbca1ca1a5499c4b7806ab6aac5,
type: 3}
propertyPath: m_TagString
value: DisplayP1
objectReference: {fileID: 0}
- target: {fileID: 1995990277796536632, guid: 4cbf0dbca1ca1a5499c4b7806ab6aac5, - target: {fileID: 1995990277796536632, guid: 4cbf0dbca1ca1a5499c4b7806ab6aac5,
type: 3} type: 3}
propertyPath: m_StaticEditorFlags propertyPath: m_StaticEditorFlags
@ -7962,6 +7998,11 @@ PrefabInstance:
propertyPath: m_Enabled propertyPath: m_Enabled
value: 0 value: 0
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 2963333645091585133, guid: 4cbf0dbca1ca1a5499c4b7806ab6aac5,
type: 3}
propertyPath: m_TagString
value: Untagged
objectReference: {fileID: 0}
- target: {fileID: 2963333645091585133, guid: 4cbf0dbca1ca1a5499c4b7806ab6aac5, - target: {fileID: 2963333645091585133, guid: 4cbf0dbca1ca1a5499c4b7806ab6aac5,
type: 3} type: 3}
propertyPath: m_StaticEditorFlags propertyPath: m_StaticEditorFlags
@ -8602,6 +8643,11 @@ PrefabInstance:
propertyPath: m_Enabled propertyPath: m_Enabled
value: 0 value: 0
objectReference: {fileID: 0} objectReference: {fileID: 0}
- target: {fileID: 8110296352969589220, guid: 4cbf0dbca1ca1a5499c4b7806ab6aac5,
type: 3}
propertyPath: m_TagString
value: DisplayP2
objectReference: {fileID: 0}
- target: {fileID: 8123848027915441045, guid: 4cbf0dbca1ca1a5499c4b7806ab6aac5, - target: {fileID: 8123848027915441045, guid: 4cbf0dbca1ca1a5499c4b7806ab6aac5,
type: 3} type: 3}
propertyPath: m_Name propertyPath: m_Name
@ -10458,6 +10504,12 @@ MonoBehaviour:
m_StringArgument: m_StringArgument:
m_BoolArgument: 0 m_BoolArgument: 0
m_CallState: 2 m_CallState: 2
--- !u!1 &963757693 stripped
GameObject:
m_CorrespondingSourceObject: {fileID: 8110296352969589220, guid: 4cbf0dbca1ca1a5499c4b7806ab6aac5,
type: 3}
m_PrefabInstance: {fileID: 757793526}
m_PrefabAsset: {fileID: 0}
--- !u!1 &965250220 stripped --- !u!1 &965250220 stripped
GameObject: GameObject:
m_CorrespondingSourceObject: {fileID: 5910539533559942829, guid: 4cbf0dbca1ca1a5499c4b7806ab6aac5, m_CorrespondingSourceObject: {fileID: 5910539533559942829, guid: 4cbf0dbca1ca1a5499c4b7806ab6aac5,
@ -15965,6 +16017,35 @@ Transform:
type: 3} type: 3}
m_PrefabInstance: {fileID: 757793526} m_PrefabInstance: {fileID: 757793526}
m_PrefabAsset: {fileID: 0} m_PrefabAsset: {fileID: 0}
--- !u!114 &1390826964
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 963757693}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: 78ff908a2776a034e9792518f4c6da70, type: 3}
m_Name:
m_EditorClassIdentifier:
decoder: {fileID: 1390826965}
--- !u!114 &1390826965
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 963757693}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: fd03e427cccae6341afca0ae448e2ec0, type: 3}
m_Name:
m_EditorClassIdentifier:
width: 360
height: 640
codec: 0
format: 0
--- !u!1 &1391291191 --- !u!1 &1391291191
GameObject: GameObject:
m_ObjectHideFlags: 0 m_ObjectHideFlags: 0

View File

@ -98,7 +98,7 @@ public class CaptureSettingManager : MonoBehaviour
public void SetCP1P() public void SetCP1P()
{ {
WindowMaterial.SetTextureScale("_MainTex",new Vector2(Toggle.isOn ? 1f : 0.5f, 1)); WindowMaterial.SetTextureScale("_MainTex",new Vector2(Toggle.isOn ? 1f : 0.5f, -1));
JsonConfig.SetBoolean("Capture1P", Toggle.isOn); JsonConfig.SetBoolean("Capture1P", Toggle.isOn);
} }
} }

View File

@ -0,0 +1,20 @@
{
"name": "Display",
"rootNamespace": "",
"references": [
"GUID:1491147abca9d7d4bb7105af628b223e",
"GUID:335e60c3f2584c947bb2dd55d449ab18",
"GUID:4d14b15ded5e3ac4499a81ec3fc340fc",
"GUID:56dd35f9b6f21364494ed8365264cbf6",
"GUID:ec8e026973d4d094882a84e64338c685"
],
"includePlatforms": [],
"excludePlatforms": [],
"allowUnsafeCode": false,
"overrideReferences": false,
"precompiledReferences": [],
"autoReferenced": true,
"defineConstraints": [],
"versionDefines": [],
"noEngineReferences": false
}

View File

@ -0,0 +1,137 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Unity.Netcode;
using uWindowCapture;
using uPacketDivision;
using uNvPipe;
using System.Runtime.InteropServices;
public class DisplaySync : NetworkBehaviour
{
public WindowEncoder Encoder;
public uNvPipeDecoder Decoder;
public uNvPipeDecodedTexture DecoderTexture;
public uint maxPacketSize = 4096;
private UwcWindow DisplayP1Window;
private Material DisplayP2Mat;
Divider divider = new Divider();
public uint timeout = 100;
Assembler assembler = new Assembler();
bool isInitialized = false;
void Start()
{
NetworkManager.Singleton.OnClientDisconnectCallback += OnClientDisconnectedCallback;
var DisplayP1 = GameObject.FindGameObjectWithTag("DisplayP1");
var DisplayP2 = GameObject.FindGameObjectWithTag("DisplayP2");
Encoder.texture = DisplayP1.GetComponent<UwcWindowTexture>();
Decoder = DisplayP2.GetComponent<uNvPipeDecoder>();
DecoderTexture = DisplayP2.GetComponent<uNvPipeDecodedTexture>();
Decoder.enabled = false;
DecoderTexture.enabled = false;
DisplayP2Mat = DisplayP2.GetComponent<Renderer>().material;
divider.maxPacketSize = maxPacketSize;
if (IsOwner)
{
Debug.Log("Add Listener");
Encoder.encoder.onEncoded.AddListener(OnEncoded);
}
}
void Update()
{
}
public void OnEncoded(System.IntPtr data, int size)
{
//Debug.Log("OnEncoded");
int[] winSize = new int[2]{Encoder.setting.width, Encoder.setting.height};
SendSizeServerRpc(winSize);
divider.Divide(data, (uint)size);
for (uint i = 0; i < divider.GetChunkCount(); ++i)
{
SendDataServerRpc(divider.GetChunk(i));
}
}
private void OnClientDisconnectedCallback(ulong callBack)
{
Decoder.enabled = false;
DecoderTexture.enabled = false;
isInitialized = false;
}
//[ServerRpc(Delivery = RpcDelivery.Unreliable)]
[ServerRpc]
private void SendDataServerRpc(byte[] bytes)
{
SetDataClientRpc(bytes);
}
//[ClientRpc(Delivery = RpcDelivery.Unreliable)]
[ClientRpc]
private void SetDataClientRpc(byte[] bytes)
{
if (IsOwner) return;
assembler.timeout = timeout;
assembler.Add(bytes);
CheckPacketEvent();
}
[ServerRpc]
private void SendSizeServerRpc(int[] ints)
{
SetSizeClientRpc(ints);
}
//[ClientRpc(Delivery = RpcDelivery.Unreliable)]
[ClientRpc]
private void SetSizeClientRpc(int[] ints)
{
if (IsOwner) return;
if (isInitialized) return;
var width = ints[0];
var height = ints[1];
Debug.LogFormat("Start decoder: width => {0}, height => {1}", width, height);
Decoder.width = width;
Decoder.height = height;
Decoder.enabled = true;
DecoderTexture.enabled = true;
DecoderTexture.gameObject.GetComponent<Renderer>().material.SetTextureScale("_MainTex",new Vector2(width/height < 0.6 ? 1f : 0.5f, -1));
isInitialized = true;
}
void CheckPacketEvent()
{
if (!isInitialized) return;
switch (assembler.GetEventType())
{
case uPacketDivision.EventType.FrameCompleted:
{
var data = assembler.GetAssembledData<byte>();
int size = data.Length;
var handle = GCHandle.Alloc(data, GCHandleType.Pinned);
var ptr = handle.AddrOfPinnedObject();
Decoder.Decode(ptr, (int)size);
handle.Free();
break;
}
case uPacketDivision.EventType.PacketLoss:
{
Debug.LogError("packet loss");
break;
}
default:
{
break;
}
}
}
}

View File

@ -0,0 +1,99 @@
using UnityEngine;
using System.Collections;
using uWindowCapture;
using Unity.Netcode;
public class WindowEncoder : NetworkBehaviour
{
[SerializeField]
public UwcWindowTexture texture = null;
[SerializeField]
public uNvEncoder.Encoder encoder = null;
[SerializeField]
public uNvEncoder.EncoderDesc setting = new uNvEncoder.EncoderDesc
{
width = 1920,
height = 1080,
frameRate = 24,
format = uNvEncoder.Format.B8G8R8A8_UNORM,
bitRate = 98304,
maxFrameSize = 4096,
};
public int idrFrameIntervalFrame = 24;
int idrFrameCounter_ = 0;
public int ResolutionDivider = 2;
public Texture2D sTexture;
void Start()
{
if (!IsOwner) return;
StartCoroutine(EncodeLoop());
}
void OnDisable()
{
if (!IsOwner) return;
StopAllCoroutines();
encoder.Destroy();
}
RenderTexture rt;
void Resize()
{
Graphics.Blit(texture.window.texture, rt);
sTexture.ReadPixels(new Rect(0,0,setting.width, setting.height),0,0);
sTexture.Apply();
}
IEnumerator EncodeLoop()
{
for (;;)
{
if (texture.window != null) break;
yield return new WaitForEndOfFrame();
}
setting.width = texture.window.width / ResolutionDivider;
setting.height = texture.window.height / ResolutionDivider;
encoder.Create(setting);
rt = new RenderTexture(setting.width, setting.height, 24);
sTexture = new Texture2D(setting.width, setting.height, TextureFormat.BGRA32, false);
RenderTexture.active = rt;
for (;;)
{
if (setting.frameRate < 60)
{
yield return new WaitForSeconds(1f / setting.frameRate);
}
bool idr = idrFrameCounter_++ % idrFrameIntervalFrame == 0;
Resize();
encoder.Encode(sTexture, idr);
encoder.Update();
}
}
[ContextMenu("Reconfigure")]
public void Reconfigure()
{
if (encoder == null) return;
encoder.Reconfigure(setting);
}
public ComputeShader ResizeShader;
Texture2D Resize(ComputeShader shader, Texture2D inputTexture, int divideSize)
{
Texture2D t = new Texture2D(inputTexture.width/divideSize, inputTexture.height/divideSize, TextureFormat.BGRA32, false);
int k = shader.FindKernel("Resize");
shader.SetInt("divideSize", divideSize);
shader.SetTexture(k, "inputTexture", inputTexture);
shader.SetTexture(k, "outputTexture", t);
shader.Dispatch(k, inputTexture.width / 8, inputTexture.height / 8, 1);
return t;
}
}

View File

@ -22,6 +22,11 @@ public class StartManager : MonoBehaviour
int hostPort = 7777; int hostPort = 7777;
void Start() void Start()
{ {
NetworkManager.Singleton.OnClientConnectedCallback += OnClientConnectedCallback;
NetworkManager.Singleton.OnServerStarted += OnServerStartedCallback;
NetworkManager.Singleton.OnClientDisconnectCallback += OnClientDisconnectedCallback;
NetworkManager.Singleton.OnTransportFailure += OnTransportFailure;
if (JsonConfig.HasKey("HostIP")) hostIP = JsonConfig.GetString("HostIP"); if (JsonConfig.HasKey("HostIP")) hostIP = JsonConfig.GetString("HostIP");
else JsonConfig.SetString("HostIP", hostIP); else JsonConfig.SetString("HostIP", hostIP);
@ -32,16 +37,30 @@ public class StartManager : MonoBehaviour
GetComponent<EnetTransport>().Port = (ushort)hostPort; GetComponent<EnetTransport>().Port = (ushort)hostPort;
PlayerSettingManager = XRLocal.GetComponent<PlayerSettingManager>(); PlayerSettingManager = XRLocal.GetComponent<PlayerSettingManager>();
} }
public void StartHost() private void OnClientConnectedCallback(ulong callBack)
{
SetMode();
}
private void OnServerStartedCallback()
{
//SetMode();
}
private void OnClientDisconnectedCallback(ulong callBack)
{
Debug.Log("Client Disconnected");
StopClient();
}
private void OnTransportFailure()
{
Debug.Log("Transport Failure");
StopAll();
}
private void SetMode()
{ {
if (NetworkManager.Singleton.IsHost) if (NetworkManager.Singleton.IsHost)
return; {
if (NetworkManager.Singleton.IsClient)
NetworkManager.Singleton.Shutdown();
NetworkManager.Singleton.StartHost();
foreach (var IO in PlayerIOs) foreach (var IO in PlayerIOs)
IO.position = new Vector3(Player1Anchor.position.x, IO.position.y, IO.position.z); IO.position = new Vector3(Player1Anchor.position.x, IO.position.y, IO.position.z);
foreach (var IO in PlayerIOsOpposite) foreach (var IO in PlayerIOsOpposite)
@ -50,16 +69,10 @@ public class StartManager : MonoBehaviour
PlayerSettingManager.SetTarget(NetworkManager.Singleton.LocalClient.PlayerObject.gameObject); PlayerSettingManager.SetTarget(NetworkManager.Singleton.LocalClient.PlayerObject.gameObject);
XRLocal.SetActive(false); XRLocal.SetActive(false);
StartHostButton.interactable = false; StartHostButton.interactable = false;
Debug.Log("Start Host Success");
} }
public void StartClient() else if (NetworkManager.Singleton.IsClient)
{ {
if (NetworkManager.Singleton.IsClient)
return;
if (NetworkManager.Singleton.IsHost)
NetworkManager.Singleton.Shutdown();
NetworkManager.Singleton.StartClient();
foreach (var IO in PlayerIOs) foreach (var IO in PlayerIOs)
IO.position = new Vector3(Player2Anchor.position.x, IO.position.y, IO.position.z); IO.position = new Vector3(Player2Anchor.position.x, IO.position.y, IO.position.z);
foreach (var IO in PlayerIOsOpposite) foreach (var IO in PlayerIOsOpposite)
@ -69,13 +82,59 @@ public class StartManager : MonoBehaviour
PlayerSettingManager.SetTarget(NetworkManager.Singleton.LocalClient.PlayerObject.gameObject); PlayerSettingManager.SetTarget(NetworkManager.Singleton.LocalClient.PlayerObject.gameObject);
XRLocal.SetActive(false); XRLocal.SetActive(false);
StartClientButton.interactable = false; StartClientButton.interactable = false;
Debug.Log("Start Client Success");
}
}
public void StartHost()
{
Debug.Log("Start Host");
if (NetworkManager.Singleton.IsClient)
{
NetworkManager.Singleton.Shutdown();
PlayerSettingManager.SetTarget(XRLocal);
XRLocal.SetActive(true);
}
if (!NetworkManager.Singleton.StartHost())
{
Debug.Log("Start Host Failed");
StopAll();
}
}
public void StartClient()
{
Debug.Log("Start Client");
if (NetworkManager.Singleton.IsHost)
{
NetworkManager.Singleton.Shutdown();
PlayerSettingManager.SetTarget(XRLocal);
XRLocal.SetActive(true);
}
if (!NetworkManager.Singleton.StartClient())
{
Debug.Log("Start Client Failed");
StopAll();
}
StartClientButton.interactable = false;
} }
public void StopAll() public void StopAll()
{ {
if (NetworkManager.Singleton.IsClient || NetworkManager.Singleton.IsHost)
NetworkManager.Singleton.Shutdown(); NetworkManager.Singleton.Shutdown();
PlayerSettingManager.SetTarget(XRLocal); PlayerSettingManager.SetTarget(XRLocal);
XRLocal.SetActive(true); XRLocal.SetActive(true);
StartHostButton.interactable = true; StartHostButton.interactable = true;
StartClientButton.interactable = true; StartClientButton.interactable = true;
Debug.Log("Stop All");
}
private void StopClient()
{
if (NetworkManager.Singleton.IsHost)
return;
NetworkManager.Singleton.Shutdown();
PlayerSettingManager.SetTarget(XRLocal);
XRLocal.SetActive(true);
StartHostButton.interactable = true;
StartClientButton.interactable = true;
Debug.Log("Stop Client");
} }
} }

View File

@ -0,0 +1,11 @@
#pragma kernel Resize
int divideSize;
Texture2D inputTexture;
RWTexture2D <float4> outputTexture;
[numthreads(8, 8, 1)]
void Resize(uint3 id : SV_DispatchThreadID)
{
outputTexture[id.xy / divideSize] = inputTexture[id.xy];
}

View File

@ -1 +0,0 @@
{"Keys":["com.unity.services.qos.version","com.unity.services.lobby.version","com.unity.services.core.version","com.unity.services.authentication.version","com.unity.services.relay.version"],"Values":[{"m_Value":"1.0.0","m_IsReadOnly":true},{"m_Value":"1.0.0-pre.6","m_IsReadOnly":true},{"m_Value":"1.4.0","m_IsReadOnly":true},{"m_Value":"2.0.0","m_IsReadOnly":true},{"m_Value":"1.0.2","m_IsReadOnly":true}]}

View File

@ -2,6 +2,9 @@
"dependencies": { "dependencies": {
"com.community.netcode.transport.enet": "https://github.com/Unity-Technologies/multiplayer-community-contributions.git?path=/Transports/com.community.netcode.transport.enet", "com.community.netcode.transport.enet": "https://github.com/Unity-Technologies/multiplayer-community-contributions.git?path=/Transports/com.community.netcode.transport.enet",
"com.community.netcode.transport.websocket": "https://github.com/Unity-Technologies/multiplayer-community-contributions.git?path=/Transports/com.community.netcode.transport.websocket", "com.community.netcode.transport.websocket": "https://github.com/Unity-Technologies/multiplayer-community-contributions.git?path=/Transports/com.community.netcode.transport.websocket",
"com.hecomi.unvencoder": "https://github.com/hecomi/uNvEncoder.git#upm",
"com.hecomi.unvpipe": "https://github.com/hecomi/uNvPipe.git#upm",
"com.hecomi.upacketdivision": "https://github.com/hecomi/uPacketDivision.git#upm",
"com.hecomi.uwindowcapture": "https://github.com/hecomi/uWindowCapture.git#upm", "com.hecomi.uwindowcapture": "https://github.com/hecomi/uWindowCapture.git#upm",
"com.unity.ide.visualstudio": "2.0.14", "com.unity.ide.visualstudio": "2.0.14",
"com.unity.ide.vscode": "1.2.5", "com.unity.ide.vscode": "1.2.5",

View File

@ -14,6 +14,27 @@
"dependencies": {}, "dependencies": {},
"hash": "095d1c78b77f405b44c9ff4ae20c3a01f6d3cddc" "hash": "095d1c78b77f405b44c9ff4ae20c3a01f6d3cddc"
}, },
"com.hecomi.unvencoder": {
"version": "https://github.com/hecomi/uNvEncoder.git#upm",
"depth": 0,
"source": "git",
"dependencies": {},
"hash": "3568c3fa3a4f9880ff18da515281950a0d646ab9"
},
"com.hecomi.unvpipe": {
"version": "https://github.com/hecomi/uNvPipe.git#upm",
"depth": 0,
"source": "git",
"dependencies": {},
"hash": "106bcc1a49d8ed573021e63bb07d1969b09880f3"
},
"com.hecomi.upacketdivision": {
"version": "https://github.com/hecomi/uPacketDivision.git#upm",
"depth": 0,
"source": "git",
"dependencies": {},
"hash": "0c302e237b3d42f501aab1d3d0ea3ca049fea001"
},
"com.hecomi.uwindowcapture": { "com.hecomi.uwindowcapture": {
"version": "https://github.com/hecomi/uWindowCapture.git#upm", "version": "https://github.com/hecomi/uWindowCapture.git#upm",
"depth": 0, "depth": 0,

View File

@ -175,8 +175,6 @@ PlayerSettings:
- {fileID: 0} - {fileID: 0}
- {fileID: 0} - {fileID: 0}
- {fileID: 0} - {fileID: 0}
- {fileID: 6536100391545742739, guid: 55d1ec7a4296de343b6d3bb6f9a19731, type: 2}
- {fileID: -6018045015233401694, guid: 3999ab811e936714280a476b3a032d86, type: 2}
metroInputSource: 0 metroInputSource: 0
wsaTransparentSwapchain: 0 wsaTransparentSwapchain: 0
m_HolographicPauseOnTrackingLoss: 1 m_HolographicPauseOnTrackingLoss: 1

View File

@ -3,7 +3,9 @@
--- !u!78 &1 --- !u!78 &1
TagManager: TagManager:
serializedVersion: 2 serializedVersion: 2
tags: [] tags:
- DisplayP1
- DisplayP2
layers: layers:
- Default - Default
- TransparentFX - TransparentFX