使用yaml-cpp解析YAML文件时,获取未定义的节点类型

时间:2016-05-14 23:26:04

标签: yaml-cpp

我正在测试YAML,看它是否适合游戏引擎的数据存储格式。我已经创建了这个示例YAML文件:

---
ShaderProperties:
    EntryPoint                      : UnlitHomogenousVS
    Profile                         : vs_4_0
    Model                           : HLSL_4
    Uniforms:
        - name                      : gTint
          type                      : kShaderUniformTypeFloat4
          defaultValue              : 1.0f, 1.0f, 1.0f, 1.0f
          constantBuffer            : cbObjectProperties
          constantBufferOffset      : 0
          usage                     : Property
    Samplers:
    ConstantBuffers:
        - name                      : cbObjectProperties
          register                  : 2
          size                      : 16
          type                      : kShaderTypeVertex
    Attributes:
        - name                      : position
          type                      : kShaderAttributeTypeFloat4
          usage                     : kShaderAttributeUsagePosition
        - name                      : color
          type                      : kShaderAttributeTypeFloat4
          usage                     : kShaderAttributeUsageColor0
ShaderText:  >
    //--
    // UnlitHomogenous.vs
    //
    // This vertex shader will color geometry with only a homogenous transform.
    //--

    //--
    // VertexInput
    //--
    struct VertexInput
    {
        float4 position : POSITION;
        float4 color    : COLOR;
    };

    //--
    // VertexOutput
    //--
    struct VertexOutput
    {
        float4 position : SV_POSITION;
        float4 color    : COLOR;
    };

    //--
    // Global Variables
    //--

    cbuffer cbObjectProperties : register(b2)
    {
        float4 gTint = float4( 1.0f, 1.0f, 1.0f, 1.0f );
    };

    //--
    // Main Function
    //--
    VertexOutput UnlitHomogenousVS( VertexInput input )
    {
        VertexOutput output = (VertexOutput)0;

        output.position = input.position * gTint;
        output.color = input.color;

        return output;
    }
...

现在,这个文件加载并且似乎解析得很好,但是当我尝试读取节点" EntryPoint"我得到一个有效的节点返回,但是有一个未定义的节点类型,我期待一个标量。

以下是我用来读取节点的代码。

YAML::Node root = YAML::LoadFile( filepathString );

if( root.IsNull() )
{
    return Failure_FileNotFound;
}

YAML::Node shaderProperties = root[ "ShaderProperties" ];
if( shaderProperties.IsNull() )
{
    return Failure_MalformedData;
}

YAML::Node& entryPointNode = shaderProperties[ "EntryPoint" ];
if( entryPointNode.IsNull() || !entryPointNode.IsDefined() )
{
    TC_SHADER_IMPORTER_LOG_ERROR( TCString( "Failed to parse shader: ") + mCurrentName + TCString( ", no entry point was found" ) );
    return Failure_MalformedData;
}
output->mEntryPointName = entryPointNode.as<std::string>().c_str();

我有什么明显的遗失吗?我能够成功加载此文件,因此我假设YAML有效。如果我拿出支票 IsDefined()并且只是尝试将节点强制转换为字符串,我得到了错误的转换。

感谢您的帮助!

编辑:

问题是我在标签名称(EntryPoint)和冒号之间使用\ t标签而不是&#39;选项卡。

0 个答案:

没有答案