private void BlendShapePanel(ClothSimEntity clothSimEntity)
    {
        m_foldoutStateBlend = EditorGUILayout.BeginFoldoutHeaderGroup(m_foldoutStateBlend, "BlendShapes");
        BlendShapeLoader loader = null;

        if (clothSimEntity.BlendShapeLoader != null)
        {
            loader = clothSimEntity.BlendShapeLoader.GetComponent <BlendShapeLoader>();

            if (GUILayout.Button("Update BlendShapes"))
            {
                if (!clothSimEntity.AllowBlendShapeUpdate)
                {
                    clothSimEntity.Model.SetActive(false);
                    loader.SetBlendShapeActive(true);
                    clothSimEntity.SaveSnapShot();
                    clothSimEntity.AllowBlendShapeUpdate = true;
                }
                else
                {
                    clothSimEntity.Model.SetActive(true);
                    loader.SetBlendShapeActive(false);
                    loader.ClearBlendShapes();
                    clothSimEntity.RestoreSnapShot();
                    clothSimEntity.AllowBlendShapeUpdate = false;
                }
            }

            if (clothSimEntity.AllowBlendShapeUpdate)
            {
                Dictionary <string, float> blendShapeValues = loader.GetBlendShapeValues();
                Dictionary <string, float> newValues        = new Dictionary <string, float>(blendShapeValues);

                foreach (KeyValuePair <string, float> kvp in blendShapeValues)
                {
                    EditorGUILayout.LabelField(kvp.Key);
                    newValues[kvp.Key] = EditorGUILayout.Slider(kvp.Value, 0.0f, 1.0f);
                }

                loader.SetBlendShapeValues(newValues);
            }

            EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        }
        EditorGUILayout.EndFoldoutHeaderGroup();
    }
    public override void OnInspectorGUI()
    {
        DynamicCollisionComponent dynamicCollision = (DynamicCollisionComponent)target;
        ClothSimEntity            clothSimEntity   = dynamicCollision.ClothSimEntity;
        CollisionInfoDefinition   collisionInfo    = dynamicCollision.CollisionInfo.CollisionInfoDefinition;

        collisionInfo.Name     = EditorGUILayout.TextField("Name", collisionInfo.Name);
        collisionInfo.BoneName = EditorGUILayout.TextField("Bone Name", collisionInfo.BoneName);

        int index = options.IndexOf(collisionInfo.CollisionType);

        index = EditorGUILayout.Popup("Collision Type", index, options.ToArray());

        collisionInfo.CollisionType = options[index];

        if (collisionInfo.CollisionType == "capsule")
        {
            collisionInfo.Length = EditorGUILayout.FloatField("Length", collisionInfo.Length);
        }

        collisionInfo.Radius = EditorGUILayout.FloatField("Radius", collisionInfo.Radius);

        collisionInfo.PositionOffset = EditorGUILayout.Vector3Field("Offset", collisionInfo.PositionOffset);

        Vector3 r = collisionInfo.RotationOffset;

        if (r.x > 180.0f)
        {
            r.x -= 360f;
        }
        if (r.y > 180.0f)
        {
            r.y -= 360f;
        }
        if (r.z > 180.0f)
        {
            r.z -= 360f;
        }

        EditorGUILayout.Vector3Field("Rotation", r);

        BlendShapeEditor(clothSimEntity, dynamicCollision, dynamicCollision.CollisionInfo.CollisionInfoDefinition.BodyShapeOffSets);
    }
    private void GenerateBlendShapeOffsetsPanel(ClothSimEntity clothSimEntity)
    {
        m_foldoutStateBlendShapeOffsets = EditorGUILayout.BeginFoldoutHeaderGroup(m_foldoutStateBlendShapeOffsets, "BlendShapes Offsets");
        BlendShapeLoader loader = null;

        if (clothSimEntity.BlendShapeLoader != null)
        {
            loader = clothSimEntity.BlendShapeLoader.GetComponent <BlendShapeLoader>();

            string[] opts = loader.GetBlendShapeValues().Keys.ToArray();

            m_blendShapeIndex = EditorGUILayout.Popup(m_blendShapeIndex, opts);

            if (GUILayout.Button("Generate BlendShape Offsets"))
            {
                clothSimEntity.GenerateParticleOffset(opts[m_blendShapeIndex]);
            }
        }

        EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        EditorGUILayout.EndFoldoutHeaderGroup();
    }
    public override void OnInspectorGUI()
    {
        ClothSimEntity clothSimEntity = (ClothSimEntity)target;
        ClothSimConfig config         = clothSimEntity.ClothConfig;
        Event          currentEvent   = Event.current;

        EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        EditorGUILayout.TextField("Model Path", clothSimEntity.ModelPath);

        ClothSimEntity.Translucient = EditorGUILayout.Vector4Field("Translucient Colour", ClothSimEntity.Translucient);
        ClothSimEntity.Opaque       = EditorGUILayout.Vector4Field("Opaque Colour", ClothSimEntity.Opaque);
        EditorGUILayout.BeginHorizontal();

        if (GUILayout.Button("Browse"))
        {
            Uri absolutePath = new Uri(EditorUtility.OpenFilePanel("Open", "/Resourses/Models", "FBX"));
            Uri assetsPath   = new Uri(Application.dataPath);
            clothSimEntity.ModelPath = assetsPath.MakeRelativeUri(absolutePath).ToString();
        }
        if (GUILayout.Button("Load"))
        {
            clothSimEntity.LoadModel();
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);

        if (config != null)
        {
            config.m_configValues.m_mass            = EditorGUILayout.FloatField("Global Mass", config.m_configValues.m_mass);
            config.m_configValues.m_pullToSkin      = EditorGUILayout.FloatField("Pull To Skin", config.m_configValues.m_pullToSkin);
            config.m_configValues.m_pullToSkinLimit = EditorGUILayout.FloatField("Pull To Skin Limit", config.m_configValues.m_pullToSkinLimit);
            config.m_configValues.m_volumeValue     = EditorGUILayout.FloatField("Volume", config.m_configValues.m_volumeValue);
            config.m_configValues.m_linearDamping   = EditorGUILayout.FloatField("Linear Damping", config.m_configValues.m_linearDamping);
            config.m_configValues.m_colliderRadius  = EditorGUILayout.FloatField("Collider Radius", config.m_configValues.m_colliderRadius);
        }

        DynamicPropertiesDisplay(clothSimEntity);

        EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Load"))
        {
            Uri absolutePath = new Uri(EditorUtility.OpenFilePanel("Open", "/Resourses/Models", "FBX"));
            Uri assetsPath   = new Uri(Application.dataPath);
            clothSimEntity.ModelPath    = assetsPath.MakeRelativeUri(absolutePath).ToString();
            clothSimEntity.m_scriptPath = EditorUtility.OpenFilePanel("Open", "/Assets/Scenes/ClothSimConfig Generator", "lua");
            clothSimEntity.LoadConfiguration();
        }

        if (GUILayout.Button("Save"))
        {
            string savePath = clothSimEntity.m_scriptPath;
            if (!string.IsNullOrEmpty(savePath))
            {
                clothSimEntity.m_outputPath = savePath;
                clothSimEntity.SaveConfiguration();
                EditorUtility.DisplayDialog("Attention", "Config Saved", "Ok");
            }
            else
            {
                clothSimEntity.m_outputPath = EditorUtility.SaveFilePanel("Save", "/Assets/Scenes/ClothSimConfig Generator", "output", "lua");
                clothSimEntity.SaveConfiguration();
            }
        }

        if (GUILayout.Button("SaveAs"))
        {
            clothSimEntity.m_outputPath = EditorUtility.SaveFilePanel("Save", "/Assets/Scenes/ClothSimConfig Generator", "output", "lua");
            clothSimEntity.SaveConfiguration();
        }

        if (GUILayout.Button("Reload"))
        {
            clothSimEntity.LoadConfiguration();
        }

        EditorGUILayout.EndHorizontal();

        if (GUILayout.Button("Generate Collision From Config"))
        {
            clothSimEntity.GenerateCollisionFromConfig();
        }

        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Create New Patricle") || (currentEvent.keyCode == KeyCode.N && currentEvent.type == EventType.KeyUp))
        {
            clothSimEntity.CreateParticle();
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.BeginHorizontal();

        if (GUILayout.Button("Generate From Mesh"))
        {
            Uri absolutePath = new Uri(EditorUtility.OpenFilePanel("Open", "/Resourses/Models", "FBX"));
            Uri assetsPath   = new Uri(Application.dataPath);

            clothSimEntity.GenerateFromMesh(assetsPath.MakeRelativeUri(absolutePath).ToString());
        }
        EditorGUILayout.EndHorizontal();

        BlendShapePanel(clothSimEntity);
        GenerateBlendShapeOffsetsPanel(clothSimEntity);
    }
    private void DynamicPropertiesDisplay(ClothSimEntity clothSimEntity)
    {
        Dictionary <string, DynamicPropertiesDef> dynamicProperties = clothSimEntity.GetConstraintDefinitions();

        string[] options = new string[0];

        if (dynamicProperties.Count > 0)
        {
            options = dynamicProperties.Keys.ToArray();

            m_foldoutState = EditorGUILayout.BeginFoldoutHeaderGroup(m_foldoutState, "DynamicProperties");
            EditorGUILayout.BeginHorizontal();
            int newIndex = EditorGUILayout.Popup(m_currentPropertiesIndex, options, EditorStyles.popup);

            DynamicPropertiesDef def = dynamicProperties[options[m_currentPropertiesIndex]];

            def.RenderColour = EditorGUILayout.ColorField(def.RenderColour);
            EditorGUILayout.EndHorizontal();
            def.Stretch     = EditorGUILayout.FloatField("Stretch", def.Stretch);
            def.Compression = EditorGUILayout.FloatField("Compression", def.Compression);
            def.Push        = EditorGUILayout.FloatField("Push", def.Push);
            def.Damping     = EditorGUILayout.FloatField("Damping", def.Damping);
            def.Elasticity  = EditorGUILayout.FloatField("Elasticity", def.Elasticity);
            def.Inert       = EditorGUILayout.FloatField("Inert", def.Inert);
            def.Amount      = EditorGUILayout.FloatField("Amount", def.Amount);
            def.Priority    = EditorGUILayout.IntField("Priority", def.Priority);

            string[] vertOrders = clothSimEntity.GetVertOrders().Keys.ToArray();

            EditorGUILayout.BeginHorizontal();
            EditorGUILayout.PrefixLabel("VertOrder");
            m_selectedVertOrderIndex = EditorGUILayout.Popup(m_selectedVertOrderIndex, vertOrders);
            def.VertOrder            = vertOrders.Count() > 0 ? vertOrders[m_selectedVertOrderIndex] : "";
            EditorGUILayout.EndHorizontal();

            m_currentPropertiesIndex = (newIndex != m_currentPropertiesIndex) ? newIndex : m_currentPropertiesIndex;
        }

        EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        EditorGUILayout.LabelField("Dynamic Properties");
        EditorGUILayout.BeginHorizontal();
        m_newProperiesName = EditorGUILayout.TextField("Name", m_newProperiesName);
        string errorString = "";

        if (GUILayout.Button("Create"))
        {
            if (dynamicProperties.TryGetValue(m_newProperiesName, out DynamicPropertiesDef propDef))
            {
                errorString = "ERROR: This name already exists. The name needs to be unique.";
            }
            else
            {
                dynamicProperties.Add(m_newProperiesName, new DynamicPropertiesDef());
            }
        }

        if (options.Count() > 0)
        {
            if (GUILayout.Button("Delete"))
            {
                dynamicProperties.Remove(options[m_currentPropertiesIndex]);
            }
        }

        EditorGUILayout.TextField("", errorString);

        EditorGUILayout.EndHorizontal();
        EditorGUILayout.EndFoldoutHeaderGroup();
    }
    private void OnGUI()
    {
        if ((ParticleComponent != null))
        {
            GUILayout.Label("Cloth Simulation Constraints for VertID " + ParticleComponent.name, EditorStyles.boldLabel);
            ClothSimEntity clothSimEntity = ParticleComponent.ClothSimEntity;
            Dictionary <string, DynamicPropertiesDef> constraintProperties = clothSimEntity.GetConstraintDefinitions();
            Event currentEvent = Event.current;

            List <ConstraintInfo> constraintInfo = ParticleComponent.ConstraintParticles;
            List <ConstraintDef>  defs           = ParticleComponent.ParticleInfo.VertInfo.ConstraintsTable.ConstraintsDefs;
            Dictionary <string, DynamicPropertiesDef> dynamicProperties = clothSimEntity.GetConstraintDefinitions();
            List <string> keys    = dynamicProperties.Keys.ToList();
            string[]      options = keys.ToArray();

            int defIndex = 0;
            foreach (ConstraintDef def in defs)
            {
                EditorGUILayout.BeginHorizontal();
                m_selected[defIndex] = EditorGUILayout.Toggle(m_selected[defIndex]);
                int index    = keys.IndexOf(def.ConstraintType);
                int newIndex = EditorGUILayout.Popup(index, options, EditorStyles.popup);

                if (newIndex != index)
                {
                    def.ConstraintType = options[newIndex];
                    DynamicPropertiesDef newDef = constraintProperties[def.ConstraintType];
                    ConstraintInfo       info   = ParticleComponent.ConstraintParticles.FirstOrDefault(c => def.TargetVert == c.ConstraintParticle.ParticleInfo.VertInfo.VertID);
                    info.DynamicProperties = newDef;
                }


                def.TargetVert = EditorGUILayout.IntField("Target Vert ID", def.TargetVert);
                EditorGUILayout.EndHorizontal();

                ++defIndex;
            }

            ParticleComponent.Selected = m_selected;

            EditorGUILayout.BeginHorizontal();
            if (GUILayout.Button("Delete"))
            {
                int         index         = 0;
                List <bool> isSelectedSet = new List <bool>(m_selected);
                foreach (bool isSelected in isSelectedSet)
                {
                    if (isSelected)
                    {
                        ConstraintDef def = defs[index];
                        defs.Remove(def);
                        constraintInfo.Remove(
                            constraintInfo.First(i => i.ConstraintParticle.ParticleInfo.VertInfo.VertID == def.TargetVert));

                        m_selected.RemoveAt(index);
                    }

                    ++index;
                }
            }

            if (GUILayout.Button("Add"))
            {
                foreach (GameObject gameObject in Selection.gameObjects)
                {
                    DynamicParticleComponent dynamicParticle = gameObject.GetComponent <DynamicParticleComponent>();

                    ConstraintDef def = new ConstraintDef
                    {
                        ConstraintType = options.Count() > 0 ? options[0] : "Invalid",
                        TargetVert     = dynamicParticle.ParticleInfo.VertInfo.VertID
                    };

                    defs.Add(def);

                    ConstraintInfo info = new ConstraintInfo
                    {
                        ConstraintParticle = dynamicParticle
                    };

                    if (dynamicProperties.TryGetValue(def.ConstraintType, out DynamicPropertiesDef dynamicPropertiesDef))
                    {
                        info.DynamicProperties = dynamicPropertiesDef;
                    }

                    constraintInfo.Add(info);

                    m_selected.Add(false);
                }
            }

            if (GUILayout.Button("Change"))
            {
                int         index         = 0;
                List <bool> isSelectedSet = new List <bool>(m_selected);
                foreach (bool isSelected in isSelectedSet)
                {
                    if (isSelected)
                    {
                        ConstraintDef  def  = defs[index];
                        ConstraintInfo info = constraintInfo.First(i => i.ConstraintParticle.ParticleInfo.VertInfo.VertID == def.TargetVert);

                        GameObject gameObject = Selection.activeGameObject;

                        DynamicParticleComponent particle = gameObject.GetComponent <DynamicParticleComponent>();

                        def.TargetVert          = particle.ParticleInfo.VertInfo.VertID;
                        info.ConstraintParticle = particle;
                    }

                    ++index;
                }
            }
            EditorGUILayout.EndHorizontal();
        }
    }
    private void BlendShapeEditor(ClothSimEntity clothSimEntity, DynamicCollisionComponent dynamicCollision, CollisionInfoShapeOffsets offsetsTable)
    {
        EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        ShapeRenderer    shapeRenderer    = clothSimEntity.ShapeRenderer.GetComponent <ShapeRenderer>();
        BlendShapeLoader blendShapeLoader = clothSimEntity.BlendShapeLoader.GetComponent <BlendShapeLoader>();

        string[] opts = offsetsTable.BodyShapeOffsets.Keys.ToArray();

        m_currentOffsetsIndex = EditorGUILayout.Popup(m_currentOffsetsIndex, opts);
        Material modelMaterial = clothSimEntity.Model.GetComponentInChildren <SkinnedMeshRenderer>().material;
        bool     isCapsule     = dynamicCollision.CollisionInfo.CollisionInfoDefinition.CollisionType == "capsule";

        if (opts.Count() > 0)
        {
            EditorGUILayout.BeginHorizontal();
            //this is Blah
            if (GUILayout.Button("Edit"))
            {
                if (!m_isEditMode)
                {
                    if (offsetsTable.BodyShapeOffsets.TryGetValue(opts[m_currentOffsetsIndex], out CollisionInfoDefinition outDef))
                    {
                        float radius = dynamicCollision.CollisionInfo.CollisionInfoDefinition.Radius;
                        float length = isCapsule ? dynamicCollision.CollisionInfo.CollisionInfoDefinition.Length : 0.0f;

                        shapeRenderer.Initialise(isCapsule ? Shape.ShapeType.Capsule : Shape.ShapeType.Sphere, dynamicCollision.transform.rotation, dynamicCollision.transform.position, radius, length);
                        blendShapeLoader.ClearBlendShapes();
                        blendShapeLoader.SetBlendShapeActive(true);
                        blendShapeLoader.SetBlendShapeValue(opts[m_currentOffsetsIndex], 1.0f);
                        dynamicCollision.DummyObject.transform.localPosition = outDef.PositionOffset;
                        //dynamicCollision.transform.position = dynamicCollision.DummyObject.transform.position;
                        dynamicCollision.DummyObject.transform.localEulerAngles = outDef.RotationOffset;
                        dynamicCollision.transform.rotation = dynamicCollision.DummyObject.transform.rotation;
                        dynamicCollision.CollisionInfo.CollisionInfoDefinition.Radius = outDef.Radius;

                        if (isCapsule)
                        {
                            dynamicCollision.CollisionInfo.CollisionInfoDefinition.Length = outDef.Length;
                        }

                        modelMaterial.color = ClothSimEntity.Translucient;
                        m_isEditMode        = true;
                    }
                }
                else
                {
                    dynamicCollision.transform.position = shapeRenderer.transform.position;
                    dynamicCollision.transform.rotation = shapeRenderer.transform.rotation;
                    dynamicCollision.CollisionInfo.CollisionInfoDefinition.Length = shapeRenderer.ShapeDefinition.Length;
                    dynamicCollision.CollisionInfo.CollisionInfoDefinition.Radius = shapeRenderer.ShapeDefinition.Radius;

                    shapeRenderer.Clear();
                    m_isEditMode = false;
                    blendShapeLoader.ClearBlendShapes();
                    modelMaterial.color = ClothSimEntity.Opaque;
                }
            }
            EditorGUILayout.EndHorizontal();

            if (m_isEditMode)
            {
                dynamicCollision.DummyObject.transform.localPosition = EditorGUILayout.Vector3Field("Position Offset", dynamicCollision.DummyObject.transform.localPosition);


                Vector3 eulerAngles = dynamicCollision.GetEulerAnglesDegrees(dynamicCollision.DummyObject.transform.localRotation);

                dynamicCollision.DummyObject.transform.localEulerAngles = EditorGUILayout.Vector3Field("Rotation Offset", eulerAngles);

                if (isCapsule)
                {
                    dynamicCollision.CollisionInfo.CollisionInfoDefinition.Length = EditorGUILayout.FloatField("Length", dynamicCollision.CollisionInfo.CollisionInfoDefinition.Length);
                }

                dynamicCollision.CollisionInfo.CollisionInfoDefinition.Radius = EditorGUILayout.FloatField("Radius", dynamicCollision.CollisionInfo.CollisionInfoDefinition.Radius);

                EditorGUILayout.BeginHorizontal();
                if (GUILayout.Button("Save"))
                {
                    CollisionInfoDefinition collisionInfoDefinition = offsetsTable.BodyShapeOffsets[opts[m_currentOffsetsIndex]];

                    collisionInfoDefinition.PositionOffset = dynamicCollision.DummyObject.transform.localPosition;

                    Vector3 saveEulerAngles = dynamicCollision.GetEulerAnglesDegrees(dynamicCollision.DummyObject.transform.localRotation);
                    collisionInfoDefinition.RotationOffset = saveEulerAngles;
                    collisionInfoDefinition.Radius         = dynamicCollision.CollisionInfo.CollisionInfoDefinition.Radius;

                    if (isCapsule)
                    {
                        collisionInfoDefinition.Length = dynamicCollision.CollisionInfo.CollisionInfoDefinition.Length;
                    }

                    //restore the original values.

                    dynamicCollision.CollisionInfo.CollisionInfoDefinition.Radius = shapeRenderer.ShapeDefinition.Radius;
                    dynamicCollision.CollisionInfo.CollisionInfoDefinition.Length = shapeRenderer.ShapeDefinition.Length;

                    dynamicCollision.transform.position = shapeRenderer.transform.position;
                    dynamicCollision.transform.rotation = shapeRenderer.transform.rotation;

                    shapeRenderer.Clear();
                    blendShapeLoader.ClearBlendShapes();
                    modelMaterial.color = ClothSimEntity.Opaque;
                    m_isEditMode        = false;
                }

                EditorGUILayout.EndHorizontal();
            }
        }

        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Add Offset"))
        {
        }

        if (GUILayout.Button("Remove Offset"))
        {
        }
        EditorGUILayout.EndHorizontal();

        EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
    }
Ejemplo n.º 8
0
    public override void OnInspectorGUI()
    {
        DynamicParticleComponent dynamicParticle = (DynamicParticleComponent)target;
        ClothSimEntity           clothSimEntity  = dynamicParticle.ClothSimEntity;

        VertInfo vertInfo = dynamicParticle.ParticleInfo.VertInfo;

        JointInfoTable.JointInfoDefinition jointInfo = dynamicParticle.ParticleInfo.JointInfo;
        BodyShapeOffSetTable bodyShapesOffsetsTable  = dynamicParticle.ParticleInfo.VertInfo.BodyShapeOffsetTable;

        int vertID = vertInfo.VertID;

        vertInfo.VertID = EditorGUILayout.IntField("Vert ID", vertID);
        dynamicParticle.gameObject.name = vertInfo.VertID != vertID ? "Particle VertID : " + vertInfo.VertID.ToString() : dynamicParticle.gameObject.name;

        vertInfo.MassScale           = EditorGUILayout.FloatField("Mass Scale", vertInfo.MassScale);
        vertInfo.PullToSkinScale     = EditorGUILayout.FloatField("Pull To Skin Scale", vertInfo.PullToSkinScale);
        vertInfo.ColliderRadiusScale = EditorGUILayout.FloatField("Collider Radius Scale", vertInfo.ColliderRadiusScale);
        vertInfo.Position            = EditorGUILayout.Vector3Field("Position", vertInfo.Position);
        vertInfo.IsStatic            = EditorGUILayout.Toggle("Static", vertInfo.IsStatic);

        //update vert id.


        JointInfoDisplay(jointInfo);

        if (GUILayout.Button("Skin Weights Editor"))
        {
        }

        if (GUILayout.Button("Constraints Editor"))
        {
            ClothSimConstraintsEditorWindow constraintsWindow = EditorWindow.GetWindow <ClothSimConstraintsEditorWindow>();
            constraintsWindow.ParticleComponent = dynamicParticle;
            constraintsWindow.Show();
        }

        if (jointInfo == null)
        {
            if (GUILayout.Button("AddJointInfo"))
            {
                JointInfoTable.JointInfoDefinition newJointInfo = new JointInfoTable.JointInfoDefinition();

                clothSimEntity.AddJointInfo(newJointInfo);
                dynamicParticle.ParticleInfo.JointInfo = newJointInfo;
            }
        }
        else
        {
            if (GUILayout.Button("RemoveJointInfo"))
            {
                clothSimEntity.RemoveJointInfo(jointInfo);
                dynamicParticle.ParticleInfo.JointInfo = null;
            }
        }

        if (GUILayout.Button("Delete Patricle"))
        {
            clothSimEntity.DeleteParticle(dynamicParticle.gameObject);
        }

        BlendShapeEditor(clothSimEntity, dynamicParticle, dynamicParticle.ParticleInfo.VertInfo.BodyShapeOffsetTable);
    }
Ejemplo n.º 9
0
    private void BlendShapeEditor(ClothSimEntity clothSimEntity, DynamicParticleComponent dynamicParticle, BodyShapeOffSetTable offsetsTable)
    {
        EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
        ShapeRenderer    shapeRenderer    = clothSimEntity.ShapeRenderer.GetComponent <ShapeRenderer>();
        BlendShapeLoader blendShapeLoader = clothSimEntity.BlendShapeLoader.GetComponent <BlendShapeLoader>();

        string[] opts = offsetsTable.Definitions.Keys.ToArray();

        m_currentOffsetsIndex = EditorGUILayout.Popup(m_currentOffsetsIndex, opts);
        Material modelMaterial = clothSimEntity.Model.GetComponentInChildren <SkinnedMeshRenderer>().material;

        //this is Blah
        if (opts.Count() > 0)
        {
            EditorGUILayout.BeginHorizontal();
            if (GUILayout.Button("Edit"))
            {
                if (!m_isEditMode)
                {
                    if (offsetsTable.Definitions.TryGetValue(opts[m_currentOffsetsIndex], out Vector3 outVector))
                    {
                        float radius      = dynamicParticle.ParticleInfo.ConfigValues.m_colliderRadius;
                        float radiusScale = dynamicParticle.ParticleInfo.VertInfo.ColliderRadiusScale;
                        shapeRenderer.Initialise(Shape.ShapeType.Sphere, dynamicParticle.transform.rotation, dynamicParticle.transform.position, radius * radiusScale);
                        blendShapeLoader.ClearBlendShapes();
                        blendShapeLoader.SetBlendShapeActive(true);
                        blendShapeLoader.SetBlendShapeValue(opts[m_currentOffsetsIndex], 1.0f);
                        dynamicParticle.transform.position = outVector;
                        modelMaterial.color = ClothSimEntity.Translucient;

                        m_isEditMode = true;
                    }
                }
                else
                {
                    dynamicParticle.transform.position = shapeRenderer.transform.position;
                    shapeRenderer.Clear();
                    m_isEditMode = false;
                    blendShapeLoader.ClearBlendShapes();
                    modelMaterial.color = ClothSimEntity.Opaque;
                }
            }
            EditorGUILayout.EndHorizontal();

            if (m_isEditMode)
            {
                EditorGUILayout.BeginHorizontal();
                dynamicParticle.transform.position = EditorGUILayout.Vector3Field("Position", dynamicParticle.transform.position);

                if (GUILayout.Button("Save"))
                {
                    offsetsTable.Definitions[opts[m_currentOffsetsIndex]] = dynamicParticle.transform.position;
                    dynamicParticle.transform.position = shapeRenderer.transform.position;

                    shapeRenderer.Clear();
                    blendShapeLoader.ClearBlendShapes();
                    modelMaterial.color = ClothSimEntity.Opaque;
                    m_isEditMode        = false;
                }

                EditorGUILayout.EndHorizontal();
            }
        }


        EditorGUILayout.BeginHorizontal();
        if (GUILayout.Button("Add Offset"))
        {
        }

        if (GUILayout.Button("Remove Offset"))
        {
        }
        EditorGUILayout.EndHorizontal();
        EditorGUILayout.LabelField("", GUI.skin.horizontalSlider);
    }