void WriteFunction(string func, FxlcToken token) { WriteIndent(); var operands = token.Operands .Skip(1) .Select(o => o.ToString(Ctab, Cli)); WriteLine("{0} = {1}({2});", token.Operands[0].ToString(Ctab, Cli), func, string.Join(", ", operands)); }
void Write(FxlcToken token) { WriteIndent(); WriteLine($"// {token.ToString(Shader.ConstantTable, Shader.Cli)}"); switch (token.Opcode) { case Bytecode.Fxlvm.FxlcOpcode.Mov: WriteIndent(); WriteLine("{0} = {1};", token.Operands[0].FormatOperand(Ctab, Cli), token.Operands[1].FormatOperand(Ctab, Cli)); break; case Bytecode.Fxlvm.FxlcOpcode.Neg: WriteIndent(); WriteLine("{0} = -{1};", token.Operands[0].FormatOperand(Ctab, Cli), token.Operands[1].FormatOperand(Ctab, Cli)); break; case Bytecode.Fxlvm.FxlcOpcode.Frc: WriteFunction("frac", token); break; case Bytecode.Fxlvm.FxlcOpcode.Exp: WriteFunction("exp", token); break; case Bytecode.Fxlvm.FxlcOpcode.Log: WriteFunction("log", token); break; case Bytecode.Fxlvm.FxlcOpcode.Rsq: WriteFunction("rsq", token); break; case Bytecode.Fxlvm.FxlcOpcode.Sin: WriteFunction("sin", token); break; case Bytecode.Fxlvm.FxlcOpcode.Cos: WriteFunction("cos", token); break; case Bytecode.Fxlvm.FxlcOpcode.Asin: WriteFunction("asin", token); break; case Bytecode.Fxlvm.FxlcOpcode.Acos: WriteFunction("acos", token); break; case Bytecode.Fxlvm.FxlcOpcode.Atan: WriteFunction("atam", token); break; case Bytecode.Fxlvm.FxlcOpcode.Atan2: WriteFunction("atan2", token); break; case Bytecode.Fxlvm.FxlcOpcode.Sqrt: WriteFunction("sqrt", token); break; case Bytecode.Fxlvm.FxlcOpcode.Ineg: WriteFunction("~int", token); break; case Bytecode.Fxlvm.FxlcOpcode.Imax: WriteFunction("(int)max(", token); break; case Bytecode.Fxlvm.FxlcOpcode.Not: WriteFunction("!", token); break; case Bytecode.Fxlvm.FxlcOpcode.Utof: WriteFunction("utof", token); break; case Bytecode.Fxlvm.FxlcOpcode.Ftoi: WriteFunction("ftoi", token); break; case Bytecode.Fxlvm.FxlcOpcode.Ftou: WriteFunction("ftou", token); break; case Bytecode.Fxlvm.FxlcOpcode.Btoi: WriteFunction("btoi", token); break; case Bytecode.Fxlvm.FxlcOpcode.Round: WriteFunction("round", token); break; case Bytecode.Fxlvm.FxlcOpcode.Floor: WriteFunction("floor", token); break; case Bytecode.Fxlvm.FxlcOpcode.Ceil: WriteFunction("ceil", token); break; case Bytecode.Fxlvm.FxlcOpcode.Min: WriteFunction("min", token); break; case Bytecode.Fxlvm.FxlcOpcode.Max: WriteFunction("max", token); break; case Bytecode.Fxlvm.FxlcOpcode.Add: WriteInfix("+", token); break; case Bytecode.Fxlvm.FxlcOpcode.Mul: WriteInfix("*", token); break; case Bytecode.Fxlvm.FxlcOpcode.Lt: WriteInfix("<", token); break; } }