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 8409545..12a918d 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() { @@ -65,6 +67,10 @@ vec2 opU( vec2 d1, vec2 d2 ) return (d1.x1e2)" + "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,l,y);" + "if(f>1e2)" + "f=0.;" + "return vec3(f,r,m);" "}" - "float t(vec3 v,vec3 i,float f)" + "float t(vec3 v,vec3 f,float n)" "{" - "float r=1.,l=.02;" - "for(int m=0;m<6;m++)" + "float i=1.,m=.02;" + "for(int e=0;e<6;e++)" "{" - "if(l>f)" + "if(m>n)" "break;" - "float n=t(v+l*i).x;" - "r=min(r,n/(4.*l));" - "l+=clamp(n,.1,.8);" - "if(r<-1.)" + "float l=t(v+m*f).x;" + "i=min(i,l/(4.*m));" + "m+=clamp(l,.1,.8);" + "if(i<-1.)" "break;" "}" - "r=max(r,-1.);" - "return.25*(1.+r)*(1.+r)*(2.-r);" + "i=max(i,-1.);" + "return.25*(1.+i)*(1.+i)*(2.-i);" "}" - "vec3 x(vec3 v)" + "vec3 e(vec3 v)" "{" "vec2 i=vec2(.01,0);" - "v=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);" - "return normalize(v);" + "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 t(vec3 v,vec3 i,vec3 f,vec3 r,vec3 l,float y)" + "vec3 e(vec3 v,vec3 i,vec3 l,vec3 f,vec3 m,float n)" "{" - "v-=f;" - "float m=length(v);" + "v-=l;" + "float e=length(v);" "v=normalize(v);" - "float n=3./(1.+.09*m+.032*m*m),c=max(dot(l,v),0.);" - "r=normalize(v-r);" - "vec3 e=vec3(.04);" - "e+=(1.-e)*pow(clamp(1.-max(dot(r,v),0.),0.,1.),5.);" - "m=t(f+l*.01,v,m);" - "return(i*c*n+i*pow(max(dot(l,r),0.),mix(128.,8.,y))*n*e)*m;" + "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 t(vec3 v,vec3 i,vec3 f,float r)" + "vec3 e(vec3 v,vec3 i,vec3 f,float n)" "{" "float m=.01;" "vec3 l=vec3(0);" - "if(r==0.)" + "if(n==0.)" "l=vec3(.8314,.2941,.2941),m=.1;" - "else if(r==1.)" + "else if(n==1.)" "l=vec3(.6196,.6118,.6118),m=.7;" - "else if(r==2.)" + "else if(n==2.)" "l=vec3(.3255,.4784,.3255),m=.2;" - "else if(r==3.)" + "else if(n==3.)" "l=vec3(.2471,.3059,.6314),m=1.;" - "else if(r==4.)" + "else if(n==4.)" "l=vec3(.9961,1,.9922),m=.1;" - "else if(r==5.)" + "else if(n==5.)" "l=vec3(.9961,1,.9922),m=.3;" - "vec3 y=vec3(0);" - "y+=t(vec3(0,40,-10),vec3(.77,.26,.73),v,f,i,m);" - "y+=t(vec3(0,2,-5),vec3(.08,.62,.75),v,f,i,m);" - "y+=t(vec3(0,20,15),vec3(.77,.26,.73),v,f,i,m);" - "y+=vec3(.08,.62,.75)*clamp(dot(i,normalize(vec3(0,1,-3)*vec3(0,-1,-2))),0.,1.)*.8;" - "return l*max(vec3(0),y);" + "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 t(vec2 i,vec3 v)" + "vec3 e(vec2 v,vec3 i)" "{" - "v=normalize(vec3(0,-1,10)-v);" - "vec3 m=normalize(cross(vec3(0,1,0),v));" - "return normalize(v+i.x*m+i.y*cross(v,m));" + "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 t(vec2 v)" + "vec3 e()" "{" - "vec3 i=vec3(0,20,-10),m=t(v,i),f=vec3(0),r=vec3(0);" - "i=t(i,m,r);" - "if(i.x>0.)" + "vec3 i;" + "{" + "float v=l*.06;" + "i=vec3(sin(v)*15.,30.+cos(v*.5)*5.,cos(v)*15.);" + "}" + "return i;" + "}" + "vec3 e(vec2 v)" + "{" + "vec3 i=e(v,e()),m=vec3(.102,.2431,.3412),n=vec3(0),l=t(e(),i,n);" + "if(l.x>0.)" "{" - "vec3 v=x(r);" - "f=t(r,v,m,i.y);" + "vec3 v=e(n);" + "m=e(n,v,i,l.y);" "}" - "return f;" + "return m;" "}" "void main()" "{" - "vec3 v=t(gl_FragCoord.xy*vec2(.00104166667,.00185185185)-1.);" - "f=vec4(v,1);" + "vec3 v=e(gl_FragCoord.xy*vec2(.00104166667,.00185185185)-1.);" + "i=vec4(v,1);" "}"; #endif // FRAGMENT_INL_