3 votes

Comment implémenter une stratégie de sélection de couleur également pour le texte ?

Donc, j'ai réussi à implémenter la sélection en rendant avec une couleur unique chaque partie que je veux rendre sélectionnable.

Cela fonctionne pour la géométrie, mais qu'en est-il du texte? J'ai beaucoup cherché sur le Web, mais je n'ai rien trouvé en lien avec la sélection par couleur et le texte.

La solution que j'ai envisagée était de rendre une géométrie personnalisée au lieu d'un texte dans le tampon arrière. Le problème est que ma scène peut avoir des rotations différentes (rotation globale X + rotation locale Z), donc je devrais calculer à chaque fois la bonne position et la bonne rotation de cette géométrie puisque je dois correspondre à la position/rotation du texte, qui est automatiquement rendu horizontalement et perpendiculaire à l'utilisateur avec l'appel glut.glutStrokeString(font, string).

Je me demande s'il y a aussi un truc concernant la sélection de texte.

Ps : désolé, j'avais tort, je n'utilise pas le tracé mais le glutBitmapString..

3voto

glcoder Points 424

Vous pouvez calculer un rectangle de délimitation dans l'espace écran pour votre texte et, lors d'un événement de clic, vérifier si la position du curseur se trouve dans l'un des rectangles de délimitation actifs. Quelque chose comme ceci:

struct brect_t { float x, y, w, h; };
struct string_t {
    void *fontID;
    const unsigned char *data;
    brect_t rect;
};

static string_t strings[MAX_STRINGS];
int stringsCount = 0;

// ajouter une nouvelle chaîne à la file d'attente de rendu
int stringsAdd(float x, float y, void *fontID, const unsigned char *str) {
    if (stringsCount >= MAX_STRINGS)
        return 0;

    string_t *string = strings + stringsCount++;
    string->rect.x  = x;
    string->rect.y  = y;
    string->rect.w  = glutStrokeLength(fontID, str);
    string->rect.h  = glutStrokeHeight(fontID);
    strings->fontID = fontID;
    string->data    = str;

    return 1;
}

// rendre toutes les chaînes
void stringsRender(float r, float g, float b) {
    glColor3f(r, g, b);

    for (int i = 0; i < stringsCount; ++i) {
        const string_t *string = strings + i;

        glPushMatrix();
        glLoadIdentity();
        glTranslatef(string->rect.x, string->rect.y, 0.0f);
        glutStrokeString(string->fontID, string->data);
        glPopMatrix();
    }
}

// x,y - dans les coordonnées de l'espace modèle
const string_t* stringsPick(float x, float y) {
    for (int i = 0; i < stringsCount; ++i) {
        const string_t *string = strings + i;
        const rect_t   *rect   = &string->rect;

        if (x >= rect->x &&
            y >= rect->y &&
            x <= (rect->x + rect->w) &&
            y <= (rect->y + rect->h)) {
            return string;
        }
    }

    return NULL;
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X