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; }