mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-24 10:48:53 +01:00
parent
a0549820fd
commit
ac16564e95
@ -499,6 +499,66 @@ func (cs *compileState) parseExpr(block *block, expr ast.Expr) ([]shaderir.Expr,
|
||||
},
|
||||
}, []shaderir.Type{t}, stmts, true
|
||||
|
||||
case *ast.IndexExpr:
|
||||
var stmts []shaderir.Stmt
|
||||
|
||||
// Parse the index first
|
||||
exprs, _, ss, ok := cs.parseExpr(block, e.Index)
|
||||
if !ok {
|
||||
return nil, nil, nil, false
|
||||
}
|
||||
stmts = append(stmts, ss...)
|
||||
|
||||
if len(exprs) != 1 {
|
||||
cs.addError(e.Pos(), fmt.Sprintf("multiple-value context is not available at an index expression"))
|
||||
return nil, nil, nil, false
|
||||
}
|
||||
idx := exprs[0]
|
||||
if idx.Type != shaderir.NumberExpr {
|
||||
cs.addError(e.Pos(), fmt.Sprintf("an index must be a constant number"))
|
||||
return nil, nil, nil, false
|
||||
}
|
||||
idx.ConstType = shaderir.ConstTypeInt
|
||||
|
||||
exprs, ts, ss, ok := cs.parseExpr(block, e.X)
|
||||
if !ok {
|
||||
return nil, nil, nil, false
|
||||
}
|
||||
stmts = append(stmts, ss...)
|
||||
if len(exprs) != 1 {
|
||||
cs.addError(e.Pos(), fmt.Sprintf("multiple-value context is not available at an index expression"))
|
||||
return nil, nil, nil, false
|
||||
}
|
||||
x := exprs[0]
|
||||
t := ts[0]
|
||||
|
||||
var typ shaderir.Type
|
||||
switch t.Main {
|
||||
case shaderir.Vec2, shaderir.Vec3, shaderir.Vec4:
|
||||
typ = shaderir.Type{Main: shaderir.Float}
|
||||
case shaderir.Mat2:
|
||||
typ = shaderir.Type{Main: shaderir.Vec2}
|
||||
case shaderir.Mat3:
|
||||
typ = shaderir.Type{Main: shaderir.Vec3}
|
||||
case shaderir.Mat4:
|
||||
typ = shaderir.Type{Main: shaderir.Vec4}
|
||||
case shaderir.Array:
|
||||
typ = t.Sub[0]
|
||||
default:
|
||||
cs.addError(e.Pos(), fmt.Sprintf("index operator cannot be applied to the type %s", t.String()))
|
||||
return nil, nil, nil, false
|
||||
}
|
||||
|
||||
return []shaderir.Expr{
|
||||
{
|
||||
Type: shaderir.Index,
|
||||
Exprs: []shaderir.Expr{
|
||||
x,
|
||||
idx,
|
||||
},
|
||||
},
|
||||
}, []shaderir.Type{typ}, stmts, true
|
||||
|
||||
default:
|
||||
cs.addError(e.Pos(), fmt.Sprintf("expression not implemented: %#v", e))
|
||||
}
|
||||
|
1
internal/shader/testdata/array.expected.vs
vendored
1
internal/shader/testdata/array.expected.vs
vendored
@ -14,6 +14,7 @@ void F1(out vec2[2] l0) {
|
||||
vec2[2] l2 = vec2[2](vec2(0), vec2(0));
|
||||
(l1)[0] = vec2(1.0);
|
||||
l2 = l1;
|
||||
((l2)[1]).y = vec2(2.0);
|
||||
l0 = l2;
|
||||
return;
|
||||
}
|
||||
|
1
internal/shader/testdata/array.go
vendored
1
internal/shader/testdata/array.go
vendored
@ -9,5 +9,6 @@ func Foo() [2]vec2 {
|
||||
|
||||
func Bar() [2]vec2 {
|
||||
x := [2]vec2{vec2(1)}
|
||||
x[1].y = vec2(2)
|
||||
return x
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user