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