void Test()
    {
        var brick = new BrickData();

        brick.design = new BrickDesignData();

        brick.id            = -1;
        brick.materialId    = 102;
        brick.design.id     = 60481;
        brick.design.width  = LXFMLHelper.GetBrickWidth(brick.design.id);
        brick.design.height = LXFMLHelper.GetBrickHeight(brick.design.id);
        brick.design.type   = LXFMLHelper.GetBrickType(brick.design.id);

        brick.position = Vector3.zero;
        brick.scale    = Vector3.one;
        brick.rotation = Quaternion.identity;

        brick.isFlipped = true;

        Render(brick);
    }
示例#2
0
    void CreateNewBrickData()
    {
        BrickData brickData = new BrickData();

        brickData.design = new BrickDesignData();

        brickData.id            = _builder.construction.GetNextBrickId();
        brickData.materialId    = LXFMLHelper.GetColors(draggingScenePart.designId)[0];
        brickData.design.id     = draggingScenePart.designId;
        brickData.design.width  = LXFMLHelper.GetBrickWidth(draggingScenePart.designId);
        brickData.design.height = LXFMLHelper.GetBrickHeight(draggingScenePart.designId);
        brickData.design.type   = LXFMLHelper.GetBrickType(draggingScenePart.designId);

        Vector3 position = draggingScenePart.transform.position;

        //WEIRD HACK...I HAVE TO OFFSET BY HALF A BRICK TO GET THE CORRECT POSITION
        position.z -= LXFMLHelper.kBrickSize.x / 2f;

        brickData.position = position;
        brickData.scale    = Vector3.one;
        brickData.rotation = Quaternion.Euler(0f, -draggingScenePart.transform.rotation.eulerAngles.y, 0f);

        brickData.isFlipped = LXFMLHelper.IsBrickFlipped(brickData);

        _builder.AddBrick(_bricks[-1].transform, brickData);

        draggingScenePart.id = brickData.id;



        _bricks.Remove(-1);

        if (_bricks.ContainsKey(draggingScenePart.id))
        {
            _bricks.Remove(draggingScenePart.id);
        }

        _bricks.Add(draggingScenePart.id, draggingScenePart);
    }
示例#3
0
    public static LXFMLConstruction ParseConstruction(string lxfmlData, ConstructionType pType)
    {
        var construction = GetConstructionByType(pType);

        XmlDocument xmlDoc = new XmlDocument();

        xmlDoc.LoadXml(lxfmlData);

        XmlNodeList nodes = xmlDoc.SelectNodes("LXFML/Bricks/Brick/Part");
        BrickData   brick;

        float minX = float.MaxValue;
        float minY = float.MaxValue;

        List <BrickData> list_tmp = new List <BrickData>();

        foreach (XmlElement node in nodes)
        {
            brick        = new BrickData();
            brick.design = new BrickDesignData();

            brick.id            = int.Parse(node.GetAttribute(kTokenBrickId));
            brick.materialId    = int.Parse(node.GetAttribute(kTokenMaterials).Split(',')[0]);
            brick.design.id     = int.Parse(node.GetAttribute(kTokenDesign));
            brick.design.width  = LXFMLHelper.GetBrickWidth(brick.design.id);
            brick.design.height = LXFMLHelper.GetBrickHeight(brick.design.id);
            brick.design.type   = LXFMLHelper.GetBrickType(brick.design.id);

            Matrix4x4 matrix = LXFMLHelper.GetBrickMatrix((node.FirstChild as XmlElement).GetAttribute(kTokenBrickMatrix));
            brick.position = LXFMLHelper.GetBrickPosition(matrix);

            minX = Mathf.Min(minX, brick.position.x);
            minY = Mathf.Min(minY, brick.position.y);

            brick.scale    = LXFMLHelper.GetBrickScale(matrix);
            brick.rotation = LXFMLHelper.GetBrickRotation(matrix);

            brick.isFlipped = LXFMLHelper.IsBrickFlipped(brick);

            list_tmp.Add(brick);
        }

        if (minX > 0)
        {
            minX = 0;
        }

        if (minY > 0)
        {
            minY = 0;
        }

        //Offset position
        foreach (BrickData b in list_tmp)
        {
//			try
//			{
            var pos = b.position;
            pos.x     -= minX;
            pos.y     -= minY;
            b.position = pos;
            construction.AddBrick(b);
//			}
//			catch(Exception e)
//			{
//				UnityEngine.Debug.LogError(b.position + " " + minX + " " + minY);
//			}
        }

        return(construction);
    }
示例#4
0
    public void ReplacePart(int designId, bool reverse)
    {
        if (selectedPart != null)
        {
            bool currentReversed = !MathUtils.NearEqual(selectedPart.transform.localRotation.eulerAngles.y, LXFMLHelper.GetDefaultRotation(selectedPart.designId));            //(_construction.GetBrick(selectedPart.id));

            int brickId = selectedPart.id;

            //Destroy old one
            Vector3 oldPosition = selectedPart.transform.position;
            _builder.DestroyBrick(selectedPart);
            _bricks.Remove(brickId);


            //Create new one
            BrickData brickData = new BrickData();

            brickData.design = new BrickDesignData();

            brickData.id            = _builder.construction.GetNextBrickId();
            brickData.materialId    = LXFMLHelper.GetColors(designId)[0];
            brickData.design.id     = designId;
            brickData.design.width  = LXFMLHelper.GetBrickWidth(designId);
            brickData.design.height = LXFMLHelper.GetBrickHeight(designId);
            brickData.design.type   = LXFMLHelper.GetBrickType(designId);

            brickData.scale = Vector3.one;

            GameObject newBrick = Instantiate(ConstructionController.Instance.resourcesProvider.GetPrefabForDesign(designId));
            newBrick.transform.SetParent(constructionTarget);
            LegoBrickId newOne = newBrick.GetComponent <LegoBrickId>();
            newOne.id = brickData.id;

            newOne.transform.position = oldPosition;

            Vector3 position = oldPosition;
            //WEIRD HACK...I HAVE TO OFFSET BY HALF A BRICK TO GET THE CORRECT POSITION
            position.z -= LXFMLHelper.kBrickSize.x / 2f;

            brickData.position = position;

            float add = reverse?180:0;

            if (LXFMLHelper.GetBrickOrientation(newOne.designId) == LXFMLHelper.BrickOrientation.NegativeX)
            {
                newOne.transform.localEulerAngles = new Vector3(0, 0f + add, 0);
            }
            else if (LXFMLHelper.GetBrickOrientation(newOne.designId) == LXFMLHelper.BrickOrientation.PositiveX)
            {
                newOne.transform.localEulerAngles = new Vector3(0, 180f + add, 0);
            }
            else if (LXFMLHelper.GetBrickOrientation(newOne.designId) == LXFMLHelper.BrickOrientation.NegativeZ)
            {
                newOne.transform.localEulerAngles = new Vector3(0, 90f + add, 0);
            }
            else if (LXFMLHelper.GetBrickOrientation(newOne.designId) == LXFMLHelper.BrickOrientation.PositiveZ)
            {
                newOne.transform.localEulerAngles = new Vector3(0, 270f + add, 0);
            }


            //TODO : Fix Orientation stuff, it's getting messy...
            if (reverse)
            {
                if (!currentReversed)
                {
                    float xOffset = (brickData.design.width - 1) * LXFMLHelper.kBrickSize.x;
                    if (LXFMLHelper.GetBrickOrientation(newOne.designId) == LXFMLHelper.BrickOrientation.PositiveZ)
                    {
                        newOne.transform.Translate(0f, 0f, xOffset);
                    }
                    else
                    {
                        newOne.transform.Translate(-xOffset, 0f, 0f);
                    }
                    brickData.position = newOne.transform.position;
                }
            }
            else
            {
                if (currentReversed)
                {
                    float xOffset = (brickData.design.width - 1) * LXFMLHelper.kBrickSize.x;
                    if (LXFMLHelper.GetBrickOrientation(newOne.designId) == LXFMLHelper.BrickOrientation.PositiveZ)
                    {
                        newOne.transform.Translate(0f, 0f, xOffset);
                    }
                    else
                    {
                        newOne.transform.Translate(-xOffset, 0f, 0f);
                    }
                    brickData.position = newOne.transform.position;
                }
            }

            brickData.isFlipped = reverse;
            brickData.rotation  = Quaternion.Euler(0f, -newOne.transform.localEulerAngles.y, 0f);

            var renderer = newBrick.GetComponentInChildren <MeshRenderer>();
            renderer.sharedMaterial = ConstructionController.Instance.resourcesProvider.GetMaterial(brickData.materialId);
            selectedPart            = newOne;

            _bricks.Add(newOne.id, newOne);

            _builder.AddBrick(_bricks[newOne.id].transform, brickData);

            UpdateAvailableParts(selectedPart);
            UpdateAvailableColors(selectedPart);
        }
    }