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