Skip to content
This repository has been archived by the owner. It is now read-only.
Permalink
Browse files

Implemented blend modes in the D3D renderer

  • Loading branch information
slouken committed Jul 19, 2006
1 parent b60e8d8 commit 4366cd6214eea98c48826f4fde928eac40338557
Showing with 64 additions and 13 deletions.
  1. +4 −0 src/stdlib/SDL_string.c
  2. +32 −6 src/video/win32/SDL_d3drender.c
  3. +1 −1 test/common.c
  4. +1 −1 test/testgl2.c
  5. +26 −5 test/testsprite2.c
@@ -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
@@ -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->
@@ -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)) {
@@ -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);
}
@@ -8,14 +8,15 @@

#define NUM_SPRITES 100
#define MAX_SPEED 1
#define BACKGROUND 0x00FFFFFF
#define BACKGROUND 0x00A0A0A0

static CommonState *state;
static int num_sprites;
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;

0 comments on commit 4366cd6

Please sign in to comment.