mirror of
https://github.com/FunkyFr3sh/cnc-ddraw.git
synced 2025-03-24 17:49:52 +01:00
use multiple textures and rotate them (d3d9)
This commit is contained in:
parent
80563db9db
commit
6b8208ad85
2
ddraw.rc
2
ddraw.rc
@ -4,7 +4,7 @@
|
|||||||
#define VERSION_MAJOR 1
|
#define VERSION_MAJOR 1
|
||||||
#define VERSION_MINOR 2
|
#define VERSION_MINOR 2
|
||||||
#define VERSION_BUILD 4
|
#define VERSION_BUILD 4
|
||||||
#define VERSION_REVISION 1
|
#define VERSION_REVISION 2
|
||||||
|
|
||||||
#define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION
|
#define VERSION VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION
|
||||||
#define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION)
|
#define VERSION_STRING ver_str(VERSION_MAJOR, VERSION_MINOR, VERSION_BUILD, VERSION_REVISION)
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
#include "d3d9shader.h"
|
#include "d3d9shader.h"
|
||||||
#include "render_d3d9.h"
|
#include "render_d3d9.h"
|
||||||
|
|
||||||
|
#define TEXTURE_COUNT 2
|
||||||
|
|
||||||
HMODULE Direct3D9_hModule;
|
HMODULE Direct3D9_hModule;
|
||||||
|
|
||||||
@ -13,8 +14,8 @@ static D3DPRESENT_PARAMETERS D3dpp;
|
|||||||
static LPDIRECT3D9 D3d;
|
static LPDIRECT3D9 D3d;
|
||||||
static LPDIRECT3DDEVICE9 D3dDev;
|
static LPDIRECT3DDEVICE9 D3dDev;
|
||||||
static LPDIRECT3DVERTEXBUFFER9 VertexBuf;
|
static LPDIRECT3DVERTEXBUFFER9 VertexBuf;
|
||||||
static IDirect3DTexture9 *SurfaceTex;
|
static IDirect3DTexture9 *SurfaceTex[TEXTURE_COUNT];
|
||||||
static IDirect3DTexture9 *PaletteTex;
|
static IDirect3DTexture9 *PaletteTex[TEXTURE_COUNT];
|
||||||
static IDirect3DPixelShader9 *PixelShader;
|
static IDirect3DPixelShader9 *PixelShader;
|
||||||
static float ScaleW;
|
static float ScaleW;
|
||||||
static float ScaleH;
|
static float ScaleH;
|
||||||
@ -70,7 +71,7 @@ BOOL Direct3D9_Create()
|
|||||||
D3DADAPTER_DEFAULT,
|
D3DADAPTER_DEFAULT,
|
||||||
D3DDEVTYPE_HAL,
|
D3DDEVTYPE_HAL,
|
||||||
ddraw->hWnd,
|
ddraw->hWnd,
|
||||||
D3DCREATE_MULTITHREADED | behaviorFlags[i], //D3DCREATE_NOWINDOWCHANGES |
|
D3DCREATE_MULTITHREADED | behaviorFlags[i],
|
||||||
&D3dpp,
|
&D3dpp,
|
||||||
&D3dDev)))
|
&D3dDev)))
|
||||||
return D3dDev && CreateResources() && SetStates();
|
return D3dDev && CreateResources() && SetStates();
|
||||||
@ -110,16 +111,20 @@ BOOL Direct3D9_Release()
|
|||||||
VertexBuf = NULL;
|
VertexBuf = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (SurfaceTex)
|
int i;
|
||||||
|
for (i = 0; i < TEXTURE_COUNT; i++)
|
||||||
{
|
{
|
||||||
SurfaceTex->lpVtbl->Release(SurfaceTex);
|
if (SurfaceTex[i])
|
||||||
SurfaceTex = NULL;
|
{
|
||||||
}
|
SurfaceTex[i]->lpVtbl->Release(SurfaceTex[i]);
|
||||||
|
SurfaceTex[i] = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (PaletteTex)
|
if (PaletteTex[i])
|
||||||
{
|
{
|
||||||
PaletteTex->lpVtbl->Release(PaletteTex);
|
PaletteTex[i]->lpVtbl->Release(PaletteTex[i]);
|
||||||
PaletteTex = NULL;
|
PaletteTex[i] = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (PixelShader)
|
if (PixelShader)
|
||||||
@ -167,16 +172,24 @@ static BOOL CreateResources()
|
|||||||
|
|
||||||
err = err || !UpdateVertices(InterlockedExchangeAdd(&ddraw->incutscene, 0));
|
err = err || !UpdateVertices(InterlockedExchangeAdd(&ddraw->incutscene, 0));
|
||||||
|
|
||||||
err = err || FAILED(
|
int i;
|
||||||
D3dDev->lpVtbl->CreateTexture(D3dDev, texWidth, texHeight, 1, 0, D3DFMT_L8, D3DPOOL_MANAGED, &SurfaceTex, 0));
|
for (i = 0; i < TEXTURE_COUNT; i++)
|
||||||
|
{
|
||||||
|
err = err || FAILED(
|
||||||
|
D3dDev->lpVtbl->CreateTexture(D3dDev, texWidth, texHeight, 1, 0, D3DFMT_L8, D3DPOOL_MANAGED, &SurfaceTex[i], 0));
|
||||||
|
|
||||||
err = err || FAILED(
|
err = err || !SurfaceTex[i];
|
||||||
D3dDev->lpVtbl->CreateTexture(D3dDev, 256, 256, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &PaletteTex, 0));
|
|
||||||
|
err = err || FAILED(
|
||||||
|
D3dDev->lpVtbl->CreateTexture(D3dDev, 256, 256, 1, 0, D3DFMT_X8R8G8B8, D3DPOOL_MANAGED, &PaletteTex[i], 0));
|
||||||
|
|
||||||
|
err = err || !PaletteTex[i];
|
||||||
|
}
|
||||||
|
|
||||||
err = err || FAILED(
|
err = err || FAILED(
|
||||||
D3dDev->lpVtbl->CreatePixelShader(D3dDev, (DWORD *)PalettePixelShaderSrc, &PixelShader));
|
D3dDev->lpVtbl->CreatePixelShader(D3dDev, (DWORD *)PalettePixelShaderSrc, &PixelShader));
|
||||||
|
|
||||||
return SurfaceTex && PaletteTex && VertexBuf && PixelShader && !err;
|
return VertexBuf && PixelShader && !err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static BOOL SetStates()
|
static BOOL SetStates()
|
||||||
@ -185,8 +198,8 @@ static BOOL SetStates()
|
|||||||
|
|
||||||
err = err || FAILED(D3dDev->lpVtbl->SetFVF(D3dDev, D3DFVF_XYZRHW | D3DFVF_TEX1));
|
err = err || FAILED(D3dDev->lpVtbl->SetFVF(D3dDev, D3DFVF_XYZRHW | D3DFVF_TEX1));
|
||||||
err = err || FAILED(D3dDev->lpVtbl->SetStreamSource(D3dDev, 0, VertexBuf, 0, sizeof(CUSTOMVERTEX)));
|
err = err || FAILED(D3dDev->lpVtbl->SetStreamSource(D3dDev, 0, VertexBuf, 0, sizeof(CUSTOMVERTEX)));
|
||||||
err = err || FAILED(D3dDev->lpVtbl->SetTexture(D3dDev, 0, (IDirect3DBaseTexture9 *)SurfaceTex));
|
err = err || FAILED(D3dDev->lpVtbl->SetTexture(D3dDev, 0, (IDirect3DBaseTexture9 *)SurfaceTex[0]));
|
||||||
err = err || FAILED(D3dDev->lpVtbl->SetTexture(D3dDev, 1, (IDirect3DBaseTexture9 *)PaletteTex));
|
err = err || FAILED(D3dDev->lpVtbl->SetTexture(D3dDev, 1, (IDirect3DBaseTexture9 *)PaletteTex[0]));
|
||||||
err = err || FAILED(D3dDev->lpVtbl->SetPixelShader(D3dDev, PixelShader));
|
err = err || FAILED(D3dDev->lpVtbl->SetPixelShader(D3dDev, PixelShader));
|
||||||
|
|
||||||
D3DVIEWPORT9 viewData = {
|
D3DVIEWPORT9 viewData = {
|
||||||
@ -268,6 +281,8 @@ DWORD WINAPI render_d3d9_main(void)
|
|||||||
DrawFrameInfoStart();
|
DrawFrameInfoStart();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static int texIndex = 0, palIndex = 0;
|
||||||
|
|
||||||
if (MaxFPS > 0)
|
if (MaxFPS > 0)
|
||||||
tickStart = timeGetTime();
|
tickStart = timeGetTime();
|
||||||
|
|
||||||
@ -293,9 +308,13 @@ DWORD WINAPI render_d3d9_main(void)
|
|||||||
|
|
||||||
if (InterlockedExchange(&ddraw->render.surfaceUpdated, FALSE))
|
if (InterlockedExchange(&ddraw->render.surfaceUpdated, FALSE))
|
||||||
{
|
{
|
||||||
|
if (++texIndex >= TEXTURE_COUNT)
|
||||||
|
texIndex = 0;
|
||||||
|
|
||||||
RECT rc = { 0,0,ddraw->width,ddraw->height };
|
RECT rc = { 0,0,ddraw->width,ddraw->height };
|
||||||
|
|
||||||
if (SUCCEEDED(SurfaceTex->lpVtbl->LockRect(SurfaceTex, 0, &lock_rc, &rc, 0)))
|
if (SUCCEEDED(D3dDev->lpVtbl->SetTexture(D3dDev, 0, (IDirect3DBaseTexture9 *)SurfaceTex[texIndex])) &&
|
||||||
|
SUCCEEDED(SurfaceTex[texIndex]->lpVtbl->LockRect(SurfaceTex[texIndex], 0, &lock_rc, &rc, 0)))
|
||||||
{
|
{
|
||||||
unsigned char *src = (unsigned char *)ddraw->primary->surface;
|
unsigned char *src = (unsigned char *)ddraw->primary->surface;
|
||||||
unsigned char *dst = (unsigned char *)lock_rc.pBits;
|
unsigned char *dst = (unsigned char *)lock_rc.pBits;
|
||||||
@ -309,19 +328,23 @@ DWORD WINAPI render_d3d9_main(void)
|
|||||||
dst += lock_rc.Pitch;
|
dst += lock_rc.Pitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
SurfaceTex->lpVtbl->UnlockRect(SurfaceTex, 0);
|
SurfaceTex[texIndex]->lpVtbl->UnlockRect(SurfaceTex[texIndex], 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (InterlockedExchange(&ddraw->render.paletteUpdated, FALSE))
|
if (InterlockedExchange(&ddraw->render.paletteUpdated, FALSE))
|
||||||
{
|
{
|
||||||
|
if (++palIndex >= TEXTURE_COUNT)
|
||||||
|
palIndex = 0;
|
||||||
|
|
||||||
RECT rc = { 0,0,256,1 };
|
RECT rc = { 0,0,256,1 };
|
||||||
|
|
||||||
if (SUCCEEDED(PaletteTex->lpVtbl->LockRect(PaletteTex, 0, &lock_rc, &rc, 0)))
|
if (SUCCEEDED(D3dDev->lpVtbl->SetTexture(D3dDev, 1, (IDirect3DBaseTexture9 *)PaletteTex[palIndex])) &&
|
||||||
|
SUCCEEDED(PaletteTex[palIndex]->lpVtbl->LockRect(PaletteTex[palIndex], 0, &lock_rc, &rc, 0)))
|
||||||
{
|
{
|
||||||
memcpy(lock_rc.pBits, ddraw->primary->palette->data_rgb, 4 * 256);
|
memcpy(lock_rc.pBits, ddraw->primary->palette->data_rgb, 256 * sizeof(int));
|
||||||
|
|
||||||
PaletteTex->lpVtbl->UnlockRect(PaletteTex, 0);
|
PaletteTex[palIndex]->lpVtbl->UnlockRect(PaletteTex[palIndex], 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user