Initialization of Graphics Rendering in C++
This snippet showcases the initialization of graphics rendering using the Gu library in C++. It sets up the draw buffer, viewport, depth buffer, and various rendering options to prepare for rendering graphics effectively.unknown
c_cpp
a year ago
3.8 kB
7
Indexable
#include "../include/graphics_manager.hpp"
char list[0x20000] __attribute__((aligned(64)));
void initGu() {
sceGuInit();
sceGuStart(GU_DIRECT, list);
sceGuDrawBuffer(GU_PSM_8888, (void*)0, BUFFER_WIDTH);
sceGuDispBuffer(SCREEN_WIDTH, SCREEN_HEIGHT, (void*)0x88000, BUFFER_WIDTH);
sceGuDepthBuffer((void*)0x110000, BUFFER_WIDTH);
sceGuOffset(2048 - (SCREEN_WIDTH / 2), 2048 - (SCREEN_HEIGHT / 2));
sceGuViewport(2048, 2048, SCREEN_WIDTH, SCREEN_HEIGHT);
sceGuDepthRange(0, 65535);
sceGuScissor(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
sceGuEnable(GU_SCISSOR_TEST);
sceGuDisable(GU_DEPTH_TEST);
sceGuShadeModel(GU_SMOOTH);
sceGuDisable(GU_BLEND);
sceGuEnable(GU_TEXTURE_2D);
sceGuTexMode(GU_PSM_8888, 0, 0, 0);
sceGuTexFunc(GU_TFX_MODULATE, GU_TCC_RGBA);
sceGuTexEnvColor(0x0);
sceGuTexOffset(0.0f, 0.0f);
sceGuTexScale(1.0f, 1.0f);
sceGuTexWrap(GU_REPEAT, GU_REPEAT);
sceGuTexFilter(GU_NEAREST, GU_NEAREST);
sceGuFinish();
sceGuSync(0, 0);
sceGuDisplay(GU_TRUE);
}
void endGu() {
sceGuDisplay(GU_FALSE);
sceGuTerm();
}
void startFrame() {
sceGuStart(GU_DIRECT, list);
sceGuClearColor(0xFFFFFFFF);
sceGuClear(GU_COLOR_BUFFER_BIT);
}
void endFrame() {
sceGuFinish();
sceGuSync(0, 0);
sceDisplayWaitVblankStart();
sceGuSwapBuffers();
}
void _drawRect(short x, short y, short w, short h, unsigned int color) {
Vertex* vertices = (Vertex*)sceGuGetMemory(2 * sizeof(Vertex));
vertices[0].x = x;
vertices[0].y = y;
vertices[1].x = x + w;
vertices[1].y = y + h;
sceGuColor(color);
sceGuDrawArray(GU_SPRITES, GU_TEXTURE_16BIT | GU_VERTEX_16BIT | GU_TRANSFORM_2D, 2, 0, vertices);
}
void _drawRectEx(short x, short y, short w, short h, unsigned int color, float angle) {
Vertex* vertices = (Vertex*)sceGuGetMemory(2 * sizeof(Vertex));
vertices[0].x = x;
vertices[0].y = y;
vertices[1].x = x + w;
vertices[1].y = y + h;
sceGuColor(color);
sceGumPushMatrix();
sceGumLoadIdentity();
sceGumRotateZ(angle);
sceGuDrawArray(GU_SPRITES, GU_TEXTURE_16BIT | GU_VERTEX_16BIT | GU_TRANSFORM_2D, 2, 0, vertices);
sceGumPopMatrix();
}
void drawRect(Rect& rect, unsigned int color) {
_drawRect(rect.x, rect.y, rect.w, rect.h, color);
}
void drawRect(Rect& rect, unsigned int color, float angle) {
_drawRectEx(rect.x, rect.y, rect.w, rect.h, color, angle);
}
void drawString(const char* text, int x, int y, unsigned int color, int fw) {
int len = (int)strlen(text);
if(!len) {
return;
}
typedef struct {
float s, t;
unsigned int c;
float x, y, z;
} VERT;
VERT* v = (VERT*)sceGuGetMemory(sizeof(VERT) * 2 * len);
int i;
for(i = 0; i < len; i++) {
unsigned char c = (unsigned char)text[i];
if(c < 32) {
c = 0;
} else if(c >= 128) {
c = 0;
}
int tx = (c & 0x0F) << 4;
int ty = (c & 0xF0);
VERT* v0 = &v[i*2+0];
VERT* v1 = &v[i*2+1];
v0->s = (float)(tx + (fw ? ((16 - fw) >> 1) : ((16 - fontwidthtab[c]) >> 1)));
v0->t = (float)(ty);
v0->c = color;
v0->x = (float)(x);
v0->y = (float)(y);
v0->z = 0.0f;
v1->s = (float)(tx + 16 - (fw ? ((16 - fw) >> 1) : ((16 - fontwidthtab[c]) >> 1)));
v1->t = (float)(ty + 16);
v1->c = color;
v1->x = (float)(x + (fw ? fw : fontwidthtab[c]));
v1->y = (float)(y + 16);
v1->z = 0.0f;
x += (fw ? fw : fontwidthtab[c]);
}
sceGumDrawArray(GU_SPRITES,
GU_TEXTURE_32BITF | GU_COLOR_8888 | GU_VERTEX_32BITF | GU_TRANSFORM_2D,
len * 2, 0, v
);
}
Editor is loading...
Leave a Comment