Ejemplo n.º 1
0
            /// <summary>
            /// ResolvedElement を Part へ分類します。
            /// </summary>
            /// <param name="resolvedElement">分類する ResolvedElement。</param>
            void Classify(ResolvedElement resolvedElement)
            {
                // 対象とする Part のリストを取得します。
                List <Part> partList;

                if (!partListMap.TryGetValue(resolvedElement.Element.MaterialIndex, out partList))
                {
                    partList = new List <Part>();
                    partList.Add(new Part(resolvedElement.Element.MaterialIndex));
                    partListMap[resolvedElement.Element.MaterialIndex] = partList;
                }

                // リストの最後の Part を取得します。
                var part = partList[partList.Count - 1];

                // IndexBuffer の最大サイズを超えるならば、
                // 新たな Part へ Element を追加するようにします。
                // Reach Profile では 16 ビットが最大サイズ (ushort) であり、
                // また、立方体の表現に必要なインデックス数は 36 です。
                if (ushort.MaxValue < (part.ResolvedElements.Count + 1) * 36)
                {
                    part = new Part(resolvedElement.Element.MaterialIndex);
                    partList.Add(part);
                }

                // リストの最後の Part へ Element を追加します。
                part.ResolvedElements.Add(resolvedElement);
            }
Ejemplo n.º 2
0
            /// <summary>
            /// 指定の Element コレクション内について、指定の Element を解析します。
            /// </summary>
            /// <param name="elements">Element コレクション。</param>
            /// <param name="target">解析対象の Element。</param>
            /// <returns>解析結果の ResolvedElement。</returns>
            public static ResolvedElement Resolve(InterElementCollection elements, Element target)
            {
                var resolvedElement = new ResolvedElement(target);

                var targetPosition = target.Position;
                var testPosition   = targetPosition;

                testPosition.X = targetPosition.X + 1;
                resolvedElement.SurfaceVisible[(int)CubeSurfaces.East] = !elements.Contains(testPosition);

                testPosition.X = targetPosition.X - 1;
                resolvedElement.SurfaceVisible[(int)CubeSurfaces.West] = !elements.Contains(testPosition);

                testPosition.X = targetPosition.X;

                testPosition.Y = targetPosition.Y + 1;
                resolvedElement.SurfaceVisible[(int)CubeSurfaces.Top] = !elements.Contains(testPosition);

                testPosition.Y = targetPosition.Y - 1;
                resolvedElement.SurfaceVisible[(int)CubeSurfaces.Bottom] = !elements.Contains(testPosition);

                testPosition.Y = targetPosition.Y;

                testPosition.Z = targetPosition.Z - 1;
                resolvedElement.SurfaceVisible[(int)CubeSurfaces.North] = !elements.Contains(testPosition);

                testPosition.Z = targetPosition.Z + 1;
                resolvedElement.SurfaceVisible[(int)CubeSurfaces.South] = !elements.Contains(testPosition);

                return(resolvedElement);
            }
Ejemplo n.º 3
0
            /// <summary>
            /// Element を分類します。
            /// </summary>
            /// <param name="elements">Element のリスト。</param>
            /// <returns>分類結果を管理する ElementClassifier。</returns>
            public static ElementClassifier Classify(InterElementCollection elements)
            {
                var instance = new ElementClassifier();

                foreach (var element in elements)
                {
                    // 面の結合状態を解析します。
                    var resolvedElement = ResolvedElement.Resolve(elements, element);

                    // 立方体が完全に囲まれているのではないならば分類を開始します。
                    if (!resolvedElement.Enclosed)
                    {
                        instance.Classify(resolvedElement);
                    }
                }

                // Parts プロパティへ全ての Part を追加します。
                foreach (var partList in instance.partListMap.Values)
                {
                    foreach (var part in partList)
                    {
                        instance.Parts.Add(part);
                    }
                }

                return(instance);
            }
Ejemplo n.º 4
0
            /// <summary>
            /// ResolvedElement を Part へ分類します。
            /// </summary>
            /// <param name="resolvedElement">分類する ResolvedElement。</param>
            void Classify(ResolvedElement resolvedElement)
            {
                // 対象とする Part のリストを取得します。
                List<Part> partList;
                if (!partListMap.TryGetValue(resolvedElement.Element.MaterialIndex, out partList))
                {
                    partList = new List<Part>();
                    partList.Add(new Part(resolvedElement.Element.MaterialIndex));
                    partListMap[resolvedElement.Element.MaterialIndex] = partList;
                }

                // リストの最後の Part を取得します。
                var part = partList[partList.Count - 1];

                // IndexBuffer の最大サイズを超えるならば、
                // 新たな Part へ Element を追加するようにします。
                // Reach Profile では 16 ビットが最大サイズ (ushort) であり、
                // また、立方体の表現に必要なインデックス数は 36 です。
                if (ushort.MaxValue < (part.ResolvedElements.Count + 1) * 36)
                {
                    part = new Part(resolvedElement.Element.MaterialIndex);
                    partList.Add(part);
                }

                // リストの最後の Part へ Element を追加します。
                part.ResolvedElements.Add(resolvedElement);
            }
Ejemplo n.º 5
0
            /// <summary>
            /// 指定の Element コレクション内について、指定の Element を解析します。
            /// </summary>
            /// <param name="elements">Element コレクション。</param>
            /// <param name="target">解析対象の Element。</param>
            /// <returns>解析結果の ResolvedElement。</returns>
            public static ResolvedElement Resolve(InterElementCollection elements, Element target)
            {
                var resolvedElement = new ResolvedElement(target);

                var targetPosition = target.Position;
                var testPosition = targetPosition;

                testPosition.X = targetPosition.X + 1;
                resolvedElement.SurfaceVisible[(int) CubeSurfaces.East] = !elements.Contains(testPosition);

                testPosition.X = targetPosition.X - 1;
                resolvedElement.SurfaceVisible[(int) CubeSurfaces.West] = !elements.Contains(testPosition);

                testPosition.X = targetPosition.X;

                testPosition.Y = targetPosition.Y + 1;
                resolvedElement.SurfaceVisible[(int) CubeSurfaces.Top] = !elements.Contains(testPosition);

                testPosition.Y = targetPosition.Y - 1;
                resolvedElement.SurfaceVisible[(int) CubeSurfaces.Bottom] = !elements.Contains(testPosition);

                testPosition.Y = targetPosition.Y;

                testPosition.Z = targetPosition.Z - 1;
                resolvedElement.SurfaceVisible[(int) CubeSurfaces.North] = !elements.Contains(testPosition);

                testPosition.Z = targetPosition.Z + 1;
                resolvedElement.SurfaceVisible[(int) CubeSurfaces.South] = !elements.Contains(testPosition);

                return resolvedElement;
            }