Exemplo n.º 1
0
    private static List <Triangle> GetOrganTriangles(OrganIndex _OrganIndex, GameObject _Object)
    {
        List <Triangle> Triangles = new List <Triangle>();

        int[] TriangleIndexes = GetTriangleIndexes(_Object);
        if (TriangleIndexes != null)
        {
            Vector3[] Vertices = GetVerticesInWorld(_Object);   //世界坐标系下的顶点坐标
            Vector2[] UV       = GetUV(_Object);                //纹理坐标

            for (int i = 0; i < TriangleIndexes.Length; i = i + 3)
            {
                Triangles.Add(new Triangle(new Vector3[3] {
                    Vertices[TriangleIndexes[i]], Vertices[TriangleIndexes[i + 1]], Vertices[TriangleIndexes[i + 2]]
                },
                                           new Vector2[3] {
                    UV[TriangleIndexes[i]], UV[TriangleIndexes[i + 1]], UV[TriangleIndexes[i + 2]]
                },
                                           _OrganIndex));
            }
        }

        //添加子对象的三角面片
        foreach (Transform Child in _Object.transform)
        {
            Triangles.AddRange(GetOrganTriangles(_OrganIndex, Child.gameObject));
        }

        return(Triangles);
    }
Exemplo n.º 2
0
 /// <summary>
 /// 获取三角面片
 /// </summary>
 public static List <Triangle> GetTriangles(OrganIndex _OrganIndex)
 {
     if (_OrganIndex.Type == OrganType.Branch)
     {
         return(GetBranchTriangles(_OrganIndex));
     }
     else
     {
         return(GetOrganTriangles(_OrganIndex));
     }
 }
Exemplo n.º 3
0
    private void AddOrganIndex(OrganIndex index)
    {
        if (m_listOrganIndexes == null)
        {
            m_listOrganIndexes = new List <OrganIndex>();
        }

        index.TreeModel = this;

        m_listOrganIndexes.Add(index);
    }
Exemplo n.º 4
0
    public bool IsMatchWithPrevious(OrganIndex preOrganIndex)
    {
        BranchIndex preBranchIndex = preOrganIndex.From;
        BranchIndex curBranchIndex = From;

        if (!preBranchIndex.IsMatch(curBranchIndex))
        {
            return(false);                     //不属于同一枝干
        }
        return(IsTheSameType(preOrganIndex) && /*类型相同*/
               IsTheSameIndex(preOrganIndex)); /*索引相同*/
    }
Exemplo n.º 5
0
    public Triangle(Vector3[] vertices, Vector2[] uv, OrganIndex _OrganIndex)
    {
        m_Vertices = vertices;
        m_UV       = uv;
        m_Normal   = Vector3.zero;

        m_OrganIndex = _OrganIndex;

        Vector3 Max = Vector3.Max(Vector3.Max(m_Vertices[0], m_Vertices[1]), m_Vertices[2]);
        Vector3 Min = Vector3.Min(Vector3.Min(m_Vertices[0], m_Vertices[1]), m_Vertices[2]);

        m_Bounds = new Bounds((Max + Min) / 2.0f, Max - Min);
    }
Exemplo n.º 6
0
    public Triangle(Vector3 v0, Vector3 v1, Vector3 v2, Vector2 uv1, Vector2 uv2, Vector2 uv3, Vector3 normal, OrganIndex _OrganIndex)
    {
        m_Vertices = new Vector3[3] {
            v0, v1, v2
        };
        m_UV = new Vector2[3] {
            uv1, uv2, uv3
        };
        m_Normal = normal;

        m_OrganIndex = _OrganIndex;

        Vector3 Max = Vector3.Max(Vector3.Max(m_Vertices[0], m_Vertices[1]), m_Vertices[2]);
        Vector3 Min = Vector3.Min(Vector3.Min(m_Vertices[0], m_Vertices[1]), m_Vertices[2]);

        m_Bounds = new Bounds((Max + Min) / 2.0f, Max - Min);
    }
Exemplo n.º 7
0
    private static List <Triangle> GetBranchTriangles(OrganIndex _OrganIndex)
    {
        GameObject Branch = _OrganIndex.Belong;

        List <Triangle> Triangles = new List <Triangle>(40);

        int BottomVerticesIndex = ((BranchIndex)_OrganIndex).BottomVerticesIndex;       //底端顶点坐标索引
        int TopVerticesIndex    = ((BranchIndex)_OrganIndex).TopVerticesIndex;          //顶端顶点坐标索引

        Vector3[] BottomVertices = GetVerticesInWorld(Branch, BottomVerticesIndex, 20); //底端顶点坐标
        Vector3[] TopVertices    = GetVerticesInWorld(Branch, TopVerticesIndex, 20);    //顶端顶点坐标

        if (BottomVertices == null || TopVertices == null || BottomVertices.Length != TopVertices.Length)
        {
            return(null);
        }

        Vector2[] UV = GetUV(Branch);   //纹理坐标

        for (int i = 0; i < 20; i++)
        {
            Triangles[i * 2] = new Triangle(new Vector3[3] {
                BottomVertices[(i + 1) % 20], BottomVertices[i], TopVertices[i]
            },
                                            new Vector2[3] {
                UV[BottomVerticesIndex + (i + 1) % 20], UV[BottomVerticesIndex + i], UV[TopVerticesIndex + i]
            },
                                            _OrganIndex);

            Triangles[i * 2 + 1] = new Triangle(new Vector3[3] {
                TopVertices[i], TopVertices[(i + 1) % 20], BottomVertices[(i + 1) % 20]
            },
                                                new Vector2[3] {
                UV[TopVerticesIndex + i], UV[TopVerticesIndex + (i + 1) % 20], UV[BottomVerticesIndex + (i + 1) % 20]
            },
                                                _OrganIndex);
        }

        return(Triangles);
    }
Exemplo n.º 8
0
 private static List <Triangle> GetOrganTriangles(OrganIndex _OrganIndex)
 {
     return(GetOrganTriangles(_OrganIndex, _OrganIndex.Belong));
 }
Exemplo n.º 9
0
    private void GetIndexesFrom(LLinkedListNode <LTerm> node, BranchIndex fromBranch, GameObjectInfo objectInfo, ref List <OrganIndex> indexList)
    {
        if (node == null)
        {
            throw new ArgumentNullException("No start node.");
        }

        LLinkedListNode <LTerm> headNode = m_RuleData.FinalList.First;

        BranchIndex curBranchIndex = fromBranch;

        do
        {
            if (node.Value != null)
            {
                switch (node.Value.Symbol[0])   //符号解析
                {
                case 'F':
                    objectInfo.Length = Convert.ToSingle(node.Value.Params[0]);
                    BranchIndex branchIndex = GetBranchIndex(curBranchIndex, fromBranch, objectInfo);

                    indexList.Add(branchIndex);        //在器官索引列表中添加,后续绘制用,绘制完成后删除
                    AddBranchIndex(branchIndex);       //在枝干索引列表中添加,不删除

                    curBranchIndex = branchIndex;      //设置当前的枝干索引

                    break;

                case 'f':
                    objectInfo.Position = MoveForward(objectInfo);
                    break;

                case '!':
                    objectInfo.Radius = Convert.ToSingle(node.Value.Params[0]);
                    break;

                case '+':
                    objectInfo.Rotation -= new Vector3(Convert.ToSingle(node.Value.Params[0]), 0, 0);
                    break;

                case '-':
                    objectInfo.Rotation += new Vector3(Convert.ToSingle(node.Value.Params[0]), 0, 0);
                    break;

                case '&':
                    objectInfo.Rotation -= new Vector3(0, Convert.ToSingle(node.Value.Params[0]), 0);
                    break;

                case '^':
                    objectInfo.Rotation += new Vector3(0, Convert.ToSingle(node.Value.Params[0]), 0);
                    break;

                case '\\':
                    objectInfo.Rotation += new Vector3(0, 0, Convert.ToSingle(node.Value.Params[0]));
                    break;

                case '/':
                    objectInfo.Rotation -= new Vector3(0, 0, Convert.ToSingle(node.Value.Params[0]));
                    break;

                case '%':
                    OrganIndex organIndex = GetOrganIndex(MeshResource.GetInstance().GetNameOf(Convert.ToInt32(node.Value.Params[0])) /*将标识码转换成对应的名字*/,
                                                          curBranchIndex, objectInfo);

                    if (organIndex != null)
                    {
                        indexList.Add(organIndex);
                        AddOrganIndex(organIndex);
                    }

                    break;

                case '[':
                    node = node.Next;

                    GetIndexesFrom(node, curBranchIndex, objectInfo.Clone(), ref indexList); //入栈

                    node = _CurrentNode;                                                     //将节点设置成分支结束的节点

                    break;

                case ']':
                    _CurrentNode = node;

                    node = headNode.Previous;       //出栈,中断该函数
                    break;
                }
            }

            node = node.Next;
        } while (node != headNode);
    }
Exemplo n.º 10
0
 public bool IsTheSameIndex(OrganIndex _OrganIndex)
 {
     return(IsTheSameType(_OrganIndex) && this.Index == _OrganIndex.Index);
 }
Exemplo n.º 11
0
 public bool IsTheSameType(OrganIndex _OrganIndex)
 {
     return(this.Type == _OrganIndex.Type);
 }