|  | @@ -131,11 +131,11 @@ void la_RootObjectDraw(laBoxedTheme *bt, tnsObject *root, laUiItem* ui){
 | 
											
												
													
														|  |      tnsEnableShaderv(T->immShader);
 |  |      tnsEnableShaderv(T->immShader);
 | 
											
												
													
														|  |      tnsUnbindTexture(); tnsUniformUseTexture(T->immShader,0,0); tnsUseMultiplyColor(0);
 |  |      tnsUnbindTexture(); tnsUniformUseTexture(T->immShader,0,0); tnsUseMultiplyColor(0);
 | 
											
												
													
														|  |      glPointSize(6); glLineWidth(3);
 |  |      glPointSize(6); glLineWidth(3);
 | 
											
												
													
														|  | -    tnsDrawObjectTree(root, 0, 0);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    tnsDrawObjectTree(root, 0, 0, e->SelectMode);
 | 
											
												
													
														|  |      glPointSize(1); glLineWidth(10);
 |  |      glPointSize(1); glLineWidth(10);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      glDepthMask(GL_FALSE); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //glEnable(GL_POLYGON_OFFSET_LINE); glPolygonOffset(1,1);
 |  |      glDepthMask(GL_FALSE); glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); //glEnable(GL_POLYGON_OFFSET_LINE); glPolygonOffset(1,1);
 | 
											
												
													
														|  | -    tnsDrawObjectTree(root, e->ActiveObject, 1);
 |  | 
 | 
											
												
													
														|  | 
 |  | +    tnsDrawObjectTree(root, root->Active, 1, 0);
 | 
											
												
													
														|  |      glDepthMask(GL_TRUE); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 |  |      glDepthMask(GL_TRUE); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
 | 
											
												
													
														|  |      glLineWidth(1);
 |  |      glLineWidth(1);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -430,9 +430,14 @@ void laDefault3DViewOverlay(laUiItem *ui){
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      laShowColumnAdjuster(uil, c);
 |  |      laShowColumnAdjuster(uil, c);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +    b=laBeginRow(uil,cl,0,0);
 | 
											
												
													
														|  | 
 |  | +    laShowItem(uil,cl,&ui->ExtraPP,"select_mode")->Flags|=LA_UI_FLAGS_EXPAND;
 | 
											
												
													
														|  | 
 |  | +    laShowItem(uil,cl,&ui->ExtraPP,"select_through");
 | 
											
												
													
														|  | 
 |  | +    laEndRow(uil,b);
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      b=laBeginRow(uil,cl,0,0);
 |  |      b=laBeginRow(uil,cl,0,0);
 | 
											
												
													
														|  |      laShowLabel(uil,cl,"Active Object: ",0,0);
 |  |      laShowLabel(uil,cl,"Active Object: ",0,0);
 | 
											
												
													
														|  | -    laShowItem(uil,cl,&ui->ExtraPP,"active_object.identifier")->Flags|=LA_UI_FLAGS_PLAIN;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    laShowItem(uil,cl,&ui->PP,"identifier")->Flags|=LA_UI_FLAGS_PLAIN;
 | 
											
												
													
														|  |      laEndRow(uil,b);
 |  |      laEndRow(uil,b);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      g = laMakeFoldableGroup(uil, cr, "Scene Info", 0, 1);{
 |  |      g = laMakeFoldableGroup(uil, cr, "Scene Info", 0, 1);{
 | 
											
										
											
												
													
														|  | @@ -451,11 +456,11 @@ void laDefault3DViewOverlay(laUiItem *ui){
 | 
											
												
													
														|  |          laSplitColumn(gu, gc, 0.35);
 |  |          laSplitColumn(gu, gc, 0.35);
 | 
											
												
													
														|  |          gcl = laLeftColumn(gc, 0);
 |  |          gcl = laLeftColumn(gc, 0);
 | 
											
												
													
														|  |          gcr = laRightColumn(gc, 0);
 |  |          gcr = laRightColumn(gc, 0);
 | 
											
												
													
														|  | -        laShowItem(gu, gc, e, "active_object.name");
 |  | 
 | 
											
												
													
														|  | -        laShowLabel(gu, gcl, "Location:", 0, 0);laShowItem(gu, gcr, e, "active_object.location")->Flags|=LA_UI_FLAGS_TRANSPOSE;
 |  | 
 | 
											
												
													
														|  | 
 |  | +        laShowItem(gu, gc, &ui->PP, "active.name");
 | 
											
												
													
														|  | 
 |  | +        laShowLabel(gu, gcl, "Location:", 0, 0);laShowItem(gu, gcr, &ui->PP, "active.location")->Flags|=LA_UI_FLAGS_TRANSPOSE;
 | 
											
												
													
														|  |          laShowSeparator(gu,gc);
 |  |          laShowSeparator(gu,gc);
 | 
											
												
													
														|  | -        laShowLabel(gu, gcl, "Rotation:", 0, 0);laShowItem(gu, gcr, e, "active_object.rotation")->Flags|=LA_UI_FLAGS_TRANSPOSE;
 |  | 
 | 
											
												
													
														|  | -        laShowItem(gu, gc, e, "active_object.scale");
 |  | 
 | 
											
												
													
														|  | 
 |  | +        laShowLabel(gu, gcl, "Rotation:", 0, 0);laShowItem(gu, gcr, &ui->PP, "active.rotation")->Flags|=LA_UI_FLAGS_TRANSPOSE;
 | 
											
												
													
														|  | 
 |  | +        laShowItem(gu, gc, &ui->PP, "active.scale");
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |      g = laMakeFoldableGroup(uil, cr, "Display", 0, 1);{
 |  |      g = laMakeFoldableGroup(uil, cr, "Display", 0, 1);{
 | 
											
												
													
														|  |          gu = g->Page;
 |  |          gu = g->Page;
 | 
											
										
											
												
													
														|  | @@ -872,6 +877,12 @@ void la_RegisterViewerOperators(){
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  void *tnsget_detached_FirstScene(void *UNUSED1, void *UNUSED2);
 |  |  void *tnsget_detached_FirstScene(void *UNUSED1, void *UNUSED2);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +void laset_CanvasSelectMode(laCanvasExtra* ex, int mode){
 | 
											
												
													
														|  | 
 |  | +    ex->SelectMode=mode; laUiItem* ui=ex->ParentUi;
 | 
											
												
													
														|  | 
 |  | +    tnsObject*root=ui?ui->PP.EndInstance:0; if(!root) return 0;
 | 
											
												
													
														|  | 
 |  | +    if(root->Active){ if(root->Active->Type==TNS_OBJECT_MESH && ((tnsMeshObject*)root->Active)->Mode==TNS_MESH_EDIT_MODE){ tnsMMeshEnsureSelection(root->Active, mode); } }
 | 
											
												
													
														|  | 
 |  | +}
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  void la_RegisterUiTypesViewerWidgets(){
 |  |  void la_RegisterUiTypesViewerWidgets(){
 | 
											
												
													
														|  |      laPropContainer *pc = 0;
 |  |      laPropContainer *pc = 0;
 | 
											
												
													
														|  |      laProp *p = 0;
 |  |      laProp *p = 0;
 | 
											
										
											
												
													
														|  | @@ -906,11 +917,6 @@ void la_RegisterUiTypesViewerWidgets(){
 | 
											
												
													
														|  |              laAddEnumItem(p, "too_wide", "Too Wide", "Line width is too wide for graphic hadware", L'❌');
 |  |              laAddEnumItem(p, "too_wide", "Too Wide", "Line width is too wide for graphic hadware", L'❌');
 | 
											
												
													
														|  |              laAddEnumItem(p, "too_thin", "Too Thin", "Line width is too thin for graphic hadware", L'❌');
 |  |              laAddEnumItem(p, "too_thin", "Too Thin", "Line width is too thin for graphic hadware", L'❌');
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        p = laAddEnumProperty(pc, "frame_number", "Frame Number", "Enable Frame Number Display At The Bottom Of The Frame Cursor", 0, 0, 0, 0, 0,
 |  | 
 | 
											
												
													
														|  | -                               offsetof(laCanvasExtra, ShowFrameNumber), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
 |  | 
 | 
											
												
													
														|  | -            laAddEnumItem(p, "hidden", "Hidden", "Don't Draw Frame Number", L'🌔');
 |  | 
 | 
											
												
													
														|  | -            laAddEnumItem(p, "shown", "Shown", "Draw Frame Number", L'🌑');
 |  | 
 | 
											
												
													
														|  | -        }
 |  | 
 | 
											
												
													
														|  |          p = laAddEnumProperty(pc, "clear_background", "Clear Background", "Clear Background", 0, 0, 0, 0, 0, offsetof(laCanvasExtra, ClearBackground), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
 |  |          p = laAddEnumProperty(pc, "clear_background", "Clear Background", "Clear Background", 0, 0, 0, 0, 0, offsetof(laCanvasExtra, ClearBackground), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
 | 
											
												
													
														|  |              laAddEnumItem(p, "no", "No", "Don't Clear Background", L'🌔');
 |  |              laAddEnumItem(p, "no", "No", "Don't Clear Background", L'🌔');
 | 
											
												
													
														|  |              laAddEnumItem(p, "yes", "Yes", "Clear Background", L'🌑');
 |  |              laAddEnumItem(p, "yes", "Yes", "Clear Background", L'🌑');
 | 
											
										
											
												
													
														|  | @@ -937,18 +943,23 @@ void la_RegisterUiTypesViewerWidgets(){
 | 
											
												
													
														|  |      ct=laRegisterCanvasTemplate("la_3DView", "tns_object", la_RootObjectDraw, la_RootObjectDrawOverlay, la_3DViewInit, la_3DViewDestroy);
 |  |      ct=laRegisterCanvasTemplate("la_3DView", "tns_object", la_RootObjectDraw, la_RootObjectDrawOverlay, la_3DViewInit, la_3DViewDestroy);
 | 
											
												
													
														|  |      pc = laCanvasHasExtraProps(ct, sizeof(laCanvasExtra), 2);{
 |  |      pc = laCanvasHasExtraProps(ct, sizeof(laCanvasExtra), 2);{
 | 
											
												
													
														|  |          _LA_PROP_3D_EXTRA = pc;
 |  |          _LA_PROP_3D_EXTRA = pc;
 | 
											
												
													
														|  | -        laAddSubGroup(pc, "active_object", "Active Object", "Active object in this viewport", "tns_object",tnsget_ObjectType, 0, 0, offsetof(laCanvasExtra, ActiveObject), 0, 0, 0, 0, 0, 0, 0, LA_UDF_REFER);
 |  | 
 | 
											
												
													
														|  |          laAddIntProperty(pc, "grid_size", "Grid Size", "Floor Grid Size Per Cell", 0, 0, "Unit", 100, 1, 1, 10, 0, offsetof(laCanvasExtra, GridSize), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
 |  |          laAddIntProperty(pc, "grid_size", "Grid Size", "Floor Grid Size Per Cell", 0, 0, "Unit", 100, 1, 1, 10, 0, offsetof(laCanvasExtra, GridSize), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
 | 
											
												
													
														|  |          laAddIntProperty(pc, "grid_span", "Grid Span", "How Many Grids Are Drawn", 0, 0, 0, 25, 1, 1, 10, 0, offsetof(laCanvasExtra, GridSpan), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
 |  |          laAddIntProperty(pc, "grid_span", "Grid Span", "How Many Grids Are Drawn", 0, 0, 0, 25, 1, 1, 10, 0, offsetof(laCanvasExtra, GridSpan), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
 | 
											
												
													
														|  | -        p = laAddEnumProperty(pc, "show_axis", "Show Axis", "Show Global X,Y,Z Axis", LA_WIDGET_ENUM_CYCLE, "X,Y,Z", 0, 0, 0,
 |  | 
 | 
											
												
													
														|  | -                               offsetof(laCanvasExtra, ShowAxis), 0, 0, 3, 0, 0, 0, 0, 0, 0, 0);{
 |  | 
 | 
											
												
													
														|  | -            laAddEnumItem(p, "hidden", "Hidden", "Current Axis Is Hidden", L'🌔');
 |  | 
 | 
											
												
													
														|  | -            laAddEnumItem(p, "shown", "Shown", "Current Axis Is Shown", L'🌑');
 |  | 
 | 
											
												
													
														|  | 
 |  | +        p = laAddEnumProperty(pc, "show_axis", "Show Axis", "Show Global X,Y,Z Axis", LA_WIDGET_ENUM_CYCLE, "X,Y,Z", 0, 0, 0, offsetof(laCanvasExtra, ShowAxis), 0, 0, 3, 0, 0, 0, 0, 0, 0, 0);{
 | 
											
												
													
														|  | 
 |  | +            laAddEnumItem(p, "HIDDEN", "Hidden", "Current Axis Is Hidden", L'🌔');
 | 
											
												
													
														|  | 
 |  | +            laAddEnumItem(p, "SHOWN", "Shown", "Current Axis Is Shown", L'🌑');
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        p = laAddEnumProperty(pc, "show_floor_grid", "Show Floor Grid", "Show Floor Grid", 0,  0, 0, 0, 0, offsetof(laCanvasExtra, ShowFloorGrid), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
 | 
											
												
													
														|  | 
 |  | +            laAddEnumItem(p, "HIDDEN", "Hidden", "Current Axis Is Hidden", L'🌔');
 | 
											
												
													
														|  | 
 |  | +            laAddEnumItem(p, "SHOWN", "Shown", "Current Axis Is Shown", L'🌑');
 | 
											
												
													
														|  | 
 |  | +        }
 | 
											
												
													
														|  | 
 |  | +        p = laAddEnumProperty(pc, "select_mode", "Select Mode", "Select by vertices or edges", 0, 0, 0, 0, 0, offsetof(laCanvasExtra, SelectMode), 0, laset_CanvasSelectMode, 0, 0, 0, 0, 0, 0, 0, 0);{
 | 
											
												
													
														|  | 
 |  | +            laAddEnumItemAs(p, "VERTS", "Verts", "Select by vertices", LA_CANVAS_SELECT_MODE_VERTS,0);
 | 
											
												
													
														|  | 
 |  | +            laAddEnumItemAs(p, "EDGES", "Edges", "Select by edges", LA_CANVAS_SELECT_MODE_EDGES,0);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  | -        p = laAddEnumProperty(pc, "show_floor_grid", "Show Floor Grid", "Show Floor Grid", 0,  0, 0, 0, 0,
 |  | 
 | 
											
												
													
														|  | -                               offsetof(laCanvasExtra, ShowFloorGrid), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
 |  | 
 | 
											
												
													
														|  | -            laAddEnumItem(p, "hidden", "Hidden", "Current Axis Is Hidden", L'🌔');
 |  | 
 | 
											
												
													
														|  | -            laAddEnumItem(p, "shown", "Shown", "Current Axis Is Shown", L'🌑');
 |  | 
 | 
											
												
													
														|  | 
 |  | +        p = laAddEnumProperty(pc, "select_through", "Select Through", "Select through stuff", LA_WIDGET_ENUM_HIGHLIGHT, 0, 0, 0, 0, offsetof(laCanvasExtra, SelectThrough), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);{
 | 
											
												
													
														|  | 
 |  | +            laAddEnumItemAs(p, "OFF", "Off", "Don't select through stuff", LA_CANVAS_SELECT_THROUGH_OFF,0);
 | 
											
												
													
														|  | 
 |  | +            laAddEnumItemAs(p, "ON", "On", "Select through stuff", LA_CANVAS_SELECT_THROUGH_ON,0);
 | 
											
												
													
														|  |          }
 |  |          }
 | 
											
												
													
														|  |          laAddIntProperty(pc, "height_coeff", "Ui Height", "Ui Height Coefficiency Entry", 0, 0, "Rows", 100, -100, 1, 0, 0, offsetof(laCanvasExtra, HeightCoeff), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
 |  |          laAddIntProperty(pc, "height_coeff", "Ui Height", "Ui Height Coefficiency Entry", 0, 0, "Rows", 100, -100, 1, 0, 0, offsetof(laCanvasExtra, HeightCoeff), 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
 | 
											
												
													
														|  |          laAddOperatorProperty(pc, "zoom", "Zoom", "Zoom Viewing Camera", "LA_3d_view_camera_zoom", L'🔎', 0);
 |  |          laAddOperatorProperty(pc, "zoom", "Zoom", "Zoom Viewing Camera", "LA_3d_view_camera_zoom", L'🔎', 0);
 |