|
@@ -135,6 +135,7 @@ void la_PopulateSelectDataObjects(MSelectData* sd, tnsObject* root, laCanvasExtr
|
|
|
glClearColor(0,0,0,0); glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); glEnable(GL_DEPTH_TEST);
|
|
|
tnsInvalidateEvaluation(root); tnsSetObjectTreeEvaluationArgs(root,root->Active,1,1); tnsEvaluateObjectTree(root,0,0);
|
|
|
tnsDrawObjectTree(root,TNS_EVAL_LAYER_SELECTION,&de,0);
|
|
|
+ tnsDrawObjectOrigins(root,root->Active,1); tnsFlush();
|
|
|
glDisable(GL_DEPTH_TEST);
|
|
|
|
|
|
nvgEndFrame(vg); tnsRestoreFromNanoVG(); tnsEnableShaderv(T->immShader);
|
|
@@ -472,6 +473,23 @@ int OPMOD_Select(laOperator *a, laEvent *e){
|
|
|
return LA_RUNNING;
|
|
|
}
|
|
|
|
|
|
+int OPINV_SelectLinked(laOperator *a, laEvent *e){
|
|
|
+ if(!a->This || !a->This->EndInstance){ return 0; }
|
|
|
+ laCanvasExtra* ex=a->This->EndInstance; tnsCamera*c=ex->ViewingCamera; laUiItem* ui=ex->ParentUi;
|
|
|
+ tnsObject*root=ui?ui->PP.EndInstance:0; if(!root) return 0;
|
|
|
+ tnsObject* o=root->Active; tnsMeshObject* mo=o; tnsShapeObject* so=o;
|
|
|
+
|
|
|
+ if(o&&o->Type==TNS_OBJECT_MESH && mo->Mode==TNS_MESH_EDIT_MODE){
|
|
|
+ tnsMMeshSelectLinked(mo); tnsInvalidateMeshBatch(mo);
|
|
|
+ laNotifyUsers("tns.world"); laRecordAndPush(0,"tns.world","Mesh selection",TNS_HINT_GEOMETRY);
|
|
|
+ }elif(o&&o->Type==TNS_OBJECT_SHAPE && so->Mode==TNS_MESH_EDIT_MODE){
|
|
|
+ tnsShapeSelectLinked(so);
|
|
|
+ laNotifyUsers("tns.world"); laRecordAndPush(0,"tns.world","Shape selection",TNS_HINT_GEOMETRY);
|
|
|
+ }
|
|
|
+
|
|
|
+ return LA_FINISHED_PASS;
|
|
|
+}
|
|
|
+
|
|
|
|
|
|
#define LA_TRANSFORM_MODE_GRAB 1
|
|
|
#define LA_TRANSFORM_MODE_ROTATE 2
|
|
@@ -1281,7 +1299,7 @@ int OPINV_Delete(laOperator *a, laEvent *e){
|
|
|
tnsMMeshRefreshIndex(mo);
|
|
|
tnsInvalidateMeshBatch(mo);
|
|
|
laRecordInstanceDifferences(mo, "tns_mesh_object"); laPushDifferences("Deleted primitives", TNS_HINT_GEOMETRY); laNotifyUsers("tns.world");
|
|
|
- }if(so->Base.Type==TNS_OBJECT_SHAPE && so->Mode==TNS_MESH_EDIT_MODE){
|
|
|
+ }elif(so->Base.Type==TNS_OBJECT_SHAPE && so->Mode==TNS_MESH_EDIT_MODE){
|
|
|
if(!tnsShapeAnySelected(so)) return LA_FINISHED;
|
|
|
char* split=strGetArgumentString(a->ExtraInstructionsP, "split");
|
|
|
if(split){
|
|
@@ -1483,11 +1501,12 @@ int OPINV_Add(laOperator *a, laEvent *e){
|
|
|
if(!a->This || !a->This->EndInstance){ return 0; }
|
|
|
laCanvasExtra* ex=a->This->EndInstance; tnsCamera*c=ex->ViewingCamera; laUiItem* ui=ex->ParentUi;
|
|
|
tnsObject*root=ui?ui->PP.EndInstance:0; if(!root) return 0;
|
|
|
- tnsMeshObject* mo=root->Active; int ran=0; tnsObject* no=0;
|
|
|
+ tnsMeshObject* mo=root->Active; tnsShapeObject* so=mo;int ran=0; tnsObject* no=0;
|
|
|
laObjectAddData *ad=memAcquire(sizeof(laObjectAddData));a->CustomData=ad;
|
|
|
char* str=strGetArgumentString(a->ExtraInstructionsP, "mode");
|
|
|
|
|
|
- if((!mo) || mo->Base.Type!=TNS_OBJECT_MESH || mo->Mode!=TNS_MESH_EDIT_MODE){ ad->Context=LA_ADD_CTX_OBJECT;
|
|
|
+ if((!mo) || (mo->Base.Type==TNS_OBJECT_MESH && mo->Mode!=TNS_MESH_EDIT_MODE) ||
|
|
|
+ (so->Base.Type==TNS_OBJECT_SHAPE && so->Mode!=TNS_MESH_EDIT_MODE)){ ad->Context=LA_ADD_CTX_OBJECT;
|
|
|
if(strSame(str,"PLANE")){ tnsDeselectAllObjects(root);
|
|
|
no=tnsCreateMeshPlane(root, "Plane",0,0,0,1); no->Flags|=TNS_OBJECT_FLAGS_SELECTED; memAssignRef(root,&root->Active,no); ran=1; }
|
|
|
elif(strSame(str,"INSTANCER")){ tnsDeselectAllObjects(root);
|
|
@@ -1496,7 +1515,7 @@ int OPINV_Add(laOperator *a, laEvent *e){
|
|
|
no=tnsCreateShapeSquare(root, "Square",0,0,0,1); no->Flags|=TNS_OBJECT_FLAGS_SELECTED; memAssignRef(root,&root->Active,no); ran=1; }
|
|
|
else{ laEnableOperatorPanel(a,a->This,e->x,e->y,200,200,0,0,0,0,0,0,0,0,e); return LA_RUNNING; }
|
|
|
if(ran){ laRecordAndPush(0,"tns.world","Add object",TNS_HINT_GEOMETRY); laNotifyUsers("tns.world"); }
|
|
|
- }elif(mo->Base.Type==TNS_OBJECT_MESH && mo->Mode!=TNS_MESH_EDIT_MODE){ ad->Context=LA_ADD_CTX_MESH;
|
|
|
+ }elif(mo->Base.Type==TNS_OBJECT_MESH && mo->Mode==TNS_MESH_EDIT_MODE){ ad->Context=LA_ADD_CTX_MESH;
|
|
|
if(strSame(str,"PLANE")){
|
|
|
tnsMMeshDeselectAll(mo); tnsAddMMeshPlane(mo, 1); tnsMMeshEnsureSelection(mo,ex->SelectMode); ran=1;
|
|
|
}else{ laEnableOperatorPanel(a,a->This,e->x,e->y,200,200,0,0,0,0,0,0,0,0,e); return LA_RUNNING; }
|
|
@@ -1504,14 +1523,12 @@ int OPINV_Add(laOperator *a, laEvent *e){
|
|
|
tnsMMeshRefreshIndex(mo); tnsInvalidateMeshBatch(mo);
|
|
|
laRecordInstanceDifferences(mo, "tns_mesh_object"); laPushDifferences("Add primitives", TNS_HINT_GEOMETRY); laNotifyUsers("tns.world");
|
|
|
}
|
|
|
- }elif(mo->Base.Type==TNS_OBJECT_SHAPE && mo->Mode!=TNS_MESH_EDIT_MODE){ ad->Context=LA_ADD_CTX_SHAPE;
|
|
|
+ }elif(so->Base.Type==TNS_OBJECT_SHAPE && so->Mode==TNS_MESH_EDIT_MODE){ ad->Context=LA_ADD_CTX_SHAPE;
|
|
|
if(strSame(str,"SQUARE")){
|
|
|
- //stuff
|
|
|
- ran=1;
|
|
|
+ tnsShapeDeselectAll(so); tnsInitShapeSquare(so,1); ran=1;
|
|
|
}else{ laEnableOperatorPanel(a,a->This,e->x,e->y,200,200,0,0,0,0,0,0,0,0,e); return LA_RUNNING; }
|
|
|
if(ran){
|
|
|
- //stuff
|
|
|
- laRecordInstanceDifferences(mo, "tns_shape_object"); laPushDifferences("Add primitives", TNS_HINT_GEOMETRY); laNotifyUsers("tns.world");
|
|
|
+ laRecordInstanceDifferences(so, "tns_shape_object"); laPushDifferences("Add shape", TNS_HINT_GEOMETRY); laNotifyUsers("tns.world");
|
|
|
}
|
|
|
}
|
|
|
return LA_FINISHED;
|
|
@@ -2022,6 +2039,7 @@ void la_RegisterModellingOperators(){
|
|
|
laAddEnumItemAs(p,"OBJECT","Object","Object context",LA_ADD_CTX_OBJECT,0);
|
|
|
laAddEnumItemAs(p,"MESH","Mesh","Mesh context",LA_ADD_CTX_MESH,0);
|
|
|
laAddEnumItemAs(p,"SHAPE","Shape","Shape context",LA_ADD_CTX_SHAPE,0);
|
|
|
+ laCreateOperatorType("M_select_linked", "Select Linked", "Select linked geometry or shapes", OPCHK_ViewportAndSceneExists, 0, 0, OPINV_SelectLinked, 0, 0, LA_EXTRA_TO_PANEL);
|
|
|
|
|
|
laCreateOperatorType("M_separate", "Separate", "Separate mesh parts", 0, 0, 0, OPINV_Separate, 0, 0, 0);
|
|
|
laCreateOperatorType("M_combine", "Combine", "Combine mesh objects", 0, 0, 0, OPINV_Combine, 0, 0, 0);
|