Add transition between 2 scene of a rotating cube
This commit is contained in:
parent
2d97b7a304
commit
a2b6cbe0c3
10 changed files with 301 additions and 18 deletions
|
@ -3,7 +3,16 @@
|
|||
|
||||
#include <GL4D/gl4dh.h>
|
||||
|
||||
// Comportement avant de lancer les animations
|
||||
void initialisationAnimation(void);
|
||||
// Dimensions initiales de la fenêtre
|
||||
extern int dimensions[];
|
||||
|
||||
// Cube coloré qui tourne sur lui-même
|
||||
void cube(int);
|
||||
|
||||
// Cube2 coloré qui tourne sur lui-même
|
||||
void cube2(int);
|
||||
|
||||
// Effet de transition en fondu
|
||||
void fondu(void (*)(int), void (*)(int), Uint32, Uint32, int);
|
||||
|
||||
#endif
|
||||
|
|
10
shaders/cube.fs
Normal file
10
shaders/cube.fs
Normal file
|
@ -0,0 +1,10 @@
|
|||
#version 330
|
||||
|
||||
in vec4 vsoColor;
|
||||
out vec4 maSortie;
|
||||
|
||||
in float il;
|
||||
|
||||
void main() {
|
||||
maSortie = il * vsoColor;
|
||||
}
|
23
shaders/cube.vs
Normal file
23
shaders/cube.vs
Normal file
|
@ -0,0 +1,23 @@
|
|||
#version 330
|
||||
|
||||
layout(location = 0) in vec3 position;
|
||||
layout(location = 1) in vec3 normal;
|
||||
layout(location = 2) in vec2 texCoord;
|
||||
|
||||
uniform mat4 proj;
|
||||
uniform mat4 modview;
|
||||
uniform mat4 view;
|
||||
|
||||
out vec4 vsoColor;
|
||||
out float il;
|
||||
const vec3 Ld = vec3(0., -.707, -.707);
|
||||
|
||||
|
||||
void main() {
|
||||
vec3 n = (transpose(inverse(modview)) * vec4(normal, 0.0)).xyz;
|
||||
il = clamp(dot(n, -Ld), 0.0, 1.0);
|
||||
|
||||
gl_Position = proj * view * modview * vec4(position, 1.);
|
||||
|
||||
vsoColor = vec4(texCoord, 0.5, 1);
|
||||
}
|
12
shaders/fondu.fs
Normal file
12
shaders/fondu.fs
Normal file
|
@ -0,0 +1,12 @@
|
|||
#version 330
|
||||
|
||||
uniform float delta_temps;
|
||||
uniform sampler2D tex0;
|
||||
uniform sampler2D tex1;
|
||||
|
||||
in vec2 vsoTexCoord;
|
||||
out vec4 fragColor;
|
||||
|
||||
void main(void) {
|
||||
fragColor = mix(texture(tex0, vsoTexCoord), texture(tex1, vsoTexCoord), delta_temps);
|
||||
}
|
12
shaders/fondu.vs
Normal file
12
shaders/fondu.vs
Normal file
|
@ -0,0 +1,12 @@
|
|||
#version 330
|
||||
|
||||
layout (location = 0) in vec3 vsiPosition;
|
||||
layout (location = 1) in vec3 vsiNormal;
|
||||
layout (location = 2) in vec2 vsiTexCoord;
|
||||
|
||||
out vec2 vsoTexCoord;
|
||||
|
||||
void main(void) {
|
||||
gl_Position = vec4(vsiPosition, 1.0);
|
||||
vsoTexCoord = vec2(vsiTexCoord.s, vsiTexCoord.t);
|
||||
}
|
|
@ -1,5 +0,0 @@
|
|||
#include "../includes/animations.h"
|
||||
|
||||
void initialisationAnimation(void) {
|
||||
/* ... */
|
||||
}
|
74
src/cube.c
Normal file
74
src/cube.c
Normal file
|
@ -0,0 +1,74 @@
|
|||
#include "../includes/animations.h"
|
||||
|
||||
void cube(int etat) {
|
||||
static GLuint cube = 0, proc_id = 0;
|
||||
|
||||
static GLclampf r = 0,
|
||||
g = 0,
|
||||
b = 0;
|
||||
|
||||
switch(etat) {
|
||||
case GL4DH_INIT:
|
||||
r = (rand() / (float)(RAND_MAX)) * 1.f;
|
||||
g = (rand() / (float)(RAND_MAX)) * 1.f;
|
||||
b = (rand() / (float)(RAND_MAX)) * 1.f;
|
||||
|
||||
cube = gl4dgGenCubef();
|
||||
proc_id = gl4duCreateProgram("<vs>shaders/cube.vs", "<fs>shaders/cube.fs", NULL);
|
||||
|
||||
gl4duGenMatrix(GL_FLOAT, "modview");
|
||||
gl4duGenMatrix(GL_FLOAT, "view");
|
||||
gl4duGenMatrix(GL_FLOAT, "proj");
|
||||
|
||||
gl4duBindMatrix("proj");
|
||||
|
||||
gl4duLoadIdentityf();
|
||||
|
||||
gl4duFrustumf(-1, 1, -1, 1, 1, 1000);
|
||||
|
||||
// resize
|
||||
GLfloat ratio_inverse;
|
||||
GLuint fenetre_largeur = dimensions[0], fenetre_hauteur = dimensions[1];
|
||||
glViewport(0, 0, fenetre_largeur, fenetre_hauteur);
|
||||
ratio_inverse = fenetre_hauteur / (GLfloat)fenetre_largeur;
|
||||
gl4duBindMatrix("proj");
|
||||
gl4duLoadIdentityf();
|
||||
gl4duFrustumf(-1.f, 1.f, -1.f * ratio_inverse, 1.f * ratio_inverse, 1.f, 1000.f);
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
break;
|
||||
|
||||
case GL4DH_UPDATE_WITH_AUDIO:
|
||||
break;
|
||||
|
||||
case GL4DH_DRAW:
|
||||
glClearColor(r, g, b, 1.f);
|
||||
static GLfloat cube_rotation = 0;
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
glUseProgram(proc_id);
|
||||
|
||||
gl4duBindMatrix("view");
|
||||
gl4duLoadIdentityf();
|
||||
gl4duLookAtf(0, 0, 5, 0, 0, 0, 0, 1, 0);
|
||||
|
||||
gl4duBindMatrix("modview");
|
||||
gl4duLoadIdentityf();
|
||||
|
||||
gl4duPushMatrix();
|
||||
gl4duRotatef(cube_rotation, 0, 1, 0);
|
||||
gl4duSendMatrices();
|
||||
gl4dgDraw(cube);
|
||||
gl4duPopMatrix();
|
||||
|
||||
glUseProgram(0);
|
||||
|
||||
++cube_rotation;
|
||||
break;
|
||||
|
||||
case GL4DH_FREE:
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
74
src/cube2.c
Normal file
74
src/cube2.c
Normal file
|
@ -0,0 +1,74 @@
|
|||
#include "../includes/animations.h"
|
||||
|
||||
void cube2(int etat) {
|
||||
static GLuint cube = 0, proc_id = 0;
|
||||
|
||||
static GLclampf r = 0,
|
||||
g = 0,
|
||||
b = 0;
|
||||
|
||||
switch(etat) {
|
||||
case GL4DH_INIT:
|
||||
r = (rand() / (float)(RAND_MAX)) * 1.f;
|
||||
g = (rand() / (float)(RAND_MAX)) * 1.f;
|
||||
b = (rand() / (float)(RAND_MAX)) * 1.f;
|
||||
|
||||
cube = gl4dgGenCubef();
|
||||
proc_id = gl4duCreateProgram("<vs>shaders/cube.vs", "<fs>shaders/cube.fs", NULL);
|
||||
|
||||
gl4duGenMatrix(GL_FLOAT, "modview");
|
||||
gl4duGenMatrix(GL_FLOAT, "view");
|
||||
gl4duGenMatrix(GL_FLOAT, "proj");
|
||||
|
||||
gl4duBindMatrix("proj");
|
||||
|
||||
gl4duLoadIdentityf();
|
||||
|
||||
gl4duFrustumf(-1, 1, -1, 1, 1, 1000);
|
||||
|
||||
// resize
|
||||
GLfloat ratio_inverse;
|
||||
GLuint fenetre_largeur = dimensions[0], fenetre_hauteur = dimensions[1];
|
||||
glViewport(0, 0, fenetre_largeur, fenetre_hauteur);
|
||||
ratio_inverse = fenetre_hauteur / (GLfloat)fenetre_largeur;
|
||||
gl4duBindMatrix("proj");
|
||||
gl4duLoadIdentityf();
|
||||
gl4duFrustumf(-1.f, 1.f, -1.f * ratio_inverse, 1.f * ratio_inverse, 1.f, 1000.f);
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
break;
|
||||
|
||||
case GL4DH_UPDATE_WITH_AUDIO:
|
||||
break;
|
||||
|
||||
case GL4DH_DRAW:
|
||||
glClearColor(r, g, b, 1.f);
|
||||
static GLfloat cube_rotation = 0;
|
||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||
glUseProgram(proc_id);
|
||||
|
||||
gl4duBindMatrix("view");
|
||||
gl4duLoadIdentityf();
|
||||
gl4duLookAtf(0, 0, 5, 0, 0, 0, 0, 1, 0);
|
||||
|
||||
gl4duBindMatrix("modview");
|
||||
gl4duLoadIdentityf();
|
||||
|
||||
gl4duPushMatrix();
|
||||
gl4duRotatef(cube_rotation, 0, 1, 0);
|
||||
gl4duSendMatrices();
|
||||
gl4dgDraw(cube);
|
||||
gl4duPopMatrix();
|
||||
|
||||
glUseProgram(0);
|
||||
|
||||
++cube_rotation;
|
||||
break;
|
||||
|
||||
case GL4DH_FREE:
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
79
src/fondu.c
Normal file
79
src/fondu.c
Normal file
|
@ -0,0 +1,79 @@
|
|||
#include "../includes/animations.h"
|
||||
|
||||
/* Fondu de Farès BELHADJ */
|
||||
|
||||
void fondu(void (* ancienne_anim)(int), void (* nouvelle_anim)(int), Uint32 temps_total, Uint32 temps_ecoule, int etat) {
|
||||
GLint viewport[4];
|
||||
GLint tex_id = 0;
|
||||
static GLuint ecran[2], proc_id = 0, quad = 0;
|
||||
|
||||
switch(etat) {
|
||||
case GL4DH_INIT:
|
||||
quad = gl4dgGenQuadf();
|
||||
|
||||
glGetIntegerv(GL_VIEWPORT, viewport);
|
||||
|
||||
glGenTextures(2, ecran);
|
||||
for(int i = 0; i < 2; ++i) {
|
||||
glBindTexture(GL_TEXTURE_2D, ecran[i]);
|
||||
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
|
||||
|
||||
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, viewport[2], viewport[3], 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||
}
|
||||
|
||||
proc_id = gl4duCreateProgram("<vs>shaders/fondu.vs", "<fs>shaders/fondu.fs", NULL);
|
||||
break;
|
||||
|
||||
case GL4DH_UPDATE_WITH_AUDIO:
|
||||
break;
|
||||
|
||||
case GL4DH_DRAW:
|
||||
// Récupération ID texture
|
||||
glGetFramebufferAttachmentParameteriv(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &tex_id);
|
||||
|
||||
// Dessine les deux animations
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ecran[0], 0);
|
||||
if(ancienne_anim) {
|
||||
ancienne_anim(etat);
|
||||
}
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, ecran[1], 0);
|
||||
if(nouvelle_anim) {
|
||||
nouvelle_anim(etat);
|
||||
}
|
||||
|
||||
// Mix des deux écrans
|
||||
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex_id, 0);
|
||||
glDisable(GL_DEPTH);
|
||||
glUseProgram(proc_id);
|
||||
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, ecran[0]);
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, ecran[1]);
|
||||
|
||||
glUniform1f(glGetUniformLocation(proc_id, "delta_temps"), temps_ecoule / (GLfloat)temps_total);
|
||||
glUniform1i(glGetUniformLocation(proc_id, "tex0"), 0);
|
||||
glUniform1i(glGetUniformLocation(proc_id, "tex1"), 1);
|
||||
gl4dgDraw(quad);
|
||||
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, 0);
|
||||
break;
|
||||
|
||||
case GL4DH_FREE:
|
||||
if(ecran[0] || ecran[1]) {
|
||||
glDeleteTextures(2, ecran);
|
||||
ecran[0] = ecran[1] = 0;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
15
window.c
15
window.c
|
@ -2,25 +2,24 @@
|
|||
|
||||
#include "includes/animations.h"
|
||||
|
||||
// Dimensions initiales de la fenêtre
|
||||
static int dimensions[] = {1280, 720};
|
||||
int dimensions[] = {1280, 720};
|
||||
|
||||
// Animations
|
||||
static GL4DHanime animations[] = {
|
||||
{ 5000, cube, NULL, NULL },
|
||||
{ 2500, cube, cube2, fondu },
|
||||
{ 5000, cube2, NULL, NULL },
|
||||
{ 0, NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
// Comportement à la fermeture du programme
|
||||
static void fermeture(void);
|
||||
|
||||
// Comportement au démarrage du programme
|
||||
void initialisation(void);
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
if(!gl4duwCreateWindow(argc, argv, "Démo Anri KENNEL", 10, 10, dimensions[0], dimensions[1], GL4DW_SHOWN)) {
|
||||
return 1;
|
||||
}
|
||||
initialisation();
|
||||
gl4dhInit(animations, dimensions[0], dimensions[1], NULL);
|
||||
atexit(fermeture);
|
||||
|
||||
gl4duwDisplayFunc(gl4dhDraw);
|
||||
|
@ -29,10 +28,6 @@ int main(int argc, char *argv[]) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
void initialisation(void) {
|
||||
gl4dhInit(animations, dimensions[0], dimensions[1], initialisationAnimation);
|
||||
}
|
||||
|
||||
void fermeture(void) {
|
||||
gl4duClean(GL4DU_ALL);
|
||||
}
|
||||
|
|
Reference in a new issue