home *** CD-ROM | disk | FTP | other *** search
/ CD Actual Thematic 25: Programming / pc_actual_25.iso / Delphi / TeeChartPro / TeeChart5Delphi5Eval.exe / %MAINDIR% / Examples / Features / OpenGL_Surface.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  2001-09-10  |  7.1 KB  |  296 lines

  1. {$I TeeDefs.inc}
  2. unit OpenGL_Surface;
  3.  
  4. interface
  5.  
  6. { This example adds one more extra Light to OpenGL
  7.   rendering scene. Also shows Surface Series. }
  8.  
  9. uses
  10.   Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  11.   TeEngine, TeeSurfa, TeePoin3, ExtCtrls, TeeProcs, Chart, TeeComma,
  12.   TeeOpenGL, TeeEditPro, StdCtrls, ComCtrls;
  13.  
  14. type
  15.   TOpenGLSurface = class(TForm)
  16.     Chart1: TChart;
  17.     TeeCommander1: TTeeCommander;
  18.     Series1: TSurfaceSeries;
  19.     TeeOpenGL1: TTeeOpenGL;
  20.     Panel1: TPanel;
  21.     ScrollBar2: TScrollBar;
  22.     ScrollBar3: TScrollBar;
  23.     ScrollBar4: TScrollBar;
  24.     ScrollBar5: TScrollBar;
  25.     Timer1: TTimer;
  26.     CheckBox2: TCheckBox;
  27.     Label1: TLabel;
  28.     Label2: TLabel;
  29.     Label3: TLabel;
  30.     Label4: TLabel;
  31.     CheckBox3: TCheckBox;
  32.     CheckBox4: TCheckBox;
  33.     RadioGroup1: TRadioGroup;
  34.     CheckBox5: TCheckBox;
  35.     CheckBox6: TCheckBox;
  36.     Label5: TLabel;
  37.     Label6: TLabel;
  38.     Label7: TLabel;
  39.     Label8: TLabel;
  40.     CheckBox7: TCheckBox;
  41.     Label9: TLabel;
  42.     CheckBox1: TCheckBox;
  43.     TrackBar1: TTrackBar;
  44.     procedure FormCreate(Sender: TObject);
  45.     procedure TeeOpenGL1Init(Sender: TObject);
  46.     procedure ScrollBar2Change(Sender: TObject);
  47.     procedure ScrollBar3Change(Sender: TObject);
  48.     procedure ScrollBar4Change(Sender: TObject);
  49.     procedure ScrollBar5Change(Sender: TObject);
  50.     procedure Timer1Timer(Sender: TObject);
  51.     procedure CheckBox1Click(Sender: TObject);
  52.     procedure CheckBox3Click(Sender: TObject);
  53.     procedure CheckBox4Click(Sender: TObject);
  54.     procedure RadioGroup1Click(Sender: TObject);
  55.     procedure CheckBox5Click(Sender: TObject);
  56.     procedure CheckBox6Click(Sender: TObject);
  57.     procedure CheckBox2Click(Sender: TObject);
  58.     procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  59.     procedure TrackBar1Change(Sender: TObject);
  60.   private
  61.     { Private declarations }
  62.   public
  63.     { Public declarations }
  64.      a,b,c,d  : Double;
  65.      Changing : Boolean;
  66.      Formula  : Integer;
  67.      DeltaA,
  68.      DeltaB,
  69.      DeltaC,
  70.      DeltaD   : Integer;
  71.     procedure Fill;
  72.   end;
  73.  
  74. implementation
  75.  
  76. {$R *.DFM}
  77.  
  78. uses TeeGLEditor, TeeGLCanvas, OpenGL2;
  79.  
  80. procedure TOpenGLSurface.FormCreate(Sender: TObject);
  81. begin
  82.   { initialize local variables... }
  83.   Changing:=False;
  84.   DeltaA:=2;
  85.   DeltaB:=2;
  86.   DeltaC:=6;
  87.   DeltaD:=6;
  88.   a:=3.0;
  89.   b:=10.0;
  90.   c:=5.0;
  91.   d:=1.0;
  92.   ScrollBar4.Position:=100;
  93.   Formula:=0;
  94.   TeeCommander1.ButtonRotate.Down:=True;
  95.   { add the surface... }
  96.   Fill;
  97. end;
  98.  
  99. Procedure TOpenGLSurface.Fill;
  100.  
  101.   { return a surface cell value... }
  102.   Function Calc(x,y:Double):Double;
  103.   begin
  104.     Case Formula of
  105.       0:  begin
  106.             x:=x/3.0;
  107.             y:=y/3.0;
  108.             Result:=  a*sqr(d-x)*exp(-(x*x)-Sqr(y+d))
  109.             -b*(x/c-(x*x*x)-(y*y*y*y*y))*exp(-sqr(x)-sqr(y))
  110.             -(d/a)*exp(-sqr(x+d)-sqr(y));
  111.           end;
  112.       1: begin
  113.           x:=(x/15.0)*random(100)/100.0;
  114.           y:=(y/15.0)*random(100)/100.0;
  115.           result:=cos(x+sqr(y)+a*b*c*d);
  116.          end;
  117.       2: begin
  118.           x:=(x/15.0)*pi/3.0;
  119.           y:=(y/15.0)*pi/1;
  120.           result:=cos(sqr(a)+x*sin(y)+sin(sqr(b)+x)*sqr(cos(sqr(c*d+y))));;
  121.          end;
  122.     else
  123.     begin
  124.       result:=0;
  125.     end;
  126.     end;
  127.   end;
  128.  
  129. var i,j:Integer;
  130. begin
  131.   { do a loop and fill a 21 x 21 surface... }
  132.   if not Changing then
  133.   with Series1 do
  134.   begin
  135.     Clear;
  136.     for i:=-10 to 10 do
  137.         for j:=-10 to 10 do AddXYZ(i,Calc(i,j),j  {$IFNDEF D4},'',clTeeColor{$ENDIF});
  138.     if CheckBox2.Checked then PaletteSteps:=32;
  139.   end;
  140.   { show the formula parameters... }
  141.   Label1.Caption:=FloatToStr(a);
  142.   Label2.Caption:=FloatToStr(b);
  143.   Label3.Caption:=FloatToStr(c);
  144.   Label4.Caption:=FloatToStr(d);
  145. end;
  146.  
  147. { use OpenGL native API to add an extra "light" to the scene }
  148. Procedure AddExtraLight(Const Ambient,Diffuse,Specular,X,Y,Z:Double);
  149. var tmp : GLMat;
  150. begin
  151.   glEnable(GL_LIGHT1);
  152.  
  153.   tmp[0]:=Ambient;
  154.   tmp[1]:=Ambient;
  155.   tmp[2]:=Ambient;
  156.   tmp[3]:=1;
  157.   glLightfv(GL_LIGHT1,  GL_AMBIENT, @tmp);
  158.  
  159.   tmp[0]:=Diffuse;
  160.   tmp[1]:=Diffuse;
  161.   tmp[2]:=Diffuse;
  162.   tmp[3]:=1;
  163.   glLightfv(GL_LIGHT1,  GL_DIFFUSE, @tmp);
  164.  
  165.   tmp[0]:=Specular;
  166.   tmp[1]:=Specular;
  167.   tmp[2]:=Specular;
  168.   tmp[3]:=1;
  169.   glLightfv(GL_LIGHT1,  GL_SPECULAR, @tmp);
  170.  
  171.   tmp[0]:=  200;
  172.   tmp[1]:=  100;
  173.   tmp[2]:= -150;
  174.   tmp[3]:=    1;
  175.   glLightfv(GL_LIGHT1, GL_POSITION, @tmp);
  176. end;
  177.  
  178. Procedure DisableExtraLight;
  179. begin
  180.   glDisable(GL_LIGHT1);
  181. end;
  182.  
  183. { On OpenGL initialization, add the extra light... }
  184. procedure TOpenGLSurface.TeeOpenGL1Init(Sender: TObject);
  185. begin
  186.   if CheckBox7.Checked then AddExtraLight(0.6,0.2,0.9,200,100,-150)
  187.                        else DisableExtraLight;
  188. end;
  189.  
  190. procedure TOpenGLSurface.ScrollBar2Change(Sender: TObject);
  191. begin
  192.   a:=ScrollBar2.Position/100.0;
  193.   Fill;
  194. end;
  195.  
  196. procedure TOpenGLSurface.ScrollBar3Change(Sender: TObject);
  197. begin
  198.   b:=ScrollBar3.Position/100.0;
  199.   Fill;
  200. end;
  201.  
  202. procedure TOpenGLSurface.ScrollBar4Change(Sender: TObject);
  203. begin
  204.   c:=ScrollBar4.Position/100.0;
  205.   Fill;
  206. end;
  207.  
  208. procedure TOpenGLSurface.ScrollBar5Change(Sender: TObject);
  209. begin
  210.   d:=ScrollBar5.Position/100.0;
  211.   Fill;
  212. end;
  213.  
  214. { animation... }
  215. procedure TOpenGLSurface.Timer1Timer(Sender: TObject);
  216.  
  217.  Procedure ChangeScroll(ABar:TScrollBar; Var ADelta:Integer);
  218.  begin
  219.    With ABar do
  220.     if ((Position+ADelta)<Min) or ((Position+ADelta)>Max) then
  221.        ADelta:=-ADelta
  222.     else
  223.        Position:=Position+ADelta;
  224.  end;
  225.  
  226. begin
  227.   Timer1.Enabled:=False;
  228.   Changing:=True;
  229.   ChangeScroll(ScrollBar2,DeltaA);
  230.   ChangeScroll(ScrollBar3,DeltaB);
  231.   ChangeScroll(ScrollBar4,DeltaC);
  232.   ChangeScroll(ScrollBar5,DeltaD);
  233.   Changing:=False;
  234.   Fill;
  235.   With Chart1.View3DOptions do
  236.   begin
  237.     Rotation:=Rotation+1;
  238.     if Rotation>360 then Rotation:=Rotation-360;
  239.   end;
  240.   Timer1.Enabled:=True;
  241. end;
  242.  
  243. procedure TOpenGLSurface.CheckBox1Click(Sender: TObject);
  244. begin
  245.   Timer1.Enabled:=CheckBox1.Checked;
  246. end;
  247.  
  248. procedure TOpenGLSurface.CheckBox3Click(Sender: TObject);
  249. begin
  250.   Chart1.View3DWalls:=CheckBox3.Checked;
  251. end;
  252.  
  253. procedure TOpenGLSurface.CheckBox4Click(Sender: TObject);
  254. begin
  255.   Series1.Pen.Visible:=CheckBox4.Checked
  256. end;
  257.  
  258. procedure TOpenGLSurface.RadioGroup1Click(Sender: TObject);
  259. begin
  260.   Formula:=RadioGroup1.ItemIndex;
  261.   Fill;
  262. end;
  263.  
  264. procedure TOpenGLSurface.CheckBox5Click(Sender: TObject);
  265. begin
  266.   Chart1.AxisVisible:=CheckBox5.Checked
  267. end;
  268.  
  269. procedure TOpenGLSurface.CheckBox6Click(Sender: TObject);
  270. begin
  271.   Series1.WireFrame:=not CheckBox6.Checked
  272. end;
  273.  
  274. procedure TOpenGLSurface.CheckBox2Click(Sender: TObject);
  275. begin
  276.   Series1.UsePalette:=CheckBox2.Checked;
  277.   Series1.UseColorRange:=not CheckBox2.Checked;
  278. end;
  279.  
  280. procedure TOpenGLSurface.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
  281. begin
  282.   Timer1.Enabled:=False;
  283. end;
  284.  
  285. { change the light "spot" parameter... }
  286. procedure TOpenGLSurface.TrackBar1Change(Sender: TObject);
  287. begin
  288.   TeeDefaultLightSpot:=TrackBar1.Position;
  289.   if TeeDefaultLightSpot=91 then TeeDefaultLightSpot:=180;
  290.   Chart1.Repaint;
  291. end;
  292.  
  293. initialization
  294.   RegisterClass(TOpenGLSurface);
  295. end.
  296.