Text in OpenGLcontrol

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Text in OpenGLcontrol

Beitrag von lzuser »

Win10, Laz1.6
Übertragung von Del6 nach Laz1.6

Ich habe in ein OpenGLcontrol (OGLCon) erfolgreich die Zeichnung eines 3d-Systems übertragen. Nun möchte ich wie vorher in Del das System auch noch beschriften. Dazu übernehme ich auch die in Del verwendeten procs. Der Compiler läuft so durch, aber es gibt leider keine Text-Ausgabe. Was muss ich mit OpenGLcontrol anders machen? Gibt es eine Musterlösung dafür?

Code: Alles auswählen

 
var DC:HDC;   //Handle auf Zeichenfläche
    //RC:HGLRC; //Rendering Context hier mit OpenGLcontrol nicht benutzt
    OGLFont: Cardinal; //Variable für den TextFont
    MyK:TKoSys; //Variable für mein eigenes KoSys
 
//in FormCreate:
DC:= GetDC(OGLCon.Handle)//--->>> So funktioniert das leider nicht ???
 
//unter Del hatte ich mit Hilfe der dglOpenGL gearbeitet und benutzt:
DC:= GetDC(OGLPanel.Handle); //also auf ein Panel gezeichnet
 
{--------------------------------------------------------------------}
procedure OpenGLCreateFont;
//Quelle:   http://wiki.delphigl.com/index.php/wglUseFontBitmaps
//Erzeugt einen Font aus einer Windows-Schriftart als Bitmap
//und legt ihn in der Variablen OGLFont ab; einmalig am Anfang
var Font: TFont;
begin
  OGLFont := glGenLists(256);
  Font := TFont.Create// Instanz einer Fontklasse erstellen
  try
    Font.Name := 'Arial'; // Font-Name  auch 'Times New Roman' oder 'Courier New'; breitengleich
    Font.Size := 10// Schriftgröße  //auch 32
    Font.Style := []; // auch [fsBold]
    SelectObject(DC, Font.Handle); // Font auf einen Device Context benutzen
    //Die Schrifteinstellungen des Device Contextes werden genutzt,
    //um mit glBitmap-Befehlen die angebenen Zeichen in Displaylisten zu speichern:
 
    wglUseFontBitmaps (DC, 0, 255, OGLFont); //--->>> hier wird DC benötigt
 
  finally
    FreeAndNil(Font)// erstellte Instanz wieder frei geben
  end;
end;
{--------------------------------------------------------------------}
procedure TKoSys.TextOutK(x1,y1,z1:double; pText: AnsiString);
//Der Text ist 2D; linke untere Ecke entpricht den Koordinaten
begin
glRasterPos3f(x1,y1,z1); //(sichtbare) Rasterposition eintellen
glListBase(OGLFont); // Font-Liste auswählen
glCallLists(Length(pText), GL_UNSIGNED_BYTE, Pointer(pText)); //Teil-Bitmap aufrufen
end;
{--------------------------------------------------------------------}
 
 

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Text in OpenGLcontrol

Beitrag von Mathias »

Ich hatte auch ein Schrift-Demo, welches unter Delphi lief. Ich wollte die auf Lazarus konvenieren, ausser eine SIGSEV, habe ich nichts erreicht.
Es wurde kein TOpenGLContext verwendet, sondern Win-Aufrufe.
So wie es scheint, muss man dafür recht tief in die Win-Api greifen.

Was noch eine Alternative wäre, den ganzen Zeichensatz auf eine Bitmap/Textur kopieren, und mit glTexCoord2f
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Text in OpenGLcontrol

Beitrag von marcov »


lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Re: Text in OpenGLcontrol

Beitrag von lzuser »

Win10-64, Laz1.6
Als Alternative habe ich aus http://wiki.lazarus.freepascal.org/OpenGL_Tutorial den Abschnitt "Bitmap fonts" mit dem Quelltext von https://sourceforge.net/projects/lazarus-ccr/files/OpenGL%20Tutorial/ getestet.
Leider auch kein Erfolg: Beim Compilieren kommt die Fehlermeldung "Could not load Glut from glut32.dll" und da komme ich halt nicht weiter.
Versuch: Sämtliche opengl-Dateien in den Progr.-Ordner kopiert - hilft nicht.
Auch wenn ich die mitgelieferte exe starte kommt "Runtime Error 217".
Irgendeine Idee, warum dieses fertige Prog nicht läuft?
Danke für eure Hilfe.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: Text in OpenGLcontrol

Beitrag von Michl »

lzuser hat geschrieben:Als Alternative habe ich aus http://wiki.lazarus.freepascal.org/OpenGL_Tutorial den Abschnitt "Bitmap fonts" mit dem Quelltext von https://sourceforge.net/projects/lazaru ... 0Tutorial/ getestet.
Habe es eben selbst schnell runtergeladen und in ein Verzeichnis mitsamt der DLLs von hier https://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip geworfen und es läuft hier (Windows 7).

Hast du mal überprüft, ob du bei einem 64bit Kompilat auch eine 64bit DLL verwendest bzw. mal eine 32bit Anwendung erstellt und damit probiert?

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Text in OpenGLcontrol

Beitrag von Mathias »

Leider auch kein Erfolg: Beim Compilieren kommt die Fehlermeldung "Could not load Glut from glut32.dll" und da komme ich halt nicht weiter.

Mal eine blöde Frage, was hast du für ein Grafik-Treiber installiert, den originalen von Windows, oder einen des GrKa-Hersteller ?

Wie sieht es mit dem Beispiel im Anhang aus, läuft diese bei dir ?
Dateianhänge
Goto_Null.zip
(125.68 KiB) 142-mal heruntergeladen
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Re: Text in OpenGLcontrol

Beitrag von lzuser »

Michl hat geschrieben:
lzuser hat geschrieben:Habe es eben selbst schnell runtergeladen und in ein Verzeichnis mitsamt der DLLs von hier https://www.opengl.org/resources/libraries/glut/glutdlls37beta.zip geworfen und es läuft hier (Windows 7).
Hast du mal überprüft, ob du bei einem 64bit Kompilat auch eine 64bit DLL verwendest bzw. mal eine 32bit Anwendung erstellt und damit probiert?


Mir fehlten die (richtigen?) glut-dlls im Prog-Ordner. Jetzt läuft es. Danke.
Ich verwende Laz1.6 - 32bit, damit die Progs auch auf älteren PCs laufen.

lzuser
Beiträge: 97
Registriert: Sa 20. Jun 2009, 16:00
OS, Lazarus, FPC: Win10 20H2, Laz 2.0.8 auch Linux Mint Mate 20, Laz 2.0.6
CPU-Target: 64Bit

Re: Text in OpenGLcontrol

Beitrag von lzuser »

Mathias hat geschrieben:Mal eine blöde Frage, was hast du für ein Grafik-Treiber installiert, den originalen von Windows, oder einen des GrKa-Hersteller ?
Wie sieht es mit dem Beispiel im Anhang aus, läuft diese bei dir ?


Treiber ist OK, Computer und Treiber kommen nach Vorschlag aus der Zeitschrift ct
Dein Beispiel läuft nicht. Mein Laz1.6 behauptet, es fehlen ogl_Package, LazOpenGLContext(sicher installiert und OpenGLControl schon benutzt) und LCL
Da stimmt was nicht. Ich verfolge erstmal obige Idee weiter. Trotzdem vielen Dank

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Text in OpenGLcontrol

Beitrag von Mathias »

Dein Beispiel läuft nicht. Mein Laz1.6 behauptet, es fehlen ogl_Package,

Die ogl_Package kannst problemlos aus dem Projectinspector entfernen, diese wird bei mir nur gebracht, wegen der dglopengl.pas.
Du muss nur die dglopengl.pas bei dir einbinden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Re: Text in OpenGLcontrol

Beitrag von Frank Ranis »

Hallo ,

ich habe mal ein paar Brocken von mir zusammengesucht und das Demo ' Goto_Null.zip' von Mathias ein wenig aufgehübscht und mit 3D-Textausgabe versehen.

Neues File 'Goto_Null_Mod_FR.zip' im Anhang.

Gruß

Frank
Dateianhänge
Goto_Null_Mod_FR.zip
(1.21 MiB) 167-mal heruntergeladen
www.flz-vortex.de

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Text in OpenGLcontrol

Beitrag von Mathias »

ich habe mal ein paar Brocken von mir zusammengesucht und das Demo ' Goto_Null.zip' von Mathias ein wenig aufgehübscht und mit 3D-Textausgabe versehen.

Nur hast du eine unsympathisch Unit eingebunden, Windows.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Re: Text in OpenGLcontrol

Beitrag von Frank Ranis »

Hallo Mathias ,

>>>>
Nur hast du eine unsympathisch Unit eingebunden, Windows.
<<<<

ich habe die letzten 2 Wochen mal nach einer Lösung für Lazarus (ohne Windows) gesucht.

Speziell zum 3D-Textausgabe in Opengl habe ich nichts gefunden.

Alle Delphi-Pascal-Quellen benutzen die Windows-Funktionen, die Portierung nach Laz bringt dann Null Vorteile.

Dann habe ich nach einer Möglichkeit gesucht , an die Stützstellen der Fonts zu kommen.
Mit Windows ganz einfach.

Code: Alles auswählen

unit ttf_font_stuetzstellen_windows_unit;
 
{$mode objfpc}{$H+}
 
interface
 
uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
 
  windows; // <-- doof
 
type
 
  { TForm1 }
 
  TForm1 = class(TForm)
    Button1: TButton;
    FontDialog1: TFontDialog;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;
 
type
TPoly = array of TPoint;
TTypes = array of Byte;
 
var
Poly : TPoly;
Types : TTypes;
AnzPkt : integer;
 
 
var
  Form1: TForm1;
 
implementation
 
{$R *.lfm}
 
{ TForm1 }
 
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
 memo1.Clear;
Canvas.Font.Size := 100;
if fontdialog1.Execute
 then canvas.Font.Name :=fontdialog1.Font.Name
 else canvas.Font.Name := 'Microsoft Sans Serif';
Canvas.Pen.Color := clRed;
BeginPath(Canvas.Handle);
SetBkMode(Canvas.Handle, TRANSPARENT);
Canvas.TextOut(20, 30, 'A');
EndPath(Canvas.Handle);
 
AnzPkt := GetPath(Canvas.Handle, Poly, Types, 0);
if AnzPkt < 1 then exit;
 
SetLength(Poly, AnzPkt);
SetLength(Types, AnzPkt);
 
// Linienzug in Poly speichern
// PolyDraw and GetPath
// point types
// PT_CLOSEFIGURE = 1;
// PT_LINETO = 2;
// PT_BEZIERTO = 4;
// PT_MOVETO = 6;
GetPath(Canvas.Handle, Poly[0], types[0], AnzPkt);
 
for i := 0 to AnzPkt-1 do
 begin
  memo1.Lines.Add(inttostr(types[i])+'  '+inttostr(poly[i].X)+'   '+inttostr(poly[i].Y));
 end;
 
// Zeichnen der Orginal Fontstützstellen (grob)
for i := 0 to AnzPkt-1 do
 begin
  if types[i]=6
   then form1.canvas.moveTo(poly[i].X,poly[i].y)
   else form1.canvas.lineTo(poly[i].X,poly[i].y);
 end;
 
end;
 
end.                             
 


Gibt es da wirklich keine FPC-Funktionen um

BeginPath
SetBkMode
EndPath
GetPath

zu ersetzten ?

Dann habe ich nach einem TrueType-Parser gesucht , um mir zumindest die Stützstellen der Vektor-Fonts rauszusaugen.
Aber auch hier habe ich nicht gutes finden können .
Es gibt was schönes in JavaSript (https://github.com/nodebox/opentype.js) , Super .
Aber von JS habe ich aber NULL Ahnung , die Einarbeitung und eine Portierung nach PFC würde mich Monate kosten.

Die Idee wäre dann
1) die Fontstüzstellen (grobe Polygone ) nehmen
2) diese mit einem Spline glätten
3) die 2D-Polygone triangulieren
4) die 2D-Dreicke zu einem 3D-Körper umformen.
5) das ganze als STL-File abspeichern .

Das STL ja ein einfaches Dreick-Fileformat hat , kann man dieses prima für OpenGl / 3D-Druck u.u.u. benutzen.
Und es sollte damit auch keine Probleme auf anderen Betriebssystemen geben.

Aber , ich muß nur erst mal an die Vektor-Font-Koordinaten rann kommen.
Hat einer was passendes ? , ne Demo mit Quellen .

Gruß

Frank
www.flz-vortex.de

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Text in OpenGLcontrol

Beitrag von Mathias »

Es gibt was schönes in JavaSript (https://github.com/nodebox/opentype.js) , Super .
Aber von JS habe ich aber NULL Ahnung , die Einarbeitung und eine Portierung nach PFC würde mich Monate kosten.

Ein wenig kenne ich JS, aber dies scheint ein recht komplexes Programm zu sein.
Müssten TrueType Schriften nicht recht verwand mit WMF-Dateien sein ?

Was ich mal gemacht habe, ist ein Umweg über Bitmap und Texturen.
Ich habe den ganzen Zeichensatz, in eine Textur gelegt und dann Zeichen für Zeichen aus der Textur angezeigt.
ZB. für "Hello" musste man dann 5 Rechtecke rendern, dafür kann man aber bei jedem Render-Durchgang einen anderen Text nehmen.
Ich habe das Ganze mit eine Shader gelöst. Aber mit glTexCoord müsste es eigentlich auch gehen.

Auch werden proportional-Schriften unterstützt, auch ist der Hintergrund transparent. Aber nur max 256 Zeichen, welche auf der Console unterstützt werden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Re: Text in OpenGLcontrol

Beitrag von Frank Ranis »

Hallo Mathias,

Mathias hat geschrieben:Ein wenig kenne ich JS, aber dies scheint ein recht komplexes Programm zu sein.


Ja , das ist schon recht umfangreich , man müßte ja eigentlich nur den Parser-Teil rausziehen, das halt hinten die Polygone rausfallen.

Mathias hat geschrieben:Müssten TrueType Schriften nicht recht verwand mit WMF-Dateien sein ?


Das kann ich jetzt nicht beurteilen , die Dateien liegen ja nur als Binärfile vor .
Aus der Mircrosoft-TTF-Doku werde ich nicht so recht schlau .
Eine Klartext-Datei wäre schön , dann könnte man sich die Stuktur in einem Texteditor anschauen und sich was zusammenreimen.
Zum speichern meiner Daten nehme ich daher immer Textdateien , alla Ini oder so .

Mathias hat geschrieben:Was ich mal gemacht habe, ist ein Umweg über Bitmap und Texturen.
Ich habe den ganzen Zeichensatz, in eine Textur gelegt und dann Zeichen für Zeichen aus der Textur angezeigt.
ZB. für "Hello" musste man dann 5 Rechtecke rendern, dafür kann man aber bei jedem Render-Durchgang einen anderen Text nehmen.
Ich habe das Ganze mit eine Shader gelöst. Aber mit glTexCoord müsste es eigentlich auch gehen.

Auch werden proportional-Schriften unterstützt, auch ist der Hintergrund transparent. Aber nur max 256 Zeichen, welche auf der Console unterstützt werden.


Bitmap und Texturen ist ja ganz nett , wenn es um die reine Bilddarstellung geht.
Ich bevorzuge aber lieber richtige 3D-Körper mit allen Koordianten-Werten XYZ.
Mit diesen kann man dann auch in allen Richtugen (CAD , STL , DXF , booleansche Operationen , 3D-Druck , CNC) weiterarbeiten .
Und OpenGL dann als reines Visualisierungs-Tool der 3D-Daten benutzen.

Wie machst Du es mit deinen Bitmap/Texturen-Fonts , wenn es um die 3D-Darstellung geht , hast Du da mal ein Demo ?.
Man möchte ja die Texte auch gestreckt (in Tiefenrichtung) , von allen Seiten mit Beleuchtungs-Effekten sehen und nicht nur platt auf einer Fläche.
Und zwischen den einzelnen Buchstaben des Textes möchte ich auch hindurchfahren können .

Wie macht es LAZ/FPC eigentlich , wenn es auf dem Canvas mit Textout zeichnet .
Man kann ja den Canvas-Font auswählen , und diverse Parameter dazu und Textout malt dann den Schriftzug .
Irgendwo in den Tiefen von Freepascal müßen doch eigentlich alle Routinen , die wir brauchen , vorhanden sein , nur wo .
Und es muß ja auch eine Auswertung der TTF-Vektor-Daten stattfinden , auch ohne 'Uses Windows'.
Dann müßte man doch irgendwie an die Font-Polygon-Koordinaten rankommen können.

Ich programmiere nun schon 20 Jahre in Pascal und merke immer wieder , das ich doch eigentlich nur an der Oberfläche rumkratze , von den Tiefen habe ich kaum eine Ahnung .

Gruß

Frank
www.flz-vortex.de

Mathias
Beiträge: 6167
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: Text in OpenGLcontrol

Beitrag von Mathias »

Wie machst Du es mit deinen Bitmap/Texturen-Fonts , wenn es um die 3D-Darstellung geht , hast Du da mal ein Demo ?.
Man möchte ja die Texte auch gestreckt (in Tiefenrichtung) , von allen Seiten mit Beleuchtungs-Effekten sehen und nicht nur platt auf einer Fläche.
Und zwischen den einzelnen Buchstaben des Textes möchte ich auch hindurchfahren können .

Das hast du recht, es sind nur Flächen, aber dies kann man in alle Richtungen drehen und beleuchten, so wie es bei einer normalen Textur auch der Fall ist.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten