#include <vcl.h>
#include "Unit1.h"
#pragma hdrstop
#pragma package(smart_init)
#pragma resource "*.dfm"
//---------------------------------------------------------------------------
GLfloat rtri_x = 70.0f; //k靖 o jaki obracamy stozek wzdluz osi x
GLfloat rquad_x = 30.0f; //k靖 o jaki obracamy szescian wzluz osi x
GLfloat rcyl_x = -20.0f; //k靖 o jaki obracamy walec wzluz osi x
GLfloat rscrew_x = 50.0f;
GLfloat rtri_y = 30.0f;
GLfloat rquad_y = -50.0f;
GLfloat rcyl_y = -30.0f;
GLfloat rscrew_y = -30.0f;
GLfloat rtri_z = 0.0f;
GLfloat rquad_z = 0.0f;
GLfloat rcyl_z = 0.0f;
GLfloat rscrew_z = 0.0f;
//---------------------------------------------------------------------------
GLfloat ttri_x = -5.0f; //dlugosc o jaka przesuwamy ostroslup wzdluz osi x
//wartosc zainicjowana to ustawienie poczatkowe
GLfloat tquad_x = 6.0f; //dlugosc o jaka przesuwamy szescian wzdluz osi x
//wartosc zainicjowana to ustawienie poczatkowe
GLfloat tcyl_x = 2.0f; //dlugosc o jaka przesuwamy cylinder wzdluz osi x
//wartosc zainicjowana to ustawienie poczatkowe
GLfloat tscrew_x = 0.0f;
GLfloat ttri_y = 2.0f;
GLfloat tquad_y = -2.0f;
GLfloat tcyl_y = 5.0f;
GLfloat tscrew_y = -2.0f;
GLfloat ttri_z = -5.0f;
GLfloat tquad_z = 2.0f;
GLfloat tcyl_z = 0.0f;
GLfloat tscrew_z = 3.0f;
//---------------------------------------------------------------------------
GLfloat squad_x = 1.0f; //skala o jaka zwiekszamy lub zmniejszamy wymiary w osi x
//wartosc zainicjowana oznacza orginalne wymiary poczatkowe
GLfloat squad_y = 1.0f; //skala o jaka zwiekszamy lub zmniejszamy wymiary w osi y
//wartosc zainicjowana oznacza orginalne wymiary poczatkowe
GLfloat squad_z = 1.0f; //skala o jaka zwiekszamy lub zmniejszamy wymiary w osi z
//wartosc zainicjowana oznacza orginalne wymiary poczatkowe
GLfloat stri_x = 1.0f;
GLfloat stri_y = 1.0f;
GLfloat stri_z = 1.0f;
GLfloat scyl_x = 1.0f;
GLfloat scyl_y = 1.0f;
GLfloat scyl_z = 1.0f;
GLfloat sscrew_x = 1.0f;
GLfloat sscrew_y = 1.0f;
GLfloat sscrew_z = 1.0f;
//---------------------------------------------------------------------------
//const float pi = 3.14159;
//wymiary walca
//float s = 1, x = 1.0, y = -1.0, rw = 1.0, rz = 2.0, h = 4.0;
//---------------------------------------------------------------------------
int depth_buffer;
int quality;
int shade;
int polygon_front, polygon_back;
//---------------------------------------------------------------------------
const float DEG2RAD = 3.14159/180;
void draw_gwint(float xradius, float yradius)
{
float z;
glBegin(GL_LINE_LOOP);
glColor3f(1.0f,1.0f,1.0f);
for (int j=0;j<20;j++)
{
for (int i=0; i < 360; i++)
{
//zamieniamy stopnie na radiany
float degInRad = i*DEG2RAD;
glVertex3f(+1+cos(degInRad)*xradius,-1+sin(degInRad)*yradius,z);
}
z=z+0.25;
}
glEnd();
}
//----------------------------------------------------------------------------
TForm1 *Form1;
//----------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
Application->OnIdle = IdleLoop;
}
//----------------------------------------------------------------------------
void __fastcall TForm1::IdleLoop(TObject *Sender, bool &Done)
{
Repaint();
}
//----------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
PIXELFORMATDESCRIPTOR pfd;
int format_piksela;
hdc = GetDC( Form1 -> Panel1-> Handle);//identyfikator okna
ZeroMemory( &pfd, sizeof( pfd)); //wype軟ienie struktury zerami
pfd.nSize = sizeof( pfd);
pfd.nVersion = 1;
pfd.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |
PFD_DOUBLEBUFFER;
pfd.iPixelType = PFD_TYPE_RGBA;
pfd.cColorBits = 8;
pfd.cDepthBits = 16;
pfd.iLayerType = PFD_MAIN_PLANE;
format_piksela = ChoosePixelFormat(hdc, &pfd);
SetPixelFormat(hdc, format_piksela, &pfd);
hrc = wglCreateContext(hdc); //identyfikator OpenGL
if(hrc == NULL)
ShowMessage( "Blad kontekstu renderowania: hrc == NULL");
if(wglMakeCurrent(hdc, hrc) == false)
//aktywowanie OpenGL
ShowMessage("Blad uaktywnienia grafiki");
}
//----------------------------------------------------------------------------
void __fastcall TForm1::FormDestroy(TObject *Sender)
{
wglMakeCurrent( NULL, NULL);
wglDeleteContext( hrc);
ReleaseDC( Form1 ->Panel1-> Handle, hdc);
}
//----------------------------------------------------------------------------
void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key,
TShiftState Shift)
{
if( Key == VK_ESCAPE)
Close();
}
//----------------------------------------------------------------------------
void __fastcall TForm1::FormPaint(TObject *Sender)
{
//glShadeModel(GL_SMOOTH); //wlaczamy smooth shading
glClearDepth(1.0f); //ustawienie depth bufora
glEnable(GL_DEPTH_TEST); //wlaczamy depth testing
//glDepthFunc(GL_LEQUAL); //ustawiamy typ depth testing
//----------------------------------------------------------------------------
//----------------------------------------------------------------------------
if(quality==0)
glHint(GL_FASTEST,GL_POINT_SMOOTH_HINT);
else if(quality==1)
glHint(GL_NICEST,GL_POINT_SMOOTH_HINT);
else if(quality==2)glHint(GL_DONT_CARE,GL_POINT_SMOOTH_HINT);
//glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
//----------------------------------------------------------------------------
glClearColor(0.0f,0.0f,0.0f,1.0f);
glClear(GL_COLOR_BUFFER_BIT); //czyszczenie bufora koloru
glEnable(GL_LINE_STIPPLE);
//glPolygonMode(GL_FRONT,GL_FILL);
//glPolygonMode(GL_BACK,GL_FILL);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); //wyczyszczenie obrazu depth bufora
if(depth_buffer==0)
glDepthFunc(GL_LESS);
else if(depth_buffer==1)
glDepthFunc(GL_LEQUAL);
else if(depth_buffer==2)
glDepthFunc(GL_NOTEQUAL);
else if(depth_buffer==3)
glDepthFunc(GL_ALWAYS);
else if(depth_buffer==4)
glDepthFunc(GL_NEVER);
//----------------------------------------------------------------------------
if(shade==0)
glShadeModel(GL_SMOOTH);
else if(shade==1)
glShadeModel(GL_FLAT);
//----------------------------------------------------------------------------
glPointSize(2);
if(polygon_front==0)
{
glPolygonMode(GL_FRONT,GL_FILL);
}
else if(polygon_front==1)
{
glPolygonMode(GL_FRONT,GL_POINT);
}
else if(polygon_front==2)
{
glPolygonMode(GL_FRONT,GL_LINE);
}
if(polygon_back==3)
{
glPolygonMode(GL_BACK,GL_FILL);
}
else if(polygon_back==4)
{
glPolygonMode(GL_BACK,GL_POINT);
}
else if(polygon_back==5)
{
glPolygonMode(GL_BACK,GL_LINE);
}
Repaint();
//----------------------------------------------------------------------------
/* glLoadIdentity();
glTranslatef(ttri_x,ttri_y,ttri_z); //ustawaienie ostroslupa w pozycji zainicjowanej na poczatku
glRotatef(rtri_x,1.0f,0.0f,0.0f); //obracanie o kat wokol osi x
glRotatef(rtri_y,0.0f,1.0f,0.0f); //obracanie o kat wokol osi y
gl