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.");
            }
        }
Beispiel #3
0
        // 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);
        }