fpc/packages/libndsfpc/examples/gl2d/primitives/primitives.pp
Legolas 659b386f02 + Added Easy gl2d library for Nintendo DS and 6 new examples
* libndsfpc: Fixed glMaterialShinyness()

git-svn-id: trunk@19932 -
2011-12-31 14:14:12 +00:00

271 lines
6.5 KiB
ObjectPascal

(*
Easy GL2D
Relminator 2011
Richard Eric M. Lope BSN RN
Http://Rel.Phatcode.Net
A very small, simple, yet very fast DS 2D rendering lib using the DS' 3D core.
--
Translated in Object Pascal by Francesco Lombardi - 2012
http://itaprogaming.free.fr
*)
program primitives;
{$mode objfpc}
uses
nds9, ctypes, gl2d;
const
HALF_WIDTH = (SCREEN_WIDTH div 2);
HALF_HEIGHT = (SCREEN_HEIGHT div 2);
BRAD_PI = (1 shl 14);
// Simple box, triangle, and putpixel demo
procedure simple(frame: cint);
var
red, green, blue: cint;
i: integer;
x, y: integer;
begin
// set up GL2D for 2d mode
glBegin2D();
// Do some funky color cycling
red := abs(sinLerp(frame * 220) * 31) shr 12;
green := abs(sinLerp(frame * 140) * 31) shr 12;
blue := abs(sinLerp(frame * 40) * 31) shr 12;
// fill the whole screen with a gradient box
glBoxFilledGradient( 0, 0, 255, 191,
RGB15( red, green, blue ),
RGB15( blue, 31 - red, green ),
RGB15( green, blue, 31 - red ),
RGB15( 31 - green, red, blue )
);
// draw a black box
glBoxFilled( 200, 10,
250, 180,
RGB15(0,0,0)
);
// draw a border around the black box
glBox( 200, 10,
250, 180,
RGB15(0,31,0)
);
// draw a triangle
glTriangleFilled( 20, 100,
200, 30,
60, 40,
RGB15(31,0,31)
);
// draw a gradient triangle
glTriangleFilledGradient( 20, 100,
200, 30,
60, 40,
RGB15(blue,red,green),
RGB15(green,blue, red),
RGB15(red,green,blue)
);
// translucent mode
// Poly ID 1
glPolyFmt(POLY_ALPHA(16) or POLY_CULL_NONE or POLY_ID(1));
glBoxFilledGradient( 10, 50, 230, 150,
RGB15( green, 0, 0 ),
RGB15( 0, red, 0 ),
RGB15( 31, 0, blue ),
RGB15( 0, red, 31 )
);
// translucent mode
// Poly ID 2
glPolyFmt(POLY_ALPHA(16) or POLY_CULL_NONE or POLY_ID(2));
glTriangleFilledGradient( 70, 10,
20, 130,
230, 180,
RGB15(red,green,blue),
RGB15(blue,red,green),
RGB15(green,blue, red)
);
i := 0;
// restore to normal(solid) rendering
glPolyFmt(POLY_ALPHA(31) or POLY_CULL_NONE or POLY_ID(3));
// draw a circle using putpixel
{
for i := 0 to 128 do
begin
x := sar(cosLerp(i * 256) * 80, 12);
y := sar(sinLerp(i * 256) * 70, 12);
glPutPixel( HALF_WIDTH + x,
HALF_HEIGHT + y,
RGB15(red, green, blue)
);
end;
}
while i < BRAD_PI * 2 do
begin
x := SarLongint(cosLerp(i) * 80, 12);
y := SarLongint(sinLerp(i) * 70, 12);
glPutPixel( HALF_WIDTH + x, HALF_HEIGHT + y, RGB15(red, green, blue) );
inc(i, 256);
end;
glEnd2D();
end;
// oldskool lines demo
procedure lines(frame: cint);
var
red, green, blue: cint;
i: cint;
px, py, px2, py2: cint;
begin
// Do some funky color cycling
red := abs(sinLerp(frame * 220) * 31) shr 12 ;
green := abs(sinLerp(frame * 140) * 31) shr 12 ;
blue := abs(sinLerp(frame * 40) * 31) shr 12 ;
// set up GL2D for 2d mode
glBegin2D();
// draw a bunch (4096/32) of colored lines
// using some funky trig equations
i := frame;
while i < ((1 shl 12) + frame) do
begin
px := SarLongint(sinLerp(frame * 130) * 130, 12) * cosLerp( (i * 100));
py := SarLongint(sinLerp(frame * 280) * 70, 12) * sinLerp( (i * 200));
px2 := SarLongint(sinLerp(frame * 330) * 100, 12) * cosLerp(((i * 300 + BRAD_PI)));
py2 := SarLongint(sinLerp(frame * 140) * 80, 12) * sinLerp(((i * 400 + BRAD_PI)));
glLine( HALF_WIDTH + SarLongint(px, 12), HALF_HEIGHT + SarLongint(py, 12),
HALF_WIDTH + SarLongint(px2, 12), HALF_HEIGHT + SarLongint(py2, 12),
RGB15(red, green, blue)
);
glLine( HALF_WIDTH + SarLongint(py2, 12), HALF_HEIGHT + SarLongint(px, 12),
HALF_WIDTH + SarLongint(py, 12), HALF_HEIGHT + SarLongint(px2, 12),
RGB15(green, blue, red)
);
inc(i, 32);
end;
glEnd2D();
end;
// Some radially displaced pixels
procedure pixels(frame: cint);
var
radius, red, green, blue: cint;
i, angle: cint;
x, y, a2,x2,y2: cint;
begin
// Elastic radius
radius := 40 + (abs(sinLerp(frame * 20) * 80) shr 12);
// Do some funky color cycling
red := abs(sinLerp(frame * 220) * 31) shr 12 ;
green := abs(sinLerp(frame * 140) * 31) shr 12 ;
blue := abs(sinLerp(frame * 40) * 31) shr 12 ;
// speed opf animation
i := (frame * 140) and 32767;
// duh!
angle := 0;
// set up GL2D for 2d mode
glBegin2D();
// Draw a full revolution of some radially dispalced pixels
for angle := 0 to 512 do
begin
a2 := (angle * 64) + i;
x := cosLerp(angle * 64 * 2) * radius;
y := sinLerp(x div 32 + a2) * radius;
x := cosLerp((y div 64) + (angle * 64)) * (radius + 20);
y := sinLerp(x div 64 + a2) * radius;
x2 := -y;
y2 := x;
glPutPixel( HALF_WIDTH + SarLongint(x, 12),
HALF_HEIGHT + SarLongint(y, 12),
RGB15(red, green, blue)
);
glPutPixel( HALF_WIDTH + SarLongint(x2, 12),
HALF_HEIGHT + SarLongint(y2, 12),
RGB15(green, blue, red)
);
end;
glEnd2D();
end;
// Demo titles
var
demo_titles: array [0..2] of pchar = ('Lovely Wobbly ',
'OldSkool ',
'This Suxxors! ');
var
frame: integer = 0;
demonum: integer = 0;
key: integer;
begin
defaultExceptionHandler();
// Set it to my favorite mode
videoSetMode( MODE_5_3D );
consoleDemoInit();
// Initialize GL in 3d mode
glScreen2D();
iprintf(#$1b'[1;1HEasy GL2D Primitives Example');
iprintf(#$1b'[3;1HRelminator');
iprintf(#$1b'[4;1Hhttp://rel.betterwebber.com');
iprintf(#$1b'[6;1HPress Arrow keys to Change FX');
while true do
begin
// increment frame counter
inc(frame);
// get input
scanKeys();
key := keysDown();
// process input
if ((key and KEY_DOWN) <> 0) or ((key and KEY_RIGHT) <> 0) then
demonum := (demonum + 1) mod 3;
if ((key and KEY_UP) <> 0) or ((key and KEY_LEFT) <> 0) then
begin
dec(demonum);
if demonum < 0 then
demonum := 2;
end;
// figure out what demo should be viewed
case demonum of
0: pixels(frame);
1: lines(frame);
2: simple(frame);
else
pixels(frame);
end;
glFlush(0);
swiWaitForVBlank();
iprintf(#$1b'[10;1HDemo# %i/3', demonum+1);
iprintf(#$1b'[11;1HTitle: %s', demo_titles[demonum] );
end;
end.