Implemented blend modes in the D3D renderer

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%401961
This commit is contained in:
Sam Lantinga 2006-07-19 05:03:21 +00:00
parent f2c829616b
commit 9eea51e280
5 changed files with 64 additions and 13 deletions

View File

@ -750,6 +750,8 @@ SDL_strcasecmp(const char *str1, const char *str2)
++str1;
++str2;
}
a = SDL_tolower(*str1);
b = SDL_tolower(*str2);
return (int) ((unsigned char) a - (unsigned char) b);
}
#endif
@ -769,6 +771,8 @@ SDL_strncasecmp(const char *str1, const char *str2, size_t maxlen)
++str2;
--maxlen;
}
a = SDL_tolower(*str1);
b = SDL_tolower(*str2);
return (int) ((unsigned char) a - (unsigned char) b);
}
#endif

View File

@ -359,12 +359,6 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
IDirect3DDevice9_SetRenderState(data->device, D3DRS_CULLMODE,
D3DCULL_NONE);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_LIGHTING, FALSE);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
TRUE);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
D3DBLEND_SRCALPHA);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
D3DBLEND_INVSRCALPHA);
return renderer;
}
@ -627,6 +621,38 @@ D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
vertices[3].u = minu;
vertices[3].v = maxv;
switch (blendMode) {
case SDL_TextureBlendMode_None:
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
FALSE);
break;
case SDL_TextureBlendMode_Mask:
case SDL_TextureBlendMode_Blend:
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
TRUE);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
D3DBLEND_SRCALPHA);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
D3DBLEND_INVSRCALPHA);
break;
case SDL_TextureBlendMode_Add:
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
TRUE);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
D3DBLEND_SRCALPHA);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
D3DBLEND_ONE);
break;
case SDL_TextureBlendMode_Mod:
IDirect3DDevice9_SetRenderState(data->device, D3DRS_ALPHABLENDENABLE,
TRUE);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_SRCBLEND,
D3DBLEND_ZERO);
IDirect3DDevice9_SetRenderState(data->device, D3DRS_DESTBLEND,
D3DBLEND_SRCCOLOR);
break;
}
result =
IDirect3DDevice9_SetTexture(data->device, 0,
(IDirect3DBaseTexture9 *) texturedata->

View File

@ -105,7 +105,7 @@ CommonArg(CommonState * state, int index)
}
if (SDL_strcasecmp(argv[index], "--windows") == 0) {
++index;
if (!argv[index] || !isdigit(*argv[index])) {
if (!argv[index] || !SDL_isdigit(*argv[index])) {
return -1;
}
if (!(state->window_flags & SDL_WINDOW_FULLSCREEN)) {

View File

@ -193,7 +193,7 @@ main(int argc, char *argv[])
}
}
if (consumed < 0) {
fprintf(stderr, "Usage: %s [--fsaa] [--accel] %s", argv[0],
fprintf(stderr, "Usage: %s %s [--fsaa] [--accel]", argv[0],
CommonUsage(state));
quit(1);
}

View File

@ -8,7 +8,7 @@
#define NUM_SPRITES 100
#define MAX_SPEED 1
#define BACKGROUND 0x00FFFFFF
#define BACKGROUND 0x00A0A0A0
static CommonState *state;
static int num_sprites;
@ -16,6 +16,7 @@ static SDL_TextureID *sprites;
static SDL_Rect *positions;
static SDL_Rect *velocities;
static int sprite_w, sprite_h;
static SDL_TextureBlendMode blendMode = SDL_TextureBlendMode_Mask;
/* Call this instead of exit(), so we can clean up SDL: atexit() is evil. */
static void
@ -107,7 +108,7 @@ MoveSprites(SDL_WindowID window, SDL_TextureID sprite)
}
/* Blit the sprite onto the screen */
SDL_RenderCopy(sprite, NULL, position, SDL_TextureBlendMode_Mask,
SDL_RenderCopy(sprite, NULL, position, blendMode,
SDL_TextureScaleMode_None);
}
@ -135,11 +136,31 @@ main(int argc, char *argv[])
consumed = CommonArg(state, i);
if (consumed == 0) {
num_sprites = SDL_atoi(argv[i]);
consumed = 1;
consumed = -1;
if (SDL_strcasecmp(argv[i], "--blend") == 0) {
if (argv[i + 1]) {
if (SDL_strcasecmp(argv[i + 1], "none") == 0) {
blendMode = SDL_TextureBlendMode_None;
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "blend") == 0) {
blendMode = SDL_TextureBlendMode_Blend;
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "add") == 0) {
blendMode = SDL_TextureBlendMode_Add;
consumed = 2;
} else if (SDL_strcasecmp(argv[i + 1], "mod") == 0) {
blendMode = SDL_TextureBlendMode_Mod;
consumed = 2;
}
}
} else if (SDL_isdigit(*argv[i])) {
num_sprites = SDL_atoi(argv[i]);
consumed = 1;
}
}
if (consumed < 0) {
fprintf(stderr, "Usage: %s %s", argv[0], CommonUsage(state));
fprintf(stderr, "Usage: %s %s [--blend none|blend|add|mod]",
argv[0], CommonUsage(state));
quit(1);
}
i += consumed;