QB64 Phoenix Edition
Is there a faster way to do this glow circle effect? - Printable Version

+- QB64 Phoenix Edition (https://qb64phoenix.com/forum)
+-- Forum: QB64 Rising (https://qb64phoenix.com/forum/forumdisplay.php?fid=1)
+--- Forum: Code and Stuff (https://qb64phoenix.com/forum/forumdisplay.php?fid=3)
+---- Forum: Help Me! (https://qb64phoenix.com/forum/forumdisplay.php?fid=10)
+---- Thread: Is there a faster way to do this glow circle effect? (/showthread.php?tid=2805)

Pages: 1 2


RE: Is there a faster way to do this glow circle effect? - justsomeguy - 06-16-2024

I created this a while back for a project. It uses a look up table of distances to set the intensity of the pixel, giving it a soft edge. With very little modification to the color mixing, you can create different colors of spot lights.

Code: (Select All)
'#######################################################
'#                Spolight Demo                      #
'#######################################################
_TITLE "Spotlight Demo"
CONST spotLightSize = 128

DIM AS DOUBLE distLUT(spotLightSize * 2, spotLightSize * 2)
DIM AS LONG scr, img, colour, iter
DIM AS STRING fl
DIM AS DOUBLE xp, yp, xl, yl
DIM AS DOUBLE dist, percentage

'#######################################################
'#          Setup Screen and load Image                #
'#######################################################
' main draw screen
scr = _NEWIMAGE(1000, 600, 32)
' hidden reference image
backscr = _NEWIMAGE(1000, 600, 32)
' Change this to whatever image you want to open.
fl = "cactus.jpg"
img = _LOADIMAGE(fl, 32)
' Draw it to the hidden screen
_PUTIMAGE (100, 50)-(900, 550), img, backscr,
SCREEN scr
'#######################################################
'#          Lookup Table for distance                  #
'#######################################################
FOR yp = 0 TO spotLightSize * 2
FOR xp = 0 TO spotLightSize * 2
  distLUT(xp, yp) = SQR(((xp - spotLightSize) ^ 2) + ((yp - spotLightSize) ^ 2))
NEXT
NEXT
'#######################################################
'#                  Main Loop                          #
'#######################################################
xl = _WIDTH / 2: yl = _HEIGHT / 2
DO
CLS
' Scan over the area of the spotlight and lighten the pixel
FOR yp = yl - spotLightSize TO yl + spotLightSize
  FOR xp = xl - spotLightSize TO xl + spotLightSize
  dist = distLUT(xp - xl + spotLightSize, yp - yl + spotLightSize)
  IF dist < spotLightSize THEN
    percentage = clamp((dist / spotLightSize), 0, 1)
    _SOURCE backscr
    colour = colorMixer(POINT(xp, yp), 0, 1 - percentage)
    PSET (xp, yp), colour
  END IF
  NEXT
NEXT
' Mouse routine
DO WHILE _MOUSEINPUT
  xl = _MOUSEX: yl = _MOUSEY
LOOP
_DISPLAY
LOOP

'#######################################################
'#              Helper Functions                      #
'#######################################################
FUNCTION colorChannelMixer%% (colorChannelA AS _UNSIGNED _BYTE, colorChannelB AS _UNSIGNED _BYTE, amountToMix AS DOUBLE)
DIM AS DOUBLE channelA, channelB
channelA = colorChannelA * amountToMix
channelB = colorChannelB * (1 - amountToMix)
colorChannelMixer = INT(channelA + channelB)
END FUNCTION

FUNCTION colorMixer& (rgbA AS LONG, rgbB AS LONG, amountToMix AS DOUBLE)
DIM AS _UNSIGNED _BYTE r, g, b
r = colorChannelMixer(_RED(rgbA), _RED(rgbB), amountToMix)
g = colorChannelMixer(_GREEN(rgbA), _GREEN(rgbB), amountToMix)
b = colorChannelMixer(_BLUE(rgbA), _BLUE(rgbB), amountToMix)
colorMixer = _RGB(r, g, b)
END FUNCTION

FUNCTION clamp# (a AS DOUBLE, hi AS DOUBLE, low AS DOUBLE)
DIM AS DOUBLE NDa
NDa = a
IF hi < low THEN SWAP hi, low
IF NDa < low THEN NDa = low
IF NDa > hi THEN NDa = high
clamp# = NDa
END FUNCTION
[Image: cactus.jpg]


RE: Is there a faster way to do this glow circle effect? - Dav - 06-16-2024

Well that works very well also, @justsomeguy.  Good coding.  

This forum is great, so many quick replies with great code!

- Dav