public override async Task <Entity> CreateEntity(EntityHierarchyItemViewModel parent) { var name = ComputeNewName(parent, "Navigation bounding box"); var component = new NavigationBoundingBoxComponent(); Entity result = await CreateEntityWithComponent(name, component); component.Size = new Vector3(1.0f); return(result); }
private void EnsureClonedSceneAndHash() { if (!sceneCloned) { // Hash relevant scene objects if (asset.Scene != null) { string sceneUrl = AttachedReferenceManager.GetUrl(asset.Scene); var sceneAsset = (SceneAsset)AssetFinder.FindAsset(sceneUrl)?.Asset; // Clone scene asset because we update the world transformation matrices clonedSceneAsset = (SceneAsset)AssetCloner.Clone(sceneAsset); // Turn the entire entity hierarchy into a single list var sceneEntities = clonedSceneAsset.Hierarchy.Parts.Select(x => x.Value.Entity).ToList(); sceneHash = 0; foreach (var entity in sceneEntities) { // Collect bounding box entities NavigationBoundingBoxComponent boundingBoxComponent = entity.Get <NavigationBoundingBoxComponent>(); // Collect static collider entities StaticColliderComponent colliderComponent = entity.Get <StaticColliderComponent>(); if (boundingBoxComponent == null && colliderComponent == null) { continue; } // Update world transform entity.Transform.UpdateWorldMatrix(); if (boundingBoxComponent != null) { Vector3 scale; Quaternion rotation; Vector3 translation; boundingBoxComponent.Entity.Transform.WorldMatrix.Decompose(out scale, out rotation, out translation); var boundingBox = new BoundingBox(translation - boundingBoxComponent.Size * scale, translation + boundingBoxComponent.Size * scale); boundingBoxes.Add(boundingBox); // Hash collider for ComputeParameterHash sceneHash = (sceneHash * 397) ^ boundingBox.GetHashCode(); } if (colliderComponent != null) { staticColliderDatas.Add(new StaticColliderData { Component = colliderComponent }); if (colliderComponent.Enabled && !colliderComponent.IsTrigger && ((int)asset.IncludedCollisionGroups & (int)colliderComponent.CollisionGroup) != 0) { // Load collider shape assets since the scene asset is being used, which does not have these loaded by default foreach (var desc in colliderComponent.ColliderShapes) { var shapeAssetDesc = desc as ColliderShapeAssetDesc; if (shapeAssetDesc?.Shape != null) { var assetReference = AttachedReferenceManager.GetAttachedReference(shapeAssetDesc.Shape); PhysicsColliderShape loadedColliderShape; if (!loadedColliderShapes.TryGetValue(assetReference.Url, out loadedColliderShape)) { loadedColliderShape = contentManager.Load <PhysicsColliderShape>(assetReference.Url); loadedColliderShapes.Add(assetReference.Url, loadedColliderShape); // Store where we loaded the shapes from } shapeAssetDesc.Shape = loadedColliderShape; } } } // Hash collider for ComputeParameterHash sceneHash = (sceneHash * 397) ^ Xenko.Navigation.NavigationMeshBuildUtils.HashEntityCollider(colliderComponent, asset.IncludedCollisionGroups); } } } sceneCloned = true; } }