-- parent script : parentScript-FireObj.lingo --*************************************************** -- Fire v 1.0 -- --Copyright © 2001 Brian Donovan --fire-related@monokromatik.com --All Rights Reserved. -- --*************************************************** -- .................................................................................................................................. -- pListFireData this list will hold all of the information -- necessary to draw the fire -- .................................................................................................................................. property pListFireData property pMovieProps on new (me) -- .................................................................................................................................. -- initialize pListFireData as an empty list -- .................................................................................................................................. pListFireData = [] intStageWidth = (the stage).rect.width intStageHeight = (the stage).rect.height rgbColorStage = (the stage).image.getPixel(0,0) me.pMovieProps = ["intStageWidth" : intStageWidth, "intStageHeight" : intStageHeight, "rgbColorStage" : rgbColorStage] me.pMovieProps["buffer"] = 5 -- pMovieProps["buffer"] : spacing around non-contact edges of stage me.pMovieProps["flameletsMultiple"] = 5 -- pMovieProps["buffer"] : spacing around non-contact edges of stage return me end -- =================================== -- Debugging Handlers -- =================================== on putInfo (me) put"-----------------------------------------" put "properties of this Fire object :" intNumProps = count(me) repeat with i = 1 to intNumProps propName = getPropAt(me, i) propValue = getaProp(me, propName) put " property '" & propName & "' : " & propValue end repeat put"-----------------------------------------" put end on putFlameInfo (me, intFlameIndex) put"-----------------------------------------" put "properties of Flame " & intFlameIndex & " : " refThisFlame = me.pListFireData[intFlameIndex] intNumElems = count(refThisFlame) repeat with i = 1 to intNumElems propName = getPropAt(refThisFlame, i) propValue = getaProp(refThisFlame, propName) put " property '" & propName & "' : " & propValue end repeat put"-----------------------------------------" put end on wipeStage (me) (the stage).bgColor = me.pMovieProps["rgbColorStage"] end -- =================================== -- Other Handlers -- =================================== --gFire.addFlame (1, 3, [120,0,0], [255,0,0], 12, 50, 65, 10, 10, 50) on addFlame (me, intDirection, intRegion, listFlameRGB, listFlameletRGB, intNumFlamelets, intAxialScaleFlame, intBaseScaleFlame, intAxialScaleFlamelets, intBaseScaleFlamelets, intVariance) intStageWidth = me.pMovieProps["intStageWidth"] intStageHeight = me.pMovieProps["intStageHeight"] listNewFlame = ["intDirection" : intDirection, "intRegion" : intRegion, "listFlameRGB" : listFlameRGB, "listFlameletRGB" : listFlameletRGB, "intNumFlamelets" : intNumFlamelets, "intAxialScaleFlame" : intAxialScaleFlame, "intBaseScaleFlame" : intBaseScaleFlame, "intAxialScaleFlamelets" : intAxialScaleFlamelets, "intBaseScaleFlamelets" : intBaseScaleFlamelets, "intVariance" : intVariance] listNewFlame["listFlameData"] = me.planFlame(intDirection, intRegion, intAxialScaleFlame, intBaseScaleFlame, intVariance) if (intNumFlamelets > 0) then -- .................................................................................................................................. -- Flamelets -- .................................................................................................................................. listNewFlame["listFlameletsData"] = me.planFlamelets(intRegion, intNumFlamelets, intAxialScaleFlamelets, intBaseScaleFlamelets, intVariance, listNewFlame["listFlameData"]) --me, intRegion, intAxialScaleFlamelets, intBaseScaleFlamelets, intVariance, listFlamePoints, intFlameletOrientation else -- .................................................................................................................................. -- NO Flamelets -- .................................................................................................................................. listNewFlame["listFlameletsData"] = [] end if me.pListFireData.append(listNewFlame) return true end on planFlame (me, intDirection, intRegion, intAxialScaleFlame, intBaseScaleFlame, intVariance) -- .................................................................................................................................. -- Select the coordinates for the flame -- .................................................................................................................................. intStageWidth = me.pMovieProps["intStageWidth"] intStageHeight = me.pMovieProps["intStageHeight"] if ((intRegion = 1) or (intRegion = 3)) then -- .................................................................................................................................. -- flames pointing from the top down OR bottom up -- .................................................................................................................................. -- Below : width of the Flame ... If Variance = 0, then the Flame's width will be exactly to scale. -- If Variance is greater than zero, then it will be weightedly random -- Below : length of the Flame ... If Variance = 0, then the Flame's length will be exactly to scale. if (intVariance > 0) then intBaseWidth = integer((intBaseScaleFlame/100.0)*(((100- intVariance)/100.0)*intStageWidth + random(integer((intVariance/100.0)*intStageWidth)))) intLength = integer((intAxialScaleFlame/100.0)*(((100- intVariance)/100.0)*intStageHeight + random( integer( (intVariance/100.0)*intStageHeight) ) + 1 )) else intBaseWidth = integer((intBaseScaleFlame/100.0)*intStageWidth) intLength = integer((intAxialScaleFlame/100.0)*intStageHeight) end if -- .................................................................................................................................. -- Below : choose the X value of the origin point - try first -- to select it randomly, but set it to the lower bound if 25 -- random tries don't give us an acceptable value. -- .................................................................................................................................. intOrigin = 0 intHalfBaseWidth = integer(intBaseWidth/2.0) repeat with i = 1 to 25 intOrigin = random(intStageWidth) if ((intOrigin > intHalfBaseWidth) and (intOrigin < (intStageWidth - intHalfBaseWidth))) then exit repeat else if (i = 25) then intOrigin = intHalfBaseWidth end if end repeat intBaseY = -1 if (intRegion = 1) then intBaseY = 0 else intBaseY = intStageHeight end if -- .................................................................................................................................. -- flames pointing from the top down -- .................................................................................................................................. listPointOrigin = [intOrigin, intBaseY] -- .................................................................................................................................. -- Now, we have to choose the basepoints coords for this flame -- .................................................................................................................................. -- Below : choose the X value for base1 and base 2 intBase1X = intOrigin - intHalfBaseWidth intBase2X = intOrigin + intHalfBaseWidth -- Below : make lists of coords for base1 and base 2 of this flame listBase1 = [intBase1X, intBaseY] listBase2 = [intBase2X, intBaseY] -- .................................................................................................................................. -- Now, we have to choose the terminus coords for this flame -- .................................................................................................................................. -- Below, set intTerminusX to -1 until we set it to something legit intTerminusX = -1 intToRandom = intOrigin - intBase1X - me.pMovieProps["buffer"] if (intToRandom <= 0) then intToRandom = 1 end if if (intDirection = 1) then -- intDirection = 1 means that the triangle points backward to base1. -- If there is no variance (intVariance = 0), set the terminus X halfway -- between the origin and the base to which it points if (intVariance = 0) then intTerminusX = intOrigin - integer((intOrigin - intBase1X)/2.0) else intTerminusX = intOrigin - random(intToRandom) end if else if (intDirection = 2) then -- intDirection = 2 means that the triangle points forward to base1. if (intVariance = 0) then intTerminusX = intOrigin + integer((intOrigin - intBase1X)/2.0) else intTerminusX = intOrigin + random(intToRandom) end if end if if (intTerminusX <= intBase1X) then intTerminusX = intBase1X + 1 else if (intTerminusX >= intBase2X) then intTerminusX = intBase2X - 1 end if if (intRegion = 1) then listTerminus = [intTerminusX, intLength] else if (intRegion = 3) then listTerminus = [intTerminusX, (me.pMovieProps["intStageHeight"] - intLength)] end if listFlamePoints = ["origin" : listPointOrigin, "base1" : listBase1, "base2" : listBase2, "terminus" : listTerminus] else if ((intRegion = 2) or (intRegion = 4)) then -- .................................................................................................................................. -- flames pointing from the right to left OR left to right -- .................................................................................................................................. -- Below : width of the Flame ... If Variance = 0, then the Flame's width will be exactly to scale. -- If Variance is greater than zero, then it will be weightedly random intScaledBaseWidth = integer((intAxialScaleFlame/100.0)*intStageHeight) if (intVariance > 0) then intBaseWidth = integer( ((100- intVariance)/100.0)*intScaledBaseWidth + random(integer((intVariance/100.0)*intScaledBaseWidth))) intLength = integer((intAxialScaleFlame/100.0)*(((100- intVariance)/100.0)*intStageWidth + random(integer((intVariance/100.0)*intStageWidth)))) else intBaseWidth = integer((intBaseScaleFlame/100.0)*intStageHeight) intLength = integer((intAxialScaleFlame/100.0)*intStageWidth) end if -- .................................................................................................................................. -- Below : choose the X value of the origin point - try first -- to select it randomly, but set it to the lower bound if 25 -- random tries don't give us an acceptable value. -- .................................................................................................................................. intOrigin = 0 intHalfBaseWidth = integer(intBaseWidth/2.0) repeat with i = 1 to 25 intOrigin = random(intStageHeight) if ((intOrigin > intHalfBaseWidth) and (intOrigin < (intStageHeight - intHalfBaseWidth))) then exit repeat else if (i = 25) then intOrigin = intHalfBaseWidth end if end repeat intBaseX = -1 if (intRegion = 4) then intBaseX = 0 else intBaseX = intStageWidth end if -- .................................................................................................................................. -- flames pointing from the top down -- .................................................................................................................................. listPointOrigin = [intBaseX, intOrigin] -- .................................................................................................................................. -- Now, we have to choose the basepoints coords for this flame -- .................................................................................................................................. -- Below : choose the X value for base1 and base 2 intBase1Y = intOrigin - intHalfBaseWidth intBase2Y = intOrigin + intHalfBaseWidth -- Below : make lists of coords for base1 and base 2 of this flame listBase1 = [intBaseX, intBase1Y] listBase2 = [intBaseX, intBase2Y] -- .................................................................................................................................. -- Now, we have to choose the terminus coords for this flame -- .................................................................................................................................. -- Below, set intTerminusX to -1 until we set it to something legit intTerminusY = -1 intToRandom = intOrigin - intBase1Y - me.pMovieProps["buffer"] if (intToRandom <= 0) then intToRandom = 1 end if if (intDirection = 1) then -- intDirection = 1 means that the triangle points backward to base1. -- If there is no variance (intVariance = 0), set the terminus X halfway -- between the origin and the base to which it points if (intVariance = 0) then intTerminusY = intOrigin - integer((intOrigin - intBase1Y)/2.0) else intTerminusY = intOrigin - random(intToRandom) --intTerminusY = intOrigin - random(intToRandom) + me.pMovieProps["buffer"] end if else if (intDirection = 2) then -- intDirection = 2 means that the triangle points forward to base1. if (intVariance = 0) then intTerminusY = intOrigin + integer((intOrigin - intBase1Y)/2.0) else --intTerminusY = intOrigin + random(intToRandom) - me.pMovieProps["buffer"] intTerminusY = intOrigin + random(intToRandom) - me.pMovieProps["buffer"] end if end if if (intTerminusY <= intBase1Y) then intTerminusY = intBase1Y + 1 else if (intTerminusY >= intBase2Y) then intTerminusY = intBase2Y - 1 end if if (intRegion = 2) then listTerminus = [me.pMovieProps["intStageWidth"] - intLength, intTerminusY] else if (intRegion = 4) then listTerminus = [intLength, intTerminusY] end if listFlamePoints = ["origin" : listPointOrigin, "base1" : listBase1, "base2" : listBase2, "terminus" : listTerminus] else -- .................................................................................................................................. -- they supplied a bad region number -- .................................................................................................................................. put "Error 1 : bad 'intRegion' supplied : " & intRegion return false end if return listFlamePoints end on smallestBiggestXY (me, listBase1, listBase2, listTerminus) listXvals = [listBase1[1], listBase2[1], listTerminus[1]] listYvals = [listBase1[2], listBase2[2], listTerminus[2]] listXvals.sort() listYvals.sort() listSmallestXY = [listXvals[1], listYvals[1]] listBiggestXY = [listXvals[3], listYvals[3]] listSmallestBiggestXY = [listSmallestXY, listBiggestXY] return listSmallestBiggestXY end on planOneFlamelet (me, intRegion, intAxialScaleFlamelets, intBaseScaleFlamelets, intVariance, listFlamePoints, intFlameletOrientation, floatSlope, intLineEqConst) --put intRegion, intAxialScaleFlamelets, intBaseScaleFlamelets, intVariance, listFlamePoints, intFlameletOrientation, floatSlope, intLineEqConst -- .................................................................................................................................. -- create the list to hold the info that we'll be returning for this flamelet -- .................................................................................................................................. listOneFlameletInfo = [] -->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- intRegion: 1 OR 3 -->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if ((intRegion = 1) or (intRegion = 3)) then -- .................................................................................................................................. -- Get the height of the parent flame (value the same no matter intRegion -- .................................................................................................................................. intFlameHeight = abs(listFlamePoints["terminus"][2] - listFlamePoints["base2"][2]) -- .................................................................................................................................. -- get the base length for the flamelet, constant across both sides -- .................................................................................................................................. intFlameletLength = integer((intAxialScaleFlamelets/100.0)*intFlameHeight) -- .................................................................................................................................. -- Get the base width for the - varies from side to side of the flame, but is constant unless intVariance > 0 -- .................................................................................................................................. if (intFlameletOrientation = 1) then intFlameletBaseWidth = integer((intBaseScaleFlamelets/100.0)*(listFlamePoints["terminus"][1] - listFlamePoints["base1"][1])) else if (intFlameletOrientation = 2) then intFlameletBaseWidth = integer((intBaseScaleFlamelets/100.0)*(listFlamePoints["base2"][1] - listFlamePoints["terminus"][1])) end if if (intFlameletBaseWidth <= 0) then intFlameletBaseWidth = me.pMovieProps["buffer"] end if -- .................................................................................................................................. -- Adjust intFlameletBaseWidth and intFlameletLength if variance > 0 -- .................................................................................................................................. if (intVariance > 0) then intFlameletBaseWidth = integer(((100 - intVariance)/100.0)*intFlameletBaseWidth + random(integer((intVariance/100.0)*intFlameletBaseWidth))) intFlameletLength = integer(((100 - intVariance)/100.0)*intFlameletLength + random(integer((intVariance/100.0)*intFlameletLength))) end if -- .................................................................................................................................. -- First, calculate the x values for the basepoints and terminus, branching on iFO -- .................................................................................................................................. if (intFlameletOrientation = 1) then intRandomize = listFlamePoints["terminus"][1] - listFlamePoints["base1"][1] - intFlameletBaseWidth if (intRandomize > 0) then intBase1X = listFlamePoints["base1"][1] + random(intRandomize) else intBase1X = listFlamePoints["base1"][1] + me.pMovieProps["buffer"] end if intBase2X = intBase1X + intFlameletBaseWidth if (intBase1X >= listFlamePoints["terminus"][1]) then intBase1X = listFlamePoints["terminus"][1] - (2*me.pMovieProps["buffer"]) end if if (intBase2X >= listFlamePoints["terminus"][1]) then intBase2X = listFlamePoints["terminus"][1] - me.pMovieProps["buffer"] end if intBase1Y = integer((floatSlope*intBase1X) + intLineEqConst) intBase2Y = integer((floatSlope*intBase2X) + intLineEqConst) intTerminusX = intBase1X - intFlameletLength else if (intFlameletOrientation = 2) then intRandomize = listFlamePoints["base2"][1] - listFlamePoints["terminus"][1] - intFlameletBaseWidth if (intRandomize > 0) then intBase1X = listFlamePoints["base2"][1] - random(intRandomize) else intBase1X = listFlamePoints["base2"][1] - me.pMovieProps["buffer"] end if intBase2X = intBase1X - intFlameletBaseWidth if (intBase1X <= listFlamePoints["terminus"][1]) then intBase1X = listFlamePoints["terminus"][1] + (2*me.pMovieProps["buffer"]) end if if (intBase2X <= listFlamePoints["terminus"][1]) then intBase2X = listFlamePoints["terminus"][1] + me.pMovieProps["buffer"] end if intBase1Y = integer((floatSlope*intBase1X) + intLineEqConst) intBase2Y = integer((floatSlope*intBase2X) + intLineEqConst) intTerminusX = intBase1X + intFlameletLength end if if (intVariance > 0) then intDeltaXtoShiftByPreAbs = listFlamePoints["terminus"][1] - intBase1X if (intDeltaXtoShiftByPreAbs <= 0) then intDeltaXtoShiftByPreAbs = me.pMovieProps["buffer"] end if intDeltaXtoShiftBy = random(integer((intVariance/100.0)*abs(intDeltaXtoShiftByPreAbs))) intShiftDirection = random(2) if (intShiftDirection = 2) then -- .................................................................................................................................. -- shift this flamelet inside of the flame -- .................................................................................................................................. intBase1X = intBase1X + intDeltaXtoShiftBy intBase2X = intBase2X + intDeltaXtoShiftBy else -- .................................................................................................................................. -- shift this flamelet outside of the flame -- .................................................................................................................................. intBase1X = intBase1X - intDeltaXtoShiftBy intBase2X = intBase2X - intDeltaXtoShiftBy end if end if if (intBase1X > me.pMovieProps["intStageWidth"]) then intBase1X = me.pMovieProps["intStageWidth"] - me.pMovieProps["buffer"] end if if (intBase1X < 0) then intBase1X = me.pMovieProps["buffer"] end if if (intBase2X > me.pMovieProps["intStageWidth"]) then intBase2X = me.pMovieProps["intStageWidth"] - me.pMovieProps["buffer"] end if if (intBase2X < 0) then intBase2X = me.pMovieProps["buffer"] end if if (intTerminusX > me.pMovieProps["intStageWidth"]) then intTerminusX = me.pMovieProps["intStageWidth"] - me.pMovieProps["buffer"] end if if (intTerminusX < 0) then intTerminusX = me.pMovieProps["buffer"] end if -->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- intRegion: 1 -->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if (intRegion = 1) then if (intBase1Y <= 0) then intBase1Y = me.pMovieProps["buffer"] end if if (intBase2Y <= 0) then intBase2Y = 2*me.pMovieProps["buffer"] end if intTerminusYadd = me.pMovieProps["flameletsMultiple"]*intFlameletLength if (intVariance > 0) then intTerminusYadd = integer(((100- intVariance)/100.0)*intTerminusYadd + random(integer((intVariance/100.0)*intTerminusYadd))) end if intTerminusY = intBase2Y + intTerminusYadd if (intTerminusY > me.pMovieProps["intStageHeight"]) then intTerminusY = me.pMovieProps["intStageHeight"] - me.pMovieProps["buffer"] end if if (intFlameletOrientation = 1) then else if (intFlameletOrientation = 2) then end if listBase1 = [intBase1X, intBase1Y] listBase2 = [intBase2X, intBase2Y] listTerminus = [intTerminusX, intTerminusY] listSmallestBiggestXY = me.smallestBiggestXY (listBase1, listBase2, listTerminus) intSmallestX = listSmallestBiggestXY[1][1] intSmallestY = listSmallestBiggestXY[1][2] intBiggestX = listSmallestBiggestXY[2][1] intBiggestY = listSmallestBiggestXY[2][2] listOneFlameletRect = [intSmallestX, intSmallestY, intBiggestX, intBiggestY] listBase1 = [(intBase1X - intSmallestX), (intBase1Y - intSmallestY)] listBase2 = [(intBase2X - intSmallestX), (intBase2Y - intSmallestY)] listTerminus = [(intTerminusX - intSmallestX), (intTerminusY - intSmallestY)] -- .................................................................................................................................. -- Above : end of intRegion = 1 condition -- Below : beginning of intRegion = 3 condition -- .................................................................................................................................. -->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- intRegion: 3 -->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> else if (intRegion = 3) then if (intBase1Y >= me.pMovieProps["intStageHeight"]) then intBase1Y = me.pMovieProps["intStageHeight"] - me.pMovieProps["buffer"] end if if (intBase2Y >= me.pMovieProps["intStageHeight"]) then intBase2Y = me.pMovieProps["intStageHeight"] - (2*me.pMovieProps["buffer"]) end if intTerminusYadd = me.pMovieProps["flameletsMultiple"]*intFlameletLength if (intVariance > 0) then intTerminusYadd = integer(((100- intVariance)/100.0)*intTerminusYadd + random(integer((intVariance/100.0)*intTerminusYadd))) end if intTerminusY = intBase2Y - intTerminusYadd if (intTerminusY < 0) then intTerminusY = me.pMovieProps["buffer"] end if if (intFlameletOrientation = 1) then else if (intFlameletOrientation = 2) then end if listBase1 = [intBase1X, intBase1Y] listBase2 = [intBase2X, intBase2Y] listTerminus = [intTerminusX, intTerminusY] listSmallestBiggestXY = me.smallestBiggestXY (listBase1, listBase2, listTerminus) intSmallestX = listSmallestBiggestXY[1][1] intSmallestY = listSmallestBiggestXY[1][2] intBiggestX = listSmallestBiggestXY[2][1] intBiggestY = listSmallestBiggestXY[2][2] listOneFlameletRect = [intSmallestX, intSmallestY, intBiggestX, intBiggestY] listBase1 = [(intBase1X - intSmallestX), (intBase1Y - intSmallestY)] listBase2 = [(intBase2X - intSmallestX), (intBase2Y - intSmallestY)] listTerminus = [(intTerminusX - intSmallestX), (intTerminusY - intSmallestY)] end if else if ((intRegion = 2) or (intRegion = 4)) then -- .................................................................................................................................. -- Get the height of the parent flame (value the same no matter intRegion -- .................................................................................................................................. intFlameLength = abs(listFlamePoints["terminus"][1] - listFlamePoints["base2"][1]) -- .................................................................................................................................. -- get the base length for the flamelet, constant across both sides -- .................................................................................................................................. intFlameletLength = integer((intAxialScaleFlamelets/100.0)*intFlameLength) -- .................................................................................................................................. -- Get the base width for the - varies from side to side of the flame, but is constant unless intVariance > 0 -- .................................................................................................................................. if (intFlameletOrientation = 1) then intFlameletBaseWidth = integer((intBaseScaleFlamelets/100.0)*(listFlamePoints["terminus"][2] - listFlamePoints["base1"][2])) else if (intFlameletOrientation = 2) then intFlameletBaseWidth = integer((intBaseScaleFlamelets/100.0)*(listFlamePoints["base2"][2] - listFlamePoints["terminus"][2])) end if if (intFlameletBaseWidth <= 0) then intFlameletBaseWidth = me.pMovieProps["buffer"] end if -- .................................................................................................................................. -- Adjust intFlameletBaseWidth and intFlameletLength if variance > 0 -- .................................................................................................................................. if (intVariance > 0) then intFlameletBaseWidth = integer(((100 - intVariance)/100.0)*intFlameletBaseWidth + random(integer((intVariance/100.0)*intFlameletBaseWidth))) intFlameletLength = integer(((100 - intVariance)/100.0)*intFlameletLength + random(integer((intVariance/100.0)*intFlameletLength))) end if -- .................................................................................................................................. -- First, calculate the x values for the basepoints and terminus, branching on iFO -- .................................................................................................................................. if (intFlameletOrientation = 1) then intRandomize = listFlamePoints["terminus"][2] - listFlamePoints["base1"][2] - intFlameletBaseWidth if (intRandomize > 0) then intBase1Y = listFlamePoints["base1"][2] + random(intRandomize) else intBase1Y = listFlamePoints["base1"][2] + me.pMovieProps["buffer"] end if intBase2Y = intBase1Y + intFlameletBaseWidth if (intBase1Y > listFlamePoints["terminus"][2]) then intBase1Y = listFlamePoints["terminus"][2] - (2*me.pMovieProps["buffer"]) end if if (intBase2Y > listFlamePoints["terminus"][2]) then intBase2Y = listFlamePoints["terminus"][2] - me.pMovieProps["buffer"] end if intBase1X = integer((intBase1Y - intLineEqConst)/floatSlope) intBase2X = integer((intBase2Y - intLineEqConst)/floatSlope) intTerminusY = intBase1Y - intFlameletLength else if (intFlameletOrientation = 2) then intRandomize = listFlamePoints["base2"][2] - listFlamePoints["terminus"][2] - intFlameletBaseWidth if (intRandomize > 0) then intBase1Y = listFlamePoints["base2"][2] - random(intRandomize) else intBase1Y = listFlamePoints["base2"][2] - me.pMovieProps["buffer"] end if intBase2Y = intBase1Y - intFlameletBaseWidth if (intBase1Y < listFlamePoints["terminus"][2]) then intBase1Y = listFlamePoints["terminus"][2] + (2*me.pMovieProps["buffer"]) end if if (intBase2Y < listFlamePoints["terminus"][2]) then intBase2Y = listFlamePoints["terminus"][2] + me.pMovieProps["buffer"] end if intBase1X = integer((intBase1Y - intLineEqConst)/floatSlope) intBase2X = integer((intBase2Y - intLineEqConst)/floatSlope) intTerminusY = intBase1Y + intFlameletLength end if if (intVariance > 0) then intDeltaYtoShiftByPreAbs = listFlamePoints["terminus"][2] - intBase1Y if (intDeltaYtoShiftByPreAbs <= 0) then intDeltaYtoShiftByPreAbs = me.pMovieProps["buffer"] end if intDeltaYtoShiftBy = random(integer((intVariance/100.0)*abs(intDeltaYtoShiftByPreAbs))) intShiftDirection = random(2) if (intShiftDirection = 2) then -- .................................................................................................................................. -- shift this flamelet inside of the flame -- .................................................................................................................................. intBase1Y = intBase1Y + intDeltaYtoShiftBy intBase2Y = intBase2Y + intDeltaYtoShiftBy else -- .................................................................................................................................. -- shift this flamelet outside of the flame -- .................................................................................................................................. intBase1Y = intBase1Y - intDeltaYtoShiftBy intBase2Y = intBase2Y - intDeltaYtoShiftBy end if end if if (intBase1Y > me.pMovieProps["intStageHeight"]) then intBase1Y = me.pMovieProps["intStageHeight"] - me.pMovieProps["buffer"] end if if (intBase1Y < 0) then intBase1Y = me.pMovieProps["buffer"] end if if (intBase2Y > me.pMovieProps["intStageHeight"]) then intBase2Y = me.pMovieProps["intStageHeight"] - me.pMovieProps["buffer"] end if if (intBase2Y < 0) then intBase2Y = me.pMovieProps["buffer"] end if if (intTerminusY > me.pMovieProps["intStageHeight"]) then intTerminusY = me.pMovieProps["intStageHeight"] - me.pMovieProps["buffer"] end if if (intTerminusY < 0) then intTerminusY = me.pMovieProps["buffer"] end if -->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- intRegion: 2 -->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> if (intRegion = 2) then if (intBase1X > me.pMovieProps["intStageWidth"]) then intBase1X = me.pMovieProps["intStageWidth"] - me.pMovieProps["buffer"] end if if (intBase2X > me.pMovieProps["intStageWidth"]) then intBase2X = me.pMovieProps["intStageWidth"] - (2*me.pMovieProps["buffer"]) end if intTerminusXadd = me.pMovieProps["flameletsMultiple"]*intFlameletLength if (intVariance > 0) then intTerminusXadd = integer(((100- intVariance)/100.0)*intTerminusXadd + random(integer((intVariance/100.0)*intTerminusXadd))) end if --put "intBase1 : (" && intBase1X && ", " && intBase1Y && ")" --put "intBase2 : (" && intBase2X && ", " && intBase2Y && ")" --put "intTerminusX : " && intTerminusX intTerminusX = intBase2X - intTerminusXadd --put "intTerminusXadd : " && intTerminusXadd --put "intTerminusX : " && intTerminusX if (intTerminusX < 0) then intTerminusX = me.pMovieProps["buffer"] end if if (intFlameletOrientation = 1) then else if (intFlameletOrientation = 2) then end if listBase1 = [intBase1X, intBase1Y] listBase2 = [intBase2X, intBase2Y] listTerminus = [intTerminusX, intTerminusY] listSmallestBiggestXY = me.smallestBiggestXY (listBase1, listBase2, listTerminus) intSmallestX = listSmallestBiggestXY[1][1] intSmallestY = listSmallestBiggestXY[1][2] intBiggestX = listSmallestBiggestXY[2][1] intBiggestY = listSmallestBiggestXY[2][2] listOneFlameletRect = [intSmallestX, intSmallestY, intBiggestX, intBiggestY] listBase1 = [(intBase1X - intSmallestX), (intBase1Y - intSmallestY)] listBase2 = [(intBase2X - intSmallestX), (intBase2Y - intSmallestY)] listTerminus = [(intTerminusX - intSmallestX), (intTerminusY - intSmallestY)] -- .................................................................................................................................. -- Above : end of intRegion = 2 condition -- Below : beginning of intRegion = 4 condition -- .................................................................................................................................. -->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> -- intRegion: 4 -->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> else if (intRegion = 4) then if (intBase1X < 0) then intBase1X = me.pMovieProps["buffer"] end if if (intBase2X < 0) then intBase2X = 2*me.pMovieProps["buffer"] end if intTerminusXadd = me.pMovieProps["flameletsMultiple"]*intFlameletLength if (intVariance > 0) then intTerminusXadd = integer(((100- intVariance)/100.0)*intTerminusXadd + random(integer((intVariance/100.0)*intTerminusXadd))) end if intTerminusX = intBase2X + intTerminusXadd if (intTerminusX > me.pMovieProps["intStageWidth"]) then intTerminusX = me.pMovieProps["intStageWidth"] - me.pMovieProps["buffer"] end if if (intFlameletOrientation = 1) then else if (intFlameletOrientation = 2) then end if listBase1 = [intBase1X, intBase1Y] listBase2 = [intBase2X, intBase2Y] listTerminus = [intTerminusX, intTerminusY] listSmallestBiggestXY = me.smallestBiggestXY (listBase1, listBase2, listTerminus) intSmallestX = listSmallestBiggestXY[1][1] intSmallestY = listSmallestBiggestXY[1][2] intBiggestX = listSmallestBiggestXY[2][1] intBiggestY = listSmallestBiggestXY[2][2] listOneFlameletRect = [intSmallestX, intSmallestY, intBiggestX, intBiggestY] listBase1 = [(intBase1X - intSmallestX), (intBase1Y - intSmallestY)] listBase2 = [(intBase2X - intSmallestX), (intBase2Y - intSmallestY)] listTerminus = [(intTerminusX - intSmallestX), (intTerminusY - intSmallestY)] end if end if listOneFlameletPoints = ["base1" : listBase1, "base2" : listBase2, "terminus" : listTerminus] listOneFlameletInfo = ["points" : listOneFlameletPoints, "rect" : listOneFlameletRect] --put listOneFlameletInfo put return listOneFlameletInfo end on planFlamelets (me, intRegion, intNumFlamelets, intAxialScaleFlamelets, intBaseScaleFlamelets, intVariance, listFlamePoints) listFlameletsInfo = [] -- .................................................................................................................................. -- Decides how many flamelets to put onto one side or another and then calls planOneFlamelet -- .................................................................................................................................. intNumFlameletsSide1 = -1 intNumFlameletsSide2 = -1 intNumFlameletsForRandomAlloc = 0 if (intVariance > 0) then -- .................................................................................................................................. -- intVariance% of intNumFlamelets will be apportioned randomly on either side of the Flame, and the rest roughly 50/50 -- .................................................................................................................................. intNumFlameletsForRandomAlloc = integer((intVariance/100.0)*intNumFlamelets) intRemFlamelets = intNumFlamelets - intNumFlameletsForRandomAlloc intRandomFlamelets = random(intNumFlameletsForRandomAlloc) intNumFlameletsSide1 = integer(intRemFlamelets/2.0) + intRandomFlamelets intNumFlameletsSide2 = intNumFlamelets - intNumFlameletsSide1 else -- .................................................................................................................................. -- If intVariance = 0, place flamelets nearly equally on either side -- .................................................................................................................................. intNumFlameletsSide1 = integer(intNumFlamelets/2.0) intNumFlameletsSide2 = intNumFlamelets - intNumFlameletsSide1 end if -- .................................................................................................................................. -- Calculate the the X values for both basepoints and then adjust them depending on the value of intVariance. -- The line from basepoint1 to basepoint2 will run parallel to the line from the relevant parent Flame's basepoint, -- either bp1 or 2 depending on the value of intFlameletOrientation to the Flame terminus. -- -- line eqn for side of parent flame (terminusY - bpY) = m*(terminusX - bpX) -- substitute generic y2 & x2 for terminus values and rearrange to y2 = mx2 + [bpY - (m*bpX)] , where the expr in [] is a constant -- .................................................................................................................................. floatFlameSideLineEqnSlopeFO1 = float(listFlamePoints["terminus"][2] - listFlamePoints["base1"][2])/float(listFlamePoints["terminus"][1] - listFlamePoints["base1"][1]) intRightSideConstFO1= listFlamePoints["base1"][2] - integer(floatFlameSideLineEqnSlopeFO1 * listFlamePoints["base1"][1]) floatFlameSideLineEqnSlopeFO2 = float(listFlamePoints["terminus"][2] - listFlamePoints["base2"][2])/float(listFlamePoints["terminus"][1] - listFlamePoints["base2"][1]) intRightSideConstFO2 = listFlamePoints["base2"][2] - integer(floatFlameSideLineEqnSlopeFO2 * listFlamePoints["base2"][1]) repeat with i = 1 to intNumFlameletsSide1 intFlameletOrientation = 1 listOneFlameletInfo = me.planOneFlamelet(intRegion, intAxialScaleFlamelets, intBaseScaleFlamelets, intVariance, listFlamePoints, intFlameletOrientation, floatFlameSideLineEqnSlopeFO1, intRightSideConstFO1) listFlameletsInfo.append(listOneFlameletInfo) end repeat repeat with i = 1 to intNumFlameletsSide2 intFlameletOrientation = 2 listOneFlameletInfo = me.planOneFlamelet(intRegion, intAxialScaleFlamelets, intBaseScaleFlamelets, intVariance, listFlamePoints, intFlameletOrientation, floatFlameSideLineEqnSlopeFO2, intRightSideConstFO2) listFlameletsInfo.append(listOneFlameletInfo) end repeat return listFlameletsInfo end on clearMember (me, theMemberName) theMemberNum = member(theMemberName).number if theMemberNum > 0 then member(theMemberName).erase() return 1 else return 0 end if end on wipeStageDeprec (me, intUpdateStageYesNo) square = rect(0, 0, me.pMovieProps["intStageWidth"], me.pMovieProps["intStageHeight"]) white = rgb(255, 255, 255) options = [#color: white, #shapeType: #rect] (the stage).image.fill(square, options) if (intUpdateStageYesNo = 1) then updateStage end if end on drawToStage (me, listRGB, listVertices, listRect) stringThisMemberName = "drawingNow" rectThisMember = rect(listRect[1], listRect[2], listRect[3], listRect[4]) thisVectorShape = new(#vectorShape) clearTheWay = me.clearMember(stringThisMemberName) member(thisVectorShape).name = stringThisMemberName member(stringThisMemberName).closed = 1 member(stringThisMemberName).fillMode = #solid member(stringThisMemberName).strokeWidth = 0 member(stringThisMemberName).fillColor = rgb(listRGB[1], listRGB[2], listRGB[3]) member(stringThisMemberName).addVertex(1, point(listVertices["base1"][1], listVertices["base1"][2])) member(stringThisMemberName).addVertex(2, point(listVertices["base2"][1], listVertices["base2"][2])) member(stringThisMemberName).addVertex(3, point(listVertices["terminus"][1], listVertices["terminus"][2])) (the stage).image.copyPixels(member(stringThisMemberName).image, rectThisMember , member(stringThisMemberName).rect, [#ink:36]) end on drawFlame (me, intFlameIndex) listVertices = me.pListFireData[intFlameIndex]["listFlameData"] -- .................................................................................................................................. -- construct the rect for the part of the stage where i'm putting the image of the vector shape -- .................................................................................................................................. intBiggestX = 0 if (listVertices["terminus"][1] > listVertices["base2"][1]) then intBiggestX = listVertices["terminus"][1] else intBiggestX = listVertices["base2"][1] end if intBiggestY = 0 if (listVertices["terminus"][2] > listVertices["base2"][2]) then intBiggestY = listVertices["terminus"][2] else intBiggestY = listVertices["base2"][2] end if rectThisMember = rect(0,0, intBiggestX, intBiggestY) me.drawToStage(me.pListFireData[intFlameIndex]["listFlameRGB"], listVertices, rectThisMember) end on drawFlamelets (me, intFlameIndex) intNumFlamelets = count(me.pListFireData[intFlameIndex]["listFlameletsData"]) repeat with i = 1 to intNumFlamelets drawToStage (me, me.pListFireData[intFlameIndex]["listFlameletRGB"], me.pListFireData[intFlameIndex]["listFlameletsData"][i]["points"], me.pListFireData[intFlameIndex]["listFlameletsData"][i]["rect"]) end repeat end on drawFire (me) intNumFlames = count(me.pListFireData) repeat with i = 1 to intNumFlames me.drawFlame (i) end repeat repeat with i = 1 to intNumFlames me.drawFlamelets (i) end repeat end on drawFireConsecutive (me) intNumFlames = count(me.pListFireData) repeat with i = 1 to intNumFlames me.drawFlame (i) me.drawFlamelets (i) end repeat end