public Texture2D RenderSectionPreview(SectionInfo info, ModuleCarnationVariablePart current)
        {
            Texture2D result = new Texture2D(128, 128, TextureFormat.RGBA32, mipCount: 0, linear: false);

            cvsp.Section0Width  = info.width;
            cvsp.Section0Height = info.height;
            int i = -1;

            while (++i < 4)
            {
                cvsp.SetCornerRadius(i, info.radius[i]);

                string name = info.corners[i];
                if (name == null)
                {
                    continue;
                }
                SectionCorner corner = CVSPConfigs.SectionCornerDefinitions.FirstOrDefault(q => q.name.Equals(name));
                if (corner.name == null)
                {
                    continue;
                }
                cvsp.SetCornerTypes(corner, i);
                cvsp.SetCornerTypes(corner, i + 4);
            }
            //cvsp.uiEditing = true;
            if (cvsp.enabled)
            {
                cvsp.enabled = false;
                cvsp.MeshRender.sharedMaterials = new Material[2] {
                    renderMat, renderMat
                };
                Destroy(cvsp.GetComponent <Collider>());
            }

            if (!current)
            {
                renderMat.mainTexture = null;
            }
            else
            {
                renderMat.mainTexture = current.EndsDiffTexture;
            }

            cvsp.UpdateSectionTransforms();
            cvsp.ForceUpdateGeometry(updateColliders: false);
            camera.orthographicSize = Mathf.Max(info.width, info.height) / 2;
            cvsp.MeshRender.enabled = true;
            camera.Render();
            RenderTexture.active = rt;
            result.ReadPixels(new Rect(0, 0, 128, 128), 0, 0);
            cvsp.MeshRender.enabled = false;
            result.Apply(false, true);
            return(result);
        }
Пример #2
0
        /// <summary>
        /// 创建截面
        /// </summary>
        /// <param name="cornerID">0~8,角点的编号</param>
        /// <param name="radiusNormalized">0~1的圆角大小</param>
        private void BuildSectionCorner(int cornerID, float radiusNormalized, SectionCorner sectionCorner)
        {
            //顶点ID
            var corner = sectionCorners[cornerID];

            if (IsZero(radiusNormalized))
            {
                for (int i = 0; i < corner.Length; i++)
                {
                    sectionVerts[corner[i]].x = originSectionVerts[corner[i]].x;
                    sectionVerts[corner[i]].z = originSectionVerts[corner[i]].z;
                }
                return;
            }
            //旋转矩阵
            float xx, xz, zz, zx;

            switch (sectionCornersRotation[cornerID])
            {
            case 90:
                xx = 0;
                xz = -1;
                zz = 0;
                zx = 1;
                break;

            case 180:
                xx = -1;
                xz = 0;
                zz = -1;
                zx = 0;
                break;

            case 270:
                xx = 0;
                xz = 1;
                zz = 0;
                zx = -1;
                break;

            default:        //0
                xx = 1;
                xz = 0;
                zz = 1;
                zx = 0;
                break;
            }
            Vector2 center = new Vector2(xx + zx, xz + zz) * (1 - radiusNormalized);

            for (int i = 0; i < corner.Length; i++)
            {
                sectionVerts[corner[i]].x = center.x + radiusNormalized * (sectionCorner.vertices[i].x * xx + sectionCorner.vertices[i].y * zx);
                sectionVerts[corner[i]].z = center.y + radiusNormalized * (sectionCorner.vertices[i].x * xz + sectionCorner.vertices[i].y * zz);
            }
        }
        private static List <SectionCorner> LoadSectionCornerDefinitions(ConfigNode[] cfg = null)
        {
            if (cfg == null)
            {
                cfg = GameDatabase.Instance.GetConfigNodes("CRFPSectionCornerDefinitions");
            }
            List <SectionCorner> result = new List <SectionCorner>();

            foreach (var config in cfg)
            {
                foreach (var secDefNode in config.GetNodes("SectionCorner"))
                {
                    if (secDefNode != null)
                    {
                        var secDef = new SectionCorner
                        {
                            vertices = new Vector2[7]
                        };
                        if (!secDefNode.TryGetValue("name", ref secDef.name) ||
                            !secDefNode.TryGetValue("vertex1", ref secDef.vertices[0]) ||
                            !secDefNode.TryGetValue("vertex2", ref secDef.vertices[1]) ||
                            !secDefNode.TryGetValue("vertex3", ref secDef.vertices[2]) ||
                            !secDefNode.TryGetValue("vertex4", ref secDef.vertices[3]) ||
                            !secDefNode.TryGetValue("vertex5", ref secDef.vertices[4]) ||
                            !secDefNode.TryGetValue("vertex6", ref secDef.vertices[5]) ||
                            !secDefNode.TryGetValue("vertex7", ref secDef.vertices[6]) ||
                            !secDefNode.TryGetValue("cornerPerimeter", ref secDef.cornerPerimeter) ||
                            !secDefNode.TryGetValue("cornerArea", ref secDef.cornerArea)
                            )
                        {
                            Debug.LogError($"[CRFP] Can't load SectionCornerDefinition {secDefNode.name}");
                            continue;
                        }
                        result.Add(secDef);
                    }
                }
            }

            return(result);
        }
Пример #4
0
 public void BuildPreviewSectionMesh(float width, float height, SectionCorner corner, Vector4 radius, out int[] triangles, out Vector3[] vertices)
 {
     triangles = new int[1];
     vertices  = new Vector3[1];
 }