mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2025-01-12 12:08:58 +01:00
shaderir: Add swizzling
This commit is contained in:
parent
7648271eff
commit
7e274050a3
@ -19,6 +19,40 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func isValidSwizzling(s string) bool {
|
||||||
|
if len(s) < 1 || 4 < len(s) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
xyzw = "xyzw"
|
||||||
|
rgba = "rgba"
|
||||||
|
strq = "strq"
|
||||||
|
)
|
||||||
|
|
||||||
|
switch {
|
||||||
|
case strings.IndexByte(xyzw, s[0]) >= 0:
|
||||||
|
for _, c := range s {
|
||||||
|
if strings.IndexRune(xyzw, c) == -1 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case strings.IndexByte(rgba, s[0]) >= 0:
|
||||||
|
for _, c := range s {
|
||||||
|
if strings.IndexRune(rgba, c) == -1 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case strings.IndexByte(strq, s[0]) >= 0:
|
||||||
|
for _, c := range s {
|
||||||
|
if strings.IndexRune(strq, c) == -1 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func (p *Program) structName(t *Type) string {
|
func (p *Program) structName(t *Type) string {
|
||||||
if t.Main != Struct {
|
if t.Main != Struct {
|
||||||
panic("shaderir: the given type at structName must be a struct")
|
panic("shaderir: the given type at structName must be a struct")
|
||||||
@ -190,6 +224,11 @@ func (p *Program) glslBlock(b *Block, level int, localVarIndex int) []string {
|
|||||||
}
|
}
|
||||||
case BuiltinFuncExpr:
|
case BuiltinFuncExpr:
|
||||||
return string(e.BuiltinFunc)
|
return string(e.BuiltinFunc)
|
||||||
|
case SwizzlingExpr:
|
||||||
|
if isValidSwizzling(e.Swizzling) {
|
||||||
|
return fmt.Sprintf("?(unexpected swizzling: %s)", e.Swizzling)
|
||||||
|
}
|
||||||
|
return e.Swizzling
|
||||||
case Ident:
|
case Ident:
|
||||||
return e.Ident
|
return e.Ident
|
||||||
case Unary:
|
case Unary:
|
||||||
|
@ -98,6 +98,13 @@ func builtinFuncExpr(f BuiltinFunc) Expr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func swizzlingExpr(swizzling string) Expr {
|
||||||
|
return Expr{
|
||||||
|
Type: SwizzlingExpr,
|
||||||
|
Swizzling: swizzling,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func identExpr(ident string) Expr {
|
func identExpr(ident string) Expr {
|
||||||
return Expr{
|
return Expr{
|
||||||
Type: Ident,
|
Type: Ident,
|
||||||
@ -455,7 +462,7 @@ varying vec3 V0;`,
|
|||||||
{Main: Vec4},
|
{Main: Vec4},
|
||||||
},
|
},
|
||||||
OutParams: []Type{
|
OutParams: []Type{
|
||||||
{Main: Float},
|
{Main: Vec2},
|
||||||
},
|
},
|
||||||
Block: block(
|
Block: block(
|
||||||
nil,
|
nil,
|
||||||
@ -463,15 +470,15 @@ varying vec3 V0;`,
|
|||||||
varNameExpr(Local, 1),
|
varNameExpr(Local, 1),
|
||||||
fieldSelectorExpr(
|
fieldSelectorExpr(
|
||||||
varNameExpr(Local, 0),
|
varNameExpr(Local, 0),
|
||||||
identExpr("x"),
|
swizzlingExpr("xz"),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
Glsl: `void F0(in vec4 l0, out float l1) {
|
Glsl: `void F0(in vec4 l0, out vec2 l1) {
|
||||||
l1 = (l0).x;
|
l1 = (l0).xz;
|
||||||
}`,
|
}`,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -89,6 +89,7 @@ type Expr struct {
|
|||||||
Int int32
|
Int int32
|
||||||
Float float32
|
Float float32
|
||||||
BuiltinFunc BuiltinFunc
|
BuiltinFunc BuiltinFunc
|
||||||
|
Swizzling string
|
||||||
Ident string
|
Ident string
|
||||||
Op Op
|
Op Op
|
||||||
}
|
}
|
||||||
@ -100,6 +101,7 @@ const (
|
|||||||
FloatExpr
|
FloatExpr
|
||||||
VarName
|
VarName
|
||||||
BuiltinFuncExpr
|
BuiltinFuncExpr
|
||||||
|
SwizzlingExpr
|
||||||
Ident
|
Ident
|
||||||
Unary
|
Unary
|
||||||
Binary
|
Binary
|
||||||
|
Loading…
Reference in New Issue
Block a user