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