-
Notifications
You must be signed in to change notification settings - Fork 7
/
Copy pathPixelGridMeshHelper.cs
67 lines (60 loc) · 2.4 KB
/
PixelGridMeshHelper.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
using System;
using System.Collections.Generic;
using System.Drawing;
using Rhino.Geometry;
using StudioAvw.Voxels.Geometry;
namespace StudioAvw.Voxels.Helper
{
public static class PixelGridMeshHelper
{
public static Mesh GenerateMesh(this PixelGrid2D pixelGrid, Color trueColor, Color falseColor)
{
var m = new Mesh();
var sizeU = pixelGrid.PixelSize[0]/2;
var sizeV = pixelGrid.PixelSize[1]/2;
var pts = new Point3d[] {
new Point3d(-sizeU, -sizeV, 0),
new Point3d(-sizeU, sizeV, 0),
new Point3d(sizeU, sizeV, 0),
new Point3d(sizeU, -sizeV, 0)
};
var pln = pixelGrid.Plane;
for (var i = 0; i < pixelGrid.Count; i++)
{
var pt = pixelGrid.PointAt(i);
pln.Origin = pt;
var p3fs = new List<Point3f>();
foreach (var ptd in pts)
{
var worldpt = pln.PointAt(ptd.X, ptd.Y, ptd.Z);
p3fs.Add(new Point3f((float)worldpt.X, (float)worldpt.Y, (float)worldpt.Z));
}
// try to use unique vertices
var cCount = m.Vertices.Count;
m.Vertices.AddVertices(p3fs);
var iFaceIndex = m.Faces.Count;
var facenormal = Vector3d.CrossProduct(p3fs[1] - p3fs[0], p3fs[2] - p3fs[0]);
if (Vector3d.VectorAngle(facenormal, pln.Normal) > Math.PI / 2)
{
m.Faces.AddFace(cCount + 3, cCount + 2, cCount + 1, cCount);
}
else
{
m.Faces.AddFace(cCount, cCount + 1, cCount + 2, cCount + 3);
}
if (pixelGrid[i] == true)
{
m.VertexColors.Add(trueColor); m.VertexColors.Add(trueColor); m.VertexColors.Add(trueColor); m.VertexColors.Add(trueColor);
}
else
{
m.VertexColors.Add(falseColor); m.VertexColors.Add(falseColor); m.VertexColors.Add(falseColor); m.VertexColors.Add(falseColor);
}
m.FaceNormals.SetFaceNormal(iFaceIndex, pln.Normal);
m.Normals.ComputeNormals();
m.Compact();
}
return m;
}
}
}