- {/* Engine section/side panel */}
-
-
-
-
-
- {/* Top controls */}
-
-
- {/* Bottom controls */}
-
-
- {appUiState.viewMode === APPUI_VIEW_MODES.SIDE_BY_SIDE && (
-
- )}
-
-
-
-
- {/* Side panel */}
-
-
-
+ <>
+
-
- {/* Timeline */}
-
+ >
);
};
diff --git a/app/pages/PageEnigma/PageStyling.tsx b/app/pages/PageEnigma/PageStyling.tsx
new file mode 100644
index 0000000000..d518650763
--- /dev/null
+++ b/app/pages/PageEnigma/PageStyling.tsx
@@ -0,0 +1,68 @@
+import { useSignals } from "@preact/signals-react/runtime";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { faAngleLeft } from "@fortawesome/pro-solid-svg-icons";
+import { Button, Link } from "~/components";
+import { StyleSelection } from "~/pages/PageEnigma/comps/StyleSelection";
+import { LowerPanel } from "~/modules/LowerPanel";
+import { TimerGrid } from "~/pages/PageEnigma/comps/TimerGrid/TimerGrid";
+import { Scrubber } from "~/pages/PageEnigma/comps/Timeline/Scrubber";
+import { PreviewImages } from "~/pages/PageEnigma/comps/PreviewImages";
+import { TopBar } from "~/modules/TopBar";
+import { useContext } from "react";
+import { EngineContext } from "~/contexts/EngineContext";
+
+interface Props {
+ setPage: (page: string) => void;
+}
+
+export const PageStyling = ({ setPage }: Props) => {
+ useSignals();
+ const editorEngine = useContext(EngineContext);
+
+ const generateFrame = async () => {
+ await editorEngine?.generateFrame();
+ };
+
+ const generateMovie = async () => {
+ await editorEngine?.generateVideo();
+ };
+
+ const switchEdit = () => {
+ editorEngine?.switchEdit();
+ setPage("edit");
+ }
+
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/app/pages/PageEnigma/comps/ControlPanelSceneObject/ControlPanelSceneObject.tsx b/app/pages/PageEnigma/comps/ControlPanelSceneObject/ControlPanelSceneObject.tsx
index d736eb492b..8d0f0f8642 100644
--- a/app/pages/PageEnigma/comps/ControlPanelSceneObject/ControlPanelSceneObject.tsx
+++ b/app/pages/PageEnigma/comps/ControlPanelSceneObject/ControlPanelSceneObject.tsx
@@ -7,12 +7,12 @@ import {
} from "@fortawesome/pro-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { AppUiContext } from "../../contexts/AppUiContext";
-import { EngineContext } from "../../contexts/EngineContext";
+import { AppUiContext } from "../../../../contexts/AppUiContext";
+import { EngineContext } from "../../../../contexts/EngineContext";
import { Button, H5, InputVector } from "~/components";
import { XYZ } from "../../datastructures/common";
-import { ACTION_TYPES } from "../../reducers/appUiReducer/types";
+import { ACTION_TYPES } from "~/reducers/appUiReducer/types";
import { QueueNames } from "../../Queue/QueueNames";
import Queue from "~/pages/PageEnigma/Queue/Queue";
diff --git a/app/pages/PageEnigma/comps/Controls3D/Controls3D.tsx b/app/pages/PageEnigma/comps/Controls3D/Controls3D.tsx
index fed4fa9829..66020a93e5 100644
--- a/app/pages/PageEnigma/comps/Controls3D/Controls3D.tsx
+++ b/app/pages/PageEnigma/comps/Controls3D/Controls3D.tsx
@@ -1,4 +1,5 @@
import {
+ faAngleRight,
faArrowsRotate,
faArrowsUpDownLeftRight,
faCube,
@@ -10,16 +11,18 @@ import {
fa3dTorus,
fa3dSphere,
} from "@awesome.me/kit-fde2be5eb0/icons/kit/custom";
-import { ButtonIcon, ButtonIconSelect } from "~/components";
-import { EngineContext } from "../../contexts/EngineContext";
+import { Button, ButtonIcon, ButtonIconSelect, Link } from "~/components";
+import { EngineContext } from "../../../../contexts/EngineContext";
import { useContext } from "react";
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-export const Controls3D = () => {
+interface Props {
+ setPage: (page: string) => void;
+}
+
+export const Controls3D = ({ setPage }: Props) => {
const editorEngine = useContext(EngineContext);
- const handlePlus = () => {
- console.log("Controls 3D: Plus button clicked");
- };
const handleMoveArrows = () => {
if (!editorEngine) {
return;
@@ -55,6 +58,11 @@ export const Controls3D = () => {
}
};
+ const changeStylize = () => {
+ editorEngine?.switchPreview();
+ setPage("style");
+ }
+
const modes = [
{ value: "move", icon: faArrowsUpDownLeftRight },
{ value: "rotate", icon: faArrowsRotate },
@@ -66,14 +74,16 @@ export const Controls3D = () => {
-
-
-
-
+
+
+
+
diff --git a/app/pages/PageEnigma/comps/ControlsTopButtons/ControlsTopButtons.tsx b/app/pages/PageEnigma/comps/ControlsTopButtons/ControlsTopButtons.tsx
index dcc148adcb..07ab5dd9cd 100644
--- a/app/pages/PageEnigma/comps/ControlsTopButtons/ControlsTopButtons.tsx
+++ b/app/pages/PageEnigma/comps/ControlsTopButtons/ControlsTopButtons.tsx
@@ -1,9 +1,9 @@
import { useContext, useState } from "react";
import { Input } from "~/components";
import { ButtonDialogue } from "~/modules/ButtonDialogue";
-import { EngineContext } from "../../contexts/EngineContext";
-import { ToasterContext } from "~/pages/PageEnigma/contexts/ToasterContext";
-// import { APPUI_ACTION_TYPES } from "~/pages/PageEnigma/reducers";
+import { EngineContext } from "../../../../contexts/EngineContext";
+import { ToasterContext } from "~/contexts/ToasterContext";
+// import { APPUI_ACTION_TYPES } from "app/reducers";
import { TestFeaturesButtons } from "./TestFeaturesButtons";
@@ -20,7 +20,7 @@ export const ControlsTopButtons = () => {
const handleButtonSave = async () => {
console.log(`SceneName is ${sceneName}`);
const sceneMediaToken = await editorEngine?.saveScene(sceneName);
- if(sceneMediaToken){
+ if (sceneMediaToken) {
addToast("success", sceneMediaToken);
}
};
diff --git a/app/pages/PageEnigma/comps/ControlsTopButtons/TestFeaturesButtons.tsx b/app/pages/PageEnigma/comps/ControlsTopButtons/TestFeaturesButtons.tsx
index 763a6b662a..ae530bad9c 100644
--- a/app/pages/PageEnigma/comps/ControlsTopButtons/TestFeaturesButtons.tsx
+++ b/app/pages/PageEnigma/comps/ControlsTopButtons/TestFeaturesButtons.tsx
@@ -1,9 +1,9 @@
import { useContext } from "react";
import { Button, } from "~/components";
import { ClipGroup } from "~/pages/PageEnigma/models/track";
-import { APPUI_ACTION_TYPES } from "../../reducers";
-import { AppUiContext } from "../../contexts/AppUiContext";
-import { EngineContext } from "../../contexts/EngineContext";
+import { APPUI_ACTION_TYPES } from "~/reducers";
+import { AppUiContext } from "~/contexts/AppUiContext";
+import { EngineContext } from "~/contexts/EngineContext";
export const TestFeaturesButtons = ({debug}:{debug:boolean})=>{
if (!debug) return null;
diff --git a/app/pages/PageEnigma/comps/ControlsVideo/ControlsVideo.tsx b/app/pages/PageEnigma/comps/ControlsVideo/ControlsVideo.tsx
index dd3ce0c84a..86cc4d8fb2 100644
--- a/app/pages/PageEnigma/comps/ControlsVideo/ControlsVideo.tsx
+++ b/app/pages/PageEnigma/comps/ControlsVideo/ControlsVideo.tsx
@@ -7,7 +7,7 @@ import {
faPlay,
} from "@fortawesome/pro-solid-svg-icons";
import { ButtonIcon } from "~/components";
-import { EngineContext } from "../../contexts/EngineContext";
+import { EngineContext } from "../../../../contexts/EngineContext";
export const ControlsVideo = () => {
const editorEngine = useContext(EngineContext);
diff --git a/app/pages/PageEnigma/comps/DialogueTTS/DialogueTTS.tsx b/app/pages/PageEnigma/comps/DialogueTTS/DialogueTTS.tsx
index 7d674e2882..061e1c02b4 100644
--- a/app/pages/PageEnigma/comps/DialogueTTS/DialogueTTS.tsx
+++ b/app/pages/PageEnigma/comps/DialogueTTS/DialogueTTS.tsx
@@ -4,12 +4,12 @@ import { v4 as uuidv4 } from "uuid";
import {
faVolume,
faShuffle,
- faPlay,
+ // faPlay,
faBrainCircuit,
} from "@fortawesome/pro-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
-import { AppUiContext } from "../../contexts/AppUiContext";
-import { APPUI_ACTION_TYPES } from "../../reducers";
+import { AppUiContext } from "~/contexts/AppUiContext";
+import { APPUI_ACTION_TYPES } from "~/reducers";
import {
Button,
H2,
diff --git a/app/pages/PageEnigma/comps/PreviewEngineCamera/index.tsx b/app/pages/PageEnigma/comps/PreviewEngineCamera/index.tsx
index babadfe83f..a68523d513 100644
--- a/app/pages/PageEnigma/comps/PreviewEngineCamera/index.tsx
+++ b/app/pages/PageEnigma/comps/PreviewEngineCamera/index.tsx
@@ -1,7 +1,6 @@
import { useContext, useEffect, useState } from "react";
-import { EngineContext } from "../../contexts/EngineContext";
-import { Button, Input } from "~/components";
-import { LoadingDotsTyping } from "~/components";
+import { EngineContext } from "../../../../contexts/EngineContext";
+import { Button, Input, LoadingDotsTyping } from "~/components";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCameraViewfinder } from "@fortawesome/pro-solid-svg-icons";
diff --git a/app/pages/PageEnigma/comps/PreviewImages.tsx b/app/pages/PageEnigma/comps/PreviewImages.tsx
new file mode 100644
index 0000000000..dbae3b5f65
--- /dev/null
+++ b/app/pages/PageEnigma/comps/PreviewImages.tsx
@@ -0,0 +1,52 @@
+import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
+import { faArrowRight } from "@fortawesome/pro-solid-svg-icons";
+import { useSignals } from "@preact/signals-react/runtime";
+import { pageHeight, pageWidth } from "~/store";
+
+export const PreviewImages = () => {
+ useSignals();
+
+ const imageWidth1 = pageWidth.value > 1340 ? 630 : (pageWidth.value - 80) / 2;
+ const imageHeight1 = imageWidth1 * 0.56;
+ const imageHeight2 = pageHeight.value > 1138 ? 354 : pageHeight.value - 620;
+ const imageWidth2 = imageHeight2 / 0.56;
+
+ const imageWidth = imageHeight1 < imageHeight2 ? imageWidth1 : imageWidth2;
+ const imageHeight = imageHeight1 < imageHeight2 ? imageHeight1 : imageHeight2;
+
+ const textClasses = [
+ "flex items-center justify-center",
+ "w-full rounded-t-lg bg-ui-controls h-[34px]",
+ "text-sm font-semibold",
+ ].join(" ");
+
+ return (
+
+
+
+
+
+
+
Styled Preview
+
+
![]()
+
+
+
+ );
+};
diff --git a/app/pages/PageEnigma/comps/SidePanelTabs/AudioTabComponent/AudioTabComponent.tsx b/app/pages/PageEnigma/comps/SidePanelTabs/AudioTabComponent/AudioTabComponent.tsx
index c685ebb909..26e292bc2a 100644
--- a/app/pages/PageEnigma/comps/SidePanelTabs/AudioTabComponent/AudioTabComponent.tsx
+++ b/app/pages/PageEnigma/comps/SidePanelTabs/AudioTabComponent/AudioTabComponent.tsx
@@ -3,9 +3,9 @@ import { twMerge } from "tailwind-merge";
import { useSignals, useSignalEffect } from "@preact/signals-react/runtime";
import { faCirclePlus, faArrowsRotate } from "@fortawesome/pro-solid-svg-icons";
-import { AppUiContext } from "~/pages/PageEnigma/contexts/AppUiContext";
+import { AppUiContext } from "~/contexts/AppUiContext";
import { AuthenticationContext } from "~/contexts/Authentication";
-import { APPUI_ACTION_TYPES } from "~/pages/PageEnigma/reducers";
+import { APPUI_ACTION_TYPES } from "~/reducers";
import { audioFilter, audioItems } from "~/pages/PageEnigma/store";
import { AssetFilterOption } from "~/pages/PageEnigma/models";
diff --git a/app/pages/PageEnigma/comps/SidePanelTabs/TabStylization.tsx b/app/pages/PageEnigma/comps/SidePanelTabs/TabStylization.tsx
index f2b61ed00d..816fc0dda9 100644
--- a/app/pages/PageEnigma/comps/SidePanelTabs/TabStylization.tsx
+++ b/app/pages/PageEnigma/comps/SidePanelTabs/TabStylization.tsx
@@ -2,11 +2,10 @@ import { useContext, useState } from "react";
import { Button, ItemPicker, Label, Textarea } from "~/components";
-import { AppUiContext } from "../../contexts/AppUiContext";
-import { APPUI_ACTION_TYPES, APPUI_VIEW_MODES } from "../../reducers";
-import { EngineContext } from "../../contexts/EngineContext";
+import { AppUiContext } from "~/contexts/AppUiContext";
+import { APPUI_ACTION_TYPES, APPUI_VIEW_MODES } from "~/reducers";
+import { EngineContext } from "~/contexts/EngineContext";
import { ArtStyle } from "../../js/api_manager";
-import { ignoreDelete } from "~/pages/PageEnigma/store";
export const TabStylization = () => {
const [appUiState, dispatchAppUiState] = useContext(AppUiContext);
diff --git a/app/pages/PageEnigma/comps/SidePanelTabs/tabList.tsx b/app/pages/PageEnigma/comps/SidePanelTabs/tabList.tsx
index 2042e7d6df..d5b0abfc03 100644
--- a/app/pages/PageEnigma/comps/SidePanelTabs/tabList.tsx
+++ b/app/pages/PageEnigma/comps/SidePanelTabs/tabList.tsx
@@ -6,6 +6,12 @@ import { AudioTab } from "~/pages/PageEnigma/comps/SidePanelTabs/itemTabs/AudioT
import { TabStylization } from "~/pages/PageEnigma/comps/SidePanelTabs/TabStylization";
import { CameraTab } from "./itemTabs/CameraTab";
export const tabList = [
+ {
+ icon: "resources/icons/characters.png",
+ title: "Characters",
+ value: AssetType.CHARACTER,
+ component:
,
+ },
{
icon: "resources/icons/animations.png",
title: "Animation",
@@ -24,12 +30,6 @@ export const tabList = [
value: AssetType.SHAPE,
component:
,
},
- {
- icon: "resources/icons/characters.png",
- title: "Characters",
- value: AssetType.CHARACTER,
- component:
,
- },
{
icon: "resources/icons/camera.png",
title: "Camera",
@@ -42,10 +42,4 @@ export const tabList = [
value: AssetType.AUDIO,
component:
,
},
- {
- icon: "resources/icons/objects.png",
- title: "Style (Temporary being moved)",
- value: AssetType.STYLE,
- component:
,
- },
];
diff --git a/app/pages/PageEnigma/comps/StyleSelection.tsx b/app/pages/PageEnigma/comps/StyleSelection.tsx
new file mode 100644
index 0000000000..2937074c9f
--- /dev/null
+++ b/app/pages/PageEnigma/comps/StyleSelection.tsx
@@ -0,0 +1,123 @@
+import { useContext, useState } from "react";
+
+import { ButtonIcon, ItemPicker, Label, Textarea } from "~/components";
+
+import { EngineContext } from "~/contexts/EngineContext";
+import { ArtStyle } from "~/pages/PageEnigma/js/api_manager";
+import { faAngleLeft, faAngleRight } from "@fortawesome/pro-solid-svg-icons";
+import { styleList } from "~/pages/PageEnigma/styleList";
+
+export const StyleSelection = () => {
+ const [selection, setSelection] = useState
(styleList[0].type);
+ const [scrollPosition, setScrollPosition] = useState(0);
+
+ const editorEngine = useContext(EngineContext);
+
+ const handlePickingStylizer = (picked: ArtStyle) => {
+ console.log(`Picked style: ${picked}`);
+ setSelection(picked);
+ if (editorEngine === null) {
+ console.log("Editor is null");
+ return;
+ }
+ editorEngine.art_style = picked;
+ };
+
+ const onChangeHandlerNegative = (
+ e: React.ChangeEvent,
+ ) => {
+ if (editorEngine == null) {
+ console.log("Editor is null");
+ return;
+ }
+ editorEngine.negative_prompt = e.target.value;
+ console.log(e.target.value);
+ };
+
+ const onChangeHandlerPositive = (
+ e: React.ChangeEvent,
+ ) => {
+ if (editorEngine == null) {
+ console.log("Editor is null");
+ return;
+ }
+ editorEngine.positive_prompt = e.target.value;
+ console.log(e.target.value);
+ };
+
+ return (
+
+
+
+
+
+ {styleList.map((style) => (
+
+ ))}
+
+ {scrollPosition > 0 && (
+
+
+ setScrollPosition(Math.max(scrollPosition - 6, 0))
+ }
+ />
+
+ )}
+ {scrollPosition < styleList.length - 9 && (
+
+
+ setScrollPosition(
+ Math.min(scrollPosition + 6, styleList.length - 9),
+ )
+ }
+ fill
+ />
+
+ )}
+
+
+
+
+
+
+
+
+ );
+};
diff --git a/app/pages/PageEnigma/comps/Timeline/TrackKeyFrame.tsx b/app/pages/PageEnigma/comps/Timeline/TrackKeyFrame.tsx
index 600f99c9f5..a194f09adf 100644
--- a/app/pages/PageEnigma/comps/Timeline/TrackKeyFrame.tsx
+++ b/app/pages/PageEnigma/comps/Timeline/TrackKeyFrame.tsx
@@ -3,7 +3,7 @@ import { filmLength, scale, selectedItem } from "~/pages/PageEnigma/store";
import { useMouseEventsKeyframe } from "~/pages/PageEnigma/comps/Timeline/utils/useMouseEventsKeyframe";
import { useSignals } from "@preact/signals-react/runtime";
import { useContext } from "react";
-import { ToasterContext } from "~/pages/PageEnigma/contexts/ToasterContext";
+import { ToasterContext } from "~/contexts/ToasterContext";
interface Props {
keyframe: Keyframe;
diff --git a/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsScrubber.ts b/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsScrubber.ts
index d8ca0c1edf..7a066836d4 100644
--- a/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsScrubber.ts
+++ b/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsScrubber.ts
@@ -31,8 +31,6 @@ export const useMouseEventsScrubber = () => {
}
};
- console.log("scroll", currentScroll.value);
-
const onMouseMove = (event: MouseEvent) => {
const delta = Math.round(
(event.clientX - clientX) / 4 / scale.value + currentTime.value,
diff --git a/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsTimeline.ts b/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsTimeline.ts
index 31aa752cf4..5c53a71b00 100644
--- a/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsTimeline.ts
+++ b/app/pages/PageEnigma/comps/Timeline/utils/useMouseEventsTimeline.ts
@@ -1,9 +1,6 @@
import React, { useCallback, useEffect, useState } from "react";
-import {
- dndTimelineHeight,
- pageHeight,
- timelineHeight,
-} from "~/pages/PageEnigma/store";
+import { dndTimelineHeight, timelineHeight } from "~/pages/PageEnigma/store";
+import { pageHeight } from "~/store";
export const useMouseEventsTimeline = () => {
const [isActive, setIsActive] = useState(false);
diff --git a/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx b/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx
index 2006974a60..17a2f65770 100644
--- a/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx
+++ b/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx
@@ -1,42 +1,45 @@
import { useEffect, useState, useContext } from "react";
import { LoadingDotsBricks } from "~/components";
-import { EngineContext } from "../../contexts/EngineContext";
+import { EngineContext } from "../../../../contexts/EngineContext";
-export const ViewSideBySide = ()=>{
+export const ViewSideBySide = () => {
const [showLoader, setShowLoader] = useState(true);
const editorEngine = useContext(EngineContext);
- useEffect(()=>{
+ useEffect(() => {
editorEngine?.generateFrame();
- setTimeout(()=>setShowLoader(false), 200);
- },[ ]);
+ setTimeout(() => setShowLoader(false), 200);
+ }, []);
return (
-
+
-
![]()
+
-
+
-
![]()
+
-
- )
-}
\ No newline at end of file
+ );
+};
diff --git a/app/pages/PageEnigma/contexts/EngineProvider.tsx b/app/pages/PageEnigma/contexts/EngineProvider.tsx
deleted file mode 100644
index 2428a5a529..0000000000
--- a/app/pages/PageEnigma/contexts/EngineProvider.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import { ReactNode, useContext, useEffect, useState } from "react";
-
-import Editor from "~/pages/PageEnigma/js/editor";
-
-import { EngineContext } from "./EngineContext";
-import { AppUiContext } from "./AppUiContext";
-
-interface Props {
- children: ReactNode;
-}
-
-export const EngineProvider = ({ children }: Props) => {
- const [editor, setEditor] = useState
(null);
- const [appUiState, dispatchAppUiState] = useContext(AppUiContext);
- // To talk to react land.
-
- useEffect(() => {
- //componentDidMount
- if (document.getElementById("video-scene") === null) {
- console.error(
- 'Editor Engine need a target canvas with the id "video-scene"',
- );
- } else {
- setEditor((curr) => {
- if (curr !== null) {
- console.warn("Editor Engine already exist");
- return curr;
- } else {
- return new Editor();
- }
- });
- }
- }, []);
-
- useEffect(() => {
- if (editor && editor.can_initialize && dispatchAppUiState !== null) {
- console.log("initializing Editor");
- editor.initialize({
- dispatchAppUiState,
- });
- }
- }, [editor, dispatchAppUiState]);
-
- return (
- {children}
- );
-};
diff --git a/app/pages/PageEnigma/contexts/TrackContext/utils/useUpdateKeyframe.ts b/app/pages/PageEnigma/contexts/TrackContext/utils/useUpdateKeyframe.ts
index 0a3b3b8d90..0f779acaf7 100644
--- a/app/pages/PageEnigma/contexts/TrackContext/utils/useUpdateKeyframe.ts
+++ b/app/pages/PageEnigma/contexts/TrackContext/utils/useUpdateKeyframe.ts
@@ -13,7 +13,7 @@ import {
deleteCharacterKeyframe,
deleteObjectKeyframe,
} from "~/pages/PageEnigma/store";
-import { ToasterContext } from "~/pages/PageEnigma/contexts/ToasterContext";
+import { ToasterContext } from "~/contexts/ToasterContext";
const ADD_KEYFRAME: Record<
ClipGroup,
diff --git a/app/pages/PageEnigma/js/api_manager.ts b/app/pages/PageEnigma/js/api_manager.ts
index 0ed80bf05d..8657109208 100644
--- a/app/pages/PageEnigma/js/api_manager.ts
+++ b/app/pages/PageEnigma/js/api_manager.ts
@@ -348,7 +348,7 @@ export class APIManager {
positive_prompt: string,
negative_prompt: string,
): Promise {
- const url = `https://funnel.tailce84f.ts.net/preview/`;
+ const url = 'http://207.189.112.61:31605/preview';
const payload = {
style: style,
@@ -357,7 +357,7 @@ export class APIManager {
};
const formData = new FormData();
- formData.append("video", blob, fileName);
+ formData.append("input_file", blob, fileName);
formData.append("request", JSON.stringify(payload));
const response = await fetch(url, {
diff --git a/app/pages/PageEnigma/js/editor.ts b/app/pages/PageEnigma/js/editor.ts
index a33026252c..805fc5bdff 100644
--- a/app/pages/PageEnigma/js/editor.ts
+++ b/app/pages/PageEnigma/js/editor.ts
@@ -21,7 +21,7 @@ import { LipSyncEngine } from "./lip_sync_engine.js";
import { AnimationEngine } from "./animation_engine.js";
import { PointerLockControls } from "three/addons/controls/PointerLockControls.js";
-import { APPUI_ACTION_TYPES } from "../reducers";
+import { APPUI_ACTION_TYPES } from "../../../reducers";
import { ClipGroup } from "~/pages/PageEnigma/models/track";
import { XYZ } from "../datastructures/common";
@@ -90,6 +90,8 @@ class Editor {
current_scene_glb_media_token: string | null;
can_initialize: boolean;
+ switchPreviewToggle: boolean;
+
dispatchAppUiState: any; // todo figure out the type
render_width: number;
render_height: number;
@@ -150,6 +152,7 @@ class Editor {
this.last_selected;
this.transform_interaction;
this.rendering = false;
+ this.switchPreviewToggle = false;
// API.
this.api_manager = new APIManager();
// Debug & Movement.
@@ -366,7 +369,7 @@ class Editor {
console.log(result);
}
- public async testTestTimelineEvents() {}
+ public async testTestTimelineEvents() { }
public async loadScene(scene_media_token: string) {
this.dispatchAppUiState({
@@ -679,8 +682,6 @@ class Editor {
if (this.timeline.is_playing == false) {
this.stopPlayback();
this.playback_location = 0;
- this.rendering = false;
- this.switchCameraView();
this.onWindowResize();
}
}
@@ -805,10 +806,10 @@ class Editor {
audioSegment,
"-filter_complex",
"[1:a]adelay=" +
- startTime * 1000 +
- "|" +
- startTime * 1000 +
- "[a1];[0:a][a1]amix=inputs=2[a]",
+ startTime * 1000 +
+ "|" +
+ startTime * 1000 +
+ "[a1];[0:a][a1]amix=inputs=2[a]",
"-map",
"[a]",
`${itteration}final_tmp.wav`,
@@ -834,13 +835,13 @@ class Editor {
}
async stopPlayback(compile_audio: boolean = true) {
- console.log(this.frames, this.frame_buffer.length);
-
- this.renderMode();
if (this.generating_preview) {
return;
}
+
+ this.rendering = false;
+
this.generating_preview = true;
const ffmpeg = createFFmpeg({ log: true });
await ffmpeg.load();
@@ -922,6 +923,32 @@ class Editor {
console.log(result);
}
+ switchPreview() {
+ if (this.switchPreviewToggle == false) {
+ this.switchPreviewToggle = true;
+ this.generateFrame();
+ if (this.cameraViewControls) {
+ this.cameraViewControls.enabled = false;
+ }
+ }
+ }
+
+ switchEdit() {
+ if (this.switchPreviewToggle == true) {
+ this.switchPreviewToggle = false;
+ this.canvasRenderCamReference = document.getElementById("camera-view");
+ this.rawRenderer = new THREE.WebGLRenderer({
+ antialias: false,
+ canvas: this.canvasRenderCamReference,
+ preserveDrawingBuffer: true,
+ });
+ if (this.camera_person_mode == true) {
+ this.switchCameraView();
+ }
+ this.activeScene.renderMode(false);
+ }
+ }
+
async generateFrame() {
if (this.renderer && !this.generating_preview) {
this.removeTransformControls();
@@ -944,54 +971,55 @@ class Editor {
this.activeScene.renderMode(false);
this.onWindowResize();
- const rawPreview: HTMLVideoElement | null = document.getElementById(
- "raw-preview",
- ) as HTMLVideoElement;
- if (rawPreview) {
- rawPreview.src = imgData;
-
- const ffmpeg = createFFmpeg({ log: false });
- await ffmpeg.load();
- await ffmpeg.FS("writeFile", `render.png`, await fetchFile(imgData));
- await ffmpeg.run("-i", `render.png`, "render.mp4");
- const output = await ffmpeg.FS("readFile", "render.mp4");
- const blob = new Blob([output.buffer], { type: "video/mp4" });
-
- const url = await this.api_manager.uploadMediaFrameGeneration(
- blob,
- "render.mp4",
- this.art_style,
- this.positive_prompt,
- this.negative_prompt,
- );
- console.log(url);
-
- const stylePreview: HTMLVideoElement | null = document.getElementById(
- "stylized-preview",
- ) as HTMLVideoElement;
- if (stylePreview) {
- stylePreview.src = url;
- stylePreview.width = rawPreview.width;
- stylePreview.height = rawPreview.height;
- } else {
- console.log("No style preview window.");
- }
-
- this.generating_preview = false;
-
- return new Promise((resolve, reject) => {
- resolve(url);
- });
- } else {
- console.log("No raw preview window.");
+ this.canvasRenderCamReference = document.getElementById("raw-preview");
+ this.rawRenderer = new THREE.WebGLRenderer({
+ antialias: false,
+ canvas: this.canvasRenderCamReference,
+ preserveDrawingBuffer: true,
+ });
+ if (this.camera_person_mode == false) {
+ this.switchCameraView();
}
+ this.activeScene.renderMode(true);
+
+ const ffmpeg = createFFmpeg({ log: false });
+ await ffmpeg.load();
+ await ffmpeg.FS("writeFile", `render.png`, await fetchFile(imgData));
+ await ffmpeg.run("-i", `render.png`, "render.mp4");
+ const output = await ffmpeg.FS("readFile", "render.mp4");
+ const blob = new Blob([output.buffer], { type: "video/mp4" });
+
+ const url = await this.api_manager.uploadMediaFrameGeneration(
+ blob,
+ "render.mp4",
+ this.art_style,
+ this.positive_prompt,
+ this.negative_prompt,
+ );
+ console.log(url);
+
+ const stylePreview: HTMLVideoElement | null = document.getElementById(
+ "styled-preview",
+ ) as HTMLVideoElement;
+ if (stylePreview) {
+ stylePreview.src = url;
+ } else {
+ console.log("No style preview window.");
+ }
+
+ this.generating_preview = false;
+
+ return new Promise((resolve, reject) => {
+ resolve(url);
+ });
+
this.generating_preview = false;
}
}
// This initializes the generation of a video render scene is where the core work happens
generateVideo() {
- console.log("Generating video...");
+ console.log("Generating video...", this.frame_buffer);
if (this.rendering || this.generating_preview) {
return;
}
diff --git a/app/pages/PageEnigma/js/timeline.ts b/app/pages/PageEnigma/js/timeline.ts
index 74d910ae28..5271a39ef7 100644
--- a/app/pages/PageEnigma/js/timeline.ts
+++ b/app/pages/PageEnigma/js/timeline.ts
@@ -402,6 +402,7 @@ export class TimeLine {
public async deletePlayableClip(clip_uuid: string): Promise {}
public async scrub(data: any): Promise {
+ console.log('Scrubby Scrubby');
if (this.is_playing) {
return;
}
@@ -537,10 +538,10 @@ export class TimeLine {
await this.animation_engine.clips[
object.uuid + element.media_id
].play(object);
- let fps = 120;
- if (isRendering) {
- fps = 60;
- }
+ let fps = 60;
+ //if (isRendering) {
+ // fps = 60;
+ //}
this.animation_engine.clips[object.uuid + element.media_id].step(
this.scrubber_frame_position / fps, // Double FPS for best result.
);
diff --git a/app/pages/PageEnigma/store/media.ts b/app/pages/PageEnigma/store/media.ts
index 51167876fa..064a0121e7 100644
--- a/app/pages/PageEnigma/store/media.ts
+++ b/app/pages/PageEnigma/store/media.ts
@@ -514,7 +514,7 @@ export const characterItems = signal([
},
{
version: 1,
- media_id: "m_4wva09qznapzk5rcvbxy671d1qx2pr ",
+ media_id: "m_pwtk45wsfr5z2bavmwxh2efnwvh4rr ",
type: AssetType.CHARACTER,
name: "Story Girl",
thumbnail: "resources/characters/img13.png",
diff --git a/app/pages/PageEnigma/store/sidePanel.ts b/app/pages/PageEnigma/store/sidePanel.ts
index 7da980497e..f416771ce0 100644
--- a/app/pages/PageEnigma/store/sidePanel.ts
+++ b/app/pages/PageEnigma/store/sidePanel.ts
@@ -1,6 +1,7 @@
import { computed, signal } from "@preact/signals-core";
import { AssetFilterOption, Tab } from "~/pages/PageEnigma/models";
-import { pageHeight, timelineHeight } from "~/pages/PageEnigma/store/sizing";
+import { timelineHeight } from "~/pages/PageEnigma/store/sizing";
+import { pageHeight } from "~/store";
export const sidePanelVisible = signal(true);
diff --git a/app/pages/PageEnigma/store/sizing.ts b/app/pages/PageEnigma/store/sizing.ts
index f838c049c6..052685850f 100644
--- a/app/pages/PageEnigma/store/sizing.ts
+++ b/app/pages/PageEnigma/store/sizing.ts
@@ -2,9 +2,6 @@ import { signal, computed } from "@preact/signals-core";
import { characterGroups } from "~/pages/PageEnigma/store/characterGroups";
import { objectGroup } from "~/pages/PageEnigma/store/objectGroup";
-export const pageHeight = signal(0);
-export const pageWidth = signal(0);
-
// timeline
export const scale = signal(1);
export const filmLength = signal(12);
diff --git a/app/pages/PageEnigma/styleList.ts b/app/pages/PageEnigma/styleList.ts
new file mode 100644
index 0000000000..cdaaaa1f07
--- /dev/null
+++ b/app/pages/PageEnigma/styleList.ts
@@ -0,0 +1,84 @@
+import { ArtStyle } from "~/pages/PageEnigma/js/api_manager";
+
+export const styleList = [
+ {
+ label: "Anime",
+ type: ArtStyle.Anime2_5D,
+ image: "/resources/avatars/0.webp",
+ },
+ {
+ label: "Anime Flat",
+ type: ArtStyle.Anime2DFlat,
+ image: "/resources/avatars/1.webp",
+ },
+ {
+ label: "Cartoon 3D",
+ type: ArtStyle.Cartoon3D,
+ image: "/resources/avatars/2.webp",
+ },
+ {
+ label: "Comic Book",
+ type: ArtStyle.ComicBook,
+ image: "/resources/avatars/3.webp",
+ },
+ {
+ label: "Ghibli",
+ type: ArtStyle.AnimeGhibli,
+ image: "/resources/avatars/4.webp",
+ },
+ {
+ label: "Ink Punk",
+ type: ArtStyle.InkPunk,
+ image: "/resources/avatars/5.webp",
+ },
+ {
+ label: "Ink Splash",
+ type: ArtStyle.InkSplash,
+ image: "/resources/avatars/6.webp",
+ },
+ {
+ label: "Ink Black and White",
+ type: ArtStyle.InkBWStyle,
+ image: "/resources/avatars/7.webp",
+ },
+ {
+ label: "Jo Jo Style",
+ type: ArtStyle.JojoStyle,
+ image: "/resources/avatars/8.webp",
+ },
+ {
+ label: "Paper Origami",
+ type: ArtStyle.PaperOrigami,
+ image: "/resources/avatars/9.webp",
+ },
+ {
+ label: "Pixel",
+ type: ArtStyle.PixelArt,
+ image: "/resources/avatars/10.webp",
+ },
+ {
+ label: "Pop Art",
+ type: ArtStyle.PopArt,
+ image: "/resources/avatars/11.webp",
+ },
+ {
+ label: "Realistic 1",
+ type: ArtStyle.Realistic1,
+ image: "/resources/avatars/12.webp",
+ },
+ {
+ label: "Realistic 2",
+ type: ArtStyle.Realistic2,
+ image: "/resources/avatars/13.webp",
+ },
+ {
+ label: "Anime Retro Neon",
+ type: ArtStyle.AnimeRetroNeon,
+ image: "/resources/avatars/14.webp",
+ },
+ {
+ label: "Anime Standard",
+ type: ArtStyle.AnimeStandard,
+ image: "/resources/avatars/15.webp",
+ },
+];
diff --git a/app/pages/PageEnigma/reducers/appUiReducer/index.tsx b/app/reducers/appUiReducer/index.tsx
similarity index 100%
rename from app/pages/PageEnigma/reducers/appUiReducer/index.tsx
rename to app/reducers/appUiReducer/index.tsx
diff --git a/app/pages/PageEnigma/reducers/appUiReducer/reducer.tsx b/app/reducers/appUiReducer/reducer.tsx
similarity index 100%
rename from app/pages/PageEnigma/reducers/appUiReducer/reducer.tsx
rename to app/reducers/appUiReducer/reducer.tsx
diff --git a/app/pages/PageEnigma/reducers/appUiReducer/types.tsx b/app/reducers/appUiReducer/types.tsx
similarity index 95%
rename from app/pages/PageEnigma/reducers/appUiReducer/types.tsx
rename to app/reducers/appUiReducer/types.tsx
index 22f870c24a..279080bd7f 100644
--- a/app/pages/PageEnigma/reducers/appUiReducer/types.tsx
+++ b/app/reducers/appUiReducer/types.tsx
@@ -1,5 +1,5 @@
-import { Simple3DVector } from "../../datastructures/common";
-import { AssetType, ClipGroup } from "../../models";
+import { Simple3DVector } from "../../pages/PageEnigma/datastructures/common";
+import { AssetType, ClipGroup } from "../../pages/PageEnigma/models";
export enum VIEW_MODES {
EDITOR = "editor",
SIDE_BY_SIDE = "side-by-side",
diff --git a/app/pages/PageEnigma/reducers/appUiReducer/values.tsx b/app/reducers/appUiReducer/values.tsx
similarity index 100%
rename from app/pages/PageEnigma/reducers/appUiReducer/values.tsx
rename to app/reducers/appUiReducer/values.tsx
diff --git a/app/pages/PageEnigma/reducers/index.tsx b/app/reducers/index.tsx
similarity index 100%
rename from app/pages/PageEnigma/reducers/index.tsx
rename to app/reducers/index.tsx
diff --git a/app/root.tsx b/app/root.tsx
index 8cdb91667c..9fb106feeb 100644
--- a/app/root.tsx
+++ b/app/root.tsx
@@ -15,16 +15,18 @@ import tailwindCss from "./styles/tailwind.css?url";
import baseCss from "./styles/base.css?url";
import { LoadingDotsBricks } from "~/components";
-import { TopBar } from "./modules/TopBar";
-import { TopBarInnerContext } from "~/contexts/TopBarInner";
import { AuthenticationProvider } from "./contexts/Authentication";
-import { ToasterProvider } from "~/pages/PageEnigma/contexts/ToasterContext";
+import { ToasterProvider } from "~/contexts/ToasterContext";
// The following import prevents a Font Awesome icon server-side rendering bug,
// where the icons flash from a very large icon down to a properly sized one:
-import '@fortawesome/fontawesome-svg-core/styles.css';
+import "@fortawesome/fontawesome-svg-core/styles.css";
// Prevent fontawesome from adding its CSS since we did it manually above:
-import { config } from '@fortawesome/fontawesome-svg-core';
+import { config } from "@fortawesome/fontawesome-svg-core";
+import { useSignals } from "@preact/signals-react/runtime";
+import { pageHeight, pageWidth } from "~/store";
+import { sidePanelWidth, timelineHeight } from "~/pages/PageEnigma/store";
+import { AppUIProvider } from "~/contexts/AppUiContext";
config.autoAddCss = false; /* eslint-disable import/first */
export const links: LinksFunction = () => [
@@ -65,6 +67,25 @@ export default function App() {
setTimeout(() => setShowLoader(false), 2500);
}, []);
+ useSignals();
+ useEffect(() => {
+ function setPage() {
+ // TODO address this issue with zooming
+ pageHeight.value = window.innerHeight;
+ pageWidth.value = window.innerWidth;
+ }
+ timelineHeight.value = window.innerHeight * 0.25;
+ sidePanelWidth.value = 443;
+
+ setPage();
+
+ window.addEventListener("resize", setPage);
+
+ return () => {
+ window.removeEventListener("resize", setPage);
+ };
+ }, []);
+
return (
@@ -78,16 +99,10 @@ export default function App() {
-
+
-
-
+
diff --git a/app/routes/_index.tsx b/app/routes/_index.tsx
index 9f26515f16..26bce9aff5 100644
--- a/app/routes/_index.tsx
+++ b/app/routes/_index.tsx
@@ -1,8 +1,11 @@
-
import type { MetaFunction } from "@remix-run/deno";
import { TopBarHelmet } from "~/modules/TopBarHelmet";
import sonic from "./_assets/sonic-the-hedgehog-classic-sonic.gif";
+import { useSignals } from "@preact/signals-react/runtime";
+import { useEffect } from "react";
+import { pageHeight, pageWidth } from "~/store";
+import { sidePanelWidth, timelineHeight } from "~/pages/PageEnigma/store";
export const meta: MetaFunction = () => {
return [
@@ -20,10 +23,10 @@ export default function Index() {
src={sonic}
className="
fixed
- h-screen w-screen
- top-0 left-0
+ left-0 top-0
+ -z-10 h-screen
+ w-screen
object-cover
- -z-10
"
/>
diff --git a/app/store/global.ts b/app/store/global.ts
new file mode 100644
index 0000000000..ce57f155e1
--- /dev/null
+++ b/app/store/global.ts
@@ -0,0 +1,6 @@
+import { signal } from "@preact/signals-core";
+
+export const sceneTitle = signal("Home Office");
+
+export const pageHeight = signal(0);
+export const pageWidth = signal(0);
diff --git a/app/store/index.ts b/app/store/index.ts
new file mode 100644
index 0000000000..09370234b7
--- /dev/null
+++ b/app/store/index.ts
@@ -0,0 +1 @@
+export * from "./global";