:: PlayerAdvance.org ::  

Précédent   :: PlayerAdvance.org :: > :: Forums Hébergés :: > OldSchool Library > Aide au développement

Aide au développement Aide sur l'utilisation d'OSLib

Publicité

Réponse
 
Outils de la discussion Modes d'affichage
Vieux 29/11/2009, 19h21   #1
Kcazer
Membre
 
Date d'inscription: 29/11/2009
Messages: 14
Par défaut drawBuffer et clipping

Bonsoir,

En voulant ajouter une fonctionnalité de "zoom" dans un programme, je me suis retrouvé face à deux solutions:
  • Gérer chaque mode de zoom au cas par cas, ce qui implique de changer manuellement la taille des sprites, ainsi que la position
  • Rester sur une taille fixe, en dessinant sur une image, et afficher cette image en changeant seulement sa taille
La première solution étant un peu plus complexe à mettre en place, j'ai testé la seconde.
Pour info, la taille du buffer est de 480x360, et peut etre affiché tel quel (avec scroll vertical au besoin), en fullscreen (donc 480x272, un peu aplati), ou n'importe quel autre mode, c'est pas vraiment le problème ici.

J'arrive au problème, quand je dessine dans mon buffer et l'affiche ensuite, il semblerait que tout ce que j'ai dessiné soit clippé à une hauteur de 272pixel, tout ce qui est plus bas n'apparait pas.
Une image sera surement plus parlante:
Spoiler

Quand au code (simplifié) que j'utilise:
Code PHP:
// OSLib
#include <oslib/oslib.h>

// Callbacks
PSP_MODULE_INFO("Test"011);
PSP_MAIN_THREAD_ATTR(THREAD_ATTR_USER THREAD_ATTR_VFPU);
 
int main() {
    
//Initialisation
    
oslInit(0);
    
oslInitGfx(OSL_PF_56501);

    
// Creation de l'image
    
OSL_IMAGE *drawBuffer oslCreateImage(480360OSL_IN_VRAMOSL_PF_5650);
    
oslClearImage(drawBuffer0xFF00FF00); // image toute verte
    
drawBuffer->stretchX >>= 1;
    
drawBuffer->stretchY >>= 1;
    
    
//Boucle principale
    
while (!osl_quit) {
        
oslStartDrawing();
        
        
oslSetDrawBuffer(drawBuffer);
        
oslDrawFillRect(004803600xFF0000FF); // rempli de rouge
        
oslDrawFillRect(10,10,470,350,0xFFFF0000); // dessine un rectangle bleu

        
oslSetDrawBuffer(OSL_DEFAULT_BUFFER);
        
oslClearScreen(0xFF000000);
        
oslDrawImage(drawBuffer); // dessine l'image
        
        
oslEndDrawing();
        
oslEndFrame();
        
oslSyncFrame();
    }

    
// Nettoyage de la memoire
    
oslDeleteImage(drawBuffer);
    
    
//Leave the program
    
oslEndGfx();
    
oslQuit();
    return 
0;

En faisant quelques test, je me suis rendu compte que si je dessinais sur le buffer en dehors de la boucle (donc une seule fois), et que j'attendais un petit peu avant de repasser sur le buffer principal, tout était dessiné.

Le GPU n'aurait pas le temps de tout dessiner avant le changement de buffer ? J'ai essayé de forcer l'attente avec oslSyncDrawing(), mais aucun changement.

Un bug dans la gestion automatique du clipping qui se fixerait à 480x272 sans raison ? oslSetDrawBuffer est censé ajuster automatiquement, et j'ai même ajouté un oslSetScreenClipping au cas ou, mais sans succès.

Je sèche complétement, donc si quelqu'un a une idée, ça serait sympa. J'espère juste ne pas avoir loupé une info dans la doc ;

Merci d'avance.
Kcazer est déconnecté   Réponse avec citation

Publicité

Vieux 30/11/2009, 02h10   #2
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 225
Par défaut

Ce n'est effectivement pas normal... j'allais te proposer le oslSetScreenClipping, mais tu as déjà testé...
Est-ce que c'est pile à 272 qu'il s'arrête en hauteur, ou à un emplacement plus "aléatoire"? Tu as essayé de faire ça en X aussi pour voir? (genre un buffer de 512 avec un petit scrolling ou scaling)
Brunni est déconnecté   Réponse avec citation
Vieux 30/11/2009, 12h59   #3
Kcazer
Membre
 
Date d'inscription: 29/11/2009
Messages: 14
Par défaut

Merci pour la réponse,

Oui, ça tombe toujours à 272 de hauteur, et je viens de faire le test sur la largeur, et il y a le même problème, ça clip à 480...



(j'affiche en 1/2, mais j'ai testé à l'échelle 1 en décalant l'image, ça tombe bien toujours à 480x272)
Kcazer est déconnecté   Réponse avec citation
Vieux 30/11/2009, 14h25   #4
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 225
Par défaut

Wow la dose de rose entre ton avatar et le screen, je vois tout vert maintenant XD
Bon ben si le clipping reste c'est assez étrange... je serais prêt à parier qu'il n'existe pas avec un sceGuCopyImage mais je ne peux pas tester comme ça (je regarderai chez moi).
Est-ce que tu peux juste essayer de faire:
sceGuDisable(GU_SCISSOR_TEST);
C'est l'équivalent d'un oslResetScreenClipping() qui étrangement n'existe pas. Est-ce que ça corrige le problème par hasard?
Brunni est déconnecté   Réponse avec citation
Vieux 30/11/2009, 15h17   #5
Kcazer
Membre
 
Date d'inscription: 29/11/2009
Messages: 14
Par défaut

C'est joli le rose pourtant :3

Je viens de tester sceGuDisable(GU_SCISSOR_TEST);, à plusieurs endroit au cas où (en début de programme, avant le changement de buffer, et après), aucun effet, je reste avec le même résultat, c'est à n'y rien comprendre.

Je n'ai pas réussi à trouver quelqu'un ayant eu un problème similaire, c'est quand même pas la premier fois que quelqu'un essaye de dessiner sur une image plus grande que l'écran quand même xD
Kcazer est déconnecté   Réponse avec citation
Vieux 30/11/2009, 16h55   #6
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 225
Par défaut

Bon t'as gagné je crois que tu vas me faire ressortir ma PSP
Par contre je suis plus du tout à jour, tu utilises quoi comme devkit?
Brunni est déconnecté   Réponse avec citation
Vieux 30/11/2009, 17h36   #7
Kcazer
Membre
 
Date d'inscription: 29/11/2009
Messages: 14
Par défaut

héhé =)

J'utilise le MINPSPW, c'est encore ce que j'ai trouvé de plus pratique.

Mais sinon t'embêtes pas trop, j'ai vu que t'avais quand même pas mal de projets, au pire j'aurais toujours moyen de m'arranger autrement (bien que ça m'arrange pas =P)
Kcazer est déconnecté   Réponse avec citation
Vieux 01/12/2009, 02h07   #8
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 225
Par défaut

Bon ben j'ai testé avec MINPSPW (merci au passage ) mais là je n'arrive même pas à recompiler la lib Apparemment ce qui est audio a dû changer (sceAudiocodecInit, etc.), ça m'étonne pas parce que c'était super expérimental quand je l'ai fait.
Tu as dû faire quelque chose de spécial au niveau des libs?
Brunni est déconnecté   Réponse avec citation
Vieux 01/12/2009, 22h27   #9
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 225
Par défaut

Bon ben apparemment le souci serait lié à mon appel à sceGuDispBuffer(480,272,(void*)0,512);
C'est assez bizarre, je pensais que ce truc n'affectait que l'affichage, mais en fait il est plutôt mal nommé. Il affecte également la région de dessin (registres 21 et 22 http://wiki.ps2dev.org/psp:ge_register_list). Du coup c'est un truc que je dois fixer dans la lib...
Alors il y a deux choses que tu peux faire,
1) utiliser la fonction drawRegion incluse au PSPSDK pour définir une région de dessin plus grande, comme dans le code C++ suivant:
Code PHP:
#include "../oslib/oslib.h"
#ifdef PSP
#include <psputils.h>
#endif

PSP_MODULE_INFO("OSLib Sample"001);
PSP_MAIN_THREAD_ATTR(PSP_THREAD_ATTR_USER PSP_THREAD_ATTR_VFPU);

extern "C" void drawRegion(int xint yint widthint height);
int main()
{
    
OSL_IMAGE *img;
    
oslInit(0);
    
oslInitGfx(OSL_PF_56501);
    
// Image plus grande que l'écran
    
img oslCreateImage(512512OSL_IN_VRAMOSL_PF_5650);
    
img->stretchX /= 2;
    
img->stretchY /= 2;
    while (!
osl_quit) {
        
oslStartDrawing();
        
// Dessin sur l'image, limité à 50x512
        
oslSetDrawBuffer(img);
        
drawRegion(0050512);
        
// Sera clippé
        
oslDrawFillRect(00100512RGB(25500));
        
// Passage sur le drawbuffer initial
        
oslSyncDrawing();
        
oslSetDrawBuffer(OSL_DEFAULT_BUFFER);
        
// Pour dessiner sur toute la surface
        
drawRegion(00480272);
        
oslDrawImage(img);
        
oslEndDrawing();
        
oslEndFrame();
        
oslSyncFrame();
    }
    
oslQuit();
    return 
0;

2) me spammer pour que je trouve le temps d'implémenter ça correctement dans OSLib et faire une nouvelle release =P
Bonne continuation
Brunni est déconnecté   Réponse avec citation
Vieux 01/12/2009, 22h57   #10
Kcazer
Membre
 
Date d'inscription: 29/11/2009
Messages: 14
Par défaut

Ohhh, c'est nickel, parfait =D
Je vais utiliser drawRegion directement, ça sera plus pratique (quoiqu'une oslib3 orienté objet je dirais pas non... nan nan rien, je déconne xD)

Sinon juste une petite question, dans ton exemple tu repasses à 480x272 une fois retourné sur le buffer principal, ça veut dire que la fonction opère indépendamment du buffer, et que si tu ne le faisais pas, on pourrais dessiner "en dehors" de l'écran ?

En tout cas, merci, je pense pas que j'aurais pu trouver ça tout seul, merci encore =)
Kcazer est déconnecté   Réponse avec citation
Vieux 01/12/2009, 23h01   #11
Brunni
Super Modérateur
 
Date d'inscription: 10/11/2005
Localisation: Un pays avec beaucoup de banques
Messages: 3 225
Par défaut

Heu bah j'ai même pas testé de laisser la région plus grande que l'écran, mais j'imagine effectivement que tu vas avoir droit à de belles joyeusetés =)
De rien sinon
Brunni est déconnecté   Réponse avec citation
Réponse

Liens sociaux

Publicité



Utilisateurs regardant la discussion actuelle : 1 (0 membre(s) et 1 invité(s))
 
Outils de la discussion
Modes d'affichage

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 18h03.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd. Tous droits réservés.
Version française #16 par l'association vBulletin francophone
Design par Ass-Itch, DJP et Dr.Vince