//---------------------------------------------------------------------------


#pragma hdrstop

#include "paralelepipedo.h"

//---------------------------------------------------------------------------

#pragma package(smart_init)

paralelepipedo::paralelepipedo(cWorld *mundo, float densidade, float largura, float altura, float profundidade) :
         objetoDinamico(mundo,densidade*largura*altura*profundidade,false) {

        _densidade = densidade;
        _largura = largura;
        _altura  = altura;
        _profundidade = profundidade;

        // cria vertices
        criaParalelepipedo();

        // inicializa propriedades do objeto dinamico
        inicializa();

        double m = _densidade*_largura*_altura*_profundidade;

        // define matriz de inercia
        double Ixx=m*(_altura*_altura + _profundidade*_profundidade); //3.0;
        double Iyy=m*(_largura*_largura + _profundidade*_profundidade); //3.0;
        double Izz=m*(_largura*_largura + _altura*_altura); //3.0;

        matrizInercia.set(Ixx,0,0,
                          0,Iyy,0,
                          0,0,Izz);
        matrizInercia.invert();

}

void paralelepipedo::criaParalelepipedo() {

    // cria um mesh e liga o mesh aa cena

    float dx=0,dy=0,dz=0;

    // face dianteira
    int p1 = newVertex(-0.5*_largura+dx, -0.5*_altura+dy, 0.5*_profundidade+dz);
    int p2 = newVertex( 0.5*_largura+dx, -0.5*_altura+dy, 0.5*_profundidade+dz);
    int p3 = newVertex(-0.5*_largura+dx, 0.5*_altura+dy, 0.5*_profundidade+dz);
    int p4 = newVertex( 0.5*_largura+dx, 0.5*_altura+dy, 0.5*_profundidade+dz);
    newTriangle(p1, p2, p3);
    newTriangle(p2, p4, p3);

    // face traseira
    int p5 = newVertex(-0.5*_largura+dx,-0.5*_altura+dy, -0.5*_profundidade+dz);
    int p6 = newVertex( 0.5*_largura+dx,-0.5*_altura+dy, -0.5*_profundidade+dz);
    int p7 = newVertex(-0.5*_largura+dx, 0.5*_altura+dy, -0.5*_profundidade+dz);
    int p8 = newVertex( 0.5*_largura+dx, 0.5*_altura+dy, -0.5*_profundidade+dz);
    newTriangle(p5, p7, p6);
    newTriangle(p6, p7, p8);

    // face lateral direita
    newTriangle(p2, p6, p4);
    newTriangle(p6, p8, p4);
    // face lateral esquerda
    newTriangle(p5, p1, p3);
    newTriangle(p5, p3, p7);
    // face superior
    newTriangle(p3, p4, p8);
    newTriangle(p3, p8, p7);
    // face inferior
    newTriangle(p1, p5, p6);
    newTriangle(p1, p6, p2);

    // compute normals
    computeAllNormals(true);

}
