mirror of https://github.com/encounter/SDL.git
Add an option to 'testsprite2' to render slicing into triangles.
[--use-rendergeometry mode1|mode2] mode1: Draw sprite2 as triangles that can be recombined as rect by software renderer mode2: Draw sprite2 as triangles that can *not* be recombined as rect by software renderer Use an 'indices' array
This commit is contained in:
parent
47db47c1cc
commit
53bcb3e0e9
|
@ -39,6 +39,7 @@ static int sprite_w, sprite_h;
|
||||||
static SDL_BlendMode blendMode = SDL_BLENDMODE_BLEND;
|
static SDL_BlendMode blendMode = SDL_BLENDMODE_BLEND;
|
||||||
static Uint32 next_fps_check, frames;
|
static Uint32 next_fps_check, frames;
|
||||||
static const Uint32 fps_check_delay = 5000;
|
static const Uint32 fps_check_delay = 5000;
|
||||||
|
static int use_rendergeometry = 0;
|
||||||
|
|
||||||
/* Number of iterations to move sprites - used for visual tests. */
|
/* Number of iterations to move sprites - used for visual tests. */
|
||||||
/* -1: infinite random moves (default); >=0: enables N deterministic moves */
|
/* -1: infinite random moves (default); >=0: enables N deterministic moves */
|
||||||
|
@ -175,7 +176,38 @@ MoveSprites(SDL_Renderer * renderer, SDL_Texture * sprite)
|
||||||
temp.y = 1;
|
temp.y = 1;
|
||||||
temp.w = sprite_w;
|
temp.w = sprite_w;
|
||||||
temp.h = sprite_h;
|
temp.h = sprite_h;
|
||||||
SDL_RenderFillRect(renderer, &temp);
|
if (use_rendergeometry == 0) {
|
||||||
|
SDL_RenderFillRect(renderer, &temp);
|
||||||
|
} else {
|
||||||
|
/* Draw two triangles, filled, uniform */
|
||||||
|
SDL_Color color;
|
||||||
|
SDL_Vertex verts[3];
|
||||||
|
SDL_zeroa(verts);
|
||||||
|
color.r = 0xFF;
|
||||||
|
color.g = 0xFF;
|
||||||
|
color.b = 0xFF;
|
||||||
|
color.a = 0xFF;
|
||||||
|
|
||||||
|
verts[0].position.x = temp.x;
|
||||||
|
verts[0].position.y = temp.y;
|
||||||
|
verts[0].color = color;
|
||||||
|
|
||||||
|
verts[1].position.x = temp.x + temp.w;
|
||||||
|
verts[1].position.y = temp.y;
|
||||||
|
verts[1].color = color;
|
||||||
|
|
||||||
|
verts[2].position.x = temp.x + temp.w;
|
||||||
|
verts[2].position.y = temp.y + temp.h;
|
||||||
|
verts[2].color = color;
|
||||||
|
|
||||||
|
SDL_RenderGeometry(renderer, NULL, verts, 3, NULL, 0);
|
||||||
|
|
||||||
|
verts[1].position.x = temp.x;
|
||||||
|
verts[1].position.y = temp.y + temp.h;
|
||||||
|
verts[1].color = color;
|
||||||
|
|
||||||
|
SDL_RenderGeometry(renderer, NULL, verts, 3, NULL, 0);
|
||||||
|
}
|
||||||
SDL_RenderCopy(renderer, sprite, NULL, &temp);
|
SDL_RenderCopy(renderer, sprite, NULL, &temp);
|
||||||
temp.x = viewport.w-sprite_w-1;
|
temp.x = viewport.w-sprite_w-1;
|
||||||
temp.y = 1;
|
temp.y = 1;
|
||||||
|
@ -220,7 +252,7 @@ MoveSprites(SDL_Renderer * renderer, SDL_Texture * sprite)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Countdown sprite-move iterations and disable color changes at iteration end - used for visual tests. */
|
/* Countdown sprite-move iterations and disable color changes at iteration end - used for visual tests. */
|
||||||
if (iterations > 0) {
|
if (iterations > 0) {
|
||||||
iterations--;
|
iterations--;
|
||||||
|
@ -232,11 +264,160 @@ MoveSprites(SDL_Renderer * renderer, SDL_Texture * sprite)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Draw sprites */
|
/* Draw sprites */
|
||||||
for (i = 0; i < num_sprites; ++i) {
|
if (use_rendergeometry == 0) {
|
||||||
position = &positions[i];
|
for (i = 0; i < num_sprites; ++i) {
|
||||||
|
position = &positions[i];
|
||||||
|
|
||||||
/* Blit the sprite onto the screen */
|
/* Blit the sprite onto the screen */
|
||||||
SDL_RenderCopy(renderer, sprite, NULL, position);
|
SDL_RenderCopy(renderer, sprite, NULL, position);
|
||||||
|
}
|
||||||
|
} else if (use_rendergeometry == 1) {
|
||||||
|
/*
|
||||||
|
* 0--1
|
||||||
|
* | /|
|
||||||
|
* |/ |
|
||||||
|
* 3--2
|
||||||
|
*
|
||||||
|
* Draw sprite2 as triangles that can be recombined as rect by software renderer
|
||||||
|
*/
|
||||||
|
SDL_Vertex *verts = (SDL_Vertex *) SDL_malloc(num_sprites * sizeof (SDL_Vertex) * 6);
|
||||||
|
SDL_Vertex *verts2 = verts;
|
||||||
|
if (verts) {
|
||||||
|
SDL_Color color;
|
||||||
|
SDL_GetTextureColorMod(sprite, &color.r, &color.g, &color.b);
|
||||||
|
SDL_GetTextureAlphaMod(sprite, &color.a);
|
||||||
|
for (i = 0; i < num_sprites; ++i) {
|
||||||
|
position = &positions[i];
|
||||||
|
/* 0 */
|
||||||
|
verts->position.x = position->x;
|
||||||
|
verts->position.y = position->y;
|
||||||
|
verts->color = color;
|
||||||
|
verts->tex_coord.x = 0.0f;
|
||||||
|
verts->tex_coord.y = 0.0f;
|
||||||
|
verts++;
|
||||||
|
/* 1 */
|
||||||
|
verts->position.x = position->x + position->w;
|
||||||
|
verts->position.y = position->y;
|
||||||
|
verts->color = color;
|
||||||
|
verts->tex_coord.x = 1.0f;
|
||||||
|
verts->tex_coord.y = 0.0f;
|
||||||
|
verts++;
|
||||||
|
/* 2 */
|
||||||
|
verts->position.x = position->x + position->w;
|
||||||
|
verts->position.y = position->y + position->h;
|
||||||
|
verts->color = color;
|
||||||
|
verts->tex_coord.x = 1.0f;
|
||||||
|
verts->tex_coord.y = 1.0f;
|
||||||
|
verts++;
|
||||||
|
/* 0 */
|
||||||
|
verts->position.x = position->x;
|
||||||
|
verts->position.y = position->y;
|
||||||
|
verts->color = color;
|
||||||
|
verts->tex_coord.x = 0.0f;
|
||||||
|
verts->tex_coord.y = 0.0f;
|
||||||
|
verts++;
|
||||||
|
/* 2 */
|
||||||
|
verts->position.x = position->x + position->w;
|
||||||
|
verts->position.y = position->y + position->h;
|
||||||
|
verts->color = color;
|
||||||
|
verts->tex_coord.x = 1.0f;
|
||||||
|
verts->tex_coord.y = 1.0f;
|
||||||
|
verts++;
|
||||||
|
/* 3 */
|
||||||
|
verts->position.x = position->x;
|
||||||
|
verts->position.y = position->y + position->h;
|
||||||
|
verts->color = color;
|
||||||
|
verts->tex_coord.x = 0.0f;
|
||||||
|
verts->tex_coord.y = 1.0f;
|
||||||
|
verts++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Blit sprites as triangles onto the screen */
|
||||||
|
SDL_RenderGeometry(renderer, sprite, verts2, num_sprites * 6, NULL, 0);
|
||||||
|
SDL_free(verts2);
|
||||||
|
}
|
||||||
|
} else if (use_rendergeometry == 2) {
|
||||||
|
/* 0-----1
|
||||||
|
* |\ A /|
|
||||||
|
* | \ / |
|
||||||
|
* |D 2 B|
|
||||||
|
* | / \ |
|
||||||
|
* |/ C \|
|
||||||
|
* 3-----4
|
||||||
|
*
|
||||||
|
* Draw sprite2 as triangles that can *not* be recombined as rect by software renderer
|
||||||
|
* Use an 'indices' array
|
||||||
|
*/
|
||||||
|
SDL_Vertex *verts = (SDL_Vertex *) SDL_malloc(num_sprites * sizeof (SDL_Vertex) * 5);
|
||||||
|
SDL_Vertex *verts2 = verts;
|
||||||
|
int *indices = (int *) SDL_malloc(num_sprites * sizeof (int) * 4 * 3);
|
||||||
|
int *indices2 = indices;
|
||||||
|
if (verts && indices) {
|
||||||
|
int pos = 0;
|
||||||
|
SDL_Color color;
|
||||||
|
SDL_GetTextureColorMod(sprite, &color.r, &color.g, &color.b);
|
||||||
|
SDL_GetTextureAlphaMod(sprite, &color.a);
|
||||||
|
for (i = 0; i < num_sprites; ++i) {
|
||||||
|
position = &positions[i];
|
||||||
|
/* 0 */
|
||||||
|
verts->position.x = position->x;
|
||||||
|
verts->position.y = position->y;
|
||||||
|
verts->color = color;
|
||||||
|
verts->tex_coord.x = 0.0f;
|
||||||
|
verts->tex_coord.y = 0.0f;
|
||||||
|
verts++;
|
||||||
|
/* 1 */
|
||||||
|
verts->position.x = position->x + position->w;
|
||||||
|
verts->position.y = position->y;
|
||||||
|
verts->color = color;
|
||||||
|
verts->tex_coord.x = 1.0f;
|
||||||
|
verts->tex_coord.y = 0.0f;
|
||||||
|
verts++;
|
||||||
|
/* 2 */
|
||||||
|
verts->position.x = position->x + position->w / 2.0f;
|
||||||
|
verts->position.y = position->y + position->h / 2.0f;
|
||||||
|
verts->color = color;
|
||||||
|
verts->tex_coord.x = 0.5f;
|
||||||
|
verts->tex_coord.y = 0.5f;
|
||||||
|
verts++;
|
||||||
|
/* 3 */
|
||||||
|
verts->position.x = position->x;
|
||||||
|
verts->position.y = position->y + position->h;
|
||||||
|
verts->color = color;
|
||||||
|
verts->tex_coord.x = 0.0f;
|
||||||
|
verts->tex_coord.y = 1.0f;
|
||||||
|
verts++;
|
||||||
|
/* 4 */
|
||||||
|
verts->position.x = position->x + position->w;
|
||||||
|
verts->position.y = position->y + position->h;
|
||||||
|
verts->color = color;
|
||||||
|
verts->tex_coord.x = 1.0f;
|
||||||
|
verts->tex_coord.y = 1.0f;
|
||||||
|
verts++;
|
||||||
|
/* A */
|
||||||
|
*indices++ = pos + 0;
|
||||||
|
*indices++ = pos + 1;
|
||||||
|
*indices++ = pos + 2;
|
||||||
|
/* B */
|
||||||
|
*indices++ = pos + 1;
|
||||||
|
*indices++ = pos + 2;
|
||||||
|
*indices++ = pos + 4;
|
||||||
|
/* C */
|
||||||
|
*indices++ = pos + 3;
|
||||||
|
*indices++ = pos + 2;
|
||||||
|
*indices++ = pos + 4;
|
||||||
|
/* D */
|
||||||
|
*indices++ = pos + 3;
|
||||||
|
*indices++ = pos + 2;
|
||||||
|
*indices++ = pos + 0;
|
||||||
|
pos += 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Blit sprites as triangles onto the screen */
|
||||||
|
SDL_RenderGeometry(renderer, sprite, verts2, num_sprites * 5, indices2, num_sprites * 4 * 3);
|
||||||
|
SDL_free(verts2);
|
||||||
|
SDL_free(indices2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Update the screen! */
|
/* Update the screen! */
|
||||||
|
@ -331,6 +512,20 @@ main(int argc, char *argv[])
|
||||||
} else if (SDL_strcasecmp(argv[i], "--cyclealpha") == 0) {
|
} else if (SDL_strcasecmp(argv[i], "--cyclealpha") == 0) {
|
||||||
cycle_alpha = SDL_TRUE;
|
cycle_alpha = SDL_TRUE;
|
||||||
consumed = 1;
|
consumed = 1;
|
||||||
|
} else if (SDL_strcasecmp(argv[i], "--use-rendergeometry") == 0) {
|
||||||
|
if (argv[i + 1]) {
|
||||||
|
if (SDL_strcasecmp(argv[i + 1], "mode1") == 0) {
|
||||||
|
/* Draw sprite2 as triangles that can be recombined as rect by software renderer */
|
||||||
|
use_rendergeometry = 1;
|
||||||
|
} else if (SDL_strcasecmp(argv[i + 1], "mode2") == 0) {
|
||||||
|
/* Draw sprite2 as triangles that can *not* be recombined as rect by software renderer
|
||||||
|
* Use an 'indices' array */
|
||||||
|
use_rendergeometry = 2;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
consumed = 2;
|
||||||
} else if (SDL_isdigit(*argv[i])) {
|
} else if (SDL_isdigit(*argv[i])) {
|
||||||
num_sprites = SDL_atoi(argv[i]);
|
num_sprites = SDL_atoi(argv[i]);
|
||||||
consumed = 1;
|
consumed = 1;
|
||||||
|
@ -340,7 +535,15 @@ main(int argc, char *argv[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (consumed < 0) {
|
if (consumed < 0) {
|
||||||
static const char *options[] = { "[--blend none|blend|add|mod]", "[--cyclecolor]", "[--cyclealpha]", "[--iterations N]", "[num_sprites]", "[icon.bmp]", NULL };
|
static const char *options[] = {
|
||||||
|
"[--blend none|blend|add|mod]",
|
||||||
|
"[--cyclecolor]",
|
||||||
|
"[--cyclealpha]",
|
||||||
|
"[--iterations N]",
|
||||||
|
"[--use-rendergeometry mode1|mode2]",
|
||||||
|
"[num_sprites]",
|
||||||
|
"[icon.bmp]",
|
||||||
|
NULL };
|
||||||
SDLTest_CommonLogUsage(state, argv[0], options);
|
SDLTest_CommonLogUsage(state, argv[0], options);
|
||||||
quit(1);
|
quit(1);
|
||||||
}
|
}
|
||||||
|
@ -374,7 +577,7 @@ main(int argc, char *argv[])
|
||||||
quit(2);
|
quit(2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Position sprites and set their velocities using the fuzzer */
|
/* Position sprites and set their velocities using the fuzzer */
|
||||||
if (iterations >= 0) {
|
if (iterations >= 0) {
|
||||||
/* Deterministic seed - used for visual tests */
|
/* Deterministic seed - used for visual tests */
|
||||||
seed = (Uint64)iterations;
|
seed = (Uint64)iterations;
|
||||||
|
|
Loading…
Reference in New Issue