| 
					
				 | 
			
			
				@@ -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; 
			 |