From 8a8b823f8cbfdcb2ae0749c15c0fb16472d2d7ac Mon Sep 17 00:00:00 2001 From: Quicksticks-oss Date: Sat, 30 Mar 2024 01:16:12 -0400 Subject: [PATCH 1/6] added camera object and camera view. --- .../comps/PreviewEngineCamera/index.tsx | 6 +-- .../PageEnigma/comps/ViewSideBySide/index.tsx | 12 +----- app/pages/PageEnigma/js/editor.ts | 37 +++++++++++++++---- app/pages/PageEnigma/js/scene.ts | 27 +++++++++----- 4 files changed, 49 insertions(+), 33 deletions(-) diff --git a/app/pages/PageEnigma/comps/PreviewEngineCamera/index.tsx b/app/pages/PageEnigma/comps/PreviewEngineCamera/index.tsx index 8630ed50d9..58179c047e 100644 --- a/app/pages/PageEnigma/comps/PreviewEngineCamera/index.tsx +++ b/app/pages/PageEnigma/comps/PreviewEngineCamera/index.tsx @@ -23,11 +23,7 @@ export const PreviewEngineCamera = ()=>{
- +
diff --git a/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx b/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx index bcad3ada4c..492409b662 100644 --- a/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx +++ b/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx @@ -18,11 +18,7 @@ export const ViewSideBySide = ()=>{
- +
@@ -31,11 +27,7 @@ export const ViewSideBySide = ()=>{
- +
diff --git a/app/pages/PageEnigma/js/editor.ts b/app/pages/PageEnigma/js/editor.ts index ea619a2d3a..b2ce8c3251 100644 --- a/app/pages/PageEnigma/js/editor.ts +++ b/app/pages/PageEnigma/js/editor.ts @@ -45,8 +45,10 @@ class Editor { camera: any; render_camera: any; renderer: THREE.WebGLRenderer | undefined; + rawRenderer: THREE.WebGLRenderer | undefined; clock: THREE.Clock | undefined; canvReference: any; + canvasRenderCamReference: any; composer: EffectComposer | undefined; effectFXAA: EffectComposer | undefined; outlinePass: OutlinePass | undefined; @@ -120,6 +122,7 @@ class Editor { this.camera; this.render_camera; this.renderer; + this.rawRenderer; this.clock; this.canvReference = null; this.cam_obj; @@ -165,6 +168,8 @@ class Editor { this.render_width = 1280; this.render_height = 720; + this.canvasRenderCamReference; + this.audio_engine = new AudioEngine(); this.transform_engine = new TransformEngine(this.version); this.lipsync_engine = new LipSyncEngine(); @@ -205,16 +210,18 @@ class Editor { // Gets the canvas. this.canvReference = document.getElementById("video-scene"); + this.canvasRenderCamReference = document.getElementById("camera-view"); + // Base width and height. let width = this.canvReference.width; let height = this.canvReference.height; // Sets up camera and base position. - this.camera = new THREE.PerspectiveCamera(70, width / height, 0.1, 50); + this.camera = new THREE.PerspectiveCamera(70, width / height, 0.15, 30); this.camera.position.z = 3; this.camera.position.y = 3; this.camera.position.x = -3; - this.render_camera = new THREE.PerspectiveCamera(70, width / height, 0.1, 50); + this.render_camera = new THREE.PerspectiveCamera(70, width / height, 0.15, 30); // Base WebGL render and clock for delta time. this.renderer = new THREE.WebGLRenderer({ @@ -223,6 +230,12 @@ class Editor { preserveDrawingBuffer: true, }); + this.rawRenderer = new THREE.WebGLRenderer({ + antialias: false, + canvas: this.canvasRenderCamReference, + preserveDrawingBuffer: true, + }); + this.renderer.shadowMap.enabled = true; this.clock = new THREE.Clock(); // Resizes the renderer. @@ -271,11 +284,6 @@ class Editor { this.renderer.domElement.addEventListener("mouseup", this.onMouseUp.bind(this), false); this.renderer.domElement.addEventListener("onContextMenu", this.onContextMenu.bind(this), false); - this.cam_obj = this.activeScene.get_object_by_name("::CAM::"); - if (this.cam_obj) { - this.addTransformClipBase("Camera Object", "camera", this.cam_obj, 0, 150) - } - // saving state of the scene this.current_scene_media_token = null; this.current_scene_glb_media_token = null; @@ -301,6 +309,8 @@ class Editor { this.addTransformClipBase("Camera Object", "camera", this.cam_obj, 0, 150); } + console.log(this.cam_obj); + this.dispatchAppUiState({ type: APPUI_ACTION_TYPES.UPDATE_EDITOR_LOADINGBAR, payload: { @@ -483,6 +493,7 @@ class Editor { switchCameraView() { this.camera_person_mode = !this.camera_person_mode; + console.log("camera") if (this.cam_obj) { if (this.camera_person_mode) { this.last_cam_pos.copy(this.camera.position); @@ -723,6 +734,14 @@ class Editor { // Basicly Unity 3D's update loop. updateLoop(time: number) { + + if(this.cam_obj == undefined){ + this.cam_obj = this.activeScene.get_object_by_name("::CAM::"); + if (this.cam_obj) { + this.addTransformClipBase("Camera Object", "camera", this.cam_obj, 0, 150) + } + } + // Updates debug stats. if (this.stats != null) { this.stats.update(); @@ -977,8 +996,9 @@ class Editor { // Render the scene to the camera. renderScene() { - if (this.composer != null && !this.rendering) { + if (this.composer != null && !this.rendering && this.rawRenderer) { this.composer.render(); + this.rawRenderer.render(this.activeScene.scene, this.render_camera); } else if (this.renderer && this.render_camera) { this.renderer.setSize(this.render_width, this.render_height); this.renderer.render(this.activeScene.scene, this.render_camera); @@ -1088,6 +1108,7 @@ class Editor { this.raycaster.setFromCamera(this.mouse, this.camera); let interactable: any[] = []; this.activeScene.scene.children.forEach((child: THREE.Object3D) => { + console.log(child); if (child.name != "") { if (child.type == "Mesh" || child.type == "Object3D") { interactable.push(child); diff --git a/app/pages/PageEnigma/js/scene.ts b/app/pages/PageEnigma/js/scene.ts index 8f620aad68..2318a2091c 100644 --- a/app/pages/PageEnigma/js/scene.ts +++ b/app/pages/PageEnigma/js/scene.ts @@ -64,7 +64,7 @@ class Scene { let obj = new THREE.Mesh(geometry, material); obj.position.copy(pos); obj.receiveShadow = visable; - if(this.hot_items != undefined){ + if (this.hot_items != undefined) { this.hot_items.push(obj); } this.scene.add(obj); @@ -75,15 +75,17 @@ class Scene { } _create_camera_obj() { - let cam_obj: THREE.Object3D = new THREE.Object3D(); - cam_obj.userData["name"] = "::CAM::"; - cam_obj.name = "::CAM::"; - this.scene.add(cam_obj); + this.load_glb("/resources/models/camera/camera.glb", false).then((cam_obj) => { + cam_obj.userData["name"] = "::CAM::"; + cam_obj.name = "::CAM::"; + this.scene.add(cam_obj); + }); } - renderMode(enabled:boolean=true) { - if(this.gridHelper == undefined) { return; } - if(enabled) { + + renderMode(enabled: boolean = true) { + if (this.gridHelper == undefined) { return; } + if (enabled) { this._disable_skybox(); this.scene.remove(this.gridHelper); } else { @@ -92,7 +94,7 @@ class Scene { } } - async load_glb(filepath: string) { //: Promise { + async load_glb(filepath: string, auto_add: boolean = true): Promise { //: Promise { return new Promise((resolve) => { let glbLoader = new GLTFLoader(); glbLoader.load(filepath, (glb) => { @@ -106,7 +108,12 @@ class Scene { c.material.transparent = false; } }); - this.scene.add(child); + if (child.type == "Group") { + if (auto_add) { this.scene.add(child.children[0]); } + resolve(child.children[0]); + return; + } + if (auto_add) { this.scene.add(child); } resolve(child); }); }); From 91a777c34e05eb37542aeec69793a85adbc46c2e Mon Sep 17 00:00:00 2001 From: Quicksticks-oss Date: Sat, 30 Mar 2024 01:44:18 -0400 Subject: [PATCH 2/6] added stylized preview but the raw and stylized versions css need to match sizes. --- .../PageEnigma/comps/ViewSideBySide/index.tsx | 12 ++++--- app/pages/PageEnigma/js/editor.ts | 33 +++++++++++++------ 2 files changed, 31 insertions(+), 14 deletions(-) diff --git a/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx b/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx index 492409b662..2006974a60 100644 --- a/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx +++ b/app/pages/PageEnigma/comps/ViewSideBySide/index.tsx @@ -1,11 +1,15 @@ -import { useEffect, useState, } from "react"; +import { useEffect, useState, useContext } from "react"; import { LoadingDotsBricks } from "~/components"; +import { EngineContext } from "../../contexts/EngineContext"; export const ViewSideBySide = ()=>{ const [showLoader, setShowLoader] = useState(true); + const editorEngine = useContext(EngineContext); + useEffect(()=>{ - setTimeout(()=>setShowLoader(false), 1000); + editorEngine?.generateFrame(); + setTimeout(()=>setShowLoader(false), 200); },[ ]); return ( @@ -18,7 +22,7 @@ export const ViewSideBySide = ()=>{
- +
@@ -27,7 +31,7 @@ export const ViewSideBySide = ()=>{
- +
diff --git a/app/pages/PageEnigma/js/editor.ts b/app/pages/PageEnigma/js/editor.ts index b2ce8c3251..3516e28d80 100644 --- a/app/pages/PageEnigma/js/editor.ts +++ b/app/pages/PageEnigma/js/editor.ts @@ -88,6 +88,7 @@ class Editor { lockControls: PointerLockControls | undefined; cam_obj: THREE.Object3D | undefined; renderPass: RenderPass | undefined; + generating_preview: boolean; camera_person_mode: boolean; current_scene_media_token: string | null; @@ -119,6 +120,7 @@ class Editor { // Clock, scene and camera essentials. this.activeScene = new Scene("" + this.version); this.activeScene.initialize(); + this.generating_preview = false; this.camera; this.render_camera; this.renderer; @@ -904,7 +906,8 @@ class Editor { } async generateFrame() { - if (this.renderer) { + if (this.renderer && !this.generating_preview) { + this.generating_preview = true; this.activeScene.renderMode(true); if (this.activeScene.hot_items) { this.activeScene.hot_items.forEach(element => { @@ -922,6 +925,15 @@ class Editor { let imgData = this.renderer.domElement.toDataURL(); this.activeScene.renderMode(false); this.onWindowResize(); + + const rawPreview: HTMLVideoElement | null = document.getElementById("raw-preview") as HTMLVideoElement; + if(rawPreview){ + rawPreview.src = imgData; + } + else { + console.log("No raw preview window.") + } + let ffmpeg = createFFmpeg({ log: false }); await ffmpeg.load(); await ffmpeg.FS( @@ -935,15 +947,17 @@ class Editor { //const blob = new Blob([imgData], { type: "image/png" }); let url = await this.api_manager.uploadMediaFrameGeneration(blob, "render.mp4", "anime_ghibli", "((masterpiece, best quality, 8K, detailed)), colorful, epic, fantasy, (fox, red fox:1.2), no humans, 1other, ((koi pond)), outdoors, pond, rocks, stones, koi fish, ((watercolor))), lilypad, fish swimming around.", ""); + console.log(url); - const downloadLink = document.createElement("a"); - downloadLink.href = url; - downloadLink.download = "render.mp4"; - document.body.appendChild(downloadLink); - downloadLink.click(); - // Clean up - URL.revokeObjectURL(url); - document.body.removeChild(downloadLink); + const stylePreview: HTMLVideoElement | null = document.getElementById("stylized-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); @@ -1108,7 +1122,6 @@ class Editor { this.raycaster.setFromCamera(this.mouse, this.camera); let interactable: any[] = []; this.activeScene.scene.children.forEach((child: THREE.Object3D) => { - console.log(child); if (child.name != "") { if (child.type == "Mesh" || child.type == "Object3D") { interactable.push(child); From 8c47e153d21402224a0b85ac5ad40aa26c459dc3 Mon Sep 17 00:00:00 2001 From: Quicksticks-oss Date: Sat, 30 Mar 2024 01:50:50 -0400 Subject: [PATCH 3/6] Finilized preview of frame generation. --- app/pages/PageEnigma/js/editor.ts | 64 ++++++++++++++++--------------- 1 file changed, 34 insertions(+), 30 deletions(-) diff --git a/app/pages/PageEnigma/js/editor.ts b/app/pages/PageEnigma/js/editor.ts index 3516e28d80..d3cf25bb24 100644 --- a/app/pages/PageEnigma/js/editor.ts +++ b/app/pages/PageEnigma/js/editor.ts @@ -737,7 +737,7 @@ class Editor { // Basicly Unity 3D's update loop. updateLoop(time: number) { - if(this.cam_obj == undefined){ + if (this.cam_obj == undefined) { this.cam_obj = this.activeScene.get_object_by_name("::CAM::"); if (this.cam_obj) { this.addTransformClipBase("Camera Object", "camera", this.cam_obj, 0, 150) @@ -907,6 +907,7 @@ class Editor { async generateFrame() { if (this.renderer && !this.generating_preview) { + this.removeTransformControls(); this.generating_preview = true; this.activeScene.renderMode(true); if (this.activeScene.hot_items) { @@ -927,41 +928,44 @@ class Editor { this.onWindowResize(); const rawPreview: HTMLVideoElement | null = document.getElementById("raw-preview") as HTMLVideoElement; - if(rawPreview){ + if (rawPreview) { rawPreview.src = imgData; + + + let ffmpeg = createFFmpeg({ log: false }); + await ffmpeg.load(); + await ffmpeg.FS( + "writeFile", + `render.png`, + await fetchFile(imgData), + ); + await ffmpeg.run('-i', `render.png`, 'render.mp4'); + let output = await ffmpeg.FS("readFile", 'render.mp4'); + const blob = new Blob([output.buffer], { type: "video/mp4" }); + + let url = await this.api_manager.uploadMediaFrameGeneration(blob, "render.mp4", "anime_ghibli", "((masterpiece, best quality, 8K, detailed)), colorful, epic, fantasy, (fox, red fox:1.2), no humans, 1other, ((koi pond)), outdoors, pond, rocks, stones, koi fish, ((watercolor))), lilypad, fish swimming around.", ""); + 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.") } - - let ffmpeg = createFFmpeg({ log: false }); - await ffmpeg.load(); - await ffmpeg.FS( - "writeFile", - `render.png`, - await fetchFile(imgData), - ); - await ffmpeg.run('-i', `render.png`, 'render.mp4'); - let output = await ffmpeg.FS("readFile", 'render.mp4'); - const blob = new Blob([output.buffer], { type: "video/mp4" }); - - //const blob = new Blob([imgData], { type: "image/png" }); - let url = await this.api_manager.uploadMediaFrameGeneration(blob, "render.mp4", "anime_ghibli", "((masterpiece, best quality, 8K, detailed)), colorful, epic, fantasy, (fox, red fox:1.2), no humans, 1other, ((koi pond)), outdoors, pond, rocks, stones, koi fish, ((watercolor))), lilypad, fish swimming around.", ""); - console.log(url); - - const stylePreview: HTMLVideoElement | null = document.getElementById("stylized-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); - }); } } From 05ebad745b765026b64f6da5a8fa09c8b7b1e164 Mon Sep 17 00:00:00 2001 From: Quicksticks-oss Date: Sat, 30 Mar 2024 01:55:25 -0400 Subject: [PATCH 4/6] made camera in a default position. --- app/pages/PageEnigma/js/scene.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/app/pages/PageEnigma/js/scene.ts b/app/pages/PageEnigma/js/scene.ts index 2318a2091c..8d7d51fe9a 100644 --- a/app/pages/PageEnigma/js/scene.ts +++ b/app/pages/PageEnigma/js/scene.ts @@ -78,6 +78,7 @@ class Scene { this.load_glb("/resources/models/camera/camera.glb", false).then((cam_obj) => { cam_obj.userData["name"] = "::CAM::"; cam_obj.name = "::CAM::"; + cam_obj.position.set(0, 0.6, 1.5); this.scene.add(cam_obj); }); } From 7a9f0d0d39496a8ad312825118edd79877bf64f4 Mon Sep 17 00:00:00 2001 From: Quicksticks-oss Date: Sat, 30 Mar 2024 16:15:19 -0400 Subject: [PATCH 5/6] fixed timeline scene reset & camera view selection. --- app/pages/PageEnigma/datastructures/clips/lipsync_clip.ts | 5 +++++ app/pages/PageEnigma/js/editor.ts | 4 +++- app/pages/PageEnigma/js/timeline.ts | 5 +++++ 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/app/pages/PageEnigma/datastructures/clips/lipsync_clip.ts b/app/pages/PageEnigma/datastructures/clips/lipsync_clip.ts index a06808e72c..6ad94b7fbf 100644 --- a/app/pages/PageEnigma/datastructures/clips/lipsync_clip.ts +++ b/app/pages/PageEnigma/datastructures/clips/lipsync_clip.ts @@ -113,6 +113,11 @@ step() { } reset() { + if (this.lipsync.face != undefined) { + this.lipsync.face.morphTargetInfluences[this.blendshape_helper.ee] = 0; + this.lipsync.face.morphTargetInfluences[this.blendshape_helper.ah] = 0 + this.lipsync.face.morphTargetInfluences[this.blendshape_helper.oh] = 0; + } this.lipsync = new LipSync(); } diff --git a/app/pages/PageEnigma/js/editor.ts b/app/pages/PageEnigma/js/editor.ts index d3cf25bb24..fd66db210a 100644 --- a/app/pages/PageEnigma/js/editor.ts +++ b/app/pages/PageEnigma/js/editor.ts @@ -512,11 +512,12 @@ class Editor { if (this.cameraViewControls) { this.cameraViewControls.enabled = true; } - + this.cam_obj.scale.set(0,0,0); if (this.activeScene.hot_items) { this.activeScene.hot_items.forEach((element) => { element.visible = false; }); + } } else { this.camera.position.copy(this.last_cam_pos); @@ -530,6 +531,7 @@ class Editor { if (this.cameraViewControls) { this.cameraViewControls.enabled = false; } + this.cam_obj.scale.set(1,1,1); if (this.activeScene.hot_items) { this.activeScene.hot_items.forEach((element) => { element.visible = true; diff --git a/app/pages/PageEnigma/js/timeline.ts b/app/pages/PageEnigma/js/timeline.ts index 6873675c84..d025ed5084 100644 --- a/app/pages/PageEnigma/js/timeline.ts +++ b/app/pages/PageEnigma/js/timeline.ts @@ -130,6 +130,7 @@ export class TimeLine { this.audio_engine.loadClip(element.media_id); } else if (element.type == "animation") { + this.animation_engine.clips[element.object_uuid].stop(); } else if (element.type == "lipsync") { this.lipSync_engine.clips[element.object_uuid].reset(); @@ -199,6 +200,10 @@ export class TimeLine { this.stop() } } + + if (this.scrubber_frame_position >= this.timeline_limit) { + await this.resetScene(); + } } private async stop(): Promise { From 81a3d519d532bc45f2842a85c9154418808db232 Mon Sep 17 00:00:00 2001 From: Quicksticks-oss Date: Sat, 30 Mar 2024 16:16:01 -0400 Subject: [PATCH 6/6] added camera mesh --- public/resources/models/camera/camera.glb | Bin 0 -> 32468 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 public/resources/models/camera/camera.glb diff --git a/public/resources/models/camera/camera.glb b/public/resources/models/camera/camera.glb new file mode 100644 index 0000000000000000000000000000000000000000..836cf9351d9797de8c0c04dafcde08abd134fa2a GIT binary patch literal 32468 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 M_|$?%vNCG_AFBp3K>z>% literal 0 HcmV?d00001