shiveshnavin commited on
Commit
b34f990
·
1 Parent(s): 178824b

Back animation

Browse files
src/Compositions.tsx CHANGED
@@ -60,7 +60,8 @@ export const Compositions: React.FC = () => {
60
  .sort((t, u) => t.index - u.index)
61
  // .filter(item => (item.audioCaptionFile != undefined))
62
  // .slice(0, 2)
63
- .map((section) => {
 
64
  var { text, duration: durationMilis, offset, mediaAbsPaths, mediaAbsPaths, audioFullPath, title, pointers } = section
65
  mediaAbsPaths = mediaAbsPaths || mediaAbsPaths || []
66
  if (!durationMilis) {
 
60
  .sort((t, u) => t.index - u.index)
61
  // .filter(item => (item.audioCaptionFile != undefined))
62
  // .slice(0, 2)
63
+ .map((section, idx, array) => {
64
+ section.index = section.index || idx;
65
  var { text, duration: durationMilis, offset, mediaAbsPaths, mediaAbsPaths, audioFullPath, title, pointers } = section
66
  mediaAbsPaths = mediaAbsPaths || mediaAbsPaths || []
67
  if (!durationMilis) {
src/ig-reel/IGSimpleScene.tsx CHANGED
@@ -1,4 +1,3 @@
1
- //@ts-nocheck
2
  import { AbsoluteFill, Sequence, interpolate, staticFile, Audio, useCurrentFrame, Easing } from 'remotion';
3
  import React, { useEffect, useState } from 'react'
4
  import { RenderUtils } from '../RenderUtils';
@@ -90,12 +89,41 @@ export const GenerateWordGroupRanges = function (audioCaptionFile: string, setSu
90
  })
91
  }
92
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
93
  export const IGSimpleScene: React.FC<any> = (props: {
94
  script: OriginalManuscript,
95
  item: Transcript,
96
  SubtitleComponent: React.FC<any>
97
  }) => {
98
-
99
  const [subtitles, setSubtitles] = useState(undefined)
100
  const [groups, setGroups] = useState(undefined)
101
  const item: Transcript = props.item
@@ -107,7 +135,17 @@ export const IGSimpleScene: React.FC<any> = (props: {
107
  const SubtitleComponent = props.SubtitleComponent
108
  let speechPath = RenderUtils.getFileName(item?.audioFullPath)
109
 
110
-
 
 
 
 
 
 
 
 
 
 
111
  useEffect(() => {
112
  if (audioCaptionFile)
113
  GenerateWordGroupRanges(audioCaptionFile, setSubtitles, setGroups)
@@ -120,40 +158,19 @@ export const IGSimpleScene: React.FC<any> = (props: {
120
  let itemDurationInFrames = item.durationInSeconds * fps
121
  // console.log('scriptItem.offset', frame, itemDurationInFrames)
122
 
123
- const foregroundOpacity = item.transition_type == 'none' ? 0 : interpolate(
124
  frame,
125
  [0, 10, itemDurationInFrames - 10, itemDurationInFrames],
126
  [1, 0, 0, item.index >= props?.script?.transcript?.length - 1 ? 0 : 1]
127
- );
128
 
129
 
130
  let curSecond: Number = frame / fps
131
  let word = RenderUtils.findCurrentWord(curSecond, subtitles)
132
  let group: Group = RenderUtils.findCurrentGroupByTime(curSecond, groups)
133
 
134
- let currentDisplayMedia: DisplayMedia = (item?.mediaAbsPaths || [])[0]
135
 
136
- if (!_.isEmpty(item?.mediaAbsPaths)) {
137
- let frameOffest = 0
138
- for (let i = 0; i < item?.mediaAbsPaths.length; i++) {
139
- const media: SectionMedia = item.mediaAbsPaths[i];
140
- media.idx = i
141
- media.startFrame = frameOffest
142
- if (media.durationSec == undefined) {
143
- media.durationSec = durationInSeconds / (item?.mediaAbsPaths.length)
144
- if (i == item.mediaAbsPaths.length - 1) {
145
- media.durationSec = durationInSeconds
146
- }
147
- }
148
- media.durationFrames = media.durationSec * fps
149
- media.endFrame = frameOffest + media.durationFrames
150
- frameOffest = frameOffest + media.durationFrames
151
- if (frame > media.startFrame && frame < media.endFrame) {
152
- currentDisplayMedia = media
153
- }
154
- }
155
-
156
- }
157
 
158
 
159
  let chunks: React.ReactNode[] = (item?.mediaAbsPaths?.map((displayMedia: DisplayMedia, i) => {
@@ -175,9 +192,8 @@ export const IGSimpleScene: React.FC<any> = (props: {
175
  let Anim = anims[frame % 9]
176
  let seed = i * displayMedia.idx
177
  Anim = RenderUtils.randomElement(anims, `x-${seed}`)
178
- console.log('Anim', Anim)
179
  const easeInOutExp = Easing.inOut(Easing.bezier(0.8, 0.22, 0.96, 0.65));
180
- if (item.transition_type == 'geometrial' || item.transition_type == undefined) {
181
  chunk.push((
182
  <TransitionSeries.Transition
183
  durationInFrames={60}
@@ -201,6 +217,13 @@ export const IGSimpleScene: React.FC<any> = (props: {
201
  height: '100%',
202
  }} className='relative'>
203
  <Audio volume={1} loop src={staticFile(speechPath)} />
 
 
 
 
 
 
 
204
  <TransitionSeries>
205
  {
206
  ...chunks
@@ -209,7 +232,7 @@ export const IGSimpleScene: React.FC<any> = (props: {
209
  </TransitionSeries>
210
 
211
  {
212
- (item.transition_type == 'graphical') &&
213
  currentDisplayMedia?.idx > -1 && (
214
  item?.mediaAbsPaths?.map((displayMedia: DisplayMedia, i) => {
215
  let transitionsByMood = Transitions.filter(t => t.mood?.indexOf("happy") > -1)
 
 
1
  import { AbsoluteFill, Sequence, interpolate, staticFile, Audio, useCurrentFrame, Easing } from 'remotion';
2
  import React, { useEffect, useState } from 'react'
3
  import { RenderUtils } from '../RenderUtils';
 
89
  })
90
  }
91
 
92
+ export function calculateDisplayMedia(
93
+ item: Transcript,
94
+ durationInSeconds: number,
95
+ frame: number,
96
+ fps: number) {
97
+ let currentDisplayMedia: DisplayMedia = (item?.mediaAbsPaths as any || [])[0]
98
+ if (!_.isEmpty(item?.mediaAbsPaths)) {
99
+ let frameOffest = 0
100
+ for (let i = 0; i < item?.mediaAbsPaths.length; i++) {
101
+ const media: DisplayMedia = item.mediaAbsPaths[i] as any;
102
+ media.idx = i
103
+ media.startFrame = frameOffest
104
+ if (media.durationSec == undefined) {
105
+ media.durationSec = durationInSeconds / (item?.mediaAbsPaths.length)
106
+ if (i == item.mediaAbsPaths.length - 1) {
107
+ media.durationSec = durationInSeconds
108
+ }
109
+ }
110
+ media.durationFrames = media.durationSec * fps
111
+ media.endFrame = frameOffest + media.durationFrames
112
+ frameOffest = frameOffest + media.durationFrames
113
+ if (frame > media.startFrame && frame < media.endFrame) {
114
+ currentDisplayMedia = media
115
+ }
116
+ }
117
+
118
+ }
119
+ return currentDisplayMedia
120
+ }
121
+
122
  export const IGSimpleScene: React.FC<any> = (props: {
123
  script: OriginalManuscript,
124
  item: Transcript,
125
  SubtitleComponent: React.FC<any>
126
  }) => {
 
127
  const [subtitles, setSubtitles] = useState(undefined)
128
  const [groups, setGroups] = useState(undefined)
129
  const item: Transcript = props.item
 
135
  const SubtitleComponent = props.SubtitleComponent
136
  let speechPath = RenderUtils.getFileName(item?.audioFullPath)
137
 
138
+ const itemIdx = item.index;
139
+ const isLastScene = script.transcript[script.transcript?.length - 1]?.index == itemIdx
140
+ const nextScene = script.transcript.find(i => i.index == itemIdx + 1);
141
+ let nextSceneMedia0 = nextScene?.mediaAbsPaths as any as DisplayMedia;
142
+ console.log('item.index', item.index,
143
+ 'nextSceneMedia0', nextSceneMedia0,
144
+ "isLastScene", isLastScene,
145
+ 'item?.mediaAbsPaths?.[0]', item?.mediaAbsPaths?.[0])
146
+ if (nextSceneMedia0) {
147
+ nextSceneMedia0 = calculateDisplayMedia(nextScene as Transcript, durationInSeconds, frame, fps)
148
+ }
149
  useEffect(() => {
150
  if (audioCaptionFile)
151
  GenerateWordGroupRanges(audioCaptionFile, setSubtitles, setGroups)
 
158
  let itemDurationInFrames = item.durationInSeconds * fps
159
  // console.log('scriptItem.offset', frame, itemDurationInFrames)
160
 
161
+ const foregroundOpacity = item.transition_type?.includes("facde") ? interpolate(
162
  frame,
163
  [0, 10, itemDurationInFrames - 10, itemDurationInFrames],
164
  [1, 0, 0, item.index >= props?.script?.transcript?.length - 1 ? 0 : 1]
165
+ ) : 0;
166
 
167
 
168
  let curSecond: Number = frame / fps
169
  let word = RenderUtils.findCurrentWord(curSecond, subtitles)
170
  let group: Group = RenderUtils.findCurrentGroupByTime(curSecond, groups)
171
 
172
+ let currentDisplayMedia: DisplayMedia = calculateDisplayMedia(item, durationInSeconds, frame, fps)
173
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
174
 
175
 
176
  let chunks: React.ReactNode[] = (item?.mediaAbsPaths?.map((displayMedia: DisplayMedia, i) => {
 
192
  let Anim = anims[frame % 9]
193
  let seed = i * displayMedia.idx
194
  Anim = RenderUtils.randomElement(anims, `x-${seed}`)
 
195
  const easeInOutExp = Easing.inOut(Easing.bezier(0.8, 0.22, 0.96, 0.65));
196
+ if (!isLastScene && (item.transition_type?.includes('geometrial') || item.transition_type == undefined)) {
197
  chunk.push((
198
  <TransitionSeries.Transition
199
  durationInFrames={60}
 
217
  height: '100%',
218
  }} className='relative'>
219
  <Audio volume={1} loop src={staticFile(speechPath)} />
220
+ {
221
+ nextSceneMedia0 && (
222
+ <TransitionSeries.Sequence durationInFrames={nextSceneMedia0.durationFrames || itemDurationInFrames}>
223
+ <IGMediaRender curZoom={1} displayMedia={nextSceneMedia0} />
224
+ </TransitionSeries.Sequence>
225
+ )
226
+ }
227
  <TransitionSeries>
228
  {
229
  ...chunks
 
232
  </TransitionSeries>
233
 
234
  {
235
+ (item.transition_type?.includes("graphical")) && !isLastScene &&
236
  currentDisplayMedia?.idx > -1 && (
237
  item?.mediaAbsPaths?.map((displayMedia: DisplayMedia, i) => {
238
  let transitionsByMood = Transitions.filter(t => t.mood?.indexOf("happy") > -1)