![]() |
Re: Andorra 2D [Ver. 0.20 ALPHA 2, 05.10.07]
Liste der Anhänge anzeigen (Anzahl: 1)
Gerade schreibe ich den Andorra 2D Canvas um/neu. Neue Features darin werden sein:
- Doppelt so schnell wie vorher - Keine Darstellungsfehler wie vorher - Einstellen der Stiftbreite - Einstellen von Texturen als Pen oder Brush - Zeichnen von Polygonen - Zusammenfassen von Objekten in "Display Listen" - Vielleicht zeichnen von "Dashed"-Linien Als Vorgeschmack im Anhang ein Screenshot meiner neuen Demo "Spiral" |
Re: Andorra 2D [Ver. 0.20 ALPHA 2, 05.10.07]
Liste der Anhänge anzeigen (Anzahl: 1)
Nochmal ein Screenshot von genau der gleichen Demo, dieses mal wurde die Linie jedoch texturiert. Alles was dazu nötig ist, sind folgende Zeilen:
Delphi-Quellcode:
Wichtig ist jedoch, das die Textur eine "Power of Two"-Größe hat, sonst entstehen schwarze Lücken.
Pen.Texture := AdImageList[0].Texture.Texture;
Pen.TextureMode := tmTile; //Alternativ auch "Stretch" Übrigens: Mein Canvas-Code ist mittlerweile rund 1000 Zeilen lang - kann aber nur Linien zeichnen. Er wurde in die Unit "AdCanvas" ausgelagert, die jetzt bei der Benutzung extra eingebunden werden muss. Man kann das mit den Texturen besonders gut für "Strahlenkanonen" verwenden. |
Re: Andorra 2D [Ver. 0.20 ALPHA 2, 05.10.07]
Sieht nicht schlecht aus.... sind das jetzt OpenGL Funktionen die du vereinfachst mit deinem TCanvas ?
|
Re: Andorra 2D [Ver. 0.20 ALPHA 2, 05.10.07]
Liste der Anhänge anzeigen (Anzahl: 1)
Nach wie vor ist das natürlich von OpenGl oder Direct3d unabhängig und läuft mit beidem.
Spezielle OpenGl/DirectX Funktionen kommen nicht zum Einsatz - an der Plugin-DLL wurde nichts verändert. Vielmehr generiere ich aus dickeren Linien ein Polygon:
Delphi-Quellcode:
DirectX (über IDXLine oder sö ähnlich) oder OpenGl (über SetLineWidth oder so) machen das vermutlich intern genauso. function OrthogonalPoints(x1, y1, x2, y2, d: integer): TAdCanvasQuad; var alpha:double; l:double; begin FillChar(result, SizeOf(result), 0); l := sqrt(sqr(x2-x1)+sqr(y2-y1)); if l > 0 then begin alpha := arccos((x2-x1)/l); if (y2 > y1) then begin alpha := 2 * pi - alpha; end; alpha := - alpha; result.p1.X := x1 + cos(alpha + 0.5*pi) * d / 2; result.p1.Y := y1 + sin(alpha + 0.5*pi) * d / 2; result.p2.X := x1 + cos(alpha - 0.5*pi) * d / 2; result.p2.Y := y1 + sin(alpha - 0.5*pi) * d / 2; result.p3.X := x2 + cos(alpha + 0.5*pi) * d / 2; result.p3.Y := y2 + sin(alpha + 0.5*pi) * d / 2; result.p4.X := x2 + cos(alpha - 0.5*pi) * d / 2; result.p4.Y := y2 + sin(alpha - 0.5*pi) * d / 2; end; end; [...] //Calculate Vertices FPoints.StartIteration; i := 0; lp := nil; while not FPoints.ReachedEnd do begin cp := PAdLinePoint(FPoints.GetCurrent); [...] if lp <> nil then begin FLastQuad := quad; quad := OrthogonalPoints(lp^.x, lp^.y, cp^.x, cp^.y, FPen.Width); Vertices[i*2].Position := AdVector3(quad.p3.x, quad.p3.y, 0); Vertices[i*2].Color := cp^.Color; Vertices[i*2+1].Position := AdVector3(quad.p4.x, quad.p4.y, 0); Vertices[i*2+1].Color := cp^.Color; if i = 1 then begin Vertices[0].Position := AdVector3(quad.p1.x, quad.p1.y, 0); Vertices[0].Color := lp^.Color; Vertices[1].Position := AdVector3(quad.p2.x, quad.p2.y, 0); Vertices[1].Color := lp^.Color; end; end; lp := cp; i := i + 1; end; [...] //Calculate Indices for i := 0 to FPoints.Count - 2 do begin Indices[i * 6] := (i * 2) + 1; Indices[i * 6 + 1] := (i * 2); Indices[i * 6 + 2] := (i * 2) + 2; Indices[i * 6 + 3] := (i * 2) + 1; Indices[i * 6 + 4] := (i * 2) + 2; Indices[i * 6 + 5] := (i * 2) + 3; end; Zur Veranschaulichung habe ich nochmal ein Bild angehängt: |
Re: Andorra 2D [Ver. 0.20 ALPHA 2, 05.10.07]
und wie bekommst du die Textur da rein ?
|
Re: Andorra 2D [Ver. 0.20 ALPHA 2, 05.10.07]
Ganz Einfach: Indem ich die Texturkoordinaten der Vertices entsprechend setze:
Delphi-Quellcode:
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.
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; |
Re: Andorra 2D [Ver. 0.20 ALPHA 2, 05.10.07]
Interessant.... würde das so auch bei einem Normalen Canvas gehen ? also ohne OpenGL Unterstützung oder DX ?
Weil ich mich immer gefragt habe, wie die das bei ![]() |
Re: Andorra 2D [Ver. 0.20 ALPHA 2, 05.10.07]
Mit der Graphics32-Bibliothek ist das kein Problem. Sonst ist es vermutlich mit der GDI/GDI+ irgendwie möglich. Unter Linux (worauf du sicherlich hinaus willst) habe ich keine Ahnung. Mehr weiß ich leider auch nicht. Wenn es dich interessiert (mich interessiert es auch) kannst du ja einfach einen neuen Thread aufmachen und Fragen, vielleicht weiß ja jemand anderes bescheid.
EDIT: Die einfachste Methode ist es, die Textur gekachelt auf ein Bitmap zu zeichnen und dann ein anderes Bitmap mit dem Polygon als SW-Bild als Maske darüberzulegen. |
Re: Andorra 2D [Ver. 0.20 ALPHA 2, 05.10.07]
|
Re: Andorra 2D [Ver. 0.20 ALPHA 2, 05.10.07]
HI
ich benutze seit einer Woche Andorra und wühle mich im mom durch die ganzen Funktionen ... Dabei bin ich auf zwei Probleme gestoßen: 1) Wenn ich versuche ein Programm mit TAdSetup aus der AdSetupdlg zu compilieren also diesen Optionendialog spukt mir das Programm folgenden Fehler aus: Fehler beim Lesen von Image1.ExpliciteLeft: Eigenschaft ExpliciteLeft existiert nicht. Das spuckt er mir nicht als Compilerfehler aus sondern das compilierte Programm ... woran kann das liegen? und 2) Die GUI steuerung sieht so was ich bis jetzt gesehn habe gut aus nur ich komme mit der Ansteuerung der einzelnen Elemente nicht ganz klar wie ich zum beispiel Rausfinde Was jetzt im GUI in die Textbox geschrieben wurde usw ... wäre shcön wenn du dazu nen einfaches Beispiel Programm hättest oder gleich nen Tutorial schonmla danke mfg knoby |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz