d3d9 improvements
This commit is contained in:
parent
374f951d7c
commit
5a16d845aa
@ -185,11 +185,14 @@ int vertFormatMap[] = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
void*
|
void*
|
||||||
createIndexBuffer(uint32 length)
|
createIndexBuffer(uint32 length, bool dynamic)
|
||||||
{
|
{
|
||||||
#ifdef RW_D3D9
|
#ifdef RW_D3D9
|
||||||
IDirect3DIndexBuffer9 *ibuf;
|
IDirect3DIndexBuffer9 *ibuf;
|
||||||
d3ddevice->CreateIndexBuffer(length, D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &ibuf, 0);
|
if(dynamic)
|
||||||
|
d3ddevice->CreateIndexBuffer(length, D3DUSAGE_WRITEONLY|D3DUSAGE_DYNAMIC, D3DFMT_INDEX16, D3DPOOL_DEFAULT, &ibuf, 0);
|
||||||
|
else
|
||||||
|
d3ddevice->CreateIndexBuffer(length, D3DUSAGE_WRITEONLY, D3DFMT_INDEX16, D3DPOOL_MANAGED, &ibuf, 0);
|
||||||
if(ibuf)
|
if(ibuf)
|
||||||
d3d9Globals.numIndexBuffers++;
|
d3d9Globals.numIndexBuffers++;
|
||||||
return ibuf;
|
return ibuf;
|
||||||
@ -198,6 +201,20 @@ createIndexBuffer(uint32 length)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
destroyIndexBuffer(void *indexBuffer)
|
||||||
|
{
|
||||||
|
#ifdef RW_D3D9
|
||||||
|
if(indexBuffer){
|
||||||
|
if(((IUnknown*)indexBuffer)->Release() != 0)
|
||||||
|
printf("indexBuffer wasn't destroyed\n");
|
||||||
|
d3d9Globals.numIndexBuffers--;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
rwFree(indexBuffer);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
uint16*
|
uint16*
|
||||||
lockIndices(void *indexBuffer, uint32 offset, uint32 size, uint32 flags)
|
lockIndices(void *indexBuffer, uint32 offset, uint32 size, uint32 flags)
|
||||||
{
|
{
|
||||||
@ -245,6 +262,20 @@ createVertexBuffer(uint32 length, uint32 fvf, bool dynamic)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
destroyVertexBuffer(void *vertexBuffer)
|
||||||
|
{
|
||||||
|
#ifdef RW_D3D9
|
||||||
|
if(vertexBuffer){
|
||||||
|
if(((IUnknown*)vertexBuffer)->Release() != 0)
|
||||||
|
printf("vertexBuffer wasn't destroyed\n");
|
||||||
|
d3d9Globals.numVertexBuffers--;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
rwFree(vertexBuffer);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
uint8*
|
uint8*
|
||||||
lockVertices(void *vertexBuffer, uint32 offset, uint32 size, uint32 flags)
|
lockVertices(void *vertexBuffer, uint32 offset, uint32 size, uint32 flags)
|
||||||
{
|
{
|
||||||
@ -318,6 +349,20 @@ createTexture(int32 width, int32 height, int32 numlevels, uint32 format)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
destroyTexture(void *texture)
|
||||||
|
{
|
||||||
|
#ifdef RW_D3D9
|
||||||
|
if(texture){
|
||||||
|
if(((IUnknown*)texture)->Release() != 0)
|
||||||
|
printf("texture wasn't destroyed\n");
|
||||||
|
d3d9Globals.numTextures--;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
rwFree(texture);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
uint8*
|
uint8*
|
||||||
lockTexture(void *texture, int32 level, int32 lockMode)
|
lockTexture(void *texture, int32 level, int32 lockMode)
|
||||||
{
|
{
|
||||||
@ -345,20 +390,6 @@ unlockTexture(void *texture, int32 level)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
deleteObject(void *object)
|
|
||||||
{
|
|
||||||
if(object == nil)
|
|
||||||
return;
|
|
||||||
#ifdef RW_D3D9
|
|
||||||
IUnknown *unk = (IUnknown*)object;
|
|
||||||
if(unk->Release() != 0)
|
|
||||||
printf("something wasn't destroyed\n");
|
|
||||||
#else
|
|
||||||
rwFree(object);
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
// Native Raster
|
// Native Raster
|
||||||
|
|
||||||
int32 nativeRasterOffset;
|
int32 nativeRasterOffset;
|
||||||
@ -983,14 +1014,8 @@ destroyNativeRaster(void *object, int32 offset, int32)
|
|||||||
D3dRaster *natras = PLUGINOFFSET(D3dRaster, raster, offset);
|
D3dRaster *natras = PLUGINOFFSET(D3dRaster, raster, offset);
|
||||||
#ifdef RW_D3D9
|
#ifdef RW_D3D9
|
||||||
destroyD3D9Raster(raster);
|
destroyD3D9Raster(raster);
|
||||||
if(natras->texture){
|
|
||||||
deleteObject(natras->texture);
|
|
||||||
d3d9Globals.numTextures--;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if(natras->texture)
|
|
||||||
deleteObject(natras->texture);
|
|
||||||
#endif
|
#endif
|
||||||
|
destroyTexture(natras->texture);
|
||||||
rwFree(natras->palette);
|
rwFree(natras->palette);
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
@ -89,8 +89,8 @@ destroyNativeData(void *object, int32, int32)
|
|||||||
geometry->instData = nil;
|
geometry->instData = nil;
|
||||||
InstanceData *inst = header->inst;
|
InstanceData *inst = header->inst;
|
||||||
for(uint32 i = 0; i < header->numMeshes; i++){
|
for(uint32 i = 0; i < header->numMeshes; i++){
|
||||||
deleteObject(inst->indexBuffer);
|
destroyIndexBuffer(inst->indexBuffer);
|
||||||
deleteObject(inst->vertexBuffer);
|
destroyVertexBuffer(inst->vertexBuffer);
|
||||||
inst++;
|
inst++;
|
||||||
}
|
}
|
||||||
rwFree(header->inst);
|
rwFree(header->inst);
|
||||||
@ -146,12 +146,14 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
|||||||
|
|
||||||
inst = header->inst;
|
inst = header->inst;
|
||||||
for(uint32 i = 0; i < header->numMeshes; i++){
|
for(uint32 i = 0; i < header->numMeshes; i++){
|
||||||
inst->indexBuffer = createIndexBuffer(inst->numIndices*2);
|
assert(inst->indexBuffer == nil);
|
||||||
|
inst->indexBuffer = createIndexBuffer(inst->numIndices*2, false);
|
||||||
uint16 *indices = lockIndices(inst->indexBuffer, 0, 0, 0);
|
uint16 *indices = lockIndices(inst->indexBuffer, 0, 0, 0);
|
||||||
stream->read(indices, 2*inst->numIndices);
|
stream->read(indices, 2*inst->numIndices);
|
||||||
unlockIndices(inst->indexBuffer);
|
unlockIndices(inst->indexBuffer);
|
||||||
|
|
||||||
inst->managed = 1;
|
inst->managed = 1;
|
||||||
|
assert(inst->vertexBuffer == nil);
|
||||||
inst->vertexBuffer = createVertexBuffer(inst->stride*inst->numVertices, 0, false);
|
inst->vertexBuffer = createVertexBuffer(inst->stride*inst->numVertices, 0, false);
|
||||||
uint8 *verts = lockVertices(inst->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
|
uint8 *verts = lockVertices(inst->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
|
||||||
stream->read(verts, inst->stride*inst->numVertices);
|
stream->read(verts, inst->stride*inst->numVertices);
|
||||||
@ -277,7 +279,7 @@ instance(rw::ObjPipeline *rwpipe, Atomic *atomic)
|
|||||||
inst->managed = 0;
|
inst->managed = 0;
|
||||||
inst->remapped = 0;
|
inst->remapped = 0;
|
||||||
|
|
||||||
inst->indexBuffer = createIndexBuffer(inst->numIndices*2);
|
inst->indexBuffer = createIndexBuffer(inst->numIndices*2, false);
|
||||||
uint16 *indices = lockIndices(inst->indexBuffer, 0, 0, 0);
|
uint16 *indices = lockIndices(inst->indexBuffer, 0, 0, 0);
|
||||||
if(inst->minVert == 0)
|
if(inst->minVert == 0)
|
||||||
memcpy(indices, mesh->indices, inst->numIndices*2);
|
memcpy(indices, mesh->indices, inst->numIndices*2);
|
||||||
@ -357,6 +359,7 @@ defaultInstanceCB(Geometry *geo, InstanceData *inst)
|
|||||||
inst->vertexShader = makeFVFDeclaration(geo->flags, geo->numTexCoordSets);
|
inst->vertexShader = makeFVFDeclaration(geo->flags, geo->numTexCoordSets);
|
||||||
inst->stride = getStride(geo->flags, geo->numTexCoordSets);
|
inst->stride = getStride(geo->flags, geo->numTexCoordSets);
|
||||||
|
|
||||||
|
assert(inst->vertexBuffer == nil);
|
||||||
inst->vertexBuffer = createVertexBuffer(inst->numVertices*inst->stride,
|
inst->vertexBuffer = createVertexBuffer(inst->numVertices*inst->stride,
|
||||||
inst->vertexShader, false);
|
inst->vertexShader, false);
|
||||||
inst->managed = 1;
|
inst->managed = 1;
|
||||||
|
@ -50,8 +50,8 @@ defaultRenderCB(Atomic *atomic, InstanceDataHeader *header)
|
|||||||
d3d::setRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL);
|
d3d::setRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_MATERIAL);
|
||||||
|
|
||||||
d3ddevice->SetFVF(inst->vertexShader);
|
d3ddevice->SetFVF(inst->vertexShader);
|
||||||
d3ddevice->SetStreamSource(0, (IDirect3DVertexBuffer9*)inst->vertexBuffer, 0, inst->stride);
|
setStreamSource(0, (IDirect3DVertexBuffer9*)inst->vertexBuffer, 0, inst->stride);
|
||||||
d3ddevice->SetIndices((IDirect3DIndexBuffer9*)inst->indexBuffer);
|
setIndices((IDirect3DIndexBuffer9*)inst->indexBuffer);
|
||||||
uint32 numPrim = inst->primType == D3DPT_TRIANGLESTRIP ? inst->numIndices-2 : inst->numIndices/3;
|
uint32 numPrim = inst->primType == D3DPT_TRIANGLESTRIP ? inst->numIndices-2 : inst->numIndices/3;
|
||||||
d3d::flushCache();
|
d3d::flushCache();
|
||||||
d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)inst->primType, inst->baseIndex,
|
d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)inst->primType, inst->baseIndex,
|
||||||
|
@ -73,6 +73,8 @@ createVertexDeclaration(VertexElement *elements)
|
|||||||
#ifdef RW_D3D9
|
#ifdef RW_D3D9
|
||||||
IDirect3DVertexDeclaration9 *decl = 0;
|
IDirect3DVertexDeclaration9 *decl = 0;
|
||||||
d3ddevice->CreateVertexDeclaration((D3DVERTEXELEMENT9*)elements, &decl);
|
d3ddevice->CreateVertexDeclaration((D3DVERTEXELEMENT9*)elements, &decl);
|
||||||
|
if(decl)
|
||||||
|
d3d9Globals.numVertexDeclarations++;
|
||||||
return decl;
|
return decl;
|
||||||
#else
|
#else
|
||||||
int n = 0;
|
int n = 0;
|
||||||
@ -85,6 +87,20 @@ createVertexDeclaration(VertexElement *elements)
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
destroyVertexDeclaration(void *declaration)
|
||||||
|
{
|
||||||
|
#ifdef RW_D3D9
|
||||||
|
if(declaration){
|
||||||
|
if(((IUnknown*)declaration)->Release() != 0)
|
||||||
|
printf("declaration wasn't destroyed\n");
|
||||||
|
d3d9Globals.numVertexDeclarations--;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
rwFree(declaration);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
uint32
|
uint32
|
||||||
getDeclaration(void *declaration, VertexElement *elements)
|
getDeclaration(void *declaration, VertexElement *elements)
|
||||||
{
|
{
|
||||||
@ -113,10 +129,10 @@ freeInstanceData(Geometry *geometry)
|
|||||||
InstanceDataHeader *header =
|
InstanceDataHeader *header =
|
||||||
(InstanceDataHeader*)geometry->instData;
|
(InstanceDataHeader*)geometry->instData;
|
||||||
geometry->instData = nil;
|
geometry->instData = nil;
|
||||||
deleteObject(header->vertexDeclaration);
|
destroyVertexDeclaration(header->vertexDeclaration);
|
||||||
deleteObject(header->indexBuffer);
|
destroyIndexBuffer(header->indexBuffer);
|
||||||
deleteObject(header->vertexStream[0].vertexBuffer);
|
destroyVertexBuffer(header->vertexStream[0].vertexBuffer);
|
||||||
deleteObject(header->vertexStream[1].vertexBuffer);
|
destroyVertexBuffer(header->vertexStream[1].vertexBuffer);
|
||||||
rwFree(header->inst);
|
rwFree(header->inst);
|
||||||
rwFree(header);
|
rwFree(header);
|
||||||
return;
|
return;
|
||||||
@ -183,7 +199,8 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
|||||||
stream->read(elements, numDeclarations*8);
|
stream->read(elements, numDeclarations*8);
|
||||||
header->vertexDeclaration = createVertexDeclaration(elements);
|
header->vertexDeclaration = createVertexDeclaration(elements);
|
||||||
|
|
||||||
header->indexBuffer = createIndexBuffer(header->totalNumIndex*2);
|
assert(header->indexBuffer == nil);
|
||||||
|
header->indexBuffer = createIndexBuffer(header->totalNumIndex*2, false);
|
||||||
uint16 *indices = lockIndices(header->indexBuffer, 0, 0, 0);
|
uint16 *indices = lockIndices(header->indexBuffer, 0, 0, 0);
|
||||||
stream->read(indices, 2*header->totalNumIndex);
|
stream->read(indices, 2*header->totalNumIndex);
|
||||||
unlockIndices(header->indexBuffer);
|
unlockIndices(header->indexBuffer);
|
||||||
@ -202,8 +219,8 @@ readNativeData(Stream *stream, int32, void *object, int32, int32)
|
|||||||
|
|
||||||
if(s->vertexBuffer == nil)
|
if(s->vertexBuffer == nil)
|
||||||
continue;
|
continue;
|
||||||
// TODO: unset managed flag when using morph targets.
|
// TODO: use dynamic VB when doing morphing
|
||||||
// also uses different buffer type and locks differently
|
assert(s->vertexBuffer == nil);
|
||||||
s->vertexBuffer = createVertexBuffer(s->stride*header->totalNumVertex, 0, false);
|
s->vertexBuffer = createVertexBuffer(s->stride*header->totalNumVertex, 0, false);
|
||||||
uint8 *verts = lockVertices(s->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
|
uint8 *verts = lockVertices(s->vertexBuffer, 0, 0, D3DLOCK_NOSYSLOCK);
|
||||||
stream->read(verts, s->stride*header->totalNumVertex);
|
stream->read(verts, s->stride*header->totalNumVertex);
|
||||||
@ -338,7 +355,7 @@ instanceMesh(rw::ObjPipeline *rwpipe, Geometry *geo)
|
|||||||
header->totalNumIndex = meshh->totalIndices;
|
header->totalNumIndex = meshh->totalIndices;
|
||||||
header->inst = rwNewT(InstanceData, header->numMeshes, MEMDUR_EVENT | ID_GEOMETRY);
|
header->inst = rwNewT(InstanceData, header->numMeshes, MEMDUR_EVENT | ID_GEOMETRY);
|
||||||
|
|
||||||
header->indexBuffer = createIndexBuffer(header->totalNumIndex*2);
|
header->indexBuffer = createIndexBuffer(header->totalNumIndex*2, false);
|
||||||
|
|
||||||
uint16 *indices = lockIndices(header->indexBuffer, 0, 0, 0);
|
uint16 *indices = lockIndices(header->indexBuffer, 0, 0, 0);
|
||||||
InstanceData *inst = header->inst;
|
InstanceData *inst = header->inst;
|
||||||
@ -522,12 +539,34 @@ defaultInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance)
|
|||||||
s->geometryFlags |= 0x4;
|
s->geometryFlags |= 0x4;
|
||||||
stride += 12;
|
stride += 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// We expect some attributes to always be there, use the constant buffer as fallback
|
||||||
|
if(!isPrelit){
|
||||||
|
dcl[i].stream = 2;
|
||||||
|
dcl[i].offset = offsetof(VertexConstantData, color);
|
||||||
|
dcl[i].type = D3DDECLTYPE_D3DCOLOR;
|
||||||
|
dcl[i].method = D3DDECLMETHOD_DEFAULT;
|
||||||
|
dcl[i].usage = D3DDECLUSAGE_COLOR;
|
||||||
|
dcl[i].usageIndex = 0;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if(geo->numTexCoordSets == 0){
|
||||||
|
dcl[i].stream = 2;
|
||||||
|
dcl[i].offset = offsetof(VertexConstantData, texCoors[0]);
|
||||||
|
dcl[i].type = D3DDECLTYPE_FLOAT2;
|
||||||
|
dcl[i].method = D3DDECLMETHOD_DEFAULT;
|
||||||
|
dcl[i].usage = D3DDECLUSAGE_TEXCOORD;
|
||||||
|
dcl[i].usageIndex = 0;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
dcl[i] = D3DDECL_END();
|
dcl[i] = D3DDECL_END();
|
||||||
s->stride = stride;
|
s->stride = stride;
|
||||||
|
|
||||||
assert(header->vertexDeclaration == nil);
|
assert(header->vertexDeclaration == nil);
|
||||||
header->vertexDeclaration = createVertexDeclaration((VertexElement*)dcl);
|
header->vertexDeclaration = createVertexDeclaration((VertexElement*)dcl);
|
||||||
|
|
||||||
|
assert(s->vertexBuffer == nil);
|
||||||
s->vertexBuffer = createVertexBuffer(header->totalNumVertex*s->stride, 0, false);
|
s->vertexBuffer = createVertexBuffer(header->totalNumVertex*s->stride, 0, false);
|
||||||
}else
|
}else
|
||||||
getDeclaration(header->vertexDeclaration, dcl);
|
getDeclaration(header->vertexDeclaration, dcl);
|
||||||
|
@ -143,10 +143,10 @@ void
|
|||||||
matfxRenderCB_Shader(Atomic *atomic, InstanceDataHeader *header)
|
matfxRenderCB_Shader(Atomic *atomic, InstanceDataHeader *header)
|
||||||
{
|
{
|
||||||
int vsBits;
|
int vsBits;
|
||||||
d3ddevice->SetStreamSource(0, (IDirect3DVertexBuffer9*)header->vertexStream[0].vertexBuffer,
|
setStreamSource(0, (IDirect3DVertexBuffer9*)header->vertexStream[0].vertexBuffer,
|
||||||
0, header->vertexStream[0].stride);
|
0, header->vertexStream[0].stride);
|
||||||
d3ddevice->SetIndices((IDirect3DIndexBuffer9*)header->indexBuffer);
|
setIndices((IDirect3DIndexBuffer9*)header->indexBuffer);
|
||||||
d3ddevice->SetVertexDeclaration((IDirect3DVertexDeclaration9*)header->vertexDeclaration);
|
setVertexDeclaration((IDirect3DVertexDeclaration9*)header->vertexDeclaration);
|
||||||
|
|
||||||
lastEnvFrame = nil;
|
lastEnvFrame = nil;
|
||||||
|
|
||||||
@ -197,11 +197,7 @@ matfxRenderCB_Shader(Atomic *atomic, InstanceDataHeader *header)
|
|||||||
|
|
||||||
inst++;
|
inst++;
|
||||||
}
|
}
|
||||||
|
|
||||||
d3d::setTexture(1, nil);
|
d3d::setTexture(1, nil);
|
||||||
|
|
||||||
setVertexShader(nil);
|
|
||||||
setPixelShader(nil);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VS_NAME g_vs20_main
|
#define VS_NAME g_vs20_main
|
||||||
|
@ -75,10 +75,10 @@ defaultRenderCB_Fix(Atomic *atomic, InstanceDataHeader *header)
|
|||||||
convMatrix(&world, f->getLTM());
|
convMatrix(&world, f->getLTM());
|
||||||
d3ddevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)&world);
|
d3ddevice->SetTransform(D3DTS_WORLD, (D3DMATRIX*)&world);
|
||||||
|
|
||||||
d3ddevice->SetStreamSource(0, (IDirect3DVertexBuffer9*)header->vertexStream[0].vertexBuffer,
|
setStreamSource(0, (IDirect3DVertexBuffer9*)header->vertexStream[0].vertexBuffer,
|
||||||
0, header->vertexStream[0].stride);
|
0, header->vertexStream[0].stride);
|
||||||
d3ddevice->SetIndices((IDirect3DIndexBuffer9*)header->indexBuffer);
|
setIndices((IDirect3DIndexBuffer9*)header->indexBuffer);
|
||||||
d3ddevice->SetVertexDeclaration((IDirect3DVertexDeclaration9*)header->vertexDeclaration);
|
setVertexDeclaration((IDirect3DVertexDeclaration9*)header->vertexDeclaration);
|
||||||
|
|
||||||
InstanceData *inst = header->inst;
|
InstanceData *inst = header->inst;
|
||||||
for(uint32 i = 0; i < header->numMeshes; i++){
|
for(uint32 i = 0; i < header->numMeshes; i++){
|
||||||
@ -131,10 +131,10 @@ void
|
|||||||
defaultRenderCB_Shader(Atomic *atomic, InstanceDataHeader *header)
|
defaultRenderCB_Shader(Atomic *atomic, InstanceDataHeader *header)
|
||||||
{
|
{
|
||||||
int vsBits;
|
int vsBits;
|
||||||
d3ddevice->SetStreamSource(0, (IDirect3DVertexBuffer9*)header->vertexStream[0].vertexBuffer,
|
setStreamSource(0, (IDirect3DVertexBuffer9*)header->vertexStream[0].vertexBuffer,
|
||||||
0, header->vertexStream[0].stride);
|
0, header->vertexStream[0].stride);
|
||||||
d3ddevice->SetIndices((IDirect3DIndexBuffer9*)header->indexBuffer);
|
setIndices((IDirect3DIndexBuffer9*)header->indexBuffer);
|
||||||
d3ddevice->SetVertexDeclaration((IDirect3DVertexDeclaration9*)header->vertexDeclaration);
|
setVertexDeclaration((IDirect3DVertexDeclaration9*)header->vertexDeclaration);
|
||||||
|
|
||||||
vsBits = lightingCB_Shader(atomic);
|
vsBits = lightingCB_Shader(atomic);
|
||||||
uploadMatrices(atomic->getFrame()->getLTM());
|
uploadMatrices(atomic->getFrame()->getLTM());
|
||||||
@ -177,8 +177,6 @@ defaultRenderCB_Shader(Atomic *atomic, InstanceDataHeader *header)
|
|||||||
drawInst(header, inst);
|
drawInst(header, inst);
|
||||||
inst++;
|
inst++;
|
||||||
}
|
}
|
||||||
setVertexShader(nil);
|
|
||||||
setPixelShader(nil);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -117,6 +117,25 @@ skinInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance)
|
|||||||
i++;
|
i++;
|
||||||
stride += 4;
|
stride += 4;
|
||||||
|
|
||||||
|
// We expect some attributes to always be there, use the constant buffer as fallback
|
||||||
|
if(!isPrelit){
|
||||||
|
dcl[i].stream = 2;
|
||||||
|
dcl[i].offset = offsetof(VertexConstantData, color);
|
||||||
|
dcl[i].type = D3DDECLTYPE_D3DCOLOR;
|
||||||
|
dcl[i].method = D3DDECLMETHOD_DEFAULT;
|
||||||
|
dcl[i].usage = D3DDECLUSAGE_COLOR;
|
||||||
|
dcl[i].usageIndex = 0;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
if(geo->numTexCoordSets == 0){
|
||||||
|
dcl[i].stream = 2;
|
||||||
|
dcl[i].offset = offsetof(VertexConstantData, texCoors[0]);
|
||||||
|
dcl[i].type = D3DDECLTYPE_FLOAT2;
|
||||||
|
dcl[i].method = D3DDECLMETHOD_DEFAULT;
|
||||||
|
dcl[i].usage = D3DDECLUSAGE_TEXCOORD;
|
||||||
|
dcl[i].usageIndex = 0;
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
dcl[i] = D3DDECL_END();
|
dcl[i] = D3DDECL_END();
|
||||||
s->stride = stride;
|
s->stride = stride;
|
||||||
@ -124,6 +143,7 @@ skinInstanceCB(Geometry *geo, InstanceDataHeader *header, bool32 reinstance)
|
|||||||
assert(header->vertexDeclaration == nil);
|
assert(header->vertexDeclaration == nil);
|
||||||
header->vertexDeclaration = createVertexDeclaration((VertexElement*)dcl);
|
header->vertexDeclaration = createVertexDeclaration((VertexElement*)dcl);
|
||||||
|
|
||||||
|
assert(s->vertexBuffer == nil);
|
||||||
s->vertexBuffer = createVertexBuffer(header->totalNumVertex*s->stride, 0, false);
|
s->vertexBuffer = createVertexBuffer(header->totalNumVertex*s->stride, 0, false);
|
||||||
}else
|
}else
|
||||||
getDeclaration(header->vertexDeclaration, dcl);
|
getDeclaration(header->vertexDeclaration, dcl);
|
||||||
@ -246,10 +266,10 @@ skinRenderCB(Atomic *atomic, InstanceDataHeader *header)
|
|||||||
{
|
{
|
||||||
int vsBits;
|
int vsBits;
|
||||||
|
|
||||||
d3ddevice->SetStreamSource(0, (IDirect3DVertexBuffer9*)header->vertexStream[0].vertexBuffer,
|
setStreamSource(0, (IDirect3DVertexBuffer9*)header->vertexStream[0].vertexBuffer,
|
||||||
0, header->vertexStream[0].stride);
|
0, header->vertexStream[0].stride);
|
||||||
d3ddevice->SetIndices((IDirect3DIndexBuffer9*)header->indexBuffer);
|
setIndices((IDirect3DIndexBuffer9*)header->indexBuffer);
|
||||||
d3ddevice->SetVertexDeclaration((IDirect3DVertexDeclaration9*)header->vertexDeclaration);
|
setVertexDeclaration((IDirect3DVertexDeclaration9*)header->vertexDeclaration);
|
||||||
|
|
||||||
vsBits = lightingCB_Shader(atomic);
|
vsBits = lightingCB_Shader(atomic);
|
||||||
uploadMatrices(atomic->getFrame()->getLTM());
|
uploadMatrices(atomic->getFrame()->getLTM());
|
||||||
@ -294,8 +314,6 @@ skinRenderCB(Atomic *atomic, InstanceDataHeader *header)
|
|||||||
drawInst(header, inst);
|
drawInst(header, inst);
|
||||||
inst++;
|
inst++;
|
||||||
}
|
}
|
||||||
setVertexShader(nil);
|
|
||||||
setPixelShader(nil);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#define VS_NAME g_vs20_main
|
#define VS_NAME g_vs20_main
|
||||||
|
@ -46,6 +46,18 @@ static DynamicVB *dynamicVBs;
|
|||||||
void addDynamicVB(uint32 length, uint32 fvf, IDirect3DVertexBuffer9 **buf);
|
void addDynamicVB(uint32 length, uint32 fvf, IDirect3DVertexBuffer9 **buf);
|
||||||
void removeDynamicVB(IDirect3DVertexBuffer9 **buf);
|
void removeDynamicVB(IDirect3DVertexBuffer9 **buf);
|
||||||
|
|
||||||
|
// Same thing for dynamic index buffers
|
||||||
|
struct DynamicIB
|
||||||
|
{
|
||||||
|
uint32 length;
|
||||||
|
IDirect3DIndexBuffer9 **buf;
|
||||||
|
DynamicIB *next;
|
||||||
|
};
|
||||||
|
static DynamicIB *dynamicIBs;
|
||||||
|
void addDynamicIB(uint32 length, IDirect3DIndexBuffer9 **buf);
|
||||||
|
void removeDynamicIB(IDirect3DIndexBuffer9 **buf);
|
||||||
|
|
||||||
|
|
||||||
struct RwRasterStateCache {
|
struct RwRasterStateCache {
|
||||||
Raster *raster;
|
Raster *raster;
|
||||||
Texture::Addressing addressingU;
|
Texture::Addressing addressingU;
|
||||||
@ -71,11 +83,14 @@ struct RwStateCache {
|
|||||||
};
|
};
|
||||||
static RwStateCache rwStateCache;
|
static RwStateCache rwStateCache;
|
||||||
|
|
||||||
|
void *constantVertexStream;
|
||||||
|
|
||||||
D3dShaderState d3dShaderState;
|
D3dShaderState d3dShaderState;
|
||||||
|
|
||||||
#define MAXNUMSTATES (D3DRS_BLENDOPALPHA+1)
|
#define MAXNUMSTATES (D3DRS_BLENDOPALPHA+1)
|
||||||
#define MAXNUMTEXSTATES (D3DTSS_CONSTANT+1)
|
#define MAXNUMTEXSTATES (D3DTSS_CONSTANT+1)
|
||||||
#define MAXNUMSAMPLERSTATES (D3DSAMP_DMAPOFFSET+1)
|
#define MAXNUMSAMPLERSTATES (D3DSAMP_DMAPOFFSET+1)
|
||||||
|
#define MAXNUMSTREAMS (3)
|
||||||
|
|
||||||
static int32 numDirtyStates;
|
static int32 numDirtyStates;
|
||||||
static uint32 dirtyStates[MAXNUMSTATES];
|
static uint32 dirtyStates[MAXNUMSTATES];
|
||||||
@ -85,6 +100,20 @@ static struct {
|
|||||||
} stateCache[MAXNUMSTATES];
|
} stateCache[MAXNUMSTATES];
|
||||||
static uint32 d3dStates[MAXNUMSTATES];
|
static uint32 d3dStates[MAXNUMSTATES];
|
||||||
|
|
||||||
|
// Things that aren't just integers
|
||||||
|
struct D3dDeviceCache {
|
||||||
|
IDirect3DVertexShader9 *vertexShader;
|
||||||
|
IDirect3DPixelShader9 *pixelShader;
|
||||||
|
IDirect3DVertexDeclaration9 *vertexDeclaration;
|
||||||
|
IDirect3DIndexBuffer9 *indices;
|
||||||
|
struct {
|
||||||
|
IDirect3DVertexBuffer9 *buffer;
|
||||||
|
uint32 offset;
|
||||||
|
uint32 stride;
|
||||||
|
} vertexStreams[MAXNUMSTREAMS];
|
||||||
|
};
|
||||||
|
static D3dDeviceCache deviceCache;
|
||||||
|
|
||||||
static int32 numDirtyTextureStageStates;
|
static int32 numDirtyTextureStageStates;
|
||||||
static struct {
|
static struct {
|
||||||
uint32 stage;
|
uint32 stage;
|
||||||
@ -256,6 +285,13 @@ restoreD3d9Device(void)
|
|||||||
for(s = 0; s < MAXNUMSTAGES; s++)
|
for(s = 0; s < MAXNUMSTAGES; s++)
|
||||||
d3ddevice->SetSamplerState(s, (D3DSAMPLERSTATETYPE)t, d3dSamplerStates[t][s]);
|
d3ddevice->SetSamplerState(s, (D3DSAMPLERSTATETYPE)t, d3dSamplerStates[t][s]);
|
||||||
d3ddevice->SetMaterial(&d3dmaterial);
|
d3ddevice->SetMaterial(&d3dmaterial);
|
||||||
|
|
||||||
|
d3ddevice->SetVertexShader(deviceCache.vertexShader);
|
||||||
|
d3ddevice->SetPixelShader(deviceCache.pixelShader);
|
||||||
|
d3ddevice->SetVertexDeclaration(deviceCache.vertexDeclaration);
|
||||||
|
d3ddevice->SetIndices(deviceCache.indices);
|
||||||
|
for(i = 0; i < MAXNUMSTREAMS; i++)
|
||||||
|
d3ddevice->SetStreamSource(i, deviceCache.vertexStreams[i].buffer, deviceCache.vertexStreams[i].offset, deviceCache.vertexStreams[i].stride);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -580,13 +616,50 @@ getRwRenderState(int32 state)
|
|||||||
void
|
void
|
||||||
setVertexShader(void *vs)
|
setVertexShader(void *vs)
|
||||||
{
|
{
|
||||||
d3ddevice->SetVertexShader((IDirect3DVertexShader9*)vs);
|
if(deviceCache.vertexShader != vs){
|
||||||
|
deviceCache.vertexShader = (IDirect3DVertexShader9*)vs;
|
||||||
|
d3ddevice->SetVertexShader(deviceCache.vertexShader);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
setPixelShader(void *ps)
|
setPixelShader(void *ps)
|
||||||
{
|
{
|
||||||
d3ddevice->SetPixelShader((IDirect3DPixelShader9*)ps);
|
if(deviceCache.pixelShader != ps){
|
||||||
|
deviceCache.pixelShader = (IDirect3DPixelShader9*)ps;
|
||||||
|
d3ddevice->SetPixelShader(deviceCache.pixelShader);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setIndices(void *indexBuffer)
|
||||||
|
{
|
||||||
|
if(deviceCache.indices != indexBuffer){
|
||||||
|
deviceCache.indices = (IDirect3DIndexBuffer9*)indexBuffer;
|
||||||
|
d3ddevice->SetIndices(deviceCache.indices);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setStreamSource(int n, void *buffer, uint32 offset, uint32 stride)
|
||||||
|
{
|
||||||
|
if(deviceCache.vertexStreams[n].buffer != buffer ||
|
||||||
|
deviceCache.vertexStreams[n].offset != offset ||
|
||||||
|
deviceCache.vertexStreams[n].stride != stride){
|
||||||
|
deviceCache.vertexStreams[n].buffer = (IDirect3DVertexBuffer9*)buffer;
|
||||||
|
deviceCache.vertexStreams[n].offset = offset;
|
||||||
|
deviceCache.vertexStreams[n].stride = stride;
|
||||||
|
d3ddevice->SetStreamSource(n, deviceCache.vertexStreams[n].buffer, offset, stride);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
setVertexDeclaration(void *declaration)
|
||||||
|
{
|
||||||
|
if(deviceCache.vertexDeclaration != declaration){
|
||||||
|
deviceCache.vertexDeclaration = (IDirect3DVertexDeclaration9*)declaration;
|
||||||
|
d3ddevice->SetVertexDeclaration(deviceCache.vertexDeclaration);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void*
|
void*
|
||||||
@ -595,7 +668,8 @@ createVertexShader(void *csosrc)
|
|||||||
void *shdr;
|
void *shdr;
|
||||||
if(d3ddevice->CreateVertexShader((DWORD*)csosrc, (IDirect3DVertexShader9**)&shdr) == D3D_OK)
|
if(d3ddevice->CreateVertexShader((DWORD*)csosrc, (IDirect3DVertexShader9**)&shdr) == D3D_OK)
|
||||||
return shdr;
|
return shdr;
|
||||||
d3d9Globals.numVertexShaders++;
|
if(shdr)
|
||||||
|
d3d9Globals.numVertexShaders++;
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -605,22 +679,27 @@ createPixelShader(void *csosrc)
|
|||||||
void *shdr;
|
void *shdr;
|
||||||
if(d3ddevice->CreatePixelShader((DWORD*)csosrc, (IDirect3DPixelShader9**)&shdr) == D3D_OK)
|
if(d3ddevice->CreatePixelShader((DWORD*)csosrc, (IDirect3DPixelShader9**)&shdr) == D3D_OK)
|
||||||
return shdr;
|
return shdr;
|
||||||
d3d9Globals.numPixelShaders++;
|
if(shdr)
|
||||||
|
d3d9Globals.numPixelShaders++;
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
destroyVertexShader(void *shader)
|
destroyVertexShader(void *shader)
|
||||||
{
|
{
|
||||||
((IDirect3DVertexShader9*)shader)->Release();
|
if(shader){
|
||||||
d3d9Globals.numVertexShaders--;
|
((IDirect3DVertexShader9*)shader)->Release();
|
||||||
|
d3d9Globals.numVertexShaders--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
destroyPixelShader(void *shader)
|
destroyPixelShader(void *shader)
|
||||||
{
|
{
|
||||||
((IDirect3DPixelShader9*)shader)->Release();
|
if(shader){
|
||||||
d3d9Globals.numPixelShaders--;
|
((IDirect3DPixelShader9*)shader)->Release();
|
||||||
|
d3d9Globals.numPixelShaders--;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -755,11 +834,8 @@ releaseVidmemRasters(void)
|
|||||||
raster = vmr->raster;
|
raster = vmr->raster;
|
||||||
natras = PLUGINOFFSET(D3dRaster, raster, nativeRasterOffset);
|
natras = PLUGINOFFSET(D3dRaster, raster, nativeRasterOffset);
|
||||||
if(raster->type == Raster::CAMERATEXTURE){
|
if(raster->type == Raster::CAMERATEXTURE){
|
||||||
if(natras->texture){
|
destroyTexture(natras->texture);
|
||||||
deleteObject(natras->texture);
|
natras->texture = nil;
|
||||||
d3d9Globals.numTextures--;
|
|
||||||
natras->texture = nil;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -817,11 +893,8 @@ releaseDynamicVBs(void)
|
|||||||
{
|
{
|
||||||
DynamicVB *dvb;
|
DynamicVB *dvb;
|
||||||
for(dvb = dynamicVBs; dvb; dvb = dvb->next){
|
for(dvb = dynamicVBs; dvb; dvb = dvb->next){
|
||||||
if(*dvb->buf){
|
destroyVertexBuffer(*dvb->buf);
|
||||||
deleteObject(*dvb->buf);
|
*dvb->buf = nil;
|
||||||
d3d9Globals.numVertexBuffers--;
|
|
||||||
*dvb->buf = nil;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -830,9 +903,53 @@ recreateDynamicVBs(void)
|
|||||||
{
|
{
|
||||||
DynamicVB *dvb;
|
DynamicVB *dvb;
|
||||||
for(dvb = dynamicVBs; dvb; dvb = dvb->next){
|
for(dvb = dynamicVBs; dvb; dvb = dvb->next){
|
||||||
|
assert(*dvb->buf == nil);
|
||||||
*dvb->buf = (IDirect3DVertexBuffer9*)createVertexBuffer(dvb->length, dvb->fvf, true);
|
*dvb->buf = (IDirect3DVertexBuffer9*)createVertexBuffer(dvb->length, dvb->fvf, true);
|
||||||
if(*dvb->buf)
|
}
|
||||||
d3d9Globals.numVertexBuffers++;
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
addDynamicIB(uint32 length, IDirect3DIndexBuffer9 **buf)
|
||||||
|
{
|
||||||
|
DynamicIB *ivb = rwNewT(DynamicIB, 1, ID_DRIVER | MEMDUR_EVENT);
|
||||||
|
ivb->length = length;
|
||||||
|
ivb->buf = buf;
|
||||||
|
ivb->next = dynamicIBs;
|
||||||
|
dynamicIBs = ivb;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
removeDynamicIB(IDirect3DIndexBuffer9 **buf)
|
||||||
|
{
|
||||||
|
DynamicIB **p, *ivb;
|
||||||
|
for(p = &dynamicIBs; *p; p = &(*p)->next)
|
||||||
|
if((*p)->buf == buf)
|
||||||
|
goto found;
|
||||||
|
return;
|
||||||
|
found:
|
||||||
|
ivb = *p;
|
||||||
|
*p = ivb->next;
|
||||||
|
rwFree(ivb);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
releaseDynamicIBs(void)
|
||||||
|
{
|
||||||
|
DynamicIB *ivb;
|
||||||
|
for(ivb = dynamicIBs; ivb; ivb = ivb->next){
|
||||||
|
destroyIndexBuffer(*ivb->buf);
|
||||||
|
*ivb->buf = nil;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
recreateDynamicIBs(void)
|
||||||
|
{
|
||||||
|
DynamicIB *ivb;
|
||||||
|
for(ivb = dynamicIBs; ivb; ivb = ivb->next){
|
||||||
|
assert(*ivb->buf == nil);
|
||||||
|
*ivb->buf = (IDirect3DIndexBuffer9*)createIndexBuffer(ivb->length, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -846,16 +963,18 @@ releaseVideoMemory(void)
|
|||||||
d3ddevice->SetVertexShader(nil);
|
d3ddevice->SetVertexShader(nil);
|
||||||
d3ddevice->SetPixelShader(nil);
|
d3ddevice->SetPixelShader(nil);
|
||||||
d3ddevice->SetIndices(nil);
|
d3ddevice->SetIndices(nil);
|
||||||
for(i = 0; i < 2; i++)
|
for(i = 0; i < MAXNUMSTREAMS; i++)
|
||||||
d3ddevice->SetStreamSource(0, nil, 0, 0);
|
d3ddevice->SetStreamSource(0, nil, 0, 0);
|
||||||
|
|
||||||
releaseVidmemRasters();
|
releaseVidmemRasters();
|
||||||
releaseDynamicVBs();
|
releaseDynamicVBs();
|
||||||
|
releaseDynamicIBs();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
restoreVideoMemory(void)
|
restoreVideoMemory(void)
|
||||||
{
|
{
|
||||||
|
recreateDynamicIBs();
|
||||||
recreateDynamicVBs();
|
recreateDynamicVBs();
|
||||||
// important that we get all raster back before restoring state
|
// important that we get all raster back before restoring state
|
||||||
recreateVidmemRasters();
|
recreateVidmemRasters();
|
||||||
@ -1170,8 +1289,6 @@ initD3D(void)
|
|||||||
{
|
{
|
||||||
int32 s, t;
|
int32 s, t;
|
||||||
|
|
||||||
// TODO: do some real stuff here
|
|
||||||
|
|
||||||
d3d9Globals.numTextures = 0;
|
d3d9Globals.numTextures = 0;
|
||||||
d3d9Globals.numVertexShaders = 0;
|
d3d9Globals.numVertexShaders = 0;
|
||||||
d3d9Globals.numPixelShaders = 0;
|
d3d9Globals.numPixelShaders = 0;
|
||||||
@ -1179,6 +1296,27 @@ initD3D(void)
|
|||||||
d3d9Globals.numIndexBuffers = 0;
|
d3d9Globals.numIndexBuffers = 0;
|
||||||
d3d9Globals.numVertexDeclarations = 0;
|
d3d9Globals.numVertexDeclarations = 0;
|
||||||
|
|
||||||
|
VertexConstantData constants;
|
||||||
|
constants.normal.x = 0.0f;
|
||||||
|
constants.normal.y = 0.0f;
|
||||||
|
constants.normal.z = 0.0f;
|
||||||
|
constants.color.red = 0;
|
||||||
|
constants.color.green = 0;
|
||||||
|
constants.color.blue = 0;
|
||||||
|
constants.color.alpha = 255;
|
||||||
|
for(s = 0; s < 8; s++){
|
||||||
|
constants.texCoors[s].u = 0.0f;
|
||||||
|
constants.texCoors[s].v = 0.0f;
|
||||||
|
}
|
||||||
|
assert(constantVertexStream == nil);
|
||||||
|
constantVertexStream = createVertexBuffer(sizeof(constants)*10000, 0, false);
|
||||||
|
assert(constantVertexStream);
|
||||||
|
uint8 *lockedvertices = lockVertices(constantVertexStream, 0, sizeof(constants), D3DLOCK_NOSYSLOCK);
|
||||||
|
assert(lockedvertices);
|
||||||
|
memcpy(lockedvertices, &constants, sizeof(constants));
|
||||||
|
unlockVertices(constantVertexStream);
|
||||||
|
setStreamSource(2, constantVertexStream, 0, 0);
|
||||||
|
|
||||||
d3ddevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
|
d3ddevice->SetRenderState(D3DRS_ALPHAFUNC, D3DCMP_GREATEREQUAL);
|
||||||
rwStateCache.alphafunc = ALPHAGREATEREQUAL;
|
rwStateCache.alphafunc = ALPHAGREATEREQUAL;
|
||||||
d3ddevice->SetRenderState(D3DRS_ALPHAREF, 10);
|
d3ddevice->SetRenderState(D3DRS_ALPHAREF, 10);
|
||||||
@ -1187,7 +1325,6 @@ initD3D(void)
|
|||||||
d3ddevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
|
d3ddevice->SetRenderState(D3DRS_FOGENABLE, FALSE);
|
||||||
rwStateCache.fogenable = 0;
|
rwStateCache.fogenable = 0;
|
||||||
d3ddevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_LINEAR);
|
d3ddevice->SetRenderState(D3DRS_FOGTABLEMODE, D3DFOG_LINEAR);
|
||||||
// TODO: more fog stuff
|
|
||||||
|
|
||||||
d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
|
d3ddevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
|
||||||
rwStateCache.cullmode = CULLNONE;
|
rwStateCache.cullmode = CULLNONE;
|
||||||
@ -1358,6 +1495,9 @@ initD3D(void)
|
|||||||
static int
|
static int
|
||||||
termD3D(void)
|
termD3D(void)
|
||||||
{
|
{
|
||||||
|
destroyVertexBuffer(constantVertexStream);
|
||||||
|
constantVertexStream = nil;
|
||||||
|
|
||||||
closeIm3D();
|
closeIm3D();
|
||||||
closeIm2D();
|
closeIm2D();
|
||||||
|
|
||||||
@ -1458,7 +1598,8 @@ Device renderdevice = {
|
|||||||
d3d::im2DRenderPrimitive,
|
d3d::im2DRenderPrimitive,
|
||||||
d3d::im2DRenderIndexedPrimitive,
|
d3d::im2DRenderIndexedPrimitive,
|
||||||
d3d::im3DTransform,
|
d3d::im3DTransform,
|
||||||
d3d::im3DRenderIndexed,
|
d3d::im3DRenderPrimitive,
|
||||||
|
d3d::im3DRenderIndexedPrimitive,
|
||||||
d3d::im3DEnd,
|
d3d::im3DEnd,
|
||||||
d3d::deviceSystem,
|
d3d::deviceSystem,
|
||||||
};
|
};
|
||||||
|
@ -46,30 +46,33 @@ openIm2D(void)
|
|||||||
{ 0, offsetof(Im2DVertex, u), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
|
{ 0, offsetof(Im2DVertex, u), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
|
||||||
D3DDECL_END()
|
D3DDECL_END()
|
||||||
};
|
};
|
||||||
d3ddevice->CreateVertexDeclaration((D3DVERTEXELEMENT9*)elements, &im2ddecl);
|
assert(im2ddecl == nil);
|
||||||
|
im2ddecl = (IDirect3DVertexDeclaration9*)d3d9::createVertexDeclaration((d3d9::VertexElement*)elements);
|
||||||
assert(im2ddecl);
|
assert(im2ddecl);
|
||||||
d3d9Globals.numVertexDeclarations++;
|
|
||||||
|
assert(im2dvertbuf == nil);
|
||||||
im2dvertbuf = (IDirect3DVertexBuffer9*)createVertexBuffer(NUMVERTICES*sizeof(Im2DVertex), 0, true);
|
im2dvertbuf = (IDirect3DVertexBuffer9*)createVertexBuffer(NUMVERTICES*sizeof(Im2DVertex), 0, true);
|
||||||
assert(im2dvertbuf);
|
assert(im2dvertbuf);
|
||||||
addDynamicVB(NUMVERTICES*sizeof(Im2DVertex), 0, &im2dvertbuf);
|
addDynamicVB(NUMVERTICES*sizeof(Im2DVertex), 0, &im2dvertbuf);
|
||||||
im2dindbuf = (IDirect3DIndexBuffer9*)createIndexBuffer(NUMINDICES*sizeof(uint16));
|
|
||||||
|
assert(im2dindbuf == nil);
|
||||||
|
im2dindbuf = (IDirect3DIndexBuffer9*)createIndexBuffer(NUMINDICES*sizeof(uint16), true);
|
||||||
assert(im2dindbuf);
|
assert(im2dindbuf);
|
||||||
|
addDynamicIB(NUMINDICES*sizeof(uint16), &im2dindbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
closeIm2D(void)
|
closeIm2D(void)
|
||||||
{
|
{
|
||||||
deleteObject(im2ddecl);
|
d3d9::destroyVertexDeclaration(im2ddecl);
|
||||||
d3d9Globals.numVertexDeclarations--;
|
|
||||||
im2ddecl = nil;
|
im2ddecl = nil;
|
||||||
|
|
||||||
removeDynamicVB(&im2dvertbuf);
|
removeDynamicVB(&im2dvertbuf);
|
||||||
deleteObject(im2dvertbuf);
|
destroyVertexBuffer(im2dvertbuf);
|
||||||
d3d9Globals.numVertexBuffers--;
|
|
||||||
im2dvertbuf = nil;
|
im2dvertbuf = nil;
|
||||||
|
|
||||||
deleteObject(im2dindbuf);
|
removeDynamicIB(&im2dindbuf);
|
||||||
d3d9Globals.numIndexBuffers--;
|
destroyIndexBuffer(im2dindbuf);
|
||||||
im2dindbuf = nil;
|
im2dindbuf = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -105,8 +108,8 @@ im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices)
|
|||||||
memcpy(lockedvertices, vertices, numVertices*sizeof(Im2DVertex));
|
memcpy(lockedvertices, vertices, numVertices*sizeof(Im2DVertex));
|
||||||
unlockVertices(im2dvertbuf);
|
unlockVertices(im2dvertbuf);
|
||||||
|
|
||||||
d3ddevice->SetStreamSource(0, im2dvertbuf, 0, sizeof(Im2DVertex));
|
setStreamSource(0, im2dvertbuf, 0, sizeof(Im2DVertex));
|
||||||
d3ddevice->SetVertexDeclaration(im2ddecl);
|
setVertexDeclaration(im2ddecl);
|
||||||
|
|
||||||
if(engine->device.getRenderState(TEXTURERASTER))
|
if(engine->device.getRenderState(TEXTURERASTER))
|
||||||
setPixelShader(im2d_tex_PS);
|
setPixelShader(im2d_tex_PS);
|
||||||
@ -137,8 +140,6 @@ im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
d3ddevice->DrawPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0, primCount);
|
d3ddevice->DrawPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0, primCount);
|
||||||
|
|
||||||
setPixelShader(nil);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -150,7 +151,7 @@ im2DRenderIndexedPrimitive(PrimitiveType primType,
|
|||||||
// TODO: error
|
// TODO: error
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
uint16 *lockedindices = lockIndices(im2dindbuf, 0, numIndices*sizeof(uint16), 0);
|
uint16 *lockedindices = lockIndices(im2dindbuf, 0, numIndices*sizeof(uint16), D3DLOCK_DISCARD);
|
||||||
memcpy(lockedindices, indices, numIndices*sizeof(uint16));
|
memcpy(lockedindices, indices, numIndices*sizeof(uint16));
|
||||||
unlockIndices(im2dindbuf);
|
unlockIndices(im2dindbuf);
|
||||||
|
|
||||||
@ -158,9 +159,9 @@ im2DRenderIndexedPrimitive(PrimitiveType primType,
|
|||||||
memcpy(lockedvertices, vertices, numVertices*sizeof(Im2DVertex));
|
memcpy(lockedvertices, vertices, numVertices*sizeof(Im2DVertex));
|
||||||
unlockVertices(im2dvertbuf);
|
unlockVertices(im2dvertbuf);
|
||||||
|
|
||||||
d3ddevice->SetStreamSource(0, im2dvertbuf, 0, sizeof(Im2DVertex));
|
setStreamSource(0, im2dvertbuf, 0, sizeof(Im2DVertex));
|
||||||
d3ddevice->SetIndices(im2dindbuf);
|
setIndices(im2dindbuf);
|
||||||
d3ddevice->SetVertexDeclaration(im2ddecl);
|
setVertexDeclaration(im2ddecl);
|
||||||
|
|
||||||
if(engine->device.getRenderState(TEXTURERASTER))
|
if(engine->device.getRenderState(TEXTURERASTER))
|
||||||
setPixelShader(im2d_tex_PS);
|
setPixelShader(im2d_tex_PS);
|
||||||
@ -193,8 +194,6 @@ im2DRenderIndexedPrimitive(PrimitiveType primType,
|
|||||||
d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0,
|
d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0,
|
||||||
0, numVertices,
|
0, numVertices,
|
||||||
0, primCount);
|
0, primCount);
|
||||||
|
|
||||||
setPixelShader(nil);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -215,30 +214,33 @@ openIm3D(void)
|
|||||||
{ 0, offsetof(Im3DVertex, u), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
|
{ 0, offsetof(Im3DVertex, u), D3DDECLTYPE_FLOAT2, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_TEXCOORD, 0 },
|
||||||
D3DDECL_END()
|
D3DDECL_END()
|
||||||
};
|
};
|
||||||
d3ddevice->CreateVertexDeclaration((D3DVERTEXELEMENT9*)elements, &im3ddecl);
|
|
||||||
|
assert(im3ddecl == nil);
|
||||||
|
im3ddecl = (IDirect3DVertexDeclaration9*)d3d9::createVertexDeclaration((d3d9::VertexElement*)elements);
|
||||||
assert(im3ddecl);
|
assert(im3ddecl);
|
||||||
d3d9Globals.numVertexDeclarations++;
|
|
||||||
|
assert(im3dvertbuf == nil);
|
||||||
im3dvertbuf = (IDirect3DVertexBuffer9*)createVertexBuffer(NUMVERTICES*sizeof(Im3DVertex), 0, true);
|
im3dvertbuf = (IDirect3DVertexBuffer9*)createVertexBuffer(NUMVERTICES*sizeof(Im3DVertex), 0, true);
|
||||||
assert(im3dvertbuf);
|
assert(im3dvertbuf);
|
||||||
addDynamicVB(NUMVERTICES*sizeof(Im3DVertex), 0, &im3dvertbuf);
|
addDynamicVB(NUMVERTICES*sizeof(Im3DVertex), 0, &im3dvertbuf);
|
||||||
im3dindbuf = (IDirect3DIndexBuffer9*)createIndexBuffer(NUMINDICES*sizeof(uint16));
|
|
||||||
|
assert(im3dindbuf == nil);
|
||||||
|
im3dindbuf = (IDirect3DIndexBuffer9*)createIndexBuffer(NUMINDICES*sizeof(uint16), true);
|
||||||
assert(im3dindbuf);
|
assert(im3dindbuf);
|
||||||
|
addDynamicIB(NUMINDICES*sizeof(uint16), &im3dindbuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
closeIm3D(void)
|
closeIm3D(void)
|
||||||
{
|
{
|
||||||
deleteObject(im3ddecl);
|
d3d9::destroyVertexDeclaration(im3ddecl);
|
||||||
d3d9Globals.numVertexDeclarations--;
|
|
||||||
im3ddecl = nil;
|
im3ddecl = nil;
|
||||||
|
|
||||||
removeDynamicVB(&im3dvertbuf);
|
removeDynamicVB(&im3dvertbuf);
|
||||||
deleteObject(im3dvertbuf);
|
destroyVertexBuffer(im3dvertbuf);
|
||||||
d3d9Globals.numVertexBuffers--;
|
|
||||||
im3dvertbuf = nil;
|
im3dvertbuf = nil;
|
||||||
|
|
||||||
deleteObject(im3dindbuf);
|
destroyIndexBuffer(im3dindbuf);
|
||||||
d3d9Globals.numIndexBuffers--;
|
|
||||||
im3dindbuf = nil;
|
im3dindbuf = nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -261,8 +263,8 @@ im3DTransform(void *vertices, int32 numVertices, Matrix *world)
|
|||||||
memcpy(lockedvertices, vertices, numVertices*sizeof(Im3DVertex));
|
memcpy(lockedvertices, vertices, numVertices*sizeof(Im3DVertex));
|
||||||
unlockVertices(im3dvertbuf);
|
unlockVertices(im3dvertbuf);
|
||||||
|
|
||||||
d3ddevice->SetStreamSource(0, im3dvertbuf, 0, sizeof(Im3DVertex));
|
setStreamSource(0, im3dvertbuf, 0, sizeof(Im3DVertex));
|
||||||
d3ddevice->SetVertexDeclaration(im3ddecl);
|
setVertexDeclaration(im3ddecl);
|
||||||
|
|
||||||
setVertexShader(default_amb_VS);
|
setVertexShader(default_amb_VS);
|
||||||
|
|
||||||
@ -270,13 +272,47 @@ im3DTransform(void *vertices, int32 numVertices, Matrix *world)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
im3DRenderIndexed(PrimitiveType primType, void *indices, int32 numIndices)
|
im3DRenderPrimitive(PrimitiveType primType)
|
||||||
{
|
{
|
||||||
uint16 *lockedindices = lockIndices(im3dindbuf, 0, numIndices*sizeof(uint16), 0);
|
if(engine->device.getRenderState(TEXTURERASTER))
|
||||||
|
setPixelShader(default_tex_PS);
|
||||||
|
else
|
||||||
|
setPixelShader(default_PS);
|
||||||
|
|
||||||
|
d3d::flushCache();
|
||||||
|
|
||||||
|
uint32 primCount = 0;
|
||||||
|
switch(primType){
|
||||||
|
case PRIMTYPELINELIST:
|
||||||
|
primCount = num3DVertices/2;
|
||||||
|
break;
|
||||||
|
case PRIMTYPEPOLYLINE:
|
||||||
|
primCount = num3DVertices-1;
|
||||||
|
break;
|
||||||
|
case PRIMTYPETRILIST:
|
||||||
|
primCount = num3DVertices/3;
|
||||||
|
break;
|
||||||
|
case PRIMTYPETRISTRIP:
|
||||||
|
primCount = num3DVertices-2;
|
||||||
|
break;
|
||||||
|
case PRIMTYPETRIFAN:
|
||||||
|
primCount = num3DVertices-2;
|
||||||
|
break;
|
||||||
|
case PRIMTYPEPOINTLIST:
|
||||||
|
primCount = num3DVertices;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
d3ddevice->DrawPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0, primCount);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices)
|
||||||
|
{
|
||||||
|
uint16 *lockedindices = lockIndices(im3dindbuf, 0, numIndices*sizeof(uint16), D3DLOCK_DISCARD);
|
||||||
memcpy(lockedindices, indices, numIndices*sizeof(uint16));
|
memcpy(lockedindices, indices, numIndices*sizeof(uint16));
|
||||||
unlockIndices(im3dindbuf);
|
unlockIndices(im3dindbuf);
|
||||||
|
|
||||||
d3ddevice->SetIndices(im3dindbuf);
|
setIndices(im3dindbuf);
|
||||||
|
|
||||||
if(engine->device.getRenderState(TEXTURERASTER))
|
if(engine->device.getRenderState(TEXTURERASTER))
|
||||||
setPixelShader(default_tex_PS);
|
setPixelShader(default_tex_PS);
|
||||||
@ -306,13 +342,9 @@ im3DRenderIndexed(PrimitiveType primType, void *indices, int32 numIndices)
|
|||||||
primCount = numIndices;
|
primCount = numIndices;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
d3d::setRenderState(D3DRS_EMISSIVEMATERIALSOURCE, D3DMCS_COLOR1);
|
|
||||||
d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0,
|
d3ddevice->DrawIndexedPrimitive((D3DPRIMITIVETYPE)primTypeMap[primType], 0,
|
||||||
0, num3DVertices,
|
0, num3DVertices,
|
||||||
0, primCount);
|
0, primCount);
|
||||||
|
|
||||||
setVertexShader(nil);
|
|
||||||
setPixelShader(nil);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -139,16 +139,20 @@ enum {
|
|||||||
|
|
||||||
extern int vertFormatMap[];
|
extern int vertFormatMap[];
|
||||||
|
|
||||||
void *createIndexBuffer(uint32 length);
|
void *createIndexBuffer(uint32 length, bool dynamic);
|
||||||
|
void destroyIndexBuffer(void *indexBuffer);
|
||||||
uint16 *lockIndices(void *indexBuffer, uint32 offset, uint32 size, uint32 flags);
|
uint16 *lockIndices(void *indexBuffer, uint32 offset, uint32 size, uint32 flags);
|
||||||
void unlockIndices(void *indexBuffer);
|
void unlockIndices(void *indexBuffer);
|
||||||
|
|
||||||
void *createVertexBuffer(uint32 length, uint32 fvf, bool dynamic);
|
void *createVertexBuffer(uint32 length, uint32 fvf, bool dynamic);
|
||||||
|
void destroyVertexBuffer(void *vertexBuffer);
|
||||||
uint8 *lockVertices(void *vertexBuffer, uint32 offset, uint32 size, uint32 flags);
|
uint8 *lockVertices(void *vertexBuffer, uint32 offset, uint32 size, uint32 flags);
|
||||||
void unlockVertices(void *vertexBuffer);
|
void unlockVertices(void *vertexBuffer);
|
||||||
|
|
||||||
void *createTexture(int32 width, int32 height, int32 levels, uint32 format);
|
void *createTexture(int32 width, int32 height, int32 levels, uint32 format);
|
||||||
|
void destroyTexture(void *texture);
|
||||||
uint8 *lockTexture(void *texture, int32 level);
|
uint8 *lockTexture(void *texture, int32 level);
|
||||||
void unlockTexture(void *texture, int32 level);
|
void unlockTexture(void *texture, int32 level);
|
||||||
void deleteObject(void *object);
|
|
||||||
|
|
||||||
// Native Texture and Raster
|
// Native Texture and Raster
|
||||||
|
|
||||||
@ -184,6 +188,10 @@ void setMaterial(SurfaceProperties surfProps, rw::RGBA color);
|
|||||||
|
|
||||||
void setVertexShader(void *vs);
|
void setVertexShader(void *vs);
|
||||||
void setPixelShader(void *ps);
|
void setPixelShader(void *ps);
|
||||||
|
void setIndices(void *indexBuffer);
|
||||||
|
void setStreamSource(int n, void *buffer, uint32 offset, uint32 stride);
|
||||||
|
void setVertexDeclaration(void *declaration);
|
||||||
|
|
||||||
void *createVertexShader(void *csosrc);
|
void *createVertexShader(void *csosrc);
|
||||||
void *createPixelShader(void *csosrc);
|
void *createPixelShader(void *csosrc);
|
||||||
void destroyVertexShader(void *shader);
|
void destroyVertexShader(void *shader);
|
||||||
@ -194,6 +202,15 @@ void destroyPixelShader(void *shader);
|
|||||||
* Vertex shaders and common pipeline stuff
|
* Vertex shaders and common pipeline stuff
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// This data will be available in vertex stream 2
|
||||||
|
struct VertexConstantData
|
||||||
|
{
|
||||||
|
V3d normal;
|
||||||
|
RGBA color;
|
||||||
|
TexCoords texCoors[8];
|
||||||
|
};
|
||||||
|
extern void *constantVertexStream;
|
||||||
|
|
||||||
struct D3dShaderState
|
struct D3dShaderState
|
||||||
{
|
{
|
||||||
// for VS
|
// for VS
|
||||||
|
@ -52,6 +52,7 @@ struct InstanceDataHeader : rw::InstanceDataHeader
|
|||||||
};
|
};
|
||||||
|
|
||||||
void *createVertexDeclaration(VertexElement *elements);
|
void *createVertexDeclaration(VertexElement *elements);
|
||||||
|
void destroyVertexDeclaration(void *delaration);
|
||||||
uint32 getDeclaration(void *declaration, VertexElement *elements);
|
uint32 getDeclaration(void *declaration, VertexElement *elements);
|
||||||
|
|
||||||
void drawInst(d3d9::InstanceDataHeader *header, d3d9::InstanceData *inst);
|
void drawInst(d3d9::InstanceDataHeader *header, d3d9::InstanceData *inst);
|
||||||
|
@ -4,19 +4,16 @@ namespace d3d {
|
|||||||
#ifdef RW_D3D9
|
#ifdef RW_D3D9
|
||||||
void openIm2D(void);
|
void openIm2D(void);
|
||||||
void closeIm2D(void);
|
void closeIm2D(void);
|
||||||
void im2DRenderLine(void *vertices, int32 numVertices,
|
void im2DRenderLine(void *vertices, int32 numVertices, int32 vert1, int32 vert2);
|
||||||
int32 vert1, int32 vert2);
|
void im2DRenderTriangle(void *vertices, int32 numVertices, int32 vert1, int32 vert2, int32 vert3);
|
||||||
void im2DRenderTriangle(void *vertices, int32 numVertices,
|
void im2DRenderPrimitive(PrimitiveType primType, void *vertices, int32 numVertices);
|
||||||
int32 vert1, int32 vert2, int32 vert3);
|
void im2DRenderIndexedPrimitive(PrimitiveType primType, void *vertices, int32 numVertices, void *indices, int32 numIndices);
|
||||||
void im2DRenderPrimitive(PrimitiveType primType,
|
|
||||||
void *vertices, int32 numVertices);
|
|
||||||
void im2DRenderIndexedPrimitive(PrimitiveType primType,
|
|
||||||
void *vertices, int32 numVertices, void *indices, int32 numIndices);
|
|
||||||
|
|
||||||
void openIm3D(void);
|
void openIm3D(void);
|
||||||
void closeIm3D(void);
|
void closeIm3D(void);
|
||||||
void im3DTransform(void *vertices, int32 numVertices, Matrix *world);
|
void im3DTransform(void *vertices, int32 numVertices, Matrix *world);
|
||||||
void im3DRenderIndexed(PrimitiveType primType, void *indices, int32 numIndices);
|
void im3DRenderPrimitive(PrimitiveType primType);
|
||||||
|
void im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices);
|
||||||
void im3DEnd(void);
|
void im3DEnd(void);
|
||||||
|
|
||||||
|
|
||||||
@ -57,6 +54,9 @@ void removeVidmemRaster(Raster *raster);
|
|||||||
void addDynamicVB(uint32 length, uint32 fvf, IDirect3DVertexBuffer9 **buf); // NB: don't share this pointer
|
void addDynamicVB(uint32 length, uint32 fvf, IDirect3DVertexBuffer9 **buf); // NB: don't share this pointer
|
||||||
void removeDynamicVB(IDirect3DVertexBuffer9 **buf);
|
void removeDynamicVB(IDirect3DVertexBuffer9 **buf);
|
||||||
|
|
||||||
|
void addDynamicIB(uint32 length, IDirect3DIndexBuffer9 **buf); // NB: don't share this pointer
|
||||||
|
void removeDynamicIB(IDirect3DIndexBuffer9 **buf);
|
||||||
|
|
||||||
|
|
||||||
int findFormatDepth(uint32 format);
|
int findFormatDepth(uint32 format);
|
||||||
void destroyD3D9Raster(Raster *raster);
|
void destroyD3D9Raster(Raster *raster);
|
||||||
|
@ -221,10 +221,12 @@ Engine::stop(void)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
engine->device.system(DEVICETERM, nil, 0);
|
|
||||||
for(uint i = 0; i < NUM_PLATFORMS; i++)
|
for(uint i = 0; i < NUM_PLATFORMS; i++)
|
||||||
Driver::s_plglist[i].destruct(rw::engine->driver[i]);
|
Driver::s_plglist[i].destruct(rw::engine->driver[i]);
|
||||||
Engine::s_plglist.destruct(engine);
|
Engine::s_plglist.destruct(engine);
|
||||||
|
|
||||||
|
engine->device.system(DEVICETERM, nil, 0);
|
||||||
|
|
||||||
Engine::state = Opened;
|
Engine::state = Opened;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -301,7 +303,8 @@ void im2DRenderPrimitive(PrimitiveType, void*, int32) { }
|
|||||||
void im2DRenderIndexedPrimitive(PrimitiveType, void*, int32, void*, int32) { }
|
void im2DRenderIndexedPrimitive(PrimitiveType, void*, int32, void*, int32) { }
|
||||||
|
|
||||||
void im3DTransform(void *vertices, int32 numVertices, Matrix *world) { }
|
void im3DTransform(void *vertices, int32 numVertices, Matrix *world) { }
|
||||||
void im3DRenderIndexed(PrimitiveType primType, void *indices, int32 numIndices) { }
|
void im3DRenderPrimitive(PrimitiveType primType) { }
|
||||||
|
void im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices) { }
|
||||||
void im3DEnd(void) { }
|
void im3DEnd(void) { }
|
||||||
|
|
||||||
Raster*
|
Raster*
|
||||||
@ -394,7 +397,8 @@ Device renderdevice = {
|
|||||||
null::im2DRenderPrimitive,
|
null::im2DRenderPrimitive,
|
||||||
null::im2DRenderIndexedPrimitive,
|
null::im2DRenderIndexedPrimitive,
|
||||||
null::im3DTransform,
|
null::im3DTransform,
|
||||||
null::im3DRenderIndexed,
|
null::im3DRenderPrimitive,
|
||||||
|
null::im3DRenderIndexedPrimitive,
|
||||||
null::im3DEnd,
|
null::im3DEnd,
|
||||||
null::deviceSystem
|
null::deviceSystem
|
||||||
};
|
};
|
||||||
|
@ -1166,7 +1166,8 @@ Device renderdevice = {
|
|||||||
gl3::im2DRenderPrimitive,
|
gl3::im2DRenderPrimitive,
|
||||||
gl3::im2DRenderIndexedPrimitive,
|
gl3::im2DRenderIndexedPrimitive,
|
||||||
gl3::im3DTransform,
|
gl3::im3DTransform,
|
||||||
gl3::im3DRenderIndexed,
|
gl3::im3DRenderPrimitive,
|
||||||
|
gl3::im3DRenderIndexedPrimitive,
|
||||||
gl3::im3DEnd,
|
gl3::im3DEnd,
|
||||||
#ifdef LIBRW_SDL2
|
#ifdef LIBRW_SDL2
|
||||||
gl3::deviceSystemSDL2
|
gl3::deviceSystemSDL2
|
||||||
|
@ -220,7 +220,18 @@ im3DTransform(void *vertices, int32 numVertices, Matrix *world)
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
im3DRenderIndexed(PrimitiveType primType, void *indices, int32 numIndices)
|
im3DRenderPrimitive(PrimitiveType primType)
|
||||||
|
{
|
||||||
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im3DIbo);
|
||||||
|
|
||||||
|
flushCache();
|
||||||
|
glDrawArrays(primTypeMap[primType], 0, num3DVertices);
|
||||||
|
disableAttribPointers(im3dattribDesc, 3);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices)
|
||||||
{
|
{
|
||||||
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im3DIbo);
|
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, im3DIbo);
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices*2,
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, numIndices*2,
|
||||||
|
@ -18,7 +18,8 @@ void im2DRenderIndexedPrimitive(PrimitiveType primType,
|
|||||||
void openIm3D(void);
|
void openIm3D(void);
|
||||||
void closeIm3D(void);
|
void closeIm3D(void);
|
||||||
void im3DTransform(void *vertices, int32 numVertices, Matrix *world);
|
void im3DTransform(void *vertices, int32 numVertices, Matrix *world);
|
||||||
void im3DRenderIndexed(PrimitiveType primType, void *indices, int32 numIndices);
|
void im3DRenderPrimitive(PrimitiveType primType);
|
||||||
|
void im3DRenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices);
|
||||||
void im3DEnd(void);
|
void im3DEnd(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -37,7 +37,8 @@ Device renderdevice = {
|
|||||||
null::im2DRenderPrimitive,
|
null::im2DRenderPrimitive,
|
||||||
null::im2DRenderIndexedPrimitive,
|
null::im2DRenderIndexedPrimitive,
|
||||||
null::im3DTransform,
|
null::im3DTransform,
|
||||||
null::im3DRenderIndexed,
|
null::im3DRenderPrimitive,
|
||||||
|
null::im3DRenderIndexedPrimitive,
|
||||||
null::im3DEnd,
|
null::im3DEnd,
|
||||||
null::deviceSystem
|
null::deviceSystem
|
||||||
};
|
};
|
||||||
|
@ -57,9 +57,14 @@ Transform(void *vertices, int32 numVertices, Matrix *world)
|
|||||||
engine->device.im3DTransform(vertices, numVertices, world);
|
engine->device.im3DTransform(vertices, numVertices, world);
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
RenderIndexed(PrimitiveType primType, void *indices, int32 numIndices)
|
RenderPrimitive(PrimitiveType primType)
|
||||||
{
|
{
|
||||||
engine->device.im3DRenderIndexed(primType, indices, numIndices);
|
engine->device.im3DRenderPrimitive(primType);
|
||||||
|
}
|
||||||
|
void
|
||||||
|
RenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices)
|
||||||
|
{
|
||||||
|
engine->device.im3DRenderIndexedPrimitive(primType, indices, numIndices);
|
||||||
}
|
}
|
||||||
void
|
void
|
||||||
End(void)
|
End(void)
|
||||||
|
@ -50,16 +50,14 @@ struct Device
|
|||||||
void (*setRenderState)(int32 state, void *value);
|
void (*setRenderState)(int32 state, void *value);
|
||||||
void *(*getRenderState)(int32 state);
|
void *(*getRenderState)(int32 state);
|
||||||
|
|
||||||
void (*im2DRenderLine)(void*, int32, int32, int32);
|
void (*im2DRenderLine)(void *vertices, int32 numVertices, int32 vert1, int32 vert2);
|
||||||
void (*im2DRenderTriangle)(void*, int32, int32, int32, int32);
|
void (*im2DRenderTriangle)(void *vertices, int32 numVertices, int32 vert1, int32 vert2, int32 vert3);
|
||||||
void (*im2DRenderPrimitive)(PrimitiveType,
|
void (*im2DRenderPrimitive)(PrimitiveType primType, void *vertices, int32 numVertices);
|
||||||
void*, int32);
|
void (*im2DRenderIndexedPrimitive)(PrimitiveType primType, void *vertices, int32 numVertices, void *indices, int32 numIndices);
|
||||||
void (*im2DRenderIndexedPrimitive)(PrimitiveType,
|
|
||||||
void*, int32, void*, int32);
|
|
||||||
|
|
||||||
// Not sure if this will stay...
|
|
||||||
void (*im3DTransform)(void *vertices, int32 numVertices, Matrix *world);
|
void (*im3DTransform)(void *vertices, int32 numVertices, Matrix *world);
|
||||||
void (*im3DRenderIndexed)(PrimitiveType primType, void *indices, int32 numIndices);
|
void (*im3DRenderPrimitive)(PrimitiveType primType);
|
||||||
|
void (*im3DRenderIndexedPrimitive)(PrimitiveType primType, void *indices, int32 numIndices);
|
||||||
void (*im3DEnd)(void);
|
void (*im3DEnd)(void);
|
||||||
|
|
||||||
DeviceSystem *system;
|
DeviceSystem *system;
|
||||||
|
@ -774,10 +774,13 @@ struct TexDictionary
|
|||||||
enum { ID = 6 };
|
enum { ID = 6 };
|
||||||
Object object;
|
Object object;
|
||||||
LinkList textures;
|
LinkList textures;
|
||||||
|
LLLink inGlobalList;
|
||||||
|
|
||||||
static int32 numAllocated;
|
static int32 numAllocated;
|
||||||
|
|
||||||
static TexDictionary *create(void);
|
static TexDictionary *create(void);
|
||||||
|
static TexDictionary *fromLink(LLLink *lnk){
|
||||||
|
return LLLinkGetData(lnk, TexDictionary, inGlobalList); }
|
||||||
void destroy(void);
|
void destroy(void);
|
||||||
int32 count(void) { return this->textures.count(); }
|
int32 count(void) { return this->textures.count(); }
|
||||||
void add(Texture *t);
|
void add(Texture *t);
|
||||||
|
@ -80,7 +80,8 @@ void RenderPrimitive(PrimitiveType type, void *verts, int32 numVerts);
|
|||||||
namespace im3d {
|
namespace im3d {
|
||||||
|
|
||||||
void Transform(void *vertices, int32 numVertices, Matrix *world);
|
void Transform(void *vertices, int32 numVertices, Matrix *world);
|
||||||
void RenderIndexed(PrimitiveType primType, void *indices, int32 numIndices);
|
void RenderPrimitive(PrimitiveType primType);
|
||||||
|
void RenderIndexedPrimitive(PrimitiveType primType, void *indices, int32 numIndices);
|
||||||
void End(void);
|
void End(void);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,8 +17,6 @@
|
|||||||
|
|
||||||
#define PLUGIN_ID 0
|
#define PLUGIN_ID 0
|
||||||
|
|
||||||
// TODO: maintain a global list of all texdicts
|
|
||||||
|
|
||||||
namespace rw {
|
namespace rw {
|
||||||
|
|
||||||
int32 Texture::numAllocated;
|
int32 Texture::numAllocated;
|
||||||
@ -36,6 +34,7 @@ struct TextureGlobals
|
|||||||
bool32 loadTextures;
|
bool32 loadTextures;
|
||||||
// create dummy textures to store just names
|
// create dummy textures to store just names
|
||||||
bool32 makeDummies;
|
bool32 makeDummies;
|
||||||
|
LinkList texDicts;
|
||||||
};
|
};
|
||||||
int32 textureModuleOffset;
|
int32 textureModuleOffset;
|
||||||
|
|
||||||
@ -46,6 +45,7 @@ textureOpen(void *object, int32 offset, int32 size)
|
|||||||
{
|
{
|
||||||
TexDictionary *texdict;
|
TexDictionary *texdict;
|
||||||
textureModuleOffset = offset;
|
textureModuleOffset = offset;
|
||||||
|
TEXTUREGLOBAL(texDicts).init();
|
||||||
texdict = TexDictionary::create();
|
texdict = TexDictionary::create();
|
||||||
TEXTUREGLOBAL(initialTexDict) = texdict;
|
TEXTUREGLOBAL(initialTexDict) = texdict;
|
||||||
TexDictionary::setCurrent(texdict);
|
TexDictionary::setCurrent(texdict);
|
||||||
@ -56,7 +56,10 @@ textureOpen(void *object, int32 offset, int32 size)
|
|||||||
static void*
|
static void*
|
||||||
textureClose(void *object, int32 offset, int32 size)
|
textureClose(void *object, int32 offset, int32 size)
|
||||||
{
|
{
|
||||||
TEXTUREGLOBAL(initialTexDict)->destroy();
|
FORLIST(lnk, TEXTUREGLOBAL(texDicts))
|
||||||
|
TexDictionary::fromLink(lnk)->destroy();
|
||||||
|
TEXTUREGLOBAL(initialTexDict) = nil;
|
||||||
|
TEXTUREGLOBAL(currentTexDict) = nil;
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -93,6 +96,7 @@ TexDictionary::create(void)
|
|||||||
numAllocated++;
|
numAllocated++;
|
||||||
dict->object.init(TexDictionary::ID, 0);
|
dict->object.init(TexDictionary::ID, 0);
|
||||||
dict->textures.init();
|
dict->textures.init();
|
||||||
|
TEXTUREGLOBAL(texDicts).add(&dict->inGlobalList);
|
||||||
s_plglist.construct(dict);
|
s_plglist.construct(dict);
|
||||||
return dict;
|
return dict;
|
||||||
}
|
}
|
||||||
@ -104,6 +108,7 @@ TexDictionary::destroy(void)
|
|||||||
TEXTUREGLOBAL(currentTexDict) = nil;
|
TEXTUREGLOBAL(currentTexDict) = nil;
|
||||||
FORLIST(lnk, this->textures)
|
FORLIST(lnk, this->textures)
|
||||||
Texture::fromDict(lnk)->destroy();
|
Texture::fromDict(lnk)->destroy();
|
||||||
|
this->inGlobalList.remove();
|
||||||
s_plglist.destruct(this);
|
s_plglist.destruct(this);
|
||||||
rwFree(this);
|
rwFree(this);
|
||||||
numAllocated--;
|
numAllocated--;
|
||||||
|
@ -350,7 +350,7 @@ im3dtest(void)
|
|||||||
genIm3DEnd();
|
genIm3DEnd();
|
||||||
*/
|
*/
|
||||||
rw::im3d::Transform(verts, 8, nil);
|
rw::im3d::Transform(verts, 8, nil);
|
||||||
rw::im3d::RenderIndexed(rw::PRIMTYPETRILIST, indices, 12);
|
rw::im3d::RenderIndexedPrimitive(rw::PRIMTYPETRILIST, indices, 12);
|
||||||
rw::im3d::End();
|
rw::im3d::End();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user