Estou fazendo:
- Porte para X
- otimizar profiles:
  - desenha linha horizontal dos poligonos (64%!!!!)

Para logo:
- componente com infomacoes fisicas: raio, direcao, aceleracao.
  Se colidir anula vetor aceleracao para aquela direcao - acho
  que eh assim que o Descent faz!
- por makefile-comum e makefile especifico para cada plataforma
- por hierarquia de makes: 1 make library , outros make examples,...
- BUG arrumar SR (o SR das fontes de luz eh um, objetos outro, deteccao
  colisao,...!)
- BUG deteccao de colisao trata da malha nao transformada do SRO -> SRU.
  Estah funcionando, mas deve ser relativo ao SRU.
  Transladar esfera para SRO da malha!
- BUG: deteccao de colisao com objetos no mesmo setor testa malha de
  objetos que nao tem malha!?
- BUG: calcular cores quando compila sem COMP_HILIGHTS.
- BUG: seg fault se retorna componente que nao existe (CMap ou mRetComponent)
- definir indice de defracao na light table (faixa de valores para cada
  formula)
- nao tem ASM nos poligonos com sombreamento FLAT e textura. :(
- componente que move objeto (gera msg para passar de setor ou se
  colidiu com poligono solido) - outros componentes: passa setor e
  colidiu.
- CStringMap -> string de 4 chars para CNode
- TXE: Undefine e IncludeDefine
- passagem de um vetor direcao e nao toda base no TXE - pau
- handler de teclado para Svgalib
- texto sobre as texturas
- trocar LightTableID do poligonos conforme qual a fonte de luz que
  o ilumina.
- mudar: engine.cc, sector.cc, scenery.cc, cosecset, render.cc
  chamar slots dos objetos e nao pegar direto os ponteiros para os
  componentes!
- ASM na rotina dos poligonos - desenho horizontal (CDraw)
- definir coodenadas da textura genericamente (nao usar as tabelas em
  CDraw(?))
- palette construida a partir de outras palettes
- cache para setores (array para cada nivel de recursao)
- ???USAR UM SISTEMA DE REFERENCIA SEPARADO PARA A CAMERA, NAO ADAPTAR O DA
  INSTANCIA POIS ISSO PODE ATRAPALHAR O DESENHO DO OBJETO DE DENTRO
  PARA FORA (VIRADO). POR EM CSCENERY.

BUG colisao e atravessar portais:
- dependendo o angulo de colisao voce atravessa a parede se insistir (aumentar raio ou...)
  veja bem no buraco que fica no corredor de saida da sala inicial.
- deteccao de colisao e travessia de portais com precisao de poligonos
  nao sempre. Detecta quando nao deve, e nao deterta quando deve,
  as vezes... (ver bridge e nao detecta colisao contra os objetos "box")
- deteccao de colisao contra poligono (no inicio, com vetor direcao inicial) nao funciona!
  tambem nao funciona contra paredes que nao estao alinhadas com os planos cartesianos.
  para resolver use o sinal produto escalar vetor normal plano com vetor

BUG portais:
- o mSetClipEdgebuffer seta um pouco mais de area do que eh usado pelos poligonos do destino
  porque se nota as vezes uma pequena tarja preta (se o frame buffer eh semre pintado com preto)
  na borda superior do portal...
- o mSetClipEdgebuffer devolve clip buffer em X com valores que passam os limites da tela e
  tambem varre o clip buffer mais do que pode (mais linhas do que tem)
- nao estah funcionando direito o recorte pelo poligono de clip pois quase sempre eh retornado TRUE
  em mSetClipEdgeBuffer.
- o recorte com retangulo que circunscreve area de clip nao funciona em X,
  os limites de X ficam sempre do tamanho da tela para evitar problemas.
- recorte de poligonos faz recorte do portal fazendo com que voce, se estiver entre um setor
  e outro nao veja completamente o setor destino.
  Esse bug foi parcialmente corrigido em CRender::mMakeNearZPlaneClip, mas
  ainda permanece um pouco. Agora tambem falha o reset do clip edge buffer
  que torna visivel areas que deveriam ser clipadas.

BUG geometria e render: 
- a base nao eh normalizada de vez em quando
- se os vertices do poligono estao alinhados da GFP na hora de calcular o vetor normal
  ao poligono (tempo de carga do cenario)
- ultima scanline do frame buffer nao tem imagem bem definida (pixels errados)
- nao retransformar mesh do setor por causa das var membro "globais". Usar CMap em CRender
  para acesso a cada mesh transformada para cada objeto,setor - se 2 portais mapeiam mesmo
  destino e ambos estao visiveis, soh um transforma, o outro aproveita.
  ver tambem REVIEW.
* backface culling - nao remove sempre (engine poderia entrar em loop)
* FPE quando se aproxima do portal da sala inicial, no demo - problema
  na projecao. Fazer a historia de setar um flag que diz: poligono
  deve ser clipado.
- nao usar INT no CRender -> CDraw
- cada CComponentCameraSystem tem um lookup table (muita memoria)

BUG iluminacao:
- fontes de luz soh iluminam o setor onde estao
- o LightTableID nao eh usado em CComponentLightSourceOmni (ainda...)

BUG arquivos:
- sinaliza arquivo TXE carregado OK mesmo quando ocorre erro de achar token
  nao identificado no bloco externo. (deve ter sido causado pelo porte para Linux).

BUG super bug com Segmentation Fault (resolvido?):
   No 0.4.0 se a fonte de luz do penguim nao tem malha da pau. Quando o CEngine chama
   o loop de eventos da primeira vez da pau (com o primeiro evento).
      Pode ser pela ordem de declaracao de CObject e CNode em CNodeObject.
      Ha uma diferenca entre o this da parte CObject e o this do
      CNodeObject. ANINHAR CObject (mesmo problema que na textura
      antigamente).
   Manifestacao em CScnery::mEndAddDefine (quando vai pegar componente do
   corpo o GCC reclama que o ponteiro aponta para lugar improprio).
   USAR PARA TESTES: testtxe.exe old/se.txe
   CObject::mCreateComponent:
   // remove existing component from this slot (if exist)
   // REVIEW super bug mDestroyComponent ( dwSlotID, pData1, pData2 );
   // sobre o BUG:
   // se a ordem de preenchimento dos slots eh decrescente e eh chamado
   // mDestroyComponent da Segmentation Fault. Ver ordem em old/se.txe.
   // Ou remover comentario de mDestroyComponent e no 3dfcdemo alterar
   // instancia do objeto 1 por 101 99 (SR e controle teclado).
   // A falha ocorre ao retornar o componente durante execusao de
   // mDestroyComponent (o erro tem causa desconhecida...)
   Um erro encontrado foi em CSector::mSearchObject - tinha um
   "break" no lugar do "continue" na comparacao de IDs.



RESOLVIDOS:
- variaveis membro de CRender eram alteradas durante recursao desatualizando dados do
  setor atual causando muitos GPFs
- GPF no Windows se remove por engano um portal pela angulo com vetor normal.
- GPF no Windows se desenha um portal de costas de outro setor (estouro de pilha
  do sistema pela recursao?)
- vetor normal nao calculado com perspectiva, remove precosse o poligono,
  nao considera angulo em perspectiva.
- iluminacao: recorte com o plano Z proximo estah errado (light levels
  trocados). Nao, esta certo, eh que no recorte nao interpolacao para
  calcular um novo valor e ele acaba aumentando a pressisao do
  sombreamento no local.
- clip Z proximo recorta errado informacao sobre ilumincao do vertice



TEXTURA E POLIGONOS PLANOS:
tmap.html
para definir y inicial e final:
   firstscreeny = ceil(top_point);
   lastscreeny = ceil(bottom_point)-1;
inicalizacao do x para descer no edge-loop
   float deltax = (x2-x1) / (y2-y1);
   float x = x1 + (firstscreeny-y1) * deltax;
calcular os edges
   // leftegde is a boolean value that we set higher up 

   if (leftedge) 

    for (y=firsty; y<=lasty; y++,x+=deltax)

     left[y] = ceil(x);

   else 

    for (y=firsty; y<=lasty; y++,x+=deltax)

     right[y] = ceil(x)-1;



-NA FUNCAO QUE TERMINA A ADICAO DE DADOS A UMA MALHA DEFINIR OS PLANOS DA
 MALHA. USAR PLANOS EXPLICITAMENTE PARA FAZER BACKFACE-CULLING,...
-LIGHT MAP: USAR PONTOS COM ESPACAMENTO VARIAVEL (SE MUITO GRADIENTE MAIOR
 DENCIDADE)
-INFORMAR SE MAIS DE DOIS POLIGONOS USAM A MESMA COMBINACAO DE LIGHT-MAP E TEXTURA,
 SE SIM NAO EH NECESSARIO RECRIAR 2x A MESMA TEXTURA.



utilitarios para help: lista o nome de todos arquivos, classes e funcoes
conforme o que for selecionado mostra o comentario respectivo (do arquivo
classe ou funcao). Esse arquivo procura nos metodos dos diretorios,
recursivamente abaixo do diretorio atual.



VER ALPHA!!!!
procedure SetFPUPrecision(Precision: word);
{precision values:  1  -  24 bits (SINGLE)   }
{                   2  -  53 bits (DOUBLE)   }
{                   3  -  64 bits (EXTENDED) }
var CtrlWord: word;
begin {SetPrecisionCtrl}
   if Precision=1 then Precision := 0;
   Precision := Precision shl 8; { make mask for PC field in ctrl word}
   asm
      fstcw    [CtrlWord]        { store NDP control word }
      mov      AX, [CtrlWord]    { load control word into CPU }
      and      AX, 0FCFFh        { mask out precision control field }
      or       AX, [Precision]   { set desired precision in PC field }
      mov      [CtrlWord], AX    { store new control word }
      fldcw    [CtrlWord]        { set new precision control in NDP }
   end;
end;



CDraw deriva CDrawClip (desenha poligono com textura usando span-buffer:
a cada nivel na recursao eh desenhado o portal que serah usado no clip
- o portal tambem eh clipado pelo anterior - e entao eh desenhado os
poligonos do setor destino). O edge-buffer estarah na funcao que chama o
desenho e suportara no maximo 1024 linhas. Em CDrawClip haverah a funcao
que muda o edge-buffer conforme o portal e a funcao de desenho de poligonos
com clip pelo edge-buffer.



no futuro fazer sistema de mensagens: um nodo gera mensagem de movimento da
camera para servidor de mensagens, servidor de mensagens usa um filtro para
ver o que fazer com a mensagem e envia mensagem adiante para CFly se for o
caso. Ou melhor CFly manda mensagem para quem mandou o movimento quando
ocorrer detecsao de colisao: cada objeto recebe e gera mensagens, nao eh
centralizado. As mensagens sao codigos que sao enviados para os objetos que
disseram quererem interseptar aquele tipo de mensagem. Cada objeto tem 2
filas de mensagens - uma com mensagens de pouca prioridade (se nao executadas
naquela vez nao faz mal) e alta prioridade (deve sempre ser executado ateh
o fim)



fazer TILE MAPPING e nao texture mapping com escala (ou ser opcional num
atributo do poligono - Quake)! m_oTexVert sai!



nao chamar rotacao a toda hora soh quanto foi teclado rotacao,
o mesmo para translacoes.



Fazer um setorizador automatico com base em tetraedros ou transformar arquivos
de dados do Quake.



Fazer clip de polygonos contra portal calculando as interseccoes entre poligono
a ser desenhado e portal (nao usar o clip edge buffer podre - depende muito de
resolucao).



Evitar tantas copias das coordenadas para desenhar poligono: passar para
fazedor de poligonos o conjunto de indices de vertices e a lista de vertices.
(deve ser possivel ainda passar coordenadas para fazer recorte contra plano Z
proximo, esse recorte "cria" novos vertices no universo da camera), ou ver
ideia abaixo:



usar ponteiros no lugar de indices e IDs: setores, objetos, vertices de um
poligono, texturas e portais de um poligono



Ler 1 setor (ou a casca do objeto) de arquivos ASC (3D Studio),...



se o jogo eh de caminhar: fazer textura do chao com mais resolucao
que a textura do teto (chao mais proximo).



Em sistemas de particulas nao eh necessario que seja calculada a gravidade de
cada particula, somente use objectos em hierarquia e mova o referencial (as
particulas vao junto).



parametrisar nos arquivos TXE:
- varias cameras (terao um ID)
  origens, direcoes,
  distancia centro de projecao,
  distancia plano de recorte,
  velocidade de aceleracao se alterados parametros,
  setor inicial e objeto inicial da camera
- tamanho viewport,
- modo grafico,
- espelhos: portais que mapeiam para setor origem mas invertido, sua distancia
  com o espelho eh a distancia do centro de projecao (com ruido definivel)
- sistema de mensagens: teclas pressionadas, colisoes x translacoes e rotacoes
- enviroment mapping: em Textures {...} definir uma textura sem arquivo PCX e sim
  um ID de camera, entao a textura vai mapear aquela camera.
- um portal pode ter atributo "mirror"que faz ele refletir, desenhar, o setor em que
  esta usando como centro de projecao (?) distancia ente ele e a camera.
