protected void WriteStructure(StringBuilder sb, StructureDefinition sd) { sb.AppendLine($"struct {CSharpToShaderType(sd.Name)}"); sb.AppendLine("{"); HlslSemanticTracker tracker = new HlslSemanticTracker(); StringBuilder fb = new StringBuilder(); foreach (FieldDefinition field in sd.Fields) { fb.Append(CSharpToShaderType(field.Type.Name.Trim())); fb.Append(' '); fb.Append(CorrectIdentifier(field.Name.Trim())); int arrayCount = field.ArrayElementCount; if (arrayCount > 0) { fb.Append('['); fb.Append(arrayCount); fb.Append(']'); } fb.Append(HlslSemantic(field.SemanticType, ref tracker)); fb.Append(';'); sb.Append(" "); sb.AppendLine(fb.ToString()); fb.Clear(); } sb.AppendLine("};"); sb.AppendLine(); }
private string HlslSemantic(SemanticType semanticType, ref HlslSemanticTracker tracker) { switch (semanticType) { case SemanticType.None: return(string.Empty); case SemanticType.Position: { int val = tracker.Position++; return(" : POSITION" + val.ToString()); } case SemanticType.Normal: { int val = tracker.Normal++; return(" : NORMAL" + val.ToString()); } case SemanticType.TextureCoordinate: { int val = tracker.TexCoord++; return(" : TEXCOORD" + val.ToString()); } case SemanticType.Color: { int val = tracker.Color++; return(" : COLOR" + val.ToString()); } case SemanticType.Tangent: { int val = tracker.Tangent++; return(" : TANGENT" + val.ToString()); } case SemanticType.SystemPosition: { return(" : SV_Position"); } case SemanticType.ColorTarget: { int val = tracker.ColorTarget++; return(" : SV_Target" + val.ToString()); } default: throw new ShaderGenerationException("Invalid semantic type: " + semanticType); } }
private string HlslSemantic(SemanticType semanticType, bool fragmentSemantics, ref HlslSemanticTracker tracker) { switch (semanticType) { case SemanticType.None: return(string.Empty); case SemanticType.Position: if (fragmentSemantics) { if (!tracker.emittedSvPosition) { tracker.emittedSvPosition = true; return(" : SV_POSITION"); } else { int val = tracker.Position++; return(" : POSITION" + val.ToString()); } } else { int val = tracker.Position++; return(" : POSITION" + val.ToString()); } case SemanticType.Normal: { int val = tracker.Normal++; return(" : NORMAL" + val.ToString()); } case SemanticType.TextureCoordinate: { int val = tracker.TexCoord++; return(" : TEXCOORD" + val.ToString()); } case SemanticType.Color: { int val = tracker.Color++; return(" : COLOR" + val.ToString()); } case SemanticType.Tangent: { int val = tracker.Tangent++; return(" : TANGENT" + val.ToString()); } default: throw new ShaderGenerationException("Invalid semantic type: " + semanticType); } }