*/}}
Browse Source

Outliner and etc.

YimingWu 1 year ago
parent
commit
f8062a31aa
6 changed files with 83 additions and 11 deletions
  1. 2 0
      la_interface.h
  2. 11 7
      la_kernel.c
  3. 2 1
      la_tns_kernel.c
  4. 23 2
      resources/la_modelling.c
  5. 2 1
      resources/la_properties.c
  6. 43 0
      resources/la_templates.c

+ 2 - 0
la_interface.h

@@ -1730,6 +1730,8 @@ void tnsui_MeshObjectProperties(laUiList *uil, laPropPack *This, laPropPack *UNU
 void tnsui_InstancerObjectProperties(laUiList *uil, laPropPack *This, laPropPack *UNUSED_Extra, laColumn *UNUSED_Colums, int context);
 void tnsui_BaseObjectProperties(laUiList *uil, laPropPack *This, laPropPack *UNUSED_Extra, laColumn *UNUSED_Colums, int context);
 
+void tnsui_DefaultObjectPropUiDefine(laUiList *uil, laPropPack *This, laPropPack *OperatorProps, laColumn *UNUSED, int context);
+
 int OPINV_UiItem(laOperator *a, laEvent *e);
 int OPEXT_UiItem(laOperator *a, int ExitCode);
 

+ 11 - 7
la_kernel.c

@@ -3788,11 +3788,12 @@ laUiItem *laShowCanvas(laUiList *uil, laColumn *c, laPropPack *Base, const char
 laUiItem *laShow3DCanvasCombo(laUiList *uil, laColumn *c, laPropPack *Base, const char *Path, int Height, laPropPack* Detached){
     laUiItem* ui=0;
 #define ADD_CANVAS \
-    laUiItem* b3=laOnConditionThat(uil,c,laPropExpression(&rb->PP,"active"));{\
-        laUiItem* b=laBeginRow(uil,cr,0,0);\
+    laUiItem* b=laBeginRow(uil,cr,0,0);\
+    laUiItem* b3=laOnConditionThat(uil,cr,laPropExpression(&rb->PP,"active"));{\
         laShowLabel(uil,cr,"⯈",0,0); laShowItem(uil,cr,&rb->PP,"active.name")->Flags|=LA_UI_FLAGS_NO_DECAL;\
-        laEndRow(uil,b);\
-    }laEndCondition(uil,b3);
+    }laEndCondition(uil,b3);\
+    laEndRow(uil,b);
+    
     if(Detached){
         laColumn* cl,*cll,*clr,*cr;
         laSplitColumn(uil,c,0.35); cl=laLeftColumn(c,7); cr=laRightColumn(c,0);
@@ -4174,7 +4175,7 @@ int la_DoExpression(laUiConditionNode *Expression, int *IResult, real *FResult,
     void *Ptr1 = 0, *Ptr2 = 0;
     char Str1[128], Str2[128]={0}; char* StrResult=_StrResult;
     int Result1, Result2;
-    laEnumItem *ei;
+    laEnumItem *ei; laSubProp*sp;
 
     if (!Expression) return 0;
 
@@ -4215,8 +4216,11 @@ int la_DoExpression(laUiConditionNode *Expression, int *IResult, real *FResult,
             break;
         case LA_PROP_SUB:
             if (!Expression->PP.Go) Instance = Expression->PP.EndInstance;
-            else
-                Instance = laGetActiveInstance(Expression->PP.LastPs->p, Expression->PP.LastPs->UseInstance, &pi);
+            else Instance = laGetActiveInstance(Expression->PP.LastPs->p, Expression->PP.LastPs->UseInstance, &pi);
+            if(!Instance){ sp=Expression->PP.LastPs->p; if((!sp->GetActive) && (sp->Base.Offset<=0)){ 
+                    Instance=laGetInstance(sp,Expression->PP.LastPs->UseInstance, &pi);
+                }
+            }
             *PtrResult = Instance;
             if (Instance) return 1;
             break;

+ 2 - 1
la_tns_kernel.c

@@ -3464,7 +3464,7 @@ tnsObject *tnsCreateRootObject(char *name){
 void tnsDestroyRootObject(tnsObject *root){
     tnsWorld *w = T->World;
     tnsObject *o, *NextO;
-    w->ActiveRoot = root->Item.pPrev ? root->Item.pPrev : root->Item.pNext ? root->Item.pNext : 0;
+    memAssignRef(w,&w->ActiveRoot,root->Item.pPrev ? root->Item.pPrev : root->Item.pNext ? root->Item.pNext : 0);
 
     tnsFreeEvaluatedArray(&root->Evaluated);
 
@@ -3882,6 +3882,7 @@ void tnsDrawLayer(tnsEvaluateData* ed,int Layer,void* CustomData){
     }
 }
 void tnsDrawObjectTree(tnsObject* from, int Layers,void* CustomData){
+    if(!from) return;
     tnsEvaluateData* ed=&from->Evaluated; if(!ed->Done) return;
     if(Layers&TNS_EVAL_LAYER_SOLID){ tnsDrawLayer(ed,TNS_EVAL_LAYER_SOLID,CustomData); }
     if(Layers&TNS_EVAL_LAYER_OUTLINE){ tnsDrawLayer(ed,TNS_EVAL_LAYER_OUTLINE,CustomData);}

+ 23 - 2
resources/la_modelling.c

@@ -1607,10 +1607,31 @@ void laui_Merge(laUiList *uil, laPropPack *pp, laPropPack *actinst, laColumn *ex
 }
 
 
+int OPINV_NewRootObject(laOperator *a, laEvent *e){
+    tnsCreateRootObject("Root"); laNotifyUsers("tns.world.root_objects"); laNotifyUsers("tns.world.active_root");
+    return LA_FINISHED;
+}
+int OPCHK_RemoveRootObjects(laPropPack *This, laStringSplitor *ss){
+    if(This && This->EndInstance){
+        if(la_EnsureSubTarget(This->LastPs->p,0)!=TNS_PC_OBJECT_GENERIC) return 0;
+        if(((tnsObject*)This->EndInstance)->Type!=TNS_OBJECT_ROOT) return 0;
+    }else{ if(!T->World->ActiveRoot) return 0; }
+    return 1;
+}
+int OPINV_RemoveRootObject(laOperator *a, laEvent *e){
+    if(a->This && a->This->EndInstance){ tnsDestroyRootObject(a->This->EndInstance); }
+    else{ tnsDestroyRootObject(T->World->ActiveRoot); }
+    laNotifyUsers("tns.world.root_objects"); laNotifyUsers("tns.world.active_root");
+    return LA_FINISHED;
+}
+
+
 void la_RegisterModellingOperators(){
     laPropContainer *pc; laProp *p;
-    laOperatorType *at;
-    laEnumProp *ep;
+    laOperatorType *at; laEnumProp *ep;
+
+    laCreateOperatorType("M_new_root", "New Root", "Create a new root object", 0, 0, 0, OPINV_NewRootObject, 0, '+', 0);
+    laCreateOperatorType("M_remove_root", "Remove Root", "Remove root object", OPCHK_RemoveRootObjects, 0, 0, OPINV_RemoveRootObject, 0 ,L'🗴', 0);
 
     laCreateOperatorType("M_set_cursor", "Set Cursor", "Set cursor in the viewport", OPCHK_ViewportAndSceneExists, 0, 0, OPINV_SetCursor, 0, 0, LA_EXTRA_TO_PANEL);
     laCreateOperatorType("M_toggle_edit_mode", "Toggle Edit Mode", "Toggle edit mode of the active object", OPCHK_ThereIsActiveObject, 0, 0, OPINV_ToggleEdit, 0, 0, 0);

+ 2 - 1
resources/la_properties.c

@@ -983,7 +983,7 @@ void la_RegisterTNSProps(){
     }
 
     p = laAddPropertyContainer("tns_object", "Object", "3D Object Item", 0,tnsui_BaseObjectProperties,sizeof(tnsObject), tnspost_Object, 0,2);{
-        laPropContainerExtraFunctions(p,0,0,0,tnspropagate_Object,0);
+        laPropContainerExtraFunctions(p,0,0,0,tnspropagate_Object,tnsui_DefaultObjectPropUiDefine);
         laContainerAnimationFunctions(p,laaction_VerifyRootObject);
         TNS_PC_OBJECT_GENERIC=p;
         laAddStringProperty(p, "name", "Object Name", "The Name Of The Object", 0,0,0,0,1, offsetof(tnsObject, Name), 0,0,0,0,LA_AS_IDENTIFIER);
@@ -1026,6 +1026,7 @@ void la_RegisterTNSProps(){
         laAddSubGroup(p, "__actions__", "Actions", "Animation actions", "la_animation_action",0,0,0,-1,0,laget_CurrentAnimationAction,0,laset_CurrentAnimationAction,0,0,offsetof(tnsObject, Actions), 0);
         laAddSubGroup(p, "drivers", "Drivers", "Driver page collection","la_driver_collection",0,0,0,offsetof(tnsObject,Drivers),0,0,0,0,0,0,0,LA_UDF_SINGLE|LA_HIDE_IN_SAVE);
         laAddOperatorProperty(p, "add_driver_page", "Add Page", "Add a driver page","LA_add_driver_page",'+',0);
+        laAddOperatorProperty(p, "remove_root", "Remove root", "Remove the root node","M_remove_root",L'🗴',0);
     }
     p = laAddPropertyContainer("tns_instancer", "Instancer", "Instance placeholder object", U'📎', tnsui_InstancerObjectProperties,sizeof(tnsInstancer), 0,0,2);{
         laPropContainerExtraFunctions(p,0,0,tnstouched_Object,0/*tnspropagate_Object*/,0);

+ 43 - 0
resources/la_templates.c

@@ -1736,6 +1736,48 @@ void tnsui_ScenePanel(laUiList *uil, laPropPack *This, laPropPack *DetachedProps
 }
 
 
+void tnsui_ObjectHierachy(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context);
+void tnsui_ChildObjectHierachy(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
+    laColumn* c=laFirstColumn(uil); laShowItemFull(uil,c,This,"object",0,0,tnsui_ObjectHierachy,1)
+        ->Flags|=LA_UI_FLAGS_NO_DECAL|LA_UI_FLAGS_NO_GAP|LA_UI_COLLECTION_NO_HIGHLIGHT;
+}
+void tnsui_ObjectHierachy(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
+    laColumn* c=laFirstColumn(uil),*cl,*cr; laSplitColumn(uil,c,0.5); cl=laLeftColumn(c,1); cr=laRightColumn(c,0);
+    laUiItem* r=laBeginRow(uil,cr,0,0);
+    laShowItemFull(uil,cr,This,"name",0,0,0,0)->Flags|=LA_UI_FLAGS_NO_DECAL;
+    laEndRow(uil,r);
+    char* prop=context?"base.children":"children";
+    laUiItem* b2=laOnConditionThat(uil,cl,laPropExpression(This,prop));{
+        laUiItem* b=laOnConditionToggle(uil,cl,0,0,0,0,0);{ b->Flags|=LA_UI_FLAGS_NO_DECAL;
+            b->State=LA_UI_ACTIVE;
+            laShowItemFull(uil,cr,This,prop,0,0,tnsui_ChildObjectHierachy,0)
+                ->Flags|=LA_UI_FLAGS_NO_DECAL|LA_UI_FLAGS_NO_GAP|LA_UI_COLLECTION_NO_HIGHLIGHT;
+        }laEndCondition(uil,b);
+    }laEndCondition(uil,b2);
+}
+void tnsui_WorldHierachy(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *UNUSED, int context){
+    laColumn* c=laFirstColumn(uil),*gc; laUiList* gu;
+    laUiItem* r=laBeginRow(uil,c,0,0);
+    gu=laMakeMenuPage(uil,c,"Menu");{  gc=laFirstColumn(gu);
+        laShowItem(gu,gc,0,"M_new_root");
+    }
+    laEndRow(uil,r);
+    laUiItem* g=laMakeEmptyGroup(uil,c,"Hierachy",0);{ gu=g->Page; gc=laFirstColumn(gu);
+        gu->HeightCoeff=-1; //g->Flags|=LA_UI_FLAGS_NO_DECAL;
+        laShowItemFull(gu,gc,0,"tns.world.root_objects",0,0,tnsui_ObjectHierachy,0)->Flags|=LA_UI_FLAGS_NO_DECAL;
+    }
+}
+void tnsui_DefaultObjectPropUiDefine(laUiList *uil, laPropPack *This, laPropPack *OperatorProps, laColumn *UNUSED, int context){
+    laColumn* c=laFirstColumn(uil);
+    char* prop=context?"base":"";
+    laUiItem* base=laShowInvisibleItem(uil,c,This,prop);
+    laShowItemFull(uil, c, &base->PP, "name",LA_WIDGET_STRING_PLAIN,0,0,0);
+    laShowItemFull(uil, c, &base->PP, "remove_root",0,0,0,0);
+    laShowItemFull(uil, c, 0, "M_new_root",0,0,0,0);
+}
+
+
+
 void la_RegisterBuiltinTemplates(){
     int obj=MAIN.InitArgs.HasWorldObjects;
     int tex=MAIN.InitArgs.HasTextureInspector;
@@ -1745,6 +1787,7 @@ void la_RegisterBuiltinTemplates(){
             laRegisterUiTemplate("LAUI_input_mapper","Input Mapper",laui_InputMapper,0,0,"Controlling",0,0,0);
             laRegisterUiTemplate("LAUI_controllers", "Controllers", laui_GameController, lauidetached_GameController, 0,0,0,0,0);
     if(obj) laRegisterUiTemplate("LAUI_scene", "Scene", tnsui_ScenePanel, tnsui_DetachedScenePanel, 0, 0, 0,25,25);
+    if(obj) laRegisterUiTemplate("LAUI_world_hierachy","World",tnsui_WorldHierachy,0,0,0,0,0,0);
     if(obj) laRegisterUiTemplate("LAUI_object_properties", "Properties", tnsui_ObjectProperties, tnsuidetached_ObjectProperties, 0, 0, 0,15,25);
     if(act) laRegisterUiTemplate("LAUI_animation_actions", "Actions", laui_AnimationActions, 0, 0, 0, 0,15,25);
     if(act) laRegisterUiTemplate("LAUI_animation_action_channels", "Action Channels", laui_AnimationActionChannels, 0, 0, 0, 0,20,15);