BUGS:
- overflow em alguns calculos do vetor normal para remocao de elementos ocultos em CRender
 - engine entre em loop porque acha que deve desenhar ambos setores infinitamente.
   ver REVIEW->teste yLevel>5, ocorre muito se voce esta atravessando um portal de lado.
- engine entre em loop por algum motivo estrado dependendo de como voce atravessa o portal
  e nao eh por causa do vetor normal!
- 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
- 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.
- 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.
- 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)
- 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 estah funcionando direito o recorte pelo poligono de clip pois quase sempre eh retornado TRUE
  em mSetClipEdgeBuffer.
- o recorte com retancangulo que circunscreve area de clip nao funciona em X,
  os limites de X ficam sempre do tamanho da tela para evitar problemas.
- 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)
- os poligonos nao podem estar muito longe: overflow se vistos de longe
- ultima scanline do frame buffer nao tem imagem bem definida (pixels errados)
- 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)
- problemas no separador de arquivos conforme Linux ou DOS \ / (cenario deve
  ser generico, agora nao eh)
- Derivar CNtFly de CFly. Passar inicializacao do frame
  (clip edge buffer...) para CRender. Um makefile unico para todos os exemplos.
- sinaliza arquivo carregado OK mesmo quando ocorre erro the achar token
  nao identificado no bloco externo. (deve ter sido caudo pelo porte para Linux).



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;


-USAR PONTEIROS PARA VERTICES E NAO INDICES (NA INSTANCIACAO)
-USAR PONTEIROS ONDE HAVIAM ID (mas manter ID textura e objeto para controle)
 EM PORTAIS POR PONTEIRO PARA SETOR DESTINO
-RETIRAR O CMAP PARA PORTAIS: POR PONTEIRO DIRETO DO POLIGONO PARA O DESTINO
-RETIRAR O 0/1 DOS ATRIBUTOS DOS POLIGONOS QUE INSFORMA SE O POLIGONO EH
 PORTAL OU NAO
-EM START, RETIRAR OBJETO, SETOR ONDE CAMERA ESTA DENTRO: INFORMACAO JAH
 ESTAH NA INSTANCIA
-CRIAR CLASSE CINSTANCE - CONTROLA A INSTANCIA CORRESPONDENTE
-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.
-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 COMBONACAO 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.

CRender aninha CDrawClip

CFly aninha CRender e CCameraSystem

CApl possui numa funcao: CScenery, CFly e CScreen



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)



Yes, but not only for a game. I what to do a 3D window system for Linux, an
 enviroment for multi-agent research, a demo, a general purpose free library
  (like Visual C Microsoft Foundation Class), some virtual tutorials about
  many things, 3D aplications like text editors, data base clients, .... All
   good stuff I want in a 3D enviroment but don't exist.

Maybe I will put hiresolutions, hicolors, true-colors, sockets suport, sound
 suport, CORBA suport, agents suport, a message loop, neural network,
  hierarchical objects, voxels suport (3D sprites), Z-buffer suport,
   dist-trees (my idea for MIP-mapping for poly mesh), many colored light
    sources (sport or omni) perspective-MIP-mapped-shaded polygons,
     transparency, bump mapping, hiper-textures (true textures), gif loading,
 VRML suport, 3D Studio ASC suport, AutoCad suport, GEO suport, a automatic
  conversor for sectors, ... (all in Linux versions).

If you know where I can found material about some thing above let me know,
please.

I will ask for help for Free Software Foundation, Delorie, ... to do this
(code all alone is not good). You know how can I get some money making 3D
engines?



tirar o switch HORRIVEL do desenho das linhas da texture mHorizontalTexturedLine...



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



chamar de fly as transformacoes geometricas (e nao render)



Ter uma lista de cameras (em CFly) que podem ser renderizadas



fazer um objeto CReferenceSystem, outro CCamera e outro CBody -
tem definicoes do corpo (fisicas!), um derivado do outro.



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: sectores, 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).



parametrizar 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,
- se deve ou nao limpar o frame buffer antes de desenhar novo frame,
- 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.
- Instancias de objetos (objetos podem ser instanciados a partir de modelos 
  carregados).



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