public static void FindModelFile() { var path = EditorUtility.OpenFilePanelWithFilters("Select model file", "Packages/com.unity.lego.modelimporter/Models", new string[] { "All model files", "ldr,io,lxfml,lxf", "LDraw files", "ldr", "Studio files", "io", "LXFML files", "lxfml", "LXF files", "lxf" }); if (path.Length != 0) { lxfml = ReadFileLogic(path); if (lxfml != null) { pivot = Model.Pivot.BottomCenter; filePath = path; importSettings.Clear(); foreach (var group in lxfml.groups) { importSettings.Add(group.number, new ModelGroupImportSettings()); } model = null; group = null; GetWindow <ImportModel>(true, "LEGO Model Importer"); } else { ShowReadError(); } } }
public static void ReimportModelGroup(LXFMLDoc lxfml, ModelGroup group, ModelGroupImportSettings importSettings, bool detectConnectivity = false) { // Assign the new group import settings to the group. group.importSettings = importSettings; // We assume that the group can be found, so reimport it. if (group.processed) { // Remove all processed meshes. var renderers = group.GetComponentsInChildren <MeshRenderer>(); foreach (var renderer in renderers) { // FIXME Destroy the mesh? Prevents undo.. var filter = renderer.GetComponent <MeshFilter>(); //Undo.DestroyObjectImmediate(filter.sharedMesh); if (renderer.GetComponent <ModelGroup>() == null) { // Destroy submesh game objects entirely. Undo.DestroyObjectImmediate(renderer.gameObject); } else { // Destroy mesh related components on group game object. Object.DestroyImmediate(filter); Object.DestroyImmediate(renderer); } } } // FIXME Check if bricks are referenced. // FIXME Check if bricks have custom components attached. // Remove group bricks. var existingBricks = group.GetComponentsInChildren <Brick>(); foreach (var brick in existingBricks) { Undo.DestroyObjectImmediate(brick.gameObject); } var groupLightMapped = group.importSettings.isStatic && group.importSettings.lightmapped; SetStaticAndGIParams(group.gameObject, group.importSettings.isStatic, groupLightMapped); // Move group to origo to ensure that bricks are instantiated in the correct positions. var originalGroupLocalPosition = group.transform.localPosition; var originalGroupLocalRotation = group.transform.localRotation; var originalGroupLocalScale = group.transform.localScale; var originalGroupParent = group.transform.parent; var originalGroupSiblingIndex = group.transform.GetSiblingIndex(); group.transform.SetParent(null); group.transform.localPosition = Vector3.zero; group.transform.localRotation = Quaternion.identity; group.transform.localScale = Vector3.one; // Create dictionary with just this group. var modelGroupImportSettingsDictionary = new DictionaryIntToModelGroupImportSettings(); modelGroupImportSettingsDictionary.Add(group.number, group.importSettings); // Instantiate group bricks. var resultBricks = new Dictionary <int, Brick>(lxfml.bricks.Count); InstantiateModelBricks(lxfml, modelGroupImportSettingsDictionary, ref resultBricks, group.number); // Assign bricks to group. foreach (var brick in resultBricks.Values) { brick.transform.SetParent(group.transform); } ModelGroupUtility.RecomputePivot(group, false, ModelGroupUtility.UndoBehavior.withoutUndo); // Move group back to original location. group.transform.SetParent(originalGroupParent); group.transform.SetSiblingIndex(originalGroupSiblingIndex); group.transform.localPosition = originalGroupLocalPosition; group.transform.localRotation = originalGroupLocalRotation; group.transform.localScale = originalGroupLocalScale; /*if (group.processed) * { * // Process the group again. * // FIXME Is this even a good idea? * if (group.type == GroupType.Environment || group.type == GroupType.Static) * { * Vector2Int vertCount = Vector2Int.zero; * Vector2Int triCount = Vector2Int.zero; * Vector2Int meshCount = Vector2Int.zero; * Vector2Int colliderCount = Vector2Int.zero; * ModelProcessor.ProcessModelGroup(group, ref vertCount, ref triCount, ref meshCount, ref colliderCount); * * Debug.Log($"Process result (before/after):\nVerts {vertCount.x}/{vertCount.y}, tris {triCount.x}/{triCount.y}, meshes {meshCount.x}/{meshCount.y}, colliders {colliderCount.x}/{colliderCount.y}"); * } * }*/ if (detectConnectivity && group.importSettings.connectivity) { var sceneBricks = new HashSet <Brick>(StageUtility.GetCurrentStageHandle().FindComponentsOfType <Brick>()); DetectConnectivity(new HashSet <Brick>(resultBricks.Values), sceneBricks); } EditorUtility.ClearProgressBar(); }
public static void ReimportModelGroup(LXFMLDoc lxfml, ModelGroup group, ModelGroupImportSettings importSettings, bool detectConnectivity = false) { // Assign the new group import settings to the group. group.importSettings = importSettings; // We assume that the group can be found, so reimport it. if (group.processed) { // Remove all processed meshes. var renderers = group.GetComponentsInChildren <MeshRenderer>(); foreach (var renderer in renderers) { // FIXME Destroy the mesh? Prevents undo.. var filter = renderer.GetComponent <MeshFilter>(); //Undo.DestroyObjectImmediate(filter.sharedMesh); if (renderer.GetComponent <ModelGroup>() == null) { // Destroy submesh game objects entirely. Undo.DestroyObjectImmediate(renderer.gameObject); } else { // Destroy mesh related components on group game object. Object.DestroyImmediate(filter); Object.DestroyImmediate(renderer); } } } // FIXME Check if bricks are referenced. // FIXME Check if bricks have custom components attached. // Remove group bricks. var existingBricks = group.GetComponentsInChildren <Brick>(); foreach (var brick in existingBricks) { Undo.DestroyObjectImmediate(brick.gameObject); } var groupLightMapped = group.importSettings.isStatic && group.importSettings.lightmapped; SetStaticAndGIParams(group.gameObject, group.importSettings.isStatic, groupLightMapped); // Move group to origo to ensure that bricks are instantiated in the correct positions. var originalGroupParent = group.transform.parent; var originalGroupSiblingIndex = group.transform.GetSiblingIndex(); group.transform.parent = null; group.transform.localPosition = Vector3.zero; group.transform.localRotation = Quaternion.identity; group.transform.localScale = Vector3.one; // Create dictionary with just this group. var modelGroupImportSettingsDictionary = new DictionaryIntToModelGroupImportSettings(); modelGroupImportSettingsDictionary.Add(group.number, group.importSettings); // Instantiate group bricks. var resultBricks = new Dictionary <int, Brick>(lxfml.bricks.Count); InstantiateModelBricks(lxfml, modelGroupImportSettingsDictionary, ref resultBricks, group.number); // Assign bricks to group. foreach (var brick in resultBricks.Values) { brick.transform.SetParent(group.transform); } // Set parent of group back to original. group.transform.parent = originalGroupParent; group.transform.SetSiblingIndex(originalGroupSiblingIndex); if (detectConnectivity && group.importSettings.connectivity) { var sceneBricks = new HashSet <Brick>(StageUtility.GetCurrentStageHandle().FindComponentsOfType <Brick>()); DetectConnectivity(new HashSet <Brick>(resultBricks.Values), sceneBricks); } EditorUtility.ClearProgressBar(); }