From 9e1a61af1dceebffdb6f7c1393d6558ff41b58fc Mon Sep 17 00:00:00 2001 From: MagicTINTIN Date: Mon, 20 Mar 2023 09:55:36 +0100 Subject: [PATCH 1/2] smoooooth controls --- main.c | 122 ++++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 82 insertions(+), 40 deletions(-) diff --git a/main.c b/main.c index 40d904e..7e27d62 100644 --- a/main.c +++ b/main.c @@ -18,7 +18,7 @@ * * For instance if you want fps and position set the value to 2*3=6 */ -#define DEBUG_MODE 5 +#define DEBUG_MODE 1 GLuint screenWidth = 720, screenHeight = 480; const GLFWvidmode* mode; @@ -44,6 +44,13 @@ float ez[3] = {0}; float ex[3] = {0}; float ey[3] = {0}; +bool upar = false; +bool downar = false; +bool leftar = false; +bool rightar = false; +bool forwardar = false; +bool backwardar = false; + float fovValue=1.0; //283=3.14/2 * 180 const int maxYmouse = 283; @@ -73,49 +80,59 @@ static void key_callback(GLFWwindow* window, int key, int scancode, int action, multiplicatorFov=1.; } - if (!action == GLFW_PRESS) - return; - if (key == GLFW_KEY_ESCAPE) - { - //glfwSetWindowShouldClose(window, GLFW_TRUE); - pause=!pause; - printf(pause ? "En pause\n" : "En fonctionnement\n"); - if (pause) + if (action == GLFW_PRESS) { + if (key == GLFW_KEY_ESCAPE) { - glfwSetWindowTitle(window, "EnginPasTangible (En pause)"); - glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); + //glfwSetWindowShouldClose(window, GLFW_TRUE); + pause=!pause; + printf(pause ? "En pause\n" : "En fonctionnement\n"); + if (pause) + { + glfwSetWindowTitle(window, "EnginPasTangible (En pause)"); + glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_NORMAL); + } + else + { + glfwSetWindowTitle(window, APPNAMEVERSION); + glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); + } } - else - { - glfwSetWindowTitle(window, APPNAMEVERSION); - glfwSetInputMode(window, GLFW_CURSOR, GLFW_CURSOR_DISABLED); + if (key == GLFW_KEY_BACKSPACE) + glfwSetWindowShouldClose(window, GLFW_TRUE); + if (key == GLFW_KEY_SPACE) + upar = true; + if (key == GLFW_KEY_LEFT_CONTROL) + downar = true; + if (key == GLFW_KEY_UP || key == GLFW_KEY_W) { + forwardar = true; + } + if (key == GLFW_KEY_DOWN || key == GLFW_KEY_S ) { + backwardar = true; + } + if (key == GLFW_KEY_RIGHT || key == GLFW_KEY_D) { + rightar = true; + } + if (key == GLFW_KEY_LEFT || key == GLFW_KEY_A ) { + leftar = true; } } - if (key == GLFW_KEY_BACKSPACE) - glfwSetWindowShouldClose(window, GLFW_TRUE); - if (key == GLFW_KEY_SPACE && stateControl != GLFW_PRESS) - camPosY += speed; - if (key == GLFW_KEY_SPACE && stateControl == GLFW_PRESS) - camPosY -= speed; - if (key == GLFW_KEY_UP || key == GLFW_KEY_W) { - camPosX += speed*ez[0]; - camPosY += speed*ez[1]; - camPosZ += speed*ez[2]; - } - if (key == GLFW_KEY_DOWN || key == GLFW_KEY_S ) { - camPosX -= speed*ez[0]; - camPosY -= speed*ez[1]; - camPosZ -= speed*ez[2]; - } - if (key == GLFW_KEY_RIGHT || key == GLFW_KEY_D) { - camPosX += speed*ex[0]; - camPosY += speed*ex[1]; - camPosZ += speed*ex[2]; - } - if (key == GLFW_KEY_LEFT || key == GLFW_KEY_A ) { - camPosX -= speed*ex[0]; - camPosY -= speed*ex[1]; - camPosZ -= speed*ex[2]; + else if (action == GLFW_RELEASE) { + if (key == GLFW_KEY_SPACE) + upar = false; + if (key == GLFW_KEY_LEFT_CONTROL) + downar = false; + if (key == GLFW_KEY_UP || key == GLFW_KEY_W) { + forwardar = false; + } + if (key == GLFW_KEY_DOWN || key == GLFW_KEY_S ) { + backwardar = false; + } + if (key == GLFW_KEY_RIGHT || key == GLFW_KEY_D) { + rightar = false; + } + if (key == GLFW_KEY_LEFT || key == GLFW_KEY_A ) { + leftar = false; + } } } @@ -256,6 +273,31 @@ int main (){ ey[2] = ex[0] * ez[1] - ex[1] * ez[0]; //crossProduct(ex,ez); + if (upar) + camPosY += speed; + if (downar) + camPosY -= speed; + if (forwardar) { + camPosX += speed*ez[0]; + camPosY += speed*ez[1]; + camPosZ += speed*ez[2]; + } + if (backwardar) { + camPosX -= speed*ez[0]; + camPosY -= speed*ez[1]; + camPosZ -= speed*ez[2]; + } + if (rightar) { + camPosX += speed*ex[0]; + camPosY += speed*ex[1]; + camPosZ += speed*ex[2]; + } + if (leftar) { + camPosX -= speed*ex[0]; + camPosY -= speed*ex[1]; + camPosZ -= speed*ex[2]; + } + currentTime = glfwGetTime(); deltaTime = currentTime - lastFrame; lastFrame = currentTime; From 4574eb9452c84457a31382fc61025267cf6293ce Mon Sep 17 00:00:00 2001 From: MagicTINTIN Date: Tue, 21 Mar 2023 14:06:13 +0100 Subject: [PATCH 2/2] adding scene + zoom less slow --- main.c | 9 ++- shaders/default.fs | 120 +++++++++++++++++++++++++++++++++ shaders/immeublesparisiens.fs | 121 ++++++++++++++++++++++++++++++++++ shaders/quad.fs | 16 ++++- 4 files changed, 261 insertions(+), 5 deletions(-) create mode 100644 shaders/default.fs create mode 100644 shaders/immeublesparisiens.fs diff --git a/main.c b/main.c index 7e27d62..9e43b4a 100644 --- a/main.c +++ b/main.c @@ -7,6 +7,8 @@ #define STB_IMAGE_IMPLEMENTATION #include "./Libraries/stb/stb_image.h" #include "headers/shader.h" + +#define SCENE "shaders/default.fs" #define FULLSCREEN 0 #define EXPERIMENTAL_FEATURES 0 /* ## DEBUG MODE ## @@ -141,10 +143,11 @@ void scroll_callback(GLFWwindow* window, double xoffset, double yoffset) int stateControl = glfwGetKey(window, GLFW_KEY_LEFT_CONTROL); // we only use yoffset as it is present on normal mice - if (DEBUG_MODE % 5 == 0) + if (DEBUG_MODE % 5 == 0) { printf("scroll value : %f | precision : %f | ",yoffset, camPrecision); printf((stateControl == GLFW_PRESS) ? "ctrl -> speed" : "Zooming"); printf("\n"); + } if (stateControl == GLFW_PRESS) { camPrecision += yoffset/2; if (camPrecision <= 1) @@ -219,7 +222,7 @@ int main (){ glBindVertexArray(VAO); // seeing as we only have a single VAO there's no need to unbind in the setupVertexArray function and then bind here, but we'll do so for clarity, organization, and avoiding possible bugs in future GLuint quad_shader = glCreateProgram(); - int compilerInfo=buildShaders(quad_shader, "shaders/generic.vs", "shaders/quad.fs"); + int compilerInfo=buildShaders(quad_shader, "shaders/generic.vs", SCENE); if(compilerInfo>0){ return compilerInfo; } @@ -319,7 +322,7 @@ int main (){ glUniform3f(glGetUniformLocation(quad_shader, "iEy"), ey[0],ey[1],ey[2]); glUniform3f(glGetUniformLocation(quad_shader, "iEz"), ez[0],ez[1],ez[2]); glUniform3f(glGetUniformLocation(quad_shader, "iCamPos"), camPosX,camPosY,camPosZ); - glUniform1f(glGetUniformLocation(quad_shader, "iFovValue"), fovValue*multiplicatorFov); + glUniform1f(glGetUniformLocation(quad_shader, "iFovValue"), fovValue*fovValue*multiplicatorFov); // glBindVertexArray(0); // no need to unbind it every time } diff --git a/shaders/default.fs b/shaders/default.fs new file mode 100644 index 0000000..f05aa1b --- /dev/null +++ b/shaders/default.fs @@ -0,0 +1,120 @@ +#version 330 core + +in vec2 FragCoord; +in float Time; +in vec3 Ex; +in vec3 Ey; +in vec3 Ez; +in vec3 CamPos; +in float fovValue; +in float FacteurLargeur; + +out vec4 FragColor; +//uniform sampler2D generalTexture; + +vec3 rotate(vec3 pos, vec3 angles){ + float ca=cos(angles.x); + float sa=sin(angles.x); + float cb=cos(angles.y); + float sb=sin(angles.y); + float cc=cos(angles.z); + float sc=sin(angles.z); + return vec3(cb*cc*pos.x+(sa*sb*cc-ca*sc)*pos.y+(ca*sb*cc+sa*sc)*pos.z, + cb*sc*pos.x+(sa*sb*sc+ca*cc)*pos.y+(ca*sb*sc-sa*cc)*pos.z, + -sb*pos.x+sa*cb*pos.y+ca*cb*pos.z); +} + +vec3 infinity(vec3 pos,vec3 box){ + return mod(pos+.5*box,box)-.5*box; +} + + +vec3 repeter(vec3 p, float size, vec3 repet) +{ + return p-size*clamp(round(p/size),-repet,repet); +} + +float SDF_Box_Frame( vec3 p, vec3 b, float e ) +{ + p = abs(p )-b; + vec3 q = abs(p+e)-e; + return min(min( + length(max(vec3(p.x,q.y,q.z),0.0))+min(max(p.x,max(q.y,q.z)),0.0), + length(max(vec3(q.x,p.y,q.z),0.0))+min(max(q.x,max(p.y,q.z)),0.0)), + length(max(vec3(q.x,q.y,p.z),0.0))+min(max(q.x,max(q.y,p.z)),0.0)); +} + +float Inflate( float b, float r ) +{ + return b - r; +} + +float SDF_Sphere(vec3 p,float r){ + return length(p)-r; +} + +float SDF_Global(vec3 p){ + return SDF_Sphere(p,.5); + //return max(SDF_Sphere(p,.5),-SDF_Box_Frame(rotate(p,vec3(0.,.2*Time,0.)),vec3(1.,1.,1.),.3));//min(SDF_Box_Frame(p,vec3(.5,.5,.5),0.1),SDF_Circle(mod(p+vec3(.5),vec3(1.,1.,1.))-vec3(.5),.15)); +} + +vec4 Get_Impact(vec3 origin,vec3 dir){//must have length(dir)==1 + vec3 pos=origin; + float dist; + for(int i=0;i<30;i++){ + dist=SDF_Global(pos); + pos+=dist*dir; + if(dist<=.01) return vec4(pos,1.); + if(dist>=20.0) return vec4(pos,-1.); + } + return vec4(pos,-1.); +} + +vec3 grad(vec3 p){ + vec2 epsilon = vec2(.01,0.); + return normalize(vec3(SDF_Global(p+epsilon.xyy)-SDF_Global(p-epsilon.xyy), + SDF_Global(p+epsilon.yxy)-SDF_Global(p-epsilon.yxy), + SDF_Global(p+epsilon.yyx)-SDF_Global(p-epsilon.yyx))); +} + +vec3 Get_Color(vec3 origin,vec3 dir){ + vec4 impact = Get_Impact(origin,dir); + if(impact.w<0.) return (impact.y+1.)*.05*vec3(.5,.7,1.); + vec3 normale=grad(impact.xyz); + vec3 sunPos=vec3(3.,3.5,.5);//vec3(3.*sin(Time*1.5),3.*cos(Time*3.),3.*cos(Time*1.5)); + return vec3(clamp(0.,1.,dot(sunPos-impact.xyz,normale)));//normale; +} + +float Mandel(vec2 co){ + vec2 coo = co.xy; + float limf=100.0; + float cf=0.0; + int c; + for(c=0;c<30;c++){ + coo=vec2(pow(coo.x,2.0)-pow(coo.y,2.0)+co.x,2.*coo.x*coo.y+co.y); + if(length(coo)>=2.0){ + return cf/limf; + } + cf+=1.0; + } + return 0.0; +} + +void main(){ + vec3 lookingAt = vec3(0.); + vec3 posCam = CamPos;//vec3(-3.*sin(Time*.15),.6*cos(Time*.15),3.*cos(Time*.15)); + //vec3 posCam = vec3(-3.*sin(MousePos.x/400)*(1-abs(atan(MousePos.y/500))),2*atan(MousePos.y/300),3.*cos(MousePos.x/400)*(1-abs(atan(MousePos.y/500)))); + //float pan=-MousePos.x/180.; + //float tilt=-MousePos.y/180.; + //tilt=max(min(tilt,3.14*.45),-3.14*.45); + + //vec3 ez = vec3(cos(tilt)*sin(pan),sin(tilt),cos(tilt)*cos(pan));//normalize(lookingAt-posCam);////base orthonormée + //vec3 ex = normalize(cross(ez,vec3(0.,1.,0.))); + //vec3 ey = cross(ex,ez); + + vec3 dir = normalize(FragCoord.x * normalize(Ex) + FragCoord.y * normalize(Ey) + fovValue * Ez); + + + //float c=Mandel(FragCoord*1.5); + FragColor=vec4(Get_Color(posCam,dir),1.);//c,c,c,1.); +} diff --git a/shaders/immeublesparisiens.fs b/shaders/immeublesparisiens.fs new file mode 100644 index 0000000..99ec4f8 --- /dev/null +++ b/shaders/immeublesparisiens.fs @@ -0,0 +1,121 @@ +#version 330 core + +in vec2 FragCoord; +in float Time; +in vec3 Ex; +in vec3 Ey; +in vec3 Ez; +in vec3 CamPos; +in float fovValue; +in float FacteurLargeur; + +out vec4 FragColor; +//uniform sampler2D generalTexture; + +vec3 rotate(vec3 pos, vec3 angles){ + float ca=cos(angles.x); + float sa=sin(angles.x); + float cb=cos(angles.y); + float sb=sin(angles.y); + float cc=cos(angles.z); + float sc=sin(angles.z); + return vec3(cb*cc*pos.x+(sa*sb*cc-ca*sc)*pos.y+(ca*sb*cc+sa*sc)*pos.z, + cb*sc*pos.x+(sa*sb*sc+ca*cc)*pos.y+(ca*sb*sc-sa*cc)*pos.z, + -sb*pos.x+sa*cb*pos.y+ca*cb*pos.z); +} + +vec3 infinity(vec3 pos,vec3 box){ + return mod(pos+.5*box,box)-.5*box; +} + + +vec3 repeter(vec3 p, vec3 size, vec3 repet) +{ + return p-size*clamp(vec3(round(p.x/size.x),round(p.y/size.y),round(p.z/size.z)),-repet,repet); +} + +float SDF_Box_Frame( vec3 p, vec3 b, float e ) +{ + p = abs(p )-b; + vec3 q = abs(p+e)-e; + return min(min( + length(max(vec3(p.x,q.y,q.z),0.0))+min(max(p.x,max(q.y,q.z)),0.0), + length(max(vec3(q.x,p.y,q.z),0.0))+min(max(q.x,max(p.y,q.z)),0.0)), + length(max(vec3(q.x,q.y,p.z),0.0))+min(max(q.x,max(q.y,p.z)),0.0)); +} + +float Inflate( float b, float r ) +{ + return b - r; +} + +float SDF_Sphere(vec3 p,float r){ + return length(p)-r; +} + +float SDF_Global(vec3 p){ + //return SDF_Box_Frame(rotate(p,vec3(0.,.2*Time,0.)),vec3(.5,.5,.5),.1); + //return max(SDF_Sphere(p,.5),-SDF_Box_Frame(rotate(p,vec3(0.,.2*Time,0.)),vec3(1.,1.,1.),.3));//min(SDF_Box_Frame(p,vec3(.5,.5,.5),0.1),SDF_Circle(mod(p+vec3(.5),vec3(1.,1.,1.))-vec3(.5),.15)); + return min(SDF_Box_Frame(repeter(p, vec3(4.,2.,10.), vec3(2., 25., 5.)), vec3(1.,1.,1.),.1),p.y); //infinity(p, vec(0.3, 0.2, 0.5)) +} + +vec4 Get_Impact(vec3 origin,vec3 dir){//must have length(dir)==1 + vec3 pos=origin; + float dist; + for(int i=0;i<30;i++){ + dist=SDF_Global(pos); + pos+=dist*dir; + if(dist<=.01) return vec4(pos,1.); + if(dist>=20.0) return vec4(pos,-1.); + } + return vec4(pos,-1.); +} + +vec3 grad(vec3 p){ + vec2 epsilon = vec2(.01,0.); + return normalize(vec3(SDF_Global(p+epsilon.xyy)-SDF_Global(p-epsilon.xyy), + SDF_Global(p+epsilon.yxy)-SDF_Global(p-epsilon.yxy), + SDF_Global(p+epsilon.yyx)-SDF_Global(p-epsilon.yyx))); +} + +vec3 Get_Color(vec3 origin,vec3 dir){ + vec4 impact = Get_Impact(origin,dir); + if(impact.w<0.) return (impact.y+1.)*.05*vec3(.5,.7,1.); + vec3 normale=grad(impact.xyz); + vec3 sunPos=vec3(3.,3.5,.5);//vec3(3.*sin(Time*1.5),3.*cos(Time*3.),3.*cos(Time*1.5)); + return vec3(clamp(0.,1.,dot(sunPos-impact.xyz,normale)));//normale; +} + +float Mandel(vec2 co){ + vec2 coo = co.xy; + float limf=100.0; + float cf=0.0; + int c; + for(c=0;c<30;c++){ + coo=vec2(pow(coo.x,2.0)-pow(coo.y,2.0)+co.x,2.*coo.x*coo.y+co.y); + if(length(coo)>=2.0){ + return cf/limf; + } + cf+=1.0; + } + return 0.0; +} + +void main(){ + vec3 lookingAt = vec3(0.); + vec3 posCam = CamPos;//vec3(-3.*sin(Time*.15),.6*cos(Time*.15),3.*cos(Time*.15)); + //vec3 posCam = vec3(-3.*sin(MousePos.x/400)*(1-abs(atan(MousePos.y/500))),2*atan(MousePos.y/300),3.*cos(MousePos.x/400)*(1-abs(atan(MousePos.y/500)))); + //float pan=-MousePos.x/180.; + //float tilt=-MousePos.y/180.; + //tilt=max(min(tilt,3.14*.45),-3.14*.45); + + //vec3 ez = vec3(cos(tilt)*sin(pan),sin(tilt),cos(tilt)*cos(pan));//normalize(lookingAt-posCam);////base orthonormée + //vec3 ex = normalize(cross(ez,vec3(0.,1.,0.))); + //vec3 ey = cross(ex,ez); + + vec3 dir = normalize(FragCoord.x * normalize(Ex) + FragCoord.y * normalize(Ey) + fovValue * Ez); + + + //float c=Mandel(FragCoord*1.5); + FragColor=vec4(Get_Color(posCam,dir),1.);//c,c,c,1.); +} diff --git a/shaders/quad.fs b/shaders/quad.fs index ae09765..71cc71f 100644 --- a/shaders/quad.fs +++ b/shaders/quad.fs @@ -28,6 +28,12 @@ vec3 infinity(vec3 pos,vec3 box){ return mod(pos+.5*box,box)-.5*box; } + +vec3 repeter(vec3 p, float size, vec3 repet) +{ + return p-size*clamp(round(p/size),-repet,repet); +} + float SDF_Box_Frame( vec3 p, vec3 b, float e ) { p = abs(p )-b; @@ -38,12 +44,18 @@ float SDF_Box_Frame( vec3 p, vec3 b, float e ) length(max(vec3(q.x,q.y,p.z),0.0))+min(max(q.x,max(q.y,p.z)),0.0)); } -float SDF_Circle(vec3 p,float r){ +float Inflate( float b, float r ) +{ + return b - r; +} + +float SDF_Sphere(vec3 p,float r){ return length(p)-r; } float SDF_Global(vec3 p){ - return SDF_Box_Frame(rotate(p,vec3(0.,.2*Time,0.)),vec3(.5,.5,.5),.1);//min(SDF_Box_Frame(p,vec3(.5,.5,.5),0.1),SDF_Circle(mod(p+vec3(.5),vec3(1.,1.,1.))-vec3(.5),.15)); + return SDF_Box_Frame(rotate(p,vec3(0.,.2*Time,0.)),vec3(.5,.5,.5),.1); + //return max(SDF_Sphere(p,.5),-SDF_Box_Frame(rotate(p,vec3(0.,.2*Time,0.)),vec3(1.,1.,1.),.3));//min(SDF_Box_Frame(p,vec3(.5,.5,.5),0.1),SDF_Circle(mod(p+vec3(.5),vec3(1.,1.,1.))-vec3(.5),.15)); } vec4 Get_Impact(vec3 origin,vec3 dir){//must have length(dir)==1