Example #1
0
    void runComputeShader(ref Vector3[] in_points, ref Vector3[] in_normals)
    {
        int num_points = in_points.Length;

        //reserve memory
        points        = new ComputeBuffer(num_points, 12); //stride in number of bytes of each element
        normals       = new ComputeBuffer(num_points, 12);
        triangles     = new ComputeBuffer(num_points * 3, 36);
        base_triangle = new ComputeBuffer(1, 64);

        //fill data
        points.SetData(in_points);
        normals.SetData(in_normals);
        triangles.SetData(new Triangle[num_points]);  //CompShader will write the values

        BaseTriangle[] tmp = new BaseTriangle[1];
        tmp[0] = baseTriValues;
        base_triangle.SetData(tmp);

        //attach buffers to CompShader (uniforms)
        int kernel = cs_create_triangles.FindKernel("CreateTriangles");  //CompShader can have several main functions

        cs_create_triangles.SetBuffer(kernel, "points", points);
        cs_create_triangles.SetBuffer(kernel, "normals", normals);
        cs_create_triangles.SetBuffer(kernel, "triangles", triangles);
        cs_create_triangles.SetBuffer(kernel, "base_triangle", base_triangle);

        //dispatch (Ensure you have enough threads)
        const int thread_group_size_x = 32;  //the same in the compshader file
        int       n_groups            = (num_points / thread_group_size_x);

        cs_create_triangles.Dispatch(kernel, n_groups, 1, 1);

        //TODO: take into account the not included points
    }
        private void button1_Click(object sender, EventArgs e)
        {
            BaseShape f = null;

            switch (comboBox1.SelectedIndex)
            {
            case 0:
                f = new BaseTriangle(float.Parse(txtWidth.Text), float.Parse(txtHeight.Text));
                break;

            case 1:
                f = new BaseRectangle(float.Parse(txtWidth.Text), float.Parse(txtHeight.Text));
                break;

            case 2:
                f = new BaseSector(float.Parse(txtWidth.Text), int.Parse(txtHeight.Text));
                break;

            default:
                break;
            }

            var p = new ConcreteParameters(float.Parse(txtX.Text), float.Parse(txtY.Text), int.Parse(txtAngle.Text));
            var c = new ConcreteShape(f, p);

            ResultLabel.Text = c.ToString() + "\n" + c.GetMaxDistance(new PointF(0, 0)).ToString();
        }
Example #3
0
 void createBaseTriangle()  //called only at Start function
 {
     baseTriValues = new BaseTriangle(
         new Vector4(0.0f, 0.0f, 0.0f, 1.0f),
         new Vector4(0.03f * 1.75f, 0.0f, 0.0f, 1.0f),
         new Vector4(0.015f * 1.75f, 0.0259807621135332f * 1.75f, 0.0f, 1.0f),
         new Vector4(0.0f, 0.0f, -1.0f, 1.0f)  //triangle normal
         );
 }
Example #4
0
        public static BaseTriangle[] LoadObj(string filename)
        {
            //buffers used to make triangles
            List <Vector3>          vertices = new List <Vector3>();
            List <Vector2>          uvs      = new List <Vector2>();
            List <VerticiesUVIndex> indexes  = new List <VerticiesUVIndex>();

            //loading file line by line and parsing
            using (StreamReader sr = new StreamReader(filename))
            {
                string line = String.Empty;            //line buffer

                while ((line = sr.ReadLine()) != null) //read until end of file
                {
                    //loading line
                    var values = Regex.Split(line, " ");
                    var type   = values[0];

                    //Parser line type
                    switch (type)
                    {
                    case "vt":     //uv
                        uvs.Add(CreateUV(values[1], values[2]));
                        break;

                    case "v":     //Vertex
                        vertices.Add(CreateVertex(values[1], values[2], values[3]));
                        break;

                    case "f":     //face
                        indexes.Add(CreateIndexes(values[1], values[2], values[3]));
                        break;
                    }
                }
            }

            //make triangle list
            BaseTriangle[] returnList = new BaseTriangle[indexes.Count];

            //for (int i = 0; i < indexes.Count; i++)
            Parallel.For(0, indexes.Count, i =>
            {
                returnList[i] = new BaseTriangle(
                    new TriangleData
                {
                    Vertex1 = vertices[indexes[i].vertexIndex1 - 1],
                    Vertex2 = vertices[indexes[i].vertexIndex2 - 1],
                    Vertex3 = vertices[indexes[i].vertexIndex3 - 1],
                    Uv1     = uvs[indexes[i].uvIndex1 - 1],
                    Uv2     = uvs[indexes[i].uvIndex2 - 1],
                    Uv3     = uvs[indexes[i].uvIndex3 - 1],
                });
            });

            return(returnList);
        }