// ho_flameLib.h float isSameDir(vector v1,v2){ float same = 1; if(v1.v2 < 0){ same = 0; } return same; } point ho_setSpace(string space; float offsetX, offsetY, offsetZ, scaleAll, scaleX, scaleY, scaleZ){ point p = transform(space, P); float x = xcomp(p); float y = ycomp(p); float z = zcomp(p); setxcomp(p,x * scaleX * scaleAll + offsetX); setycomp(p,y * scaleY * scaleAll + offsetY); setzcomp(p,z * scaleZ * scaleAll + offsetZ); return p; } float solarize(float in){ float out = in; uniform float harfLevel = 0.5; if(out > harfLevel){ out = 1-out; } return out *= 2; } float ho_multiNoise(string space; float scales[4]; float offsets[3]; float frq,octave,solarize){ point p = ho_setSpace(space, offsets[0],offsets[1],offsets[2], scales[0],scales[1],scales[2],scales[3]); float out = 0.5; float doubleFrq = frq; float halfAmp = 1; float n = 0; for(n = 0 ; n < octave ; n += 1){ p = transform(space,p); out += (noise(p * doubleFrq) * halfAmp)-halfAmp/2; doubleFrq *= 2; halfAmp *= 0.5; } if(solarize){ out = solarize(out); } return out; } color ho_mix(color c1,c2; float colorBias,mixer){ float changedMixer = pow(mixer,colorBias); return mix(c1,c2,changedMixer); } float flameShape(string space,trimSide; float mixer,shapeSoftness,shapeNoiseSizeRatio,shapeOffsets[3],softEdge){ float shape = 1; point p = ho_setSpace(space, shapeOffsets[0],shapeOffsets[1],shapeOffsets[2], shapeNoiseSizeRatio,1,.8,1); p = transform(space,p); float softness = softEdge*noise(p); float flameHeight = 1-s; float sinShape = sin(t * PI)* flameHeight; sinShape += noise(p * shapeNoiseSizeRatio)/2; sinShape = pow(sinShape,2); float dark = smoothstep(sinShape-softness,sinShape+softness,mixer); return 1-dark; } float enableArea(string space; float enablePos[3]; float enableAreaRadius,enableAreaSoftnessRadius){ point currentP = transform(space,P); point enableCenter = transform(space,(0,0,0)); setxcomp(enableCenter,enablePos[0]); setycomp(enableCenter,enablePos[1]); setzcomp(enableCenter,enablePos[2]); float distanceFromCenter = distance(currentP, enableCenter); return 1-smoothstep(enableAreaRadius - enableAreaSoftnessRadius,enableAreaRadius,distanceFromCenter); } //ho_flame.sl #include "ho_flameLib.h"; surface ho_flame( string space = "world", trimSide = "t"; /* "s" , "t" , "" */ color red = color(1,0,0), yellow = color(1,1,0), oapcity = color(.8,.8,.8); float noiseTransperant = 0, softEdge = 0.1, colorBias = 1, /*opacityBias = 0.5,*/ globalScale = 1, xScale = 1, yScale = 1, zScale = 1, frq = 1, octave = 2, solarize = 1, /*1,0 if 1 do solarize filter like photoshop*/ offsetX = 0, offsetY = 0, offsetZ = 0, /*offset_s = 0, offset_t = 0,*/ shapeSoftness = 0.1, shapeNoiseSizeRatio = 0.5, shapeNoiseOffsetX = 0, shapeNoiseOffsetY = 0, shapeNoiseOffsetZ = 0, /*shapeNoiseOffset_s = 0, shapeNoiseOffset_t = 0,*/ enableAreaCenterX = 0, enableAreaCenterY = 0, enableAreaCenterZ = 0, enableAreaRadius = 10000, enableAreaSoftnessRadius = 1, disableAreaCenterX = 0, disableAreaCenterY = 0, disableAreaCenterZ = 0, disableAreaRadius = 0, disableAreaSoftnessRadius = 0 ){ float scales[4] = {globalScale,xScale,yScale,zScale}; float offsets[3] = {offsetX,offsetY,offsetZ}; float mixer = ho_multiNoise(space,scales,offsets,frq,octave,solarize); float opacityMixer = ho_multiNoise(space,scales,offsets,frq,octave,0); color surfColor = ho_mix(red,yellow,colorBias,mixer); float shapeOffsets[3] = {shapeNoiseOffsetX,shapeNoiseOffsetY,shapeNoiseOffsetZ}; float surfOpacityMixer = flameShape(space,trimSide,opacityMixer,shapeSoftness,shapeNoiseSizeRatio,shapeOffsets,softEdge); color surfOpacityTmp= ho_mix(color(0,0,0),color(1,1,1),1,surfOpacityMixer); float surfOpacity = surfOpacityTmp[0]; //enable area float enablePos[3] = {enableAreaCenterX,enableAreaCenterY,enableAreaCenterZ}; surfOpacity *= enableArea(space,enablePos,enableAreaRadius,enableAreaSoftnessRadius); //disable are float disablePos[3] = {disableAreaCenterX,disableAreaCenterY,disableAreaCenterZ}; surfOpacity *= 1-enableArea(space,disablePos,disableAreaRadius,disableAreaSoftnessRadius); float noiseOi = surfOpacity * (1-(noiseTransperant) * (1-mixer)); Oi = Os * surfOpacity * oapcity * noiseOi; Ci = Cs * surfColor * Oi; } //ho_FlameDisplacement.sl #include "ho_flameLib.h"; displacement ho_woodFlameDisplacement( string space = "world"; float baseHeight = 0.05, flameHeight = 0.1, upHight = 0.1, frq = 2, frqX = 1, frqY = 1, frqZ = 1, octave = 2, solarize = 1, sharpness = 15, offsetX = 0, offsetY = 0, offsetZ = 0, enableCenterX = 0, enableCenterY = 0, enableCenterZ = 0, enableAreaRadius = 4, enableAreaSoftnessRadius = 3; output varying float h ){ point wp = ho_setSpace(space,offsetX,offsetY,offsetZ,frq,1,1,1); vector worldUp = vector "world" (0,1,0); float flameAmp = 0; flameAmp = noise(wp*frq); float frqs[4] = {1,frqX,frqY,frqZ}; float offsets[3] = {offsetX,offsetY,offsetZ}; flameAmp = ho_multiNoise(space,frqs,offsets,frq,octave,solarize); flameAmp = pow(smoothstep(0,1,flameAmp),sharpness); float enableCenter[3] = {enableCenterX,enableCenterY,enableCenterZ}; flameAmp *= enableArea(space, enableCenter ,enableAreaRadius, enableAreaSoftnessRadius); P+= normalize(N) * flameAmp * flameHeight; N = calculatenormal(P); if(isSameDir(worldUp,N)){ flameAmp *= worldUp.normalize(N); P+= normalize(N) * flameAmp * upHight; N = calculatenormal(P); } h = flameAmp; } //ho_woodFlame.sl #include "ho_flameLib.h"; surface ho_woodFlame( string space = "world"; color red = color(1,0,0), yellow = color(1,1,0); float colorBias = 1, power = 3, xRayMin = 0.2, disablePosX = 0, disablePosY = 0, disablePosZ = 0, disableAreaRadius = 1, disableAreaSoftnessRadius = 1 ){ float xRay = 1-(normalize(-I).normalize(faceforward(N,I))); float height = 0; displacement("h",height); float mixer = (height*2) * ((xRay*(1-xRayMin))+xRayMin) * power; color surfColor = ho_mix(yellow,red,colorBias,mixer); float disablePos[3] = {disablePosX,disablePosY,disablePosZ}; mixer *= 1- enableArea(space,disablePos,disableAreaRadius,disableAreaSoftnessRadius); Oi = mixer; Ci = surfColor * Oi; }