*/}}
Browse Source

android and other fixes

YimingWu 6 months ago
parent
commit
0d81e7d07a

+ 4 - 0
CMakeLists.txt

@@ -46,6 +46,10 @@ find_package(Threads REQUIRED)
 
 
 add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
 add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
 add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
 add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
+add_compile_options(-fpermissive
+    -Wno-error=incompatible-function-pointer-types
+    -Wno-error=int-conversion
+)
 
 
 file(GLOB SOURCE_FILES 
 file(GLOB SOURCE_FILES 
 	./*.c ./*.cpp ./resources/*.c ./resources/*.cpp)
 	./*.c ./*.cpp ./resources/*.c ./resources/*.cpp)

+ 3 - 3
la_audio.c

@@ -1410,9 +1410,9 @@ void laInitAudio(){
     LA_NODE_CATEGORY_SYSTEM_SOUND=laEnsureNodeCategory("System",0,LA_RACK_TYPE_AUDIO);
     LA_NODE_CATEGORY_SYSTEM_SOUND=laEnsureNodeCategory("System",0,LA_RACK_TYPE_AUDIO);
 
 
     laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_SYNTHESIZER,
     laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_SYNTHESIZER,
-        &LA_IDN_INPUT,&LA_IDN_PULSE,&LA_IDN_FM,&LA_IDN_NOISE,&LA_IDN_VCA,&LA_IDN_ENVELOPE,&LA_IDN_QUANTIZE,&LA_IDN_SCOPE,&LA_IDN_SYNTH_TRIGGER,0);
-    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_SYSTEM_SOUND, &LA_IDN_OUTPUT,0);
+        &LA_IDN_INPUT,&LA_IDN_PULSE,&LA_IDN_FM,&LA_IDN_NOISE,&LA_IDN_VCA,&LA_IDN_ENVELOPE,&LA_IDN_QUANTIZE,&LA_IDN_SCOPE,&LA_IDN_SYNTH_TRIGGER,0LL);
+    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_SYSTEM_SOUND, &LA_IDN_OUTPUT,0LL);
 
 
     LA_NODE_CATEGORY_DRIVER=laEnsureNodeCategory("Driver",0,LA_RACK_TYPE_DRIVER);
     LA_NODE_CATEGORY_DRIVER=laEnsureNodeCategory("Driver",0,LA_RACK_TYPE_DRIVER);
-    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_DRIVER, &LA_IDN_SYNTH_DRIVER, &LA_IDN_SYNTH_TRIGGER,0);
+    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_DRIVER, &LA_IDN_SYNTH_DRIVER, &LA_IDN_SYNTH_TRIGGER,0LL);
 }
 }

+ 1 - 0
la_data.c

@@ -4253,6 +4253,7 @@ laDBInst* la_GetDiffDBInst(laListHandle* NewAdded, laListHandle* Master, void* i
     return 0;
     return 0;
 }
 }
 
 
+int laIterateDB(laDBInst* parent, laPropPack* pp, laDiff* diff, laDBProp* dp);
 int la_GenerateListDifferences(laDBInst* dbi, laDBSubProp* dbp, laPropPack* pp, laDiff* diff){
 int la_GenerateListDifferences(laDBInst* dbi, laDBSubProp* dbp, laPropPack* pp, laDiff* diff){
     laProp *p = pp->LastPs->p, *subp = 0;
     laProp *p = pp->LastPs->p, *subp = 0;
     laPropIterator pi={0};
     laPropIterator pi={0};

+ 3 - 1
la_interface.h

@@ -19,7 +19,7 @@
 #pragma once
 #pragma once
 
 
 #ifdef LAGUI_ANDROID
 #ifdef LAGUI_ANDROID
-    #include <GLES3/gl3.h>
+    #include <GLES3/gl32.h>
     #include <EGL/egl.h>
     #include <EGL/egl.h>
     #include <android/input.h>
     #include <android/input.h>
     #include <android/keycodes.h> 
     #include <android/keycodes.h> 
@@ -2083,6 +2083,7 @@ void laHideProgress();
 void logPrintT(int Type, char* format, ...);
 void logPrintT(int Type, char* format, ...);
 void logPrint(char* format, ...);
 void logPrint(char* format, ...);
 void logPrintNew(char* format, ...);
 void logPrintNew(char* format, ...);
+void logClear();
 
 
 #ifdef _WIN32
 #ifdef _WIN32
 LRESULT CALLBACK LA_WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
 LRESULT CALLBACK LA_WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
@@ -2091,6 +2092,7 @@ LRESULT CALLBACK LA_ProgressWindowProc(HWND hwnd, UINT message, WPARAM wparam, L
 
 
 void la_RegisterMainOperators();
 void la_RegisterMainOperators();
 void la_RegisterUiOperatorsBasic();
 void la_RegisterUiOperatorsBasic();
+void la_RegisterViewerOperators();
 void la_RegisterBuiltinOperators();
 void la_RegisterBuiltinOperators();
 void la_RegisterModellingOperators();
 void la_RegisterModellingOperators();
 void la_RegisterUiTypesBasic();
 void la_RegisterUiTypesBasic();

+ 36 - 29
la_kernel.c

@@ -51,7 +51,7 @@
 #include <shellscalingapi.h>
 #include <shellscalingapi.h>
 #endif
 #endif
 #ifdef LAGUI_ANDROID
 #ifdef LAGUI_ANDROID
-#include <GLES3/gl3.h>
+#include <GLES3/gl32.h>
 #include <android/log.h>
 #include <android/log.h>
 #include <android/native_activity.h>
 #include <android/native_activity.h>
 #include <jni.h>
 #include <jni.h>
@@ -485,7 +485,7 @@ void la_HandlerSIGSEGV(int sig) {
 
 
 void la_glDebugOutput(GLenum source, GLenum type, unsigned int id,
 void la_glDebugOutput(GLenum source, GLenum type, unsigned int id,
     GLenum severity, GLsizei length, const char* message, const void* userParam) {
     GLenum severity, GLsizei length, const char* message, const void* userParam) {
-#ifndef LAGUI_ANDROID
+//#ifndef LAGUI_ANDROID
     // ignore non-significant error/warning codes
     // ignore non-significant error/warning codes
     if (id==131169 || id==131185 || id==131218 || id==131204 || id==131076) return;
     if (id==131169 || id==131185 || id==131218 || id==131204 || id==131076) return;
 
 
@@ -521,11 +521,11 @@ void la_glDebugOutput(GLenum source, GLenum type, unsigned int id,
     case GL_DEBUG_SEVERITY_NOTIFICATION: strseverity = "Notification"; break;
     case GL_DEBUG_SEVERITY_NOTIFICATION: strseverity = "Notification"; break;
     }
     }
     logPrint("%s | %s | %s\n\n", strsource,strtype,strseverity);
     logPrint("%s | %s | %s\n\n", strsource,strtype,strseverity);
-#endif
+//#endif
 }
 }
 
 
 void la_SetCurrentGLContextDebug(){
 void la_SetCurrentGLContextDebug(){
-#ifndef LAGUI_ANDROID
+//#ifndef LAGUI_ANDROID
     int force=MAIN.InitArgs.GLDebug;
     int force=MAIN.InitArgs.GLDebug;
     if(MAIN.EnableGLDebug || force){ glEnable(GL_DEBUG_OUTPUT); }else{ glDisable(GL_DEBUG_OUTPUT); }
     if(MAIN.EnableGLDebug || force){ glEnable(GL_DEBUG_OUTPUT); }else{ glDisable(GL_DEBUG_OUTPUT); }
     if(MAIN.GLDebugSync || force){ glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); }else{ glDisable(GL_DEBUG_OUTPUT_SYNCHRONOUS); }
     if(MAIN.GLDebugSync || force){ glEnable(GL_DEBUG_OUTPUT_SYNCHRONOUS); }else{ glDisable(GL_DEBUG_OUTPUT_SYNCHRONOUS); }
@@ -541,7 +541,7 @@ void la_SetCurrentGLContextDebug(){
         }
         }
     }
     }
     glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, sev, 0, 0, GL_TRUE);
     glDebugMessageControl(GL_DONT_CARE, GL_DONT_CARE, sev, 0, 0, GL_TRUE);
-#endif
+//#endif
 }
 }
 void la_NotifyGLDebugChanges(){
 void la_NotifyGLDebugChanges(){
     MAIN.GLDebugNeedsUpdate=1; for(laWindow* w=MAIN.Windows.pFirst;w;w=w->Item.pNext){ w->GLDebugNeedsUpdate=1; }
     MAIN.GLDebugNeedsUpdate=1; for(laWindow* w=MAIN.Windows.pFirst;w;w=w->Item.pNext){ w->GLDebugNeedsUpdate=1; }
@@ -1442,12 +1442,12 @@ void laShutoff(int SavePrefereces){
 }
 }
 
 
 int laRestoreFactorySettings(){
 int laRestoreFactorySettings(){
-    char path[1024]; sprintf(path, "%s%s", MAIN.WorkingDirectory->Ptr, "preferences.udf");
+    char path[1024]; sprintf(path, "%s%s", SSTR(MAIN.WorkingDirectory), "preferences.udf");
     if(remove(path)){ return 0; }
     if(remove(path)){ return 0; }
     return 1;
     return 1;
 }
 }
 void laSaveUserPreferences(){
 void laSaveUserPreferences(){
-    char path[1024]; sprintf(path,"%s%s",MAIN.WorkingDirectory->Ptr,"preferences.udf");
+    char path[1024]; sprintf(path,"%s%s",SSTR(MAIN.WorkingDirectory),"preferences.udf");
     laUDF* udf=laPrepareUDF(path);
     laUDF* udf=laPrepareUDF(path);
     laWriteProp(udf,"la.windows");
     laWriteProp(udf,"la.windows");
     laWriteProp(udf,"la.user_preferences");
     laWriteProp(udf,"la.user_preferences");
@@ -1459,7 +1459,7 @@ void laSaveUserPreferences(){
     laPackUDF(udf,0,0);
     laPackUDF(udf,0,0);
 }
 }
 void laEnsureUserPreferences(){
 void laEnsureUserPreferences(){
-    char path[1024]; sprintf(path,"%s%s",MAIN.WorkingDirectory->Ptr,"preferences.udf");
+    char path[1024]; sprintf(path,"%s%s",SSTR(MAIN.WorkingDirectory),"preferences.udf");
     laUDFRegistry* r=laFindUDFRegistry(path);
     laUDFRegistry* r=laFindUDFRegistry(path);
     if(!r){ laSaveUserPreferences(); return; }
     if(!r){ laSaveUserPreferences(); return; }
     laUDF* udf=laOpenUDF(r->Path->Ptr,1,0,0); if(!udf){ logPrint("Can't read preferences. Using default settings."); return; }
     laUDF* udf=laOpenUDF(r->Path->Ptr,1,0,0); if(!udf){ logPrint("Can't read preferences. Using default settings."); return; }
@@ -1832,6 +1832,7 @@ void la_MakeSpecialKeyBit(SYSWINDOW hwnd,laWindow*wnd,laEvent *e,int use_last_po
     e->SpecialKeyBit = ((GetKeyState(VK_SHIFT)&0x8000)?LA_KEY_SHIFT:0)|((GetKeyState(VK_CONTROL)&0x8000)?LA_KEY_CTRL:0)|((GetKeyState(VK_MENU)&0x8000)?LA_KEY_ALT:0);
     e->SpecialKeyBit = ((GetKeyState(VK_SHIFT)&0x8000)?LA_KEY_SHIFT:0)|((GetKeyState(VK_CONTROL)&0x8000)?LA_KEY_CTRL:0)|((GetKeyState(VK_MENU)&0x8000)?LA_KEY_ALT:0);
 #endif
 #endif
 }
 }
+void laMappingRequestEval();
 void la_SaveEvent(SYSWINDOW hwnd, laEvent *e, int use_last_pos){
 void la_SaveEvent(SYSWINDOW hwnd, laEvent *e, int use_last_pos){
     laListHandle *wl = &MAIN.Windows;
     laListHandle *wl = &MAIN.Windows;
     laWindow* wnd;
     laWindow* wnd;
@@ -8237,28 +8238,34 @@ static int32_t la_AndroidInputCallback(struct android_app *app, AInputEvent *eve
     __android_log_print(ANDROID_LOG_DEBUG, "huh 5678", "123 input");
     __android_log_print(ANDROID_LOG_DEBUG, "huh 5678", "123 input");
     if(!MAIN.AppEnabled){return 0;}
     if(!MAIN.AppEnabled){return 0;}
     //laRedrawAllWindows();
     //laRedrawAllWindows();
-    
-    int pcount = AMotionEvent_getPointerCount(event); int x,y;
-    if(pcount){
-        real rx=AMotionEvent_getX(event, 0), ry=AMotionEvent_getY(event, 0);
-        x=rx; y=ry;
-    }
-    int32_t action = AMotionEvent_getAction(event);
-    unsigned int flags = action & AMOTION_EVENT_ACTION_MASK;
-    int32_t pointerIndex = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
 
 
-    if (flags == AMOTION_EVENT_ACTION_DOWN){
-        la_SendMouseEvent(0,LA_MOUSEMOVE,x,y);
-        la_SendMouseEvent(0,LA_L_MOUSE_DOWN,x,y);
-    }
-    else if (flags == AMOTION_EVENT_ACTION_UP){
-        la_SendMouseEvent(0,LA_L_MOUSE_UP,x,y);
-    }
-    else if (flags == AMOTION_EVENT_ACTION_MOVE){
-        la_SendMouseEvent(0,LA_MOUSEMOVE,x,y);
+    int type = AInputEvent_getType(event);
+    if(type == AINPUT_EVENT_TYPE_KEY){
+        return 0;
     }
     }
-    else if (flags == AMOTION_EVENT_ACTION_CANCEL){
-        la_SendMouseEvent(0,LA_L_MOUSE_UP,x,y);
+    elif(type == AINPUT_EVENT_TYPE_MOTION){
+        int pcount = AMotionEvent_getPointerCount(event); int x,y;
+        if(pcount){
+            real rx=AMotionEvent_getX(event, 0), ry=AMotionEvent_getY(event, 0);
+            x=rx; y=ry;
+        }
+        int32_t action = AMotionEvent_getAction(event);
+        unsigned int flags = action & AMOTION_EVENT_ACTION_MASK;
+        int32_t pointerIndex = (action & AMOTION_EVENT_ACTION_POINTER_INDEX_MASK) >> AMOTION_EVENT_ACTION_POINTER_INDEX_SHIFT;
+
+        if (flags == AMOTION_EVENT_ACTION_DOWN){
+            la_SendMouseEvent(0,LA_MOUSEMOVE,x,y);
+            la_SendMouseEvent(0,LA_L_MOUSE_DOWN,x,y);
+        }
+        else if (flags == AMOTION_EVENT_ACTION_UP){
+            la_SendMouseEvent(0,LA_L_MOUSE_UP,x,y);
+        }
+        else if (flags == AMOTION_EVENT_ACTION_MOVE){
+            la_SendMouseEvent(0,LA_MOUSEMOVE,x,y);
+        }
+        else if (flags == AMOTION_EVENT_ACTION_CANCEL){
+            la_SendMouseEvent(0,LA_L_MOUSE_UP,x,y);
+        }
     }
     }
 
 
     //static float r=0;
     //static float r=0;
@@ -8350,7 +8357,7 @@ void la_InitAndroidPlatform(struct android_app *app){
         }
         }
     }
     }
 }
 }
-
+int main(int, char *[]);
 void android_main(struct android_app *app){
 void android_main(struct android_app *app){
     char arg0[] = "lagui";     // NOTE: argv[] are mutable
     char arg0[] = "lagui";     // NOTE: argv[] are mutable
 
 

+ 3 - 0
la_tns.h

@@ -1284,6 +1284,8 @@ NEED_STRUCTURE(la3DObjectDrawExtra);
 void tnsDrawShapePointsSelectionID(tnsEvaluatedInstance* ei, la3DObjectDrawExtra* de);
 void tnsDrawShapePointsSelectionID(tnsEvaluatedInstance* ei, la3DObjectDrawExtra* de);
 void tnsDrawShapeObject(tnsEvaluatedInstance* ei, la3DObjectDrawExtra* de);
 void tnsDrawShapeObject(tnsEvaluatedInstance* ei, la3DObjectDrawExtra* de);
 
 
+tnsShapeObject* tnsDuplicateShapeObject(tnsShapeObject* from);
+
 void la_RegisterModellingOperators();
 void la_RegisterModellingOperators();
 void la_RegisterShapeOperators();
 void la_RegisterShapeOperators();
 
 
@@ -1328,6 +1330,7 @@ void tnsDrawWorld(int W, int H);
 tnsMaterial *tnsCreateMaterial(char *Name);
 tnsMaterial *tnsCreateMaterial(char *Name);
 tnsMaterial *tnsFindMaterial(char *name);
 tnsMaterial *tnsFindMaterial(char *name);
 tnsMaterialSlot* tnsNewMaterialSlot(tnsObject* o);
 tnsMaterialSlot* tnsNewMaterialSlot(tnsObject* o);
+void tnsRemoveMaterial(tnsMaterial* mat);
 void tnsRemoveMaterialSlot(tnsObject* o, tnsMaterialSlot* ms);
 void tnsRemoveMaterialSlot(tnsObject* o, tnsMaterialSlot* ms);
 void tnsAssignMaterialSlot(tnsObject* o, tnsMaterialSlot* ms);
 void tnsAssignMaterialSlot(tnsObject* o, tnsMaterialSlot* ms);
 
 

+ 4 - 4
la_tns_kernel.c

@@ -1738,9 +1738,10 @@ void tnsConfigure2DTexture(tnsTexture *t){
         int isDepth=t->GLTexBitsType==GL_DEPTH_COMPONENT||t->GLTexBitsType==GL_DEPTH_COMPONENT16||
         int isDepth=t->GLTexBitsType==GL_DEPTH_COMPONENT||t->GLTexBitsType==GL_DEPTH_COMPONENT16||
             t->GLTexBitsType==GL_DEPTH_COMPONENT24||t->GLTexBitsType==GL_DEPTH_COMPONENT32F;
             t->GLTexBitsType==GL_DEPTH_COMPONENT24||t->GLTexBitsType==GL_DEPTH_COMPONENT32F;
         int format=isDepth?GL_DEPTH_COMPONENT:(t->GLTexBitsType==GL_R8?GL_RED:(t->GLTexBitsType==GL_RG8?GL_RG:(t->GLTexBitsType==GL_RGB8?GL_RGB:GL_RGBA)));
         int format=isDepth?GL_DEPTH_COMPONENT:(t->GLTexBitsType==GL_R8?GL_RED:(t->GLTexBitsType==GL_RG8?GL_RG:(t->GLTexBitsType==GL_RGB8?GL_RGB:GL_RGBA)));
-        int type=GL_UNSIGNED_BYTE;
-        if(t->GLTexBitsType==GL_DEPTH_STENCIL){ format=GL_DEPTH_STENCIL; type=GL_UNSIGNED_INT_24_8; }
+        int type=isDepth?GL_UNSIGNED_INT:GL_UNSIGNED_BYTE;
+        if(t->GLTexBitsType==GL_DEPTH_STENCIL){ format=GL_DEPTH_STENCIL; type=GL_UNSIGNED_INT_24_8; t->GLTexBitsType=GL_DEPTH24_STENCIL8; }
 #ifndef LAGUI_ANDROID
 #ifndef LAGUI_ANDROID
+        if(isDepth){t->GLTexBitsType=GL_DEPTH_COMPONENT24; type=GL_UNSIGNED_INT;}
         if(t->Multisample) glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, t->Multisample, t->GLTexBitsType, t->Width, t->Height, GL_TRUE);
         if(t->Multisample) glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, t->Multisample, t->GLTexBitsType, t->Width, t->Height, GL_TRUE);
 #endif
 #endif
         else{ glTexImage2D(GL_TEXTURE_2D, 0, t->GLTexBitsType, t->Width, t->Height, 0, format, type, 0);
         else{ glTexImage2D(GL_TEXTURE_2D, 0, t->GLTexBitsType, t->Width, t->Height, 0, format, type, 0);
@@ -2796,7 +2797,6 @@ int tnsLoadSystemFont(char* from, char* name){
         FT_Face face; FT_Long i,num_faces; FT_Open_Args args; args.flags=FT_OPEN_MEMORY;
         FT_Face face; FT_Long i,num_faces; FT_Open_Args args; args.flags=FT_OPEN_MEMORY;
         args.memory_base=fontdata; args.memory_size=filesize;
         args.memory_base=fontdata; args.memory_size=filesize;
         if(FT_Open_Face(f->ftlib, &args, -1, &face )) continue;
         if(FT_Open_Face(f->ftlib, &args, -1, &face )) continue;
-        logPrintNew("stream %d",fontfile);
         num_faces = face->num_faces; FT_Done_Face(face); int found=0;
         num_faces = face->num_faces; FT_Done_Face(face); int found=0;
         for(int fa=0;fa<num_faces;fa++){
         for(int fa=0;fa<num_faces;fa++){
             if(FT_Open_Face(f->ftlib,&args,fa,&face)){ continue; }
             if(FT_Open_Face(f->ftlib,&args,fa,&face)){ continue; }
@@ -4502,7 +4502,7 @@ void tnsAssignMaterialSlot(tnsObject* o, tnsMaterialSlot* ms){
         }
         }
     }
     }
 }
 }
-
+void tns_InvalidateMeshWithMaterial(tnsMaterial* m);
 void tnsRefreshMaterialLibraries(){
 void tnsRefreshMaterialLibraries(){
     strSafeDestroy(&T->World->MaterialLibraries);
     strSafeDestroy(&T->World->MaterialLibraries);
     for(tnsMaterial* mat=T->World->Materials.pFirst;mat;mat=mat->Item.pNext){
     for(tnsMaterial* mat=T->World->Materials.pFirst;mat;mat=mat->Item.pNext){

+ 1 - 1
la_util.h

@@ -31,7 +31,7 @@
 #include <android/window.h>             // Required for: AWINDOW_FLAG_FULLSCREEN definition and others
 #include <android/window.h>             // Required for: AWINDOW_FLAG_FULLSCREEN definition and others
 #include <android_native_app_glue.h>    // Required for: android_app struct and activity management
 #include <android_native_app_glue.h>    // Required for: android_app struct and activity management
 #include <jni.h>                        // Required for: JNIEnv and JavaVM [Used in OpenURL()]
 #include <jni.h>                        // Required for: JNIEnv and JavaVM [Used in OpenURL()]
-#include <GLES3/gl3.h>
+#include <GLES3/gl32.h>
 #include <stdio.h>
 #include <stdio.h>
 #define fopen(name, mode) android_fopen(name, mode)
 #define fopen(name, mode) android_fopen(name, mode)
 FILE *android_fopen(const char *fileName, const char *mode);
 FILE *android_fopen(const char *fileName, const char *mode);

+ 1 - 0
resources/la_modelling.c

@@ -2015,6 +2015,7 @@ int OPCHK_RefreshMaterialShader(laPropPack *This, laStringSplitor *ss){
         if(la_EnsureSubTarget(This->LastPs->p,This->EndInstance)==TNS_PC_MATERIAL){ return 1; }
         if(la_EnsureSubTarget(This->LastPs->p,This->EndInstance)==TNS_PC_MATERIAL){ return 1; }
     } return 0;
     } return 0;
 }
 }
+void tns_InvalidateMeshWithMaterial(tnsMaterial* m);
 int OPINV_RefreshMaterialShader(laOperator *a, laEvent *e){
 int OPINV_RefreshMaterialShader(laOperator *a, laEvent *e){
     if(!a->This || !a->This->EndInstance){ return LA_FINISHED; }
     if(!a->This || !a->This->EndInstance){ return LA_FINISHED; }
     tnsMaterial* m=a->This->EndInstance;
     tnsMaterial* m=a->This->EndInstance;

+ 6 - 5
resources/la_nodes_basic.c

@@ -1066,6 +1066,7 @@ laNodeRack* la_NewRackAfter(laRackPage* parent,laNodeRack* rr){
     strSafeSet(&r->Name,"New Rack");
     strSafeSet(&r->Name,"New Rack");
     if(rr) lstInsertItemAfter(&parent->Racks,r,rr); else lstPushItem(&parent->Racks, r);
     if(rr) lstInsertItemAfter(&parent->Racks,r,rr); else lstPushItem(&parent->Racks, r);
     r->ParentPage=parent; r->RackType=parent->RackType;
     r->ParentPage=parent; r->RackType=parent->RackType;
+    return r;
 }
 }
 int OPINV_MoveNodeToRack(laOperator* a, laEvent *e){
 int OPINV_MoveNodeToRack(laOperator* a, laEvent *e){
     laBaseNode* n=a->This?a->This->EndInstance:0; if(!n||!n->InRack) return LA_CANCELED;
     laBaseNode* n=a->This?a->This->EndInstance:0; if(!n||!n->InRack) return LA_CANCELED;
@@ -1509,11 +1510,11 @@ typedef laMathNode laSmallMathNode;
     LA_IDN_REGISTER("Loop",0,LA_IDN_LOOP,LA_PC_IDN_LOOP, IDN_Loop, laLoopNode);
     LA_IDN_REGISTER("Loop",0,LA_IDN_LOOP,LA_PC_IDN_LOOP, IDN_Loop, laLoopNode);
     LA_IDN_REGISTER("Loop Index",0,LA_IDN_LOOP_INDEX,LA_PC_IDN_LOOP_INDEX, IDN_LoopIndex, laLoopIndexNode);
     LA_IDN_REGISTER("Loop Index",0,LA_IDN_LOOP_INDEX,LA_PC_IDN_LOOP_INDEX, IDN_LoopIndex, laLoopIndexNode);
 
 
-    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_INPUT, &LA_IDN_KEYBOARD,&LA_IDN_CONTROLLER,0);
-    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_MATH, &LA_IDN_MATH, &LA_IDN_SMALL_MATH,&LA_IDN_VECTOR_MATH,&LA_IDN_MAPPER,&LA_IDN_RANDOM,&LA_IDN_MATRIX, &LA_IDN_VALUES,0);
-    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_ROUTE, &LA_IDN_SPLIT, &LA_IDN_SWITCH, &LA_IDN_COMBINE, &LA_IDN_LOOP, &LA_IDN_LOOP_INDEX,0);
-    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_AUX, &LA_IDN_COMMENT, &LA_IDN_VISUALIZER,0);
-    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_COLOR, &LA_IDN_RGB2OKHSL, &LA_IDN_OKHSL2RGB,0);
+    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_INPUT, &LA_IDN_KEYBOARD,&LA_IDN_CONTROLLER,0LL);
+    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_MATH, &LA_IDN_MATH, &LA_IDN_SMALL_MATH,&LA_IDN_VECTOR_MATH,&LA_IDN_MAPPER,&LA_IDN_RANDOM,&LA_IDN_MATRIX, &LA_IDN_VALUES,0LL);
+    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_ROUTE, &LA_IDN_SPLIT, &LA_IDN_SWITCH, &LA_IDN_COMBINE, &LA_IDN_LOOP, &LA_IDN_LOOP_INDEX,0LL);
+    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_AUX, &LA_IDN_COMMENT, &LA_IDN_VISUALIZER,0LL);
+    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_COLOR, &LA_IDN_RGB2OKHSL, &LA_IDN_OKHSL2RGB,0LL);
 
 
     MAIN.tNodeIn=laCreateInSocket("TIN",0);
     MAIN.tNodeIn=laCreateInSocket("TIN",0);
     MAIN.tNodeOut=laCreateOutSocket(0,"TOUT",0);
     MAIN.tNodeOut=laCreateOutSocket(0,"TOUT",0);

+ 1 - 1
resources/la_operators.c

@@ -369,7 +369,7 @@ laFileBrowser *la_FileBrowserInit(laOperator *a){
     laFileBrowser *fb = memAcquire(sizeof(laFileBrowser));
     laFileBrowser *fb = memAcquire(sizeof(laFileBrowser));
     char* arg=0;
     char* arg=0;
 
 
-    strcpy(fb->Path, MAIN.WorkingDirectory->Ptr);
+    strcpy(fb->Path, SSTR(MAIN.WorkingDirectory));
 
 
     if (strArgumentMatch(a->ExtraInstructionsP, "select", "folder")){ fb->SelectFolder = LA_FILE_SELECT_FOLDER; }
     if (strArgumentMatch(a->ExtraInstructionsP, "select", "folder")){ fb->SelectFolder = LA_FILE_SELECT_FOLDER; }
     if (strArgumentMatch(a->ExtraInstructionsP, "warn_file_exists", "true")){ fb->WarnFileExists = 1; }
     if (strArgumentMatch(a->ExtraInstructionsP, "warn_file_exists", "true")){ fb->WarnFileExists = 1; }

+ 5 - 0
resources/la_properties.c

@@ -485,6 +485,7 @@ void laread_ConditionNodePropPath(laUiConditionNode *ucn, char *Content, char**
 void lapost_ConditionNode(laUiConditionNode *ucn){
 void lapost_ConditionNode(laUiConditionNode *ucn){
     lapost_PropPack(&ucn->PP);
     lapost_PropPack(&ucn->PP);
 }
 }
+void la_ConditionNodeFreeRecursive(laUiConditionNode *ucn);
 void laset_ConditionNodeType(laUiConditionNode *ucn, int Type){
 void laset_ConditionNodeType(laUiConditionNode *ucn, int Type){
     ucn->Type = Type;
     ucn->Type = Type;
     switch (Type){
     switch (Type){
@@ -667,6 +668,7 @@ void lapost_Window(laWindow *w){
     laStartWindow(w);
     laStartWindow(w);
 }
 }
 int la_CreateSystemWindow(laWindow *window, int synctovbank);
 int la_CreateSystemWindow(laWindow *window, int synctovbank);
+void la_AssignWindowPP(laWindow* w);
 void lapostim_Window(laWindow *w){
 void lapostim_Window(laWindow *w){
     w->IsFullScreen=0;
     w->IsFullScreen=0;
     la_CreateSystemWindow(w,MAIN.Windows.pFirst==MAIN.Windows.pLast);
     la_CreateSystemWindow(w,MAIN.Windows.pFirst==MAIN.Windows.pLast);
@@ -686,6 +688,7 @@ void lapost_UiItem(laUiItem *ui){
     lapost_PropPack(&ui->PP);
     lapost_PropPack(&ui->PP);
     //if(ui->Type == _LA_UI_CANVAS) ui->Type->Init(ui);
     //if(ui->Type == _LA_UI_CANVAS) ui->Type->Init(ui);
 }
 }
+void la_AssignPropExtras(laUiItem* ui);
 void lapostim_UiItem(laUiItem *ui){
 void lapostim_UiItem(laUiItem *ui){
     if (ui->Type && ui->Type->Init && ui->Type != _LA_UI_CANVAS && ui->Type != &_LA_UI_CONDITION) ui->Type->Init(ui);
     if (ui->Type && ui->Type->Init && ui->Type != _LA_UI_CANVAS && ui->Type != &_LA_UI_CONDITION) ui->Type->Init(ui);
     ui->State = ui->State ? ui->State : (ui->Type ? LA_UI_NORMAL : 0);
     ui->State = ui->State ? ui->State : (ui->Type ? LA_UI_NORMAL : 0);
@@ -725,6 +728,7 @@ void lapost_Panel(laPanel *p){
     XSync(MAIN.dpy,0);
     XSync(MAIN.dpy,0);
 #endif
 #endif
 }
 }
+void la_AssignBlockPP(laBlock* b);
 void lapost_Block(laBlock *b){
 void lapost_Block(laBlock *b){
     la_AssignBlockPP(b);
     la_AssignBlockPP(b);
 }
 }
@@ -771,6 +775,7 @@ void laread_DetachedPropPath(laProp *p, char *content){
     p->DetachedPP.Go = CreateNewBuffer(char, 128);
     p->DetachedPP.Go = CreateNewBuffer(char, 128);
     strcpy(p->DetachedPP.Go, content);
     strcpy(p->DetachedPP.Go, content);
 }
 }
+int la_GetPropertySize(int Type);
 void lapost_DetachedProp(laProp *Prop){
 void lapost_DetachedProp(laProp *Prop){
     laPropContainer *pc = 0;
     laPropContainer *pc = 0;
     laSubProp *np = 0;
     laSubProp *np = 0;

+ 4 - 3
resources/la_templates.c

@@ -1216,11 +1216,12 @@ void laui_RackPage(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn
     }laEndCondition(uil,b);
     }laEndCondition(uil,b);
 }
 }
 void laui_NodeCategory(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
 void laui_NodeCategory(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
-    laColumn* c=laFirstColumn(uil); laNodeCategory* nc=This->EndInstance;
+    laColumn* c=laFirstColumn(uil); laNodeCategory* nc=This?This->EndInstance:0; if(!nc){ return; }
     if(nc->Ui){ nc->Ui(uil,This,Extra,0,context); return; }
     if(nc->Ui){ nc->Ui(uil,This,Extra,0,context); return; }
-    char buf[256];
+    char buf[512]={0};
     for(laListItemPointer* lip=nc->NodeTypes.pFirst;lip;lip=lip->pNext){
     for(laListItemPointer* lip=nc->NodeTypes.pFirst;lip;lip=lip->pNext){
-        laBaseNodeType* nt=lip->p; sprintf(buf,"feedback=%s;text=%s;icon=%lc;",nt->TypeName,nt->Name,nt->Icon?nt->Icon:' ');
+        laBaseNodeType* nt=lip->p; logPrintNew("%d",nt);
+        sprintf(buf,"feedback=%s;text=%s;icon=%lc;",nt->TypeName?nt->TypeName:" ",nt->Name?nt->Name:" ",nt->Icon?nt->Icon:L' ');
         laShowItemFull(uil,c,0,"LA_confirm",0,buf,0,0);
         laShowItemFull(uil,c,0,"LA_confirm",0,buf,0,0);
     }
     }
 }
 }

+ 2 - 2
resources/la_tns_drivers.c

@@ -320,7 +320,7 @@ void tns_RegisterNodes(){
     LA_IDN_REGISTER("Make Transform",0,TNS_IDN_MAKE_TRANSFORM,TNS_PC_IDN_MAKE_TRANSFORM, IDN_MakeTransform, tnsMakeTransformNode);
     LA_IDN_REGISTER("Make Transform",0,TNS_IDN_MAKE_TRANSFORM,TNS_PC_IDN_MAKE_TRANSFORM, IDN_MakeTransform, tnsMakeTransformNode);
     LA_IDN_REGISTER("Action Player",0,TNS_IDN_ACTION_PLAYER,TNS_PC_IDN_ACTION_PLAYER, IDN_ActionPlayer, tnsActionPlayerNode);
     LA_IDN_REGISTER("Action Player",0,TNS_IDN_ACTION_PLAYER,TNS_PC_IDN_ACTION_PLAYER, IDN_ActionPlayer, tnsActionPlayerNode);
 
 
-    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_MATH, &TNS_IDN_MAKE_TRANSFORM,0);
-    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_DRIVER, &TNS_IDN_TRANSFORM, &TNS_IDN_ACTION_PLAYER,0);
+    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_MATH, &TNS_IDN_MAKE_TRANSFORM,0LL);
+    laNodeCategoryAddNodeTypes(LA_NODE_CATEGORY_DRIVER, &TNS_IDN_TRANSFORM, &TNS_IDN_ACTION_PLAYER,0LL);
 }
 }
 
 

+ 2 - 2
resources/la_widgets_viewers.c

@@ -94,7 +94,7 @@ void la_RootObjectDraw(laBoxedTheme *bt, tnsObject *root, laUiItem* ui){
 
 
     if (!e->OffScr){
     if (!e->OffScr){
         //e->OffScr = tnsCreateDeferredOffscreen(W,H,MAIN.PanelMultisample);
         //e->OffScr = tnsCreateDeferredOffscreen(W,H,MAIN.PanelMultisample);
-        e->OffScr = tnsCreate2DOffscreen(GL_RGBA, W, H, MAIN.PanelMultisample ,1, 1);
+        e->OffScr = tnsCreate2DOffscreen(GL_RGBA, W, H, MAIN.PanelMultisample ,1, 0);
     }else{ tnsEnsureOffscreenStatus(e->OffScr, ui->R - ui->L, ui->B - ui->U); }
     }else{ tnsEnsureOffscreenStatus(e->OffScr, ui->R - ui->L, ui->B - ui->U); }
 
 
     if (0){//(e->CurrentScene && e->CurrentScene->ActiveSun){
     if (0){//(e->CurrentScene && e->CurrentScene->ActiveSun){
@@ -161,7 +161,7 @@ void la_RootObjectDraw(laBoxedTheme *bt, tnsObject *root, laUiItem* ui){
     //    tnsClearAll();
     //    tnsClearAll();
     //}
     //}
 
 
-    tnsDrawToOffscreen(e->OffScr,3,TNS_ATTACHMENT_ARRAY_0_1_2);
+    tnsDrawToOffscreen(e->OffScr,1,TNS_ATTACHMENT_ARRAY);
     //tnsDrawToOffscreen(e->DeferredOffScr,3,TNS_ATTACHMENT_ARRAY_0_1_2);
     //tnsDrawToOffscreen(e->DeferredOffScr,3,TNS_ATTACHMENT_ARRAY_0_1_2);
     tnsViewportWithScissor(0, 0, W, H); glDepthMask(GL_TRUE);
     tnsViewportWithScissor(0, 0, W, H); glDepthMask(GL_TRUE);
     tnsClearColorv(laThemeColor(bt,LA_BT_NORMAL)); tnsClearAll(); float gpos_clear[]={-1e20, -1e20, -1e20, 0};
     tnsClearColorv(laThemeColor(bt,LA_BT_NORMAL)); tnsClearAll(); float gpos_clear[]={-1e20, -1e20, -1e20, 0};