Text in OpenGLcontrol

Für Probleme bezüglich Grafik, Audio, GL, ACS, ...
wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Text in OpenGLcontrol

Beitrag von wp_xyz »

Eine Idee als Anregung, um das Zerpflücken der TTF-Dateien zu umgehen: Für die plattformunabhängige Textausgabe in TAChart mit Hilfe des OpenGL-Drawers habe ich vor einiger Zeit einige Routinen aus diversen Forumsbeiträgen zusammengetragen. Sie sind allerdings nicht direkt nutzbar. Du müsstest dir die Datei TADrawerOpenGL.pas aus der Lazarus-Trunk-Version besorgen (z.B. http://svn.freepascal.org/cgi-bin/viewv ... s&view=log) und dann die mit dem Define {$IFDEF CHARTGL_USE_LAZFREETYPE} eingeklammerten Teile in eine separate Unit extrahieren. Die verwendeten FreeType-Units gehören zum Lazarus-Package LazUtils und sind unabhängig von der LCL. Eine Routine, wie das anzuwenden ist, findest du in TOpenGLDrawer.SimpleTextOut().

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

Re: Text in OpenGLcontrol

Beitrag von Frank Ranis »

Hallo ,

ich habe weiter im WWW gesuch und habe hier

http://forum.lazarus.freepascal.org/ind ... c=19980.15

etwas gefunden.

In der Antwort von 'zamtmn' « Reply #23 on: February 26, 2013, 12:18:21 pm » ,
habe ich mir das Demo http://download.shamangrad.net/zcad/ttf2vector.7z geladen und damit gespielt.

Hier werden die Units
EasyLazFreeType, TTObjs, TTTypes
aus Lazarus-Package LazUtils (Standardbestückung von Lazaraus) benutzt.

Wie schon vermutet , ist für jedes Problem eine Lösung vorhanden.
Das finden dauert bei Freepascal / Lazarus halt nur ewig und 3 Tage .

Ich habe das Prog nun etwas umgeschrieben siehe Anhang.

Man kann nun einen Font ' *.ttf ' laden und bekommt die Grobdaten eines jeden Char's im Memo eingeblendet.
Weiter habe ich noch die Polygon-Punkt farbig markiert , so das man
1) Start- und End-Punkte
2) Punkte auf der Orginal-Kontur
und
3) Bezier-Stützpunkte
erkennen kann.

Setzt man links oben im Prog die Sleep-Zeit für das Zeichnen der Polygone auf z.B. 50/100 ms , kann man auch schön

die Drehrichtung der Polygone erkennen.
Außenkonturen sind rechts orientiert , Innenkonturen (also Löcher) gehen links herum.

Das erste Ziel , an die Polygondaten zu kommen ist also nun , mit Laz-Bordmitteln , gelöst.

Die ToDo-Liste ist nun :

1) Die Bezier-Stützpunkte durch eine wählbare Feinstruktur ersetzen.

2) Die Char-Flächen triangulieren , um eine Basis-2D-Fläche für die OpenGL-Zeichnung zu bekommen
hier wäre euer Rat gefragt , wegen der Löcher in den Char's.

3) Diese Triangle-Fläche zu einem 3D-Körper extrudieren .
Am besten noch die fertigen Char-Körper auf eine Größe von 1,1,1 normieren , dann fällt das Skalieren später

einfacher.

4) Einen STL- Export/Import bauen.
Dann kann man die 3D-Char's auch gleich in CAD / CNC / 3D-Print benutzen .

Ich probier mal Anfang 2017 weiter .

Gruß

Frank
Dateianhänge
ttf2vector_mod_FR.zip
(2.07 MiB) 132-mal heruntergeladen
www.flz-vortex.de

Mathias
Beiträge: 6160
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 »

In der Antwort von 'zamtmn' « Reply #23 on: February 26, 2013, 12:18:21 pm » ,
habe ich mir das Demo http://download.shamangrad.net/zcad/ttf2vector.7z geladen und damit gespielt.

Ausser einem SIGSEV kommt nichts.

Code: Alles auswählen

 In Datei 'easylazfreetype.pas' in Zeile 866:
familyItem := Collection.Family[FName];


Ich habe es mit Linux 64Bit probiert.

Das finden dauert bei Freepascal / Lazarus halt nur ewig und 3 Tage .

Das geht mir leider auch so, bei programmtechnischen Sachen, hat Google recht mühe.
Aber das wird daran liegen, das es sehr wenig Programmierer gibt.

2) Die Char-Flächen triangulieren , um eine Basis-2D-Fläche für die OpenGL-Zeichnung zu bekommen
hier wäre euer Rat gefragt , wegen der Löcher in den Char's.

Bei den Löchern wirst du sicher noch recht die Zähne ausbeissen, vor allem, wen es aussen viel mehr Elemente hat, als beim Loch.

4) Einen STL- Export/Import bauen.
Dann kann man die 3D-Char's auch gleich in CAD / CNC / 3D-Print benutzen .

Da würde ich dir OBJ empfehlen.
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 ,

Ausser einem SIGSEV kommt nichts.



In der Antwort von 'zamtmn' « Reply #23 on: February 26, 2013, 12:18:21 pm » ,
habe ich mir das Demo http://download.shamangrad.net/zcad/ttf2vector.7z geladen und damit gespielt.


Ausser einem SIGSEV kommt nichts.

Code: Alles auswählen

In Datei 'easylazfreetype.pas' in Zeile 866:
familyItem := Collection.Family[FName];

Ich habe es mit Linux 64Bit probiert.


Ah , ja , die Fehlermeldung hatte ich beim Orginal-Quelltext auch erst.

In der Routine FormCreate , bei 'FTTFFont.Name:= ' den Absolut-Pfad zur Fotdatei eintragen , sonst findet TFreeTypeFont die Datei nicht.

Unter Windows z.B. so

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
     FTTFFont:=TFreeTypeFont.create;
     FTTFFont.Hinted:=false;
     FTTFFont.Name:='C:\Lazarus\Test\arial.ttf';
end;


Wie man in Linux arbeite , keine Ahnung .

Hast Du meine modifizierte Version (Anhang) auch probiert ?

2) Die Char-Flächen triangulieren , um eine Basis-2D-Fläche für die OpenGL-Zeichnung zu bekommen
hier wäre euer Rat gefragt , wegen der Löcher in den Char's.


Bei den Löchern wirst du sicher noch recht die Zähne ausbeissen, vor allem, wen es aussen viel mehr Elemente hat, als beim Loch.


Ich habe auch so meine Bedenken , aber aufgegeben habe ich noch nicht .

4) Einen STL- Export/Import bauen.
Dann kann man die 3D-Char's auch gleich in CAD / CNC / 3D-Print benutzen .


Da würde ich dir OBJ empfehlen.


Was meinst Du genau mit OBJ , eine eigene Klasse bauen , oder was ?

Gruß

Frank
www.flz-vortex.de

Mathias
Beiträge: 6160
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 »

Was meinst Du genau mit OBJ , eine eigene Klasse bauen , oder was ?

Wavefront OBJ.
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:Was meinst Du genau mit OBJ , eine eigene Klasse bauen , oder was ?
Wavefront OBJ.


Ah ja , Wavefront OBJ , 3D-Grafikformat .
Schau ich mir dann mal an , wenn die Grundprobleme gelöst sind.

Danke

Gruß

Frank
www.flz-vortex.de

Mathias
Beiträge: 6160
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 »

Hast Du meine modifizierte Version (Anhang) auch probiert ?

Ich habe die nicht den Anhang erwischt, sonder dein Link, aber mit dem Anhang funktioniert es wenigsten teilweise. Ich kann ein 2. Font laden, aber bei 3. kommt ein SIGSEV.

Wie man in Linux arbeite , keine Ahnung .

Das es unter Linux läuft, kann man so lösen:

Code: Alles auswählen

// TTF-Freetype-Font erzeugen
procedure TForm1.FormCreate(Sender: TObject);
begin
  hauptpfad := extractfiledir(ParamStr(0)) + DirectorySeparator; // Das wichtigste.
 
  FTTFFont := TFreeTypeFont.Create;
  FTTFFont.Hinted := False;
  FTTFFont.Name := hauptpfad + 'FreeSans.ttf';
  Caption := FTTFFont.Name;
  spinedit1.MaxValue := FTTFFont.GlyphCount - 1;
end;
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 ,

habe den letzten Monat weiter gemacht.

Aktueller Stand ist die 3D-Konvertierung eines gewählten Glyph's (Char's) zu einem trianguliertem 3D-Körper und dessen Darstellung in OpenGL .

Die Konvertierung erfolgt in mehreren Stufen und ist derzeit noch unter dem Button 'Erzeuge 3d-Glyph' abgelegt .
Hier drunter sind dann die folgenden Schritte zu finden.

Schritt 1) Mit Hilfe der Untit 'EasyLazFreeType' (im LAZ-Paket enthalten) werden die Outline-Polygone eines gewünschten Glyph's ausgelesen und in der Liste
_3D_Glyph.Grob_Polys festgehalten.

_3D_Glyph ist eine von mir gebaute Klasse , die dann pö.a.pö. erweitert werden kann.

Wenn das Programm gestartet ist , kann man dieses Grob-Polygone im Bild links unten sehen .
Polygon-Punkte , die genau auf der Orginalkontur liegen werden als Quadrat dargestellt.
Bezier-Stützpunkte sind als Kreis dargestellt .
Startpunkte im Polygon sind mit clyellow gemalt , Polygon-Endpunkte mit cllime.

Mit den Bedienelementen mittig oben kann man den Font '*.ttf' wählen und per Spinedit auf/ab die Char's bzw. Glyph's wählen 65 wäre z.B. ein 'A' , 56 eine '8' usw.
Mit dem Button 'Finde Index' kann man nach bestimmten Char's suchen , voreingestellt ist hier z.B. das 'Ä' , das würde dann den Char-Index 196 ergeben.


Schritt 2) Es kann nun vorkommen, das der Startpunkt eine Bezier-Stützpunkt ist .
Dann werden die Polygonpunkte in der _3D_Glyph.Grob_Polys-Liste solange rotiert , bis der Startpunkt ein Orginal Konturpunkt ist.

Schritt 3)
Hier werden die Bezier-Stützpunkte aufgelöst und durch berechnete Konturen-Punkte ersetzt.
Die Feinheit der Auflösung kann man mit dem Spinedit neben dem Hinweistext 'Auflösung der Bezierkontur' einstellen .
Für die Umrechnung der Bezier-Stützpunkte wird die Unit 'Bezier.pas' benutzt , diese habe ich aus einem Fotran-Quelltext eines Kollegen portiert.
Der Quelltext ist von ihm freigegeben , er möchte aber Anonym bleiben , nun gut jedem das Seine .

Die fertigen Konturpolygone werden dann in der Liste _3D_Glyph.Fein_Polys festgehalten .
Dargestellt wird das Resultat im Bild mittig unten.

Hat man ein Glyph gewählt , das Bezier-Stützpunkte enthält z.B. das 'B' oder die '8' und spielt ein wenig mit dem Auflösungs-Spinedit rum , kann man sehr schön die Auswirkung sehen.
In der Regel reicht eine Auflösung von 5-10 , um schon ansprechende Kontur zu bekommen.
Mit der Checkbox 'Punkte Grob- / Feinpolygone zeichnen' kann man noch die Darstellung der Punkte an/aus schalten .

Schritt 4) Triangulierung
Hier habe ich lange probiert und im WWW gesucht .
Nach mehreren eigenen Versuchen , habe ich es dann aufgegeben (aus Frust und Unlust).
Dann bin ich doch noch fündig geworden , die BeRoTriangulation.pas .

INFOS und Quellcode unter
http://www.pascalgamedevelopment.com/sh ... x-polygons
http://rootserver.rosseaux.net/stuff/Be ... lation.pas

Benutzt wird hier auch die clipper.pas
INFOS und Download unter
http://www.angusj.com/delphi/clipper.php

Die BeRoTriangulation.pas funzt wunderbar und man ist alle Sorgen los .
Herzlichen DANK an Benjamin Rosseaux und Angus Johnson für diese tollen UNIT's .

Die im Anhang abgelegten Units (BeRoTriangulation.pas und clipper.pas) sind """ fast """ Orginal.
Folgende Kleingkeiten sind geändert , um es in meinem Programm unter LAZ nutzten zu können.

a) im Clipper.pas habe ich , ganz oben , folgendes geändert (jeweils mit // <---------- mod FR Jan 2017 kommentiert)

Code: Alles auswählen

unit clipper;
 
{$Mode delphi} // <---------- mod FR Jan 2017
 
(*******************************************************************************
*                                                                              *
* Author    :  Angus Johnson                                                   *
* Version   :  6.4.0                                                           *
* Date      :  2 July 2015                                                     *
* Website   :  http://www.angusj.com                                           *
* Copyright :  Angus Johnson 2010-2015 
 
Damit wird die Pointeranpassung '^' (von Delphi nach LAZ) vermieden , welche sich sonst durch den gesamten Quelltext zieht.

b) BeRoTriangulation.pas
Hier habe ich eine Konstante in der Funktion TriangulateDelaunayClipping geändert.

Code: Alles auswählen

{$ifndef STANDALONE}
{$ifndef FASTONLY}
function TriangulateDelaunayClipping(const InputPolygons:TBeRoTriangulationPolygons;var OutputTriangles:TBeRoTriangulationTriangles;InputPolygonFillRule:TBeRoTriangulationPolygonFillRule=btpfrEVENODD):boolean;
//const ScaleFactor=16777216.0;
const ScaleFactor=10000;             // <---------- mod FR Jan 2017
 

Es kam sonst , ab und an mal zu einem Fehler , wenn die Koodinatenwerte der Polygone zu groß wurden.


Die BeRoTriangulation.pas bietet verschiedene Verfahren zur Triangulierung von Polygonen an .
Wählen kann man diese mit dem Spinedit neben dem Hinweistext
(Triangulierungs-Verfahren (unit BeRoTriangulation) , 1) Dalauny , 2) BeRo-Konzept , 3) Seidel ).
Wirklich gut nutzbar sind nur die 1) Dalauny , 2) BeRo-Konzept.
3) Seidel ist nicht robust und hat öfter mal Aussetzter.
Den Vorzug habe ich dem 1) Dalauny gegeben , weil dieses schöne Dreiecke produziert , auch wenn es mal ertwas länger zum Rechen braucht .

Das Ergebnis der BeRoTriangulation kann man im Bild rechts unten betrachten , die Darstellung der Dreieckkanten kann man mit der Checkbox 'Kanten Dreieck-Triangulierung zeichnen ' an/ab schalten.

Die fertigen Dreiecke (Achtung alles noch in 2D platt, Z-Tiefenwerte=0 ) werden in der Liste _3D_Glyph.Dreiecklist2D gesammelt.

Schritt 5) zum 3D-Körper extrudieren
Dies ist eigentlich der einfachste Schritt .
Aus der Liste _3D_Glyph.Dreiecklist2D werden ein Deckel und eine Rückwand gebaut.
Die Dreiecke der Seitenwände werden mit Hilfe der Liste _3D_Glyph.Fein_Polys erzeugt.
Wichtig ist hier nur , das man die Richtung der Normalvektoren (diese sollen immer nach außen zeigen) bestimmt, wegen der Beleuchtungseffekte im OPENGL.
Eventuell müßen zwei Dreieckpunkte getauscht werden , dann dreht der Normalvektor die Richtung um.

Die Dreiecke des Körpers werden in der Liste _3D_Glyph.Dreiecklist3D gesammelt.

Bleibt zum Schluß noch die Darstellung des fertigen Glyph's in OpenGl.
Mit dem Button '3D Fenster' machen wir die FORM2 (Unit2) auf und unser fertiges Objekt wird in 3D dargestellt.
Hier kann man mit der Maus rotieren , verschieben , zoomen.

Alles ist ohne die Unit 'Windows' gebaut und sollte daher nun auch unter einer anderen Plattform (LINUX z.B.) zum Laufen zu bekommen sein.
Linux-spezifische Pfad-Geschichten müßte man noch anpassen , davon habe ich aber keine Ahnung .

Die nächsten Schritte wären noch .
1) Einen komplette Font konvertieren (also alle Zeichen des Font's) und in einer Glyph-Liste ablegen.
Dieses sollte man nur einmalig machen und nicht immer wärend der Laufzeit.
Die 3D-Glyph's dann in Displaylisten für OpenGl ablegen , am besten Verknüpft mit dem Char-Index.
2) Eine OpenGl-Textausgabe implementieren , mit entsprechender Offset-Verrechnerei .
3) Export von Einzel-3D-Glyph's oder kompletten 3D-Texten als STL-Format .
Dann steht einem die 3D-Welt mit 3D-Druck , Programme zur Booleaschen-Verschneidung usw. offen.

Es wäre nun SUPER , wenn ihr mit diesem Grundgerüst weiter bastelt und dann die Ergebnisse wieder hier einstellt, das alle etwas davon haben.
Mit der 3D-Font-Ausgabe gibt es nun auch schöne Möglichkeiten seine OpenGL-3D-Welt unter LAZ zu beschriften .

Gruß

Frank
Dateianhänge
glyph_3d_viewer.zip
(2.71 MiB) 135-mal heruntergeladen
www.flz-vortex.de

Mathias
Beiträge: 6160
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 »

Mit der 3D-Font-Ausgabe gibt es nun auch schöne Möglichkeiten seine OpenGL-3D-Welt unter LAZ zu beschriften .

Nur läuft es leider nicht unter Linux.

Be der dlgOpenGL.pas hast du eine alte Version erwischt, dort wurde das Problem mit TRect noch nicht behoben.

Den Pfad konnte ich beheben.

Code: Alles auswählen

//  FTTFFont.Name:=hauptpfad+'\FreeSans.ttf';
  FTTFFont.Name:='FreeSans.ttf'


Aber dann kommt lieder ein SIGSEV.

Code: Alles auswählen

Projekt glyph_3d_viewer hat Exception-Klasse »External: SIGSEGV« ausgelöst.
 
 In Datei 'easylazfreetype.pas' in Zeile 866:
familyItem := Collection.Family[FName];

Die EasyLazFreeType schein aber Bestandteil von Lazarus zu sein.
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 ,

super , das sich wenigstens einer für das Projekt interessiert.


Mathias hat geschrieben:Beitragvon Mathias » 1. Feb 2017, 17:47 Re: Text in OpenGLcontrol
 
Mit der 3D-Font-Ausgabe gibt es nun auch schöne Möglichkeiten seine OpenGL-3D-Welt unter LAZ zu beschriften .
 
 
Nur läuft es leider nicht unter Linux.
 
Be der dlgOpenGL.pas hast du eine alte Version erwischt, dort wurde das Problem mit TRect noch nicht behoben.
 

Das kann gut sein , unter Windows läuft das Prog aber reibunglos.
Bitte gib mir doch mal einen LINK zur aktuellen dlgOpenGL.pas , dann brauch ich mir keinen WOLF suchen.

Mathias hat geschrieben:
Den Pfad konnte ich beheben.

Code: Alles auswählen

// FTTFFont.Name:=hauptpfad+'\FreeSans.ttf';
FTTFFont.Name:='FreeSans.ttf';

Aber dann kommt lieder ein SIGSEV.

Code: Alles auswählen

Projekt glyph_3d_viewer hat Exception-Klasse »External: SIGSEGV« ausgelöst.

In Datei 'easylazfreetype.pas' in Zeile 866:
familyItem := Collection.Family[FName];


Die EasyLazFreeType schein aber Bestandteil von Lazarus zu sein.



Mit dem entfernen der Variablen 'Hauptpfad' hast Du den absoluten Pfad zur Fontdatei gekillt.
Das EasyLazFreeType-Objekt findet dann die Fontdatei nicht und es ballert.

In meiner FormCreate-Routine besorge ich mir den Hauptpfad mit extractfiledir(paramstr(0))

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
  hauptpfad:=extractfiledir(paramstr(0));
 
  FTTFFont:=TFreeTypeFont.create;
  FTTFFont.Hinted:=false;
  FTTFFont.Name:=hauptpfad+'\FreeSans.ttf';
  caption:=FTTFFont.Name;
  spinedit1.MaxValue:=FTTFFont.GlyphCount-1;
end;
 

Unter Linux scheit das wohl aber nicht so ohne weiteres zu funzen (wie gesagt , habe keine Ahnung von LINUX).
Da müssen wir dann einen anderen Weg finden , um den absoluten Pfad zur Fontdatei zu bekommen.
Hier ist dann deine Erfahrung mit Linux gefragt.

In deiner Post vom 'Beitragvon Mathias » 22. Dez 2016, 19:48 Re: Text in OpenGLcontrol' hattest Du das doch schon mal angepasst.

Mathias hat geschrieben:Das es unter Linux läuft, kann man so lösen:

Code: Alles auswählen

// TTF-Freetype-Font erzeugen
procedure TForm1.FormCreate(Sender: TObject);
begin
hauptpfad := extractfiledir(ParamStr(0)) + DirectorySeparator; // Das wichtigste.

FTTFFont := TFreeTypeFont.Create;
FTTFFont.Hinted := False;
FTTFFont.Name := hauptpfad + 'FreeSans.ttf';
Caption := FTTFFont.Name;
spinedit1.MaxValue := FTTFFont.GlyphCount - 1;
end;


Es wäre dann geschickt , wenn man diese Codeunterschiede in Compiler-Direktiven einschließen würde.
Vielleicht so in der Art:

Code: Alles auswählen

 
// TTF-Freetype-Font erzeugen
procedure TForm1.FormCreate(Sender: TObject);
begin
{$IFDEF WINDOWS}
  hauptpfad:=extractfiledir(paramstr(0));
{$ENDIF}
{$IFDEF LINUX}
  hauptpfad := extractfiledir(ParamStr(0)) + DirectorySeparator; // Das wichtigste.
{$ENDIF}
 
  FTTFFont:=TFreeTypeFont.create;
  FTTFFont.Hinted:=false;
  FTTFFont.Name:=hauptpfad+'\FreeSans.ttf';
  caption:=FTTFFont.Name;
  spinedit1.MaxValue:=FTTFFont.GlyphCount-1;
end;                   
 

Leg Dir doch bitte in der Unit EasyLazFreeType.pas , einen Haltepunkt , an den Begin von

Code: Alles auswählen

 
Procedure TFreeTypeFont.LoadFace;
var errorNum: TT_Error;
    familyItem: TCustomFamilyCollectionItem;
    fontItem: TCustomFontCollectionItem;
begin                                                                    // <------ hier nen Haltepunkt
  DiscardFace;
  if FStream <> nil then
  begin
    errorNum := TT_Open_Face(FStream,False,FFace);
    if errorNum <> TT_Err_Ok then
      raise exception.Create('Cannot open font (TT_Error ' + intToStr(errorNum)+') <Stream>');
  end else
  begin
    if Pos(PathDelim, FName) <> 0 then
    begin
      errorNum := TT_Open_Face(FName,FFace);         // <----- Hier in FName mal den Pfad zur Fontdatei checken
      if errorNum <> TT_Err_Ok then
        raise exception.Create('Cannot open font (TT_Error ' + intToStr(errorNum)+') "'+FName+'"');
    end else
    begin
      familyItem := Collection.Family[FName];
      if familyItem = nil then
        raise exception.Create('Font family not found ("'+FName+'")');
      fontItem := familyItem.GetFont(FStyleStr);
      if fontItem = nil then
        raise exception.Create('Font style not found ("'+FStyleStr+'")');
      FFace := fontItem.QueryFace(FontCollectionItemDestroyListener(self,@OnDestroyFontItem));
      FFaceItem := fontItem;
    end;
  end;
 
  FFaceLoaded:= true;
  UpdateInstance;
end;         
 


und schau mal was in der Variablen FName für ein Pfad drinn steht.
Wäre doch schade , wenn es an so Kleingkeiten hapert !!

Gruß

Frank
www.flz-vortex.de

Mathias
Beiträge: 6160
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 »

Bitte gib mir doch mal einen LINK zur aktuellen dlgOpenGL.pas , dann brauch ich mir keinen WOLF suchen.

Das weis ich leider auch nicht, ich habe gerade dazu im OpenGL Forum ein Frage gestellt.
Aber ich kann wenigstens meine Datei geben.

Mit dem entfernen der Variablen 'Hauptpfad' hast Du den absoluten Pfad zur Fontdatei gekillt.

Das war natürlich nur eine Notlösung.
So ist dies sehr elegant gelöst.

Code: Alles auswählen

FTTFFont.Name:=hauptpfad + DirectorySeparator + 'FreeSans.ttf';


Das EasyLazFreeType-Objekt findet dann die Fontdatei nicht und es ballert.

Es kommt darauf an, von wo aus man die Exe startet.

Es wäre dann geschickt , wenn man diese Codeunterschiede in Compiler-Direktiven einschließen würde.

Wegen dem Pfad-Trenner, sollte dies nicht nötig sein.

Code: Alles auswählen

  hauptpfad := extractfiledir(ParamStr(0)) + DirectorySeparator; // Das wichtigste.
 
  FTTFFont:=TFreeTypeFont.create;
  FTTFFont.Hinted:=false;
  FTTFFont.Name:=hauptpfad+'FreeSans.ttf';   //   Den \ entfernen
Dateianhänge
dglOpenGL.pas.zip
(139.13 KiB) 108-mal heruntergeladen
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 ,

werde die Infos bez. des Pfades einbauen.

Danke für die opengl.pas

Das wichtigste fehlt aber noch , läuft es nun unter LINUX ?????

Soll ich weiter machen , JA , NEIN , JEIN .

Gruß

Frank
www.flz-vortex.de

Jole
Beiträge: 114
Registriert: Fr 4. Jul 2014, 14:39
OS, Lazarus, FPC: Linux
CPU-Target: amd64

Re: Text in OpenGLcontrol

Beitrag von Jole »

Mathias hat geschrieben:
Bitte gib mir doch mal einen LINK zur aktuellen dlgOpenGL.pas , dann brauch ich mir keinen WOLF suchen.


Das weis ich leider auch nicht, ich habe gerade dazu im OpenGL Forum ein Frage gestellt.
Aber ich kann wenigstens meine Datei geben.

Naja, einen Wolf suchen muß man sich nicht und ob das delphigl Forum schneller als Google ist? Google führt einen mit dem Suchbegriff "dglOpenGL 4.5" auf eine GitHub Seite auf der man die neueste Version herunter laden kann. Das jetzt aber nur mal für den Fall das noch andere an dieser pas Datei Interesse haben.

Mathias
Beiträge: 6160
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 »

Google führt einen mit dem Suchbegriff "dglOpenGL 4.5" auf eine GitHub Seite auf der man die neueste Version herunter laden kann.

Das habe ich gerade gemacht, aber in dieser Version ist der TRect-Bug vorhanden.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

wp_xyz
Beiträge: 4869
Registriert: Fr 8. Apr 2011, 09:01

Re: Text in OpenGLcontrol

Beitrag von wp_xyz »

Das ist denn der TRect-Bug?

Antworten