GFA
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le deal à ne pas rater :
Cartes Pokémon 151 : où trouver le coffret Collection Alakazam-ex ?
Voir le deal

Apparition en fondu de couleur

Aller en bas

Apparition en fondu de couleur Empty Apparition en fondu de couleur

Message par Shadow272 Mer 25 Nov - 14:11

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

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


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&},Cool,15),7))),Cool ! 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 ! =)
Shadow272
Shadow272
Admin

Messages : 328
Date d'inscription : 28/12/2017
Age : 65
Localisation : Hainaut Belgique

http://toutatari.blog4ever.xyz/

Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum