private static Material GetMaterial(int colourId) { var materialExistence = MaterialUtility.CheckIfMaterialExists(colourId); if (materialExistence == MaterialUtility.MaterialExistence.Legacy) { Debug.LogWarning("Legacy material " + colourId); } else if (materialExistence == MaterialUtility.MaterialExistence.None) { Debug.LogError("Missing material " + colourId); } if (materialExistence != MaterialUtility.MaterialExistence.None) { return(MaterialUtility.LoadMaterial(colourId, materialExistence == MaterialUtility.MaterialExistence.Legacy)); } return(null); }
private static void AddPartToBrick(Brick brick, string ldrawID, Matrix4x4 transformation, string materialID, string fullName) { // Report if material is missing. var materialExistence = MaterialUtility.CheckIfMaterialExists(materialID); if (materialExistence == MaterialUtility.MaterialExistence.None) { missingMaterials.Add($"Brick ID {ldrawID}\tMaterial ID {materialID}"); } else if (materialExistence == MaterialUtility.MaterialExistence.Legacy) { legacyMaterials.Add($"Brick ID {ldrawID}\tMaterial ID {materialID}"); } // 1. Peel off anything from 'p' onwards and check if it includes a number. (Pattern constant + pattern sequential #) var patternSplit = Regex.Split(ldrawID, "(p[a-z]*[0-9]*)"); // 2. If something was peeled off, make a note of it. We cannot map the pattern sequential id to a decoration imageId and we also don't know the surfaceName. if (patternSplit.Length > 1) { //Debug.Log("PATTERN: " + patternSplit[0] + patternSplit[1]); missingDecorations.Add($"Brick ID {fullName}"); } // 3. Peel off anything from 'd' onwards and check if it includes a number. (Sticker + sticker number) var stickerSplit = Regex.Split(patternSplit[0], "(d[0-9]+)"); // 4. If something was peeled off, make a note of it. if (stickerSplit.Length > 1) { //Debug.Log("STICKER: " + stickerSplit[0] + stickerSplit[1]); missingStickers.Add($"Brick ID {fullName}"); } // 5. Reassemble remaining id + ".dat" and use as ldrawID. var designID = stickerSplit[0]; ldrawID = designID + ".dat"; // Apply mapping to another designID. if (LDrawBrickToLEGOBrick.ContainsKey(ldrawID)) { designID = LDrawBrickToLEGOBrick[ldrawID]; } // 6. If a mesh does not exist with exact designID, make a note of it and try to peel off any trailing letters. var partExistenceResult = PartUtility.CheckIfPartExists(designID); if (partExistenceResult.existence == PartUtility.PartExistence.None) { var versionSplit = Regex.Split(designID, "([a-z]+)"); designID = versionSplit[0]; // 6b. If there was something to peel off, look again with new designID. if (versionSplit.Length > 1) { partExistenceResult = PartUtility.CheckIfPartExists(designID); if (partExistenceResult.existence == PartUtility.PartExistence.None) { // Missing part. missingParts.Add($"Brick ID {fullName}"); } else { // Changed part. changedParts.Add($"Brick ID {fullName}\tChanges to {designID}"); // Legacy part. if (partExistenceResult.existence == PartUtility.PartExistence.Legacy) { // FIXME Check if colliders and connectivity info are available. legacyParts.Add($"Brick ID {fullName}"); } } } else { // Missing part. missingParts.Add($"Brick ID {fullName}"); } } else if (partExistenceResult.existence == PartUtility.PartExistence.Legacy) { // Legacy part. // FIXME Check if colliders and connectivity info are available. legacyParts.Add($"Brick ID {fullName}"); } // Reconstruct potentially changed ldrawID. ldrawID = designID + ".dat"; // Apply transformation for ldrawID. if (LDrawBrickToTransformation.ContainsKey(ldrawID)) { transformation *= LDrawBrickToTransformation[ldrawID]; } else if (partExistenceResult.existence != PartUtility.PartExistence.None) { missingTransformations.Add($"Brick ID {fullName}"); } var part = new Part() { transformation = transformation, designID = designID, materialID = materialID }; brick.parts.Add(part); // Assign design ID of part to brick. This is incorrect for multi-part bricks but we do not know the correct design ID. brick.designID = designID; }