You can subscribe to this list here.
2000 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
(18) |
Oct
(33) |
Nov
(27) |
Dec
(26) |
---|---|---|---|---|---|---|---|---|---|---|---|---|
2001 |
Jan
(22) |
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(46) |
Sep
|
Oct
|
Nov
|
Dec
|
2002 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
(1) |
Dec
|
2008 |
Jan
|
Feb
|
Mar
|
Apr
(13) |
May
(7) |
Jun
(9) |
Jul
(23) |
Aug
(5) |
Sep
(4) |
Oct
(6) |
Nov
(1) |
Dec
|
2009 |
Jan
(1) |
Feb
|
Mar
|
Apr
|
May
(2) |
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2010 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
From: Darryl L. <py...@us...> - 2000-11-06 21:55:31
|
Update of /cvsroot/pythianproject//GLForm In directory slayer.i.sourceforge.net:/tmp/cvs-serv28729 Log Message: no message Status: Vendor Tag: avendor Release Tags: arelease N GLForm/GLFormTest.res N GLForm/GLFormTest.dpr N GLForm/GLForms.pas N GLForm/Main.pas N GLForm/Main.dfm N GLForm/GLFormTest.dof N GLForm/GLFormTest.cfg N GLForm/debug.txt N GLForm/pythiancvs/prototypes/glform/GLFormTest.cfg N GLForm/pythiancvs/prototypes/glform/GLFormTest.dof N GLForm/pythiancvs/prototypes/glform/GLFormTest.dpr N GLForm/pythiancvs/prototypes/glform/GLFormTest.res N GLForm/pythiancvs/prototypes/glform/GLForms.pas N GLForm/pythiancvs/prototypes/glform/Main.dfm N GLForm/pythiancvs/prototypes/glform/Main.pas N GLForm/pythiancvs/prototypes/glform/debug.txt No conflicts created by this import ***** Bogus filespec: - ***** Bogus filespec: Imported ***** Bogus filespec: sources |
From: Darryl L. <py...@us...> - 2000-11-06 21:54:03
|
Update of /cvsroot/pythianproject//pythiancvs/prototypes/glform In directory slayer.i.sourceforge.net:/tmp/cvs-serv28478 Log Message: no message Status: Vendor Tag: avendor Release Tags: arelease N pythiancvs/prototypes/glform/GLFormTest.res N pythiancvs/prototypes/glform/GLFormTest.dpr N pythiancvs/prototypes/glform/GLForms.pas N pythiancvs/prototypes/glform/Main.pas N pythiancvs/prototypes/glform/Main.dfm N pythiancvs/prototypes/glform/GLFormTest.dof N pythiancvs/prototypes/glform/GLFormTest.cfg N pythiancvs/prototypes/glform/debug.txt No conflicts created by this import ***** Bogus filespec: - ***** Bogus filespec: Imported ***** Bogus filespec: sources |
From: Michael H. <mh...@us...> - 2000-11-04 21:56:22
|
Update of /cvsroot/pythianproject/Prototypes/GLCanvas In directory slayer.i.sourceforge.net:/tmp/cvs-serv4722/GLCanvas Log Message: Directory /cvsroot/pythianproject/Prototypes/GLCanvas added to the repository |
From: Kamil K. <kkr...@us...> - 2000-10-27 20:02:32
|
Update of /cvsroot/pythianproject/PythianProject/Source/Units In directory slayer.i.sourceforge.net:/tmp/cvs-serv31077 Added Files: vglcanvas.pas Log Message: @kk --- NEW FILE --- unit vglcanvas; { ****************************************************************** ** Visual GL ** ** Version 0.1 ** ** ** ** Here will be our licence!!! ** ****************************************************************** Authors: Kamil Krauspe - basic ideas and definitions History: 27.10.00 - (@@kk) first definitions, fundamentals and ideas, To do: **** don't have time to write everything what should be done } interface uses Points, OpenGL, Classes; const // Visual GL - basic commands VGL_LINE = $000A; VGL_RECT = $000B; VGL_TRIANGLE = $000C; // Visual GL - basic properties change commands VGL_FONTCHANGE = $005A; VGL_COLORCHANGE = $005B; VGL_PENCHANGE = $005C; VGL_BRUSHCHANGE = $005D; // Return codes VGL_OK = 0; VGL_ERROR = - 1; type // Visual GL - classes TvglUObj = class; TvglFont = class; TvglColor = class; // !!!!!!!! TODO TvglPen = class; !!!!!!!! // !!!!!!!! TODO TvglBrush = class; !!!!!!!!! TvglCommandList = class; TvglCanvas = class; // Visual GL - command structures Pvgl_TRIANGLE_STRUCT = ^Tvgl_TRIANGLE_STRUCT; Pvgl_LINE_STRUCT = ^Tvgl_LINE_STRUCT; Pvgl_RECT_STRUCT = ^Tvgl_RECT_STRUCT; Pvgl_FONT_CHANGE_STRUCT = ^Tvgl_FONT_CHANGE_STRUCT; Pvgl_COLOR_CHANGE_STRUCT = ^Tvgl_COLOR_CHANGE_STRUCT; Tvgl_FONT_CHANGE_STRUCT = record // used internaly FontNumber, Effects: Integer; Size, AspectRatio: Single; end; Tvgl_COLOR_CHANGE_STRUCT = record Data: TByteColor; end; Tvgl_LINE_STRUCT = record Pa, Pb: TPoint3D; end; Tvgl_RECT_STRUCT = record Pa, Pb, Pc, Pd: TPoint3D; end; Tvgl_TRIANGLE_STRUCT = record Pa, Pb, Pc: TPoint3D; end; TvglUObj = class(TPersistent) protected FCanvas: TvglCanvas; public constructor Create(ACanvas: TvglCanvas); virtual; procedure Update; virtual; abstract; end; TvglFont = class(TvglUObj) private FEffects: Integer; FFontNumber: Integer; FAspectRatio: Single; FSize: Single; procedure SetAspectRatio(const Value: Single); procedure SetEffects(const Value: Integer); procedure SetFontNumber(const Value: Integer); procedure SetSize(const Value: Single); protected procedure AssignTo(Dest: TPersistent); override; public procedure UseFont(const Data: Pvgl_FONT_CHANGE_STRUCT); virtual; constructor Create(ACanvas: TvglCanvas); override; destructor Destroy; override; procedure Update; override; property FontNumber: Integer read FFontNumber write SetFontNumber; property Effects: Integer read FEffects write SetEffects; property Size: Single read FSize write SetSize; property AspectRatio: Single read FAspectRatio write SetAspectRatio; // x:y size - aspect ratio // ??? use color here, too or will be using color of pen and brush end; TvglColor = class(TvglUObj) protected FAsByteColor: TByteColor; procedure SetAsByteColor(const Value: TByteColor); procedure SetAsGLColor(const Value: TGLColor); procedure AssignTo(Dest: TPersistent); override; function GetAsGLColor: TGLColor; public procedure UseColor(const Data: Pvgl_COLOR_CHANGE_STRUCT); virtual; procedure SetValue(R, G, B, A: Single); overload; procedure SetValue(R, G, B, A: Byte); overload; constructor Create(ACanvas: TvglCanvas); override; destructor Destroy; override; procedure Update; override; property AsGLColor: TGLColor read GetAsGLColor write SetAsGLColor; property AsByteColor: TByteColor read FAsByteColor write SetAsByteColor; end; TvglCommandTwin = record ID: Integer; Data: Pointer; end; TvglCommandList = class protected FCommands: array of TvglCommandTwin; function GetCount: Integer; procedure FreeItems; public constructor Create; virtual; destructor Destroy; override; function Enqueue(AID: Integer; Data: Pointer): Integer; overload; // appends a command onto FCommands array function Pop(ADelete: Boolean): TvglCommandTwin; // returns (and deletes) first Command form FCommands function GetItem(AIndex: Integer): TvglCommandTwin; // returns item at AIndex function DeleteItem(AIndex: Integer): Integer; // deletes item at AIndex property Count: Integer read GetCount; end; TvglCanvas = class protected FCommands: TvglCommandList; FFont: TvglFont; procedure DrawRectangle(const Data: Pvgl_RECT_STRUCT); virtual; procedure DrawTriangle(const Data: Pvgl_TRIANGLE_STRUCT); virtual; procedure DrawLine(const Data: Pvgl_LINE_STRUCT); virtual; procedure ProcessItem(const AItem: TvglCommandTwin); virtual; public procedure Draw; virtual; constructor Create; virtual; destructor Destroy; override; procedure Rectangle(APa, APb, APc, APd: TPoint3D); procedure Triangle(APa, APb, APc: TPoint3D); procedure Line(APa, APb: TPoint3D); property Font: TvglFont read FFont; // TODO: add another public declarations end; implementation const VGL_BYTE2GL = 1 / 255; VGL_GL2BYTE = 255; { TvglUObj } constructor TvglUObj.Create(ACanvas: TvglCanvas); begin inherited Create; FCanvas := ACanvas; end; { TvglFont } procedure TvglFont.AssignTo(Dest: TPersistent); begin if Dest is TvglFont then begin TvglFont(Dest).FEffects := FEffects; TvglFont(Dest).FFontNumber := FFontNumber; TvglFont(Dest).FAspectRatio := FAspectRatio; TvglFont(Dest).FSize := FSize; end else inherited; // trigger TPersistent.AssignTo(Dest) -> Raise Exception end; constructor TvglFont.Create(ACanvas: TvglCanvas); begin inherited Create(ACanvas); FEffects := 0; FFontNumber := 0; FAspectRatio := 1; FSize := 1; end; destructor TvglFont.Destroy; begin // inherited Destroy; end; procedure TvglFont.SetAspectRatio(const Value: Single); begin FAspectRatio := Value; end; procedure TvglFont.SetEffects(const Value: Integer); begin FEffects := Value; end; procedure TvglFont.SetFontNumber(const Value: Integer); begin FFontNumber := Value; end; procedure TvglFont.SetSize(const Value: Single); begin FSize := Value; end; procedure TvglFont.Update; var ACmd: Pvgl_FONT_CHANGE_STRUCT; begin New(ACmd); ACmd^.FontNumber := FFontNumber; ACmd^.Effects := FEffects; ACmd^.Size := FSize; ACmd^.AspectRatio := FAspectRatio; FCanvas.FCommands.Enqueue(VGL_FONTCHANGE, ACmd); end; procedure TvglFont.UseFont(const Data: Pvgl_FONT_CHANGE_STRUCT); begin // changes the Font (in processing/drawing time) - something like DrawLine... end; { TvglColor } procedure TvglColor.AssignTo(Dest: TPersistent); begin if Dest is TvglColor then begin TvglColor(Dest).FAsByteColor := FAsByteColor; end else inherited; // trigger TPersistent.AssignTo(Dest) -> Raise Exception end; constructor TvglColor.Create(ACanvas: TvglCanvas); begin inherited Create(ACanvas); FillChar(FAsByteColor, SizeOf(FAsByteColor){4 i think}, 0); end; destructor TvglColor.Destroy; begin // inherited; end; function TvglColor.GetAsGLColor: TGLColor; begin Result[0] := FAsByteColor[0] * VGL_BYTE2GL; Result[1] := FAsByteColor[1] * VGL_BYTE2GL; Result[2] := FAsByteColor[2] * VGL_BYTE2GL; Result[3] := FAsByteColor[3] * VGL_BYTE2GL; end; procedure TvglColor.SetAsByteColor(const Value: TByteColor); begin FAsByteColor := Value; end; procedure TvglColor.SetAsGLColor(const Value: TGLColor); begin FAsByteColor[0] := Round(Value[0] * VGL_GL2BYTE); FAsByteColor[1] := Round(Value[1] * VGL_GL2BYTE); FAsByteColor[2] := Round(Value[2] * VGL_GL2BYTE); FAsByteColor[3] := Round(Value[3] * VGL_GL2BYTE); end; procedure TvglColor.SetValue(R, G, B, A: Single); begin SetAsGLColor(MakeGLColor(R, G, B, A)); end; procedure TvglColor.SetValue(R, G, B, A: Byte); begin FAsByteColor[0] := R; FAsByteColor[1] := G; FAsByteColor[2] := B; FAsByteColor[3] := A; end; procedure TvglColor.Update; var ACmd: Pvgl_COLOR_CHANGE_STRUCT; begin New(ACmd); ACmd^.Data := FAsByteColor; FCanvas.FCommands.Enqueue(VGL_COLORCHANGE, ACmd); end; procedure TvglColor.UseColor(const Data: Pvgl_COLOR_CHANGE_STRUCT); begin // changes color: Is this OK? glColor4bv(@Data^.Data[0]); end; { TvglCommandList } constructor TvglCommandList.Create; begin inherited Create; SetLength(FCommands, 0); end; function TvglCommandList.DeleteItem(AIndex: Integer): Integer; var i, ACount: Integer; begin Result := VGL_ERROR; ACount := Length(FCommands); if AIndex >= ACount then Exit; if AIndex = ACount - 1 then SetLength(FCommands, AIndex) else begin i := (ACount - AIndex - 1) * SizeOf(TvglCommandTwin);; // moving could be done with Copy function, but this is better and faster Move(FCommands[AIndex + 1], FCommands[AIndex], i); SetLength(FCommands, ACount - 1); end; Result := VGL_OK; end; destructor TvglCommandList.Destroy; begin FreeItems; inherited; end; function TvglCommandList.Enqueue(AID: Integer; Data: Pointer): Integer; var AIndex: Integer; begin Result := VGL_ERROR; if Data = nil then Exit; AIndex := Length(FCommands); SetLength(FCommands, AIndex + 1); FCommands[AIndex].ID := AID; FCommands[AIndex].Data := Data; Result := VGL_OK; end; procedure TvglCommandList.FreeItems; var i: Integer; begin for i := 0 to Length(FCommands) - 1 do if FCommands[i].Data <> nil then Dispose(FCommands[i].Data); SetLength(FCommands, 0); end; function TvglCommandList.GetCount: Integer; begin Result := Length(FCommands); end; function TvglCommandList.GetItem(AIndex: Integer): TvglCommandTwin; begin if AIndex < GetCount then Result := FCommands[AIndex] else begin Result.Data := nil; Result.ID := VGL_ERROR; end; end; function TvglCommandList.Pop(ADelete: Boolean): TvglCommandTwin; begin Result := GetItem(0); if ADelete and (Result.ID <> VGL_ERROR) then DeleteItem(0); end; { TvglCanvas } constructor TvglCanvas.Create; begin inherited Create; FFont := TvglFont.Create(Self); FCommands := TvglCommandList.Create; end; destructor TvglCanvas.Destroy; begin FFont.Free; FCommands.Free; inherited Destroy; end; procedure TvglCanvas.Draw; var D: TvglCommandTwin; begin D := FCommands.Pop(True); while (D.Data <> nil) and (D.ID <> VGL_ERROR) do begin ProcessItem(D); D := FCommands.Pop(True); end; end; procedure TvglCanvas.DrawLine(const Data: Pvgl_LINE_STRUCT); begin // Don't know much about OpenGL, is this OK? glBegin(GL_LINES); glVertex3f(Data^.Pa.X, Data^.Pa.Y, Data^.Pa.Z); // Point A glVertex3f(Data^.Pb.X, Data^.Pb.Y, Data^.Pb.Z); // Point B glEnd; end; procedure TvglCanvas.DrawRectangle(const Data: Pvgl_RECT_STRUCT); begin // Don't know much about OpenGL, is this OK? glBegin(GL_QUADS); glVertex3f(Data^.Pa.X, Data^.Pa.Y, Data^.Pa.Z); // Point A glVertex3f(Data^.Pb.X, Data^.Pb.Y, Data^.Pb.Z); // Point B glVertex3f(Data^.Pc.X, Data^.Pc.Y, Data^.Pc.Z); // Point C glVertex3f(Data^.Pd.X, Data^.Pd.Y, Data^.Pd.Z); // Point D glEnd; end; procedure TvglCanvas.DrawTriangle(const Data: Pvgl_TRIANGLE_STRUCT); begin // Don't know much about OpenGL, is this OK? glBegin(GL_TRIANGLES); glVertex3f(Data^.Pa.X, Data^.Pa.Y, Data^.Pa.Z); // Point A glVertex3f(Data^.Pb.X, Data^.Pb.Y, Data^.Pb.Z); // Point B glVertex3f(Data^.Pc.X, Data^.Pc.Y, Data^.Pc.Z); // Point C glEnd; end; procedure TvglCanvas.Line(APa, APb: TPoint3D); var ACmd: Pvgl_LINE_STRUCT; begin New(ACmd); ACmd^.Pa := APa; ACmd^.Pb := APb; FCommands.Enqueue(VGL_LINE, ACmd); end; procedure TvglCanvas.ProcessItem(const AItem: TvglCommandTwin); begin case AItem.ID of VGL_LINE: DrawLine(AItem.Data); VGL_RECT: DrawRectangle(AItem.Data); VGL_TRIANGLE: DrawTriangle(AItem.Data); VGL_FONTCHANGE: FFont.UseFont(AItem.Data); VGL_COLORCHANGE: {Color.UseColor(AItem.Data)}; VGL_PENCHANGE:; VGL_BRUSHCHANGE:; end; end; procedure TvglCanvas.Rectangle(APa, APb, APc, APd: TPoint3D); var ACmd: Pvgl_RECT_STRUCT; begin New(ACmd); ACmd^.Pa := APa; ACmd^.Pb := APb; ACmd^.Pc := APc; ACmd^.Pd := APd; FCommands.Enqueue(VGL_RECT, ACmd); end; procedure TvglCanvas.Triangle(APa, APb, APc: TPoint3D); var ACmd: Pvgl_TRIANGLE_STRUCT; begin New(ACmd); ACmd^.Pa := APa; ACmd^.Pb := APb; ACmd^.Pc := APc; FCommands.Enqueue(VGL_TRIANGLE, ACmd); end; end. |
From: Michael H. <mh...@us...> - 2000-10-26 17:16:18
|
Update of /cvsroot/pythianproject/Prototypes/GLBitmapDemo In directory slayer.i.sourceforge.net:/tmp/cvs-serv7229 Added Files: GLBitmapTutorial.html frmMain.dfm frmMain.pas gadgetcollage.bmp glBitmapDemo.dpr Log Message: added GLBitmapDemo --- NEW FILE --- <html> <head> <meta http-equiv="Content-Language" content="en-gb"> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"> <meta name="GENERATOR" content="Microsoft FrontPage 4.0"> <meta name="ProgId" content="FrontPage.Editor.Document"> <title>OpenGL Bitmaps tutorial</title> </head> <body> <p>This tutorial will hopefully explain to you how to display colour bitmaps of any size in OpenGL, using the glDrawPixels() command. It will also teach you how to use a separate alpha bitmap to let you define transparent areas in the picture. There are several ways of displaying pictures in a GL window, the one that I found to be mentioned most often is using a textured quad, but this has several disadvantages not least of which is the 256x256 size limitation. So, how do you load and draw bitmaps of any size into the frame buffer?</p> <p>The first problem we encounter is the fact that OpenGL does not have any support for the BMP file format used in Windows, or any file format for that matter. The glDrawPixels command is fairly simple, it takes a pointer to some memory, the image size and the way the image is layed out in memory (i'll look at this in a minute). So how do you load pictures? Well, you could read the picture file directly but this is a pain and means that you can't use libraries to use new file formats. Here's the solution I came up with, just load the file using and library you want (in Delphi this means the VCL TBitmap object) and then use the GetPixel routines to retrieve each pixel one at a time, placing it into the memory buffer at the correct location. I can hear some of you scream now about how inefficient that is, but remember we only have to do this once when we first load the bitmap, and if you'd like to make the routine more efficient then that's fine but for now simplicity is my aim. So, we first load the bitmap and allocate the memory buffer:</p> <p><code>var bmp: TBitmap;<br> PixData :Pointer;</code></p> <p><code>bmp := TBitmap.Create;<br> bmp.LoadFromFile("picture.bmp");<br> <br> PixData := AllocMem( (bmp.Width * bmp.Height) * 3 ); // multiply by 3 because of RGB data<br> </code></p> <p>Notice that I said, "in the correct location" in the previous paragraph. This is something that took me a while to clock, but OpenGL draws bitmap data from the bottom left corner, not the top left. Obviously this means that when we load the picture we need to place the top left pixel of the bitmap file into the bottom left pixel of the memory :( OK, I'm going to show you the code that translates an X, Y position in the bitmap to a pixel offset. I'll take you through it one step at a time.</p> <p><code>oy := (PxHeight-1) - oy; // now y is OK<br> pxoffset := ox;<br> <br> if oy > 0 then<br> pxoffset := pxoffset + (oy*PxWidth);<br> <br> pxoffset := pxoffset * 3; // move into position for RGB data</code></p> <p><br> Here, OX and OY are the positions we want to translate and pxoffset is the result. The first thing we do is invert oy, to take into account the difference in opinion about where bitmap origins should be located. The reason we take 1 from PxHeight before subtracting OY is because measurements of height/width are not usually zero based. We assign x to pxOffset, then check that oy > 0 , because if it is we need to do some more work. We simply multiply oy by PxWidth to account for all the rows we've "skipped". Finally, we multiple the result by 3 because in fact each pixel takes 3 bytes, not 1 (for the red, green, blue components right?) Sorry, I know that's not a very good explanation but you get the general idea.</p> <p>Ok, so here's the loop that does the work:</p> <p><code>for y := 0 to pxHeight-1 do<br> begin<br> for x := 0 to pxWidth-1 do<br> begin<br> c := b.Canvas.Pixels[x,y];<br> red := TColorQuad(c)[0];<br> green := TColorQuad(c)[1];<br> blue := TColorQuad(c)[2];<br> <br> pd^[ XYToOffset(x,y) + 0 ] := red;<br> pd^[ XYToOffset(x,y) + 1 ] := green;<br> pd^[ XYToOffset(x,y) + 2 ] := blue;<br> end;<br> end;</code></p> <p>As you can see, the loop goes through each pixel in turn. The TColorQuad stuff is just to extract the separate rgb components from the Delphi TColor type. Once we have this, we assign each component to the offset + 0, 1 or 2. Now pd points to the pixel data OpenGL can accept. One more thing before we draw, this line must be added to the OpenGL init code:</p> <p><code>glPixelStorei(GL_UNPACK_ALIGNMENT, 1);</code></p> <p>This tells OpenGL that the data is aligned to every 1 byte (ie isn't aligned). The reason for this is because some processors are optimised for accessing data on certain byte alignments so if you're willing to use a bit more memory you can improve the time required for the card to access your pixel data by aligning it to every 4/8/16 bytes or whatever and telling OpenGL about it here.</p> <p>Finally, we need to actually DRAW the damn thing :) The location that we draw the bitmap to is controlled by something called the raster position. This is simply a point which OpenGL maintains like any other vertex and that can be moved around using the glRasterPos commands. Because it's a point it's affected by matrix transformations though, so you can scale it and rotate it, but remember that this won't scale or rotate your image, just its starting point. Remember also that the bitmap will be drawn upwards, not downwards.</p> <p><code>glDrawPixels(pxWidth,pxHeight,GL_RGB,GL_UNSIGNED_BYTE,pd);</code></p> <p>This says, draw a bitmap of width pxWidth, height pxHeight, pixel type "red, then green, then blue" and that each pixel is represented by an unsigned byte. Finally, we give it the pointer to the pixel data! There, that wasn't too hard was it? </p> <p>The reason we need to tell the GL that we're using unsigned bytes is because pixel data can be represented in numerous ways. Not only can you use bytes for RGB data in the usual way, but you can also use floats and integers like other GL commands. Data can be stored as RGB data, colour index data (you need to be in colour index mode for this), RGBA (like RGB but with an additional alpha component), depth data (you can write to any of the GL buffers using this command), stencil indexes (see the excellent NeHe tutorial on stencil buffers if you're curious at <a href="http://nehe.gamedev.net/opengl.asp">http://nehe.gamedev.net/opengl.asp</a>, luminance (the weighted sum of the RGB components) and that's just a selection.</p> <p>You can magnify, reduce and flip your image using the glPixelZoom() command. This lets you specify a magnification factor for each axis - so a zoom with x and y equal to 2.0 would map each pixel to 4 pixels. Fractional zoom factors are allowed, as are negative factors, and these are what flip the image.</p> <p>Finally, by modifying the code you can easily add in alpha transparency to your images (although I haven't tried this). To do this load two images, one which is the normal image and another (still 24bit) image that is greyscale and defines the alpha channel. By this I mean that each pixel in the new image maps to the alpha value of each pixel in the original bitmap. An alpha bitmap is white to mean totally opaque, black to mean transparent and shades of gray to represent partially see-through. Once you've made the alpha bitmap you make the following modifications:</p> <p><code>for y := 0 to pxHeight-1 do<br> begin<br> for x := 0 to pxWidth-1 do<br> begin<br> c := b.Canvas.Pixels[x,y];<br> red := TColorQuad(c)[0];<br> green := TColorQuad(c)[1];<br> blue := TColorQuad(c)[2];<br> <br> alpha = alphabmp.Canvas.Pixels[x,y]; { NEW }<br> <br> pd^[ XYToOffset(x,y) + 0 ] := red;<br> pd^[ XYToOffset(x,y) + 1 ] := green;<br> pd^[ XYToOffset(x,y) + 2 ] := blue;<br> pd^[ XYToOffset(x,y) + 3 ] := alpha; { NEW }<br> end;<br> end;</code></p> <p><code>--------------------------------------------------<br> <br> glDrawPixels(pxWidth,pxHeight,GL_RGBA,GL_UNSIGNED_BYTE,pd); { GL_RGBA changed }</code></p> <p><code>--------------------------------------------------<br> <br> </code><code>oy := (PxHeight-1) - oy; // now y is OK<br> pxoffset := ox;<br> <br> if oy > 0 then<br> pxoffset := pxoffset + (oy*PxWidth);<br> <br> pxoffset := pxoffset * 4; // move into position for RGBA data, 4 components now</code></p> <p><code>--------------------------------------------------<br> </code></p> <p><code>// allocate enough memory for the new component<br> PixData := AllocMem( (bmp.Width * bmp.Height) * 4 ); // multiply by 4 because of RGBA data</code></p> <p> </p> <p>I hope this tutorial has helped you understand how to draw bitmaps and how to do some more advanced things with them.</p> <p>-mike </p> <p><a href="mailto:mh...@su...">mh...@su...</a></p> <p> </p> </body> </html> --- NEW FILE --- ÿ Font.ColorclWindowTextFont.Heightõ Font.Name MS Sans Serif Font.Style TextHeight Exit1Click FrameTimerIntervalOnTimerFrameTimerTimerLeft --- NEW FILE --- unit frmMain; { GL Bitmap demo (C) Michael Hearn 2000 mh...@su... } interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, GLPanel, OpenGL, Textures, Trace; type { This demo shows how to write pixel data from a bitmap file directly to the frame buffer - no need to worry about textures etc. However, it is horribly inefficient, in a better implementation the pixel data would be read directly from the bitmap file like in the TTexture object. However, for simplicity I will use the slow but easy to understand GetPixel routines to make a copy of the bitmap. } // we use this to store the pixel data from a bitmap TPixelData = TByteArray; PPixelData = ^TPixelData; TMainForm = class(TForm) GLPanel: TGLPanel; MainMenu: TMainMenu; File1: TMenuItem; Exit1: TMenuItem; FrameTimer: TTimer; procedure FrameTimerTimer(Sender: TObject); procedure GLPanelGLInit(Sender: TObject); procedure GLPanelResize(Sender: TObject); procedure GLPanelGLDraw(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } public { Public declarations } // Animation trackers can go here animSquare: integer; // this var will be cycled through 1..360 // which states the angle of the square. By // incrementing this every frame we can create // a rotating square :) Px :PPixelData; PxWidth, PxHeight :integer; procedure SetProjection(Sender: TObject); function BmpToPixelData(filename:string):PPixelData; end; var MainForm: TMainForm; implementation {$R *.DFM} procedure TMainForm.FrameTimerTimer(Sender: TObject); begin { Add code to advance animations etc. here } inc(animSquare); if animSquare >= 360 then animSquare := 0; // now redraw the screen GLPanel.GLReDraw; end; procedure TMainForm.SetProjection(Sender: TObject); var gldAspect : TGLdouble; begin // Redefine the viewing volume and viewport when the window size changes. gldAspect := GLPanel.Width / GLPanel.Height; glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(30.0, // Field-of-view angle gldAspect, // Aspect ratio of viewing volume 1.0, // Distance to near clipping plane 100.0); // Distance to far clipping plane glViewport(0, 0, GLPanel.Width, GLPanel.Height); InvalidateRect(Handle, nil, False); end; procedure TMainForm.GLPanelGLInit(Sender: TObject); begin // Add GL init code here // Any enable/disable commands that affect the entire app should go here // // Enable depth testing and alpha blending // glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE); // uncomment this line to enable alpha blending try Px := BmpToPixelData('gadgetcollage.bmp'); // go gadget go! except on E:Exception do begin ShowMessage('BmpToPixelData() failed: '+e.message); px := nil; end; end; glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glDisable(GL_STENCIL_TEST); end; procedure TMainForm.GLPanelResize(Sender: TObject); begin SetProjection(Sender); // this sets up the view // init any variables here animSquare := 0; end; procedure TMainForm.GLPanelGLDraw(Sender: TObject); begin // // Clear the color and depth buffers. // glClearColor(0.0,0.0,0.0,1.0); // clear to black glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // reset the matrix to it's identity (original, unmodified) matrix glMatrixMode(GL_PROJECTION); glLoadIdentity; glMatrixMode(GL_MODELVIEW); glLoadIdentity; { ADD YOUR DRAWING CODE HERE } // scale and rotate glScalef(0.5,0.5,0.5); glRotatef(animSquare,0.0,1.0,0.5); // // Draw the six faces of the cube. // glDisable(GL_BLEND); glColor4f(1.0,0.0,0.0,1.0); glBegin(GL_POLYGON); glNormal3f(0.0, 0.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(-1.0, -1.0, 1.0); glVertex3f(1.0, -1.0, 1.0); glEnd; glColor4f(0.0,1.0,0.0,1.0); glBegin(GL_POLYGON); glNormal3f(0.0, 0.0, -1.0); glVertex3f(1.0, 1.0, -1.0); glVertex3f(1.0, -1.0, -1.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(-1.0, 1.0, -1.0); glEnd; glColor4f(0.0,0.0,1.0,1.0); glBegin(GL_POLYGON); glNormal3f(-1.0, 0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(-1.0, -1.0, 1.0); glEnd; glColor4f(0.0,1.0,1.0,1.0); glBegin(GL_POLYGON); glNormal3f(1.0, 0.0, 0.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(1.0, -1.0, 1.0); glVertex3f(1.0, -1.0, -1.0); glVertex3f(1.0, 1.0, -1.0); glEnd; glColor4f(1.0,1.0,0.0,1.0); glBegin(GL_POLYGON); glNormal3f(0.0, 1.0, 0.0); glVertex3f(-1.0, 1.0, -1.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(1.0, 1.0, -1.0); glEnd; glColor4f(1.0,1.0,1.0,0.75); glBegin(GL_POLYGON); glNormal3f(0.0, -1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(1.0, -1.0, -1.0); glVertex3f(1.0, -1.0, 1.0); glVertex3f(-1.0, -1.0, 1.0); glEnd; // add bitmap code here // px contains our data in RGB format 8bit per component, 24 bits pp glLoadIdentity; glRasterPos2d(-1,-1); glClear(GL_DEPTH_BUFFER_BIT); glDisable(GL_DEPTH_TEST); if px <> nil then glDrawPixels(pxWidth,pxHeight,GL_RGB,GL_UNSIGNED_BYTE,px); glEnable(GL_DEPTH_TEST); end; procedure TMainForm.Exit1Click(Sender: TObject); begin Close; end; function TMainForm.BmpToPixelData(filename: string):PPixelData; type TColorQuad = array[0..3] of byte; var b:TBitmap; pd :PPixelData; x,y:integer; c:TColor; red,green,blue:byte; function XYToOffset(ox,oy:integer):integer; var pxoffset:integer; begin { 0 1 2 3 4 5 6 7 8 9 PxWidth=10 0 X X X X X X X X X X PxHeight=3 1 X X X X X X X X X X 2 X X X X X X X X X X } pxoffset := 0; oy := (PxHeight-1) - oy; // now y is OK pxoffset := ox; if oy > 0 then begin pxoffset := pxoffset + (oy*(PxWidth){-1}) {+ 1}; end; pxoffset := pxoffset * 3; // move into position for RGB data Result := pxoffset; end; begin Result := nil; b := TBitmap.Create; b.LoadFromFile(filename); pxWidth := b.Width; pxHeight := b.Height; // allocate memory for it, assume RGB data (3 components) pd := AllocMem( (b.Width*b.Height)*3 ); // now for the inefficient bit - copying the data pixel by pixel // from the Win32 GDI to our own data structure. for y := 0 to pxHeight-1 do begin for x := 0 to pxWidth-1 do begin c := b.Canvas.Pixels[x,y]; red := TColorQuad(c)[0]; green := TColorQuad(c)[1]; blue := TColorQuad(c)[2]; pd^[ XYToOffset(x,y) + 0 ] := red; pd^[ XYToOffset(x,y) + 1 ] := green; pd^[ XYToOffset(x,y) + 2 ] := blue; end; end; b.Free; Result := pd; end; procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); begin if assigned(px) then FreeMem(px); end; end. --- NEW FILE --- BMV D'L/(9Y=6X>7]B8eH?^>3\8.rL@|UFsK8ZDc8%oD5|OD]4+a;6hD>Y5/]80kB9xNA{Q>tN6zU;dJmUtM7cQVD QAl;+wJ=kD6^:0eB8fB<Q-'S0,X83^?<O62?0-ÿüøÿÿüÿÿüýýýøúúüþÿýÿÿþýÿþýÿÿýÿÿýÿÿýÿÿýÿþþþþÿýýÿþ÷ûöÿÿüüýù÷üûúÿÿñôùýüÿÿúÿþ÷ÿÿûÿýüÿÿþÿþøù{~ÿÞÚWD´^ÿÝÿß ÿçzÿìwÿÙeóÍ]úÔnÿâùà~úä~ÿëÿçyúÞrÿæ{ÿã}þÖpöÓqÿà}ÿåüÞyþÝvñÏk÷ÖuÿãûÜúØÿÙÿÖÿ×~ÿÞ|ÿåÿâþÓrûÎlþÔqøÖrúáyòÝtÿãzÿàO( SAY;(-"cfM¢¨üýûïìõøôÿëçóíçøðëúüøÿýúÿ÷öúûúþýùÿüøÿÿþÿÿýÿöïôùöøï÷÷ëöôÿýÿæóÿFn*mÒÿÛÿÎüwÉøwÉùÒÿÜÿyÀòÇÿÉÿ|ÂøÚÿÇùÎþyÂôÒÿËÿÓÿÎÿËÿ ÐÿÉùÆõÔÿÚÿËüL«|ÍÑúÿÛúÿìÿÿïþÿóÿÿíÿÿäÿÿÔüûÑÿÿÅþýÊÿÿ»÷÷ÆþÿÈÿÿ»ÿÿ¨òôËÿÿÅýÿ»üÿØóXrX~*r²NæpÃÿwËÿrÅøØÿÐùÑÿyÃûÔÿËÿ,n¡g²æpÆü" ¿5ÎâÿÕÿRÅOÎS¥íc h¿á®ÿÿ´üÿºÿÿºüÿ¸ûþ¾ÿÿºúþ»øüÆÿÿÄÿÿ¿üøÆÿþÌÿÿÕúÿÒõÿsçQ¬Pê+{ÎmÄ+|Ñ?Ù6Ò#iÎ%iÒ(nÉ*qÉ>|à.lÖ#bÔZÍ dÕ*lÕ0nÌ8xÍ0sÊ0uÌ$hÁc¼%jÇ$iÆ[¸a½>zÓD}ØGè/hÃ<s°I Z@4nTD\>+T/wM:¤ugdXpeYQriyWJmM@iY[D5n[N\MDYOHG@=@>=fhhµº¹¤¢¬µ«¨¤OJGTDEcGFd?;sIBi<1tK<pM9W7 R3^<%d?+\3$_5(f>2^:0V4.ÿöòÿóóÊÆÅ¡ ~skdrifjegWSYijntvwb`_ZXWWTVJFQE?VPKh3 'uÜÐäÿùÿÿûÿû÷ýÿúÿÿúÿùòÿÿøÿçÙëndS`ÿ÷ÿÿýÿÿùúÿýÿÿõýiFJIüɯÿÕÿÚøÖrñÖhüâxøßyîÐqõÔwÿàôÔpñÖgûãqÿé|ÿéÿçÿæÿáÿå~ÿÞqðÏbýÝtÿà}ÿãÿæýà~üß|ÿáþÞ}øØuþÞzÿæÿå|ÿâtÿçzÿäâÇ}9) xty½¼¾ÚßÝÊÑÌÉÐÍÒ×ÖÐÑÕÊÇÐÍÊÓÐÐÖÑÕÖÕÜÙÉÓÍËÒÏÐÑÕËÎÖÛèöÒÔÞF-)a<4D%$@!$J%'N&'U*'T,'H'$G*&S3-E%T61N3/5 ¢ÊÆÅ{}}§¡RZPKB96 O--b:;X,-R&'h<;G< pdvL?~OAN@WM¢ngZT¬zte[dZZOg[kK@dKAiYSC75VQR£§¨ £©ª ^UQF30jMI_94b7.rE:pG8f@.Y8%W8#dA-fB0]6']6(d<0W8/T@?MDG+*.:;?@;=mbd ¶¥©ÓÅÐîæðýüÿúýûöúôîñèåæäèèîÃÁÕ% ; ¢ÿøÿÿùÿÿûÿÿüÿÿýÿüûÿùöÿÿûÿþôÿÿùÿïàîZM[¨·ûûÿïðúçäíÿûÿDZ¶<¨gÿÞ©úÓüÜ}÷ÛvÿãÿèøØ ÿâÿßñÔyíÔnôÞtûãþäÿàýÛÿâÿçýÚsñÎfÿäÿéÿàüØÿáÿáÿÞþÝýÛ}ÿßÿâúÝzþàwúÛtîÏtïÕȺº¸¯·°·º½Â¾ÅÈóüÿïûýîúüæòôë÷ùìõøôûþð÷úò÷úöýÿöÿÿòûþîúüòûþõøü÷öúúöûû÷üûúþòüÿÌì÷Ïáw²Òx¼ç~Éÿ{Éÿq¹õ~ÆüÒÿØýáÿäÿÙÿÔÿÉÿÐÿÍÿÙÿÖÿÒÿÍüÒÿÊüÓÿÏþyÊ÷zÎøäÿÙÿÒû|Òü|ÐúÙþÕùÛÿÚÿÖÿd°ÚÞÿ¾Þ¯éÿ¹õÿ¯óÿµûÿáÿw½åk¸æÞÿ}ÕþuÍöÛÿÕÿÄõÖÿØÿàÿåÿÕÿÑÿÕÿÏÿ~Éý~Çùr¾îtÂðØÿtÉöÛÿÌÿÎÿf¢ô2pÎ=é0|Ö!m¨?§¿üÿÌÿÿÉÿúËÿúÉÿüÇÿýÅþÿÅÿÿÀýùÅþûÏÿÿÌýÿÁôÿq©Ú?~ÈIæ>|àCé:{Ý1vÓ>ß5yØ8wß.lØ3pØ-lÎ8wÓDÞ4mÐ.eÍ6qÔA~à2qÓ5wÖ7z×AÜ1pÈ=vÌXß^Ý]ØEq±<d¤ÆÜèúõöÿôîùÿöÿ <P[¥¿Í¹ÙìÏõÿÌõÿÐþÿËûÿÅùùÍÿÿÍÿÿÈÿÿ½÷ý½öÿÆÿÿÄþÿÃýÿÀùûÆÿÿÂúûÉùÿz»¸ÔÞïÐÖÛÇÍÌÏÕÔ ¦ trq !uxvÈÉÅÏÐÌÍÎÌËÍÍÈÊÊÂÄÄ ¢¢ÄÆÆ¥§§®°°ÍÏÏÏÑÑÌÎÎÏÑÑÅÇÇÉËËÌÎÎ TTT''' ²Å«Ü¿»Þ¾¿×²¶à¸½Þ³¶Ý°³Ñ¢ªÎªÞª»äµÅß¶ÅÞ¶ÁÛ²¹ÝµºÜ·¹ÚÀÀýôñÿþýÿýÿíæëüûýø÷ùùöøÿùüÿýÿÿýÿÿýÿÿþÿûúüýÿÿûÿÿûýþÿþÿÿþÿÿùüÿüýîôïðõóþùû÷ïöûðúÿüÿÿûÿûÿÿïùùïýÿìýÿÚòÿ·ØÖÉ÷Ñÿ×ÿÔýÛÿÛÿÐ÷Øÿ¢åÿÛÿÖùÓöàÿâÿÏõØÿÒüÏûÓÿÖÿÊõÐøßÿÝÿÕÿËûÉûÍÿsÂÿ J¢y¹ÿßÿÍÿÑú~Òö~ÔøÖúØÿÖýÖüÐõÛüÕõÜýßÿÐÿp¯éÍÿÛÿ8Í Q¥3zÒ8xÖ.hÈK åDáAâ6zÙ1vÓJå;xÚ2zàOïr°ì¨àÿÇþÿÅüÿÃúÿÇýþÇÿÿÉÿÿÆÿþÇüÿÎûÿÐûÿÆý3d®>|Ö?áFä;×.nÌ:wÙWø@{ÞJâKàCÚFÞZõ>}Ù8zÍ9{ÎCÛ5kÂ1b¨Ek¡1ClÑÕòþõÿìßïêàíùñûÿûÿøõ÷öôôù÷÷ú÷ùÿüùÿñæfI: (&573;.BMªÉÓÝÅËÒÄÈÍÀÉÍÀÍÕÃ×â¡´7`y¦Ë©Õú¢Ðò³ãÿ´Òë</7J()O.2O03E)(E)"O2$M- Z;2A)#/#!&&&¡§¦´ÀÀt ~{p}§²ª»°¢oYGW8!ª kyO2_FH,TD8Ä·k}v ¬§}°¨HcZ=XOáûõìÿþÑèäzIe__~w¢ª<?)zsX|mMxU^u\:K4zfGÔ¿¤}k n_UE5>/K;*aO>_E5N/ kJ;`>1U5(]@2T4)\8.h?6[4+sTKÿôîöììúùûûÿÿûÿÿÎÒÍhlgÿÿþÿÿÿþøùÿüÿͽÈ{qû÷ÿùýÿõÿýóÿþðÿÿíÿÿëÿÿëÿýíÿýîÿüîþýïþÿïþÿíþÿêÿÿåÿýãÿÿÞöÿìüÿíóÿÿúÿòà÷58nÿõÿþ÷þÿÿþû÷òÿÿû±¥¥sdhëÛâÿéñÿØàÿèïÿ×ÞÚ±¹uwN]¢y̢ʢ߳²â³µß¯µÞ®ºå·ÃêÂÇû×Ýÿíüÿñÿÿëûÿèöÿîûÿóûÿóóüóðûíñÿûÿÿúÿÿüÿñøóëõïû÷üÿúÿÿ÷úÿýÿÿþÿÿûüøøøúüüûýýúúúÿþþþüüüúúÿþþýÿÿúÿþöþýûþÿÿúÿÿòÿÿöÿÿøÿÿúÿþûÿþùûÿþÿÿþÿøò÷ÿ÷ÿÿùÿ÷ïöèææÔØÍÑÔŸµ¦¨¢Á¹Ã¨?8qdd°NY³9T¯?mÁXÝÕÿâÿáÿàÿÕÿ|ÄúÐÿÜÿÛþÛÿÑÿÅýÊþÍþÓúÑýwÇÿ"o¾ ),";?2NU7Tb9H=TdµÇÒÆÐ×ÉÒÕÄÏÓ¿ÏÖºÐÜIh},Uu¼âªÙÿªÙÿ¿òÿÆäý:+3B !E%&G'(I*'O/)N-$D$V617" '"#ÍÕÕ¡s §¥z º±£{gUO2jR\@£y\bJS9+~qiËÉÁs~v¢~ mzH`V>WMzìÿûñÿüëÿúìÿÿÙòîTok@YUl~§µ©fl[20tXnMjFzb>^iQ-\E%À¨×Á¯Ä²¡xQA1/F0$tZLU:,y^PeJ<Y<.^>3eA7[1*U0(_E9ÿõìÿÿüôùøúÿÿïöó üýûÿÿÿÿýÿÿûÿ,"9md ðíÿúýÿùÿû÷ÿþóÿÿòÿÿðÿÿðÿþðÿþïÿýñÿýñþÿîýÿìýÿêÿÿæÿÿæÿÿÙîýêúÿôüÿúúÿÿøÿiYp %/IU6Wj=g~5L(<WuÀÔÕ½ÌÈÌÙ×ÃÓÙ±ÁJh«Ë¯ÜÿÊøÐþ¦Úÿ¹×ð<+8F!#V52@b97W+*S)*F""V6;ÃÇÌwn~w´«mU7fLmQW>hNjJ7Q>7©¢{£k{}2G>~z³«óÿþñú÷øÿÿøÿÿòûþôÿÿÅÓÒYihEVR©PVCDD,yqSwiEu^8f=rE[=T9ê½¥´»¥zsVF?D8.]OCK;.U@1Q7)]=2lG?g?:tPJ]C<ÿÿ÷þüûúÿÿ÷üýûÿÿcaaùóôÿþÿÿüÿÿúÿçÜðbUmÞÒî|ÞÜòýûÿþÿýýÿÿúÿÿøÿÿõþÿóýýðüüóÿÿôÿÿòþÿðüÿíýÿæøÿÕêòÄÙè¿ÐëÎÝ÷íüÿåðøöþÿáçîegrö÷ÿóñÿáÙðaSk¸¢ºÿæúÿøÿÿÞâ¤xyY-.྿ÿúÿÿëôò×áà½Ë¯¯Ù¯¶éºÂÞ¯¸Ú¬¸îÉÓÿî÷ÿòûÿñýýóÿÿøÿÿüÿÿøþýïóüîðÿñòÿôöÿñõÿüÿÿþÿò÷ú÷ýÿûüÿøõþØÑÔéâߨÙÐéíáÝÝÏ£THBüîïÿýÿÿüÿýþÿúþÿúÿþúÿþöýúûÿÿÿüÿýõÿÿûÿóëòèÞäàÕ×ÿýýÿÿü÷ýøøÿüöÿüøþýûýýüþþýÿþúüöúúìÿÿõÈ«¦tSZeKc¦Å~½j}°GbOm¤`¾Lqµ6c¬9r½A|Ä<p¶9o¶MßGåIíZ£ùRã[äc¤îb¥ð{½ÿg¦ÿXµO¯(ZºQàU£ W(X£½âÎíÿÂãöÓöÿÝýÿµÍë]cgUqSzcxf|qxt#"+dei rqs®ª°ÈÂÍÕÐÙ¼»½ÍÎÌËÎÌÊÏÍÏÔÓÏÓÔ¼ÀÁº½ÁÉÌÐÈÍÐÌÏÓÊÌÍÏÏÏÝÙØÊÈÈklp #' /2'3&?@b7\$RtBn ;H{ÁÓÒ³ÃÊÅÖé¯Äê^y¥¨Î³Üÿ ÍÿËû¦ÕûÂÛõC1>S.0Y85O,(a86S)*H!#? #7 %¿±·¬¦«¥¨¦¤}_J+Q4¡}_uYeOhUgM==+ \SPÿÿÿÆÑÎ1E@|{ª m|8PFª¿·bwoL[WíøõûÿÿýüþýþÿîñõúÿÿøÿÿéóóôÿÿäòîWd\bl`bjYIL3JF){qO|Up\3}e;g>tT0R0ybǨ»¡¸¦¨( TD3ZC3Y<-iF9Y0'a72hC?P73ÿû÷üýûöüûúÿÿ¯¯°«¬ÿùüÿúÿÿúÿÿ÷ÿ}pØËåÿöÿúùÿõöÿÿþÿÿÿÿþýÿøüý÷üýöþþ÷ÿÿöÿÿôýúôÿúóÿùïýùïýüîÿÿêýÿá÷ýåþÿÎæòÐäïìþÿéøÿòûÿðõÿ±rlµ¨Î_Mvÿíÿÿîÿ§¤W9LirÿõôÔ¹µÆ´³ýðòûíóÿïøÿïüÿæñíËÖЫµÒ§°ã¶¿Ý¯»êÂÍÿéôÿñúÿûÿÿúÿüøþÿûÿÿüÿÿöúÿïòÿëîÿìñüèíùëñüòøþöÿÿøÿÿøÿüùÿÚèæêþùîüø÷úøÿþþDz±.rTS«ÿô÷ÿüÿÿýÿÿýÿÿÿÿýÿûõûöúûÿÿýÿöõùÿþÿÿóñA51QB?³¨¤öòíÿÿûÿÿüðîíÿüþÿýÿÿþÿýûúÿÿôÛͺaQgC9]AAͼûûÿòûÿñýÿóüÿêñÿÜàøÕÚù¾Êì°Ð£ÆËwÉ;[§/UaëmûQÞH~ÜZøBè%oÍ(kÇ1f·PxÀ¬ì&7jA+6R15@Os{[dsy{¬\x¡Tx®oß6nµFÌÞÿÏÿÊûËÿËÿ ÇÿÎÿÑÿ~ÇÿÈÿÌÿt®öR×=oÇ$V¶9mÒAxÙKÝMÔ]ÜM¸ÀøÿÄüÿÁú÷ÌÿÿÊÿÿÅýþÊÿýÍÿûÌýûÓûÿÍëÿtÆK~Ä_ëCÍFÐJ ÔOÝE~ÙB~×FØ8wÇ<vÈOÖdágÐW 1Tb#* ^jdûý÷ÿõøûìôÿòÿôæñòìíóïîúõ÷ùñûøîþüòÿüøþÿýÿÿíøG / !YK 4 %* " @i;t§ÇúÍÿÓÿÚÿËøÊõåÿçÿÔûÓýØÿßÿÎÿÊü×ÿÇóÏù}Ëúæÿy¸üQÉ_Ç¡ÍöÄðÿÓÿÿÆúúÄüýÄÿÿÊÿÿÅþÿËÿÿÇøöÕþÿÚþÿÇëÿBkª\àYëPßMzÕdÚOl±DMJE|&=04D6:YJGmUUmUUZKHaUO«ÿøõÿûÿÿ÷ÿôæøÿ÷ÿøôÿû÷ÿøóüÿøÿÿûÿÿüÿÿþþÿ÷úæÀÒe6P ŵÿú÷ÿÿþþýÿûþÿðóûúýÿúüÿýýÿÿýÿÿýÿÿýÿÿýÿÿþÿÿþÿûþÿúÿÿûÿÿóùøöÿþñÿþ>UMew¢ToeyEXO¢ôûöüýûÿÿþÿûüþüüýÿþûÿþýÿÿýÿÿÿþÿÿþÿÿýÿÿýÿÿýÿÿþÿÿþÿýþÿûÿÿúÿÿøÿÿøÿÿúÿÿûÿÿýÿÿùúþýþÿúüýûýþÿþýÌÆ¿eLBW:,M,W4&F'N2'Q:2ÿþüÿûÿÛÛá`bcýýýüúùÿþÿýûÿopô÷ÿûýÿõùúúÿþøÿü÷ÿû÷ÿûõÿþóÿÿòÿÿòþÿóýÿõýÿøþÿúüÿììø¼»Ë ´¢¡»¸µ¨¢Ë{z¡| æòÿêýÿâøþéÿýîÿþñþüúþÿüõÿmZsÿöÿõãôüê÷ÿóüº£«¥úèï¹£¨W@Ev_dÔÀÅcX[VORtoqunqi^atkn»´·ÿüÿÿöþøàèÿíôþðöÿöüÿüÿÿüÿýóùôíðÿþÿýýýýÿÿîððÿÿþý÷øÿûøÿÿ÷»¼²uqf¡sj\u×ÑÄÿÿõÿÿøýÿûúýûüÿýûÿúýÿûõûðÿÿùuyhEOqPW=$R7; ruhce§ª®ûþÿýýÿÿþÿÿÿþöúïÿÿôÛ̹[I5,>80,ED·jn¬nt½¨ ¯rqy|gLPXAE}jghUH[B8gEKW5?YDFbSPaNKfNNT28`=GtSbI/G+<, P??u4Bv<^Dg.D`¡³ÛöÿßÿÿÚÿÿÎöÿÓûÿÍ÷ÿÓþÿÅðÿÓýÿÍöÿ¦ÑüGs¨ZÄÀüÙÿÑÿ|½ðÄô¢çÿÛÿÐ÷{ÈïËõÔÿÍýÇùÚÿÝÿl·å{ÆôÊùÒÿvà!S³ÓÃõÿÍÿÿÂü÷Èÿÿ¾úùÀûýÇÿÿÈÿþÉÿüÍÿþÑÿÿÏüÿ·äÿ^Å8hª[ÉaÄOn¡WhPPxREeh~pz}wvxlvjZah[]xjkäÓÖÿðùîàìîæ÷ýúÿòóýõ÷ÿûøÿþöÿýòüÿòúÿ÷ùÿúþÜÅÓx]q # !0 ):<Q$B[%@ #*#9D.8$8C,3), .>=N:N+Tk5_|?b&J $2"-&, ! $,%BQ)Fa'H ' 1 ) 1Af"V N]L ?O I ,* _aa z+ ] OE 3 7 Znv1 ,02/. 7&).#4/(+z"(kn#VU6 <)?*"3+uiuøòÿ÷÷ÿ¬¯¾"XUeû÷ÿ·µÒ°åðÿëùÿóÿÿöÿÿïüú·ÊϧÄÒ¾çþ^°cÀ¦Ýÿ×ÿÜÿÕÿÑþãÿæÿÇío¨ÏCx£Uºo¡ÝÍÿ¯íp©àÕÿuÌôãÿÜÿÖþÕü×ýÙüØùÕöÜÿÏõ¬áÿ¬ÝÿÁ÷;k¥aϽôc}¢mqÕ¾Æÿåã][M}?5K@v80MHd)-b21/urc´¾¸ÐßâßæõàçøíùÿèþÿÙúÿ´àø~·Þ M~FËc¹ïpÌûlÊõéÿ~Ùÿj¿ìÞÿëÿrÔöNªÍ9«?y±Ï¹ëÿÎܼÞäàüüêÿÿñÿüóöôö÷õöþýíòõÿöÿúé÷ TTQZ[Xa d \ ,{ E,5%0$$ +#+< %@^T{6Y-T0WT|¬)S8dÂÞÅëýÐóýÝÿÿÚÿÿmªa®Àá©âÿÙÿÛÿÓøâÿÐ÷Òó¬çÿ_ %G2PiÁ;a%WsºæßÿßÿÙÿÓûÑøÓùÚýÞÿàÿ¨æÿ¦áÿ¤ÖÿÉüÙÿ©Ôÿµð7Y".Xÿõÿ°h9;k77HFp)%}20@Co+2AJTToQ@¨nuhboqÈÒêÝìÿØ÷ÿºçüU§dyÄðsÁöÚÿáÿtÏÿ[ºæfÅðeÄïkÉ÷áÿdÐònÛûnÑ÷tÌõv¾íÀìx¹à>z6ez¿åñßÿÿæÿýôÿþ÷ÿøóûôùþüþüÿðêõ *G RMD LNX[V > 3 S6/W8/eF=`A8P1(\?6U8/P1(]=7U1+E_\\31\45ÿáãÿÝáÖ·ºL22ÿõôÿüùýýÿñùÿ2<dU^ÆÌÿÊÐÿÕÜýëöÿñýÿõþÿ÷ÿþùÿýùÿýúÿýúÿþúþÿúýÿûÿÿúÿÿõþûøÿþõÿÿôÿÿíöÿyÜìùìûÿóÿþúÿûÿÿûÿþúÿûýû÷ü÷øüôúÿïøÿçõÿ¯¡µÇåþÿèÿÿÒÞð!%>ÌÅæÂ¶Úôçÿÿöÿû÷ÿúûÿúüÿ÷ûÿýÿÿý÷ü9+7WAT`Da±ÿòàèÓ¸¹£zpXãÈ~ÿãÿêÿçÿíùä{óØ3 H G 7 Jais f Al YH{T"U(Z,]@s1[?`LmU|'c[S| \WM$X%[']IS N ] n%u~" /7#"+ =);"6r*8%x)5 $%~(* /.'-!(/6,,h)%S3- N`/1 EVO #' >SP¼Ôÿ~ØÿjÆùoÍûoÑûcÈîxàÿ_ÃåãÿêÿãÿfÍínÕötÙùqÕòïÿbÊçkÕôìÿïÿÔÿwÅðçÿÔûàÿÝýÌôÔÿÖÿ5k)Qqµ»×ÿ¬Êû3X;z»û ÞÿmÀó{ÓüÔùÔöÓøÓúÕýÖÿÖÿÖÿtÉöqÆóÑþyÊ÷ÔþpÄî|ÓûÙÿÌÿ¥ÐÿZy¦8>8K0$*:l1?K/ B# bD?_NR*-I)Fr]ÐÑÿg½ñeÅówàÿwçÿPÀîKºêeÎÿ_ÄñiÉñx×þdÄèlÍóuÙÿjÏüxÙÿjËýlÊøZ½éYÅïkÔÿsÏÿÛÿeÂúa»ôyÏÿàÿkÅã]o gLU¬ýÜ»ÿÛøÎ÷ÈÿÑÿØïÄsûÕ}ìÇrÿÝÿÜù×~ÿéÿÝ{ÿäzúÔhñÊbþÓB +!'x$%¢, ¹:+$²;%º7# 4(;,}"¨7'0'76)/+4t,8V2B)-? 0 °3±',+- #¢,¤(ª2&,$00l!)p/>W,A,'B !$µ¾Çôÿ¶íÿ²ëÿÉøÿÃîÿ¼Ù\£¹âÿÄå`§«ÚðÄöÿÁöùÈýúÎÿüÐýúØÿýàÿÿÙÿþÓÿÿÏÿÿÒÿÿÑþÿÍþÿÇÿÿÃÿÿ¿ÿÿÄÿÿÆÿÿÉÿÿÌýÿËüþËüþÎþÿÕþÿàÿÿàÿÿÖýÿÏÿÿÄûÿÂùÿÇüÿx«ÌÇé½ìÿ½ëýÁòüËüÿÆùÿ VaN\)Ub+K^GVv>ElovÏÜÿ¾×ù±Ïò¼àÿÂçÿ¿åÿµÞþ°Þý°Þÿ®Ûÿ«ÛÿÎÿÌþ£Ñÿ®ÛÿÊóÐøÑúËö¬àÿÑþÙÿ£ÜÿÔÿ¦Øÿ¼÷W¹ @k ^Y!ZY;vVM0u n!r '4"5$¡5#)¢' ¤" ²7-®/ °0¥&´4§! &9) *¡- '$y(+^'0J*=3.I!;_ l x0co"y '¡3!¤2!ª4!©0 5e{ÃLp?a~Dbu\kt,,,C4+aD6X1"`1#l8,c0&i?3qNAiH?V:3O<7ÿÿüÿÿÿðúúëýü®®ßùù×òïìÿÿíÿÿïþúóÿþéüùïÿÿíûùöÿÿúÿÿðõôûýýþÿýÿÿûýüò@8+VG7nZrR;zR9sJ4xWHZ>7P97?15ek~ ¡ £&¨2&2+*+d%T$1 §°ÇôÿÇýÿÃÿÿºùÿ¬ßùj¶*\x!Sqb¹¯àÿÆúÿ´ëÿ¿ûÿ¾ûÿÇÿÿÊÿÿÊýÿÌüÿÎþÿÈùûÄýþÄýþËüþÌüþÉüþÅýþÂþþÂþþÅýþÊýÿÎÿÿÌÿÿÉÿÿÆþÿÆþÿÈþÿÅøúÌýÿÍþüÌúûÐûÿÖþÿ¤Æê¥Í·ßüÅóÿÌýÿÍþÿËöÿ§Ðç D\;MPW/^f3RiPdgqÃÉÞþÊæÿÁçÿ¶áÿ·ÞþÃéÿÍòÿÁèÿ®Üÿ©Ýÿ¨âÿÔÿÏü¤ÙÿÓþ©Ýÿ£ØÿÉýª×ÿµãÿ£Ôÿ£Öÿ®åÿ¥Üÿ¦Öÿ®ÝÿËý/b"S*[%Z%^T,c "S%SN%W&\%[Ix9ie̼ö¿÷ÄøÍýÐû£ØÿÌ÷ÒÿÎüÓÿ¤Øÿ Ôÿ Õÿ¡ÖÿÓü¦Ùÿ Óþ£Ôÿ¥Øÿ¬àÿÄäÿD5=Z01_03X%,R!)U&.a9>\<A4#QCN3+<-$@Sfg§Dd^}q£q-/0L>8jPD\9,e8...@8d...C[?4nTMlYRwsúõôûÿÿôÿÿã÷øÐêêåÿÿ··Öñîìÿÿîÿþíþú»ÌÉòÿþðúú÷üýýÿÿÿþÿÿþÿùúøñóíýüò0-]UD}lWhP8y[@yW?eD1\>3K3-N@BU\m+7@]xn¥JcwvNT[($#I=7^KDR51Ö´´ß·¼Ù´¸Ó³´çÏÑXFMÿøÿ0-MÁÅõÌÕÿ",z YÆÌÿ¼ÀûÂÆÿÁÈùÇÓ÷Ùæÿéøÿïþÿïÿÿíüÿðüÿðþýðþýðþüðþüîþýîýÿîýÿóÿÿòÿÿóýÿõþÿ÷ÿþõÿýõÿýñÿýëüÿíÿÿáúöæÿÿÞúûäüÿ½Ëû£Óâíÿîùÿáìÿåîÿ ·åëÿñóÿóóÿûöÿ| < yÔòÿ¾æøË÷ÿÆ÷ÿÐüÿÉ÷ÿÃôÿµèü¹ëÿÃöÿÊè¡ÚðÀûÿ¿úüÆÿÿÊÿÿÈþÿËþÿÌÿÿÃüû½ÿþ½ÿþÄýþÇýþÅýþÂþþ¾þþ¾þþÆÿÿÈþÿÇýþÆüýÄýþÃÿÿÅþÿÃþÿÀüÿÂüÿÌÿÿÉùûÔýÿØúÿ´ÙªÉð¿çÿÆ÷ÿÈþÿÊÿÿ½ëÿ´Õ<^@YIP*af-Rf?WuUd {«ËàÿÄãÿ¢Ëì°Üû¸àý¶Û÷¼Þû½ãÿÙÿÎùÚÿÑûÏø¤ØÿÍö ÔÿÐÿÅù§Ñÿ¯×ÿ£ÐüÎø ×þÖýÒûÎù³çÿbÂ%UMuMr#\ HuP WMJN YL1a4aÆÿÃÿÈÿ¡ÑÿÏýÐûÔÿÌ÷ÑÿÐþ Ôÿ ÔÿÑþÖÿ£ÚÿÖÿÔÿÎù¢ÓÿÐûÎ÷´Òï8'0S'(a/3W#*^)2s@HQ%+F"(P5>G6?61:*-;/;Pko«HiZylEUb'+0JA>TA:X;4c?7d<7c?9P3,fOGaKE\LF©ÿýþýþÿôýÿçøû¥§×ðòàúú×ïíìÿÿçüùåöó«ªÚææøÿÿöúûÿþÿøõ÷ÿþÿÿÿÿÿÿüÿÿùEE7MK9{pZiX=`J.y\AiG0fD4W<2TBAhah7<K.C &@Olt«aybr!$,5-.YHEW?9R32Ö±³Ü²¹Ú±¸×´¸àÃÆRAJöéùkf²ÆÐÿÙläÎÐÿÄÉÿ¿Æý¿ËõÌÚ÷Úêûãóÿêúÿíþÿîýÿîþýîþýîÿüîþýîþýîýÿêýÿèÿÿèÿÿêþÿíþÿòÿÿòÿþòÿÿðÿÿéúÿëþÿâüüäÿþâýÿãøÿ×ãÿÉÛæúïþÿÐáôæøÿ®ÕÅÑõóùÿìíÿ÷ïÿÿõÿÒÆêh]} [mÃñf¿øc¼ÿGéc¼ÿsÕÿæÿkÑô{âÿpÖÿiÑüiÑüoÓýèÿx×þx×þvÙÿqÛÿxêÿ^ÙûhàÿtâÿqÜÿYÇñ]Êö\Åö\ÆûOÃøK½òiÍÿ`¿ðkÐ÷ÜþB¬×êã÷ÿÔÚåñî÷ÿüÿ '.+>;3L=4bG=eB8d90Q*"cIBfWN<0*]TPÿÿûòôôøÿÿôÿÿñÿÿ£µ´k}|¡³²éüùÁÔÑÅÖÓîÿüðþýðþýïýû¿Í˺ÇÅðúúÅÏÏ¿ÉÉôÿýõÿý×âÚ$!wcÙ¬]@+R4!_C2]C5M>501('#'$ 33Ymh0EC VPKfPKV52eAA฽ൾݯ»à±ºè¹Ááµ»jpD(5ÿíÿ!AÁÂÈÿ®µþ &!s+. ¦©!2¡* &¤+ $8 G-9"9'y&7/3"v, U-28;PJ|¦ÕÿÛÿx×ÿèÿvÛÿmËösÍülÈùxÓÿpÊíéÿ×ñãÿÙÿàÿ= £¹ÅÑñüÒøÿËõÿÉôýËùÿÄ÷úÇúýÈöþÌøÿÀîÿ½îþÁöÿºòý·ôø¿ýýÃÿþÃÿþÅþÿÇþÿÈÿÿÊÿÿÈÿûÄÿúºüûÃÿÿÁúüÌþÿ«×öoÁ§ÔùÄóÿÏÿÿÎüýÌõÿÆçÿÍ Ñ5Gp6NlCW KZ=L7I7N5Om¢Ê³Ðü¯Óÿ«×ÿ ÓþÑùÑùÒý¦Øÿ¥ÖÿËõÜÿ°ÚýÁâs7Nh&<1>Ob£µ¼Òä¯=Um&=W2N&A(%+)7 #" 5"</"#.6#+").60]jBq$TxHt3c lXMnRGnMDjFFW17e@H4aMYòêõswêôþª}öüÿ÷úÿ><B%![CKX6<T,.à¶·Û³¸Ó³Ï§²Ð¨´â¸Éâ½ÑåÇযodwt¡8bl¢ÎÙÿcn§`j ½ÆÿÆÎÿ²¼ø½Çÿ¼Åþ½Æø¾ÄñÌÔù×ßýäïÿíúÿíýÿêýÿâúÿßøüäüÿÝøüÜúûàþÿâÿÿåÿÿêÿÿêÿÿëÿþåÿùãý÷êÿüîûýøúÿÿùÿª£¸ÜÞößéÿÞìÿËÙöÝçÿ½Âá|{ìéÿrqÛâñîôûýþÿÿýÿþóÿYO\ c^uÑütÔühÏöfÑ÷j×ývâÿlÖÿhÎùnÑýnËü{ÖÿrÌÿsÍÿpÊÿdÁùcÄüfÎÿgÖÿbÓþ\Éõ`ÄôoÈû}Îÿ ÔÿÚüÔê*VcÂÜãôþÿóõýÿüÿÿûÿâÌÑ 7'=7 NYOÓÞÖúÿüøûùýÿþÉÍÈ÷þùôýúîüúéúýêÿÿ¢¾ÅpÐôþØÿÿÊôÿWÈóÿÒûÿPwÖùýáúþëøööÿüïüôöÿûôÿûïý÷øÿü?FA:;7=<863.KHCQLIa\[LDE ~0*=4¬9,¨%°64 f,&4)1 ,=}´Ìøÿ¤ÛÿÖýØÿÏñäÿ¥íÿÍîÖûÝÿÖÿÕÿÒüÕÿÕù»êÿÜùÿ§ XQB +1 41®:#1#/4a#9)@8SÙÿ|ÚþSÈåjßüw×ûnÅíÜÿpÈð}ÔöçÿëÿæÿpÂò`©ãt´õ={»{Æúâÿ¤ëÿËÿÿßúþ³Á¶L`C'/@7Ugn§¸Ëðÿ¯àÿªåÿÜûâÿ£æÿ¬ëÿÐïÖö¢ÞÿßÿØÿßÿàý©çùÈúÿÛûú©¡[XPo`^ùåêÿ÷ÿÌÈÛåïÿßùÿÀëÿÊïzºãßÿæÿj¼æpÃöjÃöc¿ò}ÜÿnÑý~åÿnÕülÒütØÿ@¥ÙS·ífÍÿWÄøLºîK¹íj×ÿcËÿ[ÁõuØÿmÐÿU¹é[Áñl×ÿfÑýhÒÿvÜÿiÊüiÅørËþÛÿ{ØÿfÌýP½óUÈÿUÉÿTÁù^Áók»ä Øõf%&K))_1&J±pǪ{cQ, :)C44),'( 0"¦9$±9#»;&Á:&¹2¦&¢$©( ¸5½5»7 ¸:((§:¯=¶2º3´7"®4¬+°1«1#->$?!*%3 .¢?)¤:#+"&.x#9HA+*Th½èÿràþ[Ìì}ÞÿxÕüqÓû}ÞÿwÑóêÿÝþåÿ{Ðÿ[¨á"b£xµ÷ãÿÖÿÇåÅúÿáúÿ>N=exgÛòî´¾·ÌÑ÷ÿ«Ûý£Ýÿ¡âÿ£çÿ©êÿ³ïÿ¦Üý¨Þÿ¡ÛÿÕûÓùÜþ×ñ§éü¢Ùâ¼æëäÿÿ½ÄOTcuuááÿïõÿÛîÿxÃZ·|¸æ×ÿÕÿçÿ{ÐøuÍü]¸ëqÍÿäÿmÍõuØþrÚÿsÚÿwÝÿD¦ÖU¶ènÑÿaÊýQ½íYÇ÷cÏÿdÌûgÍýxÚÿu×ÿkÍûmÒÿ{ãÿkÔÿ_ÆójÎþlËýyÔÿ|ÒÿxÑÿ~ÞÿvßÿVÇÿL¿üL½ûgÎÿÝÿáÿÇØ0@F>PSoE.S.aIÆ¢ 9lAqHxAo ª4 £- ¬1«(².¨+¤,¡.,6¦C'/+('!,$#!(./>X*@-EhÎéäÿÛÿåÿtâÿe×ÿtÜÿäÿyáÿzàÿhÉûG ÙGÎÌÿ}Äýp¹í7®[ÁÁáÿá÷ÿÏëÿ¯ÑéÃíÿÅñÿÇîºåÑü±ìÿÞÿ ãÿÔöØü Ûÿ ÝÿÙÿÞÿßÿÖþØÿÚÿ§ëÿ Çêm®Õf¢Ðy±èq¦ß´ì´én¨Ùl¯ÜÕÿÖþ ÝÿêÿØüÞÿtÒÿB¡ÓqÎÿvÕÿxÙÿîÿwÝÿwÜÿäÿiÊöpÏûtÖÿqÙÿnÙÿn×þmÕú{áÿ{ßÿuÖúyÙýxÙÿxÙÿnÐøiÍ÷rÓÿâÿtÑÿpÉüsÉÿyÕÿgÓýLÂìeÝÿL½õ^ÀöÐûÒë\|! ¢#¥4 2%4 «:*¡7&¢<)6 ¤6$2$% 66u27i:C@'5)/wq±ÃàÂßmÁÝêÿèÿïÿ(ºN±ãa½ðnÀðØÿÙÿyÌòçÿzÐú>{T;{«UÆyºæÝÿ£ßÿ{´ëj¥ÖÅï¬èÿ³íÿ ÙÿÕýÚÿÒúÛÿèÿàÿlÁîp¶òj§éb¡Ýo±ì{Äÿp½ü~ÌÿÖÿÝÿÏûÚÿ×úÝÿßÿäÿåÿÚÿsËùb»íU²ãmÍûkÏùuÙÿjÎønÏûiÊöjÌôkÐ÷n×þiÕÿXÅø@«ÞlÒýyÙÿvÖþdÄìoÎöyØÿgÆíjÉñ}ÝÿrÑümÌø{ÙÿwÔÿ{ØÿoËþdÃôaËô\ÇíoÒøÕøÅâTu *#,I10 \ -9KO]y¯Ò´Ëñ´Ñö®Òø¼æÿ³äÿÏýÐÿÍÿÌÿÐÿÐÿÐÿÊôÖÿÎõ£Øýáÿ°ãÿ²åÿ¥ÙÿÍøÒÿÏùÑù×þÔøÎ÷ Ñÿ¢ÑÿËÿÊÿ ÐÿÎþËùÎ÷ÓöÔ÷ÏøÌ÷¦Üÿ¦Üÿ¡×ÿ£Øÿ©Þÿ¡ÕÿÍûÒÿÌþÎÿÌÿËÿÈÿÇÿÀþ·ö~²øn¢é~¯ù²újÛ}ÆS=Pf9<X-*^7/^:2P/&W3+c?7b>6jD?b20e33e68Y-.wJMÊ¢Q'(_64hB>Y5/_@7bF;eH:a?2pJ>wLCtB<XR[Pi_vYUvdk.'<¯Òåÿu²ÐôÿÑûÿÒüÿÑûúÚÿÿÚûþãþÿÙïû KZmº¶Îò¶Ðô¶Ô÷½àÿºäÿÒýÍüÎÿÓÿÔÿÏüÍøÒùÔùÒõ±æÿ´éÿ®áÿ¨Ûüáÿ°äÿ§ÛÿÒúÐùÒý¤×ÿ¥Øÿ£ÓÿÎÿÊþÊýÌýÓÿÕþ¨Ýÿ¶èÿµåÿ¬Ùþ¨Õû¥Öþ¤×ÿ®áÿ®àÿáÿ«ßÿÐûÏýÏÿÏÿÆÿ¼ùµö½ÿ~´û¼ÿ³úpá¬õjÛaÏzÃ@.Eg>E\31^91`D9fJ?f@<^52\4/`83i>;h=:h<;W.,DñËÉuROL,'iIDdD?N.(uQKqIDzKGo:7ZWSP\V|MEd_nTTr~(´Éáÿr°ØýÿÅðùÌüýÊüúÉýýÐýÿáÿÿÚïþÏàó$6ZYi ej¨|{©tqup§pk¤pjXPndn`YMa_u=<LJvIFW1-d`¤@ nHDg?:kA<h;7n?;f73k;7b96]B> éÀqÿÚtÿÕlÿÑfÿ×kÿÚqÿá~ÿá}ÿâ{ÿæ}ÿâÿÊ}q$3!B&2 ##!-(:.=+9!;"©F** <£8²?³>½I2¯A5-#¥,¦(©*ÃB'ÌG+³3 FC E7 !5ew«Àæ¸Ïõ·Ñö¼Ùþ¶ÝÿÐþÑÿÐÿÓÿ ÕÿÔÿÑüÑúÑöÐó§Ûÿ±æÿ³æÿªÝþ¦Ùú¤ÖúªÚþ²ãÿÐûÑÿ£Õÿ©Úÿ«Ûÿ§ØÿÒÿÍþÑÿÖÿ×þ¢×ü§Ùý«Øý¯Ùþ³Ýÿ§Õþ£Ôü¨Ùÿ¥Õÿ¢Ôþ¢ÔþË÷ËûËÿÊÿÂÿÂÿ¹ÿ µýx¦ó±û±öqÚx¡æeÓdÎÆF6Mg@HW0.Y4,V:/V90]64a56b52_50`52i>;lA>_63A¶½O1,qSNK-(fC?e?;d74OMFEQQPO]ZVOzUQr[_|s9 ÃÆäÿp³ÎúÿÏÿÿÉýýÍÿÿ¾úúÉÿÿÌõþßþÿáüÿMbw);mfsrwyyli°yr§mhfa£lg¨rk`UWNNIURNLnA=P'$°ieN*$nHDf<7m@=l=9l;9d40k:8`52N/.& ¯(¼5§' ±3¢"§%®,µ4 ( 1 7¥@§@ ª;%¦1('©-9ª49*'1+3,4/1*1% 4,T-/PLX7Rg@e D7 2["%c$&s46VH?* ( Q'(S$&? `'(E< ,$ ª0©5¥2#§+%¦,, /3&)+)4/1,.2k?V,.Q7kàÿâÿxãÿrÜÿ'ÇS·ñpÔÿ@ÑpÎü{ØÿâÿöÿzÞûkÕíûÿûÿdÝ÷}ëÿyâÿëÿlÖûH³ÕqÝÿuãÿxéÿqçÿiâü{õÿvîÿzîÿtäÿváÿíÿ}åÿjÐó~âÿyØÿdÀñ>ËhÇósÕý|çÿtàÿoÛý}èÿçÿoÑïÜÿL§Î;ÃuÖÿ3ÆiÊü{áÿvÞÿcÎê~çÿzßÿs×úoÎöeÃîuÑúÚÿjÂðkÄðjÈìhÂáÝýÖéKhe:;1A)#T22I+08 ", :N!\&%SOIENJN? C? = 8 -- $$$ /#,4'2"6'¢2&)"$*¥<)¦3·C ¬>-§6§2%¤*£.),& :(®E* «5" ' #¦3610&8,3'67T3N!KUÁßÿ|áÿ{èÿkØþ6 ÏlÒÿmÒÿ(ºxÙÿæÿzÜþzÞûyàù{æûyëümæönåúqÞúvÚüøÿäÿ+³qÛúrßûiÚômáøqéü}õÿmãöyéÿrÞö}äÿ|âÿòÿ{Þþðÿäÿ_´äEÌuÎú{Ûÿ|áÿsÛøtÜù ìÿ{ß÷wÔí|ÓõrÇïO«ÖvÓÿ9ÍdÄùqÔÿwßÿtßúìÿvÞûvÚütÕûsÒú}ÜÿãÿtÏüzÕÿqÏúyÑù Ó÷ÒçC\X1,P.!a3+]34O'(D?JX ZMQaZG0 B/ >MP {sl³§~r~k\ymtev_PvaR}m]WH8*xhÛÆ·N7(U:,aTkH;f>2g=1l?4|NCj<1d6+`<2UB; ( 0& ! 4:Fb+>Y*B^1Qn%Kk0R}°Ü¥Æó´ÖÿµÜÿ¬Øý¤ÕýÉôÎù Óþ ÓþÏúÐû¥Ùÿ«ßÿ«ßÿ¤Øÿ£×ÿÒú£Öþ¬ßÿªÞÿ¥Øÿ¨Úÿ¨Øÿ¡ÒÿÍÿÏÿÓÿÕÿÒûÎ÷¬Ýÿ¨ÙÿÎÿÊÿÒÿÓÿÐÿÑÿÆþÇÿÇÿÆÿ¸ú»þÂÿzómå`ÕkÜiÕ_È`ÄMm®pÎnÉc¼lÉa{½iÀÀU7Pg5?f3:m<>h>?W-.m9@}KMb:._=-dA7d@8X3+]80iE=mLCM.%E* Ø¿µ²M7,E/$_D:L/&rSJ|\V{\YnQM¦H.' I61L@@®¯³sz}~i{|Qbev ¤³µL\[#% .4 8: 60 1% > 0- # 9> |-9',7#7%ik w(t("dW_o £*¬4¤3±?º@½= ¬)¦#¼8.½@+²@¡7 <9 +§7#¢1¦/«&"³11§;*¦C-¢@.3 46 m4%_:>3E + z"+|,6&z1#\ Zlg[V a v!°0µ6¥/°=¼C·8 £!¹7*®4°C£@¡@£A)+¥2%'¡(¬)&¯0/2$6"8$3:% 4p2"b898A=¾ìÜÿsÛøpãø~ðÿsãùïÿcÑû3 ÓlÛÿ|èÿîÿïÿìÿnÙôèÿ éÿtÚñöÿoÙðpØõwÞÿ;¡ÄfÏðnÛ÷öÿrçünæùuìÿhÜósãúyèþëýìÿèÿ|Ôø{ÚûpÑõoÔÿ®gÑúnØýìÿ|ãÿ|àÿwÞþxãþmÜöùÿxãÿßÿR«Ý ~¬rÕÿl×ùqÞþXÆärßÿ_ÆíqÓûäÿtØúqÕ÷jÒ÷nÔÿ`Ã÷èÿÚÿ§ãÿ2Zf1 ^ fmpv "'«,+´2%ª* ª/ ' U65b65V*0X_eAAS--e4<e4<mEGtOQzRT[27b6<k?Ej>Dc:?W26\;?D),E347++4,,.*)'%$342675755-'(C8:~nossliyupgÚ¿µ¤a[Pjl`~y ]WL}kZ䯳°z¯súʾįŢ¼²Íº«ØÊ·ËÁ¯¤ trg }ROK~yvxxoheLBB/(%H@@UPMFBAPMIWOOPGD?/0UA@[@CU69c?E$ O (´¹Ï¦«Õ©°Ñ¥¬Õ©¯ã»¼üØØÿëêÿëíÿìñÿôýÿïû÷æñúéòþîõÿñõÿùýÿùÿ\DNÿðóÿïóÿñüøä÷ÿé÷ÿîéÌ¡¬w4ÿËpýÐgúÓfÿçÿÜvýÐnÿÔrÿâÿäûÛwùØqóÌbüÕkóÑmëÃxc*o%{ ,"klv("r# fahgy##$%*¥(*§'"£&³A#¯B 7«>¸@¿E³8°7µ9'¦.¦3/'2 6)¤6*±4&²0#3-&(7#A*?&C(A% < s?/Q:?&-FV«ßÿëÿvêÿwêþqãúuéÿOÅî"ÈtíÿbÛû]×íhâòuñülæö|òÿñÿïÿñÿwáøtÚ÷èÿçÿrÑø|ÝÿïÿyáþgÔðwäÿxåÿ}èÿtßûxáüèÿéÿw×õ~âûyàûkÒóJ²ÕQºÛ~èÿqØøqØùmÑôtØúvÝøjÔìyäÿn×øgÌóäÿS»ê;§ÖYËôiÝÿaÕô}ìÿñÿ}ÝÿÜÿ~ÙþÝÿâÿ|ÜÿlÊõrÇïàÿ¨Á'2')5 0 ) + /jBr UKPVW|yMjR"<E^©j~ÉÒ¥Ô©¬Ð§¬Ú¶Þ¯¸çµ¿ë¼Äⷺݸºÿäåÿðôÿí÷ÿíûþéøöáðúæóýëòÿòóÿòñÿùÿ«x{üìíÿòõÿìõúäöÿøÿÿïëÃxf)ôºhúÈhÿ×rþ×oûÑlüËiÿÐnÿÝxÿÚtôÑjöÑiûÑgÿØnöÒnôÊt;~3*$ vj sy% njjgy&42!)-%,! !,"#%! , - - 0/ WB7 Þ¢fó½|z]1 ¦7¨9¢236=%(©3 6!9&9*8)<,1¥5#¥5(/'/3h)=8B }rtôâÛ`?+jKJ FT¸ðÿþÿ{îÿgÞ÷\Ñìpåÿpæÿøÿxîÿöÿ~ïù ñüìùqáîpéùsîÿuìÿxìÿñÿ~æÿqÐ÷]¶âqÊöìÿ~ëÿwïÿmíÿeåúháûoÜøçÿ~Ûôxà÷oßó}êÿìÿyãûvàøvÝøæÿðÿ|âÿxßÿrÙùlÕövßÿiÔöèÿ|×ü|Øûæÿòÿ{ìÿoäÿnßÿjØúkÓökÌòfÂíuËùÓÿÖÿÔ÷Óô»ã0T *5 ++ 1+ ¤1¤0-.,¥7©5 ,µG%£9629!@)5 3¹J"±@% / 0 0 *! B=ZYPxscn\p]iSuT{Ve=tN O21e[CnVsX¡fLy_«~[«k4m*y0m+Y'rK{\¡ePxi§±®æÍÙÿ»Ñû·ÐúÉëÿ¯ÚÿÎúÊø¡Òÿ¢ÓÿÌüÊüÏÿ ÒÿÉýÎÿÏÿÎÿÌÿÈÿÏÿÃÿ~·ü»ÿ¼ÿqàmÜ«îqÜmÓ{¡áoÛlÓsÏ|Â5B\(%"$,$$, R@AwacuZ]pSVvY\sVYqVYoWYmWYmWYmWYmWYmWYt\\t_^p\[t`_t\^mPSY6:nFKnEJjBGQ,.a??``ur²´]XwMFsIBmF>^91\80hG>tSJqPGpQHbA8kJAuTKdC:wVMgH?vZOlVKWH?jb[e`]YWW437++1ûûÿûþÿøýþûÿþûý÷*)KE:qlXZDlVkViT¨ua½ tªqbºr½wźyªxl}q¯u¢uheYg]UJ¢zn©wڷΫ¡}ZPZ3+a70j@9wMFpF?g@8oKEqM;c@ìÉ þÛÿàuþÛfýØhüÒrõÄx¾Nt4 NI¥sunoig¤~|khlluwdi`gbjks´Ó³Ñ¨¯Ó§À[_k>Agjݰ³È YbשµÇ¨×«±Á\)½UÿÏüÒoÿâuÿÔiÿÒiÿÒkÿÖoÿÛuÿÝzÿÚ|ý×yõÑmûÔlÿÐlÿÎtÝDòVôOã?áCìPòRðOøWôTæKêN÷X÷XÿdÿfðSìVÁh5F¤=¨;±B"¯>©5´>!º@(¬/¸5!¿8"º1²) ¦" & "('!))& ³?«=«@£8¤8¯C$.:!¯H(¢9³G(A).%19'=9:RNA9Áµóÿ¤÷ÿx×þhÎñwáÿwâþ{àùáûßú{ÓñyÒôáÿxâÿváÿoÐñÞýíÿoÔôcÌíyàÿòÿ|ÛõtÕñ{áþwåÿqßýyãûëÿçþóÿußö}çþïÿk×ïrÞöðÿtßûíÿîÿußþp×øoÖ÷iÐñtÝþnÛûnÜúxßúqÔðvØölÍîgÈézÕôÙô°íÿ¥Ìèk~( '! /2 5 4 2 79 &$A>7\F=hoc}o¯o]¤gK]@ mTmUtXvTpK{W©V92qX>qT©{\½\Ä{V¾zK²g(i mhXi5pFsW\M¹»Ëú¹Õþ´Õü¡Êñ¤Ôþ¤Öÿ¥Öÿ¢ÓÿÎÿÍÿÎÿ ÒÿÊÿÅýÈÿÃýÅÿËÿ¿û ºù~´û|±út¤ìtèrãoÞw¡âyßpÐnÎgËsÑÓ~¹EIa@=FRGI3&$8)'`LKs^]pXXu]]nVVmXWmXWlXWlXWmXWmXWoWWqWWmSSpXXkVUlWVpUXtUX`;?h?DX,2b9>^79b>>gCCc=;jA>nA>`0,m:7h52~NJb^¡rn½µnikfjelg~ZTiE?lHBK.' Ë»µÕÉÅÿüùÿþþÿûüÿýÿÿüÿûüÿöûüôÿýôÿüûÿü3*!zrqSHj^_R`Sm_j]²zo±xo±wqÈ®vqÎÖøÂ»ó¾´à© ¼|¦lfLE§vng_[-%j>7mC<zNGvJCvIEuHDj=9nA=vLGgA/wT)óÒÿÜ{ÿÞnùÕ_÷Ï^þÍiÿÌuÿÎÿÙüÌlÿÖoÿèÿØxõÎkûÒoÿÎnÿÔsÿÙtÿØpÿÒmÿÍlÿÌnÿÍoþÔqüÕkÿÖiÿÒfÿÍiÿÎtöÅwâ°vs;TTN§vxr{jvjykzhunw¡rzio§{Ï£ªÒ©°Ç¤Ñ¡§Ô¥¨ß¶´¶U\¤v¾¡Çªà°¼gcs;ÂTÿÆzÿÏrÿÙnÿÕfþÒgüÏfùÐiýÕoÿÛvÿÛxþÒuöÊmúÐmýÐiÿÑnÿÎvçIöUÿ[üUñQîRóVõWñSñRôVíSâLëVêYølê_æ\ç^ÖxMÝtS¿Q3²E%¯D©=¯A³C%³@%¨/³5½7»6¯05´A&@$®D%¡:2¤9)/§9!¦4¯?(¦6"'&0"2$3(¥984E,HA6UTvµÛ¦èÿåÿYÀçmÛÿ~ìÿêÿíÿíÿÞÿ|ÚýnÒõmØý{æÿyÜøßùêÿzáüoÚöpÛöóÿïÿ~æýwáùzèÿ óÿöÿñÿ~åøéüyâ÷õÿöÿqàözèÿñÿwäÿðÿìÿyãÿæÿèÿtØûr×ýpÙÿmÙÿpÞÿtåÿsäÿfÒôjËïÚûæÿ¶Íce}K:O.( $ #! ?0,O*,D&$:31E71D!, 9TLuk_l]fT\FkS«w\ÃsR»uH©k@rRpUt\v\]<fEK0/{W@¢nV¼qTÇvVÍyVÊUÄk3e#faT|`+sIkOSH÷ÍÿÁï®Öÿ¨Õÿ Òÿ ÓÿÐÿËýËÿÐÿÏÿÇÿºô½úÁÿµõ´ô¼ÿ³ö~«ï´û«òqßqÚnÙmÖtÛqÔlÊkÊlÍrÎ~Ìpy¥62K-#/*# 0$"2#!dPOmXWhSRjUTmXWmXWmXWmXWoWWoWWqWWsWWrVVsYYoWWnVVqTW{Z^iAFc:?d8>d8>`8:]77c==g@>h=:rB@uDBQOp:9PObaONKJs;: MLJI~KINL US^[a^nkhemj¥|z¥|zmk`^´õÏÍÿøóÿøòÿÿ÷ùçÜîØÍ°¥~uÕª¡Ètk¿ºÀÅ}I=Ѻ}}IB·|´y°{q³}r´}p³|o¨rg ka¢mcLB TJ[PrG>rI@xQHjF<mIArNFkG?kF>jE=f@.[5ðË÷ÌuþÓlüÕiüÓlÿÐuÿÎvÿÎpÿÐoÿÒmúÐk÷ÎkùÏnüÐqùÍp÷ÌoúÐoýÕkÿÔiÿÏiÿÍmÿÑuÿØwþÝpøÚi÷ÕdûÔhÿÑoþÎnùÐmûÐy÷ÁÈhz=#h-`Yceflr|htgskw`lkw¼Å¡À¨Î£°Ì¡¬Æ¤Ë£¥Õ¦¨ä²²Í½|p>( oIùÃÿÐÿÖüÆgÿÙtúÏhÿÒkÿÖoÿØsÿÖsüÐküÍkÿÏqÿÔvþÐkÿ×qÿÎkÿÄmðW÷\ðTðUæQî]ë]ç^æ`òoÿ±ñ§wæ¢sûºì« ýºÿ½ÿǦÿÆ¡éw÷|ºV: =£A«B!ªB¤=«E"µJ%°>®3 2¯8¯:§3"2!8!: 66', ))¢8'4%1%6,;+0$,(::-0£5;/9Y,M+C)'DUtÍìØö{ßüyÝúòÿîÿsÔõwßÿôÿpÛÿsÞÿwÛô èþñÿíÿ{îÿsèýuéúoáòvãùuáùjÕñn×òåûëþçþóÿ ìÿ}çÿjÖîjÕðìÿvãÿkÖòtÞýqÛú}çÿèÿ ìÿvÚülÎöbÂ÷bÂ÷_ÄêsÕówÎé¡åÿÌëdy5/B@-]#.y4>g#.4 3 / .5755( sI¢p4â°dýÏwÿÖwþÑpÿÙwüÇfÿÓoþÍgÿÑhþÍgÿÑmÿÕsÿÖsÿÒmÿÎjÿÍmþÎnûÔlÿàuÿÜwûÅnÝUíhúªuõ©uõ¯ÿÅú³ú³ÿ¿¢õ¶ñ»ïÀ¡ë¿¢ì¥꿤ù̱óǪôɨòˤÿÓí®ñ§õ¥ÅnS7£7B!»P*¯B¯=¸B¼E½K"²C#¢2¤;(>$34¨:1«:*¨4#©4³?(®=# .&06/%,&;- 7*²>7§//¢1529](1!6A]§ªñÿìÿÔó~×ùtÛüëÿaÉîq×úzÞú|âùußöwçýxîÿbÜô{õÿxîÿíÿåÿtÖþqÔúwÛýwÜüvàÿíÿxáÿ}äÿçÿyÝÿ{ßÿoÓõyÝÿiÍïaÅçyàÿhÏðmÖ÷qÛúoÕøjÄóáÿ§âöÂáêunqBRv/2y2/@8;30)87^=- /- 0«:*¦3«2¶<&«4¹C&µ= ,'' =-$©/#½92¶00¡.1~14Y8<%-(Van©¼ÏçâÿæÿhÊìjÕ÷ìÿèÿäÿéÿyãúvæýwîÿdßùnêÿ]ÔîbÎð{àÿ~àÿoÎùoÓöèÿnÖù|çÿlÔ÷pØûèÿåÿáÿnÐòíÿ`ÂäFªÌnÕöqØùíÿðÿuÛþãÿ¥ìÿd£R^^Q1,|;387*'6,8)0"| ,'nZ1 1- --- NEW FILE --- program glBitmapDemo; uses Forms, frmMain in 'frmMain.pas' {MainForm}; {$R *.RES} begin Application.Initialize; Application.Title := 'GL Bitmap Demo'; Application.CreateForm(TMainForm, MainForm); Application.Run; end. |
From: Michael H. <mh...@us...> - 2000-10-26 17:09:50
|
Update of /cvsroot/pythianproject/Prototypes/GLBitmapDemo In directory slayer.i.sourceforge.net:/tmp/cvs-serv6868/GLBitmapDemo Log Message: Directory /cvsroot/pythianproject/Prototypes/GLBitmapDemo added to the repository |
From: Michael H. <mh...@us...> - 2000-10-26 17:09:08
|
Update of /cvsroot/pythianproject/PythianProject/Source/Units In directory slayer.i.sourceforge.net:/tmp/cvs-serv6787/Source/Units Modified Files: Textures.pas glfd.pas Log Message: no message Index: Textures.pas =================================================================== RCS file: /cvsroot/pythianproject/PythianProject/Source/Units/Textures.pas,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** Textures.pas 2000/07/19 18:23:23 1.5 --- Textures.pas 2000/10/26 17:09:06 1.6 *************** *** 138,141 **** --- 138,142 ---- glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_BLEND); + if FUseAlpha then begin Index: glfd.pas =================================================================== RCS file: /cvsroot/pythianproject/PythianProject/Source/Units/glfd.pas,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -r1.4 -r1.5 *** glfd.pas 2000/10/21 12:29:58 1.4 --- glfd.pas 2000/10/26 17:09:06 1.5 *************** *** 1047,1051 **** conx := conWidth; ! if conx >= conWidth then begin conx := 0; --- 1047,1051 ---- conx := conWidth; ! if (conx >= conWidth) then begin conx := 0; |
From: Michael H. <mh...@us...> - 2000-10-26 17:08:17
|
Update of /cvsroot/pythianproject/Prototypes/Console Demo In directory slayer.i.sourceforge.net:/tmp/cvs-serv6734/Console Demo Modified Files: frmMain.dfm frmMain.pas Log Message: no message ***** Bogus filespec: Demo Index: frmMain.dfm =================================================================== RCS file: /cvsroot/pythianproject/Prototypes/Console Demo/frmMain.dfm,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -r1.1 -r1.2 Binary files /tmp/cvsOh73DS and /tmp/cvs8KkOaB differ Index: frmMain.pas =================================================================== RCS file: /cvsroot/pythianproject/Prototypes/Console Demo/frmMain.pas,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -r1.1 -r1.2 *** frmMain.pas 2000/10/21 12:26:23 1.1 --- frmMain.pas 2000/10/26 17:08:15 1.2 *************** *** 19,24 **** uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ! Menus, ExtCtrls, GLPanel, OpenGL, glfd; type TMainForm = class(TForm) --- 19,32 ---- uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ! Menus, ExtCtrls, GLPanel, OpenGL, glfd, Trace; + const + CONSOLE_SHOWN = 3; + CONSOLE_HIDDEN = 0; + CONSOLE_SHOWING = 1; + CONSOLE_HIDING = 2; + + CONSOLE_START_POS = 3.0; + type TMainForm = class(TForm) *************** *** 34,37 **** --- 42,47 ---- procedure Exit1Click(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); + procedure FormResize(Sender: TObject); + procedure FormClose(Sender: TObject; var Action: TCloseAction); private { Private declarations } *************** *** 39,45 **** --- 49,62 ---- animSquare :integer; CubeEnabled :boolean; + consoleMode :byte; // 0 = hidden; 1 = showing; 2 = hiding; 3 = shown + consoleY :single; // top of console location for animation + strOverlay :TStringList; + textList :integer; procedure consoleInit; procedure consoleProcessKey(Key:Char); procedure consoleProcessCommand(cmd:string); + procedure consoleDraw; + + procedure DumpStrings(s:TStringList); public { Public declarations } *************** *** 67,70 **** --- 84,88 ---- begin // Redefine the viewing volume and viewport when the window size changes. + glClear(GL_COLOR_BUFFER_BIT); gldAspect := GLPanel.Width / GLPanel.Height; *************** *** 99,102 **** --- 117,122 ---- glfSetAnchorPoint(GLF_LEFT_UP); + strOverlay := TStringList.Create; + textList := glGenLists(1); consoleInit; end; *************** *** 191,215 **** glEnable(GL_BLEND); end; - - - { now draw an alpha quad to effectively "clear" the screen but still - leaving something showing } - glLoadIdentity; - glColor4f(0.6,0.6,0.6,0.99); - glTranslatef(0.0,0.0,-1.0); - glBegin(GL_QUADS); - glVertex2f(1.0,1.0); - glVertex2f(1.0,-1.0); - glVertex2f(-1.0,-1.0); - glVertex2f(-1.0,1.0); - glEnd; - glClear(GL_DEPTH_BUFFER_BIT); glLoadIdentity; ! glTranslatef(-1.0,1.0,-1.0); glScalef(0.04,0.04,0.04); ! glfConsoleDraw; except // ignore exceptions - the delphi IDE seems to screw up on my system :( --- 211,249 ---- glEnable(GL_BLEND); end; + // text glLoadIdentity; ! glDisable(GL_DEPTH_TEST); ! glTranslatef(-1.0,1.0,0); glScalef(0.04,0.04,0.04); + glCallList(textList); + glEnable(GL_DEPTH_TEST); + glLoadIdentity; ! { work the different modes } ! if ConsoleMode = CONSOLE_SHOWING then ! begin ! consoleDraw; ! consoleY := consoleY - 0.1; ! if consoleY <= 1.1 then ! begin ! consoleY := 1.0; ! ConsoleMode := CONSOLE_SHOWN; ! end; ! end else if ConsoleMode = CONSOLE_HIDING then ! begin ! consoleDraw; ! consoleY := consoleY + 0.1; ! if consoleY >= CONSOLE_START_POS then ! begin ! ConsoleMode := CONSOLE_HIDDEN; ! consoleY := CONSOLE_START_POS; ! end; ! end else if ConsoleMode = CONSOLE_SHOWN then ! begin ! glLoadIdentity; ! consoleDraw; ! end; except // ignore exceptions - the delphi IDE seems to screw up on my system :( *************** *** 229,237 **** procedure TMainForm.consoleProcessKey(Key: Char); begin ! // add this key to the console, unless it is a backspace key if Key = #8 {backspace} then begin ! glfConsoleBackspace(1); ! consoleCommandBuffer := Copy(consoleCommandbuffer,0,Length(consoleCommandBuffer)-1); end else if Key = #13 then --- 263,290 ---- procedure TMainForm.consoleProcessKey(Key: Char); begin ! // process hide/show key (`) ! if key = #96 then ! begin ! if ConsoleMode = CONSOLE_HIDDEN then ! ConsoleMode := CONSOLE_SHOWING ! else if ConsoleMode = CONSOLE_SHOWN then ! ConsoleMode := CONSOLE_HIDING ! else if ConsoleMode = CONSOLE_SHOWING then ! ConsoleMode := CONSOLE_HIDING ! else if ConsoleMode = CONSOLE_HIDING then ! ConsoleMode := CONSOLE_SHOWING; ! exit; ! end; ! ! // check that we're not hidden ! if consoleMode = CONSOLE_HIDDEN then exit; ! // if not then add this key to the console, unless it is a backspace key if Key = #8 {backspace} then begin ! if Length(ConsoleCommandBuffer) > 0 then ! begin ! glfConsoleBackspace(1); ! consoleCommandBuffer := Copy(consoleCommandbuffer,0,Length(consoleCommandBuffer)-1); ! end; end else if Key = #13 then *************** *** 253,264 **** --- 306,326 ---- begin consoleCommandBuffer := ''; + consoleMode := CONSOLE_SHOWING; + consoleY := CONSOLE_START_POS; glfSetConsoleParam( 45, 24); // this clears the console for 640x480 glfPrintString('Console Demo app v1.0'#13); glfPrintString('by Michael Hearn'#13); + glfPrintString('- Use the ` key to show/hide the console'#13); + glfPrintString('- Type help for command info'#13); glfPrintString('> '); end; procedure TMainForm.consoleProcessCommand(cmd: string); + var + fn :string; // filename for dump command + x,y:integer; + s:string; begin + TraceString(Copy(cmd,0,Pos(#32,cmd))); if (LowerCase(cmd) = 'help') or (cmd = '?') then begin *************** *** 267,270 **** --- 329,333 ---- glfPrintString(' - help/?: displays this text'#13); glfPrintString(' - cube on/off: changes the background cube'#13); + glfPrintString(' - dump "filename": writes filename to the screen'#13); glfPrintString(' - exit: quits the demo'#13); end else if (LowerCase(cmd) = 'cube on') then *************** *** 276,283 **** --- 339,405 ---- CubeEnabled := false; glfPrintString('Cube OFF'#13); + end else if (LowerCase(cmd) = 'cube') then + begin + if CubeEnabled then glfPrintString('Cube is ON') else glfPrintString('Cube is OFF'); + end else if (LowerCase(cmd) = 'dump') then + begin + glNewList(textList,GL_COMPILE); + for y := 0 to 30 do + begin + s := ''; + for x := 0 to 40 do + s := s + Chr(Trunc(Random(Ord('Z') - Ord('A')) + Ord('A'))); + glfDrawSolidString(s); + glTranslatef(0,-2,0); + end; + glEndList; end else if (LowerCase(cmd) = 'exit') then begin Close; end; + end; + + procedure TMainForm.FormResize(Sender: TObject); + begin + SetProjection(Sender); + end; + + procedure TMainForm.consoleDraw; + begin + { now draw an alpha quad to effectively "clear" the screen but still + leaving something showing } + glColor4f(0.6,0.6,0.6,0.99); + glTranslatef(0.0,consoleY-1,-1.0); + glBegin(GL_QUADS); + glVertex2f(1.0,1.0); + glVertex2f(1.0,-1.0); + glVertex2f(-1.0,-1.0); + glVertex2f(-1.0,1.0); + glEnd; + + + glClear(GL_DEPTH_BUFFER_BIT); + glLoadIdentity; + glTranslatef(-1.0,consoleY,-1.0); + glScalef(0.04,0.04,0.04); + + glfConsoleDraw; + end; + + procedure TMainForm.DumpStrings(s: TStringList); + var a:integer; + begin + // dumps the contents of s to the glf console + for a := 0 to s.Count-1 do + begin + glfDrawSolidString(s.Strings[a]); + glTranslatef(0.0,-2,0.0); + end; + end; + + procedure TMainForm.FormClose(Sender: TObject; var Action: TCloseAction); + begin + strOverlay.free; + glDeleteLists(textList,1); end; |
From: Michael H. <mh...@us...> - 2000-10-26 17:08:17
|
Update of /cvsroot/pythianproject/Prototypes/BasicGLapp In directory slayer.i.sourceforge.net:/tmp/cvs-serv6734/BasicGLapp Modified Files: frmMain.pas Log Message: no message Index: frmMain.pas =================================================================== RCS file: /cvsroot/pythianproject/Prototypes/BasicGLapp/frmMain.pas,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** frmMain.pas 2000/10/24 17:21:24 1.3 --- frmMain.pas 2000/10/26 17:08:15 1.4 *************** *** 1,5 **** unit frmMain; ! { Shows texture fonts loaded from a grid. (C) Michael Hearn 2000 mh...@su... } --- 1,5 ---- unit frmMain; ! { Basic 3D application (C) Michael Hearn 2000 mh...@su... } *************** *** 30,35 **** { Public declarations } - TestTex :TTexture; - // Animation trackers can go here animSquare: integer; // this var will be cycled through 1..360 --- 30,33 ---- *************** *** 38,55 **** // a rotating square :) - GridSquareWidth,GridSquareHeight :integer; // size of grid square - GridCharSpacing:integer; // spacing between letters. - - txtfile :TStringList; - counter1 :integer; - - txtList:integer; procedure SetProjection(Sender: TObject); - - procedure DrawGridChar(C:Char); - function DrawGridSquare(X,Y:integer):integer; - procedure DrawGridString(s:String); - - procedure MakeList; end; --- 36,40 ---- *************** *** 102,120 **** // uncomment this line to enable alpha blending - TestTex := TTexture.Create; - TestTex.UseMipmaps := true; - TestTex.UseAlpha := true; - TestTex.LoadFromFile('CourierNew Grid.bmp'); - - GridSquareWidth := 20; - GridSquareHeight := 20; - GridCharSpacing := 15; - - txtFile := TStringList.Create; - txtFile.LoadFromFile('movies.txt'); - - txtList := glGenLists(1); - Counter1 := 0; - MakeList; end; --- 87,90 ---- *************** *** 203,243 **** glVertex3f(-1.0, -1.0, 1.0); glEnd; - - glLoadIdentity; - - glClear(GL_DEPTH_BUFFER_BIT); - glEnable(GL_TEXTURE_2D); - glEnable(GL_BLEND); - - // change co-ordinate system to 1:1 pixel mapping - glScalef(2.0 / GLPanel.Width, -2.0 / GLPanel.Height, 1.0); - glTranslatef(-(GLPanel.Width / 2), -(GLPanel.Height / 2), 0); - - glMatrixMode(GL_TEXTURE); - glLoadIdentity; - glScalef(1/256,1/256,1); - - TestTex.Draw; - // left = 256 right = 0 - // top = 0 bottom = 256 - // - // left = 256 - (20 * (x-1)) - - glMatrixMode(GL_MODELVIEW); - - glEnable(GL_SCISSOR_TEST); - - inc(Counter1); - if Counter1 >= 100 then - begin - MakeList; - Counter1 := 0; - end; - glScissor(10,10,630,470); - gltranslatef(0,animSquare-500,0); - glCallList(txtList); - glDisable(GL_SCISSOR_TEST); - - glDisable(GL_TEXTURE_2D); end; --- 173,176 ---- *************** *** 245,325 **** begin Close; - end; - - function TMainForm.DrawGridSquare(X,Y: integer):integer; - var l,t:integer; - begin - Result := -1; - if (l <= 0) or (t <= 0) then - exit; - - l := 256 - (GridSquareWidth * (x-1)); - t := (Y - 1) * GridSquareHeight; - - glBegin(GL_QUADS); - glTexCoord2f(l,t); - glVertex2f(0,0); - glTexCoord2f(l,t+GridSquareHeight); - glVertex2f(0,GridSquareHeight); - glTexCoord2f(l-GridSquareWidth,t+GridSquareHeight); - glVertex2f(GridSquareWidth,GridSquareHeight); - glTexCoord2f(l-GridSquareWidth,t); - glVertex2f(GridSquareWidth,0); - glEnd; - - result := 0; - end; - - procedure TMainForm.DrawGridChar(C: Char); - var - AlphaOffset :integer; - x,y:integer; - begin - C := UpCase(C); - if (Ord(C) >= Ord('A')) or (Ord(C) <= Ord('Z')) then - begin - AlphaOffset := Ord(C) - Ord('A') + 1; - // AlphaOffset contains the grid offset of the character now - // in this test grid there are 12 per line - Y := (AlphaOffset div 12); - if AlphaOffset mod 12 <> 0 then // need this in case letter is last on grid line - inc(y); - X := AlphaOffset - ((Y-1)*12); - TraceString(IntToStr(X)+','+IntToStr(Y)); - DrawGridSquare(x,y); - end; - end; - - procedure TMainForm.DrawGridString(s: String); - var a:integer; - begin - for a := 1 to Length(s) do - begin - if s[a] = #13 then - begin - glTranslatef(-GLPanel.Width-GridCharSpacing,20,0) - end else begin - DrawGridChar(s[a]); - glTranslatef(GridCharSpacing,0,0); - end; - end; - end; - - procedure TMainForm.MakeList; - var x,y:integer; - begin - glNewList(txtList,GL_COMPILE); - for y := 1 to 800 div 20 do - begin - glPushMatrix; - for x := 1 to (640 div GridCharSpacing) do - begin - DrawGridChar(Chr(Trunc(Random(Ord('Z') - Ord('A')) + Ord('A')))); - glTranslatef(GridCharSpacing,0,0); - end; - glPopMatrix; - glTranslatef(0,20,0); - end; - glEndList; end; --- 178,181 ---- |
From: Michael H. <mh...@us...> - 2000-10-24 17:21:27
|
Update of /cvsroot/pythianproject/Prototypes/BasicGLapp In directory slayer.i.sourceforge.net:/tmp/cvs-serv11441 Modified Files: frmMain.pas Log Message: added scissor test -mike Index: frmMain.pas =================================================================== RCS file: /cvsroot/pythianproject/Prototypes/BasicGLapp/frmMain.pas,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** frmMain.pas 2000/10/23 20:55:11 1.2 --- frmMain.pas 2000/10/24 17:21:24 1.3 *************** *** 226,236 **** glMatrixMode(GL_MODELVIEW); inc(Counter1); ! if Counter1 >= 10 then begin MakeList; Counter1 := 0; end; glCallList(txtList); glDisable(GL_TEXTURE_2D); --- 226,241 ---- glMatrixMode(GL_MODELVIEW); + glEnable(GL_SCISSOR_TEST); + inc(Counter1); ! if Counter1 >= 100 then begin MakeList; Counter1 := 0; end; + glScissor(10,10,630,470); + gltranslatef(0,animSquare-500,0); glCallList(txtList); + glDisable(GL_SCISSOR_TEST); glDisable(GL_TEXTURE_2D); |
From: Michael H. <mh...@us...> - 2000-10-23 20:55:13
|
Update of /cvsroot/pythianproject/Prototypes/BasicGLapp In directory slayer.i.sourceforge.net:/tmp/cvs-serv28155 Modified Files: frmMain.pas Added Files: CourierNew Grid.bmp texdemo.cfg texdemo.dof texdemo.dpr Removed Files: Basic3D.cfg Basic3D.dof Basic3D.dpr Basic3D.res Log Message: no message ***** Bogus filespec: CourierNew ***** Error reading new file: (2, 'No such file or directory') --- NEW FILE --- -$A+ -$B- -$C+ -$D+ -$E- -$F- -$G+ -$H+ -$I+ -$J+ -$K- -$L+ -$M- -$N+ -$O+ -$P+ -$Q- -$R- -$S- -$T- -$U- -$V+ -$W- -$X+ -$YD -$Z1 -cg -AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -H+ -W+ -M -$M16384,1048576 -K$00400000 -U"..\..\PythianProject\Source\Units\" -O"..\..\PythianProject\Source\Units\" -I"..\..\PythianProject\Source\Units\" -R"..\..\PythianProject\Source\Units\" --- NEW FILE --- [Compiler] A=1 B=0 C=1 D=1 E=0 F=0 G=1 H=1 I=1 J=1 K=0 L=1 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=0 V=1 W=0 X=1 Y=1 Z=1 ShowHints=1 ShowWarnings=1 UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [Linker] MapFile=0 OutputObjs=0 ConsoleApp=1 DebugInfo=0 RemoteSymbols=0 MinStackSize=16384 MaxStackSize=1048576 ImageBase=4194304 ExeDescription= [Directories] OutputDir= UnitOutputDir= PackageDLLOutputDir= PackageDCPOutputDir= SearchPath=..\..\PythianProject\Source\Units\ Packages=VCL40;VCLX40;VCLDB40;VCLDBX40;VCLSMP40;QRPT40;TEEUI40;TEEDB40;TEE40;ibevnt40;nmfast40;Python_d4;PythonVCL_d4;NtfyIcon;glPanelPkg Conditionals= DebugSourceDirs= UsePackages=0 [Parameters] RunParams= HostApplication= [Version Info] IncludeVerInfo=0 AutoIncBuild=0 MajorVer=1 MinorVer=0 Release=0 Build=0 Debug=0 PreRelease=0 Special=0 Private=0 DLL=0 Locale=2057 CodePage=1252 [Version Info Keys] CompanyName= FileDescription= FileVersion=1.0.0.0 InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion=1.0.0.0 Comments= [Excluded Packages] $(DELPHI)\Components\Indy\dclIndy40.bpl=Internet Direct "Indy" for D4 Property and Component Editors [HistoryLists\hlUnitAliases] Count=1 Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [HistoryLists\hlSearchPath] Count=1 Item0=..\..\PythianProject\Source\Units\ [HistoryLists\hlOutputDirectorry] Count=1 Item0=. --- NEW FILE --- program texdemo; uses Forms, frmMain in 'frmMain.pas' {MainForm}; {$R *.RES} begin Application.Initialize; Application.Title := 'Texure Demo app'; Application.CreateForm(TMainForm, MainForm); Application.Run; end. Index: frmMain.pas =================================================================== RCS file: /cvsroot/pythianproject/Prototypes/BasicGLapp/frmMain.pas,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -r1.1 -r1.2 *** frmMain.pas 2000/10/21 12:26:23 1.1 --- frmMain.pas 2000/10/23 20:55:11 1.2 *************** *** 1,13 **** unit frmMain; ! { Basic 3D OpenGL application that uses the GLPanel component ! by Michael Hearn 2000 for the Pythian Project } interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ! Menus, ExtCtrls, GLPanel, OpenGL, glfd; type --- 1,15 ---- unit frmMain; ! { Shows texture fonts loaded from a grid. ! (C) Michael Hearn 2000 ! mh...@su... } + interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ! Menus, ExtCtrls, GLPanel, OpenGL, Textures, Trace; type *************** *** 28,31 **** --- 30,35 ---- { Public declarations } + TestTex :TTexture; + // Animation trackers can go here animSquare: integer; // this var will be cycled through 1..360 *************** *** 34,38 **** --- 38,55 ---- // a rotating square :) + GridSquareWidth,GridSquareHeight :integer; // size of grid square + GridCharSpacing:integer; // spacing between letters. + + txtfile :TStringList; + counter1 :integer; + + txtList:integer; procedure SetProjection(Sender: TObject); + + procedure DrawGridChar(C:Char); + function DrawGridSquare(X,Y:integer):integer; + procedure DrawGridString(s:String); + + procedure MakeList; end; *************** *** 82,87 **** glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); ! //glBlendFunc(GL_SRC_ALPHA,GL_ONE); // uncomment this line to enable alpha blending end; --- 99,120 ---- glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); ! glBlendFunc(GL_SRC_ALPHA,GL_ONE); // uncomment this line to enable alpha blending + + TestTex := TTexture.Create; + TestTex.UseMipmaps := true; + TestTex.UseAlpha := true; + TestTex.LoadFromFile('CourierNew Grid.bmp'); + + GridSquareWidth := 20; + GridSquareHeight := 20; + GridCharSpacing := 15; + + txtFile := TStringList.Create; + txtFile.LoadFromFile('movies.txt'); + + txtList := glGenLists(1); + Counter1 := 0; + MakeList; end; *************** *** 116,120 **** // Draw the six faces of the cube. // ! glColor4f(1.0,0.0,0.0,0.75); glBegin(GL_POLYGON); glNormal3f(0.0, 0.0, 1.0); --- 149,154 ---- // Draw the six faces of the cube. // ! glDisable(GL_BLEND); ! glColor4f(1.0,0.0,0.0,1.0); glBegin(GL_POLYGON); glNormal3f(0.0, 0.0, 1.0); *************** *** 125,129 **** glEnd; ! glColor4f(0.0,1.0,0.0,0.75); glBegin(GL_POLYGON); glNormal3f(0.0, 0.0, -1.0); --- 159,163 ---- glEnd; ! glColor4f(0.0,1.0,0.0,1.0); glBegin(GL_POLYGON); glNormal3f(0.0, 0.0, -1.0); *************** *** 134,138 **** glEnd; ! glColor4f(0.0,0.0,1.0,0.75); glBegin(GL_POLYGON); glNormal3f(-1.0, 0.0, 0.0); --- 168,172 ---- glEnd; ! glColor4f(0.0,0.0,1.0,1.0); glBegin(GL_POLYGON); glNormal3f(-1.0, 0.0, 0.0); *************** *** 143,147 **** glEnd; ! glColor4f(0.0,1.0,1.0,0.75); glBegin(GL_POLYGON); glNormal3f(1.0, 0.0, 0.0); --- 177,181 ---- glEnd; ! glColor4f(0.0,1.0,1.0,1.0); glBegin(GL_POLYGON); glNormal3f(1.0, 0.0, 0.0); *************** *** 152,156 **** glEnd; ! glColor4f(1.0,1.0,0.0,0.75); glBegin(GL_POLYGON); glNormal3f(0.0, 1.0, 0.0); --- 186,190 ---- glEnd; ! glColor4f(1.0,1.0,0.0,1.0); glBegin(GL_POLYGON); glNormal3f(0.0, 1.0, 0.0); *************** *** 169,172 **** --- 203,238 ---- glVertex3f(-1.0, -1.0, 1.0); glEnd; + + glLoadIdentity; + + glClear(GL_DEPTH_BUFFER_BIT); + glEnable(GL_TEXTURE_2D); + glEnable(GL_BLEND); + + // change co-ordinate system to 1:1 pixel mapping + glScalef(2.0 / GLPanel.Width, -2.0 / GLPanel.Height, 1.0); + glTranslatef(-(GLPanel.Width / 2), -(GLPanel.Height / 2), 0); + + glMatrixMode(GL_TEXTURE); + glLoadIdentity; + glScalef(1/256,1/256,1); + + TestTex.Draw; + // left = 256 right = 0 + // top = 0 bottom = 256 + // + // left = 256 - (20 * (x-1)) + + glMatrixMode(GL_MODELVIEW); + + inc(Counter1); + if Counter1 >= 10 then + begin + MakeList; + Counter1 := 0; + end; + glCallList(txtList); + + glDisable(GL_TEXTURE_2D); end; *************** *** 174,177 **** --- 240,320 ---- begin Close; + end; + + function TMainForm.DrawGridSquare(X,Y: integer):integer; + var l,t:integer; + begin + Result := -1; + if (l <= 0) or (t <= 0) then + exit; + + l := 256 - (GridSquareWidth * (x-1)); + t := (Y - 1) * GridSquareHeight; + + glBegin(GL_QUADS); + glTexCoord2f(l,t); + glVertex2f(0,0); + glTexCoord2f(l,t+GridSquareHeight); + glVertex2f(0,GridSquareHeight); + glTexCoord2f(l-GridSquareWidth,t+GridSquareHeight); + glVertex2f(GridSquareWidth,GridSquareHeight); + glTexCoord2f(l-GridSquareWidth,t); + glVertex2f(GridSquareWidth,0); + glEnd; + + result := 0; + end; + + procedure TMainForm.DrawGridChar(C: Char); + var + AlphaOffset :integer; + x,y:integer; + begin + C := UpCase(C); + if (Ord(C) >= Ord('A')) or (Ord(C) <= Ord('Z')) then + begin + AlphaOffset := Ord(C) - Ord('A') + 1; + // AlphaOffset contains the grid offset of the character now + // in this test grid there are 12 per line + Y := (AlphaOffset div 12); + if AlphaOffset mod 12 <> 0 then // need this in case letter is last on grid line + inc(y); + X := AlphaOffset - ((Y-1)*12); + TraceString(IntToStr(X)+','+IntToStr(Y)); + DrawGridSquare(x,y); + end; + end; + + procedure TMainForm.DrawGridString(s: String); + var a:integer; + begin + for a := 1 to Length(s) do + begin + if s[a] = #13 then + begin + glTranslatef(-GLPanel.Width-GridCharSpacing,20,0) + end else begin + DrawGridChar(s[a]); + glTranslatef(GridCharSpacing,0,0); + end; + end; + end; + + procedure TMainForm.MakeList; + var x,y:integer; + begin + glNewList(txtList,GL_COMPILE); + for y := 1 to 800 div 20 do + begin + glPushMatrix; + for x := 1 to (640 div GridCharSpacing) do + begin + DrawGridChar(Chr(Trunc(Random(Ord('Z') - Ord('A')) + Ord('A')))); + glTranslatef(GridCharSpacing,0,0); + end; + glPopMatrix; + glTranslatef(0,20,0); + end; + glEndList; end; --- Basic3D.cfg DELETED --- --- Basic3D.dof DELETED --- --- Basic3D.dpr DELETED --- --- Basic3D.res DELETED --- |
From: Michael H. <mh...@us...> - 2000-10-21 12:30:02
|
Update of /cvsroot/pythianproject/PythianProject/Source/Units In directory slayer.i.sourceforge.net:/tmp/cvs-serv13585 Modified Files: glfd.pas Log Message: added code to glf lib -mike Index: glfd.pas =================================================================== RCS file: /cvsroot/pythianproject/PythianProject/Source/Units/glfd.pas,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 *** glfd.pas 2000/10/17 06:05:28 1.3 --- glfd.pas 2000/10/21 12:29:58 1.4 *************** *** 22,26 **** Translation to Delphi: - Kamil Krauspe (main guy) ! - Michael Hearn (minor changes) - Darryl Long (teeny little changes) --- 22,26 ---- Translation to Delphi: - Kamil Krauspe (main guy) ! - Michael Hearn (minor changes), added console commands + console bug fixes - Darryl Long (teeny little changes) *************** *** 117,120 **** --- 117,123 ---- procedure glfSetCursorBlinkRate(Rate: Integer); + // @@added mike - 20th October 2000 + procedure glfConsoleBackspace(c:integer); + implementation *************** *** 222,225 **** --- 225,229 ---- glfSetSpaceSize(2.0); glfSetSymbolDepth(0.2); + glfSetConsoleParam(40, 20); glfConsoleClear; *************** *** 1028,1032 **** procedure glfPrint(const s: string; lenght: Integer); var ! i{, e}: Integer; begin for i := 1 to lenght do --- 1032,1037 ---- procedure glfPrint(const s: string; lenght: Integer); var ! i,c{, e}: Integer; ! str2:string; begin for i := 1 to lenght do *************** *** 1048,1053 **** if cony >= conHeight then begin //* Shift all console contents up */ ! Move(conData[conWidth], conData, conWidth * (conHeight - 1)); //* Fill bottom line by spaces */ FillChar(conData[conWidth * (conHeight - 1)], conWidth, 0); --- 1053,1060 ---- if cony >= conHeight then begin + // @@mike - modified here to fix bug //* Shift all console contents up */ ! conData := Copy(conData,conWidth,conWidth* (conHeight-1)); ! SetLength(conData,conWidth*conHeight); //* Fill bottom line by spaces */ FillChar(conData[conWidth * (conHeight - 1)], conWidth, 0); *************** *** 1110,1113 **** --- 1117,1132 ---- conCursorCount := Rate; conCursorMode := GLF_YES; + end; + end; + + procedure glfConsoleBackspace(c:integer); + var a:integer; + begin + // just replace the character at the current location with a space, + // then move back a character. do this once for each c + for a := 1 to c do + begin + conData[cony * conWidth + (conx-1)] := #0; + if conx > 0 then dec(conX); end; end; |
Update of /cvsroot/pythianproject/Prototypes/Console Demo In directory slayer.i.sourceforge.net:/tmp/cvs-serv13420/Console Demo Added Files: ConsoleDemo.cfg ConsoleDemo.dof ConsoleDemo.dpr ConsoleDemo.res arial1.glf frmMain.dfm frmMain.pas Log Message: added basic GL app and Console demo ***** Bogus filespec: Demo --- NEW FILE --- -$A+ -$B- -$C+ -$D+ -$E- -$F- -$G+ -$H+ -$I+ -$J+ -$K- -$L+ -$M- -$N+ -$O+ -$P+ -$Q- -$R- -$S- -$T- -$U- -$V+ -$W- -$X+ -$YD -$Z1 -cg -AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -H+ -W+ -M -$M16384,1048576 -K$00400000 -U"..\..\PythianProject\Source\Units\" -O"..\..\PythianProject\Source\Units\" -I"..\..\PythianProject\Source\Units\" -R"..\..\PythianProject\Source\Units\" --- NEW FILE --- [Compiler] A=1 B=0 C=1 D=1 E=0 F=0 G=1 H=1 I=1 J=1 K=0 L=1 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=0 V=1 W=0 X=1 Y=1 Z=1 ShowHints=1 ShowWarnings=1 UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [Linker] MapFile=0 OutputObjs=0 ConsoleApp=1 DebugInfo=0 RemoteSymbols=0 MinStackSize=16384 MaxStackSize=1048576 ImageBase=4194304 ExeDescription= [Directories] OutputDir= UnitOutputDir= PackageDLLOutputDir= PackageDCPOutputDir= SearchPath=..\..\PythianProject\Source\Units\ Packages=VCL40;VCLX40;VCLDB40;VCLDBX40;VCLSMP40;QRPT40;TEEUI40;TEEDB40;TEE40;ibevnt40;nmfast40;Python_d4;PythonVCL_d4;NtfyIcon;glPanelPkg Conditionals= DebugSourceDirs= UsePackages=0 [Parameters] RunParams= HostApplication= [Version Info] IncludeVerInfo=0 AutoIncBuild=0 MajorVer=1 MinorVer=0 Release=0 Build=0 Debug=0 PreRelease=0 Special=0 Private=0 DLL=0 Locale=2057 CodePage=1252 [Version Info Keys] CompanyName= FileDescription= FileVersion=1.0.0.0 InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion=1.0.0.0 Comments= [Excluded Packages] $(DELPHI)\Components\Indy\dclIndy40.bpl=Internet Direct "Indy" for D4 Property and Component Editors [HistoryLists\hlUnitAliases] Count=1 Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [HistoryLists\hlSearchPath] Count=1 Item0=..\..\PythianProject\Source\Units\ [HistoryLists\hlOutputDirectorry] Count=1 Item0=. --- NEW FILE --- program ConsoleDemo; uses Forms, frmMain in 'frmMain.pas' {MainForm}; {$R *.RES} begin Application.Initialize; Application.Title := 'Console App'; Application.CreateForm(TMainForm, MainForm); Application.Run; end. --- NEW FILE --- --- NEW FILE --- GLFArial Normal 1 `åP=Nb¾ð§Æ=¡Ë>ð§Æ=.?ð§Æ½.?ð§Æ½¡Ë>9´H½Nb¾¢E¶=¿¢E¶== ×¾5^º½= ×¾5^º½¿ # h=¾d;¿héJ¾ »X94?q= ¾X94?ù£X¾ï§>X9ô¾ï§>X9ô¾ÀJ>f¾s¾ÀJ>¾Âõ½X9ô¾Âõ½X9ô¾ $DF`åP=L7I¿`åP=A ¿G8M>º¾¿ö~£>}>¿UNË>ÞžuØ>÷xq¾äeÕ>)(¾3ÝË>]ßǽk¼>¦½§>2O<ùi>*Xc=îÌT>Ñ"»=F>ä=`åP=ÃE>`åP== ?¼Aô=!ä?)\/>¼u?tT>Eî>ú~j>¦Ä>'1È>`åÐ>9³> ?Óù>bº$??1>2?`åP=X9?`åP=ÍÌL?ï'½ÍÌL?ï'½X9?ö&6¾'Ú1? ¾l#?k»¾V¹?q=ʾF¶»>bžßù> µ¾ÀJ>of¾ä÷>Óõt¾Ì|§=4 ¾·¸=ï'½]£e¹ï'½íü¾O=¾î¾VM¾ïS;B`u¾¦¾®¾/]¾uؾmç{¾Vξª·¾u¸¾¹Æç¾êz¾¿Évn¾B¿/ ¾³~¿ï'½Ä ¿ï'½L7I¿ï'½°&>Ïó¾ïI>ÅpE¾z>9`g¾h=>!°r¾uçÁ>Ae¾hè>²õ<¾þÔ?1´ú½?ï'½P?`åP=ÅżX >Í|½{¼`>ÛùÞ½ßP>m;-¾Ë¡ >ö(|¾c|>øQ¾EfN>ºIÔ¾l >#Ýï¾`åP=íü¾2 <= < ;<;; :; : :9:898787676565 45 4 !4!"34"3"#23#2#$ ?W¾Vó>V¾¾½>8I¾fh>Õ"¢¾òz@>Ÿ¾>1Ô¾ßO >Ú7ï¾ ¿ >ÍÌ¿`·>3S ¿u=ñ>dæ¿Â ?ï¾£Z?1Ô¾P?w¾Tã%¿Z¸Ô>X94?C7>X94?f¾Ó¾Tã%¿Ú #>羨n^>¿k¹>"Q ¿-Ò>Tã%¿cÑ?ÙB ¿°?Fa¿+?+è¾Å 0?¨n¾õ+?Ìy&¾ué?f½» ?; <^ºÑ>Âõ<ÛO>xGÆ;ØóU>À½ó!>ïT0¾)\>õ¾>ï>àKÁ½òÑ?°¾N ?cL¾ÍÌ?X¾;U ?!®Ô¾î?Ùø¾iï>¿ Ó>L7 ¿¸>¿ºK¢>Ùø¾rS>P9Ö¾V>' ¡¾(E>%²O¾s¢>â"¾ j¸> Á½Ï÷Ó>ï§½ 3 34 45 5 $5B'øC=Õxi>ìQ¸=¬tï>ìQ¸=.?ìQ¸½.?ìQ¸½¬tï>CK½Õxi> ¾W A¾u )¡0¨<4L¿= ÷=ge¿í@>u ¾õØF>-^=33>iå>úC3=Xä÷>ÀʽX94?bX¾X94?ÈÎû½,ò?sh½1â>·Cü£>Ãô=<}B>ñe"=+Áâ<9´H=C¾o¼^d¿bX¾#Ûy¿Àʽ#Ûy¿ *Àz<¾'1Ø>mr½ZÌ>¾²õ¬>nj`¾ûÎo>¼$î½ ×#>¡I½¢ñt>ÄíP»çû±>Ãy=+w>±Âí= ×#>Îb>ûÎo>z >sf«>ßÄ=ZÌ>]6>f¼Õ>¼t>B`å>òÒ}>X?-² >?1,=eãù>Ô(d=1^?¶ó}=X94?o½X94?r½¤Ä?Ûù>½µpù>1^¾¯²?Û}¾X?¼t¾B`å> P=ÀʾP=X94½¬Ú>X94½¬Ú>`åÐ=P=`åÐ=P=°rè>P½°rè>P½`åÐ=¬Ú¾`åÐ=¬Ú¾X94½P½X94½P½Àʾ , 8 ;¿UX»|`+¿wH±¼½s8¿ÈT½àA¿\½9´H¿Y½¬Z¿Û2`<°çO¿çs=+2B¿h°="Q0¿\Â=¿\Â== ×¾{®½= ×¾{®½¿ ×¾ìQ¸½= ×¾ìQ¸½¿ '1 ü©q>Å 0?h >Å 0?®G¡= ?X9´»X9?ÂMæ½mÞ>ü©q¾Zd»>ü©q¾HáZ>íÓ!¾}>¼Ì½ >êxL<Há²>w¾=ð§Î>w¾=¿ü©q>¿ 2(&{¤Q¾B`å¾+3¾[{ϾN ¾5´¹¾Ò½/¾%;6=ÿ$N¾åB>×½P>mÇ<>³>³&Ö=ñ¸È>39>=ÖÔ>vý>ßߨ>Jª> Ë>â;ñ>¬¨¡>¢ð?J$A>À)?gÑ»<Å 0?/¾f*?ß¿¾\ã?#¡µ¾ÓKô>ñɾåТ>¹þm¾¾>yÍ[¾KuÑ>¼'¾ëú>8ª½I ?\ä<Ù?Úáï=f» ?ÿG>¬Äü>`z>Ø>5î >mç«>Ky>~;y>ïo@>P>¤=.ã<¢µÂ½?¾L[¾ëj¾t¾F¶£¾A)º¾= ϾkØÏ¾±û¾·b×¾ÇK¿/MÙ¾¿æÙ>¿æÙ>B`å¾ $%&#$&#&'#' '397?¾æ;оí~¾u¿sc*¾ Ñ¿32H¼d;¿\>">¿Çõ>V¿ÊâÆ>TÀ¾+Ö> Âa¾7Î>dÚ½;¶>Bv^¼>;a=½Ä8>·CÃ=v§>äø>Çõ>¥P> ±>?>´È¶>¾µ>BͰ>$Dá>/Û>þ)?ª>]û?3>$?êЩ=:?-?sh¼Å 0?!¾i*? ?¾Dß?#0¶¾´þ>Vξ¢E¶>Ház¾ï§>Pà]¾¼tÛ>l*¾Å ò¾7,¼mçû¾&ǽ{gô¾ö|-¾dçݾºöe¾sg¶¾Ë¡ ¾ÙÎw¾+Ö¾Ý$¾()*'(*&'*78 - ,-%&*%*+%+,%,$%$#$# # "#""!"!!! 84À>¿À>+¾ ×ã>+¾ ×ã>¾À>¾À>.?n>.? ×ã¾¾ ×ã¾+¾lç=+¾lç=¿3¾¾lç=ÄÚ>lç=¾ 5%#RdžhæÑ¾`å¾Õ"¿A0¾<õ¿= W¼d;¿çÿ5>D¿ ª¥>ÀÌ>¹Æ§¾Ù>Qh)¾lÑÊ> ?:âx>Pá>y@9>T8b>úÕ< $677 º>Òn ?¿ôƾ3¤>uؾÞ!E9¯°È¾O"¾>¾ãOô¾bi ¾ö¿0ò²<d;¿>>>´¿hi>¸¿Y>ÀÌÿ¾¶ó½>¢íо ëÑ>ã§¾uØ>1<¾jÊ>àÚ¼ï>p²í=ÇB>mãO>¢5=hm>O3½Ôb>¾®B>$µP¾\<>9´¾p(|= ¾óVm>¼tc¾K9·>p/¾æ>Îl×½¤?o.½*?Dë<Ù?_bì=¹ ?Ó¥?>C7û>ÞÊb>q<ß>í|>¢E¶>VÎ>j¼>Óe¾+Ù½ÍÌ,¾v4<þ°½·E=ä£E<À=T;ã=·E=øSC>v4<ÐGy>ûW½Ë¡ >4E¾gy>Ûú¡¾nB>Ï£Ò¾Åä=ñ¾ä»<mçû¾nùH½ÿéö¾^æ½·ñç¾B+¾¨qϾU¾+ݾ 23 #$ 12010/0/ ./ . .-.-,-,,+,+*+*)*)()('('$67¬Z>?zÆ=zS¹>`åP¼Ëõ6>÷"Ú½:?żØÒ3¾p¾`¾¯Ý¾×£p¾¿½¿_R½fÕ¾`åP¼h}¾:ç= ¸¼`å0>¾KI>/>8HÈ>ázÔ>?ázÔ>ú~*?ázÔ¾ú~*?ázÔ¾? >¶ó½>{À´>þÔ°>Høö>Õx>ö)?ú*>ã)?d»Å 0?¾ê*?5^¾Z¹?g±¾(îø>¶ó½¾ëý¶>Âß·¾Há>䣥¾ìùJ>>̾rÀ>°Ê5¾]jÄ=ëF¾íºß>º¡¾ »B`å<4 Î=ú<ÒQ>>8>½5x>É̾ˡ >Ap¾x>Åu¬¾e@>B´Ö¾ÿÎÖ=¢ò¾j÷«:mçû¾·A½Nz÷¾ï ¾73ê¾(¶B¾ÚÔ¾k¾G9¸¾9¾kd¾Ë¡ ¾Háj¾)121)* 89 8 787676 56 5 545)4)()(('(''&'&%&%$%$#$#"#"!"! ! / /./...-/A9::µ2¹¾%\྾Dß ¿i4¾`俾!½d;¿ó¾=-\¿ÀT>w¾¿5´>5ç¾-´»>}饾±4Ð>×ø¾= ×>x^=#.Ð>0I>»>jÛ>ÄÍ>ö ?¯V>Há?ÖÈÎ=áÐ+?¼Å 0?h4¾ (?F`¾Ë¡?¯_Ⱦ Ü>= ×¾³E>ɾùK«=ë¾VN½«!A¾_b¾ùó-½çû)¾H=.¾?å>õ0ô½|dS>;á ½Ý$>()0;> ë¼>]¿ u>Ý(b¾¸Z>V¾º¡9>Û¥½¾>Í#×¾Ðï»=ªñê¾óv=ª÷¾½mçû¾ ç½õÕõ¾Õ2¾Ó¡ã¾ Ua¾Âöþ¶ó}¾¾ÍÌ̾㥾©öi>fg>æ$4>bKO=ïÄ=0eà»B»ôýÔ¼ÏÒ½0eà»Rd=¾bKO=á}u¾N>¾ûÎ>ú|t¾ T¿>1`9¾ Âñ>èÆ½%[ ?I¸:Ù?!Ä=¾¿ ?iá2>hçô>ì¥i>0ðÄ>mç{>Ï>9*99 9 () 898787 67 6 $#$565"#"!"! ! 5454343232121010/0/./.-.-,-,,+,+*+*)9:ìQ¸=>ìQ¸=Ãõ¨>ìQ¸½Ãõ¨>ìQ¸½>ìQ¸=¿ìQ¸== ×¾ìQ¸½= ×¾ìQ¸½¿ ×¾{®½= ×¾{®½¿ <uØ>òÒ;uØ>#Ûy¾í|¾+=uØ>-²>uØ>î>uؾ/Ý=uؾ ×#½ ×#½ ×¾d;ß½= ×¾d;ß½¿ !!!"""###$$$% +A¿Cá¿7.¿ÑA+¿Ç¿¨ÇF¿¡òç¾x)]¿`9¾¬m¿ýؾͫv¿AÕh=#Ûy¿ö'>QLv¿'Õ>ºk¿8i?×Z¿ÀË,?ÃõD¿wD?À,¿Ï÷S?ôý¿ +?ôý¿Ø?ª/¿ nà>LâD¿Jµ>3§S¿w¾_=uX¿® ¾¡ÛS¿3Ý«¾5´E¿ kû¾«-¿Û¿ÏM¿éº,¿ºô¿¾!°2¿X94¾éº,¿¶¹±<Û¿Ý|S>jPü¾êzº>´r¯¾ ]¾!?Ww¤¾å|á>Aξ{¾¾>«â¾J`£>Õxé¾¼]>4Jç¾A>s¾à¾Üb>,×¾>}ë˾Ás>H6·¾' >+¾ ëÑ>Tã¥>J>Tã¥>ÕÐf>ºA>½.>* >6Ù=þÖ>f=7®>¤ ½33³>¾@ª>>{¾bf>5]¯¾{jE>%\ؾÄí=GÉó¾7T½íü¾T¾Ä ÷¾ü©¡¾Zbå¾VÔ¾ßNʾÔdþ¾þ*¨¾Ëö ¿ï¾ê°¿Ù&5¾¿S=Ù½¿*7½k¿N¶=Ñ¿j¼=péè¾Çc¦¾¾ª¾= W½µß¾tû<'Ùj¾(Í=q:¾ðN>âv¾&5D>[ ¨½ûZ>´Éá¼®Ga>?Q=P>à*ï=?5>M%>ìù=X94>d:ô¼¸#,>B?ó½\ã>T¾vãÝ=¾=ò(µ¾±L<= Ͼ0¸&½ã§á¾ZÀ½ëäì¾F¶¾×£ð¾OçZ¾Õ$辽Ⱦð§Î¾¯¢¾'Ú¥¾çû©¾öÐ^¾kl 8 89 9 9: ::;;<<<==>>>???@@AYqrXYrWXrWrsVWsUVsUstTUtTtuSTuRSuRu^R^_QR_Q_`PQ`P`aOPaOabObcNOcNcdMNdMdeLMeLefKLfJKfJfgIJgIghFIhFhiFijFjkFkEFDECDCBCBBBBA]uA/ÛÖ¾¿°È¾Y¾¬>Y¾IÐ>¿Àu?¿¥£=.?$Óá½.?Àu¿¿Èλ½ºõ>PT½½Ù>P©¼ÍÌ?rÝ<ÂöÛ>~r=üU>iQ>P½Vl¾P½ B9;_¶;¿áð=¨:¿y=X>°¿>/Q ¿ñÔ³>\ã¿Ñ#Î>Áí¾3Ýã>¬Ê¾*pò>n¡¾ÇK÷>Cãi¾mTï>nÂý½¤n×><j½Ã·°> ú=x>ï§=6\¤>ÞÌ>ÙÀ>ð÷K>?àÑ>_b>P×>}?µ>G!Ñ>á>+ݽ>¶ó? C>ú? ªm>à $?>ã,?Ö«H».?ÇK÷¾.?ÇK÷¾¿A ¾®?áj½®?3¨v=v?#>¬?mã?>ú*ù>4Ûe>ãOä>ÆM}>É>\>ìùª>b¾|>+>¡c>f¾c>àõ9>A¶<> 3 $ #$# "# " !"! ! ''(&'(&()%&)%)*$%*$*+$+,$,-$-.-'8C*(-³°>Ñy¾ôQ>®É¾-^>H4é¾xÓ<F¶ó¾Ê»½ÿë¾I¾ÛÔ¾/¾:®¾T°¾ Co¾4¾ûÎϽ9´È¾(ÑR=aþ~4>´¾`;> í¾ZÏ>GY¾îzù>¡Mν7R ?)\=Ù?>Z>¤Ä ?Év~>Vý>H¥>-±Ò>7Á>?á>C?þ¨>äøñ>cÐù>w¹>´?>Z\>xò-?=X94? ïý½(E/?øS¾wh ?D˾C '()') %E X9ô>¿X9ô>B`å¾/¾B`å¾/¾¦D¼ºIÌ>¦D¼ºIÌ>)\>/¾)\>/¾®?/Ýä>®?/Ýä>.?X9ô¾.?X9ô¾¿ +¾¿+¾¼t¼{®>¼t¼{®>L7 >+¾L7 >+¾®??5Þ>®??5Þ>.??5Þ¾.??5Þ¾¿ ?ÙÍÌ>èÛ?`>(?^i9>KV1?¨QH=X94?U¾//?èù¾j ?ÛOÖ¾÷?C¿¬ÄÄ>¿]>P¿Ù=Û ¿¾ o¿}?¾QøÔ¾9aâ¾gº¾# ¿íñ½Ì ¿¶ó}=d;¿b¾L>¿C7«>-\¿ú)î>vS¿P?ï×¾P?/]=ÍÌL=/]=ÍÌL=9´È½ !!!!"""###$$ $ $% %%&&&' ' '( ( () ))***+++,,,---...////001 çû©¾¿çû©¾o;çû©>o;çû©>¿ I{®=¿{®=.?{®½.?{®½¿ K ìQ¸¾¿ìQ¸¾w¾¾À¾Í<=°>¿®?¿rS½</%>7?.?´t>.?ìQ¸¾ý¾?=ìQ¸¾.?®¿.?®¿¿ LÍÌÌ>¿ÍÌÌ>B`å¾ k¾B`å¾ k¾.?ÍÌ̾.?ÍÌ̾¿ N Å °¾¿Å °¾9´Ð>³Eª>¿7?¿7?.?Å °>.?Å °>b¼¦¾³Eª¾.?7¿.?7¿¿ ¿@¾¼Ëå¾´Êܾô§¥¾'Û¿/¾M£¿ ¿±Þà>ããã¾°Ç?2°¾ä?ïS¾í?aú=¢$?Cb>´É ?ßûÃ>0ä>;?üQ¤># ?Mº->OÌ.?B`e:X94?.{¾¬(?â¾?{õ¿Hâ>í¿£ZÄ<´Ð¾]ø>Ý$¾lÞ>Ì$*¾kð?B`å:Ù?âû=o½ ?±nl>Õü>/3¤>¢BÕ>²Å>E >aûÙ>ôû>>Äà>Z$=æåÐ>Ý'7¾ÇI¡>/Û®¾m:2>â¾B`eºF¶ó¾21¾ø©â¾× ¾/ ¯¾2Éоý=¾Äà¾n²<%%& 'PøS£¾¿øS£¾ ×£½×¡< ×£½uèt>µS½á$Å>å=éí>«B#>5^ú>= >Ìcõ>ÞæÍ>°tæ>bºø>[Ï>?Lá±>?UL>J%? ÂA>¼t+?9ÕÚ=áÎ-?Zº».?5^ú¾.?5^ú¾¿øS£¾®?l<®?Ù=²ó?u;+>Ä?°h>*û>Ñv>öÔâ>w>PÂ>®G¡>Z>3p>¸ÊS>úÒ{>ob>-¯>ÅȲ=ÁÈK<¼t=øS£¾¼t= ¿ÏLà>"¿bf?Ù$3¿ ×¾= 8¾yéæ¾ï'=ÆßÖ¾+ >¦¾×KÛ><¾H?ï'¼Ù?mpâ=o½ ?ö$`>Õü>R>ìPÕ>Õz¿> >ÖÓ>çý?>¾Ú> +=¨qÇ>|íI¾dç>ªE¼¾ÅÆ,>À̾Р=u;{¾ ( () ) ))***+++,,,---...///003R++ɾ¿É¾Âõ¼ ?W#;<q= ?+2 >»}?÷xa>ò|ö>&>¯[Ô>u>¥ó©><2>Y>n>1^>W>j/>mç>{h>¶j=máù=ò¼hí=ɾhí='(()')*''' ' '''&'&%&%$%$#$#"#"!"!! ! ** ÙÁ>M÷¿i;æ>ÝÐܾI¡ü>=¾J?t¾ÆMý> /¾íè>2h½×LÆ>ge{<{À>ýù=F :>éä=Úã<N>40"¾ QN>ÛQ|¾r|>H4¾Ý">P¾ÛM¸>t¾Þ>K\g¾ÉÌý>.X ¾ µ ?@12»ßO ?Åt>'f ?í`>ßQû>J>Ô>-²>R¸>×£ð>/ݤ>ç>°sÛ>Ð>?1¬>%?v> (?ÅÆü=IK1?ï'¼X94?\¾k1?z¾)?öÒ¬¾à.?{hϾÙ#?å}ä¾§Zã> ë¾#/³>ýÀå¾Ì>¸tÔ¾B>èf·¾zÆþ=F^¾1=ÒR9¾D=[´ 7 676565 45 4 34323212110CT{®=¿{®=®?ÁÊ?®?ÁÊ?.?ÁÊ¿.?ÁÊ¿®?{®½®?{®½¿ Ö >×¢ ¾ãQ> +ž¹Æ>Åå¾A¼×£ð¾§væ½[&ë¾+/I¾®Ú¾\ ¾õÀ¾Ñ"¾ö(¾= §¾÷«P¾«¾Âßo½«¾.?%¿.?%¿YÄp½;Èû¾¼Îv¾ìûè¾ V a°=¿ú)?.?hÓ>.?ÂÂ=À"¾Â¤ø<ÃJµ¾ yçºë¾èÞ½j·¾ ª½À"¾X7ξ.?ú)¿.?äØº½¿ W𧾿®¼$½¬ÈÀ>oºÓ÷?Ã%=¢íÀ>Vb>¿:\ó>¿ªñR?.?èO'?.?ÛMè>Û¾+Ç>{h×¾P5²>[N¾®ï>qÈ=ìQØ=.?¹nʽ.? T¯¾¬<¾ßO;{h×¾¾Ké¾"¾®ñ%¿.?ªñR¿.?Gù¾¿ ×c=üQ¾7Á>¿?¿Ú©Ù=ò"=ÍÌ?.?þ(º>.?Q-â=}ç¯>Lc=\å>+<U3K>£å Y ã¥=¿ã¥=Ò7i½+?.?}çÇ>.?³x>ã¥>¡m:Ûù=4¾R¸>Tľ.?+¿.?À½Ò7i½À½¿ Z ÁÊ?¿ÁÊ?B`å¾w¾¾B`å¾÷xq¾â"·¾ìQø>®?ìQø>.?-²Ý¾.?-²Ý¾®? >®?D3_>.ë>>5 Á>ÁÊ¿q=â¾ÁÊ¿¿ W¾o; -¾¯>)Z©¾ôýd>Ú¾¾>ÍÌ̾o=mç{¾X94=Z¾¢>+¾h9>ãʽ>[W>B`庮Ga>¸ÊÓ=ºS>çS7>ß§*><ÝY>Ôç=B`e>ظþ<ázd> ×#¼C7Û=å ½ét½ DD CD C !BC!"AB"B!1Db%%o¾Õö¾n¾Ö俸Y¼:R¸¿äM>c¿õ>¬Æú¾{¾¾>÷=ª¾òÒÍ>ß÷½û@Ê>Ñ?Á¼7¿> ¸=+®>ò$>9 >Eº_>g·v>·F> />¡>Í ¾=.È®>9¶<33³>J¾Í£>#Ûy¾°Êe>#Ûy¾.?òÒ;.?òÒ;¿o¾¿øþv¾íò<C=¾oº>h?Ò½=dJ>ôýÔ»®Ga> ¶´= -K>ë+>Ý>äLc>ÜÔÀ<Âu>X ¾b>¾¬È(>¨Í¾¥I©=oï¾/]¼Háú¾'/¾:\ë¾®[¾Í̼¾¦~¾¾¸ ¾¾ >Òȧ½ùK>÷>Õ<®Ga>ãÊ=1U>ëU$>í0>ì¦T>Ælé=F¶s>o=®Ç>ôýT=Iö°>Å6>L>Õv>Ô} >$D©>*q<33³>½ÈĽeü«>èKO¾X>î%¾ed>ïSµ¾ÿ=ÍwȾOw;ÙξòÒ ¾§À¾¨°¾¾®ý¾*¾ý¿¿¯<R¸¿ÁÊ!>åñ¿n>¿¿{Á·>+ؾÙÎ>)\¾ #d''òÒÍ>¿òÒÍ>.?#Ûy>.?#Ûy>Ï÷c>R¹I>4I>¨ >°¡>É=®>Ã5¼33³> +õ½l{«>¨^¾ôS>«¾c`]>'3¶¾î=ëǾ6r]»òÒ;Ñ"¾4JǾMM¾°³¾×¥Æ¾±0¾ ø¾®ïS¾Z¿_^à½Î¿ýÜP»R¸¿!¬>Ö¿o>Vbö¾o>¿r¿c¾øûÅ<_¶-¾ì¥ >¤¹½_K>ìQ¸;®Ga>»GÖ=¼yJ>N?>k>Éqw>óT<¸ >¾ÅÇw>\;¾f@>gºÏ¾9Ý=ð¾ÙN<Háú¾w¼©½ï¾¬È(¾V¸Í¾b¾·¾Âu¾ÿ¯ ¾ &e$$X:_>ÒžËõ&>¬ã¾ bÃ=ùõ¾ÍÊv<Háú¾m绽ð¾7¾¼vѾ=¶u¾ë¾'1¾X94¾!°Ú>X94¾Ñ"Û>L7 ¾%Ì>=B´>Árd>3>®ô¢>gbº;33³>æÎ,¾a¥¢>1\¾×÷a>)±Ë¾)^ =Ñ"Û¾ÓM¾'Ü˾¨°¾)¾m;ý¾?,¾£±¿+l<R¸¿ð¤%>®¿Õz>d ¿¯[¼>©ä¾°rØ> ×£¾}? >¾ò&o¾o=X94¾Ð&>Ûù¾½f¿N>?ß;®Ga>í=ZJ>d;O>¡j>¡w>-wf=Ý$>j<½¾j<½""#" " !" ! ! >ÁÊ¿>j¼ô¾T~>]û¿!Xu>R.¿4ÛU> ö?¿}">VcM¿?±=iÇU¿¿/¼uX¿eнзU¿q/¾á$M¿f¾S¾,B¿fff¾-2¿%Á¾V-¿_j¾ôüé<Ad1¾#Û >I»½zlK>*Â;®Ga>_×=K>XA>4> é{>÷ÉÑ<®>?5þ½öy|>Ù¾ØÒC>òÒž¸Þ=¦ïå¾ÓK<×£ð¾fh¼½;á御I2¾ªÅ¾ Dj¾må¾í|¾¼tó½-.-- - ,- +, $% + + *+ * )*)()('(''&'&5&55454343232121010/0./.%5hA`¾¿A`¾j¼½Y¾³;E¾ù¢= ü!¾K: >Z¼Ø½øû5>\.½+ÙQ>Ê<Ñ"[>)Û=W_M>ìM,>b$>DS>¯$¹=A`>n=¼A`>¿%Á>¿%Á>òÓ8¼Ù¼>}=ß=ìQ°>ì¥I> > >N¶q>=`>¡J>vþ>4Il=33³>À½âÍ¢>A`¾T;c>A`¾.?%Á¾.?%Á¾¿ iÁÊ¡= k " lÁÊ¡=¿ÁÊ¡=.?ÁÊ¡½.?ÁÊ¡½¿ Ã==9d>>^>l^>qJ>C>Ñ"[>vR·>Æ£T>¸ÈÍ>é&A>u?ß>#>ìOê>+/ù=½5ð>Ìë=-ò>+l¼-ò>¿7!?¿7!?==DÁ?Õy4>{i?>³\î>àf©>Ýx¯>33³>?:>¨n>Uù^=A@>±j<o>y$½ßO>$)é½Mº>Æ£T¾33³>+¾óå>@ß¾¾ðý>nOà¾È` >5^ú¾mçK>5^ú¾Ãõ¨>7!¿Ãõ¨>7!¿¿+, ! ! !" "# ##$$%%%&&&'''(()),nA`¾¿A`¾Ú½½Ï¤M¾ºk=áξ,¶>½©½ÇJ>Ù<Ñ"[>~®=0ÚS>±> o""óTϾFa¯¾ú*¡¾´tý¾{4¾Ø¸¿&å9R¸¿A+ð=Æ¿f>.¿Ãa¡>ýgý¾#/Ã>B´Î¾Ö×>X¾R¸Þ>Ú©ù½ö)Ï>%= >øûe>¶¡2>Õ%£>&å933³>ñ"¾ ¾Ó¾eä¬<ïG¾Ëõ>Rܽ%³J>&å9®Ga>ZdÛ=J>}G>ù>Ä>Ð*³<¨Æ>¡j¾Ó>§³¾ïG>¦E;#Ü=Nzï¾&å9Háú¾Rܽ¹ï¾ïG¾í~;Ӿr§¾¨Æ¾Ê ¾ !p))mç{¾j¼t¿mç{¾ ¾-¿Êp½}¿ÄíкR¸¿£?Ô=9Õ¿J¸P>,¿m>lø¾¦´>ÛľËIÈ>Ô¾ÙÎ>o¾ÿçÈ>>?ºw·>î=>A\> ! ! !" """###$$$$%%(q%%òÒÍ>j¼t¿òÒÍ>Ãõ¨>¸ >Ãõ¨>¸ >¥óQ>wf>㤠>Å 0¼33³>j3߫>:Z¾må>,¾lc>µ¾ÿ=¿Ç¾þEÐ;òÒ;®G¾q¾¾:Ê©¾îоLáù¾eá¾kF¿j÷«:R¸¿n=ð¿ Õ>ªò¿íÔL> ¿#Ûy>éÒÿ¾#Ûy>j¼t¿mc¾ ä<Ãñ,¾Év>Ed¸½ /Q>K;lg>Î=,O>c<>Â>±v>Çô<¸ >æx¾S³w>Z¾r@>®IϾaÝ=jûï¾®r<Háú¾x悔lï¾pé(¾V;7b¾¨Æ¾Âu¾+¾ $ $ $#$# "# " !"! ! $rÀ½¿À½Îç½³½þÓ¼á½ßÄ=×6½Ifõ=Uù¼)° >)u =78>ï§=@>°t>{8>¢íH>rÀ>%>>²>rÀ.>öÒ¬>¹=33³>=/¯>8 %¼ê$£>p|m½>®Gá½shA>®Gá½Ãõ¨>%¾Ãõ¨>%¾¿ /A¾î<=9 P¾=ôýT¾VÎ=II¾f>ÏK%¾¼<>}A˽Õ$X>À»®Ga>£=É W>79>¬8>oº5>Í>ÀJ>)\=X9´>ìQ¸=2s©>pë.>gd>À"o>¦E}>'1>/3>Á£>Ú«¯=.¯>½¼33³>îx³½K˰>/¾q©>¤nW¾Êâ>øÿ¾Z>¾Vº{>^º©¾Ì$J>¬´¾Ã>ìQ¸¾AÕ¨=Tå³¾¯´<Ϧ¾¼,½2ɾÎS½½ïSe¾¾gc¾ÒR)¾<oS¾6ù=+q¾n6>j¼¾Ó£Y>q<¾B`e>@¯¾ªðW>mç˾ä¡/>-^ä¾×=@õ¾=-<Háú¾¹O®½½ô¾J¸ ¾á¾¨R¾Â¾ k¾u¾Ë¡Å¾/ݤ¾=> 45 4 4343 3 23121010/0/./-.-,-,+,+*+)*)()'('&'&%&$%$$#>t é+>=¶í¾r>î¾zߨ=¼!í¾y©=Àè¾=hæá¾¬áb=%Ù¾üI=ÃõȾ@=D¬¾@=ôýT>Ï÷S>ôýT>Ï÷S>Ãõ¨>@=Ãõ¨>@=î|'?øSã½øS?øSã½Ãõ¨>°rh¾Ãõ¨>°rh¾ôýT>øSã½ôýT>øSã½`§¾ÿvÙ½I¹ã¾ ß»½¬p¿½¬ ¿WμV¸¿,ô=ï¿ÒýÜ=¬¿3á'>*È¿°rh>°¿Ï÷S>oë¾ v T=¿¾Ú>Ãõ¨>+Û>Ãõ¨>Å p=ò"s¾õÎ<«ª¾ w´ D¾¿o»Âjì=¸=X94½ñ*;>¿Pá°>¿øS#?Ãõ¨>üUø>Ãõ¨>h¥>!XU¾q=>AƾTãe>ÁW¾¬=Ãõ¨>î½Ãõ¨>F^f¾r\¾¿ó¾´Ð¾Õ¦¾sT¾¼ ò¾Ãõ¨>øS#¿Ãõ¨>%²·¾¿ y¾U¢x¿Tãu¾#Ûy¿L6.¾w¿Àâ½p¿s½ö³d¿%l¼S¿À<E·>¿}=°Æ¿ ëÙ>Ãõ¨>sh>Ãõ¨>;ß=kZ¾ð=-¢¾"ߥ;Ýx×¾tÛ¼H6¾H1½·CS¾¼t¾Ãõ¨> ëÙ¾Ãõ¨>!°½¿)\¯½;ß#¿½ê½Ä_7¿ãý¾}éA¿ ¾ÂI¿Dß=¾¼uN¿ c¾¯ÒQ¿×÷¾ªñR¿5]¾JR¿Å ¸¾)\O¿y鮾Ë÷t¿ Ǽ>±>¾Ü½ÿ¯ ¾Ð½<-¿½?6I<ÿ¯:½[ï7=¾¼<]ß=ÕxÉ=B´=ÝzM>ã¥=P9Æ>j¾ª=Ïõõ>ÿØ= ?½>KÍ?+f>`å?%>`å?%>X94?i9P>X94?Vb>ª3?ÉÆÃ=çû1?8R=Ð-?b<'?Å©V¼?½1\?¾`½"?+½ôQî>8/½/ÜÉ>_²½mç>í,½ìQ>a°½ÍW=kEÛ½H¥X< ¾j2ã¼C¾øl]½%¾o½%&'$%'#$'#'(#() #)*"#*"*+"+,",-!"-!-.!./ !/ /0 01 11222333344455566677 W< ?3nê¼Ð*?K磽ߥ0?®¾~T3?²Q¾X94?J¾X94?J¾`å?'1h¾`å?µÆ ¾j?Ìñê½Ûù ?뻽ÉË? ×£½81ì>w¾½¤>ãQ½lëÇ=P½C¼´ª<·C£½OÝ=ÿ¯ ¾$=g2¾À´(¼øOg¾À8½Üb¾+½oþ¼t½õ¾P½°r(¿Òû¦½ä @¿àGÕ½Ñ#N¿oe¾]nT¿ïg¾+V¿J¾+V¿J¾#Ûy¿Ü¡Q¾#Ûy¿Â÷¾u=y¿ ×ýZdw¿4ôO½øþr¿Úäp¼äùl¿òl<%e¿¯Ò=ÕZ¿J)h= M¿C=áz<¿ËG=`9*¿óÊ=33¿E=¶Ö¾õ0´=q嬾ÿ]ß=Zf¾êÎ>ux¾`E>?]¾J>ªñR¾J>o½$%&#$&"#&"&'"'( --- NEW FILE --- ÿ Font.ColorclWindowTextFont.Heightõ Font.Name MS Sans Serif Font.Style KeyPreview MenuMainMenuOldCreateOrder OnKeyPressFormKeyPress PixelsPerInch` TextHeight Exit1Click FrameTimerIntervalOnTimerFrameTimerTimerLeft --- NEW FILE --- unit frmMain; { Console Demo by Michael Hearn 2000 for the Pythian Project } { we're going to "clear" the screen, see OnGLDraw for this. I'll then use the glf functions to draw the console. keystrokes will be interpreted and placed on the screen until I have a simple console. The commands you can use are - help - cube on/ cube off - exit } interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, GLPanel, OpenGL, glfd; type TMainForm = class(TForm) GLPanel: TGLPanel; MainMenu: TMainMenu; File1: TMenuItem; Exit1: TMenuItem; FrameTimer: TTimer; procedure FrameTimerTimer(Sender: TObject); procedure GLPanelGLInit(Sender: TObject); procedure GLPanelResize(Sender: TObject); procedure GLPanelGLDraw(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure FormKeyPress(Sender: TObject; var Key: Char); private { Private declarations } consoleCommandBuffer :string; animSquare :integer; CubeEnabled :boolean; procedure consoleInit; procedure consoleProcessKey(Key:Char); procedure consoleProcessCommand(cmd:string); public { Public declarations } procedure SetProjection(Sender: TObject); end; var MainForm: TMainForm; implementation {$R *.DFM} procedure TMainForm.FrameTimerTimer(Sender: TObject); begin // now redraw the screen inc(animSquare); if animsquare >= 360 then animsquare := 0; GLPanel.GLReDraw; end; procedure TMainForm.SetProjection(Sender: TObject); var gldAspect : TGLdouble; begin // Redefine the viewing volume and viewport when the window size changes. gldAspect := GLPanel.Width / GLPanel.Height; glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(30.0, // Field-of-view angle gldAspect, // Aspect ratio of viewing volume 1.0, // Distance to near clipping plane 100.0); // Distance to far clipping plane glViewport(0, 0, GLPanel.Width, GLPanel.Height); InvalidateRect(Handle, nil, False); end; procedure TMainForm.GLPanelGLInit(Sender: TObject); begin // Add GL init code here // Any enable/disable commands that affect the entire app should go here animSquare := 0; cubeEnabled := true; // // Enable depth testing and alpha blending // glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA,GL_ONE); glfInit; if glfLoadFont('arial1.glf') = GLF_ERROR then raise Exception.Create('font load failed'); glfSetAnchorPoint(GLF_LEFT_UP); consoleInit; end; procedure TMainForm.GLPanelResize(Sender: TObject); begin SetProjection(Sender); // this sets up the view // init any variables here end; procedure TMainForm.GLPanelGLDraw(Sender: TObject); begin // // Clear the color and depth buffers. // try glClearColor(0.0,0.0,0.0,1.0); // clear to black glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // reset the matrix to it's identity (original, unmodified) matrix glMatrixMode(GL_PROJECTION); glLoadIdentity; glMatrixMode(GL_MODELVIEW); glLoadIdentity; if CubeEnabled then begin glPushMatrix; // scale and rotate glScalef(0.5,0.5,0.5); glRotatef(animSquare,0.0,1.0,0.5); glDisable(GL_BLEND); // // Draw the six faces of the cube. // glColor4f(1.0,0.0,0.0,0.75); glBegin(GL_POLYGON); glNormal3f(0.0, 0.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(-1.0, -1.0, 1.0); glVertex3f(1.0, -1.0, 1.0); glEnd; glColor4f(0.0,1.0,0.0,0.75); glBegin(GL_POLYGON); glNormal3f(0.0, 0.0, -1.0); glVertex3f(1.0, 1.0, -1.0); glVertex3f(1.0, -1.0, -1.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(-1.0, 1.0, -1.0); glEnd; glColor4f(0.0,0.0,1.0,0.75); glBegin(GL_POLYGON); glNormal3f(-1.0, 0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(-1.0, -1.0, 1.0); glEnd; glColor4f(0.0,1.0,1.0,0.75); glBegin(GL_POLYGON); glNormal3f(1.0, 0.0, 0.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(1.0, -1.0, 1.0); glVertex3f(1.0, -1.0, -1.0); glVertex3f(1.0, 1.0, -1.0); glEnd; glColor4f(1.0,1.0,0.0,0.75); glBegin(GL_POLYGON); glNormal3f(0.0, 1.0, 0.0); glVertex3f(-1.0, 1.0, -1.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(1.0, 1.0, -1.0); glEnd; glColor4f(1.0,1.0,1.0,0.75); glBegin(GL_POLYGON); glNormal3f(0.0, -1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(1.0, -1.0, -1.0); glVertex3f(1.0, -1.0, 1.0); glVertex3f(-1.0, -1.0, 1.0); glEnd; glPopMatrix; glEnable(GL_BLEND); end; { now draw an alpha quad to effectively "clear" the screen but still leaving something showing } glLoadIdentity; glColor4f(0.6,0.6,0.6,0.99); glTranslatef(0.0,0.0,-1.0); glBegin(GL_QUADS); glVertex2f(1.0,1.0); glVertex2f(1.0,-1.0); glVertex2f(-1.0,-1.0); glVertex2f(-1.0,1.0); glEnd; glClear(GL_DEPTH_BUFFER_BIT); glLoadIdentity; glTranslatef(-1.0,1.0,-1.0); glScalef(0.04,0.04,0.04); glfConsoleDraw; except // ignore exceptions - the delphi IDE seems to screw up on my system :( end; end; procedure TMainForm.Exit1Click(Sender: TObject); begin Close; end; procedure TMainForm.FormKeyPress(Sender: TObject; var Key: Char); begin consoleProcessKey(Key); end; procedure TMainForm.consoleProcessKey(Key: Char); begin // add this key to the console, unless it is a backspace key if Key = #8 {backspace} then begin glfConsoleBackspace(1); consoleCommandBuffer := Copy(consoleCommandbuffer,0,Length(consoleCommandBuffer)-1); end else if Key = #13 then begin // if user hit enter, process command and move onto new line to // display the result glfPrintString(key); consoleProcessCommand(consoleCommandBuffer); glfPrintString('> '); consoleCommandBuffer := ''; end else begin glfPrintString(key); consoleCommandBuffer := consoleCommandBuffer + key; end; end; procedure TMainForm.consoleInit; begin consoleCommandBuffer := ''; glfSetConsoleParam( 45, 24); // this clears the console for 640x480 glfPrintString('Console Demo app v1.0'#13); glfPrintString('by Michael Hearn'#13); glfPrintString('> '); end; procedure TMainForm.consoleProcessCommand(cmd: string); begin if (LowerCase(cmd) = 'help') or (cmd = '?') then begin glfPrintString('This is the console demo application :)'#13); glfPrintString('Commands available:'#13); glfPrintString(' - help/?: displays this text'#13); glfPrintString(' - cube on/off: changes the background cube'#13); glfPrintString(' - exit: quits the demo'#13); end else if (LowerCase(cmd) = 'cube on') then begin CubeEnabled := true; glfPrintString('Cube ON'#13); end else if (LowerCase(cmd) = 'cube off') then begin CubeEnabled := false; glfPrintString('Cube OFF'#13); end else if (LowerCase(cmd) = 'exit') then begin Close; end; end; end. |
From: Michael H. <mh...@us...> - 2000-10-21 12:26:27
|
Update of /cvsroot/pythianproject//Prototypes/AI-Demos/FieldData In directory slayer.i.sourceforge.net:/tmp/cvs-serv13420/AI-Demos/FieldData Modified Files: AIDemoWin.dfm Log Message: added basic GL app and Console demo Index: AIDemoWin.dfm =================================================================== RCS file: /cvsroot/pythianproject//Prototypes/AI-Demos/FieldData/AIDemoWin.dfm,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -r1.4 -r1.5 Binary files /tmp/cvsjYLtR3 and /tmp/cvsWBUWDX differ |
From: Michael H. <mh...@us...> - 2000-10-21 12:26:27
|
Update of /cvsroot/pythianproject/Prototypes/BasicGLapp In directory slayer.i.sourceforge.net:/tmp/cvs-serv13420/BasicGLapp Added Files: Basic3D.cfg Basic3D.dof Basic3D.dpr Basic3D.res frmMain.dfm frmMain.pas Log Message: added basic GL app and Console demo --- NEW FILE --- -$A+ -$B- -$C+ -$D+ -$E- -$F- -$G+ -$H+ -$I+ -$J+ -$K- -$L+ -$M- -$N+ -$O+ -$P+ -$Q- -$R- -$S- -$T- -$U- -$V+ -$W- -$X+ -$YD -$Z1 -cg -AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; -H+ -W+ -M -$M16384,1048576 -K$00400000 -U"..\..\PythianProject\Source\Units\" -O"..\..\PythianProject\Source\Units\" -I"..\..\PythianProject\Source\Units\" -R"..\..\PythianProject\Source\Units\" --- NEW FILE --- [Compiler] A=1 B=0 C=1 D=1 E=0 F=0 G=1 H=1 I=1 J=1 K=0 L=1 M=0 N=1 O=1 P=1 Q=0 R=0 S=0 T=0 U=0 V=1 W=0 X=1 Y=1 Z=1 ShowHints=1 ShowWarnings=1 UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [Linker] MapFile=0 OutputObjs=0 ConsoleApp=1 DebugInfo=0 RemoteSymbols=0 MinStackSize=16384 MaxStackSize=1048576 ImageBase=4194304 ExeDescription= [Directories] OutputDir= UnitOutputDir= PackageDLLOutputDir= PackageDCPOutputDir= SearchPath=..\..\PythianProject\Source\Units\ Packages=VCL40;VCLX40;VCLDB40;VCLDBX40;VCLSMP40;QRPT40;TEEUI40;TEEDB40;TEE40;ibevnt40;nmfast40;Python_d4;PythonVCL_d4;NtfyIcon;glPanelPkg Conditionals= DebugSourceDirs= UsePackages=0 [Parameters] RunParams= HostApplication= [Version Info] IncludeVerInfo=0 AutoIncBuild=0 MajorVer=1 MinorVer=0 Release=0 Build=0 Debug=0 PreRelease=0 Special=0 Private=0 DLL=0 Locale=2057 CodePage=1252 [Version Info Keys] CompanyName= FileDescription= FileVersion=1.0.0.0 InternalName= LegalCopyright= LegalTrademarks= OriginalFilename= ProductName= ProductVersion=1.0.0.0 Comments= [Excluded Packages] $(DELPHI)\Components\Indy\dclIndy40.bpl=Internet Direct "Indy" for D4 Property and Component Editors [HistoryLists\hlUnitAliases] Count=1 Item0=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE; [HistoryLists\hlSearchPath] Count=1 Item0=..\..\PythianProject\Source\Units\ [HistoryLists\hlOutputDirectorry] Count=1 Item0=. --- NEW FILE --- program Basic3D; uses Forms, frmMain in 'frmMain.pas' {MainForm}; {$R *.RES} begin Application.Initialize; Application.Title := 'Basic 3D application'; Application.CreateForm(TMainForm, MainForm); Application.Run; end. --- NEW FILE --- --- NEW FILE --- ÿ Font.ColorclWindowTextFont.Heightõ Font.Name MS Sans Serif Font.Style TextHeight Exit1Click FrameTimerIntervalOnTimerFrameTimerTimerLeft --- NEW FILE --- unit frmMain; { Basic 3D OpenGL application that uses the GLPanel component by Michael Hearn 2000 for the Pythian Project } interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, GLPanel, OpenGL, glfd; type TMainForm = class(TForm) GLPanel: TGLPanel; MainMenu: TMainMenu; File1: TMenuItem; Exit1: TMenuItem; FrameTimer: TTimer; procedure FrameTimerTimer(Sender: TObject); procedure GLPanelGLInit(Sender: TObject); procedure GLPanelResize(Sender: TObject); procedure GLPanelGLDraw(Sender: TObject); procedure Exit1Click(Sender: TObject); private { Private declarations } public { Public declarations } // Animation trackers can go here animSquare: integer; // this var will be cycled through 1..360 // which states the angle of the square. By // incrementing this every frame we can create // a rotating square :) procedure SetProjection(Sender: TObject); end; var MainForm: TMainForm; implementation {$R *.DFM} procedure TMainForm.FrameTimerTimer(Sender: TObject); begin { Add code to advance animations etc. here } inc(animSquare); if animSquare >= 360 then animSquare := 0; // now redraw the screen GLPanel.GLReDraw; end; procedure TMainForm.SetProjection(Sender: TObject); var gldAspect : TGLdouble; begin // Redefine the viewing volume and viewport when the window size changes. gldAspect := GLPanel.Width / GLPanel.Height; glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(30.0, // Field-of-view angle gldAspect, // Aspect ratio of viewing volume 1.0, // Distance to near clipping plane 100.0); // Distance to far clipping plane glViewport(0, 0, GLPanel.Width, GLPanel.Height); InvalidateRect(Handle, nil, False); end; procedure TMainForm.GLPanelGLInit(Sender: TObject); begin // Add GL init code here // Any enable/disable commands that affect the entire app should go here // // Enable depth testing and alpha blending // glEnable(GL_DEPTH_TEST); glEnable(GL_BLEND); //glBlendFunc(GL_SRC_ALPHA,GL_ONE); // uncomment this line to enable alpha blending end; procedure TMainForm.GLPanelResize(Sender: TObject); begin SetProjection(Sender); // this sets up the view // init any variables here animSquare := 0; end; procedure TMainForm.GLPanelGLDraw(Sender: TObject); begin // // Clear the color and depth buffers. // glClearColor(0.0,0.0,0.0,1.0); // clear to black glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); // reset the matrix to it's identity (original, unmodified) matrix glMatrixMode(GL_PROJECTION); glLoadIdentity; glMatrixMode(GL_MODELVIEW); glLoadIdentity; { ADD YOUR DRAWING CODE HERE } // scale and rotate glScalef(0.5,0.5,0.5); glRotatef(animSquare,0.0,1.0,0.5); // // Draw the six faces of the cube. // glColor4f(1.0,0.0,0.0,0.75); glBegin(GL_POLYGON); glNormal3f(0.0, 0.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(-1.0, -1.0, 1.0); glVertex3f(1.0, -1.0, 1.0); glEnd; glColor4f(0.0,1.0,0.0,0.75); glBegin(GL_POLYGON); glNormal3f(0.0, 0.0, -1.0); glVertex3f(1.0, 1.0, -1.0); glVertex3f(1.0, -1.0, -1.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(-1.0, 1.0, -1.0); glEnd; glColor4f(0.0,0.0,1.0,0.75); glBegin(GL_POLYGON); glNormal3f(-1.0, 0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(-1.0, -1.0, 1.0); glEnd; glColor4f(0.0,1.0,1.0,0.75); glBegin(GL_POLYGON); glNormal3f(1.0, 0.0, 0.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(1.0, -1.0, 1.0); glVertex3f(1.0, -1.0, -1.0); glVertex3f(1.0, 1.0, -1.0); glEnd; glColor4f(1.0,1.0,0.0,0.75); glBegin(GL_POLYGON); glNormal3f(0.0, 1.0, 0.0); glVertex3f(-1.0, 1.0, -1.0); glVertex3f(-1.0, 1.0, 1.0); glVertex3f(1.0, 1.0, 1.0); glVertex3f(1.0, 1.0, -1.0); glEnd; glColor4f(1.0,1.0,1.0,0.75); glBegin(GL_POLYGON); glNormal3f(0.0, -1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); glVertex3f(1.0, -1.0, -1.0); glVertex3f(1.0, -1.0, 1.0); glVertex3f(-1.0, -1.0, 1.0); glEnd; end; procedure TMainForm.Exit1Click(Sender: TObject); begin Close; end; end. |
From: Michael H. <mh...@us...> - 2000-10-21 12:22:55
|
Update of /cvsroot/pythianproject/Prototypes/BasicGLapp In directory slayer.i.sourceforge.net:/tmp/cvs-serv13204/BasicGLapp Log Message: Directory /cvsroot/pythianproject/Prototypes/BasicGLapp added to the repository |
From: Michael H. <mh...@us...> - 2000-10-19 19:45:23
|
Update of /cvsroot/pythianproject/PythianProject/Bin/DATA/images In directory slayer.i.sourceforge.net:/tmp/cvs-serv15733/Bin/DATA/images Modified Files: logo1.bmp Log Message: added transparent picture demo -mike Index: logo1.bmp =================================================================== RCS file: /cvsroot/pythianproject/PythianProject/Bin/DATA/images/logo1.bmp,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -r1.1 -r1.2 Binary files /tmp/cvsTsVXHU and /tmp/cvsMmlGmH differ |
From: Michael H. <mh...@us...> - 2000-10-19 19:45:23
|
Update of /cvsroot/pythianproject/PythianProject/Source/GameEngine In directory slayer.i.sourceforge.net:/tmp/cvs-serv15733/Source/GameEngine Modified Files: GrEngState.pas Log Message: added transparent picture demo -mike Index: GrEngState.pas =================================================================== RCS file: /cvsroot/pythianproject/PythianProject/Source/GameEngine/GrEngState.pas,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -r1.10 -r1.11 *** GrEngState.pas 2000/10/18 20:53:18 1.10 --- GrEngState.pas 2000/10/19 19:45:20 1.11 *************** *** 35,39 **** uses ! glfd, OpenGL, SysUtils, Windows; { TGraphicsEngine } --- 35,39 ---- uses ! glfd, OpenGL, SysUtils, Windows, Points; { TGraphicsEngine } *************** *** 46,49 **** --- 46,50 ---- function TGraphicsEngine.Initialize: Boolean; + const whiteByte: TByteColor = (255,255,255,255); begin Result := inherited Initialize; *************** *** 72,78 **** FTestTex := TTexture.Create; FTestTex.Initialize; ! FTestTex.UseAlpha := false; FTestTex.LoadFromFile(DataPath+'images\logo1.bmp'); if FTestTex.Image = nil then TraceString('Logo failed to init!'); end; end; --- 73,84 ---- FTestTex := TTexture.Create; FTestTex.Initialize; ! FTestTex.UseAlpha := true; ! FTestTex.AlphaColor := whiteByte; FTestTex.LoadFromFile(DataPath+'images\logo1.bmp'); if FTestTex.Image = nil then TraceString('Logo failed to init!'); + + // text antialiasing + glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); end; end; *************** *** 109,118 **** // hmm, we seem to need to do vertices in an anti-clockwise direction ! glPushMatrix; glTranslatef(Window.Width-270,30,0); ! glEnable(GL_TEXTURE_2D); FTestTex.Draw; // bind texture glMatrixMode(GL_TEXTURE); ! glPushMatrix; glScalef(1/256,1/256,1); --- 115,124 ---- // hmm, we seem to need to do vertices in an anti-clockwise direction ! glPushMatrix; // push logo matrix glTranslatef(Window.Width-270,30,0); ! glEnable(GL_TEXTURE_2D); // reenable textures for this part FTestTex.Draw; // bind texture glMatrixMode(GL_TEXTURE); ! glPushMatrix; // push tex matrix glScalef(1/256,1/256,1); *************** *** 134,154 **** glVertex2f(0,64); glEnd; - glPopMatrix; // pop tex matrix - glMatrixMode(GL_MODELVIEW); - glPopMatrix; // pop logo matrix - glDisable(GL_TEXTURE_2D); ! { glBegin(GL_QUADS); ! glNormal3f(0,0,1); ! glColor4f(1.0,0.0,0.0,0.5); ! glVertex2f(100,100); ! glColor4f(0.0,1.0,0.0,0.5); ! glVertex2f(-100,-100); ! glColor4f(0.0,0.0,1.0,0.5); ! glVertex2f(10,-100); ! glColor4f(1.0,1.0,1.0,0.5); ! glVertex2f(-10,10); ! glEnd; } // need this: scale it - otherwise text will be 1x1 pixels! glScalef(10, 10, 1); --- 140,185 ---- glVertex2f(0,64); glEnd; ! // IMPORTANT NOTE: it appears to be important which order matrices ! // are pushed and popped. You can't : ! // ! // push texture ; push modelview ! // pop texture ; pop modelview ! // ! // as you might think, instead you must do this: ! // ! // push texture; push modelview ! // pop modelview; pop texture ! // ! // in effect - last on, first off ! ! glMatrixMode(GL_TEXTURE); glPopMatrix; ! glMatrixMode(GL_MODELVIEW); glPopMatrix; // pop logo matrix ! ! // now for non-rectangular images - ie basic transparency ! glPushMatrix; // push circle matrix ! glTranslatef(10,FWindow.Height-60,0); // move to bottom left ! glMatrixMode(GL_TEXTURE); ! glPushMatrix; // push tex matrix ! glScalef(1/256,1/256,1); ! + // hmm, for some reason the x axis on the texture matrix + // seems to be inverted. must investigate when i have time + // (which is probably sometime after never) + glBegin(GL_QUADS); + glTexCoord2f(256,64); glVertex2f(0,0); + glTexCoord2f(256,114); glVertex2f(0,50); + glTexCoord2f(206,114); glVertex2f(50,50); + glTexCoord2f(206,64); glVertex2f(50,0); + glEnd; + + glMatrixMode(GL_TEXTURE); glPopMatrix; // pop texture matrix + glMatrixMode(GL_MODELVIEW); glPopMatrix; // pop circle matrix + + + glDisable(GL_TEXTURE_2D); // disable texturing again for text + + // now for the text // need this: scale it - otherwise text will be 1x1 pixels! glScalef(10, 10, 1); *************** *** 162,169 **** --- 193,204 ---- glScalef(1, -1, 1); + glEnable(GL_POLYGON_SMOOTH); + glPushMatrix; // finally draw the text glfDrawSolidString(Format('FPS: %f',[FFPS])); glPopMatrix; + + glDisable(GL_POLYGON_SMOOTH); glScalef(1, -1, 1); |
From: Michael H. <mh...@us...> - 2000-10-18 20:53:20
|
Update of /cvsroot/pythianproject/PythianProject/Source/GameEngine In directory slayer.i.sourceforge.net:/tmp/cvs-serv27384/GameEngine Modified Files: GameGrEngState.pas GrEngState.pas Log Message: texture demo in graphics engine -mike Index: GameGrEngState.pas =================================================================== RCS file: /cvsroot/pythianproject/PythianProject/Source/GameEngine/GameGrEngState.pas,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -r1.11 -r1.12 *** GameGrEngState.pas 2000/10/17 06:03:12 1.11 --- GameGrEngState.pas 2000/10/18 20:53:18 1.12 *************** *** 91,94 **** --- 91,95 ---- glEnable(GL_CULL_FACE); // enable face culling (no back faces) glEnable(GL_TEXTURE_2D); + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); // enable alpha blending teSetWedgie(2.0); *************** *** 147,151 **** teStopTesselationMap;} ! teFinishFrame; inherited; --- 148,152 ---- teStopTesselationMap;} ! teFinishFrame; inherited; Index: GrEngState.pas =================================================================== RCS file: /cvsroot/pythianproject/PythianProject/Source/GameEngine/GrEngState.pas,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -r1.9 -r1.10 *** GrEngState.pas 2000/10/17 18:23:07 1.9 --- GrEngState.pas 2000/10/18 20:53:18 1.10 *************** *** 3,7 **** interface ! uses BaseObjects, Cameras, MovingObjects, Objects, OpenGLWin, States, Textures; type --- 3,7 ---- interface ! uses BaseObjects, Cameras, MovingObjects, Objects, OpenGLWin, States, Textures, Trace; type *************** *** 14,17 **** --- 14,19 ---- FtxtFont :integer; + FTestTex :TTexture; + procedure SetWindow(const Value: TOpenGLWindow); procedure SetBitDepth(const Value: TBitDepth); *************** *** 39,42 **** --- 41,45 ---- procedure TGraphicsEngine.Finalize; begin + FTestTex.Free; inherited; end; *************** *** 61,67 **** --- 64,78 ---- glfEnable(GLF_CONTOURING);} + // add some console text (not used at this time) glfConsoleClear; glfPrintString('Test Line 1'); glfPrintString('Test Line 2'); + + // init the test texture + FTestTex := TTexture.Create; + FTestTex.Initialize; + FTestTex.UseAlpha := false; + FTestTex.LoadFromFile(DataPath+'images\logo1.bmp'); + if FTestTex.Image = nil then TraceString('Logo failed to init!'); end; end; *************** *** 71,77 **** // Disable texturing so we can see our colours glDisable(GL_TEXTURE_2D); ! glColor3f(1, 1, 1); ! // glClear(GL_DEPTH_BUFFER_BIT); // don't know why we need this, but we do // well, turns out we don't :) // heh. okay :) must just be me --- 82,92 ---- // Disable texturing so we can see our colours glDisable(GL_TEXTURE_2D); ! // turn on alpha blending for this text ! glEnable(GL_BLEND); ! glEnable(GL_ALPHA_TEST); ! glColor4f(1, 1, 1, 0.4); ! ! //glClear(GL_DEPTH_BUFFER_BIT); // don't know why we need this, but we do // well, turns out we don't :) // heh. okay :) must just be me *************** *** 85,98 **** glLoadIdentity; // change co-ordinate system to 1:1 pixel mapping glScalef(2.0 / Window.Width, -2.0 / Window.Height, 1.0); glTranslatef(-(Window.Width / 2), -(Window.Height / 2), 0); // need this: scale it - otherwise text will be 1x1 pixels! glScalef(10, 10, 1); // offset it from the top by Y/2 text rows to make it look nicer ! glTranslatef(0, 2, 0); ! // need this: flip matrix because GLF is expecting OpenGL default // co-ordinates and we have changed them. Otherwise text will be --- 100,160 ---- glLoadIdentity; + // change co-ordinate system to 1:1 pixel mapping glScalef(2.0 / Window.Width, -2.0 / Window.Height, 1.0); glTranslatef(-(Window.Width / 2), -(Window.Height / 2), 0); + // draw shapes. for some reason we need to do this BEFORE text + // why? beats me :( + + // hmm, we seem to need to do vertices in an anti-clockwise direction + glPushMatrix; + glTranslatef(Window.Width-270,30,0); + glEnable(GL_TEXTURE_2D); + FTestTex.Draw; // bind texture + glMatrixMode(GL_TEXTURE); + glPushMatrix; + glScalef(1/256,1/256,1); + + glColor4f(1.0,1.0,1.0,0.8); + + glBegin(GL_QUADS); + glNormal3f(0,0,1); + // glColor4f(1.0,0.0,0.0,0.5); + glTexCoord2f(0,64); + glVertex2f(256,64); + // glColor4f(0.0,1.0,0.0,0.5); + glTexCoord2f(0,0); + glVertex2f(256,0); + // glColor4f(0.0,0.0,1.0,0.5); + glTexCoord2f(256,0); + glVertex2f(0,0); + // glColor4f(1.0,1.0,1.0,0.5); + glTexCoord2f(256,64); + glVertex2f(0,64); + glEnd; + glPopMatrix; // pop tex matrix + glMatrixMode(GL_MODELVIEW); + glPopMatrix; // pop logo matrix + glDisable(GL_TEXTURE_2D); + + { glBegin(GL_QUADS); + glNormal3f(0,0,1); + glColor4f(1.0,0.0,0.0,0.5); + glVertex2f(100,100); + glColor4f(0.0,1.0,0.0,0.5); + glVertex2f(-100,-100); + glColor4f(0.0,0.0,1.0,0.5); + glVertex2f(10,-100); + glColor4f(1.0,1.0,1.0,0.5); + glVertex2f(-10,10); + glEnd; } + // need this: scale it - otherwise text will be 1x1 pixels! glScalef(10, 10, 1); // offset it from the top by Y/2 text rows to make it look nicer ! glTranslatef(0, 2, -1); ! // need this: flip matrix because GLF is expecting OpenGL default // co-ordinates and we have changed them. Otherwise text will be *************** *** 100,109 **** --- 162,178 ---- glScalef(1, -1, 1); + glPushMatrix; // finally draw the text glfDrawSolidString(Format('FPS: %f',[FFPS])); + glPopMatrix; + + glScalef(1, -1, 1); // and restore to default glMatrixMode(GL_PROJECTION); glPopMatrix; + + glDisable(GL_BLEND); + glDisable(GL_ALPHA_TEST); // restore the colour to white because this affects everything else in the |
From: Michael H. <mh...@us...> - 2000-10-18 20:52:11
|
Update of /cvsroot/pythianproject/PythianProject/Bin/DATA/images In directory slayer.i.sourceforge.net:/tmp/cvs-serv24003/images Log Message: Directory /cvsroot/pythianproject/PythianProject/Bin/DATA/images added to the repository |
From: Kamil K. <kkr...@us...> - 2000-10-18 17:58:14
|
Update of /cvsroot/pythianproject/PythianProject/Source/Units In directory slayer.i.sourceforge.net:/tmp/cvs-serv17133 Modified Files: PythianUtils.pas Log Message: @@kk 18/10/00 Index: PythianUtils.pas =================================================================== RCS file: /cvsroot/pythianproject/PythianProject/Source/Units/PythianUtils.pas,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -r1.1 -r1.2 *** PythianUtils.pas 2000/09/10 16:47:17 1.1 --- PythianUtils.pas 2000/10/18 17:58:11 1.2 *************** *** 11,14 **** --- 11,16 ---- function BoolToStr(b:boolean):String; + procedure PyFreeAndNil(P: Pointer); + implementation *************** *** 18,21 **** --- 20,29 ---- Result := 'TRUE' else Result := 'FALSE'; + end; + + procedure PyFreeAndNil(P: Pointer); + begin + Dispose(P); + P := nil; end; |
From: Michael H. <mh...@us...> - 2000-10-17 18:23:10
|
Update of /cvsroot/pythianproject/PythianProject/Source/GameEngine In directory slayer.i.sourceforge.net:/tmp/cvs-serv25629/GameEngine Modified Files: GrEngState.pas Log Message: stuff Index: GrEngState.pas =================================================================== RCS file: /cvsroot/pythianproject/PythianProject/Source/GameEngine/GrEngState.pas,v retrieving revision 1.8 retrieving revision 1.9 diff -C2 -r1.8 -r1.9 *** GrEngState.pas 2000/10/17 06:03:12 1.8 --- GrEngState.pas 2000/10/17 18:23:07 1.9 *************** *** 54,58 **** Camera.ViewHeight := OpenGLWIndow.Height; ! // put code to init tests here glfInit; Ftxtfont := glfLoadFont(DataPath+'fonts\arial1.glf'); --- 54,58 ---- Camera.ViewHeight := OpenGLWIndow.Height; ! // put code to init text here glfInit; Ftxtfont := glfLoadFont(DataPath+'fonts\arial1.glf'); *************** *** 75,78 **** --- 75,79 ---- // glClear(GL_DEPTH_BUFFER_BIT); // don't know why we need this, but we do // well, turns out we don't :) + // heh. okay :) must just be me // reinit the matrices |
From: Michael H. <mh...@us...> - 2000-10-17 18:23:10
|
Update of /cvsroot/pythianproject/PythianProject/Source/Units In directory slayer.i.sourceforge.net:/tmp/cvs-serv25629/Units Modified Files: BaseAIs.pas NetDataExch.pas Log Message: stuff Index: BaseAIs.pas =================================================================== RCS file: /cvsroot/pythianproject/PythianProject/Source/Units/BaseAIs.pas,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -r1.12 -r1.13 *** BaseAIs.pas 2000/09/20 18:07:08 1.12 --- BaseAIs.pas 2000/10/17 18:23:07 1.13 *************** *** 95,99 **** C.Target := Character; C.CommandType := cmdType; ! C.TTL := 1; MakeAICommand := C; end; --- 95,99 ---- C.Target := Character; C.CommandType := cmdType; ! //@@C.TTL := 1; MakeAICommand := C; end; Index: NetDataExch.pas =================================================================== RCS file: /cvsroot/pythianproject/PythianProject/Source/Units/NetDataExch.pas,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** NetDataExch.pas 2000/10/17 06:04:40 1.5 --- NetDataExch.pas 2000/10/17 18:23:07 1.6 *************** *** 34,40 **** interface uses Windows, Classes, Points, IdTCPConnection, IdUDPBase, IdComponent, IdGlobal, ! PythColl, IdException; const --- 34,42 ---- interface + + // kamil - IdException doesn't seem to be in the repository. mike uses Windows, Classes, Points, IdTCPConnection, IdUDPBase, IdComponent, IdGlobal, ! PythColl{, IdException}; const |
From: Michael H. <mh...@us...> - 2000-10-17 18:23:10
|
Update of /cvsroot/pythianproject/PythianProject/Source/Conversation/Interpreter/second In directory slayer.i.sourceforge.net:/tmp/cvs-serv25629/Conversation/Interpreter/second Modified Files: frmMain.dfm Log Message: stuff Index: frmMain.dfm =================================================================== RCS file: /cvsroot/pythianproject/PythianProject/Source/Conversation/Interpreter/second/frmMain.dfm,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -r1.3 -r1.4 Binary files /tmp/cvs0tecFm and /tmp/cvse6Fkgz differ |
From: Darryl L. <py...@us...> - 2000-10-17 06:05:41
|
Update of /cvsroot/pythianproject/PythianProject/Source/Units In directory slayer.i.sourceforge.net:/tmp/cvs-serv25201 Modified Files: glfd.pas Log Message: Fixed up some little things Index: glfd.pas =================================================================== RCS file: /cvsroot/pythianproject/PythianProject/Source/Units/glfd.pas,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** glfd.pas 2000/10/14 19:37:24 1.2 --- glfd.pas 2000/10/17 06:05:28 1.3 *************** *** 23,26 **** --- 23,27 ---- - Kamil Krauspe (main guy) - Michael Hearn (minor changes) + - Darryl Long (teeny little changes) For the Pythian Project *************** *** 60,64 **** //* Font loading/unloading functions */ ! function glfLoadFont(font_name: string): Integer; //* Load font to memory*/ function glfUnloadFont: Integer; //* Unload font from memory */ function glfUnloadFontD(font_descriptor: Integer): Integer; //* Unload font by font_descriptor */ --- 61,65 ---- //* Font loading/unloading functions */ ! function glfLoadFont(const font_name: string): Integer; //* Load font to memory*/ function glfUnloadFont: Integer; //* Unload font from memory */ function glfUnloadFontD(font_descriptor: Integer): Integer; //* Unload font by font_descriptor */ *************** *** 66,90 **** //* Text drawing functions */ procedure glfDrawWiredSymbol(s: Char); //* Draw wired symbol */ ! procedure glfDrawWiredString(s: string); //* Draw wired string */ procedure glfDrawSolidSymbol(s: Char); //* Draw solid symbol */ ! procedure glfDrawSolidString(s: string); //* Draw solid string */ procedure glfDraw3DWiredSymbol(s: Char); //* Draw 3D wired symbol */ ! procedure glfDraw3DWiredString(s: string); //* Draw 3D wired string */ procedure glfDraw3DSolidSymbol(s: Char); //* Draw 3D solid symbol */ ! procedure glfDraw3DSolidString(s: string); //* Draw 3D solid string */ //* Text drawing functions by specified font */ procedure glfDrawWiredSymbolF(font_descriptor: Integer; s: Char); ! procedure glfDrawWiredStringF(font_descriptor: Integer; s: string); procedure glfDrawSolidSymbolF(font_descriptor: Integer; s: Char); ! procedure glfDrawSolidStringF(font_descriptor: Integer; s: string); procedure glfDraw3DWiredSymbolF(font_descriptor: Integer; s: Char); ! procedure glfDraw3DWiredStringF(font_descriptor: Integer; s: string); procedure glfDraw3DSolidSymbolF(font_descriptor: Integer; s: Char); ! procedure glfDraw3DSolidStringF(font_descriptor: Integer; s: string); //* Text control functions */ ! procedure glfGetStringBoundsF(fd: Integer; s: string; var minx, miny, maxx, maxy: Single); ! procedure glfGetStringBounds(s: string; var minx, miny, maxx, maxy: Single); procedure glfSetSymbolSpace(sp: Single); //* Set space between symbols */ --- 67,91 ---- //* Text drawing functions */ procedure glfDrawWiredSymbol(s: Char); //* Draw wired symbol */ ! procedure glfDrawWiredString(const s: string); //* Draw wired string */ procedure glfDrawSolidSymbol(s: Char); //* Draw solid symbol */ ! procedure glfDrawSolidString(const s: string); //* Draw solid string */ procedure glfDraw3DWiredSymbol(s: Char); //* Draw 3D wired symbol */ ! procedure glfDraw3DWiredString(const s: string); //* Draw 3D wired string */ procedure glfDraw3DSolidSymbol(s: Char); //* Draw 3D solid symbol */ ! procedure glfDraw3DSolidString(const s: string); //* Draw 3D solid string */ //* Text drawing functions by specified font */ procedure glfDrawWiredSymbolF(font_descriptor: Integer; s: Char); ! procedure glfDrawWiredStringF(font_descriptor: Integer; const s: string); procedure glfDrawSolidSymbolF(font_descriptor: Integer; s: Char); ! procedure glfDrawSolidStringF(font_descriptor: Integer; const s: string); procedure glfDraw3DWiredSymbolF(font_descriptor: Integer; s: Char); ! procedure glfDraw3DWiredStringF(font_descriptor: Integer; const s: string); procedure glfDraw3DSolidSymbolF(font_descriptor: Integer; s: Char); ! procedure glfDraw3DSolidStringF(font_descriptor: Integer; const s: string); //* Text control functions */ ! procedure glfGetStringBoundsF(fd: Integer; const s: string; var minx, miny, maxx, maxy: Single); ! procedure glfGetStringBounds(const s: string; var minx, miny, maxx, maxy: Single); procedure glfSetSymbolSpace(sp: Single); //* Set space between symbols */ *************** *** 107,114 **** //* Console functions */ procedure glfSetConsoleParam(width, height: Integer); ! function glfSetConsoleFont(Font_Descriptor: Integer): Integer; procedure glfConsoleClear; ! procedure glfPrint(s: string; lenght: Integer); ! procedure glfPrintString(s: string); procedure glfPrintChar(s: Char); --- 108,115 ---- //* Console functions */ procedure glfSetConsoleParam(width, height: Integer); ! function glfSetConsoleFont(Font_Descriptor: Integer): Integer; procedure glfConsoleClear; ! procedure glfPrint(const s: string; lenght: Integer); ! procedure glfPrintString(const s: string); procedure glfPrintChar(s: Char); *************** *** 236,240 **** // 0 - big endian endianTester := 1; ! endianChar := #0; endianChar := Char(endianTester); --- 237,241 ---- // 0 - big endian endianTester := 1; ! // endianChar := #0; endianChar := Char(endianTester); *************** *** 357,361 **** end; ! function glfLoadFont(font_name: string): Integer; var i: Integer; --- 358,362 ---- end; ! function glfLoadFont(const font_name: string): Integer; var i: Integer; *************** *** 393,397 **** // @@mike - FreeAndNil? Don't know about that one. //FreeAndNil(fonts[i]); ! Dispose(fonts[i]); fonts[i] := nil; end; end; --- 394,399 ---- // @@mike - FreeAndNil? Don't know about that one. //FreeAndNil(fonts[i]); ! Dispose(fonts[i]); ! fonts[i] := nil; end; end; *************** *** 489,493 **** end; ! procedure DrawString(s: string; funct: TCharProcedure); var i: Integer; --- 491,495 ---- end; ! procedure DrawString(const s: string; funct: TCharProcedure); var i: Integer; *************** *** 496,506 **** --- 498,512 ---- if s = '' then Exit; + if curfont < 0 then Exit; + glPushMatrix; + for i := 1 to Length(s) do begin if s[i] <> ' ' then funct(s[i]); + if (fonts[curfont]^.symbols[Byte(s[i])] = nil) or (s[i] = ' ') then glTranslatef(SpaceSize, 0, 0) *************** *** 513,516 **** --- 519,523 ---- if fonts[curfont]^.symbols[Byte(s[i+1])] = nil then Continue; + sda := fonts[curfont]^.symbols[Byte(s[i])]^.rightx; sdb := -fonts[curfont]^.symbols[Byte(s[i+1])]^.leftx; *************** *** 519,526 **** end; end; glPopMatrix; end; ! procedure glfDrawWiredString(s: string); begin DrawString(s, glfDrawWiredSymbol); --- 526,534 ---- end; end; + glPopMatrix; end; ! procedure glfDrawWiredString(const s: string); begin DrawString(s, glfDrawWiredSymbol); *************** *** 528,532 **** //* Draw wired string by font_descriptor */ ! procedure glfDrawWiredStringF(font_descriptor: Integer; s: string); var temp: Integer; --- 536,540 ---- //* Draw wired string by font_descriptor */ ! procedure glfDrawWiredStringF(font_descriptor: Integer; const s: string); var temp: Integer; *************** *** 563,568 **** y := vp^[b^[bo]*2+1]; anchor_proc(x, y, ap); if texturing = GLF_YES then ! glTexCoord2f((x+1)/2, (y+1)/2); glVertex2f(x, y); Inc(bo); --- 571,578 ---- y := vp^[b^[bo]*2+1]; anchor_proc(x, y, ap); + if texturing = GLF_YES then ! glTexCoord2f((x + 1) / 2, (y + 1) / 2); ! glVertex2f(x, y); Inc(bo); *************** *** 592,596 **** end; ! procedure glfDrawSolidString(s: string); begin DrawString(s, glfDrawSolidSymbol); --- 602,606 ---- end; ! procedure glfDrawSolidString(const s: string); begin DrawString(s, glfDrawSolidSymbol); *************** *** 598,602 **** //* Draw solid string by font_descriptor */ ! procedure glfDrawSolidStringF(font_descriptor: Integer; s: string); var temp: Integer; --- 608,612 ---- //* Draw solid string by font_descriptor */ ! procedure glfDrawSolidStringF(font_descriptor: Integer; const s: string); var temp: Integer; *************** *** 694,698 **** end; ! procedure glfDraw3DWiredString(s: string); begin DrawString(s, glfDraw3DWiredSymbol); --- 704,708 ---- end; ! procedure glfDraw3DWiredString(const s: string); begin DrawString(s, glfDraw3DWiredSymbol); *************** *** 700,704 **** //* Draw 3D wired string by font_descriptor */ ! procedure glfDraw3DWiredStringF(font_descriptor: Integer; s: string); var temp: Integer; --- 710,714 ---- //* Draw 3D wired string by font_descriptor */ ! procedure glfDraw3DWiredStringF(font_descriptor: Integer; const s: string); var temp: Integer; *************** *** 828,832 **** end; ! procedure glfDraw3DSolidString(s: string); begin DrawString(s, glfDraw3DSolidSymbol); --- 838,842 ---- end; ! procedure glfDraw3DSolidString(const s: string); begin DrawString(s, glfDraw3DSolidSymbol); *************** *** 834,838 **** //* Draw 3D solid string by font_descriptor */ ! procedure glfDraw3DSolidStringF(font_descriptor: Integer; s: string); var temp: Integer; --- 844,848 ---- //* Draw 3D solid string by font_descriptor */ ! procedure glfDraw3DSolidStringF(font_descriptor: Integer; const s: string); var temp: Integer; *************** *** 845,849 **** //* Get the size a string will have on screen */ ! procedure glfGetStringBoundsF(fd: Integer; s: string; var minx, miny, maxx, maxy: Single); var font: Pglf_font; --- 855,859 ---- //* Get the size a string will have on screen */ ! procedure glfGetStringBoundsF(fd: Integer; const s: string; var minx, miny, maxx, maxy: Single); var font: Pglf_font; *************** *** 898,902 **** end; ! procedure glfGetStringBounds(s: string; var minx, miny, maxx, maxy: Single); begin glfGetStringBoundsF(curfont, s, minx, miny, maxx, maxy); --- 908,912 ---- end; ! procedure glfGetStringBounds(const s: string; var minx, miny, maxx, maxy: Single); begin glfGetStringBoundsF(curfont, s, minx, miny, maxx, maxy); *************** *** 986,998 **** procedure glfSetConsoleParam(width, height: Integer); ! var ! e: Integer; begin ! if Length(conData) > 0 then SetLength(conData, 0); conWidth := width; conHeight := height; SetLength(conData, width * height); ! e := Length(conData); glfConsoleClear; end; --- 996,1009 ---- procedure glfSetConsoleParam(width, height: Integer); ! {var ! e: Integer;} begin ! if Length(conData) > 0 then ! SetLength(conData, 0); conWidth := width; conHeight := height; SetLength(conData, width * height); ! // e := Length(conData); glfConsoleClear; end; *************** *** 1015,1021 **** end; ! procedure glfPrint(s: string; lenght: Integer); var ! i, e: Integer; begin for i := 1 to lenght do --- 1026,1032 ---- end; ! procedure glfPrint(const s: string; lenght: Integer); var ! i{, e}: Integer; begin for i := 1 to lenght do *************** *** 1023,1032 **** if s[i] > #31 then begin ! e := Length(conData); conData[cony * conWidth + conx] := s[i]; Inc(conx); ! end else if s[i] = #13 then conx := conWidth; if conx >= conWidth then begin --- 1034,1045 ---- if s[i] > #31 then begin ! // e := Length(conData); conData[cony * conWidth + conx] := s[i]; Inc(conx); ! end ! else if s[i] = #13 then conx := conWidth; + if conx >= conWidth then begin *************** *** 1045,1049 **** end; ! procedure glfPrintString(s: string); begin glfPrint(s, Length(s)); --- 1058,1062 ---- end; ! procedure glfPrintString(const s: string); begin glfPrint(s, Length(s)); |