*/}}
Pārlūkot izejas kodu

second texture mixing

YimingWu 1 mēnesi atpakaļ
vecāks
revīzija
3d5c4b00be
6 mainītis faili ar 95 papildinājumiem un 40 dzēšanām
  1. 2 2
      la_kernel.c
  2. 18 7
      la_tns.h
  3. 35 15
      la_tns_kernel.c
  4. 2 2
      resources/la_modelling.c
  5. 37 13
      resources/la_tns_shaders.cpp
  6. 1 1
      resources/la_widgets_viewers.c

+ 2 - 2
la_kernel.c

@@ -189,10 +189,10 @@ void la_ScanWacomDevices(Display *display, int deviceid){
 }
 
 void laHideCursor(){
-    if(!MAIN.CurrentWindow) return; XFixesHideCursor(MAIN.dpy, MAIN.CurrentWindow->win);
+    //if(!MAIN.CurrentWindow) return; XFixesHideCursor(MAIN.dpy, MAIN.CurrentWindow->win);
 }
 void laShowCursor(){
-    if(!MAIN.CurrentWindow) return; XFixesShowCursor(MAIN.dpy, MAIN.CurrentWindow->win);
+    //if(!MAIN.CurrentWindow) return; XFixesShowCursor(MAIN.dpy, MAIN.CurrentWindow->win);
 }
 
 int la_XErrorHandler(Display *display, XErrorEvent *event){

+ 18 - 7
la_tns.h

@@ -57,6 +57,9 @@ extern const char* LA_SELECTION_FRAGMENT_SHADER;
 #define TNS_COLOR_SPACE_CLAY 1
 #define TNS_COLOR_SPACE_D65_P3 2
 
+#define TNS_MIX_NORMAL 0
+#define TNS_MIX_ADD    1
+
 //typedef real tnsMatrix33d[9];
 
 typedef float tnsMatrix44f[16];
@@ -101,15 +104,17 @@ struct _tnsShader{
     int iVertex, iNormal, iColor, iUV;
     int iUseNormal;
 
-    int iTexColor,iTexNormal,iTexGPos;
-    int iTexColorMS,iTexColorU;
-    int iMultiplyColor, StateMultiplyColor;
-    int iTextureMode, StateTextureMode, iColorMode,iHCYGamma;
-    int iSampleAmount, StateSampleAmount;
+    int iTexColor,iTexColor2,iTexNormal,iTexGPos;
+    int iTexIsUI,iTex2IsUI;
+    int iTexColorMS,iTexColorU,iTexColor2U;
+    int iMultiplyColor;
+    int iTextureMode,iColorMode,iHCYGamma;
+    int iSampleAmount;
     int iInputColorSpace, iOutputColorSpace, iShowStripes, iTexLut, iUseLut;
     int iComposing, iComposingGamma, iComposingBlackpoint;
     int iDoOffset;
     int iUseHalftone,iHalftoneSize;
+    int StateTextureMode,StateMultiplyColor,StateSampleAmount,StateTexIsUI,StateTex2IsUI;
 
     int uViewDir,uViewPos,uFOV,uNear,uFar;
 };
@@ -144,6 +149,7 @@ STRUCTURE(tnsCommand){
 
     tnsShader *ReplaceShader;
     tnsTexture *ColorTexture;
+    tnsTexture *ColorTexture2;
     int TextureMode;
     int MultiplyColor;
 
@@ -245,10 +251,12 @@ struct _tnsMain {
 
     // Corresponds to current GL_TEXTURE0/1...
     tnsTexture *TexColor;
+    tnsTexture *TexColor2; //==TEXTURE4
     tnsTexture *TexRenderbuffer;
 
     // For commands
     tnsTexture *StateTexColor;
+    tnsTexture *StateTexColor2;
     int StateTextureMode;
     int StateMultiplyColor;
     int StateUseNormal;
@@ -1394,11 +1402,13 @@ tnsOffscreen *tnsCreateDeferredOffscreen(int w, int h, int Multisample);
 void tnsCopyScreenTo2DTexture(tnsTexture *target, int x_lower_left, int y_lower_left, int w, int h);
 void tnsActiveTexture(GLenum tex);
 void tnsBindTexture(tnsTexture *t);
+void tnsBindTexture2(tnsTexture *t);
 void tnsUnbindTexture();
+void tnsUnbindTexture2();
 void tnsUniformUseNormal(tnsShader* s, int Use);
 void tnsUniformUseHalftone(tnsShader* s, real Use);
 void tnsUniformHalftoneSize(tnsShader* s, real Use);
-void tnsUniformUseTexture(tnsShader* s, int mode, int sample);
+void tnsUniformUseTexture(tnsShader* s, int mode, int sample, int TexIsUInt, int Tex2IsUInt);
 void tnsUniformColorMode(tnsShader *s, int mode);
 void tnsUniformHCYGamma(tnsShader* s, float Gamma);
 void tnsUniformInputColorSpace(tnsShader* s, int ColorSpace);
@@ -1408,6 +1418,7 @@ void tnsUniformColorComposing(tnsShader* s, int Composing, real gamma, real blac
 void tnsUniformUseMultiplyColor(tnsShader* s, int enable);
 void tnsUseMaskTexture(tnsTexture *t);
 void tnsUseTexture(tnsTexture *t);
+void tnsUseTexture2(tnsTexture* t, int mixmode);
 void tnsUseNoTexture();
 void tnsUseMultiplyColor(int enable);
 void tnsDeleteTexture(tnsTexture *t);
@@ -1432,7 +1443,7 @@ void tnsDrawToOffscreen(tnsOffscreen *toff, int HowMany, GLuint *AttachmentArray
 void tnsDrawToExtraColorAttachment(tnsOffscreen *toff);
 void tnsDrawToExtraNormalAttachment(tnsOffscreen *toff);
 void tnsDrawToAllExtraAttachments(tnsOffscreen *toff);
-void tnsDrawToOffscreenOnlyBind(tnsOffscreen *toff, int HowMany, GLuint *AttachmentArray);
+void tnsDrawToOffscreenOnlyBind(tnsOffscreen *toff);
 void tnsReadFromOffscreen(tnsOffscreen *toff);
 
 void tnsDrawToScreen();

+ 35 - 15
la_tns_kernel.c

@@ -343,10 +343,8 @@ void tnsShaderMakeIndex(tnsShader *tns){
     tns->iTexColorU = glGetUniformLocation(program, "TexColorUI");
     tns->iTexColorMS = glGetUniformLocation(program, "TexColorMS");
     tns->iTexLut=glGetUniformLocation(program, "TexLut");
-    if(tns->iTexColor>=0){glUniform1i(tns->iTexColor, 0);}
-    if(tns->iTexColorMS>=0){glUniform1i(tns->iTexColorMS, 1);}
-    if(tns->iTexColorU>=0){glUniform1i(tns->iTexColorU, 2);}
-    if(tns->iTexLut>=0){glUniform1i(tns->iTexLut, 3);}
+    tns->iTexColor2 = glGetUniformLocation(program, "TexColor2");
+    tns->iTexColor2U = glGetUniformLocation(program, "TexColor2UI");
     tns->iTexNormal = glGetUniformLocation(program, "TexNormal");
     tns->iTexGPos = glGetUniformLocation(program, "TexGPos");
     tns->iMultiplyColor = glGetUniformLocation(program, "MultiplyColor");
@@ -357,6 +355,8 @@ void tnsShaderMakeIndex(tnsShader *tns){
     tns->iUseNormal = glGetUniformLocation(program, "UseNormal");
     tns->iOutputColorSpace=glGetUniformLocation(program, "OutputColorSpace");
     tns->iInputColorSpace=glGetUniformLocation(program, "InputColorSpace");
+    tns->iTexIsUI=glGetUniformLocation(program, "TexIsUI");
+    tns->iTex2IsUI=glGetUniformLocation(program, "Tex2IsUI");
     tns->iUseLut=glGetUniformLocation(program, "UseLut");
     tns->iShowStripes=glGetUniformLocation(program, "ShowStripes");
     tns->iComposing=glGetUniformLocation(program, "Composing");
@@ -1691,7 +1691,7 @@ void tnsDrawBatchInitArrayStates(tnsBatch* batch){
         }
     }
     if(cs->iUV>=0){ glDisableVertexAttribArray(cs->iUV); }
-    tnsUniformUseTexture(cs, 0, 0);
+    tnsUniformUseTexture(cs,0,0,0,0);
 }
 int tnsDrawBatch(tnsBatch* batch, const char* OverrideCommand, real* OverrideUniformColor, int OverrideAsArray) {
 	if (!batch) return 0;
@@ -1921,21 +1921,26 @@ void tnsUseMaskTexture(tnsTexture *t){
     if(!t){T->StateTextureMode=0; return;}
     T->StateTexColor = t; T->StateTextureMode=1;
 }
+#define TEX_MODE_IS_MIXING(T) \
+    (T->StateTextureMode>=5&&T->StateTextureMode<=100)
 void tnsUseTexture(tnsTexture *t){
-    if(!t){T->StateTextureMode=0; return;}
-    if(t->IsUIntTexture){ T->StateTexColor = t; T->StateTextureMode=4; return; }
+    if(!t){ T->StateTextureMode=0; return; }
     if(t->GLTexType == GL_TEXTURE_2D){
         T->StateTexColor = t;
         switch(t->ChromaCompression){
             case TNS_CHROMA_COMPRESSION_YUYV: T->StateTextureMode = 101; break;
             case TNS_CHROMA_COMPRESSION_UYVY: T->StateTextureMode = 102; break;
-            default: T->StateTextureMode = 2;
+            default: T->StateTextureMode = TEX_MODE_IS_MIXING(T)?T->StateTextureMode:2;
         }
     }
 #ifndef LAGUI_ANDROID
     else if(t->GLTexType == GL_TEXTURE_2D_MULTISAMPLE){ T->StateTexColor = t; T->StateTextureMode=3; }
 #endif
 }
+void tnsUseTexture2(tnsTexture* t, int mixmode){
+    if(!t){ T->StateTextureMode=TEX_MODE_IS_MIXING(T)?2:0; return; }
+    if(t->GLTexType == GL_TEXTURE_2D){ T->StateTexColor2=t; T->StateTextureMode=5+mixmode; }
+}
 void tnsUseNoTexture(){
     tnsUseTexture(0);
 }
@@ -1985,9 +1990,20 @@ void tnsUnbindTexture(){
         glBindTexture(T->TexColor->GLTexType, 0); T->TexColor=0;
     }
 }
-void tnsUniformUseTexture(tnsShader* s, int mode, int sample){
+void tnsBindTexture2(tnsTexture *t){
+    if ((!t) || T->TexColor2==t) return;
+    if(t->GLTexType == GL_TEXTURE_2D){ tnsActiveTexture(GL_TEXTURE4); glBindTexture(t->GLTexType, t->GLTexHandle); T->TexColor2=t;}
+}
+void tnsUnbindTexture2(){
+    if(T->TexColor2){
+        tnsActiveTexture(GL_TEXTURE4); glBindTexture(T->TexColor->GLTexType, 0); T->TexColor=0;
+    }
+}
+void tnsUniformUseTexture(tnsShader* s, int mode, int sample, int TexIsUInt, int Tex2IsUInt){
     if(s->StateTextureMode != mode){ s->StateTextureMode=mode; glUniform1i(s->iTextureMode,mode); }
     if(mode==3 && s->StateSampleAmount != sample){ s->StateSampleAmount=sample, glUniform1i(s->iSampleAmount,sample); }
+    if(s->StateTexIsUI != TexIsUInt){ s->StateTexIsUI=TexIsUInt; glUniform1i(s->iTexIsUI,TexIsUInt); }
+    if(s->StateTex2IsUI != Tex2IsUInt){ s->StateTex2IsUI=Tex2IsUInt; glUniform1i(s->iTex2IsUI,TexIsUInt); }
 }
 void tnsUniformUseMultiplyColor(tnsShader* s, int enable){
     int mode=enable?1:0;
@@ -2433,6 +2449,7 @@ void tnsPackAs(GLenum Mode){
     c->Mode = Mode;
     c->ReplaceShader = T->StateShader;
     c->ColorTexture = T->StateTexColor;
+    c->ColorTexture2 = T->StateTexColor2;
     c->TextureMode = T->StateTextureMode;
     c->MultiplyColor = T->StateMultiplyColor;
     c->LineWidth=T->StateLineWidth;
@@ -2533,10 +2550,13 @@ void tnsFlush(){
             }
         }
 
-        if (c->TextureMode && c->ColorTexture && cs->iTexColor != -1){
-            tnsBindTexture(c->ColorTexture); tnsUniformUseTexture(cs, c->TextureMode, c->ColorTexture->Multisample);
+        if (c->TextureMode && c->ColorTexture && cs->iTexColor!=-1){
+            tnsBindTexture(c->ColorTexture);
+            if(c->ColorTexture2) tnsBindTexture2(c->ColorTexture2);
+            tnsUniformUseTexture(cs, c->TextureMode, c->ColorTexture->Multisample,
+                c->ColorTexture?c->ColorTexture->IsUIntTexture:0, c->ColorTexture2?c->ColorTexture2->IsUIntTexture:0);
         }else{
-            tnsUniformUseTexture(cs, 0, 0); //tnsUnbindTexture(); 
+            tnsUniformUseTexture(cs,0,0,0,0); //tnsUnbindTexture(); 
         }
 
         if(cs->iMultiplyColor != -1){ tnsUniformUseMultiplyColor(cs, c->MultiplyColor); }
@@ -2753,12 +2773,12 @@ void tnsDrawToOffscreen(tnsOffscreen *toff, int HowMany, GLuint *AttachmentArray
     T->IsOffscreen = 1;
     T->BindedShader = 0;
 }
-void tnsDrawToOffscreenOnlyBind(tnsOffscreen *toff, int HowMany, GLuint *AttachmentArray){
-    if (!toff) return;
+void tnsDrawToOffscreenOnlyBind(tnsOffscreen *toff){
+    if (!toff){ glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0); return; }
     glBindFramebuffer(GL_DRAW_FRAMEBUFFER, toff->FboHandle);
 }
 void tnsReadFromOffscreen(tnsOffscreen *toff){
-    if (!toff) return;
+    if (!toff){ glBindFramebuffer(GL_READ_FRAMEBUFFER, 0); return; }
     glBindFramebuffer(GL_READ_FRAMEBUFFER, toff->FboHandle);
 }
 void tnsDrawToScreen(){

+ 2 - 2
resources/la_modelling.c

@@ -120,7 +120,7 @@ void la_PopulateSelectDataObjects(MSelectData* sd, tnsObject* root, laCanvasExtr
     sd->nextV++; // starting from 1;
     la_AssignObjectSelectIDRecursive(root, sd);
     if(sd->nextV==1) return; int w=sd->Color->Width, h=sd->Color->Height;
-    tnsUnbindTexture(); tnsUniformUseTexture(T->immShader,0,0); tnsUseMultiplyColor(0);
+    tnsUnbindTexture(); tnsUniformUseTexture(T->immShader,0,0,0,0); tnsUseMultiplyColor(0);
     tnsEnableShaderv(T->SelectionShader);
     glDisableVertexAttribArray(T->SelectionShader->iColor); glVertexAttrib4f(T->SelectionShader->iColor,0,0,0,0);
     tnsViewportWithScissor(0,0,w,h);tnsResetViewMatrix();tnsResetModelMatrix();tnsResetProjectionMatrix();
@@ -182,7 +182,7 @@ void la_PopulateSelectDataPrimitives(MSelectData* sd, tnsObject* o, tnsCamera* c
         la_PopulateSelectPoints(sd,so);
     }
     int w=sd->Color->Width, h=sd->Color->Height;
-    tnsUnbindTexture(); tnsUniformUseTexture(T->immShader,0,0); tnsUseMultiplyColor(0);
+    tnsUnbindTexture(); tnsUniformUseTexture(T->immShader,0,0,0,0); tnsUseMultiplyColor(0);
     tnsEnableShaderv(T->SelectionShader);
     tnsViewportWithScissor(0,0,w,h);tnsResetViewMatrix();tnsResetModelMatrix();tnsResetProjectionMatrix();
 

+ 37 - 13
resources/la_tns_shaders.cpp

@@ -678,13 +678,17 @@ void main(){
 })";
 
 extern "C" const char* LA_IMM_FRAGMENT_SHADER = R"(#version 310 es
-
+#extension GL_ARB_shading_language_420pack : enable // uniform sampler binding
 precision highp float;
 precision highp int;
-uniform highp sampler2D TexColor;
-uniform highp sampler2DMS TexColorMS;
-uniform highp usampler2D TexColorUI;
-uniform highp sampler3D TexLut;
+layout (binding=0) uniform highp sampler2D TexColor;
+layout (binding=1) uniform highp sampler2DMS TexColorMS;
+layout (binding=2) uniform highp usampler2D TexColorUI;
+layout (binding=3) uniform highp sampler3D TexLut;
+layout (binding=4) uniform highp sampler2D TexColor2;
+layout (binding=5) uniform highp sampler2D TexColorUI2;
+uniform int TexIsUI;
+uniform int Tex2IsUI;
 uniform int UseLut;
 uniform int TextureMode;
 uniform int ColorMode;
@@ -754,12 +758,29 @@ vec4 cunpack(uint d){
 }
 #endif
 
+#ifdef GLES_UINT_TEXTURE
+#define textureUI(sampler,uv) \
+	cunpack(texture(sampler,uv).r)
+#else
+#define textureUI(sampler,uv) \
+	vec4(texture(sampler,uv))/vec4(65535.)
+#endif
+
+vec4 texture1(vec2 uv){
+	if(TexIsUI!=0){ vec4 c=textureUI(TexColorUI,uv); return c; }
+	return texture(TexColor,uv);
+}
+vec4 texture2(){
+	if(Tex2IsUI!=0){ vec4 c=texelFetch(TexColorUI2,ivec2(gl_FragCoord.xy),0); return c; }
+	return texelFetch(TexColor2,ivec2(gl_FragCoord.xy),0);
+}
+
 void main(){
     vec4 color=vec4(1,0,1,1);
     if(TextureMode==0){ color = fColor; if(UseHalftone>0.) color.a=HalftoneSingle(color.a,htsize,rad(7.),0.); }
-    else if(TextureMode==1){color = vec4(fColor.rgb,fColor.a*texture(TexColor,fUV.st).r);}
+    else if(TextureMode==1){color = vec4(fColor.rgb,fColor.a*texture1(fUV.st).r);}
     else if(TextureMode==2){
-        color=texture(TexColor,fUV.st);
+        color=texture1(fUV.st);
         if(MultiplyColor!=0){color*=fColor;}
     }else if(TextureMode==3){
         color=vec4(0,0,0,0);
@@ -768,12 +789,15 @@ void main(){
         color/=float(SampleAmount);
         if(MultiplyColor!=0){color*=fColor;}
     }else if(TextureMode==4){
-#ifdef GLES_UINT_TEXTURE
-		color=cunpack(texture(TexColorUI,fUV.st).r);
-#else
-		color=vec4(texture(TexColorUI,fUV.st))/vec4(65535.);
-#endif
-        if(MultiplyColor!=0){color*=fColor;}
+        color=vec4(1,0,1,1); //deprecated
+	}else if(TextureMode==5){
+        vec4 color1=texture1(fUV.st); if(MultiplyColor!=0){color1*=fColor;}
+		vec4 color2=texture2();
+		color = color1+color2*(1.0-color1.a);
+	}else if(TextureMode==6){
+        vec4 color1=texture1(fUV.st); if(MultiplyColor!=0){color1*=fColor;}
+		vec4 color2=texture2();
+		color = color1+color2;
 	}else if(TextureMode==101){ // YUYV
 		ivec2 tsize = textureSize(TexColor,0);
 		vec2 pixel = fUV.st * vec2(tsize);

+ 1 - 1
resources/la_widgets_viewers.c

@@ -208,7 +208,7 @@ void la_RootObjectDraw(laBoxedTheme *bt, tnsObject *root, laUiItem* ui){
             glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND);
 
             tnsUseShader(T->immShader); tnsEnableShaderv(T->immShader); tnsUseNoTexture();
-            tnsUnbindTexture(); tnsUniformUseTexture(T->immShader,0,0); tnsUseMultiplyColor(0);
+            tnsUnbindTexture(); tnsUniformUseTexture(T->immShader,0,0,0,0); tnsUseMultiplyColor(0);
             tnsDrawObjectTree(root,TNS_EVAL_LAYER_SOLID|Do2DInstance,&de,e->AsPlayer);
             
             glLineWidth(7);  tnsUniformUseOffset(T->immShader,-100);