Funcionamiento de los SPRITES

11 views
Skip to first unread message

Pablo Hugo Reda

unread,
Apr 10, 2016, 10:47:32 AM4/10/16
to reda4
Quizas esto ayude a entender un poco mas el sistema
 
Sprites vectoriales:
Estas palabras son las primeras que agregue al sistema.
Utiliza 4 variables globales definidas en lib/gc.txt

| cursor centro (xc,yc) ancho (w) alto (h)
#:xc | centro x
#:yc | centro y
#:w | width
#:h | heigth


asignar valores a estas variables va a modificar el dibujo del sprite.
la conversion del x e y de cada punto esta definido en lib/convert.txt

|--- sprite en 32 bits, ajustado por gc
| fuente vectorial en 32bits | 14 - 14 - 4
| 0000 0000 0000 00 | 00 0000 0000 0000 | 0000
| x y      control

::gc>xy | v -- x y
 dup  
18 >> w 14 *>> xc + swap 14 << 18 >> h 14 *>> yc + ;
::xy>gc | x y -- v
 yc
- h 14 <</ $3fff and 4 << swap xc - w  14 <</ $3fff and 18 << or ;


El sprite esta definido en la memoria como un arreglo de numeros (32bits) terminados en 0.
El dibujo lo realiza la palabra en lib/sprite.txt

#nspaedit a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 aa ab ac ad ae af

::nsprite | adr --
 
( @+ 1? )( dup $f and 2 << 'nspaedit + @ exec ) 2drop sfill ;


Lo que hace esto es bien simple, toma los 4 bits inferiores y lo utiliza para obtener la direccion
del codigo a executar.
Como nota se puede decir que curiosamente el BASIC utiliza esta estructura de control,
el famoso ON GOTO o ON GOSUB, el PEEK (@) y POKE (!) tambien estaban presentes.
La idea es transformar un numero (en este caso una parte del numero) en una accion.
Las palabras a0..af

:a0  drop ; | el valor no puede ser 0
:a1  gc>xy op ;  | punto
:a2  gc>xy 'ycc ! 'xcc ! ; | cp
:a3  gc>xy pline ; | linea
:a4  gc>xy xcc ycc pcurve ;  | curva
:a5  gc>xy line ;
:a6  gc>xy xcc ycc curve ;


:a7  gc>xy 2dup 'ycen !+ ! fcen ; | centro degrade
:a8  gc>xy xcen rot - ycen rot -
  over dup * over dup * + 0? ( 1 nip ) >r | gracias IQ
  swap neg r 16 <</
  swap r> 16 <</ fmat ;

:a9  gc>xy xcc ycc pcurve ; | e .. 9
:aa  gc>xy pline ;  | f .. a
:ab  4 >> ink ; |drop ; |>xy point ;
:ac  4 >> '
c1 ! ;  | segundo color | c .. c
:ad  4 >> ink sfill poli ; | 9 .. d
:ae  4 >> c1 fcol lfill poli ; | a .. e
:af  4 >> c1 fcol rfill poli ; | b ..  f


asi, la memoria
#sprite1 $00000001 $00040015 0
es un op en 0,0 y un line en 1,1

Las variables xcc,ycc son auxiliares para dibujar curvas, xcen,ycen son para el centro del degrade, c1 para el segundo color.
El comentario gracias IQ viene de una consulta que le hice a Iñigo Quilez de como obtener la matriz de transformacion para el degrade.
Una contra que tienen estos sprites es que dibuja cada poligono, sobreescribiendo los pixeles que se superponen.
La forma de evitar esto sin cambiar la forma de almacenar estos graficos es meterse adentro de la definicion de poligono y
retrasar el dibujo hasta que se terminen los poligonos a dibujar, y modificar el dibujo linea a linea.
Tendria que definir unas palabras como multi poligonos, quiza algun dia aparezcan !!
sfill lfiil rfill y tfill (que aqui no se utiliza) son los que ponen el llenado de poligonos en SOLIDO, LINEAL, RADIAL y TEXTURA.
Mi idea era imita la forma de dibujo del FLASH, muy de moda cuando programe estas definiciones.

La version actual convive con una version anterior (sprites.txt), de forma similar pero sin llenado con degrade.
No lo quite porque hay programas que la utilizan.

galil...@gmail.com

unread,
Apr 11, 2016, 12:19:44 PM4/11/16
to reda4
Mira por donde estaba queriendo hacer la conversión de un programa que dibujaba curvas y hete aquí que tratas el tema.

Pablo Hugo Reda

unread,
Apr 11, 2016, 9:56:09 PM4/11/16
to reda4
En r4\System\asmbase\asmbase.txt
estan las palabras que se utillizan cuando se compilan a asm, estan en :r4
esta es la definicion de CURVE, grafica curvas de bezier de 3 puntos, el origen, el punto de control y el final.
me llevo mucho llegar a esta definicion hasta que encontre que debia seguir el orden de dibujo para que se simplifique
fijate que usa solo LINE, no OP, siempre dibuja en orden!!


::CURVE | fx fy cx cy --
 pick3 pxBPP
+ pick2 2* - abs
 pick3 pyBPP
+ pick2 2* - abs  +
 
4 <? ( 3drop LINE ; ) drop
 pick3 pick2
+ 2/  pick3 pick2 + 2/ | fx fy cx cy c2 c2
 
2swap                              | fx fy c2 c2 cx cy
 py
+ 2/ swap px + 2/ swap          | fx fy c2 c2 c1 c1
 pick3 pick2
+ 2/  pick3 pick2 + 2/ | fx fy c2 c2 c1 c1 ex ey
 
2swap
 CURVE CURVE
;

Reply all
Reply to author
Forward
0 new messages