diff --git a/internal/shaderir/glsl.go b/internal/shaderir/glsl.go index 16c0354b9..eeabb5e6d 100644 --- a/internal/shaderir/glsl.go +++ b/internal/shaderir/glsl.go @@ -119,8 +119,8 @@ func (p *Program) glslBlock(b *Block, f *Func, level int, localVarIndex int) []s var glslExpr func(e *Expr) string glslExpr = func(e *Expr) string { switch e.Type { - case Literal: - return e.Value + case Numeric: + return fmt.Sprintf("%.9e", e.Num) case VarName: switch e.Variable.Type { case Uniform: @@ -135,7 +135,7 @@ func (p *Program) glslBlock(b *Block, f *Func, level int, localVarIndex int) []s return fmt.Sprintf("?(unexpected variable type: %d)", e.Variable.Type) } case Ident: - return e.Value + return e.Ident case Unary: return fmt.Sprintf("%s(%s)", e.Op, glslExpr(&e.Exprs[0])) case Binary: @@ -163,7 +163,13 @@ func (p *Program) glslBlock(b *Block, f *Func, level int, localVarIndex int) []s case Assign: lines = append(lines, fmt.Sprintf("%s%s = %s;", idt, glslExpr(&s.Exprs[0]), glslExpr(&s.Exprs[1]))) case If: - panic("not implemented") + lines = append(lines, fmt.Sprintf("%sif (%s) {", idt, glslExpr(&s.Exprs[0]))) + lines = append(lines, p.glslBlock(s.Block, f, level+1, localVarIndex)...) + if s.ElseBlock != nil { + lines = append(lines, fmt.Sprintf("%s} else {", idt)) + lines = append(lines, p.glslBlock(s.ElseBlock, f, level+1, localVarIndex)...) + } + lines = append(lines, fmt.Sprintf("%s}", idt)) case For: panic("not implemented") case Continue: diff --git a/internal/shaderir/ir_test.go b/internal/shaderir/ir_test.go index ed34acb9b..9b79aea7e 100644 --- a/internal/shaderir/ir_test.go +++ b/internal/shaderir/ir_test.go @@ -27,6 +27,22 @@ func assignStmt(lhs Expr, rhs Expr) Stmt { } } +func ifStmt(cond Expr, block *Block, elseBlock *Block) Stmt { + return Stmt{ + Type: If, + Exprs: []Expr{cond}, + Block: block, + ElseBlock: elseBlock, + } +} + +func numericExpr(value float64) Expr { + return Expr{ + Type: Numeric, + Num: value, + } +} + func varNameExpr(vt VariableType, index int) Expr { return Expr{ Type: VarName, @@ -224,7 +240,8 @@ varying vec3 V0;`, Stmts: []Stmt{ assignStmt( varNameExpr(Local, 2), - binaryExpr(Add, + binaryExpr( + Add, varNameExpr(Local, 0), varNameExpr(Local, 1), ), @@ -236,6 +253,57 @@ varying vec3 V0;`, }, Glsl: `void F0(in float l0, in float l1, out float l2) { l2 = (l0) + (l1); +}`, + }, + { + Name: "FuncIf", + Program: Program{ + Funcs: []Func{ + { + Name: "F0", + InParams: []Type{ + {Main: Float}, + {Main: Float}, + }, + OutParams: []Type{ + {Main: Float}, + }, + Block: Block{ + Stmts: []Stmt{ + ifStmt( + binaryExpr( + Eq, + varNameExpr(Local, 0), + numericExpr(0), + ), + &Block{ + Stmts: []Stmt{ + assignStmt( + varNameExpr(Local, 2), + varNameExpr(Local, 0), + ), + }, + }, + &Block{ + Stmts: []Stmt{ + assignStmt( + varNameExpr(Local, 2), + varNameExpr(Local, 1), + ), + }, + }, + ), + }, + }, + }, + }, + }, + Glsl: `void F0(in float l0, in float l1, out float l2) { + if ((l0) == (0.000000000e+00)) { + l2 = l0; + } else { + l2 = l1; + } }`, }, } diff --git a/internal/shaderir/program.go b/internal/shaderir/program.go index 16a96685c..7888c043b 100644 --- a/internal/shaderir/program.go +++ b/internal/shaderir/program.go @@ -42,11 +42,10 @@ type Block struct { type Stmt struct { Type StmtType Exprs []Expr - Condition Expr - ElseExprs []Expr + Block *Block + ElseBlock *Block ForInit Expr ForRest Expr - Block *Block } type StmtType int @@ -67,14 +66,15 @@ type Expr struct { Type ExprType Exprs []Expr Variable Variable - Value string + Num float64 + Ident string Op Op } type ExprType int const ( - Literal ExprType = iota + Numeric ExprType = iota VarName Ident Unary