public bool Deserialise(Table collisionInfoTable)
    {
        bool success = false;

        foreach (DynValue entry in collisionInfoTable.Values)
        {
            Table entryValue = entry.Table;

            CollisionInfoDefinition def = new CollisionInfoDefinition
            {
                Name           = entryValue.Get("name").String,
                BoneName       = entryValue.Get("joint_name").String,
                CollisionType  = entryValue.Get("collision_type").String,
                Radius         = (float)entryValue.Get("radius").Number,
                PositionOffset = entryValue.Get("translate").ToObject <Vector3>(),

                BodyShapeOffSets = new CollisionInfoShapeOffsets()
            };

            if (def.CollisionType == "capsule")
            {
                def.Length         = (float)entryValue.Get("length").Number;
                def.RotationOffset = entryValue.Get("rotate").ToObject <Vector3>();
            }

            Table bodyShapeOffsetTable = entryValue.Get("body_shape_offset").Table;
            def.BodyShapeOffSets.Deserialise(bodyShapeOffsetTable);

            CollisionInfoList.Add(def);
        }

        success = true;
        return(success);
    }
Example #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
            });
        }
    }
    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);
    }
        public bool Serialise(ref StringBuilder stringBuilder)
        {
            bool success = false;

            stringBuilder.Append("            body_shape_offset = {\n");

            foreach (KeyValuePair <string, CollisionInfoDefinition> kvp in BodyShapeOffsets)
            {
                stringBuilder.Append("                { ");

                string name = kvp.Key;
                CollisionInfoDefinition def = kvp.Value;
                Vector3 t = def.PositionOffset;
                Vector3 r = def.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;

                stringBuilder.Append("body_shape = '" + name + "', ");
                stringBuilder.Append("radius = " + def.Radius.ToString() + ", ");

                if (def.Length > 0)
                {
                    stringBuilder.Append("length = " + def.Length.ToString() + ", ");
                }

                stringBuilder.Append("translate = vec3(" + t.x.ToString() + ", " + t.y.ToString() + ", " + t.z.ToString() + "), ");
                stringBuilder.Append("rotate = vec3(" + r.x.ToString() + ", " + r.y.ToString() + ", " + r.z.ToString() + ") }, \n");
            }

            stringBuilder.Append("            },\n");

            success = true;
            return(success);
        }
Example #5
0
    public void RestoreSnapShot()
    {
        foreach (KeyValuePair <int, Vector3> kvp in m_particleSnapShot)
        {
            GameObject gameObject = m_particleEntities[kvp.Key];
            gameObject.transform.position = kvp.Value;
        }

        foreach (KeyValuePair <string, CollisionSnapShotData> kvp in m_collisionSnapShot)
        {
            GameObject gameObject = m_collisionEntities[kvp.Key];
            DynamicCollisionComponent collision = gameObject.GetComponent <DynamicCollisionComponent>();
            CollisionInfoDefinition   def       = collision.CollisionInfo.CollisionInfoDefinition;

            def.PositionOffset = kvp.Value.PositionOffset;
            def.RotationOffset = kvp.Value.RotationOffset;
            def.Length         = kvp.Value.Length;
            def.Radius         = kvp.Value.Radius;
        }

        m_particleSnapShot.Clear();
        m_collisionSnapShot.Clear();
    }
        public bool Deserialise(Table offsetsTable)
        {
            bool success = false;

            foreach (DynValue entry in offsetsTable.Values)
            {
                Table entryValue = entry.Table;

                string name = entryValue.Get("body_shape").String;

                CollisionInfoDefinition def = new CollisionInfoDefinition
                {
                    Radius         = (float)entryValue.Get("radius").Number,
                    Length         = (float)entryValue.Get("length").Number,
                    PositionOffset = entryValue.Get("translate").ToObject <Vector3>(),
                    RotationOffset = entryValue.Get("rotate").ToObject <Vector3>()
                };

                BodyShapeOffsets.Add(name, def);
            }

            success = true;
            return(success);
        }
    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);
    }