diff --git a/Engine/source/T3D/gameBase/moveManager.h b/Engine/source/T3D/gameBase/moveManager.h index 6b26c4196..539046dc4 100644 --- a/Engine/source/T3D/gameBase/moveManager.h +++ b/Engine/source/T3D/gameBase/moveManager.h @@ -57,7 +57,7 @@ struct Move bool trigger[MaxTriggerKeys]; Move(); - + virtual ~Move() {}; virtual void pack(BitStream *stream, const Move * move = NULL); virtual void unpack(BitStream *stream, const Move * move = NULL); virtual void clamp(); diff --git a/Engine/source/T3D/player.cpp b/Engine/source/T3D/player.cpp index f2e54900a..7c0fd1aca 100644 --- a/Engine/source/T3D/player.cpp +++ b/Engine/source/T3D/player.cpp @@ -4014,9 +4014,9 @@ void Player::updateActionThread() mActionAnimation.callbackTripped = true; } - if ((mActionAnimation.action == PlayerData::NullAnimation) || - ((!mActionAnimation.waitForEnd || mActionAnimation.atEnd) && - (!mActionAnimation.holdAtEnd && (mActionAnimation.delayTicks -= !mMountPending) <= 0))) + if (mActionAnimation.action == PlayerData::NullAnimation || !mActionAnimation.waitForEnd || //either no animation or not waiting till the end + ((mActionAnimation.atEnd && !mActionAnimation.holdAtEnd) && //or not holding that state and + (mActionAnimation.delayTicks -= mMountPending) <= 0)) //not waiting to mount { pickActionAnimation(); } diff --git a/Engine/source/console/console.h b/Engine/source/console/console.h index df921c694..b3163e5c5 100644 --- a/Engine/source/console/console.h +++ b/Engine/source/console/console.h @@ -246,6 +246,7 @@ public: return s == StringTable->EmptyString() ? 0 : dAtoi(s); if (type == ConsoleValueType::cvString) return dStrcmp(s, "") == 0 ? 0 : dAtoi(s); + return dAtoi(getConsoleData()); } diff --git a/Engine/source/console/torquescript/CMDscan.cpp b/Engine/source/console/torquescript/CMDscan.cpp index ccf1aacb5..4497cb961 100644 --- a/Engine/source/console/torquescript/CMDscan.cpp +++ b/Engine/source/console/torquescript/CMDscan.cpp @@ -1301,7 +1301,8 @@ case 5: /* rule 5 can match eol */ YY_RULE_SETUP #line 120 "CMDscan.l" -{ yycolumn = 1; +{ + yycolumn = 1; lines.push_back(String::ToString("%s", yytext+1)); if (lines.size() > Con::getIntVariable("$scriptErrorLineCount", 10)) lines.erase(lines.begin()); @@ -1311,162 +1312,162 @@ YY_RULE_SETUP YY_BREAK case 6: YY_RULE_SETUP -#line 127 "CMDscan.l" +#line 128 "CMDscan.l" { return(Sc_ScanString(STRATOM)); } YY_BREAK case 7: YY_RULE_SETUP -#line 128 "CMDscan.l" +#line 129 "CMDscan.l" { return(Sc_ScanString(TAGATOM)); } YY_BREAK case 8: YY_RULE_SETUP -#line 129 "CMDscan.l" +#line 130 "CMDscan.l" { CMDlval.i = MakeToken< int >( opEQ, yylineno ); return opEQ; } YY_BREAK case 9: YY_RULE_SETUP -#line 130 "CMDscan.l" +#line 131 "CMDscan.l" { CMDlval.i = MakeToken< int >( opNE, yylineno ); return opNE; } YY_BREAK case 10: YY_RULE_SETUP -#line 131 "CMDscan.l" +#line 132 "CMDscan.l" { CMDlval.i = MakeToken< int >( opGE, yylineno ); return opGE; } YY_BREAK case 11: YY_RULE_SETUP -#line 132 "CMDscan.l" +#line 133 "CMDscan.l" { CMDlval.i = MakeToken< int >( opLE, yylineno ); return opLE; } YY_BREAK case 12: YY_RULE_SETUP -#line 133 "CMDscan.l" +#line 134 "CMDscan.l" { CMDlval.i = MakeToken< int >( opAND, yylineno ); return opAND; } YY_BREAK case 13: YY_RULE_SETUP -#line 134 "CMDscan.l" +#line 135 "CMDscan.l" { CMDlval.i = MakeToken< int >( opOR, yylineno ); return opOR; } YY_BREAK case 14: YY_RULE_SETUP -#line 135 "CMDscan.l" +#line 136 "CMDscan.l" { CMDlval.i = MakeToken< int >( opCOLONCOLON, yylineno ); return opCOLONCOLON; } YY_BREAK case 15: YY_RULE_SETUP -#line 136 "CMDscan.l" +#line 137 "CMDscan.l" { CMDlval.i = MakeToken< int >( opMINUSMINUS, yylineno ); return opMINUSMINUS; } YY_BREAK case 16: YY_RULE_SETUP -#line 137 "CMDscan.l" +#line 138 "CMDscan.l" { CMDlval.i = MakeToken< int >( opPLUSPLUS, yylineno ); return opPLUSPLUS; } YY_BREAK case 17: YY_RULE_SETUP -#line 138 "CMDscan.l" +#line 139 "CMDscan.l" { CMDlval.i = MakeToken< int >( opSTREQ, yylineno ); return opSTREQ; } YY_BREAK case 18: YY_RULE_SETUP -#line 139 "CMDscan.l" +#line 140 "CMDscan.l" { CMDlval.i = MakeToken< int >( opSTRNE, yylineno ); return opSTRNE; } YY_BREAK case 19: YY_RULE_SETUP -#line 140 "CMDscan.l" +#line 141 "CMDscan.l" { CMDlval.i = MakeToken< int >( opSHL, yylineno ); return opSHL; } YY_BREAK case 20: YY_RULE_SETUP -#line 141 "CMDscan.l" +#line 142 "CMDscan.l" { CMDlval.i = MakeToken< int >( opSHR, yylineno ); return opSHR; } YY_BREAK case 21: YY_RULE_SETUP -#line 142 "CMDscan.l" +#line 143 "CMDscan.l" { CMDlval.i = MakeToken< int >( opPLASN, yylineno ); return opPLASN; } YY_BREAK case 22: YY_RULE_SETUP -#line 143 "CMDscan.l" +#line 144 "CMDscan.l" { CMDlval.i = MakeToken< int >( opMIASN, yylineno ); return opMIASN; } YY_BREAK case 23: YY_RULE_SETUP -#line 144 "CMDscan.l" +#line 145 "CMDscan.l" { CMDlval.i = MakeToken< int >( opMLASN, yylineno ); return opMLASN; } YY_BREAK case 24: YY_RULE_SETUP -#line 145 "CMDscan.l" +#line 146 "CMDscan.l" { CMDlval.i = MakeToken< int >( opDVASN, yylineno ); return opDVASN; } YY_BREAK case 25: YY_RULE_SETUP -#line 146 "CMDscan.l" +#line 147 "CMDscan.l" { CMDlval.i = MakeToken< int >( opMODASN, yylineno ); return opMODASN; } YY_BREAK case 26: YY_RULE_SETUP -#line 147 "CMDscan.l" +#line 148 "CMDscan.l" { CMDlval.i = MakeToken< int >( opANDASN, yylineno ); return opANDASN; } YY_BREAK case 27: YY_RULE_SETUP -#line 148 "CMDscan.l" +#line 149 "CMDscan.l" { CMDlval.i = MakeToken< int >( opXORASN, yylineno ); return opXORASN; } YY_BREAK case 28: YY_RULE_SETUP -#line 149 "CMDscan.l" +#line 150 "CMDscan.l" { CMDlval.i = MakeToken< int >( opORASN, yylineno ); return opORASN; } YY_BREAK case 29: YY_RULE_SETUP -#line 150 "CMDscan.l" +#line 151 "CMDscan.l" { CMDlval.i = MakeToken< int >( opSLASN, yylineno ); return opSLASN; } YY_BREAK case 30: YY_RULE_SETUP -#line 151 "CMDscan.l" +#line 152 "CMDscan.l" { CMDlval.i = MakeToken< int >( opSRASN, yylineno ); return opSRASN; } YY_BREAK case 31: YY_RULE_SETUP -#line 152 "CMDscan.l" +#line 153 "CMDscan.l" { CMDlval.i = MakeToken< int >( opINTNAME, yylineno ); return opINTNAME; } YY_BREAK case 32: YY_RULE_SETUP -#line 153 "CMDscan.l" +#line 154 "CMDscan.l" { CMDlval.i = MakeToken< int >( opINTNAMER, yylineno ); return opINTNAMER; } YY_BREAK case 33: YY_RULE_SETUP -#line 154 "CMDscan.l" +#line 155 "CMDscan.l" { CMDlval.i = MakeToken< int >( '\n', yylineno ); return '@'; } YY_BREAK case 34: YY_RULE_SETUP -#line 155 "CMDscan.l" +#line 156 "CMDscan.l" { CMDlval.i = MakeToken< int >( '\t', yylineno ); return '@'; } YY_BREAK case 35: YY_RULE_SETUP -#line 156 "CMDscan.l" +#line 157 "CMDscan.l" { CMDlval.i = MakeToken< int >( ' ', yylineno ); return '@'; } YY_BREAK case 36: YY_RULE_SETUP -#line 157 "CMDscan.l" +#line 158 "CMDscan.l" { CMDlval.i = MakeToken< int >( 0, yylineno ); return '@'; } YY_BREAK case 37: YY_RULE_SETUP -#line 158 "CMDscan.l" +#line 159 "CMDscan.l" { /* this comment stops syntax highlighting from getting messed up when editing the lexer in TextPad */ int c = 0, l; for ( ; ; ) @@ -1488,222 +1489,222 @@ YY_RULE_SETUP } YY_BREAK case 38: -#line 178 "CMDscan.l" -case 39: #line 179 "CMDscan.l" -case 40: +case 39: #line 180 "CMDscan.l" -case 41: +case 40: #line 181 "CMDscan.l" -case 42: +case 41: #line 182 "CMDscan.l" -case 43: +case 42: #line 183 "CMDscan.l" -case 44: +case 43: #line 184 "CMDscan.l" -case 45: +case 44: #line 185 "CMDscan.l" -case 46: +case 45: #line 186 "CMDscan.l" -case 47: +case 46: #line 187 "CMDscan.l" -case 48: +case 47: #line 188 "CMDscan.l" -case 49: +case 48: #line 189 "CMDscan.l" -case 50: +case 49: #line 190 "CMDscan.l" -case 51: +case 50: #line 191 "CMDscan.l" -case 52: +case 51: #line 192 "CMDscan.l" -case 53: +case 52: #line 193 "CMDscan.l" -case 54: +case 53: #line 194 "CMDscan.l" -case 55: +case 54: #line 195 "CMDscan.l" -case 56: +case 55: #line 196 "CMDscan.l" -case 57: +case 56: #line 197 "CMDscan.l" -case 58: +case 57: #line 198 "CMDscan.l" -case 59: +case 58: #line 199 "CMDscan.l" -case 60: +case 59: #line 200 "CMDscan.l" +case 60: +#line 201 "CMDscan.l" case 61: YY_RULE_SETUP -#line 200 "CMDscan.l" +#line 201 "CMDscan.l" { CMDlval.i = MakeToken< int >( CMDtext[ 0 ], yylineno ); return CMDtext[ 0 ]; } YY_BREAK case 62: YY_RULE_SETUP -#line 201 "CMDscan.l" +#line 202 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwIN, yylineno ); return(rwIN); } YY_BREAK case 63: YY_RULE_SETUP -#line 202 "CMDscan.l" +#line 203 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwCASEOR, yylineno ); return(rwCASEOR); } YY_BREAK case 64: YY_RULE_SETUP -#line 203 "CMDscan.l" +#line 204 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwBREAK, yylineno ); return(rwBREAK); } YY_BREAK case 65: YY_RULE_SETUP -#line 204 "CMDscan.l" +#line 205 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwRETURN, yylineno ); return(rwRETURN); } YY_BREAK case 66: YY_RULE_SETUP -#line 205 "CMDscan.l" +#line 206 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwELSE, yylineno ); return(rwELSE); } YY_BREAK case 67: YY_RULE_SETUP -#line 206 "CMDscan.l" +#line 207 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwASSERT, yylineno ); return(rwASSERT); } YY_BREAK case 68: YY_RULE_SETUP -#line 207 "CMDscan.l" +#line 208 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwWHILE, yylineno ); return(rwWHILE); } YY_BREAK case 69: YY_RULE_SETUP -#line 208 "CMDscan.l" +#line 209 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwDO, yylineno ); return(rwDO); } YY_BREAK case 70: YY_RULE_SETUP -#line 209 "CMDscan.l" +#line 210 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwIF, yylineno ); return(rwIF); } YY_BREAK case 71: YY_RULE_SETUP -#line 210 "CMDscan.l" +#line 211 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwFOREACHSTR, yylineno ); return(rwFOREACHSTR); } YY_BREAK case 72: YY_RULE_SETUP -#line 211 "CMDscan.l" +#line 212 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwFOREACH, yylineno ); return(rwFOREACH); } YY_BREAK case 73: YY_RULE_SETUP -#line 212 "CMDscan.l" +#line 213 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwFOR, yylineno ); return(rwFOR); } YY_BREAK case 74: YY_RULE_SETUP -#line 213 "CMDscan.l" +#line 214 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwCONTINUE, yylineno ); return(rwCONTINUE); } YY_BREAK case 75: YY_RULE_SETUP -#line 214 "CMDscan.l" +#line 215 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwDEFINE, yylineno ); return(rwDEFINE); } YY_BREAK case 76: YY_RULE_SETUP -#line 215 "CMDscan.l" +#line 216 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwDECLARE, yylineno ); return(rwDECLARE); } YY_BREAK case 77: YY_RULE_SETUP -#line 216 "CMDscan.l" +#line 217 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwDECLARESINGLETON, yylineno ); return(rwDECLARESINGLETON); } YY_BREAK case 78: YY_RULE_SETUP -#line 217 "CMDscan.l" +#line 218 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwDATABLOCK, yylineno ); return(rwDATABLOCK); } YY_BREAK case 79: YY_RULE_SETUP -#line 218 "CMDscan.l" +#line 219 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwCASE, yylineno ); return(rwCASE); } YY_BREAK case 80: YY_RULE_SETUP -#line 219 "CMDscan.l" +#line 220 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwSWITCHSTR, yylineno ); return(rwSWITCHSTR); } YY_BREAK case 81: YY_RULE_SETUP -#line 220 "CMDscan.l" +#line 221 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwSWITCH, yylineno ); return(rwSWITCH); } YY_BREAK case 82: YY_RULE_SETUP -#line 221 "CMDscan.l" +#line 222 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwDEFAULT, yylineno ); return(rwDEFAULT); } YY_BREAK case 83: YY_RULE_SETUP -#line 222 "CMDscan.l" +#line 223 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwPACKAGE, yylineno ); return(rwPACKAGE); } YY_BREAK case 84: YY_RULE_SETUP -#line 223 "CMDscan.l" +#line 224 "CMDscan.l" { CMDlval.i = MakeToken< int >( rwNAMESPACE, yylineno ); return(rwNAMESPACE); } YY_BREAK case 85: YY_RULE_SETUP -#line 224 "CMDscan.l" +#line 225 "CMDscan.l" { CMDlval.i = MakeToken< int >( 1, yylineno ); return INTCONST; } YY_BREAK case 86: YY_RULE_SETUP -#line 225 "CMDscan.l" +#line 226 "CMDscan.l" { CMDlval.i = MakeToken< int >( 0, yylineno ); return INTCONST; } YY_BREAK case 87: YY_RULE_SETUP -#line 226 "CMDscan.l" +#line 227 "CMDscan.l" { return(Sc_ScanVar()); } YY_BREAK case 88: YY_RULE_SETUP -#line 228 "CMDscan.l" +#line 229 "CMDscan.l" { return Sc_ScanIdent(); } YY_BREAK case 89: YY_RULE_SETUP -#line 229 "CMDscan.l" +#line 230 "CMDscan.l" return(Sc_ScanHex()); YY_BREAK case 90: YY_RULE_SETUP -#line 230 "CMDscan.l" +#line 231 "CMDscan.l" { CMDtext[CMDleng] = 0; CMDlval.i = MakeToken< int >( dAtoi(CMDtext), yylineno ); return INTCONST; } YY_BREAK case 91: YY_RULE_SETUP -#line 231 "CMDscan.l" +#line 232 "CMDscan.l" return Sc_ScanNum(); YY_BREAK case 92: YY_RULE_SETUP -#line 232 "CMDscan.l" +#line 233 "CMDscan.l" return(ILLEGAL_TOKEN); YY_BREAK case 93: YY_RULE_SETUP -#line 233 "CMDscan.l" +#line 234 "CMDscan.l" return(ILLEGAL_TOKEN); YY_BREAK case 94: YY_RULE_SETUP -#line 234 "CMDscan.l" +#line 235 "CMDscan.l" ECHO; YY_BREAK -#line 1706 "CMDscan.cpp" +#line 1707 "CMDscan.cpp" case YY_STATE_EOF(INITIAL): yyterminate(); @@ -2679,7 +2680,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 234 "CMDscan.l" +#line 235 "CMDscan.l" static const char *scanBuffer; @@ -2741,6 +2742,8 @@ void CMDSetScanBuffer(const char *sb, const char *fn) scanBuffer = sb; fileName = fn; scanIndex = 0; + yylineno = 1; + lines.clear(); } int CMDgetc() diff --git a/Engine/source/console/torquescript/CMDscan.l b/Engine/source/console/torquescript/CMDscan.l index 57e8f0b3f..aa3a72733 100644 --- a/Engine/source/console/torquescript/CMDscan.l +++ b/Engine/source/console/torquescript/CMDscan.l @@ -116,7 +116,8 @@ HEXDIGIT [a-fA-F0-9] ("///"([^/\n\r][^\n\r]*)?[\n\r]+)+ { return(Sc_ScanDocBlock()); } "//"[^\n\r]* ; [\r] ; -\n.* { yycolumn = 1; +\n.* { + yycolumn = 1; lines.push_back(String::ToString("%s", yytext+1)); if (lines.size() > Con::getIntVariable("$scriptErrorLineCount", 10)) lines.erase(lines.begin()); @@ -291,6 +292,8 @@ void CMDSetScanBuffer(const char *sb, const char *fn) scanBuffer = sb; fileName = fn; scanIndex = 0; + yylineno = 1; + lines.clear(); } int CMDgetc() diff --git a/Engine/source/console/torquescript/astNodes.cpp b/Engine/source/console/torquescript/astNodes.cpp index cc911477d..17d96c961 100644 --- a/Engine/source/console/torquescript/astNodes.cpp +++ b/Engine/source/console/torquescript/astNodes.cpp @@ -200,7 +200,9 @@ U32 IfStmtNode::compileStmt(CodeStream& codeStream, U32 ip) U32 endifIp, elseIp; addBreakLine(codeStream); - if (testExpr->getPreferredType() == TypeReqUInt) + TypeReq testType = testExpr->getPreferredType(); + + if (testType == TypeReqUInt) { integer = true; } @@ -209,8 +211,16 @@ U32 IfStmtNode::compileStmt(CodeStream& codeStream, U32 ip) integer = false; } - ip = testExpr->compile(codeStream, ip, integer ? TypeReqUInt : TypeReqFloat); - codeStream.emit(integer ? OP_JMPIFNOT : OP_JMPIFFNOT); + if (testType == TypeReqString || testType == TypeReqNone) + { + ip = testExpr->compile(codeStream, ip, TypeReqString); + codeStream.emit(OP_JMPNOTSTRING); + } + else + { + ip = testExpr->compile(codeStream, ip, integer ? TypeReqUInt : TypeReqFloat); + codeStream.emit(integer ? OP_JMPIFNOT : OP_JMPIFFNOT); + } if (elseBlock) { diff --git a/Engine/source/console/torquescript/compiledEval.cpp b/Engine/source/console/torquescript/compiledEval.cpp index 3d765c470..94ddcab80 100644 --- a/Engine/source/console/torquescript/compiledEval.cpp +++ b/Engine/source/console/torquescript/compiledEval.cpp @@ -1144,6 +1144,15 @@ Con::EvalResult CodeBlock::exec(U32 ip, const char* functionName, Namespace* thi ip++; break; } + + ip = code[ip]; + break; + case OP_JMPNOTSTRING: + if (stack[_STK--].getBool()) + { + ip++; + break; + } ip = code[ip]; break; case OP_JMPIFF: diff --git a/Engine/source/console/torquescript/compiler.h b/Engine/source/console/torquescript/compiler.h index e1cfbbed9..74737c773 100644 --- a/Engine/source/console/torquescript/compiler.h +++ b/Engine/source/console/torquescript/compiler.h @@ -62,6 +62,7 @@ namespace Compiler OP_JMPIFFNOT, OP_JMPIFNOT, + OP_JMPNOTSTRING, OP_JMPIFF, OP_JMPIF, OP_JMPIFNOT_NP, diff --git a/Engine/source/core/fileObject.cpp b/Engine/source/core/fileObject.cpp index 1305074c9..c5efbd654 100644 --- a/Engine/source/core/fileObject.cpp +++ b/Engine/source/core/fileObject.cpp @@ -85,18 +85,18 @@ FileObject::FileObject() mFileBuffer = NULL; mBufferSize = 0; mCurPos = 0; - stream = NULL; + mStream = NULL; } FileObject::~FileObject() { SAFE_DELETE_ARRAY(mFileBuffer); - SAFE_DELETE(stream); + SAFE_DELETE(mStream); } void FileObject::close() { - SAFE_DELETE(stream); + SAFE_DELETE(mStream); SAFE_DELETE_ARRAY(mFileBuffer); mFileBuffer = NULL; mBufferSize = mCurPos = 0; @@ -112,10 +112,10 @@ bool FileObject::openForWrite(const char *fileName, const bool append) if( !buffer[ 0 ] ) return false; - if((stream = FileStream::createAndOpen( fileName, append ? Torque::FS::File::WriteAppend : Torque::FS::File::Write )) == NULL) + if((mStream = FileStream::createAndOpen( fileName, append ? Torque::FS::File::WriteAppend : Torque::FS::File::Write )) == NULL) return false; - stream->setPosition( stream->getStreamSize() ); + mStream->setPosition(mStream->getStreamSize() ); return( true ); } @@ -225,17 +225,17 @@ void FileObject::peekLine( S32 peekLineOffset, U8* line, S32 length ) void FileObject::writeLine(const U8 *line) { - stream->write(dStrlen((const char *) line), line); - stream->write(2, "\r\n"); + mStream->write(dStrlen((const char *) line), line); + mStream->write(2, "\r\n"); } void FileObject::writeObject( SimObject* object, const U8* objectPrepend ) { if( objectPrepend == NULL ) - stream->write(2, "\r\n"); + mStream->write(2, "\r\n"); else - stream->write(dStrlen((const char *) objectPrepend), objectPrepend ); - object->write( *stream, 0 ); + mStream->write(dStrlen((const char *) objectPrepend), objectPrepend ); + object->write( *mStream, 0 ); } DefineEngineMethod( FileObject, openForRead, bool, ( const char* filename ),, diff --git a/Engine/source/core/fileObject.h b/Engine/source/core/fileObject.h index 64559e7db..ae2f20bd2 100644 --- a/Engine/source/core/fileObject.h +++ b/Engine/source/core/fileObject.h @@ -36,7 +36,7 @@ class FileObject : public SimObject U8 *mFileBuffer; U32 mBufferSize; U32 mCurPos; - FileStream *stream; + FileStream *mStream; public: FileObject(); ~FileObject(); @@ -50,6 +50,8 @@ public: bool isEOF(); void writeLine(const U8 *line); void close(); + + bool writeObject(Stream* stream) override { Con::errorf("FileObject:Can Not write a file interface object to a file"); return false; }; //Don't allow writing FileObject *to* files void writeObject( SimObject* object, const U8* objectPrepend = NULL ); DECLARE_CONOBJECT(FileObject); diff --git a/Engine/source/core/strings/stringFunctions.h b/Engine/source/core/strings/stringFunctions.h index d0c91b734..d1556f7a6 100644 --- a/Engine/source/core/strings/stringFunctions.h +++ b/Engine/source/core/strings/stringFunctions.h @@ -259,9 +259,23 @@ extern S32 dStrcmp(const UTF16 *str1, const UTF16 *str2); extern S32 dStrnatcmp( const char* str1, const char* str2 ); extern S32 dStrnatcasecmp( const char* str1, const char* str2 ); -inline bool dAtob(const char *str) +inline bool dAtob(const char* str) { - return !dStricmp(str, "true") || dAtof(str); + if (str && str[0] != '\0') + { + if (dStricmp(str, "0") == 0) + return false; + if (dStricmp(str, "0.0") == 0) + return false; + if (dStricmp(str, "0.0f") == 0) + return false; + if (dStricmp(str, "null") == 0) + return false; + if (dStricmp(str, "false") == 0) + return false; + return true; + } + return false; } bool dStrEqual(const char* str1, const char* str2); diff --git a/Engine/source/gfx/video/theoraTexture.h b/Engine/source/gfx/video/theoraTexture.h index 8c0748068..d262dfae7 100644 --- a/Engine/source/gfx/video/theoraTexture.h +++ b/Engine/source/gfx/video/theoraTexture.h @@ -263,7 +263,7 @@ class TheoraTexture : private IOutputStream< TheoraTextureFrame* >, /// AsyncState( const ThreadSafeRef< OggInputStream >& oggStream, bool looping = false ); - + virtual ~AsyncState() {}; /// Return the Theora decoder substream. OggTheoraDecoder* getTheora() const { return mTheoraDecoder; } diff --git a/Engine/source/lighting/advanced/glsl/deferredShadingFeaturesGLSL.cpp b/Engine/source/lighting/advanced/glsl/deferredShadingFeaturesGLSL.cpp index 3d881b398..66e451ab7 100644 --- a/Engine/source/lighting/advanced/glsl/deferredShadingFeaturesGLSL.cpp +++ b/Engine/source/lighting/advanced/glsl/deferredShadingFeaturesGLSL.cpp @@ -261,16 +261,16 @@ void GlowMapGLSL::processPix(Vector& componentList, const Mate targ->setType("vec4"); targ->setName(getOutputTargetVarName(ShaderFeature::RenderTarget3)); targ->setStructName("OUT"); - output = new GenOp("@ = vec4(@.rgb*@,0);", targ, texOp, glowMul); + output = new GenOp("@ = vec4(pow(max(@.rgb*@,0.0),vec3(3.54406804435,3.54406804435,3.54406804435)),0);", targ, texOp, glowMul); } else { - output = new GenOp("@ += vec4(@.rgb*@,0);", targ, texOp, glowMul); + output = new GenOp("@ += vec4(pow(max(@.rgb*@,0.0),vec3(3.54406804435,3.54406804435,3.54406804435)),0);", targ, texOp, glowMul); } } else { - output = new GenOp("@ += vec4(@.rgb*@,@.a);", targ, texOp, glowMul, targ); + output = new GenOp("@ += vec4(pow(max(@.rgb*@,0.0),vec3(3.54406804435,3.54406804435,3.54406804435)),@.a);", targ, texOp, glowMul, targ); } } diff --git a/Engine/source/lighting/advanced/hlsl/deferredShadingFeaturesHLSL.cpp b/Engine/source/lighting/advanced/hlsl/deferredShadingFeaturesHLSL.cpp index 42518830a..8b7d3c0bb 100644 --- a/Engine/source/lighting/advanced/hlsl/deferredShadingFeaturesHLSL.cpp +++ b/Engine/source/lighting/advanced/hlsl/deferredShadingFeaturesHLSL.cpp @@ -264,16 +264,16 @@ void GlowMapHLSL::processPix(Vector &componentList, const Mate targ->setType("fragout"); targ->setName(getOutputTargetVarName(ShaderFeature::RenderTarget3)); targ->setStructName("OUT"); - output = new GenOp("@ = float4(@.rgb*@,0);", targ, texOp, glowMul); + output = new GenOp("@ = float4(pow(max(@.rgb*@,0.0),3.54406804435),0);", targ, texOp, glowMul); } else { - output = new GenOp("@ += float4(@.rgb*@,0);", targ, texOp, glowMul); + output = new GenOp("@ += float4(pow(max(@.rgb*@,0.0),3.54406804435),0);", targ, texOp, glowMul); } } else { - output = new GenOp("@ += float4(@.rgb*@,@.a);", targ, texOp, glowMul, targ); + output = new GenOp("@ += float4(pow(max(@.rgb*@,0.0),3.54406804435),@.a);", targ, texOp, glowMul, targ); } } diff --git a/Engine/source/materials/materialFeatureTypes.cpp b/Engine/source/materials/materialFeatureTypes.cpp index 44220a9b1..2a5736ae3 100644 --- a/Engine/source/materials/materialFeatureTypes.cpp +++ b/Engine/source/materials/materialFeatureTypes.cpp @@ -56,6 +56,7 @@ ImplementFeatureType( MFT_AccuMap, MFG_PreLighting, 2.0f, true ); ImplementFeatureType(MFT_ReflectionProbes, MFG_Lighting, 1.0f, true); ImplementFeatureType( MFT_RTLighting, MFG_Lighting, 2.0f, true ); ImplementFeatureType( MFT_GlowMap, MFG_Lighting, 3.0f, true ); +ImplementFeatureType( MFT_GlowMask, MFG_Lighting, 3.1f, true ); ImplementFeatureType( MFT_LightMap, MFG_Lighting, 4.0f, true ); ImplementFeatureType( MFT_ToneMap, MFG_Lighting, 5.0f, true ); ImplementFeatureType( MFT_VertLitTone, MFG_Lighting, 6.0f, false ); @@ -65,8 +66,6 @@ ImplementFeatureType( MFT_SubSurface, MFG_Lighting, 8.0f, true ); ImplementFeatureType( MFT_VertLit, MFG_Lighting, 9.0f, true ); ImplementFeatureType( MFT_MinnaertShading, MFG_Lighting, 10.0f, true ); - -ImplementFeatureType( MFT_GlowMask, MFG_PostLighting, 1.0f, true ); ImplementFeatureType( MFT_Visibility, MFG_PostLighting, 2.0f, true ); ImplementFeatureType( MFT_Fog, MFG_PostProcess, 3.0f, true ); diff --git a/Engine/source/materials/processedMaterial.cpp b/Engine/source/materials/processedMaterial.cpp index 79b08249a..f4b0d2417 100644 --- a/Engine/source/materials/processedMaterial.cpp +++ b/Engine/source/materials/processedMaterial.cpp @@ -197,7 +197,7 @@ void ProcessedMaterial::addStateBlockDesc(const GFXStateBlockDesc& sb) mUserDefined = sb; } -void ProcessedMaterial::_initStateBlockTemplates(GFXStateBlockDesc& stateTranslucent, GFXStateBlockDesc& stateGlow, GFXStateBlockDesc& stateReflect) +void ProcessedMaterial::_initStateBlockTemplates(GFXStateBlockDesc& stateTranslucent, GFXStateBlockDesc& stateReflect) { // Translucency stateTranslucent.blendDefined = true; @@ -211,10 +211,6 @@ void ProcessedMaterial::_initStateBlockTemplates(GFXStateBlockDesc& stateTranslu stateTranslucent.alphaTestFunc = GFXCmpGreaterEqual; stateTranslucent.samplersDefined = true; - // Glow - stateGlow.zDefined = true; - stateGlow.zWriteEnable = false; - // Reflect stateReflect.cullDefined = true; stateReflect.cullMode = mMaterial->mDoubleSided ? GFXCullNone : GFXCullCW; @@ -316,11 +312,10 @@ void ProcessedMaterial::_initPassStateBlock( RenderPassData *rpd, GFXStateBlockD void ProcessedMaterial::_initRenderStateStateBlocks( RenderPassData *rpd ) { GFXStateBlockDesc stateTranslucent; - GFXStateBlockDesc stateGlow; GFXStateBlockDesc stateReflect; GFXStateBlockDesc statePass; - _initStateBlockTemplates( stateTranslucent, stateGlow, stateReflect ); + _initStateBlockTemplates( stateTranslucent, stateReflect ); _initPassStateBlock( rpd, statePass ); // Ok, we've got our templates set up, let's combine them together based on state and @@ -333,8 +328,6 @@ void ProcessedMaterial::_initRenderStateStateBlocks( RenderPassData *rpd ) stateFinal.addDesc(stateReflect); if (i & RenderPassData::STATE_TRANSLUCENT) stateFinal.addDesc(stateTranslucent); - if (i & RenderPassData::STATE_GLOW) - stateFinal.addDesc(stateGlow); stateFinal.addDesc(statePass); @@ -359,9 +352,6 @@ U32 ProcessedMaterial::_getRenderStateIndex( const SceneRenderState *sceneState, // For example sgData.visibility would be bad to use // in here without changing how RenderMeshMgr works. - if ( sgData.binType == SceneData::GlowBin ) - currState |= RenderPassData::STATE_GLOW; - if ( sceneState && sceneState->isReflectPass() ) currState |= RenderPassData::STATE_REFLECT; diff --git a/Engine/source/materials/processedMaterial.h b/Engine/source/materials/processedMaterial.h index d316fc450..4efc338bc 100644 --- a/Engine/source/materials/processedMaterial.h +++ b/Engine/source/materials/processedMaterial.h @@ -98,9 +98,8 @@ public: { STATE_REFLECT = 1, STATE_TRANSLUCENT = 2, - STATE_GLOW = 4, - STATE_WIREFRAME = 8, - STATE_MAX = 16 + STATE_WIREFRAME = 4, + STATE_MAX = 8 }; /// @@ -301,7 +300,7 @@ protected: /// @{ /// Creates the default state block templates, used by initStateBlocks. - virtual void _initStateBlockTemplates(GFXStateBlockDesc& stateTranslucent, GFXStateBlockDesc& stateGlow, GFXStateBlockDesc& stateReflect); + virtual void _initStateBlockTemplates(GFXStateBlockDesc& stateTranslucent, GFXStateBlockDesc& stateReflect); /// Does the base render state block setting, normally per pass. virtual void _initPassStateBlock( RenderPassData *rpd, GFXStateBlockDesc& result); diff --git a/Engine/source/materials/processedShaderMaterial.cpp b/Engine/source/materials/processedShaderMaterial.cpp index 77566ef29..521ec04c6 100644 --- a/Engine/source/materials/processedShaderMaterial.cpp +++ b/Engine/source/materials/processedShaderMaterial.cpp @@ -348,7 +348,6 @@ void ProcessedShaderMaterial::_determineFeatures( U32 stageNum, // if ( features.hasFeature( MFT_UseInstancing ) && mMaxStages == 1 && - !mMaterial->mGlow[0] && shaderVersion >= 3.0f ) fd.features.addFeature( MFT_UseInstancing ); @@ -520,6 +519,9 @@ void ProcessedShaderMaterial::_determineFeatures( U32 stageNum, if ( mMaterial->mVertColor[ stageNum ] && mVertexFormat->hasColor() ) fd.features.addFeature( MFT_DiffuseVertColor ); + + if (mMaterial->mGlow[stageNum]) + fd.features.addFeature(MFT_GlowMask); // Allow features to add themselves. for ( U32 i = 0; i < FEATUREMGR->getFeatureCount(); i++ ) diff --git a/Engine/source/materials/sceneData.h b/Engine/source/materials/sceneData.h index 67a521923..bd99e3e00 100644 --- a/Engine/source/materials/sceneData.h +++ b/Engine/source/materials/sceneData.h @@ -45,10 +45,6 @@ struct SceneData /// the special bins we care about. RegularBin = 0, - /// The glow render bin. - /// @see RenderGlowMgr - GlowBin, - /// The deferred render bin. /// @RenderDeferredMgr DeferredBin, diff --git a/Engine/source/module/moduleDefinition.h b/Engine/source/module/moduleDefinition.h index f26c2ae2c..0fb12f7b0 100644 --- a/Engine/source/module/moduleDefinition.h +++ b/Engine/source/module/moduleDefinition.h @@ -194,6 +194,8 @@ public: inline void setModuleLocked( const bool status ) { mLocked = status; } inline bool getModuleLocked( void ) const { return mLocked; } inline ModuleManager* getModuleManager( void ) const { return mpModuleManager; } + + using Parent::save; bool save( void ); /// Declare Console Object. diff --git a/Engine/source/persistence/taml/taml.h b/Engine/source/persistence/taml/taml.h index 70290684f..dd093e164 100644 --- a/Engine/source/persistence/taml/taml.h +++ b/Engine/source/persistence/taml/taml.h @@ -111,6 +111,7 @@ private: void compileCustomState( TamlWriteNode* pTamlWriteNode ); void compileCustomNodeState( TamlCustomNode* pCustomNode ); + void write(Stream& stream, U32 tabStop, U32 flags = 0) override { Con::errorf("Taml:Can Not write a file interface object to a file"); }; //Don't allow writing Taml objects *to* files bool write( FileStream& stream, SimObject* pSimObject, const TamlFormatMode formatMode ); SimObject* read( FileStream& stream, const TamlFormatMode formatMode ); template inline T* read( FileStream& stream, const TamlFormatMode formatMode ) diff --git a/Engine/source/renderInstance/renderDeferredMgr.cpp b/Engine/source/renderInstance/renderDeferredMgr.cpp index 664302528..65276a111 100644 --- a/Engine/source/renderInstance/renderDeferredMgr.cpp +++ b/Engine/source/renderInstance/renderDeferredMgr.cpp @@ -683,7 +683,8 @@ void ProcessedDeferredMaterial::_determineFeatures( U32 stageNum, type == MFT_UseInstancing || type == MFT_DiffuseVertColor || type == MFT_DetailMap || - type == MFT_DiffuseMapAtlas) + type == MFT_DiffuseMapAtlas|| + type == MFT_GlowMask) newFeatures.addFeature( type ); // Add any transform features. diff --git a/Engine/source/renderInstance/renderGlowMgr.cpp b/Engine/source/renderInstance/renderGlowMgr.cpp deleted file mode 100644 index 17ae78c60..000000000 --- a/Engine/source/renderInstance/renderGlowMgr.cpp +++ /dev/null @@ -1,282 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#include "platform/platform.h" -#include "renderInstance/renderGlowMgr.h" -#include "renderInstance/renderParticleMgr.h" - -#include "scene/sceneManager.h" -#include "scene/sceneRenderState.h" -#include "materials/sceneData.h" -#include "materials/matInstance.h" -#include "materials/materialFeatureTypes.h" -#include "materials/processedMaterial.h" -#include "postFx/postEffect.h" -#include "gfx/gfxTransformSaver.h" -#include "gfx/gfxDebugEvent.h" -#include "math/util/matrixSet.h" - -IMPLEMENT_CONOBJECT( RenderGlowMgr ); - - -ConsoleDocClass( RenderGlowMgr, - "@brief A render bin for the glow pass.\n\n" - "When the glow buffer PostEffect is enabled this bin gathers mesh render " - "instances with glow materials and renders them to the #glowbuffer offscreen " - "render target.\n\n" - "This render target is then used by the 'GlowPostFx' PostEffect to blur and " - "render the glowing portions of the screen.\n\n" - "@ingroup RenderBin\n" ); - -const MatInstanceHookType RenderGlowMgr::GlowMaterialHook::Type( "Glow" ); - - -RenderGlowMgr::GlowMaterialHook::GlowMaterialHook( BaseMatInstance *matInst ) - : mGlowMatInst( NULL ) -{ - mGlowMatInst = (MatInstance*)matInst->getMaterial()->createMatInstance(); - mGlowMatInst->getFeaturesDelegate().bind( &GlowMaterialHook::_overrideFeatures ); - mGlowMatInst->setUserObject(matInst->getUserObject()); - mGlowMatInst->init( matInst->getRequestedFeatures(), - matInst->getVertexFormat() ); -} - -RenderGlowMgr::GlowMaterialHook::~GlowMaterialHook() -{ - SAFE_DELETE( mGlowMatInst ); -} - -void RenderGlowMgr::GlowMaterialHook::_overrideFeatures( ProcessedMaterial *mat, - U32 stageNum, - MaterialFeatureData &fd, - const FeatureSet &features ) -{ - // If this isn't a glow pass... then add the glow mask feature. - if ( mat->getMaterial() && - !mat->getMaterial()->mGlow[stageNum] ) - fd.features.addFeature( MFT_GlowMask ); - - // Don't allow fog or HDR encoding on - // the glow materials. - fd.features.removeFeature( MFT_Fog ); - fd.features.addFeature( MFT_Imposter ); -} - -RenderGlowMgr::RenderGlowMgr() - : RenderTexTargetBinManager( RenderPassManager::RIT_Mesh, - 1.0f, - 1.0f, - GFXFormatR8G8B8A8, - Point2I( 512, 512 ) ) -{ - notifyType( RenderPassManager::RIT_Decal ); - notifyType( RenderPassManager::RIT_DecalRoad ); - notifyType( RenderPassManager::RIT_Translucent ); - notifyType( RenderPassManager::RIT_Particle ); - - mParticleRenderMgr = NULL; - - mNamedTarget.registerWithName( "glowbuffer" ); - mTargetSizeType = WindowSize; -} - -RenderGlowMgr::~RenderGlowMgr() -{ -} - -PostEffect* RenderGlowMgr::getGlowEffect() -{ - if ( !mGlowEffect ) - mGlowEffect = dynamic_cast( Sim::findObject( "GlowPostFx" ) ); - - return mGlowEffect; -} - -bool RenderGlowMgr::isGlowEnabled() -{ - return getGlowEffect() && getGlowEffect()->isEnabled(); -} - -void RenderGlowMgr::addElement( RenderInst *inst ) -{ - // Skip out if we don't have the glow post - // effect enabled at this time. - if ( !isGlowEnabled() ) - return; - - // TODO: We need to get the scene state here in a more reliable - // manner so we can skip glow in a non-diffuse render pass. - //if ( !mParentManager->getSceneManager()->getSceneState()->isDiffusePass() ) - //return RenderBinManager::arSkipped; - ParticleRenderInst *particleInst = NULL; - if(inst->type == RenderPassManager::RIT_Particle) - particleInst = static_cast(inst); - if(particleInst && particleInst->glow) - { - internalAddElement(inst); - return; - } - - // Skip it if we don't have a glowing material. - BaseMatInstance *matInst = getMaterial( inst ); - if ( !matInst || !matInst->hasGlow() ) - return; - - internalAddElement(inst); -} - -void RenderGlowMgr::render( SceneRenderState *state ) -{ - PROFILE_SCOPE( RenderGlowMgr_Render ); - - if ( !isGlowEnabled() ) - return; - - const U32 binSize = mElementList.size(); - - // If this is a non-diffuse pass or we have no objects to - // render then tell the effect to skip rendering. - if ( !state->isDiffusePass() || binSize == 0 ) - { - getGlowEffect()->setSkip( true ); - return; - } - - GFXDEBUGEVENT_SCOPE( RenderGlowMgr_Render, ColorI::GREEN ); - - GFXTransformSaver saver; - - // Respect the current viewport - mNamedTarget.setViewport(GFX->getViewport()); - - // Tell the superclass we're about to render, preserve contents - const bool isRenderingToTarget = _onPreRender( state, true ); - - // Clear all the buffers to black. - GFX->clear( GFXClearTarget, ColorI::BLACK, 1.0f, 0); - - // Restore transforms - MatrixSet &matrixSet = getRenderPass()->getMatrixSet(); - matrixSet.restoreSceneViewProjection(); - - // init loop data - SceneData sgData; - sgData.init( state, SceneData::GlowBin ); - - for( U32 j=0; jtype == RenderPassManager::RIT_Particle) - { - // Find the particle render manager (if we don't have it) - if(mParticleRenderMgr == NULL) - { - RenderPassManager *rpm = state->getRenderPass(); - for( U32 i = 0; i < rpm->getManagerCount(); i++ ) - { - RenderBinManager *bin = rpm->getManager(i); - if( bin->getRenderInstType() == RenderParticleMgr::RIT_Particles ) - { - mParticleRenderMgr = reinterpret_cast(bin); - break; - } - } - } - - ParticleRenderInst *ri = static_cast(_ri); - - GFX->setStateBlock(mParticleRenderMgr->_getHighResStateBlock(ri)); - mParticleRenderMgr->_getShaderConsts().mShaderConsts->setSafe(mParticleRenderMgr->_getShaderConsts().mModelViewProjSC, *ri->modelViewProj); - - mParticleRenderMgr->renderParticle(ri, state); - j++; - continue; - } - - MeshRenderInst *ri = static_cast(_ri); - - setupSGData( ri, sgData ); - - BaseMatInstance *mat = ri->matInst; - GlowMaterialHook *hook = mat->getHook(); - if ( !hook ) - { - hook = new GlowMaterialHook( ri->matInst ); - ri->matInst->addHook( hook ); - } - BaseMatInstance *glowMat = hook->getMatInstance(); - - U32 matListEnd = j; - - while( glowMat && glowMat->setupPass( state, sgData ) ) - { - U32 a; - for( a=j; atype == RenderPassManager::RIT_Particle) - break; - - MeshRenderInst *passRI = static_cast(mElementList[a].inst); - - if ( newPassNeeded( ri, passRI ) ) - break; - - matrixSet.setWorld(*passRI->objectToWorld); - matrixSet.setView(*passRI->worldToCamera); - matrixSet.setProjection(*passRI->projection); - glowMat->setTransforms(matrixSet, state); - - // Setup HW skinning transforms if applicable - if (glowMat->usesHardwareSkinning()) - { - glowMat->setNodeTransforms(passRI->mNodeTransforms, passRI->mNodeTransformCount); - } - - //push along any overriden fields that are instance-specific as well - if (passRI->mCustomShaderData.size() > 0) - { - mat->setCustomShaderData(passRI->mCustomShaderData); - } - - glowMat->setSceneInfo(state, sgData); - glowMat->setBuffers(passRI->vertBuff, passRI->primBuff); - - if ( passRI->prim ) - GFX->drawPrimitive( *passRI->prim ); - else - GFX->drawPrimitive( passRI->primBuffIndex ); - } - matListEnd = a; - setupSGData( ri, sgData ); - } - - // force increment if none happened, otherwise go to end of batch - j = ( j == matListEnd ) ? j+1 : matListEnd; - } - - // Finish up. - if ( isRenderingToTarget ) - _onPostRender(); - - // Make sure the effect is gonna render. - getGlowEffect()->setSkip( false ); -} diff --git a/Engine/source/renderInstance/renderGlowMgr.h b/Engine/source/renderInstance/renderGlowMgr.h deleted file mode 100644 index 27ff7a03f..000000000 --- a/Engine/source/renderInstance/renderGlowMgr.h +++ /dev/null @@ -1,90 +0,0 @@ -//----------------------------------------------------------------------------- -// Copyright (c) 2012 GarageGames, LLC -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -//----------------------------------------------------------------------------- - -#ifndef _RENDERGLOWMGR_H_ -#define _RENDERGLOWMGR_H_ - -#ifndef _TEXTARGETBIN_MGR_H_ -#include "renderInstance/renderTexTargetBinManager.h" -#endif -#include - - -class PostEffect; - - -/// -class RenderGlowMgr : public RenderTexTargetBinManager -{ - typedef RenderTexTargetBinManager Parent; - -public: - - RenderGlowMgr(); - virtual ~RenderGlowMgr(); - - /// Returns the glow post effect. - PostEffect* getGlowEffect(); - - /// Returns true if the glow post effect is - /// enabled and the glow buffer should be updated. - bool isGlowEnabled(); - - // RenderBinManager - void addElement( RenderInst *inst ) override; - void render( SceneRenderState *state ) override; - - // ConsoleObject - DECLARE_CONOBJECT( RenderGlowMgr ); - -protected: - - class GlowMaterialHook : public MatInstanceHook - { - public: - - GlowMaterialHook( BaseMatInstance *matInst ); - virtual ~GlowMaterialHook(); - - virtual BaseMatInstance *getMatInstance() { return mGlowMatInst; } - - const MatInstanceHookType& getType() const override { return Type; } - - /// Our material hook type. - static const MatInstanceHookType Type; - - protected: - - static void _overrideFeatures( ProcessedMaterial *mat, - U32 stageNum, - MaterialFeatureData &fd, - const FeatureSet &features ); - - BaseMatInstance *mGlowMatInst; - }; - - SimObjectPtr mGlowEffect; - RenderParticleMgr *mParticleRenderMgr; -}; - - -#endif // _RENDERGLOWMGR_H_ diff --git a/Engine/source/renderInstance/renderPassManager.cpp b/Engine/source/renderInstance/renderPassManager.cpp index 5c88041c7..fdcf76936 100644 --- a/Engine/source/renderInstance/renderPassManager.cpp +++ b/Engine/source/renderInstance/renderPassManager.cpp @@ -35,7 +35,6 @@ #include "renderInstance/renderObjectMgr.h" #include "renderInstance/renderMeshMgr.h" #include "renderInstance/renderTranslucentMgr.h" -#include "renderInstance/renderGlowMgr.h" #include "renderInstance/renderTerrainMgr.h" #include "core/util/safeDelete.h" #include "math/util/matrixSet.h" diff --git a/Engine/source/sfx/media/sfxSndStream.cpp b/Engine/source/sfx/media/sfxSndStream.cpp index 3c1d21b17..96ad07711 100644 --- a/Engine/source/sfx/media/sfxSndStream.cpp +++ b/Engine/source/sfx/media/sfxSndStream.cpp @@ -57,15 +57,14 @@ bool SFXSndStream::_readHeader() bitsPerSample = 8; break; case SF_FORMAT_PCM_16: - case SF_FORMAT_VORBIS: bitsPerSample = 16; break; + case SF_FORMAT_VORBIS: case SF_FORMAT_PCM_24: - bitsPerSample = 24; - break; case SF_FORMAT_PCM_32: case SF_FORMAT_FLOAT: - bitsPerSample = 32; + bitsPerSample = 16; + sf_command(sndFile, SFC_SET_SCALE_FLOAT_INT_READ, NULL, SF_TRUE); break; default: // missed, set it to 16 anyway. @@ -105,14 +104,46 @@ void SFXSndStream::reset() U32 SFXSndStream::read(U8* buffer, U32 length) { + if (!sndFile) + { + Con::errorf("SFXSndStream - read: Called on uninitialized stream."); + return 0; + } + + U32 framesToRead = length / mFormat.getBytesPerSample(); U32 framesRead = 0; - framesRead = sf_readf_short(sndFile, (short*)buffer, sfinfo.frames); - if (framesRead != sfinfo.frames) + switch (sfinfo.format & SF_FORMAT_SUBMASK) + { + case SF_FORMAT_PCM_S8: + case SF_FORMAT_PCM_U8: + framesRead = sf_readf_int(sndFile, (int*)buffer, framesToRead); + break; + case SF_FORMAT_PCM_16: + case SF_FORMAT_VORBIS: + case SF_FORMAT_PCM_24: + case SF_FORMAT_PCM_32: + case SF_FORMAT_FLOAT: + framesRead = sf_readf_short(sndFile, (short*)buffer, framesToRead); + break; + default: + Con::errorf("SFXSndStream - read: Unsupported format."); + return 0; + } + + if (framesRead != framesToRead) { Con::errorf("SFXSndStream - read: %s", sf_strerror(sndFile)); } + // (convert to frames) - number of frames available < MAX_BUFFER? reset + if (((getPosition() / mFormat.getBytesPerSample()) - sfinfo.frames) < MAX_BUFFER) + { + // reset stream + setPosition(0); + } + + return framesRead * mFormat.getBytesPerSample(); } diff --git a/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp b/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp index 33c3f520d..1fd6276d3 100644 --- a/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp +++ b/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.cpp @@ -2519,23 +2519,22 @@ void AlphaTestGLSL::processPix( Vector &componentList, //**************************************************************************** // GlowMask //**************************************************************************** - void GlowMaskGLSL::processPix( Vector &componentList, const MaterialFeatureData &fd ) { - output = NULL; - - // Get the output color... and make it black to mask out - // glow passes rendered before us. - // - // The shader compiler will optimize out all the other - // code above that doesn't contribute to the alpha mask. - Var *color = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget)); - if ( color ) - output = new GenOp( " @.rgb = vec3(0);\r\n", color ); + //determine output target + ShaderFeature::OutputTarget inTarg, outTarg; + inTarg = outTarg = ShaderFeature::DefaultTarget; + if (fd.features[MFT_isDeferred]) + { + inTarg = ShaderFeature::RenderTarget1; + outTarg = ShaderFeature::RenderTarget3; + } + Var* inCol = (Var*)LangElement::find(getOutputTargetVarName(inTarg)); + Var* outCol = (Var*)LangElement::find(getOutputTargetVarName(outTarg)); + output = new GenOp(" @.rgb += @.rgb*10;\r\n", outCol, inCol); } - //**************************************************************************** // RenderTargetZero //**************************************************************************** diff --git a/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.h b/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.h index 5db741ded..e7bcea21f 100644 --- a/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.h +++ b/Engine/source/shaderGen/GLSL/shaderFeatureGLSL.h @@ -552,11 +552,9 @@ public: class GlowMaskGLSL : public ShaderFeatureGLSL { public: + void processPix( Vector &componentList, const MaterialFeatureData &fd ) override; - - Material::BlendOp getBlendOp() override { return Material::None; } - String getName() override { return "Glow Mask"; diff --git a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp index 0f1bf06fd..8e7542052 100644 --- a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp +++ b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.cpp @@ -2592,23 +2592,22 @@ void AlphaTestHLSL::processPix( Vector &componentList, //**************************************************************************** // GlowMask //**************************************************************************** - void GlowMaskHLSL::processPix( Vector &componentList, const MaterialFeatureData &fd ) { - output = NULL; - - // Get the output color... and make it black to mask out - // glow passes rendered before us. - // - // The shader compiler will optimize out all the other - // code above that doesn't contribute to the alpha mask. - Var *color = (Var*)LangElement::find(getOutputTargetVarName(ShaderFeature::DefaultTarget)); - if ( color ) - output = new GenOp( " @.rgb = 0;\r\n", color ); + //determine output target + ShaderFeature::OutputTarget inTarg, outTarg; + inTarg = outTarg = ShaderFeature::DefaultTarget; + if (fd.features[MFT_isDeferred]) + { + inTarg = ShaderFeature::RenderTarget1; + outTarg = ShaderFeature::RenderTarget3; + } + Var* inCol = (Var*)LangElement::find(getOutputTargetVarName(inTarg)); + Var* outCol = (Var*)LangElement::find(getOutputTargetVarName(outTarg)); + output = new GenOp(" @.rgb += @.rgb*10;\r\n", outCol, inCol); } - //**************************************************************************** // RenderTargetZero //**************************************************************************** diff --git a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.h b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.h index 49c32e66e..627f1019a 100644 --- a/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.h +++ b/Engine/source/shaderGen/HLSL/shaderFeatureHLSL.h @@ -555,11 +555,9 @@ public: class GlowMaskHLSL : public ShaderFeatureHLSL { public: + void processPix( Vector &componentList, const MaterialFeatureData &fd ) override; - - Material::BlendOp getBlendOp() override { return Material::None; } - String getName() override { return "Glow Mask"; diff --git a/Engine/source/util/settings.h b/Engine/source/util/settings.h index 3368fe759..41d5a2f84 100644 --- a/Engine/source/util/settings.h +++ b/Engine/source/util/settings.h @@ -52,6 +52,7 @@ public: const UTF8 *value(const UTF8 *settingName, const UTF8 *defaultValue = ""); void remove(const UTF8 *settingName, bool includeDefaults = false); void clearAllFields(); + void write(Stream& stream, U32 tabStop, U32 flags = 0) override { Con::errorf("Settings: Can Not write a file interface object to a file"); }; //Don't allow writing Settings objects *to* files bool write(); bool read(); void readLayer(SimXMLDocument *document, String groupStack = String("")); diff --git a/Templates/BaseGame/game/core/postFX/scripts/DepthOfField/DepthOfFieldPostFX.tscript b/Templates/BaseGame/game/core/postFX/scripts/DepthOfField/DepthOfFieldPostFX.tscript index 74feb289d..d77dc2511 100644 --- a/Templates/BaseGame/game/core/postFX/scripts/DepthOfField/DepthOfFieldPostFX.tscript +++ b/Templates/BaseGame/game/core/postFX/scripts/DepthOfField/DepthOfFieldPostFX.tscript @@ -407,7 +407,7 @@ singleton PostEffect( DepthOfFieldPostFX ) enabled = false; renderTime = "PFXAfterBin"; - renderBin = "GlowBin"; + renderBin = "FogBin"; renderPriority = 0.1; shader = PFX_DOFDownSampleShader; diff --git a/Templates/BaseGame/game/core/postFX/scripts/Glow/GlowPostFX.tscript b/Templates/BaseGame/game/core/postFX/scripts/Glow/GlowPostFX.tscript index 8f2c5a72d..0e3ce4457 100644 --- a/Templates/BaseGame/game/core/postFX/scripts/Glow/GlowPostFX.tscript +++ b/Templates/BaseGame/game/core/postFX/scripts/Glow/GlowPostFX.tscript @@ -20,29 +20,6 @@ // IN THE SOFTWARE. //----------------------------------------------------------------------------- - -singleton ShaderData( PFX_GlowBlurVertShader ) -{ - DXVertexShaderFile = "./glowBlurV.hlsl"; - DXPixelShaderFile = "./glowBlurP.hlsl"; - - OGLVertexShaderFile = "./glowBlurV.glsl"; - OGLPixelShaderFile = "./glowBlurP.glsl"; - - defines = "BLUR_DIR=float2(0.0,1.0)"; - - samplerNames[0] = "$diffuseMap"; - - pixVersion = 2.0; -}; - - -singleton ShaderData( PFX_GlowBlurHorzShader : PFX_GlowBlurVertShader ) -{ - defines = "BLUR_DIR=float2(1.0,0.0)"; -}; - - singleton GFXStateBlockData( PFX_GlowCombineStateBlock : PFX_DefaultStateBlock ) { // Use alpha test to save some fillrate @@ -59,54 +36,6 @@ singleton GFXStateBlockData( PFX_GlowCombineStateBlock : PFX_DefaultStateBlock ) blendDest = GFXBlendOne; }; - -singleton PostEffect( GlowPostFX ) -{ - // Do not allow the glow effect to work in reflection - // passes by default so we don't do the extra drawing. - allowReflectPass = false; - - renderTime = "PFXAfterBin"; - renderBin = "GlowBin"; - renderPriority = 1; - - // First we down sample the glow buffer. - shader = PFX_PassthruShader; - stateBlock = PFX_DefaultStateBlock; - texture[0] = "#glowbuffer"; - target = "$outTex"; - targetScale = "0.5 0.5"; - - enabled = true; - - // Blur vertically - new PostEffect() - { - shader = PFX_GlowBlurVertShader; - stateBlock = PFX_DefaultStateBlock; - texture[0] = "$inTex"; - target = "$outTex"; - }; - - // Blur horizontally - new PostEffect() - { - shader = PFX_GlowBlurHorzShader; - stateBlock = PFX_DefaultStateBlock; - texture[0] = "$inTex"; - target = "$outTex"; - }; - - // Upsample and combine with the back buffer. - new PostEffect() - { - shader = PFX_PassthruShader; - stateBlock = PFX_GlowCombineStateBlock; - texture[0] = "$inTex"; - target = "$backBuffer"; - }; -}; - singleton ShaderData( PFX_VolFogGlowBlurVertShader ) { DXVertexShaderFile = "./glowBlurV.hlsl"; diff --git a/Templates/BaseGame/game/core/postFX/scripts/Turbulence/TurbulencePostFX.tscript b/Templates/BaseGame/game/core/postFX/scripts/Turbulence/TurbulencePostFX.tscript index 2d30550a5..781333dce 100644 --- a/Templates/BaseGame/game/core/postFX/scripts/Turbulence/TurbulencePostFX.tscript +++ b/Templates/BaseGame/game/core/postFX/scripts/Turbulence/TurbulencePostFX.tscript @@ -48,7 +48,7 @@ singleton PostEffect( TurbulencePostFX ) allowReflectPass = true; renderTime = "PFXAfterDiffuse"; - renderBin = "GlowBin"; + renderBin = "FogBin"; renderPriority = 0.5; // Render after the glows themselves shader = PFX_TurbulenceShader; diff --git a/Templates/BaseGame/game/core/rendering/scripts/renderManager.tscript b/Templates/BaseGame/game/core/rendering/scripts/renderManager.tscript index 34a48f64a..e3461b199 100644 --- a/Templates/BaseGame/game/core/rendering/scripts/renderManager.tscript +++ b/Templates/BaseGame/game/core/rendering/scripts/renderManager.tscript @@ -79,10 +79,7 @@ function initRenderManager() DiffuseRenderPassManager.addManager( new RenderTranslucentMgr(TranslucentBin){ renderOrder = 1.4; processAddOrder = 1.4; } ); DiffuseRenderPassManager.addManager(new RenderObjectMgr(FogBin){ bintype = "ObjectVolumetricFog"; renderOrder = 1.45; processAddOrder = 1.45; } ); - - // Note that the GlowPostFx is triggered after this bin. - DiffuseRenderPassManager.addManager( new RenderGlowMgr(GlowBin) { renderOrder = 1.5; processAddOrder = 1.5; } ); - + // We render any editor stuff from this bin. Note that the HDR is // completed before this bin to keep editor elements from tone mapping. DiffuseRenderPassManager.addManager( new RenderObjectMgr(EditorBin) { bintype = "Editor"; renderOrder = 1.6; processAddOrder = 1.6; } );