bx-1379-redesign #15

Merged
ksenia_mikhailova merged 124 commits from bx-1379-redesign into dev 2024-09-06 15:39:13 +03:00
8 changed files with 97 additions and 63 deletions
Showing only changes of commit 36e7aa45ed - Show all commits

View File

@ -36,6 +36,7 @@ declare module 'vue' {
Load: typeof import('./src/components/load.vue')['default'] Load: typeof import('./src/components/load.vue')['default']
Load_models: typeof import('./src/components/Promo/load_models.vue')['default'] Load_models: typeof import('./src/components/Promo/load_models.vue')['default']
Main: typeof import('./src/components/Main/index.vue')['default'] Main: typeof import('./src/components/Main/index.vue')['default']
Main_load_models: typeof import('./src/components/Main/main_load_models.vue')['default']
ModelItem: typeof import('./src/components/Promo/modelItem.vue')['default'] ModelItem: typeof import('./src/components/Promo/modelItem.vue')['default']
Models: typeof import('./src/components/Promo/models.vue')['default'] Models: typeof import('./src/components/Promo/models.vue')['default']
Nav: typeof import('./src/components/nav.vue')['default'] Nav: typeof import('./src/components/nav.vue')['default']

View File

@ -39,6 +39,7 @@ a[href] {
flex-grow: 1; flex-grow: 1;
height: 50vh; height: 50vh;
width: 100vw; width: 100vw;
max-height: 65vh;
} }
} }

View File

@ -90,5 +90,5 @@ onMounted(async () => {
}) })
</script> </script>
<template> <template>
<div id="gallery"></div> <div id="gallery" style=" width: 100vw; height: 100vh;"></div>
</template> </template>

View File

@ -1,18 +1,17 @@
<script setup lang="ts"> <script setup lang="ts">
import { reactive, ref, watch } from 'vue'; import { onMounted, reactive, ref, watch } from 'vue';
import { SRGBColorSpace } from 'three'; import { SRGBColorSpace } from 'three';
import { TresCanvas, } from '@tresjs/core'; import { TresCanvas, } from '@tresjs/core';
import { useGLTF, OrbitControls } from '@tresjs/cientos'; import { OrbitControls } from '@tresjs/cientos';
import MainLoadModels from './main_load_models.vue';
import { useItem } from '../../stores/item'; import { useItem } from '../../stores/item';
import { useRawData } from '../../stores/raw_data'; import { useRawData } from '../../stores/raw_data';
import { IMAGE_URL } from '../../constants';
const raw_dataStore = useRawData() const raw_dataStore = useRawData()
const pageStore = useItem() const pageStore = useItem()
const camera = ref() const camera = ref()
const controls = ref() const controls = ref()
const models = ref([] as model3DType[])
const controlsState = reactive({ const controlsState = reactive({
enableDamping: true, enableDamping: true,
@ -23,51 +22,14 @@ const controlsState = reactive({
autoRotate: true, autoRotate: true,
}) })
const loadModels = async () => { onMounted(async () => {
camera.value.minDistance = raw_dataStore.data.min_distance; if (!raw_dataStore.data.id && pageStore.page.id) {
camera.value.maxDistance = raw_dataStore.data.max_distance; await raw_dataStore.load({ source: pageStore.page.scene_3d })
const d = raw_dataStore.data.max_distance * 0.5;
camera.value.position.set(d, d, d)
for (let index = 0; index < raw_dataStore.data.elements.length; index++) {
const element = raw_dataStore.data.elements[index];
const item = {} as model3DType
if (element.name == 'ground') continue
item.modelUrl = `${IMAGE_URL}/${element.model_file}`
let { scene: loaded_scene } = await useGLTF(item.modelUrl)
item.modelFile = loaded_scene
item.id = element.id
item.name = element.name
if (!element.is_enabled) {
item.modelFile.visible = false
}
if (item.modelFile.children[0]) {
item.modelFile.children[0].position.set(
item.modelFile.children[0].position.x + element.x_pos,
item.modelFile.children[0].position.y + element.y_pos,
item.modelFile.children[0].position.z + element.z_pos
)
item.modelFile.children[0].updateMatrixWorld(true)
}
models.value.push(item)
} }
} })
if (!raw_dataStore.data.id && pageStore.page.id) {
await raw_dataStore.load({ source: pageStore.page.id })
await loadModels();
controls.value.autoRotate = true
controls.value.value.update()
}
watch(() => pageStore.page.id, async () => { watch(() => pageStore.page.id, async () => {
await raw_dataStore.load({ source: pageStore.page.id }) await raw_dataStore.load({ source: pageStore.page.scene_3d })
await loadModels()
controls.value.autoRotate = true
controls.value.value.update()
}) })
</script> </script>
@ -85,13 +47,8 @@ watch(() => pageStore.page.id, async () => {
<TresCanvas :output-encoding="SRGBColorSpace"> <TresCanvas :output-encoding="SRGBColorSpace">
<TresPerspectiveCamera ref="camera" /> <TresPerspectiveCamera ref="camera" />
<OrbitControls v-bind="controlsState" make-default ref="controls" /> <OrbitControls v-bind="controlsState" make-default ref="controls" />
<TresGroup ref="scene"> <MainLoadModels v-if="raw_dataStore.data.id" />
<template v-for="item in models"> <TresAmbientLight />
<TresGroup :name="item.name">
<TresObject3D v-bind="item.modelFile.clone()" />
</TresGroup>
</template>
</TresGroup>
</TresCanvas> </TresCanvas>
</div> </div>
</div> </div>

View File

@ -0,0 +1,69 @@
<script setup lang="ts">
import { ref } from 'vue';
import { useLoop, useTresContext } from '@tresjs/core';
import { useGLTF } from '@tresjs/cientos';
import { OrbitControlsProps } from '@tresjs/cientos/dist/core/controls/OrbitControls.vue.js';
import { useRawData } from '../../stores/raw_data';
import { IMAGE_URL } from '../../constants';
import { Euler, Vector3 } from 'three';
const { controls, camera } = useTresContext()
const raw_dataStore = useRawData()
const models = ref([] as model3DType[])
const loadModels = async () => {
for (let index = 0; index < raw_dataStore.data.elements.length; index++) {
const element = raw_dataStore.data.elements[index];
const item = {} as model3DType
if (element.name == 'ground') continue
item.modelUrl = `${IMAGE_URL}/${element.model_file}`
let { scene: loaded_scene } = await useGLTF(item.modelUrl)
item.modelFile = loaded_scene
item.id = element.id
item.name = element.name
if (!element.is_enabled) {
item.modelFile.visible = false
}
if (item.modelFile.children[0]) {
item.modelFile.children[0].position.set(
item.modelFile.children[0].position.x + element.x_pos,
item.modelFile.children[0].position.y + element.y_pos,
item.modelFile.children[0].position.z + element.z_pos
)
item.modelFile.children[0].updateMatrixWorld(true)
}
models.value.push(item)
}
}
const cameraSet = () => {
if (controls.value) {
(controls.value as OrbitControlsProps).minDistance = raw_dataStore.data.min_distance;
(controls.value as OrbitControlsProps).maxDistance = raw_dataStore.data.max_distance;
(controls.value as OrbitControlsProps).autoRotate = true;
(controls.value as OrbitControlsProps).autoRotateSpeed = 1;
(controls.value as any).update()
}
if (camera.value) {
const d = raw_dataStore.data.max_distance * 0.5;
camera.value.position.set(d * 0.25, d * 0.5, d);
camera.value.updateMatrixWorld()
}
}
loadModels()
cameraSet()
const { onAfterRender } = useLoop()
onAfterRender(() => {
(controls.value as any).update()
})
</script>
<template>
<template v-for="item in models">
<TresGroup :name="item.name">
<TresObject3D v-bind="item.modelFile.clone()" />
</TresGroup>
</template>
</template>

View File

@ -1,11 +1,22 @@
<script setup lang="ts"> <script setup lang="ts">
import { useRoute } from 'vue-router'; import { useRoute, useRouter } from 'vue-router';
import { useItem } from '../stores/item'; import { useItem } from '../stores/item';
import { watch } from 'vue';
const page = useItem() const page = useItem()
const route = useRoute() const route = useRoute()
const router = useRouter()
await page.load(route.params) router.afterEach((to) => {
if (to.name == 'home_no') {
page.load(route.params)
}
return true
})
watch(() => route.params.item, () => {
page.load(route.params)
})
</script> </script>
<template> <template>

View File

@ -8,7 +8,7 @@ const pageStore = useItem()
<template> <template>
<div class="nav"> <div class="nav">
<div class="nav-group"> <div class="nav-group">
<span class="nav-icon" :class="[{ 'active': route.name == 'main' }]"> <span class="nav-icon" :class="[{ 'active': ['main', 'home_no'].includes(route.name as string) }]">
<RouterLink :to="`/${pageStore.page.slug}`"> <RouterLink :to="`/${pageStore.page.slug}`">
<i-mdi-home-outline /> <i-mdi-home-outline />
</RouterLink> </RouterLink>
@ -18,7 +18,7 @@ const pageStore = useItem()
<i-mdi:video-3d /> <i-mdi:video-3d />
</RouterLink> </RouterLink>
</span> </span>
<span class="nav-icon" :class="[{ 'active': route.name == 'gallery' }]" style="font-size: 1.375rem;"> <span class="nav-icon" :class="[{ 'active': route.name == 'gallery' }]" style="font-size: 1.375rem;">
<RouterLink :to="`/${pageStore.page.slug}/gallery`"> <RouterLink :to="`/${pageStore.page.slug}/gallery`">
<i-mdi:vector-arrange-below /> <i-mdi:vector-arrange-below />
</RouterLink> </RouterLink>

View File

@ -22,12 +22,7 @@ const router = createRouter({
}) })
router.beforeEach((to, from, next) => { router.beforeEach((to, from, next) => {
// This function will be called before each route change
console.log('Navigating from', from.fullPath, 'to', to.fullPath); console.log('Navigating from', from.fullPath, 'to', to.fullPath);
// You can perform any additional logic here
// Make sure to call next() to continue with the navigation
next(); next();
}); });