private IEnumerable<InputAssemblerVertexOutput> GetVertexStreamInternal(
			InputSignatureChunk vertexShaderInputSignature,
			int vertexCount, int instanceID, int vertexID, 
			VertexBufferIndex[] vertexBufferIndices)
		{
			var inputParameterCount = vertexShaderInputSignature.Parameters.Count;
			Dictionary<int, InputLayout.ProcessedInputElement> inputElementsKeyedByRegister = null;
			if (InputLayout != null)
				inputElementsKeyedByRegister = InputLayout.Elements.ToDictionary(x => x.RegisterIndex);

		    var processedVertexHandler = ProcessedVertex;

			for (int i = 0; i < vertexCount; i++)
			{
				var output = new InputAssemblerVertexOutput();
				output.VertexID = vertexID++;
				output.InstanceID = instanceID;
				output.Data = new Number4[inputParameterCount];
				
				// TODO: Support non-32-bit formats.
				foreach (var parameter in vertexShaderInputSignature.Parameters)
				{
					switch (parameter.SystemValueType)
					{
						case Name.Undefined:
						case Name.Position:
							if (inputElementsKeyedByRegister == null)
								throw new Exception("InputLayout must be set in order to use these system value types.");
							var inputElement = inputElementsKeyedByRegister[(int) parameter.Register];
							vertexBufferIndices[inputElement.InputSlot].GetData(
								output.Data, inputElement.RegisterIndex,
								inputElement.AlignedByteOffset,
								FormatHelper.SizeOfInBytes(inputElement.Format));
							break;
						case Name.VertexID:
							output.Data[parameter.Register] = new Number4(output.VertexID, 0, 0, 0);
							break;
						case Name.InstanceID:
							output.Data[parameter.Register] = new Number4(output.InstanceID, 0, 0, 0);
							break;
					}
				}

                if (processedVertexHandler != null)
                    processedVertexHandler(this, new InputAssemblerVertexEventArgs(output));

				yield return output;

				foreach (var vertexBufferIndex in vertexBufferIndices)
					vertexBufferIndex.Increment(InputClassification.PerVertexData);
			}
		}
 public InputAssemblerVertexEventArgs(InputAssemblerVertexOutput vertex)
 {
     _vertex = vertex;
 }
Esempio n. 3
0
        private IEnumerable <InputAssemblerVertexOutput> GetVertexStreamInternal(
            InputSignatureChunk vertexShaderInputSignature,
            int vertexCount, int instanceID, int vertexID,
            VertexBufferIndex[] vertexBufferIndices)
        {
            var inputParameterCount = vertexShaderInputSignature.Parameters.Count;
            Dictionary <int, InputLayout.ProcessedInputElement> inputElementsKeyedByRegister = null;

            if (InputLayout != null)
            {
                inputElementsKeyedByRegister = InputLayout.Elements.ToDictionary(x => x.RegisterIndex);
            }

            var processedVertexHandler = ProcessedVertex;

            for (int i = 0; i < vertexCount; i++)
            {
                var output = new InputAssemblerVertexOutput();
                output.VertexID   = vertexID++;
                output.InstanceID = instanceID;
                output.Data       = new Number4[inputParameterCount];

                // TODO: Support non-32-bit formats.
                foreach (var parameter in vertexShaderInputSignature.Parameters)
                {
                    switch (parameter.SystemValueType)
                    {
                    case Name.Undefined:
                    case Name.Position:
                        if (inputElementsKeyedByRegister == null)
                        {
                            throw new Exception("InputLayout must be set in order to use these system value types.");
                        }
                        var inputElement = inputElementsKeyedByRegister[(int)parameter.Register];
                        vertexBufferIndices[inputElement.InputSlot].GetData(
                            output.Data, inputElement.RegisterIndex,
                            inputElement.AlignedByteOffset,
                            FormatHelper.SizeOfInBytes(inputElement.Format));
                        break;

                    case Name.VertexID:
                        output.Data[parameter.Register] = new Number4(output.VertexID, 0, 0, 0);
                        break;

                    case Name.InstanceID:
                        output.Data[parameter.Register] = new Number4(output.InstanceID, 0, 0, 0);
                        break;
                    }
                }

                if (processedVertexHandler != null)
                {
                    processedVertexHandler(this, new InputAssemblerVertexEventArgs(output));
                }

                yield return(output);

                foreach (var vertexBufferIndex in vertexBufferIndices)
                {
                    vertexBufferIndex.Increment(InputClassification.PerVertexData);
                }
            }
        }
 public InputAssemblerVertexEventArgs(InputAssemblerVertexOutput vertex)
 {
     _vertex = vertex;
 }