{ This is my plasma code. Written here for windows 24bit mode. There's some comments in it. It had a problem. I tried to fix it. Couldn't. Deleted some POSITIVELY ABSOLUTELY ESSENTIAL bits of code, and the problem went away. Don't ask me, I just wrote it. You should be able to put it to palette based code pretty easy. It started out that way and then got converted to RGB. Probably all you'd need to do, is kill red and green, and just use blue as the palette entry. Your problem to make sure your palette has nice colours. It still tends to be a little ridgy on the primary axes. If anybody can get rid of that, that would be cool. Let me know. It's also a fractal terrain generator. Same alg. This is just 3 fractal terrain altitude maps overlaid in rgb. (Oh, yeah, it's not really windows code. All the real windows code should be separate from the useful code, just in case you don't do windows, don't be scared.) --8<-------------------------------------------------------- } program plasma; {integer version of cloud. Only works 24bit. Change resolution constants width, height if you need.} {Left button starts drawing. CTRL-ALT-DEL to stop. Or wait for it to finish, and right button} uses OWindows, ODialogs, WinTypes, WinProcs; const {integer version of old real constant. For calm versions, try FUZZ1/FUZZ2=0.3 For wild versions, try FUZZ1/FUZZ2=10} FUZZ1=1; FUZZ2=6; width= 800; height= 600; type TMyApp=object (TApplication) procedure InitMainWindow; virtual; end; PMyWindow=^TPlasmaWindow; TPlasmaWindow=object (TWindow) r,g,b:byte; w,h:integer; constructor init(AParent:PWindowsObject; ATitle:PChar); procedure SetUpWindow; virtual; procedure WMLButtonDown(var Msg:TMessage); virtual wm_First+wm_LButtonDown; procedure WMRButtonDown(var Msg:TMessage); virtual wm_First+wm_RButtonDown; function getclassname:pchar; virtual; procedure getwindowclass(var awndclass:twndclass); virtual; end; var maxx,maxy:integer; backg:TColorRef; i:integer; function clamp(x:integer):byte; begin { if x<0 then x:=0 else if x>255 then x:=255; clamp:=x;} case x of -32767..0 : clamp:=0; 0..255 : clamp:=x; 256..32767: clamp:=255; else {oops}; end; {case} end; function randomcolour:TColorRef; var r,g,b:byte; begin randomcolour:=rgb(random(256),random(256),random(256)); end; procedure TMyApp.InitMainWindow; begin MainWindow := New(PMyWindow, Init(NIL,'Plasma')); end; constructor TPlasmaWindow.init(AParent:PWindowsObject; ATitle:PChar); begin inherited init(AParent,ATitle); r:=0; g:=0; b:=0; w:=2;h:=2; attr.x:=0; attr.y:=0; attr.w:=width; attr.h:=height; attr.style:=ws_popup + ws_visible; end; procedure TPlasmaWindow.SetUpWindow; begin inherited setupwindow; end; procedure TPlasmaWindow.WMLButtonDown(var Msg:TMessage); var ADC:HDC; AP,TempP:HPen; AB,TempB:HBrush; function max(a,b:integer):integer; begin if a1) or (b-t>1) then begin variance:=width * FUZZ1 div fuzz2 ; vd2:=variance div 2; mx:=mid(l,r); my:=mid(t,b); m:=getpixel(adc,l,t); n:=getpixel(adc,l,b); o:=getpixel(adc,r,t); p:=getpixel(adc,r,b); mzr:=clamp((getrvalue(m) + getrvalue(n) + getrvalue(o) + getrvalue(p)) div 4 + random(variance)-vd2); mzg:=clamp((getgvalue(m) + getgvalue(n) + getgvalue(o) + getgvalue(p)) div 4 + random(variance)-vd2); mzb:=clamp((getbvalue(m) + getbvalue(n) + getbvalue(o) + getbvalue(p)) div 4 + random(variance)-vd2); setpixel(adc,mx,my,rgb(mzr,mzg,mzb)); setpixel(adc,(l),(my),ridge(l,t,l,b)); setpixel(adc,(r),(my),ridge(r,t,r,b)); setpixel(adc,(mx),(t),ridge(l,t,r,t)); setpixel(adc,(mx),(b),ridge(l,b,r,b)); quarter(l,t,mx,my); quarter(l,my,mx,b); quarter(mx,t,r,my); quarter(mx,my,r,b); end; end; begin ADC:=getdc(HWindow); randomize; maxx:=width-1; maxy:=height-1; backg:=getpixel(ADC,10,10); setpixel(adc,0,0,randomcolour); setpixel(adc,0,maxy,randomcolour); setpixel(adc,maxx,0,randomcolour); setpixel(adc,maxx,maxy,randomcolour); setpixel(adc,mid(0,maxx),0,randomcolour); setpixel(adc,mid(0,maxx),maxy,randomcolour); setpixel(adc,0,mid(0,maxy),randomcolour); setpixel(adc,maxx,mid(0,maxy),randomcolour); quarter(0,0,maxx,maxy); end; procedure TPlasmaWindow.WMRButtonDown(var Msg:TMessage); begin destroy; end; function TPlasmaWindow.getclassname:pchar; begin getclassname:='Cloud Window'; end; procedure TPlasmaWindow.getwindowclass(var awndclass:twndclass); begin inherited getwindowclass(awndclass); awndclass.hbrbackground:=getstockobject(white_brush); end; var DitherApp:TMyApp; begin DitherApp.init('Cloud'); DitherApp.run; DitherApp.done; end.