Skip to content

Commit bcf388f

Browse files
authored
Merge pull request #4 from MetacityTools/dev
Refactoring
2 parents 9b9ec64 + 91a7298 commit bcf388f

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

64 files changed

+644
-680
lines changed

README.md

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,44 @@ Currently:
2121
- SHP (Polygons and MultiPatch only)
2222
- IFC
2323
- GLTF (triangles only)
24+
25+
## Roadmap
26+
27+
- [x] Grid in the background
28+
- [x] Translucent models to see wirefame in the background
29+
- [x] Snap vertices
30+
- [x] Translation - scale - rotate
31+
- [x] Split models
32+
- [x] Hide models
33+
- [x] Delete model
34+
- [x] Loading SHP - _needs our own library to load, noone supports multipatch_
35+
- [x] BVH build into worker
36+
- [x] Loading screen + Add chicken
37+
- [x] Add React Context
38+
- [x] Tabs in sidepanel
39+
- [x] Redesign
40+
- [x] Sidepanel view settings
41+
- [x] Intro screen
42+
- [x] Selecting alignment for loaded models
43+
- [x] Worker pool for loading
44+
- [x] Status - counter, update global loading status
45+
- [x] Reading metadata from IFC files - inspeciton of metadata?
46+
- [x] CI na githubu autodeploy
47+
- [x] Uniforms copy on model add
48+
- [x] Rotate Splash screen bug
49+
- [ ] Loading points and lines from SHP
50+
- [ ] Loading GeoJSON
51+
- [ ] Project export
52+
- [ ] Project import
53+
- [ ] Allow labeling geometry
54+
- [ ] delete selected submodel
55+
- [ ] merge submodels
56+
57+
### Backlog
58+
59+
- [ ] IFC metadata loading (memory-efficiency???)
60+
- [ ] BVH
61+
- [ ] remesh models - intersection of triangles
62+
- [ ] delete submodel - _for now as (split + delete)_
63+
- [ ] frustum culling
64+
- [ ] rectangular select

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "metacity-studio",
33
"private": true,
4-
"version": "0.0.3",
4+
"version": "0.0.4",
55
"type": "module",
66
"scripts": {
77
"dev": "vite",
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import React from 'react';
22

3-
import { GridModel } from '@utils/models/GridModel';
3+
import { GridModel } from '@utils/models/models/GridModel';
44

55
import * as GL from '@bananagl/bananagl';
66

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { vec3 } from 'gl-matrix';
22
import React from 'react';
33

4-
import { EditorModel } from '@utils/models/EditorModel';
4+
import { EditorModel } from '@utils/models/models/EditorModel';
55

66
import * as GL from '@bananagl/bananagl';
77

@@ -15,7 +15,7 @@ export const EditorContext = React.createContext<{
1515
models: EditorModel[];
1616
setModels: React.Dispatch<React.SetStateAction<EditorModel[]>>;
1717
selectedModel: EditorModel | null;
18-
setSelectedModel: React.Dispatch<React.SetStateAction<EditorModel | null>>;
18+
selectModel: (model: EditorModel | null) => void;
1919
camTargetZ: number;
2020
setCamTargetZ: React.Dispatch<React.SetStateAction<number>>;
2121
minShade: number;
@@ -28,6 +28,8 @@ export const EditorContext = React.createContext<{
2828
setGlobalShift: React.Dispatch<React.SetStateAction<vec3 | null>>;
2929
loadingStatus: string;
3030
setLoadingStatus: React.Dispatch<React.SetStateAction<string>>;
31+
selectedSubmodels: number[];
32+
setSelectedSubmodels: React.Dispatch<React.SetStateAction<number[]>>;
3133
} | null>(null);
3234

3335
export function ContextComponent(props: { children: React.ReactNode }) {
@@ -37,7 +39,7 @@ export function ContextComponent(props: { children: React.ReactNode }) {
3739
const [selection, setSelection] = React.useState(new GL.SelectionManager());
3840
const [models, setModels] = React.useState<EditorModel[]>([]);
3941
const [selectedModel, setSelectedModel] = React.useState<EditorModel | null>(null);
40-
console.log('rendering context');
42+
const [selectedSubmodels, setSelectedSubmodels] = React.useState<number[]>([]);
4143

4244
const [camTargetZ, setCamTargetZ] = React.useState<number>(0);
4345
const [minShade, setMinShade] = React.useState<number>(0);
@@ -46,6 +48,51 @@ export function ContextComponent(props: { children: React.ReactNode }) {
4648
const [globalShift, setGlobalShift] = React.useState<vec3 | null>(null);
4749
const [loadingStatus, setLoadingStatus] = React.useState<string>('');
4850

51+
const selectModel = (model: EditorModel | null) => {
52+
setSelectedModel((prev) => {
53+
if (prev !== null && prev !== model) prev.selected = false;
54+
if (model !== null && prev !== model) model.selected = true;
55+
if (model === null || prev !== model) selection.clearSelection();
56+
return model;
57+
});
58+
};
59+
60+
React.useEffect(() => {
61+
const onChange = () => {
62+
setSelectedSubmodels(selection.selected.map((obj) => obj.identifier));
63+
};
64+
65+
selection.onSelect = onChange;
66+
67+
return () => {
68+
selection.removeOnSelect(onChange);
69+
};
70+
}, [selection, setSelectedSubmodels]);
71+
72+
React.useEffect(() => {
73+
const onChange = () => {
74+
const copy = scene.objects.filter((obj) => obj instanceof EditorModel) as EditorModel[];
75+
setModels(copy);
76+
if (selectedModel !== null && !copy.includes(selectedModel)) setSelectedModel(null);
77+
};
78+
79+
scene.onChange = onChange;
80+
81+
return () => {
82+
scene.removeChange = onChange;
83+
};
84+
}, [scene, selectedModel]);
85+
86+
React.useEffect(() => {
87+
renderer.onInit = () => {
88+
const controls = renderer.window.controls;
89+
controls.onPick = (m: GL.Pickable) => {
90+
const model = m as EditorModel;
91+
selectModel(model);
92+
};
93+
};
94+
}, [renderer]);
95+
4996
return (
5097
<EditorContext.Provider
5198
value={{
@@ -58,7 +105,7 @@ export function ContextComponent(props: { children: React.ReactNode }) {
58105
models,
59106
setModels,
60107
selectedModel,
61-
setSelectedModel,
108+
selectModel,
62109
camTargetZ,
63110
setCamTargetZ,
64111
minShade,
@@ -71,6 +118,8 @@ export function ContextComponent(props: { children: React.ReactNode }) {
71118
setGlobalShift,
72119
loadingStatus,
73120
setLoadingStatus,
121+
selectedSubmodels,
122+
setSelectedSubmodels,
74123
}}
75124
>
76125
{props.children}

src/Components/Editor/Editor.tsx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@ import React from 'react';
44

55
import { SizeGuard } from '@elements/SizeGuard';
66

7-
import { SidePanel } from './SidePanel';
8-
import { Canvas } from './Utils/Canvas';
9-
import { ContextComponent } from './Utils/Context';
7+
import { Canvas } from './Canvas';
8+
import { ContextComponent } from './Context';
9+
import { SidePanel } from './SidePanel/SidePanel';
1010
import { ProcessingScreen } from './Utils/Processing';
1111
import { SpashScreen } from './Utils/Splash';
12-
import { ViewControls } from './ViewControls';
12+
import { ViewControls } from './ViewControls/ViewControls';
1313

1414
export function ModelEditor() {
1515
return (

src/Components/Editor/SidePanel.tsx

Lines changed: 0 additions & 126 deletions
This file was deleted.

src/Components/Editor/SidePanel/Actions.tsx renamed to src/Components/Editor/SidePanel/Actions/Actions.tsx

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
import * as React from 'react';
2-
import { ModelData } from 'types';
32

43
import { load } from '@utils/formats/loader';
54
import { CoordinateMode, addEditorModels } from '@utils/models/addEditorModel';
5+
import { ModelData } from '@utils/types';
66

7-
import { EditorContext } from '@components/Editor/Utils/Context';
7+
import { EditorContext } from '@components/Editor/Context';
88

9-
import { ImportDialog } from './Actions/ImportDialog';
9+
import { ImportDialog } from './ImportDialog';
1010
import { Vitals } from './Vitals';
1111

1212
export function ActionMenu() {
@@ -23,12 +23,12 @@ export function ActionMenu() {
2323
} = ctx;
2424

2525
const [importOpen, setImportOpen] = React.useState(false);
26-
const [selectedModels, setSelectedModels] = React.useState<ModelData[]>([]);
26+
const [importedModels, setImportedModels] = React.useState<ModelData[]>([]);
2727

2828
const onModelsSelected = async (event: React.ChangeEvent<HTMLInputElement>) => {
2929
setProcessing(true);
3030
const models = await load(event, setLoadingStatus);
31-
setSelectedModels(models);
31+
setImportedModels(models);
3232
setImportOpen(true);
3333
setProcessing(false);
3434
event.target.value = '';
@@ -39,19 +39,17 @@ export function ActionMenu() {
3939
setProcessing(true);
4040
setImportOpen(false);
4141
const shift = await addEditorModels(
42-
selectedModels,
43-
selection,
44-
scene,
45-
mode,
46-
globalShift,
47-
undefined,
48-
undefined,
49-
undefined,
50-
undefined,
42+
{
43+
modelData: importedModels,
44+
selection: selection,
45+
scene: scene,
46+
coordMode: mode,
47+
globalShift: globalShift,
48+
},
5149
setLoadingStatus
5250
);
5351
setProcessing(false);
54-
setSelectedModels([]);
52+
setImportedModels([]);
5553
setGlobalShift(shift);
5654
};
5755

@@ -70,7 +68,6 @@ export function ActionMenu() {
7068
id="modelInputFiles"
7169
multiple
7270
/>
73-
7471
<Vitals scenes={[scene]} renderer={renderer} />
7572
<ImportDialog isOpen={importOpen} onClose={handleModelsAdded} />
7673
</div>
File renamed without changes.

0 commit comments

Comments
 (0)