помнится, я уже предлагал сделать стандартный компонент взаимного пересчёта мировых и экранных координат
1nd1g0, возможно на тот момент я не совсем понимал как это сделать
------------ Дoбавленo в 22.44:
Пока не ушёл далеко от темы 2D текста решил поискать в расширениях замену glRasterPos3f, соответственно нашлось расширение GL_ARB_window_pos, работает замечательно при этом не нужны пересчёты координат.
Add(MainForm,15261923,14,28)
{
Height=400
BorderStyle=1
Position=1
Point(MouseX)
Point(MouseY)
Point(onResize)
Point(Handle)
link(onCreate,16299401:doEvent1,[(58,48)(58,104)])
link(onResize,16131419:doWork1,[(130,55)])
}
Add(GL_Main,12986311,154,98)
{
EnvironmentMode=2
AASamples=1
link(onInit,12198675:doInit,[])
link(onViewPort,3410847:doPerspective,[(198,111)(198,146)])
link(Handle,15261923:Handle,[(160,79)(34,79)])
}
Add(Timer,9506849,42,182)
{
Interval=10
Enable=1
link(onTimer,1049454:doEvent1,[])
}
Add(GL_GTools,771925,154,182)
{
Point(doClear)
Point(doPushMatrix)
Point(doPopMatrix)
}
Add(Hub,1049454,91,182)
{
OutCount=5
link(onEvent1,771925:doClear,[])
link(onEvent2,771925:doPushMatrix,[])
link(onEvent3,1477332:doDisabled,[(114,202)(114,223)])
link(onEvent4,771925:doPopMatrix,[(142,209)(142,202)])
link(onEvent5,12986311:doFlip,[(128,216)(128,118)])
}
Add(Hub,16299401,70,98)
{
OutCount=3
link(onEvent1,12986311:doInit,[])
link(onEvent2,16131419:doWork2,[])
link(onEvent3,9506849:doTimer,[(121,118)(121,156)(32,156)(32,188)])
}
Add(GL_GluTools,12198675,210,98)
{
link(onInit,1101264:doEnabled,[])
}
Add(GL_Light,14989894,378,98)
{
link(onEnabled,6442457:In,[])
}
Add(GL_Options,1101264,252,98)
{
link(onEvent,5851269:doEnabled,[])
}
Add(GL_Options,5851269,294,98)
{
Flag=1
link(onEvent,5809249:doEnabled,[])
}
Add(GL_Options,5809249,336,98)
{
Flag=2
link(onEvent,14989894:doEnabled,[])
}
Add(GL_Perspective,3410847,210,140)
{
zNear=0.001
}
Add(HubEx,16131419,126,105)
{
link(onEvent,12986311:doViewPort,[])
}
Add(LineBreak,13637880,252,189)
{
link(Out,10480843:doBuildFont,[(292,195)(292,209)])
Primary=[6442457,168,-91]
}
Add(LineBreak,15363895,154,140)
{
Caption="hDC"
Type=1
link(Data,12986311:GLHandle,[])
Primary=[10764968,147,28]
}
Add(GL_Color,9919393,252,210)
{
Color=65280
link(onColor,10480843:do_glPrint,[])
}
Add(GL_Options,1477332,210,210)
{
link(onEvent,9919393:doColor,[])
}
Add(GL_Options,15352328,350,210)
{
}
Add(Memory,4637279,343,154)
{
Default=String(Растровые шрифты)
}
Add(InlineCode,10480843,301,203)
{
@Hint=#25:Урок 13. Растровые шрифты|
WorkPoints=#11:doBuildFont|10:do_glPrint|
EventPoints=#11:onBuildFont|10:on_glPrint|
DataPoints=#8:data_hDC|10:data_rtext|
Code=#15:unit HiAsmUnit;|0:|9:interface|0:|36:uses Windows,kol,Share,Debug,OpenGL;|6: var|16: base: GLuint;|25: // GL_ARB_window_pos|32: PGL_ARB_window_pos : Boolean;|4:type|28: THiAsmClass = class(TDebug)|10: private|63: Viewport : Array [0..3] of Integer; // параметры viewport-a.|62: ProjMatrix: Array [0..15] of GLDouble; // матрица проекции.|60: mvMatrix: Array [0..15] of GLDouble; // видовая матрица.|63: wx,wy,wz:GLdouble; // возвращаемые мировые координаты.|17: hDC : Integer;|15: Font: HFONT;|0:|9: public|27: onBuildFont:THI_Event;|26: on_glPrint:THI_Event;|24: data_hDC:THI_Event;|26: data_rtext:THI_Event;|5: |53: procedure doBuildFont(var _Data:TData; index:word);|52: procedure do_glPrint(var _Data:TData; index:word);|5: end;|32:procedure glPrint(text: string);|36:function GL_ARB_window_pos: boolean;|0:|14:implementation|0:|27:function GL_ARB_window_pos;|3:var|22: Extensions: String;|5:begin|44: Extensions := glGetString(GL_EXTENSIONS);|67: PGL_ARB_window_pos := Pos('GL_ARB_window_pos', Extensions) <> 0;|29: if PGL_ARB_window_pos then|8: begin|66: glWindowPos2iARB := wglGetProcAddress('glWindowPos2iARB');|6: end|7: else|8: begin|22: Result := false;|7: end;|4:end;|0:|32:procedure glPrint(text: string);|5:begin|25: if text = '' then exit;|28: glPushAttrib(GL_LIST_BIT);|20: glListBase(base); |58: glCallLists(length(text),GL_UNSIGNED_BYTE,Pchar(text)); |15: glPopAttrib; |4:end;|0:|63:procedure THiAsmClass.doBuildFont(var _Data:TData; index:word);|0:|5:begin|37: hDC := ReadInteger(_Data,data_hDC);|63: base := glGenLists(1000); // glListBase|114: font := CreateFont(-30, // Ширина фонта // если (-), то задаётся высота шрифта в пикселях|77: 0, // Угол отношения //|76: 0, // Угол наклона // |76: 0, // Ширина шрифта //|55: 0, // |61: 0, // |60: 0, //|61: 0, // |63: RUSSIAN_CHARSET, //|60: OUT_TT_PRECIS, //|61: CLIP_DEFAULT_PRECIS, // |57: DEFAULT_QUALITY, // |60: FF_DONTCARE OR DEFAULT_PITCH, //|42: 'Times New Roman'); |22: |25: SelectObject(hDC,font);|36: wglUseFontBitmaps(hDC,0,256,base);|81: glGetIntegerv(GL_VIEWPORT,@Viewport); // узнаём параметры viewport-a.|77: glGetDoublev(GL_PROJECTION_MATRIX,@ProjMatrix); // узнаём матрицу проекции.|75: glGetDoublev(GL_MODELVIEW_MATRIX,@mvMatrix); // узнаём видовую матрицу.|4:end;|0:|62:procedure THiAsmClass.do_glPrint(var _Data:TData; index:word);|0:|3:var|15:rtext : string;|16:SizeFont: TSize;|20:SizeFontY: Integer; |0:|5:begin|40: rtext := ReadString(_Data,data_rtext);|67: GetTextExtentPoint32(hDC, PChar(rtext), Length(rtext), SizeFont);|26: SizeFontY:= SizeFont.cy;|4: //|28: if GL_ARB_window_pos then |46: glWindowPos2iARB(0, viewport[3] - SizeFontY)|6: else|7: exit;|0:|17: glPrint(rtext);|26: _hi_OnEvent(on_glPrint);|7: end; |3: |4:end.|
link(on_glPrint,15352328:doEnabled,[])
link(data_hDC,10764968:Var,[])
link(data_rtext,4637279:Value,[(314,195)(349,195)])
}