*/}}
Jelajahi Sumber

Object local rotation fix and box select fix

YimingWu 8 bulan lalu
induk
melakukan
7b538945d2
4 mengubah file dengan 30 tambahan dan 25 penghapusan
  1. 2 1
      la_tns.h
  2. 20 18
      la_tns_kernel.c
  3. 6 4
      resources/la_modelling.c
  4. 2 2
      resources/la_widgets_viewers.c

+ 2 - 1
la_tns.h

@@ -1039,7 +1039,8 @@ void tns_RegisterNodes();
 void tnsCopyObjectTransformationsLocal(tnsObject* to, tnsObject* from);
 void tnsCopyObjectTransformationsGlobal(tnsObject* to, tnsObject* from);
 void tnsRotateObjectGlobal(tnsObject *o, real x, real y, real z, real angle, real cx,real cy,real cz);
-void tnsRotateObjectLocal(tnsObject *o, real x, real y, real z, real angle, real gcx,real gcy,real gcz);
+void tnsRotateObjectDelta(tnsObject *o, real x, real y, real z, real angle);
+void tnsRotateObjectLocal(tnsObject *o, real x, real y, real z, real angle);
 void tnsRotateObjectLocalValues(tnsObject *o, real x, real y, real z);
 void tnsRotateObjectGlobalForDelta(tnsObject *o, real x, real y, real z, real angle, real cx,real cy,real cz);
 void tnsTranslateObjectGlobal(tnsObject *o, real x, real y, real z);

+ 20 - 18
la_tns_kernel.c

@@ -3360,30 +3360,32 @@ void tnsRotateObjectGlobal(tnsObject *o, real x, real y, real z, real angle, rea
     //memcpy(o->GlobalTransform, res1, sizeof(tnsMatrix44d));
     tnsGlobalMatrixChanged(o,1);
 }
-void tnsRotateObjectLocal(tnsObject *o, real x, real y, real z, real angle, real gcx,real gcy,real gcz){
+void tnsRotateObjectLocal(tnsObject *o, real x, real y, real z, real angle){
     tnsMatrix44d tback,tfwd,rot,res1,res2;
-    real xs, ys, zs;
-    tnsVector3d gp,gpt; gp[0]=gcx; gp[1]=gcy; gp[2]=gcz;
-    tnsApplyTransform43d(gpt,o->GlobalTransform,gp);
-    tnsMakeTranslationMatrix44d(tfwd, gpt[0]-gcx, gpt[0]-gcy, gpt[0]-gcz);
-    tnsInverse44d(tback,tfwd);
+    //tnsVector3d gp,gpt; gp[0]=gcx; gp[1]=gcy; gp[2]=gcz;
+    //tnsMakeTranslationMatrix44d(tfwd, gcx, gcy, gcz);
+    //tnsInverse44d(tback,tfwd);
     tnsMakeRotationMatrix44d(rot,angle,x,y,z);
-    tnsMultiply44d(res1,o->SelfTransform,tback);
-    tnsMultiply44d(res2,res1,rot);
-    tnsMultiply44d(o->SelfTransform,res2,tfwd);
+    //tnsMultiply44d(res1,o->SelfTransform,tback);
+    //tnsMultiply44d(res2,res1,rot);
+    //tnsMultiply44d(o->SelfTransform,res2,tfwd);
+    tnsMultiply44d(res1,o->SelfTransform,rot);
+    tnsCopyMatrix44d(res1,o->SelfTransform);
     tnsSelfMatrixChanged(o,1);
 }
-void tnsRotateObjectDelta(tnsObject *o, real x, real y, real z, real angle, real gcx,real gcy,real gcz){
+void tnsRotateObjectDelta(tnsObject *o, real x, real y, real z, real angle){
     tnsMatrix44d tback,tfwd,rot,res1,res2;
-    real xs, ys, zs;
-    tnsVector3d gp,gpt; gp[0]=gcx; gp[1]=gcy; gp[2]=gcz;
-    tnsApplyTransform43d(gpt,o->DeltaTransform,gp);
-    tnsMakeTranslationMatrix44d(tfwd, gpt[0]-gcx, gpt[0]-gcy, gpt[0]-gcz);
-    tnsInverse44d(tback,tfwd);
+    //tnsVector3d gp,gpt; gp[0]=gcx; gp[1]=gcy; gp[2]=gcz;
+    //tnsApplyTransform43d(gpt,o->DeltaTransform,gp);
+    //tnsMakeTranslationMatrix44d(tfwd, gpt[0]-gcx, gpt[0]-gcy, gpt[0]-gcz);
+    //tnsInverse44d(tback,tfwd);
+    //tnsMakeRotationMatrix44d(rot,angle,x,y,z);
+    //tnsMultiply44d(res1,o->SelfTransform,tback);
+    //tnsMultiply44d(res2,res1,rot);
+    //tnsMultiply44d(o->SelfTransform,res2,tfwd);
     tnsMakeRotationMatrix44d(rot,angle,x,y,z);
-    tnsMultiply44d(res1,o->SelfTransform,tback);
-    tnsMultiply44d(res2,res1,rot);
-    tnsMultiply44d(o->SelfTransform,res2,tfwd);
+    tnsMultiply44d(res1,o->DeltaTransform,rot);
+    tnsCopyMatrix44d(res1,o->DeltaTransform);
     tnsExtractDeltaTransformValue(o);
     tnsSelfMatrixChanged(o,1);
 }

+ 6 - 4
resources/la_modelling.c

@@ -423,7 +423,7 @@ STRUCTURE(MTransformData){
     tnsMatrix44d Delta;
     tnsMatrix44d ViewProjection;
     tnsVector4d Up,Right,Foward;
-    tnsVector4d TCenter;
+    tnsVector4d TCenter,TLCenter;
     int CenterX,CenterY; real Initial;
     tnsObject* mo; tnsMatrix44d obmatinv,deltainv;
     tnsCamera* c; tnsObject* root;
@@ -493,9 +493,11 @@ int la_PopulateTransformVerticies(MTransformData* td, tnsMeshObject* mo){
         tnsApplyTransform43d(to->p, mo->Base.GlobalTransform, mv->p);
         memcpy(to->origp, mv->p, sizeof(tnsVector3d)); any++;
         tnsVectorAccum3d(td->TCenter,to->p);
+        tnsVectorAccum3d(td->TLCenter,mv->p);
     }
     //printf(" [totmv %d]\n",mo->totmv);
     tnsVectorMultiSelf3d(td->TCenter, 1.0f/any);
+    tnsVectorMultiSelf3d(td->TLCenter, 1.0f/any);
     la_GetTransformCenter2D(td);
     return any;
 }
@@ -585,8 +587,8 @@ void la_ApplyRotation(MTransformData* td, int uix, int uiy){
             if(to->Discard){ tnsSelfMatrixChanged(to->o,1); continue; }
             if(td->CanvasDeltaMode) tnsGlobalMatrixChangedForDelta(to->o, 0); else tnsGlobalMatrixChanged(to->o, 0);
             if(td->UseLocal){
-                if(td->CanvasDeltaMode) tnsRotateObjectDelta(to->o,LA_COLOR3(use_forward),angle,LA_COLOR3(td->TCenter));
-                else  tnsRotateObjectLocal(to->o,LA_COLOR3(use_forward),angle,LA_COLOR3(td->TCenter));
+                if(td->CanvasDeltaMode) tnsRotateObjectDelta(to->o,LA_COLOR3(use_forward),angle);
+                else tnsRotateObjectLocal(to->o,LA_COLOR3(use_forward),angle);
             }else{
                 if(td->CanvasDeltaMode) tnsRotateObjectGlobalForDelta(to->o,LA_COLOR3(use_forward),angle,LA_COLOR3(td->TCenter));
                 else tnsRotateObjectGlobal(to->o,LA_COLOR3(use_forward),angle,LA_COLOR3(td->TCenter));
@@ -594,7 +596,7 @@ void la_ApplyRotation(MTransformData* td, int uix, int uiy){
         }
     }else{
         tnsMakeRotationMatrix44d(trans, angle, LA_COLOR3(use_forward));
-        tnsMatrix44d t1,t2,t3; tnsMakeTranslationMatrix44d(t1,LA_COLOR3(td->TCenter)); tnsInverse44d(t2,t1);
+        tnsMatrix44d t1,t2,t3; tnsMakeTranslationMatrix44d(t1,LA_COLOR3(td->UseLocal?td->TLCenter:td->TCenter)); tnsInverse44d(t2,t1);
         tnsMatrix44d final; tnsMultiply44d(t3,t1,trans); tnsMultiply44d(t1,t3,t2);
         if(!td->UseLocal) tnsMultiply44d(final,td->obmatinv,t1);
         else tnsMultiply44d(final,t1,td->obmatinv);

+ 2 - 2
resources/la_widgets_viewers.c

@@ -241,8 +241,8 @@ void la_RootObjectDrawOverlay(laUiItem *ui, int h){
             tnsColor4dv(laThemeColor(bt,LA_BT_TEXT));
             int drawx=(e->DrawCursor==LA_CANVAS_CURSOR_CROSS)||(e->DrawCursor==LA_CANVAS_CURSOR_X);
             int drawy=(e->DrawCursor==LA_CANVAS_CURSOR_CROSS)||(e->DrawCursor==LA_CANVAS_CURSOR_Y);
-            if(drawx) tnsVertex2d(e->OnX, ui->U); tnsVertex2d(e->OnX, ui->B);
-            if(drawy) tnsVertex2d(ui->L, e->OnY); tnsVertex2d(ui->R, e->OnY);
+            if(drawx){ tnsVertex2d(e->OnX, ui->U); tnsVertex2d(e->OnX, ui->B); }
+            if(drawy){ tnsVertex2d(ui->L, e->OnY); tnsVertex2d(ui->R, e->OnY); }
             tnsPackAs(GL_LINES);
         }
     }