diff --git a/Engine/source/shaderGen/HLSL/customFeatureHLSL.cpp b/Engine/source/shaderGen/HLSL/customFeatureHLSL.cpp index 74c687db8..98888f3e6 100644 --- a/Engine/source/shaderGen/HLSL/customFeatureHLSL.cpp +++ b/Engine/source/shaderGen/HLSL/customFeatureHLSL.cpp @@ -206,8 +206,69 @@ void CustomFeatureHLSL::setTexData(Material::StageData &stageDat, Con::executef(mOwner, "setTextureData"); } +void CustomFeatureHLSL::addVariable(String name, String type, String defaultValue) +{ + //do the var/arg fetching here + Var *newVar = (Var*)LangElement::find(name.c_str()); + if (!newVar) + { + newVar = new Var(name, type); + LangElement *newVarDecl = new DecOp(newVar); + + if (!defaultValue.isEmpty()) + { + char declareStatement[128]; + dSprintf(declareStatement, 128, " @ = %s;\n", defaultValue.c_str()); + + meta->addStatement(new GenOp(declareStatement, newVarDecl)); + } + else + { + meta->addStatement(new GenOp(" @;\n", newVarDecl)); + } + } +} + void CustomFeatureHLSL::writeLine(String format, S32 argc, ConsoleValueRef *argv) { //do the var/arg fetching here - meta->addStatement(new GenOp(format + "\n"/*, colorAccuDecl, accuMapTex, accuMap, inTex, accuScale*/)); + Vector varList; + + for (U32 i = 0; i < argc; i++) + { + String varName = argv[i].getStringValue(); + Var *newVar = (Var*)LangElement::find(varName.c_str()); + if (!newVar) + { + //couldn't find that variable, bail out + Con::errorf("CustomShaderFeature::writeLine: unable to find variable %s, meaning it was not declared before being used!", argv[i].getStringValue()); + return; + } + + varList.push_back(newVar); + } + + //not happy about it, but do a trampoline here to pass along the args + + switch (varList.size()) + { + case 0: + meta->addStatement(new GenOp(format + "\n")); + break; + case 1: + meta->addStatement(new GenOp(format + "\n", varList[0])); + break; + case 2: + meta->addStatement(new GenOp(format + "\n", varList[0], varList[1])); + break; + case 3: + meta->addStatement(new GenOp(format + "\n", varList[0], varList[1], varList[2])); + break; + case 4: + meta->addStatement(new GenOp(format + "\n", varList[0], varList[1], varList[2], varList[3])); + break; + case 5: + meta->addStatement(new GenOp(format + "\n", varList[0], varList[1], varList[2], varList[3], varList[4])); + break; + } } \ No newline at end of file diff --git a/Engine/source/shaderGen/HLSL/customFeatureHLSL.h b/Engine/source/shaderGen/HLSL/customFeatureHLSL.h index 23d2b2ca4..834f4f72a 100644 --- a/Engine/source/shaderGen/HLSL/customFeatureHLSL.h +++ b/Engine/source/shaderGen/HLSL/customFeatureHLSL.h @@ -64,5 +64,6 @@ public: return mOwner->getName(); } + void addVariable(String name, String type, String defaultValue); void writeLine(String format, S32 argc, ConsoleValueRef *argv); }; \ No newline at end of file diff --git a/Engine/source/shaderGen/customShaderFeature.cpp b/Engine/source/shaderGen/customShaderFeature.cpp index 2809cfa57..3f6f66c10 100644 --- a/Engine/source/shaderGen/customShaderFeature.cpp +++ b/Engine/source/shaderGen/customShaderFeature.cpp @@ -84,6 +84,11 @@ void CustomShaderFeatureData::onRemove() } //Shadergen setup functions +void CustomShaderFeatureData::addVariable(String name, String type, String defaultValue) +{ + mFeatureHLSL->addVariable(name, type, defaultValue); +} + void CustomShaderFeatureData::writeLine(String format, S32 argc, ConsoleValueRef *argv) { /*mOnObject = onObject; @@ -126,16 +131,15 @@ void CustomShaderFeatureData::setTexData(Material::StageData &stageDat, mFeatureHLSL.setTexData(stageDat, fd, passData, texIndex); }*/ -/*DefineEngineMethod(CustomShaderFeatureData, newVar, void, (String name, String type), ("", ""), "") +DefineEngineMethod(CustomShaderFeatureData, addVariable, void, (String name, String type, String defaultValue), ("", "", ""), "") { - object->newVar(name, type); -}*/ + object->addVariable(name, type, defaultValue); +} ConsoleMethod(CustomShaderFeatureData, writeLine, void, 3, 0, "( string format, string args... ) Dynamically call a method on an object.\n" "@param method Name of method to call.\n" "@param args Zero or more arguments for the method.\n" "@return The result of the method call.") { - argv[1] = argv[2]; - object->writeLine(argv[1], argc - 1, argv + 1); + object->writeLine(argv[2], argc - 3, argv + 3); } \ No newline at end of file diff --git a/Engine/source/shaderGen/customShaderFeature.h b/Engine/source/shaderGen/customShaderFeature.h index f40f55152..312728df1 100644 --- a/Engine/source/shaderGen/customShaderFeature.h +++ b/Engine/source/shaderGen/customShaderFeature.h @@ -58,6 +58,7 @@ public: void onRemove(); //shadergen setup + void addVariable(String name, String type, String defaultValue); void writeLine(String format, S32 argc, ConsoleValueRef *argv); //shader generation