Compare commits
4 Commits
teemun_uus
...
hexakoodi
| Author | SHA1 | Date | |
|---|---|---|---|
| 84d9dbaa93 | |||
| 17d1ab8651 | |||
| cccd524d39 | |||
| 3317747bdd |
@ -71,8 +71,8 @@ void compute_fft(float* time_data, float* freq_out) {
|
||||
|
||||
for (int i = 0; i < FFT_SIZE / 2; ++i) {
|
||||
float mag = sqrtf(real[i] * real[i] + imag[i] * imag[i]) / FFT_SIZE;
|
||||
//float db = 20.0f * log10f(mag + 1e-6f); // Decibels
|
||||
//float normalized = (db + 60.0f) / 60.0f; // [0,1]
|
||||
float db = 20.0f * log10f(mag + 1e-6f); // Decibels
|
||||
float normalized = (db + 60.0f) / 60.0f; // [0,1]
|
||||
freq_out[i] = mag;
|
||||
}
|
||||
}
|
||||
|
||||
86
src/main.cpp
86
src/main.cpp
@ -16,6 +16,9 @@
|
||||
#define USE_AUDIO 1
|
||||
#define NO_UNIFORMS 0
|
||||
|
||||
#define GRID 32
|
||||
#define HEX_TEX_SIZE (GRID * GRID * 4) // RGBA: 4 floats per texel
|
||||
|
||||
#include "definitions.h"
|
||||
#if OPENGL_DEBUG
|
||||
#include "debug.h"
|
||||
@ -110,8 +113,7 @@ int __cdecl main(int argc, char* argv[])
|
||||
|
||||
long playCursor = 0;
|
||||
long lastPlayCursor = -1;
|
||||
volatile float maximum = 0.0; // Helper variable to calculate maximum fft output for normalization
|
||||
|
||||
|
||||
// Unlock buffer for next use
|
||||
IDirectSoundBuffer_Unlock(direct_sound_buffer, p1, SU_LENGTH_IN_SAMPLES * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE, NULL, NULL);
|
||||
|
||||
@ -126,9 +128,19 @@ int __cdecl main(int argc, char* argv[])
|
||||
static float fft_input[FFT_SIZE];
|
||||
static float fft_output[FFT_SIZE / 2]; // Magnitudes
|
||||
static float fft_uniform[FFT_SIZE / 4];
|
||||
|
||||
|
||||
//// Bind to texture unit 0
|
||||
PFNGLACTIVETEXTUREPROC glActiveTexture = ((PFNGLACTIVETEXTUREPROC)wglGetProcAddress("glActiveTexture"));
|
||||
PFNGLUNIFORM1IPROC glUniform1i = ((PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"));
|
||||
PFNGLGETUNIFORMLOCATIONPROC glGetUniformLocation = ((PFNGLGETUNIFORMLOCATIONPROC)wglGetProcAddress("glGetUniformLocation"));
|
||||
|
||||
const ULONGLONG targetIntervalMs = 1000 / 60; // For 60 FPS FFT updates
|
||||
|
||||
do
|
||||
{
|
||||
static ULONGLONG lastFFTTime = 0;
|
||||
ULONGLONG currentTime = GetTickCount64();
|
||||
|
||||
direct_sound_buffer->GetCurrentPosition((DWORD*)&playCursor, NULL);
|
||||
|
||||
#if !(DESPERATE)
|
||||
@ -158,43 +170,44 @@ int __cdecl main(int argc, char* argv[])
|
||||
((PFNGLUNIFORM1IPROC)wglGetProcAddress("glUniform1i"))(0, (static_cast<int>(position*44100.0)));
|
||||
|
||||
#endif
|
||||
if (currentTime - lastFFTTime >= targetIntervalMs) {
|
||||
lastFFTTime = currentTime;
|
||||
/******************
|
||||
* FFT
|
||||
*******************/
|
||||
LPVOID audio_ptr = NULL;
|
||||
DWORD audio_size = 0;
|
||||
|
||||
/******************
|
||||
* FFT
|
||||
*******************/
|
||||
LPVOID audio_ptr = NULL;
|
||||
DWORD audio_size = 0;
|
||||
// Read audio
|
||||
HRESULT hr = IDirectSoundBuffer_Lock(direct_sound_buffer, 0, FFT_SIZE * sizeof(SUsample), &audio_ptr, &audio_size, NULL, NULL, DSBLOCK_FROMWRITECURSOR);
|
||||
|
||||
// Read audio
|
||||
HRESULT hr = IDirectSoundBuffer_Lock(direct_sound_buffer, 0, FFT_SIZE * sizeof(SUsample), &audio_ptr, &audio_size, NULL, NULL, DSBLOCK_FROMWRITECURSOR);
|
||||
if (SUCCEEDED(hr) && audio_ptr) {
|
||||
if (playCursor < ((SU_LENGTH_IN_SAMPLES * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE) - (FFT_SIZE * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE)))
|
||||
{
|
||||
SUsample* samples = (SUsample*)audio_ptr;
|
||||
for (int i = 0; i < FFT_SIZE; ++i) {
|
||||
fft_input[i] = (float)samples[i];
|
||||
}
|
||||
}
|
||||
|
||||
if (SUCCEEDED(hr) && audio_ptr) {
|
||||
if (playCursor < ((SU_LENGTH_IN_SAMPLES * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE) - (FFT_SIZE* SU_CHANNEL_COUNT * SU_SAMPLE_SIZE)))
|
||||
{
|
||||
SUsample* samples = (SUsample*)audio_ptr;
|
||||
for (int i = 0; i < FFT_SIZE; ++i) {
|
||||
fft_input[i] = (float)samples[i];
|
||||
IDirectSoundBuffer_Unlock(direct_sound_buffer, audio_ptr, audio_size, NULL, 0);
|
||||
}
|
||||
|
||||
// Calculate FFT
|
||||
compute_fft(fft_input, fft_output);
|
||||
|
||||
// Normalize output
|
||||
for (int i = 0; i < (FFT_SIZE / 4); i++)
|
||||
{
|
||||
float gain = 50.0f;
|
||||
float alpha = 0.10f; // "Hidastaa" FFT:n piikkej<65>
|
||||
float threshhold = 0.05f; // Alin arvo mik<69> p<><70>stet<65><74>n shaderille (v<>hent<6E><74> "noisea")
|
||||
float x_t = fft_output[i] * gain;
|
||||
// Exponential smoothing kaava
|
||||
// s(t) = alpha*x(t)+(1-alpha)*s(t-1)
|
||||
fft_uniform[i] = (x_t < threshhold) ? 0.f : alpha * (x_t)+(1 - alpha) * fft_uniform[i];
|
||||
}
|
||||
}
|
||||
|
||||
IDirectSoundBuffer_Unlock(direct_sound_buffer, audio_ptr, audio_size, NULL, 0);
|
||||
}
|
||||
|
||||
// Calculate FFT
|
||||
compute_fft(fft_input, fft_output);
|
||||
|
||||
// Normalize output
|
||||
for (int i = 0; i < (FFT_SIZE / 4); i++)
|
||||
{
|
||||
float gain = 50.0f;
|
||||
float alpha = 0.15f; // "Hidastaa" FFT:n piikkej<65>
|
||||
float threshhold = 0.05f; // Alin arvo mik<69> p<><70>stet<65><74>n shaderille (v<>hent<6E><74> "noisea")
|
||||
float x_t = fft_output[i] * gain;
|
||||
// Exponential smoothing kaava
|
||||
// s(t) = alpha*x(t)+(1-alpha)*s(t-1)
|
||||
fft_uniform[i] = (x_t < threshhold) ? 0.f : alpha*(x_t) + (1-alpha)*fft_uniform[i];
|
||||
}
|
||||
|
||||
syncs[0] = (float)playCursor / (SU_SAMPLE_RATE * SU_CHANNEL_COUNT * SU_SAMPLE_SIZE); // Aika sekunteina.
|
||||
|
||||
for (int i = 0; i < SU_NUMSYNCS; ++i)
|
||||
@ -208,9 +221,6 @@ int __cdecl main(int argc, char* argv[])
|
||||
|
||||
glRects(-1, -1, 1, 1);
|
||||
|
||||
//syncs[0] = -syncs[0];
|
||||
//glUniform1fvProc(0, SU_NUMSYNCS + 1, syncs);
|
||||
|
||||
// render "post process" using the opengl backbuffer
|
||||
#if POST_PASS
|
||||
glBindTexture(GL_TEXTURE_2D, 1);
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@ -1,336 +1,139 @@
|
||||
// Generated with Shader Minifier 1.5.1 (https://github.com/laurentlb/Shader_Minifier/)
|
||||
#ifndef FRAGMENT_INL_
|
||||
# define FRAGMENT_INL_
|
||||
# define VAR_fft_output "f"
|
||||
# define VAR_o "v"
|
||||
# define VAR_syncs "n"
|
||||
# define VAR_fft_output "H"
|
||||
# define VAR_o "f"
|
||||
# define VAR_syncs "a"
|
||||
# define VAR_u_hexGridTex "l"
|
||||
|
||||
const char *fragment_frag =
|
||||
"#version 460\n"
|
||||
"precision mediump float;"
|
||||
"out vec4 v;"
|
||||
"layout(location=0)uniform float n[7];"
|
||||
"layout(location=8)uniform float f[512];"
|
||||
"float m=n[0];\n"
|
||||
"#define saturate(x)clamp(x,0.,1.)\n"
|
||||
"#define dot2(x)dot(x,x)\n"
|
||||
"float d=m*.25,s=sin(d)*.5+.7;"
|
||||
"vec3 e=vec3(9.*cos(d),6.*abs(sin(d))/-.75+s,1);"
|
||||
"float c=sin(d)*.075+.125;"
|
||||
"vec3 x=vec3(1,.6,.3),o=vec3(.2,.01,.6),p=vec3(.95,.93,.88),l=vec3(.05),r=vec3(0,9,21);"
|
||||
"struct Ray{vec3 origin,direction;};"
|
||||
"struct Rect{vec3 center,side1,side2,side3,side4;vec3 up,right,front;vec2 halfSize;};"
|
||||
"mat3 t()"
|
||||
"out vec4 f;"
|
||||
"const float m=2.*acos(-1.),v=sqrt(5.)*.5+.5;"
|
||||
"layout(location=0)uniform float a[7];"
|
||||
"layout(location=8)uniform float H[512];"
|
||||
"uniform sampler2D l;"
|
||||
"float d=a[0];"
|
||||
"vec2 n=vec2(1920,1080);"
|
||||
"vec3 s(vec3 v)"
|
||||
"{"
|
||||
"float v=d;"
|
||||
"return mat3(cos(v),-sin(v),0.,sin(v),cos(v),0.,0.,0.,1.);"
|
||||
"return normalize(v);"
|
||||
"}"
|
||||
"vec3 t(vec3 v,float d)"
|
||||
"float s(float v,float f,float m)"
|
||||
"{"
|
||||
"vec3 f=vec3(0,1,0);"
|
||||
"return f*cos(d)+cross(v,f)*sin(d)+v*dot(v,f)*(1.-cos(d));"
|
||||
"return clamp(v,f,m);"
|
||||
"}"
|
||||
"mat3 t(vec3 v)"
|
||||
"mat2 s()"
|
||||
"{"
|
||||
"v=normalize(vec3(0,1,0)-v);"
|
||||
"vec3 d=normalize(cross(v,vec3(0,1,0)));"
|
||||
"return mat3(d,normalize(cross(d,v)),v);"
|
||||
"float v=sin(.5),f=cos(.5);"
|
||||
"return mat2(f,-v,v,f);"
|
||||
"}"
|
||||
"Ray t(vec2 v)"
|
||||
"float s(vec3 v,vec2 m)"
|
||||
"{"
|
||||
"vec3 d=r;"
|
||||
"return Ray(d,normalize(t(d)*vec3(v,2.5)));"
|
||||
"v=abs(v);"
|
||||
"return max(v.y-m.y,max(v.x*sqrt(3.)*.5+v.z*.5,v.z)-m.x);"
|
||||
"}\n"
|
||||
"#define zclamp(a)max(a,0.0)\n"
|
||||
"struct HexData{vec3 local;vec2 axial;};"
|
||||
"HexData t(vec3 v)"
|
||||
"{"
|
||||
"float f=sqrt(3.)/3.*v.x-1./3.*v.z,m=2./3.*v.z,x=round(f),l=round(m),a=round(-f-m),d=abs(x-f),p=abs(l-m);"
|
||||
"f=abs(a+f+m);"
|
||||
"if(d>p&&d>f)"
|
||||
"x=-l-a;"
|
||||
"else if(p>f)"
|
||||
"l=-x-a;"
|
||||
"f=sqrt(3.)*(x+l*.5);"
|
||||
"m=1.5*l;"
|
||||
"HexData r;"
|
||||
"r.local=v-vec3(f,0,m);"
|
||||
"r.axial=vec2(x,l);"
|
||||
"return r;"
|
||||
"}"
|
||||
"void t(out Rect v)"
|
||||
"struct HexData{vec3 local;vec2 axial;};"
|
||||
"float s(vec2 v)"
|
||||
"{"
|
||||
"float f=d;"
|
||||
"v.up=vec3(0,0,1);"
|
||||
"v.right=vec3(1,0,0);"
|
||||
"v.front=normalize(cross(v.right,v.up));"
|
||||
"v.halfSize=vec2(2.5,1.5)*(vec2(cos(f),sin(f))*.25+.75);"
|
||||
"v.center=vec3(0,6,sin(f)*4.-1.5);"
|
||||
"v.side1=v.center+v.halfSize.x*v.right+v.halfSize.y*v.up;"
|
||||
"v.side2=v.center-v.halfSize.x*v.right+v.halfSize.y*v.up;"
|
||||
"v.side3=v.center-v.halfSize.x*v.right-v.halfSize.y*v.up;"
|
||||
"v.side4=v.center+v.halfSize.x*v.right-v.halfSize.y*v.up;"
|
||||
"float m=v.x,f=v.y;"
|
||||
"return max(abs(m),max(abs(f),abs(-m-f)));"
|
||||
"}"
|
||||
"float t(vec3 v,vec3 d,vec3 f,vec3 i,vec3 c)"
|
||||
"vec3 p(vec3 v)"
|
||||
"{"
|
||||
"v=normalize(cross(d,f));"
|
||||
"f=normalize(cross(f,i));"
|
||||
"i=normalize(cross(i,c));"
|
||||
"d=normalize(cross(c,d));"
|
||||
"return acos(dot(-v,f))+acos(dot(-f,i))+acos(dot(-i,d))+acos(dot(-d,v))-2.*acos(-1.);"
|
||||
"float f=1e9;"
|
||||
"HexData m=t(vec3(v.x,v.y-10.,v.z));"
|
||||
"float l=1.+H[int(clamp(s(m.axial)+1.,0.,511.))];"
|
||||
"v=m.local;"
|
||||
"v.xz*=s();"
|
||||
"l=s(vec3(v.x,v.y-l/2,v.z),vec2(.83,l/2));"
|
||||
"f=min(f,l);"
|
||||
"return vec3(f,0,0);"
|
||||
"}"
|
||||
"vec3 R,y;"
|
||||
"Rect i;"
|
||||
"vec2 t(vec2 v,vec2 i)"
|
||||
"float p(vec3 v,vec3 f,int m)"
|
||||
"{"
|
||||
"return v.x<i.x?"
|
||||
"v:"
|
||||
"i;"
|
||||
"}"
|
||||
"float h(vec3 v)"
|
||||
"{"
|
||||
"return v.y+.75;"
|
||||
"}"
|
||||
"float h(vec3 v,vec3 d,float f)"
|
||||
"{"
|
||||
"return length(v-d)-f;"
|
||||
"}"
|
||||
"float h(vec3 v,vec3 d,vec3 f)"
|
||||
"{"
|
||||
"v-=d;"
|
||||
"d=f-d;"
|
||||
"float y=saturate(dot(v,d)/dot(d,d));"
|
||||
"return length(v-d*y)-c;"
|
||||
"}"
|
||||
"float h(vec3 v,vec3 f,vec3 d,vec3 i,vec3 y)"
|
||||
"{"
|
||||
"vec3 x=d-f,s=v-f,c=i-d,n=v-d,R=y-i;"
|
||||
"i=v-i;"
|
||||
"d=f-y;"
|
||||
"f=v-y;"
|
||||
"v=cross(x,d);"
|
||||
"return sqrt(sign(dot(cross(x,v),s))+sign(dot(cross(c,v),n))+sign(dot(cross(R,v),i))+sign(dot(cross(d,v),f))<3.?"
|
||||
"min(min(min(dot2(x*clamp(dot(x,s)/dot2(x),0.,1.)-s),dot2(c*clamp(dot(c,n)/dot2(c),0.,1.)-n)),dot2(R*clamp(dot(R,i)/dot2(R),0.,1.)-i)),dot2(d*clamp(dot(d,f)/dot2(d),0.,1.)-f)):"
|
||||
"dot(v,s)*dot(v,s)/dot2(v));"
|
||||
"}"
|
||||
"vec2 w(vec3 v)"
|
||||
"{"
|
||||
"vec2 d=t(t(t(t(t(vec2(h(v),3),vec2(h(v,vec3(-4.5,.75,0),1.5),1.05)),vec2(h(v,vec3(-1.5,.75,0),1.5),1.25)),vec2(h(v,vec3(1.5,.75,0),1.5),1.45)),vec2(h(v,vec3(4.5,.75,0),1.5),1.65)),vec2(h(v,e,s),0));"
|
||||
"d=t(d,vec2(h(v,R,y),0));"
|
||||
"return t(d,vec2(h(v,i.side1,i.side2,i.side3,i.side4),0));"
|
||||
"}"
|
||||
"vec2 a(vec3 v)"
|
||||
"{"
|
||||
"return t(t(t(t(vec2(v.y+.75,3),vec2(h(v,vec3(-4.5,.75,0),1.5),1.05)),vec2(h(v,vec3(-1.5,.75,0),1.5),1.25)),vec2(h(v,vec3(1.5,.75,0),1.5),1.45)),vec2(h(v,vec3(4.5,.75,0),1.5),1.65));"
|
||||
"}"
|
||||
"vec2 u(vec3 v)"
|
||||
"{"
|
||||
"return t(t(t(t(vec2(h(v),3),vec2(h(v,vec3(-4.5,.75,0),1.5),1.05)),vec2(h(v,vec3(-1.5,.75,0),1.5),1.25)),vec2(h(v,vec3(1.5,.75,0),1.5),1.45)),vec2(h(v,vec3(4.5,.75,0),1.5),1.65));"
|
||||
"}"
|
||||
"vec3 C(vec3 v)"
|
||||
"{"
|
||||
"vec2 i=vec2(2e-4,0);"
|
||||
"return normalize(vec3(a(v+i.xyy).x,a(v+i.yxy).x,a(v+i.yyx))-a(v).x);"
|
||||
"}"
|
||||
"vec2 C(Ray v)"
|
||||
"{"
|
||||
"float d=0.;"
|
||||
"vec2 f=vec2(-1);"
|
||||
"for(int i=0;i<128;++i)"
|
||||
"vec3 l;"
|
||||
"float x=0.,r;"
|
||||
"for(int m=0;m<80;m++)"
|
||||
"{"
|
||||
"f=w(v.origin+v.direction*d);"
|
||||
"if(f.x<2e-4*d||d>=1e2)"
|
||||
"l=p(v+f*x);"
|
||||
"r=abs(l.x);"
|
||||
"if(r<1e-5*(x*.125+1.)||x>1e2)"
|
||||
"break;"
|
||||
"d+=f.x;"
|
||||
"x+=l.x;"
|
||||
"}"
|
||||
"if(d>=1e2)"
|
||||
"f.y=-1.;"
|
||||
"return vec2(d,f.y);"
|
||||
"}"
|
||||
"vec2 a(Ray v)"
|
||||
"{"
|
||||
"float d=0.;"
|
||||
"vec2 f=vec2(-1);"
|
||||
"for(int i=0;i<64;++i)"
|
||||
"x-=15.;"
|
||||
"for(int m=0;m<80;m++)"
|
||||
"{"
|
||||
"f=u(v.origin+v.direction*d);"
|
||||
"if(f.x<2e-4*d||d>=1e2)"
|
||||
"l=p(v+f*x);"
|
||||
"r=abs(l.x);"
|
||||
"if(r<x*.00125*1e-5||x>1e2)"
|
||||
"break;"
|
||||
"d+=f.x;"
|
||||
"x+=min(l.x,.2);"
|
||||
"}"
|
||||
"if(d>=1e2)"
|
||||
"f.y=-1.;"
|
||||
"return vec2(d,f.y);"
|
||||
"}\n"
|
||||
"#if 1\n"
|
||||
"float h(Ray v)"
|
||||
"if(r>=1e2)"
|
||||
"x=-1.;"
|
||||
"return x;"
|
||||
"}"
|
||||
"vec3 x(vec3 v)"
|
||||
"{"
|
||||
"float d=1.,f=0.;"
|
||||
"for(int i=0;i<64;++i)"
|
||||
"vec2 m=vec2(.01,0);"
|
||||
"return s(p(v).x-vec3(p(v-m.xyy).x,p(v-m.yxy).x,p(v-m.yyx)));"
|
||||
"}"
|
||||
"float p(vec3 v,vec3 f,float m,float l,vec3 x,float y)"
|
||||
"{"
|
||||
"vec3 a=s(f-v);"
|
||||
"m=s(dot(x,a)*m,0.,m)/(1.+y*length(f-v));"
|
||||
"if(p(v+x*.025,a,1)<length(f-v))"
|
||||
"m*=l;"
|
||||
"return m;"
|
||||
"}"
|
||||
"float p(vec3 v,vec3 m,vec3 f)"
|
||||
"{"
|
||||
"float l=pow(10.,2.);"
|
||||
"return pow(max(dot(reflect(f,v),m),0.),l)*((l+8.)/(acos(-1.)*8.));"
|
||||
"}"
|
||||
"vec3 p(vec2 v,vec3 f,float m)"
|
||||
"{"
|
||||
"f=s(vec3(0,0,-5)-f);"
|
||||
"vec3 l=s(cross(vec3(0,1,0),f));"
|
||||
"return s(f*m+v.x*l+v.y*cross(f,l));"
|
||||
"}"
|
||||
"vec3 p(vec2 v)"
|
||||
"{"
|
||||
"vec3 f=vec3(0,25,25),m=p(v,f,s(1.,2.,25.)),l=vec3(0);"
|
||||
"float a=p(f,m,0),r=0.;"
|
||||
"if(a<5e2)"
|
||||
"{"
|
||||
"vec2 c=u(v.origin+v.direction*f);"
|
||||
"if(c.y>0.)"
|
||||
"{"
|
||||
"d=min(d,.5+.5*c.x/(.125*f));"
|
||||
"if(d<0.)"
|
||||
"break;"
|
||||
"f+=clamp(c.x,.005,.5);"
|
||||
"}"
|
||||
"vec3 v=f+m*a,i=x(v);"
|
||||
"r=p(v).y;"
|
||||
"l=l+vec3(.82,.5,.9)*p(v,vec3(10,15,25),1.,.2,i,1e-10)+vec3(.79,.66,.43)*p(v,vec3(4,2,-15),1.,1.,i,1e-10)+vec3(0,.06,.7)*p(v,vec3(0,0,5),s((d-29.)*1e2,0.,50.),0.,i,3.1)+vec3(.29,.28,.33)*s(dot(i,s(vec3(0,1,10))),0.,1.);"
|
||||
"if(r==0.)"
|
||||
"l*=vec3(.2,.3,.3)+vec3(p(i,s(vec3(0,.3,.8)),s(m)))*.5;"
|
||||
"}"
|
||||
"return smoothstep(0.,1.,max(d,0.));"
|
||||
"}\n"
|
||||
"#else\n"
|
||||
"float h(Ray v)"
|
||||
"{"
|
||||
"float f=0.;"
|
||||
"for(int d=0;d<64;++d)"
|
||||
"{"
|
||||
"float i=u(v.origin+v.direction*f).x;"
|
||||
"if(i<2e-4)"
|
||||
"return 0.;"
|
||||
"f+=i;"
|
||||
"}"
|
||||
"return 1.;"
|
||||
"}\n"
|
||||
"#endif\n"
|
||||
"float C(float v,float d,float f)"
|
||||
"{"
|
||||
"d*=d;"
|
||||
"return f*f*d/pow(v*v*(d-1.)+1.,2.);"
|
||||
"}"
|
||||
"float a(float v,float d,float f)"
|
||||
"{"
|
||||
"d*=d;"
|
||||
"return d*f/pow(v*v*(d-1.)+1.,2.);"
|
||||
"}"
|
||||
"float h(float v,float d,float f)"
|
||||
"{"
|
||||
"d*=d;"
|
||||
"return f*f*f*d/pow(v*v*(d-1.)+1.,2.);"
|
||||
"}"
|
||||
"float C(float v,float d)"
|
||||
"{"
|
||||
"return v/max(v*(1.-d)+d,2e-7);"
|
||||
"}"
|
||||
"float t(float v,float d,float f)"
|
||||
"{"
|
||||
"f+=1.;"
|
||||
"f=f*f/8.;"
|
||||
"return C(v,f)*C(d,f);"
|
||||
"}"
|
||||
"vec3 C(vec3 v,float d)"
|
||||
"{"
|
||||
"return v+(1.-v)*pow(1.-d,5.);"
|
||||
"}"
|
||||
"vec2 a(float v,float d)"
|
||||
"{"
|
||||
"vec4 i=v*vec4(-1,-.0275,-.572,.022)+vec4(1,.0425,1.04,-.04);"
|
||||
"return vec2(-1.04,1.04)*(min(i.x*i.x,exp2(-9.28*d))*i.x+i.y)+i.zw;"
|
||||
"}"
|
||||
"vec4 C(vec3 v,vec3 d,vec3 f,vec3 i,vec3 c,float x,float n,float R,out vec3 r,out float y)"
|
||||
"{"
|
||||
"vec3 m=e-v,o=dot(m,i)*i-m;"
|
||||
"i=m+o*saturate(s/length(o));"
|
||||
"o=normalize(i);"
|
||||
"m=normalize(f+o);"
|
||||
"R=length(i);"
|
||||
"float p=max(dot(d,o),0.);"
|
||||
"y=pow(saturate(1.-pow(R/20.,4.)),2.)/(R*R+1.);"
|
||||
"y*=h(Ray(v+d*2e-4,o));"
|
||||
"float a=n*n;"
|
||||
"R=saturate(a+s/(2.*R));"
|
||||
"r=C(c,max(dot(m,f),0.));"
|
||||
"m=C(max(dot(d,m),0.),a,R)*t(x,p,n)*r;"
|
||||
"return vec4(m,p);"
|
||||
"}"
|
||||
"vec4 a(vec3 v,vec3 d,vec3 f,vec3 i,vec3 x,float m,float n,float s,out vec3 r,out float o)"
|
||||
"{"
|
||||
"vec4 e=vec4(0);"
|
||||
"vec3 p=R-v,l=y-v;"
|
||||
"s=length(p);"
|
||||
"float w=length(l);"
|
||||
"e.w=2.*saturate(dot(d,p)/(2.*s)+dot(d,l)/(2.*w))/(s*w+dot(p,l)+2.);"
|
||||
"l-=p;"
|
||||
"w=dot(i,l);"
|
||||
"s=length(l);"
|
||||
"vec3 z=p+l*saturate((dot(i,p)*w-dot(p,l))/(s*s-w*w));"
|
||||
"i=dot(z,i)*i-z;"
|
||||
"z+=i*saturate(c/length(i));"
|
||||
"i=normalize(f+normalize(z));"
|
||||
"w=length(z);"
|
||||
"s=w/20.;"
|
||||
"o=1./(s*s+1.);"
|
||||
"o*=h(Ray(v+d*2e-4,normalize(p+l*.5)));"
|
||||
"s=n*n;"
|
||||
"w=saturate(s+c/(2.*w));"
|
||||
"r=C(x,dot(i,f));"
|
||||
"e.xyz=a(max(dot(d,i),0.),s,w)*t(m,e.w,n)*r;"
|
||||
"return e;"
|
||||
"}"
|
||||
"vec4 h(vec3 v,vec3 d,vec3 f,vec3 s,vec3 c,float x,float n,float R,out vec3 r,out float y)"
|
||||
"{"
|
||||
"vec4 e=vec4(0);"
|
||||
"R=dot(cross(i.right,i.up),i.center-v);"
|
||||
"if(R>0.)"
|
||||
"return e;"
|
||||
"vec3 m=i.side1-v,o=i.side2-v,p=i.side3-v,l=i.side4-v;"
|
||||
"e.w=t(v,m,o,p,l)*.2*(saturate(dot(normalize(m),d))+saturate(dot(normalize(o),d))+saturate(dot(normalize(p),d))+saturate(dot(normalize(l),d))+saturate(dot(normalize(i.center-v),d)));"
|
||||
"y=h(Ray(v+d*2e-4,normalize(i.center)));"
|
||||
"Ray w=Ray(v,s);"
|
||||
"m=w.origin+w.direction*(dot(i.front,i.center-w.origin)/dot(i.front,w.direction))-i.center;"
|
||||
"vec2 z=vec2(dot(m,i.right),dot(m,i.up));"
|
||||
"z=min(abs(z),i.halfSize)*sign(z);"
|
||||
"m=i.center+i.right*z.x+i.up*z.y-v;"
|
||||
"o=normalize(f+normalize(m));"
|
||||
"R=n*n;"
|
||||
"float a=saturate(R+4./(2.*length(m)));"
|
||||
"r=C(c,dot(o,f));"
|
||||
"e.xyz=h(max(dot(d,o),0.),R,a)*t(x,e.w,n)*r;"
|
||||
"return e;"
|
||||
"}"
|
||||
"vec3 t(Ray v)"
|
||||
"{"
|
||||
"vec3 f=vec3(2,0,0)*t(),s=vec3(6.*sin(d),3,5);"
|
||||
"R=s-f;"
|
||||
"y=s+f;"
|
||||
"t(i);"
|
||||
"f=vec3(0);"
|
||||
"vec2 c=C(v);"
|
||||
"s=v.origin+v.direction*c.x;"
|
||||
"vec3 m=C(s),n=-v.direction,e=reflect(v.direction,m);"
|
||||
"float w=max(dot(m,n),0.);"
|
||||
"vec3 r=o;"
|
||||
"float z=fract(c.y),F=.88;"
|
||||
"vec3 u=p;"
|
||||
"if(c.y>-1.)"
|
||||
"{"
|
||||
"if(c.y>2.)"
|
||||
"r=vec3(.31,.62,.47),z=max(.05,r.x*.5),F=.05,u=l;"
|
||||
"else if(c.y<.5)"
|
||||
"return x*64.;"
|
||||
"vec3 v=mix(u,r,F),d=vec3(0);"
|
||||
"float i=1.;"
|
||||
"vec4 R=C(s,m,n,e,v,w,z,F,d,i);"
|
||||
"d=(1.-d)*(1.-F);"
|
||||
"vec3 y=vec3(0);"
|
||||
"float p=1.;"
|
||||
"vec4 g=a(s,m,n,e,v,w,z,F,y,p);"
|
||||
"y=(1.-y)*(1.-F);"
|
||||
"vec3 b=vec3(0);"
|
||||
"float A=1.;"
|
||||
"vec4 B=h(s,m,n,e,v,w,z,F,b,A);"
|
||||
"b=(1.-b)*(1.-F);"
|
||||
"f=f+(d*.3183098861*r+R.xyz)*256.*R.w*i+(y*.3183098861*r+g.xyz)*512.*g.w*p+(b*.3183098861*r+B.xyz)*64.*B.w*A+r*.025;"
|
||||
"A=z*z;"
|
||||
"b=vec3(.1125,.1875,.25)+e.y*.35;"
|
||||
"Ray D=Ray(s,vec3(0));"
|
||||
"for(int v=0;v<8;++v)"
|
||||
"{"
|
||||
"float d=float(v)/float(8);"
|
||||
"D.direction=normalize(t(e,2.*acos(-1.)*d)*A+e);"
|
||||
"vec2 i=a(D);"
|
||||
"if(floor(i.y)==3.)"
|
||||
"b=vec3(.1,.3,.2);"
|
||||
"else if(floor(i.y)==1.)"
|
||||
"b+=o;"
|
||||
"}"
|
||||
"b/=float(8);"
|
||||
"vec2 E=a(z,w);"
|
||||
"b=b*(v*E.x+E.y)+max(vec3(.754554516862612,.748542953903366,.790921515418539)+vec3(-.083856548007422,.09253350096321,.322764661032516)*m.y+vec3(.308152705331738,.366796330467391,.466698181299906)*m.z+vec3(-.188884931542396,-.277402551592231,-.377844212327557)*m.x,0.)*.3183098861*r;"
|
||||
"f=(f+b*.84)*x;"
|
||||
"}"
|
||||
"return mix(f,vec3(.01,.006,.004),clamp(1.-exp(-c.x*.08),0.,1.));"
|
||||
"return smoothstep(0.,1.,pow(mix(l,mix(vec3(.34,.11,.34),vec3(.93,.37,.16),pow(max(dot(m,vec3(0,-.1,-1)),0.),8.)),1.-exp(-a*.01))*vec3(.9,.8,.7),vec3(.45)));"
|
||||
"}"
|
||||
"void main()"
|
||||
"{"
|
||||
"vec2 d=vec2(1920,1080);"
|
||||
"d=(2.*gl_FragCoord.xy-d.xy)/d.y;"
|
||||
"Ray f=t(d);"
|
||||
"vec3 i=t(f);"
|
||||
"v=vec4(i,1);"
|
||||
"f=vec4(p((gl_FragCoord.xy*2.-n.xy)/n.y),1);"
|
||||
"}";
|
||||
|
||||
#endif // FRAGMENT_INL_
|
||||
|
||||
79
test.py
Normal file
79
test.py
Normal file
@ -0,0 +1,79 @@
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from matplotlib.animation import FuncAnimation
|
||||
|
||||
class DecayingSineWave:
|
||||
def __init__(self, freq=5, decay=0.05, sample_rate=60):
|
||||
self.freq = freq
|
||||
self.decay = decay
|
||||
self.sample_rate = sample_rate
|
||||
self.triggers = []
|
||||
|
||||
def trigger(self, t):
|
||||
self.triggers.append(t)
|
||||
|
||||
def sample(self, t):
|
||||
value = 0.0
|
||||
still_active = []
|
||||
for start_time in self.triggers:
|
||||
age = t - start_time
|
||||
if age >= 0:
|
||||
v = np.sin(2 * np.pi * self.freq * age / self.sample_rate) * np.exp(-self.decay * age)
|
||||
value += v
|
||||
if np.exp(-self.decay * age) > 1e-3:
|
||||
still_active.append(start_time)
|
||||
self.triggers = still_active
|
||||
return value
|
||||
|
||||
# --- Initialize ---
|
||||
wave = DecayingSineWave(freq=5, decay=0.05, sample_rate=60)
|
||||
wave_array = np.zeros(512)
|
||||
time = [0]
|
||||
max_len = 512
|
||||
|
||||
fig, ax = plt.subplots()
|
||||
line, = ax.plot(np.arange(512), wave_array, lw=2)
|
||||
trig_dots, = ax.plot([], [], 'ro', markersize=4)
|
||||
|
||||
ax.set_xlim(0, 511)
|
||||
ax.set_ylim(-1.2, 1.2)
|
||||
ax.set_title("Click to Trigger Decaying Sine Wave")
|
||||
ax.set_xlabel("Sample Index (0 = current)")
|
||||
ax.set_ylabel("Amplitude")
|
||||
ax.grid(True)
|
||||
|
||||
trigger_times = []
|
||||
|
||||
# --- Click handler ---
|
||||
def on_click(event):
|
||||
current_time = time[0]
|
||||
wave.trigger(current_time)
|
||||
trigger_times.append(current_time)
|
||||
|
||||
fig.canvas.mpl_connect('button_press_event', on_click)
|
||||
|
||||
# --- Animation update ---
|
||||
def update(frame):
|
||||
global wave_array
|
||||
current_time = time[0]
|
||||
|
||||
# Shift buffer to the right (older samples move toward the end)
|
||||
wave_array = wave_array * 0.995
|
||||
wave_array = np.roll(wave_array, 1)
|
||||
# Insert new sample at index 0
|
||||
wave_array[0] = wave.sample(current_time)
|
||||
print (wave_array)
|
||||
|
||||
line.set_data(np.arange(512), wave_array)
|
||||
|
||||
# Trigger markers
|
||||
visible_triggers = [tt for tt in trigger_times if current_time - 512 < tt <= current_time]
|
||||
x = [current_time - tt for tt in visible_triggers] # 0 = current time
|
||||
y = [1.0 for _ in x]
|
||||
trig_dots.set_data(x, y)
|
||||
|
||||
time[0] += 1
|
||||
return line, trig_dots
|
||||
|
||||
ani = FuncAnimation(fig, update, interval=1000 / 60, blit=True)
|
||||
plt.show()
|
||||
Reference in New Issue
Block a user