Ejemplo n.º 1
0
        void AddVegetationItemsToScene(VegetationCell vegetationCell, GameObject parent, VegetationItemInfoPro vegetationItemInfoPro)
        {
            if (!vegetationItemInfoPro.VegetationPrefab)
            {
                return;
            }
            VegetationSystemPro vegetationSystemPro = _sceneVegetationBaker.VegetationSystemPro;

            vegetationSystemPro.SpawnVegetationCell(vegetationCell, vegetationItemInfoPro.VegetationItemID);
            NativeList <MatrixInstance> vegetationInstanceList =
                vegetationSystemPro.GetVegetationItemInstances(vegetationCell, vegetationItemInfoPro.VegetationItemID);

            for (int j = 0; j <= vegetationInstanceList.Length - 1; j++)
            {
                Matrix4x4  vegetationItemMatrix = vegetationInstanceList[j].Matrix;
                Vector3    position             = MatrixTools.ExtractTranslationFromMatrix(vegetationItemMatrix);
                Vector3    scale    = MatrixTools.ExtractScaleFromMatrix(vegetationItemMatrix);
                Quaternion rotation = MatrixTools.ExtractRotationFromMatrix(vegetationItemMatrix);

                GameObject vegetationItem = Instantiate(vegetationItemInfoPro.VegetationPrefab, parent.transform);
                vegetationItem.transform.position   = position;
                vegetationItem.transform.localScale = scale;
                vegetationItem.transform.rotation   = rotation;
                vegetationItem.isStatic             = _sceneVegetationBaker.ExportStatic;
            }
            vegetationCell.ClearCache();
        }
Ejemplo n.º 2
0
        void AddVegetationItemInstanceInfo(GameObject go, Matrix4x4 positionMatrix, VegetationType vegetationType, string vegetationItemID)
        {
            var vegetationItemInstanceInfo = go.AddComponent <VegetationItemInstanceInfo>();

            vegetationItemInstanceInfo.Position = MatrixTools.ExtractTranslationFromMatrix(positionMatrix);
            vegetationItemInstanceInfo.VegetationItemInstanceID = Mathf.RoundToInt(vegetationItemInstanceInfo.Position.x * 100f).ToString() + "_" +
                                                                  Mathf.RoundToInt(vegetationItemInstanceInfo.Position.y * 100f).ToString() + "_" +
                                                                  Mathf.RoundToInt(vegetationItemInstanceInfo.Position.z * 100f).ToString();
            vegetationItemInstanceInfo.Rotation         = MatrixTools.ExtractRotationFromMatrix(positionMatrix);
            vegetationItemInstanceInfo.Scale            = MatrixTools.ExtractScaleFromMatrix(positionMatrix);
            vegetationItemInstanceInfo.VegetationType   = vegetationType;
            vegetationItemInstanceInfo.VegetationItemID = vegetationItemID;
        }
Ejemplo n.º 3
0
        void BakeVegetationItemColliders(ColliderManager colliderManager, VegetationItemInfoPro vegetationItemInfoPro)
        {
            GC.Collect();

            GameObject rootItem = new GameObject("Baked colliders_" + vegetationItemInfoPro.Name + "_" + vegetationItemInfoPro.VegetationItemID);

#if UNITY_EDITOR
            if (!Application.isPlaying)
            {
                EditorUtility.DisplayProgressBar("Bake Collider: " + vegetationItemInfoPro.Name, "Bake cell", 0);
            }
#endif
            int colliderCount = 0;

            for (int i = 0; i <= VegetationSystemPro.VegetationCellList.Count - 1; i++)
            {
                VegetationCell vegetationCell = VegetationSystemPro.VegetationCellList[i];

#if UNITY_EDITOR
                if (i % 10 == 0)
                {
                    if (!Application.isPlaying)
                    {
                        EditorUtility.DisplayProgressBar("Bake Collider: " + vegetationItemInfoPro.Name, "Bake cell " + i + "/" + (VegetationSystemPro.VegetationCellList.Count - 1), i / ((float)VegetationSystemPro.VegetationCellList.Count - 1));
                    }
                }
#endif

                VegetationSystemPro.SpawnVegetationCell(vegetationCell, vegetationItemInfoPro.VegetationItemID);
                NativeList <MatrixInstance> vegetationInstanceList =
                    VegetationSystemPro.GetVegetationItemInstances(vegetationCell, vegetationItemInfoPro.VegetationItemID);

                for (int j = 0; j <= vegetationInstanceList.Length - 1; j++)
                {
                    Matrix4x4  vegetationItemMatrix = vegetationInstanceList[j].Matrix;
                    Vector3    position             = MatrixTools.ExtractTranslationFromMatrix(vegetationItemMatrix);
                    Vector3    scale    = MatrixTools.ExtractScaleFromMatrix(vegetationItemMatrix);
                    Quaternion rotation = MatrixTools.ExtractRotationFromMatrix(vegetationItemMatrix);

                    ItemSelectorInstanceInfo itemSelectorInstanceInfo = new ItemSelectorInstanceInfo
                    {
                        Position = position, Scale = scale, Rotation = rotation
                    };

                    GameObject newCollider = colliderManager.ColliderPool.GetObject(itemSelectorInstanceInfo);
                    newCollider.hideFlags = HideFlags.None;
                    newCollider.transform.SetParent(rootItem.transform, true);
                    SetNavmeshArea(newCollider, vegetationItemInfoPro.NavMeshArea);

                    if (SetBakedCollidersStatic)
                    {
                        SetStatic(newCollider);
                    }

                    if (ConvertBakedCollidersToMesh)
                    {
                        CreateNavMeshColliderMeshes(newCollider);
                    }


                    colliderCount++;
                }

                vegetationCell.ClearCache();
            }

            VegetationSystemPro.ClearCache(vegetationItemInfoPro.VegetationItemID);

#if UNITY_EDITOR
            if (!Application.isPlaying)
            {
                EditorUtility.ClearProgressBar();
            }
#endif

            if (colliderCount == 0)
            {
                DestroyImmediate(rootItem);
            }
        }
Ejemplo n.º 4
0
        void CreateCollider(Matrix4x4 colliderMatrix, VegetationPackage vegetationPackage, int i, int j, bool bakeNavmesh, VegetationCell vegetationCell, GameObject currentParent, VegetationItemInfo vegetationItemInfo, VegetationCellCollider vegetationCellCollider)
        {
            RuntimeObjectInfo runtimeObjectInfo;
            Vector3           vegetationItemScale;

            //TUDO add pool of colliders
            switch (vegetationPackage.VegetationInfoList[i].ColliderType)
            {
            case ColliderType.Capsule:
                GameObject capsuleColliderObject = new GameObject(vegetationCell.CellIndex + " " + vegetationPackage.VegetationInfoList[i].VegetationType + " CapsuleCollider_" + j);

                if (!bakeNavmesh)
                {
                    capsuleColliderObject.hideFlags = HideColliders ? HideFlags.HideAndDontSave : HideFlags.DontSave;
                }
                capsuleColliderObject.layer = GetColliderLayer(vegetationPackage.VegetationInfoList[i].VegetationType);

                vegetationItemScale = MatrixTools.ExtractScaleFromMatrix(colliderMatrix);

                CapsuleCollider capsuleCollider = capsuleColliderObject.AddComponent <CapsuleCollider>();
                capsuleCollider.height    = vegetationPackage.VegetationInfoList[i].ColliderHeight;
                capsuleCollider.radius    = vegetationPackage.VegetationInfoList[i].ColliderRadius;
                capsuleCollider.isTrigger =
                    vegetationPackage.VegetationInfoList[i].ColliderTrigger;
                capsuleColliderObject.transform.SetParent(currentParent.transform, false);
                capsuleColliderObject.transform.position   = MatrixTools.ExtractTranslationFromMatrix(colliderMatrix) + new Vector3(0, (capsuleCollider.height * vegetationItemScale.y) / 2f, 0);
                capsuleColliderObject.transform.rotation   = MatrixTools.ExtractRotationFromMatrix(colliderMatrix);
                capsuleColliderObject.transform.localScale = vegetationItemScale;


                Vector3 colliderOffset =
                    new Vector3(
                        capsuleColliderObject.transform.localScale.x *
                        vegetationPackage.VegetationInfoList[i].ColliderOffset.x,
                        capsuleColliderObject.transform.localScale.y *
                        vegetationPackage.VegetationInfoList[i].ColliderOffset.y,
                        capsuleColliderObject.transform.localScale.z *
                        vegetationPackage.VegetationInfoList[i].ColliderOffset.z);
                capsuleColliderObject.transform.localPosition += MatrixTools.ExtractRotationFromMatrix(colliderMatrix) * colliderOffset;

                if (!bakeNavmesh)
                {
                    AddNavMesObstacle(capsuleColliderObject, vegetationItemInfo);
                    AddVegetationItemInstanceInfo(capsuleColliderObject, colliderMatrix,
                                                  vegetationItemInfo.VegetationType,
                                                  vegetationItemInfo.VegetationItemID);
                    vegetationCellCollider.ColliderList.Add(capsuleColliderObject);
                    runtimeObjectInfo =
                        capsuleColliderObject.AddComponent <RuntimeObjectInfo>();
                    runtimeObjectInfo.VegetationItemInfo =
                        vegetationPackage.VegetationInfoList[i];
                    if (OnCreateColliderDelegate != null)
                    {
                        OnCreateColliderDelegate(capsuleCollider);
                    }
                }
                break;

            case ColliderType.Sphere:
                GameObject sphereColliderObject = new GameObject(vegetationCell.CellIndex.ToString() + " " + vegetationPackage.VegetationInfoList[i].VegetationType.ToString() + " SphereCollider_" + j.ToString());
                if (!bakeNavmesh)
                {
                    sphereColliderObject.hideFlags = HideColliders ? HideFlags.HideAndDontSave : HideFlags.DontSave;
                }

                sphereColliderObject.layer = GetColliderLayer(vegetationPackage.VegetationInfoList[i].VegetationType);

                vegetationItemScale = MatrixTools.ExtractScaleFromMatrix(colliderMatrix);

                SphereCollider sphereCollider = sphereColliderObject.AddComponent <SphereCollider>();
                sphereCollider.radius    = vegetationPackage.VegetationInfoList[i].ColliderRadius;
                sphereCollider.isTrigger =
                    vegetationPackage.VegetationInfoList[i].ColliderTrigger;
                sphereColliderObject.transform.SetParent(currentParent.transform, false);
                sphereColliderObject.transform.position =
                    MatrixTools.ExtractTranslationFromMatrix(colliderMatrix);    // + vegetationPackage.VegetationInfoList[i].ColliderOffset;
                sphereColliderObject.transform.rotation   = MatrixTools.ExtractRotationFromMatrix(colliderMatrix);
                sphereColliderObject.transform.localScale = vegetationItemScale;

                Vector3 sphereColliderOffset =
                    new Vector3(
                        sphereColliderObject.transform.localScale.x *
                        vegetationPackage.VegetationInfoList[i].ColliderOffset.x,
                        sphereColliderObject.transform.localScale.y *
                        vegetationPackage.VegetationInfoList[i].ColliderOffset.y,
                        sphereColliderObject.transform.localScale.z *
                        vegetationPackage.VegetationInfoList[i].ColliderOffset.z);
                sphereColliderObject.transform.localPosition += MatrixTools.ExtractRotationFromMatrix(colliderMatrix) * sphereColliderOffset;

                if (!bakeNavmesh)
                {
                    AddNavMesObstacle(sphereColliderObject, vegetationItemInfo);
                    AddVegetationItemInstanceInfo(sphereColliderObject, colliderMatrix,
                                                  vegetationItemInfo.VegetationType,
                                                  vegetationItemInfo.VegetationItemID);
                    vegetationCellCollider.ColliderList.Add(sphereColliderObject);
                    runtimeObjectInfo =
                        sphereColliderObject.AddComponent <RuntimeObjectInfo>();
                    runtimeObjectInfo.VegetationItemInfo =
                        vegetationPackage.VegetationInfoList[i];
                    if (OnCreateColliderDelegate != null)
                    {
                        OnCreateColliderDelegate(sphereCollider);
                    }
                }

                break;

            case ColliderType.CustomMesh:
            case ColliderType.Mesh:
                GameObject meshColliderObject = new GameObject(vegetationCell.CellIndex.ToString() + " " + vegetationPackage.VegetationInfoList[i].VegetationType.ToString() + " MeshCollider_" + j.ToString());
                if (!bakeNavmesh)
                {
                    meshColliderObject.hideFlags = HideColliders ? HideFlags.HideAndDontSave : HideFlags.DontSave;
                }
                meshColliderObject.layer = GetColliderLayer(vegetationPackage.VegetationInfoList[i].VegetationType);
                MeshCollider            meshCollider            = meshColliderObject.AddComponent <MeshCollider>();
                VegetationItemModelInfo vegetationItemModelInfo = VegetationSystem.GetVegetationModelInfo(i);
                meshCollider.sharedMesh = vegetationItemInfo.ColliderType == ColliderType.CustomMesh ? vegetationItemInfo.ColliderMesh : vegetationItemModelInfo.VegetationMeshLod0;

                meshColliderObject.transform.SetParent(currentParent.transform, false);
                meshColliderObject.transform.position =
                    MatrixTools.ExtractTranslationFromMatrix(colliderMatrix);// + vegetationPackage.VegetationInfoList[i].ColliderOffset;
                meshColliderObject.transform.rotation   = MatrixTools.ExtractRotationFromMatrix(colliderMatrix);
                meshColliderObject.transform.localScale = MatrixTools.ExtractScaleFromMatrix(colliderMatrix);

                if (!bakeNavmesh)
                {
                    AddNavMesObstacle(meshColliderObject, vegetationItemInfo);
                    AddVegetationItemInstanceInfo(meshColliderObject, colliderMatrix,
                                                  vegetationItemInfo.VegetationType,
                                                  vegetationItemInfo.VegetationItemID);
                    vegetationCellCollider.ColliderList.Add(meshColliderObject);
                    runtimeObjectInfo = meshColliderObject.AddComponent <RuntimeObjectInfo>();
                    runtimeObjectInfo.VegetationItemInfo = vegetationPackage.VegetationInfoList[i];
                    if (OnCreateColliderDelegate != null)
                    {
                        OnCreateColliderDelegate(meshCollider);
                    }
                }
                break;
            }
        }
        public void AddQuad(Matrix4x4 matrix, Vector3 terrainPosition, float boundsYExtent)
        {
            QuadCount++;

            //Vector3 position = MatrixTools.ExtractTranslationFromMatrix(matrix);
            Vector3 scale = MatrixTools.ExtractScaleFromMatrix(matrix) / 2f;

            Vector3    position = MatrixTools.ExtractTranslationFromMatrix(matrix) + new Vector3(0, boundsYExtent * scale.y * 2, 0);
            Quaternion rotation = MatrixTools.ExtractRotationFromMatrix(matrix);

            //Vector3 scale = MatrixTools.ExtractScaleFromMatrix(matrix);


            _vertices.Add(position);
            _vertices.Add(position);
            _vertices.Add(position);
            _vertices.Add(position);

            _normals.Add(_srcVerts[0]);
            _normals.Add(_srcVerts[1]);
            _normals.Add(_srcVerts[2]);
            _normals.Add(_srcVerts[3]);

            _uvs.Add(_srcUVs[0]);
            _uvs.Add(_srcUVs[1]);
            _uvs.Add(_srcUVs[2]);
            _uvs.Add(_srcUVs[3]);

            //Vector2 rotationTint;
            //rotationTint.x = rotation.eulerAngles.y / 360f; // rotation from 0.....1
            //rotationTint.y = 5f;// .7f + Random.value * .6f; // color.rgb * rotation.y
            var rotationVector = new UnityEngine.Vector2((360f - rotation.eulerAngles.y) / 360f, 1f);

            _uv2S.Add(rotationVector);
            _uv2S.Add(rotationVector);
            _uv2S.Add(rotationVector);
            _uv2S.Add(rotationVector);
            //_uv2S.Add(new Vector2(rotation.eulerAngles.y / 360f, 1f));
            //_uv2S.Add(new Vector2(rotation.eulerAngles.y / 360f, 1f));
            //_uv2S.Add(new Vector2(rotation.eulerAngles.y / 360f, 1f));
            //_uv2S.Add(new Vector2(rotation.eulerAngles.y / 360f, 1f));

            UnityEngine.Vector2 scaleAndVFix;

            scaleAndVFix.x = VegetationItemSize * scale.x * 2f; // Random.Range(10f, 15f); // quad scale
            scaleAndVFix.y = -(boundsYExtent * scale.y * 2);    // scaleAndVFix.x * .3f; // vertical max shift on look from top

            _uv3S.Add(scaleAndVFix);
            _uv3S.Add(scaleAndVFix);
            _uv3S.Add(scaleAndVFix);
            _uv3S.Add(scaleAndVFix);

            _indices.Add(_srcInds[0] + _vertIndex);
            _indices.Add(_srcInds[1] + _vertIndex);
            _indices.Add(_srcInds[2] + _vertIndex);
            _indices.Add(_srcInds[3] + _vertIndex);
            _indices.Add(_srcInds[4] + _vertIndex);
            _indices.Add(_srcInds[5] + _vertIndex);

            _vertIndex += 4;

            if (_vertices.Count > vertLimit)
            {
                ProcessMesh(terrainPosition, true);
            }
        }
Ejemplo n.º 6
0
        /// <summary>
        /// BakeVegetationItem will bake all instances of a VegetationItem from the rules to the Persisitent Vegetation Storage. The original rule will set "Include in Terrain" to false.
        /// </summary>
        /// <param name="vegetationItemID"></param>
        public void BakeVegetationItem(string vegetationItemID)
        {
            if (!VegetationSystemPro)
            {
                return;
            }

            if (vegetationItemID == "")
            {
                Debug.Log("vegetationItemID empty");
                return;
            }

            GC.Collect();

            VegetationItemInfoPro vegetationItemInfo = VegetationSystemPro.GetVegetationItemInfo(vegetationItemID);

            vegetationItemInfo.EnableRuntimeSpawn = true;

#if UNITY_EDITOR
            if (!Application.isPlaying)
            {
                EditorUtility.DisplayProgressBar("Bake vegetation item: " + vegetationItemInfo.Name, "Spawn all cells", 0);
            }
#endif

            for (int i = 0; i <= VegetationSystemPro.VegetationCellList.Count - 1; i++)
            {
                VegetationCell vegetationCell = VegetationSystemPro.VegetationCellList[i];

#if UNITY_EDITOR
                if (i % 10 == 0)
                {
                    if (!Application.isPlaying)
                    {
                        EditorUtility.DisplayProgressBar("Bake vegetation item: " + vegetationItemInfo.Name, "Spawn cell " + i + "/" + (VegetationSystemPro.VegetationCellList.Count - 1), i / ((float)VegetationSystemPro.VegetationCellList.Count - 1));
                    }
                }
#endif
                VegetationSystemPro.SpawnVegetationCell(vegetationCell, vegetationItemID);
                NativeList <MatrixInstance> vegetationInstanceList =
                    VegetationSystemPro.GetVegetationItemInstances(vegetationCell, vegetationItemID);

                for (int j = 0; j <= vegetationInstanceList.Length - 1; j++)
                {
                    Matrix4x4 vegetationItemMatrix = vegetationInstanceList[j].Matrix;
                    //AddVegetationItemInstance(vegetationItemID, MatrixTools.ExtractTranslationFromMatrix(vegetationItemMatrix),
                    //    MatrixTools.ExtractScaleFromMatrix(vegetationItemMatrix),
                    //    MatrixTools.ExtractRotationFromMatrix(vegetationItemMatrix), false,0);
                    PersistentVegetationStoragePackage.AddVegetationItemInstance(vegetationCell.Index, vegetationItemID, MatrixTools.ExtractTranslationFromMatrix(vegetationItemMatrix) - VegetationSystemPro.VegetationSystemPosition, MatrixTools.ExtractScaleFromMatrix(vegetationItemMatrix), MatrixTools.ExtractRotationFromMatrix(vegetationItemMatrix), 0, vegetationInstanceList[j].DistanceFalloff);
                }

                vegetationCell.ClearCache();
            }

            VegetationSystemPro.ClearCache(vegetationItemID);
            vegetationItemInfo.EnableRuntimeSpawn = false;
#if UNITY_EDITOR
            if (!Application.isPlaying)
            {
                EditorUtility.ClearProgressBar();
            }
#endif
        }