unit u_kugel_zwei;

{$mode objfpc}{$H+}

// http://nehe.gamedev.net/

interface

uses
  Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
  ExtCtrls, OpenGLContext,
  //dglOpenGL;

{ statt der dglOpenGL können auch die units GL, GLU eingebunden werden
  Bei Verwednung der dglOpenGL unit muss beim Form.Create eine saubere
  Initialisierung erfolgen }
  GL, GLU;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure FormPaint(Sender: TObject);
    procedure OnAppIdle(Sender: TObject; var Done: Boolean);
    procedure OpenGLControl1Resize(Sender: TObject);
  private
    OpenGLControl1: TOpenGLControl;
  public

  end;

var
  Form1: TForm1;
  rtri: GLFloat = 0.0;
  rquad: GLFloat = 0.0;
  EarthRot, MoonRot : Double;  // Rotationsvariablen

implementation

{ TForm1 }


procedure TForm1.FormCreate(Sender: TObject);

begin
  OpenGLControl1:=TOpenGLControl.Create(Self);
  with OpenGLControl1 do begin
    Name:='OpenGLControl1';
    Align:=alClient;
    Parent:=Self;
    OnPaint:=@FormPaint;
    OnResize:=@OpenGLControl1Resize;
    AutoResizeViewport:=true;
  end;

  { Beginn: Initialisierung von OpenGL bei Verwendung der dglOpenGL}
  //InitOpenGL;
  OpenGLControl1.MakeCurrent;
  //ReadExtensions;
  //ReadImplementationProperties;
  { End: Initialisierung von OpenGL bei Verwendung der dglOpenGL}

  { Beginn: Initialisierung von OpenGL gemäß Neon Helium}
  glEnable(GL_TEXTURE_2D);             // Aktiviert Texture Mapping
  glShadeModel(GL_SMOOTH);             // Aktiviert weiches Shading
  glClearColor(0.0, 0.0, 0.0, 0.5);    // Bildschirm löschen
  glClearDepth(1.0);                   // Depth Buffer Setup
  glEnable(GL_DEPTH_TEST);             // Aktiviert Despth Testing
  glDepthFunc(GL_LEQUAL);              // Type of Depth Test to Do
  glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST); // Qualitativ bessere Koordinaten Interpolation
  { End: Initialisierung von OpenGL gemäß Neon Helium}


  { Aufruf des IdleHandlers für das kontinuierliche Durchlaufen der .FormPaint }
  Application.AddOnIdleHandler(@OnAppIdle);

end;

procedure TForm1.FormDestroy(Sender: TObject);
begin

end;

procedure TForm1.OnAppIdle(Sender: TObject; var Done: Boolean);
begin
  Done:=false;
  //DebugLn(['TForm1.OnAppIdle ']);
  OpenGLControl1.Invalidate;
end;

procedure TForm1.FormPaint(Sender: TObject);

var
  quadricSonne, quadricErde, quadricMond : PGLuquadric;

begin

  // Screen- und Tiefenbuffer bereinigen
  glClear( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT ); // Clear the Screen and the Depth

  EarthRot:=EarthRot+100/365;
  MoonRot:=MoonRot+100/60;

  glLoadIdentity; // Reset the Current ModelView Matrix
  gluLookAt(-60,10,20, 0,0,0, 0,1,0);

  glBegin  (GL_Lines);
  glColor3f(1,0,0);
  glVertex3f(0,0,0);glVertex3f(60,0,0);
  glColor3f(0,1,0);
  glVertex3f(0,0,0);glVertex3f(0,60,0);
  glColor3f(0,0,1);
  glVertex3f(0,0,0);glVertex3f(0,0,60);
  glend;


  //  erstellt eine Betrachtungsmatrix aus einem Betrachterpunkt (eyeX, eyeY, eyeZ),
  //                                       einem Referenzpunkt der zu betrachtenden Szene
  //                                       und einen nach oben zeigenden Vektor
  gluLookAt(-40,10,20, 0,0,0, 0,1,0);

  // Sonne
  glEnable(gl_normalize);
  //glRotated(EarthRot,0,-1,0) ;
  glLineWidth(1);
  glColor3f(1,1,0);
  quadricSonne:=gluNewQuadric();
  gluQuadricOrientation(quadricSonne,glu_outside);
  gluQuadricTexture(quadricSonne,gl_false);
  gluQuadricDrawStyle(quadricSonne, GLU_LINE);
  glShademodel(gl_flat);
  gluQuadricTexture(quadricSonne, gl_false);
  gluSphere(quadricSonne, 10, 15, 15);
  gluDeleteQuadric(quadricSonne);

   {
  // Erde

  gltranslated(30,0,0);
  glRotated(EarthRot,0,-1,0);
  glPushMatrix;
  glColor3f(0,0,1);
  quadricErde:=gluNewQuadric();
  gluQuadricOrientation(quadricErde,glu_outside);
  gluQuadricTexture(quadricErde,gl_false);
  gluQuadricDrawStyle(quadricErde, GLU_LINE);
  glShademodel(gl_flat);
  gluQuadricTexture(quadricErde, gl_false);
  gluSphere(quadricErde, 5, 20, 20);
  gluDeleteQuadric(quadricErde);
  glPopMatrix;

  //Mond

  gltranslated(8,0,0);
  glRotated(MoonRot,0.2,1,0);

  glColor3f(0,1,1);
  quadricMond:=gluNewQuadric();
  gluQuadricOrientation(quadricMond,glu_outside);
  gluQuadricTexture(quadricMond,gl_false);
  gluQuadricDrawStyle(quadricMond, GLU_LINE);
  glShademodel(gl_flat);
  gluQuadricTexture(quadricMond, gl_false);
  gluSphere(quadricMond, 1, 10, 10);
  gluDeleteQuadric(quadricMond);

  }
  OpenGLControl1.SwapBuffers;

end;


procedure TForm1.OpenGLControl1Resize(Sender: TObject);
begin
  if OpenGLControl1.Height <= 0 then exit;
  // the viewport is automatically resized by the TOpenGLControl
  // you can disable it (OpenGLControl1.AutoResizeViewport:=false)
  // and do something yourself here

  glViewport(0, 0, Width, Height);     // Setzt den Viewport für das OpenGL Fenster
                                       // Width & Height existieren in der UNIT CONTROLS

  glMatrixMode(GL_PROJECTION);         // Matrixmode auf Projektion setzen
  glLoadIdentity();                    // und reset der View
  gluPerspective(100.0,Width/Height,0.1,100.0); // Výpoèet perspektivy
  glViewport(0, 0, Width, Height); // Resetuje aktuální nastavení

  glMatrixMode(GL_MODELVIEW); // Zvolí matici Modelview
  glLoadIdentity; // Reset the Current ModelView Matrix
end;

initialization

  {$I u_kugel_zwei.lrs}

end.
