Skip to content

Commit 5f65391

Browse files
committed
revert internal_stores
1 parent 0398bfe commit 5f65391

File tree

5 files changed

+217
-105
lines changed

5 files changed

+217
-105
lines changed

internal_stores/mesh/index.js

Lines changed: 194 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -1,76 +1,214 @@
1-
// Third party imports
1+
import "@kitware/vtk.js/Rendering/Profiles/Geometry"
2+
import vtkGenericRenderWindow from "@kitware/vtk.js/Rendering/Misc/GenericRenderWindow"
3+
import vtkXMLPolyDataReader from "@kitware/vtk.js/IO/XML/XMLPolyDataReader"
4+
import vtkMapper from "@kitware/vtk.js/Rendering/Core/Mapper"
5+
import vtkActor from "@kitware/vtk.js/Rendering/Core/Actor"
6+
27
import viewer_schemas from "@geode/opengeodeweb-viewer/opengeodeweb_viewer_schemas.json"
8+
import Status from "@ogw_f/utils/status.js"
9+
10+
export const useHybridViewerStore = defineStore("hybridViewer", () => {
11+
const viewerStore = useViewerStore()
12+
const dataBaseStore = useDataBaseStore()
13+
const db = reactive({})
14+
const status = ref(Status.NOT_CREATED)
15+
const camera_options = reactive({})
16+
const genericRenderWindow = reactive({})
17+
const is_moving = ref(false)
18+
const zScale = ref(1.0)
19+
let viewStream
20+
let gridActor = null
21+
22+
async function initHybridViewer() {
23+
if (status.value !== Status.NOT_CREATED) return
24+
status.value = Status.CREATING
25+
genericRenderWindow.value = vtkGenericRenderWindow.newInstance({
26+
background: [180 / 255, 180 / 255, 180 / 255],
27+
listenWindowResize: false,
28+
})
329

4-
// Local imports
5-
import { useMeshPointsStyle } from "./points.js"
6-
import { useMeshEdgesStyle } from "./edges.js"
7-
import { useMeshPolygonsStyle } from "./polygons.js"
8-
import { useMeshPolyhedraStyle } from "./polyhedra.js"
30+
const webGLRenderWindow =
31+
genericRenderWindow.value.getApiSpecificRenderWindow()
32+
const imageStyle = webGLRenderWindow.getReferenceByName("bgImage").style
33+
imageStyle.transition = "opacity 0.1s ease-in"
34+
imageStyle.zIndex = 1
935

10-
// Local constants
11-
const mesh_schemas = viewer_schemas.opengeodeweb_viewer.mesh
36+
await viewerStore.ws_connect()
37+
viewStream = viewerStore.client.getImageStream().createViewStream("-1")
38+
viewStream.onImageReady((e) => {
39+
if (is_moving.value) return
40+
const webGLRenderWindow =
41+
genericRenderWindow.value.getApiSpecificRenderWindow()
42+
const imageStyle = webGLRenderWindow.getReferenceByName("bgImage").style
43+
webGLRenderWindow.setBackgroundImage(e.image)
44+
imageStyle.opacity = 1
45+
})
1246

13-
export default function useMeshStyle() {
14-
const dataStyleStore = useDataStyleStore()
15-
const pointsStyleStore = useMeshPointsStyle()
16-
const edgesStyleStore = useMeshEdgesStyle()
17-
const meshPolygonsStyleStore = useMeshPolygonsStyle()
18-
const meshPolyhedraStyleStore = useMeshPolyhedraStyle()
19-
const hybridViewerStore = useHybridViewerStore()
47+
status.value = Status.CREATED
48+
}
49+
50+
async function addItem(id) {
51+
if (!genericRenderWindow.value) {
52+
return
53+
}
54+
const value = dataBaseStore.db[id]
55+
console.log("hybridViewerStore.addItem", { value })
56+
const reader = vtkXMLPolyDataReader.newInstance()
57+
const textEncoder = new TextEncoder()
58+
await reader.parseAsArrayBuffer(
59+
textEncoder.encode(value.vtk_js.binary_light_viewable),
60+
)
61+
const polydata = reader.getOutputData(0)
62+
const mapper = vtkMapper.newInstance()
63+
mapper.setInputData(polydata)
64+
const actor = vtkActor.newInstance()
65+
actor.getProperty().setColor(20 / 255, 20 / 255, 20 / 255)
66+
actor.setMapper(mapper)
67+
const renderer = genericRenderWindow.value.getRenderer()
68+
const renderWindow = genericRenderWindow.value.getRenderWindow()
69+
renderer.addActor(actor)
70+
renderer.resetCamera()
71+
renderWindow.render()
72+
db[id] = { actor, polydata, mapper }
73+
}
2074

21-
function meshVisibility(id) {
22-
return dataStyleStore.getStyle(id).visibility
75+
async function setVisibility(id, visibility) {
76+
db[id].actor.setVisibility(visibility)
77+
const renderWindow = genericRenderWindow.value.getRenderWindow()
78+
renderWindow.render()
79+
}
80+
async function setZScaling(z_scale) {
81+
zScale.value = z_scale
82+
const renderer = genericRenderWindow.value.getRenderer()
83+
const actors = renderer.getActors()
84+
actors.forEach((actor) => {
85+
if (actor !== gridActor) {
86+
const scale = actor.getScale()
87+
actor.setScale(scale[0], scale[1], z_scale)
88+
}
89+
})
90+
renderer.resetCamera()
91+
genericRenderWindow.value.getRenderWindow().render()
92+
const schema = viewer_schemas?.opengeodeweb_viewer?.viewer?.set_z_scaling
93+
if (!schema) return
94+
await viewer_call({
95+
schema,
96+
params: {
97+
z_scale: z_scale,
98+
},
99+
})
23100
}
24-
function setMeshVisibility(id, visibility) {
25-
return viewer_call(
101+
102+
function syncRemoteCamera() {
103+
console.log("syncRemoteCamera")
104+
const renderer = genericRenderWindow.value.getRenderer()
105+
const camera = renderer.getActiveCamera()
106+
const params = {
107+
camera_options: {
108+
focal_point: camera.getFocalPoint(),
109+
view_up: camera.getViewUp(),
110+
position: camera.getPosition(),
111+
view_angle: camera.getViewAngle(),
112+
clipping_range: camera.getClippingRange(),
113+
distance: camera.getDistance(),
114+
},
115+
}
116+
viewer_call(
26117
{
27-
schema: mesh_schemas.visibility,
28-
params: { id, visibility },
118+
schema: viewer_schemas.opengeodeweb_viewer.viewer.update_camera,
119+
params,
29120
},
30121
{
31122
response_function: () => {
32-
hybridViewerStore.setVisibility(id, visibility)
33-
dataStyleStore.getStyle(id).visibility = visibility
34-
console.log(setMeshVisibility.name, { id }, meshVisibility(id))
123+
remoteRender()
124+
for (const key in params.camera_options) {
125+
camera_options[key] = params.camera_options[key]
126+
}
35127
},
36128
},
37129
)
38130
}
39131

40-
function applyMeshStyle(id) {
41-
const style = dataStyleStore.getStyle(id)
42-
console.log(
43-
"[MeshStyle] applyMeshDefaultStyle for id:",
44-
id,
45-
"style:",
46-
style,
47-
)
48-
const promise_array = []
49-
for (const [key, value] of Object.entries(style)) {
50-
if (key === "visibility") {
51-
promise_array.push(setMeshVisibility(id, value))
52-
} else if (key === "points") {
53-
promise_array.push(pointsStyleStore.applyMeshPointsStyle(id))
54-
} else if (key === "edges") {
55-
promise_array.push(edgesStyleStore.applyMeshEdgesStyle(id))
56-
} else if (key === "polygons") {
57-
promise_array.push(meshPolygonsStyleStore.applyMeshPolygonsStyle(id))
58-
} else if (key === "polyhedra") {
59-
promise_array.push(meshPolyhedraStyleStore.applyMeshPolyhedraStyle(id))
60-
} else {
61-
throw new Error("Unknown mesh key: " + key)
62-
}
132+
function remoteRender() {
133+
viewer_call({
134+
schema: viewer_schemas.opengeodeweb_viewer.viewer.render,
135+
})
136+
}
137+
138+
function setContainer(container) {
139+
genericRenderWindow.value.setContainer(container.value.$el)
140+
const webGLRenderWindow =
141+
genericRenderWindow.value.getApiSpecificRenderWindow()
142+
webGLRenderWindow.setUseBackgroundImage(true)
143+
const imageStyle = webGLRenderWindow.getReferenceByName("bgImage").style
144+
imageStyle.transition = "opacity 0.1s ease-in"
145+
imageStyle.zIndex = 1
146+
resize(container.value.$el.offsetWidth, container.value.$el.offsetHeight)
147+
console.log("setContainer", container.value.$el)
148+
149+
useMousePressed({
150+
target: container,
151+
onPressed: (event) => {
152+
console.log("onPressed")
153+
if (event.button == 0) {
154+
is_moving.value = true
155+
event.stopPropagation()
156+
imageStyle.opacity = 0
157+
}
158+
},
159+
onReleased: () => {
160+
if (!is_moving.value) {
161+
return
162+
}
163+
is_moving.value = false
164+
console.log("onReleased")
165+
syncRemoteCamera()
166+
},
167+
})
168+
169+
let wheelEventEndTimeout = null
170+
useEventListener(container, "wheel", () => {
171+
is_moving.value = true
172+
imageStyle.opacity = 0
173+
clearTimeout(wheelEventEndTimeout)
174+
wheelEventEndTimeout = setTimeout(() => {
175+
is_moving.value = false
176+
syncRemoteCamera()
177+
}, 600)
178+
})
179+
}
180+
181+
async function resize(width, height) {
182+
if (
183+
viewerStore.status !== Status.CONNECTED ||
184+
status.value !== Status.CREATED
185+
) {
186+
return
63187
}
64-
return Promise.all(promise_array)
188+
const webGLRenderWindow =
189+
genericRenderWindow.value.getApiSpecificRenderWindow()
190+
const canvas = webGLRenderWindow.getCanvas()
191+
canvas.width = width
192+
canvas.height = height
193+
await nextTick()
194+
webGLRenderWindow.setSize(width, height)
195+
viewStream.setSize(width, height)
196+
const renderWindow = genericRenderWindow.value.getRenderWindow()
197+
renderWindow.render()
198+
remoteRender()
65199
}
66200

67201
return {
68-
meshVisibility,
69-
setMeshVisibility,
70-
applyMeshStyle,
71-
...useMeshPointsStyle(),
72-
...useMeshEdgesStyle(),
73-
...useMeshPolygonsStyle(),
74-
...useMeshPolyhedraStyle(),
202+
db,
203+
genericRenderWindow,
204+
addItem,
205+
setVisibility,
206+
setZScaling,
207+
syncRemoteCamera,
208+
initHybridViewer,
209+
remoteRender,
210+
resize,
211+
setContainer,
212+
zScale,
75213
}
76-
}
214+
})

internal_stores/model/blocks.js

Lines changed: 6 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -80,21 +80,12 @@ export function useModelBlocksStyle() {
8080
}
8181

8282
function applyModelBlocksStyle(id) {
83-
const style = dataStyleStore.getStyle(id).blocks
84-
const block_ids = dataBaseStore.getBlocksUuids(id)
85-
86-
if (!block_ids || block_ids.length === 0) {
87-
return Promise.resolve()
88-
}
89-
90-
const promises = []
91-
if (typeof style?.visibility === "boolean") {
92-
promises.push(setModelBlocksVisibility(id, block_ids, style.visibility))
93-
}
94-
if (style?.color) {
95-
promises.push(setModelBlocksColor(id, block_ids, style.color))
96-
}
97-
return Promise.all(promises)
83+
const style = modelBlocksStyle(id)
84+
const blocks_ids = dataBaseStore.getBlocksUuids(id)
85+
return Promise.all([
86+
setModelBlocksVisibility(id, blocks_ids, style.visibility),
87+
setModelBlocksColor(id, blocks_ids, style.color),
88+
])
9889
}
9990

10091
return {

internal_stores/model/corners.js

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -82,19 +82,10 @@ export function useModelCornersStyle() {
8282
function applyModelCornersStyle(id) {
8383
const style = modelCornersStyle(id)
8484
const corner_ids = dataBaseStore.getCornersUuids(id)
85-
86-
if (!corner_ids || corner_ids.length === 0) {
87-
return Promise.resolve()
88-
}
89-
90-
const promises = []
91-
if (typeof style?.visibility === "boolean") {
92-
promises.push(setModelCornersVisibility(id, corner_ids, style.visibility))
93-
}
94-
if (style?.color) {
95-
promises.push(setModelCornersColor(id, corner_ids, style.color))
96-
}
97-
return Promise.all(promises)
85+
return Promise.all([
86+
setModelCornersVisibility(id, corner_ids, style.visibility),
87+
setModelCornersColor(id, corner_ids, style.color),
88+
])
9889
}
9990

10091
return {

internal_stores/model/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,6 @@ export default function useModelStyle() {
127127
[component_id],
128128
visibility,
129129
)
130-
} else if (component_type === "Edge") {
131-
return modelEdgesStyleStore.setModelEdgesVisibility(id, visibility)
132130
} else {
133131
throw new Error("Unknown model component_type: " + component_type)
134132
}
@@ -182,8 +180,10 @@ export default function useModelStyle() {
182180
return {
183181
modelVisibility,
184182
visibleMeshComponents,
183+
modelMeshComponentVisibility,
185184
setModelVisibility,
186185
setModelColor,
186+
setModelMeshComponentVisibility,
187187
applyModelStyle,
188188
setModelMeshComponentsDefaultStyle,
189189
...useModelBlocksStyle(),

internal_stores/model/surfaces.js

Lines changed: 11 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@ export function useModelSurfacesStyle() {
88
const dataStyleStore = useDataStyleStore()
99
const dataBaseStore = useDataBaseStore()
1010

11+
function modelSurfacesStyle(id) {
12+
return dataStyleStore.getStyle(id).surfaces
13+
}
1114
function modelSurfaceStyle(id, surface_id) {
12-
if (!dataStyleStore.getStyle(id).surfaces[surface_id]) {
13-
dataStyleStore.getStyle(id).surfaces[surface_id] = {}
15+
if (!modelSurfacesStyle(id)[surface_id]) {
16+
modelSurfacesStyle(id)[surface_id] = {}
1417
}
15-
return dataStyleStore.getStyle(id).surfaces[surface_id]
18+
return modelSurfacesStyle(id)[surface_id]
1619
}
1720

1821
function modelSurfaceVisibility(id, surface_id) {
@@ -74,23 +77,12 @@ export function useModelSurfacesStyle() {
7477
}
7578

7679
function applyModelSurfacesStyle(id) {
77-
const style = dataStyleStore.getStyle(id).surfaces
80+
const style = modelSurfacesStyle(id)
7881
const surface_ids = dataBaseStore.getSurfacesUuids(id)
79-
80-
if (!surface_ids || surface_ids.length === 0) {
81-
return Promise.resolve()
82-
}
83-
84-
const promises = []
85-
if (typeof style?.visibility === "boolean") {
86-
promises.push(
87-
setModelSurfacesVisibility(id, surface_ids, style.visibility),
88-
)
89-
}
90-
if (style?.color) {
91-
promises.push(setModelSurfacesColor(id, surface_ids, style.color))
92-
}
93-
return Promise.all(promises)
82+
return Promise.all([
83+
setModelSurfacesVisibility(id, surface_ids, style.visibility),
84+
setModelSurfacesColor(id, surface_ids, style.color),
85+
])
9486
}
9587

9688
return {

0 commit comments

Comments
 (0)