/* Declaracoes do modulo ARCBALL
 *
 * Autor: Marcelo Gattass
 * Data: 20 de novembro de 2005
 * O modulo contem duas implementacoes quase equivalentes: 
 * (a) uma com base na matriz de rotacao em torno de um eixo qualquer;
 * (b) outra com base de quaternios.
 *
 * A unica diferenca entre os resultados duas e' qua a de quaternios 
 * roda o dobro para o mesmo movimento de mouse.
 * 
 */

#ifdef __cplusplus
extern "C" {
#endif


#ifndef ARCBALL_H
#define ARCBALL_H

#include "algebra.h"

typedef struct _arcball Arcball;

/* 
 * Cria uma instancia do arcball centrado na posicao (xc,yc), de raio radius num canvas
 * e ajusta os eixos de rotacao de forma a acomodar possiveis diferencas entre os eixos
 * da tela e dos objetos.
 * Os eixos {ex},{ey} e {ez} sao os vetores x,y e z da camera escritos no sistema de 
 * coordenadas dos objetos 
 */
Arcball* arcballInit(int xc, int yc, int radius, Vector ex, Vector ey, Vector ez ); 

/*
 * Rotação livre, as coordenadas do canvas (x0,y0) e (x1,y1) tem origem no canto inferior esquerdo 
 * Implementa as rotacoes como uso de quaternios. 
 * Semelhante a funcao "arcballRotMatrix" com a diferenca que o angulo de rotacao e' o dobro.
 */
Quat arcballRotQuat(Arcball *arc, int x0, int y0, int x1, int y1);

/* 
 * Rotação livre, as coordenadas do canvas (x0,y0) e (x1,y1) tem origem no canto inferior esquerdo 
 * Implementa as rotacoes como uso da matriz de rotacao em torno de um eixo qualquer.
 * Semelhante a funcao "arcballRotQuat" com a diferenca que o angulo de rotacao e' a metade.
 */
Matrix arcballRotMatrix(Arcball* arc, int x0, int y0, int x1, int y1);


/* Desenha o arcball no canvas de largura width e altura height */
void arcballDraw(Arcball* arc, int width, int height);

/* Deleta um arcball */
void arcballDestroi(Arcball* arc);


#endif


#ifdef __cplusplus
}
#endif
