예제 #1
0
        private int CutEdgeOptimizedVerticesNormalsTangentsUVs(int a_RelativeVertexLocationsOffset, int a_IndexA, int a_IndexB, Vector3 a_VertexA, Vector3 a_VertexB, bool a_IsVertexAInside, float a_IntersectionFactorAB)
        {
            CutEdge edge  = new CutEdge(a_IndexA, a_IndexB);
            int     count = base.m_DecalsMesh.Vertices.Count;

            base.m_DecalsMesh.Vertices.Add(Vector3.Lerp(a_VertexA, a_VertexB, a_IntersectionFactorAB));
            base.m_DecalsMesh.Normals.Add(Vector3.Lerp(base.m_DecalsMesh.Normals[a_IndexA], base.m_DecalsMesh.Normals[a_IndexB], a_IntersectionFactorAB));
            base.m_DecalsMesh.Tangents.Add(Vector4.Lerp(base.m_DecalsMesh.Tangents[a_IndexA], base.m_DecalsMesh.Tangents[a_IndexB], a_IntersectionFactorAB));
            base.m_DecalsMesh.UVs.Add(Vector2.Lerp(base.m_DecalsMesh.UVs[a_IndexA], base.m_DecalsMesh.UVs[a_IndexB], a_IntersectionFactorAB));
            if (base.m_DecalsMesh.Decals.UseVertexColors)
            {
                base.m_DecalsMesh.TargetVertexColors.Add(Color.Lerp(base.m_DecalsMesh.TargetVertexColors[a_IndexA], base.m_DecalsMesh.TargetVertexColors[a_IndexB], a_IntersectionFactorAB));
                base.m_DecalsMesh.VertexColors.Add(Color.Lerp(base.m_DecalsMesh.VertexColors[a_IndexA], base.m_DecalsMesh.VertexColors[a_IndexB], a_IntersectionFactorAB));
            }
            base.m_ActiveProjector.DecalsMeshUpperVertexIndex++;
            if (a_IsVertexAInside)
            {
                edge.newVertex2Index = count;
                base.m_RelativeVertexLocations[a_IndexB - a_RelativeVertexLocationsOffset] = RelativeVertexLocation.Outside;
            }
            else
            {
                edge.newVertex1Index = count;
                base.m_RelativeVertexLocations[a_IndexA - a_RelativeVertexLocationsOffset] = RelativeVertexLocation.Outside;
            }
            base.m_CutEdges.AddEdge(edge);
            return(count);
        }
예제 #2
0
        private int CutEdgeUnoptimized(int a_RelativeVertexLocationsOffset, int a_IndexA, int a_IndexB, Vector3 a_VertexA, Vector3 a_VertexB, bool a_IsVertexAInside, float a_IntersectionFactorAB)
        {
            CutEdge    edge    = new CutEdge(a_IndexA, a_IndexB);
            Vector3    a       = base.m_DecalsMesh.OriginalVertices[a_IndexA];
            Vector3    vector3 = base.m_DecalsMesh.Normals[a_IndexA];
            BoneWeight weight  = base.m_DecalsMesh.BoneWeights[a_IndexA];
            int        count   = base.m_DecalsMesh.Vertices.Count;

            base.m_DecalsMesh.OriginalVertices.Add(Vector3.Lerp(a, base.m_DecalsMesh.OriginalVertices[a_IndexB], a_IntersectionFactorAB));
            base.m_DecalsMesh.Vertices.Add(Vector3.Lerp(a_VertexA, a_VertexB, a_IntersectionFactorAB));
            base.m_DecalsMesh.Normals.Add(Vector3.Lerp(vector3, base.m_DecalsMesh.Normals[a_IndexB], a_IntersectionFactorAB));
            base.m_DecalsMesh.BoneWeights.Add(this.LerpBoneWeights(weight, base.m_DecalsMesh.BoneWeights[a_IndexB], a_IntersectionFactorAB));
            base.m_ActiveProjector.DecalsMeshUpperVertexIndex++;
            if (base.m_DecalsMesh.Decals.CurrentTangentsMode == TangentsMode.Target)
            {
                base.m_DecalsMesh.Tangents.Add(Vector4.Lerp(base.m_DecalsMesh.Tangents[a_IndexA], base.m_DecalsMesh.Tangents[a_IndexB], a_IntersectionFactorAB));
            }
            if (base.m_DecalsMesh.Decals.UseVertexColors)
            {
                base.m_DecalsMesh.TargetVertexColors.Add(Color.Lerp(base.m_DecalsMesh.TargetVertexColors[a_IndexA], base.m_DecalsMesh.TargetVertexColors[a_IndexB], a_IntersectionFactorAB));
                base.m_DecalsMesh.VertexColors.Add(Color.Lerp(base.m_DecalsMesh.VertexColors[a_IndexA], base.m_DecalsMesh.VertexColors[a_IndexB], a_IntersectionFactorAB));
            }
            if ((base.m_DecalsMesh.Decals.CurrentUVMode == UVMode.TargetUV) || (base.m_DecalsMesh.Decals.CurrentUVMode == UVMode.TargetUV2))
            {
                base.m_DecalsMesh.UVs.Add(Vector2.Lerp(base.m_DecalsMesh.UVs[a_IndexA], base.m_DecalsMesh.UVs[a_IndexB], a_IntersectionFactorAB));
            }
            if ((base.m_DecalsMesh.Decals.CurrentUV2Mode == UV2Mode.TargetUV) || (base.m_DecalsMesh.Decals.CurrentUV2Mode == UV2Mode.TargetUV2))
            {
                base.m_DecalsMesh.UV2s.Add(Vector2.Lerp(base.m_DecalsMesh.UV2s[a_IndexA], base.m_DecalsMesh.UV2s[a_IndexB], a_IntersectionFactorAB));
            }
            if (a_IsVertexAInside)
            {
                edge.newVertex2Index = count;
                base.m_RelativeVertexLocations[a_IndexB - a_RelativeVertexLocationsOffset] = RelativeVertexLocation.Outside;
            }
            else
            {
                edge.newVertex1Index = count;
                base.m_RelativeVertexLocations[a_IndexA - a_RelativeVertexLocationsOffset] = RelativeVertexLocation.Outside;
            }
            base.m_CutEdges.AddEdge(edge);
            return(count);
        }
예제 #3
0
 public CutEdge this[CutEdge a_CutEdge]
 {
     get =>
     this.m_CutEdgeDictionary[a_CutEdge];
예제 #4
0
 public bool HasEdge(CutEdge a_CutEdge) =>
 this.m_CutEdgeDictionary.ContainsKey(a_CutEdge);
예제 #5
0
 public void AddEdge(CutEdge a_CutEdge)
 {
     this.m_CutEdgeDictionary.Add(a_CutEdge, a_CutEdge);
 }