private static void WritePointsToFile(string filePath, ColorMesh mesh)
        {
            var    indeces  = mesh.GetTriangleIndexes();
            var    vertices = mesh.GetVertices();
            var    colors   = mesh.GetColors();
            int    faces    = indeces.Count / 3;
            string header   = GetHeader(vertices.Count, faces);

            using (StreamWriter file = new StreamWriter(filePath))
            {
                file.WriteLine(header);                  //header
                for (int i = 0; i < vertices.Count; i++) //vertices + colors
                {
                    file.WriteLine(GetPointString(vertices[i], colors[i]));
                }
                for (int i = 0; i < faces; i++)
                {
                    string baseIndex0 = (i * 3).ToString(CultureInfo.InvariantCulture);
                    string baseIndex1 = ((i * 3) + 1).ToString(CultureInfo.InvariantCulture);
                    string baseIndex2 = ((i * 3) + 2).ToString(CultureInfo.InvariantCulture);
                    string faceString = "3 " + baseIndex0 + " " + baseIndex1 + " " + baseIndex2;
                    file.WriteLine(faceString);
                }
            }
        }
        [ExcludeFromCodeCoverage]                              //Cannot test this as it requires a Kinect ColorMesh which is dependent on the Kinect API:
        //you can't construct this yourself
        public static CVMesh ConvertToMesh(ColorMesh mesh)
        {
            CVMesh m = new CVMesh();

            m.Colors.AddRange(mesh.GetColors());
            m.Normals.AddRange(mesh.GetNormals());
            m.TriangleIndeces.AddRange(mesh.GetTriangleIndexes());
            m.Vertices.AddRange(mesh.GetVertices());
            return(m);
        }
        /// <summary>
        /// Save mesh in ASCII .PLY file with per-vertex color
        /// </summary>
        /// <param name="mesh">Calculated mesh object</param>
        /// <param name="writer">The text writer</param>
        /// <param name="flipAxes">Flag to determine whether the Y and Z values are flipped on save,
        /// default should be true.</param>
        /// <param name="outputColor">Set this true to write out the surface color to the file when it has been captured.</param>
        public static void SaveAsciiPlyMesh(ColorMesh mesh, TextWriter writer, bool flipAxes, bool outputColor)
        {
            if (null == mesh || null == writer)
            {
                return;
            }

            var vertices = mesh.GetVertices();
            var indices  = mesh.GetTriangleIndexes();
            var colors   = mesh.GetColors();

            // Check mesh arguments
            if (0 == vertices.Count || 0 != vertices.Count % 3 || vertices.Count != indices.Count || (outputColor && vertices.Count != colors.Count))
            {
                throw new ArgumentException(Properties.Resources.InvalidMeshArgument);
            }

            int faces = indices.Count / 3;

            // Write the PLY header lines
            writer.WriteLine("ply");
            writer.WriteLine("format ascii 1.0");
            writer.WriteLine("comment file created by Microsoft Kinect Fusion");

            writer.WriteLine("element vertex " + vertices.Count.ToString(CultureInfo.InvariantCulture));
            writer.WriteLine("property float x");
            writer.WriteLine("property float y");
            writer.WriteLine("property float z");

            if (outputColor)
            {
                writer.WriteLine("property uchar red");
                writer.WriteLine("property uchar green");
                writer.WriteLine("property uchar blue");
            }

            writer.WriteLine("element face " + faces.ToString(CultureInfo.InvariantCulture));
            writer.WriteLine("property list uchar int vertex_index");
            writer.WriteLine("end_header");

            // Sequentially write the 3 vertices of the triangle, for each triangle
            for (int i = 0; i < vertices.Count; i++)
            {
                var vertex = vertices[i];

                string vertexString = vertex.X.ToString(CultureInfo.InvariantCulture) + " ";

                if (flipAxes)
                {
                    vertexString += (-vertex.Y).ToString(CultureInfo.InvariantCulture) + " " + (-vertex.Z).ToString(CultureInfo.InvariantCulture);
                }
                else
                {
                    vertexString += vertex.Y.ToString(CultureInfo.InvariantCulture) + " " + vertex.Z.ToString(CultureInfo.InvariantCulture);
                }

                if (outputColor)
                {
                    int red   = (colors[i] >> 16) & 255;
                    int green = (colors[i] >> 8) & 255;
                    int blue  = colors[i] & 255;

                    vertexString += " " + red.ToString(CultureInfo.InvariantCulture) + " " + green.ToString(CultureInfo.InvariantCulture) + " "
                                    + blue.ToString(CultureInfo.InvariantCulture);
                }

                writer.WriteLine(vertexString);
            }

            // Sequentially write the 3 vertex indices of the triangle face, for each triangle, 0-referenced in PLY files
            for (int i = 0; i < faces; i++)
            {
                string baseIndex0 = (i * 3).ToString(CultureInfo.InvariantCulture);
                string baseIndex1 = ((i * 3) + 1).ToString(CultureInfo.InvariantCulture);
                string baseIndex2 = ((i * 3) + 2).ToString(CultureInfo.InvariantCulture);

                string faceString = "3 " + baseIndex0 + " " + baseIndex1 + " " + baseIndex2;
                writer.WriteLine(faceString);
            }
        }
        /// <summary>
        /// Save mesh in ASCII .PLY file with per-vertex color
        /// </summary>
        /// <param name="mesh">Calculated mesh object</param>
        /// <param name="writer">The text writer</param>
        /// <param name="flipAxes">Flag to determine whether the Y and Z values are flipped on save,
        /// default should be true.</param>
        /// <param name="outputColor">Set this true to write out the surface color to the file when it has been captured.</param>
        public static void SaveAsciiPlyMesh(ColorMesh mesh, TextWriter writer, bool flipAxes, bool outputColor)
        {
            if (null == mesh || null == writer)
            {
                return;
            }

            var vertices = mesh.GetVertices();
            var indices = mesh.GetTriangleIndexes();
            var colors = mesh.GetColors();

            // Check mesh arguments
            if (0 == vertices.Count || 0 != vertices.Count % 3 || vertices.Count != indices.Count || (outputColor && vertices.Count != colors.Count))
            {
                throw new ArgumentException();
            }

            int faces = indices.Count / 3;

            // Write the PLY header lines
            writer.WriteLine("ply");
            writer.WriteLine("format ascii 1.0");
            writer.WriteLine("comment file created by Microsoft Kinect Fusion");

            writer.WriteLine("element vertex " + vertices.Count.ToString(CultureInfo.InvariantCulture));
            writer.WriteLine("property float x");
            writer.WriteLine("property float y");
            writer.WriteLine("property float z");

            if (outputColor)
            {
                writer.WriteLine("property uchar red");
                writer.WriteLine("property uchar green");
                writer.WriteLine("property uchar blue");
            }

            writer.WriteLine("element face " + faces.ToString(CultureInfo.InvariantCulture));
            writer.WriteLine("property list uchar int vertex_index");
            writer.WriteLine("end_header");

            // Sequentially write the 3 vertices of the triangle, for each triangle
            for (int i = 0; i < vertices.Count; i++)
            {
                var vertex = vertices[i];

                string vertexString = vertex.X.ToString(CultureInfo.InvariantCulture) + " ";

                if (flipAxes)
                {
                    vertexString += (-vertex.Y).ToString(CultureInfo.InvariantCulture) + " " + (-vertex.Z).ToString(CultureInfo.InvariantCulture);
                }
                else
                {
                    vertexString += vertex.Y.ToString(CultureInfo.InvariantCulture) + " " + vertex.Z.ToString(CultureInfo.InvariantCulture);
                }

                if (outputColor)
                {
                    int red = (colors[i] >> 16) & 255;
                    int green = (colors[i] >> 8) & 255;
                    int blue = colors[i] & 255;

                    vertexString += " " + red.ToString(CultureInfo.InvariantCulture) + " " + green.ToString(CultureInfo.InvariantCulture) + " "
                                    + blue.ToString(CultureInfo.InvariantCulture);
                }

                writer.WriteLine(vertexString);
            }

            // Sequentially write the 3 vertex indices of the triangle face, for each triangle, 0-referenced in PLY files
            for (int i = 0; i < faces; i++)
            {
                string baseIndex0 = (i * 3).ToString(CultureInfo.InvariantCulture);
                string baseIndex1 = ((i * 3) + 1).ToString(CultureInfo.InvariantCulture);
                string baseIndex2 = ((i * 3) + 2).ToString(CultureInfo.InvariantCulture);

                string faceString = "3 " + baseIndex0 + " " + baseIndex1 + " " + baseIndex2;
                writer.WriteLine(faceString);
            }
        }
Beispiel #5
0
        public void Update(IPluginIO pin, DX11RenderContext context)
        {
            if (!this.FTextureOutput[0].Contains(context))
            {
                this.FTextureOutput[0][context] = new DX11DynamicTexture2D(context, this.width, this.height, SlimDX.DXGI.Format.R8G8B8A8_UNorm);
                this.FPCOut[0][context]         = new DX11DynamicStructuredBuffer <float>(context, 640 * 480 * 6);
            }

            if (this.FInvalidate)
            {
                fixed(int *f = &this.pic[0])
                {
                    IntPtr ptr = new IntPtr(f);

                    this.FTextureOutput[0][context].WriteData(ptr, this.width * this.height * 4);
                }

                /*fixed (float* f = &this.piccloud[0])
                 * {*
                 *  IntPtr ptr = new IntPtr(f);*/

                DX11DynamicStructuredBuffer <float> db = (DX11DynamicStructuredBuffer <float>) this.FPCOut[0][context];

                db.WriteData(this.piccloud);
                //}

                this.FInvalidate = false;
            }

            if (this.FInVoxels[0])
            {
                if (this.FOutVoxels[0].Contains(context))
                {
                    this.FOutVoxels[0].Dispose(context);
                }

                short[] data = new short[this.VoxelResolutionX * this.VoxelResolutionY * this.VoxelResolutionZ];

                this.colorVolume.ExportVolumeBlock(0, 0, 0, this.VoxelResolutionX, this.VoxelResolutionY, this.VoxelResolutionZ, 1, data);

                DX11DynamicStructuredBuffer <int> b = new DX11DynamicStructuredBuffer <int>(context, this.VoxelResolutionX * this.VoxelResolutionY * this.VoxelResolutionZ);

                int[] idata = new int[this.VoxelResolutionX * this.VoxelResolutionY * this.VoxelResolutionZ];

                for (int i = 0; i < this.VoxelResolutionX * this.VoxelResolutionY * this.VoxelResolutionZ; i++)
                {
                    idata[i] = data[i];
                }

                b.WriteData(idata);

                this.FOutVoxels[0][context] = b;
            }

            if (this.FInExport[0])
            {
                if (this.FGeomOut[0].Contains(context))
                {
                    this.FGeomOut[0].Dispose(context);
                }

                if (this.colorVolume != null)
                {
                    ColorMesh m = this.colorVolume.CalculateMesh(this.FInGeomVoxelStep[0]);

                    DX11IndexedGeometry geom = new DX11IndexedGeometry(context);

                    ReadOnlyCollection <int> inds = m.GetTriangleIndexes();

                    DataStream ds = new DataStream(inds.Count * 4, true, true);
                    ds.WriteRange <int>(inds.ToArray());
                    ds.Position = 0;

                    DX11IndexBuffer ibo = new DX11IndexBuffer(context, ds, false, true);

                    ReadOnlyCollection <Microsoft.Kinect.Toolkit.Fusion.Vector3> pos  = m.GetVertices();
                    ReadOnlyCollection <Microsoft.Kinect.Toolkit.Fusion.Vector3> norm = m.GetNormals();
                    ReadOnlyCollection <int> col = m.GetColors();

                    DataStream dsv = new DataStream(Pos3Norm3Vertex.VertexSize * pos.Count, true, true);

                    SlimDX.Vector3 bmin = new SlimDX.Vector3(float.MaxValue, float.MaxValue, float.MaxValue);
                    SlimDX.Vector3 bmax = new SlimDX.Vector3(float.MinValue, float.MinValue, float.MinValue);

                    for (int i = 0; i < pos.Count; i++)
                    {
                        Microsoft.Kinect.Toolkit.Fusion.Vector3 p = pos[i];
                        Microsoft.Kinect.Toolkit.Fusion.Vector3 n = norm[i];

                        dsv.Write <Microsoft.Kinect.Toolkit.Fusion.Vector3>(p);
                        dsv.Write <Microsoft.Kinect.Toolkit.Fusion.Vector3>(n);
                        dsv.Write <int>(col[i]);

                        if (p.X < bmin.X)
                        {
                            bmin.X = p.X;
                        }
                        if (p.Y < bmin.Y)
                        {
                            bmin.Y = p.Y;
                        }
                        if (p.Z < bmin.Z)
                        {
                            bmin.Z = p.Z;
                        }

                        if (p.X > bmax.X)
                        {
                            bmax.X = p.X;
                        }
                        if (p.Y > bmax.Y)
                        {
                            bmax.Y = p.Y;
                        }
                        if (p.Z > bmax.Z)
                        {
                            bmax.Z = p.Z;
                        }
                    }

                    geom.IndexBuffer    = ibo;
                    geom.HasBoundingBox = true;
                    geom.InputLayout    = FusionColoredVertex.Layout;
                    geom.Topology       = SlimDX.Direct3D11.PrimitiveTopology.TriangleList;
                    geom.VertexSize     = FusionColoredVertex.VertexSize;
                    geom.VertexBuffer   = BufferHelper.CreateVertexBuffer(context, dsv, false, true);
                    geom.VerticesCount  = pos.Count;
                    geom.BoundingBox    = new BoundingBox(bmin, bmax);


                    this.FGeomOut[0][context] = geom;

                    m.Dispose();
                }
            }
        }