changes to the sequencer in trunk between 20855:20928, (excluding UI changes)
[blender.git] / source / blender / blenkernel / intern / nla.c
1 /**
2  * $Id$
3  *
4  * ***** BEGIN GPL LICENSE BLOCK *****
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License
8  * as published by the Free Software Foundation; either version 2
9  * of the License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software Foundation,
18  * Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
19  *
20  * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV.
21  * All rights reserved.
22  *
23  * The Original Code is: all of this file.
24  *
25  * Contributor(s): none yet.
26  *
27  * ***** END GPL LICENSE BLOCK *****
28  */
29
30 #include <stdlib.h>
31
32 #include "MEM_guardedalloc.h"
33
34 #include "BLI_blenlib.h"
35
36 #include "DNA_space_types.h"
37 #include "DNA_nla_types.h"
38 #include "DNA_action_types.h"
39 #include "DNA_ID.h"
40 #include "DNA_ipo_types.h"
41 #include "DNA_object_types.h"
42
43 #include "BKE_nla.h"
44 #include "BKE_action.h"
45 #include "BKE_blender.h"
46 #include "BKE_library.h"
47 #include "BKE_object.h" /* for convert_action_to_strip(ob) */
48
49
50 #ifdef HAVE_CONFIG_H
51 #include <config.h>
52 #endif
53
54 /* NOTE: in group.c the strips get copied for group-nla override, this assumes
55    that strips are one single block, without additional data to be copied */
56
57 void copy_actionstrip (bActionStrip **dst, bActionStrip **src){
58         bActionStrip *dstrip;
59         bActionStrip *sstrip = *src;
60
61         if (!*src){
62                 *dst=NULL;
63                 return;
64         }
65
66         *dst = MEM_dupallocN(sstrip);
67
68         dstrip = *dst;
69         if (dstrip->act)
70                 dstrip->act->id.us++;
71
72         if (dstrip->ipo)
73                 dstrip->ipo->id.us++;
74         
75         if (dstrip->modifiers.first) {
76                 BLI_duplicatelist (&dstrip->modifiers, &sstrip->modifiers);
77         }
78         
79 }
80
81 void copy_nlastrips (ListBase *dst, ListBase *src)
82 {
83         bActionStrip *strip;
84
85         dst->first=dst->last=NULL;
86
87         BLI_duplicatelist (dst, src);
88
89         /* Update specific data */
90         if (!dst->first)
91                 return;
92
93         for (strip = dst->first; strip; strip=strip->next){
94                 if (strip->act)
95                         strip->act->id.us++;
96                 if (strip->ipo)
97                         strip->ipo->id.us++;
98                 if (strip->modifiers.first) {
99                         ListBase listb;
100                         BLI_duplicatelist (&listb, &strip->modifiers);
101                         strip->modifiers= listb;
102                 }
103         }
104 }
105
106 /* from editnla, for convert_action_to_strip -- no UI code so should be ok here.. */
107 void find_stridechannel(Object *ob, bActionStrip *strip)
108 {
109         if(ob && ob->pose) {
110                 bPoseChannel *pchan;
111                 for(pchan= ob->pose->chanbase.first; pchan; pchan= pchan->next)
112                         if(pchan->flag & POSE_STRIDE)
113                                 break;
114                 if(pchan)
115                         BLI_strncpy(strip->stridechannel, pchan->name, 32);
116                 else
117                         strip->stridechannel[0]= 0;
118         }
119 }
120
121 //called by convert_nla / bpy api with an object with the action to be converted to a new strip
122 bActionStrip *convert_action_to_strip (Object *ob)
123 {
124         bActionStrip *nstrip;
125
126         /* Make new actionstrip */
127         nstrip = MEM_callocN(sizeof(bActionStrip), "bActionStrip");
128                         
129         /* Link the action to the nstrip */
130         nstrip->act = ob->action;
131         id_us_plus(&nstrip->act->id);
132         calc_action_range(nstrip->act, &nstrip->actstart, &nstrip->actend, 1);
133         nstrip->start = nstrip->actstart;
134         nstrip->end = nstrip->actend;
135         nstrip->flag = ACTSTRIP_SELECT|ACTSTRIP_LOCK_ACTION;
136                         
137         find_stridechannel(ob, nstrip);
138         //set_active_strip(ob, nstrip); /* is in editnla as does UI calls */
139                         
140         nstrip->repeat = 1.0;
141
142         if(ob->nlastrips.first == NULL)
143                 ob->nlaflag |= OB_NLA_OVERRIDE;
144         
145         BLI_addtail(&ob->nlastrips, nstrip);
146         return nstrip; /* is created, malloced etc. here so is safe to just return the pointer?
147                           this is needed for setting this active in UI, and probably useful for API too */
148         
149 }
150
151
152 /* not strip itself! */
153 void free_actionstrip(bActionStrip* strip)
154 {
155         if (!strip)
156                 return;
157
158         if (strip->act){
159                 strip->act->id.us--;
160                 strip->act = NULL;
161         }
162         if (strip->ipo){
163                 strip->ipo->id.us--;
164                 strip->ipo = NULL;
165         }
166         if (strip->modifiers.first) {
167                 BLI_freelistN(&strip->modifiers);
168         }
169         
170 }
171
172 void free_nlastrips (ListBase *nlalist)
173 {
174         bActionStrip *strip;
175
176         if (!nlalist->first)
177                 return;
178
179         /* Do any specific freeing */
180         for (strip=nlalist->first; strip; strip=strip->next)
181         {
182                 free_actionstrip (strip);
183         };
184
185         /* Free the whole list */
186         BLI_freelistN(nlalist);
187 }