Apparition en fondu de couleur
Page 1 sur 1
Apparition en fondu de couleur
Apparition en fondu de couleur
Par hylst
Hello !
Je suis un peu rouillé depuis toutes ces années, et parmi les questions basiques,
j'essaie de faire un proggy qui déclenche un fondu progressif pour l'apparition d'une image,
à partir d'une palette à 0, jusqu'à la palette de l'image finale.
Mais... ça ne donne pas du tout le résultat escompté.
Si quelqu'un peut éclaire ma lanterne...
Tomchi :
Voila la routine que j'utilise, piquée à Tobé dans le source de Roger ou 1999 chais plus.
J'alloue de la mémoire pour 16 palettes (blanc STE à 0) je calcule le dégradé, et ensuite en fonction de l'incrementation de la boucle , je fais un fondu du noir à l'image ou de l'image au noir.
Shadow272 :
Excellente routine.
Merci Tomchi.
hylst :
Excellente routine en effet, sans flottant qui plus est.
Je ne suis toutefois toujours pas sur de comprendre ce qui cloche dans mon code.
Tomchi :
En fait je comprends pas complètement ce que tu fais .
Tu divises chaque composante RVB par 7 et ensuite tu multiplies par cp& (la valeur de ton dégrade) ?
Dans ce cas tu n'obtiendrai que des couleurs STF. Sauf que DIV et MUL ne renvoient que des entiers, et du coup ben les résultats sont faussés et le INT ne sert à rien, il faudrait travailler avec des flottants et utiliser '*' et '/' pour que ça marche mais sans avoir les couleurs intercalées du STE.
[EDIT]
A ouais, c'est l'heure de la sieste , je plane completement !!!!
Ou juste un peu , chais plus !
En fait ça marcherait quand même mais alors sur STe, merdouille assurée.
Imaginons un degradé sur une couleur bleue &h9
rappelons que du fait que le STE utilise le bit 4 et pour que ça reste compatible STF, les valeurs pour les couleurs sont organisées ainsi:
0,8,1,9,2,A,3,B,4C,5,D,6,E,7,F
Donc notre couleur est un bleu foncé
9/7=1.286
INT(1.286*1)=1 ! bleu foncé
INT(1.286*2)=2 ! plus clair
INT(1.286*3)=3 ! encore +
INT(1.286*4)=5 ! encore +
INT(1.286*5)=6 ! euh ... chais plus ce que je voulais dire
INT(1.286*6)=7 ! le bleu le plus clair pour un STF (enfin je me comprends )
INT(1.286*7)=9 ! Notre bleu foncé STE
hylst :
tomchi a écrit:
En fait je comprends pas complètement ce que tu fais .
Tu divises chaque composante RVB par 7 et ensuite tu multiplies par cp& (la valeur de ton degradé) ?
Dans ce cas tu n'obtiendrai que des couleurs STF. Sauf que DIV et MUL ne renvoient que des entiers, et du coup ben les resultats sont faussés et le INT ne sert à rien, il faudrait travailler avec des flottants et utiliser '*' et '/' pour que ça marche mais sans avoir les couleurs intercalées du STE.
CARD{&HFFFF8240+co&}=CARD{&HFFFF8240+co&} OR INT(MUL(cp&,DIV(AND(CARD{pal%+co&},15),7))) ! b
CARD{&HFFFF8240+co&}=CARD{&HFFFF8240+co&} OR SHL(INT(MUL(cp&,DIV(AND(SHR(CARD{pal%+co&},4),15),7))),4) ! v
CARD{&HFFFF8240+co&}=CARD{&HFFFF8240+co&} OR SHL(INT(MUL(cp&,DIV(AND(SHR(CARD{pal%+co&},,15),7))), ! r
J'ai en effet l'habitude de tout coder pour STf. Côté div, j'utilise l'option $%3 du compilateur (division forcée en flottant) mais il est vrai qu'il serait plus clair d'employer /.
Merci pour tes conseils une fois de plus ! =)
Par hylst
Hello !
Je suis un peu rouillé depuis toutes ces années, et parmi les questions basiques,
j'essaie de faire un proggy qui déclenche un fondu progressif pour l'apparition d'une image,
à partir d'une palette à 0, jusqu'à la palette de l'image finale.
Mais... ça ne donne pas du tout le résultat escompté.
Si quelqu'un peut éclaire ma lanterne...
- Code:
sup%=GEMDOS(32,L:0)
pic%=MALLOC(32034)
palv$=SPACE$(32)
palv%=V:palv$
VOID XBIOS(6,L:palv%)
BLOAD "c:good4.pi1",pic%
BMOVE pic%+34,XBIOS(2),32000
pal%=pic%+2
' fade on
' essai de programme d'apparition progressive par fondu progressif des couleurs
' structure couleurs en basse r‚so ST
' 16 couleurs cod‚es sur 2 octets chacun soit palette de 32 octets
' Pour chaque couleur : MSB inutilis‚ 1111 r 1111 v 1111 b 1111
' avec sut stf, seulement les 3 LSBits de chaque composante de couleur utilis‚s sur stf (palette 512)
' 4 bits sur Ste (4096)
FOR cp&=0 TO 7
FOR co&=0 TO 15*2 STEP 2
CARD{&HFFFF8240+co&}=CARD{&HFFFF8240+co&} OR INT(MUL(cp&,DIV(AND(CARD{pal%+co&},15),7))) ! b
CARD{&HFFFF8240+co&}=CARD{&HFFFF8240+co&} OR SHL(INT(MUL(cp&,DIV(AND(SHR(CARD{pal%+co&},4),15),7))),4) ! v
CARD{&HFFFF8240+co&}=CARD{&HFFFF8240+co&} OR SHL(INT(MUL(cp&,DIV(AND(SHR(CARD{pal%+co&},8),15),7))),8) ! r
NEXT co&
PAUSE 10
VSYNC
NEXT cp&
VOID GEMDOS(32,L:sup%)
VOID MFREE(pic%)
Tomchi :
Voila la routine que j'utilise, piquée à Tobé dans le source de Roger ou 1999 chais plus.
J'alloue de la mémoire pour 16 palettes (blanc STE à 0) je calcule le dégradé, et ensuite en fonction de l'incrementation de la boucle , je fais un fondu du noir à l'image ou de l'image au noir.
- Code:
RESERVE 1000
CLS
super%=GEMDOS(&H20,L:0)
buffer%=MALLOC(32034+32*17)
pic%=buffer%
palettes%=ADD(pic%,32034)
initial_palette%=ADD(palettes%,16*32)
BMOVE &HFFFF8240,initial_palette%,32
SETCOLOR 0,0
SETCOLOR 15,&HFFF
FILESELECT "","",f$
BLOAD f$,buffer%
FOR i%=0 TO 15
SETCOLOR i%,0
NEXT i%
BMOVE pic%+34,XBIOS(2),32000
@calc_to_black(pic%+2)
FOR pal&=15 DOWNTO 0
~XBIOS(6,L:ADD(palettes%,MUL(pal&,32)))
VSYNC
VSYNC
VSYNC
VSYNC
VSYNC
NEXT pal&
~INP(2)
FOR pal&=0 TO 15
~XBIOS(6,L:ADD(palettes%,MUL(pal&,32)))
VSYNC
VSYNC
VSYNC
VSYNC
NEXT pal&
CLS
~XBIOS(6,L:initial_palette%)
~GEMDOS(&H20,L:super%)
~MFREE(buffer%)
EDIT
> PROCEDURE calc_to_black(paltofade%)
BMOVE paltofade%,palettes%,32
FOR col&=1 TO 15
FOR adr%=0 TO 30 STEP 2
brou%=ADD(ADD(palettes%,adr%),MUL(SUB(col&,1),32))
val&=CARD{brou%}
r|=AND(SHR(val&,8),&HF)
v|=AND(SHR(val&,4),&HF)
b|=AND(val&,&HF)
IF r|<>0 !&HF !15
IF r|<8 !>7
ADD r|,7 !SUB r|,7
ELSE
SUB r|,8 !ADD r|,8
ENDIF
ENDIF
IF v|<>0 !&HF !15
IF v|<8 !>7
ADD v|,7 !SUB v|,7
ELSE
SUB v|,8 !ADD v|,8
ENDIF
ENDIF
IF b|<>0 !&HF !15
IF b|<8 !>7
ADD b|,7 !SUB b|,7
ELSE
SUB b|,8 !ADD b|,8
ENDIF
ENDIF
coul&=SHL(r|,8) OR SHL(v|,4) OR b|
adr_dest%=ADD(ADD(palettes%,adr%),MUL(col&,32))
CARD{adr_dest%}=coul&
NEXT adr%
NEXT col&
RETURN
Shadow272 :
Excellente routine.
Merci Tomchi.
hylst :
Excellente routine en effet, sans flottant qui plus est.
Je ne suis toutefois toujours pas sur de comprendre ce qui cloche dans mon code.
Tomchi :
En fait je comprends pas complètement ce que tu fais .
Tu divises chaque composante RVB par 7 et ensuite tu multiplies par cp& (la valeur de ton dégrade) ?
Dans ce cas tu n'obtiendrai que des couleurs STF. Sauf que DIV et MUL ne renvoient que des entiers, et du coup ben les résultats sont faussés et le INT ne sert à rien, il faudrait travailler avec des flottants et utiliser '*' et '/' pour que ça marche mais sans avoir les couleurs intercalées du STE.
[EDIT]
A ouais, c'est l'heure de la sieste , je plane completement !!!!
Ou juste un peu , chais plus !
En fait ça marcherait quand même mais alors sur STe, merdouille assurée.
Imaginons un degradé sur une couleur bleue &h9
rappelons que du fait que le STE utilise le bit 4 et pour que ça reste compatible STF, les valeurs pour les couleurs sont organisées ainsi:
0,8,1,9,2,A,3,B,4C,5,D,6,E,7,F
Donc notre couleur est un bleu foncé
9/7=1.286
INT(1.286*1)=1 ! bleu foncé
INT(1.286*2)=2 ! plus clair
INT(1.286*3)=3 ! encore +
INT(1.286*4)=5 ! encore +
INT(1.286*5)=6 ! euh ... chais plus ce que je voulais dire
INT(1.286*6)=7 ! le bleu le plus clair pour un STF (enfin je me comprends )
INT(1.286*7)=9 ! Notre bleu foncé STE
hylst :
tomchi a écrit:
En fait je comprends pas complètement ce que tu fais .
Tu divises chaque composante RVB par 7 et ensuite tu multiplies par cp& (la valeur de ton degradé) ?
Dans ce cas tu n'obtiendrai que des couleurs STF. Sauf que DIV et MUL ne renvoient que des entiers, et du coup ben les resultats sont faussés et le INT ne sert à rien, il faudrait travailler avec des flottants et utiliser '*' et '/' pour que ça marche mais sans avoir les couleurs intercalées du STE.
CARD{&HFFFF8240+co&}=CARD{&HFFFF8240+co&} OR INT(MUL(cp&,DIV(AND(CARD{pal%+co&},15),7))) ! b
CARD{&HFFFF8240+co&}=CARD{&HFFFF8240+co&} OR SHL(INT(MUL(cp&,DIV(AND(SHR(CARD{pal%+co&},4),15),7))),4) ! v
CARD{&HFFFF8240+co&}=CARD{&HFFFF8240+co&} OR SHL(INT(MUL(cp&,DIV(AND(SHR(CARD{pal%+co&},,15),7))), ! r
J'ai en effet l'habitude de tout coder pour STf. Côté div, j'utilise l'option $%3 du compilateur (division forcée en flottant) mais il est vrai qu'il serait plus clair d'employer /.
Merci pour tes conseils une fois de plus ! =)
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|