*/}}
Selaa lähdekoodia

Transformation operators adapt to deltas.

YimingWu 1 vuosi sitten
vanhempi
commit
0959a4ec1b
3 muutettua tiedostoa jossa 93 lisäystä ja 18 poistoa
  1. 3 0
      la_tns.h
  2. 43 2
      la_tns_kernel.c
  3. 47 16
      resources/la_modelling.c

+ 3 - 0
la_tns.h

@@ -1119,6 +1119,7 @@ void tnsExtractLocation44d(tnsMatrix44d mat, real *xyz_result);
 void tnsExtractUniformScale44d(tnsMatrix44d mat, real *uniform_result);
 void tnsSelfMatrixChanged(tnsObject* o, int ApplyToChild);
 void tnsGlobalMatrixChanged(tnsObject* o, int ApplyToChild);
+void tnsGlobalMatrixChangedForDelta(tnsObject* o, int ApplyToChild);
 void tnsSelfTransformValueChanged(tnsObject* o);
 void tnsDeltaTransformValueChanged(tnsObject* o);
 void tnsGlobalTransformValueChanged(tnsObject* o);
@@ -1146,11 +1147,13 @@ 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 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);
 void tnsTranslateObjectLocal(tnsObject *o, real x, real y, real z);
 void tnsMoveObjectLocal(tnsObject *o, real x, real y, real z);
 void tnsMoveObjectDelta(tnsObject *o, real x, real y, real z);
 void tnsMoveObjectGlobal(tnsObject *o, real x, real y, real z);
+void tnsMoveObjectGlobalForDelta(tnsObject *o, real x, real y, real z);
 void tnsScaleObject(tnsObject *o, real fac, real cx,real cy,real cz);
 void tnsScaleObjectDelta(tnsObject *o, real fac, real cx,real cy,real cz);
 int tnsCheckParentable(tnsObject* child, tnsObject* parent);

+ 43 - 2
la_tns_kernel.c

@@ -3263,14 +3263,29 @@ void tnsSelfMatrixChanged(tnsObject* o, int ApplyToChild){
     if(ApplyToChild) for (laListItemPointer* li=o->ChildObjects.pFirst;li;li=li->pNext){ tnsSelfMatrixChanged(li->p,1); }
 }
 void tnsGlobalMatrixChanged(tnsObject* o, int ApplyToChild){
-    if (!o->ParentObject){ memcpy(o->SelfTransform, o->GlobalTransform, sizeof(tnsMatrix44d)); }
+    tnsMatrix44d self,invd;
+    if (!o->ParentObject){ memcpy(self, o->GlobalTransform, sizeof(tnsMatrix44d)); }
     else{ tnsMatrix44d inv;
         tnsInverse44d(inv, o->ParentObject->GlobalTransform);
-        tnsMultiply44d(o->SelfTransform, inv, o->GlobalTransform); }
+        tnsMultiply44d(self, inv, o->GlobalTransform); }
+    tnsInverse44d(invd, o->DeltaTransform);
+    tnsMultiply44d(o->SelfTransform, self, invd); 
     tnsExtractSelfTransformValue(o);
     tnsExtractGlobalTransformValue(o);
     if(ApplyToChild) for (laListItemPointer* li=o->ChildObjects.pFirst;li;li=li->pNext){ tnsSelfMatrixChanged(li->p,1); }
 }
+void tnsGlobalMatrixChangedForDelta(tnsObject* o, int ApplyToChild){
+    tnsMatrix44d invs, invp, tmp;
+    if (!o->ParentObject){ tnsLoadIdentity44d(invp); }
+    else{ tnsInverse44d(invp, o->ParentObject->GlobalTransform); }
+    tnsInverse44d(invs, o->SelfTransform);
+    tnsMultiply44d(tmp, invs, invp); 
+    tnsMultiply44d(o->DeltaTransform, tmp, o->GlobalTransform); 
+    tnsExtractDeltaTransformValue(o);
+    //tnsExtractSelfTransformValue(o);
+    tnsExtractGlobalTransformValue(o);
+    if(ApplyToChild) for (laListItemPointer* li=o->ChildObjects.pFirst;li;li=li->pNext){ tnsSelfMatrixChanged(li->p,1); }
+}
 void tnsSelfTransformValueChanged(tnsObject* o){
     tnsMatrix44d Trans, Rot1, Rot2, Rot3, Scale, Res1, Res2;
     tnsLoadIdentity44d(o->SelfTransform);
@@ -3425,6 +3440,13 @@ void tnsMoveObjectGlobal(tnsObject *o, real x, real y, real z){
     memcpy(o->GlobalTransform, res1, sizeof(tnsMatrix44d));
     tnsGlobalMatrixChanged(o,1);
 }
+void tnsMoveObjectGlobalForDelta(tnsObject *o, real x, real y, real z){
+    tnsMatrix44d mat, res1, res2, res3;
+    tnsMakeTranslationMatrix44d(res2, x, y, z);
+    tnsMultiply44d(res1, res2, o->GlobalTransform); //if reverse then local
+    memcpy(o->GlobalTransform, res1, sizeof(tnsMatrix44d));
+    tnsGlobalMatrixChangedForDelta(o,1);
+}
 void tnsRotateObjectGlobal(tnsObject *o, real x, real y, real z, real angle, real cx,real cy,real cz){
     tnsMatrix44d tback,tfwd,rot,rot2,res1,res2;
     real xs, ys, zs;
@@ -3471,6 +3493,25 @@ void tnsRotateObjectDelta(tnsObject *o, real x, real y, real z, real angle, real
     tnsExtractDeltaTransformValue(o);
     tnsSelfMatrixChanged(o,1);
 }
+void tnsRotateObjectGlobalForDelta(tnsObject *o, real x, real y, real z, real angle, real cx,real cy,real cz){
+    tnsMatrix44d tback,tfwd,rot,rot2,res1,res2;
+    real xs, ys, zs;
+    tnsMakeRotationMatrix44d(rot,angle,x,y,z);
+    tnsMakeRotationMatrix44d(rot2,-angle,x,y,z);//why?
+
+    tnsMakeTranslationMatrix44d(tfwd, o->GLocation[0],o->GLocation[1],o->GLocation[2]);
+    tnsInverse44d(tback,tfwd);
+    tnsMultiply44d(res1,o->GlobalTransform,tback);
+    tnsMultiply44d(res2,rot,res1);
+    tnsMultiply44d(o->GlobalTransform,res2,tfwd);
+
+    tnsVector3d delta; delta[0]=o->GLocation[0]-cx; delta[1]=o->GLocation[1]-cy; delta[2]=o->GLocation[2]-cz;
+    tnsVector3d c; c[0]=cx; c[1]=cy; c[2]=cz; tnsVector3d r;
+    tnsApplyRotation43d(r,rot2,delta);
+    tnsVectorPlus3d(&o->GlobalTransform[12],c,r);
+    //memcpy(o->GlobalTransform, res1, sizeof(tnsMatrix44d));
+    tnsGlobalMatrixChangedForDelta(o,1);
+}
 void tnsScaleObject(tnsObject *o, real fac, real cx,real cy,real cz){
     tnsMatrix44d sca,res1,res2;
     tnsMakeScaleMatrix44d(sca,fac,fac,fac);

+ 47 - 16
resources/la_modelling.c

@@ -417,7 +417,7 @@ STRUCTURE(MTransformData){
     tnsVector4d Up,Right,Foward;
     tnsVector4d TCenter;
     int CenterX,CenterY; real Initial;
-    tnsObject* mo; tnsMatrix44d obmatinv;
+    tnsObject* mo; tnsMatrix44d obmatinv,deltainv;
     tnsCamera* c; tnsObject* root;
     int w,h;
     void* Originals; int next,max;
@@ -426,9 +426,10 @@ STRUCTURE(MTransformData){
     int UseLocal;
     real DeltaVal, UserDeltaVal;
     laStringEdit* Entry; int UseUserDelta;
+    int CanvasDeltaMode;
 };
 
-MTransformData* la_InitTransformData(int w, int h, tnsCamera* c){
+MTransformData* la_InitTransformData(int w, int h, tnsCamera* c, int CanvasDeltaMode){
     MTransformData* td=memAcquireSimple(sizeof(MTransformData));
     tnsVector4d pu={0,1,0,0}, pr={1,0,0,0}, pf={0,0,1};
     tnsGetCameraMovingDeltas(c,w,h,1,0,pr); pr[2]=0; pr[3]=0;
@@ -439,7 +440,7 @@ MTransformData* la_InitTransformData(int w, int h, tnsCamera* c){
     tnsApplyRotation43d(td->Foward,inv,pf);
 
     tnsGetCameraViewProjection(td->ViewProjection, w,h,c);
-    td->c=c; td->w=w; td->h=h;
+    td->c=c; td->w=w; td->h=h; td->CanvasDeltaMode=CanvasDeltaMode;
     strBeginEdit(&td->Entry, "");
     return td;
 }
@@ -475,6 +476,7 @@ int la_PopulateTransformVerticies(MTransformData* td, tnsMeshObject* mo){
     int any=0; td->mo=mo;
     arrEnsureLength(&td->Originals, 0, &td->max, sizeof(MTOrigMVert));
     tnsInverse44d(td->obmatinv, mo->Base.GlobalTransform);
+    tnsInverse44d(td->deltainv, mo->Base.DeltaTransform);
     for(tnsMVert* mv=mo->mv.pFirst;mv;mv=mv->Item.pNext){
         if(!(mv->flags&TNS_MESH_FLAG_SELECTED)) continue;
         //printf("v %d ",mv->i);
@@ -511,13 +513,21 @@ void la_ApplyTranslation(MTransformData* td, int x, int y){
         for(int i=0;i<td->next;i++){
             MTOrigObject* to=arrElement(td->Originals, i, sizeof(MTOrigObject)); memcpy(to->o->GlobalTransform, to->Global,sizeof(tnsMatrix44d));
             if(to->Discard){ tnsSelfMatrixChanged(to->o,1); continue; }
-            tnsGlobalMatrixChanged(to->o, 0);
-            if(td->UseLocal) tnsMoveObjectLocal(to->o, LA_COLOR3(use_delta)); else tnsMoveObjectGlobal(to->o, LA_COLOR3(use_delta));
+            if(td->CanvasDeltaMode) tnsGlobalMatrixChangedForDelta(to->o, 0); else tnsGlobalMatrixChanged(to->o, 0);
+            if(td->UseLocal){
+                if(td->CanvasDeltaMode) tnsMoveObjectDelta(to->o, LA_COLOR3(use_delta));
+                else tnsMoveObjectLocal(to->o, LA_COLOR3(use_delta));
+            }else{
+                if(td->CanvasDeltaMode) tnsMoveObjectGlobalForDelta(to->o, LA_COLOR3(use_delta));
+                else tnsMoveObjectGlobal(to->o, LA_COLOR3(use_delta));
+            }
         }
     }else{
-        tnsMakeTranslationMatrix44d(trans, LA_COLOR3(use_delta));
+        tnsMakeTranslationMatrix44d(trans, LA_COLOR3(use_delta)); tnsMatrix44d final; 
+        if(!td->UseLocal) tnsMultiply44d(final,td->obmatinv,trans);
+        else tnsMultiply44d(final,trans,td->obmatinv);
         for(int i=0;i<td->next;i++){ MTOrigMVert* to=arrElement(td->Originals, i, sizeof(MTOrigMVert));
-            tnsApplyTransform43d(gp, trans, to->p); if(!td->UseLocal) tnsApplyTransform43d(to->mv->p, td->obmatinv, gp); else tnsVectorCopy3d(gp, to->mv->p);
+            tnsApplyTransform43d(to->mv->p, final, to->p);
         }
         tnsInvalidateMeshBatch(td->mo); tnsMMeshCalculateNormal(td->mo);
     }
@@ -530,14 +540,25 @@ void la_ApplyScale(MTransformData* td, int uix, int uiy){
         for(int i=0;i<td->next;i++){
             MTOrigObject* to=arrElement(td->Originals, i, sizeof(MTOrigObject)); memcpy(to->o->GlobalTransform, to->Global,sizeof(tnsMatrix44d));
             if(to->Discard){ tnsSelfMatrixChanged(to->o,1); continue; }
-            tnsGlobalMatrixChanged(to->o, 0); tnsScaleObject(to->o, s, LA_COLOR3(td->TCenter));
+            if(td->CanvasDeltaMode) tnsGlobalMatrixChangedForDelta(to->o, 0); else tnsGlobalMatrixChanged(to->o, 0);
+            if(td->CanvasDeltaMode) tnsScaleObjectDelta(to->o,s,LA_COLOR3(td->TCenter));
+            else tnsScaleObject(to->o, s, LA_COLOR3(td->TCenter));
         }
     }else{
-        tnsMakeScaleMatrix44d(trans,s,s,s);
+        tnsVector3d use_delta={s,s,s};
+        if(td->LockAxis[0]>0){ use_delta[1]=use_delta[2]=1;}
+        if(td->LockAxis[1]>0){ use_delta[0]=use_delta[2]=1;}
+        if(td->LockAxis[2]>0){ use_delta[0]=use_delta[1]=1;}
+        if(td->LockAxis[0]<0){ use_delta[0]=1; }
+        if(td->LockAxis[1]<0){ use_delta[1]=1; }
+        if(td->LockAxis[2]<0){ use_delta[2]=1; }
+        tnsMakeScaleMatrix44d(trans,LA_COLOR3(use_delta));
         tnsMatrix44d t1,t2,t3; tnsMakeTranslationMatrix44d(t1,LA_COLOR3(td->TCenter)); tnsInverse44d(t2,t1);
-        tnsMatrix44d final; tnsMultiply44d(t3,t1,trans); tnsMultiply44d(final,t3,t2);
+        tnsMatrix44d final; tnsMultiply44d(t3,t1,trans); tnsMultiply44d(t1,t3,t2);
+        if(!td->UseLocal) tnsMultiply44d(final,td->obmatinv,t1);
+        else tnsMultiply44d(final,t1,td->obmatinv);
         for(int i=0;i<td->next;i++){ MTOrigMVert* to=arrElement(td->Originals, i, sizeof(MTOrigMVert));
-            tnsApplyTransform43d(gp, final, to->p); tnsApplyTransform43d(to->mv->p, td->obmatinv, gp);
+            tnsApplyTransform43d(to->mv->p, final, to->p);
         }
         tnsInvalidateMeshBatch(td->mo); tnsMMeshCalculateNormal(td->mo);
     }
@@ -554,14 +575,23 @@ void la_ApplyRotation(MTransformData* td, int uix, int uiy){
         for(int i=0;i<td->next;i++){
             MTOrigObject* to=arrElement(td->Originals, i, sizeof(MTOrigObject)); memcpy(to->o->GlobalTransform, to->Global,sizeof(tnsMatrix44d));
             if(to->Discard){ tnsSelfMatrixChanged(to->o,1); continue; }
-            tnsGlobalMatrixChanged(to->o, 0); tnsRotateObjectGlobal(to->o,LA_COLOR3(use_forward),angle,LA_COLOR3(td->TCenter));
+            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));
+            }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));
+            }
         }
     }else{
         tnsMakeRotationMatrix44d(trans, angle, LA_COLOR3(use_forward));
         tnsMatrix44d t1,t2,t3; tnsMakeTranslationMatrix44d(t1,LA_COLOR3(td->TCenter)); tnsInverse44d(t2,t1);
-        tnsMatrix44d final; tnsMultiply44d(t3,t1,trans); tnsMultiply44d(final,t3,t2);
+        tnsMatrix44d final; tnsMultiply44d(t3,t1,trans); tnsMultiply44d(t1,t3,t2);
+        if(!td->UseLocal) tnsMultiply44d(final,td->obmatinv,t1);
+        else tnsMultiply44d(final,t1,td->obmatinv);
         for(int i=0;i<td->next;i++){ MTOrigMVert* to=arrElement(td->Originals, i, sizeof(MTOrigMVert));
-            tnsApplyTransform43d(gp, final, to->p); tnsApplyTransform43d(to->mv->p, td->obmatinv, gp);
+            tnsApplyTransform43d(to->mv->p, final, to->p);
         }
         tnsInvalidateMeshBatch(td->mo); tnsMMeshCalculateNormal(td->mo);
     }
@@ -571,7 +601,8 @@ void la_CancelTransformObjects(MTransformData* td){
         for(int i=0;i<td->next;i++){ MTOrigObject* to=arrElement(td->Originals, i, sizeof(MTOrigObject));
             if(to->Discard){ tnsSelfMatrixChanged(to->o,1); continue; }
             memcpy(to->o->GlobalTransform, to->Global,sizeof(tnsMatrix44d));
-            tnsGlobalMatrixChanged(to->o, 1);
+            if(td->CanvasDeltaMode) tnsGlobalMatrixChangedForDelta(to->o, 1);
+            else tnsGlobalMatrixChanged(to->o, 1);
         }
     }else{
         for(int i=0;i<td->next;i++){ MTOrigMVert* to=arrElement(td->Originals, i, sizeof(MTOrigMVert)); tnsVectorCopy3d(to->origp,to->mv->p); }
@@ -615,7 +646,7 @@ int la_InitTransform(laOperator* a, laEvent* e, int mode){
     tnsObject*root=ui?ui->PP.EndInstance:0; if(!root) return 0;
     tnsMeshObject* mo=root->Active;
 
-    MTransformData* td=la_InitTransformData(ex->OffScr->pColor[0]->Width, ex->OffScr->pColor[0]->Height, c);
+    MTransformData* td=la_InitTransformData(ex->OffScr->pColor[0]->Width, ex->OffScr->pColor[0]->Height, c, ex->DeltaMode);
     a->CustomData = td;
     td->mode=mode;
     td->root=root;