Beispiel #1
0
        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);
        }
Beispiel #2
0
        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;
        }