示例#1
0
    public override Geometry Execute(Geometry geometry)
    {
        int vertexOffset = geometry.vertices.Count;

        for (int i = 0; i < CTesselation; ++i)
        {
            int pointsCount = i == 0 ? 1 : RTesselation;

            //generate circle
            for (int j = 0; j < pointsCount; ++j)
            {
                float angle   = 360.0f / RTesselation * j;
                float rCircle = Radius / (CTesselation - 1) * i;
                float x       = Mathf.Sin(angle * Mathf.Deg2Rad) * rCircle;
                float z       = Mathf.Cos(angle * Mathf.Deg2Rad) * rCircle;


                float y = (SphereUtils.SphereCenterOffset(CapRadius, rCircle) - SphereUtils.SphereCenterOffset(CapRadius, Radius)) * Mathf.Sign(CapRadius);



                geometry.vertices.Add(new Vector3(x, y, z));

                geometry.normals.Add(Vector3.up);
            }
        }

        //indices
        for (int i = 0; i < CTesselation - 1; ++i)
        {
            if (i == 0)
            {
                for (int j = 0; j < RTesselation; ++j)
                {
                    geometry.indices.Add(0 + vertexOffset);
                    geometry.indices.Add(j + 1 + vertexOffset);
                    geometry.indices.Add((j + 1) % RTesselation + 1 + vertexOffset);
                }
                vertexOffset += 1;
            }
            else
            {
                for (int j = 0; j < RTesselation; ++j)
                {
                    int a0 = RTesselation * (i - 1) + j;
                    int a1 = RTesselation * (i - 1) + (j + 1) % RTesselation;

                    int b0 = RTesselation * (i - 0) + j;
                    int b1 = RTesselation * (i - 0) + (j + 1) % RTesselation;


                    geometry.indices.Add(a0 + vertexOffset);
                    geometry.indices.Add(b0 + vertexOffset);
                    geometry.indices.Add(a1 + vertexOffset);

                    geometry.indices.Add(b0 + vertexOffset);
                    geometry.indices.Add(b1 + vertexOffset);
                    geometry.indices.Add(a1 + vertexOffset);
                }
            }
        }

        return(geometry);
    }