Exemple #1
0
        /// <summary>
        /// Instansiate new brick in place of all one.
        /// Copy to new brick position, rotation and scale.
        /// Make old brick inactive.
        /// </summary>
        /// <returns>The new brick.</returns>
        /// <param name="newBrickPath">New brick resources path.</param>
        /// <param name="oldBrick">Old brick.</param>
        Brick ChangeBrick(string newBrickPath, AgaQBrick oldBrick)
        {
            var newBrick = BrickBuilder.InstansiateFromResources(newBrickPath);

            if (newBrick == null)
            {
                return(null);
            }

            newBrick.transform.position   = oldBrick.transform.position;
            newBrick.transform.rotation   = oldBrick.transform.rotation;
            newBrick.transform.localScale = oldBrick.transform.localScale;

            if (oldBrick.isDragging && ToolsManager.instance.tool is MoveTool)
            {
                //let exchange bricks in move tool
                (ToolsManager.instance.tool as MoveTool).ChangeBrick(newBrick as DragableBrick);
            }
            else
            {
                oldBrick.gameObject.SetActive(false);
            }

            return(newBrick);
        }
Exemple #2
0
        /// <summary>
        /// Prepare property to display given dimension
        /// </summary>
        /// <param name="brick">Brick.</param>
        /// <param name="index">Property index.</param>
        public override void ConfigureProperty(AgaQBrick brick, int index)
        {
            base.ConfigureProperty(brick, index);

            if (brick.dimensionGroup.dimensions[index].readOnly)
            {
                valueText.gameObject.SetActive(true);
                valueText.text = brick.dimensionParams[index];
                valueDropDown.gameObject.SetActive(false);
            }
            else
            {
                valueText.gameObject.SetActive(false);
                valueDropDown.gameObject.SetActive(true);
                valueDropDown.ClearOptions();
                for (int i = 0; i < values.Length; i++)
                {
                    var option = new Dropdown.OptionData(values[i]);
                    valueDropDown.options.Add(option);
                    if (brick.dimensionParams[index] == values[i])
                    {
                        valueDropDown.value = i;
                    }
                }
            }
        }
Exemple #3
0
        /// <summary>
        /// Change brick dimension.
        /// Undefhood is replacing models.
        /// </summary>
        /// <returns><c>true</c>, if dimension was changed, <c>false</c> otherwise.</returns>
        /// <param name="brick">Brick.</param>
        public bool ChangeDimension(AgaQBrick brick, int propertyIndex, int valueIndex)
        {
            //check if new set of diemnsions is valid
            var values    = brick.dimensionGroup.GetPropertyValues(propertyIndex);
            var newValues = brick.dimensionParams;

            newValues[propertyIndex] = values[valueIndex];
            var brickPath = brick.dimensionGroup.GetBrickPathForValues(newValues);

            if (brickPath == null)
            {
                return(false);
            }

            //change brick
            var newBrick = ChangeBrick(brickPath, brick);

            if (newBrick == null)
            {
                return(false);
            }

            //register history
            if (brick != null)
            {
                HistoryManager.instance.Register(new HistoryNodeDimension(brick.gameObject, newBrick.gameObject));
            }

            //change selection
            SelectionManager.instance.Clear();
            SelectionManager.instance.Add(newBrick as SelectableBrick);

            return(true);
        }
        /// <summary>
        /// Check current brick position. Check if it is valid (all joints fits).
        /// </summary>
        /// <returns><c>true</c>, if position is valid, <c>false</c> otherwise.</returns>
        bool CheckPosition(PossibleJoint possibleJoint)
        {
            var brickJoints = possibleJoint.projectedBrickJoint.joint.parentBrick.joints;

            //Check free joints with another neighbour bricks

            //get bounds
            AgaQBrick brick  = possibleJoint.projectedBrickJoint.joint.parentBrick;
            var       bounds = brick.GetBounds();

            //extend it by joint size
            bounds.Expand(jointColisionDistance * 2);
            //collide with other bricks
            var otherBricks = Physics.OverlapBox(bounds.center, bounds.extents, brick.transform.rotation, 1);

            //check joints at those other bricks
            foreach (var otherBrick in otherBricks)
            {
                if (otherBrick.gameObject == possibleJoint.projectedBrickJoint.joint.parentBrick.gameObject)
                {
                    continue;
                }

                var agaQBrick = otherBrick.GetComponent <AgaQBrick>();
                if (agaQBrick != null && !CheckJoints(brickJoints, agaQBrick.joints))
                {
                    return(false);
                }
            }

            return(true);
        }
Exemple #5
0
        /// <summary>
        /// Prepare property to display given dimension
        /// </summary>
        /// <param name="brick">Brick.</param>
        /// <param name="index">Property index.</param>
        public override void ConfigureProperty(AgaQBrick brick, int index)
        {
            base.ConfigureProperty(brick, index);

            valueToggle.isOn    = brick.dimensionParams[index] == "1";
            valueToggle.enabled = !brick.dimensionGroup.dimensions[index].readOnly;
        }
    void RebuiltGroupData(DimensionGroup group)
    {
        //find all bricks in resources
        var    separator = Path.DirectorySeparatorChar;
        string path      = string.Concat("Assets", separator, "Resources", separator, "AgaQ");
        var    bricks    = AssetDatabase.FindAssets("t:Prefab", new string[] { path });

        //remove all data about bricks in group
        group.bricksInGroup.Clear();

        //iterate over found items an collect data
        foreach (var brickGUID in bricks)
        {
            var        brickPath   = AssetDatabase.GUIDToAssetPath(brickGUID);
            GameObject brickObject = AssetDatabase.LoadAssetAtPath <GameObject>(brickPath);
            AgaQBrick  brickScript = brickObject.GetComponent <AgaQBrick>();
            brickPath = brickPath.Substring(17, brickPath.Length - 17 - 7); //remove trailing path /Assets/Resources/ and extension .prefab

            if (brickScript.dimensionGroup == group)
            {
                brickScript.name = string.Format(group.groupName, brickScript.dimensionParams);

                //add brick to group
                group.bricksInGroup.Add(new DimensionGroupItem(brickPath, brickScript.dimensionParams));
            }
        }

        EditorUtility.SetDirty(target);
    }
Exemple #7
0
        /// <summary>
        /// Build dimencsion properties
        /// </summary>
        /// <param name="brick">Brick.</param>
        public void PrepareProperties(AgaQBrick brick)
        {
            Clear();

            if (brick.dimensionGroup == null)
            {
                return;
            }

            int index = 0;

            foreach (var dimension in brick.dimensionGroup.dimensions)
            {
                GameObject propertyObject;

                if (dimension.paramType == Bricks.DimensionsGroups.DimensionParamType.boolean)
                {
                    propertyObject = Instantiate(DimensionBoolPropertyPrefab);
                }
                else if (dimension.paramType == Bricks.DimensionsGroups.DimensionParamType.floatNumber ||
                         dimension.paramType == Bricks.DimensionsGroups.DimensionParamType.integerNumber)
                {
                    propertyObject = Instantiate(DimensionNumberPropertyPrefab);
                }
                else
                {
                    propertyObject = Instantiate(DimensionStringPropertyPrefab);
                }

                propertyObject.transform.SetParent(transform);
                var propertyScript = propertyObject.GetComponent <InspectorDimensionProperty>();
                propertyScript.ConfigureProperty(brick, index);
                properties.Add(propertyScript);
                index++;
            }

            //load description image
            string imagePath   = brick.dimensionGroup.translationImageResourcePath;
            var    translation = LeanLocalization.GetTranslation(imagePath);

            if (translation != null)
            {
                imagePath = translation.Text;
                if (Application.platform == RuntimePlatform.WindowsPlayer || Application.platform == RuntimePlatform.WindowsEditor)
                {
                    imagePath = imagePath.Replace('/', '\\');
                }

                var sprite = Resources.Load <Sprite>(imagePath);
                if (sprite != null)
                {
                    descriptionImage.SetImage(sprite);
                }
            }
        }
Exemple #8
0
        /// <summary>
        /// Prepare property to display given dimension
        /// </summary>
        /// <param name="brick">Brick.</param>
        /// <param name="index">Property index.</param>
        public virtual void ConfigureProperty(AgaQBrick brick, int index)
        {
            this.brick     = brick;
            groupPropIndex = index;
            values         = brick.dimensionGroup.GetPropertyValues(index);

            //set label
            var    translationKey  = brick.dimensionGroup.dimensions[index].translationLabel;
            var    translation     = LeanLocalization.GetTranslation(translationKey);
            string translatedLabel = translation == null ? translationKey : translation.Text;

            labelText.text = translatedLabel;
        }
        /// <summary>
        /// Prepare property to display given dimension
        /// </summary>
        /// <param name="brick">Brick.</param>
        /// <param name="index">Property index.</param>
        public override void ConfigureProperty(AgaQBrick brick, int index)
        {
            base.ConfigureProperty(brick, index);

            //value
            currentValueIndex = Array.IndexOf(values, brick.dimensionParams[index]);
            valueText.text    = brick.dimensionParams[index];

            //controls
            bool show = !brick.dimensionGroup.dimensions[index].readOnly;

            plusButton.SetActive(show);
            minusButton.SetActive(show);
        }
        /// <summary>
        /// Project joints to screen coordinates.
        /// </summary>
        /// <returns>The joints.</returns>
        /// <param name="brick">AgaQ brick</param>
        public static ProjectedJoint[] ProjectJoints(AgaQBrick brick)
        {
            ProjectedJoint[] brickJoints = new ProjectedJoint[brick.joints.Length];

            //itareate over all joints and move its coordinates to screen space
            int j = 0;

            for (int i = 0; i < brickJoints.Length; i++)
            {
                if (brick.joints[i].other == null)
                {
                    brickJoints[j++] = new ProjectedJoint(ProjectPosition(brick.joints[i].transform.position), brick.joints[i]);
                }
            }

            Array.Resize <ProjectedJoint>(ref brickJoints, j);
            return(brickJoints);
        }
Exemple #11
0
    /// <summary>
    /// Encapsulate all object components into child brick.
    /// </summary>
    void Encapsualte(AgaQBrick brick)
    {
        //create new GameObject
        var childBrick = new GameObject("brick");

        childBrick.transform.SetParent(brick.transform);
        childBrick.transform.localPosition = Vector3.zero;

        //move all children from brick to childBrick
        for (int i = brick.transform.childCount - 1; i >= 0; i--)
        {
            var child = brick.transform.GetChild(i);
            if (child != childBrick.transform)
            {
                child.SetParent(childBrick.transform);
            }
        }

        //move all colliders
        var colliders = brick.GetComponents <Collider>();

        foreach (var collider in colliders)
        {
            ComponentUtility.CopyComponent(collider);
            ComponentUtility.PasteComponentAsNew(childBrick);
            DestroyImmediate(collider);
        }

        //move mesh
        var meshFilter = brick.GetComponent <MeshFilter>();
        var renderer   = brick.GetComponent <MeshRenderer>();

        if (meshFilter != null && renderer != null)
        {
            ComponentUtility.CopyComponent(meshFilter);
            ComponentUtility.PasteComponentAsNew(childBrick);
            ComponentUtility.CopyComponent(renderer);
            ComponentUtility.PasteComponentAsNew(childBrick);
            DestroyImmediate(renderer);
            DestroyImmediate(meshFilter);
        }
    }
        public void BeforeTests()
        {
            GameObject gameObject = new GameObject();

            brick = gameObject.AddComponent <AgaQBrick>();
        }
Exemple #13
0
    public override void OnInspectorGUI()
    {
        serializedObject.Update();
        EditorGUILayout.PropertyField(serializedObject.FindProperty("name"));
        serializedObject.ApplyModifiedProperties();

        //Encapsualte button
        GUILayout.Space(10);
        AgaQBrick brick = target as AgaQBrick;

        if (!brick.gameObject.transform.Find("brick") && GUILayout.Button("Encapsulate"))
        {
            Encapsualte(brick);
        }

        //Group
        GUILayout.Space(10);
        brick.dimensionGroup = EditorGUILayout.ObjectField(brick.dimensionGroup, typeof(DimensionGroup), false) as DimensionGroup;

        DimensionGroup group = brick.dimensionGroup;

        if (group != null)
        {
            //group params
            GUILayout.Space(10);
            GUILayout.BeginVertical();
            int index = 0;

            if (brick.dimensionParams == null || group.dimensions.Length != brick.dimensionParams.Length)
            {
                brick.dimensionParams = new string[group.dimensions.Length];
            }

            foreach (var dimension in group.dimensions)
            {
                GUILayout.BeginHorizontal();

                //label
                GUILayout.Label(dimension.translationLabel);

                //property field
                if (dimension.paramType == DimensionParamType.integerNumber)
                {
                    int val = 0;
                    int.TryParse(brick.dimensionParams[index], out val);
                    val = EditorGUILayout.IntField(val);
                    brick.dimensionParams[index] = val.ToString();
                }

                else if (dimension.paramType == DimensionParamType.floatNumber)
                {
                    float val = 0;
                    float.TryParse(brick.dimensionParams[index], out val);
                    val = EditorGUILayout.FloatField(val);
                    brick.dimensionParams[index] = val.ToString();
                }

                else if (dimension.paramType == DimensionParamType.text)
                {
                    brick.dimensionParams[index] = EditorGUILayout.TextField(brick.dimensionParams[index]);
                }

                else if (dimension.paramType == DimensionParamType.boolean)
                {
                    bool toggleValue    = brick.dimensionParams[index] == "1";
                    bool toggleNewValue = EditorGUILayout.Toggle(toggleValue);
                    brick.dimensionParams[index] = toggleValue ? "1" : "0";
                }

                GUILayout.EndHorizontal();

                index++;
            }
            GUILayout.EndVertical();
        }

        GUILayout.Space(10);
        if (GUILayout.Button("Move colliders"))
        {
            var colliders = brick.gameObject.GetComponentsInChildren <Collider>();
            foreach (var collider in colliders)
            {
                Collider newCollider = brick.gameObject.AddComponent(collider.GetType()) as Collider;
                EditorUtility.CopySerialized(collider, newCollider);

                if (newCollider is BoxCollider)
                {
                    ((BoxCollider)newCollider).center += collider.gameObject.transform.localPosition;
                }

                DestroyImmediate(collider);
            }
        }

        EditorUtility.SetDirty(brick);
    }