Esempio n. 1
0
 public GraphicsPipelineBuilder Assembly(VkPrimitiveTopology topology,
                                         bool primitiveRestartEnable = false)
 {
     _asmInfo.Topology = topology;
     _asmInfo.PrimitiveRestartEnable = primitiveRestartEnable;
     return(this);
 }
Esempio n. 2
0
 public void SetDrawRange(VkPrimitiveTopology type, uint indexStart, uint indexCount, int vertexOffset)
 {
     PrimitiveTopology = type;
     IndexStart        = indexStart;
     IndexCount        = indexCount;
     VertexOffset      = vertexOffset;
 }
Esempio n. 3
0
 /// <summary>
 ///  default constructor
 /// </summary>
 public PipelineOptions()
 {
     Topology    = VkPrimitiveTopology.TriangleList;
     PolygonMode = VkPolygonMode.Fill;
     CullMode    = VkCullModeFlags.Back;
     FrontFace   = VkFrontFace.Clockwise;
 }
Esempio n. 4
0
 public void SetDrawRange(VkPrimitiveTopology type, uint vertexStart, uint vertexCount)
 {
     PrimitiveTopology = type;
     IndexStart        = 0;
     IndexCount        = 0;
     VertexStart       = vertexStart;
     VertexCount       = vertexCount;
 }
Esempio n. 5
0
        public static VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo(
            VkPrimitiveTopology topology,
            uint flags,
            uint primitiveRestartEnable)
        {
            VkPipelineInputAssemblyStateCreateInfo pipelineInputAssemblyStateCreateInfo = VkPipelineInputAssemblyStateCreateInfo.New();

            pipelineInputAssemblyStateCreateInfo.topology = topology;
            pipelineInputAssemblyStateCreateInfo.flags    = flags;
            pipelineInputAssemblyStateCreateInfo.primitiveRestartEnable = primitiveRestartEnable;
            return(pipelineInputAssemblyStateCreateInfo);
        }
Esempio n. 6
0
        /// <summary>
        /// Create a default pipeline configuration with viewport and scissor as dynamic states. One blend attachment is
        /// added automatically with blending disabled. (cfg.blendAttachments[0])
        /// If width and height parameter are omitted viewport and scissor dynamic states are automatically added, else
        /// a viewport and a vkrect2d are added to the viewport and scissor lists.
        /// </summary>
        public static GraphicPipelineConfig CreateDefault(VkPrimitiveTopology topology = VkPrimitiveTopology.TriangleList,
                                                          VkSampleCountFlags samples   = VkSampleCountFlags.SampleCount1, bool depthTestEnabled = true, int width = -1, int height = -1)
        {
            GraphicPipelineConfig cfg = new GraphicPipelineConfig();

            cfg.inputAssemblyState.topology           = topology;
            cfg.multisampleState.rasterizationSamples = samples;

            cfg.rasterizationState.polygonMode             = VkPolygonMode.Fill;
            cfg.rasterizationState.cullMode                = (uint)VkCullModeFlags.None;
            cfg.rasterizationState.frontFace               = VkFrontFace.CounterClockwise;
            cfg.rasterizationState.depthClampEnable        = False;
            cfg.rasterizationState.rasterizerDiscardEnable = False;
            cfg.rasterizationState.depthBiasEnable         = False;
            cfg.rasterizationState.lineWidth               = 1.0f;

            cfg.blendAttachments.Add(new VkPipelineColorBlendAttachmentState(false));

            if (width < 0)
            {
                cfg.dynamicStates.Add(VkDynamicState.Viewport);
                cfg.dynamicStates.Add(VkDynamicState.Scissor);
            }
            else
            {
                cfg.Viewports.Add(new VkViewport {
                    height = height, width = width, minDepth = 0f, maxDepth = 1f
                });
                cfg.Scissors.Add(new VkRect2D((uint)width, (uint)height));
            }

            if (depthTestEnabled)
            {
                cfg.depthStencilState.depthTestEnable       = True;
                cfg.depthStencilState.depthWriteEnable      = True;
                cfg.depthStencilState.depthCompareOp        = VkCompareOp.LessOrEqual;
                cfg.depthStencilState.depthBoundsTestEnable = False;
                cfg.depthStencilState.back.failOp           = VkStencilOp.Keep;
                cfg.depthStencilState.back.passOp           = VkStencilOp.Keep;
                cfg.depthStencilState.back.compareOp        = VkCompareOp.Always;
                cfg.depthStencilState.stencilTestEnable     = False;
                cfg.depthStencilState.front = cfg.depthStencilState.back;
            }

            return(cfg);
        }
Esempio n. 7
0
 public void SetPrimitiveTopology(VkPrimitiveTopology type)
 {
     vkCmdSetPrimitiveTopologyEXT(handle, type);
 }
Esempio n. 8
0
        protected override bool OnLoad(Model model, File stream)
        {
            String fileID = stream.ReadFileID();

            if (fileID != "UMDL" && fileID != "UMD2")
            {
                Log.Error("Invalid model file");
                return(false);
            }

            bool hasVertexDeclarations = (fileID == "UMD2");

            int memoryUse = Unsafe.SizeOf <Model>();

            List <Buffer>     vertexBuffers_;
            List <Buffer>     indexBuffers_;
            List <Geometry[]> geometries_ = new List <Geometry[]>();

            VertexBufferDesc[]    loadVBData_;
            IndexBufferDesc[]     loadIBData_;
            List <GeometryDesc[]> loadGeometries_;

            // Read vertex buffers
            int numVertexBuffers = (int)stream.Read <uint>();

            vertexBuffers_ = new List <Buffer>();//[numVertexBuffers];
            vertexBuffers_.Resize(numVertexBuffers);
            var morphRangeStarts_ = new int[numVertexBuffers];
            var morphRangeCounts_ = new int[numVertexBuffers];

            loadVBData_ = new VertexBufferDesc[numVertexBuffers];
            var GeometryBoneMappings = new List <int[]>();
            var GeometryCenters      = new List <vec3>();

            for (int i = 0; i < numVertexBuffers; ++i)
            {
                loadVBData_[i].vertexCount_ = stream.Read <int>();
                uint vertexSize = 0;
                if (!hasVertexDeclarations)
                {
                    uint elementMask = stream.Read <uint>();
                    loadVBData_[i].layout = CreateVertexInputStateCreateInfo(elementMask, out vertexSize);
                }
                else
                {
                    /*
                     * enum VertexElementSemantic
                     * {
                     *  SEM_POSITION = 0,
                     *  SEM_NORMAL,
                     *  SEM_BINORMAL,
                     *  SEM_TANGENT,
                     *  SEM_TEXCOORD,
                     *  SEM_COLOR,
                     *  SEM_BLENDWEIGHTS,
                     *  SEM_BLENDINDICES,
                     *  SEM_OBJECTINDEX,
                     *  MAX_VERTEX_ELEMENT_SEMANTICS
                     * }*/

                    uint numElements = stream.Read <uint>();
                    FastList <VertexAttribute> attrs = new FastList <VertexAttribute>();
                    uint offset = 0;
                    for (uint j = 0; j < numElements; ++j)
                    {
                        uint elementDesc = stream.Read <uint>();
                        uint type        = (elementDesc & 0xff);
                        uint semantic    = ((elementDesc >> 8) & 0xff);
                        uint index       = ((elementDesc >> 16) & 0xff);

                        VertexAttribute attr = new VertexAttribute(0, j, semanticToFormat[semantic], offset);
                        offset += semanticSize[semantic];
                        attrs.Add(attr);
                    }

                    vertexSize = offset;
                    var layout = new VertexLayout(attrs.ToArray());
                    loadVBData_[i].layout = layout;
                    //layout.Print();
                }

                morphRangeStarts_[i]       = stream.Read <int>();
                morphRangeCounts_[i]       = stream.Read <int>();
                loadVBData_[i].vertexSize_ = (int)vertexSize;
                loadVBData_[i].dataSize_   = loadVBData_[i].vertexCount_ * (int)vertexSize;
                loadVBData_[i].data_       = stream.ReadArray <byte>(loadVBData_[i].dataSize_);
            }

            // Read index buffers
            int numIndexBuffers = (int)stream.Read <uint>();

            indexBuffers_ = new List <Buffer>();//[numIndexBuffers];
            indexBuffers_.Resize(numIndexBuffers);
            loadIBData_ = new IndexBufferDesc[numIndexBuffers];
            for (int i = 0; i < numIndexBuffers; ++i)
            {
                int indexCount = stream.Read <int>();
                int indexSize  = stream.Read <int>();

                loadIBData_[i].indexCount_ = indexCount;
                loadIBData_[i].indexSize_  = indexSize;
                loadIBData_[i].dataSize_   = indexCount * indexSize;
                loadIBData_[i].data_       = stream.ReadArray <byte>(loadIBData_[i].dataSize_);
            }

            // Read geometries
            int numGeometries = stream.Read <int>();

            loadGeometries_ = new List <GeometryDesc[]>(numGeometries);
            geometries_.Resize(numGeometries);

            for (int i = 0; i < numGeometries; ++i)
            {
                // Read bone mappings
                int   boneMappingCount = stream.Read <int>();
                int[] boneMapping      = new int[boneMappingCount];
                for (uint j = 0; j < boneMappingCount; ++j)
                {
                    boneMapping[j] = stream.Read <int>();
                }

                GeometryBoneMappings.Add(boneMapping);

                int            numLodLevels      = stream.Read <int>();
                Geometry[]     geometryLodLevels = new Geometry[numLodLevels];
                GeometryDesc[] deoDesc           = new GeometryDesc[numLodLevels];
                loadGeometries_.Add(deoDesc);
                for (int j = 0; j < numLodLevels; ++j)
                {
                    float distance = stream.Read <float>();

                    /*
                     *  public enum PrimitiveType : ushort
                     *  {
                     *      TRIANGLE_LIST = 0,
                     *      TRIANGLE_STRIP,
                     *      LINE_LIST,
                     *      LINE_STRIP,
                     *      POINT_LIST
                     *  }
                     */

                    VkPrimitiveTopology type = primitiveType2Topology[stream.Read <int>()];
                    int vbRef      = stream.Read <int>();
                    int ibRef      = stream.Read <int>();
                    int indexStart = stream.Read <int>();
                    int indexCount = stream.Read <int>();

                    if (vbRef >= vertexBuffers_.Count)
                    {
                        Log.Error("Vertex buffer index out of bounds");
                        loadVBData_ = null;
                        loadIBData_ = null;
                        loadGeometries_.Clear();
                        return(false);
                    }

                    if (ibRef >= indexBuffers_.Count)
                    {
                        Log.Error("Index buffer index out of bounds");
                        loadVBData_ = null;
                        loadIBData_ = null;
                        loadGeometries_.Clear();
                        return(false);
                    }

                    Geometry geometry = new Geometry();
                    geometry.LodDistance = distance;

                    // Prepare geometry to be defined during EndLoad()
                    deoDesc[j].primitiveTopology = type;
                    deoDesc[j].vbRef             = vbRef;
                    deoDesc[j].ibRef             = ibRef;
                    deoDesc[j].indexStart        = indexStart;
                    deoDesc[j].indexCount        = indexCount;

                    geometryLodLevels[j] = geometry;
                    memoryUse           += Unsafe.SizeOf <Geometry>();
                }

                geometries_[i] = geometryLodLevels;
            }

            // Read morphs
            uint numMorphs = stream.Read <uint>();
            var  morphs_   = new ModelMorph[(int)numMorphs];

            for (int i = 0; i < numMorphs; ++i)
            {
                morphs_[i].name_   = stream.ReadCString();
                morphs_[i].weight_ = 0.0f;
                uint numBuffers = stream.Read <uint>();

                for (int j = 0; j < numBuffers; ++j)
                {
                    VertexBufferMorph newBuffer;
                    int bufferIndex = stream.Read <int>();

                    newBuffer.elementMask_ = stream.Read <uint>();
                    newBuffer.vertexCount_ = stream.Read <int>();

                    // Base size: size of each vertex index
                    int vertexSize = sizeof(int);
                    // Add size of individual elements
                    unsafe
                    {
                        if ((newBuffer.elementMask_ & MASK_POSITION) != 0)
                        {
                            vertexSize += sizeof(vec3);
                        }
                        if ((newBuffer.elementMask_ & MASK_NORMAL) != 0)
                        {
                            vertexSize += sizeof(vec3);
                        }
                        if ((newBuffer.elementMask_ & MASK_TANGENT) != 0)
                        {
                            vertexSize += sizeof(vec3);
                        }
                    }

                    newBuffer.dataSize_              = newBuffer.vertexCount_ * (int)vertexSize;
                    newBuffer.morphData_             = stream.ReadArray <byte>((int)newBuffer.dataSize_);
                    morphs_[i].buffers_[bufferIndex] = newBuffer;
                    memoryUse += Unsafe.SizeOf <VertexBufferMorph>() + newBuffer.vertexCount_ * vertexSize;
                }

                memoryUse += Unsafe.SizeOf <ModelMorph>();
            }

            Skeleton skeleton_ = new Skeleton();

            // Read skeleton
            skeleton_.Load(stream);
            memoryUse += skeleton_.NumBones * Unsafe.SizeOf <Bone>();

            // Read bounding box
            var boundingBox_ = stream.Read <BoundingBox>();

            // Read geometry centers
            for (int i = 0; i < geometries_.Count && !stream.IsEof; ++i)
            {
                GeometryCenters.Add(stream.Read <vec3>());
            }
            while (GeometryCenters.Count < geometries_.Count)
            {
                GeometryCenters.Add(vec3.Zero);
            }

            model.VertexBuffers = vertexBuffers_;
            model.IndexBuffers  = indexBuffers_;

            model.Skeleton             = skeleton_;
            model.BoundingBox          = boundingBox_;
            model.Geometries           = geometries_;
            model.GeometryBoneMappings = GeometryBoneMappings;
            model.GeometryCenters      = GeometryCenters;
            //model.morphRangeStarts_ = morphRangeStarts_;
            //model.morphRangeCounts_ = morphRangeCounts_;
            model.MemoryUse = memoryUse;

            for (int i = 0; i < vertexBuffers_.Count; ++i)
            {
                ref VertexBufferDesc desc = ref loadVBData_[i];
                if (desc.data_ != null)
                {
                    vertexBuffers_[i] = Buffer.Create(VkBufferUsageFlags.VertexBuffer, false
                                                      , (uint)desc.vertexSize_, (uint)desc.vertexCount_, Utilities.AsPointer(ref desc.data_[0]));
                }
            }
 protected override void PlatformSetPrimitiveTopology(PrimitiveTopology primitiveTopology)
 {
     _primitiveTopology = VkFormats.VeldridToVkPrimitiveTopology(primitiveTopology);
 }