
Белый и Пушистый
   
Профиль
Группа: Awaiting Authorisation
Сообщений: 3776
Регистрация: 2.4.2003
Репутация: нет Всего: 16
|
| Код | //---------------------------------------------------------------------------
#include <vcl.h> #pragma hdrstop
#include "Unit1.h" #include <stdio.h> #include <windows.h> #include <gl\gl.h> #include <gl\glu.h> #include <gl\glaux.h> #include <math.h> #include <stdarg.h>
//--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" Tf *f;
HGLRC hGLRC; HDC hDC; //--------------------------------------------------------------------------- GLint base; GLYPHMETRICSFLOAT gmf[256]; GLvoid BuildFont(GLvoid); //INITGL************************************************************************ __fastcall Tf::Tf(TComponent* Owner) : TForm(Owner) {
hDC = GetDC(Handle); int PixelFormat; PIXELFORMATDESCRIPTOR pfd = { sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 24, 0,0,0,0,0,0, 0,0, 0,0,0,0,0, 32, 0, 0, PFD_MAIN_PLANE, 0, 0,0, }; PixelFormat = ChoosePixelFormat (hDC, &pfd); if (SetPixelFormat (hDC, PixelFormat, &pfd) == FALSE) Application->Terminate (); hGLRC = wglCreateContext(hDC); if(hGLRC == NULL) Application->Terminate (); if(wglMakeCurrent(hDC, hGLRC) == false) Application->Terminate ();
GLfloat _mainlight[] = {0.3, 0.3, 0.3, 1.0}; GLfloat _lposition[] = {0.0, 0.0, 8.0, 1.0}; GLfloat _lambient[] = {0.5, 0.5, 0.5, 1.0}; GLfloat _ldiffuse[] = {1.0, 1.0, 1.0, 1.0}; GLfloat _lspecular[] = {1.0, 1.0, 1.0, 1.0};
glEnable (GL_ALPHA_TEST); glEnable (GL_DEPTH_TEST); glEnable (GL_NORMALIZE);
glEnable (GL_COLOR_MATERIAL); glColorMaterial (GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
glEnable (GL_LIGHTING); glEnable (GL_LIGHT0);
glLightModelfv (GL_LIGHT_MODEL_AMBIENT, _mainlight); glLightfv (GL_LIGHT0, GL_POSITION, _lposition); glLightfv (GL_LIGHT0, GL_AMBIENT, _lambient); glLightfv (GL_LIGHT0, GL_DIFFUSE, _ldiffuse); glLightfv (GL_LIGHT0, GL_SPECULAR, _lspecular);
//glViewport (0, 0, 800, 600); glClearColor (0.0, 0.0, 0.0, 1.0);
BuildFont();
GLuint filter; GLuint fogMode[]= { GL_EXP, GL_EXP2, GL_LINEAR }; GLuint fogfilter= 2; GLfloat fogColor[4]= {0.0f, 0.0f, 0.0f, 1.0f}; glEnable(GL_FOG); glFogi(GL_FOG_MODE, fogMode[fogfilter]); glFogfv(GL_FOG_COLOR, fogColor); glFogf(GL_FOG_DENSITY, 0.55f); glHint(GL_FOG_HINT, GL_DONT_CARE); glFogf(GL_FOG_START, 1); glFogf(GL_FOG_END, 10);
glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (90, GLdouble(4.0/3.0), 1.0, 30.0);
glMatrixMode (GL_MODELVIEW); glLoadIdentity ();
x=y=z=0; } //--------------------------------------------------------------------------- float GradToRadians(float grad) { return grad*0.017453292519943295769; } GLvoid BuildFont(GLvoid) { HFONT font; font = CreateFont(-12, // âûñîòà øðèôòà
0, // øèðèíà çíàêîìåñòà 0, //Óãîë ïåðåõîäà 0, //Óãîë íàïðàâëåíèÿ FW_BOLD, //Øèðèíà øðèôòà FALSE, // Êóðñèâ FALSE, // Ïîä÷åðêèâàíèå FALSE, // Ïåðå÷åðêèâàíèå ANSI_CHARSET, //Èäåíòèôèêàòîð êîäèðîâêè OUT_TT_PRECIS, // Òî÷íîñòü âûâîäà CLIP_DEFAULT_PRECIS, //Òî÷íîñòü îòñå÷åíèÿ ANTIALIASED_QUALITY,// Êà÷åñòâî âûâîäà FF_DONTCARE|DEFAULT_PITCH, // Ñåìåéñòâî è Øàã "Courier"); // Èìÿ øðèôòà SelectObject(hDC, font); //Âûáðàòü øðèôò, ñîçäàííûé íàìè wglUseFontOutlines( hDC, // Âûáðàòü òåêóùèé êîíòåêñò óñòðîéñòâà (DC) 0, // Ñòàðòîâûé ñèìâîë 255, // Êîëè÷åñòâî ñîçäàâàåìûõ ñïèñêîâ îòîáðàæåíèÿ base, // Ñòàðòîâîå çíà÷åíèå ñïèñêà îòîáðàæåíèÿ 0.0f, //Îòêëîíåíèå îò íàñòîÿùåãî êîíòóðà 0.2f, //Òîëùèíà øðèôòà ïî îñè Z WGL_FONT_POLYGONS, //Èñïîëüçîâàòü ïîëèãîíû, à íå ëèíèè gmf ); //áóôåð àäðåñà äëÿ äàííûõ ñïèñêà îòîáðàæåíèÿ
} GLvoid KillFont(GLvoid){glDeleteLists(base, 256);} GLvoid glPrint(const char *fmt, ...) { char text[256]; va_list ap; if (fmt == NULL)return; va_start(ap, fmt); vsprintf(text, fmt, ap); va_end(ap); glPushAttrib(GL_LIST_BIT); glListBase(base); glCallLists(strlen(text), GL_UNSIGNED_BYTE, text); glPopAttrib(); }
void __fastcall Tf::FormResize(TObject *Sender) { glViewport (0, 0, Width, Height); glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (90, GLdouble(Width/Height), 1.0, 100.0); glMatrixMode (GL_MODELVIEW); } //--------------------------------------------------------------------------- void __fastcall Tf::FormDestroy(TObject *Sender) { if (hGLRC) { wglMakeCurrent(NULL, NULL); wglDeleteContext(hGLRC); hGLRC = NULL; } if (hDC) { ReleaseDC(Handle, hDC); hDC = NULL; } KillFont(); } //--------------------------------------------------------------------------- void __fastcall Tf::TimerMainDrawTimer(TObject *Sender) { if(keys[37])ygol-=2; if(keys[39])ygol+=2; if(keys[38]){ z+=sin(GradToRadians(ygol))*0.02; x+=cos(GradToRadians(ygol))*0.02; } if(keys[40]){ z-=sin(GradToRadians(ygol))*0.02; x-=cos(GradToRadians(ygol))*0.02; }
glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glLoadIdentity ();
glTranslatef (0, -1, -1.5); glRotatef (-90, 0, 1, 0);
GLUquadricObj *gu2; gu2=gluNewQuadric(); gluQuadricDrawStyle(gu2, GLU_FILL); glColor4f(0.2, 0.9, 0.4, 0.1); glTranslatef (0, 0.09, 0); gluSphere(gu2, 0.1, 20, 20); glTranslatef (0, -0.09, 0); delete gu2;
glRotatef (ygol, 0, 1, 0); glTranslatef(x, y, z);
glRotatef (90, 1, 0, 0); GLUquadricObj *gu; gu=gluNewQuadric(); gluQuadricDrawStyle(gu, GLU_LINE); glColor4f(0.5, 0.5, 0.4, 1.0); gluDisk(gu, 1, 100, 100, 100); glPrint("!www"); // НЕ работает delete gu; glFlush (); SwapBuffers(hDC); } //--------------------------------------------------------------------------- void __fastcall Tf::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { keys[Key] = true; } //--------------------------------------------------------------------------- void __fastcall Tf::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { keys[Key] = false; }
|
здесь функция glPrint неработает, в других местах эта же функция работает
|