프로젝트

일반

사용자정보

통계
| 개정판:

t1 / TFDContents / Assets / KinectDemos / FittingRoomDemo / Scripts / UserBodyBlender.cs @ 3

이력 | 보기 | 이력해설 | 다운로드 (5.83 KB)

1 3 KTH
using UnityEngine;
2
using System.Collections;
3
4
5
public class UserBodyBlender : MonoBehaviour
6
{
7
	[Tooltip("Allowed depth distance between the user and the clothing model, in meters.")]
8
	[Range(-0.5f, 0.5f)]
9
	public float depthThreshold = 0.1f;
10
11
	[Tooltip("Camera used to render the scene background. The background camera gets disabled, when this component is enabled.")]
12
	public Camera backroundCamera;
13
14
	private Material userBlendMat;
15
	private KinectManager kinectManager;
16
	private long lastDepthFrameTime;
17
18
	private Vector2[] color2DepthCoords;
19
	private ComputeBuffer color2DepthBuffer;
20
21
	private float[] depthImageBufferData;
22
	private ComputeBuffer depthImageBuffer;
23
24
	private Rect shaderUvRect = new Rect(0, 0, 1, 1);
25
	private bool shaderRectInited = false;
26
27
	//private float depthFactor = 1f;
28
29
	private RenderTexture copyToTex;
30
31
32
	// sets texture to copy to
33
	/// <summary>
34
	/// Sets the texture to copy the camera image to.
35
	/// </summary>
36
	/// <param name="tex">The target texture</param>
37
	public void SetCopyToTexture(RenderTexture tex)
38
	{
39
		copyToTex = tex;
40
	}
41
42
43
	void OnEnable()
44
	{
45
		// set camera to clear the background
46
		Camera thisCamera = gameObject.GetComponent<Camera>();
47
		if(thisCamera)
48
		{
49
			thisCamera.clearFlags = CameraClearFlags.SolidColor;
50
		}
51
52
		// disable the background camera
53
		if (backroundCamera)
54
		{
55
			backroundCamera.gameObject.SetActive(false);
56
		}
57
	}
58
59
60
	void OnDisable()
61
	{
62
		// set camera to clear the depth buffser only
63
		Camera thisCamera = gameObject.GetComponent<Camera>();
64
		if(thisCamera)
65
		{
66
			thisCamera.clearFlags = CameraClearFlags.Depth;
67
		}
68
69
		// enable the background camera
70
		if (backroundCamera)
71
		{
72
			backroundCamera.gameObject.SetActive(true);
73
		}
74
	}
75
76
77
	void Start ()
78
	{
79
		kinectManager = KinectManager.Instance;
80
81
		if(kinectManager && kinectManager.IsInitialized() &&
82
			kinectManager.GetSensorData().sensorIntPlatform == KinectInterop.DepthSensorPlatform.KinectSDKv2)
83
		{
84
			Shader userBlendShader = Shader.Find("Custom/UserBlendShader");
85
			KinectInterop.SensorData sensorData = kinectManager.GetSensorData();
86
87
			if(userBlendShader != null && sensorData != null)
88
			{
89
				userBlendMat = new Material(userBlendShader);
90
91
				userBlendMat.SetFloat("_ColorResX", (float)sensorData.colorImageWidth);
92
				userBlendMat.SetFloat("_ColorResY", (float)sensorData.colorImageHeight);
93
				userBlendMat.SetFloat("_DepthResX", (float)sensorData.depthImageWidth);
94
				userBlendMat.SetFloat("_DepthResY", (float)sensorData.depthImageHeight);
95
96
				//depthFactor = 1f + Mathf.Sin (Mathf.Abs (kinectManager.sensorAngle) * Mathf.Deg2Rad);
97
				//userBlendMat.SetFloat("_DepthFactor", depthFactor);
98
99
				color2DepthCoords = new Vector2[sensorData.colorImageWidth * sensorData.colorImageHeight];
100
101
				color2DepthBuffer = new ComputeBuffer(sensorData.colorImageWidth * sensorData.colorImageHeight, sizeof(float) * 2);
102
				userBlendMat.SetBuffer("_DepthCoords", color2DepthBuffer);
103
104
				depthImageBufferData = new float[sensorData.depthImage.Length];
105
106
				depthImageBuffer = new ComputeBuffer(sensorData.depthImage.Length, sizeof(float));
107
				userBlendMat.SetBuffer("_DepthBuffer", depthImageBuffer);
108
109
				//userBlendMat.SetTexture("_ColorTex", sensorData.colorImageTexture);
110
			}
111
		}
112
		else
113
		{
114
			// disable the component
115
			gameObject.GetComponent<UserBodyBlender>().enabled = false;
116
		}
117
	}
118
119
	void OnDestroy()
120
	{
121
		if(color2DepthBuffer != null)
122
		{
123
			color2DepthBuffer.Release();
124
			color2DepthBuffer = null;
125
		}
126
127
		if(depthImageBuffer != null)
128
		{
129
			depthImageBuffer.Release();
130
			depthImageBuffer = null;
131
		}
132
133
		color2DepthCoords = null;
134
		depthImageBufferData = null;
135
	}
136
137
	void Update()
138
	{
139
		if (!shaderRectInited)
140
		{
141
			PortraitBackground portraitBack = PortraitBackground.Instance;
142
			if(portraitBack && portraitBack.IsInitialized())
143
			{
144
				shaderUvRect = portraitBack.GetShaderUvRect();
145
			}
146
147
			if (userBlendMat != null)
148
			{
149
				userBlendMat.SetFloat("_ColorOfsX", shaderUvRect.x);
150
				userBlendMat.SetFloat("_ColorMulX", shaderUvRect.width);
151
				userBlendMat.SetFloat("_ColorOfsY", shaderUvRect.y);
152
				userBlendMat.SetFloat("_ColorMulY", shaderUvRect.height);
153
			}
154
155
			shaderRectInited = true;
156
		}
157
158
		if(kinectManager && kinectManager.IsInitialized())
159
		{
160
			KinectInterop.SensorData sensorData = kinectManager.GetSensorData();
161
162
			if(sensorData != null && sensorData.depthImage != null && sensorData.colorImageTexture &&
163
				userBlendMat != null && lastDepthFrameTime != sensorData.lastDepthFrameTime)
164
			{
165
				lastDepthFrameTime = sensorData.lastDepthFrameTime;
166
				//userBlendMat.SetTexture("_ColorTex", sensorData.colorImageTexture);
167
168
				//if (kinectManager.autoHeightAngle == KinectManager.AutoHeightAngle.AutoUpdate || kinectManager.autoHeightAngle == KinectManager.AutoHeightAngle.AutoUpdateAndShowInfo)
169
				//{
170
				//	depthFactor = 1f + Mathf.Sin (Mathf.Abs (kinectManager.sensorAngle) * Mathf.Deg2Rad);
171
				//	userBlendMat.SetFloat("_DepthFactor", depthFactor);
172
				//}
173
174
				if(KinectInterop.MapColorFrameToDepthCoords(sensorData, ref color2DepthCoords))
175
				{
176
					color2DepthBuffer.SetData(color2DepthCoords);
177
				}
178
179
				// buffer for depths
180
				for (int i = 0; i < sensorData.depthImage.Length; i++)
181
				{
182
					ushort depth = sensorData.depthImage[i];
183
					depthImageBufferData[i] = (float)depth;
184
				}
185
186
				depthImageBuffer.SetData(depthImageBufferData);
187
188
				// color camera texture
189
				userBlendMat.SetTexture("_ColorTex", sensorData.colorImageTexture);
190
			}
191
		}
192
	}
193
194
	void OnRenderImage (RenderTexture source, RenderTexture destination)
195
	{
196
		if(userBlendMat != null)
197
		{
198
			userBlendMat.SetFloat("_Threshold", depthThreshold);
199
			Graphics.Blit(source, destination, userBlendMat);
200
201
			if (copyToTex != null)
202
			{
203
				Graphics.Blit(destination, copyToTex);
204
			}
205
		}
206
	}
207
}