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(); }
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; }
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); } }
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); } }
/// <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 }