// AssShader.cpp : Defines the entry point for the console application. // #include "plFileSystem.h" #include #include void ICreateHeader(const plString& varName, const plFileName& fileName, FILE* fp, LPD3DXBUFFER shader) { fputs("\n\n\n", fp); int byteLen = shader->GetBufferSize(); int quadLen = byteLen >> 2; unsigned char* codes = (unsigned char*)shader->GetBufferPointer(); plPrintf(fp, "static const uint32_t {}byteLen = {};\n\n", varName, byteLen); plPrintf(fp, "static const uint8_t {}Codes[] = {\n", varName); int i; for( i = 0; i < quadLen-1; i++ ) { plPrintf(fp, "\t0x{x},", *codes++); plPrintf(fp, "\t0x{x},", *codes++); plPrintf(fp, "\t0x{x},", *codes++); plPrintf(fp, "\t0x{x},\n", *codes++); } plPrintf(fp, "\t0x{x},", *codes++); plPrintf(fp, "\t0x{x},", *codes++); plPrintf(fp, "\t0x{x},", *codes++); plPrintf(fp, "\t0x{x}\n", *codes++); fputs("\t};", fp); fputs("\n\n", fp); plPrintf(fp, "static const plShaderDecl {}Decl(\"{}\", {}, {}byteLen, {}Codes);\n\n", varName, fileName, varName, varName, varName); plPrintf(fp, "static const plShaderRegister {}Register(&{}Decl);\n\n", varName, varName); } int main(int argc, char* argv[]) { if( argc < 2 ) { plPrintf("{} ...\n", argv[0]); return 0; } const char* const * nameList = nullptr; int numNames = 0; if (stricmp(argv[1], "all") == 0) { // Just copy in the enum and use Replace on // vs_ => "vs_ // ps_ => "ps_ // , => ", static const char* kEnumNames[] = { "vs_WaveFixedFin6", "ps_WaveFixed", "vs_CompCosines", "ps_CompCosines", "vs_ShoreLeave6", "ps_ShoreLeave6", "vs_WaveRip", "ps_WaveRip", "vs_WaveDec1Lay", "vs_WaveDec2Lay11", "vs_WaveDec2Lay12", "vs_WaveDecEnv", "ps_CbaseAbase", "ps_CalphaAbase", "ps_CalphaAMult", "ps_CalphaAadd", "ps_CaddAbase", "ps_CaddAMult", "ps_CaddAAdd", "ps_CmultAbase", "ps_CmultAMult", "ps_CmultAAdd", "ps_WaveDecEnv", "vs_WaveGraph2", "ps_WaveGraph", "vs_WaveGridFin", "ps_WaveGrid", "vs_BiasNormals", "ps_BiasNormals", "vs_ShoreLeave7", "vs_WaveRip7", "ps_MoreCosines", "vs_WaveDec1Lay_7", "vs_WaveDec2Lay11_7", "vs_WaveDec2Lay12_7", "vs_WaveDecEnv_7", "vs_WaveFixedFin7", "vs_GrassShader", "ps_GrassShader" }; nameList = kEnumNames; numNames = arrsize(kEnumNames); } else { nameList = argv+1; numNames = argc-1; } for (int i = 0; i < numNames; i++ ) { const char* name = nameList[i]; plString varName = plFileName(name).StripFileExt().AsString(); plFileName inFile = plFormat("{}.inl", varName); plFileName outFile = plFormat("{}.h", varName); plPrintf("Processing {} into {}\n", name, outFile); FILE* fp = fopen(outFile.AsString().c_str(), "w"); if (!fp) { fputs("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout); plPrintf("Error opening file %s for output\n", outFile); fputs("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout); continue; } LPD3DXBUFFER compiledShader = nullptr; LPD3DXBUFFER compilationErrors = nullptr; DWORD flags = 0; LPD3DXINCLUDE include = nullptr; HRESULT hr = D3DXAssembleShaderFromFile( inFile.AsString().c_str(), nullptr, include, flags, &compiledShader, &compilationErrors); if (FAILED(hr)) { fputs("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n", stdout); fputs(compilationErrors ? (const char*)compilationErrors->GetBufferPointer() : "File not found", stdout); continue; } ICreateHeader(varName, plFormat("sha/{}.inl", varName), fp, compiledShader); fclose(fp); } return 0; }