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); }
/// <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); }
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]; }