Example #1
0
    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();
    }
Example #2
0
    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;
    }
Example #3
0
    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);
    }
Example #4
0
 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);
         }
     }
 }
Example #5
0
    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();
    }
Example #6
0
    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);
     }
 }
Example #8
0
    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);
                 }
             }
         }
Example #10
0
    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);
    }