Browse Source

Implement plShaderAssembler

Chloe Rhodes 12 years ago
parent
commit
38e26dd12e
  1. BIN
      Sources/Plasma/PubUtilLib/plSurface/ShaderSrc/AssShader.zip
  2. 1
      Sources/Tools/CMakeLists.txt
  3. 16
      Sources/Tools/plShaderAssembler/CMakeLists.txt
  4. 207
      Sources/Tools/plShaderAssembler/main.cpp

BIN
Sources/Plasma/PubUtilLib/plSurface/ShaderSrc/AssShader.zip

Binary file not shown.

1
Sources/Tools/CMakeLists.txt

@ -1,5 +1,6 @@
add_subdirectory(plLocalizationEditor)
add_subdirectory(plResBrowser)
add_subdirectory(plShaderAssembler)
if(FREETYPE_FOUND)
add_subdirectory(plFontConverter)

16
Sources/Tools/plShaderAssembler/CMakeLists.txt

@ -0,0 +1,16 @@
include_directories("../../Plasma/CoreLib")
if(WIN32)
include_directories(${DirectX_INCLUDE_DIR})
endif(WIN32)
set(plShaderAssembler_SOURCES
main.cpp
)
add_executable(plShaderAssembler ${plShaderAssembler_SOURCES})
target_link_libraries(plShaderAssembler ${DirectX_LIBRARIES})
target_link_libraries(plShaderAssembler CoreLib)
source_group("Source Files" FILES ${plShaderAssembler_SOURCES})

207
Sources/Tools/plShaderAssembler/main.cpp

@ -0,0 +1,207 @@
// AssShader.cpp : Defines the entry point for the console application.
//
#include <D3d9.h>
#include <D3dx9core.h>
#include "plFileSystem.h"
void ICreateHeader(const char* const varName, const char* const fileName, FILE* fp, LPD3DXBUFFER shader)
{
fprintf(fp, "\n\n\n");
int byteLen = shader->GetBufferSize();
int quadLen = byteLen >> 2;
unsigned char* codes = (unsigned char*)shader->GetBufferPointer();
fprintf(fp, "static const uint32_t %sbyteLen = %d;\n\n", varName, byteLen);
fprintf(fp, "static const uint8_t %sCodes[] = {\n", varName);
int i;
for( i = 0; i < quadLen-1; i++ )
{
fprintf(fp, "\t0x%x,", *codes++);
fprintf(fp, "\t0x%x,", *codes++);
fprintf(fp, "\t0x%x,", *codes++);
fprintf(fp, "\t0x%x,\n", *codes++);
}
fprintf(fp, "\t0x%x,", *codes++);
fprintf(fp, "\t0x%x,", *codes++);
fprintf(fp, "\t0x%x,", *codes++);
fprintf(fp, "\t0x%x\n", *codes++);
fprintf(fp, "\t};");
fprintf(fp, "\n\n");
fprintf(fp, "static const plShaderDecl %sDecl(\"%s\", %s, %sbyteLen, %sCodes);\n\n", varName, fileName, varName, varName, varName);
fprintf(fp, "static const plShaderRegister %sRegister(&%sDecl);\n\n", varName, varName);
}
int main(int argc, char* argv[])
{
if( argc < 2 )
{
printf("%s <file0> <file1> ...\n", argv[0]);
return 0;
}
const char* const * nameList = 0L;
int numNames = 0;
if( !_stricmp(argv[1], "all") )
{
// Cut and paste enum and add kNumEnumNames to end
// so you don't have to count.
enum {
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,
kNumEnumNames
};
// Just copy in the enum and use Replace on
// vs_ => "vs_
// ps_ => "ps_
// , => ",
const char* kEnumNames[kNumEnumNames] = {
"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 = kNumEnumNames;
}
else
{
nameList = argv+1;
numNames = argc-1;
}
int i;
for( i = 0; i < numNames; i++ )
{
const char* name = nameList[i];
char varName[512];
strcpy(varName, name);
char* p = strrchr(varName, '.');
if( p )
*p = 0;
char inFile[512];
sprintf(inFile, "%s.inl", varName);
char outFile[512];
sprintf(outFile, "%s.h", varName);
printf("Processing %s into %s\n", name, outFile);
FILE* fp = fopen(outFile, "w");
if( !fp )
{
printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
printf("Error opening file %s for output\n");
printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
continue;
}
LPD3DXBUFFER compiledShader = 0L;
LPD3DXBUFFER compilationErrors = 0L;
DWORD flags = 0;
LPD3DXINCLUDE include = 0L;
HRESULT hr = D3DXAssembleShaderFromFile(
inFile,
0L,
include,
flags,
&compiledShader,
&compilationErrors);
if( FAILED(hr) )
{
printf("%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%\n");
printf(compilationErrors ? (char*)compilationErrors->GetBufferPointer() : "File not found");
continue;
}
sprintf(inFile, "sha/%s.inl", varName);
ICreateHeader(varName, inFile, fp, compiledShader);
fclose(fp);
}
return 0;
}
Loading…
Cancel
Save