[CODIGO FUENTE] Clase de dibujo interno OpenGL y D3D9

  • Hola Invitado, hemos creado un grupo de telegram para GamerzHacking Latino, para mas informacion ingresa al siguiente enlace AQUI


226
Me Gusta
83
Temas

c0de

MOV EAX, EDX
Registrado
19 Abr 2020
Temas
83
Mensajes
183
Ubicación
Localhost
Mejores respuestas
0
Hola,

hice esta clase simple e intuitiva para dibujar y generar texto para trucos internos de OpenGL. Es útil cuando estás haciendo un menú o aprendiendo OpenGL (cómo dibujar).
Primero queremos algunos headers:

C++:
#pragma once
#include <windows.h>
#include <gl\GL.h>
#pragma comment(lib, "opengl32.lib")

Luego la clase de dibujo:

C++:
class CDraw {
private:
    unsigned char r;
    unsigned char g;
    unsigned char b;

public:
    CDraw(unsigned char r, unsigned char g, unsigned char b) {
        this->r = r;
        this->g = g;
        this->b = b;
    }
  
    void FillRectangle(float x1, float y1, float x2, float y2) {
        ::glBegin(GL_POLYGON);
        ::glColor3ub(this->r, this->g, this->b);
        ::glVertex2f(x1, y1);
        ::glVertex2f(x2, y1);
        ::glVertex2f(x2, y2);
        ::glVertex2f(x1, y2);
        ::glEnd();
    }
  
    void Rectangle(float x1, float y1, float x2, float y2) {
        ::glBegin(GL_LINES);
        ::glColor3ub(this->r, this->g, this->b);
        ::glVertex2f(x1, y1);
        ::glVertex2f(x2, y1);
        ::glVertex2f(x2, y1);
        ::glVertex2f(x2, y2);
        ::glVertex2f(x2, y2);
        ::glVertex2f(x1, y2);
        ::glVertex2f(x1, y2);
        ::glVertex2f(x1, y1);
        ::glEnd();
    }

    void Line(float x1, float y1, float x2, float y2) {
        ::glBegin(GL_LINES);
        ::glColor3ub(this->r, this->g, this->b);
        ::glVertex2f(x1, y1);
        ::glVertex2f(x2, y2);
        ::glEnd();
    }
};

Como utilizar

C++:
CDraw colour(red,green,blue); //makes colour "brush"

colour.Rectangle(100.f,100.f,200.f,200.f); //draw rectangle with given coordinates
colour.Line(100.f,100.f,200.f,200.f); //draw line as diagonal in previous rect

colour.FillRectangle(200.f,100.f,300.f,200.f); //draw filled rect next to our picture

Ahora rendericemos algo de texto

La clase se ve así:

C++:
class CFont {
private:
    unsigned int base;
    unsigned char r;
    unsigned char g;
    unsigned char b;

public:
    CFont(int size, unsigned char r, unsigned char g, unsigned char b) {
        this->r = r;
        this->g = g;
        this->b = b;
        this->base = ::glGenLists(96);

        HDC hdc = ::wglGetCurrentDC();
        HFONT hFont = ::CreateFontA(-size, NULL, NULL, NULL, FW_MEDIUM, FALSE, FALSE, FALSE, ANSI_CHARSET, OUT_TT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, FF_DONTCARE | DEFAULT_PITCH, "Consolas");
        HFONT hOldFont = (HFONT)::SelectObject(hdc, hFont);

        ::wglUseFontBitmapsA(hdc, 32, 96, this->base);
        ::SelectObject(hdc, hOldFont);
        ::DeleteObject(hFont);
    }

    void Print(float x, float y, const char *format, ...) {
        ::glColor3ub(this->r, this->g, this->b);
        ::glRasterPos2f(x, y);

        char text[100];
        ::va_list args;

        va_start(args, format);
        ::vsprintf_s(text, 100, format, args);
        va_end(args);

        ::glPushAttrib(GL_LIST_BIT);
        ::glListBase(this->base - 32);
        ::glCallLists(::strlen(text), GL_UNSIGNED_BYTE, text);
        ::glPopAttrib();
    }
};

Ejemplo

C++:
CFont font(size,red,green,blue); //make "pen"

font.Print(100.f,100.f,"Hello World!"); //prints "Hello World!" string at (100,100) screen coordinates

Creditos
XdarionX