class AnimSys {
constructor(fps, frame_limit, onions_tint, initial_frame_nb){
this.fps = fps;
this.frame_limit = frame_limit;
this.onions_tint = onions_tint;
this.initial_frame_nb = initial_frame_nb;
this.framesList = [];
this.frameGraphics = createGraphics(width, height);
this.onionGraphics = createGraphics(width, height);
this.UI = createDiv('');
this.UI.id('ui-container');
this.createFrame_btn = createButton('');
this.createFrame_btn.mousePressed(this.create_new_frame.bind(this))
.attribute('title', 'Create new virgin frame');
//this.createFrame_btn.parent(this.UI);
this.createFrame_btn.parent('right-panel');
this.show_onion_btn = createButton('');
this.show_onion_btn.mousePressed(this.switch_onions.bind(this))
.attribute('title', 'Show onions');
//this.show_onion_btn.parent(this.UI);
this.show_onion_btn.parent('right-panel');
this.hide_onion_btn = createButton('').hide();
this.hide_onion_btn.id('hide-onion-btn');
this.hide_onion_btn.mousePressed(this.switch_onions.bind(this))
.attribute('title', 'Hide onions');
//this.hide_onion_btn.parent(this.UI);
this.hide_onion_btn.parent('right-panel');
this.clear_frame_btn = createButton('');
this.clear_frame_btn.mousePressed(this.clear_frame.bind(this))
.attribute('title', 'Clear the canvas');
//this.clear_frame_btn.parent(this.UI);
this.clear_frame_btn.parent('left-panel');
this.play_btn = createButton('');
this.play_btn.id('play-btn');
this.play_btn.mousePressed(this.play_anim.bind(this))
.attribute('title', 'Play animation');
//this.play_btn.parent(this.UI);
this.play_btn.parent('right-panel');
this.stop_btn = createButton('').hide();
this.stop_btn.id('stop-btn');
this.stop_btn.mousePressed(this.play_anim.bind(this))
.attribute('title', 'Pause animation');
//this.stop_btn.parent(this.UI);
this.stop_btn.parent('right-panel');
this.timeline = createDiv('timeline');
this.timeline.id('timeline');
this.timeline.parent('timeline-ctn');
this.frame_displayed = 0;
this.isPlaying = false;
this.play_interval = null;
this.showOnions = false;
}
// -----------------------------------------
// -----------------------------------------
update_frame_list(){
//flush timeline elements
this.timeline.html('');
//insert frames + new one in timeline
for (let [i,frame] of this.framesList.entries()){
let frameDiv = createDiv(i+1);
frameDiv.id('frame-number-' + i);
frameDiv.class('aframe');
frameDiv.parent(this.timeline);
frameDiv.mousePressed( () =>{
this.display_frame(i);
})
redraw();
}
}
// -----------------------------------------
// -----------------------------------------
create_new_frame(data){
if(this.framesList.length == this.frame_limit){
console.warn('you cannot create more than ' + this.frame_limit + ' frames for this project')
} else {
let image64;
let diff64;
if(data){
image64 = data.image64;
} else {
this.frameGraphics.clear();
this.frameGraphics.loadPixels();
image64 = this.frameGraphics.canvas.toDataURL('image/png');
}
let new_frame = {
"img_data": image64,
"diffused_data": diff64
};
this.framesList.push(new_frame);
this.update_frame_list();
if(this.framesList.length > 0){
this.frame_displayed = this.framesList.length -1;
}
this.display_frame(this.frame_displayed);
}
}
// -----------------------------------------
// -----------------------------------------
display_frame(frame_index){
if(this.isPlaying == true){
if(frame_index == this.framesList.length - 1){
frame_index = 0;
} else {
frame_index++;
}
}
this.frame_displayed = frame_index;
let getAllDiv = document.querySelectorAll('.aframe');
getAllDiv.forEach(aframe => {
aframe.classList.remove('current-frame');
});
let getDiv = select('#frame-number-' + this.frame_displayed);
getDiv.addClass('current-frame');
if(this.framesList[frame_index].img_data !== undefined){
let display = loadImage(this.framesList[frame_index].img_data, function(){
this.frameGraphics.clear();
this.frameGraphics.image(display, 0, 0);
}.bind(this));
}
if(grAPI !== undefined && grAPI.show_diffused == true){
grAPI.diffusedGraphics.clear();
if(this.framesList[frame_index].diffused_data !== undefined ){
let diff_data = this.framesList[this.frame_displayed].diffused_data;
grAPI.diffusedGraphics.image(diff_data, 0, 0);
}
}
//redraw();
// ONIONS À TRAITER DANS UNE FUNCTION À PART POUR + D'EFFICACITÉ
if( (this.isPlaying == false && this.showOnions == true) || (this.isPlaying == true && this.showOnions == true) ){
let onion_index;
if (frame_index == 0){
onion_index = this.framesList.length - 1;
} else {
onion_index = frame_index - 1;
}
let displayOnions = loadImage(this.framesList[onion_index].img_data, function(){
this.onionGraphics.clear();
this.onionGraphics.tint(255, this.onions_tint);
this.onionGraphics.image(displayOnions, 0, 0);
}.bind(this));
}
setTimeout(redraw, 10)
}
// -----------------------------------------
// -----------------------------------------
update_frame(){
this.frameGraphics.loadPixels();
let image64 = this.frameGraphics.canvas.toDataURL('image/png');
let data = {"image64": image64}
if(this.framesList.length == 0){
this.create_new_frame(data);
} else {
this.framesList[this.frame_displayed].img_data = image64;
}
setTimeout(redraw, 10)
}
// -----------------------------------------
// -----------------------------------------
clear_frame(){
// add here all the graphics layer you need to clear
grAPI.diffusedGraphics.clear();
this.framesList[this.frame_displayed].diffused_data = undefined;
this.frameGraphics.clear();
this.update_frame();
//redraw();
}
// -----------------------------------------
// -----------------------------------------
switch_onions(){
if(this.showOnions == false){
this.showOnions = true;
this.show_onion_btn.hide();
this.hide_onion_btn.show();
} else {
this.showOnions = false;
this.hide_onion_btn.hide();
this.show_onion_btn.show();
}
if(this.framesList.length != 0){
setTimeout(function(){
this.display_frame(this.frame_displayed)
}.bind(this), 10);
}
}
// -----------------------------------------
// -----------------------------------------
play_anim(){
if(this.framesList.length > 0){
if (this.isPlaying == false){
if(this.showOnions == true){
this.switch_onions();
}
this.isPlaying = true;
this.play_interval = setInterval(function(){
this.display_frame(this.frame_displayed)
}.bind(this), 1000/this.fps);
this.play_btn.hide();
this.stop_btn.show();
} else {
clearInterval(this.play_interval);
this.isPlaying = false;
this.stop_btn.hide();
this.play_btn.show();
}
} else {
console.log("Create a first capture before playing")
}
}
}