public GraphicsPipelineBuilder Assembly(VkPrimitiveTopology topology, bool primitiveRestartEnable = false) { _asmInfo.Topology = topology; _asmInfo.PrimitiveRestartEnable = primitiveRestartEnable; return(this); }
public void SetDrawRange(VkPrimitiveTopology type, uint indexStart, uint indexCount, int vertexOffset) { PrimitiveTopology = type; IndexStart = indexStart; IndexCount = indexCount; VertexOffset = vertexOffset; }
/// <summary> /// default constructor /// </summary> public PipelineOptions() { Topology = VkPrimitiveTopology.TriangleList; PolygonMode = VkPolygonMode.Fill; CullMode = VkCullModeFlags.Back; FrontFace = VkFrontFace.Clockwise; }
public void SetDrawRange(VkPrimitiveTopology type, uint vertexStart, uint vertexCount) { PrimitiveTopology = type; IndexStart = 0; IndexCount = 0; VertexStart = vertexStart; VertexCount = vertexCount; }
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); }
/// <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); }
public void SetPrimitiveTopology(VkPrimitiveTopology type) { vkCmdSetPrimitiveTopologyEXT(handle, type); }
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); }