Skip to content

Commit 9f51432

Browse files
committed
fix: face normal vector visualization
1 parent 88a0e43 commit 9f51432

File tree

2 files changed

+61
-2
lines changed

2 files changed

+61
-2
lines changed

source/RevitDevTool/Visualization/Helpers/RenderHelper.cs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -943,4 +943,63 @@ public static void MapNormalVectorsForFaces(RenderingBufferStorage buffer, List<
943943
buffer.IndexBuffer.Unmap();
944944
buffer.VertexFormat = new VertexFormat(buffer.FormatBits);
945945
}
946+
947+
public static void MapNormalArrowVectorsForFaces(RenderingBufferStorage buffer, List<(XYZ Point, XYZ Normal, double Length)> normalData)
948+
{
949+
if (normalData.Count == 0) return;
950+
951+
// Each arrow: 4 vertices (shaft start, shaft end, head left, head right), 3 lines (shaft, left head, right head)
952+
int arrowVertexCount = 4;
953+
int arrowLineCount = 3;
954+
int totalVertexCount = normalData.Count * arrowVertexCount;
955+
int totalLineCount = normalData.Count * arrowLineCount;
956+
957+
buffer.VertexBufferCount = totalVertexCount;
958+
buffer.PrimitiveCount = totalLineCount;
959+
960+
var vertexBufferSizeInFloats = VertexPosition.GetSizeInFloats() * buffer.VertexBufferCount;
961+
buffer.FormatBits = VertexFormatBits.Position;
962+
buffer.VertexBuffer = new VertexBuffer(vertexBufferSizeInFloats);
963+
buffer.VertexBuffer.Map(vertexBufferSizeInFloats);
964+
965+
var vertexStream = buffer.VertexBuffer.GetVertexStreamPosition();
966+
967+
// Store all arrow vertices
968+
foreach (var (point, normal, length) in normalData)
969+
{
970+
var normalized = normal.Normalize();
971+
var origin = point;
972+
var endPoint = origin + normalized * length;
973+
var headSize = length > 1 ? 0.2 : length * 0.2;
974+
var arrowHeadBase = endPoint - normalized * headSize;
975+
var basisVector = Math.Abs(normalized.Z).IsAlmostEqual(1) ? XYZ.BasisY : XYZ.BasisZ;
976+
var perpendicular1 = normalized.CrossProduct(basisVector).Normalize().Multiply(headSize * 0.5);
977+
978+
// 0: origin, 1: endPoint, 2: head left, 3: head right
979+
vertexStream.AddVertex(new VertexPosition(origin));
980+
vertexStream.AddVertex(new VertexPosition(endPoint));
981+
vertexStream.AddVertex(new VertexPosition(arrowHeadBase + perpendicular1));
982+
vertexStream.AddVertex(new VertexPosition(arrowHeadBase - perpendicular1));
983+
}
984+
985+
buffer.VertexBuffer.Unmap();
986+
987+
buffer.IndexBufferCount = totalLineCount * IndexLine.GetSizeInShortInts();
988+
buffer.IndexBuffer = new IndexBuffer(buffer.IndexBufferCount);
989+
buffer.IndexBuffer.Map(buffer.IndexBufferCount);
990+
991+
var indexStream = buffer.IndexBuffer.GetIndexStreamLine();
992+
for (int i = 0; i < normalData.Count; i++)
993+
{
994+
int baseIdx = i * arrowVertexCount;
995+
// Shaft
996+
indexStream.AddLine(new IndexLine(baseIdx + 0, baseIdx + 1));
997+
// Arrow head
998+
indexStream.AddLine(new IndexLine(baseIdx + 1, baseIdx + 2));
999+
indexStream.AddLine(new IndexLine(baseIdx + 1, baseIdx + 3));
1000+
}
1001+
1002+
buffer.IndexBuffer.Unmap();
1003+
buffer.VertexFormat = new VertexFormat(buffer.FormatBits);
1004+
}
9461005
}

source/RevitDevTool/Visualization/Server/FaceVisualizationServer.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -148,8 +148,8 @@ private void MapGeometryBuffer()
148148
// Collect normal data from all faces
149149
var normalData = RenderHelper.CollectFaceNormalData(VisualizeGeometries, _extrusion);
150150

151-
// Map normal vectors
152-
RenderHelper.MapNormalVectorsForFaces(_normalBuffer, normalData);
151+
// Map normal vectors as arrows
152+
RenderHelper.MapNormalArrowVectorsForFaces(_normalBuffer, normalData);
153153
}
154154
catch (Exception ex)
155155
{

0 commit comments

Comments
 (0)