|
|
|
@ -1,4 +1,5 @@ |
|
|
|
using System; |
|
|
|
using System.Diagnostics; |
|
|
|
using System.IO; |
|
|
|
using System.Linq; |
|
|
|
using System.Numerics; |
|
|
|
@ -6,6 +7,7 @@ using System.Runtime.InteropServices; |
|
|
|
using Avalonia; |
|
|
|
using Avalonia.Controls; |
|
|
|
using Avalonia.OpenGL; |
|
|
|
using Avalonia.Threading; |
|
|
|
using static Avalonia.OpenGL.GlConsts; |
|
|
|
// ReSharper disable StringLiteralTypo
|
|
|
|
|
|
|
|
@ -52,9 +54,22 @@ namespace ControlCatalog.Pages |
|
|
|
set => SetAndRaise(RollProperty, ref _roll, value); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private float _disco; |
|
|
|
|
|
|
|
public static readonly DirectProperty<OpenGlPageControl, float> DiscoProperty = |
|
|
|
AvaloniaProperty.RegisterDirect<OpenGlPageControl, float>("Disco", o => o.Disco, (o, v) => o.Disco = v); |
|
|
|
|
|
|
|
public float Disco |
|
|
|
{ |
|
|
|
get => _disco; |
|
|
|
set => SetAndRaise(DiscoProperty, ref _disco, value); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static OpenGlPageControl() |
|
|
|
{ |
|
|
|
AffectsRender<OpenGlPageControl>(YawProperty, PitchProperty, RollProperty); |
|
|
|
AffectsRender<OpenGlPageControl>(YawProperty, PitchProperty, RollProperty, DiscoProperty); |
|
|
|
} |
|
|
|
|
|
|
|
private int _vertexShader; |
|
|
|
@ -80,9 +95,20 @@ namespace ControlCatalog.Pages |
|
|
|
varying vec3 FragPos; |
|
|
|
varying vec3 VecPos; |
|
|
|
varying vec3 Normal; |
|
|
|
uniform float uTime; |
|
|
|
uniform float uDisco; |
|
|
|
void main() |
|
|
|
{ |
|
|
|
gl_Position = uProjection * uView * uModel * vec4(aPos, 1.0); |
|
|
|
float discoScale = sin(uTime*10)/10; |
|
|
|
float distortionX = 1 + uDisco * cos(uTime*20)/10; |
|
|
|
|
|
|
|
float scale = 1 + uDisco * discoScale; |
|
|
|
|
|
|
|
vec3 scaledPos = aPos; |
|
|
|
scaledPos.x = scaledPos.x * distortionX; |
|
|
|
|
|
|
|
scaledPos *= scale; |
|
|
|
gl_Position = uProjection * uView * uModel * vec4(scaledPos, 1.0); |
|
|
|
FragPos = vec3(uModel * vec4(aPos, 1.0)); |
|
|
|
VecPos = aPos; |
|
|
|
Normal = normalize(vec3(uModel * vec4(aNormal, 1.0))); |
|
|
|
@ -95,12 +121,22 @@ namespace ControlCatalog.Pages |
|
|
|
varying vec3 Normal; |
|
|
|
uniform float uMaxY; |
|
|
|
uniform float uMinY; |
|
|
|
uniform float uTime; |
|
|
|
uniform float uDisco; |
|
|
|
|
|
|
|
void main() |
|
|
|
{ |
|
|
|
float y = (VecPos.y - uMinY) / (uMaxY - uMinY); |
|
|
|
vec3 objectColor = vec3((1.0 - y), 0.40 + y / 4.0, y * 0.75+0.25); |
|
|
|
//vec3 objectColor = normalize(FragPos);
|
|
|
|
float c = cos(atan(VecPos.x, VecPos.z)*20.0+uTime*40.0+y*50); |
|
|
|
float s = sin(-atan(VecPos.z, VecPos.x)*20.0-uTime*20.0-y*30); |
|
|
|
|
|
|
|
vec3 discoColor = vec3( |
|
|
|
0.5 + abs(0.5-y)*cos(uTime*10), |
|
|
|
0.25 + (smoothstep(0.3, 0.8, y)*(0.5-c/4)), |
|
|
|
0.25 + abs((smoothstep(0.1, 0.4, y)*(0.5-s/4)))); |
|
|
|
|
|
|
|
vec3 objectColor = vec3((1.0 - y), 0.40 + y / 4.0, y * 0.75+0.25); |
|
|
|
objectColor = objectColor * (1-uDisco) + discoColor * uDisco; |
|
|
|
|
|
|
|
float ambientStrength = 0.3; |
|
|
|
vec3 lightColor = vec3(1.0, 1.0, 1.0); |
|
|
|
@ -251,6 +287,7 @@ namespace ControlCatalog.Pages |
|
|
|
GL.DeleteShader(_vertexShader); |
|
|
|
} |
|
|
|
|
|
|
|
static Stopwatch St = Stopwatch.StartNew(); |
|
|
|
protected override unsafe void OnOpenGlRender(GlInterface gl, int fb) |
|
|
|
{ |
|
|
|
gl.ClearColor(0, 0, 0, 0); |
|
|
|
@ -275,14 +312,20 @@ namespace ControlCatalog.Pages |
|
|
|
var projectionLoc = GL.GetUniformLocationString(_shaderProgram, "uProjection"); |
|
|
|
var maxYLoc = GL.GetUniformLocationString(_shaderProgram, "uMaxY"); |
|
|
|
var minYLoc = GL.GetUniformLocationString(_shaderProgram, "uMinY"); |
|
|
|
var timeLoc = GL.GetUniformLocationString(_shaderProgram, "uTime"); |
|
|
|
var discoLoc = GL.GetUniformLocationString(_shaderProgram, "uDisco"); |
|
|
|
GL.UniformMatrix4fv(modelLoc, 1, false, &model); |
|
|
|
GL.UniformMatrix4fv(viewLoc, 1, false, &view); |
|
|
|
GL.UniformMatrix4fv(projectionLoc, 1, false, &projection); |
|
|
|
GL.Uniform1f(maxYLoc, _maxY); |
|
|
|
GL.Uniform1f(minYLoc, _minY); |
|
|
|
GL.Uniform1f(timeLoc, (float)St.Elapsed.TotalSeconds); |
|
|
|
GL.Uniform1f(discoLoc, _disco); |
|
|
|
GL.DrawElements(GL_TRIANGLES, _indices.Length, GL_UNSIGNED_SHORT, IntPtr.Zero); |
|
|
|
|
|
|
|
CheckError(GL); |
|
|
|
if (_disco > 0.01) |
|
|
|
Dispatcher.UIThread.Post(InvalidateVisual, DispatcherPriority.Background); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|