RetroArch/deps/libvita2d/source/vita2d_draw.c
2019-07-24 22:58:57 +02:00

169 lines
5.0 KiB
C

#include <math.h>
#include "../include/vita2d.h"
#include "../include/shared.h"
void vita2d_draw_pixel(float x, float y, unsigned int color)
{
vita2d_color_vertex *vertex = (vita2d_color_vertex *)vita2d_pool_memalign(
1 * sizeof(vita2d_color_vertex), // 1 vertex
sizeof(vita2d_color_vertex));
uint16_t *index = (uint16_t *)vita2d_pool_memalign(
1 * sizeof(uint16_t), // 1 index
sizeof(uint16_t));
vertex->x = x;
vertex->y = y;
vertex->z = +0.5f;
vertex->color = color;
*index = 0;
sceGxmSetVertexProgram(_vita2d_context, _vita2d_colorVertexProgram);
sceGxmSetFragmentProgram(_vita2d_context, _vita2d_colorFragmentProgram);
void *vertexDefaultBuffer;
sceGxmReserveVertexDefaultUniformBuffer(_vita2d_context, &vertexDefaultBuffer);
sceGxmSetUniformDataF(vertexDefaultBuffer, _vita2d_colorWvpParam, 0, 16, _vita2d_ortho_matrix);
sceGxmSetVertexStream(_vita2d_context, 0, vertex);
sceGxmSetFrontPolygonMode(_vita2d_context, SCE_GXM_POLYGON_MODE_POINT);
sceGxmDraw(_vita2d_context, SCE_GXM_PRIMITIVE_POINTS, SCE_GXM_INDEX_FORMAT_U16, index, 1);
sceGxmSetFrontPolygonMode(_vita2d_context, SCE_GXM_POLYGON_MODE_TRIANGLE_FILL);
}
void vita2d_draw_line(float x0, float y0, float x1, float y1, unsigned int color)
{
vita2d_color_vertex *vertices = (vita2d_color_vertex *)vita2d_pool_memalign(
2 * sizeof(vita2d_color_vertex), // 2 vertices
sizeof(vita2d_color_vertex));
uint16_t *indices = (uint16_t *)vita2d_pool_memalign(
2 * sizeof(uint16_t), // 2 indices
sizeof(uint16_t));
vertices[0].x = x0;
vertices[0].y = y0;
vertices[0].z = +0.5f;
vertices[0].color = color;
vertices[1].x = x1;
vertices[1].y = y1;
vertices[1].z = +0.5f;
vertices[1].color = color;
indices[0] = 0;
indices[1] = 1;
sceGxmSetVertexProgram(_vita2d_context, _vita2d_colorVertexProgram);
sceGxmSetFragmentProgram(_vita2d_context, _vita2d_colorFragmentProgram);
void *vertexDefaultBuffer;
sceGxmReserveVertexDefaultUniformBuffer(_vita2d_context, &vertexDefaultBuffer);
sceGxmSetUniformDataF(vertexDefaultBuffer, _vita2d_colorWvpParam, 0, 16, _vita2d_ortho_matrix);
sceGxmSetVertexStream(_vita2d_context, 0, vertices);
sceGxmSetFrontPolygonMode(_vita2d_context, SCE_GXM_POLYGON_MODE_LINE);
sceGxmDraw(_vita2d_context, SCE_GXM_PRIMITIVE_LINES, SCE_GXM_INDEX_FORMAT_U16, indices, 2);
sceGxmSetFrontPolygonMode(_vita2d_context, SCE_GXM_POLYGON_MODE_TRIANGLE_FILL);
}
void vita2d_draw_rectangle(float x, float y, float w, float h, unsigned int color)
{
vita2d_color_vertex *vertices = (vita2d_color_vertex *)vita2d_pool_memalign(
4 * sizeof(vita2d_color_vertex), // 4 vertices
sizeof(vita2d_color_vertex));
uint16_t *indices = (uint16_t *)vita2d_pool_memalign(
4 * sizeof(uint16_t), // 4 indices
sizeof(uint16_t));
vertices[0].x = x;
vertices[0].y = y;
vertices[0].z = +0.5f;
vertices[0].color = color;
vertices[1].x = x + w;
vertices[1].y = y;
vertices[1].z = +0.5f;
vertices[1].color = color;
vertices[2].x = x;
vertices[2].y = y + h;
vertices[2].z = +0.5f;
vertices[2].color = color;
vertices[3].x = x + w;
vertices[3].y = y + h;
vertices[3].z = +0.5f;
vertices[3].color = color;
indices[0] = 0;
indices[1] = 1;
indices[2] = 2;
indices[3] = 3;
sceGxmSetVertexProgram(_vita2d_context, _vita2d_colorVertexProgram);
sceGxmSetFragmentProgram(_vita2d_context, _vita2d_colorFragmentProgram);
void *vertexDefaultBuffer;
sceGxmReserveVertexDefaultUniformBuffer(_vita2d_context, &vertexDefaultBuffer);
sceGxmSetUniformDataF(vertexDefaultBuffer, _vita2d_colorWvpParam, 0, 16, _vita2d_ortho_matrix);
sceGxmSetVertexStream(_vita2d_context, 0, vertices);
sceGxmDraw(_vita2d_context, SCE_GXM_PRIMITIVE_TRIANGLE_STRIP, SCE_GXM_INDEX_FORMAT_U16, indices, 4);
}
void vita2d_draw_fill_circle(float x, float y, float radius, unsigned int color)
{
static const int num_segments = 100;
vita2d_color_vertex *vertices = (vita2d_color_vertex *)vita2d_pool_memalign(
(num_segments + 1) * sizeof(vita2d_color_vertex),
sizeof(vita2d_color_vertex));
uint16_t *indices = (uint16_t *)vita2d_pool_memalign(
(num_segments + 2) * sizeof(uint16_t),
sizeof(uint16_t));
vertices[0].x = x;
vertices[0].y = y;
vertices[0].z = +0.5f;
vertices[0].color = color;
indices[0] = 0;
float theta = 2 * M_PI / (float)num_segments;
float c = cosf(theta);
float s = sinf(theta);
float t;
float xx = radius;
float yy = 0;
int i;
for (i = 1; i <= num_segments; i++) {
vertices[i].x = x + xx;
vertices[i].y = y + yy;
vertices[i].z = +0.5f;
vertices[i].color = color;
indices[i] = i;
t = xx;
xx = c * xx - s * yy;
yy = s * t + c * yy;
}
indices[num_segments + 1] = 1;
sceGxmSetVertexProgram(_vita2d_context, _vita2d_colorVertexProgram);
sceGxmSetFragmentProgram(_vita2d_context, _vita2d_colorFragmentProgram);
void *vertexDefaultBuffer;
sceGxmReserveVertexDefaultUniformBuffer(_vita2d_context, &vertexDefaultBuffer);
sceGxmSetUniformDataF(vertexDefaultBuffer, _vita2d_colorWvpParam, 0, 16, _vita2d_ortho_matrix);
sceGxmSetVertexStream(_vita2d_context, 0, vertices);
sceGxmDraw(_vita2d_context, SCE_GXM_PRIMITIVE_TRIANGLE_FAN, SCE_GXM_INDEX_FORMAT_U16, indices, num_segments + 2);
}