*/}}
YimingWu 1 hete
szülő
commit
ac411dc50b
2 módosított fájl, 34 hozzáadás és 9 törlés
  1. 2 2
      ouroperations.c
  2. 32 7
      ourshader.cpp

+ 2 - 2
ouroperations.c

@@ -1296,7 +1296,7 @@ void our_PigmentMix(OurPigmentData* target, OurPigmentData* source, real factor)
     real ascale=1.0f/(afac1+afac+DBL_EPSILON), rscale=1.0f/(rfac1+rfac+DBL_EPSILON); 
     afac*=ascale; afac1*=ascale; rfac*=rscale;rfac1*=rscale;
     for(int i=0;i<OUR_SPECTRAL_SLICES;i++){
-        target->Absorption[i]=safepow(target->Absorption[i],afac1)*safepow(source->Absorption[i],afac);
+        target->Absorption[i]=1.0f-safepow(1.0f-target->Absorption[i],afac1)*safepow(1.0f-source->Absorption[i],afac);
         target->Reflectance[i]=safepow(target->Reflectance[i],rfac1)*safepow(source->Reflectance[i],rfac);
     }
     target->Absorption[15]=tnsInterpolate(target->Absorption[15],source->Absorption[15],factor);
@@ -2524,7 +2524,7 @@ void our_ReadWidgetColor(laCanvasExtra*e,int x,int y){
     glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
     if(Our->PigmentMode){
         u8bit pigment[32]={0}; x/=2;x*=2; y/=2; y*=2;
-        glReadPixels(x,y,2,2, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, pigment);
+        glReadPixels(x*2,y*2,2,2, GL_RGBA_INTEGER, GL_UNSIGNED_SHORT, pigment);
         printf("read:\n");
         for(int i=0;i<16;i++) { printf("%03d ", pigment[i]); } printf("\n");
         for(int i=16;i<32;i++){ printf("%03d ", pigment[i]); } printf("\n");

+ 32 - 7
ourshader.cpp

@@ -422,7 +422,7 @@ int dab_pigment(float d, vec2 fpx, PigmentData color, float size, float hardness
         cc.r[15]=color.r[15]*canvas*fac*(1.-smudge);
         PigmentData smudged_color=PigmentMix(last_color,smudge_color,smudge*fac*canvas);
         PigmentData added_color=PigmentOver(cc,smudged_color);
-        final=added_color;//PigmentInterpolate(added_color,smudged_color,smudge);
+        final=added_color;
     }
     return 1;
 }
@@ -624,29 +624,54 @@ void PigmentMixSlices(float a[16], inout float b[16], float factor){
     if(factor==1.) return; if(factor==0.){ for(int i=0;i<16;i++){b[i]=a[i];} return; }
     float fac=(1.0f-factor)*a[15]; float fac1=factor*b[15]; if(fac+fac1==0.){ return; }
     float scale=1.0/(fac+fac1); b[15]=mix(a[15],b[15],factor); fac*=scale; fac1*=scale;
-    for(int i=0;i<15;i++){
+    for(int i=0;i<OUR_SPECTRAL_SLICES;i++){
         b[i]=safepow(a[i],fac)*safepow(b[i],fac1);
     }
 }
+void PigmentMixSlicesInverted(float a[16], inout float b[16], float factor){
+    if(factor==1.) return; if(factor==0.){ for(int i=0;i<16;i++){b[i]=a[i];} return; }
+    float fac=(1.0f-factor)*a[15]; float fac1=factor*b[15]; if(fac+fac1==0.){ return; }
+    float scale=1.0/(fac+fac1); b[15]=mix(a[15],b[15],factor); fac*=scale; fac1*=scale;
+    for(int i=0;i<OUR_SPECTRAL_SLICES;i++){
+        b[i]=1.-safepow(1.-a[i],fac)*safepow(1.-b[i],fac1);
+    }
+}
 void PigmentOverSlices(float a[16], inout float b[16]){
     float fac=a[15]; float fac1=(1.0f-fac)*b[15]; if(fac==0.) return;
     float scale=1.0/(fac+fac1); b[15]=fac1+fac; fac*=scale; fac1*=scale;
-    for(int i=0;i<15;i++){
+    for(int i=0;i<OUR_SPECTRAL_SLICES;i++){
         b[i]=safepow(a[i],fac)*safepow(b[i],fac1);
     }
 }
+void PigmentOverSlicesInverted(float a[16], inout float b[16]){
+    float fac=a[15]; float fac1=(1.0f-fac)*b[15]; if(fac==0.) return;
+    float scale=1.0/(fac+fac1); b[15]=fac1+fac; fac*=scale; fac1*=scale;
+    for(int i=0;i<OUR_SPECTRAL_SLICES;i++){
+        b[i]=1.-safepow((1.-a[i]),fac)*safepow((1.-b[i]),fac1);
+    }
+}
+void PigmentMultiplySlicesInverted(float a[16], inout float b[16], float factor){
+    float fac=a[15]*factor; float fac1=b[15]; if(fac==0.) return;
+    b[15]=1.-(1.-fac1)*(1.-fac);
+    for(int i=0;i<OUR_SPECTRAL_SLICES;i++){
+        float pre=1.-b[i]*fac1; float mult=pre*(1.-a[i]*fac);
+        b[i]=(1.-mult)/b[15];
+        //b[i]=1.-(1.-a[i]*fac)*(1.-b[i]);
+    }
+}
 PigmentData PigmentMix(PigmentData p0, PigmentData p1, float factor){
     PigmentData result=p1;
-    PigmentMixSlices(p0.a,result.a,factor);
+    PigmentMixSlicesInverted(p0.a,result.a,factor);
     PigmentMixSlices(p0.r,result.r,factor);
     return result;
 }
 PigmentData PigmentOver(PigmentData p0, PigmentData p1){
-    PigmentData result=p1;
+    PigmentData result=p1; float mfac=1.0;//p0.r[15];
     //for(int i=0;i<15;i++){ result.r[i]=result.r[i]*(1.0-result.a[i]*safepow(result.a[15],2.)); }
     float rfac=p0.r[15]; result.a[15]=mix(result.a[15],0.,safepow(rfac,2.));
     PigmentOverSlices(p0.r,result.r);
-    PigmentOverSlices(p0.a,result.a);
+    PigmentMultiplySlicesInverted(p0.a,result.a,mfac);
+
     return result;
 }
 void PigmentAdd(inout PigmentData p, PigmentData on_top){
@@ -696,7 +721,7 @@ vec3 Spectral2XYZ(float spec[OUR_SPECTRAL_SLICES]){
 vec3 PigmentToRGB(PigmentData pd, PigmentData light){
     float slices[OUR_SPECTRAL_SLICES];
     for(int i=0;i<OUR_SPECTRAL_SLICES-1;i++){
-        float absfac=1.0f-pd.a[i]*pow(pd.a[15],2.); if(absfac<0.)absfac=0.; slices[i]=pd.r[i]*absfac;
+        float absfac=1.0f-pd.a[i]*pow(pd.a[15],1.); if(absfac<0.)absfac=0.; slices[i]=pd.r[i]*absfac;
         slices[i]*=light.r[i];
     }
     vec3 xyz=Spectral2XYZ(slices); vec3 rgb=XYZ2sRGB(xyz); return rgb;