public void CurveMesh() { if (tessellatedMesh == null) { throw new Exception("tessellatedMesh not initialized yet, TessellateMesh first"); } if (curvedMesh == null) { curvedMesh = MeshInfo.pool.Get(); } curvedMesh.Initialize(tessellatedMesh); //if (Curved3DShaderManager.IsWorkable()) //{ // Curved3DShaderManager.Instance.Dispatch(style, tessellatedMesh.positions, tessellatedMesh.normals, tessellatedMesh.tangents, curvedMesh.positions, curvedMesh.normals, curvedMesh.tangents, radiusInverse, centerPos, centerRot); //} //else { Vector3 pos; Quaternion rot; for (int i = 0, imax = tessellatedMesh.positions.Count; i < imax; ++i) { Curved3D.Transform(style, tessellatedMesh.positions[i], Quaternion.identity, radiusInverse, centerPos, centerRot, out pos, out rot); curvedMesh.positions.Add(pos); curvedMesh.normals.Add(rot * tessellatedMesh.normals[i]); curvedMesh.tangents.Add((Vector4)(rot * tessellatedMesh.tangents[i]) + new Vector4(0f, 0f, 0f, tessellatedMesh.tangents[i].w)); } } }
// invoke by Curved3DCanvas public override void OnLayoutComplete() { if (curvedCanvas == null && m_helper != null) { return; } switch (curvedCanvas.style) { case CurveStyle.Flat: case CurveStyle.Cylinder: case CurveStyle.UVSphere: { m_helper.style = curvedCanvas.style; m_helper.centerPos = transform.InverseTransformPoint(curvedCanvas.worldCenterPos); m_helper.centerRot = curvedCanvas.worldCenterRot * Quaternion.Inverse(transform.rotation); m_helper.radius = curvedCanvas.radius; m_helper.fagmentSizeSqr = curvedCanvas.fragmentSizeSqr; break; } default: { m_helper.style = CurveStyle.DontCurve; break; } } if (m_helper.styleChanged || m_helper.radiusChanged || m_helper.centerPosChanged || m_helper.centerRotChanged) { if (transform.childCount > 0) { Vector3 pos; Quaternion rot; Curved3D.Transform(m_helper.style, Vector3.zero, Quaternion.identity, m_helper.radiusInverse, m_helper.centerPos, m_helper.centerRot, out pos, out rot); for (int i = transform.childCount - 1; i >= 0; --i) { var child = transform.GetChild(i); child.localPosition = pos; child.localRotation = rot; } } m_helper.Reset(); } }