t1 / TFDContents / Assets / KinectDemos / FittingRoomDemo / Scripts / UserBodyBlender.cs @ 3
이력 | 보기 | 이력해설 | 다운로드 (5.83 KB)
| 1 |
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 |
} |