Para logo:
- deteccao de crusamento de setores: usar (opcionalmente) precisao de
  poligonos
!!!!- fazer a deteccao de colisao atrair o objeto apenas se houver alguma
  interseccao (permite detectar colisao de objetos concavos)
- handler de teclado para Svgalib
- porte para X
- texto sobre as texturas
- ASM na rotina dos poligonos (CDraw)
- palette construida a partir de outras palettes
- cache para setores (array para cada nivel de recursao)
- adicionar fontes de luz coloridas: 0->textura->fonte de luz
                                     0    0.5         1
  em caso de conflito entre 2 cor poli e cor fonte de luz usar a cor da
  fonte de luz.
  Cada tabela de iluminacao vai ter um ID que serah usado pelo poligono ou
  fonte de luz para definir qual usar.
- definir coodenadas da textura genericamente (nao usar as tabelas em
  CDraw(?))
- ???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.
- nao sao possiveis 2 portais para setores distintos no mesmo plano: travesia
  de portais eh feita por detecsao em planos. Refazer codigos para detecsao
  passavel/nao passavel contra planos e poligonos (ambos)
- detectar colisao contra as malhas externas dos objetos
- 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

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

BUG super bug com Segmentation Fault:
   Manifestacao em CScnery::mEndAddDefine (quando vai pegar componente do
   corpo o GCC reclama que o ponteiro aponta para lugar improprio).
   Chamadas anteriores indicam:
   // o sistema fica instavel depois de rodar o m_oComponents.mAddKey no
   // CObject::mCreateComponent.
   // O comando abaixo tenta ler um dado do mesmo CMap, mas nao consegue.
   // Pode ser visto o mesmo erro em CObject::mCreateComponent - retirar
   // comentarios das linhas abaixo do mAddKey.
   // A falha estah no retorno do mAddKey - a pilha se perde,
   // provavelmente o Segmentation Fault eh so uma falha, o erro
   // estah em outro lugar.
   //  Achei proximo, ou referente a CoSecSet (mUpdatePortalPointers, ...).
   // Mas, aparentemente, qualquer DEFINE com mais de 1 CreateComponent 
   // inserido num slot maior que 4 (porque!!!?) causa problema.
   // O problema estah na inclusao do primeiro componente,
   // que eh mal feita e torna o CMap co-relacionado instavel?
   // Coisa estranha: eh possivel evitar o Segmentation Fault aqui abaixo
   // nao usando o CAST de ponteiro (CComponentMesh*), mas sim cast para
   // PTRVAL. Isso pode ser o motivo da instabilidade lah na criacao do
   // componente...
   // 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.



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.
