bool opaqueText;
int xOffset;
bool writingText;
+ bool writingOutline;
ColorAlpha background;
};
void FreeBitmap(DisplaySystem displaySystem, Bitmap bitmap)
{
- if(bitmap.picture)
- IDirect3DTexture8_Release((IDirect3DTexture8 *)bitmap.picture);
+ if(bitmap.driverData)
+ IDirect3DTexture8_Release((IDirect3DTexture8 *)bitmap.driverData);
}
bool AllocateBitmap(DisplaySystem displaySystem, Bitmap bitmap, int width, int height, int stride, PixelFormat format, bool allocatePalette)
return false;
}
- bool MakeDDBitmap(DisplaySystem displaySystem, Bitmap bitmap, bool mipMaps)
+ bool MakeDDBitmap(DisplaySystem displaySystem, Bitmap bitmap, bool mipMaps, int cubeMapFace)
{
bool result = false;
D3D8System d3dSystem = displaySystem.driverData;
- if(bitmap.Convert(null, pixelFormat888, null))
+ if(cubeMapFace && bitmap.Convert(null, pixelFormat888, null))
{
IDirect3DTexture8 * texture;
uint w = pow2i(Min(bitmap.width, 512)), h = pow2i(Min(bitmap.height, 512));
bitmap.driver.FreeBitmap(bitmap.displaySystem, bitmap);
bitmap.driver = displaySystem.driver;
- bitmap.picture = (void *)texture;
+ bitmap.driverData = (void *)texture;
if(!result)
FreeBitmap(displaySystem, bitmap);
(float)(sx+w) / (src.width-1), (float)(sy+h)/ (src.height-1) }
};
- IDirect3DDevice8_SetTexture(d3dSystem.d3dDevice, 0, (IDirect3DBaseTexture8 *)src.picture);
+ IDirect3DDevice8_SetTexture(d3dSystem.d3dDevice, 0, (IDirect3DBaseTexture8 *)src.driverData);
IDirect3DDevice8_DrawPrimitiveUP(d3dSystem.d3dDevice, D3DPT_TRIANGLESTRIP, 2,
vertex, sizeof(D3D8Vertex));
IDirect3DDevice8_SetTexture(d3dSystem.d3dDevice, 0, null);
(float)(sx+sw) / (src.width-1), (float)(sy+sh)/ (src.height-1) }
};
- IDirect3DDevice8_SetTexture(d3dSystem.d3dDevice, 0, (IDirect3DBaseTexture8 *)src.picture);
+ IDirect3DDevice8_SetTexture(d3dSystem.d3dDevice, 0, (IDirect3DBaseTexture8 *)src.driverData);
IDirect3DDevice8_DrawPrimitiveUP(d3dSystem.d3dDevice, D3DPT_TRIANGLESTRIP, 2,
vertex, sizeof(D3D8Vertex));
IDirect3DDevice8_SetTexture(d3dSystem.d3dDevice, 0, null);
((subclass(DisplayDriver))class(LFBDisplayDriver)).UnloadFont(displaySystem, font);
}
- Font LoadFont(DisplaySystem displaySystem, const char * faceName, float size, FontFlags flags)
+ Font LoadFont(DisplaySystem displaySystem, const char * faceName, float size, FontFlags flags, float outlineSize, float outlineFade)
{
- return ((subclass(DisplayDriver))class(LFBDisplayDriver)).LoadFont(displaySystem, faceName, size, flags);
+ return ((subclass(DisplayDriver))class(LFBDisplayDriver)).LoadFont(displaySystem, faceName, size, flags, outlineSize, outlineFade);
}
void TextFont(Display display, Surface surface, Font font)
d3dSurface.opaqueText = opaque;
}
- void FontExtent(DisplaySystem displaySystem, Font font, const char * text, int len, int * width, int * height)
+ void FontExtent(DisplaySystem displaySystem, Font font, const char * text, int len, int * width, int * height, int prevGlyph, int * rPrevGlyph, int * adv)
{
- ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(displaySystem, font, text, len, width, height);
+ ((subclass(DisplayDriver))class(LFBDisplayDriver)).FontExtent(displaySystem, font, text, len, width, height, prevGlyph, rPrevGlyph, adv);
}
- void WriteText(Display display, Surface surface, int x, int y, const char * text, int len)
+ void WriteText(Display display, Surface surface, int x, int y, const char * text, int len, int prevGlyph, int * rPrevGlyph)
{
DisplaySystem displaySystem = display.displaySystem;
D3D8System d3dSystem = displaySystem.driverData;
if(surface.textOpacity)
{
- int w, h;
- FontExtent(display.displaySystem, surface.font, text, len, &w, &h);
+ int w, h, adv;
+ FontExtent(display.displaySystem, surface.font, text, len, &w, &h, prevGlyph, rPrevGlyph, &adv);
+ w += adv;
{
int x1 = x, y1 = y, x2 = x+w-1, y2 = y+h-1;
IDirect3DDevice8_SetTextureStageState(d3dSystem.d3dDevice, 0, D3DTSS_MIPFILTER, D3DTEXF_NONE);
d3dSurface.writingText = true;
- ((subclass(DisplayDriver))class(LFBDisplayDriver)).WriteText(display, surface, x, y, text, len);
+ ((subclass(DisplayDriver))class(LFBDisplayDriver)).WriteText(display, surface, x, y, text, len, prevGlyph, rPrevGlyph);
d3dSurface.writingText = false;
IDirect3DDevice8_SetTextureStageState(d3dSystem.d3dDevice, 0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
IDirect3DDevice8_SetTextureStageState(d3dSystem.d3dDevice, 0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR); //NONE);
}
- void TextExtent(Display display, Surface surface, const char * text, int len, int * width, int * height)
+ void TextExtent(Display display, Surface surface, const char * text, int len, int * width, int * height, int prevGlyph, int * rPrevGlyph, int * adv)
{
- ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextExtent(display, surface, text, len, width, height);
+ ((subclass(DisplayDriver))class(LFBDisplayDriver)).TextExtent(display, surface, text, len, width, height, prevGlyph, rPrevGlyph, adv);
}
void DrawingChar(Display display, Surface surface, byte character)
{
Bitmap map = material.baseMap;
- IDirect3DDevice8_SetTexture(d3dDevice, 0, (IDirect3DBaseTexture8 *)map.picture);
+ IDirect3DDevice8_SetTexture(d3dDevice, 0, (IDirect3DBaseTexture8 *)map.driverData);
if(material.flags.tile)
{
}
}
- bool AllocateMesh(DisplaySystem displaySystem, Mesh mesh)
+ bool AllocateMesh(DisplaySystem displaySystem, Mesh mesh, MeshFeatures flags, int nVertices)
{
D3D8System d3dSystem = displaySystem.driverData;
bool result = false;
{
D3D8Mesh d3dMesh = mesh.data;
result = true;
- if((mesh.flags .vertices) && !d3dMesh.vertices)
+ if(mesh.nVertices == nVertices)
{
- mesh.vertices = new Vector3Df[mesh.nVertices];
- if(IDirect3DDevice8_CreateVertexBuffer(d3dDevice, sizeof(Vector3Df) * mesh.nVertices,
- d3dSystem.usage, 0, D3DPOOL_MANAGED, &d3dMesh.vertices))
- result = false;
- }
- if((mesh.flags.normals) && !d3dMesh.normals)
- {
- mesh.normals = new Vector3Df[mesh.nVertices];
- if(IDirect3DDevice8_CreateVertexBuffer(d3dDevice, sizeof(Vector3Df) * mesh.nVertices,
- d3dSystem.usage, 0, D3DPOOL_MANAGED, &d3dMesh.normals))
- result = false;
+ if(mesh.flags != flags)
+ {
+ // Same number of vertices, adding features (Leaves the other features pointers alone)
+ if(flags.vertices && !d3dMesh.vertices)
+ {
+ mesh.vertices = new Vector3Df[nVertices];
+ if(IDirect3DDevice8_CreateVertexBuffer(d3dDevice, sizeof(Vector3Df) * nVertices,
+ d3dSystem.usage, 0, D3DPOOL_MANAGED, &d3dMesh.vertices))
+ result = false;
+ }
+ if(flags.normals && !d3dMesh.normals)
+ {
+ mesh.normals = new Vector3Df[nVertices];
+ if(IDirect3DDevice8_CreateVertexBuffer(d3dDevice, sizeof(Vector3Df) * nVertices,
+ d3dSystem.usage, 0, D3DPOOL_MANAGED, &d3dMesh.normals))
+ result = false;
+ }
+ if(flags.texCoords1 && !d3dMesh.texCoords)
+ {
+ mesh.texCoords = new Pointf[nVertices];
+ if(IDirect3DDevice8_CreateVertexBuffer(d3dDevice, sizeof(Pointf) * nVertices,
+ d3dSystem.usage, 0, D3DPOOL_MANAGED, &d3dMesh.texCoords))
+ result = false;
+ }
+ }
}
- if((mesh.flags.texCoords1) && !d3dMesh.texCoords)
+ else
{
- mesh.texCoords = new Pointf[mesh.nVertices];
- if(IDirect3DDevice8_CreateVertexBuffer(d3dDevice, sizeof(Pointf) * mesh.nVertices,
- d3dSystem.usage, 0, D3DPOOL_MANAGED, &d3dMesh.texCoords))
- result = false;
+ // New number of vertices, reallocate all current and new features
+ flags |= mesh.flags;
+
+ // Same number of vertices, adding features (Leaves the other features pointers alone)
+ if(flags.vertices)
+ {
+ if(d3dMesh.vertices)
+ {
+ IDirect3DVertexBuffer8_Release(d3dMesh.vertices);
+ d3dMesh.vertices = null;
+ }
+ mesh.vertices = renew mesh.vertices Vector3Df[nVertices];
+ if(IDirect3DDevice8_CreateVertexBuffer(d3dDevice, sizeof(Vector3Df) * nVertices,
+ d3dSystem.usage, 0, D3DPOOL_MANAGED, &d3dMesh.vertices))
+ result = false;
+ }
+ if(flags.normals)
+ {
+ if(d3dMesh.normals)
+ {
+ IDirect3DVertexBuffer8_Release(d3dMesh.normals);
+ d3dMesh.normals = null;
+ }
+ mesh.normals = renew mesh.normals Vector3Df[nVertices];
+ if(IDirect3DDevice8_CreateVertexBuffer(d3dDevice, sizeof(Vector3Df) * nVertices,
+ d3dSystem.usage, 0, D3DPOOL_MANAGED, &d3dMesh.normals))
+ result = false;
+ }
+ if(flags.texCoords1)
+ {
+ if(d3dMesh.texCoords)
+ {
+ IDirect3DVertexBuffer8_Release(d3dMesh.texCoords);
+ d3dMesh.texCoords = null;
+ }
+ mesh.texCoords = renew mesh.texCoords Pointf[nVertices];
+ if(IDirect3DDevice8_CreateVertexBuffer(d3dDevice, sizeof(Pointf) * nVertices,
+ d3dSystem.usage, 0, D3DPOOL_MANAGED, &d3dMesh.texCoords))
+ result = false;
+ }
}
}
return result;