//---------------------------------------------------------------------------- bool FxCompiler::GetConstant (const TokenArray& tokens, const std::string& name, Shader::VariableType type, ConstantArray& constants) { std::string::size_type begin, end; if (tokens[5].size() < 4 || tokens[5][0] != 'c' || tokens[5][1] != '[' || (end = tokens[5].find("]", 0)) == std::string::npos) { ReportError("Expecting 'c[register]' token", &tokens); return false; } // Get the base register for the constant. begin = 2; // character after '[' std::string number = tokens[5].substr(begin, end - begin); int baseRegister = atoi(number.c_str()); if (baseRegister == 0 && number != "0") { ReportError("Invalid base register", &tokens); return false; } // Get the number of registers used by the constant. int numRegistersUsed; if (tokens[5].find(",", 0) == std::string::npos) { // The constant uses one register. numRegistersUsed = 1; } else { // The constant uses more than one register. numRegistersUsed = atoi(tokens[6].c_str()); if (numRegistersUsed == 0) { ReportError("Invalid number of registers", &tokens); return false; } } Constant constant; constant.Name = name; constant.Type = type; constant.BaseRegister = baseRegister; constant.NumRegistersUsed = numRegistersUsed; constants.push_back(constant); return true; }