Welcome to Fractal Forums

Fractal Software => Fragmentarium => Topic started by: Crist-JRoger on October 23, 2015, 10:43:08 PM




Title: multicoloring
Post by: Crist-JRoger on October 23, 2015, 10:43:08 PM
So my question maybe foolish, but maybe anybody can answer - how paint two or more fractals or other objects in one scene to different color palettes? Of course in DE-Raytracer or similar.
When we use orbitcolor - it`s applied on all objects because this is wrote in code of raytracer. So i found a lot of "#ifdef  providesColor" in code. And when i use as example ColorPalette by Kali - this is also applies all objects. Can we use many palettes?


Title: Re: multicoloring
Post by: SCORPION on October 24, 2015, 01:36:51 PM
Можем.
Этим вопросом я задавался в 2013 году.
DE raytracer
1. по orbitColor можно разукрашивать фракталы по разному, но если это не гибридный фрактал, а комбинация фракталов.
2. По providesColor можно разукрашивать отдельные части фрактала в разные цвета, естественно, это относится к комбинациям и гибридным фракталам.
По providesColor также можно накладывать разную текстуру на фракталы. Но этот вопрос я подробно разбирал на деми.

Code:
#info duals of uniform (regular and quasi-regular -and inbetween-) polyhedra
#info also called catalan solids
#info Distance Estimator using fold and cut technique (knighty 2012)
#define providesInit
#define providesColor
#include "DE-Raytracer.frag"
#include "MathUtils.frag"

#group polyhedra

// Symmetry group type.
uniform int Type;  slider[3,5,5]

// U "barycentric" coordinate for the normal of the face plane
uniform float U; slider[0,1,1]

// V
uniform float V; slider[0,0,1]

// W
uniform float W; slider[0,0,1]

//vertex radius
uniform float VRadius; slider[0,0.05,0.5]

//segments radius
uniform float SRadius; slider[0,0.01,0.1]

uniform bool displayFaces; checkbox[true]
uniform bool displaySegments; checkbox[true]
uniform bool displayVertices; checkbox[true]

#group polyhedraColor
uniform vec3 facesColor; color[0.0,0.0,0.0]
uniform vec3 verticesColor; color[0.0,0.0,0.0]
uniform vec3 segmentsColor; color[0.0,0.0,0.0]

#define PI 3.14159
float dissolveFn(float dott, float mu, float su){
//return 0.9-pow(1.-abs(dott),20.);
return clamp(abs(dott)*mu-su,0.,1.);
}
vec3 nc,pab,pbc,pca,nor;
float sva,svb,svc;
void init() {
float cospin=cos(PI/float(Type)), scospin=sqrt(0.75-cospin*cospin);
nc=vec3(-0.5,-cospin,scospin);
pab=vec3(0.,0.,1.);
pbc=vec3(scospin,0.,0.5);
pca=vec3(0.,scospin,cospin);
nor=normalize(U*pab+V*pbc+W*pca);
pab=pab/dot(nor,pab);
pbc=pbc/dot(nor,pbc);
pca=pca/dot(nor,pca);

//segment visibility: if facet plane is perpendicular to folding plane corresponding to our segment it should not be displayed
#define MU 10.
#define SU 0.01
sva=dissolveFn(nor.x,MU,SU);
svb=dissolveFn(nor.y,MU,SU);
svc=dissolveFn(dot(nor,nc),MU,SU);
// For vertices, a vertex is visible if one of the corresponding segments is visible with one exception:
// Folding planes at PAB (na and nb which are implicit here because their componenets are
//respectively (1,0,0) and (0,1,0)) are perpendicular to each other. This imply that the vertex PAB is visible when both
//corresponding segments are.
}

vec3 fold(vec3 pos) {
for(int i=0;i<Type;i++){
pos.xy=abs(pos.xy);
float t=-2.*min(0.,dot(pos,nc));
pos+=t*nc;
}
return pos;
}

float D2Planes(vec3 pos) {
return dot(pos,nor)-1.;
}

float D2Segment(vec3 pos, vec3 pa, vec3 pb) {//gives distance from pos to the sgment (pa,pb).
return length((pos-pa)-(pb-pa)*clamp(dot(pos-pa,pb-pa)/dot(pb-pa,pb-pa),0.,1.));
}

float D2Segments(vec3 pos) {
float d=10000.;
if(sva>0.) d=min(d,D2Segment(pos, pab, pca)-SRadius*sva);
if(svb>0.) d=min(d,D2Segment(pos, pbc, pab)-SRadius*svb);
if(svc>0.) d=min(d,D2Segment(pos, pca, pbc)-SRadius*svc);
return d;
}

float D2Vertices(vec3 pos) {
float d=10000.;
if(min(sva,svb)>0.) d=min(d,length(pos-pab)-VRadius*min(sva,svb));
if(max(svb,svc)>0.) d=min(d,length(pos-pbc)-VRadius*max(svb,svc));
if(max(svc,sva)>0.) d=min(d,length(pos-pca)-VRadius*max(svc,sva));
return d;
}

float DE(vec3 pos) {
pos=fold(pos);
float d=10000.;
if(displayFaces) d=min(d,D2Planes(pos));
if(displaySegments) d=min(d,D2Segments(pos));
if(displayVertices) d=min(d,D2Vertices(pos));
return d;
}

vec3 baseColor(vec3 pos, vec3 normal){//corrected. Not optimized.
pos=fold(pos);
float df=1000.,dv=1000.,ds=1000.;
if(displayFaces) df=D2Planes(pos);
if(displaySegments) ds=D2Segments(pos);
if(displayVertices) dv=D2Vertices(pos);
float d=min(df,min(ds,dv));
vec3 col=facesColor;
if(d==ds) col=segmentsColor;
if(d==dv) col=verticesColor;
return col;
}

#preset default
FOV = 0.62536
Eye = -3.20087,-2.1931,1.08181
Target = 3.70097,2.60688,-1.72051
Up = 0.253289,0.177444,0.927765
AntiAlias = 1
Detail = -3
DetailAO = -1.57143
FudgeFactor = 1
MaxRaySteps = 100
BoundingSphere = 3
Dither = 0.4386
NormalBackStep = 1
AO = 0,0,0,0.90123
Specular = 4
SpecularExp = 40
SpotLight = 1,1,1,0.51923
SpotLightDir = 0.6923,0.78462
CamLight = 1,0.827451,0.768627,0.49056
CamLightMin = 0
Glow = 1,1,1,0
GlowMax = 20
Fog = 0
HardShadow = 0
ShadowSoft = 8.254
Reflection = 0.
BaseColor = 0.721569,0.721569,0.721569
OrbitStrength = 0.42857
X = 0.411765,0.6,0.560784,0.41748
Y = 0.666667,0.666667,0.498039,-0.16504
Z = 1,0.258824,0.207843,1
R = 0.0823529,0.278431,1,0.82352
BackgroundColor = 0.501961,0.737255,0.956863
GradientBackground = 0.86955
CycleColors = true
Cycles = 4.04901
EnableFloor = false
FloorNormal = 0,0,1
FloorHeight = -0.9335
FloorColor = 1,1,1
Type = 5
U = 1
V = 0
W = 0
VRadius = 0.05
SRadius = 0.025
displayFaces = true
displaySegments = true
displayVertices = true
facesColor = 0.243137,0.211765,0.694118
verticesColor = 1,0,0
segmentsColor = 0.74902,0.756863,0.172549
#endpreset


SoC raytracer
Возможности разукрашивания очень большие.

Code:
#include "Soc.frag"

vec2 rotate(vec2 v, float angle) {return cos(angle)*v+sin(angle)*vec2(v.y,-v.x);}
vec2 Kaleido(vec2 v){float w=floor(.5+3.5015*atan(v.x,-v.y))*0.28559;return rotate(v,w);}
float Cone(in vec4 z, float radius, float height){return (max(abs(z.y)-height,length(z.xz))-radius*clamp(height-abs(z.y),0.0,height))/z.w;}


float DESnow(vec3 p) {  
p+=vec3(1.35,1.54,1.23);
p*=0.3;
for (int i=0; i<10; i++) {
p.xyz=abs(p.xyz);
p=p/dot(p,p);
p=p*0.7-vec3(0.8);
}
return pow(length(p),1.2)*0.08;
}

float DEFir(vec3 z0){
vec4 z=vec4(z0,1.0);
z.xy=rotate(z.xy,z.z*0.4);
z.xy=clamp(z.xy,-1.25,1.25)*2.0-z.xy;
float r=length(z.xy);
z.xy=rotate(z.xy,r*0.4);
z.z=abs(mod(z.z,0.5)-0.25)-0.125;
z.xy=Kaleido(z.xy);
z.yz=rotate(z.yz,(0.5-r)*0.15);
      float dSnow=DESnow(z0);
      float d=min(r-0.025,Cone(z,0.025,1.0));  
       float dB1=length(z0+vec3(-1.0,-1.0,-0.47))-0.6;
float dB2=length(z0+vec3(1.18,-1.24,0.3))-0.6+cos(z0.y*31.5)*0.02;
vec3 p=z0+vec3(-1.08,0.72,0.46);
float dB3=length(p)-0.5;
p.xy=mat2(0.913,-0.4078,0.4078,0.913)*p.xy;
float dB4=max(abs(p.y-0.55)-0.05,length(p.xz)-0.1+sin(atan(p.x,p.z)*8.0)*0.01);
float dB5=length(z0+vec3(-0.4,0.1,-2.4))-0.7+sin(z0.y*50)*0.01-sin(z0.z*50)*0.01+sin(z0.x*50)*0.01;
      float dB6=length(z0+vec3(-2.3,0.07,-1.4))-0.2;
       p.y-=0.69;
      dB4=min(dB4,max(abs(p.y)-0.25,length(p.xz+vec2(p.y*p.y))-0.0025));
       float dB=min(dSnow, min(dB1,min(dB2,min(dB3, min(dB4,min(dB5,dB6))))));
             if(dB<d){
             if(bColoring && dB==dB1){mcol+=vec4(2.4,0.0,2.3,0.3);}
else if(bColoring && dB==dB2){mcol+=vec4(2.3,2.3,2.3,0.3);}
else if(bColoring && dB==dB3){mcol+=vec4(0.0,2.4,2.6,0.3);}
else if(bColoring && dB==dB4){mcol+=vec4(2.0,2.0,2.0,0.3);}
             else if(bColoring && dB==dB5){mcol+=vec4(3.0,2.0,0.0,0.3);}
             else if(bColoring && dB==dB6){mcol+=vec4(3.0,0.0,0.0,0.3);}
             else if(bColoring && dB==dSnow)mcol+=vec4(3.0,3.0,3.0,0.05);
      }else{
      if(bColoring && dB-d){mcol+=vec4(0.6,1.4,0.6,0.0)*r;}
 }
return max(min(d,dB),-z0.z-4.0);
}

float DE(vec3 z){
return min(DESnow(z),DEFir(z));
}






#preset default
FOV = 0.47058
Eye = 2.44185,-0.380486,3.12248
Target = -1.579,1.85944,-4.45011
FocalPlane = 2.8409
Aperture = 0.01
FudgeFactor = 0.68354
MaxRaySteps = 200
MaxShadowSteps = 200
MaxDistance = 89.5001
ForwardStep = 0.12987
Specular = 1.6456
SpecularExp = 16.364
DiffuseContrast = 0.76087
ShadowContrast = 0.7
ShadowCone = 0.05
LightColor = 1,0.666667,0
LightDir = 0.5,0.5,-0.5
BGColor = 0,0,0.494118
ReflectionBlur = 2
Up = 0,1,0
#endpreset



#include "SoC.frag"


const float r = 1.0 * 2.0 * 1.414214 / 1.732051;
const vec2 h = vec2( r, 0.01 );
const vec2 h2 = h * vec2( 0.73, 4.0 );

const vec3 cc0 = vec3( 0.333333, -0.333333, -0.333333 );
const vec3 cx0 = vec3( 0.707107, 0.000000, 0.707107 );
const vec3 cy0 = vec3( 0.408248, 0.816496, -0.408248 );
const vec3 cz0 = vec3( -0.577350, 0.577350, 0.577350 );

const vec3 cc1 = vec3( -0.333333, -0.333333, 0.333333 );
const vec3 cx1 = vec3( 0.707107, 0.000000, 0.707107 );
const vec3 cy1 = vec3( -0.408248, 0.816496, 0.408248 );
const vec3 cz1 = vec3( -0.577350, -0.577350, 0.577350 );

const vec3 cc2 = vec3( -0.333333, 0.333333, -0.333333 );
const vec3 cx2 = vec3( 0.707107, 0.707107, 0.000000 );
const vec3 cy2 = vec3( -0.408248, 0.408248, 0.816496 );
const vec3 cz2 = vec3( 0.577350, -0.577350, 0.577350 );

const vec3 cc3 = vec3( 0.333333, 0.333333, 0.333333 );
const vec3 cx3 = vec3( 0.000000, 0.707107, -0.707107 );
const vec3 cy3 = vec3( -0.816496, 0.408248, 0.408248 );
const vec3 cz3 = vec3( 0.577350, 0.577350, 0.577350 );

const vec3 c0 = vec3( 0.333333, 0.333333, -0.333333 );
const vec3 x0 = vec3( 0.572061, 0.218508, 0.790569 );
const vec3 y0 = vec3( -0.582591, 0.786715, 0.204124 );
const vec3 z0 = vec3( -0.577350, -0.577350, 0.577350 );

const vec3 c1 = vec3( 0.206011, -0.539344, 0.000000 );
const vec3 x1 = vec3( 0.572061, 0.218508, 0.790569 );
const vec3 y1 = vec3( -0.738528, -0.282093, 0.612372 );
const vec3 z1 = vec3( 0.356822, -0.934172, 0.000000 );

const vec3 c2 = vec3( -0.539344, 0.000000, -0.206011 );
const vec3 x2 = vec3( -0.218508, 0.790569, 0.572061 );
const vec3 y2 = vec3( -0.282093, -0.612372, 0.738528 );
const vec3 z2 = vec3( 0.934172, 0.000000, 0.356822 );

const vec3 c3 = vec3( 0.000000, 0.206011, 0.539344 );
const vec3 x3 = vec3( -0.790569, 0.572061, -0.218508 );
const vec3 y3 = vec3( -0.612372, -0.738528, 0.282093 );
const vec3 z3 = vec3( -0.000000, 0.356822, 0.934172 );

// distance function

// iq's Signed Triangular Prism distance function
float dist_triXY( vec3 p, vec2 h ) {
    vec3 q = abs(p);
    return max(q.z-h.y,max(q.x*0.866025+p.y*0.5,-p.y)-h.x*0.5);
}

float dist_tri( vec3 v, vec3 c, vec3 x, vec3 y, vec3 z ) {
v -= c;
v = vec3( dot( v, x ), dot( v, y ), dot( v, z ) );
return max( dist_triXY( v, h  ), -dist_triXY( v, h2 ) );
}

float DE( vec3 v ) {
float b0, b1, b2, b3, b4;

// cube
{
float d0 = dist_tri( v, cc0, cx0, cy0, cz0 );
float d1 = dist_tri( v, cc1, cx1, cy1, cz1 );
float d2 = dist_tri( v, cc2, cx2, cy2, cz2 );
float d3 = dist_tri( v, cc3, cx3, cy3, cz3 );
b0 = min( min( d0, d1 ), min( d2, d3 ) );

}

// xyz
{
float d0 = dist_tri( v, c0, x0, y0, z0 );
float d1 = dist_tri( v, c1, x1, y1, z1 );
float d2 = dist_tri( v, c2, x2, y2, z2 );
float d3 = dist_tri( v, c3, x3, y3, z3 );
b1 = min( min( d0, d1 ), min( d2, d3 ) );

}

// zx
{
v.zx = -v.zx;
float d0 = dist_tri( v, c0, x0, y0, z0 );
float d1 = dist_tri( v, c1, x1, y1, z1 );
float d2 = dist_tri( v, c2, x2, y2, z2 );
float d3 = dist_tri( v, c3, x3, y3, z3 );
v.zx = -v.zx;
b2 = min( min( d0, d1 ), min( d2, d3 ) );

}

// yz
{
v.yz = -v.yz;
float d0 = dist_tri( v, c0, x0, y0, z0 );
float d1 = dist_tri( v, c1, x1, y1, z1 );
float d2 = dist_tri( v, c2, x2, y2, z2 );
float d3 = dist_tri( v, c3, x3, y3, z3 );
v.yz = -v.yz;
b3 = min( min( d0, d1 ), min( d2, d3 ) );
}

// xy
{
v.xy = -v.xy;
float d0 = dist_tri( v, c0, x0, y0, z0 );
float d1 = dist_tri( v, c1, x1, y1, z1 );
float d2 = dist_tri( v, c2, x2, y2, z2 );
float d3 = dist_tri( v, c3, x3, y3, z3 );
v.xy = -v.xy;
b4 = min( min( d0, d1 ), min( d2, d3 ) );
//SoC color
 float b=min(b0, min(b1,min(b2,min(b3,b4))));

 if(bColoring && b==b0){mcol+=vec4(0.0,0.0,1.0,0.0);}
else if(bColoring && b==b1){mcol+=vec4(1.0,0.0,0.0,0.0);}
else if(bColoring && b==b2){mcol+=vec4(0.0,1.0,0.0,0.0);}
else if(bColoring && b==b3){mcol+=vec4(1.0,1.0,0.0,0.0);}
else if(bColoring && b==b4){mcol+=vec4(0.0,1.0,1.0,0.0);}
}
return min( b0, min( min( b1, b2 ), min( b3, b4 ) ));
}

#preset Default
FOV = 0.62536
Eye = 3.42782,0.131122,-1.33808
Target = -4.83875,-0.410056,1.80828
FudgeFactor = 0.77215
Specular = 1.6456
SpecularExp = 16.364
FocalPlane = 1
Aperture = 0.01
MaxRaySteps = 200
MaxShadowSteps = 95
MaxDistance = 32.4998
ForwardStep = 0.5
DiffuseContrast = 0.7
ShadowContrast = 0.7
ShadowCone = 0.12712
LightColor = 1,0.9,0.4
LightDir = 0.12196,0.5,-0.5122
BGColor = 0.631373,0.631373,0.631373
ReflectionBlur = 0.5
Up = 0,1,0
#endpreset

Сергей, пока нас не засмеяли тут, может пора кочевать к своим родным берегам?....