void ReleaseEffect() { int ballNum = 60; float dist = 0.15f; Vector3[] randomDist = new Vector3[ballNum]; Vector3 temp; Vector3 pt = points [points.Count - 1]; // create metaballs for (int i = 0; i < ballNum; i++) { randomDist [i] = new Vector3(Random.Range(-dist, dist), Random.Range(-dist, dist), Random.Range(-dist, dist)); temp = new Vector3(pt.x + randomDist [i].x, pt.y + randomDist[i].y, pt.z + randomDist[i].z); GameObject child = new GameObject("MetaballNode"); child.transform.parent = line.transform.Find("SourceRoot").transform; child.transform.position = temp; child.transform.localScale = Vector3.one; child.transform.localRotation = Quaternion.identity; MetaballNode newNode = child.AddComponent <MetaballNode> (); newNode.baseRadius = Random.Range(0.2f, 0.35f); } // rebuild mesh seed.CreateMesh(); }
public static void CreateChildNode() { GameObject go = Selection.activeGameObject; float baseRadius = 1.0f; MetaballSeedBase seed = Utils.FindComponentInParents <MetaballSeedBase>(go.transform); if (seed != null) { baseRadius = seed.baseRadius; } GameObject child = new GameObject("MetaballNode"); child.transform.parent = go.transform; child.transform.localPosition = Vector3.zero; child.transform.localScale = Vector3.one; child.transform.localRotation = Quaternion.identity; MetaballNode newNode = child.AddComponent <MetaballNode>(); newNode.baseRadius = baseRadius; Selection.activeGameObject = child; }
public void AddCell(Vector3 position, float size) { audioSource.Play(); GameObject child = new GameObject("MetaballNode"); child.transform.parent = metaball.sourceRoot.transform; child.transform.position = position; child.transform.localScale = Vector3.one; child.transform.localRotation = Quaternion.identity; MetaballNode newNode = child.AddComponent <MetaballNode>(); newNode.baseRadius = size; metaball.CreateMesh(); MeshCollider mc = metaball.GetComponent <MeshCollider>(); if (mc != null) { mc.sharedMesh = metaball.Mesh; } Instantiate(hitPS.gameObject, position, Quaternion.identity); }
private void ConstructTree(Transform node, SkinnedMetaballCell cell, Matrix4x4 toLocalMtx) { for (int index = 0; index < node.get_childCount(); ++index) { Transform child = node.GetChild(index); MetaballNode component = (MetaballNode)((Component)child).GetComponent <MetaballNode>(); if (Object.op_Inequality((Object)component, (Object)null)) { SkinnedMetaballCell cell1 = cell.AddChild(Vector4.op_Implicit(Matrix4x4.op_Multiply(toLocalMtx, Vector4.op_Implicit(Vector3.op_Subtraction(((Component)child).get_transform().get_position(), ((Component)this).get_transform().get_position())))), component.Radius, 0.0f); cell1.tag = ((Object)((Component)child).get_gameObject()).get_name(); cell1.density = component.Density; this.ConstructTree(child, cell1, toLocalMtx); } } }
void MakeMetaballs(float d) { /* * Vector3 tempPt = points [points.Count - 1]; * Vector3 tempDiff = points [points.Count - 1] - points [points.Count - 2]; * int numPt = d / 0.1f; * Debug.Log (numPt); * Vector3[] midPts = new Vector3[numPt]; * midPts [numPt-1] = tempPt; * * for (int i = 0; i < numPt; i++) * { * Vector3 midPt = prevPt + ((1f / 1f) * (i + 1) * tempDiff); * // update sketch point * points.Add (midPt); * // update line width * lineWidthList.Add (Random.Range(0.1f, 0.1f * 2f)); * // update mesh * offsetsQuat.Add (Quaternion.FromToRotation (Vector3.forward, points [points.Count - 2] - points [points.Count - 1])); * UpdateMeshThree (); * RecalculateMesh (); * }*/ int ballNum = 10; float dist = 0.1f; Vector3[] randomDist = new Vector3[ballNum]; Vector3 temp; Vector3 pt = points [points.Count - 1]; // create metaballs for (int i = 0; i < ballNum; i++) { randomDist [i] = new Vector3(Random.Range(-dist, dist), Random.Range(-dist / 2, dist / 2), Random.Range(0, dist)); temp = new Vector3(pt.x + randomDist [i].x, pt.y + randomDist[i].y, pt.z + randomDist[i].z); GameObject child = new GameObject("MetaballNode"); child.transform.parent = line.transform.Find("SourceRoot").transform; child.transform.position = temp; child.transform.localScale = Vector3.one; child.transform.localRotation = Quaternion.identity; MetaballNode newNode = child.AddComponent <MetaballNode> (); newNode.baseRadius = Random.Range(0.4f, 0.6f); } // rebuild mesh seed.CreateMesh(); }
void ConstructTree(Transform node, SkinnedMetaballCell cell, Matrix4x4 toLocalMtx) { for (int i = 0; i < node.childCount; ++i) { Transform c = node.GetChild(i); MetaballNode n = c.GetComponent <MetaballNode>(); if (n != null) { SkinnedMetaballCell childCell = cell.AddChild(toLocalMtx * (c.transform.position - transform.position), n.Radius, 0.0f); childCell.tag = c.gameObject.name; childCell.density = n.Density; ConstructTree(c, childCell, toLocalMtx); } } }
private void ConstructCellCluster( MetaballCellCluster cluster, Transform parentNode, Matrix4x4 toLocalMtx, Transform meshTrans) { for (int index = 0; index < parentNode.get_childCount(); ++index) { Transform child = parentNode.GetChild(index); MetaballNode component = (MetaballNode)((Component)child).GetComponent <MetaballNode>(); if (Object.op_Inequality((Object)component, (Object)null)) { this._cellCluster.AddCell(meshTrans.InverseTransformPoint(child.get_position()), 0.0f, new float?(component.Radius), ((Object)((Component)child).get_gameObject()).get_name()).density = component.Density; } this.ConstructCellCluster(cluster, child, toLocalMtx, meshTrans); } }
void ConstructCellCluster(MetaballCellCluster cluster, Transform parentNode, Matrix4x4 toLocalMtx) { for (int i = 0; i < parentNode.childCount; ++i) { Transform c = parentNode.GetChild(i); MetaballNode n = c.GetComponent <MetaballNode>(); if (n != null) { MetaballCell cell = _cellCluster.AddCell(toLocalMtx * (c.position - transform.position), 0.0f, n.Radius, c.gameObject.name); cell.density = n.Density; } ConstructCellCluster(cluster, c, toLocalMtx); } }
private void WorldPositionBounds(Transform parentNode, ref Bounds bounds) { for (int index1 = 0; index1 < parentNode.get_childCount(); ++index1) { Transform child = parentNode.GetChild(index1); MetaballNode component = (MetaballNode)((Component)child).GetComponent <MetaballNode>(); if (Object.op_Inequality((Object)component, (Object)null)) { for (int index2 = 0; index2 < 3; ++index2) { Vector3 position1 = ((Component)child).get_transform().get_position(); double num1 = (double)((Vector3) ref position1).get_Item(index2) - (double)component.Radius; Vector3 min1 = ((Bounds) ref bounds).get_min(); double num2 = (double)((Vector3) ref min1).get_Item(index2); if (num1 < num2) { Vector3 min2 = ((Bounds) ref bounds).get_min(); ref Vector3 local = ref min2; int num3 = index2; Vector3 position2 = ((Component)child).get_transform().get_position(); double num4 = (double)((Vector3) ref position2).get_Item(index2) - (double)component.Radius; ((Vector3) ref local).set_Item(num3, (float)num4); ((Bounds) ref bounds).set_min(min2); } Vector3 position3 = ((Component)child).get_transform().get_position(); double num5 = (double)((Vector3) ref position3).get_Item(index2) + (double)component.Radius; Vector3 max1 = ((Bounds) ref bounds).get_max(); double num6 = (double)((Vector3) ref max1).get_Item(index2); if (num5 > num6) { Vector3 max2 = ((Bounds) ref bounds).get_max(); ref Vector3 local = ref max2; int num3 = index2; Vector3 position2 = ((Component)child).get_transform().get_position(); double num4 = (double)((Vector3) ref position2).get_Item(index2) + (double)component.Radius; ((Vector3) ref local).set_Item(num3, (float)num4); ((Bounds) ref bounds).set_max(max2); } } }
void OnDrawGizmosSelected() { if (_seed == null) { _seed = Utils.FindComponentInParents <MetaballSeedBase>(transform); } if (Density == 0.0f) { return; } // static seed root node is not shown nor used for building mesh if (_seed != null /*&& !_seed.IsTreeShape*/ && _seed.sourceRoot != null && _seed.sourceRoot.gameObject == gameObject) { return; } { Gizmos.color = bSubtract ? Color.red : Color.white; float drawRadius = Radius; if (_seed != null) { drawRadius *= (1.0f - Mathf.Sqrt(_seed.powerThreshold)); } Matrix4x4 oldMtx = Gizmos.matrix; Gizmos.matrix = transform.localToWorldMatrix; Gizmos.DrawWireSphere(Vector3.zero, drawRadius); MetaballNode parentNode = transform.parent.GetComponent <MetaballNode>(); if (parentNode != null && parentNode.Density != 0.0f && _seed != null && _seed.IsTreeShape) { if (_boneMesh == null) { _boneMesh = new Mesh(); Vector3[] verts = new Vector3[5]; Vector3[] normals = new Vector3[5]; int[] indxs = new int[6]; verts[0] = new Vector3(0.1f, 0.0f, 0.0f); verts[1] = new Vector3(-0.1f, 0.0f, 0.0f); verts[2] = new Vector3(0.0f, 0.1f, 0.0f); verts[3] = new Vector3(0.0f, -0.1f, 0.0f); verts[4] = new Vector3(0.0f, 0.0f, 1.0f); normals[0] = new Vector3(0, 0, 1.0f); normals[1] = new Vector3(0, 0, 1.0f); normals[2] = new Vector3(0, 0, 1.0f); normals[3] = new Vector3(0, 0, 1.0f); normals[4] = new Vector3(0, 0, 1.0f); indxs[0] = 0; indxs[1] = 1; indxs[2] = 4; indxs[3] = 2; indxs[4] = 3; indxs[5] = 4; _boneMesh.vertices = verts; _boneMesh.normals = normals; _boneMesh.SetIndices(indxs, MeshTopology.Triangles, 0); } Vector3 scale = Vector3.one; Vector3 pos = transform.position; Vector3 parentPos = transform.parent.position; if ((parentPos - pos).sqrMagnitude < float.Epsilon) { } else { scale *= ((parentPos - pos).magnitude); Matrix4x4 mtx = Matrix4x4.TRS(parentPos, Quaternion.LookRotation(pos - parentPos), scale); Gizmos.color = Color.blue; Gizmos.matrix = mtx; Gizmos.DrawWireMesh(_boneMesh); } } Gizmos.color = Color.white; Gizmos.matrix = oldMtx; } }
private void OnDrawGizmosSelected() { if (Object.op_Equality((Object)this._seed, (Object)null)) { this._seed = Utils.FindComponentInParents <MetaballSeedBase>(((Component)this).get_transform()); } if ((double)this.Density == 0.0 || Object.op_Inequality((Object)this._seed, (Object)null) && Object.op_Inequality((Object)this._seed.sourceRoot, (Object)null) && Object.op_Equality((Object)((Component)this._seed.sourceRoot).get_gameObject(), (Object)((Component)this).get_gameObject())) { return; } Gizmos.set_color(!this.bSubtract ? Color.get_white() : Color.get_red()); float radius = this.Radius; if (Object.op_Inequality((Object)this._seed, (Object)null)) { radius *= 1f - Mathf.Sqrt(this._seed.powerThreshold); } Matrix4x4 matrix = Gizmos.get_matrix(); Gizmos.set_matrix(((Component)this).get_transform().get_localToWorldMatrix()); Gizmos.DrawWireSphere(Vector3.get_zero(), radius); MetaballNode component = (MetaballNode)((Component)((Component)this).get_transform().get_parent()).GetComponent <MetaballNode>(); if (Object.op_Inequality((Object)component, (Object)null) && (double)component.Density != 0.0 && (Object.op_Inequality((Object)this._seed, (Object)null) && this._seed.IsTreeShape)) { if (Object.op_Equality((Object)this._boneMesh, (Object)null)) { this._boneMesh = new Mesh(); Vector3[] vector3Array1 = new Vector3[5]; Vector3[] vector3Array2 = new Vector3[5]; int[] numArray = new int[6]; vector3Array1[0] = new Vector3(0.1f, 0.0f, 0.0f); vector3Array1[1] = new Vector3(-0.1f, 0.0f, 0.0f); vector3Array1[2] = new Vector3(0.0f, 0.1f, 0.0f); vector3Array1[3] = new Vector3(0.0f, -0.1f, 0.0f); vector3Array1[4] = new Vector3(0.0f, 0.0f, 1f); vector3Array2[0] = new Vector3(0.0f, 0.0f, 1f); vector3Array2[1] = new Vector3(0.0f, 0.0f, 1f); vector3Array2[2] = new Vector3(0.0f, 0.0f, 1f); vector3Array2[3] = new Vector3(0.0f, 0.0f, 1f); vector3Array2[4] = new Vector3(0.0f, 0.0f, 1f); numArray[0] = 0; numArray[1] = 1; numArray[2] = 4; numArray[3] = 2; numArray[4] = 3; numArray[5] = 4; this._boneMesh.set_vertices(vector3Array1); this._boneMesh.set_normals(vector3Array2); this._boneMesh.SetIndices(numArray, (MeshTopology)0, 0); } Vector3 one = Vector3.get_one(); Vector3 position1 = ((Component)this).get_transform().get_position(); Vector3 position2 = ((Component)this).get_transform().get_parent().get_position(); Vector3 vector3_1 = Vector3.op_Subtraction(position2, position1); if ((double)((Vector3) ref vector3_1).get_sqrMagnitude() >= 1.40129846432482E-45) { Vector3 vector3_2 = one; Vector3 vector3_3 = Vector3.op_Subtraction(position2, position1); double magnitude = (double)((Vector3) ref vector3_3).get_magnitude(); Vector3 vector3_4 = Vector3.op_Multiply(vector3_2, (float)magnitude); Matrix4x4 matrix4x4 = Matrix4x4.TRS(position2, Quaternion.LookRotation(Vector3.op_Subtraction(position1, position2)), vector3_4); Gizmos.set_color(Color.get_blue()); Gizmos.set_matrix(matrix4x4); Gizmos.DrawWireMesh(this._boneMesh); } } Gizmos.set_color(Color.get_white()); Gizmos.set_matrix(matrix); }