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