See readme.txt


Ideas, bugs, work log:


* Fonte de iluminacao puntiforme: vetor de iluminacao eh definido conforme
 posicao da origem da luz e ponto medio do poligono.

* varias fontes de luz: a luz de um poligono seria resultante da soma de
 todas as luzes insidentes.

* reflexo e varias cameras: projetar imagem sobre um plano generico que
 tambem serah desenhado.

+ maze 3D 360 e burn 3D com HSV

* pre-calcular vetor normal e rotaciona-lo com demais vertices conforme caso
  OU
  obter do vetor normal um vetor mais curto e por em tabela o seu sqrt
  (usado para calcular comprimento do vetor normal) - melhor ateh agora.

+ GEL: usar vertices com posicoes relativas aos demais vertices: depende,
 principalmente, da distancia entre o seu superior na hierarquia de
 influencias e depende dos vertices inferiores. O ponto superior tem o
 mesmo peso de influencia sobre vertice que o total dos pontos da mesma
 hierarquia do vertices e inferiores juntos.
 OU
 Tentar usar B-splines sendo que os pontos de controle afetariam a posicao
 dos vertices.

+ Para espaco do cenario: mover camera e nao todo ambiente. Translacao eh
 feito alterando valores limites de recorte.

* Usar HSL para definir palete sobre cores que variam conforme luz insidente.

* Implementar funcoes de rotacao para cada plano em separado (XY, XZ, YZ).
 Translacao tambem.

* Fazer recorte dos vertices dos poligonos 2D e nao alterar vertices para
 caber na tela. Verificar se poligono projetado tem parte exibida na tela
 vendo se nem todos os vertices estao num "canto" para fora da que falta
 desenhar. Para definir area que falta desenhar:
       *-----------*
       |     +-----xxxxxxxxxxxxxxxx
       |     |tela x              x area que falta desenhar: retangulo
       |     |     x              x com area semi-preenchida por diagonais
       |     |     x|             x de poligonos, nao de canto a canto de
       |     |     x|             x um mesmo tipo de borda (superior-inferior
       |     |     x\             x direita-esquerda) da tela
       |     |     x |            x
       |     |     x |            x
       |     |     x \            x
       |pol  +-----xxxxxxxxxxxxxxxx
       *--------------*

* Ordenar poligonos pela proximidade com observador e desenhar da frente para
 tras, removendo superficies ocultas e nao pintando onde jah estah pintado.
 Tentar ordenar apenas 1 vez: subtrair x,y,z.
 OU
 pintar de tras para frente (evita teste), quardar o indice do poligono mais
 distante que serah pintado (indice da tabela de distancias).
 OU
 pintar de frente para tras e guardar numa tabela (ou arvore) os intervalos
 de x que jah foram pintados para cada y (acho o melhor ateh agora).

* desenhar linha horizontal de 4 em 4 bytes e nao de 1 em 1.

* problemas no uso do vetor normal de remover superficies ocultas, foi
 necessario somar uma quantia ao angulo (ruim ruim). Usar x e y do poligono
 projetado?!...

! BUG: imprecisao ao calcular vetores normais. Usar vertices
 que tem a maior distancia entre si.

> libc.a jah tem qsort e binary tree search

14/3/97
- render.cc: desenha com modelo flat, parametro bExibe define se vai exibir
 imagens renderisadas, incorporado CIlum.
- solido.cc
- apl.cc
- cubo.s

15/3/97
- cubo.s
- render.cc: remocao de superficies ocultas
- gr.cc: palette com um pouco de cinza

17/3/97
- sentido anti-horario em *.s e em CRender::mRetSupVisivel
- melhores comentarios em transf.cc

18/3/97
- arquivo.cc: contrutor com parametros tem ponteiro para arquivo iniciado
 com NULL (bugfix)
- apl.cc: passagem de parametros pela linha de comando

22/3/97
- solido.cc: ordenacao de poligonos
- gr.cc: (bugfix) poligonos encostados que nao se fechavam bem

25/3/97
- ideia de "area que falta desenhar" (ver acima).

27/3/97
- gr.cc: nao desenha onde jah foi desenhado (mAtrPol2D)
- CRender::mRenderPoligonos: (bugfix) se m_fModV == 0 entao faze-lo igual a
 valor pequeno. Se componentes do vetor normal sao muito grandes ainda da
 pau! Mudar multiplicacao nas tabelas de projecoes para soma nao evita o bug?
- solido.cc: bubblesort arrumado

28/3/97
- solido.cc: mecanismo de ordenacao terminado
- render.cc: (bugfix) se modulo do vetor normal eh 0, isso eh erro valor eh
 alterado para quantia pequena, mas nao nula.
- render.cc: (bugfix) usar componentes 3D de x e y para calcular vetor normal
 e nao componentes projetadas
- render.cc: nao desenha poligonos completamente fora da tela
- gr.cc: recorde (verifica se deve desenhar pixel do poligono ou nao)

30/3/97
- render.cc, solido.cc, solido.h: tabela de cores de poligonos

3/4/97:
- rendec.cc: vetor normal para remocao de superficies ocultas calculado a
 partir das componentes x e y projetadas.
- cidade.s: removido objeto barracao

10/4/97:
- arquivo.cc, render.cc, gr.cc: cores diferentes para cada poligono
- render.cc: testado projecao perspectiva (finciona e estah em comentario)
- render.cc: testo pre-calculo de cores e calculo de cores durante
 renderizacao, ambos funcionam (pre-calculo estah em comentario)
- alguns arquivos de solido com novas cores.

12/4/97:
- inicio da implementacao de particoes: CUniverso

13/4/97:
- fim da implementacao de particoes (alterado: CUniverso, CArquivo, CApl)
- melhorias no tabuleiro de damas
- alteracao do titulo que aparece no fim da execusao

18/4/97:
- anotei ideia do maze 3D 360 e burn 3D
- incorporacao do handler de teclado
- CTransf rotacao de solido com resultados para si mesmo e tranlacao para
 outro solido

20/4/97:
- projecao perspectiva tradicional
- ordenacao dos poligonos apenas de acordo com Z do ponto medio

21/4/97:
- recorte de poligonos com Z muito pequeno (menor que distancia ateh centro
 de projecao). Atenuou os Floating Point Exceptions.
- BUGFIX: se poligono todo fora a tela nao sai da rotina apenas continua loop
 (ver CRender::mRenderPoligonos). Referente ao problema de congelar programa
 se objeto estah muito proximo.
- BUGFIX: CArquivo::CArquivo ( char*, CUniverso& ) nao chamava leitura do
 arquivo de solido.
- gr.cc: alterada programacao da pallete

25/4/97:
- CRender: tentativas de definir uma camera virtual. Problemas: rotacao XY
 faz demais controles se perderem, rotacao ZY mal feita - resulta em rotacao
 XY se objeto visto de lado (90 graus).
- transf.cc: rotina de rotacao para floats

22/6/97:
- CApl: alterado movimento da camera para modo andar
