Beispiel #1
0
        private IGuideModel GetGuideModel()
        {
            IGuideModel guideEvaluator = this.map == null ? null : this.map.GetGuideModel();

            guideEvaluator = guideEvaluator == null ? new CPNGuideEvaluator() : guideEvaluator;
            return(guideEvaluator);
        }
Beispiel #2
0
        void WriteEdgesNormals(OutputMesh mesh)
        {
            IGuideModel guideEvaluator = GetGuideModel();

            CPNGuide[] guides    = this.tessellationOutput.GetGuides();
            int        edgesSize = subSet == null?curvedPolygonsNet.GetEdgesCount() : subSet.edges.Length;

            for (int i = 0; i < edgesSize; i++)
            {
                int index = subSet == null ? i : subSet.edges[i];
                if (guides[index].GetN() > 0)
                {
                    guideEvaluator.EvaluateNormals(mesh, guides[index]);
                }
            }
        }
Beispiel #3
0
        int WriteEdges(OutputMesh mesh, int position)
        {
            IGuideModel guideEvaluator = GetGuideModel();
            int         edgesSize      = subSet == null?curvedPolygonsNet.GetEdgesCount() : subSet.edges.Length;

            CPNGuide[] guides       = this.tessellationOutput.GetGuides();
            int[]      edgesProfile = this.tessellationOutput.GetEdgesProfile();

            for (int i = 0; i < edgesSize; i++)
            {
                int      index    = subSet == null ? i : subSet.edges[i];
                CPNGuide polyline = guides[index];
                if (polyline.GetN() > 0)
                {
                    short[] edge        = curvedPolygonsNet.GetEdges(/* i */);
                    int     edgeLength  = curvedPolygonsNet.GetEdgeLength(index);
                    float[] edgeWeights = curvedPolygonsNet.GetEdgeWeights(/* i */);
                    short[] edgeHints   = curvedPolygonsNet.GetEdgeHints(/* i */);

                    int edgePosition = curvedPolygonsNet.GetEdgePosition(index);

                    guideEvaluator.EvaluateEdge(curvedPolygonsNet, mesh, polyline, (short)edgeLength, edge, edgePosition,
                                                edgeHints, edgeWeights,
                                                edgesProfile, index);
                    position += polyline.GetN() - 1;
                }
            }

            edgesSize = curvedPolygonsNet.GetEdgesCount();
            int polylinesSize = subSet == null?curvedPolygonsNet.GetPolylinesCount() : subSet.polylines.Length;

            //No need to compute polylines
            for (int i = 0; i < polylinesSize; i++)
            {
                int index = subSet == null ? i : subSet.edges[i];
                index += edgesSize;
                CPNGuide polyline = guides[index];
                guideEvaluator.EvaluatePolyline(curvedPolygonsNet, mesh, polyline);
            }
            return(position);
        }
Beispiel #4
0
        void ExtractEdgesProfile()
        {
            IGuideModel guideEvaluator = GetGuideModel();

            int edgesSize     = curvedPolygonsNet.GetEdgesCount();
            int polylinesSize = curvedPolygonsNet.GetPolylinesCount();

            int totalESize = edgesSize + polylinesSize;

            CPNGuide[] guides            = this.tessellationOutput.InitGuides(totalESize);
            int[]      edgesProfile      = this.tessellationOutput.InitEdgesProfile(totalESize * 4);
            int        builtVerticesSize = this.tessellationOutput.GetBuiltVerticesSize();

            for (int i = 0; i < edgesSize; i++)
            {
                short[] edge       = curvedPolygonsNet.GetEdges(/* i */);
                int     edgeLength = curvedPolygonsNet.GetEdgeLength(i);
                short[] edgeHints  = curvedPolygonsNet.GetEdgeHints(/* i */);

                int edgesIndex = curvedPolygonsNet.GetEdgePosition(i);

                int size = guideEvaluator.GetCurveTessellationSteps(edgeLength, edge, edgeHints,
                                                                    edgesProfile, i);

                int index      = (i) << 2;
                int n          = edgesProfile[index + 3];
                int firstIndex = edgesIndex;
                int lastIndex  = edgeLength == 2 ? (firstIndex + 1) : (firstIndex + 3);
                edgesProfile[index]     = edge[firstIndex];
                edgesProfile[index + 1] = edge[lastIndex];
                edgesProfile[index + 2] = builtVerticesSize;
                if (n > 0)
                {
                    builtVerticesSize += n - 1;
                }
                CPNGuide polyline = new CPNGuide(edgesProfile, i, size);

                guides[i] = polyline;
            }

            for (int i = 0; i < polylinesSize; i++)
            {
                short[] polylines      = curvedPolygonsNet.GetPolylines();
                int     polylineLength = curvedPolygonsNet.GetPolylineLength(i);

                int polylineIndex = curvedPolygonsNet.GetPolylinePosition(i);

                int index = (i + edgesSize) << 2;
                int n     = polylineLength;//
                edgesProfile[index + 3] = n - 1;
                int firstIndex = polylineIndex;
                int lastIndex  = polylineIndex + polylineLength - 1;
                edgesProfile[index]     = polylines[firstIndex];
                edgesProfile[index + 1] = polylines[lastIndex];
                edgesProfile[index + 2] = polylines[firstIndex + 1];
                CPNGuide guide = new CPNGuide();
                guide.SetPolyline(polylineIndex, polylines, polylineLength);
                guides[i + edgesSize] = guide;
            }

            this.tessellationOutput.SetBuiltVerticesSize(builtVerticesSize);
        }