From 5a43a6ba334ebd76eff7568bd2091d11f61663a0 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Sun, 7 Mar 2021 18:22:08 +0200 Subject: [PATCH 1/4] gpu: use named indexes for materials It's hard to follow large number of elements that need to be in the correct order. Use material types as indices, which should make the implementation clearer. Signed-off-by: Egon Elbre --- gpu/gpu.go | 77 +++++++++++++++++++++-------------------------------- gpu/path.go | 14 +++++++--- 2 files changed, 42 insertions(+), 49 deletions(-) diff --git a/gpu/gpu.go b/gpu/gpu.go index 41604fa05..5936f9d3b 100644 --- a/gpu/gpu.go +++ b/gpu/gpu.go @@ -308,7 +308,7 @@ type texture struct { type blitter struct { ctx driver.Device viewport image.Point - prog [3]*program + prog [materialCount]*program layout driver.InputLayout colUniforms *blitColUniforms texUniforms *blitTexUniforms @@ -382,6 +382,7 @@ const ( materialColor materialType = iota materialLinearGradient materialTexture + materialCount ) func New(api API) (GPU, error) { @@ -569,6 +570,7 @@ func newBlitter(ctx driver.Device) *blitter { if err != nil { panic(err) } + b := &blitter{ ctx: ctx, quadVerts: quadVerts, @@ -576,13 +578,23 @@ func newBlitter(ctx driver.Device) *blitter { b.colUniforms = new(blitColUniforms) b.texUniforms = new(blitTexUniforms) b.linearGradientUniforms = new(blitLinearGradientUniforms) + prog, layout, err := createColorPrograms(ctx, shader_blit_vert, shader_blit_frag, - [3]interface{}{&b.colUniforms.vert, &b.linearGradientUniforms.vert, &b.texUniforms.vert}, - [3]interface{}{&b.colUniforms.frag, &b.linearGradientUniforms.frag, nil}, + [...]interface{}{ + materialColor: &b.colUniforms.vert, + materialLinearGradient: &b.linearGradientUniforms.vert, + materialTexture: &b.texUniforms.vert, + }, + [...]interface{}{ + materialColor: &b.colUniforms.frag, + materialLinearGradient: &b.linearGradientUniforms.frag, + materialTexture: nil, + }, ) if err != nil { panic(err) } + b.prog = prog b.layout = layout return b @@ -596,67 +608,40 @@ func (b *blitter) release() { b.layout.Release() } -func createColorPrograms(b driver.Device, vsSrc driver.ShaderSources, fsSrc [3]driver.ShaderSources, vertUniforms, fragUniforms [3]interface{}) ([3]*program, driver.InputLayout, error) { - var progs [3]*program - { - prog, err := b.NewProgram(vsSrc, fsSrc[materialTexture]) - if err != nil { - return progs, nil, err - } - var vertBuffer, fragBuffer *uniformBuffer - if u := vertUniforms[materialTexture]; u != nil { - vertBuffer = newUniformBuffer(b, u) - prog.SetVertexUniforms(vertBuffer.buf) - } - if u := fragUniforms[materialTexture]; u != nil { - fragBuffer = newUniformBuffer(b, u) - prog.SetFragmentUniforms(fragBuffer.buf) +func createColorPrograms(b driver.Device, vsSrc driver.ShaderSources, fsSrc [materialCount]driver.ShaderSources, vertUniforms, fragUniforms [materialCount]interface{}) (_ [materialCount]*program, _ driver.InputLayout, err error) { + var progs [materialCount]*program + + release := func() { + for _, p := range progs { + if p != nil { + p.Release() + } } - progs[materialTexture] = newProgram(prog, vertBuffer, fragBuffer) } - { - var vertBuffer, fragBuffer *uniformBuffer - prog, err := b.NewProgram(vsSrc, fsSrc[materialColor]) + + for variant := range progs { + prog, err := b.NewProgram(vsSrc, fsSrc[variant]) if err != nil { - progs[materialTexture].Release() + release() return progs, nil, err } - if u := vertUniforms[materialColor]; u != nil { - vertBuffer = newUniformBuffer(b, u) - prog.SetVertexUniforms(vertBuffer.buf) - } - if u := fragUniforms[materialColor]; u != nil { - fragBuffer = newUniformBuffer(b, u) - prog.SetFragmentUniforms(fragBuffer.buf) - } - progs[materialColor] = newProgram(prog, vertBuffer, fragBuffer) - } - { var vertBuffer, fragBuffer *uniformBuffer - prog, err := b.NewProgram(vsSrc, fsSrc[materialLinearGradient]) - if err != nil { - progs[materialTexture].Release() - progs[materialColor].Release() - return progs, nil, err - } - if u := vertUniforms[materialLinearGradient]; u != nil { + if u := vertUniforms[variant]; u != nil { vertBuffer = newUniformBuffer(b, u) prog.SetVertexUniforms(vertBuffer.buf) } - if u := fragUniforms[materialLinearGradient]; u != nil { + if u := fragUniforms[variant]; u != nil { fragBuffer = newUniformBuffer(b, u) prog.SetFragmentUniforms(fragBuffer.buf) } - progs[materialLinearGradient] = newProgram(prog, vertBuffer, fragBuffer) + progs[variant] = newProgram(prog, vertBuffer, fragBuffer) } + layout, err := b.NewInputLayout(vsSrc, []driver.InputDesc{ {Type: driver.DataTypeFloat, Size: 2, Offset: 0}, {Type: driver.DataTypeFloat, Size: 2, Offset: 4 * 2}, }) if err != nil { - progs[materialTexture].Release() - progs[materialColor].Release() - progs[materialLinearGradient].Release() return progs, nil, err } return progs, layout, nil diff --git a/gpu/path.go b/gpu/path.go index b7ec3ba2c..ae20e9061 100644 --- a/gpu/path.go +++ b/gpu/path.go @@ -28,7 +28,7 @@ type pather struct { type coverer struct { ctx driver.Device - prog [3]*program + prog [materialCount]*program texUniforms *coverTexUniforms colUniforms *coverColUniforms linearGradientUniforms *coverLinearGradientUniforms @@ -162,8 +162,16 @@ func newCoverer(ctx driver.Device) *coverer { c.texUniforms = new(coverTexUniforms) c.linearGradientUniforms = new(coverLinearGradientUniforms) prog, layout, err := createColorPrograms(ctx, shader_cover_vert, shader_cover_frag, - [3]interface{}{&c.colUniforms.vert, &c.linearGradientUniforms.vert, &c.texUniforms.vert}, - [3]interface{}{&c.colUniforms.frag, &c.linearGradientUniforms.frag, nil}, + [materialCount]interface{}{ + materialColor: &c.colUniforms.vert, + materialLinearGradient: &c.linearGradientUniforms.vert, + materialTexture: &c.texUniforms.vert, + }, + [materialCount]interface{}{ + materialColor: &c.colUniforms.frag, + materialLinearGradient: &c.linearGradientUniforms.frag, + materialTexture: nil, + }, ) if err != nil { panic(err) From 82f63d2a8c2f286953b4b27f0dcbeee50722d993 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Sun, 7 Mar 2021 18:33:43 +0200 Subject: [PATCH 2/4] gpu: add radial-gradient material Signed-off-by: Egon Elbre --- gpu/compute.go | 3 +++ gpu/gpu.go | 34 +++++++++++++++++++++++++++++ gpu/internal/convertshaders/main.go | 4 ++++ gpu/path.go | 28 ++++++++++++++++++++++++ gpu/shaders.go | 27 +++++++++++++++++++++++ 5 files changed, 96 insertions(+) diff --git a/gpu/compute.go b/gpu/compute.go index 36b9f74f6..55704b4f6 100644 --- a/gpu/compute.go +++ b/gpu/compute.go @@ -614,6 +614,9 @@ func (g *compute) encodeOps(trans f32.Affine2D, viewport image.Point, ops []imag case materialLinearGradient: // TODO: implement. g.enc.fill(f32color.NRGBAToRGBA(op.material.color1.SRGB())) + case materialRadialGradient: + // TODO: implement. + g.enc.fill(f32color.NRGBAToRGBA(op.material.color1.SRGB())) default: panic("not implemented") } diff --git a/gpu/gpu.go b/gpu/gpu.go index 5936f9d3b..7d425f547 100644 --- a/gpu/gpu.go +++ b/gpu/gpu.go @@ -313,6 +313,7 @@ type blitter struct { colUniforms *blitColUniforms texUniforms *blitTexUniforms linearGradientUniforms *blitLinearGradientUniforms + radialGradientUniforms *blitRadialGradientUniforms quadVerts driver.Buffer } @@ -343,6 +344,16 @@ type blitLinearGradientUniforms struct { } } +type blitRadialGradientUniforms struct { + vert struct { + blitUniforms + _ [12]byte // Padding to a multiple of 16. + } + frag struct { + gradientUniforms + } +} + type uniformBuffer struct { buf driver.Buffer ptr []byte @@ -381,6 +392,7 @@ const ( const ( materialColor materialType = iota materialLinearGradient + materialRadialGradient materialTexture materialCount ) @@ -578,16 +590,19 @@ func newBlitter(ctx driver.Device) *blitter { b.colUniforms = new(blitColUniforms) b.texUniforms = new(blitTexUniforms) b.linearGradientUniforms = new(blitLinearGradientUniforms) + b.radialGradientUniforms = new(blitRadialGradientUniforms) prog, layout, err := createColorPrograms(ctx, shader_blit_vert, shader_blit_frag, [...]interface{}{ materialColor: &b.colUniforms.vert, materialLinearGradient: &b.linearGradientUniforms.vert, + materialRadialGradient: &b.radialGradientUniforms.vert, materialTexture: &b.texUniforms.vert, }, [...]interface{}{ materialColor: &b.colUniforms.frag, materialLinearGradient: &b.linearGradientUniforms.frag, + materialRadialGradient: &b.radialGradientUniforms.frag, materialTexture: nil, }, ) @@ -1071,6 +1086,14 @@ func (d *drawState) materialFor(rect f32.Rectangle, off f32.Point, partTrans f32 m.color2 = f32color.LinearFromSRGB(d.color2) m.opaque = m.color1.A == 1.0 && m.color2.A == 1.0 + m.uvTrans = partTrans.Mul(gradientSpaceTransform(clip, off, d.stop1, d.stop2)) + case materialRadialGradient: + m.material = materialRadialGradient + + m.color1 = f32color.LinearFromSRGB(d.color1) + m.color2 = f32color.LinearFromSRGB(d.color2) + m.opaque = m.color1.A == 1.0 && m.color2.A == 1.0 + m.uvTrans = partTrans.Mul(gradientSpaceTransform(clip, off, d.stop1, d.stop2)) case materialTexture: m.material = materialTexture @@ -1166,11 +1189,13 @@ func (b *blitter) blit(z float32, mat materialType, col f32color.RGBA, col1, col case materialColor: b.colUniforms.frag.color = col uniforms = &b.colUniforms.vert.blitUniforms + case materialTexture: t1, t2, t3, t4, t5, t6 := uvTrans.Elems() b.texUniforms.vert.blitUniforms.uvTransformR1 = [4]float32{t1, t2, t3, 0} b.texUniforms.vert.blitUniforms.uvTransformR2 = [4]float32{t4, t5, t6, 0} uniforms = &b.texUniforms.vert.blitUniforms + case materialLinearGradient: b.linearGradientUniforms.frag.color1 = col1 b.linearGradientUniforms.frag.color2 = col2 @@ -1179,6 +1204,15 @@ func (b *blitter) blit(z float32, mat materialType, col f32color.RGBA, col1, col b.linearGradientUniforms.vert.blitUniforms.uvTransformR1 = [4]float32{t1, t2, t3, 0} b.linearGradientUniforms.vert.blitUniforms.uvTransformR2 = [4]float32{t4, t5, t6, 0} uniforms = &b.linearGradientUniforms.vert.blitUniforms + + case materialRadialGradient: + b.radialGradientUniforms.frag.color1 = col1 + b.radialGradientUniforms.frag.color2 = col2 + + t1, t2, t3, t4, t5, t6 := uvTrans.Elems() + b.radialGradientUniforms.vert.blitUniforms.uvTransformR1 = [4]float32{t1, t2, t3, 0} + b.radialGradientUniforms.vert.blitUniforms.uvTransformR2 = [4]float32{t4, t5, t6, 0} + uniforms = &b.radialGradientUniforms.vert.blitUniforms } uniforms.z = z uniforms.transform = [4]float32{scale.X, scale.Y, off.X, off.Y} diff --git a/gpu/internal/convertshaders/main.go b/gpu/internal/convertshaders/main.go index 92b98790e..7f309402b 100644 --- a/gpu/internal/convertshaders/main.go +++ b/gpu/internal/convertshaders/main.go @@ -268,6 +268,10 @@ func (conv *Converter) Shader(shaderPath string) ([]driver.ShaderSources, error) FetchColorExpr: `mix(_color1, _color2, clamp(vUV.x, 0.0, 1.0))`, Header: `layout(binding=0) uniform Gradient { vec4 _color1; vec4 _color2; };`, }, + { + FetchColorExpr: `mix(_color1, _color2, clamp(length(vUV), 0.0, 1.0))`, + Header: `layout(binding=0) uniform Gradient { vec4 _color1; vec4 _color2; };`, + }, { FetchColorExpr: `texture(tex, vUV)`, Header: `layout(binding=0) uniform sampler2D tex;`, diff --git a/gpu/path.go b/gpu/path.go index ae20e9061..ce75cb00f 100644 --- a/gpu/path.go +++ b/gpu/path.go @@ -32,6 +32,7 @@ type coverer struct { texUniforms *coverTexUniforms colUniforms *coverColUniforms linearGradientUniforms *coverLinearGradientUniforms + radialGradientUniforms *coverRadialGradientUniforms layout driver.InputLayout } @@ -62,6 +63,16 @@ type coverLinearGradientUniforms struct { } } +type coverRadialGradientUniforms struct { + vert struct { + coverUniforms + _ [12]byte // Padding to multiple of 16. + } + frag struct { + gradientUniforms + } +} + type coverUniforms struct { transform [4]float32 uvCoverTransform [4]float32 @@ -158,24 +169,30 @@ func newCoverer(ctx driver.Device) *coverer { c := &coverer{ ctx: ctx, } + c.colUniforms = new(coverColUniforms) c.texUniforms = new(coverTexUniforms) c.linearGradientUniforms = new(coverLinearGradientUniforms) + c.radialGradientUniforms = new(coverRadialGradientUniforms) + prog, layout, err := createColorPrograms(ctx, shader_cover_vert, shader_cover_frag, [materialCount]interface{}{ materialColor: &c.colUniforms.vert, materialLinearGradient: &c.linearGradientUniforms.vert, + materialRadialGradient: &c.radialGradientUniforms.vert, materialTexture: &c.texUniforms.vert, }, [materialCount]interface{}{ materialColor: &c.colUniforms.frag, materialLinearGradient: &c.linearGradientUniforms.frag, + materialRadialGradient: &c.radialGradientUniforms.frag, materialTexture: nil, }, ) if err != nil { panic(err) } + c.prog = prog c.layout = layout return c @@ -394,6 +411,7 @@ func (c *coverer) cover(z float32, mat materialType, col f32color.RGBA, col1, co case materialColor: c.colUniforms.frag.color = col uniforms = &c.colUniforms.vert.coverUniforms + case materialLinearGradient: c.linearGradientUniforms.frag.color1 = col1 c.linearGradientUniforms.frag.color2 = col2 @@ -402,6 +420,16 @@ func (c *coverer) cover(z float32, mat materialType, col f32color.RGBA, col1, co c.linearGradientUniforms.vert.uvTransformR1 = [4]float32{t1, t2, t3, 0} c.linearGradientUniforms.vert.uvTransformR2 = [4]float32{t4, t5, t6, 0} uniforms = &c.linearGradientUniforms.vert.coverUniforms + + case materialRadialGradient: + c.radialGradientUniforms.frag.color1 = col1 + c.radialGradientUniforms.frag.color2 = col2 + + t1, t2, t3, t4, t5, t6 := uvTrans.Elems() + c.radialGradientUniforms.vert.uvTransformR1 = [4]float32{t1, t2, t3, 0} + c.radialGradientUniforms.vert.uvTransformR2 = [4]float32{t4, t5, t6, 0} + uniforms = &c.radialGradientUniforms.vert.coverUniforms + case materialTexture: t1, t2, t3, t4, t5, t6 := uvTrans.Elems() c.texUniforms.vert.uvTransformR1 = [4]float32{t1, t2, t3, 0} diff --git a/gpu/shaders.go b/gpu/shaders.go index 4ef02174b..1c4f16bab 100644 --- a/gpu/shaders.go +++ b/gpu/shaders.go @@ -40,6 +40,19 @@ var ( GLSL150: "#version 150\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nout vec4 fragColor;\nin vec2 vUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(vUV.x, 0.0, 1.0)));\n}\n\n", HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0xc0, 0x43, 0x72, 0x3d, 0x68, 0xc9, 0x38, 0x57, 0x9f, 0xa3, 0x60, 0xa8, 0xae, 0xd2, 0xa2, 0xf0, 0x1, 0x0, 0x0, 0x0, 0x40, 0x3, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0xcc, 0x0, 0x0, 0x0, 0x74, 0x1, 0x0, 0x0, 0xf0, 0x1, 0x0, 0x0, 0xd8, 0x2, 0x0, 0x0, 0xc, 0x3, 0x0, 0x0, 0x41, 0x6f, 0x6e, 0x39, 0x8c, 0x0, 0x0, 0x0, 0x8c, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x5c, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x1, 0x0, 0x24, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x1f, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x3, 0xb0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, 0x18, 0x80, 0x0, 0x0, 0x0, 0xb0, 0x1, 0x0, 0x0, 0x2, 0x1, 0x0, 0xf, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x2, 0x0, 0x0, 0x3, 0x1, 0x0, 0xf, 0x80, 0x1, 0x0, 0xe4, 0x81, 0x1, 0x0, 0xe4, 0xa0, 0x4, 0x0, 0x0, 0x4, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0xff, 0x80, 0x1, 0x0, 0xe4, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x8, 0xf, 0x80, 0x0, 0x0, 0xe4, 0x80, 0xff, 0xff, 0x0, 0x0, 0x53, 0x48, 0x44, 0x52, 0xa0, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x28, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x12, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x36, 0x20, 0x0, 0x5, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xa, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0xe0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x0, 0xab, 0xab, 0xab, 0x3c, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x0, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x32, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x31, 0x0, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x1, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab}, }, + { + Name: "blit.frag", + Uniforms: driver.UniformsReflection{ + Blocks: []driver.UniformBlock{{Name: "Gradient", Binding: 0}}, + Locations: []driver.UniformLocation{{Name: "_12._color1", Type: 0x0, Size: 4, Offset: 0}, {Name: "_12._color2", Type: 0x0, Size: 4, Offset: 16}}, + Size: 32, + }, + GLSL100ES: "precision mediump float;\nprecision highp int;\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nvarying vec2 vUV;\n\nvoid main()\n{\n gl_FragData[0] = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n}\n\n", + GLSL300ES: "#version 300 es\nprecision mediump float;\nprecision highp int;\n\nlayout(std140) uniform Gradient\n{\n vec4 _color1;\n vec4 _color2;\n} _12;\n\nlayout(location = 0) out vec4 fragColor;\nin vec2 vUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n}\n\n", + GLSL130: "#version 130\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nout vec4 fragColor;\nin vec2 vUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n}\n\n", + GLSL150: "#version 150\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nout vec4 fragColor;\nin vec2 vUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n}\n\n", + HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0x10, 0x3d, 0xc, 0x8f, 0x81, 0xf3, 0x6e, 0x92, 0x13, 0x1a, 0x49, 0x47, 0xa2, 0xfa, 0x6e, 0xd1, 0x1, 0x0, 0x0, 0x0, 0xb0, 0x3, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x4, 0x1, 0x0, 0x0, 0xe4, 0x1, 0x0, 0x0, 0x60, 0x2, 0x0, 0x0, 0x48, 0x3, 0x0, 0x0, 0x7c, 0x3, 0x0, 0x0, 0x41, 0x6f, 0x6e, 0x39, 0xc4, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x94, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x1, 0x0, 0x24, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x51, 0x0, 0x0, 0x5, 0x2, 0x0, 0xf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x3, 0xb0, 0x5a, 0x0, 0x0, 0x4, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0xe4, 0xb0, 0x0, 0x0, 0xe4, 0xb0, 0x2, 0x0, 0x0, 0xa0, 0x7, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0xff, 0x80, 0x6, 0x0, 0x0, 0x2, 0x0, 0x0, 0x11, 0x80, 0x0, 0x0, 0x0, 0x80, 0x1, 0x0, 0x0, 0x2, 0x1, 0x0, 0xf, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x2, 0x0, 0x0, 0x3, 0x1, 0x0, 0xf, 0x80, 0x1, 0x0, 0xe4, 0x81, 0x1, 0x0, 0xe4, 0xa0, 0x4, 0x0, 0x0, 0x4, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x80, 0x1, 0x0, 0xe4, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x8, 0xf, 0x80, 0x0, 0x0, 0xe4, 0x80, 0xff, 0xff, 0x0, 0x0, 0x53, 0x48, 0x44, 0x52, 0xd8, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, 0x5, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x0, 0x0, 0x0, 0xa, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xa, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0xe0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x0, 0xab, 0xab, 0xab, 0x3c, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x0, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x32, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x31, 0x0, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab}, + }, { Name: "blit.frag", Textures: []driver.TextureBinding{{Name: "tex", Binding: 0}}, @@ -113,6 +126,20 @@ var ( GLSL150: "#version 150\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nuniform sampler2D cover;\n\nout vec4 fragColor;\nin vec2 vUV;\nin vec2 vCoverUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(vUV.x, 0.0, 1.0)));\n float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);\n fragColor *= cover_1;\n}\n\n", HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0xd2, 0x27, 0xbe, 0xa0, 0xfc, 0x1b, 0xe8, 0x79, 0xd, 0x99, 0xe5, 0xb7, 0xfe, 0x6f, 0x25, 0x6f, 0x1, 0x0, 0x0, 0x0, 0x70, 0x4, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x8, 0x1, 0x0, 0x0, 0x38, 0x2, 0x0, 0x0, 0xb4, 0x2, 0x0, 0x0, 0xf0, 0x3, 0x0, 0x0, 0x3c, 0x4, 0x0, 0x0, 0x41, 0x6f, 0x6e, 0x39, 0xc8, 0x0, 0x0, 0x0, 0xc8, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x94, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x1, 0x0, 0x28, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x34, 0x0, 0x1, 0x0, 0x24, 0x0, 0x0, 0x0, 0x34, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x1f, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0xf, 0xb0, 0x1f, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x90, 0x0, 0x8, 0xf, 0xa0, 0x42, 0x0, 0x0, 0x3, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0xe4, 0xb0, 0x0, 0x8, 0xe4, 0xa0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, 0x12, 0x80, 0x0, 0x0, 0xff, 0xb0, 0x1, 0x0, 0x0, 0x2, 0x1, 0x0, 0xf, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x2, 0x0, 0x0, 0x3, 0x1, 0x0, 0xf, 0x80, 0x1, 0x0, 0xe4, 0x81, 0x1, 0x0, 0xe4, 0xa0, 0x4, 0x0, 0x0, 0x4, 0x1, 0x0, 0xf, 0x80, 0x0, 0x0, 0x55, 0x80, 0x1, 0x0, 0xe4, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x23, 0x0, 0x0, 0x2, 0x0, 0x0, 0x11, 0x80, 0x0, 0x0, 0x0, 0x80, 0x5, 0x0, 0x0, 0x3, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x80, 0x1, 0x0, 0xe4, 0x80, 0x1, 0x0, 0x0, 0x2, 0x0, 0x8, 0xf, 0x80, 0x0, 0x0, 0xe4, 0x80, 0xff, 0xff, 0x0, 0x0, 0x53, 0x48, 0x44, 0x52, 0x28, 0x1, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x4a, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x3, 0x0, 0x60, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x58, 0x18, 0x0, 0x4, 0x0, 0x70, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x55, 0x55, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x42, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0x36, 0x20, 0x0, 0x5, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2a, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xa, 0xf2, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x9, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x7e, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x60, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x8, 0x12, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x80, 0x81, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x38, 0x0, 0x0, 0x7, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0x34, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0xb, 0x1, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x0, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x0, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x0, 0xab, 0xab, 0x91, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x0, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x32, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x31, 0x0, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x44, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0x4, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab}, }, + { + Name: "cover.frag", + Uniforms: driver.UniformsReflection{ + Blocks: []driver.UniformBlock{{Name: "Gradient", Binding: 0}}, + Locations: []driver.UniformLocation{{Name: "_12._color1", Type: 0x0, Size: 4, Offset: 0}, {Name: "_12._color2", Type: 0x0, Size: 4, Offset: 16}}, + Size: 32, + }, + Textures: []driver.TextureBinding{{Name: "cover", Binding: 1}}, + GLSL100ES: "precision mediump float;\nprecision highp int;\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nuniform mediump sampler2D cover;\n\nvarying vec2 vUV;\nvarying highp vec2 vCoverUV;\n\nvoid main()\n{\n gl_FragData[0] = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n float cover_1 = min(abs(texture2D(cover, vCoverUV).x), 1.0);\n gl_FragData[0] *= cover_1;\n}\n\n", + GLSL300ES: "#version 300 es\nprecision mediump float;\nprecision highp int;\n\nlayout(std140) uniform Gradient\n{\n vec4 _color1;\n vec4 _color2;\n} _12;\n\nuniform mediump sampler2D cover;\n\nlayout(location = 0) out vec4 fragColor;\nin vec2 vUV;\nin highp vec2 vCoverUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);\n fragColor *= cover_1;\n}\n\n", + GLSL130: "#version 130\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nuniform sampler2D cover;\n\nout vec4 fragColor;\nin vec2 vUV;\nin vec2 vCoverUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);\n fragColor *= cover_1;\n}\n\n", + GLSL150: "#version 150\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nuniform sampler2D cover;\n\nout vec4 fragColor;\nin vec2 vUV;\nin vec2 vCoverUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);\n fragColor *= cover_1;\n}\n\n", + HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0x79, 0x65, 0x19, 0xf3, 0xd2, 0xf1, 0xc0, 0x15, 0x8b, 0x62, 0x2d, 0x57, 0x71, 0xb8, 0x5, 0xe9, 0x1, 0x0, 0x0, 0x0, 0xe0, 0x4, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x40, 0x1, 0x0, 0x0, 0xa8, 0x2, 0x0, 0x0, 0x24, 0x3, 0x0, 0x0, 0x60, 0x4, 0x0, 0x0, 0xac, 0x4, 0x0, 0x0, 0x41, 0x6f, 0x6e, 0x39, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xcc, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x1, 0x0, 0x28, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x34, 0x0, 0x1, 0x0, 0x24, 0x0, 0x0, 0x0, 0x34, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x51, 0x0, 0x0, 0x5, 0x2, 0x0, 0xf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0xf, 0xb0, 0x1f, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x90, 0x0, 0x8, 0xf, 0xa0, 0x42, 0x0, 0x0, 0x3, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0xe4, 0xb0, 0x0, 0x8, 0xe4, 0xa0, 0x5a, 0x0, 0x0, 0x4, 0x0, 0x0, 0x2, 0x80, 0x0, 0x0, 0x1b, 0xb0, 0x0, 0x0, 0x1b, 0xb0, 0x2, 0x0, 0x0, 0xa0, 0x7, 0x0, 0x0, 0x2, 0x0, 0x0, 0x2, 0x80, 0x0, 0x0, 0x55, 0x80, 0x6, 0x0, 0x0, 0x2, 0x0, 0x0, 0x12, 0x80, 0x0, 0x0, 0x55, 0x80, 0x1, 0x0, 0x0, 0x2, 0x1, 0x0, 0xf, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x2, 0x0, 0x0, 0x3, 0x1, 0x0, 0xf, 0x80, 0x1, 0x0, 0xe4, 0x81, 0x1, 0x0, 0xe4, 0xa0, 0x4, 0x0, 0x0, 0x4, 0x1, 0x0, 0xf, 0x80, 0x0, 0x0, 0x55, 0x80, 0x1, 0x0, 0xe4, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x23, 0x0, 0x0, 0x2, 0x0, 0x0, 0x11, 0x80, 0x0, 0x0, 0x0, 0x80, 0x5, 0x0, 0x0, 0x3, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x80, 0x1, 0x0, 0xe4, 0x80, 0x1, 0x0, 0x0, 0x2, 0x0, 0x8, 0xf, 0x80, 0x0, 0x0, 0xe4, 0x80, 0xff, 0xff, 0x0, 0x0, 0x53, 0x48, 0x44, 0x52, 0x60, 0x1, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x3, 0x0, 0x60, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x58, 0x18, 0x0, 0x4, 0x0, 0x70, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x55, 0x55, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0xc2, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x1a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x1a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, 0x5, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x0, 0x0, 0x0, 0xa, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xa, 0xf2, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x9, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x7e, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x60, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x8, 0x12, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x80, 0x81, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x38, 0x0, 0x0, 0x7, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0x34, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0xb, 0x1, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x0, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x0, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x0, 0xab, 0xab, 0x91, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x0, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x32, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x31, 0x0, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x44, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xc, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab}, + }, { Name: "cover.frag", Textures: []driver.TextureBinding{{Name: "tex", Binding: 0}, {Name: "cover", Binding: 1}}, From 2ae1967aeb099958ee97c4a813edfb96bca8f787 Mon Sep 17 00:00:00 2001 From: Egon Elbre Date: Sun, 7 Mar 2021 18:45:42 +0200 Subject: [PATCH 3/4] gpu,op/paint: add paint.RadialGradientOp Signed-off-by: Egon Elbre --- gpu/gpu.go | 78 ++++++++++++++++-- .../rendertest/refs/TestEllipseGradient.png | Bin 0 -> 3537 bytes .../refs/TestEllipseGradientAngled.png | Bin 0 -> 2921 bytes .../rendertest/refs/TestRadialGradient.png | Bin 0 -> 4947 bytes gpu/internal/rendertest/render_test.go | 38 +++++++++ internal/opconst/ops.go | 3 + op/paint/paint.go | 46 +++++++++++ 7 files changed, 157 insertions(+), 8 deletions(-) create mode 100644 gpu/internal/rendertest/refs/TestEllipseGradient.png create mode 100644 gpu/internal/rendertest/refs/TestEllipseGradientAngled.png create mode 100644 gpu/internal/rendertest/refs/TestRadialGradient.png diff --git a/gpu/gpu.go b/gpu/gpu.go index 7d425f547..d4c1c4930 100644 --- a/gpu/gpu.go +++ b/gpu/gpu.go @@ -107,11 +107,13 @@ type drawState struct { // Current paint.ColorOp, if any. color color.NRGBA - // Current paint.LinearGradientOp. + // Current paint.LinearGradientOp and paint.RadialGradientOp. stop1 f32.Point stop2 f32.Point color1 color.NRGBA color2 color.NRGBA + // Current paint.RadialGradientOp. + radiusy float32 } type pathOp struct { @@ -187,9 +189,11 @@ type material struct { opaque bool // For materialTypeColor. color f32color.RGBA - // For materialTypeLinearGradient. + // For materialTypeLinearGradient and materialTypeRadialGradient. color1 f32color.RGBA color2 f32color.RGBA + // For materialTypeRadialGradient. + radiusy float32 // For materialTypeTexture. data imageOpData uvTrans f32.Affine2D @@ -212,9 +216,20 @@ type imageOpData struct { } type linearGradientOpData struct { - stop1 f32.Point + stop1 f32.Point + stop2 f32.Point + + color1 color.NRGBA + color2 color.NRGBA +} + +type radialGradientOpData struct { + stop1 f32.Point + stop2 f32.Point + + radiusy float32 + color1 color.NRGBA - stop2 f32.Point color2 color.NRGBA } @@ -294,6 +309,36 @@ func decodeLinearGradientOp(data []byte) linearGradientOpData { } } +func decodeRadialGradientOp(data []byte) radialGradientOpData { + if opconst.OpType(data[0]) != opconst.TypeRadialGradient { + panic("invalid op") + } + bo := binary.LittleEndian + return radialGradientOpData{ + stop1: f32.Point{ + X: math.Float32frombits(bo.Uint32(data[1:])), + Y: math.Float32frombits(bo.Uint32(data[5:])), + }, + stop2: f32.Point{ + X: math.Float32frombits(bo.Uint32(data[9:])), + Y: math.Float32frombits(bo.Uint32(data[13:])), + }, + radiusy: math.Float32frombits(bo.Uint32(data[17:])), + color1: color.NRGBA{ + R: data[21+0], + G: data[21+1], + B: data[21+2], + A: data[21+3], + }, + color2: color.NRGBA{ + R: data[25+0], + G: data[25+1], + B: data[25+2], + A: data[25+3], + }, + } +} + type clipType uint8 type resource interface { @@ -975,6 +1020,14 @@ loop: state.stop2 = op.stop2 state.color1 = op.color1 state.color2 = op.color2 + case opconst.TypeRadialGradient: + state.matType = materialRadialGradient + op := decodeRadialGradientOp(encOp.Data) + state.stop1 = op.stop1 + state.stop2 = op.stop2 + state.radiusy = op.radiusy + state.color1 = op.color1 + state.color2 = op.color2 case opconst.TypeImage: state.matType = materialTexture state.image = decodeImageOp(encOp.Data, encOp.Refs) @@ -1086,7 +1139,7 @@ func (d *drawState) materialFor(rect f32.Rectangle, off f32.Point, partTrans f32 m.color2 = f32color.LinearFromSRGB(d.color2) m.opaque = m.color1.A == 1.0 && m.color2.A == 1.0 - m.uvTrans = partTrans.Mul(gradientSpaceTransform(clip, off, d.stop1, d.stop2)) + m.uvTrans = partTrans.Mul(gradientSpaceTransform(clip, off, d.stop1, d.stop2, -1)) case materialRadialGradient: m.material = materialRadialGradient @@ -1094,7 +1147,7 @@ func (d *drawState) materialFor(rect f32.Rectangle, off f32.Point, partTrans f32 m.color2 = f32color.LinearFromSRGB(d.color2) m.opaque = m.color1.A == 1.0 && m.color2.A == 1.0 - m.uvTrans = partTrans.Mul(gradientSpaceTransform(clip, off, d.stop1, d.stop2)) + m.uvTrans = partTrans.Mul(gradientSpaceTransform(clip, off, d.stop1, d.stop2, d.radiusy)) case materialTexture: m.material = materialTexture dr := boundRectF(rect.Add(off)) @@ -1286,11 +1339,20 @@ func texSpaceTransform(r f32.Rectangle, bounds image.Point) (f32.Point, f32.Poin } // gradientSpaceTransform transforms stop1 and stop2 to [(0,0), (1,1)]. -func gradientSpaceTransform(clip image.Rectangle, off f32.Point, stop1, stop2 f32.Point) f32.Affine2D { +func gradientSpaceTransform(clip image.Rectangle, off f32.Point, stop1, stop2 f32.Point, radiusy float32) f32.Affine2D { d := stop2.Sub(stop1) l := float32(math.Sqrt(float64(d.X*d.X + d.Y*d.Y))) a := float32(math.Atan2(float64(-d.Y), float64(d.X))) + scalex := 1 / l + + var scaley float32 + if radiusy == -1 { + scaley = scalex + } else if radiusy != 0 { + scaley = 1 / radiusy + } + // TODO: optimize zp := f32.Point{} return f32.Affine2D{}. @@ -1298,7 +1360,7 @@ func gradientSpaceTransform(clip image.Rectangle, off f32.Point, stop1, stop2 f3 Offset(zp.Sub(off).Add(layout.FPt(clip.Min))). // offset to clip space Offset(zp.Sub(stop1)). // offset to first stop point Rotate(zp, a). // rotate to align gradient - Scale(zp, f32.Pt(1/l, 1/l)) // scale gradient to right size + Scale(zp, f32.Pt(scalex, scaley)) // scale gradient to right size } // clipSpaceTransform returns the scale and offset that transforms the given diff --git a/gpu/internal/rendertest/refs/TestEllipseGradient.png b/gpu/internal/rendertest/refs/TestEllipseGradient.png new file mode 100644 index 0000000000000000000000000000000000000000..75283649be59fdd2b9a74b290be7c829aa3b2b99 GIT binary patch literal 3537 zcmV;?4KDJDP)uf3QpL)g%|Y@lz5zLzXN^JjC62L3vw@#-ub^t`|GHE7Jz`k;C~#BGk`w;zO}v(MV1S||M}y>Gf&cf zAfG;J9|PdL_5%@Z;t~Gkvp<$83kBdE(*7=LvnTvh01!N29sjP;zx3V}7AQ*u;2pqQ zfR|DGn0)$Z{#_ovg7#eu10#Y8hwBAmus8tT`s0<)e3JGt0G$fJgaGIW029EcW>?0` zvH-XQ`2VQ=vk1T%@kvJ_a1b1adk;VtqXmY_`5fu0&BgJuAOO|?KO*g)<*}FMKQsp5 zT!@7#aMXNkJ=tf)ZNYGKi=>066Ps$tUHYlzci_^^yk^5xcn) zw5Omq6}(SJRgz{C1&yT8SfojhzUk&ev&J6qmsoOOF<_ae%U`6NhbBK#rPrZ>+sYSB z8%kpjc%9c9lHSwb9!20@)~}1Sp2954{&=Xo^G&}7_}JpYleF}Jzj_k5h*gJOth>?t zhYbLF3PSDZ=E+g$o*$!o%#4|uV0HQXr2hbdJ@(qP)gPrfdCBO&cD@W4I z1AdAluax}kau|x_XEp{%sV6R16i$!=GPE0)HS>T=uG&KlpQb=c78J}seLLpgVx=dH zx6uiHX`_Zl9`M#zJqz>S$`Lq$!4A6$^QQ#0;>f+DIzVT82oGde6)cFycA}7^`nx490!2QYo&c2S3)S> z`HtC(H2}pj6KRB1Sbb#{wxv@K-&WCMyQg*aJ2(IksHpZVJHL$UhS8uu->|_FAb^l6191Pr|^+c|ado z=&kLj*c1STf2g{j)&m@Jf?mL&2@9D5aE8dI=VGif+54RyfP?VJHJXU%%u*wk09?kx zgJk>CAZxbh&w7B%>k~zE89CDHV{ziraP^!W0IyKxM_<#>5iVkj&x!|Np#V^?!cMUD zT|GenUXV4mN@+n+R(%X$&7TFh%Ok-HGo@Gpu;Zxzu%oCsr|B?lGexBRt#gc;91#Xnt>E{Q;05%7e&cEV_XltVvO8}I)++t;eq%67u zE=e)v+o9@PC!c>MfZd-S0Q44LYJ>Dc#TAqwjH}aWokUG@N&6ugwGj&dUd06sER(E= zS`~^=0KohMx%o>cXORfU+IQPvhSCCnbD^L{*HlquNnD`=;NtHm_2d!;p||HJ1HhIW z$I_W}s&_pMumG?DKtfc(*encK13;teiaR7aq6)=1j}!n{rLTm}oFD+~Exx)IRsurQ zf$*Y-RWyI;471pGc__9~jzt@l#y*>svSGk+RiFuZfV6;DcZ<^jK$_30Ka@aCBXIiJ zbWlUs2@J#z0Lkv)AnhmsxN6md3bPFW-LV_k$qaxMQ7q@LbOI?dvuzbkD8Q!<8`PzZ z0O+bsUjLR&WIOKL15OU4Ap-!8PC*-4DM9L$MYHun*zuRHccl-VNkQW10IXG`s{}(~ zBs}=4{NMVv3?k&wo9H=Xg!~2Ms=?pRVn7$9u$}~RTQmrz!ypbH9e@sLs<=o{i9*7l zC?(OGglA78y)D3CS??1y+-W{TS1>m*VKa92+R0QQMJEbXvRDHN0x zBn1Fgt+Y87s?})#K>eNlLGeN|URI%sZ?S5nZSB?DrsZ8Kdwd*svuU;(znHnWr_jI{ZBMmv3VOUR*nt;U9=2DaghIjo#18fbH`1v z2MZW&PJ)Ww@bu(j0RXF3DvoYF07gM0)ZZoJRVZjR_Z!Irl&FCJcYHE6h;noQhB*bX>CNnc3vhZE z_@1^59E{JyP5DZbB#H;nGbjy7Fxc!fV+6pc zdH`10L_Y5b3l(&v=#)L760WiNpAG;I2!I+bP&%H3Io>3!6Vx!0)T{B7Zq$C@JYbd( z@P;sWu}P5v1u3Xz;$F{^Uf}_!1HesuWIxN%)Yz%M@S2|>x(DcpvcaYZzoXUeCKdo( zqc|*Kz>;<00n+rZ9*32av)WG)*ybUwMpKfHc_^l;k@Up|07sS^DXOH{NX_B!YxWFd zBLE%<1yQb`ZXh6Mnx_DwQt{(Ir^ z=sRp9b`S zM)Y)H%0Dy4tc29}kesd=xMkBLCc3 zYQz|TZ{EHhWk0~r*A6PC(^8clFv`J3vi(Qjy;I&n;}gJ-aX>&Zz#b6petALf z;Q{O>K041xM=Snm0KgZ&izN1daQ%G_K*u>j;u&^q%r0wSgD|EY>;d<_d&bhh18#FC z2rM)b09Hi%>4gG-Bj&I8!H}E(?SF#@gq?dYWg=1@Oj&5Z5`aqbxo@x+7TO{wpbvculK96VCzvfoOq|INc>oCJZ&`gS zq!|FeppDI?o%@sYc?_VB1}Y}SXq9aw=AX#trrnPIjUQETmG5m{Y?+$GA?iP z+NaUANK$DGz!X&E`wubjhN|apO)izlA^-?%uu%cnmx5@$A!$D}XSVuNmqh>o0Ka-C zV6z~s*#iK;<{z|w<(pfGECm1n_!+TKlBCl$2LOAQB+EZ{{s`3nbF)iiWI+H7z9Qdq z5qQceNLijv0l;a`wQs`a{?kfX5CEY#vB?3L{3i(jx~n<voQdV08+sxB%Pm^k@Ztq zA^-scJde1IizmXCWW4}Dngb{nI(+uWGG)AOlp!rYAe7<=s?H8NW z%c21Y^4{+(dxmOuy#PQWpP>EgCFT2)JOcp2hPZEh;d+ONsMtd$kx$_L<&1T8c^&`+ zIRki|mrgMNV_e?z)qIWr_sDYsAj#Hy!y4@&GsG2-&rbdo009602Iw^=`>BDi00000 LNkvXXu0mjf_1%i{ literal 0 HcmV?d00001 diff --git a/gpu/internal/rendertest/refs/TestEllipseGradientAngled.png b/gpu/internal/rendertest/refs/TestEllipseGradientAngled.png new file mode 100644 index 0000000000000000000000000000000000000000..3e9378bd658e144afbe32cbfe44525c4687db23a GIT binary patch literal 2921 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 Z+@OGEgY2ITls^a!pe(OhG?{xp_%8{ZnS1~M literal 0 HcmV?d00001 diff --git a/gpu/internal/rendertest/refs/TestRadialGradient.png b/gpu/internal/rendertest/refs/TestRadialGradient.png new file mode 100644 index 0000000000000000000000000000000000000000..8a2ff95bc6d4a3b9f3948ebefb905925329c1495 GIT binary patch literal 4947 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 Date: Mon, 8 Mar 2021 17:18:47 +0200 Subject: [PATCH 4/4] gpu,op/paint: add Offset1 to RadialGradient Signed-off-by: Egon Elbre --- gpu/gpu.go | 24 +++++++++++---- gpu/internal/convertshaders/main.go | 4 +-- .../refs/TestRadialGradientOffset.png | Bin 0 -> 4673 bytes gpu/internal/rendertest/render_test.go | 13 ++++++++ gpu/path.go | 10 ++++--- gpu/shaders.go | 28 +++++++++--------- internal/opconst/ops.go | 2 +- op/paint/paint.go | 4 +++ 8 files changed, 59 insertions(+), 26 deletions(-) create mode 100644 gpu/internal/rendertest/refs/TestRadialGradientOffset.png diff --git a/gpu/gpu.go b/gpu/gpu.go index d4c1c4930..e94da75ae 100644 --- a/gpu/gpu.go +++ b/gpu/gpu.go @@ -113,6 +113,7 @@ type drawState struct { color1 color.NRGBA color2 color.NRGBA // Current paint.RadialGradientOp. + offset1 float32 radiusy float32 } @@ -193,6 +194,7 @@ type material struct { color1 f32color.RGBA color2 f32color.RGBA // For materialTypeRadialGradient. + offset1 float32 radiusy float32 // For materialTypeTexture. data imageOpData @@ -227,6 +229,7 @@ type radialGradientOpData struct { stop1 f32.Point stop2 f32.Point + offset1 float32 radiusy float32 color1 color.NRGBA @@ -336,6 +339,7 @@ func decodeRadialGradientOp(data []byte) radialGradientOpData { B: data[25+2], A: data[25+3], }, + offset1: math.Float32frombits(bo.Uint32(data[29:])), } } @@ -395,7 +399,8 @@ type blitRadialGradientUniforms struct { _ [12]byte // Padding to a multiple of 16. } frag struct { - gradientUniforms + radialGradientUniforms + _ [12]byte // Padding to multiple of 16. } } @@ -426,6 +431,12 @@ type gradientUniforms struct { color2 f32color.RGBA } +type radialGradientUniforms struct { + color1 f32color.RGBA + color2 f32color.RGBA + offset1 float32 +} + type materialType uint8 const ( @@ -1025,6 +1036,7 @@ loop: op := decodeRadialGradientOp(encOp.Data) state.stop1 = op.stop1 state.stop2 = op.stop2 + state.offset1 = op.offset1 state.radiusy = op.radiusy state.color1 = op.color1 state.color2 = op.color2 @@ -1145,6 +1157,7 @@ func (d *drawState) materialFor(rect f32.Rectangle, off f32.Point, partTrans f32 m.color1 = f32color.LinearFromSRGB(d.color1) m.color2 = f32color.LinearFromSRGB(d.color2) + m.offset1 = d.offset1 m.opaque = m.color1.A == 1.0 && m.color2.A == 1.0 m.uvTrans = partTrans.Mul(gradientSpaceTransform(clip, off, d.stop1, d.stop2, d.radiusy)) @@ -1188,7 +1201,7 @@ func (r *renderer) drawZOps(cache *resourceCache, ops []imageOp) { } drc := img.clip scale, off := clipSpaceTransform(drc, r.blitter.viewport) - r.blitter.blit(img.z, m.material, m.color, m.color1, m.color2, scale, off, m.uvTrans) + r.blitter.blit(img.z, m.material, m.color, m.color1, m.color2, m.offset1, scale, off, m.uvTrans) } r.ctx.SetDepthTest(false) } @@ -1212,7 +1225,7 @@ func (r *renderer) drawOps(cache *resourceCache, ops []imageOp) { var fbo stencilFBO switch img.clipType { case clipTypeNone: - r.blitter.blit(img.z, m.material, m.color, m.color1, m.color2, scale, off, m.uvTrans) + r.blitter.blit(img.z, m.material, m.color, m.color1, m.color2, m.offset1, scale, off, m.uvTrans) continue case clipTypePath: fbo = r.pather.stenciler.cover(img.place.Idx) @@ -1228,13 +1241,13 @@ func (r *renderer) drawOps(cache *resourceCache, ops []imageOp) { Max: img.place.Pos.Add(drc.Size()), } coverScale, coverOff := texSpaceTransform(layout.FRect(uv), fbo.size) - r.pather.cover(img.z, m.material, m.color, m.color1, m.color2, scale, off, m.uvTrans, coverScale, coverOff) + r.pather.cover(img.z, m.material, m.color, m.color1, m.color2, m.offset1, scale, off, m.uvTrans, coverScale, coverOff) } r.ctx.DepthMask(true) r.ctx.SetDepthTest(false) } -func (b *blitter) blit(z float32, mat materialType, col f32color.RGBA, col1, col2 f32color.RGBA, scale, off f32.Point, uvTrans f32.Affine2D) { +func (b *blitter) blit(z float32, mat materialType, col f32color.RGBA, col1, col2 f32color.RGBA, col1off float32, scale, off f32.Point, uvTrans f32.Affine2D) { p := b.prog[mat] b.ctx.BindProgram(p.prog) var uniforms *blitUniforms @@ -1261,6 +1274,7 @@ func (b *blitter) blit(z float32, mat materialType, col f32color.RGBA, col1, col case materialRadialGradient: b.radialGradientUniforms.frag.color1 = col1 b.radialGradientUniforms.frag.color2 = col2 + b.radialGradientUniforms.frag.offset1 = col1off t1, t2, t3, t4, t5, t6 := uvTrans.Elems() b.radialGradientUniforms.vert.blitUniforms.uvTransformR1 = [4]float32{t1, t2, t3, 0} diff --git a/gpu/internal/convertshaders/main.go b/gpu/internal/convertshaders/main.go index 7f309402b..fb2472271 100644 --- a/gpu/internal/convertshaders/main.go +++ b/gpu/internal/convertshaders/main.go @@ -269,8 +269,8 @@ func (conv *Converter) Shader(shaderPath string) ([]driver.ShaderSources, error) Header: `layout(binding=0) uniform Gradient { vec4 _color1; vec4 _color2; };`, }, { - FetchColorExpr: `mix(_color1, _color2, clamp(length(vUV), 0.0, 1.0))`, - Header: `layout(binding=0) uniform Gradient { vec4 _color1; vec4 _color2; };`, + FetchColorExpr: `mix(_color1, _color2, clamp((length(vUV) - _offset1) / (1.0 - _offset1), 0.0, 1.0))`, + Header: `layout(binding=0) uniform Gradient { vec4 _color1; vec4 _color2; float _offset1; };`, }, { FetchColorExpr: `texture(tex, vUV)`, diff --git a/gpu/internal/rendertest/refs/TestRadialGradientOffset.png b/gpu/internal/rendertest/refs/TestRadialGradientOffset.png new file mode 100644 index 0000000000000000000000000000000000000000..f9a37d3264e6a9d839ae803dc7c78b84a4ace0f0 GIT binary patch literal 4673 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 D0SMG( literal 0 HcmV?d00001 diff --git a/gpu/internal/rendertest/render_test.go b/gpu/internal/rendertest/render_test.go index 668f51e1d..8124fccea 100644 --- a/gpu/internal/rendertest/render_test.go +++ b/gpu/internal/rendertest/render_test.go @@ -352,6 +352,19 @@ func TestRadialGradient(t *testing.T) { }, func(r result) {}) } +func TestRadialGradientOffset(t *testing.T) { + run(t, func(ops *op.Ops) { + paint.RadialGradientOp{ + Stop1: f32.Pt(64, 64), + Color1: blue, + Stop2: f32.Pt(64, 0), + Color2: black, + Offset1: 0.5, + }.Add(ops) + paint.PaintOp{}.Add(ops) + }, func(r result) {}) +} + func TestEllipseGradient(t *testing.T) { run(t, func(ops *op.Ops) { paint.RadialGradientOp{ diff --git a/gpu/path.go b/gpu/path.go index ce75cb00f..b14cc38fd 100644 --- a/gpu/path.go +++ b/gpu/path.go @@ -69,7 +69,8 @@ type coverRadialGradientUniforms struct { _ [12]byte // Padding to multiple of 16. } frag struct { - gradientUniforms + radialGradientUniforms + _ [12]byte // Padding to multiple of 16. } } @@ -399,11 +400,11 @@ func (s *stenciler) stencilPath(bounds image.Rectangle, offset f32.Point, uv ima } } -func (p *pather) cover(z float32, mat materialType, col f32color.RGBA, col1, col2 f32color.RGBA, scale, off f32.Point, uvTrans f32.Affine2D, coverScale, coverOff f32.Point) { - p.coverer.cover(z, mat, col, col1, col2, scale, off, uvTrans, coverScale, coverOff) +func (p *pather) cover(z float32, mat materialType, col f32color.RGBA, col1, col2 f32color.RGBA, col1off float32, scale, off f32.Point, uvTrans f32.Affine2D, coverScale, coverOff f32.Point) { + p.coverer.cover(z, mat, col, col1, col2, col1off, scale, off, uvTrans, coverScale, coverOff) } -func (c *coverer) cover(z float32, mat materialType, col f32color.RGBA, col1, col2 f32color.RGBA, scale, off f32.Point, uvTrans f32.Affine2D, coverScale, coverOff f32.Point) { +func (c *coverer) cover(z float32, mat materialType, col f32color.RGBA, col1, col2 f32color.RGBA, col1off float32, scale, off f32.Point, uvTrans f32.Affine2D, coverScale, coverOff f32.Point) { p := c.prog[mat] c.ctx.BindProgram(p.prog) var uniforms *coverUniforms @@ -424,6 +425,7 @@ func (c *coverer) cover(z float32, mat materialType, col f32color.RGBA, col1, co case materialRadialGradient: c.radialGradientUniforms.frag.color1 = col1 c.radialGradientUniforms.frag.color2 = col2 + c.radialGradientUniforms.frag.offset1 = col1off t1, t2, t3, t4, t5, t6 := uvTrans.Elems() c.radialGradientUniforms.vert.uvTransformR1 = [4]float32{t1, t2, t3, 0} diff --git a/gpu/shaders.go b/gpu/shaders.go index 1c4f16bab..8cf6e570f 100644 --- a/gpu/shaders.go +++ b/gpu/shaders.go @@ -44,14 +44,14 @@ var ( Name: "blit.frag", Uniforms: driver.UniformsReflection{ Blocks: []driver.UniformBlock{{Name: "Gradient", Binding: 0}}, - Locations: []driver.UniformLocation{{Name: "_12._color1", Type: 0x0, Size: 4, Offset: 0}, {Name: "_12._color2", Type: 0x0, Size: 4, Offset: 16}}, - Size: 32, + Locations: []driver.UniformLocation{{Name: "_12._color1", Type: 0x0, Size: 4, Offset: 0}, {Name: "_12._color2", Type: 0x0, Size: 4, Offset: 16}, {Name: "_12._offset1", Type: 0x0, Size: 1, Offset: 32}}, + Size: 36, }, - GLSL100ES: "precision mediump float;\nprecision highp int;\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nvarying vec2 vUV;\n\nvoid main()\n{\n gl_FragData[0] = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n}\n\n", - GLSL300ES: "#version 300 es\nprecision mediump float;\nprecision highp int;\n\nlayout(std140) uniform Gradient\n{\n vec4 _color1;\n vec4 _color2;\n} _12;\n\nlayout(location = 0) out vec4 fragColor;\nin vec2 vUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n}\n\n", - GLSL130: "#version 130\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nout vec4 fragColor;\nin vec2 vUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n}\n\n", - GLSL150: "#version 150\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nout vec4 fragColor;\nin vec2 vUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n}\n\n", - HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0x10, 0x3d, 0xc, 0x8f, 0x81, 0xf3, 0x6e, 0x92, 0x13, 0x1a, 0x49, 0x47, 0xa2, 0xfa, 0x6e, 0xd1, 0x1, 0x0, 0x0, 0x0, 0xb0, 0x3, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x4, 0x1, 0x0, 0x0, 0xe4, 0x1, 0x0, 0x0, 0x60, 0x2, 0x0, 0x0, 0x48, 0x3, 0x0, 0x0, 0x7c, 0x3, 0x0, 0x0, 0x41, 0x6f, 0x6e, 0x39, 0xc4, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x94, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x1, 0x0, 0x24, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x51, 0x0, 0x0, 0x5, 0x2, 0x0, 0xf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x3, 0xb0, 0x5a, 0x0, 0x0, 0x4, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0xe4, 0xb0, 0x0, 0x0, 0xe4, 0xb0, 0x2, 0x0, 0x0, 0xa0, 0x7, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0xff, 0x80, 0x6, 0x0, 0x0, 0x2, 0x0, 0x0, 0x11, 0x80, 0x0, 0x0, 0x0, 0x80, 0x1, 0x0, 0x0, 0x2, 0x1, 0x0, 0xf, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x2, 0x0, 0x0, 0x3, 0x1, 0x0, 0xf, 0x80, 0x1, 0x0, 0xe4, 0x81, 0x1, 0x0, 0xe4, 0xa0, 0x4, 0x0, 0x0, 0x4, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x80, 0x1, 0x0, 0xe4, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x8, 0xf, 0x80, 0x0, 0x0, 0xe4, 0x80, 0xff, 0xff, 0x0, 0x0, 0x53, 0x48, 0x44, 0x52, 0xd8, 0x0, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x36, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, 0x5, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x0, 0x0, 0x0, 0xa, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xa, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0xe0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0xb7, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x0, 0xab, 0xab, 0xab, 0x3c, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x90, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xac, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x0, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x32, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x31, 0x0, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab}, + GLSL100ES: "precision mediump float;\nprecision highp int;\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n float _offset1;\n};\n\nuniform Gradient _12;\n\nvarying vec2 vUV;\n\nvoid main()\n{\n gl_FragData[0] = mix(_12._color1, _12._color2, vec4(clamp((length(vUV) - _12._offset1) / (1.0 - _12._offset1), 0.0, 1.0)));\n}\n\n", + GLSL300ES: "#version 300 es\nprecision mediump float;\nprecision highp int;\n\nlayout(std140) uniform Gradient\n{\n vec4 _color1;\n vec4 _color2;\n float _offset1;\n} _12;\n\nlayout(location = 0) out vec4 fragColor;\nin vec2 vUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp((length(vUV) - _12._offset1) / (1.0 - _12._offset1), 0.0, 1.0)));\n}\n\n", + GLSL130: "#version 130\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n float _offset1;\n};\n\nuniform Gradient _12;\n\nout vec4 fragColor;\nin vec2 vUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp((length(vUV) - _12._offset1) / (1.0 - _12._offset1), 0.0, 1.0)));\n}\n\n", + GLSL150: "#version 150\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n float _offset1;\n};\n\nuniform Gradient _12;\n\nout vec4 fragColor;\nin vec2 vUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp((length(vUV) - _12._offset1) / (1.0 - _12._offset1), 0.0, 1.0)));\n}\n\n", + HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0x9c, 0x61, 0x7c, 0xaa, 0x5d, 0x88, 0xba, 0x34, 0x7f, 0x82, 0x36, 0x27, 0x76, 0xc7, 0xe8, 0xf2, 0x1, 0x0, 0x0, 0x0, 0x64, 0x4, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x3c, 0x1, 0x0, 0x0, 0x64, 0x2, 0x0, 0x0, 0xe0, 0x2, 0x0, 0x0, 0xfc, 0x3, 0x0, 0x0, 0x30, 0x4, 0x0, 0x0, 0x41, 0x6f, 0x6e, 0x39, 0xfc, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xcc, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x1, 0x0, 0x24, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x24, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x51, 0x0, 0x0, 0x5, 0x3, 0x0, 0xf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0x3, 0xb0, 0x5a, 0x0, 0x0, 0x4, 0x0, 0x0, 0x8, 0x80, 0x0, 0x0, 0xe4, 0xb0, 0x0, 0x0, 0xe4, 0xb0, 0x3, 0x0, 0x0, 0xa0, 0x7, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0xff, 0x80, 0x6, 0x0, 0x0, 0x2, 0x0, 0x0, 0x1, 0x80, 0x0, 0x0, 0x0, 0x80, 0x1, 0x0, 0x0, 0x2, 0x0, 0x0, 0x2, 0x80, 0x3, 0x0, 0x55, 0xa0, 0x2, 0x0, 0x0, 0x3, 0x0, 0x0, 0x3, 0x80, 0x0, 0x0, 0xe4, 0x80, 0x2, 0x0, 0x0, 0xa1, 0x6, 0x0, 0x0, 0x2, 0x0, 0x0, 0x2, 0x80, 0x0, 0x0, 0x55, 0x80, 0x5, 0x0, 0x0, 0x3, 0x0, 0x0, 0x11, 0x80, 0x0, 0x0, 0x55, 0x80, 0x0, 0x0, 0x0, 0x80, 0x1, 0x0, 0x0, 0x2, 0x1, 0x0, 0xf, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x2, 0x0, 0x0, 0x3, 0x1, 0x0, 0xf, 0x80, 0x1, 0x0, 0xe4, 0x81, 0x1, 0x0, 0xe4, 0xa0, 0x4, 0x0, 0x0, 0x4, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x80, 0x1, 0x0, 0xe4, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x1, 0x0, 0x0, 0x2, 0x0, 0x8, 0xf, 0x80, 0x0, 0x0, 0xe4, 0x80, 0xff, 0xff, 0x0, 0x0, 0x53, 0x48, 0x44, 0x52, 0x20, 0x1, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, 0x5, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x80, 0x20, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x22, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0xa, 0x80, 0x20, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xa, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0x14, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x48, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0xec, 0x0, 0x0, 0x0, 0x3c, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x0, 0xab, 0xab, 0xab, 0x3c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x60, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa8, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc4, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xcf, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xdc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x0, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x32, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x31, 0x0, 0xab, 0x0, 0x0, 0x3, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x31, 0x0, 0x49, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab}, }, { Name: "blit.frag", @@ -130,15 +130,15 @@ var ( Name: "cover.frag", Uniforms: driver.UniformsReflection{ Blocks: []driver.UniformBlock{{Name: "Gradient", Binding: 0}}, - Locations: []driver.UniformLocation{{Name: "_12._color1", Type: 0x0, Size: 4, Offset: 0}, {Name: "_12._color2", Type: 0x0, Size: 4, Offset: 16}}, - Size: 32, + Locations: []driver.UniformLocation{{Name: "_12._color1", Type: 0x0, Size: 4, Offset: 0}, {Name: "_12._color2", Type: 0x0, Size: 4, Offset: 16}, {Name: "_12._offset1", Type: 0x0, Size: 1, Offset: 32}}, + Size: 36, }, Textures: []driver.TextureBinding{{Name: "cover", Binding: 1}}, - GLSL100ES: "precision mediump float;\nprecision highp int;\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nuniform mediump sampler2D cover;\n\nvarying vec2 vUV;\nvarying highp vec2 vCoverUV;\n\nvoid main()\n{\n gl_FragData[0] = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n float cover_1 = min(abs(texture2D(cover, vCoverUV).x), 1.0);\n gl_FragData[0] *= cover_1;\n}\n\n", - GLSL300ES: "#version 300 es\nprecision mediump float;\nprecision highp int;\n\nlayout(std140) uniform Gradient\n{\n vec4 _color1;\n vec4 _color2;\n} _12;\n\nuniform mediump sampler2D cover;\n\nlayout(location = 0) out vec4 fragColor;\nin vec2 vUV;\nin highp vec2 vCoverUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);\n fragColor *= cover_1;\n}\n\n", - GLSL130: "#version 130\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nuniform sampler2D cover;\n\nout vec4 fragColor;\nin vec2 vUV;\nin vec2 vCoverUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);\n fragColor *= cover_1;\n}\n\n", - GLSL150: "#version 150\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n};\n\nuniform Gradient _12;\n\nuniform sampler2D cover;\n\nout vec4 fragColor;\nin vec2 vUV;\nin vec2 vCoverUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp(length(vUV), 0.0, 1.0)));\n float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);\n fragColor *= cover_1;\n}\n\n", - HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0x79, 0x65, 0x19, 0xf3, 0xd2, 0xf1, 0xc0, 0x15, 0x8b, 0x62, 0x2d, 0x57, 0x71, 0xb8, 0x5, 0xe9, 0x1, 0x0, 0x0, 0x0, 0xe0, 0x4, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x40, 0x1, 0x0, 0x0, 0xa8, 0x2, 0x0, 0x0, 0x24, 0x3, 0x0, 0x0, 0x60, 0x4, 0x0, 0x0, 0xac, 0x4, 0x0, 0x0, 0x41, 0x6f, 0x6e, 0x39, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0xcc, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x1, 0x0, 0x28, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x34, 0x0, 0x1, 0x0, 0x24, 0x0, 0x0, 0x0, 0x34, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x51, 0x0, 0x0, 0x5, 0x2, 0x0, 0xf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0xf, 0xb0, 0x1f, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x90, 0x0, 0x8, 0xf, 0xa0, 0x42, 0x0, 0x0, 0x3, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0xe4, 0xb0, 0x0, 0x8, 0xe4, 0xa0, 0x5a, 0x0, 0x0, 0x4, 0x0, 0x0, 0x2, 0x80, 0x0, 0x0, 0x1b, 0xb0, 0x0, 0x0, 0x1b, 0xb0, 0x2, 0x0, 0x0, 0xa0, 0x7, 0x0, 0x0, 0x2, 0x0, 0x0, 0x2, 0x80, 0x0, 0x0, 0x55, 0x80, 0x6, 0x0, 0x0, 0x2, 0x0, 0x0, 0x12, 0x80, 0x0, 0x0, 0x55, 0x80, 0x1, 0x0, 0x0, 0x2, 0x1, 0x0, 0xf, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x2, 0x0, 0x0, 0x3, 0x1, 0x0, 0xf, 0x80, 0x1, 0x0, 0xe4, 0x81, 0x1, 0x0, 0xe4, 0xa0, 0x4, 0x0, 0x0, 0x4, 0x1, 0x0, 0xf, 0x80, 0x0, 0x0, 0x55, 0x80, 0x1, 0x0, 0xe4, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x23, 0x0, 0x0, 0x2, 0x0, 0x0, 0x11, 0x80, 0x0, 0x0, 0x0, 0x80, 0x5, 0x0, 0x0, 0x3, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x80, 0x1, 0x0, 0xe4, 0x80, 0x1, 0x0, 0x0, 0x2, 0x0, 0x8, 0xf, 0x80, 0x0, 0x0, 0xe4, 0x80, 0xff, 0xff, 0x0, 0x0, 0x53, 0x48, 0x44, 0x52, 0x60, 0x1, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x58, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x3, 0x0, 0x60, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x58, 0x18, 0x0, 0x4, 0x0, 0x70, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x55, 0x55, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0xc2, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x1a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x1a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, 0x5, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x0, 0x0, 0x0, 0xa, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xa, 0xf2, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x9, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x7e, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x60, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x8, 0x12, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x80, 0x81, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x38, 0x0, 0x0, 0x7, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x7, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0x34, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0xb, 0x1, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x0, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x0, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x0, 0xab, 0xab, 0x91, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xf0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x0, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x32, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x31, 0x0, 0xab, 0x49, 0x53, 0x47, 0x4e, 0x44, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xc, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab}, + GLSL100ES: "precision mediump float;\nprecision highp int;\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n float _offset1;\n};\n\nuniform Gradient _12;\n\nuniform mediump sampler2D cover;\n\nvarying vec2 vUV;\nvarying highp vec2 vCoverUV;\n\nvoid main()\n{\n gl_FragData[0] = mix(_12._color1, _12._color2, vec4(clamp((length(vUV) - _12._offset1) / (1.0 - _12._offset1), 0.0, 1.0)));\n float cover_1 = min(abs(texture2D(cover, vCoverUV).x), 1.0);\n gl_FragData[0] *= cover_1;\n}\n\n", + GLSL300ES: "#version 300 es\nprecision mediump float;\nprecision highp int;\n\nlayout(std140) uniform Gradient\n{\n vec4 _color1;\n vec4 _color2;\n float _offset1;\n} _12;\n\nuniform mediump sampler2D cover;\n\nlayout(location = 0) out vec4 fragColor;\nin vec2 vUV;\nin highp vec2 vCoverUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp((length(vUV) - _12._offset1) / (1.0 - _12._offset1), 0.0, 1.0)));\n float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);\n fragColor *= cover_1;\n}\n\n", + GLSL130: "#version 130\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n float _offset1;\n};\n\nuniform Gradient _12;\n\nuniform sampler2D cover;\n\nout vec4 fragColor;\nin vec2 vUV;\nin vec2 vCoverUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp((length(vUV) - _12._offset1) / (1.0 - _12._offset1), 0.0, 1.0)));\n float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);\n fragColor *= cover_1;\n}\n\n", + GLSL150: "#version 150\n\nstruct Gradient\n{\n vec4 _color1;\n vec4 _color2;\n float _offset1;\n};\n\nuniform Gradient _12;\n\nuniform sampler2D cover;\n\nout vec4 fragColor;\nin vec2 vUV;\nin vec2 vCoverUV;\n\nvoid main()\n{\n fragColor = mix(_12._color1, _12._color2, vec4(clamp((length(vUV) - _12._offset1) / (1.0 - _12._offset1), 0.0, 1.0)));\n float cover_1 = min(abs(texture(cover, vCoverUV).x), 1.0);\n fragColor *= cover_1;\n}\n\n", + HLSL: []byte{0x44, 0x58, 0x42, 0x43, 0x88, 0x20, 0xd, 0xe7, 0x7f, 0x81, 0xbe, 0xdf, 0x42, 0x32, 0x79, 0x2d, 0x4a, 0xd6, 0x93, 0x2e, 0x1, 0x0, 0x0, 0x0, 0xa4, 0x5, 0x0, 0x0, 0x6, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x88, 0x1, 0x0, 0x0, 0x38, 0x3, 0x0, 0x0, 0xb4, 0x3, 0x0, 0x0, 0x24, 0x5, 0x0, 0x0, 0x70, 0x5, 0x0, 0x0, 0x41, 0x6f, 0x6e, 0x39, 0x48, 0x1, 0x0, 0x0, 0x48, 0x1, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x14, 0x1, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x1, 0x0, 0x28, 0x0, 0x0, 0x0, 0x34, 0x0, 0x0, 0x0, 0x34, 0x0, 0x1, 0x0, 0x24, 0x0, 0x0, 0x0, 0x34, 0x0, 0x1, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0xff, 0xff, 0x51, 0x0, 0x0, 0x5, 0x3, 0x0, 0xf, 0xa0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1f, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x80, 0x0, 0x0, 0xf, 0xb0, 0x1f, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x90, 0x0, 0x8, 0xf, 0xa0, 0x42, 0x0, 0x0, 0x3, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0xe4, 0xb0, 0x0, 0x8, 0xe4, 0xa0, 0x5a, 0x0, 0x0, 0x4, 0x0, 0x0, 0x2, 0x80, 0x0, 0x0, 0x1b, 0xb0, 0x0, 0x0, 0x1b, 0xb0, 0x3, 0x0, 0x0, 0xa0, 0x7, 0x0, 0x0, 0x2, 0x0, 0x0, 0x2, 0x80, 0x0, 0x0, 0x55, 0x80, 0x6, 0x0, 0x0, 0x2, 0x0, 0x0, 0x2, 0x80, 0x0, 0x0, 0x55, 0x80, 0x2, 0x0, 0x0, 0x3, 0x0, 0x0, 0x2, 0x80, 0x0, 0x0, 0x55, 0x80, 0x2, 0x0, 0x0, 0xa1, 0x1, 0x0, 0x0, 0x2, 0x1, 0x0, 0x8, 0x80, 0x3, 0x0, 0x55, 0xa0, 0x2, 0x0, 0x0, 0x3, 0x0, 0x0, 0x4, 0x80, 0x1, 0x0, 0xff, 0x80, 0x2, 0x0, 0x0, 0xa1, 0x6, 0x0, 0x0, 0x2, 0x0, 0x0, 0x4, 0x80, 0x0, 0x0, 0xaa, 0x80, 0x5, 0x0, 0x0, 0x3, 0x0, 0x0, 0x12, 0x80, 0x0, 0x0, 0xaa, 0x80, 0x0, 0x0, 0x55, 0x80, 0x1, 0x0, 0x0, 0x2, 0x1, 0x0, 0xf, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x2, 0x0, 0x0, 0x3, 0x1, 0x0, 0xf, 0x80, 0x1, 0x0, 0xe4, 0x81, 0x1, 0x0, 0xe4, 0xa0, 0x4, 0x0, 0x0, 0x4, 0x1, 0x0, 0xf, 0x80, 0x0, 0x0, 0x55, 0x80, 0x1, 0x0, 0xe4, 0x80, 0x0, 0x0, 0xe4, 0xa0, 0x23, 0x0, 0x0, 0x2, 0x0, 0x0, 0x11, 0x80, 0x0, 0x0, 0x0, 0x80, 0x5, 0x0, 0x0, 0x3, 0x0, 0x0, 0xf, 0x80, 0x0, 0x0, 0x0, 0x80, 0x1, 0x0, 0xe4, 0x80, 0x1, 0x0, 0x0, 0x2, 0x0, 0x8, 0xf, 0x80, 0x0, 0x0, 0xe4, 0x80, 0xff, 0xff, 0x0, 0x0, 0x53, 0x48, 0x44, 0x52, 0xa8, 0x1, 0x0, 0x0, 0x40, 0x0, 0x0, 0x0, 0x6a, 0x0, 0x0, 0x0, 0x59, 0x0, 0x0, 0x4, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x5a, 0x0, 0x0, 0x3, 0x0, 0x60, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x58, 0x18, 0x0, 0x4, 0x0, 0x70, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x55, 0x55, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0x32, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x62, 0x10, 0x0, 0x3, 0xc2, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x65, 0x0, 0x0, 0x3, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x68, 0x0, 0x0, 0x2, 0x2, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x1a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xe6, 0x1a, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4b, 0x0, 0x0, 0x5, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x80, 0x20, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x9, 0x22, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0xa, 0x80, 0x20, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0xe, 0x20, 0x0, 0x7, 0x12, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1a, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xa, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x80, 0x41, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x32, 0x0, 0x0, 0xa, 0xf2, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x8e, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x45, 0x0, 0x0, 0x9, 0xf2, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x46, 0x10, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0x7e, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x60, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x33, 0x0, 0x0, 0x8, 0x12, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0xa, 0x0, 0x10, 0x80, 0x81, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x40, 0x0, 0x0, 0x0, 0x0, 0x80, 0x3f, 0x38, 0x0, 0x0, 0x7, 0xf2, 0x20, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x46, 0xe, 0x10, 0x0, 0x0, 0x0, 0x0, 0x0, 0x6, 0x0, 0x10, 0x0, 0x1, 0x0, 0x0, 0x0, 0x3e, 0x0, 0x0, 0x1, 0x53, 0x54, 0x41, 0x54, 0x74, 0x0, 0x0, 0x0, 0xb, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x9, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x52, 0x44, 0x45, 0x46, 0x68, 0x1, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x9c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x1c, 0x0, 0x0, 0x0, 0x0, 0x4, 0xff, 0xff, 0x0, 0x1, 0x0, 0x0, 0x40, 0x1, 0x0, 0x0, 0x7c, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8b, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x5, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0xff, 0xff, 0xff, 0xff, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0xd, 0x0, 0x0, 0x0, 0x91, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x72, 0x0, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x0, 0x47, 0x72, 0x61, 0x64, 0x69, 0x65, 0x6e, 0x74, 0x0, 0xab, 0xab, 0x91, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0xb4, 0x0, 0x0, 0x0, 0x30, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xfc, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x18, 0x1, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x10, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x23, 0x1, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x4, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x30, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x31, 0x0, 0xab, 0x1, 0x0, 0x3, 0x0, 0x1, 0x0, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x63, 0x6f, 0x6c, 0x6f, 0x72, 0x32, 0x0, 0x5f, 0x31, 0x32, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x31, 0x0, 0xab, 0x0, 0x0, 0x3, 0x0, 0x1, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x73, 0x6f, 0x66, 0x74, 0x20, 0x28, 0x52, 0x29, 0x20, 0x48, 0x4c, 0x53, 0x4c, 0x20, 0x53, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x43, 0x6f, 0x6d, 0x70, 0x69, 0x6c, 0x65, 0x72, 0x20, 0x31, 0x30, 0x2e, 0x31, 0x0, 0x49, 0x53, 0x47, 0x4e, 0x44, 0x0, 0x0, 0x0, 0x2, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x3, 0x0, 0x0, 0x38, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xc, 0xc, 0x0, 0x0, 0x54, 0x45, 0x58, 0x43, 0x4f, 0x4f, 0x52, 0x44, 0x0, 0xab, 0xab, 0xab, 0x4f, 0x53, 0x47, 0x4e, 0x2c, 0x0, 0x0, 0x0, 0x1, 0x0, 0x0, 0x0, 0x8, 0x0, 0x0, 0x0, 0x20, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x3, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xf, 0x0, 0x0, 0x0, 0x53, 0x56, 0x5f, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x0, 0xab, 0xab}, }, { Name: "cover.frag", diff --git a/internal/opconst/ops.go b/internal/opconst/ops.go index 16f6a3b25..23bd4766b 100644 --- a/internal/opconst/ops.go +++ b/internal/opconst/ops.go @@ -47,7 +47,7 @@ const ( TypePaintLen = 1 TypeColorLen = 1 + 4 TypeLinearGradientLen = 1 + 8*2 + 4*2 - TypeRadialGradientLen = 1 + 8*2 + 4 + 4*2 + TypeRadialGradientLen = 1 + 8*2 + 4 + 4*2 + 4 TypeAreaLen = 1 + 1 + 4*4 TypePointerInputLen = 1 + 1 + 1 TypePassLen = 1 + 1 diff --git a/op/paint/paint.go b/op/paint/paint.go index 4a900f1bb..abc33fb00 100644 --- a/op/paint/paint.go +++ b/op/paint/paint.go @@ -55,6 +55,8 @@ type RadialGradientOp struct { Stop2 f32.Point Color2 color.NRGBA + // Offset1 defines ratio to offset Stop1 color. + Offset1 float32 // RadiusY defines Y axis for the ellipse. // RadiusY = 0 draws a circle. RadiusY float32 @@ -176,6 +178,8 @@ func (c RadialGradientOp) Add(o *op.Ops) { data[25+1] = c.Color2.G data[25+2] = c.Color2.B data[25+3] = c.Color2.A + + bo.PutUint32(data[29:], math.Float32bits(c.Offset1)) } func (d PaintOp) Add(o *op.Ops) {