diff --git a/src/main.cpp b/src/main.cpp index 208b136..0dd5721 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -127,6 +127,42 @@ int __cdecl main(int argc, char* argv[]) static float fft_output[FFT_SIZE / 2]; // Magnitudes static float fft_uniform[FFT_SIZE / 4]; + // main note effect + boolean beenPlaying = false; + const int SHAPES_SIZE = 15; + float shapeIncrement = 0.02f; + + /** + * Definition of shape with 3 parameters in a vec3 + * + * h position, v position, length + * + */ + float vec3ShapeArray[5][3] = { + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f } + }; + + float test[3] = { 0.0f, 0.1f, 0.0f }; // test float of one shape + + int currentShape = 0; // mark location which shape we are currently building + + boolean isPlaying = false; + + float lastPlayPos = 0; + float lastNote = 0.0f; + + /*GLfloat shapes[5][3] = { + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f }, + { 0.0f, 0.0f, 0.0f } + };*/ + do { direct_sound_buffer->GetCurrentPosition((DWORD*)&playCursor, NULL); @@ -202,6 +238,68 @@ int __cdecl main(int argc, char* argv[]) syncs[i + 1] = syncBuf[(playCursor / (2 * sizeof(SUsample)) >> 8) * SU_NUMSYNCS + i]; } + ////////////////////////////////////////////////////// + // Shape builder + ////////////////////////////////////////////////////// + + // if sound is playing, start a shape, if shape is already started - add length + // if sound has stopped, end shape + // if shape is finished, move shape forward + + float captureSync = syncs[5]; + + if (captureSync >= 0.001f) { + isPlaying = true; + } + + if (isPlaying) { + vec3ShapeArray[currentShape][1] = captureSync; + vec3ShapeArray[currentShape][2] = vec3ShapeArray[currentShape][2] + shapeIncrement; + + test[0] = captureSync; // y position + test[1] = test[1] + shapeIncrement; // x position + test[2] = 0.3f; // length + } + + + // when note changes -- reset + if (lastNote != captureSync) { + test[1] = 0.1f; + test[2] = 0.0f; + lastNote = captureSync; + } + + // shape mover, if the shape isnt the current one - move it + for (int i = 0; i < SHAPES_SIZE; ++i) { + if (i != currentShape) { + vec3ShapeArray[i][0] = vec3ShapeArray[i][0] + shapeIncrement; + } + } + + beenPlaying = isPlaying; + + // go through the array and start from the first when all shapes have been used + if (beenPlaying) { + if (currentShape <= SHAPES_SIZE) { + ++currentShape; + } + else { + currentShape = 0; + } + } + + float flatShapes[15] = { + vec3ShapeArray[0][0], vec3ShapeArray[0][1], vec3ShapeArray[0][2], + vec3ShapeArray[1][0], vec3ShapeArray[1][1], vec3ShapeArray[1][2], + vec3ShapeArray[2][0], vec3ShapeArray[2][1], vec3ShapeArray[2][2], + vec3ShapeArray[3][0], vec3ShapeArray[3][1], vec3ShapeArray[3][2], + vec3ShapeArray[4][0], vec3ShapeArray[4][1], vec3ShapeArray[4][2] + }; + + PFNGLUNIFORM3FVPROC glUniform3fvProc = ((PFNGLUNIFORM3FVPROC)wglGetProcAddress("glUniform3fv")); + glUniform3fvProc(10, 3, flatShapes); // array of shapes + glUniform3fvProc(40, 1, test); // test shape + PFNGLUNIFORM1FVPROC glUniform1fvProc = ((PFNGLUNIFORM1FVPROC)wglGetProcAddress("glUniform1fv")); glUniform1fvProc(0, SU_NUMSYNCS + 1, syncs); glUniform1fvProc(8, FFT_SIZE / 4, fft_uniform); diff --git a/src/shaders/fragment.frag b/src/shaders/fragment.frag index 78359b1..cea8a49 100644 --- a/src/shaders/fragment.frag +++ b/src/shaders/fragment.frag @@ -6,6 +6,8 @@ const float TAU = (2. * PI); const float PHI = sqrt(5.) * 0.5 + 0.5; layout(location = 0) uniform float syncs[7]; layout(location = 8) uniform float fft_output[512]; // FFT_SIZE / 4 +layout(location = 600) uniform vec3 shapes[15]; // shapes - x = horizontal position, y = vertical position, z = length +layout(location = 700) uniform vec3 test; // shapes test float u_time = syncs[0]; vec2 getUV() { @@ -41,6 +43,10 @@ float getScaledFFT(int index, float scale, float offset) { return log(1.0 + raw * scale) + offset; } +float sdSphere(vec3 p, float r){ + return length(p) -r; +} + // Modify your mapScene function vec2 mapScene(in vec3 p) { float mat = 0.; @@ -54,7 +60,7 @@ vec2 mapScene(in vec3 p) { // Hexagonal grid float hexGap = 0.2; - + /* for(float j = 0.; j < 16.; j++) { vec3 po = p; po += vec3((1.6 + hexGap) * 8, -5., -(1.88 + hexGap) * 10); @@ -85,6 +91,14 @@ vec2 mapScene(in vec3 p) { } } } + */ + + // main note effect shapes + a = sdSphere(vec3(p.x + test.y, p.y + test.x, p.z), test.z + 2.); + d = min(d, a); + if (d == a) { + mat = 1.; + } return vec2(d, mat); } diff --git a/src/shaders/fragment.inl b/src/shaders/fragment.inl index bcae441..d3448bc 100644 --- a/src/shaders/fragment.inl +++ b/src/shaders/fragment.inl @@ -1,152 +1,132 @@ // Generated with Shader Minifier 1.5.1 (https://github.com/laurentlb/Shader_Minifier/) #ifndef FRAGMENT_INL_ # define FRAGMENT_INL_ -# define VAR_fft_output "n" -# define VAR_o "f" +# define VAR_fft_output "f" +# define VAR_o "i" +# define VAR_shapes "C" # define VAR_syncs "m" +# define VAR_test "k" const char *fragment_frag = "#version 460\n" "precision mediump float;" - "out vec4 f;" - "const float i=2.*acos(-1.),v=sqrt(5.)*.5+.5;" + "out vec4 i;" + "const float n=2.*acos(-1.),v=sqrt(5.)*.5+.5;" "layout(location=0)uniform float m[7];" - "layout(location=8)uniform float n[512];" - "float c=m[0];" - "float t(vec3 v,vec2 i)" - "{" - "v=abs(v);" - "return max(v.y-i.y,max(v.x*sqrt(3.)*.5+v.z*.5,v.z)-i.x);" - "}" - "float t(int v)" - "{" - "v=clamp(v,0,511);" - "float i=n[v];" - "return log(1.+i*15.);" - "}" + "layout(location=8)uniform float f[512];" + "layout(location=600)uniform vec3 C[15];" + "layout(location=700)uniform vec3 k;" + "float l=m[0];" "vec2 t(vec3 v)" "{" - "float i=0.,f=1e9,m=0.;" - "vec2 n=vec2(7);" - "for(float r=0.;r<16.;r++)" - "{" - "vec3 c=v+vec3(1.8*8,-5,-2.08*10)+vec3(0,0,2.08*r);" - "for(float v=0.;v<16.;v++)" - "{" - "c=mod(v,2.)==0.?" - "c-vec3(1.8,0,1):" - "c+vec3(-1.8,0,1);" - "int y=int(length(vec2(v,r)-n.xy));" - "m=t(c,vec2(.86,1.+t(y)*2.));" - "f=min(f,m);" - "if(f==m)" - "i=1.;" - "}" - "}" - "return vec2(f,i);" + "float n=0.,i=1e9,m=length(vec3(v.x+k.y,v.y+k.x,v.z))-k.z-2.;" + "i=min(i,m);" + "if(i==m)" + "n=1.;" + "return vec2(i,n);" "}" - "vec3 t(vec3 v,vec3 i,inout vec3 f)" + "vec3 t(vec3 v,vec3 i,inout vec3 n)" "{" - "float r=0.,m=0.,y=0.;" - "for(int c=0;c<30;c++)" + "float f=0.,r=0.,m=0.;" + "for(int e=0;e<30;e++)" "{" - "f=v+i*r;" - "vec2 n=t(f);" - "r+=n.x;" - "m=n.y;" - "if(r>1e2)" + "n=v+i*f;" + "vec2 l=t(n);" + "f+=l.x;" + "r=l.y;" + "if(f>1e2)" "break;" - "if(n.x<.001*r)" + "if(l.x<.001*f)" "{" - "y=1.;" + "m=1.;" "break;" "}" "}" - "if(r>1e2)" - "r=0.;" - "return vec3(r,m,y);" + "if(f>1e2)" + "f=0.;" + "return vec3(f,r,m);" "}" - "float t(vec3 v,vec3 i,float y)" + "float t(vec3 v,vec3 f,float n)" "{" - "float f=1.,r=.02;" - "for(int c=0;c<6;c++)" + "float i=1.,m=.02;" + "for(int e=0;e<6;e++)" "{" - "if(r>y)" + "if(m>n)" "break;" - "float m=t(v+r*i).x;" - "f=min(f,m/(4.*r));" - "r+=clamp(m,.1,.8);" - "if(f<-1.)" + "float l=t(v+m*f).x;" + "i=min(i,l/(4.*m));" + "m+=clamp(l,.1,.8);" + "if(i<-1.)" "break;" "}" - "f=max(f,-1.);" - "return.25*(1.+f)*(1.+f)*(2.-f);" + "i=max(i,-1.);" + "return.25*(1.+i)*(1.+i)*(2.-i);" "}" "vec3 e(vec3 v)" "{" "vec2 i=vec2(.01,0);" "return normalize(vec3(t(v+i.xyy).x-t(v-i.xyy).x,t(v+i.yxy).x-t(v-i.yxy).x,t(v+i.yyx).x-t(v-i.yyx).x));" "}" - "vec3 e(vec3 v,vec3 i,vec3 f,vec3 r,vec3 c,float m)" + "vec3 e(vec3 v,vec3 i,vec3 l,vec3 f,vec3 m,float n)" "{" - "v-=f;" - "float y=length(v);" + "v-=l;" + "float e=length(v);" "v=normalize(v);" - "float n=3./(1.+.09*y+.032*y*y),p=max(dot(c,v),0.);" - "r=normalize(v-r);" - "vec3 e=vec3(.04);" - "e+=(1.-e)*pow(clamp(1.-max(dot(r,v),0.),0.,1.),5.);" - "y=t(f+c*.01,v,y);" - "return(i*p*n+i*pow(max(dot(c,r),0.),mix(128.,8.,m))*n*e)*y;" + "float y=3./(1.+.09*e+.032*e*e),r=max(dot(m,v),0.);" + "f=normalize(v-f);" + "vec3 x=vec3(.04);" + "x+=(1.-x)*pow(clamp(1.-max(dot(f,v),0.),0.,1.),5.);" + "e=t(l+m*.01,v,e);" + "return(i*r*y+i*pow(max(dot(m,f),0.),mix(128.,8.,n))*y*x)*e;" "}" - "vec3 e(vec3 v,vec3 f,vec3 i,float y)" + "vec3 e(vec3 v,vec3 i,vec3 f,float n)" "{" "float m=.01;" - "vec3 c=vec3(0);" - "if(y==0.)" - "c=vec3(.8314,.2941,.2941),m=.1;" - "else if(y==1.)" - "c=vec3(.6196,.6118,.6118),m=.7;" - "else if(y==2.)" - "c=vec3(.3255,.4784,.3255),m=.2;" - "else if(y==3.)" - "c=vec3(.2471,.3059,.6314),m=1.;" - "else if(y==4.)" - "c=vec3(.9961,1,.9922),m=.1;" - "else if(y==5.)" - "c=vec3(.9961,1,.9922),m=.3;" - "v=vec3(0)+e(vec3(-10,10,0),vec3(.77,.26,.73),v,i,f,m)+e(vec3(0,10,-5),vec3(.08,.62,.75),v,i,f,m)+e(vec3(0,25,0),vec3(.5137,.1961,.7725),v,i,f,m)+vec3(.08,.62,.75)*clamp(dot(f,normalize(vec3(0,1,-3)*vec3(0,-1,-2))),0.,1.)*.8;" - "return c*max(vec3(0),v);" + "vec3 l=vec3(0);" + "if(n==0.)" + "l=vec3(.8314,.2941,.2941),m=.1;" + "else if(n==1.)" + "l=vec3(.6196,.6118,.6118),m=.7;" + "else if(n==2.)" + "l=vec3(.3255,.4784,.3255),m=.2;" + "else if(n==3.)" + "l=vec3(.2471,.3059,.6314),m=1.;" + "else if(n==4.)" + "l=vec3(.9961,1,.9922),m=.1;" + "else if(n==5.)" + "l=vec3(.9961,1,.9922),m=.3;" + "v=vec3(0)+e(vec3(-10,10,0),vec3(.77,.26,.73),v,f,i,m)+e(vec3(0,10,-5),vec3(.08,.62,.75),v,f,i,m)+e(vec3(0,25,0),vec3(.5137,.1961,.7725),v,f,i,m)+vec3(.08,.62,.75)*clamp(dot(i,normalize(vec3(0,1,-3)*vec3(0,-1,-2))),0.,1.)*.8;" + "return l*max(vec3(0),v);" "}" - "vec3 e(vec2 v,vec3 f)" + "vec3 e(vec2 v,vec3 i)" "{" - "f=normalize(vec3(0,-1,10)-f);" - "vec3 m=normalize(cross(vec3(0,1,0),f));" - "return normalize(v.x*m+v.y*normalize(cross(f,m))+f);" + "i=normalize(vec3(0,-1,10)-i);" + "vec3 m=normalize(cross(vec3(0,1,0),i));" + "return normalize(v.x*m+v.y*normalize(cross(i,m))+i);" "}" "vec3 e()" "{" - "vec3 f;" + "vec3 i;" "{" - "float v=c*.06;" - "f=vec3(sin(v)*15.,30.+cos(v*.5)*5.,cos(v)*15.);" + "float v=l*.06;" + "i=vec3(sin(v)*15.,30.+cos(v*.5)*5.,cos(v)*15.);" "}" - "return f;" + "return i;" "}" "vec3 e(vec2 v)" "{" - "vec3 f=e(v,e()),m=vec3(.102,.2431,.3412),y=vec3(0),i=t(e(),f,y);" - "if(i.x>0.)" + "vec3 i=e(v,e()),m=vec3(.102,.2431,.3412),n=vec3(0),l=t(e(),i,n);" + "if(l.x>0.)" "{" - "vec3 v=e(y);" - "m=e(y,v,f,i.y);" + "vec3 v=e(n);" + "m=e(n,v,i,l.y);" "}" "return m;" "}" "void main()" "{" "vec3 v=e(gl_FragCoord.xy*vec2(.00104166667,.00185185185)-1.);" - "f=vec4(v,1);" + "i=vec4(v,1);" "}"; #endif // FRAGMENT_INL_