private static BeginMode GetBeginMode(FlexibleModelPrimitiveTopology primitiveTopology) { switch (primitiveTopology) { case FlexibleModelPrimitiveTopology.PointList: return(BeginMode.Points); case FlexibleModelPrimitiveTopology.LineList: return(BeginMode.Lines); case FlexibleModelPrimitiveTopology.LineStrip: return(BeginMode.LineStrip); case FlexibleModelPrimitiveTopology.TriangleList: return(BeginMode.Triangles); case FlexibleModelPrimitiveTopology.TriangleStrip: return(BeginMode.TriangleStrip); case FlexibleModelPrimitiveTopology.TriangleFan: return(BeginMode.TriangleFan); case FlexibleModelPrimitiveTopology.LineListWithAdjacency: return(BeginMode.LinesAdjacency); case FlexibleModelPrimitiveTopology.LineStripWithAdjacency: return(BeginMode.LineStripAdjacency); case FlexibleModelPrimitiveTopology.TriangleListWithAdjacency: return(BeginMode.TrianglesAdjacency); case FlexibleModelPrimitiveTopology.TriangleStripWithAdjacency: return(BeginMode.TriangleStripAdjacency); case FlexibleModelPrimitiveTopology.PatchList: return(BeginMode.Patches); default: throw new ArgumentOutOfRangeException(nameof(primitiveTopology), primitiveTopology, null); } }
private MeshTopology TopologyToUnity(FlexibleModelPrimitiveTopology cgTopology) { switch (cgTopology) { case FlexibleModelPrimitiveTopology.PointList: return(MeshTopology.Points); case FlexibleModelPrimitiveTopology.LineList: return(MeshTopology.Lines); case FlexibleModelPrimitiveTopology.LineStrip: return(MeshTopology.LineStrip); case FlexibleModelPrimitiveTopology.TriangleList: return(MeshTopology.Triangles); case FlexibleModelPrimitiveTopology.TriangleStrip: case FlexibleModelPrimitiveTopology.TriangleFan: case FlexibleModelPrimitiveTopology.LineListWithAdjacency: case FlexibleModelPrimitiveTopology.LineStripWithAdjacency: case FlexibleModelPrimitiveTopology.TriangleListWithAdjacency: case FlexibleModelPrimitiveTopology.TriangleStripWithAdjacency: case FlexibleModelPrimitiveTopology.PatchList: default: throw new NotImplementedException($"Topology '{cgTopology}' is not yet supported by the Unity backend of Clarity Worlds."); } }
// todo: remove source param public static IFlexibleModel CreateSimple(IResourceSource source, VertexPosNormTex[] vertices, int[] indices, FlexibleModelPrimitiveTopology primitiveTopology) { var pack = new ResourcePack(ResourceVolatility.Immutable); //pack.Source = source; RawDataResource vertexDataRes; fixed(VertexPosNormTex *pVertices = vertices) vertexDataRes = new RawDataResource(ResourceVolatility.Immutable, (IntPtr)pVertices, vertices.Length * sizeof(VertexPosNormTex)); pack.AddSubresource("VertexArray", vertexDataRes); var hasIndices = indices != null; RawDataResource indexDataRes = null; if (hasIndices) { fixed(int *pIndices = indices) indexDataRes = new RawDataResource(ResourceVolatility.Immutable, (IntPtr)pIndices, indices.Length * sizeof(int)); pack.AddSubresource("IndexArray", indexDataRes); } var arraySubranges = hasIndices ? new[] { vertexDataRes.GetSubrange(0), indexDataRes.GetSubrange(0) } : new[] { vertexDataRes.GetSubrange(0) }; var elementInfos = VertexPosNormTex.GetElementsInfos(0); var indicesInfo = hasIndices ? new VertexIndicesInfo(1, CommonFormat.R32_UINT) : null; var vertexSet = new FlexibleModelVertexSet(ResourceVolatility.Immutable, arraySubranges, elementInfos, indicesInfo); pack.AddSubresource("VertexSet", vertexSet); var modelPart = new FlexibleModelPart { ModelMaterialName = "MainMaterial", VertexSetIndex = 0, PrimitiveTopology = primitiveTopology, IndexCount = hasIndices ? indices.Length : vertices.Length, FirstIndex = 0, VertexOffset = 0 }; var sphere = Sphere.BoundingSphere(vertices, x => x.Position); var model = new FlexibleModel(ResourceVolatility.Immutable, new[] { vertexSet }, new[] { modelPart }, sphere); pack.AddSubresource("Model", model); model.Source = source; return(model); }