SRL Archive - Unofficial Development

External Transparent Layer - draw with Simba on your desktop!


bg5

2013-10-13 12:42:58

Hello,
as you surely know SMART has utility to draw debug on client.



Have you ever thought about drawing on something else then RS?

External Transparent Layer allows you to paint on top of any surface, any client ,any window. You can use it with APPA ,debug flash games or project someone's picture on desktop. ;) ETL works in independent thread and doesn't share memory with Simba.

Limits:
* Windows only
* Works only with windowed (not full screen) applications


Features:
* Fast
* Handy
* Leakproof ( I hope so:p )
* Functionality based on PAINTSMART
* HotKeys



Credits to:
* @Brandon for c++ plugin template
* all PAINTSMART include creators for ideas of functions


Example of use - debugging flash game:






Instalation:
ETL comes in two parts: etl.dll (plugin) and ETL_Lape.simba (include). Put include into "Includes" and plugin into "Plugins". (Was it necessary? :P )

Instruction:



All functions are self - explainable, but here is short close-up:

* New vesion of include provides one-line initialisation:

ETL_Start(); // Opens ETL and places it on top of a client window.

etl_CloseWindow(); // optionally - you don't have to close ETL at the end of the script
// also you can close ETL window manually at any time by 'Esc' hotkey


* Default transparent color is clWhite. Of course you can change it.

* For bitmaps use functions from include:

ETL_SetBmp(); 
ETL_DrawBmp();
ETL_DrawBmpTransp();

NOT these functions from plugin:

//don't use !
etl_SetBitmap();
etl_DrawBitmapTranspEx();
etl_DrawBitmapTransp();
//just ignore them


*HotKeys:
C - Clear layer
R - Refresh
M - Minimize
Esc - Close


* For more look into interactive tutorial… ( currently outdated)

bg5

2013-10-13 12:44:14

I started this interactive tutorial when I was bored…but finishing it was a real pain. So here it comes,enjoy :)

program ETL_TUT;
{$loadlib ETL}
{$i etl.simba}
const
mw = 1053;
mh = 484;

var bmp,bmp2,cw,ch,i :integer;

procedure MakeFont(FLabel,Name:string;Size:integer;Style :TFontStyles);
var f:Tfont;
begin
f := TFont.Create;
f.Name := Name;
f.Size := Size;
f.Style := Style;
LoadSystemFont(f,FLabel);
f.Free;
end;


var ratioW,ratioH :extended;
function A(x:integer;isX:Boolean) : integer; //Adjust
begin
if isX then
Result := Round(x*ratioW)
else
Result := Round(x*ratioH);
end;

procedure PressSpace;
var i,x1,y1,x2,y2 :integer;
begin
x1 := cw/2-150;
y1 := ch - a(100,false);
x2 := cw/2+300;
y2 := ch - a(100,false) +50;

etl_Rectangle(x1,y1,x2,y2,clred,true);
for i:=0 to 50 do
begin
i:=i+1;
wait(30);
etl_LineTo(x1,y1+i,x2,y1+i,clred);
end;
etl_DrawTextEx(x1+50,y1+10,'Space','Press SPACE to continue...',0,false);
while(true) do
begin
if IsKeyDown(VK_SPACE) then
begin
ETL_ClearArea(IntToBox(x1,y1,x2,y2+2 ));
exit;
end;
sleep(50);
end;

end;
// modified ETL_DrawTextMultiEx with delay between rows - just for this presentation
procedure ETL_DrawTextMultiEx2(TSA: TStringArray; Placement: TPoint; Font: string; color: TColor; Shadow,Background:Boolean; BGcolor:TColor );
var
i,w,h ,TPH: Integer;
TTP, SArr: TPointArray;

begin
TPH := High(TSA);
for i := 0 to TPH do
begin
TPAFromTextWrap(TSA[i], Font, w,h,TTP);
OffsetTPA(TTP, Point(Placement.x, Placement.y + (i * (h+1))));
if Background then
etl_Rectangle(Placement.x,Placement.y+(i*h),Placement.x+w,Placement.y+h+(i * h),BGcolor,false);
etl_DrawTPA(TTP, color);
if Shadow then
begin
SArr := CopyTPA(TTP);
OffsetTPA(SArr, Point(1, 1));
ClearTPAFromTPAWrap(SArr, TTP, SArr);
etl_DrawTPA(SArr, 65536);
end;
wait(1500);
end;
end;

procedure Spiral(w,h:integer;param_a ,param_b : extended);
var
i ,radius ,bmp ,bmp2,cw,ch,x,y :integer;
tpa,temp :TPointarray;
M : TPoint;
b : extended;
begin
M := Point (w/2,h/2);
radius := (min(w,h))/2-10;
GetClientDimensions(cw,ch);
x := cw/2-w/2;
y := ch/2-h/2;
for i:= 0 to radius do
begin
TPAFromCircleWrap(m.x,m.y,i,temp);
combineTPAWrap(tpa,temp,tpa);
end;

bmp := CreateBitmap(w,h);
DrawTPABitmap(bmp,tpa,clWhite);

for i:=0 to 357 do
begin
b := fixd(i);
temp := tpa;
FilterPointsPie(temp,b, b+3, param_a*i, param_a*i+param_b*i,m.x,m.y);
DrawTPABitmap(bmp,temp,clred+(i mod 3)*10000);
bmp2 := rotatebitmap(bmp,pi/2);
freebitmap(bmp);
bmp := bmp2;
ETL_DrawBmpTransp(bmp,x,y,0);
end;

freebitmap(bmp);
end;

var TSA : TstringArray;
var TPA :TPointArray;
var ATPA :t2dpointarray;
var TBA: TBoxArray;
var cx,cy: integer;


procedure Page1;
begin
ETL_SetBmp(bmp,5,5);


ETL_DrawTextBgEx(cw/2-315,ch/2,'TNR','Welcome to External Transparent Layer',clblack,clAqua,TRUE);
wait(2000);

for i:= 0 to 60 do
begin
etl_Ellipse(cw/2+i,ch/2+60,100,i/2,clAqua+200,false);
end;

ETL_DrawTextBgEx(cw/2+30,ch/2+50,'LoginChars','By beginner5',clblack,clAqua+200,TRUE);
wait(3000);

ETL_DrawTextBgEx(cw/2-313,A(150,false),'ArialI','In this little TUT I want to show you what it can do...',clblack,2588671,FALSE);
wait(3000);
PressSpace();
etl_ClearLayer();

end;

procedure Page2;
begin
ETL_DrawBmp(bmp,5,5);
ETL_DrawTextBgEx(cw/2-100,A(50,false),'TNR','Overview',clblack,clAqua,TRUE);
wait(2000);
ETL_DrawTextMultiEx2(['ETL is:',' fully click - through - able ',' tranparent layer ',' which you can put on top of any window ',' and draw stuff on it ! '],Point(120,130),'ArialB',0,false,true,clred);
wait(2000);
PressSpace();
etl_ClearLayer();
end;

procedure Page3;
begin
ETL_DrawBmp(bmp,5,5);
ETL_DrawTextBgEx(cw/2-100,A(50,false),'TNR','HotKeys',clblack,clAqua,TRUE);
wait(2000);
ETL_DrawTextMultiEx2([' Press "R" to Refresh ',' Press "C" to Clear ',' Press "M" to Mimimize ','',' To use HotKeys you need to click ETL icon on the bar. ',' It''s only way to active mouse/keyboard focus on ETL. '],Point(120,130),'ArialB',0,false,true,clred);
ETL_DrawBmp(bmp2,120,310);
wait(1000);
TPA := [Point(494, 375),Point(512, 330),Point(525, 353),Point(477, 352),Point(512, 330),Point(500, 375),Point(494, 375)];
etl_Polygon(TPA,High(TPA),clwhite-1,false);
etl_Polygon(TPA,High(TPA),1,true);
wait(2000);
PressSpace();
etl_ClearLayer();
end;

procedure Page4;
begin
ETL_DrawBmp(bmp,5,5);
ETL_DrawTextBgEx(cw/2-100,A(50,false),'TNR','Functions',clblack,clAqua,TRUE);
wait(1000);
TPA := [Point(26, 10), Point(12, 11), Point(14, 13), Point(15, 13), Point(16, 13), Point(17, 13), Point(18, 13), Point(19, 13), Point(20, 13), Point(21, 13), Point(22, 13), Point(23, 13), Point(24, 13), Point(15, 14), Point(19, 14), Point(133, 14), Point(145, 14), Point(15, 15), Point(19, 15), Point(137, 15), Point(138, 15), Point(19, 16), Point(136, 16), Point(137, 16), Point(138, 16), Point(19, 17), Point(135, 17), Point(136, 17), Point(138, 17), Point(12, 18), Point(19, 18), Point(135, 18), Point(138, 18), Point(19, 19), Point(135, 19), Point(138, 19), Point(19, 20), Point(26, 20), Point(135, 20), Point(138, 20), Point(19, 21), Point(20, 21), Point(132, 21), Point(133, 21), Point(134, 21), Point(135, 21), Point(138, 21), Point(141, 21), Point(142, 21), Point(143, 21), Point(16, 22), Point(19, 22), Point(135, 22), Point(138, 22), Point(19, 23), Point(135, 23), Point(138, 23), Point(19, 24), Point(135, 24), Point(139, 24), Point(140, 24), Point(19, 25), Point(134, 25), Point(135, 25), Point(137, 25), Point(138, 25), Point(139, 25), Point(19, 26), Point(134, 26), Point(135, 26), Point(136, 26), Point(137, 26), Point(139, 26), Point(140, 26), Point(133, 27), Point(140, 27), Point(144, 27), Point(132, 28), Point(133, 28), Point(140, 28), Point(141, 28), Point(142, 28), Point(132, 29), Point(142, 29), Point(131, 30), Point(132, 30), Point(142, 30), Point(130, 31), Point(142, 31), Point(130, 32), Point(142, 32), Point(65, 33), Point(142, 33), Point(142, 34), Point(142, 35), Point(70, 36), Point(71, 36), Point(72, 36), Point(73, 36), Point(74, 36), Point(75, 36), Point(65, 37), Point(66, 37), Point(67, 37), Point(68, 37), Point(69, 37), Point(74, 37), Point(75, 37), Point(65, 38), Point(75, 38), Point(141, 38), Point(65, 39), Point(75, 39), Point(65, 40), Point(75, 40), Point(65, 41), Point(75, 41), Point(58, 42), Point(65, 42), Point(69, 42), Point(75, 42), Point(65, 43), Point(75, 43), Point(65, 44), Point(75, 44), Point(65, 45), Point(75, 45), Point(65, 46), Point(74, 46), Point(75, 46), Point(64, 47), Point(65, 47), Point(75, 47), Point(65, 48), Point(66, 48), Point(67, 48), Point(73, 48), Point(74, 48), Point(75, 48), Point(65, 49), Point(66, 49), Point(67, 49), Point(68, 49), Point(69, 49), Point(70, 49), Point(71, 49), Point(72, 49), Point(73, 49), Point(65, 50), Point(65, 51), Point(65, 52), Point(65, 53)];

etl_Rectangle(A(150,true),A(50,false),A(380,true),A(400,false),6071738,false);
ETL_DrawTextBgEx(A(130,true),A(40,false),'ArialB','Rectangle()',clblack,clblue,TRUE);

wait(1000);

OffsetTPA(TPA,Point(A(200,true),A(100,false)));
ETL_DrawTextBgEx(A(230,true),A(150,false),'ArialB','DrawTPA()',clblack,clblue,TRUE);
ETL_DrawTPA(TPA,clred);
wait(1000);
OffsetTPA(TPA,Point(0,A(100,false)));
ETL_DrawTextBgEx(A(215,true),A(270,false),'ArialB','DebugTPA()',clblack,clblue,TRUE);
ETL_DebugTPA(TPA,clgreen);
wait(1000);
OffsetTPA(TPA,Point(0,A(100,false)));
SplitTPAExWrap(TPA,10,10,ATPA);
ETL_DrawTextBgEx(A(200,true),A(370,false),'ArialB','DebugATPA()',clblack,clblue,TRUE);
ETL_DebugATPA(ATPA);

for i:= 0 to 60 do
begin
wait(20);
etl_Ellipse(A(510,true),A(230,false),10+i,10+2*i,clgreen,false);
end;
ETL_DrawTextBgEx(A(440,true),A(115,false),'ArialB','Ellipse()',clblack,clblue,TRUE);

wait(1000);
TPA := [Point(84, 48), Point(223, 50), Point(290, 159), Point(49, 161), Point(111, 259), Point(217, 271), Point(154, 147)];
OffsetTPA(TPA,Point(A(700,true),A(100,false)));
etl_Polygon(TPA,High(TPA),clred,false);
ETL_DrawTextBgEx(A(750,true),A(130,false),'ArialB','Polygon()',clblack,clblue,TRUE);

TBA := [IntToBox(cx+0,cy+0,cx+10,cy+10),IntToBox(cx-10,cy-10,cx+20,cy+20),IntToBox(cx-25,cy-25,cx+35,cy+35),IntToBox(cx-75,cy-75,cx+85,cy+85)];
ETL_DrawBoxes(TBA,true);
ETL_DrawTextBgEx(cx-30,cy+75,'ArialB','DrawBoxes()',clblack,clblue,TRUE);
PressSpace();
etl_ClearLayer();
end;

procedure Page5;
begin
etl_SetTransparentCol(clwhite);
etl_ClearLayer();
ETL_DrawBmp(bmp, 5, 5);
ETL_DrawTextBgEx(cw/2-100,A(50,false),'TNR','More functions',clblack,clAqua,TRUE);
etl_Rectangle(1,1,cw-1,ch-1,clred,true);
ETL_DrawTextMultiEx(['Let''s change transparency color with:','SetTransparentCol()'],A(130,true),A(100,false),'ArialB',14657091,FALSE,TRUE,clyellow );
wait(500);
PressSpace();
etl_SetTransparentCol(14657091);
wait(3000);
ETL_DrawTextMultiEx(['Now clear part of screen with:','ClearArea()'],A(130,true),A(250,false),'ArialB',14657091,FALSE,TRUE,clyellow );
wait(500);
PressSpace();
ETL_ClearArea(IntToBox(A(130,true),A(100,false),A(700,true),A(350,false)));
wait(2000);
ETL_DrawTextMultiEx(['Finally clear whole layer with:','ClearLayer()'],A(130,true),A(130,false),'ArialB',clred,FALSE,TRUE,clyellow );
wait(500);
PressSpace();
etl_ClearLayer();
wait(1000);
etl_Rectangle(1,1,cw-1,ch-1,clred,true);
ETL_DrawBmp(bmp, 5, 5);
ETL_DrawTextMultiEx(['Now change size of layer with:','SetSize()'],A(410,true),A(250,false),'ArialB',clred,FALSE,TRUE,clyellow );
wait(2000);
etl_SetTransparentCol(0);
PressSpace();
etl_SetSize(400,300);
wait(3000);
ETL_DrawTextMultiEx(['...And fit it back to client with:','MoveToClient()','(Press SPACE to continue)'],20,100,'ArialB',clred,FALSE,TRUE,clyellow );
wait(500);
PressSpace();
ETL_MoveToClient();
wait(1000);
wait(500);
PressSpace();
etl_ClearLayer();
end;

procedure Page6;
begin
ETL_DrawBmpTransp(bmp, 5, 5 ,clwhite);
Spiral(600,600,0.3,0.4);
ETL_DrawTextEx(A(100,true),A(100,false),'TNRbig','THE END',clblack,TRUE);
wait(1000);
PressSpace();
etl_SetTransparentCol(clwhite);
etl_ClearLayer();
etl_CloseWindow();

end;

procedure SetUp();
begin

if (GetImageTarget()= 0) then SetDesktopAsClient();
if not etl_IsWindowOpened() then etl_OpenWindow();
ETL_MoveToClient();
wait(300);
etl_ClearLayer();
GetClientDimensions(cw,ch);
ratioW := (cw+0.0)/mw;
ratioH := (ch+0.0)/mh;
cx := cw/2;
cy := ch/2;
MakeFont('Space','Arial',18,[fsBold]);
MakeFont('TNR','Times New Roman',26,[]);
MakeFont('ArialI','Arial',20,[fsItalic]);
MakeFont('ArialB','Arial',18,[fsBold]);
MakeFont('TNRbig','Times New Roman',100,[fsBold]);
bmp := BitmapFromString(113, 103, 'beNrtXfdXU9kW/kueiig' +
'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');


bmp2 := BitmapFromString(625, 39, 'beNrVnQdcFFf395EiRekL' +
'iF3YxZ5EY3xsMUajRqOxYy/Ye++KIihKUTqIvaHYYywxaowm9th7' +
'xd6NSewmRt7DHuc8d++dmZ1d0Of//tjPfu7ODrMzt5zvPefeuVOq' +
'1FxJLVu2HDx48NmzZx9Kevy/0O+MHgl6aKoHku5LumfUXUl3GN1m' +
'dEvSTUk3jLou6Zqkq5KuXLmSxeiKpMtGXZJ0QdA5U52VdMao04JO' +
'njx5itFJo07JCb86IWnv3r1hYWEDBgyYb1RwcPCwYcPOnz9P2fX7' +
'e9Oj/2/18H+qB9qU/b/TW3P6V9IbU/0j6G9TvZb0SkEvJT031TNJ' +
'TyU9MdVfkv406g9BZquxUulwdoZ0V9AdU4GhiI+P79ChQ7hR9evX' +
'79mz55EjR2gH2XK//x50T5DSOd82lZLNFE1llqk4Uwm6aJSShQSd' +
'YUSmEgRGDywkGUAyfcclHTPqqKQjkg4b9Zugg6baL+mAJNqyz6i9' +
'krZs2QLWtV27dlNMhYWL8vLy2rBhA5z/YVUdYXTUVLQPnu0hQXTm' +
'smfLnvMeo34x1W5JOyXtkLRt27Yfjdpq1GZJGyStN2qtpFWSMiUt' +
'M2qJUYsXL14gibocc4xKlZQiKTExMSEhIV7STEkxkqKMmi5pmqSp' +
'RoVLAhpOnjyZ3kGTJk2CNL6zCRTuAAqTlJycDGdiMBgaNGjQsGFD' +
'X1/f7777ji1QLAWqTlx5UeFy+4s6YCooQbbUQL9KorLbZaqdpmLL' +
'EfWDpC1GfS+JChTLcbWklZKWG7VixQoozaVLly6WNF8SlWaaUcmS' +
'EiXFGUXlGCVphiQsxwhJ1JqomEChoaETJI2XNNaoMUaNHj16lKSR' +
'Ro0YMWK4qYYZBXYY0Ma1tWOMjgs6wei4go5p1lE5HZGTkuFSqTys' +
'HUBTQFWIa/g/CxLrD1eLUD+aCuwDV7tIZDc2mep7QRtM9Z2g9aaC' +
'34Ur8vb21hvl4uKSkZEBecs2FnVxTczSzNkuaZsgtJliJqDoitZJ' +
'WiMJTegKSUuNAvu5yChqcemSZktKMkq0mVxbmyoJWhkmyDCiqImN' +
'k4SNi1rWCEnYlIZIGiRpoKT+RvWT1LdvX0qgehtFH6GlQxsHaAYE' +
'BASa6itJrq6uYH6Bd0S3A+Z0UEEqxGS5KRpe0QJz9eQno6h6UDOh' +
'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' +
'E/qnXAjXLEO1uJ+NLBHdClenTh24RrwZiubHsmA1IvXd9KTGsQlN' +
'4qRgLzinc6Jaz58evGhquyXh7TPC3iH1+TOzqxdajVR4x7mFcMIP' +
'HjxQQirCApCKEzVZpM6YMQPsIcCUZrXBFrC6LFInTZoE75CGVkzB' +
'WwxiAFLJ2eSQSvQUkQpp2AIZCydw7949oOTo0aNPMIKPsBH2gVKg' +
'MRSLkAo1n5Dq4eEBFyuu24P1zYbhaeXKldXA2stkMrAMTBl3lWOo' +
'SExwqYCSYD0wGCv6m+SNouAjGiIiIDKXBR/HR4Ijboechwtkn7YA' +
'H6H10VcoaALg286ePbuyqejgeIbIdPQyoApBleB6EeShV88Lsc9L' +
'lUUqpDdv3kxr8pBo5tiGjjWPNtCfbKQ/30J/uU1O+PdCsP5yO/21' +
'7u9uqDk7ovzyfp8fmPDxvfic2UoPlxa7vrJc4Ff93Sv19ajQ1aNU' +
'y9r1mz/6qd6zneX/ver19xmnV8ddHs8tNn/k5xxGoXpjOBfDv1AV' +
'kZ6IVEpTQpyyAjAFpKIHKiIVHTqMKEI7hTRkDphonHmOGIVC6d69' +
'Oxhw2AHjkOANwXZEAHqpsl4V4Q+fMmmWkogM+EdiByW02H+OrYsX' +
'L4YGyyKVW8mQVltK8XRK9nSKL5Rvlr9DrLdDgrtduqdNqs4mWmc7' +
'pZhL+EfeowNtY6oUSKlVYO4XLvNqOy2o7TT7C+fEui5pTT1W9QzY' +
'PqbyngmfnYqodWV6nRtRXzyI/PxeZN27UTUexNbeHD2ka7fu7J0p' +
'YHMwPtCjRw/IUsgWyi72Ytk0QJ9yA4oJ/gU2Iknhq8zMTDgO8BRt' +
'I5tXGtfn5L7i9pflqcYoLisrACouNQNealZWFndfCXv7CYtUmonU' +
'Ij261dwZbRZEBi+e2m7plA4ZkzplTjR7X6p1SCVooosK1gwqHnx8' +
'8eIFh1Rxqu1pozDwi04rfIskBarCoYCndMsVIhXnGkEa/uXUqVMi' +
'UmW9VNYhFTeCMQeLAb8OdRV+C5EK7w+Mwo+Q7RjmpTtJLUIqeAdg' +
'gRGpnp6eK1asELtbWG0Af4gMjWDlkCq/ILCRqiwi0W0Ek4guJJIU' +
'8gHS6enpQEx4p7gr5C18hB3Ai0Q4QgI+wkbiGss4kXqYhuxCMrLb' +
'4f3atWvQ04amV6lSpebNmyNSKzGC/4JTgnf8CP8C1gPhi7wGMwgH' +
'h/NB+iNSq8qJw6vVApsmi1S61xUKesOGDdyCPKwmdAv+rZ7+SD39' +
'6W/0F1vorwTrr3TQZ3XMCQJf62G8p2aI4ebwnDtrrvTVH2qkT65W' +
'uU+zr/yr9PD+pKeuTEdd8abjh1Z8vs3zxS6Xl8dcnuzy+XNLoXvh' +
'xQd0bc7NoQVW0sgp5DPODmLDtuClAmpDQ0PZW01xABQFAEWksgCF' +
'I7DDcCAKxsI7kpELM1J0ESqP6FVhGl0k8qrA2uO/AAhgo9nVmDl3' +
'DBop0gQS6rNiRGTAKS1ZsgTKlJAaFRWFBSouzZfsnj/JzTGmoM0s' +
'z/yJHs7pnk5zPPKlegNS84UWdRlQzHFYoMuE8u5TKrpHfuQWWdE1' +
'srzbxIruIz9xDa2tm9UmKK1bxVWDPt09pvqxsNrnZta9M73O3WmN' +
'LkR9ezCudWrkyJDuPdnZuThCjdly6dIlNuvo8uEq6MLh6gYMGIBp' +
'TFy5cgX/HQwRfNu5c2dAKnwEc3f79m3YrZmqVGbbitu54VGWoSoj' +
'nrKg1H7buNId6NDXrV279sWLF7k1YFm8skilmUitMdi7JKL9srCO' +
'y0M7r5zQdfVYQupr43TfvPJSWaTCueG8Iyg1aINKSGXvU8bFlGA7' +
'TUbCqC+6q3QoIClwlpDKxX5v3boli1QcCcUmzCKVpi2BgJJAK/gJ' +
'SP/xxx/EUBDeMEJuKRv7tTTwC/0WFqnQVJWWIECkAh20g5WdrcTD' +
'FAPCRqR+KghJRCOhhELIJcoiuNIvv/wSOjzbtm1jMQcfYSNyDTLn' +
'E6NgI3iU4FfiR/iWjg8HpN2Qm/gROo3wL3AoSH/88cf4FeTYx6aC' +
'LXRKsD+0C9iTPTicM10Ue78q9hNw+FVWsuRV2k6CTh2UYymjZJFq' +
'MBjWrl0rrnpHs68h/UvdoIO19cfq6898o7/UMmf2L/iqWV30F9vp' +
'zzbXn2ulP/2t/lAd/feflO1U+ku/Mh18ynX0KdPRr0x7v8BWvoUb' +
'Hsko8udan2e/ev/5Q6FHmcUeJJXY3beCxjtHZO+MUJoTCwCFBgLv' +
'Sjfjs/FS7XFX2ZspWuSpmmsQRwr6Xzg9aN1QvojUMmXKgBFWWiAx' +
'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' +
'i9REL/tZXvZRnvZTPewmFLCZUMB2kov9JBeHiY52ES52kxxskgu5' +
'AU+TdE7JuvxxPrZphR0TCrmNLBvUk3kCo9mHvWqZp0QZax1S3xNV' +
'zc5TsgKpls5TAqTu27cvXZtUiEbvLCXnGDVX0jxLNDcXmqOgdKsk' +
'C26u12GRn5ubeLWSsrKyWKSOGTPmvSL1g/HUontI38f4KUtV9mbV' +
'93RPDYFVC1JjYmLMTkxSohiYRDBrYGRw9AcEpgDMCBgisJNm6fxh' +
'kKpxHUJ1pFp3m+oHRiqoWLFiS5YsYXsCLFhTffIDJaPc7GbqHKe6' +
'2k51s59U0G5CQYfxBfNPLOAwxSnfFMd801xsU/1cgacp3vlTdPYp' +
'/nbphR3m+RSMKVZ46FdfdunShQVqx67dtYPVinlKZsO/Hx6pFlFV' +
'+3JJ3PQkRGoeYotj6HxJC96n5mtTbsAt0llErcZAtBVBabO6evUq' +
'i9RRo0a9J6Tm+c2nuYRphfcszlFVXwIiD+cpmUVqmTJlIiMj2Rm/' +
'2pFqlm65OUhuqKoS8jV7T42Iztwvo9TMWmmhDFzgsmXLCKlFixZd' +
'tGgRXB17/uxUJdkizmXOq9+XqjH8q52q79tR1XJDjRVIVaGqeBMN' +
'ItVSNqmjimPoQqMWmWqxUYvyTgu1KZeM5nAs+r95EqO2YnD52rVr' +
'hFRvb+8hQ4ZwM361TPe1Gqkf8obTD8lTjbepqs/+tWKeUs2aNaEC' +
'mPVSR4wYMWzYMFqQkCORpVZXZYJQ8PuXkq9qKVJlV/TVePsqu1rg' +
'+6MqLYsUHh4eERFRpEgR8lLh45QpU+ArLFCRqpQneVU66us8KK38' +
'YJ2j+n+BqlYjVZaqIkxR+/fvX2iJtCCJdmYBClryHrTYElmNYyXm' +
'st5uHkabLRpNXrlyJS31gF4q3idOqyepIFWkqnaefvgFHP63MFVa' +
'Tymvwr+0CDP0iIYPHy57Xyo1Z9i/Vq1aAwYMoIl/Kndyya4kRvPJ' +
'ubno4hOpuBF8dsoEO1lCHPXAUAz2+tjuotmxIWxcnBlRsSQZGRnL' +
'jMqQtNxUmZmZK4zKNGqlpFWC1uSRViuIrmXixInQMEuXLo1ILVOm' +
'DHwMDQ0lIyN7hqv/DwjPZCWjTFOtyFNxRWnd/2YwWqZBS81JBUn7' +
'FbTPnMT9Dxh10FSHDh2ilQkPG3VE0lFJx0x1XNJJU52SdFrSGUln' +
'jTon6fz585QAXRR0SdJlU12RlCXpqqmuSbp+/fo1Rtf/d4J8GDly' +
'pI+PDyK1UKFCkIAOdl9JQ1Q1WBB9hU95HipouKQRRrGPmRtpFD2x' +
'Dhf5p6cG0KLEuI6iOFGcW4eK1sfg7t4lHMja/9jYWJq4Jc6R48w+' +
'Bc/R/pPZF7surP2XjcyoSEtHlM6wf//+UI5QoCpIhV4xWOBy5coF' +
'MTLISa/Xy37UmypQs6B2UUJdpeRUUlAJQcUVVMxURYsWpQSnItpU' +
'2Cr554XgcqD4ateujUiFRPny5eHa4fjsGXLXVez/hrhM1p5F1uVe' +
'IUa5+V+Qn4J8LZSPsmRroJaKVEhVbB6SLK3PGnNJlNlM8zEnnSBv' +
'Rl6SPI3yYORuodxyLfhRuDpcsA6tFmQRnLCXqTy1ycNU1p2wqzkV' +
'NKcC1srlPUv2R81ejqslgmyHKipDo/8HgW6cfg==');

etl_SetTransparentCol(clwhite);
etl_ClearLayer;
end;
procedure MainLoop();
begin
Page1();
Page2();
Page3();
Page4();
Page5();
Page6();
end;

begin
ClearDebug();
writeln('Welcome to bg5''s External Transparent Layer');
writeln('http://villavu.com/forum/showthread.php?t=106263');
SetUp();
MainLoop();
end.


rj

2013-10-13 13:02:37

Nice!

so it's like appa except we can draw on it?

bg5

2013-10-13 13:05:19

From: Officer Barbrady
Nice!

so it's like appa except we can draw on it?


No it's only for drawing on it.

Janilabo

2013-10-13 13:11:43

Interesting project, @bg5!
Happy to see you were ready to release it to public, so people can test it out and that way report if there's any bugs lurking around and/or even suggest some new features/improvements.

By the way mate: I am really glad to see, that you included tags for the commands (etl), because this way things are easy to locate via code hints, as they wont get mixed up with Simba commands. Clever!
Although, these days Simba has quite useful functionlist (thanks to @Dgby714 for hes hard work on it), that can be used to check which commands are internal, plugin or include commands - but of course, that doesn't make tags any less useful.

Nice release. :p Good work man!

Olly

2013-10-15 09:17:25

Impressive, will defo use in the future :D

bg5

2014-06-21 15:18:14

Ok, I've added today ETL include version for Lape. Enjoy :)

Foundry

2014-06-21 16:12:27

Does this work for OpenGL games?

bg5

2014-06-21 16:16:01

From: Foundry
Does this work for OpenGL games?


It works for anything, which is not in fullscreen mode.

Fox

2014-06-26 14:30:32

Wouldn't this have a tick delay?

bg5

2015-03-17 12:51:33

New version of ETL is out.

Features:

  • Include rewrited in Lape.
  • Fixed flickering in some functions. All functions are double-buffered now.
  • Added ETL_TDebugBox type, example:
  • Fixed some minor bugs.
  • Cleaned up the source, which was very messy
  • etl_DrawTPA, and etl_DrawATPA are moved from include to the plugin.
  • ETL_Start - one line initialisation
  • Changes caption when minimised

Janilabo

2015-03-17 13:38:42

From: bg5
New version of ETL is out.

Features:

  • Include rewrited in Lape.
  • Fixed flickering in some functions. All functions are double-buffered now.
  • Added ETL_TDebugBox type, example:
  • Fixed some minor bugs.
  • Cleaned up the source, which was very messy
  • etl_DrawTPA, and etl_DrawATPA are moved from include to the plugin.
  • Changes caption when minimised
Good job, bg!

Nice changes, especially that first one you listed - keep up the good work man. :p

BillSn0w

2015-03-19 20:02:27

This is pretty amazing…

I was wondering though: is there any way to set a line thickness? For boxes / rectangles i can always just make it fill and then clear the inside, but what about:
etl_LineTo(100,100,300,300,clYellow);

Makes a perfect single pixel line. Is there any way (outside of stacking multiple lines) to make the line thicker? Or maybe do a rectangle at an angle?

-Bill

BillSn0w

2015-03-19 20:45:29

This is pretty amazing…

I was wondering though: is there any way to set a line thickness? For boxes / rectangles i can always just make it fill and then clear the inside, but what about:
etl_LineTo(100,100,300,300,clYellow);

Makes a perfect single pixel line. Is there any way (outside of stacking multiple lines) to make the line thicker? Or maybe do a rectangle at an angle?

-Bill

EDIT:

Using the same test script I used for TmufasaLayer (modified for yours and compounded with extra colors):

program new;
{$include ETL_Lape.simba}
var
i, j, x, y: integer;
console : ETL_TDebugBox;
begin
Disguise('Scrap');
ETL_Start();
x := -1;
y := -1;
repeat
GetMousePos(i,j);
if not (i = x) or not (j = y) then
if (i >= 0) and (i < 820) and (j >= 0) and (j < 515) then
begin
etl_ClearLayer();
ETL_DrawBox(inttobox(i, j, 100 + i, 100 + j),clRed,false);
ETL_DrawBox(inttobox(i + 5, j + 5, 100 + i - 5, 100 + j - 5),clBlue,false);
ETL_DrawBox(inttobox(i + 10, j + 10, 100 + i - 10, 100 + j - 10),clGreen,false);
ETL_DrawBox(inttobox(i + 15, j + 15, 100 + i - 15, 100 + j - 15),clYellow,false);
ETL_DrawBox(inttobox(i + 20, j + 20, 100 + i - 20, 100 + j - 20),clBlack,false);
ETL_DrawBox(inttobox(i + 25, j + 25, 100 + i - 25, 100 + j - 25),clWhite,false);
x := i;
y := j;
end;
until (i > 1000);
end.

It runs MUCH faster… didn't even really notice a difference in speed adding the extra boxes. The only issue with the test is the flashyness you get moving the mouse around fast… Which could be solved by the line thickness option…

bg5

2015-04-02 06:51:09

@BillSn0w

Try this, should work faster:

program new;
{$include ETL_Lape.simba}
var
i, j, x, y,bmp: integer;
console : ETL_TDebugBox;
begin
Disguise('Scrap');
ETL_Start();

bmp := CreateBitmap(100,100);
FastReplaceColor(bmp,0,clred);
RectangleBitmap(bmp,inttobox(5, 5, 100- 5, 100 - 5),clBlue);
RectangleBitmap(bmp,inttobox(10, 10, 100 - 10, 100 - 10),clGreen);
RectangleBitmap(bmp,inttobox(15, 15, 100- 15, 100 - 15),clYellow);
RectangleBitmap(bmp,inttobox(20, 20, 100- 20, 100 - 20),clBlack);
RectangleBitmap(bmp,inttobox(25, 25, 100- 25, 100 - 25),clWhite);

x := -1;
y := -1;
repeat
GetMousePos(i,j);
if not (i = x) or not (j = y) then
if (i >= 0) and (i < 820) and (j >= 0) and (j < 515) then
begin
//etl_ClearLayer();
ETL_SetBmp(bmp,i,j);
x := i;
y := j;
end;
until (i > 1000);
end.

Generally when you are looking for high FPS it's better to throw all graphics at once.

Currently there is no option to make line thicker.

ogustuce

2019-03-15 21:19:25

really cool stuff. very versatile. rn im using it to draw paths for a lil project of mine.