[quote="lordzero"]hello can you share the ]
from my 2d engine
procedure Div_Image_DrawRotateRect(var imageivImageest,Src:TRECT;Color:dword; Angle : Single;Blendeffect2DEffect);
//'This sub sets up the vertices for a sprite, taking into account
//width, height, vertex color, and rotation angle
//NOTE: R, G, and B dictate the color that the sprite will be -
//1, 1, 1 is normal, lower values will colorize the vertices
//' * v1 * v3
//' |\ |
//' | \ |
//' | \ |
//' | \ |
//' | \|
//' * v0 * v2
var
Verts:array[0..3]of TDivVertex;
SurfW,
SurfH,
XCenter ,
YCenter,
XCor ,
YCor:single;
begin
if image.Texture=nil then exit;
//Width of the surface
SurfW := image.Width;
//Height of the surface
SurfH := image.Height;
//Center coordinates on screen of the sprite;
XCenter := Dest.Left + (Dest.Right - Dest.Left - 1) / 2;
YCenter := Dest.Top + (Dest.Bottom - Dest.Top - 1) / 2;
//Calculate screen coordinates of sprite, and only rotate if necessary
If Angle = 0 Then
begin
XCor := Dest.Left;
YCor := Dest.Bottom;
end Else
begin
XCor := XCenter + (Dest.Left - XCenter) * Div_Math_Sin(round(Angle*afac)) + (Dest.Bottom - YCenter) * Div_Math_Cos(round(Angle*afac));
YCor := YCenter + (Dest.Bottom - YCenter) * Div_Math_Sin(round(Angle*afac)) - (Dest.Left - XCenter) * Div_Math_Cos(round(Angle*afac));
End;
//0 - Bottom left vertex
Verts[0]:=CreateD3DTLVertex (
XCor,
YCor,
0,
1.0,
color,
Src.Left / SurfW,
(Src.Bottom + 1) / SurfH,
);
//Calculate screen coordinates of sprite, and only rotate if necessary
If Angle = 0 Then
begin
XCor := Dest.Left;
YCor := Dest.Top;
end Else
begin
XCor := XCenter + (Dest.Left - XCenter) * Div_Math_Sin(round(Angle*afac)) + (Dest.Top - YCenter) * Div_Math_Cos(round(Angle*afac));
YCor := YCenter + (Dest.Top - YCenter) * Div_Math_Sin(round(Angle*afac)) - (Dest.Left - XCenter) * Div_Math_Cos(round(Angle*afac));
End;
//1 - Top left vertex
Verts[1]:=CreateD3DTLVertex (
XCor,
YCor,
0,
1.0,
color,
Src.Left / SurfW,
Src.Top / SurfH,
);
//Calculate screen coordinates of sprite, and only rotate if necessary
If Angle = 0 Then
begin
XCor := Dest.Right;
YCor := Dest.Bottom;
end Else
begin
XCor := XCenter + (Dest.Right - XCenter) * Div_Math_Sin(round(Angle*afac)) + (Dest.Bottom - YCenter) * Div_Math_Cos(round(Angle*afac)) ;
YCor := YCenter + (Dest.Bottom - YCenter) * Div_Math_Sin(round(Angle*afac)) - (Dest.Right - XCenter) * Div_Math_Cos(round(Angle*afac));
End;
//2 - Bottom right vertex
Verts[2]:=CreateD3DTLVertex(
XCor,
YCor,
0,
1.0,
color,
(Src.Right + 1) / SurfW,
(Src.Bottom + 1) / SurfH,
);
//Calculate screen coordinates of sprite, and only rotate if necessary
If Angle = 0 Then
begin
XCor := Dest.Right;
YCor := Dest.Top;
end Else
begin
XCor := XCenter + (Dest.Right - XCenter) * Div_Math_Sin(round(Angle*afac)) + (Dest.Top - YCenter) * Div_Math_Cos(round(Angle*afac));
YCor := YCenter + (Dest.Top - YCenter) * Div_Math_Sin(round(Angle*afac)) - (Dest.Right - XCenter) * Div_Math_Cos(round(Angle*afac));
End;
//3 - Top right vertex
Verts[3]:=CreateD3DTLVertex (
XCor,
YCor,
0,
1.0,
color,
(Src.Right + 1) / SurfW,
Src.Top / SurfH,
);
d3ddevice.SetTexture(0, image.texture);
case Blendeffect of
DEffectSolid2DEffectSolid;
DEffectBlend2DEffectBlend;
DEffectAdd2DEffectAdd;
DEffectSub2DEffectSub;
DEffectONE2DEffectoNE;
DEffectAdd2X2DEffectAdd2X;
DEffectLight2DEffectLight;
DEffectLightAdd2DEffectLightAdd;
end;
d3ddevice.SetVertexShader(VertexDef);
d3ddevice.DrawPrimitiveUp(D3DPT_TRIANGLESTRIP, 2,@verts,sizeof(TDivVertex));
d3ddevice.SetRenderState(D3DRS_ALPHABLENDENABLE, 0);
d3ddevice.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE);
d3ddevice.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_MODULATE);
end;
Bookmarks