Ejemplo n.º 1
0
    public void ApplyBlendOffsets()
    {
        BlendShapeLoader           loader      = BlendShapeLoader.GetComponent <BlendShapeLoader>();
        Dictionary <string, float> blendValues = loader.GetBlendShapeValues();

        foreach (GameObject gameObject in m_particleEntities.Values)
        {
            DynamicParticleComponent particle = gameObject.GetComponent <DynamicParticleComponent>();

            BodyShapeOffSetTable offsetsTable = particle.ParticleInfo.VertInfo.BodyShapeOffsetTable;

            Vector3 offset   = Vector3.zero;
            Vector3 original = m_particleSnapShot[particle.ParticleInfo.VertInfo.VertID];

            offset = original;
            foreach (KeyValuePair <string, Vector3> kvp in offsetsTable.Definitions)
            {
                if (blendValues.TryGetValue(kvp.Key, out float blendValue))
                {
                    offset += Vector3.Lerp(original, kvp.Value, blendValue) - original;
                }
            }
            gameObject.transform.position = offset;
        }

        foreach (GameObject gameObject in m_collisionEntities.Values)
        {
            DynamicCollisionComponent collision    = gameObject.GetComponent <DynamicCollisionComponent>();
            CollisionInfoShapeOffsets offsetsTable = collision.CollisionInfo.CollisionInfoDefinition.BodyShapeOffSets;
        }
    }
Ejemplo n.º 2
0
    public void SaveSnapShot()
    {
        Debug.Assert(m_particleSnapShot.Count() == 0);
        Debug.Assert(m_collisionSnapShot.Count() == 0);

        foreach (GameObject gameObject in m_particleEntities.Values)
        {
            DynamicParticleComponent particle = gameObject.GetComponent <DynamicParticleComponent>();

            m_particleSnapShot.Add(particle.ParticleInfo.VertInfo.VertID, gameObject.transform.position);
        }

        foreach (GameObject gameObject in m_collisionEntities.Values)
        {
            DynamicCollisionComponent collision = gameObject.GetComponent <DynamicCollisionComponent>();
            CollisionInfoDefinition   def       = collision.CollisionInfo.CollisionInfoDefinition;

            m_collisionSnapShot.Add(def.Name, new CollisionSnapShotData
            {
                PositionOffset = def.PositionOffset,
                RotationOffset = def.RotationOffset,
                Length         = def.Length,
                Radius         = def.Radius
            });
        }
    }
Ejemplo n.º 3
0
    public void GenerateParticleOffset(string blendShapeName)
    {
        SkinnedMeshRenderer        skinnedMeshRender = Model.GetComponentInChildren <SkinnedMeshRenderer>();
        BlendShapeLoader           loader            = BlendShapeLoader.GetComponent <BlendShapeLoader>();
        MeshCollider               meshCollider      = loader.CurrentModel.AddComponent <MeshCollider>();
        Dictionary <string, float> blendValues       = loader.GetBlendShapeValues();

        loader.SetBlendShapeValue(blendShapeName, 1.0f);
        Mesh bakedMesh = new Mesh();

        skinnedMeshRender.BakeMesh(bakedMesh);

        meshCollider.sharedMesh = bakedMesh;

        foreach (GameObject gameObject in m_particleEntities.Values)
        {
            DynamicParticleComponent particle = gameObject.GetComponent <DynamicParticleComponent>();
            BodyShapeOffSetTable     offsets  = particle.ParticleInfo.VertInfo.BodyShapeOffsetTable;
            float   colliderRadius            = particle.ParticleInfo.ConfigValues.m_colliderRadius;
            float   colliderRadiusScale       = particle.ParticleInfo.VertInfo.ColliderRadiusScale;
            Vector3 pointOnMesh = meshCollider.ClosestPoint(gameObject.transform.position);
            Vector3 dir         = (pointOnMesh - gameObject.transform.position).normalized;

            Vector3 finalPosition = pointOnMesh + dir * (colliderRadius * colliderRadiusScale);

            offsets.Definitions[blendShapeName] = finalPosition;
        }

        DestroyImmediate(meshCollider);
    }
Ejemplo n.º 4
0
    public void DeleteParticle(GameObject particleObject)
    {
        if (m_particleEntities.ContainsValue(particleObject))
        {
            DynamicParticleComponent particle = particleObject.GetComponent <DynamicParticleComponent>();
            int vertID = particle.ParticleInfo.VertInfo.VertID;
            m_config.RemoveVert(particle.ParticleInfo.VertInfo);
            m_config.RemoveJointInfo(particle.ParticleInfo.JointInfo);

            //we search for any particles that have constraints to this particle.
            List <VertInfo> constrainedParticles = m_config.GetConstrainedParticles(vertID);

            foreach (VertInfo constrainedParticle in constrainedParticles)
            {
                if (m_particleEntities.TryGetValue(constrainedParticle.VertID, out GameObject particleEntity))
                {
                    DynamicParticleComponent p = particleEntity.GetComponent <DynamicParticleComponent>();
                    p.ConstraintParticles.Remove(p.ConstraintParticles.FirstOrDefault(cp => cp.ConstraintParticle.ParticleInfo.VertInfo.VertID == vertID));
                }
            }

            foreach (VertInfo vertInfo in constrainedParticles)
            {
                vertInfo.ConstraintsTable.ConstraintsDefs.Remove(vertInfo.ConstraintsTable.ConstraintsDefs.First(c => c.TargetVert == vertID));
            }

            m_particleEntities.Remove(particle.ParticleInfo.VertInfo.VertID);

            Destroy(particleObject);
        }
    }
Ejemplo n.º 5
0
    public GameObject CreateParticle()
    {
        GameObject rootParticle = GameObject.Find("Particles");

        if (rootParticle == null)
        {
            rootParticle      = new GameObject();
            rootParticle.name = "Particles";
            rootParticle.transform.position = Vector3.zero;
            rootParticle.transform.SetParent(transform);
        }


        GameObject gameObject             = new GameObject();
        DynamicParticleComponent particle = gameObject.AddComponent <DynamicParticleComponent>();

        particle.ParticleInfo = m_config.CreateNewParticle();

        gameObject.name = "Particle VertID : " + particle.ParticleInfo.VertInfo.VertID.ToString();

        particle.ClothSimEntity      = this;
        particle.ConstraintParticles = new List <DynamicParticleComponent.ConstraintInfo>();
        gameObject.transform.parent  = transform;
        m_particleEntities.Add(particle.ParticleInfo.VertInfo.VertID, gameObject);
        gameObject.transform.SetParent(rootParticle.transform);

        return(gameObject);
    }
Ejemplo n.º 6
0
    public void GenerateFromConfig()
    {
        LoadModel();
        name = name + "(" + Path.GetFileName(m_scriptPath) + ")";

        List <ParticleInfo> particleInfo = m_config.GenerateFromConfig();

        GameObject rootParticle = GameObject.Find("Particles");

        if (rootParticle == null)
        {
            rootParticle      = new GameObject();
            rootParticle.name = "Particles";
            rootParticle.transform.position = Vector3.zero;
            rootParticle.transform.SetParent(transform);
        }

        foreach (ParticleInfo info in particleInfo)
        {
            GameObject gameObject             = new GameObject();
            DynamicParticleComponent particle = gameObject.AddComponent <DynamicParticleComponent>();
            gameObject.name = "Particle VertID : " + info.VertInfo.VertID.ToString();

            particle.ClothSimEntity = this;
            particle.ParticleInfo   = info;

            m_particleEntities.Add(info.VertInfo.VertID, gameObject);
            gameObject.transform.SetParent(rootParticle.transform);
        }

        foreach (GameObject gameObject in m_particleEntities.Values)
        {
            DynamicParticleComponent particle         = gameObject.GetComponent <DynamicParticleComponent>();
            ConstraintsTable         constraintsTable = particle.ParticleInfo.VertInfo.ConstraintsTable;

            particle.ConstraintParticles = new List <DynamicParticleComponent.ConstraintInfo>();

            foreach (ConstraintDef def in constraintsTable.ConstraintsDefs)
            {
                GameObject constraintGameObject;

                if (m_particleEntities.TryGetValue(def.TargetVert, out constraintGameObject))
                {
                    DynamicParticleComponent.ConstraintInfo constraintInfo = new DynamicParticleComponent.ConstraintInfo();
                    constraintInfo.ConstraintParticle = constraintGameObject.GetComponent <DynamicParticleComponent>();
                    constraintInfo.DynamicProperties  = m_config.GetDynamicPropertiesDef(def.ConstraintType);

                    particle.ConstraintParticles.Add(constraintInfo);
                }
            }
        }

        GenerateCollisionFromConfig();
    }
Ejemplo n.º 7
0
    public void GenerateFromMesh(string meshPath)
    {
        GameObject meshObject         = AssetDatabase.LoadAssetAtPath <GameObject>(meshPath);
        MeshFilter selectedMeshFilter = meshObject.GetComponent <MeshFilter>();
        Mesh       mesh = selectedMeshFilter.sharedMesh;

        Vector3[] vertices = mesh.vertices;

        for (var i = 0; i < vertices.Length; i++)
        {
            Vector3    pos                    = vertices[i];
            GameObject gameObject             = CreateParticle();
            DynamicParticleComponent particle = gameObject.GetComponent <DynamicParticleComponent>();
            particle.ParticleInfo.VertInfo.Position            = pos;
            particle.ParticleInfo.VertInfo.ColliderRadiusScale = 0.01f;
        }
    }
    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();
        }
    }
Ejemplo n.º 9
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.º 10
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);
    }