|
@@ -54,10 +54,11 @@ void laAnimationUpdateHolderList(){
|
|
|
ah=memAcquire(sizeof(laActionHolder));
|
|
|
memAssignRef(ah,&ah->Instance,inst);
|
|
|
ah->ListHandleOffset=ListOffset;
|
|
|
+ ah->Container=ahp->PP.LastPs->p->SubProp;
|
|
|
char _id[64]="unamed", *id=_id;
|
|
|
laTryGetInstanceIdentifier(inst,pa->Base.SubProp,_id,&id);
|
|
|
strSafeSet(&ah->Name,id);
|
|
|
- if(FirstIn){ strSafeSet(&ah->CategoryTitle,pa->Base.SubProp->Name); }
|
|
|
+ if(FirstIn){ strSafeSet(&ah->CategoryTitle,pa->Base.SubProp->Name); FirstIn=0; }
|
|
|
lstAppendItem(&MAIN.Animation->ActionHolders,ah);
|
|
|
inst=laGetNextInstance(ahp->PP.LastPs->p, inst, &pi);
|
|
|
}
|
|
@@ -69,7 +70,8 @@ laAction* laAnimiationNewAction(laActionHolder* ah, char* Name){
|
|
|
laAction* aa=memAcquire(sizeof(laAction));
|
|
|
if(!Name || !Name[0]){ Name="New Action"; }
|
|
|
strSafeSet(&aa->Name,Name);
|
|
|
- aa->Length=2; aa->FrameCount=24;
|
|
|
+ aa->Length=2; aa->FrameCount=24; aa->HolderContainer=ah->Container;
|
|
|
+ memAssignRef(aa,&aa->HolderInstance,ah->Instance);
|
|
|
memAssignRef(MAIN.Animation,&MAIN.Animation->CurrentAction,aa);
|
|
|
void* lh=((uint8_t*)ah->Instance)+ah->ListHandleOffset;
|
|
|
lstAppendItem(lh,aa);
|
|
@@ -121,8 +123,14 @@ void laAnimationStoreKeyValue(laActionChannel* ac, laActionKey* ak){
|
|
|
case LA_PROP_SUB: case LA_PROP_OPERATOR: case LA_PROP_STRING: case LA_PROP_RAW: default: return;
|
|
|
}
|
|
|
}
|
|
|
-laActionKey* laAnimationInsertKeyFrame(laAction* aa, void* hyper1, laProp* p){
|
|
|
- if(!aa) return 0;
|
|
|
+laActionKey* laAnimationInsertKeyFrame(laAction* aa, void* hyper1, laProp* p, int* error){
|
|
|
+ if(error) *error=0; if(!aa) return 0;
|
|
|
+ if(!aa->HolderInstance||!aa->HolderContainer){ if(error) *error=1; return 0; }
|
|
|
+ if(aa->HolderContainer->ActionHolderVerify){
|
|
|
+ if(!aa->HolderContainer->ActionHolderVerify(aa->HolderInstance,aa->HolderContainer,hyper1,p->Container)){
|
|
|
+ if(error) *error=2; return 0;
|
|
|
+ }
|
|
|
+ }
|
|
|
laActionChannel* ac=laAnimationEnsureChannel(aa,hyper1,p); if(!ac || !ac->AP || !ac->AP->For) return;
|
|
|
int frame=LA_ACTION_FRAME(aa);
|
|
|
laActionKey* ak=laAnimationEnsureFrame(ac,frame);
|
|
@@ -184,7 +192,7 @@ void laui_AnimationSelectAction(laUiList *uil, laPropPack *This, laPropPack *Ope
|
|
|
laColumn *c = laFirstColumn(uil);
|
|
|
for(laActionHolderPath* ahp=MAIN.Animation->ActionHolderPaths.pFirst;ahp;ahp=ahp->Item.pNext){
|
|
|
laShowLabel(uil,c,ahp->PP.LastPs->p->Name,0,0)->Flags|=LA_UI_FLAGS_DISABLED|LA_TEXT_MONO;
|
|
|
- laShowItemFull(uil,c,0,ahp->OriginalPath,LA_WIDGET_COLLECTION,0,laui_AnimationActionHolder,0)->Flags|=LA_UI_FLAGS_NO_DECAL|LA_UI_FLAGS_NO_GAP;
|
|
|
+ laShowItemFull(uil,c,0,ahp->OriginalPath,LA_WIDGET_COLLECTION,"feedback=NONE",laui_AnimationActionHolder,0)->Flags|=LA_UI_FLAGS_NO_DECAL|LA_UI_FLAGS_NO_GAP;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -259,7 +267,7 @@ void la_AnimationMixChannelValue(laActionChannel* ac, void* data, int MixMode, r
|
|
|
case LA_PROP_INT: case LA_PROP_INT|LA_PROP_ARRAY: for(int i=0;i<arrlen;i++){
|
|
|
ip[i]=ap->Reset?ipd[i]:(MixMode==LA_ANIMATION_MIX_REPLACE?ipd[i]:(ipd[i]+ip[i]));
|
|
|
} break;
|
|
|
- case LA_PROP_FLOAT: case LA_PROP_FLOAT|LA_PROP_ARRAY: for(int i=0;i<arrlen;i++){
|
|
|
+ case LA_PROP_FLOAT: case LA_PROP_FLOAT|LA_PROP_ARRAY: for(int i=0;i<arrlen;i++){
|
|
|
fp[i]=ap->Reset?fpd[i]:(MixMode==LA_ANIMATION_MIX_REPLACE?fpd[i]:(fpd[i]+fp[i]));
|
|
|
} break;
|
|
|
case LA_PROP_ENUM: ip[0]=ipd[0]; break;
|
|
@@ -272,6 +280,7 @@ void la_AnimationEvaluateActionChannels(laAction* aa){
|
|
|
int64_t _data[16]; void* data=_data;
|
|
|
int frame=LA_ACTION_FRAME(aa); real totframe=aa->PlayHead*aa->FrameCount;
|
|
|
for(laActionChannel* ac=aa->Channels.pFirst;ac;ac=ac->Item.pNext){
|
|
|
+ data=_data;
|
|
|
laActionKey* ak1=laAnimationGetFrame(ac,frame); if(!ak1) continue;
|
|
|
laActionKey* ak2=ak1->Item.pNext;
|
|
|
la_AnimationInterpolateKeys(ac,ak1,ak2,totframe,&data);
|
|
@@ -286,7 +295,7 @@ void la_AnimationEvaluateActions(int ClampOffsets){
|
|
|
laListHandle* lh=((uint8_t*)ah->Instance)+ah->ListHandleOffset;
|
|
|
for(laAction* aa=lh->pFirst;aa;aa=aa->Item.pNext){
|
|
|
real preoffset=0,postoffset=aa->Offset/aa->Length;
|
|
|
- if(ClampOffsets || (MAIN.Animation->PlayStatus!=LA_ANIMATION_STATUS_PAUSED)){
|
|
|
+ if(ClampOffsets || (MAIN.Animation->PlayStatus!=LA_ANIMATION_STATUS_PAUSED) || (aa!=MAIN.Animation->CurrentAction)){
|
|
|
while(aa->Offset>aa->Length){ aa->Offset-=aa->Length; }
|
|
|
while(aa->Offset<-1e-6){ aa->Offset+=aa->Length; }
|
|
|
preoffset=aa->Offset; postoffset=0;
|