@@ -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}
0 commit comments