Ejemplo n.º 1
0
        // 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;
                    }
                }
            }
        }