
#include "Tscene.h"

static size_t idx_zone = 0;
static size_t idx_deco = 0;
static size_t idx_perso = 0;
static size_t idx_objet = 0;
//static size_t idx_tree = 0;
//static size_t idx_flag_med = 0;
//static size_t idx_flag_low = 0;
static size_t idx_meca = 0;
static size_t idx_billboard = 0;
static size_t idx_light = 0;

void Tscene::load()
{
    load_init();
    load_site();
    load_end();
}

void Tscene::load_init()
{
    zone.clear();
    deco.clear();
	perso.clear();
    objet.clear();

    //tree.clear();
    meca.clear();
    // fontaine
    // bassin
    billboard.clear();
    torche.clear();
    //flag_med.clear();
    //flag_low.clear();
    // barrel_pbr
    // grass1 grass2 tree1 wood1 fire1

    //ref_object.clear();
}

void Tscene::load_end()
{
    camera.setPos(50,-350,70);
    camera.setAngleH(100);
    camera.setAngleV(-20);

    // passage aux shaders de la lumiere ambiente
    light_init(12.0f);
}

void Tscene::load_site()
{
    // ---
    // --- les quatre sols (iles)
    // ---

    // >> les objets ont été créés dans leur position finale
    zone.push_back(Tzone());
    zone[idx_zone].create("no.obj / 0 0 0 1 / 25 msq_00.png sable_512.png sable_512_n.png /");
    idx_zone++;

    zone.push_back(Tzone());
    zone[idx_zone].create("ne.obj / 0 0 0 1 / 25 msq_ne.png sable_512.png sable_512_n.png terre_512.png terre_512_n.png herbe_rare_512.png herbe_rare_512_n.png /");
    idx_zone++;

    zone.push_back(Tzone());
    zone[idx_zone].create("so.obj / 0 0 0 1 / 25 msq_00.png sable_512.png sable_512_n.png /");
    idx_zone++;

    zone.push_back(Tzone());
    //zone[idx_zone].create("se.obj / 0 0 0 1 / 16 msq_00.png sable_512.png sable_512_n.png /");
    zone[idx_zone].create("se.obj / 0 0 0 1 / 25 msq_se.png sable_512.png sable_512_n.png terre_512.png terre_512_n.png herbe_rare_512.png herbe_rare_512_n.png /");
    idx_zone++;

    // on remplace le sol de skyEarth par un plan d'eau
    // il s'agit d'un masque lointain > on ne recouvre pas les iles
    skyEarth.floor.setFloor("donnees/mesh/zone/sea.obj", 10000.0f, 10000.0f, 5000.0f);

    // ---
    // --- les plans d'eau lake
    // ---

    int size;
    float scale_uv;

    size = 1024;
    scale_uv = 1.0f; // modifie beaucoup l'aspect > 4.0 = les vaguelettes (ripples) ne sont plus visibles de loin
    lake3d_low.create(size, scale_uv);

    size = 1024;
    scale_uv = 16.0f;
    lake3d_med.create(size, scale_uv);

    // avec forme définie
    //lake3d_hig.create("donnees/mesh/eau_00.obj");

    // ---
    // --- plan d'eau sea
    // ---

    //
    size = 1024;
    scale_uv = (1.0f / (float)size) * 50.0f; // vue lointaine
    sea3d_low.create(size, scale_uv);


    // ---

    deco.push_back(Tdeco());
    deco[idx_deco].create("0000 deco/ chalutier_01.obj 1 / 0 0 0 0 0 0 1 1 1 /");
    idx_deco++;

    // ------------
    // --- iles ---
    // ------------

    m_mode_interface = ISLE_NO; // vide
    load_ile_se();
    load_ile_so();
    load_ile_ne();

}


// perso / fontaines / drapeaux
void Tscene::load_ile_se()
{
    perso.push_back(Tperso());
    perso[idx_perso].create("barbarian perso/ Barbarian.glb 1 / 88.4 -80 2.0 0 0 -90 1 1 1 /");
    idx_perso++;

    perso.push_back(Tperso());
    perso[idx_perso].create("skeleton_warrior perso/ Skeleton_Warrior.glb 1 / 86.0 -80.0 2.0 0 0 -90 1 1 1 /");
    idx_perso++;

    //
    m_perso_en_cours = 1;
    rbtPerso.setChecked(m_perso_en_cours);
    interface_init_lst_anim(1);

    // ---

    //objet.push_back(Tobjet());
    // attention : blender 4.1 efface la valeur emissive > corriger le fichier mtl
    //objet[idx_objet].create("cube / 70 -80 2.5 0 0 0 1 / null 1 0");
    //idx_objet++;
    deco.push_back(Tdeco());
    deco[idx_deco].create("cube deco/ cube.obj 1 / 70 -80 2.5 0 0 0 1 1 1 /");
    idx_deco++;

    objet.push_back(Tobjet());
    objet[idx_objet].create("orbe / 69 -80 2.5 0 0 0 1 / null 1 0");
    idx_objet++;

    // ---

    // squeleton hat
    objet.push_back(Tobjet());

    objet[idx_objet].create("cas_03 / 85.0 -85 2.3 0 0 0 1 / null 1 0");
    ref_object.push_back(idx_objet);
    idx_objet++;

    // barbarian hat
    objet.push_back(Tobjet());
    objet[idx_objet].create("cas_00 / 87 -85 2.3 0 0 0 1 / null 1 0");
    ref_object.push_back(idx_objet);
    idx_objet++;

    // shield common
    objet.push_back(Tobjet());
    objet[idx_objet].create("bou_00 / 89 -85 2.3 0 0 0 1 / null 1 0");
    ref_object.push_back(idx_objet);
    idx_objet++;

    // sword common
    objet.push_back(Tobjet());
    objet[idx_objet].create("arm_25 / 91 -85 2.3 0 0 0 1 / null 1 0");
    ref_object.push_back(idx_objet);
    idx_objet++;

    // ---

    fontaine.create("f0001 fontaine_0/ fontaine_a.obj 1 / 75 -100 2 0 0 0 1 1 1 /");
        fontaine.addDetecteur("f0001 / 75 -100 2 25 / 2 null / fontaine_0/fontaine_0.wav 99");
        fontaine.addEau("fontaine_b.obj / 0.48 0.28"); // ripple sud
        //fontaine.addEau("fontaine_b.obj / 0.8 0.5"); // ripple est
        fontaine.addJet("jet0 donnees/mesh/fontaine_0/ prt_eau.png 0 0 32 32 / 1000 10 9999 / -5 5 270 285 / 0.1 0.5 / 0.02 0 0 0 / 0.01 0.03 1 1.5 / 1 1 1 0.5 1 1 1 0.5 / 0.9 -0.1 0 /");

    //effet de pluie
    bassin.create("0000 deco/ bassin.obj 1 / 77 -104 2 0 0 0 1 1 1 /");
        bassin.addEau("eau_bassin.obj");

    // ---

    // voici la source d'un mvt de drapeau
    //code path file / 0 0 0 0 0 0 1 / decal.xyz / width height colnb rownb texure /
    //flag_med.create("0000 deco/ mat_00.obj / 60 -92 2 0 0 0 1 / 0.04 0 4.5 / 1.4 1.0 14 10 flag_00.png");
    //flag_med.create("0000 deco/ mat_00.obj / 60 -92 2 0 0 0 1 / 0.04 0 4.5 / 1.4 1.0 14 10 flag_01.png");
    flag_med.create("0000 deco/ mat_00.obj / 60 -92 2 0 0 0 1 / 0.04 0 4.5 / 1.4 1.0 14 10 flag_02.png");
    // faire pour toutes les instances :
        flag_med.setWind(20.0f, 300.0f);
    //idx_flag_med++;

    //code path file / 0 0 0 0 0 0 1 / decal.xyz / width height colnb rownb texure texBump /
    flag_low.create("code deco/ mat_01.obj / 60 -95 2 0 0 0 1 / 0.04 0 2.0 / 1.4 1.0 7 5 flag_03.png /");
        flag_low.addModel("62 -95 2 0 0 0 1");
        flag_low.addModel("64 -95 2 0 0 0 1");
        // faire pour toutes les instances :
        flag_low.setWind(5.0f, 300.0f);
        //flag_low.setWind(20.0f, 300.0f);
    //idx_flag_low++;


    // s'il y a des erreurs de placement :
    // definir le point d'origine ( point orangé sous blender)
    // appliquer les transformations (c'est à dire translation rotation scale)
    barrel.create("0000 deco/ Beer_Barrel.gltf 1 / 94 -80 2.0 0 0 0");

}

// meca
void Tscene::load_ile_so()
{
    m_meca_en_cours = -1;

    deco.push_back(Tdeco());
    deco[idx_deco].create("0000 deco/ wall.obj 1 / -95 -95 2 0 0 90 1 1 1 /");
    idx_deco++;

    // flamme sur le mur
    billboard.push_back(OBillboard());
        billboard[idx_billboard].create("donnees/image/ feu.png / 0 0 32 96 1 1 / 1 1 1 1 / 14 99 4 1 0 / 1 -95 -94 6.05 0.5 1.5 /");
    idx_billboard++;

    fire1.create("fire donnees/image/ / -95 -96 6.05 1.0 1.5 / fire_0.png f_noise_1.png alpha.png /");
        fire1.addModel(-95, -95, 6.05, 1.5, 2.0);

    // l'utilisation des obj (en lieu et place des gltf) simplifie le positionnement
    // sinon il faut penser à appliquer les transformations pour un bon positionnement de l'objet
    torche.push_back(Ttorche());
    torche[idx_light].create("t0000 deco/ torche.obj 1 / -94.5 -95 5 0 0 0 1 1 1 /");
        torche[idx_light].addParticle();   // defaut
        // path sphere.obj / decal.xyz decalRot.xyz / ambient color.rgb / radius cutoff / state
        torche[idx_light].addLight("deco/ sphere_1.obj / 0.5 0 0.3 0 0 0 / 0.85 0.9 0.9 0.4 / 5 0.5 / 2 /");
    idx_light++;

/*
    les meca obj sont simples à mettre en oeuvre, pas besoin de recréer une animation pour chaque coffre par exemple,
    la même pourra être utilisée. Le son est joué automatiquent (par appel dans Mcycle) >
    1)  ouvrez un fichier txt, copier-coller la séquence d'animation, changez les noms (éventuellement),
        vérifier le décalage de position, terminez par 'end'
    2)  ajoutez les materials (mtl) des objets, terminez par 'end' (conservez le fichier obj-mtl original)
    3)  indiquez le code 'obj' suivit du nom de l'objet (idem celui de l'animation), ajouter les données des objets (v vn vt f);
        ajoutez les autres parties avec le code 'obj',
        terminez par 'end'
*/
    meca.push_back(Tmeca());
    meca[idx_meca].create("cof100 meca/ chest_common.txt 0 / -90 -100 2 0 0 0 / 1 aucune_action");
    idx_meca++;

    // wall -95 -95
    meca.push_back(Tmeca());
    meca[idx_meca].create("por100 meca/ door_common.txt 1 / -95 -104 2 0 0 0 / 1 aucune_action");
    idx_meca++;

    meca.push_back(Tmeca());
    meca[idx_meca].create("mou100 meca/ moulin.txt 1 / -110 -100 2 0 0 0 / 1 aucune_action");
    idx_meca++;

    torche.push_back(Ttorche());
    // sur moulin -110 + 1.3 / -100 + 0 / z +1.2
    torche[idx_light].create("t0001 deco/ reverbere.obj 0 / -108.9 -100 3.2 0 0 0 1 1 1 /");
        torche[idx_light].addLight("deco/ cone_0.obj / 0 0 -0.1 0 0 0 / 0.87 0.9 0.95 0.5 / 1 0.1 / 2 /");
    idx_light++;

}

// vegetal
void Tscene::load_ile_ne()
{
    // ---
    // grass_geo > par geometry shader / grass_ins par instanciation (plus performant)

    grass_geo.create("grass donnees/image/ herbe_ne.bin / herbe_0.png 0.5 / herbe_2.png 0.5 / null 0 /");
    // on double la vue car on regarde de loin
    grass_geo.shGrass.setLod(30.0f, 50.0f, 70.0f);

    grass_ins.create("grass donnees/image/ herbe_ne.bin / herbe_0.png 0.5 / herbe_1.png 1.0 / herbe_2.png 0.5 /");

    // ---
    // tree > model = moins de calcul / limité en nombre (quelques centaines)
    // wood > pos+rot+scale = il faut calculer la matrice model à chaque fois / très grand nombre d'instance

/*
    si deque
    tree.push_back(OTree1());
    tree[idx_tree].create("0000 deco/ palmier.obj 1 / 91 149.5 1.8 0 0 40 1 /");
         tree[idx_tree].addModel("85 152.8 1.8 0 0 0 0.7");
         tree[idx_tree].addModel("89 147.6 1.5 -10 20 200 0.5");

         tree[idx_tree].addModel("64.5 159.5 2 0 10 0 0.7"); tree[idx_tree].addModel("69.5 158.6 2 0 0 -20 1.2");
         tree[idx_tree].addModel("65.8 162.7 2 0 20 0 1");   tree[idx_tree].addModel("71.3 164.2 2 0 -20 0 1.5");
         tree[idx_tree].addModel("79.3 161.4 2 20 0 0 1.2"); tree[idx_tree].addModel("86.4 158.2 2 -20 0 0 1");
    idx_tree++;
*/

    tree.create("0000 deco/ palmier.obj 1 / 91 149.5 1.8 0 0 40 1 /");
         tree.addModel("85 152.8 1.8 0 0 0 0.7");
         tree.addModel("89 147.6 1.5 -10 20 200 0.5");

         tree.addModel("64.5 159.5 2 0 10 0 0.7"); tree.addModel("69.5 158.6 2 0 0 -20 1.2");
         tree.addModel("65.8 162.7 2 0 20 0 1");   tree.addModel("71.3 164.2 2 0 -20 0 1.5");
         tree.addModel("79.3 161.4 2 20 0 0 1.2"); tree.addModel("86.4 158.2 2 -20 0 0 1");

    wood.create("000 deco/ Pine_3.obj 1 / donnees/image/wood_0.txt / ");

}


