Registriert seit: 31. Aug 2005
1.622 Beiträge
FreePascal / Lazarus
|
Re: Andorra 2D [Ver. 0.20 ALPHA 2, 05.10.07]
21. Okt 2007, 16:50
Ganz Einfach: Indem ich die Texturkoordinaten der Vertices entsprechend setze:
Delphi-Quellcode:
procedure TAdCanvasLine.GenerateTextureCoords(maxlen: double;
var Vertices: TAdVertexArray);
var
i:integer;
lp,cp:PAdLinePoint;
ax,ay1,ay2,len:double;
begin
//Stretch coordinates
if Pen.TextureMode = tmStretch then
begin
FPoints.StartIteration;
i := 0;
lp := nil;
ax := 0;
while not FPoints.ReachedEnd do
begin
cp := PAdLinePoint(FPoints.GetCurrent);
Vertices[i*2].Texture.Y := 0;
Vertices[i*2+1].Texture.Y := 1;
if lp = nil then
begin
Vertices[0].Texture.X := 0;
Vertices[1].Texture.X := 0;
end
else
begin
len := sqrt(sqr(lp^.X - cp^.X) + sqr(lp^.Y - cp^.Y));
ax := ax + len/maxlen;
Vertices[i*2].Texture.X := ax;
Vertices[i*2+1].Texture.X := ax;
end;
lp := cp;
i := i + 1;
end;
end;
//Tile Coordinates
if Pen.TextureMode = tmTile then
begin
FPoints.StartIteration;
i := 0;
lp := nil;
ax := 0;
ay1 := 0.5 - (FPen.Width / 2) / (Pen.Texture.Height);
ay2 := 0.5 + (FPen.Width / 2) / (Pen.Texture.Height);
while not FPoints.ReachedEnd do
begin
cp := PAdLinePoint(FPoints.GetCurrent);
Vertices[i*2].Texture.Y := ay1;
Vertices[i*2+1].Texture.Y := ay2;
if lp = nil then
begin
Vertices[0].Texture.X := 0;
Vertices[1].Texture.X := 0;
end
else
begin
len := sqrt(sqr(lp^.X - cp^.X) + sqr(lp^.Y - cp^.Y));
ax := ax + len/Pen.Texture.Width;
Vertices[i*2].Texture.X := ax;
Vertices[i*2+1].Texture.X := ax;
end;
lp := cp;
i := i + 1;
end;
end;
end;
Der Grafikkarte ist es schließlich egal, ob die Vertices die ich zeichne ein 3D-Model, ein 2D-Sprite, ein Stern oder eben eine Linie sein sollen.
Andreas "Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
|