Advertisement
Guest User

Untitled

a guest
Nov 21st, 2015
237
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 18.94 KB | None | 0 0
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8.   Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ExtCtrls,
  9.   StdCtrls, gtkglext, gdkglext, gl, gtk2, glib2, gdk2, glu, GLext;
  10.  
  11. type
  12.   TArray = array of Gfloat;
  13. type
  14.   { TForm1 }
  15.  
  16.   TForm1 = class(TForm)
  17.     Button1: TButton;
  18.     Button2: TButton;
  19.     Button3: TButton;
  20.     Panel1: TPanel;
  21.     Timer1: TTimer;
  22.     procedure Button2Click(Sender: TObject);
  23.     procedure Button3Click(Sender: TObject);
  24.     procedure FormResize(Sender: TObject);
  25.     procedure Timer1Timer(Sender: TObject);
  26.   private
  27.     { private declarations }
  28.   public
  29.     { public declarations }
  30.   end;
  31.  
  32.  
  33.  
  34. var
  35.   Form1: TForm1;
  36.   glconfig:PGdkGLConfig;
  37.   window,vbox,drawing_area,button:PGtkWidget;
  38.   TextureID:array[0..1] of GLuint;
  39.   TextureData:pByte;
  40.   vang: GLfloat= 0.0;
  41.   ang: GLfloat= 0.0;
  42.   vx: GLfloat= 0.0;
  43.   vy: GLfloat= 0.0;
  44.   vz: GLfloat= 0.0;
  45.   lookx,looky,lookz:gfloat;
  46.   blend,xdir,ydir,zdir:Boolean;
  47.   ar:Tarray;
  48.   LightAmbient: array [0..3] of GLfloat = ( 0.6, 0.3, 0, 1);
  49.   LightDiffuse: array [0..3] of GLfloat = ( 0.4,0.4,0.4,1 );
  50.   LightPosition: array [0..3] of GLfloat = ( 10.0, 10.0, 0.0, 1.0 );
  51.   LightSpec: array [0..3] of GLfloat = (1.0,1.0,1.0,1.0 );
  52.   vbuf: array of GLubyte;
  53.   nurbs:^GLUnurbsObj;
  54.   nurp:array [0..3,0..3,0..2] of GLfloat = (
  55.              ((-3,-3,0),
  56.               (-3,-1,0),
  57.               (-3,1,0),
  58.               (-3,3,0)),
  59.              ((-1,-3,0),
  60.               (-1,1,4),
  61.               (-1,1,4),
  62.               (-1,3,0)),
  63.              ((1,-3,0),
  64.               (1,-1,4),
  65.               (1,1,4),
  66.               (1,3,0)),
  67.              ((3,-3,0),
  68.               (3,-1,0),
  69.               (3,1,0),
  70.               (3,3,0))
  71.   );
  72.   knots: array[0..7] of GLfloat = (0,0,0,0,1,1,1,1);
  73.   trm:array[0..4,0..1] of GLfloat = ((0,0),(1,0),(1,1),(0,1),(0,0));
  74.   trm2:array[0..3,0..1] of GLfloat = ((0.25,0.25),(0.5,0.5),(0.75,0.25),(0.25,0.25));
  75.   samples:Integer;
  76.  
  77.   function GArray(const Values: array of gfloat): TArray;
  78.  
  79. implementation
  80.  
  81. {$R *.lfm}
  82.  
  83. { TForm1 }
  84.  
  85.  
  86. function GArray(const Values: array of gfloat): TArray;
  87. begin
  88.  SetLength(Result, Length(Values));
  89.  move(values[0], result[0], Length(Values) * SizeOf(Values[0]));
  90. end;
  91.  
  92. procedure TForm1.Timer1Timer(Sender: TObject);
  93. begin
  94.      ang:=ang-1.5;
  95.      if ang<0 then
  96.      begin
  97.       ang:=358.5;
  98.       if xdir then xdir:=false
  99.       else xdir:=true;
  100.      end;
  101.      if xdir then
  102.      begin
  103.       vx:=abs(arctan(ang));
  104.       vy:=abs(arctan(ang)/2);
  105.       vz:=abs(arctan(ang)/3);
  106.      end
  107.      else
  108.      begin
  109.       vx:=abs(arctan(ang));
  110.       vy:=-abs(arctan(ang)/2);
  111.       vz:=-abs(arctan(ang)/3);
  112.      end;
  113.      gdk_window_invalidate_rect(drawing_area^.window, @drawing_area^.allocation, FALSE);
  114. end;
  115.  
  116. function lglGetPixelFormat(const APixelFormat: TPixelFormat): Integer;
  117. begin
  118.   case APixelFormat of
  119.     pf24bit: begin
  120.       Result := GL_BGR;
  121.     end;
  122.     pf32bit: begin
  123.       Result := GL_BGRA;
  124.     end;
  125.   end;
  126. end;
  127.  
  128. procedure realize(widget:PGtkWidget; data:gpointer);
  129. const
  130.   s=4;
  131. var
  132.   glcontext: PGdkGLContext;
  133.   gldrawable: PGdkGLDrawable;
  134.   config : PGdkGLConfig;
  135.   i,x,y:Integer;
  136.   h: GLfloat;
  137.   bmp:TPicture;
  138.   new:Pointer;
  139. begin
  140.  glcontext := gtk_widget_get_gl_context (widget);
  141.  gldrawable := gtk_widget_get_gl_drawable (widget);
  142.  
  143.  if gdk_gl_drawable_gl_begin (gldrawable, glcontext)=gFALSE then exit;
  144.  
  145.   glClearColor(0.2,0.2,0.2,1);
  146.  
  147.   glClearDepth(1.0);               // Depth Buffer Setup
  148.   glEnable(GL_DEPTH_TEST);         // Enables Depth Testing
  149.   glDepthFunc(GL_LEQUAL);          // The Type Of Depth Test To Do
  150.   glDepthMask(GL_TRUE);
  151.  
  152.  
  153.   glEnable(GL_CULL_FACE);          // Enable Hidden Surface Removal
  154.   glCullFace(GL_BACK);             // Set to Back
  155.  
  156.  
  157.   glShadeModel(GL_SMOOTH);         // Set shading model
  158.  
  159.   {// fog
  160.   glEnable(GL_FOG);
  161.   glFogi(GL_FOG_MODE,GL_LINEAR);
  162.   glFogf(GL_FOG_START,0.0);
  163.   glFogf(GL_FOG_END,10.0);
  164.   glFogfv(GL_FOG_COLOR,FogColor);
  165.   }
  166.  
  167.   //glShadeModel(GL_FLAT);
  168.   glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
  169.   glHint(GL_TEXTURE_COMPRESSION_HINT ,GL_NICEST);
  170.   glHint(GL_POINT_SMOOTH_HINT ,GL_NICEST);
  171.   glHint(GL_LINE_SMOOTH_HINT ,GL_NICEST);
  172.   glHint(GL_POLYGON_SMOOTH_HINT ,GL_NICEST);
  173.   glHint(GL_FOG_HINT ,GL_NICEST);
  174.  
  175.  
  176.  // lightning
  177.  glLightfv(GL_LIGHT0, GL_AMBIENT, @LightAmbient);
  178.  glLightfv(GL_LIGHT0, GL_DIFFUSE, @LightDiffuse);
  179.  glLightfv(GL_LIGHT0, GL_POSITION,@LightPosition);
  180.  glLightfv(GL_LIGHT0, GL_SPECULAR,@LightSpec);
  181.  
  182.  //
  183.  glLightfv(GL_LIGHT1, GL_AMBIENT, pointer(GArray([0.4,0.4,0.4,1])));
  184.  glLightfv(GL_LIGHT1, GL_DIFFUSE, @LightDiffuse);
  185.  glLightfv(GL_LIGHT1, GL_POSITION,@LightPosition);
  186.  //glLightfv(GL_LIGHT1, GL_SPECULAR,@LightSpec);
  187.  glDisable(GL_LIGHT1);
  188.  glDisable(GL_LIGHTING);
  189.  //glEnable(GL_LIGHTING);
  190.  
  191.  //glBlendFunc(GL_SRC_ALPHA,GL_ONE);
  192.  glEnable(GL_BLEND);
  193.  glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
  194.  
  195.  glEnable(GL_LINE_SMOOTH);
  196.  glEnable(GL_POLYGON_SMOOTH);
  197.  glEnable(GL_POINT_SMOOTH);
  198.  glEnable(GL_MULTISAMPLE);
  199.  glEnable(GL_SAMPLE_ALPHA_TO_ONE);
  200.  glPolygonMode(GL_POINT,GL_FILL);
  201.  
  202.  //glEnable(GL_BLEND);
  203.  nurbs:=gluNewNurbsRenderer();
  204.  gluNurbsProperty(nurbs,GLU_SAMPLING_TOLERANCE,100);
  205.  //gluNurbsProperty(nurbs,GLU_SAMPLING,100);
  206.  gluNurbsProperty(nurbs,GLU_DISPLAY_MODE,GLU_FILL);
  207.  //gluNurbsProperty(nurbs,GLU_DISPLAY_MODE,GLU_OUTLINE_POLYGON);
  208.  if Load_GL_ARB_multisample then
  209.  begin
  210.    glEnable(GL_MULTISAMPLE_ARB);
  211.    glEnable(GL_MULTISAMPLE);
  212.    glHint(GL_MULTISAMPLE_FILTER_HINT_NV, GL_NICEST);
  213.    config:=gtk_widget_get_gl_config(widget);
  214.    glGetIntegerv(GL_SAMPLES_ARB, @samples);
  215.    glGetIntegerv(GL_SAMPLES, @samples);
  216.    glGetIntegerv(GL_SAMPLE_BUFFERS, @samples);
  217.  end;
  218.  
  219.  gdk_gl_drawable_gl_end (gldrawable);
  220. end;
  221.  
  222. function thereshape(widget:pGtkWidget; event:PGdkEventConfigure; data:gpointer):gboolean;
  223. var
  224.   glcontext: PGdkGLContext;
  225.   gldrawable: PGdkGLDrawable;
  226.   i,x,y:integer;
  227.   viewport: PGLint;
  228. begin
  229.  SetLength(vbuf,drawing_area^.allocation.width*drawing_area^.allocation.height*4);
  230.  glcontext := gtk_widget_get_gl_context (widget);
  231.  gldrawable := gtk_widget_get_gl_drawable (widget);
  232.  
  233.  if gdk_gl_drawable_gl_begin (gldrawable, glcontext)=gFALSE then
  234.  begin
  235.    result:=gFALSE;
  236.    exit;
  237.  end;
  238.  
  239.  glViewport(0, 0, widget^.allocation.width, widget^.allocation.height);
  240.  gdk_gl_drawable_gl_end (gldrawable);
  241.  result:=gTRUE;
  242. end;
  243.  
  244. function thedraw(widget:PGtkWidget; event:PGdkEventExpose; data:gpointer):gboolean;
  245. type
  246.   TVertex2f = record
  247.     X, Y: Single;
  248.   end;
  249. var
  250.   glcontext:PGdkGLContext;
  251.   gldrawable:PGdkGLDrawable;
  252.   i,x,y,z:GLfloat;
  253.   pf:array[0..1] of GLfloat;
  254.   pic:array [0..63] of GLubyte = (
  255.       $ff,$ff,$ff,$ff,
  256.       $ff,$ff,$ff,$ff,
  257.       $ff,$ff,$ff,$ff,
  258.       $ff,$ff,$ff,$ff,
  259.       $ff,$ff,$ff,$ff,
  260.       $ff,$ff,$ff,$ff,
  261.       $ff,$ff,$ff,$ff,
  262.       $ff,$ff,$ff,$ff,
  263.       $ff,$ff,$ff,$ff,
  264.       $ff,$ff,$ff,$ff,
  265.       $ff,$ff,$ff,$ff,
  266.       $ff,$ff,$ff,$ff,
  267.       $ff,$ff,$ff,$ff,
  268.       $ff,$ff,$ff,$ff,
  269.       $ff,$ff,$ff,$ff,
  270.       $ff,$ff,$ff,$ff);
  271.   pt:Array[0..3, 0..2] Of TGLfloat =(
  272.                       (-1,0,0),
  273.                       (-1,1,0),
  274.                       (1,-1,0),
  275.                       (1,0,0)
  276.                       );
  277.   grid:Array[0..2, 0..2, 0..2] Of TGLfloat =
  278.     (
  279.      ((-2,0,2),
  280.       (-2,2,2),
  281.       (2,0,2)),
  282.      ((-2,0,0),
  283.       (2,4,0),
  284.       (2,0,0)),
  285.      ((-2,0,-2),
  286.       (-2,2,-2),
  287.       (2,0,-2))
  288.      );
  289.   p1,p2,p3,p4,p5:TVertex2f;
  290.   disk,sphere,cyl:PgluQuadric;
  291.   a,b:Integer;
  292.   PM:GLint;
  293. begin
  294.  glcontext := gtk_widget_get_gl_context (widget);
  295.  gldrawable := gtk_widget_get_gl_drawable (widget);
  296.  if gdk_gl_drawable_gl_begin (gldrawable, glcontext)=gFALSE then
  297.  begin
  298.    result:=gFALSE;
  299.    exit;
  300.  end;
  301.  
  302.  glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
  303.  
  304.  glLoadIdentity();
  305.  
  306.  glMatrixMode (GL_PROJECTION);
  307.  glLoadIdentity();
  308.  gluPerspective(45, widget^.allocation.width/widget^.allocation.height, 0.01,100.0);
  309.  glTranslatef(0,0,-vang);
  310.  if(looky>pi/2) then looky:= pi/2;
  311.  if(looky<-pi/2) then looky:=-pi/2;
  312.  x:=cos(lookx);
  313.  y:=sin(looky);
  314.  z:=sin(lookx);
  315.  gluLookAt(x,y,z,0,0,0,0,1,0);
  316.  
  317.  glMatrixMode(GL_MODELVIEW);
  318.  glDisable(GL_CULL_FACE);
  319.  glColor3f(1,1,0);
  320.  glLineWidth (1.5);
  321.  glPointSize(1.5);
  322.  
  323.  glLoadIdentity();
  324.  
  325.   //sphere:=gluNewQuadric();
  326.   //gluSphere(sphere,0.2,20,26);
  327.  
  328.   //glEnable(GL_BLEND);
  329. {  glEnable(GL_FOG);
  330.   glFogi(GL_FOG_MODE,GL_EXP2);
  331.   glFogfv(GL_FOG_COLOR,pointer(GArray([0.9,0.9,0.9,1])));
  332.   glFogf(GL_FOG_DENSITY,0.35);
  333. }
  334.   //glEnable(GL_POLYGON_OFFSET_LINE);
  335.  
  336.   //glDisable(GL_CULL_FACE);
  337.  
  338.   //glEnable(GL_NORMALIZE);
  339.  
  340.  
  341.  
  342.   glEnable(GL_COLOR_MATERIAL);
  343.   //glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
  344.   //glMateriali(GL_FRONT,GL_SHININESS,128);
  345.   //glMaterialfv (GL_FRONT,GL_AMBIENT,pointer(Garray([0.6,0.6,0.9,1])));
  346.   //glMaterialfv (GL_FRONT,GL_DIFFUSE,pointer(Garray([0.6,0.6,0.9,1])));
  347.   //glMaterialfv (GL_FRONT,GL_SPECULAR,pointer(Garray([0.1,0.1,0.1,1])));
  348.   //glMaterialfv (GL_FRONT,GL_SHININESS,pointer(Garray([0.1,0.1,0,1,1])));
  349.   glEnable(GL_LIGHTING);
  350.   glEnable(GL_LIGHT0);
  351.   glDisable(GL_LIGHT1);
  352.   glTranslatef(0,-5.5,0);                              
  353.   glPushMatrix();
  354.    //glRotatef(90,0,1,0);
  355.    ar:=GArray([0,0,0,
  356.                1,0,0,
  357.                1,1,0,
  358.                1,1.5,0,
  359.                1.5,1,0,
  360.                1.5,1.5,0
  361.                ]);
  362.    glRotatef(90,1,0,0);
  363.    glEnableClientState(GL_VERTEX_ARRAY);
  364.     glVertexPointer(3,GL_FLOAT,0,Pointer(ar));
  365.     //glDisable(GL_CULL_FACE);
  366.     glDrawArrays(GL_TRIANGLE_STRIP,0,6);
  367.     //glEnable(GL_CULL_FACE);
  368.    glDisableClientState(GL_VERTEX_ARRAY);
  369.   glPopMatrix();
  370.  
  371.   glLoadIdentity();
  372.   glPushMatrix();
  373.    glRotatef(ang,1,0,0);
  374.    glTranslatef(0,2,0);
  375.    glPushMatrix();
  376.     glRotatef(ang,0.5,0,0);
  377.     disk:=gluNewQuadric();
  378.    if glIsEnabled(GL_CULL_FACE)=1 then
  379.     begin
  380.      glEnable(GL_CULL_FACE);
  381.      gluDisk(disk,0.1,0.5,20,26);
  382.      glDisable(GL_CULL_FACE);
  383.     end
  384.     else
  385.     begin
  386.      glEnable(GL_CULL_FACE);
  387.       gluDisk(disk,0.1,0.5,20,26);
  388.       glRotatef(180,1,0,0);
  389.       gluDisk(disk,0.1,0.5,20,26);
  390.      glDisable(GL_CULL_FACE);
  391.     end;
  392.    glPopMatrix();
  393.   glPopMatrix();
  394.  
  395.  
  396.   glLoadIdentity();
  397.   glPushMatrix();
  398.    glTranslatef(3,0,0);
  399.    glRotatef(ang,0,1,0);
  400.    sphere:=gluNewQuadric();
  401.    gluSphere(sphere,0.5,21,26);
  402.   glPopMatrix();
  403.  
  404.  
  405.  
  406.   //
  407.   glPushMatrix();
  408.    //glRotatef(90,0,1,1);
  409.    glRotatef(-ang,1,0,0);
  410.    glTranslatef(0,4,0);
  411.    cyl:=gluNewQuadric();
  412.    gluCylinder(cyl,0.5,0.0,1,13,26);
  413.    glPushMatrix();
  414.     gluCylinder(cyl,0,0.5,0,13,26);
  415.    glPopMatrix();
  416.   glPopMatrix();
  417.  
  418.  
  419.  if Load_GL_MESA_window_pos then
  420.   begin
  421.     //glWindowPos2iARB(4,4);
  422.     //glReadBuffer(GL_FRONT);
  423.     x:=drawing_area^.allocation.width;
  424.     y:=drawing_area^.allocation.height;
  425.     //
  426.     //glPixelTransferf(GL_RED_SCALE,1);
  427.     //glPixelTransferf(GL_GREEN_SCALE,1);
  428.     //glPixelTransferf(GL_BLUE_SCALE,1);
  429.     //glPixelZoom(0.2,0.2);
  430.     //glReadBuffer(GL_BACK);
  431.     //glDrawPixels(256,256,GL_RGBA,GL_UNSIGNED_BYTE,pointer(vbuf));
  432.     //glRasterPos2d(4,4);
  433.  
  434.  
  435.     //glPixelZoom(10,10);
  436.     //glDrawPixels(8,8,GL_RED,GL_UNSIGNED_BYTE,@pic);
  437.     //glDrawBuffer(GL_BACK);
  438.     //glRasterPos2i(1,1);
  439.     glWindowPos2iMESA(10,10);
  440.     //glBitmap(8,8,0,0,0,0,pic);
  441.  
  442.   end;
  443.  
  444.  
  445.  glPushMatrix();
  446.   glTranslatef(4,0,0);
  447.   glRotatef(90,0,1,0);
  448.   glMap1f(GL_MAP1_VERTEX_3,0,100,3,4,@pt);
  449.   glEnable(GL_MAP1_VERTEX_3);
  450.   glMapGrid1d(100,0,100);
  451.   glEvalMesh1(GL_LINE,0,100);
  452.   glDisable(GL_MAP1_VERTEX_3);
  453.  
  454.   glPointSize(5);
  455.   glBegin(GL_POINTS);
  456.    for a:=0 to 3 do
  457.      glVertex2fv(@pt[a]);
  458.   glend();
  459.  glPopMatrix();
  460.  
  461.  glPushMatrix();
  462.   //glDisable(GL_COLOR_MATERIAL);
  463.   glDisable(GL_LIGHT0);
  464.   glEnable(GL_LIGHT1);
  465.   //glLightfv(GL_LIGHT0, GL_AMBIENT, pointer(GArray([0.3,0.3,0.3,1])));
  466.   //glColorMaterial(GL_FRONT_AND_BACK,256);
  467.   //glColorMaterial(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE);
  468.   //glMateriali(GL_FRONT,GL_SHININESS,128);
  469.   //glMaterialfv (GL_FRONT,GL_AMBIENT,pointer(Garray([1,1,1,1])));
  470.   //glMaterialfv (GL_FRONT,GL_DIFFUSE,pointer(Garray([1,1,1,1])));
  471.   //glMaterialfv (GL_FRONT,GL_SPECULAR,pointer(Garray([0.1,0.1,0.1,1])));
  472.   //glMaterialfv (GL_FRONT,GL_SHININESS,pointer(Garray([0.1,0.1,0,1,1])));
  473.  
  474.  
  475.  
  476.   glTranslatef(0,-0.5,0);
  477.   //glRotatef(90,0,1,0);
  478.   glMap2f(GL_MAP2_VERTEX_3,0,10,3,3,0,10,9,3,@grid);
  479.   glEnable(GL_MAP2_VERTEX_3);
  480.   glMapGrid2f(10,0,10,10,0,10);
  481.   //glEvalMesh2(GL_LINE,0,10,0,10);
  482.   glColor3f(1,1,1);
  483.   glEvalMesh2(GL_FILL,0,10,0,10);
  484.   glEnable(GL_AUTO_NORMAL);
  485.   glDisable(GL_MAP2_VERTEX_3);
  486.   glDisable(GL_LIGHTING);
  487.   glColor3f(1,1,0);
  488.   glPointSize(5);
  489.   glBegin(GL_POINTS);
  490.   for a:=0 to 2 do
  491.     for b:=0 to 2 do
  492.      glVertex3fv(@grid[a][b]);
  493.   glend();
  494.   glEnable(GL_LIGHTING);
  495.  glPopMatrix();
  496.  
  497.  
  498.  
  499.  glPushMatrix();
  500.    glRotatef(180,0,1,1);
  501.    glTranslatef(5,1,0);
  502.    glDisable(GL_LIGHT1);
  503.    glEnable(GL_LIGHT0);
  504.  
  505.    gluBeginSurface(nurbs);
  506.      //glEnable(GL_AUTO_NORMAL);
  507.      gluNurbsSurface(nurbs,8,knots,8,knots,4*3,3,@nurp,4,4,GL_MAP2_VERTEX_3);
  508.  
  509.      gluBeginTrim(nurbs);
  510.       gluPwlCurve(nurbs,5,@trm,2,GLU_MAP1_TRIM_2);
  511.      gluEndTrim(nurbs);
  512.      gluBeginTrim(nurbs);
  513.       gluPwlCurve(nurbs,4,@trm2,2,GLU_MAP1_TRIM_2);
  514.      gluEndTrim(nurbs);
  515.    gluEndSurface(nurbs);
  516.  glPopMatrix();
  517.  
  518.  glDisable(GL_LIGHTING);
  519.  
  520.  if gdk_gl_drawable_is_double_buffered(gldrawable)=gTRUE then
  521.    gdk_gl_drawable_swap_buffers(gldrawable)
  522.  else glFlush();
  523.  gdk_gl_drawable_gl_end (gldrawable);
  524.  
  525.  result:=gTRUE;
  526. end;
  527.  
  528. function thekey (
  529.   widget: PGtkWidget;
  530.   event: PGdkEventKey;
  531.   data: gpointer): gboolean; cdecl;
  532. begin
  533.   case event^.keyval of
  534.     GDK_KEY_Up        : begin blend:=true;end;
  535.     GDK_KEY_Down      : begin blend:=false;end;
  536.     GDK_KEY_Left      : begin
  537.                          ang:=ang-1.5;
  538.                          if ang<0 then
  539.                          begin
  540.                           ang:=358.5;
  541.                           if xdir then xdir:=false
  542.                           else xdir:=true;
  543.                          end;
  544.                          if xdir then
  545.                          begin
  546.                           vx:=abs(arctan(ang));
  547.                           vy:=abs(arctan(ang)/2);
  548.                           vz:=abs(arctan(ang)/3);
  549.                          end
  550.                          else
  551.                          begin
  552.                           vx:=abs(arctan(ang));
  553.                           vy:=-abs(arctan(ang)/2);
  554.                           vz:=-abs(arctan(ang)/3);
  555.                          end;
  556.                         end;
  557.     GDK_KEY_Right     : begin
  558.                          ang:=ang+1.5;
  559.                          if ang>360 then
  560.                          begin
  561.                           ang:=1.5;
  562.                           if xdir then xdir:=false
  563.                           else xdir:=true;
  564.                          end;
  565.                          if xdir then
  566.                          begin
  567.                           vx:=abs(arctan(ang));
  568.                           vy:=abs(arctan(ang)/2);
  569.                           vz:=abs(arctan(ang)/3);
  570.                          end
  571.                          else
  572.                          begin
  573.                           vx:=abs(arctan(ang));
  574.                           vy:=-abs(arctan(ang)/2);
  575.                           vz:=-abs(arctan(ang)/3);
  576.                          end;
  577.                         end;
  578.     GDK_KEY_a:begin lookx+=pi/50; if lookx>2*pi then lookx-=2*pi; end;
  579.     GDK_KEY_d:begin lookx-=pi/50; if lookx<-2*pi then lookx+=2*pi; end;
  580.     GDK_KEY_w:begin looky+=pi/50; if looky>2*pi then looky-=2*pi; end;
  581.     GDK_KEY_s:begin looky-=pi/50; if looky<-2*pi then looky+=2*pi; end;
  582.     GDK_KEY_1 : glPolygonMode(GL_FRONT_AND_BACK,GL_FILL);
  583.     GDK_KEY_2 : glPolygonMode(GL_FRONT_AND_BACK,GL_POINT);
  584.     GDK_KEY_3 : glPolygonMode(GL_FRONT_AND_BACK,GL_LINE);
  585.     GDK_KEY_Page_Up : glEnable(GL_BLEND);
  586.     GDK_KEY_Page_Down : glDisable(GL_BLEND);
  587.  
  588.     GDK_KEY_Escape    : gtk_main_quit ();
  589.     else Exit(false);
  590.   end;
  591.   gdk_window_invalidate_rect(drawing_area^.window, @drawing_area^.allocation, FALSE);
  592.   Result := gtrue;
  593. end;
  594.  
  595. function mousescroll(widget: PGtkWidget;event: PGdkEventScroll): gboolean; cdecl;
  596. begin
  597.  if event^.direction = GDK_SCROLL_UP then
  598.    if vang<30 then vang+=0.5
  599.    else vang:=30;
  600.  if event^.direction = GDK_SCROLL_DOWN then
  601.    if vang>0.5 then vang-=0.5
  602.    else vang:=0.5;
  603.    gdk_window_invalidate_rect(drawing_area^.window, @drawing_area^.allocation, FALSE);
  604.    Result := gtrue;
  605. end;
  606.  
  607. procedure TForm1.Button2Click(Sender: TObject);
  608. var
  609.   major,minor:gint;
  610.   bl:gboolean;
  611.   gl:gulong;
  612.   list:PGList;
  613. begin
  614.  lookx:=0;looky:=0;lookz:=0;
  615.  
  616.  gtk_init(@argc, @argv);
  617.  gtk_gl_init(@argc, @argv);
  618.  gdk_gl_query_version(major,minor);
  619.  
  620.  glconfig := gdk_gl_config_new_by_mode(GDK_GL_MODE_RGBA or GDK_GL_MODE_DOUBLE or GDK_GL_MODE_DEPTH
  621.              or  GDK_GL_MODE_MULTISAMPLE or 2 shl 24); // or
  622.  // get parent GTK widget
  623.  window := PGtkWidget(Panel1.Handle);
  624.  list:=gtk_container_get_children(GTK_CONTAINER(window));
  625.  window:=list^.data;
  626.  
  627.  gtk_container_set_reallocate_redraws (GTK_CONTAINER (window), gTRUE);
  628.  gl:=g_signal_connect (G_OBJECT (window), 'delete_event', G_CALLBACK (@gtk_main_quit), NULL);
  629.  //gtk_container_set_border_width (GTK_CONTAINER(window), 10);
  630.  gtk_widget_show (window);
  631.  
  632.  vbox := gtk_vbox_new (gFALSE, 0);
  633.  gtk_container_add (GTK_CONTAINER (window), vbox);
  634.  gtk_widget_show (vbox);
  635.  
  636.  drawing_area := gtk_drawing_area_new();
  637.  gtk_widget_set_size_request(drawing_area, panel1.Width, panel1.Height);
  638.  bl:=gtk_widget_set_gl_capability ( drawing_area,
  639.       glconfig,
  640.       NULL,
  641.       gTRUE,
  642.       GDK_GL_RGBA_TYPE);
  643.  gtk_widget_add_events (drawing_area, GDK_VISIBILITY_NOTIFY_MASK);
  644.  gl:=g_signal_connect_after (G_OBJECT (drawing_area), 'realize',  G_CALLBACK (@realize),   NULL);
  645.  gl:=g_signal_connect(G_OBJECT (drawing_area), 'configure_event', G_CALLBACK (@thereshape),  NULL);
  646.  gl:=g_signal_connect(G_OBJECT (drawing_area), 'expose_event', G_CALLBACK (@thedraw),  NULL);
  647.  gl:=g_signal_connect_swapped(G_OBJECT(PGtkWidget(Form1.Handle)), 'key_press_event',G_CALLBACK (@thekey), drawing_area);
  648.  //gl:=g_signal_connect(G_OBJECT(drawing_area), 'motion_notify_event',G_CALLBACK(@mouse), NULL);
  649.  gl:=g_signal_connect(G_OBJECT(PGtkWidget(Panel1.Handle)), 'scroll_event',G_CALLBACK(@mousescroll), NULL);
  650.  gtk_box_pack_start (GTK_BOX(vbox), drawing_area, gTRUE, gTRUE, 0);
  651.  gtk_widget_show (drawing_area);
  652.  vang:=10.0;
  653. end;
  654.  
  655. procedure TForm1.Button3Click(Sender: TObject);
  656. begin
  657.   If Timer1.Enabled then timer1.Enabled:=false
  658.   else timer1.Enabled:=true;
  659. end;
  660.  
  661. procedure TForm1.FormResize(Sender: TObject);
  662. var
  663.   x,y:Integer;
  664. begin
  665.   x:=Form1.Width;
  666.   y:=Form1.Height;
  667.   Button1.Left:=x-90;
  668.   Button2.Left:=x-90;
  669.   Button3.Left:=x-90;
  670.   Panel1.Height:=y-40;
  671.   Panel1.Width:=x-120;
  672.   if drawing_area<>nil then
  673.   begin
  674.     gtk_widget_set_size_request(vbox, panel1.Width, panel1.Height);
  675.   end;
  676. end;
  677.  
  678. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement