From 195f73ad7cf095e8c940ef353a9a131958f02e7f Mon Sep 17 00:00:00 2001 From: Sam Lantinga Date: Fri, 14 Jul 2006 07:41:16 +0000 Subject: [PATCH] Yay! D3D renderer works! --- src/video/win32/SDL_d3drender.c | 54 +++++++++++++++++++++------------ test/testsprite2.c | 30 +++++++++--------- 2 files changed, 50 insertions(+), 34 deletions(-) diff --git a/src/video/win32/SDL_d3drender.c b/src/video/win32/SDL_d3drender.c index ebbc5fab1..9798db6d3 100644 --- a/src/video/win32/SDL_d3drender.c +++ b/src/video/win32/SDL_d3drender.c @@ -113,7 +113,8 @@ typedef struct typedef struct { float x, y, z; - float tu, tv; + float rhw; + float u, v; } Vertex; static void @@ -330,9 +331,17 @@ SDL_D3D_CreateRenderer(SDL_Window * window, Uint32 flags) data->beginScene = SDL_TRUE; /* Set up parameters for rendering */ + IDirect3DDevice9_SetVertexShader(data->device, NULL); + IDirect3DDevice9_SetFVF(data->device, D3DFVF_XYZRHW | D3DFVF_TEX1); IDirect3DDevice9_SetRenderState(data->device, D3DRS_CULLMODE, D3DCULL_NONE); - IDirect3DDevice9_SetFVF(data->device, D3DFVF_XYZ | D3DFVF_TEX1); + 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; } @@ -560,7 +569,7 @@ SDL_D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, SDL_D3D_TextureData *texturedata = (SDL_D3D_TextureData *) texture->driverdata; float minx, miny, maxx, maxy; - float mintu, maxtu, mintv, maxtv; + float minu, maxu, minv, maxv; Vertex vertices[4]; HRESULT result; @@ -569,36 +578,43 @@ SDL_D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, data->beginScene = SDL_FALSE; } - minx = (float) dstrect->x; - miny = (float) dstrect->y; - maxx = (float) dstrect->x + dstrect->w; - maxy = (float) dstrect->y + dstrect->h; + minx = (float) dstrect->x - 0.5f; + miny = (float) dstrect->y - 0.5f; + maxx = (float) dstrect->x + dstrect->w - 0.5f; + maxy = (float) dstrect->y + dstrect->h - 0.5f; - mintu = (float) srcrect->x / texture->w; - maxtu = (float) (srcrect->x + srcrect->w) / texture->w; - mintv = (float) srcrect->y / texture->h; - maxtv = (float) (srcrect->y + srcrect->h) / texture->h; + minu = (float) srcrect->x / texture->w; + maxu = (float) (srcrect->x + srcrect->w) / texture->w; + minv = (float) srcrect->y / texture->h; + maxv = (float) (srcrect->y + srcrect->h) / texture->h; vertices[0].x = minx; vertices[0].y = miny; vertices[0].z = 0.0f; - vertices[0].tu = mintu; - vertices[0].tv = mintv; + vertices[0].rhw = 1.0f; + vertices[0].u = minu; + vertices[0].v = minv; + vertices[1].x = maxx; vertices[1].y = miny; vertices[1].z = 0.0f; - vertices[1].tu = maxtu; - vertices[1].tv = mintv; + vertices[1].rhw = 1.0f; + vertices[1].u = maxu; + vertices[1].v = minv; + vertices[2].x = maxx; vertices[2].y = maxy; vertices[2].z = 0.0f; - vertices[2].tu = maxtu; - vertices[2].tv = maxtv; + vertices[2].rhw = 1.0f; + vertices[2].u = maxu; + vertices[2].v = maxv; + vertices[3].x = minx; vertices[3].y = maxy; vertices[3].z = 0.0f; - vertices[3].tu = mintu; - vertices[3].tv = maxtv; + vertices[3].rhw = 1.0f; + vertices[3].u = minu; + vertices[3].v = maxv; result = IDirect3DDevice9_SetTexture(data->device, 0, diff --git a/test/testsprite2.c b/test/testsprite2.c index b5b2b4d1a..b648edde4 100644 --- a/test/testsprite2.c +++ b/test/testsprite2.c @@ -5,7 +5,7 @@ #include "SDL.h" -#define NUM_WINDOWS 1 +#define NUM_WINDOWS 4 #define WINDOW_W 640 #define WINDOW_H 480 #define NUM_SPRITES 100 @@ -141,22 +141,23 @@ main(int argc, char *argv[]) num_sprites = NUM_SPRITES; window_w = WINDOW_W; window_h = WINDOW_H; - while (argc > 1) { - if (strcmp(argv[argc - 1], "-width") == 0) { - window_w = atoi(argv[argc]); - --argc; - } else if (strcmp(argv[argc - 1], "-height") == 0) { - window_h = atoi(argv[argc]); - --argc; - } else if (strcmp(argv[argc - 1], "-fullscreen") == 0) { + for (i = 1; i < argc; ++i) { + if (strcmp(argv[i], "-width") == 0 && (i + 1 < argc)) { + window_w = atoi(argv[++i]); + } else if (strcmp(argv[i], "-height") == 0 && (i + 1 < argc)) { + window_h = atoi(argv[++i]); + } else if (strcmp(argv[i], "-windows") == 0 && (i + 1 < argc)) { + num_windows = atoi(argv[++i]); + window_flags &= ~SDL_WINDOW_FULLSCREEN; + } else if (strcmp(argv[i], "-fullscreen") == 0) { num_windows = 1; window_flags |= SDL_WINDOW_FULLSCREEN; - --argc; - } else if (isdigit(argv[argc][0])) { - num_sprites = atoi(argv[argc]); + } else if (isdigit(argv[i][0])) { + num_sprites = atoi(argv[i]); } else { fprintf(stderr, - "Usage: %s [-width] [-height] [numsprites]\n", argv[0]); + "Usage: %s [-width N] [-height N] [-windows N] [-fullscreen] [numsprites]\n", + argv[0]); quit(1); } } @@ -240,8 +241,7 @@ main(int argc, char *argv[]) } break; case SDL_KEYDOWN: - ///* Any keypress quits the app... */ - break; + /* Any keypress quits the app... */ case SDL_QUIT: done = 1; break;