// updates the mesh according to current depth frame private void UpdateMesh() { if (!bBuildMesh && (Time.time - lastMeshUpdateTime) >= updateMeshInterval) { lastMeshUpdateTime = Time.time; // copy the texture Graphics.CopyTexture(colorTexture, colorTextureBuildMesh); if (bColorCamRes) { // get transformed depth & BI frames, if needed ulong tDepthFrameTime = 0; sensorData.sensorInterface.GetColorCameraDepthFrame(sensorData, ref tDepthImage, ref tDepthFrameTime); ulong tBiFrameTime = 0; sensorData.sensorInterface.GetColorCameraBodyIndexFrame(sensorData, ref tBodyIndexImage, ref tBiFrameTime); //Debug.Log("UpdateMesh - color time: " + sensorData.lastColorFrameTime + ", tdepth time: " + tDepthFrameTime + ", bi time: " + tBiFrameTime); } else { // copy depth and BI frames KinectInterop.CopyBytes(sensorData.depthImage, sizeof(ushort), tDepthImage, sizeof(ushort)); KinectInterop.CopyBytes(sensorData.bodyIndexImage, sizeof(byte), tBodyIndexImage, sizeof(byte)); //Debug.Log("UpdateMesh - tcolor time: " + sensorData.lastDepthCamColorFrameTime + ", depth time: " + sensorData.lastDepthFrameTime + ", bi time: " + sensorData.lastBodyIndexFrameTime); } bBuildMesh = true; } if (bUpdateMesh) { Graphics.CopyTexture(colorTextureBuildMesh, colorTextureUpdateMesh); mesh.vertices = meshVertices; if (!showAsPointCloud) { mesh.SetIndices(meshIndices, MeshTopology.Triangles, 0); } mesh.RecalculateBounds(); //prevUserId = userId; bUpdateMesh = false; //Debug.Log("Mesh updated."); if (updateColliderInterval > 0 && (Time.time - lastColliderUpdateTime) >= updateColliderInterval) { lastColliderUpdateTime = Time.time; MeshCollider meshCollider = GetComponent <MeshCollider>(); if (meshCollider) { meshCollider.sharedMesh = null; meshCollider.sharedMesh = mesh; } } } }
// updates the mesh according to current depth frame private void UpdateMesh() { // check for players //bool bHavePlayers = kinectManager.GetUsersCount() != 0; if (!bBuildMesh && (Time.time - lastMeshUpdateTime) >= updateMeshInterval /**&& (!updateWhenNoPlayers || !bHavePlayers)*/) { lastMeshUpdateTime = Time.time; // copy the texture Graphics.CopyTexture(colorTexture, colorTextureBuildMesh); if (bColorCamRes) { // get transformed depth frame, if needed ulong frameTime = 0; sensorData.sensorInterface.GetColorCameraDepthFrame(sensorData, ref tDepthImage, ref frameTime); //Debug.Log("UpdateMesh - color time: " + sensorData.lastColorFrameTime + ", tdepth time: " + frameTime); } else { // copy depth frame KinectInterop.CopyBytes(sensorData.depthImage, sizeof(ushort), tDepthImage, sizeof(ushort)); //Debug.Log("UpdateMesh - tcolor time: " + sensorData.lastDepthCamColorFrameTime + ", depth time: " + sensorData.lastDepthFrameTime); } bBuildMesh = true; } if (bUpdateMesh) { Graphics.CopyTexture(colorTextureBuildMesh, colorTextureUpdateMesh); mesh.vertices = meshVertices; if (!showAsPointCloud) { mesh.SetIndices(meshIndices, MeshTopology.Triangles, 0); } mesh.RecalculateBounds(); bUpdateMesh = false; //Debug.Log("Mesh updated."); if (updateColliderInterval > 0 && (Time.time - lastColliderUpdateTime) >= updateColliderInterval) { lastColliderUpdateTime = Time.time; MeshCollider meshCollider = GetComponent <MeshCollider>(); if (meshCollider) { meshCollider.sharedMesh = null; meshCollider.sharedMesh = mesh; } } } }
// updates the mesh according to current depth frame private void UpdateMesh() { if (bMeshInited && colorTexture != null && sensorData.depthImage != null && sensorData.depthCamIntr != null && meshShaderMat != null && lastDepthFrameTime != sensorData.lastDepthFrameTime && (Time.time - lastMeshUpdateTime) >= updateMeshInterval) { lastDepthFrameTime = sensorData.lastDepthFrameTime; lastMeshUpdateTime = Time.time; int paramsCache = coarseFactor + (showAsPointCloud ? 10 : 0); if (meshParamsCache != paramsCache) { //Debug.Log("Mesh params changed. Recreating..."); CreateMeshVertInd(); } if (depthImageBuffer != null && sensorData.depthImage != null /**&& depthBufferCreated*/) { KinectInterop.CopyBytes(sensorData.depthImage, sizeof(ushort), depthImageCopy, sizeof(ushort)); int depthBufferLength = sensorData.depthImageWidth * sensorData.depthImageHeight / 2; KinectInterop.SetComputeBufferData(depthImageBuffer, depthImageCopy, depthBufferLength, sizeof(uint)); } if (bodyIndexBuffer != null && sensorData.bodyIndexImage != null /**&& bodyIndexBufferCreated*/) { KinectInterop.CopyBytes(sensorData.bodyIndexImage, sizeof(byte), bodyIndexCopy, sizeof(byte)); int bodyIndexBufferLength = sensorData.depthImageWidth * sensorData.depthImageHeight / 4; KinectInterop.SetComputeBufferData(bodyIndexBuffer, bodyIndexCopy, bodyIndexBufferLength, sizeof(uint)); } switch (meshTexture) { case MeshTextureType.ColorTexture: if (colorTexture != null) { Graphics.CopyTexture(colorTexture, colorTextureCopy); } break; case MeshTextureType.InfraredTexture: Texture infraredTexture = kinectManager.GetInfraredImageTex(sensorIndex); if (infraredTexture != null) { Graphics.CopyTexture(infraredTexture, colorTextureCopy); } break; } meshShaderMat.SetBuffer("_DepthMap", depthImageBuffer); meshShaderMat.SetBuffer("_BodyIndexMap", bodyIndexBuffer); meshShaderMat.SetInt("_CoarseFactor", coarseFactor); meshShaderMat.SetInt("_IsPointCloud", showAsPointCloud ? 1 : 0); meshShaderMat.SetInt("_UserBodyIndex", userBodyIndex); meshShaderMat.SetVector("_UserBodyPos", userBodyPos); meshShaderMat.SetMatrix("_Transform", sensorInt.GetSensorToWorldMatrix()); meshShaderMat.SetVector("_TexRes", new Vector2(imageWidth, imageHeight)); meshShaderMat.SetVector("_Cxy", new Vector2(sensorData.depthCamIntr.ppx, sensorData.depthCamIntr.ppy)); meshShaderMat.SetVector("_Fxy", new Vector2(sensorData.depthCamIntr.fx, sensorData.depthCamIntr.fy)); meshShaderMat.SetTexture("_ColorTex", colorTextureCopy); meshShaderMat.SetVector("_SpaceScale", kinectManager.GetSensorSpaceScale(sensorIndex)); // kinectManager.GetDepthImageScale(sensorIndex) meshShaderMat.SetBuffer("_SpaceTable", spaceTableBuffer); // mesh bounds if (kinectManager.GetUserBoundingBox(userId, null, sensorIndex, Rect.zero, out Vector3 posMin, out Vector3 posMax)) { Vector3 boundsCenter = new Vector3((posMax.x - posMin.x) / 2f, (posMax.y - posMin.y) / 2f, (posMax.z - posMin.z) / 2f); Vector3 boundsSize = new Vector3((posMax.x - posMin.x), (posMax.y - posMin.y), (posMax.z - posMin.z)); mesh.bounds = new Bounds(boundsCenter, boundsSize); } if (updateColliderInterval > 0 && (Time.time - lastColliderUpdateTime) >= updateColliderInterval) { lastColliderUpdateTime = Time.time; MeshCollider meshCollider = GetComponent <MeshCollider>(); if (meshCollider) { meshCollider.sharedMesh = null; meshCollider.sharedMesh = mesh; } } } }
// updates the mesh according to current depth frame private void UpdateMesh() { if (bMeshInited && sensorData.depthImage != null && sensorData.depthCamIntr != null && meshShaderMat != null && lastDepthFrameTime != sensorData.lastDepthFrameTime && (Time.time - lastMeshUpdateTime) >= updateMeshInterval) { lastDepthFrameTime = sensorData.lastDepthFrameTime; lastMeshUpdateTime = Time.time; int paramsCache = coarseFactor + (showAsPointCloud ? 10 : 0); if (meshParamsCache != paramsCache) { //Debug.Log("Mesh params changed. Recreating..."); CreateMeshVertInd(); } if (depthImageBuffer != null && sensorData.depthImage != null /**&& depthBufferCreated*/) { KinectInterop.CopyBytes(sensorData.depthImage, sizeof(ushort), depthImageCopy, sizeof(ushort)); int depthBufferLength = sensorData.depthImageWidth * sensorData.depthImageHeight / 2; KinectInterop.SetComputeBufferData(depthImageBuffer, depthImageCopy, depthBufferLength, sizeof(uint)); } switch (meshTexture) { case MeshTextureType.ColorTexture: if (colorTexture != null) { Graphics.CopyTexture(colorTexture, colorTextureCopy); } break; case MeshTextureType.InfraredTexture: Texture infraredTexture = sensorInt.pointCloudResolution == DepthSensorBase.PointCloudResolution.DepthCameraResolution ? sensorData.infraredImageTexture : sensorData.colorInfraredTexture; if (infraredTexture != null) { Graphics.CopyTexture(infraredTexture, colorTextureCopy); } break; } if (sourceImageResolution == DepthSensorBase.PointCloudResolution.DepthCameraResolution) { //Debug.Log("SceneMeshGpu DepthFrameTime: " + lastDepthFrameTime); } else { //sensorData.usedColorDepthBufferTime = sensorData.lastColorDepthBufferTime; //Debug.Log("SceneMeshGpu ColorDepthBufferTime: " + sensorData.lastColorDepthBufferTime); } if (sourceImageResolution == DepthSensorBase.PointCloudResolution.DepthCameraResolution) { meshShaderMat.SetBuffer("_DepthMap", depthImageBuffer); } else { meshShaderMat.SetBuffer("_DepthMap", sensorData.colorDepthBuffer); } meshShaderMat.SetTexture("_ColorTex", colorTextureCopy); meshShaderMat.SetVector("_SpaceScale", sensorSpaceScale); meshShaderMat.SetBuffer("_SpaceTable", spaceTableBuffer); meshShaderMat.SetVector("_TexRes", new Vector2(imageWidth, imageHeight)); //meshShaderMat.SetVector("_Cxy", new Vector2(sensorData.depthCamIntr.ppx, sensorData.depthCamIntr.ppy)); //meshShaderMat.SetVector("_Fxy", new Vector2(sensorData.depthCamIntr.fx, sensorData.depthCamIntr.fy)); meshShaderMat.SetInt("_CoarseFactor", coarseFactor); meshShaderMat.SetInt("_IsPointCloud", showAsPointCloud ? 1 : 0); meshShaderMat.SetMatrix("_Transform", sensorInt.GetSensorToWorldMatrix()); meshShaderMat.SetVector("_PosMin", new Vector3(xMin, yMin, zMin)); meshShaderMat.SetVector("_PosMax", new Vector3(xMax, yMax, zMax)); // mesh bounds Vector3 boundsCenter = new Vector3((xMax - xMin) / 2f, (yMax - yMin) / 2f, (zMax - zMin) / 2f); Vector3 boundsSize = new Vector3((xMax - xMin), (yMax - yMin), (zMax - zMin)); mesh.bounds = new Bounds(boundsCenter, boundsSize); // update lighting parameters lighting.UpdateLighting(meshShaderMat, applyLighting); if (updateColliderInterval > 0 && (Time.time - lastColliderUpdateTime) >= updateColliderInterval) { lastColliderUpdateTime = Time.time; MeshCollider meshCollider = GetComponent <MeshCollider>(); if (meshCollider) { meshCollider.sharedMesh = null; meshCollider.sharedMesh = mesh; } } } }