void DrawFixControls() { GUILayout.BeginHorizontal(); GUI.enabled = selectedCount > 0; GUI.enabled = actor.UsesOrientedParticles; if (GUILayout.Button(new GUIContent(Resources.Load <Texture2D>("PinButton"), "Fix translation and orientation"), GUILayout.MaxHeight(24), GUILayout.Width(42))) { Undo.RecordObject(actor, "Fix particle"); FixSelectedParticles(); } GUI.enabled = true; if (GUILayout.Button(new GUIContent(Resources.Load <Texture2D>("PinTranslation"), "Fix translation"), GUILayout.MaxHeight(24), GUILayout.Width(42))) { Undo.RecordObject(actor, "Fix particle translation"); FixSelectedParticlesTranslation(); } if (GUILayout.Button(new GUIContent(Resources.Load <Texture2D>("UnpinButton"), "Unfix selected"), GUILayout.MaxHeight(24), GUILayout.Width(42))) { Undo.RecordObject(actor, "Unfix particle"); UnfixSelectedParticles(); } if (GUILayout.Button(new GUIContent(Resources.Load <Texture2D>("HandleButton"), "Create handle"), GUILayout.MaxHeight(24), GUILayout.Width(42))) { // Create the handle: GameObject c = new GameObject("Obi Handle"); Undo.RegisterCreatedObjectUndo(c, "Create Obi Particle Handle"); ObiParticleHandle handle = c.AddComponent <ObiParticleHandle>(); handle.Actor = actor; // Calculate position of handle from average of particle positions: Vector3 average = Vector3.zero; for (int i = 0; i < selectionStatus.Length; i++) { if (selectionStatus[i]) { average += wsPositions[i]; } } c.transform.position = average / selectedCount; // Add the selected particles to the handle: for (int i = 0; i < selectionStatus.Length; i++) { if (selectionStatus[i]) { handle.AddParticle(i, wsPositions[i], wsOrientations[i], actor.invMasses[i], actor.UsesOrientedParticles ? actor.invRotationalMasses[i]:0); } } } GUI.enabled = true; GUILayout.EndHorizontal(); }
void DrawFixControls() { GUILayout.BeginHorizontal(); GUI.enabled = selectedCount > 0; if (GUILayout.Button(new GUIContent(Resources.Load <Texture2D>("PinButton"), "Fix selected"), GUILayout.MaxHeight(24), GUILayout.Width(42))) { Undo.RecordObject(actor, "Fix particles"); for (int i = 0; i < selectionStatus.Length; i++) { if (selectionStatus[i]) { if (actor.invMasses[i] != 0) { SetPropertyValue(ParticleProperty.Mass, i, Mathf.Infinity); newProperty = GetPropertyValue(currentProperty, i); actor.velocities[i] = Vector3.zero; } } } actor.PushDataToSolver(ParticleData.INV_MASSES | ParticleData.VELOCITIES); } if (GUILayout.Button(new GUIContent(Resources.Load <Texture2D>("UnpinButton"), "Unfix selected"), GUILayout.MaxHeight(24), GUILayout.Width(42))) { Undo.RecordObject(actor, "Unfix particles"); for (int i = 0; i < selectionStatus.Length; i++) { if (selectionStatus[i]) { if (actor.invMasses[i] == 0) { SetPropertyValue(ParticleProperty.Mass, i, 1); newProperty = GetPropertyValue(currentProperty, i); } } } actor.PushDataToSolver(ParticleData.INV_MASSES); } if (GUILayout.Button(new GUIContent(Resources.Load <Texture2D>("HandleButton"), "Create handle"), GUILayout.MaxHeight(24), GUILayout.Width(42))) { // Create the handle: GameObject c = new GameObject("Obi Handle"); Undo.RegisterCreatedObjectUndo(c, "Create Obi Particle Handle"); ObiParticleHandle handle = c.AddComponent <ObiParticleHandle>(); handle.Actor = actor; // Calculate position of handle from average of particle positions: Vector3 average = Vector3.zero; for (int i = 0; i < selectionStatus.Length; i++) { if (selectionStatus[i]) { average += wsPositions[i]; } } c.transform.position = average / selectedCount; // Add the selected particles to the handle: for (int i = 0; i < selectionStatus.Length; i++) { if (selectionStatus[i]) { handle.AddParticle(i, wsPositions[i], actor.invMasses[i]); } } } GUI.enabled = true; if (GUILayout.Button(new GUIContent(Resources.Load <Texture2D>("BackfacesButton"), "Show backfaces"), GUI.skin.FindStyle("Button"), GUILayout.MaxHeight(24), GUILayout.Width(42))) { faceCulling = (FaceCulling)(((int)faceCulling + 1) % 3); } GUILayout.EndHorizontal(); }
public void OnEnable() { renderer = (ObiParticleHandle)target; }
void DrawSelectionToolUI() { GUILayout.Label(selectedCount + " particle(s) selected"); GUILayout.BeginHorizontal(); if (GUILayout.Button("Invert", GUILayout.Width(88))) { for (int i = 0; i < selectionStatus.Length; i++) { if (actor.active[i]) { selectionStatus[i] = !selectionStatus[i]; } } SelectionChanged(); } GUI.enabled = selectedCount > 0; if (GUILayout.Button("Clear", GUILayout.Width(88))) { for (int i = 0; i < selectionStatus.Length; i++) { selectionStatus[i] = false; } SelectionChanged(); } GUI.enabled = true; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); if (GUILayout.Button("Select fixed", GUILayout.Width(88))) { for (int i = 0; i < actor.invMasses.Length; i++) { if (actor.active[i] && actor.invMasses[i] == 0) { selectionStatus[i] = true; } } SelectionChanged(); } GUI.enabled = selectedCount > 0; if (GUILayout.Button("Unselect fixed", GUILayout.Width(88))) { for (int i = 0; i < actor.invMasses.Length; i++) { if (actor.active[i] && actor.invMasses[i] == 0) { selectionStatus[i] = false; } } SelectionChanged(); } GUI.enabled = true; GUILayout.EndHorizontal(); GUI.enabled = selectedCount > 0; GUILayout.BeginHorizontal(); if (GUILayout.Button(new GUIContent("Fix", EditorGUIUtility.Load("PinIcon.psd") as Texture2D), GUILayout.MaxHeight(18), GUILayout.Width(88))) { Undo.RecordObject(actor, "Fix particles"); for (int i = 0; i < selectionStatus.Length; i++) { if (selectionStatus[i]) { if (actor.invMasses[i] != 0) { SetPropertyValue(ParticleProperty.MASS, i, Mathf.Infinity); newProperty = GetPropertyValue(ParticleProperty.MASS, i); actor.velocities[i] = Vector3.zero; } } } actor.PushDataToSolver(new ObiSolverData(ObiSolverData.ParticleData.INV_MASSES | ObiSolverData.ParticleData.VELOCITIES)); EditorUtility.SetDirty(actor); } if (GUILayout.Button(new GUIContent("Unfix", EditorGUIUtility.Load("UnpinIcon.psd") as Texture2D), GUILayout.MaxHeight(18), GUILayout.Width(88))) { Undo.RecordObject(actor, "Unfix particles"); for (int i = 0; i < selectionStatus.Length; i++) { if (selectionStatus[i]) { if (actor.invMasses[i] == 0) { SetPropertyValue(ParticleProperty.MASS, i, 1); } } } actor.PushDataToSolver(new ObiSolverData(ObiSolverData.ParticleData.INV_MASSES)); EditorUtility.SetDirty(actor); } /*if (GUILayout.Button("CUT")){ * ObiCloth mesh = ((ObiCloth)actor); * mesh.DistanceConstraints.RemoveFromSolver(null); * mesh.AerodynamicConstraints.RemoveFromSolver(null); * MeshBuffer buf = new MeshBuffer(mesh.clothMesh); * * int[] sel = new int[2]; * int k = 0; * for(int i = 0; i < selectionStatus.Length; i++){ * if (selectionStatus[i]){ * sel[k] = i; * k++; * if (k == 2) break; * } * } * * int cindex = -1; * for (int j = 0; j < mesh.DistanceConstraints.restLengths.Count; j++){ * if ((mesh.DistanceConstraints.springIndices[j*2] == sel[0] && mesh.DistanceConstraints.springIndices[j*2+1] == sel[1]) || * (mesh.DistanceConstraints.springIndices[j*2] == sel[1] && mesh.DistanceConstraints.springIndices[j*2+1] == sel[0])){ * cindex = j; * break; * } * } * if (cindex >= 0) * mesh.Tear(cindex,buf); * * * mesh.DistanceConstraints.AddToSolver(mesh); * mesh.AerodynamicConstraints.AddToSolver(mesh); * buf.Apply(); * * mesh.GetMeshDataArrays(mesh.clothMesh); * }*/ GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); GUI.enabled = selectedCount > 0; if (GUILayout.Button("Create Handle", GUILayout.Width(180))) { // Create the handle: GameObject c = new GameObject("Obi Handle"); Undo.RegisterCreatedObjectUndo(c, "Create Obi Particle Handle"); ObiParticleHandle handle = c.AddComponent <ObiParticleHandle>(); handle.Actor = actor; // Calculate position of handle from average of particle positions: Vector3 average = Vector3.zero; for (int i = 0; i < selectionStatus.Length; i++) { if (selectionStatus[i]) { average += wsPositions[i]; } } c.transform.position = average / selectedCount; // Add the selected particles to the handle: for (int i = 0; i < selectionStatus.Length; i++) { if (selectionStatus[i]) { handle.AddParticle(i, wsPositions[i], actor.invMasses[i]); } } } GUI.enabled = true; GUILayout.EndHorizontal(); GUILayout.BeginHorizontal(); EditorGUI.showMixedValue = false; for (int i = 0; i < selectionStatus.Length; i++) { if (selectionStatus[i] && !Mathf.Approximately(GetPropertyValue(currentProperty, i), selectionProperty)) { EditorGUI.showMixedValue = true; } } newProperty = EditorGUILayout.FloatField(newProperty, GUILayout.Width(88)); EditorGUI.showMixedValue = false; if (GUILayout.Button("Set " + GetPropertyName(), GUILayout.Width(88))) { Undo.RecordObject(actor, "Set particle property"); selectionProperty = newProperty; for (int i = 0; i < selectionStatus.Length; i++) { if (selectionStatus[i]) { SetPropertyValue(currentProperty, i, selectionProperty); } } ParticlePropertyChanged(); EditorUtility.SetDirty(actor); } GUILayout.EndHorizontal(); GUI.enabled = true; }