Beispiel #1
0
void Technique::Load( const char *filename )
{
	char buffer[512];
	PHYSFS_File *f = PHYSFS_openRead( fs::MakeCanonicalForm( buffer, filename ) );
	if ( f )
	{
		char line[512];
		while ( PHYSFS_gets( line, sizeof(line), f ) )
		{
			char str[256];
			if ( sscanf( line, "pass %s", str ) == 1 )
			{
				TechniquePass pass;
				if ( ParsePass( pass, f, str ) )
				{
					passes.push_back( pass );
				}
			}
		}
		PHYSFS_close(f);
	} else
	{
		TechniquePass pass;
		pass.pass = RP_Opaque;
		pass.shader = shaderManager()->Load( "_default" );
		pass.blendSrc = hw::BLEND_ONE;
		pass.blendDst = hw::BLEND_ZERO;
		passes.push_back( pass );
	}
}
CMaterial* CMaterialLoader::Load(const char* szName) {
    std::string str = "material/";
    str += szName;
    
	byte* buffer = NULL;
	unsigned int size = 0;
	if (!CXFile::ReadText(str.c_str(), buffer, size)) {
        XELOG("material file error: %s", szName);
		return NULL;
	}

	Json::Reader reader;
	Json::Value root;
	if (!reader.parse((const char*)buffer, root)) {
        XELOG("material parse error: %s", szName);
		XEDELETE(buffer);
		return NULL;
	}
    XEDELETE(buffer);

    for (int i=0; i<root.size(); ++i) {
        Json::Value& value = root[i];
        std::string type = value["type"].asString();
        printf("%s\n", type.c_str());
    }
    
    Json::Value material = CJson::GetByType(root, "material");
    if (material.isNull()) {
        XELOG("material not find material: %s", szName);
        return NULL;
    }
    
    CMaterial* pMaterial = XENEW(CMaterial);
    if (!pMaterial) {
        return NULL;
    }
    
    // 技术列表,目前只解析一个
    Json::Value& t_list = material["list"];
    Json::Value& technique = t_list[0];
    
    CTechnique* pTechnique = XENEW(CTechnique);
    if (!pTechnique) {
        XEDELETE(pMaterial);
        return NULL;
    }
    pMaterial->SetTechnique(pTechnique);
    
    // 解析pass列表,目前只解析一个
    Json::Value& p_list = technique["list"];
    Json::Value& pass = p_list[0];
    
    // 解析pass
    CPass* pPass = ParsePass(pass, root);
    if (!pPass) {
        XEDELETE(pMaterial);
    }
    pTechnique->SetPass(pPass);
    
    return pMaterial;
}