From 99ba7ebf3aaf684a355e2c96b174669e57a57c4f Mon Sep 17 00:00:00 2001
From: ArEnSc <6252325+ArEnSc@users.noreply.github.com>
Date: Wed, 10 Apr 2024 15:26:18 -0400
Subject: [PATCH] Revert "move shapes, fix delete bug"
---
app/components/InputVector.tsx | 7 ----
app/components/Textarea.tsx | 21 +++++------
app/pages/PageEnigma/PageEnigma.tsx | 2 +-
app/pages/PageEnigma/PageEnigmaComponent.tsx | 8 +----
app/pages/PageEnigma/Queue/toEngineActions.ts | 2 --
.../ControlPanelSceneObject.tsx | 17 ++++-----
.../comps/Controls3D/Controls3D.tsx | 33 ++++++++++++++++++
.../comps/SidePanelTabs/TabStylization.tsx | 1 -
.../PageEnigma/comps/Timeline/Timeline.tsx | 4 ---
.../contexts/TrackContext/TrackProvider.tsx | 7 ++--
app/pages/PageEnigma/js/editor.ts | 30 +++++++++-------
app/pages/PageEnigma/js/timeline.ts | 12 ++-----
app/pages/PageEnigma/store/index.ts | 1 -
app/pages/PageEnigma/store/media.ts | 32 +++--------------
app/pages/PageEnigma/store/selectedItem.ts | 2 --
app/pages/PageEnigma/store/shape.ts | 12 -------
public/resources/shapes/cube.png | Bin 7585 -> 0 bytes
public/resources/shapes/cylinder.png | Bin 5742 -> 0 bytes
public/resources/shapes/donut.png | Bin 10512 -> 0 bytes
public/resources/shapes/sphere.png | Bin 8557 -> 0 bytes
20 files changed, 78 insertions(+), 113 deletions(-)
delete mode 100644 app/pages/PageEnigma/store/shape.ts
delete mode 100644 public/resources/shapes/cube.png
delete mode 100644 public/resources/shapes/cylinder.png
delete mode 100644 public/resources/shapes/donut.png
delete mode 100644 public/resources/shapes/sphere.png
diff --git a/app/components/InputVector.tsx b/app/components/InputVector.tsx
index 3c4d3c5a17..0a10274524 100644
--- a/app/components/InputVector.tsx
+++ b/app/components/InputVector.tsx
@@ -1,6 +1,5 @@
import { useRef } from "react";
import { twMerge } from "tailwind-merge";
-import { ignoreDelete } from "~/pages/PageEnigma/store";
interface InputVectorProps {
x: number;
@@ -42,8 +41,6 @@ export const InputVector = ({ x, y, z, onChange }: InputVectorProps) => {
onChange={handleOnChange}
ref={xRef}
value={x}
- onFocus={() => (ignoreDelete.value = true)}
- onBlur={() => (ignoreDelete.value = false)}
/>
{
onChange={handleOnChange}
ref={yRef}
value={y}
- onFocus={() => (ignoreDelete.value = true)}
- onBlur={() => (ignoreDelete.value = false)}
/>
{
onChange={handleOnChange}
ref={zRef}
value={z}
- onFocus={() => (ignoreDelete.value = true)}
- onBlur={() => (ignoreDelete.value = false)}
/>
diff --git a/app/components/Textarea.tsx b/app/components/Textarea.tsx
index cc35c75ac2..278b54a7cb 100644
--- a/app/components/Textarea.tsx
+++ b/app/components/Textarea.tsx
@@ -2,7 +2,6 @@ import { TextareaHTMLAttributes } from "react";
import { twMerge } from "tailwind-merge";
import { Label } from "./Typography";
import { kebabCase } from "~/utilities";
-import { ignoreDelete } from "~/pages/PageEnigma/store";
type ResizeType =
| "none"
@@ -25,10 +24,14 @@ export const Textarea = ({
}) => {
return (
- {label && }
-
+ {label &&
+
+ }
+
diff --git a/app/pages/PageEnigma/PageEnigma.tsx b/app/pages/PageEnigma/PageEnigma.tsx
index 613becceb5..afd78326cc 100644
--- a/app/pages/PageEnigma/PageEnigma.tsx
+++ b/app/pages/PageEnigma/PageEnigma.tsx
@@ -18,7 +18,7 @@ export const PageEnigma = () => {
function setPage() {
// TODO address this issue with zooming
pageHeight.value = window.innerHeight;
- pageWidth.value = window.innerWidth;
+ pageWidth.value = window.outerWidth;
}
timelineHeight.value = window.innerHeight * 0.25;
sidePanelWidth.value = 443;
diff --git a/app/pages/PageEnigma/PageEnigmaComponent.tsx b/app/pages/PageEnigma/PageEnigmaComponent.tsx
index e635b36557..d875fe506b 100644
--- a/app/pages/PageEnigma/PageEnigmaComponent.tsx
+++ b/app/pages/PageEnigma/PageEnigmaComponent.tsx
@@ -101,13 +101,7 @@ export const PageEnigmaComponent = () => {
{/* Bottom controls */}
diff --git a/app/pages/PageEnigma/Queue/toEngineActions.ts b/app/pages/PageEnigma/Queue/toEngineActions.ts
index 3a1e828a00..4be8244918 100644
--- a/app/pages/PageEnigma/Queue/toEngineActions.ts
+++ b/app/pages/PageEnigma/Queue/toEngineActions.ts
@@ -7,8 +7,6 @@ export enum toEngineActions {
ADD_OBJECT = "add_object",
- ADD_SHAPE = "add_shape",
-
// data= QueueKeyframe
DELETE_CLIP = "delete_clip",
// data=QueueClip
diff --git a/app/pages/PageEnigma/comps/ControlPanelSceneObject/ControlPanelSceneObject.tsx b/app/pages/PageEnigma/comps/ControlPanelSceneObject/ControlPanelSceneObject.tsx
index d736eb492b..8242f70de6 100644
--- a/app/pages/PageEnigma/comps/ControlPanelSceneObject/ControlPanelSceneObject.tsx
+++ b/app/pages/PageEnigma/comps/ControlPanelSceneObject/ControlPanelSceneObject.tsx
@@ -132,14 +132,15 @@ export const ControlPanelSceneObject = () => {
return;
}
- for (const key in editorEngine?.timeline.characters) {
- const element = editorEngine?.timeline.characters[key];
+ for (let key in editorEngine?.timeline.characters) {
+ let element = editorEngine?.timeline.characters[key];
if (key == currentSceneObject.object_uuid) {
- currentSceneObject.group = element;
- break;
+ currentSceneObject.group = element;
+ break;
}
}
+
Queue.publish({
queueName: QueueNames.TO_TIMELINE,
action: toTimelineActions.ADD_KEYFRAME,
@@ -164,13 +165,7 @@ export const ControlPanelSceneObject = () => {
return (
{
const handlePlus = () => {
console.log("Controls 3D: Plus button clicked");
};
+ const handleCube = () => {
+ if (editorEngine == null || editorEngine == undefined) {
+ return;
+ }
+ editorEngine.create_parim("Box");
+ };
+ const handleCylinder = () => {
+ if (editorEngine == null || editorEngine == undefined) {
+ return;
+ }
+ editorEngine.create_parim("Cylinder");
+ };
+ const handleTorus = () => {
+ if (editorEngine == null || editorEngine == undefined) {
+ return;
+ }
+ editorEngine.create_parim("Donut");
+ };
+ const handleSphere = () => {
+ if (editorEngine == null || editorEngine == undefined) {
+ return;
+ }
+ editorEngine.create_parim("Sphere");
+ };
const handleMoveArrows = () => {
if (!editorEngine) {
return;
@@ -70,6 +94,15 @@ export const Controls3D = () => {
+
+
+
+
+
+
+
+
+
{
const [appUiState, dispatchAppUiState] = useContext(AppUiContext);
diff --git a/app/pages/PageEnigma/comps/Timeline/Timeline.tsx b/app/pages/PageEnigma/comps/Timeline/Timeline.tsx
index dcbc98147b..9779650314 100644
--- a/app/pages/PageEnigma/comps/Timeline/Timeline.tsx
+++ b/app/pages/PageEnigma/comps/Timeline/Timeline.tsx
@@ -9,7 +9,6 @@ import {
deleteAudioClip,
deleteCharacterClip,
selectedItem,
- ignoreDelete,
} from "~/pages/PageEnigma/store";
import { useQueueHandler } from "~/pages/PageEnigma/comps/Timeline/utils/useQueueHandler";
import { useSignals } from "@preact/signals-react/runtime";
@@ -40,9 +39,6 @@ export const Timeline = () => {
}, []);
const onDeleteAsk = useCallback((event: KeyboardEvent) => {
- if (ignoreDelete.value) {
- return;
- }
if (
["Backspace", "Delete"].indexOf(event.key) > -1 &&
selectedItem.value !== null
diff --git a/app/pages/PageEnigma/contexts/TrackContext/TrackProvider.tsx b/app/pages/PageEnigma/contexts/TrackContext/TrackProvider.tsx
index 5132e53acc..f6138cc05b 100644
--- a/app/pages/PageEnigma/contexts/TrackContext/TrackProvider.tsx
+++ b/app/pages/PageEnigma/contexts/TrackContext/TrackProvider.tsx
@@ -17,7 +17,6 @@ import {
audioGroup,
objectGroup,
deleteCharacter,
- addShape,
} from "~/pages/PageEnigma/store";
import useUpdateKeyframe from "~/pages/PageEnigma/contexts/TrackContext/utils/useUpdateKeyframe";
import { deleteObject } from "~/pages/PageEnigma/store/objectGroup/deleteObject";
@@ -44,10 +43,10 @@ export const TrackProvider = ({ children }: Props) => {
if (dragItem.value.type === AssetType.OBJECT) {
addObject(dragItem.value);
}
- if (dragItem.value.type === AssetType.SHAPE) {
- addShape(dragItem.value);
- }
}
+ // if (dragItem.value.type === AssetType.SHAPE) {
+ // console.log("Dragged In Shape Type")
+ // }
if (canDrop.value && dragItem.value) {
if (dragItem.value.type === AssetType.ANIMATION) {
diff --git a/app/pages/PageEnigma/js/editor.ts b/app/pages/PageEnigma/js/editor.ts
index a33026252c..ee7ae2c358 100644
--- a/app/pages/PageEnigma/js/editor.ts
+++ b/app/pages/PageEnigma/js/editor.ts
@@ -183,7 +183,6 @@ class Editor {
this.animation_engine = new AnimationEngine(this.version);
this.timeline = new TimeLine(
- this,
this.audio_engine,
this.transform_engine,
this.lipsync_engine,
@@ -206,10 +205,12 @@ class Editor {
this.negative_prompt = "";
this.art_style = ArtStyle.Anime2DFlat;
+
this.storyteller_proxy_scene = new StoryTellerProxyScene(
this.version,
this.activeScene.scene,
);
+
}
initialize(config: any) {
@@ -290,7 +291,7 @@ class Editor {
);
this.control = new TransformControls(this.camera, this.renderer.domElement);
- this.control.space = "local"; // Local transformation mode
+ this.control.space = 'local'; // Local transformation mode
// .space = 'world'; // Global mode
this.control.setScaleSnap(0.1);
@@ -409,18 +410,19 @@ class Editor {
// TO UPDATE selected objects in the scene might want to add to the scene ...
async setSelectedObject(position: XYZ, rotation: XYZ, scale: XYZ) {
if (this.selected != undefined || this.selected != null) {
- //console.log(`triggering setSelectedObject`)
- this.selected.position.x = position.x;
- this.selected.position.y = position.y;
- this.selected.position.z = position.z;
- this.selected.rotation.x = THREE.MathUtils.degToRad(rotation.x);
- this.selected.rotation.y = THREE.MathUtils.degToRad(rotation.y);
- this.selected.rotation.z = THREE.MathUtils.degToRad(rotation.z);
+ //console.log(`triggering setSelectedObject`)
+ this.selected.position.x = position.x
+ this.selected.position.y = position.y
+ this.selected.position.z = position.z
- this.selected.scale.x = scale.x;
- this.selected.scale.y = scale.y;
- this.selected.scale.z = scale.z;
+ this.selected.rotation.x = THREE.MathUtils.degToRad(rotation.x)
+ this.selected.rotation.y = THREE.MathUtils.degToRad(rotation.y)
+ this.selected.rotation.z = THREE.MathUtils.degToRad(rotation.z)
+
+ this.selected.scale.x = scale.x
+ this.selected.scale.y = scale.y
+ this.selected.scale.z = scale.z
}
}
@@ -550,7 +552,9 @@ class Editor {
// const object: THREE.Object3D = await this.activeScene.load_glb(
// "m_4wva09qznapzk5rcvbxy671d1qx2pr",
// );
+
// object.uuid = "CH1";
+
// Stick Open Pose Man: m_9f3d3z94kk6m25zywyz6an3p43fjtw
// XBot: m_r7w1tmkx2jg8nznr3hyzj4k6zhfh7d
// YBot: m_9sqg0evpr23587jnr8z3zsvav1x077
@@ -735,7 +739,7 @@ class Editor {
if (this.timeline.is_playing) {
const changeView = await this.timeline.update(this.rendering);
- if (changeView) {
+ if(changeView) {
this.switchCameraView();
}
} else if (this.last_scrub == this.timeline.scrubber_frame_position) {
diff --git a/app/pages/PageEnigma/js/timeline.ts b/app/pages/PageEnigma/js/timeline.ts
index a1fe8a693d..0cbd81c84d 100644
--- a/app/pages/PageEnigma/js/timeline.ts
+++ b/app/pages/PageEnigma/js/timeline.ts
@@ -12,7 +12,7 @@ import { QueueNames } from "../Queue/QueueNames";
import { toEngineActions } from "../Queue/toEngineActions";
import { fromEngineActions } from "../Queue/fromEngineActions";
import { ClipGroup, ClipType } from "~/pages/PageEnigma/models/track";
-import { MediaItem } from "~/pages/PageEnigma/models";
+
// Every object uuid / entity has a track.
export class TimelineDataState {
timeline_items: ClipUI[];
@@ -133,18 +133,11 @@ export class TimeLine {
case toEngineActions.ADD_OBJECT:
await this.addObject(data);
break;
- case toEngineActions.ADD_SHAPE:
- await this.addShape(data);
- break;
default:
console.log("Action Not Wired", action);
}
}
- public async addShape({ data }: { data: MediaItem }) {
- this.scene.instantiate(data.media_id);
- }
-
public async addCharacter(data: any) {
let media_id = data.data['media_id'];
let name = data.data['name'];
@@ -503,4 +496,5 @@ export class TimeLine {
currentTime: this.current_time,
});
}
-}
\ No newline at end of file
+}
+
diff --git a/app/pages/PageEnigma/store/index.ts b/app/pages/PageEnigma/store/index.ts
index 78254d1a60..2c89a60fc4 100644
--- a/app/pages/PageEnigma/store/index.ts
+++ b/app/pages/PageEnigma/store/index.ts
@@ -5,7 +5,6 @@ export * from "./dragAndDrop";
export * from "./media";
export * from "./objectGroup";
export * from "./selectedItem";
-export * from "./shape";
export * from "./sidePanel";
export * from "./sizing";
export * from "./timing";
diff --git a/app/pages/PageEnigma/store/media.ts b/app/pages/PageEnigma/store/media.ts
index 51167876fa..10d3e23cfd 100644
--- a/app/pages/PageEnigma/store/media.ts
+++ b/app/pages/PageEnigma/store/media.ts
@@ -454,7 +454,7 @@ export const audioItems = signal([
type: AssetType.AUDIO,
length: 25,
name: "Talk (Demo Sounds)",
- thumbnail: "resources/placeholders/audio_placeholder.png",
+ thumbnail: "resources/placeholders/audio_placeholder.png"
},
{
version: 1,
@@ -462,8 +462,8 @@ export const audioItems = signal([
type: AssetType.AUDIO,
length: 25,
name: "NCS Song",
- thumbnail: "resources/placeholders/audio_placeholder.png",
- },
+ thumbnail: "resources/placeholders/audio_placeholder.png"
+ }
]);
export const cameraItems = signal([
@@ -530,35 +530,13 @@ export const objectItems = signal([
thumbnail: "resources/placeholders/placeholder.png",
},
]);
-
// In the future these will have shape id's
export const shapeItems = signal([
{
version: 1,
- media_id: "Box",
+ media_id: "",
type: AssetType.SHAPE,
name: "Cube",
- thumbnail: "resources/shapes/cube.png",
- },
- {
- version: 1,
- media_id: "Cylinder",
- type: AssetType.SHAPE,
- name: "Cylinder",
- thumbnail: "resources/shapes/cylinder.png",
- },
- {
- version: 1,
- media_id: "Donut",
- type: AssetType.SHAPE,
- name: "Donut",
- thumbnail: "resources/shapes/donut.png",
- },
- {
- version: 1,
- media_id: "Sphere",
- type: AssetType.SHAPE,
- name: "Sphere",
- thumbnail: "resources/shapes/sphere.png",
+ thumbnail: "resources/placeholders/placeholder.png",
},
]);
diff --git a/app/pages/PageEnigma/store/selectedItem.ts b/app/pages/PageEnigma/store/selectedItem.ts
index 210d975e04..4f1d7bf778 100644
--- a/app/pages/PageEnigma/store/selectedItem.ts
+++ b/app/pages/PageEnigma/store/selectedItem.ts
@@ -2,5 +2,3 @@ import { signal } from "@preact/signals-core";
import { Clip, Keyframe } from "~/pages/PageEnigma/models";
export const selectedItem = signal(null);
-
-export const ignoreDelete = signal(false);
diff --git a/app/pages/PageEnigma/store/shape.ts b/app/pages/PageEnigma/store/shape.ts
deleted file mode 100644
index 26ea68a57e..0000000000
--- a/app/pages/PageEnigma/store/shape.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-import { MediaItem } from "~/pages/PageEnigma/models";
-import Queue from "~/pages/PageEnigma/Queue/Queue";
-import { QueueNames } from "~/pages/PageEnigma/Queue/QueueNames";
-import { toEngineActions } from "~/pages/PageEnigma/Queue/toEngineActions";
-
-export function addShape(item: MediaItem) {
- Queue.publish({
- queueName: QueueNames.TO_ENGINE,
- action: toEngineActions.ADD_SHAPE,
- data: item,
- });
-}
diff --git a/public/resources/shapes/cube.png b/public/resources/shapes/cube.png
deleted file mode 100644
index 51cb24114c4cd76dafd8f45d62d5b70b6759a736..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 7585
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
diff --git a/public/resources/shapes/cylinder.png b/public/resources/shapes/cylinder.png
deleted file mode 100644
index 73cf7eaec4e9b66f16bb7859fe22e018fc55ca50..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 5742
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
LW1wB2X&>}oapjLy
diff --git a/public/resources/shapes/donut.png b/public/resources/shapes/donut.png
deleted file mode 100644
index bb4e5a0fbbcdef59611c16ac9ae2dd9380f3b1e6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 10512
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