mirror of https://github.com/encounter/SDL.git
adding texture function
This commit is contained in:
parent
5de01eb0aa
commit
f2ebedae92
|
@ -43,25 +43,6 @@
|
||||||
/* Size of Oneshot drawbuffer (Double Buffered, so it uses this size * 2) */
|
/* Size of Oneshot drawbuffer (Double Buffered, so it uses this size * 2) */
|
||||||
#define RENDER_QUEUE_OS_POOLSIZE 1024 * 1024 * 2 // 2048K of oneshot renderqueue
|
#define RENDER_QUEUE_OS_POOLSIZE 1024 * 1024 * 2 // 2048K of oneshot renderqueue
|
||||||
|
|
||||||
typedef struct clear_vertex {
|
|
||||||
float x;
|
|
||||||
float y;
|
|
||||||
} clear_vertex;
|
|
||||||
|
|
||||||
typedef struct texture_vertex {
|
|
||||||
float x;
|
|
||||||
float y;
|
|
||||||
float u;
|
|
||||||
float v;
|
|
||||||
uint64_t color;
|
|
||||||
} texture_vertex;
|
|
||||||
|
|
||||||
typedef struct color_vertex {
|
|
||||||
float x;
|
|
||||||
float y;
|
|
||||||
uint64_t color;
|
|
||||||
} color_vertex;
|
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
GSGLOBAL *gsGlobal;
|
GSGLOBAL *gsGlobal;
|
||||||
|
@ -264,18 +245,14 @@ PS2_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *t
|
||||||
size_indices = indices ? size_indices : 0;
|
size_indices = indices ? size_indices : 0;
|
||||||
|
|
||||||
if (texture) {
|
if (texture) {
|
||||||
texture_vertex *vertices;
|
GSPRIMUVPOINT *vertices = (GSPRIMUVPOINT *) SDL_AllocateRenderVertices(renderer, count * sizeof (GSPRIMUVPOINT), 4, &cmd->data.draw.first);
|
||||||
|
PS2_RenderData *data = (PS2_RenderData *)renderer->driverdata;
|
||||||
vertices = (texture_vertex *)SDL_AllocateRenderVertices(renderer,
|
GSTEXTURE *ps2_tex = (GSTEXTURE *) texture->driverdata;
|
||||||
count * sizeof(texture_vertex),
|
|
||||||
4,
|
|
||||||
&cmd->data.draw.first);
|
|
||||||
|
|
||||||
if (!vertices) {
|
if (!vertices) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
int j;
|
int j;
|
||||||
float *xy_;
|
float *xy_;
|
||||||
|
@ -295,11 +272,9 @@ PS2_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *t
|
||||||
col_ = *(SDL_Color *)((char*)color + j * color_stride);
|
col_ = *(SDL_Color *)((char*)color + j * color_stride);
|
||||||
uv_ = (float *)((char*)uv + j * uv_stride);
|
uv_ = (float *)((char*)uv + j * uv_stride);
|
||||||
|
|
||||||
vertices->x = xy_[0] * scale_x;
|
vertices->xyz2 = vertex_to_XYZ2(data->gsGlobal, xy_[0] * scale_x, xy_[1] * scale_y, 0);
|
||||||
vertices->y = xy_[1] * scale_y;
|
vertices->uv = vertex_to_UV(ps2_tex, uv_[0] * ps2_tex->Width, uv_[1] * ps2_tex->Height);
|
||||||
vertices->u = uv_[0];
|
vertices->rgbaq = color_to_RGBAQ(col_.r >> 1, col_.g >> 1, col_.b >> 1, col_.a >> 1);
|
||||||
vertices->v = uv_[1];
|
|
||||||
vertices->color = GS_SETREG_RGBAQ(col_.r >> 1, col_.g >> 1, col_.b >> 1, col_.a >> 1, 0x00);
|
|
||||||
|
|
||||||
vertices++;
|
vertices++;
|
||||||
}
|
}
|
||||||
|
@ -312,7 +287,6 @@ PS2_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *t
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
for (i = 0; i < count; i++) {
|
for (i = 0; i < count; i++) {
|
||||||
int j;
|
int j;
|
||||||
float *xy_;
|
float *xy_;
|
||||||
|
@ -339,7 +313,6 @@ PS2_QueueGeometry(SDL_Renderer *renderer, SDL_RenderCommand *cmd, SDL_Texture *t
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
|
@ -441,56 +414,18 @@ PS2_SetBlendMode(PS2_RenderData *data, int blendMode)
|
||||||
static int
|
static int
|
||||||
PS2_RenderGeometry(SDL_Renderer *renderer, void *vertices, SDL_RenderCommand *cmd)
|
PS2_RenderGeometry(SDL_Renderer *renderer, void *vertices, SDL_RenderCommand *cmd)
|
||||||
{
|
{
|
||||||
|
const PS2_RenderData *data = (PS2_RenderData *)renderer->driverdata;
|
||||||
int i;
|
|
||||||
uint64_t c1, c2, c3;
|
|
||||||
float x1, y1, x2, y2, x3, y3;
|
|
||||||
float u1, v1, u2, v2, u3, v3;
|
|
||||||
PS2_RenderData *data = (PS2_RenderData *)renderer->driverdata;
|
|
||||||
|
|
||||||
const size_t count = cmd->data.draw.count;
|
const size_t count = cmd->data.draw.count;
|
||||||
|
|
||||||
PS2_SetBlendMode(data, cmd->data.draw.blend);
|
PS2_SetBlendMode(data, cmd->data.draw.blend);
|
||||||
|
|
||||||
if (cmd->data.draw.texture) {
|
if (cmd->data.draw.texture) {
|
||||||
const texture_vertex *verts = (texture_vertex *) (vertices + cmd->data.draw.first);
|
const GSPRIMUVPOINT *verts = (GSPRIMUVPOINT *) (vertices + cmd->data.draw.first);
|
||||||
GSTEXTURE *ps2_tex = (GSTEXTURE *) cmd->data.draw.texture->driverdata;
|
GSTEXTURE *ps2_tex = (GSTEXTURE *) cmd->data.draw.texture->driverdata;
|
||||||
|
|
||||||
for (i = 0; i < count/3; i++) {
|
|
||||||
x1 = verts->x;
|
|
||||||
y1 = verts->y;
|
|
||||||
|
|
||||||
u1 = verts->u * ps2_tex->Width;
|
|
||||||
v1 = verts->v * ps2_tex->Height;
|
|
||||||
|
|
||||||
c1 = verts->color;
|
|
||||||
|
|
||||||
verts++;
|
|
||||||
|
|
||||||
x2 = verts->x;
|
|
||||||
y2 = verts->y;
|
|
||||||
|
|
||||||
u2 = verts->u * ps2_tex->Width;
|
|
||||||
v2 = verts->v * ps2_tex->Height;
|
|
||||||
|
|
||||||
c2 = verts->color;
|
|
||||||
|
|
||||||
verts++;
|
|
||||||
|
|
||||||
x3 = verts->x;
|
|
||||||
y3 = verts->y;
|
|
||||||
|
|
||||||
u3 = verts->u * ps2_tex->Width;
|
|
||||||
v3 = verts->v * ps2_tex->Height;
|
|
||||||
|
|
||||||
c3 = verts->color;
|
|
||||||
|
|
||||||
verts++;
|
|
||||||
|
|
||||||
gsKit_TexManager_bind(data->gsGlobal, ps2_tex);
|
gsKit_TexManager_bind(data->gsGlobal, ps2_tex);
|
||||||
|
gsKit_prim_list_triangle_goraud_texture_uv_3d(data->gsGlobal, ps2_tex, count, verts);
|
||||||
gsKit_prim_triangle_goraud_texture(data->gsGlobal, ps2_tex, x1, y1, u1, v1, x2, y2, u2, v2, x3, y3, u3, v3, 0, c1, c2, c3);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
const GSPRIMPOINT *verts = (GSPRIMPOINT *) (vertices + cmd->data.draw.first);
|
const GSPRIMPOINT *verts = (GSPRIMPOINT *) (vertices + cmd->data.draw.first);
|
||||||
gsKit_prim_list_triangle_gouraud_3d(data->gsGlobal, count, verts);
|
gsKit_prim_list_triangle_gouraud_3d(data->gsGlobal, count, verts);
|
||||||
|
|
Loading…
Reference in New Issue