@AnimEditor.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. /******************************************************************************/
  2. /******************************************************************************/
  3. class AnimEditor : Viewport4Region
  4. {
  5. enum ANIM_OP
  6. {
  7. OP_ORN ,
  8. OP_ORN2 ,
  9. OP_POS ,
  10. OP_SCALE,
  11. OP_NUM ,
  12. };
  13. enum TRACK_TYPE
  14. {
  15. TRACK_ORN,
  16. TRACK_POS,
  17. TRACK_SCALE,
  18. TRACK_NUM,
  19. };
  20. enum EVENT_OP
  21. {
  22. EVENT_MOVE,
  23. EVENT_RENAME,
  24. EVENT_NEW,
  25. EVENT_DEL,
  26. };
  27. static cchar8 *event_op_t[]
  28. ;
  29. static flt TimeEps();
  30. class Change : Edit::_Undo::Change
  31. {
  32. Animation anim;
  33. ElmAnim anim_data;
  34. Skeleton skel;
  35. virtual void create(ptr user)override;
  36. virtual void apply(ptr user)override;
  37. };
  38. class Track : GuiCustom
  39. {
  40. bool events;
  41. flt screenToTime(flt x)C;
  42. Track& create(bool events);
  43. static flt ElmPosX(C Rect &rect, flt time);
  44. static Rect ElmRect(C Rect &rect, flt time);
  45. static flt Slide(flt &time, flt dt, flt length);
  46. virtual void update(C GuiPC &gpc)override;
  47. static void DrawKey(flt time, C Rect &rect, flt y, flt r);
  48. static void DrawKeys(AnimKeys &keys, C Rect &rect, C Color &color, flt y, flt r, int row, bool lit=false);
  49. virtual void draw(C GuiPC &gpc)override;
  50. };
  51. class Preview : PropWin
  52. {
  53. ViewportSkin viewport;
  54. Button split, apply_speed, edit, locate;
  55. Tabs event_op;
  56. Track track;
  57. bool draw_bones, draw_slots, draw_axis, draw_plane;
  58. int event_lit, event_sel;
  59. flt time_speed, prop_max_x,
  60. cam_yaw, cam_pitch, cam_zoom;
  61. Camera cam;
  62. Property *length, *event;
  63. static void Play ( Preview &editor, C Str &t);
  64. static Str Play (C Preview &editor );
  65. static void Loop ( Preview &editor, C Str &t);
  66. static Str Loop (C Preview &editor );
  67. static void Linear( Preview &editor, C Str &t);
  68. static Str Linear(C Preview &editor );
  69. static void Target( Preview &editor, C Str &t);
  70. static Str Target(C Preview &editor );
  71. static void Split ( Preview &editor );
  72. static void Speed ( Preview &editor );
  73. static void Render();
  74. static void Draw(Viewport &viewport);
  75. void draw();
  76. Animation* anim()C;
  77. void create();
  78. void toGui();
  79. void removedEvent(int index);
  80. virtual Preview& hide ( ) override;
  81. virtual Rect sizeLimit( )C override;
  82. virtual Preview& rect (C Rect &rect) override;
  83. virtual void update(C GuiPC &gpc)override;
  84. public:
  85. Preview();
  86. };
  87. class OptimizeAnim : PropWin
  88. {
  89. bool refresh_needed, preview;
  90. dbl angle_eps, pos_eps, scale_eps;
  91. Property *file_size, *optimized_size;
  92. Button optimize;
  93. Animation anim;
  94. static void Changed(C Property &prop);
  95. static void Optimize(OptimizeAnim &oa);
  96. void optimizeDo(Animation &anim);
  97. Animation* getAnim();
  98. void refresh();
  99. OptimizeAnim& create();
  100. public:
  101. OptimizeAnim();
  102. };
  103. class TimeRangeSpeed : PropWin
  104. {
  105. flt start, end, speed;
  106. Button apply;
  107. Property *st, *e, *sp;
  108. static void Apply(TimeRangeSpeed &tsr);
  109. TimeRangeSpeed& create();
  110. void display();
  111. };
  112. static void Fullscreen(AnimEditor &editor);
  113. static void Render();
  114. static void Draw(Viewport &viewport);
  115. void draw(Edit::Viewport4::View&view);
  116. UID elm_id;
  117. Elm *elm;
  118. bool changed, fullscreen, copied_bone_pos_relative;
  119. flt blend_range; // amount of seconds to use blend when operating on multiple keyframes (using Ctrl), use -1 to disable TODO: make this configurable via UI
  120. Animation *anim;
  121. Skeleton *skel;
  122. AnimatedSkeleton anim_skel;
  123. SkelAnim skel_anim;
  124. MeshPtr mesh;
  125. Preview preview;
  126. Track track;
  127. Button axis, draw_bones, draw_mesh, show_grid, undo, redo, locate, edit, force_play, start, end, prev_frame, next_frame,
  128. loop, linear, root_from_body,
  129. root_del_pos, root_del_pos_x, root_del_pos_y, root_del_pos_z,
  130. root_del_rot, root_del_rot_x, root_del_rot_y, root_del_rot_z,
  131. root_del_scale, root_2_keys, root_set_move, root_set_rot, reload;
  132. CheckBox play;
  133. Memx<Property> props, root_props;
  134. Tabs op, settings;
  135. ComboBox cmd;
  136. Region settings_region;
  137. Text t_settings, t_settings_root;
  138. TextWhite ts;
  139. flt anim_speed, key_time;
  140. int lit_bone, sel_bone, bone_axis;
  141. Str8 sel_bone_name;
  142. Vec orn_target, orn_perp, copied_bone_pos;
  143. OptimizeAnim optimize_anim;
  144. TimeRangeSpeed time_range_speed;
  145. Edit::Undo<Change> undos; void undoVis();
  146. static cchar8 *transform_obj_dialog_id;
  147. static void PrevAnim (AnimEditor &editor);
  148. static void NextAnim (AnimEditor &editor);
  149. static void Mode1 (AnimEditor &editor);
  150. static void Mode2 (AnimEditor &editor);
  151. static void Mode3 (AnimEditor &editor);
  152. static void Mode4 (AnimEditor &editor);
  153. static void Play (AnimEditor &editor);
  154. static void Identity (AnimEditor &editor);
  155. static void Settings (AnimEditor &editor);
  156. static void Start (AnimEditor &editor);
  157. static void End (AnimEditor &editor);
  158. static void PrevFrame (AnimEditor &editor);
  159. static void NextFrame (AnimEditor &editor);
  160. static void DelFrame (AnimEditor &editor);
  161. static void DelFrames (AnimEditor &editor);
  162. static void DelFramesAtEnd(AnimEditor &editor);
  163. static void Optimize (AnimEditor &editor);
  164. static void TimeRangeSp (AnimEditor &editor);
  165. static void ReverseFrames (AnimEditor &editor);
  166. static void RemMovement (AnimEditor &editor);
  167. static void FreezeBone (AnimEditor &editor);
  168. static void Mirror (AnimEditor &editor);
  169. static void RotX (AnimEditor &editor);
  170. static void RotY (AnimEditor &editor);
  171. static void RotZ (AnimEditor &editor);
  172. static void DrawBones (AnimEditor &editor);
  173. static void DrawMesh (AnimEditor &editor);
  174. static void Grid (AnimEditor &editor);
  175. static void TransformObj (AnimEditor &editor);
  176. static void TransformObjDo(AnimEditor &editor);
  177. static void Undo (AnimEditor &editor);
  178. static void Redo (AnimEditor &editor);
  179. static void Locate(AnimEditor &editor);
  180. static void Reload(AnimEditor &editor);
  181. static void Loop (AnimEditor &editor);
  182. static void Linear(AnimEditor &editor);
  183. static void RootDelPos(AnimEditor &editor);
  184. static void RootDelRot(AnimEditor &editor);
  185. static void RootDel(AnimEditor &editor);
  186. static void RootDelPosX (AnimEditor &editor);
  187. static void RootDelPosY (AnimEditor &editor);
  188. static void RootDelPosZ (AnimEditor &editor);
  189. static void RootDelRotX (AnimEditor &editor);
  190. static void RootDelRotY (AnimEditor &editor);
  191. static void RootDelRotZ (AnimEditor &editor);
  192. //static void RootDelScale(AnimEditor &editor) {if(ElmAnim *d=editor.data()){editor.undos.set("rootDelScale"); FlagToggle(d.flag, ElmAnim.ROOT_DEL_SCALE); /*d.file_time.getUTC(); already changed in 'setChanged' */ if(d.flag&ElmAnim.ROOT_DEL_SCALE){Skeleton temp, &skel=editor.skel ? *editor.skel : temp; editor.anim.adjustForSameTransformWithDifferentSkeleton(skel, skel, -1, null, ROOT_DEL_SCALE ); editor.setOrnTarget(); editor.toGui();} editor.setChanged();}}
  193. static void Root2Keys (AnimEditor &editor);
  194. static void RootFromBody(AnimEditor &editor);
  195. static void RootFromBodyX(AnimEditor &editor);
  196. static void RootFromBodyZ(AnimEditor &editor);
  197. static void RootSetMove(AnimEditor &editor);
  198. static void RootSetRot(AnimEditor &editor);
  199. static Str RootMoveX(C AnimEditor &editor);
  200. static Str RootMoveY(C AnimEditor &editor);
  201. static Str RootMoveZ(C AnimEditor &editor);
  202. static void RootMoveX( AnimEditor &editor, C Str&t);
  203. static void RootMoveY( AnimEditor &editor, C Str&t);
  204. static void RootMoveZ( AnimEditor &editor, C Str&t);
  205. static Str RootRotX(C AnimEditor &editor);
  206. static Str RootRotY(C AnimEditor &editor);
  207. static Str RootRotZ(C AnimEditor &editor);
  208. static void RootRotX( AnimEditor &editor, C Str&t);
  209. static void RootRotY( AnimEditor &editor, C Str&t);
  210. static void RootRotZ( AnimEditor &editor, C Str&t);
  211. static void SetSelMirror(AnimEditor &editor);
  212. static void SetMirrorSel(AnimEditor &editor);
  213. void setSelMirror(bool set_other);
  214. static void SkelBonePosCopy (AnimEditor &editor);
  215. static void SkelBonePosCopyR(AnimEditor &editor);
  216. void skelBonePosCopy (bool relative);
  217. static void SkelBonePosPaste (AnimEditor &editor);
  218. static void SkelBonePosPasteX(AnimEditor &editor);
  219. static void SkelBonePosPasteZ(AnimEditor &editor);
  220. void skelBonePosPaste (C Vec &mask);
  221. bool selected()C;
  222. void selectedChanged();
  223. ElmAnim* data()C;
  224. Animation* getVisAnim();
  225. flt timeToFrac(flt time)C;
  226. flt animTime ( )C;
  227. void animTime (flt time);
  228. void setLoop(bool loop);
  229. void setLinear(bool linear);
  230. void selBone(int bone);
  231. void setOrnTarget();
  232. void setMenu();
  233. void setMenu(Node<MenuElm> &menu, C Str &prefix);
  234. AnimEditor& create();
  235. SkelBone transformedBone(int i)C;
  236. Matrix transformedBoneAxis(int i)C;
  237. int getBone(GuiObj *go, C Vec2 &screen_pos);
  238. int boneParent(int bone)C;
  239. AnimKeys* findVisKeys(int sbon_index, bool root=true);
  240. AnimKeys* findKeys(int sbon_index, bool root=true);
  241. AnimKeys* getKeys(int sbon_index, bool root=true);
  242. AnimKeys* findKeysParent(int sbon_index, bool root=true); // return null for root, because 'findKeys' already returns root for -1, and 'findKeysParent' would return the same
  243. static int CompareKey(C AnimKeys::Orn &key, C flt &time);
  244. static int CompareKey(C AnimKeys::Pos &key, C flt &time);
  245. static int CompareKey(C AnimKeys::Scale &key, C flt &time);
  246. static AnimKeys::Orn * FindOrn (AnimKeys &keys, flt time);
  247. static AnimKeys::Pos * FindPos (AnimKeys &keys, flt time);
  248. static AnimKeys::Scale* FindScale(AnimKeys &keys, flt time);
  249. static AnimKeys::Orn & GetOrn (AnimKeys &keys, flt time, C Orient &Default);
  250. static AnimKeys::Pos & GetPos (AnimKeys &keys, flt time, C Vec &Default);
  251. static AnimKeys::Scale& GetScale(AnimKeys &keys, flt time, C Vec &Default);
  252. flt getBlend(C AnimKeys::Key &key )C;
  253. flt getBlend( flt time)C;
  254. virtual void update(C GuiPC &gpc)override;
  255. bool selectionZoom(flt &dist);
  256. bool getHit(GuiObj *go, C Vec2 &screen_pos, Vec &hit_pos);
  257. virtual void camCenter(bool zoom)override;
  258. virtual void resize()override;
  259. void frame(int d);
  260. bool delFrameOrn(int bone);
  261. bool delFramePos(int bone);
  262. bool delFrameScale(int bone);
  263. bool delFramesOrn(int bone);
  264. bool delFramesPos(int bone);
  265. bool delFramesScale(int bone);
  266. void delFrame();
  267. void delFrames();
  268. void delFramesAtEnd();
  269. void reverseFrames();
  270. void removeMovement();
  271. void freezeBone();
  272. void playToggle();
  273. void playUpdate(flt multiplier=1);
  274. void prepMeshSkel();
  275. void toGui();
  276. void applySpeed();
  277. void moveEvent(int event, flt time);
  278. void newEvent(flt time);
  279. void delEvent(int index);
  280. void renameEvent(int index, C Str &old_name, C Str &new_name);
  281. void flush();
  282. void setChanged(bool file=true);
  283. void validateFullscreen();
  284. void toggleFullscreen();
  285. void set(Elm *elm);
  286. void focus();
  287. void activate(Elm *elm);
  288. void toggle(Elm *elm);
  289. void elmChanging(C UID &elm_id);
  290. void elmChanged(C UID &elm_id);
  291. void erasing(C UID &elm_id);
  292. void setTarget(C Str &obj_id);
  293. void drag(Memc<UID> &elms, GuiObj *obj, C Vec2 &screen_pos);
  294. private:
  295. flt _anim_time;
  296. public:
  297. AnimEditor();
  298. };
  299. /******************************************************************************/
  300. /******************************************************************************/
  301. extern AnimEditor AnimEdit;
  302. /******************************************************************************/