- porte para X
- 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.
  Parei na implementacao de DEFUALT_LIGHT_LEVEL em defs.h (tem que substitir
  no codigo)
- tamanho precompilado de textura: 256x256 (tirar TXE, tabelas em CDraw e
  fazedor de linhas de textura)
- definir coodenadas da textura genericamente (nao usar as tabelas em
  CDraw(?))
- por no codigo os flags de config.h

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.




Calcular melhor RGB para RGB ideal
int Textures::find_rgb_slow (int r, int g, int b)
{
  int i, min, mindist;
  mindist = 1000*256*256; 
  min = -1;
  register int red, green, blue, dist;
  for(i = 1 ; i < 255 ; i++) // Exclude colors 0 and 255
    if (alloc[i])
    {
      red = r - pal[i].red;
      green = g - pal[i].green;
      blue = b - pal[i].blue;
      dist = (299*red*red)+ (587*green*green)+ (114*blue*blue);
      if (dist == 0) return i;
      if (dist < mindist) { mindist = dist; min = i; }
    }
  return min;
}





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).
