mirror of
https://github.com/libretro/RetroArch.git
synced 2024-11-27 10:10:57 +00:00
169 lines
5.0 KiB
C
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);
|
|
}
|