Exemplo n.º 1
0
        private void InitProfile()
        {
            var profile            = GetProfile();
            var width              = serializedObject.FindProperty("_width").floatValue;
            var prevVect           = serializedObject.FindProperty("_prevVect");
            var rotation           = serializedObject.FindProperty("_rotation");
            var triangulationPath1 = serializedObject.FindProperty("_triangulationPath1");
            var triangulationPath2 = serializedObject.FindProperty("_triangulationPath2");

            var initpoints = new List <Vector3>();

            // Корректируем профиль
            if (profile.arraySize < 3)
            {
                var poly = Geometry.CreatePolygon(3, Axis.Z, 0.5f, 0f);
                for (var i = 0; i < 3; i++)
                {
                    if (profile.arraySize < i + 1)
                    {
                        profile.InsertArrayElementAtIndex(i);
                    }
                    profile.GetArrayElementAtIndex(i).vector3Value = poly[i];
                }
            }
            // Делаем копию профиля
            var initProfile = serializedObject.FindProperty("_initProfile");

            for (var i = 0; i < profile.arraySize; i++)
            {
                if (initProfile.arraySize < i + 1)
                {
                    initProfile.InsertArrayElementAtIndex(i);
                }
                var propSource = profile.GetArrayElementAtIndex(i);
                initProfile.GetArrayElementAtIndex(i).vector3Value = propSource.vector3Value;
                initpoints.Add(propSource.vector3Value);
            }

            // Масштабируем и копируем результат в workProfile
            var workProfile = serializedObject.FindProperty("_workProfile");
            var baseProfile = serializedObject.FindProperty("_baseProfile");
            var workpoints  = Geometry.ScalePoly(initpoints, width);

            for (var i = 0; i < initpoints.Count; i++)
            {
                if (workProfile.arraySize < i + 1)
                {
                    workProfile.InsertArrayElementAtIndex(i);
                }
                if (baseProfile.arraySize < i + 1)
                {
                    baseProfile.InsertArrayElementAtIndex(i);
                }
                workProfile.GetArrayElementAtIndex(i).vector3Value = workpoints[i];
                baseProfile.GetArrayElementAtIndex(i).vector3Value = workpoints[i];
            }
            prevVect.vector3Value    = Vector3.forward;
            rotation.quaternionValue = new Quaternion(0, 0, 0, 1);

            var triangulator = new Triangulator();
            var profile2d    = initpoints.Select(point => (Vector2)point).ToList();
            var path         = triangulator.GetTriangulationIndexes(profile2d);

            for (var i = 0; i < path.Count; i++)
            {
                if (triangulationPath1.arraySize < i + 1)
                {
                    triangulationPath1.InsertArrayElementAtIndex(i);
                }
                if (triangulationPath2.arraySize < i + 1)
                {
                    triangulationPath2.InsertArrayElementAtIndex(i);
                }
                triangulationPath1.GetArrayElementAtIndex(i).vector3Value = path[i];
            }
            CutArray(triangulationPath1, path.Count);
            CutArray(triangulationPath2, path.Count);

            for (var i = triangulationPath1.arraySize - 1; i >= 0; i--)
            {
                var triangle = triangulationPath1.GetArrayElementAtIndex(triangulationPath1.arraySize - 1 - i).vector3Value;
                triangulationPath2.GetArrayElementAtIndex(i).vector3Value = new Vector3(triangle.x, triangle.z, triangle.y);
            }

            // Обрезаем все массивы
            CutArray(profile, initpoints.Count);
            CutArray(initProfile, initpoints.Count);
            CutArray(workProfile, initpoints.Count);
            CutArray(baseProfile, initpoints.Count);
        }