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(); }
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 ); }
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); }