diff --git a/Vocaluxe/Lib/Draw/CDirect3D.cs b/Vocaluxe/Lib/Draw/CDirect3D.cs
index bceaf4d1..2df5bb7f 100644
--- a/Vocaluxe/Lib/Draw/CDirect3D.cs
+++ b/Vocaluxe/Lib/Draw/CDirect3D.cs
@@ -953,11 +953,8 @@ namespace Vocaluxe.Lib.Draw
/// The texture to be drawn
public void DrawTexture(STexture Texture)
{
- //lock (MutexTexture)
- {
- if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index))
- DrawTexture(Texture, Texture.rect, Texture.color);
- }
+ if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index))
+ DrawTexture(Texture, Texture.rect, Texture.color);
}
///
@@ -967,11 +964,8 @@ namespace Vocaluxe.Lib.Draw
/// A SRectF struct containing the destination coordinates
public void DrawTexture(STexture Texture, SRectF rect)
{
- //lock (MutexTexture)
- {
- if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index))
- DrawTexture(Texture, rect, Texture.color, false);
- }
+ if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index))
+ DrawTexture(Texture, rect, Texture.color, false);
}
///
@@ -982,11 +976,8 @@ namespace Vocaluxe.Lib.Draw
/// A SColorF struct containing a color which the texture will be colored in
public void DrawTexture(STexture Texture, SRectF rect, SColorF color)
{
- //lock (MutexTexture)
- {
- if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index))
- DrawTexture(Texture, rect, color, false);
- }
+ if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index))
+ DrawTexture(Texture, rect, color, false);
}
///
@@ -998,11 +989,8 @@ namespace Vocaluxe.Lib.Draw
/// A SRectF struct containing which part of the texture should be drawn
public void DrawTexture(STexture Texture, SRectF rect, SColorF color, SRectF bounds)
{
- //lock (MutexTexture)
- {
- if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index))
- DrawTexture(Texture, rect, color, bounds, false);
- }
+ if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index))
+ DrawTexture(Texture, rect, color, bounds, false);
}
///
@@ -1014,11 +1002,8 @@ namespace Vocaluxe.Lib.Draw
/// True if the texture should be mirrored
public void DrawTexture(STexture Texture, SRectF rect, SColorF color, bool mirrored)
{
- //lock (MutexTexture)
- {
- if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index))
- DrawTexture(Texture, rect, color, new SRectF(0, 0, CSettings.iRenderW, CSettings.iRenderH, rect.Z), mirrored);
- }
+ if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index))
+ DrawTexture(Texture, rect, color, new SRectF(0, 0, CSettings.iRenderW, CSettings.iRenderH, rect.Z), mirrored);
}
///
@@ -1031,116 +1016,113 @@ namespace Vocaluxe.Lib.Draw
/// True if the texture should be mirrored
public void DrawTexture(STexture Texture, SRectF rect, SColorF color, SRectF bounds, bool mirrored)
{
- //lock (MutexTexture)
+ if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index) && _TextureExists(ref Texture))
{
- if ((Texture.index >= 0) && (_Textures.Count > 0) && (_D3DTextures.Count > Texture.index) && _TextureExists(ref Texture))
+ //Calculate the position
+ float x1 = (bounds.X - rect.X) / rect.W * Texture.width_ratio;
+ float x2 = (bounds.X + bounds.W - rect.X) / rect.W * Texture.width_ratio;
+ float y1 = (bounds.Y - rect.Y) / rect.H * Texture.height_ratio;
+ float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * Texture.height_ratio;
+
+ if (x1 < 0)
+ x1 = 0f;
+
+ if (x2 > Texture.width_ratio)
+ x2 = Texture.width_ratio;
+
+ if (y1 < 0)
+ y1 = 0f;
+
+ if (y2 > Texture.height_ratio)
+ y2 = Texture.height_ratio;
+
+ //Calculate the size
+ float rx1 = rect.X;
+ float rx2 = rect.X + rect.W;
+ float ry1 = rect.Y;
+ float ry2 = rect.Y + rect.H;
+
+ if (rx1 < bounds.X)
+ rx1 = bounds.X;
+
+ if (rx2 > bounds.X + bounds.W)
+ rx2 = bounds.X + bounds.W;
+
+ if (ry1 < bounds.Y)
+ ry1 = bounds.Y;
+
+ if (ry2 > bounds.Y + bounds.H)
+ ry2 = bounds.Y + bounds.H;
+
+ //Align the pixels because Direct3D expects the pixels to be the left top corner
+ rx1 -= 0.5f;
+ ry1 -= 0.5f;
+ rx2 -= 0.5f;
+ ry2 -= 0.5f;
+
+ if (color.R >= 1f)
+ color.R = 1f;
+ if (color.B >= 1f)
+ color.B = 1f;
+ if (color.G >= 1f)
+ color.G = 1f;
+
+ //Apply rotation
+ //FIXME: Rotated textures get distorted when they hit the border of the window
+ if (rect.Rotation != 0)
{
- //Calculate the position
- float x1 = (bounds.X - rect.X) / rect.W * Texture.width_ratio;
- float x2 = (bounds.X + bounds.W - rect.X) / rect.W * Texture.width_ratio;
- float y1 = (bounds.Y - rect.Y) / rect.H * Texture.height_ratio;
- float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * Texture.height_ratio;
+ rect.Rotation = rect.Rotation * (float)Math.PI / 180;
+ float centerX = (rx1 + rx2) / 2f;
+ float centerY = -(ry1 + ry2) / 2f;
- if (x1 < 0)
- x1 = 0f;
+ Matrix originTranslation = _Device.GetTransform(TransformState.World);
+ Matrix translationA = Matrix.Translation(-centerX, -centerY, 0);
+ Matrix rotation = Matrix.RotationZ(-rect.Rotation);
+ Matrix translationB = Matrix.Translation(centerX, centerY, 0);
- if (x2 > Texture.width_ratio)
- x2 = Texture.width_ratio;
+ //Multiplicate the matrices to get the real world matrix,
+ //First shift the texture into the center
+ //Rotate it and shift it back to the origin position
+ //Apply the originTranslation after
+ Matrix result = translationA * rotation * translationB * originTranslation;
- if (y1 < 0)
- y1 = 0f;
+ _Device.SetTransform(TransformState.World, result);
+ }
- if (y2 > Texture.height_ratio)
- y2 = Texture.height_ratio;
+ Color c = Color.FromArgb((int)(color.A * 255 * CGraphics.GlobalAlpha), (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
- //Calculate the size
- float rx1 = rect.X;
- float rx2 = rect.X + rect.W;
- float ry1 = rect.Y;
- float ry2 = rect.Y + rect.H;
-
- if (rx1 < bounds.X)
- rx1 = bounds.X;
-
- if (rx2 > bounds.X + bounds.W)
- rx2 = bounds.X + bounds.W;
-
- if (ry1 < bounds.Y)
- ry1 = bounds.Y;
-
- if (ry2 > bounds.Y + bounds.H)
- ry2 = bounds.Y + bounds.H;
-
- //Align the pixels because Direct3D expects the pixels to be the left top corner
- rx1 -= 0.5f;
- ry1 -= 0.5f;
- rx2 -= 0.5f;
- ry2 -= 0.5f;
-
- if (color.R >= 1f)
- color.R = 1f;
- if (color.B >= 1f)
- color.B = 1f;
- if (color.G >= 1f)
- color.G = 1f;
-
- //Apply rotation
- //FIXME: Rotated textures get distorted when they hit the border of the window
- if (rect.Rotation != 0)
- {
- rect.Rotation = rect.Rotation * (float)Math.PI / 180;
- float centerX = (rx1 + rx2) / 2f;
- float centerY = -(ry1 + ry2) / 2f;
-
- Matrix originTranslation = _Device.GetTransform(TransformState.World);
- Matrix translationA = Matrix.Translation(-centerX, -centerY, 0);
- Matrix rotation = Matrix.RotationZ(-rect.Rotation);
- Matrix translationB = Matrix.Translation(centerX, centerY, 0);
-
- //Multiplicate the matrices to get the real world matrix,
- //First shift the texture into the center
- //Rotate it and shift it back to the origin position
- //Apply the originTranslation after
- Matrix result = translationA * rotation * translationB * originTranslation;
-
- _Device.SetTransform(TransformState.World, result);
- }
-
- Color c = Color.FromArgb((int)(color.A * 255 * CGraphics.GlobalAlpha), (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
-
- //Create new vertices and write them into a vertexbuffer
- DataStream stream = _VertexBuffer.Lock(0, 0, LockFlags.Discard);
- if (!mirrored)
- {
- stream.WriteRange(new[] {
- new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), c.ToArgb()),
- new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()),
- new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()),
- new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), c.ToArgb()),
- });
- }
- else
- {
- stream.WriteRange(new[] {
- new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, -y1), c.ToArgb()),
- new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, -y2), c.ToArgb()),
- new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, -y2), c.ToArgb()),
- new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, -y1), c.ToArgb()),
+ //Create new vertices and write them into a vertexbuffer
+ DataStream stream = _VertexBuffer.Lock(0, 0, LockFlags.Discard);
+ if (!mirrored)
+ {
+ stream.WriteRange(new[] {
+ new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), c.ToArgb()),
+ new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()),
+ new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()),
+ new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), c.ToArgb()),
+ });
+ }
+ else
+ {
+ stream.WriteRange(new[] {
+ new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, -y1), c.ToArgb()),
+ new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, -y2), c.ToArgb()),
+ new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, -y2), c.ToArgb()),
+ new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, -y1), c.ToArgb()),
});
- }
- _VertexBuffer.Unlock();
- stream.Dispose();
- //Set the texture
- _Device.SetTexture(0, _D3DTextures[Texture.index]);
- //Draw 2 triangles to build a quad
- _Device.DrawPrimitives(PrimitiveType.TriangleFan, 0, 2);
+ }
+ _VertexBuffer.Unlock();
+ stream.Dispose();
+ //Set the texture
+ _Device.SetTexture(0, _D3DTextures[Texture.index]);
+ //Draw 2 triangles to build a quad
+ _Device.DrawPrimitives(PrimitiveType.TriangleFan, 0, 2);
- //Reapply old matrices if the texture was rotated
- if (rect.Rotation != 0)
- {
- Matrix originTranslation = Matrix.Translation(new Vector3(-CSettings.iRenderW / 2, CSettings.iRenderH / 2, 0));
- _Device.SetTransform(TransformState.World, originTranslation);
- }
+ //Reapply old matrices if the texture was rotated
+ if (rect.Rotation != 0)
+ {
+ Matrix originTranslation = Matrix.Translation(new Vector3(-CSettings.iRenderW / 2, CSettings.iRenderH / 2, 0));
+ _Device.SetTransform(TransformState.World, originTranslation);
}
}
}
@@ -1156,19 +1138,133 @@ namespace Vocaluxe.Lib.Draw
public void DrawTexture(STexture Texture, SRectF rect, SColorF color, float begin, float end)
{
- //lock (MutexTexture)
+ if (_TextureExists(ref Texture))
{
+ float x1 = 0f + begin * Texture.width_ratio;
+ float x2 = Texture.width_ratio * end;
+ float y1 = 0f;
+ float y2 = Texture.height_ratio;
+
+ float rx1 = rect.X + begin * rect.W;
+ float rx2 = rect.X + end * rect.W;
+ float ry1 = rect.Y;
+ float ry2 = rect.Y + rect.H;
+
+ //Align the pixels because Direct3D expects the pixels to be the left top corner
+ rx1 -= 0.5f;
+ ry1 -= 0.5f;
+ rx2 -= 0.5f;
+ ry2 -= 0.5f;
+
+ Color c = Color.FromArgb((int)(color.A * 255 * CGraphics.GlobalAlpha), (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
+
+ //Apply rotation
+ //FIXME: Rotated textures get distorted when they hit the border of the window
+ if (rect.Rotation != 0)
+ {
+ rect.Rotation = rect.Rotation * (float)Math.PI / 180;
+ float centerX = (rx1 + rx2) / 2f;
+ float centerY = -(ry1 + ry2) / 2f;
+
+ Matrix originTranslation = _Device.GetTransform(TransformState.World);
+ Matrix translationA = Matrix.Translation(-centerX, -centerY, 0);
+ Matrix rotation = Matrix.RotationZ(-rect.Rotation);
+ Matrix translationB = Matrix.Translation(centerX, centerY, 0);
+
+ //Multiplicate the matrices to get the real world matrix,
+ //First shift the texture into the center
+ //Rotate it and shift it back to the origin position
+ //Apply the originTranslation after
+ Matrix result = translationA * rotation * translationB * originTranslation;
+
+ _Device.SetTransform(TransformState.World, result);
+ }
+
+ //Create new vertices and write them into a vertexbuffer
+ DataStream stream = _VertexBuffer.Lock(0, 0, LockFlags.Discard);
+ stream.WriteRange(new[] {
+ new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), c.ToArgb()),
+ new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()),
+ new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()),
+ new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), c.ToArgb()),
+ });
+ _VertexBuffer.Unlock();
+ stream.Dispose();
+ //Set the texture
+ _Device.SetTexture(0, _D3DTextures[Texture.index]);
+ //Draw 2 triangles to build a quad
+ _Device.DrawPrimitives(PrimitiveType.TriangleFan, 0, 2);
+
+ //Reapply old matrices if the texture was rotated
+ if (rect.Rotation != 0)
+ {
+ Matrix originTranslation = Matrix.Translation(new Vector3(-CSettings.iRenderW / 2, CSettings.iRenderH / 2, 0));
+ _Device.SetTransform(TransformState.World, originTranslation);
+ }
+ }
+ }
+
+ ///
+ /// Draws a reflection of a texture
+ ///
+ /// The texture of which a reflection should be drawn
+ /// A SRectF struct containing the destination coordinates
+ /// A SColorF struct containing a color which the texture will be colored in
+ /// A SRectF struct containing which part of the texture should be drawn
+ /// The space between the texture and the reflection
+ /// The height of the reflection
+ public void DrawTextureReflection(STexture Texture, SRectF rect, SColorF color, SRectF bounds, float space, float height)
+ {
+ if (_TextureExists(ref Texture))
+ {
+ if (rect.W == 0f || rect.H == 0f || bounds.H == 0f || bounds.W == 0f || color.A == 0f || height <= 0f)
+ return;
+
+ if (bounds.X > rect.X + rect.W || bounds.X + bounds.W < rect.X)
+ return;
+
+ if (bounds.Y > rect.Y + rect.H || bounds.Y + bounds.H < rect.Y)
+ return;
+
+ if (height > bounds.H)
+ height = bounds.H;
+
if (_TextureExists(ref Texture))
{
- float x1 = 0f + begin * Texture.width_ratio;
- float x2 = Texture.width_ratio * end;
- float y1 = 0f;
- float y2 = Texture.height_ratio;
+ float x1 = (bounds.X - rect.X) / rect.W * Texture.width_ratio;
+ float x2 = (bounds.X + bounds.W - rect.X) / rect.W * Texture.width_ratio;
+ float y1 = (bounds.Y - rect.Y + rect.H - height) / rect.H * Texture.height_ratio;
+ float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * Texture.height_ratio;
- float rx1 = rect.X + begin * rect.W;
- float rx2 = rect.X + end * rect.W;
- float ry1 = rect.Y;
- float ry2 = rect.Y + rect.H;
+ if (x1 < 0)
+ x1 = 0f;
+
+ if (x2 > Texture.width_ratio)
+ x2 = Texture.width_ratio;
+
+ if (y1 < 0)
+ y1 = 0f;
+
+ if (y2 > Texture.height_ratio)
+ y2 = Texture.height_ratio;
+
+
+ float rx1 = rect.X;
+ float rx2 = rect.X + rect.W;
+ float ry1 = rect.Y + rect.H + space;
+ float ry2 = rect.Y + rect.H + space + height;
+
+ if (rx1 < bounds.X)
+ rx1 = bounds.X;
+
+ if (rx2 > bounds.X + bounds.W)
+ rx2 = bounds.X + bounds.W;
+
+ if (ry1 < bounds.Y + space)
+ ry1 = bounds.Y + space;
+
+ if (ry2 > bounds.Y + bounds.H + space + height)
+ ry2 = bounds.Y + bounds.H + space + height;
//Align the pixels because Direct3D expects the pixels to be the left top corner
rx1 -= 0.5f;
@@ -1176,8 +1272,6 @@ namespace Vocaluxe.Lib.Draw
rx2 -= 0.5f;
ry2 -= 0.5f;
- Color c = Color.FromArgb((int)(color.A * 255 * CGraphics.GlobalAlpha), (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
-
//Apply rotation
//FIXME: Rotated textures get distorted when they hit the border of the window
if (rect.Rotation != 0)
@@ -1200,13 +1294,16 @@ namespace Vocaluxe.Lib.Draw
_Device.SetTransform(TransformState.World, result);
}
+ Color c = Color.FromArgb((int)(color.A * 255 * CGraphics.GlobalAlpha), (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
+ Color transparent = Color.FromArgb(0, (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
+
//Create new vertices and write them into a vertexbuffer
DataStream stream = _VertexBuffer.Lock(0, 0, LockFlags.Discard);
stream.WriteRange(new[] {
- new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), c.ToArgb()),
- new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()),
- new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()),
- new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), c.ToArgb()),
+ new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()),
+ new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), transparent.ToArgb()),
+ new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), transparent.ToArgb()),
+ new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()),
});
_VertexBuffer.Unlock();
stream.Dispose();
@@ -1225,127 +1322,6 @@ namespace Vocaluxe.Lib.Draw
}
}
- ///
- /// Draws a reflection of a texture
- ///
- /// The texture of which a reflection should be drawn
- /// A SRectF struct containing the destination coordinates
- /// A SColorF struct containing a color which the texture will be colored in
- /// A SRectF struct containing which part of the texture should be drawn
- /// The space between the texture and the reflection
- /// The height of the reflection
- public void DrawTextureReflection(STexture Texture, SRectF rect, SColorF color, SRectF bounds, float space, float height)
- {
- //lock (MutexTexture)
- {
- if (_TextureExists(ref Texture))
- {
- if (rect.W == 0f || rect.H == 0f || bounds.H == 0f || bounds.W == 0f || color.A == 0f || height <= 0f)
- return;
-
- if (bounds.X > rect.X + rect.W || bounds.X + bounds.W < rect.X)
- return;
-
- if (bounds.Y > rect.Y + rect.H || bounds.Y + bounds.H < rect.Y)
- return;
-
- if (height > bounds.H)
- height = bounds.H;
-
- if (_TextureExists(ref Texture))
- {
- float x1 = (bounds.X - rect.X) / rect.W * Texture.width_ratio;
- float x2 = (bounds.X + bounds.W - rect.X) / rect.W * Texture.width_ratio;
- float y1 = (bounds.Y - rect.Y + rect.H - height) / rect.H * Texture.height_ratio;
- float y2 = (bounds.Y + bounds.H - rect.Y) / rect.H * Texture.height_ratio;
-
- if (x1 < 0)
- x1 = 0f;
-
- if (x2 > Texture.width_ratio)
- x2 = Texture.width_ratio;
-
- if (y1 < 0)
- y1 = 0f;
-
- if (y2 > Texture.height_ratio)
- y2 = Texture.height_ratio;
-
-
- float rx1 = rect.X;
- float rx2 = rect.X + rect.W;
- float ry1 = rect.Y + rect.H + space;
- float ry2 = rect.Y + rect.H + space + height;
-
- if (rx1 < bounds.X)
- rx1 = bounds.X;
-
- if (rx2 > bounds.X + bounds.W)
- rx2 = bounds.X + bounds.W;
-
- if (ry1 < bounds.Y + space)
- ry1 = bounds.Y + space;
-
- if (ry2 > bounds.Y + bounds.H + space + height)
- ry2 = bounds.Y + bounds.H + space + height;
-
- //Align the pixels because Direct3D expects the pixels to be the left top corner
- rx1 -= 0.5f;
- ry1 -= 0.5f;
- rx2 -= 0.5f;
- ry2 -= 0.5f;
-
- //Apply rotation
- //FIXME: Rotated textures get distorted when they hit the border of the window
- if (rect.Rotation != 0)
- {
- rect.Rotation = rect.Rotation * (float)Math.PI / 180;
- float centerX = (rx1 + rx2) / 2f;
- float centerY = -(ry1 + ry2) / 2f;
-
- Matrix originTranslation = _Device.GetTransform(TransformState.World);
- Matrix translationA = Matrix.Translation(-centerX, -centerY, 0);
- Matrix rotation = Matrix.RotationZ(-rect.Rotation);
- Matrix translationB = Matrix.Translation(centerX, centerY, 0);
-
- //Multiplicate the matrices to get the real world matrix,
- //First shift the texture into the center
- //Rotate it and shift it back to the origin position
- //Apply the originTranslation after
- Matrix result = translationA * rotation * translationB * originTranslation;
-
- _Device.SetTransform(TransformState.World, result);
- }
-
- Color c = Color.FromArgb((int)(color.A * 255 * CGraphics.GlobalAlpha), (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
- Color transparent = Color.FromArgb(0, (int)(color.R * 255), (int)(color.G * 255), (int)(color.B * 255));
-
- //Create new vertices and write them into a vertexbuffer
- DataStream stream = _VertexBuffer.Lock(0, 0, LockFlags.Discard);
- stream.WriteRange(new[] {
- new TexturedColoredVertex(new Vector3(rx2, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x2, y2), c.ToArgb()),
- new TexturedColoredVertex(new Vector3(rx2, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x2, y1), transparent.ToArgb()),
- new TexturedColoredVertex(new Vector3(rx1, -ry2, rect.Z + CGraphics.ZOffset), new Vector2(x1, y1), transparent.ToArgb()),
- new TexturedColoredVertex(new Vector3(rx1, -ry1, rect.Z + CGraphics.ZOffset), new Vector2(x1, y2), c.ToArgb()),
- });
- _VertexBuffer.Unlock();
- stream.Dispose();
- //Set the texture
- _Device.SetTexture(0, _D3DTextures[Texture.index]);
- //Draw 2 triangles to build a quad
- _Device.DrawPrimitives(PrimitiveType.TriangleFan, 0, 2);
-
- //Reapply old matrices if the texture was rotated
- if (rect.Rotation != 0)
- {
- Matrix originTranslation = Matrix.Translation(new Vector3(-CSettings.iRenderW / 2, CSettings.iRenderH / 2, 0));
- _Device.SetTransform(TransformState.World, originTranslation);
- }
- }
- }
- }
- }
-
private void CheckQueque()
{
lock (MutexTexture)