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); }
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); }
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); }
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); } }