Главная страница


ru.algorithms

 
 - RU.ALGORITHMS ----------------------------------------------------------------
 From : Yuri Burger                          2:468/85.3     22 May 2001  21:04:01
 To : Michael Komm
 Subject : текстурирование (сырэц)
 -------------------------------------------------------------------------------- 
 
 
 18 May 01 02:11, Michael Komm wrote to All:
 
  MK>    есть текстура размером tsx на tsy, есть некотрая 4-угольная фигура с
  MK> координатами вершин в экранных координатах, по какому принципу текстуру
 
     Вопервых, лучше юзай треугольники - проще работать. А для треугольника это
 так:
     есть 3 точки на экране, каждой соответствует координата в текстуре. Теперь,
 сортируем эти точки по Y, чтоб сверху вниз было. Потом запоминаем, какие из
 этих точек образуют наибольшую грань.
     теперь цикл по Y-разнице этих двух точек. внутри:
 
     интерполяцией определяем граници X-отрезка от одной грани к другой,
 интерполяцией-же определяем координаты этих границ в текстуре. Потом цикл по
 этому отрезку с всё той-же родимой интерполяцией, где собсна и отрисовуем
 горизонтальный отрезок.
     когда одна из коротких граней закончится, подсовуем вторую.
 
     И вообще, чё эт я распинаюсь? Hа вот сырец, пользуй:
 
 // Guru + Texture Triangle + ZBuffer
 // выдрано их X-Vga Lib (там только текстурирование в 256х320х200 было
 // переведено с ASM на PAS, и c PAS на C и дико попорчено by Kruger :)
 // расчитано на 16-бит режимы, а потому юзает таблицу перекодировки цвета
 // если выбросить ZBuffer и Guru то вполне шустро бегает
 void PTTriangle(BTRIANGLE *F)
 {
  long MC1,MZ1;
  long MDC1,MDZ1;
  long MTX1,MTY1;
  long MTDX1,MTDY1;
 
  long CC1,CZ1;
  long DC3,DZ3;
  long TCX1,TCY1;
  long TDX3,TDY3;
 
  long CX1;
  long DX3;
 
  long mbx,mbx1,mbx2,mbx3;
  long Texture;
  long Y1,Y2,Y3;
  long z1,y;
  word t;
 
  long CC2,DC1,DC2;
  long CZ2,DZ1,DZ2;
  long CX2,DX1,DX2;
  long TCX2,TDX1,TDX2;
  long TCY2,TDY1,TDY2;
 
  vertex *a=&F->A;
  vertex *b=&F->B;
  vertex *c=&F->C;
  vertex *tmp;
 long MX1,MX2;
 long MC2;
 long MZ2;
 long MTX2,MTY2;
 
 Texture=(long)F->Texture;
 
 if(a->sy > b->sy){tmp=a;a=b;b=tmp;}
 if(a->sy > c->sy){tmp=a;a=c;c=tmp;}
 if(b->sy > c->sy){tmp=b;b=c;c=tmp;}
 CC1=a->cc*32768;
 CZ1=a->z*32768;
 
 TCX1=a->u*32768;
 TCY1=a->v*512;
 
 CX1=a->sx*=32768;
 Y1=a->sy;
 b->cc*=32768;
 b->z*=32768;
 b->u*=32768;
 b->v*=512;
 b->sx*=32768;
 Y2=b->sy;
 c->cc*=32768;
 c->z*=32768;
 c->u*=32768;
 c->v*=512;
 c->sx*=32768;
 Y3=c->sy;
 
         mbx=Y2 - Y1;
         if(mbx!=0)goto NONFLAT1;
         DC1=mbx;
         DZ1=mbx;
         TDX1=mbx;
         TDY1=mbx;
         DX1=mbx;
         CC2=b->cc;
         CZ2=b->z;
         TCX2=b->u;
         TCY2=b->v;
         CX2=b->sx;
         goto OK7;
 NONFLAT1:
         DC1=(b->cc - CC1)/mbx;
         DZ1=(b->z - CZ1)/mbx;
         TDX1=(b->u - TCX1)/mbx;
         TDY1=(b->v - TCY1)/mbx;
         DX1=(b->sx - CX1)/mbx;
         CC2=CC1;
         CZ2=CZ1;
         TCX2=TCX1;
         TCY2=TCY1;
         CX2=CX1;
 OK7:
         mbx=Y3 - Y2;
         if(mbx!=0)goto NONFLAT2;
         DC2=mbx;
         DZ2=mbx;
         TDX2=mbx;
         TDY2=mbx;
         DX2=mbx;
         goto OK11;
 NONFLAT2:
         DC2=(c->cc - b->cc)/mbx;
         DZ2=(c->z - b->z)/mbx;
         TDX2=(c->u - b->u)/mbx;
         TDY2=(c->v - b->v)/mbx;
         DX2=(c->sx - b->sx)/mbx;
 OK11:
         mbx=Y3 - Y1;
         if(mbx!=0)goto NONFLAT3;
         DC3=mbx;
         DZ3=mbx;
         TDX3=mbx;
         TDY3=mbx;
         DX3=mbx;
         goto LINELOOP;
 NONFLAT3:
         DC3=(c->cc - CC1)/mbx;
         DZ3=(c->z - CZ1)/mbx;
         TDX3=(c->u - TCX1)/mbx;
         TDY3=(c->v - TCY1)/mbx;
         DX3=(c->sx - CX1)/mbx;
 LINELOOP:
         if(CX1>=CX2)goto MUSTSWAP;
         MC1=CC1;
         MZ1=CZ1;
         MTX1=TCX1;
         MTY1=TCY1;
         MX1=CX1;
         MC2=CC2;
         MZ2=CZ2;
         MTX2=TCX2;
         MTY2=TCY2;
         MX2=CX2;
         goto OK17;
 MUSTSWAP:
         MC1=CC2;
         MZ1=CZ2;
         MTX1=TCX2;
         MTY1=TCY2;
         MX1=CX2;
         MC2=CC1;
         MZ2=CZ1;
         MTX2=TCX1;
         MTY2=TCY1;
         MX2=CX1;
 OK17:
 MX1/=32768;
 MX2/=32768;
 mbx=(MX2-MX1+1);
 MDC1=(MC2-MC1)/mbx;
 MDZ1=(MZ2-MZ1)/mbx;
 MTDX1=(MTX2-MTX1)/mbx;
 MTDY1=(MTY2-MTY1)/mbx;
     y=Y1*512+Y1*128;
     mbx=y*2+originOffset;
     mbx3=(y+MX1)*4+(long)ZBuff;
     mbx1=mbx+MX1*2;
     mbx2=mbx+MX2*2;
 LOOP1:
            z1=*(dword *)(mbx3);
            if(z1>MZ1)
            {
              *(dword *)(mbx3)=MZ1;
              t=*(word *)((MTY1&0xFFFFFE00)+(MTX1/32768)*2+Texture);
              *(word *)(mbx1)=GTable[t+(MC1&0xFFFF8000)];
            }
            mbx1+=2;
            mbx3+=4;
            MC1+=MDC1;
            MZ1+=MDZ1;
            MTX1+=MTDX1;
            MTY1+=MTDY1;
         if(mbx1<=mbx2)goto LOOP1;
         CC1+=DC3;
         CZ1+=DZ3;
         TCX1+=TDX3;
         TCY1+=TDY3;
         CX1+=DX3;
         if(Y1 < Y2)goto TOPPART;
         CC2+=DC2;
         CZ2+=DZ2;
         TCX2+=TDX2;
         TCY2+=TDY2;
         CX2+=DX2;
         Y1++;
         if(Y1 <= Y3)goto LINELOOP;
         goto EXIT;
 TOPPART:
         CC2+=DC1;
         CZ2+=DZ1;
         TCX2+=TDX1;
         TCY2+=TDY1;
         CX2+=DX1;
         Y1++;
         if(Y1 <= Y3)goto LINELOOP;
 EXIT:;
 }
 
                                                  Kрюгер.
 ---
  * Origin: А хто тут есть, у кого есть за что поесть? (2:468/85.3)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 2 Questions   Michael Komm   18 May 2001 02:11:45 
 2 Questions   Alexei Frounze   21 May 2001 23:39:18 
 текстурирование (сырэц)   Yuri Burger   22 May 2001 21:04:01 
 текстурирование (сырэц)   Aleksey Malov   25 May 2001 02:01:00 
 Re: текстурирование (сырэц)   Serge Kanilo   25 May 2001 07:19:38 
 текстурирование (сырэц)   Alexei Frounze   25 May 2001 09:37:00 
Архивное /ru.algorithms/23173b0ad456.html, оценка 1 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional